diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 29eb8d6b9..e65cae9d8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -61,7 +61,7 @@ unit-testing: alias: postgres command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"] script: - - apt-get update && apt-get install -y libimage-exiftool-perl + - apt-get update && apt-get install -y libimage-exiftool-perl ffmpeg - mix deps.get - mix ecto.create - mix ecto.migrate @@ -95,7 +95,7 @@ unit-testing-rum: <<: *global_variables RUM_ENABLED: "true" script: - - apt-get update && apt-get install -y libimage-exiftool-perl + - apt-get update && apt-get install -y libimage-exiftool-perl ffmpeg - mix deps.get - mix ecto.create - mix ecto.migrate diff --git a/CHANGELOG.md b/CHANGELOG.md index a5c75bd4f..36a84b1a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,20 +5,77 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## Unreleased +### Added +- Mix tasks for controlling user account confirmation status in bulk (`mix pleroma.user confirm_all` and `mix pleroma.user unconfirm_all`) +- Mix task for sending confirmation emails to all unconfirmed users (`mix pleroma.email send_confirmation_mails`) +- Mix task option for force-unfollowing relays + ### Changed - **Breaking** Requires `libmagic` (or `file`) to guess file types. +- **Breaking:** Pleroma Admin API: emoji packs and files routes changed. +- **Breaking:** Sensitive/NSFW statuses no longer disable link previews. +- Search: Users are now findable by their urls. - Renamed `:await_up_timeout` in `:connections_pool` namespace to `:connect_timeout`, old name is deprecated. - Renamed `:timeout` in `pools` namespace to `:recv_timeout`, old name is deprecated. +- The `discoverable` field in the `User` struct will now add a NOINDEX metatag to profile pages when false. +- Users with the `discoverable` field set to false will not show up in searches. +- Minimum lifetime for ephmeral activities changed to 10 minutes and made configurable (`:min_lifetime` option). +- Introduced optional dependencies on `ffmpeg`, `ImageMagick`, `exiftool` software packages. Please refer to `docs/installation/optional/media_graphics_packages.md`. + +### Added +- Media preview proxy (requires `ffmpeg` and `ImageMagick` to be installed and media proxy to be enabled; see `:media_preview_proxy` config for more details). +- Pleroma API: Importing the mutes users from CSV files. +- Experimental websocket-based federation between Pleroma instances. + +
+ API Changes + +- Pleroma API: Importing the mutes users from CSV files. +- Admin API: Importing emoji from a zip file +- Pleroma API: Pagination for remote/local packs and emoji. + +
### Removed - **Breaking:** `Pleroma.Workers.Cron.StatsWorker` setting from Oban `:crontab` (moved to a simpler implementation). - **Breaking:** `Pleroma.Workers.Cron.ClearOauthTokenWorker` setting from Oban `:crontab` (moved to scheduled jobs). - **Breaking:** `Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker` setting from Oban `:crontab` (moved to scheduled jobs). +- Removed `:managed_config` option. In practice, it was accidentally removed with 2.0.0 release when frontends were +switched to a new configuration mechanism, however it was not officially removed until now. + +### Fixed + +- Add documented-but-missing chat pagination. +- Allow sending out emails again. + +## Unreleased (Patch) ### Changed -- Minimum lifetime for ephmeral activities changed to 10 minutes and made configurable (`:min_lifetime` option). +- API: Empty parameter values for integer parameters are now ignored in non-strict validaton mode. + +## [2.1.2] - 2020-09-17 + +### Security + +- Fix most MRF rules either crashing or not being applied to objects passed into the Common Pipeline (ChatMessage, Question, Answer, Audio, Event). + +### Fixed + +- Welcome Chat messages preventing user registration with MRF Simple Policy applied to the local instance. +- Mastodon API: the public timeline returning an error when the `reply_visibility` parameter is set to `self` for an unauthenticated user. +- Mastodon Streaming API: Handler crashes on authentication failures, resulting in error logs. +- Mastodon Streaming API: Error logs on client pings. +- Rich media: Log spam on failures. Now the error is only logged once per attempt. + +### Changed + +- Rich Media: A HEAD request is now done to the url, to ensure it has the appropriate content type and size before proceeding with a GET. + +### Upgrade notes + +1. Restart Pleroma ## [2.1.1] - 2020-09-08 @@ -35,6 +92,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Added - Rich media failure tracking (along with `:failure_backoff` option). +
+ Admin API Changes + +- Add `PATCH /api/pleroma/admin/instance_document/:document_name` to modify the Terms of Service and Instance Panel HTML pages via Admin API +
+ ### Fixed - Default HTTP adapter not respecting pool setting, leading to possible OOM. - Fixed uploading webp images when the Exiftool Upload Filter is enabled by skipping them diff --git a/README.md b/README.md index 6ca3118fb..7a05b9e48 100644 --- a/README.md +++ b/README.md @@ -18,15 +18,16 @@ If you are running Linux (glibc or musl) on x86/arm, the recommended way to inst ### From Source If your platform is not supported, or you just want to be able to edit the source code easily, you may install Pleroma from source. -- [Debian-based](https://docs-develop.pleroma.social/backend/installation/debian_based_en/) -- [Debian-based (jp)](https://docs-develop.pleroma.social/backend/installation/debian_based_jp/) - [Alpine Linux](https://docs-develop.pleroma.social/backend/installation/alpine_linux_en/) - [Arch Linux](https://docs-develop.pleroma.social/backend/installation/arch_linux_en/) +- [CentOS 7](https://docs-develop.pleroma.social/backend/installation/centos7_en/) +- [Debian-based](https://docs-develop.pleroma.social/backend/installation/debian_based_en/) +- [Debian-based (jp)](https://docs-develop.pleroma.social/backend/installation/debian_based_jp/) +- [FreeBSD](https://docs-develop.pleroma.social/backend/installation/freebsd_en/) - [Gentoo Linux](https://docs-develop.pleroma.social/backend/installation/gentoo_en/) - [NetBSD](https://docs-develop.pleroma.social/backend/installation/netbsd_en/) - [OpenBSD](https://docs-develop.pleroma.social/backend/installation/openbsd_en/) - [OpenBSD (fi)](https://docs-develop.pleroma.social/backend/installation/openbsd_fi/) -- [CentOS 7](https://docs-develop.pleroma.social/backend/installation/centos7_en/) ### OS/Distro packages Currently Pleroma is not packaged by any OS/Distros, but if you want to package it for one, we can guide you through the process on our [community channels](#community-channels). If you want to change default options in your Pleroma package, please **discuss it with us first**. diff --git a/config/benchmark.exs b/config/benchmark.exs index e867253eb..5567ff26e 100644 --- a/config/benchmark.exs +++ b/config/benchmark.exs @@ -59,8 +59,6 @@ "BLH1qVhJItRGCfxgTtONfsOKDc9VRAraXw-3NsmjMngWSh7NxOizN6bkuRA7iLTMPS82PjwJAr3UoK9EC1IFrz4", private_key: "_-XZ0iebPrRfZ_o0-IatTdszYa8VCH1yLN-JauK7HHA" -config :web_push_encryption, :http_client, Pleroma.Web.WebPushHttpClientMock - config :pleroma, Pleroma.ScheduledActivity, daily_user_limit: 2, total_user_limit: 3, diff --git a/config/config.exs b/config/config.exs index 46a649b73..d96db7416 100644 --- a/config/config.exs +++ b/config/config.exs @@ -130,6 +130,7 @@ dispatch: [ {:_, [ + {"/api/fedsocket/v1", Pleroma.Web.FedSockets.IncomingHandler, []}, {"/api/v1/streaming", Pleroma.Web.MastodonAPI.WebsocketHandler, []}, {"/websocket", Phoenix.Endpoint.CowboyWebSocket, {Phoenix.Transports.WebSocket, @@ -148,6 +149,16 @@ "SameSite=Lax" ] +config :pleroma, :fed_sockets, + enabled: false, + connection_duration: :timer.hours(8), + rejection_duration: :timer.minutes(15), + fed_socket_fetches: [ + default: 12_000, + interval: 3_000, + lazy: false + ] + # Configures Elixir's Logger config :logger, :console, level: :debug, @@ -216,7 +227,6 @@ allow_relay: true, public: true, quarantined_instances: [], - managed_config: true, static_dir: "instance/static/", allowed_post_formats: [ "text/plain", @@ -424,6 +434,8 @@ proxy_opts: [ redirect_on_failure: false, max_body_length: 25 * 1_048_576, + # Note: max_read_duration defaults to Pleroma.ReverseProxy.max_read_duration_default/1 + max_read_duration: 30_000, http: [ follow_redirect: true, pool: :media @@ -438,6 +450,14 @@ config :pleroma, Pleroma.Web.MediaProxy.Invalidation.Script, script_path: nil +# Note: media preview proxy depends on media proxy to be enabled +config :pleroma, :media_preview_proxy, + enabled: false, + thumbnail_max_width: 600, + thumbnail_max_height: 600, + image_quality: 85, + min_content_length: 100 * 1024 + config :pleroma, :chat, enabled: true config :phoenix, :format_encoders, json: Jason @@ -533,6 +553,7 @@ token_expiration: 5, federator_incoming: 50, federator_outgoing: 50, + ingestion_queue: 50, web_push: 50, mailer: 10, transmogrifier: 20, @@ -656,7 +677,18 @@ config :pleroma, Pleroma.Workers.PurgeExpiredActivity, enabled: true, min_lifetime: 600 -config :pleroma, Pleroma.Plugs.RemoteIp, enabled: true +config :pleroma, Pleroma.Plugs.RemoteIp, + enabled: true, + headers: ["x-forwarded-for"], + proxies: [], + reserved: [ + "127.0.0.0/8", + "::1/128", + "fc00::/7", + "10.0.0.0/8", + "172.16.0.0/12", + "192.168.0.0/16" + ] config :pleroma, :static_fe, enabled: false @@ -742,8 +774,8 @@ ], media: [ size: 50, - max_waiting: 10, - recv_timeout: 10_000 + max_waiting: 20, + recv_timeout: 15_000 ], upload: [ size: 25, @@ -790,6 +822,8 @@ config :ex_aws, http_client: Pleroma.HTTP.ExAws +config :web_push_encryption, http_client: Pleroma.HTTP.WebPush + config :pleroma, :instances_favicons, enabled: false config :floki, :html_parser, Floki.HTMLParser.FastHtml diff --git a/config/description.exs b/config/description.exs index d05adf88b..f068a35de 100644 --- a/config/description.exs +++ b/config/description.exs @@ -44,11 +44,13 @@ }, %{ key: "git", + label: "Git Repository URL", type: :string, description: "URL of the git repository of the frontend" }, %{ key: "build_url", + label: "Build URL", type: :string, description: "Either an url to a zip file containing the frontend or a template to build it by inserting the `ref`. The string `${ref}` will be replaced by the configured `ref`.", @@ -56,6 +58,7 @@ }, %{ key: "build_dir", + label: "Build directory", type: :string, description: "The directory inside the zip file " } @@ -270,6 +273,19 @@ } ] }, + %{ + group: :pleroma, + key: :fed_sockets, + type: :group, + description: "Websocket based federation", + children: [ + %{ + key: :enabled, + type: :boolean, + description: "Enable FedSockets" + } + ] + }, %{ group: :pleroma, key: Pleroma.Emails.Mailer, @@ -764,12 +780,6 @@ "*.quarantined.com" ] }, - %{ - key: :managed_config, - type: :boolean, - description: - "Whenether the config for pleroma-fe is configured in this config or in static/config.json" - }, %{ key: :static_dir, type: :string, @@ -1880,6 +1890,7 @@ suggestions: [ redirect_on_failure: false, max_body_length: 25 * 1_048_576, + max_read_duration: 30_000, http: [ follow_redirect: true, pool: :media @@ -1900,6 +1911,11 @@ "Limits the content length to be approximately the " <> "specified length. It is validated with the `content-length` header and also verified when proxying." }, + %{ + key: :max_read_duration, + type: :integer, + description: "Timeout (in milliseconds) of GET request to remote URI." + }, %{ key: :http, label: "HTTP", @@ -1946,6 +1962,43 @@ } ] }, + %{ + group: :pleroma, + key: :media_preview_proxy, + type: :group, + description: "Media preview proxy", + children: [ + %{ + key: :enabled, + type: :boolean, + description: + "Enables proxying of remote media preview to the instance's proxy. Requires enabled media proxy." + }, + %{ + key: :thumbnail_max_width, + type: :integer, + description: + "Max width of preview thumbnail for images (video preview always has original dimensions)." + }, + %{ + key: :thumbnail_max_height, + type: :integer, + description: + "Max height of preview thumbnail for images (video preview always has original dimensions)." + }, + %{ + key: :image_quality, + type: :integer, + description: "Quality of the output. Ranges from 0 (min quality) to 100 (max quality)." + }, + %{ + key: :min_content_length, + type: :integer, + description: + "Min content length to perform preview, in bytes. If greater than 0, media smaller in size will be served as is, without thumbnailing." + } + ] + }, %{ group: :pleroma, key: Pleroma.Web.MediaProxy.Invalidation.Http, @@ -2395,7 +2448,7 @@ %{ group: :pleroma, key: Pleroma.Formatter, - label: "Auto Linker", + label: "Linkify", type: :group, description: "Configuration for Pleroma's link formatter which parses mentions, hashtags, and URLs.", @@ -3212,20 +3265,22 @@ %{ key: :headers, type: {:list, :string}, - description: - "A list of strings naming the `req_headers` to use when deriving the `remote_ip`. Order does not matter. Default: `~w[forwarded x-forwarded-for x-client-ip x-real-ip]`." + description: """ + A list of strings naming the HTTP headers to use when deriving the true client IP. Default: `["x-forwarded-for"]`. + """ }, %{ key: :proxies, type: {:list, :string}, description: - "A list of strings in [CIDR](https://en.wikipedia.org/wiki/CIDR) notation specifying the IPs of known proxies. Default: `[]`." + "A list of upstream proxy IP subnets in CIDR notation from which we will parse the content of `headers`. Defaults to `[]`. IPv4 entries without a bitmask will be assumed to be /32 and IPv6 /128." }, %{ key: :reserved, type: {:list, :string}, - description: - "Defaults to [localhost](https://en.wikipedia.org/wiki/Localhost) and [private network](https://en.wikipedia.org/wiki/Private_network)." + description: """ + A list of reserved IP subnets in CIDR notation which should be ignored if found in `headers`. Defaults to `["127.0.0.0/8", "::1/128", "fc00::/7", "10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"]` + """ } ] }, @@ -3631,9 +3686,7 @@ type: :map, description: "A map containing available frontends and parameters for their installation.", - children: [ - frontend_options - ] + children: frontend_options } ] }, diff --git a/config/test.exs b/config/test.exs index 0ee6f1b7f..95f860f2f 100644 --- a/config/test.exs +++ b/config/test.exs @@ -19,6 +19,11 @@ level: :warn, format: "\n[$level] $message\n" +config :pleroma, :fed_sockets, + enabled: false, + connection_duration: 5, + rejection_duration: 5 + config :pleroma, :auth, oauth_consumer_strategies: [] config :pleroma, Pleroma.Upload, @@ -78,8 +83,6 @@ "BLH1qVhJItRGCfxgTtONfsOKDc9VRAraXw-3NsmjMngWSh7NxOizN6bkuRA7iLTMPS82PjwJAr3UoK9EC1IFrz4", private_key: "_-XZ0iebPrRfZ_o0-IatTdszYa8VCH1yLN-JauK7HHA" -config :web_push_encryption, :http_client, Pleroma.Web.WebPushHttpClientMock - config :pleroma, Oban, queues: false, crontab: false, diff --git a/docs/API/admin_api.md b/docs/API/admin_api.md index c0ea074f0..7bf13daef 100644 --- a/docs/API/admin_api.md +++ b/docs/API/admin_api.md @@ -349,9 +349,9 @@ Response: ### Unfollow a Relay -Params: - -* `relay_url` +- Params: + - `relay_url` + - *optional* `force`: forcefully unfollow a relay even when the relay is not available. (default is `false`) Response: @@ -1334,3 +1334,166 @@ Loads json generated from `config/descriptions.exs`. { } ``` + +## GET /api/pleroma/admin/users/:nickname/chats + +### List a user's chats + +- Params: None + +- Response: + +```json +[ + { + "sender": { + "id": "someflakeid", + "username": "somenick", + ... + }, + "receiver": { + "id": "someflakeid", + "username": "somenick", + ... + }, + "id" : "1", + "unread" : 2, + "last_message" : {...}, // The last message in that chat + "updated_at": "2020-04-21T15:11:46.000Z" + } +] +``` + +## GET /api/pleroma/admin/chats/:chat_id + +### View a single chat + +- Params: None + +- Response: + +```json +{ + "sender": { + "id": "someflakeid", + "username": "somenick", + ... + }, + "receiver": { + "id": "someflakeid", + "username": "somenick", + ... + }, + "id" : "1", + "unread" : 2, + "last_message" : {...}, // The last message in that chat + "updated_at": "2020-04-21T15:11:46.000Z" +} +``` + +## GET /api/pleroma/admin/chats/:chat_id/messages + +### List the messages in a chat + +- Params: `max_id`, `min_id` + +- Response: + +```json +[ + { + "account_id": "someflakeid", + "chat_id": "1", + "content": "Check this out :firefox:", + "created_at": "2020-04-21T15:11:46.000Z", + "emojis": [ + { + "shortcode": "firefox", + "static_url": "https://dontbulling.me/emoji/Firefox.gif", + "url": "https://dontbulling.me/emoji/Firefox.gif", + "visible_in_picker": false + } + ], + "id": "13", + "unread": true + }, + { + "account_id": "someflakeid", + "chat_id": "1", + "content": "Whats' up?", + "created_at": "2020-04-21T15:06:45.000Z", + "emojis": [], + "id": "12", + "unread": false + } +] +``` + +## DELETE /api/pleroma/admin/chats/:chat_id/messages/:message_id + +### Delete a single message + +- Params: None + +- Response: + +```json +{ + "account_id": "someflakeid", + "chat_id": "1", + "content": "Check this out :firefox:", + "created_at": "2020-04-21T15:11:46.000Z", + "emojis": [ + { + "shortcode": "firefox", + "static_url": "https://dontbulling.me/emoji/Firefox.gif", + "url": "https://dontbulling.me/emoji/Firefox.gif", + "visible_in_picker": false + } + ], + "id": "13", + "unread": false +} +``` + +## `GET /api/pleroma/admin/instance_document/:document_name` + +### Get an instance document + +- Authentication: required + +- Response: + +Returns the content of the document + +```html +

Instance panel

+``` + +## `PATCH /api/pleroma/admin/instance_document/:document_name` +- Params: + - `file` (the file to be uploaded, using multipart form data.) + +### Update an instance document + +- Authentication: required + +- Response: + +``` json +{ + "url": "https://example.com/instance/panel.html" +} +``` + +## `DELETE /api/pleroma/admin/instance_document/:document_name` + +### Delete an instance document + +- Response: + +``` json +{ + "url": "https://example.com/instance/panel.html" +} +``` diff --git a/docs/API/pleroma_api.md b/docs/API/pleroma_api.md index 4e97d26c0..3fd141bd2 100644 --- a/docs/API/pleroma_api.md +++ b/docs/API/pleroma_api.md @@ -44,6 +44,22 @@ Request parameters can be passed via [query strings](https://en.wikipedia.org/wi * Response: HTTP 200 on success, 500 on error * Note: Users that can't be followed are silently skipped. +## `/api/pleroma/blocks_import` +### Imports your blocks. +* Method: `POST` +* Authentication: required +* Params: + * `list`: STRING or FILE containing a whitespace-separated list of accounts to block +* Response: HTTP 200 on success, 500 on error + +## `/api/pleroma/mutes_import` +### Imports your mutes. +* Method: `POST` +* Authentication: required +* Params: + * `list`: STRING or FILE containing a whitespace-separated list of accounts to mute +* Response: HTTP 200 on success, 500 on error + ## `/api/pleroma/captcha` ### Get a new captcha * Method: `GET` @@ -362,44 +378,43 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa * Params: None * Response: JSON, returns a list of Mastodon Conversation entities that were marked as read (200 - healthy, 503 unhealthy). -## `GET /api/pleroma/emoji/packs/import` -### Imports packs from filesystem +## `GET /api/pleroma/emoji/pack?name=:name` + +### Get pack.json for the pack + * Method `GET` -* Authentication: required -* Params: None -* Response: JSON, returns a list of imported packs. - -## `GET /api/pleroma/emoji/packs/remote` -### Make request to another instance for packs list -* Method `GET` -* Authentication: required +* Authentication: not required * Params: - * `url`: url of the instance to get packs from -* Response: JSON with the pack list, hashmap with pack name and pack contents + * `page`: page number for files (default 1) + * `page_size`: page size for files (default 30) +* Response: JSON, pack json with `files`, `files_count` and `pack` keys with 200 status or 404 if the pack does not exist. -## `POST /api/pleroma/emoji/packs/download` -### Download pack from another instance -* Method `POST` -* Authentication: required -* Params: - * `url`: url of the instance to download from - * `name`: pack to download from that instance - * `as`: (*optional*) name how to save pack -* Response: JSON, "ok" with 200 status if the pack was downloaded, or 500 if there were - errors downloading the pack +```json +{ + "files": {...}, + "files_count": 0, // emoji count in pack + "pack": {...} +} +``` + +## `POST /api/pleroma/emoji/pack?name=:name` -## `POST /api/pleroma/emoji/packs/:name` ### Creates an empty pack + * Method `POST` -* Authentication: required -* Params: None +* Authentication: required (admin) +* Params: + * `name`: pack name * Response: JSON, "ok" and 200 status or 409 if the pack with that name already exists -## `PATCH /api/pleroma/emoji/packs/:name` +## `PATCH /api/pleroma/emoji/pack?name=:name` + ### Updates (replaces) pack metadata + * Method `PATCH` -* Authentication: required +* Authentication: required (admin) * Params: + * `name`: pack name * `metadata`: metadata to replace the old one * `license`: Pack license * `homepage`: Pack home page url @@ -410,39 +425,85 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa * Response: JSON, updated "metadata" section of the pack and 200 status or 400 if there was a problem with the new metadata (the error is specified in the "error" part of the response JSON) -## `DELETE /api/pleroma/emoji/packs/:name` +## `DELETE /api/pleroma/emoji/pack?name=:name` + ### Delete a custom emoji pack + * Method `DELETE` -* Authentication: required -* Params: None +* Authentication: required (admin) +* Params: + * `name`: pack name * Response: JSON, "ok" and 200 status or 500 if there was an error deleting the pack -## `POST /api/pleroma/emoji/packs/:name/files` -### Add new file to the pack -* Method `POST` -* Authentication: required +## `GET /api/pleroma/emoji/packs/import` + +### Imports packs from filesystem + +* Method `GET` +* Authentication: required (admin) +* Params: None +* Response: JSON, returns a list of imported packs. + +## `GET /api/pleroma/emoji/packs/remote` + +### Make request to another instance for packs list + +* Method `GET` +* Authentication: required (admin) * Params: + * `url`: url of the instance to get packs from + * `page`: page number for packs (default 1) + * `page_size`: page size for packs (default 50) +* Response: JSON with the pack list, hashmap with pack name and pack contents + +## `POST /api/pleroma/emoji/packs/download` + +### Download pack from another instance + +* Method `POST` +* Authentication: required (admin) +* Params: + * `url`: url of the instance to download from + * `name`: pack to download from that instance + * `as`: (*optional*) name how to save pack +* Response: JSON, "ok" with 200 status if the pack was downloaded, or 500 if there were + errors downloading the pack + +## `POST /api/pleroma/emoji/packs/files?name=:name` + +### Add new file to the pack + +* Method `POST` +* Authentication: required (admin) +* Params: + * `name`: pack name * `file`: file needs to be uploaded with the multipart request or link to remote file. * `shortcode`: (*optional*) shortcode for new emoji, must be unique for all emoji. If not sended, shortcode will be taken from original filename. * `filename`: (*optional*) new emoji file name. If not specified will be taken from original filename. * Response: JSON, list of files for updated pack (hashmap -> shortcode => filename) with status 200, either error status with error message. -## `PATCH /api/pleroma/emoji/packs/:name/files` +## `PATCH /api/pleroma/emoji/packs/files?name=:name` + ### Update emoji file from pack + * Method `PATCH` -* Authentication: required +* Authentication: required (admin) * Params: + * `name`: pack name * `shortcode`: emoji file shortcode * `new_shortcode`: new emoji file shortcode * `new_filename`: new filename for emoji file * `force`: (*optional*) with true value to overwrite existing emoji with new shortcode * Response: JSON, list with updated files for updated pack (hashmap -> shortcode => filename) with status 200, either error status with error message. -## `DELETE /api/pleroma/emoji/packs/:name/files` +## `DELETE /api/pleroma/emoji/packs/files?name=:name` + ### Delete emoji file from pack + * Method `DELETE` -* Authentication: required +* Authentication: required (admin) * Params: + * `name`: pack name * `shortcode`: emoji file shortcode * Response: JSON, list with updated files for updated pack (hashmap -> shortcode => filename) with status 200, either error status with error message. @@ -467,30 +528,14 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa } ``` -## `GET /api/pleroma/emoji/packs/:name` +## `GET /api/pleroma/emoji/packs/archive?name=:name` -### Get pack.json for the pack +### Requests a local pack archive from the instance * Method `GET` * Authentication: not required * Params: - * `page`: page number for files (default 1) - * `page_size`: page size for files (default 30) -* Response: JSON, pack json with `files`, `files_count` and `pack` keys with 200 status or 404 if the pack does not exist. - -```json -{ - "files": {...}, - "files_count": 0, // emoji count in pack - "pack": {...} -} -``` - -## `GET /api/pleroma/emoji/packs/:name/archive` -### Requests a local pack archive from the instance -* Method `GET` -* Authentication: not required -* Params: None + * `name`: pack name * Response: the archive of the pack with a 200 status code, 403 if the pack is not set as shared, 404 if the pack does not exist diff --git a/docs/administration/CLI_tasks/email.md b/docs/administration/CLI_tasks/email.md index 00d2e74f8..d9aa0e71b 100644 --- a/docs/administration/CLI_tasks/email.md +++ b/docs/administration/CLI_tasks/email.md @@ -1,4 +1,4 @@ -# Managing emails +# EMail administration tasks {! backend/administration/CLI_tasks/general_cli_task_info.include !} @@ -30,3 +30,17 @@ Example: ```sh mix pleroma.email test --to root@example.org ``` + +## Send confirmation emails to all unconfirmed user accounts + +=== "OTP" + + ```sh + ./bin/pleroma_ctl email send_confirmation_mails + ``` + +=== "From Source" + + ```sh + mix pleroma.email send_confirmation_mails + ``` diff --git a/docs/administration/CLI_tasks/user.md b/docs/administration/CLI_tasks/user.md index 3e7f028ba..c64ed4f22 100644 --- a/docs/administration/CLI_tasks/user.md +++ b/docs/administration/CLI_tasks/user.md @@ -224,9 +224,10 @@ ``` ### Options +- `--admin`/`--no-admin` - whether the user should be an admin +- `--confirmed`/`--no-confirmed` - whether the user account is confirmed - `--locked`/`--no-locked` - whether the user should be locked - `--moderator`/`--no-moderator` - whether the user should be a moderator -- `--admin`/`--no-admin` - whether the user should be an admin ## Add tags to a user @@ -271,3 +272,33 @@ ```sh mix pleroma.user toggle_confirmed ``` + +## Set confirmation status for all regular active users +*Admins and moderators are excluded* + +=== "OTP" + + ```sh + ./bin/pleroma_ctl user confirm_all + ``` + +=== "From Source" + + ```sh + mix pleroma.user confirm_all + ``` + +## Revoke confirmation status for all regular active users +*Admins and moderators are excluded* + +=== "OTP" + + ```sh + ./bin/pleroma_ctl user unconfirm_all + ``` + +=== "From Source" + + ```sh + mix pleroma.user unconfirm_all + ``` diff --git a/docs/administration/backup.md b/docs/administration/backup.md index be57bf74a..b49ff07fb 100644 --- a/docs/administration/backup.md +++ b/docs/administration/backup.md @@ -5,20 +5,24 @@ 1. Stop the Pleroma service. 2. Go to the working directory of Pleroma (default is `/opt/pleroma`) 3. Run `sudo -Hu postgres pg_dump -d --format=custom -f ` (make sure the postgres user has write access to the destination file) -4. Copy `pleroma.pgdump`, `config/prod.secret.exs` and the `uploads` folder to your backup destination. If you have other modifications, copy those changes too. +4. Copy `pleroma.pgdump`, `config/prod.secret.exs`, `config/setup_db.psql` (if still available) and the `uploads` folder to your backup destination. If you have other modifications, copy those changes too. 5. Restart the Pleroma service. ## Restore/Move -1. Optionally reinstall Pleroma (either on the same server or on another server if you want to move servers). Try to use the same database name. +1. Optionally reinstall Pleroma (either on the same server or on another server if you want to move servers). 2. Stop the Pleroma service. 3. Go to the working directory of Pleroma (default is `/opt/pleroma`) 4. Copy the above mentioned files back to their original position. -5. Drop the existing database and recreate an empty one `sudo -Hu postgres psql -c 'DROP DATABASE ;';` `sudo -Hu postgres psql -c 'CREATE DATABASE ;';` -6. Run `sudo -Hu postgres pg_restore -d -v -1 ` -7. If you installed a newer Pleroma version, you should run `mix ecto.migrate`[^1]. This task performs database migrations, if there were any. -8. Restart the Pleroma service. -9. Run `sudo -Hu postgres vacuumdb --all --analyze-in-stages`. This will quickly generate the statistics so that postgres can properly plan queries. +5. Drop the existing database if restoring in-place. `sudo -Hu postgres psql -c 'DROP DATABASE ;'` +6. Restore the database schema and pleroma postgres role the with the original `setup_db.psql` if you have it: `sudo -Hu postgres psql -f config/setup_db.psql`. + + Alernatively, run the `mix pleroma.instance gen` task again. You can ignore most of the questions, but make the database user, name, and password the same as found in your backup of `config/prod.secret.exs`. Then run the restoration of the pleroma role and schema with of the generated `config/setup_db.psql` as instructed above. You may delete the `config/generated_config.exs` file as it is not needed. + +7. Now restore the Pleroma instance's data into the empty database schema: `sudo -Hu postgres pg_restore -d -v -1 ` +8. If you installed a newer Pleroma version, you should run `mix ecto.migrate`[^1]. This task performs database migrations, if there were any. +9. Restart the Pleroma service. +10. Run `sudo -Hu postgres vacuumdb --all --analyze-in-stages`. This will quickly generate the statistics so that postgres can properly plan queries. [^1]: Prefix with `MIX_ENV=prod` to run it using the production config file. diff --git a/docs/configuration/cheatsheet.md b/docs/configuration/cheatsheet.md index 7cf1d1ce7..ea7dfec98 100644 --- a/docs/configuration/cheatsheet.md +++ b/docs/configuration/cheatsheet.md @@ -18,7 +18,7 @@ To add configuration to your config file, you can copy it from the base config. * `notify_email`: Email used for notifications. * `description`: The instance’s description, can be seen in nodeinfo and ``/api/v1/instance``. * `limit`: Posts character limit (CW/Subject included in the counter). -* `discription_limit`: The character limit for image descriptions. +* `description_limit`: The character limit for image descriptions. * `chat_limit`: Character limit of the instance chat messages. * `remote_limit`: Hard character limit beyond which remote posts will be dropped. * `upload_limit`: File size limit of uploads (except for avatar, background, banner). @@ -40,7 +40,6 @@ To add configuration to your config file, you can copy it from the base config. * `allow_relay`: Enable Pleroma’s Relay, which makes it possible to follow a whole instance. * `public`: Makes the client API in authenticated mode-only except for user-profiles. Useful for disabling the Local Timeline and The Whole Known Network. Note that there is a dependent setting restricting or allowing unauthenticated access to specific resources, see `restrict_unauthenticated` for more details. * `quarantined_instances`: List of ActivityPub instances where private (DMs, followers-only) activities will not be send. -* `managed_config`: Whenether the config for pleroma-fe is configured in [:frontend_configurations](#frontend_configurations) or in ``static/config.json``. * `allowed_post_formats`: MIME-type list of formats allowed to be posted (transformed into HTML). * `extended_nickname_format`: Set to `true` to use extended local nicknames format (allows underscores/dashes). This will break federation with older software for theses nicknames. @@ -226,6 +225,16 @@ Enables the worker which processes posts scheduled for deletion. Pinned posts ar * `enabled`: whether expired activities will be sent to the job queue to be deleted +## FedSockets +FedSockets is an experimental feature allowing for Pleroma backends to federate using a persistant websocket connection as opposed to making each federation a seperate http connection. This feature is currently off by default. It is configurable throught he following options. + +### :fedsockets +* `enabled`: Enables FedSockets for this instance. `false` by default. +* `connection_duration`: Time an idle websocket is kept open. +* `rejection_duration`: Failures to connect via FedSockets will not be retried for this period of time. +* `fed_socket_fetches` and `fed_socket_rejections`: Settings passed to `cachex` for the fetch registry, and rejection stacks. See `Pleroma.Web.FedSockets` for more details. + + ## Frontends ### :frontend_configurations @@ -315,6 +324,14 @@ This section describe PWA manifest instance-specific values. Currently this opti * `enabled`: Enables purge cache * `provider`: Which one of the [purge cache strategy](#purge-cache-strategy) to use. +## :media_preview_proxy + +* `enabled`: Enables proxying of remote media preview to the instance’s proxy. Requires enabled media proxy (`media_proxy/enabled`). +* `thumbnail_max_width`: Max width of preview thumbnail for images (video preview always has original dimensions). +* `thumbnail_max_height`: Max height of preview thumbnail for images (video preview always has original dimensions). +* `image_quality`: Quality of the output. Ranges from 0 (min quality) to 100 (max quality). +* `min_content_length`: Min content length to perform preview, in bytes. If greater than 0, media smaller in size will be served as is, without thumbnailing. + ### Purge cache strategy #### Pleroma.Web.MediaProxy.Invalidation.Script @@ -409,9 +426,9 @@ This will make Pleroma listen on `127.0.0.1` port `8080` and generate urls start Available options: * `enabled` - Enable/disable the plug. Defaults to `false`. -* `headers` - A list of strings naming the `req_headers` to use when deriving the `remote_ip`. Order does not matter. Defaults to `["x-forwarded-for"]`. -* `proxies` - A list of strings in [CIDR](https://en.wikipedia.org/wiki/CIDR) notation specifying the IPs of known proxies. Defaults to `[]`. -* `reserved` - Defaults to [localhost](https://en.wikipedia.org/wiki/Localhost) and [private network](https://en.wikipedia.org/wiki/Private_network). +* `headers` - A list of strings naming the HTTP headers to use when deriving the true client IP address. Defaults to `["x-forwarded-for"]`. +* `proxies` - A list of upstream proxy IP subnets in CIDR notation from which we will parse the content of `headers`. Defaults to `[]`. IPv4 entries without a bitmask will be assumed to be /32 and IPv6 /128. +* `reserved` - A list of reserved IP subnets in CIDR notation which should be ignored if found in `headers`. Defaults to `["127.0.0.0/8", "::1/128", "fc00::/7", "10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"]`. ### :rate_limit diff --git a/docs/installation/alpine_linux_en.md b/docs/installation/alpine_linux_en.md index f393e4978..62f2fb778 100644 --- a/docs/installation/alpine_linux_en.md +++ b/docs/installation/alpine_linux_en.md @@ -21,6 +21,9 @@ It assumes that you have administrative rights, either as root or a user with [s * `nginx` (preferred, example configs for other reverse proxies can be found in the repo) * `certbot` (or any other ACME client for Let’s Encrypt certificates) +* `ImageMagick` +* `ffmpeg` +* `exiftool` ### Prepare the system @@ -30,7 +33,6 @@ It assumes that you have administrative rights, either as root or a user with [s awk 'NR==2' /etc/apk/repositories | sed 's/main/community/' | tee -a /etc/apk/repositories ``` - * Then update the system, if not already done: ```shell @@ -57,6 +59,7 @@ sudo apk add erlang erlang-runtime-tools erlang-xmerl elixir ```shell sudo apk add erlang-eldap ``` + ### Install PostgreSQL * Install Postgresql server: @@ -77,6 +80,12 @@ sudo /etc/init.d/postgresql start sudo rc-update add postgresql ``` +### Install media / graphics packages (optional, see [`docs/installation/optional/media_graphics_packages.md`](docs/installation/optional/media_graphics_packages.md)) + +```shell +sudo apk add ffmpeg imagemagick exiftool +``` + ### Install PleromaBE * Add a new system user for the Pleroma service: diff --git a/docs/installation/arch_linux_en.md b/docs/installation/arch_linux_en.md index 99eb011ad..0eb6d2d5f 100644 --- a/docs/installation/arch_linux_en.md +++ b/docs/installation/arch_linux_en.md @@ -16,6 +16,9 @@ This guide will assume that you have administrative rights, either as root or a * `nginx` (preferred, example configs for other reverse proxies can be found in the repo) * `certbot` (or any other ACME client for Let’s Encrypt certificates) +* `ImageMagick` +* `ffmpeg` +* `exiftool` ### Prepare the system @@ -53,6 +56,12 @@ sudo -iu postgres initdb -D /var/lib/postgres/data sudo systemctl enable --now postgresql.service ``` +### Install media / graphics packages (optional, see [`docs/installation/optional/media_graphics_packages.md`](docs/installation/optional/media_graphics_packages.md)) + +```shell +sudo pacman -S ffmpeg imagemagick perl-image-exiftool +``` + ### Install PleromaBE * Add a new system user for the Pleroma service: diff --git a/docs/installation/debian_based_en.md b/docs/installation/debian_based_en.md index 58d15ce14..6a9026d94 100644 --- a/docs/installation/debian_based_en.md +++ b/docs/installation/debian_based_en.md @@ -19,6 +19,9 @@ This guide will assume you are on Debian Stretch. This guide should also work wi * `nginx` (preferred, example configs for other reverse proxies can be found in the repo) * `certbot` (or any other ACME client for Let’s Encrypt certificates) +* `ImageMagick` +* `ffmpeg` +* `exiftool` ### Prepare the system @@ -51,6 +54,12 @@ sudo apt update sudo apt install elixir erlang-dev erlang-nox ``` +### Optional packages: [`docs/installation/optional/media_graphics_packages.md`](docs/installation/optional/media_graphics_packages.md) + +```shell +sudo apt install imagemagick ffmpeg libimage-exiftool-perl +``` + ### Install PleromaBE * Add a new system user for the Pleroma service: diff --git a/docs/installation/debian_based_jp.md b/docs/installation/debian_based_jp.md index d98162796..94e22325c 100644 --- a/docs/installation/debian_based_jp.md +++ b/docs/installation/debian_based_jp.md @@ -23,6 +23,9 @@ - `nginx` (おすすめです。他のリバースプロキシを使う場合は、参考となる設定をこのリポジトリから探してください) - `certbot` (または何らかのLet's Encrypt向けACMEクライアント) +- `ImageMagick` +- `ffmpeg` +- `exiftool` ### システムを準備する @@ -34,10 +37,9 @@ sudo apt full-upgrade * 上記に挙げたパッケージをインストールしておきます。 ``` -sudo apt install git build-essential postgresql postgresql-contrib cmake libmagic-dev +sudo apt install git build-essential postgresql postgresql-contrib cmake ffmpeg imagemagick libmagic-dev ``` - ### ElixirとErlangをインストールします * Erlangのリポジトリをダウンロードおよびインストールします。 @@ -52,6 +54,12 @@ sudo apt update sudo apt install elixir erlang-dev erlang-nox ``` +### オプションパッケージ: [`docs/installation/optional/media_graphics_packages.md`](docs/installation/optional/media_graphics_packages.md) + +```shell +sudo apt install imagemagick ffmpeg libimage-exiftool-perl +``` + ### Pleroma BE (バックエンド) をインストールします * Pleroma用に新しいユーザーを作ります。 diff --git a/docs/installation/freebsd_en.md b/docs/installation/freebsd_en.md index ca2575d9b..fdcb06c53 100644 --- a/docs/installation/freebsd_en.md +++ b/docs/installation/freebsd_en.md @@ -26,6 +26,12 @@ Setup the required services to automatically start at boot, using `sysrc(8)`. # service postgresql start ``` +### Install media / graphics packages (optional, see [`docs/installation/optional/media_graphics_packages.md`](docs/installation/optional/media_graphics_packages.md)) + +```shell +# pkg install imagemagick ffmpeg p5-Image-ExifTool +``` + ## Configuring Pleroma Create a user for Pleroma: diff --git a/docs/installation/gentoo_en.md b/docs/installation/gentoo_en.md index 0f7ed9d47..f2380ab72 100644 --- a/docs/installation/gentoo_en.md +++ b/docs/installation/gentoo_en.md @@ -36,6 +36,9 @@ Gentoo quite pointedly does not come with a cron daemon installed, and as such i * `www-servers/nginx` (preferred, example configs for other reverse proxies can be found in the repo) * `app-crypt/certbot` (or any other ACME client for Let’s Encrypt certificates) * `app-crypt/certbot-nginx` (nginx certbot plugin that allows use of the all-powerful `--nginx` flag on certbot) +* `media-gfx/imagemagick` +* `media-video/ffmpeg` +* `media-libs/exiftool` ### Prepare the system @@ -88,6 +91,12 @@ If you do not plan to make any modifications to your Pleroma instance, cloning d Not only does this make it much easier to deploy changes you make, as you can commit and pull from upstream and all that good stuff from the comfort of your local machine then simply `git pull` on your instance server when you're ready to deploy, it also ensures you are compliant with the Affero General Public Licence that Pleroma is licenced under, which stipulates that all network services provided with modified AGPL code must publish their changes on a publicly available internet service and for free. It also makes it much easier to ask for help from and provide help to your fellow Pleroma admins if your public repo always reflects what you are running because it is part of your deployment procedure. +### Install media / graphics packages (optional, see [`docs/installation/optional/media_graphics_packages.md`](docs/installation/optional/media_graphics_packages.md)) + +```shell +# emerge --ask media-video/ffmpeg media-gfx/imagemagick media-libs/exiftool +``` + ### Install PleromaBE * Add a new system user for the Pleroma service and set up default directories: diff --git a/docs/installation/netbsd_en.md b/docs/installation/netbsd_en.md index 6ad0de2f6..d5fa04fdf 100644 --- a/docs/installation/netbsd_en.md +++ b/docs/installation/netbsd_en.md @@ -10,7 +10,7 @@ Pleroma uses. The `mksh` shell is needed to run the Elixir `mix` script. -`# pkgin install acmesh elixir git-base git-docs mksh nginx postgresql11-server postgresql11-client postgresql11-contrib sudo` +`# pkgin install acmesh elixir git-base git-docs mksh nginx postgresql11-server postgresql11-client postgresql11-contrib sudo ffmpeg4 ImageMagick` You can also build these packages using pkgsrc: ``` @@ -44,6 +44,10 @@ pgsql=YES First, run `# /etc/rc.d/pgsql start`. Then, `$ sudo -Hu pgsql -g pgsql createdb`. +### Install media / graphics packages (optional, see [`docs/installation/optional/media_graphics_packages.md`](docs/installation/optional/media_graphics_packages.md)) + +`# pkgin install ImageMagick ffmpeg4 p5-Image-ExifTool` + ## Configuring Pleroma Create a user for Pleroma: diff --git a/docs/installation/openbsd_en.md b/docs/installation/openbsd_en.md index eee452845..8092ac379 100644 --- a/docs/installation/openbsd_en.md +++ b/docs/installation/openbsd_en.md @@ -10,20 +10,34 @@ The following packages need to be installed: * elixir * gmake - * ImageMagick * git * postgresql-server * postgresql-contrib * cmake + * ffmpeg + * ImageMagick To install them, run the following command (with doas or as root): ``` -pkg_add elixir gmake ImageMagick git postgresql-server postgresql-contrib cmake +pkg_add elixir gmake git postgresql-server postgresql-contrib cmake ffmpeg ImageMagick ``` Pleroma requires a reverse proxy, OpenBSD has relayd in base (and is used in this guide) and packages/ports are available for nginx (www/nginx) and apache (www/apache-httpd). Independently of the reverse proxy, [acme-client(1)](https://man.openbsd.org/acme-client) can be used to get a certificate from Let's Encrypt. +#### Optional software + +Per [`docs/installation/optional/media_graphics_packages.md`](docs/installation/optional/media_graphics_packages.md): + * ImageMagick + * ffmpeg + * exiftool + +To install the above: + +``` +pkg_add ImageMagick ffmpeg p5-Image-ExifTool +``` + #### Creating the pleroma user Pleroma will be run by a dedicated user, \_pleroma. Before creating it, insert the following lines in login.conf: ``` diff --git a/docs/installation/openbsd_fi.md b/docs/installation/openbsd_fi.md index b5b5056a9..01cf34ab4 100644 --- a/docs/installation/openbsd_fi.md +++ b/docs/installation/openbsd_fi.md @@ -16,7 +16,18 @@ Matrix-kanava #freenode_#pleroma:matrix.org ovat hyviä paikkoja löytää apua Asenna tarvittava ohjelmisto: -`# pkg_add git elixir gmake postgresql-server-10.3 postgresql-contrib-10.3 cmake` +`# pkg_add git elixir gmake postgresql-server-10.3 postgresql-contrib-10.3 cmake ffmpeg ImageMagick` + +#### Optional software + +[`docs/installation/optional/media_graphics_packages.md`](docs/installation/optional/media_graphics_packages.md): + * ImageMagick + * ffmpeg + * exiftool + +Asenna tarvittava ohjelmisto: + +`# pkg_add ImageMagick ffmpeg p5-Image-ExifTool` Luo postgresql-tietokanta: diff --git a/docs/installation/optional/media_graphics_packages.md b/docs/installation/optional/media_graphics_packages.md new file mode 100644 index 000000000..cb3d71188 --- /dev/null +++ b/docs/installation/optional/media_graphics_packages.md @@ -0,0 +1,32 @@ +# Optional software packages needed for specific functionality + +For specific Pleroma functionality (which is disabled by default) some or all of the below packages are required: + * `ImageMagic` + * `ffmpeg` + * `exiftool` + +Please refer to documentation in `docs/installation` on how to install them on specific OS. + +Note: the packages are not required with the current default settings of Pleroma. + +## `ImageMagick` + +`ImageMagick` is a set of tools to create, edit, compose, or convert bitmap images. + +It is required for the following Pleroma features: + * `Pleroma.Upload.Filters.Mogrify`, `Pleroma.Upload.Filters.Mogrifun` upload filters (related config: `Plaroma.Upload/filters` in `config/config.exs`) + * Media preview proxy for still images (related config: `media_preview_proxy/enabled` in `config/config.exs`) + +## `ffmpeg` + +`ffmpeg` is software to record, convert and stream audio and video. + +It is required for the following Pleroma features: + * Media preview proxy for videos (related config: `media_preview_proxy/enabled` in `config/config.exs`) + +## `exiftool` + +`exiftool` is media files metadata reader/writer. + +It is required for the following Pleroma features: + * `Pleroma.Upload.Filters.Exiftool` upload filter (related config: `Plaroma.Upload/filters` in `config/config.exs`) diff --git a/docs/installation/otp_en.md b/docs/installation/otp_en.md index 32f04a9c4..62d4c8a72 100644 --- a/docs/installation/otp_en.md +++ b/docs/installation/otp_en.md @@ -41,6 +41,25 @@ Other than things bundled in the OTP release Pleroma depends on: apt install curl unzip libncurses5 postgresql postgresql-contrib nginx certbot libmagic-dev ``` +### Installing optional packages + +Per [`docs/installation/optional/media_graphics_packages.md`](docs/installation/optional/media_graphics_packages.md): + * ImageMagick + * ffmpeg + * exiftool + +=== "Alpine" + ``` + echo "http://nl.alpinelinux.org/alpine/latest-stable/community" >> /etc/apk/repositories + apk update + apk add imagemagick ffmpeg exiftool + ``` + +=== "Debian/Ubuntu" + ``` + apt install imagemagick ffmpeg libimage-exiftool-perl + ``` + ## Setup ### Configuring PostgreSQL #### (Optional) Installing RUM indexes @@ -83,6 +102,8 @@ It is encouraged to check [Optimizing your PostgreSQL performance](../configurat If you are using PostgreSQL 12 or higher, add this to your Ecto database configuration ```elixir +# +config :pleroma, Pleroma.Repo, prepare: :named, parameters: [ plan_cache_mode: "force_custom_plan" diff --git a/installation/pleroma.nginx b/installation/pleroma.nginx index d301ca615..d613befd2 100644 --- a/installation/pleroma.nginx +++ b/installation/pleroma.nginx @@ -9,6 +9,12 @@ proxy_cache_path /tmp/pleroma-media-cache levels=1:2 keys_zone=pleroma_media_cache:10m max_size=10g inactive=720m use_temp_path=off; +# this is explicitly IPv4 since Pleroma.Web.Endpoint binds on IPv4 only +# and `localhost.` resolves to [::0] on some systems: see issue #930 +upstream phoenix { + server 127.0.0.1:4000 max_fails=5 fail_timeout=60s; +} + server { server_name example.tld; @@ -63,19 +69,16 @@ server { # the nginx default is 1m, not enough for large media uploads client_max_body_size 16m; + ignore_invalid_headers off; + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $http_host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; location / { - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_set_header Host $http_host; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - - # this is explicitly IPv4 since Pleroma.Web.Endpoint binds on IPv4 only - # and `localhost.` resolves to [::0] on some systems: see issue #930 - proxy_pass http://127.0.0.1:4000; - - client_max_body_size 16m; + proxy_pass http://phoenix; } location ~ ^/(media|proxy) { @@ -83,12 +86,16 @@ server { slice 1m; proxy_cache_key $host$uri$is_args$args$slice_range; proxy_set_header Range $slice_range; - proxy_http_version 1.1; proxy_cache_valid 200 206 301 304 1h; proxy_cache_lock on; proxy_ignore_client_abort on; proxy_buffering on; chunked_transfer_encoding on; - proxy_pass http://127.0.0.1:4000; + proxy_pass http://phoenix; + } + + location /api/fedsocket/v1 { + proxy_request_buffering off; + proxy_pass http://phoenix/api/fedsocket/v1; } } diff --git a/installation/pleroma.vcl b/installation/pleroma.vcl index 154747aa6..13dad784c 100644 --- a/installation/pleroma.vcl +++ b/installation/pleroma.vcl @@ -1,3 +1,4 @@ +# Recommended varnishncsa logging format: '%h %l %u %t "%m %{X-Forwarded-Proto}i://%{Host}i%U%q %H" %s %b "%{Referer}i" "%{User-agent}i"' vcl 4.1; import std; @@ -14,8 +15,11 @@ acl purge { sub vcl_recv { # Redirect HTTP to HTTPS if (std.port(server.ip) != 443) { + set req.http.X-Forwarded-Proto = "http"; set req.http.x-redir = "https://" + req.http.host + req.url; return (synth(750, "")); + } else { + set req.http.X-Forwarded-Proto = "https"; } # CHUNKED SUPPORT @@ -105,7 +109,7 @@ sub vcl_hash { sub vcl_backend_fetch { # Be more lenient for slow servers on the fediverse - if bereq.url ~ "^/proxy/" { + if (bereq.url ~ "^/proxy/") { set bereq.first_byte_timeout = 300s; } diff --git a/lib/mix/tasks/pleroma/config.ex b/lib/mix/tasks/pleroma/config.ex index 904c5a74b..18f99318d 100644 --- a/lib/mix/tasks/pleroma/config.ex +++ b/lib/mix/tasks/pleroma/config.ex @@ -32,7 +32,8 @@ def run(["migrate_from_db" | options]) do @spec migrate_to_db(Path.t() | nil) :: any() def migrate_to_db(file_path \\ nil) do - if Pleroma.Config.get([:configurable_from_database]) do + with true <- Pleroma.Config.get([:configurable_from_database]), + :ok <- Pleroma.Config.DeprecationWarnings.warn() do config_file = if file_path do file_path @@ -46,7 +47,8 @@ def migrate_to_db(file_path \\ nil) do do_migrate_to_db(config_file) else - migration_error() + :error -> deprecation_error() + _ -> migration_error() end end @@ -120,6 +122,10 @@ defp migration_error do ) end + defp deprecation_error do + shell_error("Migration is not allowed until all deprecation warnings have been resolved.") + end + if Code.ensure_loaded?(Config.Reader) do defp config_header, do: "import Config\r\n\r\n" defp read_file(config_file), do: Config.Reader.read_imports!(config_file) diff --git a/lib/mix/tasks/pleroma/database.ex b/lib/mix/tasks/pleroma/database.ex index 7f1108dcf..a01c36ece 100644 --- a/lib/mix/tasks/pleroma/database.ex +++ b/lib/mix/tasks/pleroma/database.ex @@ -99,7 +99,7 @@ def run(["fix_likes_collections"]) do where: fragment("(?)->>'likes' is not null", object.data), select: %{id: object.id, likes: fragment("(?)->>'likes'", object.data)} ) - |> Pleroma.RepoStreamer.chunk_stream(100) + |> Pleroma.Repo.chunk_stream(100, :batches) |> Stream.each(fn objects -> ids = objects @@ -145,7 +145,7 @@ def run(["ensure_expiration"]) do |> where(local: true) |> where([a], fragment("(? ->> 'type'::text) = 'Create'", a.data)) |> where([_a, o], fragment("?->>'type' = 'Note'", o.data)) - |> Pleroma.RepoStreamer.chunk_stream(100) + |> Pleroma.Repo.chunk_stream(100, :batches) |> Stream.each(fn activities -> Enum.each(activities, fn activity -> expires_at = diff --git a/lib/mix/tasks/pleroma/email.ex b/lib/mix/tasks/pleroma/email.ex index d3fac6ec8..9972cb988 100644 --- a/lib/mix/tasks/pleroma/email.ex +++ b/lib/mix/tasks/pleroma/email.ex @@ -2,11 +2,11 @@ defmodule Mix.Tasks.Pleroma.Email do use Mix.Task import Mix.Pleroma - @shortdoc "Simple Email test" + @shortdoc "Email administrative tasks" @moduledoc File.read!("docs/administration/CLI_tasks/email.md") def run(["test" | args]) do - Mix.Pleroma.start_pleroma() + start_pleroma() {options, [], []} = OptionParser.parse( @@ -21,4 +21,20 @@ def run(["test" | args]) do shell_info("Test email has been sent to #{inspect(email.to)} from #{inspect(email.from)}") end + + def run(["resend_confirmation_emails"]) do + start_pleroma() + + shell_info("Sending emails to all unconfirmed users") + + Pleroma.User.Query.build(%{ + local: true, + deactivated: false, + confirmation_pending: true, + invisible: false + }) + |> Pleroma.Repo.chunk_stream(500) + |> Stream.each(&Pleroma.User.try_send_confirmation_email(&1)) + |> Stream.run() + end end diff --git a/lib/mix/tasks/pleroma/relay.ex b/lib/mix/tasks/pleroma/relay.ex index a6d8d6c1c..bb808ca47 100644 --- a/lib/mix/tasks/pleroma/relay.ex +++ b/lib/mix/tasks/pleroma/relay.ex @@ -21,10 +21,19 @@ def run(["follow", target]) do end end - def run(["unfollow", target]) do + def run(["unfollow", target | rest]) do start_pleroma() - with {:ok, _activity} <- Relay.unfollow(target) do + {options, [], []} = + OptionParser.parse( + rest, + strict: [force: :boolean], + aliases: [f: :force] + ) + + force = Keyword.get(options, :force, false) + + with {:ok, _activity} <- Relay.unfollow(target, %{force: force}) do # put this task to sleep to allow the genserver to push out the messages :timer.sleep(500) else diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index 01824aa18..e06262804 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -179,7 +179,7 @@ def run(["deactivate_all_from_instance", instance]) do start_pleroma() Pleroma.User.Query.build(%{nickname: "@#{instance}"}) - |> Pleroma.RepoStreamer.chunk_stream(500) + |> Pleroma.Repo.chunk_stream(500, :batches) |> Stream.each(fn users -> users |> Enum.each(fn user -> @@ -196,17 +196,24 @@ def run(["set", nickname | rest]) do OptionParser.parse( rest, strict: [ - moderator: :boolean, admin: :boolean, - locked: :boolean + confirmed: :boolean, + locked: :boolean, + moderator: :boolean ] ) with %User{local: true} = user <- User.get_cached_by_nickname(nickname) do user = - case Keyword.get(options, :moderator) do + case Keyword.get(options, :admin) do nil -> user - value -> set_moderator(user, value) + value -> set_admin(user, value) + end + + user = + case Keyword.get(options, :confirmed) do + nil -> user + value -> set_confirmed(user, value) end user = @@ -216,9 +223,9 @@ def run(["set", nickname | rest]) do end _user = - case Keyword.get(options, :admin) do + case Keyword.get(options, :moderator) do nil -> user - value -> set_admin(user, value) + value -> set_moderator(user, value) end else _ -> @@ -353,6 +360,42 @@ def run(["toggle_confirmed", nickname]) do end end + def run(["confirm_all"]) do + start_pleroma() + + Pleroma.User.Query.build(%{ + local: true, + deactivated: false, + is_moderator: false, + is_admin: false, + invisible: false + }) + |> Pleroma.Repo.chunk_stream(500, :batches) + |> Stream.each(fn users -> + users + |> Enum.each(fn user -> User.need_confirmation(user, false) end) + end) + |> Stream.run() + end + + def run(["unconfirm_all"]) do + start_pleroma() + + Pleroma.User.Query.build(%{ + local: true, + deactivated: false, + is_moderator: false, + is_admin: false, + invisible: false + }) + |> Pleroma.Repo.chunk_stream(500, :batches) + |> Stream.each(fn users -> + users + |> Enum.each(fn user -> User.need_confirmation(user, true) end) + end) + |> Stream.run() + end + def run(["sign_out", nickname]) do start_pleroma() @@ -370,7 +413,7 @@ def run(["list"]) do start_pleroma() Pleroma.User.Query.build(%{local: true}) - |> Pleroma.RepoStreamer.chunk_stream(500) + |> Pleroma.Repo.chunk_stream(500, :batches) |> Stream.each(fn users -> users |> Enum.each(fn user -> @@ -410,4 +453,11 @@ defp set_locked(user, value) do shell_info("Locked status of #{user.nickname}: #{user.locked}") user end + + defp set_confirmed(user, value) do + {:ok, user} = User.need_confirmation(user, !value) + + shell_info("Confirmation pending status of #{user.nickname}: #{user.confirmation_pending}") + user + end end diff --git a/lib/pleroma/application.ex b/lib/pleroma/application.ex index cd7a856d0..4ed8df09c 100644 --- a/lib/pleroma/application.ex +++ b/lib/pleroma/application.ex @@ -56,7 +56,6 @@ def start(_type, _args) do Pleroma.ApplicationRequirements.verify!() setup_instrumenters() load_custom_modules() - check_system_commands() Pleroma.Docs.JSON.compile() adapter = Application.get_env(:tesla, :adapter) @@ -100,7 +99,7 @@ def start(_type, _args) do {Oban, Config.get(Oban)} ] ++ task_children(@env) ++ - streamer_child(@env) ++ + dont_run_in_test(@env) ++ chat_child(@env, chat_enabled?()) ++ [ Pleroma.Web.Endpoint, @@ -189,16 +188,17 @@ def build_cachex(type, opts), defp chat_enabled?, do: Config.get([:chat, :enabled]) - defp streamer_child(env) when env in [:test, :benchmark], do: [] + defp dont_run_in_test(env) when env in [:test, :benchmark], do: [] - defp streamer_child(_) do + defp dont_run_in_test(_) do [ {Registry, [ name: Pleroma.Web.Streamer.registry(), keys: :duplicate, partitions: System.schedulers_online() - ]} + ]}, + Pleroma.Web.FedSockets.Supervisor ] end @@ -260,21 +260,4 @@ defp http_children(Tesla.Adapter.Gun, _) do end defp http_children(_, _), do: [] - - defp check_system_commands do - filters = Config.get([Pleroma.Upload, :filters]) - - check_filter = fn filter, command_required -> - with true <- filter in filters, - false <- Pleroma.Utils.command_available?(command_required) do - Logger.error( - "#{filter} is specified in list of Pleroma.Upload filters, but the #{command_required} command is not found" - ) - end - end - - check_filter.(Pleroma.Upload.Filters.Exiftool, "exiftool") - check_filter.(Pleroma.Upload.Filters.Mogrify, "mogrify") - check_filter.(Pleroma.Upload.Filters.Mogrifun, "mogrify") - end end diff --git a/lib/pleroma/application_requirements.ex b/lib/pleroma/application_requirements.ex index 16f62b6f5..b977257a3 100644 --- a/lib/pleroma/application_requirements.ex +++ b/lib/pleroma/application_requirements.ex @@ -9,6 +9,9 @@ defmodule Pleroma.ApplicationRequirements do defmodule VerifyError, do: defexception([:message]) + alias Pleroma.Config + alias Pleroma.Helpers.MediaHelper + import Ecto.Query require Logger @@ -16,7 +19,8 @@ defmodule VerifyError, do: defexception([:message]) @spec verify!() :: :ok | VerifyError.t() def verify! do :ok - |> check_confirmation_accounts! + |> check_system_commands!() + |> check_confirmation_accounts!() |> check_migrations_applied!() |> check_welcome_message_config!() |> check_rum!() @@ -48,7 +52,9 @@ def check_confirmation_accounts!(:ok) do if Pleroma.Config.get([:instance, :account_activation_required]) && not Pleroma.Config.get([Pleroma.Emails.Mailer, :enabled]) do Logger.error( - "Account activation enabled, but no Mailer settings enabled.\nPlease set config :pleroma, :instance, account_activation_required: false\nOtherwise setup and enable Mailer." + "Account activation enabled, but no Mailer settings enabled.\n" <> + "Please set config :pleroma, :instance, account_activation_required: false\n" <> + "Otherwise setup and enable Mailer." ) {:error, @@ -81,7 +87,9 @@ def check_migrations_applied!(:ok) do Enum.map(down_migrations, fn {:down, id, name} -> "- #{name} (#{id})\n" end) Logger.error( - "The following migrations were not applied:\n#{down_migrations_text}If you want to start Pleroma anyway, set\nconfig :pleroma, :i_am_aware_this_may_cause_data_loss, disable_migration_check: true" + "The following migrations were not applied:\n#{down_migrations_text}" <> + "If you want to start Pleroma anyway, set\n" <> + "config :pleroma, :i_am_aware_this_may_cause_data_loss, disable_migration_check: true" ) {:error, "Unapplied Migrations detected"} @@ -124,14 +132,22 @@ defp do_check_rum!(setting, migrate) do case {setting, migrate} do {true, false} -> Logger.error( - "Use `RUM` index is enabled, but were not applied migrations for it.\nIf you want to start Pleroma anyway, set\nconfig :pleroma, :database, rum_enabled: false\nOtherwise apply the following migrations:\n`mix ecto.migrate --migrations-path priv/repo/optional_migrations/rum_indexing/`" + "Use `RUM` index is enabled, but were not applied migrations for it.\n" <> + "If you want to start Pleroma anyway, set\n" <> + "config :pleroma, :database, rum_enabled: false\n" <> + "Otherwise apply the following migrations:\n" <> + "`mix ecto.migrate --migrations-path priv/repo/optional_migrations/rum_indexing/`" ) {:error, "Unapplied RUM Migrations detected"} {false, true} -> Logger.error( - "Detected applied migrations to use `RUM` index, but `RUM` isn't enable in settings.\nIf you want to use `RUM`, set\nconfig :pleroma, :database, rum_enabled: true\nOtherwise roll `RUM` migrations back.\n`mix ecto.rollback --migrations-path priv/repo/optional_migrations/rum_indexing/`" + "Detected applied migrations to use `RUM` index, but `RUM` isn't enable in settings.\n" <> + "If you want to use `RUM`, set\n" <> + "config :pleroma, :database, rum_enabled: true\n" <> + "Otherwise roll `RUM` migrations back.\n" <> + "`mix ecto.rollback --migrations-path priv/repo/optional_migrations/rum_indexing/`" ) {:error, "RUM Migrations detected"} @@ -140,4 +156,50 @@ defp do_check_rum!(setting, migrate) do :ok end end + + defp check_system_commands!(:ok) do + filter_commands_statuses = [ + check_filter(Pleroma.Upload.Filters.Exiftool, "exiftool"), + check_filter(Pleroma.Upload.Filters.Mogrify, "mogrify"), + check_filter(Pleroma.Upload.Filters.Mogrifun, "mogrify") + ] + + preview_proxy_commands_status = + if !Config.get([:media_preview_proxy, :enabled]) or + MediaHelper.missing_dependencies() == [] do + true + else + Logger.error( + "The following dependencies required by Media preview proxy " <> + "(which is currently enabled) are not installed: " <> + inspect(MediaHelper.missing_dependencies()) + ) + + false + end + + if Enum.all?([preview_proxy_commands_status | filter_commands_statuses], & &1) do + :ok + else + {:error, + "System commands missing. Check logs and see `docs/installation` for more details."} + end + end + + defp check_system_commands!(result), do: result + + defp check_filter(filter, command_required) do + filters = Config.get([Pleroma.Upload, :filters]) + + if filter in filters and not Pleroma.Utils.command_available?(command_required) do + Logger.error( + "#{filter} is specified in list of Pleroma.Upload filters, but the " <> + "#{command_required} command is not found" + ) + + false + else + true + end + end end diff --git a/lib/pleroma/chat.ex b/lib/pleroma/chat.ex index 24a86371e..28007cd9f 100644 --- a/lib/pleroma/chat.ex +++ b/lib/pleroma/chat.ex @@ -6,7 +6,9 @@ defmodule Pleroma.Chat do use Ecto.Schema import Ecto.Changeset + import Ecto.Query + alias Pleroma.Chat alias Pleroma.Repo alias Pleroma.User @@ -16,6 +18,7 @@ defmodule Pleroma.Chat do It is a helper only, to make it easy to display a list of chats with other people, ordered by last bump. The actual messages are retrieved by querying the recipients of the ChatMessages. """ + @type t :: %__MODULE__{} @primary_key {:id, FlakeId.Ecto.CompatType, autogenerate: true} schema "chats" do @@ -39,16 +42,28 @@ def changeset(struct, params) do |> unique_constraint(:user_id, name: :chats_user_id_recipient_index) end + @spec get_by_user_and_id(User.t(), FlakeId.Ecto.CompatType.t()) :: + {:ok, t()} | {:error, :not_found} + def get_by_user_and_id(%User{id: user_id}, id) do + from(c in __MODULE__, + where: c.id == ^id, + where: c.user_id == ^user_id + ) + |> Repo.find_resource() + end + + @spec get_by_id(FlakeId.Ecto.CompatType.t()) :: t() | nil def get_by_id(id) do - __MODULE__ - |> Repo.get(id) + Repo.get(__MODULE__, id) end + @spec get(FlakeId.Ecto.CompatType.t(), String.t()) :: t() | nil def get(user_id, recipient) do - __MODULE__ - |> Repo.get_by(user_id: user_id, recipient: recipient) + Repo.get_by(__MODULE__, user_id: user_id, recipient: recipient) end + @spec get_or_create(FlakeId.Ecto.CompatType.t(), String.t()) :: + {:ok, t()} | {:error, Ecto.Changeset.t()} def get_or_create(user_id, recipient) do %__MODULE__{} |> changeset(%{user_id: user_id, recipient: recipient}) @@ -60,6 +75,8 @@ def get_or_create(user_id, recipient) do ) end + @spec bump_or_create(FlakeId.Ecto.CompatType.t(), String.t()) :: + {:ok, t()} | {:error, Ecto.Changeset.t()} def bump_or_create(user_id, recipient) do %__MODULE__{} |> changeset(%{user_id: user_id, recipient: recipient}) @@ -69,4 +86,12 @@ def bump_or_create(user_id, recipient) do conflict_target: [:user_id, :recipient] ) end + + @spec for_user_query(FlakeId.Ecto.CompatType.t()) :: Ecto.Query.t() + def for_user_query(user_id) do + from(c in Chat, + where: c.user_id == ^user_id, + order_by: [desc: c.updated_at] + ) + end end diff --git a/lib/pleroma/config/deprecation_warnings.ex b/lib/pleroma/config/deprecation_warnings.ex index 412d55a77..4ba6eaa77 100644 --- a/lib/pleroma/config/deprecation_warnings.ex +++ b/lib/pleroma/config/deprecation_warnings.ex @@ -26,38 +26,25 @@ def check_hellthread_threshold do !!!DEPRECATION WARNING!!! You are using the old configuration mechanism for the hellthread filter. Please check config.md. """) - end - end - def mrf_user_allowlist do - config = Config.get(:mrf_user_allowlist) - - if config && Enum.any?(config, fn {k, _} -> is_atom(k) end) do - rewritten = - Enum.reduce(Config.get(:mrf_user_allowlist), Map.new(), fn {k, v}, acc -> - Map.put(acc, to_string(k), v) - end) - - Config.put(:mrf_user_allowlist, rewritten) - - Logger.error(""" - !!!DEPRECATION WARNING!!! - As of Pleroma 2.0.7, the `mrf_user_allowlist` setting changed of format. - Pleroma 2.1 will remove support for the old format. Please change your configuration to match this: - - config :pleroma, :mrf_user_allowlist, #{inspect(rewritten, pretty: true)} - """) + :error + else + :ok end end def warn do - check_hellthread_threshold() - mrf_user_allowlist() - check_old_mrf_config() - check_media_proxy_whitelist_config() - check_welcome_message_config() - check_gun_pool_options() - check_activity_expiration_config() + with :ok <- check_hellthread_threshold(), + :ok <- check_old_mrf_config(), + :ok <- check_media_proxy_whitelist_config(), + :ok <- check_welcome_message_config(), + :ok <- check_gun_pool_options(), + :ok <- check_activity_expiration_config() do + :ok + else + _ -> + :error + end end def check_welcome_message_config do @@ -70,10 +57,14 @@ def check_welcome_message_config do if use_old_config do Logger.error(""" !!!DEPRECATION WARNING!!! - Your config is using the old namespace for Welcome messages configuration. You need to change to the new namespace: - \n* `config :pleroma, :instance, welcome_user_nickname` is now `config :pleroma, :welcome, :direct_message, :sender_nickname` - \n* `config :pleroma, :instance, welcome_message` is now `config :pleroma, :welcome, :direct_message, :message` + Your config is using the old namespace for Welcome messages configuration. You need to convert to the new namespace. e.g., + \n* `config :pleroma, :instance, welcome_user_nickname` and `config :pleroma, :instance, welcome_message` are now equal to: + \n* `config :pleroma, :welcome, direct_message: [enabled: true, sender_nickname: "NICKNAME", message: "Your welcome message"]`" """) + + :error + else + :ok end end @@ -101,8 +92,11 @@ def move_namespace_and_warn(config_map, warning_preface) do end end) - if warning != "" do + if warning == "" do + :ok + else Logger.warn(warning_preface <> warning) + :error end end @@ -115,6 +109,10 @@ def check_media_proxy_whitelist_config do !!!DEPRECATION WARNING!!! Your config is using old format (only domain) for MediaProxy whitelist option. Setting should work for now, but you are advised to change format to scheme with port to prevent possible issues later. """) + + :error + else + :ok end end @@ -124,7 +122,7 @@ def check_gun_pool_options do if timeout = pool_config[:await_up_timeout] do Logger.warn(""" !!!DEPRECATION WARNING!!! - Your config is using old setting name `await_up_timeout` instead of `connect_timeout`. Setting should work for now, but you are advised to change format to scheme with port to prevent possible issues later. + Your config is using old setting `config :pleroma, :connections_pool, await_up_timeout`. Please change to `config :pleroma, :connections_pool, connect_timeout` to ensure compatibility with future releases. """) Config.put(:connections_pool, Keyword.put_new(pool_config, :connect_timeout, timeout)) @@ -157,6 +155,9 @@ def check_gun_pool_options do Logger.warn(Enum.join([warning_preface | pool_warnings])) Config.put(:pools, updated_config) + :error + else + :ok end end diff --git a/lib/pleroma/emails/mailer.ex b/lib/pleroma/emails/mailer.ex index 8b1bdef75..5108c71c8 100644 --- a/lib/pleroma/emails/mailer.ex +++ b/lib/pleroma/emails/mailer.ex @@ -35,6 +35,11 @@ def perform(:deliver_async, email, config), do: deliver(email, config) def deliver(email, config \\ []) def deliver(email, config) do + # temporary hackney fix until hackney max_connections bug is fixed + # https://git.pleroma.social/pleroma/pleroma/-/issues/2101 + email = + Swoosh.Email.put_private(email, :hackney_options, ssl_options: [versions: [:"tlsv1.2"]]) + case enabled?() do true -> Swoosh.Mailer.deliver(email, parse_config(config)) false -> {:error, :deliveries_disabled} diff --git a/lib/pleroma/emoji.ex b/lib/pleroma/emoji.ex index f6016d73f..04936155b 100644 --- a/lib/pleroma/emoji.ex +++ b/lib/pleroma/emoji.ex @@ -56,6 +56,9 @@ def get(name) do end end + @spec exist?(String.t()) :: boolean() + def exist?(name), do: not is_nil(get(name)) + @doc "Returns all the emojos!!" @spec get_all() :: list({String.t(), String.t(), String.t()}) def get_all do diff --git a/lib/pleroma/emoji/pack.ex b/lib/pleroma/emoji/pack.ex index d076ae312..8f1989ada 100644 --- a/lib/pleroma/emoji/pack.ex +++ b/lib/pleroma/emoji/pack.ex @@ -17,6 +17,7 @@ defmodule Pleroma.Emoji.Pack do } alias Pleroma.Emoji + alias Pleroma.Emoji.Pack @spec create(String.t()) :: {:ok, t()} | {:error, File.posix()} | {:error, :empty_values} def create(name) do @@ -64,24 +65,93 @@ def delete(name) do end end - @spec add_file(String.t(), String.t(), Path.t(), Plug.Upload.t() | String.t()) :: - {:ok, t()} | {:error, File.posix() | atom()} - def add_file(name, shortcode, filename, file) do - with :ok <- validate_not_empty([name, shortcode, filename]), + @spec unpack_zip_emojies(list(tuple())) :: list(map()) + defp unpack_zip_emojies(zip_files) do + Enum.reduce(zip_files, [], fn + {_, path, s, _, _, _}, acc when elem(s, 2) == :regular -> + with( + filename <- Path.basename(path), + shortcode <- Path.basename(filename, Path.extname(filename)), + false <- Emoji.exist?(shortcode) + ) do + [%{path: path, filename: path, shortcode: shortcode} | acc] + else + _ -> acc + end + + _, acc -> + acc + end) + end + + @spec add_file(t(), String.t(), Path.t(), Plug.Upload.t()) :: + {:ok, t()} + | {:error, File.posix() | atom()} + def add_file(%Pack{} = pack, _, _, %Plug.Upload{content_type: "application/zip"} = file) do + with {:ok, zip_files} <- :zip.table(to_charlist(file.path)), + [_ | _] = emojies <- unpack_zip_emojies(zip_files), + {:ok, tmp_dir} <- Pleroma.Utils.tmp_dir("emoji") do + try do + {:ok, _emoji_files} = + :zip.unzip( + to_charlist(file.path), + [{:file_list, Enum.map(emojies, & &1[:path])}, {:cwd, tmp_dir}] + ) + + {_, updated_pack} = + Enum.map_reduce(emojies, pack, fn item, emoji_pack -> + emoji_file = %Plug.Upload{ + filename: item[:filename], + path: Path.join(tmp_dir, item[:path]) + } + + {:ok, updated_pack} = + do_add_file( + emoji_pack, + item[:shortcode], + to_string(item[:filename]), + emoji_file + ) + + {item, updated_pack} + end) + + Emoji.reload() + + {:ok, updated_pack} + after + File.rm_rf(tmp_dir) + end + else + {:error, _} = error -> + error + + _ -> + {:ok, pack} + end + end + + def add_file(%Pack{} = pack, shortcode, filename, %Plug.Upload{} = file) do + with :ok <- validate_not_empty([shortcode, filename]), :ok <- validate_emoji_not_exists(shortcode), - {:ok, pack} <- load_pack(name), - :ok <- save_file(file, pack, filename), - {:ok, updated_pack} <- pack |> put_emoji(shortcode, filename) |> save_pack() do + {:ok, updated_pack} <- do_add_file(pack, shortcode, filename, file) do Emoji.reload() {:ok, updated_pack} end end - @spec delete_file(String.t(), String.t()) :: + defp do_add_file(pack, shortcode, filename, file) do + with :ok <- save_file(file, pack, filename) do + pack + |> put_emoji(shortcode, filename) + |> save_pack() + end + end + + @spec delete_file(t(), String.t()) :: {:ok, t()} | {:error, File.posix() | atom()} - def delete_file(name, shortcode) do - with :ok <- validate_not_empty([name, shortcode]), - {:ok, pack} <- load_pack(name), + def delete_file(%Pack{} = pack, shortcode) do + with :ok <- validate_not_empty([shortcode]), :ok <- remove_file(pack, shortcode), {:ok, updated_pack} <- pack |> delete_emoji(shortcode) |> save_pack() do Emoji.reload() @@ -89,11 +159,10 @@ def delete_file(name, shortcode) do end end - @spec update_file(String.t(), String.t(), String.t(), String.t(), boolean()) :: + @spec update_file(t(), String.t(), String.t(), String.t(), boolean()) :: {:ok, t()} | {:error, File.posix() | atom()} - def update_file(name, shortcode, new_shortcode, new_filename, force) do - with :ok <- validate_not_empty([name, shortcode, new_shortcode, new_filename]), - {:ok, pack} <- load_pack(name), + def update_file(%Pack{} = pack, shortcode, new_shortcode, new_filename, force) do + with :ok <- validate_not_empty([shortcode, new_shortcode, new_filename]), {:ok, filename} <- get_filename(pack, shortcode), :ok <- validate_emoji_not_exists(new_shortcode, force), :ok <- rename_file(pack, filename, new_filename), @@ -129,13 +198,13 @@ def import_from_filesystem do end end - @spec list_remote(String.t()) :: {:ok, map()} | {:error, atom()} - def list_remote(url) do - uri = url |> String.trim() |> URI.parse() + @spec list_remote(keyword()) :: {:ok, map()} | {:error, atom()} + def list_remote(opts) do + uri = opts[:url] |> String.trim() |> URI.parse() with :ok <- validate_shareable_packs_available(uri) do uri - |> URI.merge("/api/pleroma/emoji/packs") + |> URI.merge("/api/pleroma/emoji/packs?page=#{opts[:page]}&page_size=#{opts[:page_size]}") |> http_get() end end @@ -175,7 +244,8 @@ def download(name, url, as) do uri = url |> String.trim() |> URI.parse() with :ok <- validate_shareable_packs_available(uri), - {:ok, remote_pack} <- uri |> URI.merge("/api/pleroma/emoji/packs/#{name}") |> http_get(), + {:ok, remote_pack} <- + uri |> URI.merge("/api/pleroma/emoji/pack?name=#{name}") |> http_get(), {:ok, %{sha: sha, url: url} = pack_info} <- fetch_pack_info(remote_pack, uri, name), {:ok, archive} <- download_archive(url, sha), pack <- copy_as(remote_pack, as || name), @@ -243,9 +313,10 @@ defp validate_emoji_not_exists(shortcode, force \\ false) defp validate_emoji_not_exists(_shortcode, true), do: :ok defp validate_emoji_not_exists(shortcode, _) do - case Emoji.get(shortcode) do - nil -> :ok - _ -> {:error, :already_exists} + if Emoji.exist?(shortcode) do + {:error, :already_exists} + else + :ok end end @@ -386,25 +457,18 @@ defp validate_not_empty(list) do end end - defp save_file(file, pack, filename) do + defp save_file(%Plug.Upload{path: upload_path}, pack, filename) do file_path = Path.join(pack.path, filename) create_subdirs(file_path) - case file do - %Plug.Upload{path: upload_path} -> - # Copy the uploaded file from the temporary directory - with {:ok, _} <- File.copy(upload_path, file_path), do: :ok - - url when is_binary(url) -> - # Download and write the file - file_contents = Tesla.get!(url).body - File.write(file_path, file_contents) + with {:ok, _} <- File.copy(upload_path, file_path) do + :ok end end defp put_emoji(pack, shortcode, filename) do files = Map.put(pack.files, shortcode, filename) - %{pack | files: files} + %{pack | files: files, files_count: length(Map.keys(files))} end defp delete_emoji(pack, shortcode) do @@ -460,7 +524,7 @@ defp get_filename(pack, shortcode) do defp http_get(%URI{} = url), do: url |> to_string() |> http_get() defp http_get(url) do - with {:ok, %{body: body}} <- url |> Pleroma.HTTP.get() do + with {:ok, %{body: body}} <- Pleroma.HTTP.get(url, [], pool: :default) do Jason.decode(body) end end @@ -509,7 +573,7 @@ defp fetch_pack_info(remote_pack, uri, name) do {:ok, %{ sha: sha, - url: URI.merge(uri, "/api/pleroma/emoji/packs/#{name}/archive") |> to_string() + url: URI.merge(uri, "/api/pleroma/emoji/packs/archive?name=#{name}") |> to_string() }} %{"fallback-src" => src, "fallback-src-sha256" => sha} when is_binary(src) -> diff --git a/lib/pleroma/gun/conn.ex b/lib/pleroma/gun/conn.ex index 75b1ffc0a..477e19c6e 100644 --- a/lib/pleroma/gun/conn.ex +++ b/lib/pleroma/gun/conn.ex @@ -50,10 +50,10 @@ defp do_open(uri, %{proxy: {proxy_host, proxy_port}} = opts) do with open_opts <- Map.delete(opts, :tls_opts), {:ok, conn} <- Gun.open(proxy_host, proxy_port, open_opts), - {:ok, _} <- Gun.await_up(conn, opts[:connect_timeout]), + {:ok, protocol} <- Gun.await_up(conn, opts[:connect_timeout]), stream <- Gun.connect(conn, connect_opts), {:response, :fin, 200, _} <- Gun.await(conn, stream) do - {:ok, conn} + {:ok, conn, protocol} else error -> Logger.warn( @@ -88,8 +88,8 @@ defp do_open(uri, %{proxy: {proxy_type, proxy_host, proxy_port}} = opts) do |> Map.put(:socks_opts, socks_opts) with {:ok, conn} <- Gun.open(proxy_host, proxy_port, opts), - {:ok, _} <- Gun.await_up(conn, opts[:connect_timeout]) do - {:ok, conn} + {:ok, protocol} <- Gun.await_up(conn, opts[:connect_timeout]) do + {:ok, conn, protocol} else error -> Logger.warn( @@ -106,8 +106,8 @@ defp do_open(%URI{host: host, port: port} = uri, opts) do host = Pleroma.HTTP.AdapterHelper.parse_host(host) with {:ok, conn} <- Gun.open(host, port, opts), - {:ok, _} <- Gun.await_up(conn, opts[:connect_timeout]) do - {:ok, conn} + {:ok, protocol} <- Gun.await_up(conn, opts[:connect_timeout]) do + {:ok, conn, protocol} else error -> Logger.warn( diff --git a/lib/pleroma/gun/connection_pool/worker.ex b/lib/pleroma/gun/connection_pool/worker.ex index c36332817..bf57e9e5f 100644 --- a/lib/pleroma/gun/connection_pool/worker.ex +++ b/lib/pleroma/gun/connection_pool/worker.ex @@ -15,7 +15,7 @@ def init([_key, _uri, _opts, _client_pid] = opts) do @impl true def handle_continue({:connect, [key, uri, opts, client_pid]}, _) do - with {:ok, conn_pid} <- Gun.Conn.open(uri, opts), + with {:ok, conn_pid, protocol} <- Gun.Conn.open(uri, opts), Process.link(conn_pid) do time = :erlang.monotonic_time(:millisecond) @@ -27,8 +27,12 @@ def handle_continue({:connect, [key, uri, opts, client_pid]}, _) do send(client_pid, {:conn_pid, conn_pid}) {:noreply, - %{key: key, timer: nil, client_monitors: %{client_pid => Process.monitor(client_pid)}}, - :hibernate} + %{ + key: key, + timer: nil, + client_monitors: %{client_pid => Process.monitor(client_pid)}, + protocol: protocol + }, :hibernate} else err -> {:stop, {:shutdown, err}, nil} @@ -53,14 +57,20 @@ def handle_cast({:remove_client, client_pid}, state) do end @impl true - def handle_call(:add_client, {client_pid, _}, %{key: key} = state) do + def handle_call(:add_client, {client_pid, _}, %{key: key, protocol: protocol} = state) do time = :erlang.monotonic_time(:millisecond) - {{conn_pid, _, _, _}, _} = + {{conn_pid, used_by, _, _}, _} = Registry.update_value(@registry, key, fn {conn_pid, used_by, crf, last_reference} -> {conn_pid, [client_pid | used_by], crf(time - last_reference, crf), time} end) + :telemetry.execute( + [:pleroma, :connection_pool, :client, :add], + %{client_pid: client_pid, clients: used_by}, + %{key: state.key, protocol: protocol} + ) + state = if state.timer != nil do Process.cancel_timer(state[:timer]) @@ -83,25 +93,18 @@ def handle_call(:remove_client, {client_pid, _}, %{key: key} = state) do end) {ref, state} = pop_in(state.client_monitors[client_pid]) - # DOWN message can receive right after `remove_client` call and cause worker to terminate - state = - if is_nil(ref) do - state + + Process.demonitor(ref, [:flush]) + + timer = + if used_by == [] do + max_idle = Pleroma.Config.get([:connections_pool, :max_idle_time], 30_000) + Process.send_after(self(), :idle_close, max_idle) else - Process.demonitor(ref) - - timer = - if used_by == [] do - max_idle = Pleroma.Config.get([:connections_pool, :max_idle_time], 30_000) - Process.send_after(self(), :idle_close, max_idle) - else - nil - end - - %{state | timer: timer} + nil end - {:reply, :ok, state, :hibernate} + {:reply, :ok, %{state | timer: timer}, :hibernate} end @impl true @@ -131,7 +134,7 @@ def handle_info({:gun_down, _pid, _protocol, _reason, _killed_streams}, state) d @impl true def handle_info({:DOWN, _ref, :process, pid, reason}, state) do :telemetry.execute( - [:pleroma, :connection_pool, :client_death], + [:pleroma, :connection_pool, :client, :dead], %{client_pid: pid, reason: reason}, %{key: state.key} ) diff --git a/lib/pleroma/helpers/media_helper.ex b/lib/pleroma/helpers/media_helper.ex new file mode 100644 index 000000000..6b799173e --- /dev/null +++ b/lib/pleroma/helpers/media_helper.ex @@ -0,0 +1,162 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Helpers.MediaHelper do + @moduledoc """ + Handles common media-related operations. + """ + + alias Pleroma.HTTP + + require Logger + + def missing_dependencies do + Enum.reduce([imagemagick: "convert", ffmpeg: "ffmpeg"], [], fn {sym, executable}, acc -> + if Pleroma.Utils.command_available?(executable) do + acc + else + [sym | acc] + end + end) + end + + def image_resize(url, options) do + with executable when is_binary(executable) <- System.find_executable("convert"), + {:ok, args} <- prepare_image_resize_args(options), + {:ok, env} <- HTTP.get(url, [], pool: :media), + {:ok, fifo_path} <- mkfifo() do + args = List.flatten([fifo_path, args]) + run_fifo(fifo_path, env, executable, args) + else + nil -> {:error, {:convert, :command_not_found}} + {:error, _} = error -> error + end + end + + defp prepare_image_resize_args( + %{max_width: max_width, max_height: max_height, format: "png"} = options + ) do + quality = options[:quality] || 85 + resize = Enum.join([max_width, "x", max_height, ">"]) + + args = [ + "-resize", + resize, + "-quality", + to_string(quality), + "png:-" + ] + + {:ok, args} + end + + defp prepare_image_resize_args(%{max_width: max_width, max_height: max_height} = options) do + quality = options[:quality] || 85 + resize = Enum.join([max_width, "x", max_height, ">"]) + + args = [ + "-interlace", + "Plane", + "-resize", + resize, + "-quality", + to_string(quality), + "jpg:-" + ] + + {:ok, args} + end + + defp prepare_image_resize_args(_), do: {:error, :missing_options} + + # Note: video thumbnail is intentionally not resized (always has original dimensions) + def video_framegrab(url) do + with executable when is_binary(executable) <- System.find_executable("ffmpeg"), + {:ok, env} <- HTTP.get(url, [], pool: :media), + {:ok, fifo_path} <- mkfifo(), + args = [ + "-y", + "-i", + fifo_path, + "-vframes", + "1", + "-f", + "mjpeg", + "-loglevel", + "error", + "-" + ] do + run_fifo(fifo_path, env, executable, args) + else + nil -> {:error, {:ffmpeg, :command_not_found}} + {:error, _} = error -> error + end + end + + defp run_fifo(fifo_path, env, executable, args) do + pid = + Port.open({:spawn_executable, executable}, [ + :use_stdio, + :stream, + :exit_status, + :binary, + args: args + ]) + + fifo = Port.open(to_charlist(fifo_path), [:eof, :binary, :stream, :out]) + fix = Pleroma.Helpers.QtFastStart.fix(env.body) + true = Port.command(fifo, fix) + :erlang.port_close(fifo) + loop_recv(pid) + after + File.rm(fifo_path) + end + + defp mkfifo do + path = Path.join(System.tmp_dir!(), "pleroma-media-preview-pipe-#{Ecto.UUID.generate()}") + + case System.cmd("mkfifo", [path]) do + {_, 0} -> + spawn(fifo_guard(path)) + {:ok, path} + + {_, err} -> + {:error, {:fifo_failed, err}} + end + end + + defp fifo_guard(path) do + pid = self() + + fn -> + ref = Process.monitor(pid) + + receive do + {:DOWN, ^ref, :process, ^pid, _} -> + File.rm(path) + end + end + end + + defp loop_recv(pid) do + loop_recv(pid, <<>>) + end + + defp loop_recv(pid, acc) do + receive do + {^pid, {:data, data}} -> + loop_recv(pid, acc <> data) + + {^pid, {:exit_status, 0}} -> + {:ok, acc} + + {^pid, {:exit_status, status}} -> + {:error, status} + after + 5000 -> + :erlang.port_close(pid) + {:error, :timeout} + end + end +end diff --git a/lib/pleroma/helpers/qt_fast_start.ex b/lib/pleroma/helpers/qt_fast_start.ex new file mode 100644 index 000000000..bb93224b5 --- /dev/null +++ b/lib/pleroma/helpers/qt_fast_start.ex @@ -0,0 +1,131 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Helpers.QtFastStart do + @moduledoc """ + (WIP) Converts a "slow start" (data before metadatas) mov/mp4 file to a "fast start" one (metadatas before data). + """ + + # TODO: Cleanup and optimizations + # Inspirations: https://www.ffmpeg.org/doxygen/3.4/qt-faststart_8c_source.html + # https://github.com/danielgtaylor/qtfaststart/blob/master/qtfaststart/processor.py + # ISO/IEC 14496-12:2015, ISO/IEC 15444-12:2015 + # Paracetamol + + def fix(<<0x00, 0x00, 0x00, _, 0x66, 0x74, 0x79, 0x70, _::bits>> = binary) do + index = fix(binary, 0, nil, nil, []) + + case index do + :abort -> binary + [{"ftyp", _, _, _, _}, {"mdat", _, _, _, _} | _] -> faststart(index) + [{"ftyp", _, _, _, _}, {"free", _, _, _, _}, {"mdat", _, _, _, _} | _] -> faststart(index) + _ -> binary + end + end + + def fix(binary) do + binary + end + + # MOOV have been seen before MDAT- abort + defp fix(<<_::bits>>, _, true, false, _) do + :abort + end + + defp fix( + <>, + pos, + got_moov, + got_mdat, + acc + ) do + full_size = (size - 8) * 8 + <> = rest + + acc = [ + {fourcc, pos, pos + size, size, + <>} + | acc + ] + + fix(rest, pos + size, got_moov || fourcc == "moov", got_mdat || fourcc == "mdat", acc) + end + + defp fix(<<>>, _pos, _, _, acc) do + :lists.reverse(acc) + end + + defp faststart(index) do + {{_ftyp, _, _, _, ftyp}, index} = List.keytake(index, "ftyp", 0) + + # Skip re-writing the free fourcc as it's kind of useless. + # Why stream useless bytes when you can do without? + {free_size, index} = + case List.keytake(index, "free", 0) do + {{_, _, _, size, _}, index} -> {size, index} + _ -> {0, index} + end + + {{_moov, _, _, moov_size, moov}, index} = List.keytake(index, "moov", 0) + offset = -free_size + moov_size + rest = for {_, _, _, _, data} <- index, do: data, into: [] + <> = moov + [ftyp, moov_head, fix_moov(moov_data, offset, []), rest] + end + + defp fix_moov( + <>, + offset, + acc + ) do + full_size = (size - 8) * 8 + <> = rest + + data = + cond do + fourcc in ["trak", "mdia", "minf", "stbl"] -> + # Theses contains sto or co64 part + [<>, fix_moov(data, offset, [])] + + fourcc in ["stco", "co64"] -> + # fix the damn thing + <> = data + + entry_size = + case fourcc do + "stco" -> 32 + "co64" -> 64 + end + + [ + <>, + rewrite_entries(entry_size, offset, rest, []) + ] + + true -> + [<>, data] + end + + acc = [acc | data] + fix_moov(rest, offset, acc) + end + + defp fix_moov(<<>>, _, acc), do: acc + + for size <- [32, 64] do + defp rewrite_entries( + unquote(size), + offset, + <>, + acc + ) do + rewrite_entries(unquote(size), offset, rest, [ + acc | <> + ]) + end + end + + defp rewrite_entries(_, _, <<>>, acc), do: acc +end diff --git a/lib/pleroma/helpers/uri_helper.ex b/lib/pleroma/helpers/uri_helper.ex index 6d205a636..f1301f055 100644 --- a/lib/pleroma/helpers/uri_helper.ex +++ b/lib/pleroma/helpers/uri_helper.ex @@ -3,18 +3,22 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Helpers.UriHelper do - def append_uri_params(uri, appended_params) do + def modify_uri_params(uri, overridden_params, deleted_params \\ []) do uri = URI.parse(uri) - appended_params = for {k, v} <- appended_params, into: %{}, do: {to_string(k), v} - existing_params = URI.query_decoder(uri.query || "") |> Enum.into(%{}) - updated_params_keys = Enum.uniq(Map.keys(existing_params) ++ Map.keys(appended_params)) + + existing_params = URI.query_decoder(uri.query || "") |> Map.new() + overridden_params = Map.new(overridden_params, fn {k, v} -> {to_string(k), v} end) + deleted_params = Enum.map(deleted_params, &to_string/1) updated_params = - for k <- updated_params_keys, do: {k, appended_params[k] || existing_params[k]} + existing_params + |> Map.merge(overridden_params) + |> Map.drop(deleted_params) uri |> Map.put(:query, URI.encode_query(updated_params)) |> URI.to_string() + |> String.replace_suffix("?", "") end def maybe_add_base("/" <> uri, base), do: Path.join([base, uri]) diff --git a/lib/pleroma/http/web_push.ex b/lib/pleroma/http/web_push.ex new file mode 100644 index 000000000..78148a12e --- /dev/null +++ b/lib/pleroma/http/web_push.ex @@ -0,0 +1,12 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.HTTP.WebPush do + @moduledoc false + + def post(url, payload, headers) do + list_headers = Map.to_list(headers) + Pleroma.HTTP.post(url, payload, list_headers) + end +end diff --git a/lib/pleroma/instances/instance.ex b/lib/pleroma/instances/instance.ex index 8bf53c090..f0f601469 100644 --- a/lib/pleroma/instances/instance.ex +++ b/lib/pleroma/instances/instance.ex @@ -156,16 +156,12 @@ def get_or_update_favicon(%URI{host: host} = instance_uri) do defp scrape_favicon(%URI{} = instance_uri) do try do with {:ok, %Tesla.Env{body: html}} <- - Pleroma.HTTP.get(to_string(instance_uri), [{"accept", "text/html"}], - adapter: [pool: :media] - ), - favicon_rel <- - html - |> Floki.parse_document!() - |> Floki.attribute("link[rel=icon]", "href") - |> List.first(), - favicon <- URI.merge(instance_uri, favicon_rel) |> to_string(), - true <- is_binary(favicon) do + Pleroma.HTTP.get(to_string(instance_uri), [{"accept", "text/html"}], pool: :media), + {_, [favicon_rel | _]} when is_binary(favicon_rel) <- + {:parse, + html |> Floki.parse_document!() |> Floki.attribute("link[rel=icon]", "href")}, + {_, favicon} when is_binary(favicon) <- + {:merge, URI.merge(instance_uri, favicon_rel) |> to_string()} do favicon else _ -> nil diff --git a/lib/pleroma/migration_helper/notification_backfill.ex b/lib/pleroma/migration_helper/notification_backfill.ex index d260e62ca..24f4733fe 100644 --- a/lib/pleroma/migration_helper/notification_backfill.ex +++ b/lib/pleroma/migration_helper/notification_backfill.ex @@ -19,13 +19,13 @@ def fill_in_notification_types do query |> Repo.chunk_stream(100) |> Enum.each(fn notification -> - type = - notification.activity - |> type_from_activity() + if notification.activity do + type = type_from_activity(notification.activity) - notification - |> Ecto.Changeset.change(%{type: type}) - |> Repo.update() + notification + |> Ecto.Changeset.change(%{type: type}) + |> Repo.update() + end end) end @@ -72,8 +72,7 @@ defp type_from_activity(%{data: %{"type" => type}} = activity) do "pleroma:emoji_reaction" "Create" -> - activity - |> type_from_activity_object() + type_from_activity_object(activity) t -> raise "No notification type for activity type #{t}" diff --git a/lib/pleroma/moderation_log.ex b/lib/pleroma/moderation_log.ex index 31c9afe2a..47036a6f6 100644 --- a/lib/pleroma/moderation_log.ex +++ b/lib/pleroma/moderation_log.ex @@ -320,6 +320,19 @@ def insert_log(%{ |> insert_log_entry_with_message() end + @spec insert_log(%{actor: User, action: String.t(), subject_id: String.t()}) :: + {:ok, ModerationLog} | {:error, any} + def insert_log(%{actor: %User{} = actor, action: "chat_message_delete", subject_id: subject_id}) do + %ModerationLog{ + data: %{ + "actor" => %{"nickname" => actor.nickname}, + "action" => "chat_message_delete", + "subject_id" => subject_id + } + } + |> insert_log_entry_with_message() + end + @spec insert_log_entry_with_message(ModerationLog) :: {:ok, ModerationLog} | {:error, any} defp insert_log_entry_with_message(entry) do entry.data["message"] @@ -627,6 +640,17 @@ def get_log_entry_message(%ModerationLog{ "@#{actor_nickname} updated users: #{users_to_nicknames_string(subjects)}" end + @spec get_log_entry_message(ModerationLog) :: String.t() + def get_log_entry_message(%ModerationLog{ + data: %{ + "actor" => %{"nickname" => actor_nickname}, + "action" => "chat_message_delete", + "subject_id" => subject_id + } + }) do + "@#{actor_nickname} deleted chat message ##{subject_id}" + end + defp nicknames_to_string(nicknames) do nicknames |> Enum.map(&"@#{&1}") diff --git a/lib/pleroma/object/fetcher.ex b/lib/pleroma/object/fetcher.ex index 1de2ce6c3..169298b34 100644 --- a/lib/pleroma/object/fetcher.ex +++ b/lib/pleroma/object/fetcher.ex @@ -12,6 +12,7 @@ defmodule Pleroma.Object.Fetcher do alias Pleroma.Web.ActivityPub.ObjectValidator alias Pleroma.Web.ActivityPub.Transmogrifier alias Pleroma.Web.Federator + alias Pleroma.Web.FedSockets require Logger require Pleroma.Constants @@ -98,8 +99,8 @@ def fetch_object_from_id(id, options \\ []) do {:containment, _} -> {:error, "Object containment failed."} - {:transmogrifier, {:error, {:reject, nil}}} -> - {:reject, nil} + {:transmogrifier, {:error, {:reject, e}}} -> + {:reject, e} {:transmogrifier, _} = e -> {:error, e} @@ -182,27 +183,20 @@ defp maybe_date_fetch(headers, date) do end end - def fetch_and_contain_remote_object_from_id(id) when is_binary(id) do + def fetch_and_contain_remote_object_from_id(prm, opts \\ []) + + def fetch_and_contain_remote_object_from_id(%{"id" => id}, opts), + do: fetch_and_contain_remote_object_from_id(id, opts) + + def fetch_and_contain_remote_object_from_id(id, opts) when is_binary(id) do Logger.debug("Fetching object #{id} via AP") - date = Pleroma.Signature.signed_date() - - headers = - [{"accept", "application/activity+json"}] - |> maybe_date_fetch(date) - |> sign_fetch(id, date) - - Logger.debug("Fetch headers: #{inspect(headers)}") - with {:scheme, true} <- {:scheme, String.starts_with?(id, "http")}, - {:ok, %{body: body, status: code}} when code in 200..299 <- HTTP.get(id, headers), - {:ok, data} <- Jason.decode(body), + {:ok, body} <- get_object(id, opts), + {:ok, data} <- safe_json_decode(body), :ok <- Containment.contain_origin_from_id(id, data) do {:ok, data} else - {:ok, %{status: code}} when code in [404, 410] -> - {:error, "Object has been deleted"} - {:scheme, _} -> {:error, "Unsupported URI scheme"} @@ -214,8 +208,44 @@ def fetch_and_contain_remote_object_from_id(id) when is_binary(id) do end end - def fetch_and_contain_remote_object_from_id(%{"id" => id}), - do: fetch_and_contain_remote_object_from_id(id) + def fetch_and_contain_remote_object_from_id(_id, _opts), + do: {:error, "id must be a string"} - def fetch_and_contain_remote_object_from_id(_id), do: {:error, "id must be a string"} + defp get_object(id, opts) do + with false <- Keyword.get(opts, :force_http, false), + {:ok, fedsocket} <- FedSockets.get_or_create_fed_socket(id) do + Logger.debug("fetching via fedsocket - #{inspect(id)}") + FedSockets.fetch(fedsocket, id) + else + _other -> + Logger.debug("fetching via http - #{inspect(id)}") + get_object_http(id) + end + end + + defp get_object_http(id) do + date = Pleroma.Signature.signed_date() + + headers = + [{"accept", "application/activity+json"}] + |> maybe_date_fetch(date) + |> sign_fetch(id, date) + + case HTTP.get(id, headers) do + {:ok, %{body: body, status: code}} when code in 200..299 -> + {:ok, body} + + {:ok, %{status: code}} when code in [404, 410] -> + {:error, "Object has been deleted"} + + {:error, e} -> + {:error, e} + + e -> + {:error, e} + end + end + + defp safe_json_decode(nil), do: {:ok, nil} + defp safe_json_decode(json), do: Jason.decode(json) end diff --git a/lib/pleroma/plugs/oauth_scopes_plug.ex b/lib/pleroma/plugs/oauth_scopes_plug.ex index efc25b79f..b1a736d78 100644 --- a/lib/pleroma/plugs/oauth_scopes_plug.ex +++ b/lib/pleroma/plugs/oauth_scopes_plug.ex @@ -53,7 +53,7 @@ def drop_auth_info(conn) do |> assign(:token, nil) end - @doc "Filters descendants of supported scopes" + @doc "Keeps those of `scopes` which are descendants of `supported_scopes`" def filter_descendants(scopes, supported_scopes) do Enum.filter( scopes, diff --git a/lib/pleroma/plugs/remote_ip.ex b/lib/pleroma/plugs/remote_ip.ex index 0ac9050d0..987022156 100644 --- a/lib/pleroma/plugs/remote_ip.ex +++ b/lib/pleroma/plugs/remote_ip.ex @@ -7,48 +7,42 @@ defmodule Pleroma.Plugs.RemoteIp do This is a shim to call [`RemoteIp`](https://git.pleroma.social/pleroma/remote_ip) but with runtime configuration. """ + alias Pleroma.Config import Plug.Conn @behaviour Plug - @headers ~w[ - x-forwarded-for - ] - - # https://en.wikipedia.org/wiki/Localhost - # https://en.wikipedia.org/wiki/Private_network - @reserved ~w[ - 127.0.0.0/8 - ::1/128 - fc00::/7 - 10.0.0.0/8 - 172.16.0.0/12 - 192.168.0.0/16 - ] - def init(_), do: nil def call(%{remote_ip: original_remote_ip} = conn, _) do - config = Pleroma.Config.get(__MODULE__, []) - - if Keyword.get(config, :enabled, false) do - %{remote_ip: new_remote_ip} = conn = RemoteIp.call(conn, remote_ip_opts(config)) + if Config.get([__MODULE__, :enabled]) do + %{remote_ip: new_remote_ip} = conn = RemoteIp.call(conn, remote_ip_opts()) assign(conn, :remote_ip_found, original_remote_ip != new_remote_ip) else conn end end - defp remote_ip_opts(config) do - headers = config |> Keyword.get(:headers, @headers) |> MapSet.new() - reserved = Keyword.get(config, :reserved, @reserved) + defp remote_ip_opts do + headers = Config.get([__MODULE__, :headers], []) |> MapSet.new() + reserved = Config.get([__MODULE__, :reserved], []) proxies = - config - |> Keyword.get(:proxies, []) + Config.get([__MODULE__, :proxies], []) |> Enum.concat(reserved) - |> Enum.map(&InetCidr.parse/1) + |> Enum.map(&maybe_add_cidr/1) {headers, proxies} end + + defp maybe_add_cidr(proxy) when is_binary(proxy) do + proxy = + cond do + "/" in String.codepoints(proxy) -> proxy + InetCidr.v4?(InetCidr.parse_address!(proxy)) -> proxy <> "/32" + InetCidr.v6?(InetCidr.parse_address!(proxy)) -> proxy <> "/128" + end + + InetCidr.parse(proxy, true) + end end diff --git a/lib/pleroma/repo.ex b/lib/pleroma/repo.ex index f317e4d58..4524bd5e2 100644 --- a/lib/pleroma/repo.ex +++ b/lib/pleroma/repo.ex @@ -49,7 +49,21 @@ def get_assoc(resource, association) do end end - def chunk_stream(query, chunk_size) do + @doc """ + Returns a lazy enumerable that emits all entries from the data store matching the given query. + + `returns_as` use to group records. use the `batches` option to fetch records in bulk. + + ## Examples + + # fetch records one-by-one + iex> Pleroma.Repo.chunk_stream(Pleroma.Activity.Queries.by_actor(ap_id), 500) + + # fetch records in bulk + iex> Pleroma.Repo.chunk_stream(Pleroma.Activity.Queries.by_actor(ap_id), 500, :batches) + """ + @spec chunk_stream(Ecto.Query.t(), integer(), atom()) :: Enumerable.t() + def chunk_stream(query, chunk_size, returns_as \\ :one) do # We don't actually need start and end funcitons of resource streaming, # but it seems to be the only way to not fetch records one-by-one and # have individual records be the elements of the stream, instead of @@ -69,7 +83,12 @@ def chunk_stream(query, chunk_size) do records -> last_id = List.last(records).id - {records, last_id} + + if returns_as == :one do + {records, last_id} + else + {[records], last_id} + end end end, fn _ -> :ok end diff --git a/lib/pleroma/repo_streamer.ex b/lib/pleroma/repo_streamer.ex deleted file mode 100644 index cb4d7bb7a..000000000 --- a/lib/pleroma/repo_streamer.ex +++ /dev/null @@ -1,34 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.RepoStreamer do - alias Pleroma.Repo - import Ecto.Query - - def chunk_stream(query, chunk_size) do - Stream.unfold(0, fn - :halt -> - {[], :halt} - - last_id -> - query - |> order_by(asc: :id) - |> where([r], r.id > ^last_id) - |> limit(^chunk_size) - |> Repo.all() - |> case do - [] -> - {[], :halt} - - records -> - last_id = List.last(records).id - {records, last_id} - end - end) - |> Stream.take_while(fn - [] -> false - _ -> true - end) - end -end diff --git a/lib/pleroma/reverse_proxy/reverse_proxy.ex b/lib/pleroma/reverse_proxy/reverse_proxy.ex index 0de4e2309..8ae1157df 100644 --- a/lib/pleroma/reverse_proxy/reverse_proxy.ex +++ b/lib/pleroma/reverse_proxy/reverse_proxy.ex @@ -17,6 +17,9 @@ defmodule Pleroma.ReverseProxy do @failed_request_ttl :timer.seconds(60) @methods ~w(GET HEAD) + def max_read_duration_default, do: @max_read_duration + def default_cache_control_header, do: @default_cache_control_header + @moduledoc """ A reverse proxy. @@ -391,6 +394,8 @@ defp body_size_constraint(size, limit) when is_integer(limit) and limit > 0 and defp body_size_constraint(_, _), do: :ok + defp check_read_duration(nil = _duration, max), do: check_read_duration(@max_read_duration, max) + defp check_read_duration(duration, max) when is_integer(duration) and is_integer(max) and max > 0 do if duration > max do diff --git a/lib/pleroma/signature.ex b/lib/pleroma/signature.ex index 3aa6909d2..e388993b7 100644 --- a/lib/pleroma/signature.ex +++ b/lib/pleroma/signature.ex @@ -39,7 +39,7 @@ def key_id_to_actor_id(key_id) do def fetch_public_key(conn) do with %{"keyId" => kid} <- HTTPSignatures.signature_for_conn(conn), {:ok, actor_id} <- key_id_to_actor_id(kid), - {:ok, public_key} <- User.get_public_key_for_ap_id(actor_id) do + {:ok, public_key} <- User.get_public_key_for_ap_id(actor_id, force_http: true) do {:ok, public_key} else e -> @@ -50,8 +50,8 @@ def fetch_public_key(conn) do def refetch_public_key(conn) do with %{"keyId" => kid} <- HTTPSignatures.signature_for_conn(conn), {:ok, actor_id} <- key_id_to_actor_id(kid), - {:ok, _user} <- ActivityPub.make_user_from_ap_id(actor_id), - {:ok, public_key} <- User.get_public_key_for_ap_id(actor_id) do + {:ok, _user} <- ActivityPub.make_user_from_ap_id(actor_id, force_http: true), + {:ok, public_key} <- User.get_public_key_for_ap_id(actor_id, force_http: true) do {:ok, public_key} else e -> diff --git a/lib/pleroma/telemetry/logger.ex b/lib/pleroma/telemetry/logger.ex index 4cacae02f..197b1d091 100644 --- a/lib/pleroma/telemetry/logger.ex +++ b/lib/pleroma/telemetry/logger.ex @@ -7,7 +7,8 @@ defmodule Pleroma.Telemetry.Logger do [:pleroma, :connection_pool, :reclaim, :start], [:pleroma, :connection_pool, :reclaim, :stop], [:pleroma, :connection_pool, :provision_failure], - [:pleroma, :connection_pool, :client_death] + [:pleroma, :connection_pool, :client, :dead], + [:pleroma, :connection_pool, :client, :add] ] def attach do :telemetry.attach_many("pleroma-logger", @events, &handle_event/4, []) @@ -62,7 +63,7 @@ def handle_event( end def handle_event( - [:pleroma, :connection_pool, :client_death], + [:pleroma, :connection_pool, :client, :dead], %{client_pid: client_pid, reason: reason}, %{key: key}, _ @@ -73,4 +74,17 @@ def handle_event( }" end) end + + def handle_event( + [:pleroma, :connection_pool, :client, :add], + %{clients: [_, _ | _] = clients}, + %{key: key, protocol: :http}, + _ + ) do + Logger.info(fn -> + "Pool worker for #{key}: #{length(clients)} clients are using an HTTP1 connection at the same time, head-of-line blocking might occur." + end) + end + + def handle_event([:pleroma, :connection_pool, :client, :add], _, _, _), do: :ok end diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index e73d19964..09ea80793 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -25,7 +25,6 @@ defmodule Pleroma.User do alias Pleroma.Object alias Pleroma.Registration alias Pleroma.Repo - alias Pleroma.RepoStreamer alias Pleroma.User alias Pleroma.UserRelationship alias Pleroma.Web @@ -276,9 +275,9 @@ def binary_id(%User{} = user), do: binary_id(user.id) @spec account_status(User.t()) :: account_status() def account_status(%User{deactivated: true}), do: :deactivated def account_status(%User{password_reset_pending: true}), do: :password_reset_pending - def account_status(%User{approval_pending: true}), do: :approval_pending + def account_status(%User{local: true, approval_pending: true}), do: :approval_pending - def account_status(%User{confirmation_pending: true}) do + def account_status(%User{local: true, confirmation_pending: true}) do if Config.get([:instance, :account_activation_required]) do :confirmation_pending else @@ -814,7 +813,8 @@ def send_welcome_email(%User{email: email} = user) when is_binary(email) do def send_welcome_email(_), do: {:ok, :noop} @spec try_send_confirmation_email(User.t()) :: {:ok, :enqueued | :noop} - def try_send_confirmation_email(%User{confirmation_pending: true} = user) do + def try_send_confirmation_email(%User{confirmation_pending: true, email: email} = user) + when is_binary(email) do if Config.get([:instance, :account_activation_required]) do send_confirmation_email(user) {:ok, :enqueued} @@ -915,9 +915,7 @@ defp do_unfollow(%User{} = follower, %User{} = followed) do FollowingRelationship.unfollow(follower, followed) {:ok, followed} = update_follower_count(followed) - {:ok, follower} = - follower - |> update_following_count() + {:ok, follower} = update_following_count(follower) {:ok, follower, followed} @@ -1686,42 +1684,6 @@ def perform(:delete, %User{} = user) do def perform(:deactivate_async, user, status), do: deactivate(user, status) - @spec perform(atom(), User.t(), list()) :: list() | {:error, any()} - def perform(:blocks_import, %User{} = blocker, blocked_identifiers) - when is_list(blocked_identifiers) do - Enum.map( - blocked_identifiers, - fn blocked_identifier -> - with {:ok, %User{} = blocked} <- get_or_fetch(blocked_identifier), - {:ok, _block} <- CommonAPI.block(blocker, blocked) do - blocked - else - err -> - Logger.debug("blocks_import failed for #{blocked_identifier} with: #{inspect(err)}") - err - end - end - ) - end - - def perform(:follow_import, %User{} = follower, followed_identifiers) - when is_list(followed_identifiers) do - Enum.map( - followed_identifiers, - fn followed_identifier -> - with {:ok, %User{} = followed} <- get_or_fetch(followed_identifier), - {:ok, follower} <- maybe_direct_follow(follower, followed), - {:ok, _, _, _} <- CommonAPI.follow(follower, followed) do - followed - else - err -> - Logger.debug("follow_import failed for #{followed_identifier} with: #{inspect(err)}") - err - end - end - ) - end - @spec external_users_query() :: Ecto.Query.t() def external_users_query do User.Query.build(%{ @@ -1750,21 +1712,6 @@ def external_users(opts \\ []) do Repo.all(query) end - def blocks_import(%User{} = blocker, blocked_identifiers) when is_list(blocked_identifiers) do - BackgroundWorker.enqueue("blocks_import", %{ - "blocker_id" => blocker.id, - "blocked_identifiers" => blocked_identifiers - }) - end - - def follow_import(%User{} = follower, followed_identifiers) - when is_list(followed_identifiers) do - BackgroundWorker.enqueue("follow_import", %{ - "follower_id" => follower.id, - "followed_identifiers" => followed_identifiers - }) - end - def delete_notifications_from_user_activities(%User{ap_id: ap_id}) do Notification |> join(:inner, [n], activity in assoc(n, :activity)) @@ -1775,7 +1722,7 @@ def delete_notifications_from_user_activities(%User{ap_id: ap_id}) do def delete_user_activities(%User{ap_id: ap_id} = user) do ap_id |> Activity.Queries.by_actor() - |> RepoStreamer.chunk_stream(50) + |> Repo.chunk_stream(50, :batches) |> Stream.each(fn activities -> Enum.each(activities, fn activity -> delete_activity(activity, user) end) end) @@ -1821,12 +1768,12 @@ def html_filter_policy(%User{no_rich_text: true}) do def html_filter_policy(_), do: Config.get([:markup, :scrub_policy]) - def fetch_by_ap_id(ap_id), do: ActivityPub.make_user_from_ap_id(ap_id) + def fetch_by_ap_id(ap_id, opts \\ []), do: ActivityPub.make_user_from_ap_id(ap_id, opts) - def get_or_fetch_by_ap_id(ap_id) do + def get_or_fetch_by_ap_id(ap_id, opts \\ []) do cached_user = get_cached_by_ap_id(ap_id) - maybe_fetched_user = needs_update?(cached_user) && fetch_by_ap_id(ap_id) + maybe_fetched_user = needs_update?(cached_user) && fetch_by_ap_id(ap_id, opts) case {cached_user, maybe_fetched_user} do {_, {:ok, %User{} = user}} -> @@ -1899,8 +1846,8 @@ def public_key(%{public_key: public_key_pem}) when is_binary(public_key_pem) do def public_key(_), do: {:error, "key not found"} - def get_public_key_for_ap_id(ap_id) do - with {:ok, %User{} = user} <- get_or_fetch_by_ap_id(ap_id), + def get_public_key_for_ap_id(ap_id, opts \\ []) do + with {:ok, %User{} = user} <- get_or_fetch_by_ap_id(ap_id, opts), {:ok, public_key} <- public_key(user) do {:ok, public_key} else @@ -2123,6 +2070,13 @@ def toggle_confirmation(users) do Enum.map(users, &toggle_confirmation/1) end + @spec need_confirmation(User.t(), boolean()) :: {:ok, User.t()} | {:error, Changeset.t()} + def need_confirmation(%User{} = user, bool) do + user + |> confirmation_changeset(need_confirmation: bool) + |> update_and_set_cache() + end + def get_mascot(%{mascot: %{} = mascot}) when not is_nil(mascot) do mascot end @@ -2337,7 +2291,9 @@ def remove_pinnned_activity(user, %Pleroma.Activity{id: id, data: data}) do # if pinned activity was scheduled for deletion, we reschedule it for deletion if data["expires_at"] do - {:ok, expires_at, _} = DateTime.from_iso8601(data["expires_at"]) + # MRF.ActivityExpirationPolicy used UTC timestamps for expires_at in original implementation + {:ok, expires_at} = + data["expires_at"] |> Pleroma.EctoType.ActivityPub.ObjectValidators.DateTime.cast() Pleroma.Workers.PurgeExpiredActivity.enqueue(%{ activity_id: id, diff --git a/lib/pleroma/user/import.ex b/lib/pleroma/user/import.ex new file mode 100644 index 000000000..e458021c8 --- /dev/null +++ b/lib/pleroma/user/import.ex @@ -0,0 +1,85 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.User.Import do + use Ecto.Schema + + alias Pleroma.User + alias Pleroma.Web.CommonAPI + alias Pleroma.Workers.BackgroundWorker + + require Logger + + @spec perform(atom(), User.t(), list()) :: :ok | list() | {:error, any()} + def perform(:mutes_import, %User{} = user, [_ | _] = identifiers) do + Enum.map( + identifiers, + fn identifier -> + with {:ok, %User{} = muted_user} <- User.get_or_fetch(identifier), + {:ok, _} <- User.mute(user, muted_user) do + muted_user + else + error -> handle_error(:mutes_import, identifier, error) + end + end + ) + end + + def perform(:blocks_import, %User{} = blocker, [_ | _] = identifiers) do + Enum.map( + identifiers, + fn identifier -> + with {:ok, %User{} = blocked} <- User.get_or_fetch(identifier), + {:ok, _block} <- CommonAPI.block(blocker, blocked) do + blocked + else + error -> handle_error(:blocks_import, identifier, error) + end + end + ) + end + + def perform(:follow_import, %User{} = follower, [_ | _] = identifiers) do + Enum.map( + identifiers, + fn identifier -> + with {:ok, %User{} = followed} <- User.get_or_fetch(identifier), + {:ok, follower} <- User.maybe_direct_follow(follower, followed), + {:ok, _, _, _} <- CommonAPI.follow(follower, followed) do + followed + else + error -> handle_error(:follow_import, identifier, error) + end + end + ) + end + + def perform(_, _, _), do: :ok + + defp handle_error(op, user_id, error) do + Logger.debug("#{op} failed for #{user_id} with: #{inspect(error)}") + error + end + + def blocks_import(%User{} = blocker, [_ | _] = identifiers) do + BackgroundWorker.enqueue( + "blocks_import", + %{"user_id" => blocker.id, "identifiers" => identifiers} + ) + end + + def follow_import(%User{} = follower, [_ | _] = identifiers) do + BackgroundWorker.enqueue( + "follow_import", + %{"user_id" => follower.id, "identifiers" => identifiers} + ) + end + + def mutes_import(%User{} = user, [_ | _] = identifiers) do + BackgroundWorker.enqueue( + "mutes_import", + %{"user_id" => user.id, "identifiers" => identifiers} + ) + end +end diff --git a/lib/pleroma/user/query.ex b/lib/pleroma/user/query.ex index d618432ff..2440bf890 100644 --- a/lib/pleroma/user/query.ex +++ b/lib/pleroma/user/query.ex @@ -47,6 +47,7 @@ defmodule Pleroma.User.Query do is_moderator: boolean(), super_users: boolean(), invisible: boolean(), + internal: boolean(), followers: User.t(), friends: User.t(), recipients_from_activity: [String.t()], @@ -80,7 +81,9 @@ defp base_query do end defp prepare_query(query, criteria) do - Enum.reduce(criteria, query, &compose_query/2) + criteria + |> Map.put_new(:internal, false) + |> Enum.reduce(query, &compose_query/2) end defp compose_query({key, value}, query) @@ -107,12 +110,12 @@ defp compose_query({:tags, tags}, query) when is_list(tags) and length(tags) > 0 where(query, [u], fragment("? && ?", u.tags, ^tags)) end - defp compose_query({:is_admin, _}, query) do - where(query, [u], u.is_admin) + defp compose_query({:is_admin, bool}, query) do + where(query, [u], u.is_admin == ^bool) end - defp compose_query({:is_moderator, _}, query) do - where(query, [u], u.is_moderator) + defp compose_query({:is_moderator, bool}, query) do + where(query, [u], u.is_moderator == ^bool) end defp compose_query({:super_users, _}, query) do @@ -129,14 +132,12 @@ defp compose_query({:external, _}, query), do: location_query(query, false) defp compose_query({:active, _}, query) do User.restrict_deactivated(query) - |> where([u], not is_nil(u.nickname)) |> where([u], u.approval_pending == false) end defp compose_query({:legacy_active, _}, query) do query |> where([u], fragment("not (?->'deactivated' @> 'true')", u.info)) - |> where([u], not is_nil(u.nickname)) end defp compose_query({:deactivated, false}, query) do @@ -145,7 +146,10 @@ defp compose_query({:deactivated, false}, query) do defp compose_query({:deactivated, true}, query) do where(query, [u], u.deactivated == ^true) - |> where([u], not is_nil(u.nickname)) + end + + defp compose_query({:confirmation_pending, bool}, query) do + where(query, [u], u.confirmation_pending == ^bool) end defp compose_query({:need_approval, _}, query) do @@ -199,10 +203,15 @@ defp compose_query({:limit, limit}, query) do limit(query, ^limit) end + defp compose_query({:internal, false}, query) do + query + |> where([u], not is_nil(u.nickname)) + |> where([u], not like(u.nickname, "internal.%")) + end + defp compose_query(_unsupported_param, query), do: query defp location_query(query, local) do where(query, [u], u.local == ^local) - |> where([u], not is_nil(u.nickname)) end end diff --git a/lib/pleroma/user/search.ex b/lib/pleroma/user/search.ex index 7babd47ea..35a828008 100644 --- a/lib/pleroma/user/search.ex +++ b/lib/pleroma/user/search.ex @@ -3,8 +3,10 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.User.Search do + alias Pleroma.EctoType.ActivityPub.ObjectValidators.Uri, as: UriType alias Pleroma.Pagination alias Pleroma.User + import Ecto.Query @limit 20 @@ -19,16 +21,47 @@ def search(query_string, opts \\ []) do query_string = format_query(query_string) - maybe_resolve(resolve, for_user, query_string) + # If this returns anything, it should bounce to the top + maybe_resolved = maybe_resolve(resolve, for_user, query_string) + + top_user_ids = + [] + |> maybe_add_resolved(maybe_resolved) + |> maybe_add_ap_id_match(query_string) + |> maybe_add_uri_match(query_string) results = query_string - |> search_query(for_user, following) + |> search_query(for_user, following, top_user_ids) |> Pagination.fetch_paginated(%{"offset" => offset, "limit" => result_limit}, :offset) results end + defp maybe_add_resolved(list, {:ok, %User{} = user}) do + [user.id | list] + end + + defp maybe_add_resolved(list, _), do: list + + defp maybe_add_ap_id_match(list, query) do + if user = User.get_cached_by_ap_id(query) do + [user.id | list] + else + list + end + end + + defp maybe_add_uri_match(list, query) do + with {:ok, query} <- UriType.cast(query), + q = from(u in User, where: u.uri == ^query, select: u.id), + users = Pleroma.Repo.all(q) do + users ++ list + else + _ -> list + end + end + defp format_query(query_string) do # Strip the beginning @ off if there is a query query_string = String.trim_leading(query_string, "@") @@ -47,21 +80,29 @@ defp format_query(query_string) do end end - defp search_query(query_string, for_user, following) do + defp search_query(query_string, for_user, following, top_user_ids) do for_user |> base_query(following) |> filter_blocked_user(for_user) |> filter_invisible_users() + |> filter_discoverable_users() |> filter_internal_users() |> filter_blocked_domains(for_user) |> fts_search(query_string) + |> select_top_users(top_user_ids) |> trigram_rank(query_string) - |> boost_search_rank(for_user) + |> boost_search_rank(for_user, top_user_ids) |> subquery() |> order_by(desc: :search_rank) |> maybe_restrict_local(for_user) end + defp select_top_users(query, top_user_ids) do + from(u in query, + or_where: u.id in ^top_user_ids + ) + end + defp fts_search(query, query_string) do query_string = to_tsquery(query_string) @@ -122,6 +163,10 @@ defp filter_invisible_users(query) do from(q in query, where: q.invisible == false) end + defp filter_discoverable_users(query) do + from(q in query, where: q.discoverable == true) + end + defp filter_internal_users(query) do from(q in query, where: q.actor_type != "Application") end @@ -175,7 +220,7 @@ defp restrict_local(q), do: where(q, [u], u.local == true) defp local_domain, do: Pleroma.Config.get([Pleroma.Web.Endpoint, :url, :host]) - defp boost_search_rank(query, %User{} = for_user) do + defp boost_search_rank(query, %User{} = for_user, top_user_ids) do friends_ids = User.get_friends_ids(for_user) followers_ids = User.get_followers_ids(for_user) @@ -187,6 +232,7 @@ defp boost_search_rank(query, %User{} = for_user) do CASE WHEN (?) THEN (?) * 1.5 WHEN (?) THEN (?) * 1.3 WHEN (?) THEN (?) * 1.1 + WHEN (?) THEN 9001 ELSE (?) END """, u.id in ^friends_ids and u.id in ^followers_ids, @@ -195,11 +241,26 @@ defp boost_search_rank(query, %User{} = for_user) do u.search_rank, u.id in ^followers_ids, u.search_rank, + u.id in ^top_user_ids, u.search_rank ) } ) end - defp boost_search_rank(query, _for_user), do: query + defp boost_search_rank(query, _for_user, top_user_ids) do + from(u in subquery(query), + select_merge: %{ + search_rank: + fragment( + """ + CASE WHEN (?) THEN 9001 + ELSE (?) END + """, + u.id in ^top_user_ids, + u.search_rank + ) + } + ) + end end diff --git a/lib/pleroma/utils.ex b/lib/pleroma/utils.ex index 21d1159be..e95766223 100644 --- a/lib/pleroma/utils.ex +++ b/lib/pleroma/utils.ex @@ -24,4 +24,24 @@ def compile_dir(dir) when is_binary(dir) do def command_available?(command) do match?({_output, 0}, System.cmd("sh", ["-c", "command -v #{command}"])) end + + @doc "creates the uniq temporary directory" + @spec tmp_dir(String.t()) :: {:ok, String.t()} | {:error, :file.posix()} + def tmp_dir(prefix \\ "") do + sub_dir = + [ + prefix, + Timex.to_unix(Timex.now()), + :os.getpid(), + String.downcase(Integer.to_string(:rand.uniform(0x100000000), 36)) + ] + |> Enum.join("-") + + tmp_dir = Path.join(System.tmp_dir!(), sub_dir) + + case File.mkdir(tmp_dir) do + :ok -> {:ok, tmp_dir} + error -> error + end + end end diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 66a9f78a3..eb44cffec 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -84,7 +84,7 @@ defp increase_replies_count_if_reply(%{ defp increase_replies_count_if_reply(_create_data), do: :noop - @object_types ~w[ChatMessage Question Answer Audio Event] + @object_types ~w[ChatMessage Question Answer Audio Video Event Article] @spec persist(map(), keyword()) :: {:ok, Activity.t() | Object.t()} def persist(%{"type" => type} = object, meta) when type in @object_types do with {:ok, object} <- Object.create(object) do @@ -154,8 +154,8 @@ def insert(map, local \\ true, fake \\ false, bypass_actor_check \\ false) when {:remote_limit_pass, _} -> {:error, :remote_limit} - {:reject, reason} -> - {:error, reason} + {:reject, _} = e -> + {:error, e} end end @@ -767,7 +767,7 @@ defp restrict_replies(query, %{exclude_replies: true}) do end defp restrict_replies(query, %{ - reply_filtering_user: user, + reply_filtering_user: %User{} = user, reply_visibility: "self" }) do from( @@ -783,14 +783,24 @@ defp restrict_replies(query, %{ end defp restrict_replies(query, %{ - reply_filtering_user: user, + reply_filtering_user: %User{} = user, reply_visibility: "following" }) do from( [activity, object] in query, where: fragment( - "?->>'inReplyTo' is null OR ? && array_remove(?, ?) OR ? = ?", + """ + ?->>'type' != 'Create' -- This isn't a Create + OR ?->>'inReplyTo' is null -- this isn't a reply + OR ? && array_remove(?, ?) -- The recipient is us or one of our friends, + -- unless they are the author (because authors + -- are also part of the recipients). This leads + -- to a bug that self-replies by friends won't + -- show up. + OR ? = ? -- The actor is us + """, + activity.data, object.data, ^[user.ap_id | User.get_cached_user_friends_ap_ids(user)], activity.recipients, @@ -841,7 +851,14 @@ defp restrict_blocked(query, %{blocking_user: %User{} = user} = opts) do from( [activity, object: o] in query, where: fragment("not (? = ANY(?))", activity.actor, ^blocked_ap_ids), - where: fragment("not (? && ?)", activity.recipients, ^blocked_ap_ids), + where: + fragment( + "((not (? && ?)) or ? = ?)", + activity.recipients, + ^blocked_ap_ids, + activity.actor, + ^user.ap_id + ), where: fragment( "recipients_contain_blocked_domains(?, ?) = false", @@ -1270,10 +1287,12 @@ defp object_to_user_data(data) do def fetch_follow_information_for_user(user) do with {:ok, following_data} <- - Fetcher.fetch_and_contain_remote_object_from_id(user.following_address), + Fetcher.fetch_and_contain_remote_object_from_id(user.following_address, + force_http: true + ), {:ok, hide_follows} <- collection_private(following_data), {:ok, followers_data} <- - Fetcher.fetch_and_contain_remote_object_from_id(user.follower_address), + Fetcher.fetch_and_contain_remote_object_from_id(user.follower_address, force_http: true), {:ok, hide_followers} <- collection_private(followers_data) do {:ok, %{ @@ -1347,8 +1366,8 @@ def user_data_from_user_object(data) do end end - def fetch_and_prepare_user_from_ap_id(ap_id) do - with {:ok, data} <- Fetcher.fetch_and_contain_remote_object_from_id(ap_id), + def fetch_and_prepare_user_from_ap_id(ap_id, opts \\ []) do + with {:ok, data} <- Fetcher.fetch_and_contain_remote_object_from_id(ap_id, opts), {:ok, data} <- user_data_from_user_object(data) do {:ok, maybe_update_follow_information(data)} else @@ -1390,13 +1409,13 @@ def maybe_handle_clashing_nickname(data) do end end - def make_user_from_ap_id(ap_id) do + def make_user_from_ap_id(ap_id, opts \\ []) do user = User.get_cached_by_ap_id(ap_id) if user && !User.ap_enabled?(user) do Transmogrifier.upgrade_user_from_ap_id(ap_id) else - with {:ok, data} <- fetch_and_prepare_user_from_ap_id(ap_id) do + with {:ok, data} <- fetch_and_prepare_user_from_ap_id(ap_id, opts) do if user do user |> User.remote_user_changeset(data) diff --git a/lib/pleroma/web/activity_pub/mrf.ex b/lib/pleroma/web/activity_pub/mrf.ex index 206d6af52..5e5361082 100644 --- a/lib/pleroma/web/activity_pub/mrf.ex +++ b/lib/pleroma/web/activity_pub/mrf.ex @@ -5,16 +5,34 @@ defmodule Pleroma.Web.ActivityPub.MRF do @callback filter(Map.t()) :: {:ok | :reject, Map.t()} - def filter(policies, %{} = object) do + def filter(policies, %{} = message) do policies - |> Enum.reduce({:ok, object}, fn - policy, {:ok, object} -> policy.filter(object) + |> Enum.reduce({:ok, message}, fn + policy, {:ok, message} -> policy.filter(message) _, error -> error end) end def filter(%{} = object), do: get_policies() |> filter(object) + def pipeline_filter(%{} = message, meta) do + object = meta[:object_data] + ap_id = message["object"] + + if object && ap_id do + with {:ok, message} <- filter(Map.put(message, "object", object)) do + meta = Keyword.put(meta, :object_data, message["object"]) + {:ok, Map.put(message, "object", ap_id), meta} + else + {err, message} -> {err, message, meta} + end + else + {err, message} = filter(message) + + {err, message, meta} + end + end + def get_policies do Pleroma.Config.get([:mrf, :policies], []) |> get_policies() end diff --git a/lib/pleroma/web/activity_pub/mrf/keyword_policy.ex b/lib/pleroma/web/activity_pub/mrf/keyword_policy.ex index 15e09dcf0..db66cfa3e 100644 --- a/lib/pleroma/web/activity_pub/mrf/keyword_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/keyword_policy.ex @@ -20,9 +20,17 @@ defp string_matches?(string, pattern) do String.match?(string, pattern) end - defp check_reject(%{"object" => %{"content" => content, "summary" => summary}} = message) do + defp object_payload(%{} = object) do + [object["content"], object["summary"], object["name"]] + |> Enum.filter(& &1) + |> Enum.join("\n") + end + + defp check_reject(%{"object" => %{} = object} = message) do + payload = object_payload(object) + if Enum.any?(Pleroma.Config.get([:mrf_keyword, :reject]), fn pattern -> - string_matches?(content, pattern) or string_matches?(summary, pattern) + string_matches?(payload, pattern) end) do {:reject, "[KeywordPolicy] Matches with rejected keyword"} else @@ -30,12 +38,12 @@ defp check_reject(%{"object" => %{"content" => content, "summary" => summary}} = end end - defp check_ftl_removal( - %{"to" => to, "object" => %{"content" => content, "summary" => summary}} = message - ) do + defp check_ftl_removal(%{"to" => to, "object" => %{} = object} = message) do + payload = object_payload(object) + if Pleroma.Constants.as_public() in to and Enum.any?(Pleroma.Config.get([:mrf_keyword, :federated_timeline_removal]), fn pattern -> - string_matches?(content, pattern) or string_matches?(summary, pattern) + string_matches?(payload, pattern) end) do to = List.delete(to, Pleroma.Constants.as_public()) cc = [Pleroma.Constants.as_public() | message["cc"] || []] @@ -51,35 +59,24 @@ defp check_ftl_removal( end end - defp check_replace(%{"object" => %{"content" => content, "summary" => summary}} = message) do - content = - if is_binary(content) do - content - else - "" - end + defp check_replace(%{"object" => %{} = object} = message) do + object = + ["content", "name", "summary"] + |> Enum.filter(fn field -> Map.has_key?(object, field) && object[field] end) + |> Enum.reduce(object, fn field, object -> + data = + Enum.reduce( + Pleroma.Config.get([:mrf_keyword, :replace]), + object[field], + fn {pat, repl}, acc -> String.replace(acc, pat, repl) end + ) - summary = - if is_binary(summary) do - summary - else - "" - end + Map.put(object, field, data) + end) - {content, summary} = - Enum.reduce( - Pleroma.Config.get([:mrf_keyword, :replace]), - {content, summary}, - fn {pattern, replacement}, {content_acc, summary_acc} -> - {String.replace(content_acc, pattern, replacement), - String.replace(summary_acc, pattern, replacement)} - end - ) + message = Map.put(message, "object", object) - {:ok, - message - |> put_in(["object", "content"], content) - |> put_in(["object", "summary"], summary)} + {:ok, message} end @impl true diff --git a/lib/pleroma/web/activity_pub/mrf/media_proxy_warming_policy.ex b/lib/pleroma/web/activity_pub/mrf/media_proxy_warming_policy.ex index 98d595469..0fb05d3c4 100644 --- a/lib/pleroma/web/activity_pub/mrf/media_proxy_warming_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/media_proxy_warming_policy.ex @@ -12,17 +12,21 @@ defmodule Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy do require Logger - @options [ + @adapter_options [ pool: :media, recv_timeout: 10_000 ] def perform(:prefetch, url) do - Logger.debug("Prefetching #{inspect(url)}") + # Fetching only proxiable resources + if MediaProxy.enabled?() and MediaProxy.url_proxiable?(url) do + # If preview proxy is enabled, it'll also hit media proxy (so we're caching both requests) + prefetch_url = MediaProxy.preview_url(url) - url - |> MediaProxy.url() - |> HTTP.get([], @options) + Logger.debug("Prefetching #{inspect(url)} as #{inspect(prefetch_url)}") + + HTTP.get(prefetch_url, [], @adapter_options) + end end def perform(:preload, %{"object" => %{"attachment" => attachments}} = _message) do diff --git a/lib/pleroma/web/activity_pub/mrf/simple_policy.ex b/lib/pleroma/web/activity_pub/mrf/simple_policy.ex index bb193475a..161177727 100644 --- a/lib/pleroma/web/activity_pub/mrf/simple_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/simple_policy.ex @@ -66,7 +66,8 @@ defp check_media_nsfw( "type" => "Create", "object" => child_object } = object - ) do + ) + when is_map(child_object) do media_nsfw = Config.get([:mrf_simple, :media_nsfw]) |> MRF.subdomains_regex() diff --git a/lib/pleroma/web/activity_pub/mrf/subchain_policy.ex b/lib/pleroma/web/activity_pub/mrf/subchain_policy.ex index c9f20571f..048052da6 100644 --- a/lib/pleroma/web/activity_pub/mrf/subchain_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/subchain_policy.ex @@ -28,8 +28,7 @@ def filter(%{"actor" => actor} = message) do }" ) - subchain - |> MRF.filter(message) + MRF.filter(subchain, message) else _e -> {:ok, message} end diff --git a/lib/pleroma/web/activity_pub/object_validator.ex b/lib/pleroma/web/activity_pub/object_validator.ex index b77c06395..bd0a2a8dc 100644 --- a/lib/pleroma/web/activity_pub/object_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validator.ex @@ -12,11 +12,13 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do alias Pleroma.Activity alias Pleroma.EctoType.ActivityPub.ObjectValidators alias Pleroma.Object + alias Pleroma.Object.Containment alias Pleroma.User alias Pleroma.Web.ActivityPub.ObjectValidators.AcceptRejectValidator alias Pleroma.Web.ActivityPub.ObjectValidators.AnnounceValidator alias Pleroma.Web.ActivityPub.ObjectValidators.AnswerValidator - alias Pleroma.Web.ActivityPub.ObjectValidators.AudioValidator + alias Pleroma.Web.ActivityPub.ObjectValidators.ArticleNoteValidator + alias Pleroma.Web.ActivityPub.ObjectValidators.AudioVideoValidator alias Pleroma.Web.ActivityPub.ObjectValidators.BlockValidator alias Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator alias Pleroma.Web.ActivityPub.ObjectValidators.CreateChatMessageValidator @@ -149,10 +151,20 @@ def validate(%{"type" => "Question"} = object, meta) do end end - def validate(%{"type" => "Audio"} = object, meta) do + def validate(%{"type" => type} = object, meta) when type in ~w[Audio Video] do with {:ok, object} <- object - |> AudioValidator.cast_and_validate() + |> AudioVideoValidator.cast_and_validate() + |> Ecto.Changeset.apply_action(:insert) do + object = stringify_keys(object) + {:ok, object, meta} + end + end + + def validate(%{"type" => "Article"} = object, meta) do + with {:ok, object} <- + object + |> ArticleNoteValidator.cast_and_validate() |> Ecto.Changeset.apply_action(:insert) do object = stringify_keys(object) {:ok, object, meta} @@ -198,7 +210,7 @@ def validate( %{"type" => "Create", "object" => %{"type" => objtype} = object} = create_activity, meta ) - when objtype in ~w[Question Answer Audio Event] do + when objtype in ~w[Question Answer Audio Video Event Article] do with {:ok, object_data} <- cast_and_apply(object), meta = Keyword.put(meta, :object_data, object_data |> stringify_keys), {:ok, create_activity} <- @@ -232,14 +244,18 @@ def cast_and_apply(%{"type" => "Answer"} = object) do AnswerValidator.cast_and_apply(object) end - def cast_and_apply(%{"type" => "Audio"} = object) do - AudioValidator.cast_and_apply(object) + def cast_and_apply(%{"type" => type} = object) when type in ~w[Audio Video] do + AudioVideoValidator.cast_and_apply(object) end def cast_and_apply(%{"type" => "Event"} = object) do EventValidator.cast_and_apply(object) end + def cast_and_apply(%{"type" => "Article"} = object) do + ArticleNoteValidator.cast_and_apply(object) + end + def cast_and_apply(o), do: {:error, {:validator_not_set, o}} # is_struct/1 isn't present in Elixir 1.8.x @@ -262,7 +278,8 @@ def stringify_keys(object) when is_list(object) do def stringify_keys(object), do: object def fetch_actor(object) do - with {:ok, actor} <- ObjectValidators.ObjectID.cast(object["actor"]) do + with actor <- Containment.get_actor(object), + {:ok, actor} <- ObjectValidators.ObjectID.cast(actor) do User.get_or_fetch_by_ap_id(actor) end end diff --git a/lib/pleroma/web/activity_pub/object_validators/audio_validator.ex b/lib/pleroma/web/activity_pub/object_validators/article_note_validator.ex similarity index 80% rename from lib/pleroma/web/activity_pub/object_validators/audio_validator.ex rename to lib/pleroma/web/activity_pub/object_validators/article_note_validator.ex index 1a97c504a..5b7dad517 100644 --- a/lib/pleroma/web/activity_pub/object_validators/audio_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/article_note_validator.ex @@ -2,7 +2,7 @@ # Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.Web.ActivityPub.ObjectValidators.AudioValidator do +defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNoteValidator do use Ecto.Schema alias Pleroma.EctoType.ActivityPub.ObjectValidators @@ -25,14 +25,19 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AudioValidator do # TODO: Write type field(:tag, {:array, :map}, default: []) field(:type, :string) + + field(:name, :string) + field(:summary, :string) field(:content, :string) + field(:context, :string) + # short identifier for PleromaFE to group statuses by context + field(:context_id, :integer) # TODO: Remove actor on objects field(:actor, ObjectValidators.ObjectID) field(:attributedTo, ObjectValidators.ObjectID) - field(:summary, :string) field(:published, ObjectValidators.DateTime) field(:emoji, ObjectValidators.Emoji, default: %{}) field(:sensitive, :boolean, default: false) @@ -40,13 +45,11 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AudioValidator do field(:replies_count, :integer, default: 0) field(:like_count, :integer, default: 0) field(:announcement_count, :integer, default: 0) - field(:inReplyTo, :string) + field(:inReplyTo, ObjectValidators.ObjectID) field(:url, ObjectValidators.Uri) - # short identifier for PleromaFE to group statuses by context - field(:context_id, :integer) - field(:likes, {:array, :string}, default: []) - field(:announcements, {:array, :string}, default: []) + field(:likes, {:array, ObjectValidators.ObjectID}, default: []) + field(:announcements, {:array, ObjectValidators.ObjectID}, default: []) end def cast_and_apply(data) do @@ -62,19 +65,14 @@ def cast_and_validate(data) do end def cast_data(data) do + data = fix(data) + %__MODULE__{} |> changeset(data) end - defp fix_url(%{"url" => url} = data) when is_list(url) do - attachment = - Enum.find(url, fn x -> is_map(x) and String.starts_with?(x["mimeType"], "audio/") end) - - link_element = Enum.find(url, fn x -> is_map(x) and x["mimeType"] == "text/html" end) - - data - |> Map.put("attachment", [attachment]) - |> Map.put("url", link_element["href"]) + defp fix_url(%{"url" => url} = data) when is_map(url) do + Map.put(data, "url", url["href"]) end defp fix_url(data), do: data @@ -83,8 +81,9 @@ defp fix(data) do data |> CommonFixes.fix_defaults() |> CommonFixes.fix_attribution() - |> Transmogrifier.fix_emoji() + |> CommonFixes.fix_actor() |> fix_url() + |> Transmogrifier.fix_emoji() end def changeset(struct, data) do @@ -97,8 +96,8 @@ def changeset(struct, data) do def validate_data(data_cng) do data_cng - |> validate_inclusion(:type, ["Audio"]) - |> validate_required([:id, :actor, :attributedTo, :type, :context, :attachment]) + |> validate_inclusion(:type, ["Article", "Note"]) + |> validate_required([:id, :actor, :attributedTo, :type, :context, :context_id]) |> CommonValidations.validate_any_presence([:cc, :to]) |> CommonValidations.validate_fields_match([:actor, :attributedTo]) |> CommonValidations.validate_actor_presence() diff --git a/lib/pleroma/web/activity_pub/object_validators/attachment_validator.ex b/lib/pleroma/web/activity_pub/object_validators/attachment_validator.ex index c8b148280..df102a134 100644 --- a/lib/pleroma/web/activity_pub/object_validators/attachment_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/attachment_validator.ex @@ -5,6 +5,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AttachmentValidator do use Ecto.Schema + alias Pleroma.EctoType.ActivityPub.ObjectValidators alias Pleroma.Web.ActivityPub.ObjectValidators.UrlObjectValidator import Ecto.Changeset @@ -15,7 +16,11 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AttachmentValidator do field(:mediaType, :string, default: "application/octet-stream") field(:name, :string) - embeds_many(:url, UrlObjectValidator) + embeds_many :url, UrlObjectValidator, primary_key: false do + field(:type, :string) + field(:href, ObjectValidators.Uri) + field(:mediaType, :string, default: "application/octet-stream") + end end def cast_and_validate(data) do @@ -37,7 +42,18 @@ def changeset(struct, data) do struct |> cast(data, [:type, :mediaType, :name]) - |> cast_embed(:url, required: true) + |> cast_embed(:url, with: &url_changeset/2) + |> validate_inclusion(:type, ~w[Link Document Audio Image Video]) + |> validate_required([:type, :mediaType, :url]) + end + + def url_changeset(struct, data) do + data = fix_media_type(data) + + struct + |> cast(data, [:type, :href, :mediaType]) + |> validate_inclusion(:type, ["Link"]) + |> validate_required([:type, :href, :mediaType]) end def fix_media_type(data) do @@ -75,6 +91,7 @@ defp fix_url(data) do def validate_data(cng) do cng + |> validate_inclusion(:type, ~w[Document Audio Image Video]) |> validate_required([:mediaType, :url, :type]) end end diff --git a/lib/pleroma/web/activity_pub/object_validators/audio_video_validator.ex b/lib/pleroma/web/activity_pub/object_validators/audio_video_validator.ex new file mode 100644 index 000000000..16973e5db --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/audio_video_validator.ex @@ -0,0 +1,134 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.ObjectValidators.AudioVideoValidator do + use Ecto.Schema + + alias Pleroma.EarmarkRenderer + alias Pleroma.EctoType.ActivityPub.ObjectValidators + alias Pleroma.Web.ActivityPub.ObjectValidators.AttachmentValidator + alias Pleroma.Web.ActivityPub.ObjectValidators.CommonFixes + alias Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations + alias Pleroma.Web.ActivityPub.Transmogrifier + + import Ecto.Changeset + + @primary_key false + @derive Jason.Encoder + + embedded_schema do + field(:id, ObjectValidators.ObjectID, primary_key: true) + field(:to, ObjectValidators.Recipients, default: []) + field(:cc, ObjectValidators.Recipients, default: []) + field(:bto, ObjectValidators.Recipients, default: []) + field(:bcc, ObjectValidators.Recipients, default: []) + # TODO: Write type + field(:tag, {:array, :map}, default: []) + field(:type, :string) + + field(:name, :string) + field(:summary, :string) + field(:content, :string) + + field(:context, :string) + # short identifier for PleromaFE to group statuses by context + field(:context_id, :integer) + + # TODO: Remove actor on objects + field(:actor, ObjectValidators.ObjectID) + + field(:attributedTo, ObjectValidators.ObjectID) + field(:published, ObjectValidators.DateTime) + field(:emoji, ObjectValidators.Emoji, default: %{}) + field(:sensitive, :boolean, default: false) + embeds_many(:attachment, AttachmentValidator) + field(:replies_count, :integer, default: 0) + field(:like_count, :integer, default: 0) + field(:announcement_count, :integer, default: 0) + field(:inReplyTo, ObjectValidators.ObjectID) + field(:url, ObjectValidators.Uri) + + field(:likes, {:array, ObjectValidators.ObjectID}, default: []) + field(:announcements, {:array, ObjectValidators.ObjectID}, default: []) + end + + def cast_and_apply(data) do + data + |> cast_data + |> apply_action(:insert) + end + + def cast_and_validate(data) do + data + |> cast_data() + |> validate_data() + end + + def cast_data(data) do + %__MODULE__{} + |> changeset(data) + end + + defp fix_url(%{"url" => url} = data) when is_list(url) do + attachment = + Enum.find(url, fn x -> + mime_type = x["mimeType"] || x["mediaType"] || "" + + is_map(x) and String.starts_with?(mime_type, ["video/", "audio/"]) + end) + + link_element = + Enum.find(url, fn x -> + mime_type = x["mimeType"] || x["mediaType"] || "" + + is_map(x) and mime_type == "text/html" + end) + + data + |> Map.put("attachment", [attachment]) + |> Map.put("url", link_element["href"]) + end + + defp fix_url(data), do: data + + defp fix_content(%{"mediaType" => "text/markdown", "content" => content} = data) + when is_binary(content) do + content = + content + |> Earmark.as_html!(%Earmark.Options{renderer: EarmarkRenderer}) + |> Pleroma.HTML.filter_tags() + + Map.put(data, "content", content) + end + + defp fix_content(data), do: data + + defp fix(data) do + data + |> CommonFixes.fix_defaults() + |> CommonFixes.fix_attribution() + |> CommonFixes.fix_actor() + |> Transmogrifier.fix_emoji() + |> fix_url() + |> fix_content() + end + + def changeset(struct, data) do + data = fix(data) + + struct + |> cast(data, __schema__(:fields) -- [:attachment]) + |> cast_embed(:attachment) + end + + def validate_data(data_cng) do + data_cng + |> validate_inclusion(:type, ["Audio", "Video"]) + |> validate_required([:id, :actor, :attributedTo, :type, :context, :attachment]) + |> CommonValidations.validate_any_presence([:cc, :to]) + |> CommonValidations.validate_fields_match([:actor, :attributedTo]) + |> CommonValidations.validate_actor_presence() + |> CommonValidations.validate_host_match() + end +end diff --git a/lib/pleroma/web/activity_pub/object_validators/common_fixes.ex b/lib/pleroma/web/activity_pub/object_validators/common_fixes.ex index 720213d73..b3638cfc7 100644 --- a/lib/pleroma/web/activity_pub/object_validators/common_fixes.ex +++ b/lib/pleroma/web/activity_pub/object_validators/common_fixes.ex @@ -3,6 +3,7 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Web.ActivityPub.ObjectValidators.CommonFixes do + alias Pleroma.Object.Containment alias Pleroma.Web.ActivityPub.Utils # based on Pleroma.Web.ActivityPub.Utils.lazy_put_objects_defaults @@ -19,4 +20,12 @@ def fix_attribution(data) do data |> Map.put_new("actor", data["attributedTo"]) end + + def fix_actor(data) do + actor = Containment.get_actor(data) + + data + |> Map.put("actor", actor) + |> Map.put("attributedTo", actor) + end end diff --git a/lib/pleroma/web/activity_pub/object_validators/create_generic_validator.ex b/lib/pleroma/web/activity_pub/object_validators/create_generic_validator.ex index b3dbeea57..422ee07be 100644 --- a/lib/pleroma/web/activity_pub/object_validators/create_generic_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/create_generic_validator.ex @@ -10,9 +10,10 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.CreateGenericValidator do alias Pleroma.EctoType.ActivityPub.ObjectValidators alias Pleroma.Object + alias Pleroma.Web.ActivityPub.ObjectValidators.CommonFixes + alias Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations import Ecto.Changeset - import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations @primary_key false @@ -75,14 +76,15 @@ defp fix(data, meta) do data |> fix_context(meta) |> fix_addressing(meta) + |> CommonFixes.fix_actor() end def validate_data(cng, meta \\ []) do cng |> validate_required([:actor, :type, :object]) |> validate_inclusion(:type, ["Create"]) - |> validate_actor_presence() - |> validate_any_presence([:to, :cc]) + |> CommonValidations.validate_actor_presence() + |> CommonValidations.validate_any_presence([:to, :cc]) |> validate_actors_match(meta) |> validate_context_match(meta) |> validate_object_nonexistence() diff --git a/lib/pleroma/web/activity_pub/object_validators/note_validator.ex b/lib/pleroma/web/activity_pub/object_validators/note_validator.ex deleted file mode 100644 index ab4469a59..000000000 --- a/lib/pleroma/web/activity_pub/object_validators/note_validator.ex +++ /dev/null @@ -1,73 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.ActivityPub.ObjectValidators.NoteValidator do - use Ecto.Schema - - alias Pleroma.EctoType.ActivityPub.ObjectValidators - alias Pleroma.Web.ActivityPub.Transmogrifier - - import Ecto.Changeset - - @primary_key false - - embedded_schema do - field(:id, ObjectValidators.ObjectID, primary_key: true) - field(:to, ObjectValidators.Recipients, default: []) - field(:cc, ObjectValidators.Recipients, default: []) - field(:bto, ObjectValidators.Recipients, default: []) - field(:bcc, ObjectValidators.Recipients, default: []) - # TODO: Write type - field(:tag, {:array, :map}, default: []) - field(:type, :string) - - field(:name, :string) - field(:summary, :string) - field(:content, :string) - - field(:context, :string) - # short identifier for PleromaFE to group statuses by context - field(:context_id, :integer) - - field(:actor, ObjectValidators.ObjectID) - field(:attributedTo, ObjectValidators.ObjectID) - field(:published, ObjectValidators.DateTime) - field(:emoji, ObjectValidators.Emoji, default: %{}) - field(:sensitive, :boolean, default: false) - # TODO: Write type - field(:attachment, {:array, :map}, default: []) - field(:replies_count, :integer, default: 0) - field(:like_count, :integer, default: 0) - field(:announcement_count, :integer, default: 0) - field(:inReplyTo, ObjectValidators.ObjectID) - field(:url, ObjectValidators.Uri) - - field(:likes, {:array, :string}, default: []) - field(:announcements, {:array, :string}, default: []) - end - - def cast_and_validate(data) do - data - |> cast_data() - |> validate_data() - end - - defp fix(data) do - data - |> Transmogrifier.fix_emoji() - end - - def cast_data(data) do - data = fix(data) - - %__MODULE__{} - |> cast(data, __schema__(:fields)) - end - - def validate_data(data_cng) do - data_cng - |> validate_inclusion(:type, ["Note"]) - |> validate_required([:id, :actor, :to, :cc, :type, :content, :context]) - end -end diff --git a/lib/pleroma/web/activity_pub/object_validators/question_validator.ex b/lib/pleroma/web/activity_pub/object_validators/question_validator.ex index 934d3c1ea..9310485dc 100644 --- a/lib/pleroma/web/activity_pub/object_validators/question_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/question_validator.ex @@ -47,8 +47,8 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.QuestionValidator do # short identifier for PleromaFE to group statuses by context field(:context_id, :integer) - field(:likes, {:array, :string}, default: []) - field(:announcements, {:array, :string}, default: []) + field(:likes, {:array, ObjectValidators.ObjectID}, default: []) + field(:announcements, {:array, ObjectValidators.ObjectID}, default: []) field(:closed, ObjectValidators.DateTime) field(:voters, {:array, ObjectValidators.ObjectID}, default: []) diff --git a/lib/pleroma/web/activity_pub/object_validators/url_object_validator.ex b/lib/pleroma/web/activity_pub/object_validators/url_object_validator.ex deleted file mode 100644 index 881030f38..000000000 --- a/lib/pleroma/web/activity_pub/object_validators/url_object_validator.ex +++ /dev/null @@ -1,24 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.ActivityPub.ObjectValidators.UrlObjectValidator do - use Ecto.Schema - - alias Pleroma.EctoType.ActivityPub.ObjectValidators - - import Ecto.Changeset - @primary_key false - - embedded_schema do - field(:type, :string) - field(:href, ObjectValidators.Uri) - field(:mediaType, :string, default: "application/octet-stream") - end - - def changeset(struct, data) do - struct - |> cast(data, __schema__(:fields)) - |> validate_required([:type, :href, :mediaType]) - end -end diff --git a/lib/pleroma/web/activity_pub/pipeline.ex b/lib/pleroma/web/activity_pub/pipeline.ex index 36e325c37..2db86f116 100644 --- a/lib/pleroma/web/activity_pub/pipeline.ex +++ b/lib/pleroma/web/activity_pub/pipeline.ex @@ -26,13 +26,17 @@ def common_pipeline(object, meta) do {:error, e} -> {:error, e} + + {:reject, e} -> + {:reject, e} end end def do_common_pipeline(object, meta) do with {_, {:ok, validated_object, meta}} <- {:validate_object, ObjectValidator.validate(object, meta)}, - {_, {:ok, mrfd_object}} <- {:mrf_object, MRF.filter(validated_object)}, + {_, {:ok, mrfd_object, meta}} <- + {:mrf_object, MRF.pipeline_filter(validated_object, meta)}, {_, {:ok, activity, meta}} <- {:persist_object, ActivityPub.persist(mrfd_object, meta)}, {_, {:ok, activity, meta}} <- @@ -40,7 +44,7 @@ def do_common_pipeline(object, meta) do {_, {:ok, _}} <- {:federation, maybe_federate(activity, meta)} do {:ok, activity, meta} else - {:mrf_object, {:reject, _}} -> {:ok, nil, meta} + {:mrf_object, {:reject, message, _}} -> {:reject, message} e -> {:error, e} end end diff --git a/lib/pleroma/web/activity_pub/publisher.ex b/lib/pleroma/web/activity_pub/publisher.ex index d88f7f3ee..9c3956683 100644 --- a/lib/pleroma/web/activity_pub/publisher.ex +++ b/lib/pleroma/web/activity_pub/publisher.ex @@ -13,6 +13,7 @@ defmodule Pleroma.Web.ActivityPub.Publisher do alias Pleroma.User alias Pleroma.Web.ActivityPub.Relay alias Pleroma.Web.ActivityPub.Transmogrifier + alias Pleroma.Web.FedSockets require Pleroma.Constants @@ -50,15 +51,35 @@ def is_representable?(%Activity{} = activity) do def publish_one(%{inbox: inbox, json: json, actor: %User{} = actor, id: id} = params) do Logger.debug("Federating #{id} to #{inbox}") - uri = URI.parse(inbox) + case FedSockets.get_or_create_fed_socket(inbox) do + {:ok, fedsocket} -> + Logger.debug("publishing via fedsockets - #{inspect(inbox)}") + FedSockets.publish(fedsocket, json) + _ -> + Logger.debug("publishing via http - #{inspect(inbox)}") + http_publish(inbox, actor, json, params) + end + end + + def publish_one(%{actor_id: actor_id} = params) do + actor = User.get_cached_by_id(actor_id) + + params + |> Map.delete(:actor_id) + |> Map.put(:actor, actor) + |> publish_one() + end + + defp http_publish(inbox, actor, json, params) do + uri = %{path: path} = URI.parse(inbox) digest = "SHA-256=" <> (:crypto.hash(:sha256, json) |> Base.encode64()) date = Pleroma.Signature.signed_date() signature = Pleroma.Signature.sign(actor, %{ - "(request-target)": "post #{uri.path}", + "(request-target)": "post #{path}", host: signature_host(uri), "content-length": byte_size(json), digest: digest, @@ -89,15 +110,6 @@ def publish_one(%{inbox: inbox, json: json, actor: %User{} = actor, id: id} = pa end end - def publish_one(%{actor_id: actor_id} = params) do - actor = User.get_cached_by_id(actor_id) - - params - |> Map.delete(:actor_id) - |> Map.put(:actor, actor) - |> publish_one() - end - defp signature_host(%URI{port: port, scheme: scheme, host: host}) do if port == URI.default_port(scheme) do host diff --git a/lib/pleroma/web/activity_pub/relay.ex b/lib/pleroma/web/activity_pub/relay.ex index b65710a94..6606e1780 100644 --- a/lib/pleroma/web/activity_pub/relay.ex +++ b/lib/pleroma/web/activity_pub/relay.ex @@ -30,12 +30,16 @@ def follow(target_instance) do end end - @spec unfollow(String.t()) :: {:ok, Activity.t()} | {:error, any()} - def unfollow(target_instance) do + @spec unfollow(String.t(), map()) :: {:ok, Activity.t()} | {:error, any()} + def unfollow(target_instance, opts \\ %{}) do with %User{} = local_user <- get_actor(), - {:ok, %User{} = target_user} <- User.get_or_fetch_by_ap_id(target_instance), + {:ok, target_user} <- fetch_target_user(target_instance, opts), {:ok, activity} <- ActivityPub.unfollow(local_user, target_user) do - User.unfollow(local_user, target_user) + case target_user.id do + nil -> User.update_following_count(local_user) + _ -> User.unfollow(local_user, target_user) + end + Logger.info("relay: unfollowed instance: #{target_instance}: id=#{activity.data["id"]}") {:ok, activity} else @@ -43,6 +47,14 @@ def unfollow(target_instance) do end end + defp fetch_target_user(ap_id, opts) do + case {opts[:force], User.get_or_fetch_by_ap_id(ap_id)} do + {_, {:ok, %User{} = user}} -> {:ok, user} + {true, _} -> {:ok, %User{ap_id: ap_id}} + {_, error} -> error + end + end + @spec publish(any()) :: {:ok, Activity.t()} | {:error, any()} def publish(%Activity{data: %{"type" => "Create"}} = activity) do with %User{} = user <- get_actor(), diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index 46a8be767..b9a83a544 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -336,7 +336,7 @@ def handle_object_creation(%{"type" => "Answer"} = object_map, meta) do end def handle_object_creation(%{"type" => objtype} = object, meta) - when objtype in ~w[Audio Question Event] do + when objtype in ~w[Audio Video Question Event Article] do with {:ok, object, meta} <- Pipeline.common_pipeline(object, meta) do {:ok, object, meta} end diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index af4384213..d7dd9fe6b 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -7,7 +7,6 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do A module to handle coding from internal to wire ActivityPub and back. """ alias Pleroma.Activity - alias Pleroma.EarmarkRenderer alias Pleroma.EctoType.ActivityPub.ObjectValidators alias Pleroma.Maps alias Pleroma.Object @@ -45,7 +44,6 @@ def fix_object(object, options \\ []) do |> fix_addressing |> fix_summary |> fix_type(options) - |> fix_content end def fix_summary(%{"summary" => nil} = object) do @@ -274,24 +272,7 @@ def fix_url(%{"url" => url} = object) when is_map(url) do Map.put(object, "url", url["href"]) end - def fix_url(%{"type" => "Video", "url" => url} = object) when is_list(url) do - attachment = - Enum.find(url, fn x -> - media_type = x["mediaType"] || x["mimeType"] || "" - - is_map(x) and String.starts_with?(media_type, "video/") - end) - - link_element = - Enum.find(url, fn x -> is_map(x) and (x["mediaType"] || x["mimeType"]) == "text/html" end) - - object - |> Map.put("attachment", [attachment]) - |> Map.put("url", link_element["href"]) - end - - def fix_url(%{"type" => object_type, "url" => url} = object) - when object_type != "Video" and is_list(url) do + def fix_url(%{"url" => url} = object) when is_list(url) do first_element = Enum.at(url, 0) url_string = @@ -309,7 +290,7 @@ def fix_url(object), do: object def fix_emoji(%{"tag" => tags} = object) when is_list(tags) do emoji = tags - |> Enum.filter(fn data -> data["type"] == "Emoji" and data["icon"] end) + |> Enum.filter(fn data -> is_map(data) and data["type"] == "Emoji" and data["icon"] end) |> Enum.reduce(%{}, fn data, mapping -> name = String.trim(data["name"], ":") @@ -371,18 +352,6 @@ def fix_type(%{"inReplyTo" => reply_id, "name" => _} = object, options) def fix_type(object, _), do: object - defp fix_content(%{"mediaType" => "text/markdown", "content" => content} = object) - when is_binary(content) do - html_content = - content - |> Earmark.as_html!(%Earmark.Options{renderer: EarmarkRenderer}) - |> Pleroma.HTML.filter_tags() - - Map.merge(object, %{"content" => html_content, "mediaType" => "text/html"}) - end - - defp fix_content(object), do: object - # Reduce the object list to find the reported user. defp get_reported(objects) do Enum.reduce_while(objects, nil, fn ap_id, _ -> @@ -455,7 +424,7 @@ def handle_incoming( %{"type" => "Create", "object" => %{"type" => objtype} = object} = data, options ) - when objtype in ~w{Article Note Video Page} do + when objtype in ~w{Note Page} do actor = Containment.get_actor(data) with nil <- Activity.get_create_by_object_ap_id(object["id"]), @@ -546,13 +515,19 @@ def handle_incoming( end def handle_incoming( - %{"type" => "Create", "object" => %{"type" => objtype}} = data, + %{"type" => "Create", "object" => %{"type" => objtype, "id" => obj_id}} = data, _options ) - when objtype in ~w{Question Answer ChatMessage Audio Event} do + when objtype in ~w{Question Answer ChatMessage Audio Video Event Article} do + data = Map.put(data, "object", strip_internal_fields(data["object"])) + with {:ok, %User{}} <- ObjectValidator.fetch_actor(data), + nil <- Activity.get_create_by_object_ap_id(obj_id), {:ok, activity, _} <- Pipeline.common_pipeline(data, local: false) do {:ok, activity} + else + %Activity{} = activity -> {:ok, activity} + e -> e end end @@ -1029,7 +1004,7 @@ def perform(:user_upgrade, user) do def upgrade_user_from_ap_id(ap_id) do with %User{local: false} = user <- User.get_cached_by_ap_id(ap_id), - {:ok, data} <- ActivityPub.fetch_and_prepare_user_from_ap_id(ap_id), + {:ok, data} <- ActivityPub.fetch_and_prepare_user_from_ap_id(ap_id, force_http: true), {:ok, user} <- update_user(user, data) do TransmogrifierWorker.enqueue("user_upgrade", %{"user_id" => user.id}) {:ok, user} diff --git a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex index f5e4d49f9..d5713c3dd 100644 --- a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex @@ -23,8 +23,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do alias Pleroma.Web.Endpoint alias Pleroma.Web.Router - require Logger - @users_page_size 50 plug( @@ -68,6 +66,12 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do when action in [:list_user_statuses, :list_instance_statuses] ) + plug( + OAuthScopesPlug, + %{scopes: ["read:chats"], admin: true} + when action in [:list_user_chats] + ) + plug( OAuthScopesPlug, %{scopes: ["read"], admin: true} @@ -256,6 +260,20 @@ def list_user_statuses(%{assigns: %{user: admin}} = conn, %{"nickname" => nickna end end + def list_user_chats(%{assigns: %{user: admin}} = conn, %{"nickname" => nickname} = _params) do + with %User{id: user_id} <- User.get_cached_by_nickname_or_id(nickname, for: admin) do + chats = + Pleroma.Chat.for_user_query(user_id) + |> Pleroma.Repo.all() + + conn + |> put_view(AdminAPI.ChatView) + |> render("index.json", chats: chats) + else + _ -> {:error, :not_found} + end + end + def user_toggle_activation(%{assigns: %{user: admin}} = conn, %{"nickname" => nickname}) do user = User.get_cached_by_nickname(nickname) diff --git a/lib/pleroma/web/admin_api/controllers/chat_controller.ex b/lib/pleroma/web/admin_api/controllers/chat_controller.ex new file mode 100644 index 000000000..967600d69 --- /dev/null +++ b/lib/pleroma/web/admin_api/controllers/chat_controller.ex @@ -0,0 +1,85 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.ChatController do + use Pleroma.Web, :controller + + alias Pleroma.Activity + alias Pleroma.Chat + alias Pleroma.Chat.MessageReference + alias Pleroma.ModerationLog + alias Pleroma.Pagination + alias Pleroma.Plugs.OAuthScopesPlug + alias Pleroma.Web.AdminAPI + alias Pleroma.Web.CommonAPI + alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView + + require Logger + + plug(Pleroma.Web.ApiSpec.CastAndValidate) + + plug( + OAuthScopesPlug, + %{scopes: ["read:chats"], admin: true} when action in [:show, :messages] + ) + + plug( + OAuthScopesPlug, + %{scopes: ["write:chats"], admin: true} when action in [:delete_message] + ) + + action_fallback(Pleroma.Web.AdminAPI.FallbackController) + + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.Admin.ChatOperation + + def delete_message(%{assigns: %{user: user}} = conn, %{ + message_id: message_id, + id: chat_id + }) do + with %MessageReference{object: %{data: %{"id" => object_ap_id}}} = cm_ref <- + MessageReference.get_by_id(message_id), + ^chat_id <- to_string(cm_ref.chat_id), + %Activity{id: activity_id} <- Activity.get_create_by_object_ap_id(object_ap_id), + {:ok, _} <- CommonAPI.delete(activity_id, user) do + ModerationLog.insert_log(%{ + action: "chat_message_delete", + actor: user, + subject_id: message_id + }) + + conn + |> put_view(MessageReferenceView) + |> render("show.json", chat_message_reference: cm_ref) + else + _e -> + {:error, :could_not_delete} + end + end + + def messages(conn, %{id: id} = params) do + with %Chat{} = chat <- Chat.get_by_id(id) do + cm_refs = + chat + |> MessageReference.for_chat_query() + |> Pagination.fetch_paginated(params) + + conn + |> put_view(MessageReferenceView) + |> render("index.json", chat_message_references: cm_refs) + else + _ -> + conn + |> put_status(:not_found) + |> json(%{error: "not found"}) + end + end + + def show(conn, %{id: id}) do + with %Chat{} = chat <- Chat.get_by_id(id) do + conn + |> put_view(AdminAPI.ChatView) + |> render("show.json", chat: chat) + end + end +end diff --git a/lib/pleroma/web/admin_api/controllers/instance_document_controller.ex b/lib/pleroma/web/admin_api/controllers/instance_document_controller.ex new file mode 100644 index 000000000..504d9b517 --- /dev/null +++ b/lib/pleroma/web/admin_api/controllers/instance_document_controller.ex @@ -0,0 +1,41 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.InstanceDocumentController do + use Pleroma.Web, :controller + + alias Pleroma.Plugs.InstanceStatic + alias Pleroma.Plugs.OAuthScopesPlug + alias Pleroma.Web.InstanceDocument + + plug(Pleroma.Web.ApiSpec.CastAndValidate) + + action_fallback(Pleroma.Web.AdminAPI.FallbackController) + + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.Admin.InstanceDocumentOperation + + plug(OAuthScopesPlug, %{scopes: ["read"], admin: true} when action == :show) + plug(OAuthScopesPlug, %{scopes: ["write"], admin: true} when action in [:update, :delete]) + + def show(conn, %{name: document_name}) do + with {:ok, url} <- InstanceDocument.get(document_name), + {:ok, content} <- File.read(InstanceStatic.file_path(url)) do + conn + |> put_resp_content_type("text/html") + |> send_resp(200, content) + end + end + + def update(%{body_params: %{file: file}} = conn, %{name: document_name}) do + with {:ok, url} <- InstanceDocument.put(document_name, file.path) do + json(conn, %{"url" => url}) + end + end + + def delete(conn, %{name: document_name}) do + with :ok <- InstanceDocument.delete(document_name) do + json(conn, %{}) + end + end +end diff --git a/lib/pleroma/web/admin_api/controllers/relay_controller.ex b/lib/pleroma/web/admin_api/controllers/relay_controller.ex index 95d06dde7..6c19f09f7 100644 --- a/lib/pleroma/web/admin_api/controllers/relay_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/relay_controller.ex @@ -33,11 +33,7 @@ def index(conn, _params) do def follow(%{assigns: %{user: admin}, body_params: %{relay_url: target}} = conn, _) do with {:ok, _message} <- Relay.follow(target) do - ModerationLog.insert_log(%{ - action: "relay_follow", - actor: admin, - target: target - }) + ModerationLog.insert_log(%{action: "relay_follow", actor: admin, target: target}) json(conn, %{actor: target, followed_back: target in Relay.following()}) else @@ -48,13 +44,9 @@ def follow(%{assigns: %{user: admin}, body_params: %{relay_url: target}} = conn, end end - def unfollow(%{assigns: %{user: admin}, body_params: %{relay_url: target}} = conn, _) do - with {:ok, _message} <- Relay.unfollow(target) do - ModerationLog.insert_log(%{ - action: "relay_unfollow", - actor: admin, - target: target - }) + def unfollow(%{assigns: %{user: admin}, body_params: %{relay_url: target} = params} = conn, _) do + with {:ok, _message} <- Relay.unfollow(target, %{force: params[:force]}) do + ModerationLog.insert_log(%{action: "relay_unfollow", actor: admin, target: target}) json(conn, target) else diff --git a/lib/pleroma/web/admin_api/views/chat_view.ex b/lib/pleroma/web/admin_api/views/chat_view.ex new file mode 100644 index 000000000..847df1423 --- /dev/null +++ b/lib/pleroma/web/admin_api/views/chat_view.ex @@ -0,0 +1,30 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.ChatView do + use Pleroma.Web, :view + + alias Pleroma.Chat + alias Pleroma.User + alias Pleroma.Web.MastodonAPI + alias Pleroma.Web.PleromaAPI + + def render("index.json", %{chats: chats} = opts) do + render_many(chats, __MODULE__, "show.json", Map.delete(opts, :chats)) + end + + def render("show.json", %{chat: %Chat{user_id: user_id}} = opts) do + user = User.get_by_id(user_id) + sender = MastodonAPI.AccountView.render("show.json", user: user, skip_visibility_check: true) + + serialized_chat = PleromaAPI.ChatView.render("show.json", opts) + + serialized_chat + |> Map.put(:sender, sender) + |> Map.put(:receiver, serialized_chat[:account]) + |> Map.delete(:account) + end + + def render(view, opts), do: PleromaAPI.ChatView.render(view, opts) +end diff --git a/lib/pleroma/web/admin_api/views/status_view.ex b/lib/pleroma/web/admin_api/views/status_view.ex index 500800be2..6042a22b6 100644 --- a/lib/pleroma/web/admin_api/views/status_view.ex +++ b/lib/pleroma/web/admin_api/views/status_view.ex @@ -8,6 +8,7 @@ defmodule Pleroma.Web.AdminAPI.StatusView do require Pleroma.Constants alias Pleroma.Web.AdminAPI + alias Pleroma.Web.CommonAPI alias Pleroma.Web.MastodonAPI defdelegate merge_account_views(user), to: AdminAPI.AccountView @@ -17,7 +18,7 @@ def render("index.json", opts) do end def render("show.json", %{activity: %{data: %{"object" => _object}} = activity} = opts) do - user = MastodonAPI.StatusView.get_user(activity.data["actor"]) + user = CommonAPI.get_user(activity.data["actor"]) MastodonAPI.StatusView.render("show.json", opts) |> Map.merge(%{account: merge_account_views(user)}) diff --git a/lib/pleroma/web/api_spec.ex b/lib/pleroma/web/api_spec.ex index 79fd5f871..93a5273e3 100644 --- a/lib/pleroma/web/api_spec.ex +++ b/lib/pleroma/web/api_spec.ex @@ -13,10 +13,15 @@ defmodule Pleroma.Web.ApiSpec do @impl OpenApi def spec do %OpenApi{ - servers: [ - # Populate the Server info from a phoenix endpoint - OpenApiSpex.Server.from_endpoint(Endpoint) - ], + servers: + if Phoenix.Endpoint.server?(:pleroma, Endpoint) do + [ + # Populate the Server info from a phoenix endpoint + OpenApiSpex.Server.from_endpoint(Endpoint) + ] + else + [] + end, info: %OpenApiSpex.Info{ title: "Pleroma", description: Application.spec(:pleroma, :description) |> to_string(), diff --git a/lib/pleroma/web/api_spec/cast_and_validate.ex b/lib/pleroma/web/api_spec/cast_and_validate.ex index fbfc27d6f..6d1a7ebbc 100644 --- a/lib/pleroma/web/api_spec/cast_and_validate.ex +++ b/lib/pleroma/web/api_spec/cast_and_validate.ex @@ -115,6 +115,10 @@ defp cast_and_validate(spec, operation, conn, content_type, false = _strict) do %{reason: :unexpected_field, name: name, path: [name]}, params -> Map.delete(params, name) + # Filter out empty params + %{reason: :invalid_type, path: [name_atom], value: ""}, params -> + Map.delete(params, to_string(name_atom)) + %{reason: :invalid_enum, name: nil, path: path, value: value}, params -> path = path |> Enum.reverse() |> tl() |> Enum.reverse() |> list_items_to_string() update_in(params, path, &List.delete(&1, value)) diff --git a/lib/pleroma/web/api_spec/helpers.ex b/lib/pleroma/web/api_spec/helpers.ex index 2a7f1a706..34de2ed57 100644 --- a/lib/pleroma/web/api_spec/helpers.ex +++ b/lib/pleroma/web/api_spec/helpers.ex @@ -72,7 +72,11 @@ def empty_object_response do end def empty_array_response do - Operation.response("Empty array", "application/json", %Schema{type: :array, example: []}) + Operation.response("Empty array", "application/json", %Schema{ + type: :array, + items: %Schema{type: :object, example: %{}}, + example: [] + }) end def no_content_response do diff --git a/lib/pleroma/web/api_spec/operations/account_operation.ex b/lib/pleroma/web/api_spec/operations/account_operation.ex index aaebc9b5c..d90ddb787 100644 --- a/lib/pleroma/web/api_spec/operations/account_operation.ex +++ b/lib/pleroma/web/api_spec/operations/account_operation.ex @@ -372,6 +372,10 @@ def identity_proofs_operation do tags: ["accounts"], summary: "Identity proofs", operationId: "AccountController.identity_proofs", + # Validators complains about unused path params otherwise + parameters: [ + %Reference{"$ref": "#/components/parameters/accountIdOrNickname"} + ], description: "Not implemented", responses: %{ 200 => empty_array_response() @@ -469,7 +473,6 @@ defp create_response do identifier: %Schema{type: :string}, message: %Schema{type: :string} }, - required: [], # Note: example of successful registration with failed login response: # example: %{ # "identifier" => "missing_confirmed_email", @@ -530,7 +533,7 @@ defp update_credentials_request do nullable: true, oneOf: [ %Schema{type: :array, items: attribute_field()}, - %Schema{type: :object, additionalProperties: %Schema{type: attribute_field()}} + %Schema{type: :object, additionalProperties: attribute_field()} ] }, # NOTE: `source` field is not supported diff --git a/lib/pleroma/web/api_spec/operations/admin/chat_operation.ex b/lib/pleroma/web/api_spec/operations/admin/chat_operation.ex new file mode 100644 index 000000000..d3e5dfc1c --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/admin/chat_operation.ex @@ -0,0 +1,96 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Admin.ChatOperation do + alias OpenApiSpex.Operation + alias Pleroma.Web.ApiSpec.Schemas.Chat + alias Pleroma.Web.ApiSpec.Schemas.ChatMessage + + import Pleroma.Web.ApiSpec.Helpers + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def delete_message_operation do + %Operation{ + tags: ["admin", "chat"], + summary: "Delete an individual chat message", + operationId: "AdminAPI.ChatController.delete_message", + parameters: [ + Operation.parameter(:id, :path, :string, "The ID of the Chat"), + Operation.parameter(:message_id, :path, :string, "The ID of the message") + ], + responses: %{ + 200 => + Operation.response( + "The deleted ChatMessage", + "application/json", + ChatMessage + ) + }, + security: [ + %{ + "oAuth" => ["write:chats"] + } + ] + } + end + + def messages_operation do + %Operation{ + tags: ["admin", "chat"], + summary: "Get the most recent messages of the chat", + operationId: "AdminAPI.ChatController.messages", + parameters: + [Operation.parameter(:id, :path, :string, "The ID of the Chat")] ++ + pagination_params(), + responses: %{ + 200 => + Operation.response( + "The messages in the chat", + "application/json", + Pleroma.Web.ApiSpec.ChatOperation.chat_messages_response() + ) + }, + security: [ + %{ + "oAuth" => ["read:chats"] + } + ] + } + end + + def show_operation do + %Operation{ + tags: ["chat"], + summary: "Create a chat", + operationId: "AdminAPI.ChatController.show", + parameters: [ + Operation.parameter( + :id, + :path, + :string, + "The id of the chat", + required: true, + example: "1234" + ) + ], + responses: %{ + 200 => + Operation.response( + "The existing chat", + "application/json", + Chat + ) + }, + security: [ + %{ + "oAuth" => ["read"] + } + ] + } + end +end diff --git a/lib/pleroma/web/api_spec/operations/admin/instance_document_operation.ex b/lib/pleroma/web/api_spec/operations/admin/instance_document_operation.ex new file mode 100644 index 000000000..a120ff4e8 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/admin/instance_document_operation.ex @@ -0,0 +1,115 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Admin.InstanceDocumentOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Helpers + alias Pleroma.Web.ApiSpec.Schemas.ApiError + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def show_operation do + %Operation{ + tags: ["Admin", "InstanceDocument"], + summary: "Get the instance document", + operationId: "AdminAPI.InstanceDocumentController.show", + security: [%{"oAuth" => ["read"]}], + parameters: [ + Operation.parameter(:name, :path, %Schema{type: :string}, "The document name", + required: true + ) + | Helpers.admin_api_params() + ], + responses: %{ + 200 => document_content(), + 400 => Operation.response("Bad Request", "application/json", ApiError), + 403 => Operation.response("Forbidden", "application/json", ApiError), + 404 => Operation.response("Not Found", "application/json", ApiError) + } + } + end + + def update_operation do + %Operation{ + tags: ["Admin", "InstanceDocument"], + summary: "Update the instance document", + operationId: "AdminAPI.InstanceDocumentController.update", + security: [%{"oAuth" => ["write"]}], + requestBody: Helpers.request_body("Parameters", update_request()), + parameters: [ + Operation.parameter(:name, :path, %Schema{type: :string}, "The document name", + required: true + ) + | Helpers.admin_api_params() + ], + responses: %{ + 200 => Operation.response("InstanceDocument", "application/json", instance_document()), + 400 => Operation.response("Bad Request", "application/json", ApiError), + 403 => Operation.response("Forbidden", "application/json", ApiError), + 404 => Operation.response("Not Found", "application/json", ApiError) + } + } + end + + defp update_request do + %Schema{ + title: "UpdateRequest", + description: "POST body for uploading the file", + type: :object, + required: [:file], + properties: %{ + file: %Schema{ + type: :string, + format: :binary, + description: "The file to be uploaded, using multipart form data." + } + } + } + end + + def delete_operation do + %Operation{ + tags: ["Admin", "InstanceDocument"], + summary: "Get the instance document", + operationId: "AdminAPI.InstanceDocumentController.delete", + security: [%{"oAuth" => ["write"]}], + parameters: [ + Operation.parameter(:name, :path, %Schema{type: :string}, "The document name", + required: true + ) + | Helpers.admin_api_params() + ], + responses: %{ + 200 => Operation.response("InstanceDocument", "application/json", instance_document()), + 400 => Operation.response("Bad Request", "application/json", ApiError), + 403 => Operation.response("Forbidden", "application/json", ApiError), + 404 => Operation.response("Not Found", "application/json", ApiError) + } + } + end + + defp instance_document do + %Schema{ + title: "InstanceDocument", + type: :object, + properties: %{ + url: %Schema{type: :string} + }, + example: %{ + "url" => "https://example.com/static/terms-of-service.html" + } + } + end + + defp document_content do + Operation.response("InstanceDocumentContent", "text/html", %Schema{ + type: :string, + example: "

Instance panel

" + }) + end +end diff --git a/lib/pleroma/web/api_spec/operations/admin/relay_operation.ex b/lib/pleroma/web/api_spec/operations/admin/relay_operation.ex index e06b2d164..f754bb9f5 100644 --- a/lib/pleroma/web/api_spec/operations/admin/relay_operation.ex +++ b/lib/pleroma/web/api_spec/operations/admin/relay_operation.ex @@ -56,7 +56,7 @@ def unfollow_operation do operationId: "AdminAPI.RelayController.unfollow", security: [%{"oAuth" => ["write:follows"]}], parameters: admin_api_params(), - requestBody: request_body("Parameters", relay_url()), + requestBody: request_body("Parameters", relay_unfollow()), responses: %{ 200 => Operation.response("Status", "application/json", %Schema{ @@ -91,4 +91,14 @@ defp relay_url do } } end + + defp relay_unfollow do + %Schema{ + type: :object, + properties: %{ + relay_url: %Schema{type: :string, format: :uri}, + force: %Schema{type: :boolean, default: false} + } + } + end end diff --git a/lib/pleroma/web/api_spec/operations/chat_operation.ex b/lib/pleroma/web/api_spec/operations/chat_operation.ex index b1a0d26ab..0dcfdb354 100644 --- a/lib/pleroma/web/api_spec/operations/chat_operation.ex +++ b/lib/pleroma/web/api_spec/operations/chat_operation.ex @@ -158,7 +158,8 @@ def messages_operation do "The messages in the chat", "application/json", chat_messages_response() - ) + ), + 404 => Operation.response("Not Found", "application/json", ApiError) }, security: [ %{ @@ -184,7 +185,8 @@ def post_chat_message_operation do "application/json", ChatMessage ), - 400 => Operation.response("Bad Request", "application/json", ApiError) + 400 => Operation.response("Bad Request", "application/json", ApiError), + 422 => Operation.response("MRF Rejection", "application/json", ApiError) }, security: [ %{ diff --git a/lib/pleroma/web/api_spec/operations/custom_emoji_operation.ex b/lib/pleroma/web/api_spec/operations/custom_emoji_operation.ex index 2f812ac77..5ff263ceb 100644 --- a/lib/pleroma/web/api_spec/operations/custom_emoji_operation.ex +++ b/lib/pleroma/web/api_spec/operations/custom_emoji_operation.ex @@ -69,7 +69,7 @@ defp custom_emoji do type: :object, properties: %{ category: %Schema{type: :string}, - tags: %Schema{type: :array} + tags: %Schema{type: :array, items: %Schema{type: :string}} } } ], diff --git a/lib/pleroma/web/api_spec/operations/emoji_reaction_operation.ex b/lib/pleroma/web/api_spec/operations/emoji_reaction_operation.ex index 1a49fece0..745d41f88 100644 --- a/lib/pleroma/web/api_spec/operations/emoji_reaction_operation.ex +++ b/lib/pleroma/web/api_spec/operations/emoji_reaction_operation.ex @@ -23,7 +23,7 @@ def index_operation do parameters: [ Operation.parameter(:id, :path, FlakeID, "Status ID", required: true), Operation.parameter(:emoji, :path, :string, "Filter by a single unicode emoji", - required: false + required: nil ) ], security: [%{"oAuth" => ["read:statuses"]}], diff --git a/lib/pleroma/web/api_spec/operations/list_operation.ex b/lib/pleroma/web/api_spec/operations/list_operation.ex index 15039052e..f6e73968a 100644 --- a/lib/pleroma/web/api_spec/operations/list_operation.ex +++ b/lib/pleroma/web/api_spec/operations/list_operation.ex @@ -187,8 +187,7 @@ defp add_remove_accounts_request(required) when is_boolean(required) do type: :object, properties: %{ account_ids: %Schema{type: :array, description: "Array of account IDs", items: FlakeID} - }, - required: required && [:account_ids] + } }, required: required ) diff --git a/lib/pleroma/web/api_spec/operations/pleroma_emoji_file_operation.ex b/lib/pleroma/web/api_spec/operations/pleroma_emoji_file_operation.ex new file mode 100644 index 000000000..a56641426 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/pleroma_emoji_file_operation.ex @@ -0,0 +1,139 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.PleromaEmojiFileOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.ApiError + + import Pleroma.Web.ApiSpec.Helpers + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def create_operation do + %Operation{ + tags: ["Emoji Packs"], + summary: "Add new file to the pack", + operationId: "PleromaAPI.EmojiPackController.add_file", + security: [%{"oAuth" => ["write"]}], + requestBody: request_body("Parameters", create_request(), required: true), + parameters: [name_param()], + responses: %{ + 200 => Operation.response("Files Object", "application/json", files_object()), + 422 => Operation.response("Unprocessable Entity", "application/json", ApiError), + 404 => Operation.response("Not Found", "application/json", ApiError), + 400 => Operation.response("Bad Request", "application/json", ApiError), + 409 => Operation.response("Conflict", "application/json", ApiError) + } + } + end + + defp create_request do + %Schema{ + type: :object, + required: [:file], + properties: %{ + file: %Schema{ + description: + "File needs to be uploaded with the multipart request or link to remote file", + anyOf: [ + %Schema{type: :string, format: :binary}, + %Schema{type: :string, format: :uri} + ] + }, + shortcode: %Schema{ + type: :string, + description: + "Shortcode for new emoji, must be unique for all emoji. If not sended, shortcode will be taken from original filename." + }, + filename: %Schema{ + type: :string, + description: + "New emoji file name. If not specified will be taken from original filename." + } + } + } + end + + def update_operation do + %Operation{ + tags: ["Emoji Packs"], + summary: "Add new file to the pack", + operationId: "PleromaAPI.EmojiPackController.update_file", + security: [%{"oAuth" => ["write"]}], + requestBody: request_body("Parameters", update_request(), required: true), + parameters: [name_param()], + responses: %{ + 200 => Operation.response("Files Object", "application/json", files_object()), + 404 => Operation.response("Not Found", "application/json", ApiError), + 400 => Operation.response("Bad Request", "application/json", ApiError), + 409 => Operation.response("Conflict", "application/json", ApiError), + 422 => Operation.response("Unprocessable Entity", "application/json", ApiError) + } + } + end + + defp update_request do + %Schema{ + type: :object, + required: [:shortcode, :new_shortcode, :new_filename], + properties: %{ + shortcode: %Schema{ + type: :string, + description: "Emoji file shortcode" + }, + new_shortcode: %Schema{ + type: :string, + description: "New emoji file shortcode" + }, + new_filename: %Schema{ + type: :string, + description: "New filename for emoji file" + }, + force: %Schema{ + type: :boolean, + description: "With true value to overwrite existing emoji with new shortcode", + default: false + } + } + } + end + + def delete_operation do + %Operation{ + tags: ["Emoji Packs"], + summary: "Delete emoji file from pack", + operationId: "PleromaAPI.EmojiPackController.delete_file", + security: [%{"oAuth" => ["write"]}], + parameters: [ + name_param(), + Operation.parameter(:shortcode, :query, :string, "File shortcode", + example: "cofe", + required: true + ) + ], + responses: %{ + 200 => Operation.response("Files Object", "application/json", files_object()), + 400 => Operation.response("Bad Request", "application/json", ApiError), + 404 => Operation.response("Not Found", "application/json", ApiError), + 422 => Operation.response("Unprocessable Entity", "application/json", ApiError) + } + } + end + + defp name_param do + Operation.parameter(:name, :query, :string, "Pack Name", example: "cofe", required: true) + end + + defp files_object do + %Schema{ + type: :object, + additionalProperties: %Schema{type: :string}, + description: "Object with emoji names as keys and filenames as values" + } + end +end diff --git a/lib/pleroma/web/api_spec/operations/pleroma_emoji_pack_operation.ex b/lib/pleroma/web/api_spec/operations/pleroma_emoji_pack_operation.ex index b2b4f8713..79f52dcb3 100644 --- a/lib/pleroma/web/api_spec/operations/pleroma_emoji_pack_operation.ex +++ b/lib/pleroma/web/api_spec/operations/pleroma_emoji_pack_operation.ex @@ -19,7 +19,21 @@ def remote_operation do tags: ["Emoji Packs"], summary: "Make request to another instance for emoji packs list", security: [%{"oAuth" => ["write"]}], - parameters: [url_param()], + parameters: [ + url_param(), + Operation.parameter( + :page, + :query, + %Schema{type: :integer, default: 1}, + "Page" + ), + Operation.parameter( + :page_size, + :query, + %Schema{type: :integer, default: 30}, + "Number of emoji to return" + ) + ], operationId: "PleromaAPI.EmojiPackController.remote", responses: %{ 200 => emoji_packs_response(), @@ -175,111 +189,6 @@ def update_operation do } end - def add_file_operation do - %Operation{ - tags: ["Emoji Packs"], - summary: "Add new file to the pack", - operationId: "PleromaAPI.EmojiPackController.add_file", - security: [%{"oAuth" => ["write"]}], - requestBody: request_body("Parameters", add_file_request(), required: true), - parameters: [name_param()], - responses: %{ - 200 => Operation.response("Files Object", "application/json", files_object()), - 400 => Operation.response("Bad Request", "application/json", ApiError), - 409 => Operation.response("Conflict", "application/json", ApiError) - } - } - end - - defp add_file_request do - %Schema{ - type: :object, - required: [:file], - properties: %{ - file: %Schema{ - description: - "File needs to be uploaded with the multipart request or link to remote file", - anyOf: [ - %Schema{type: :string, format: :binary}, - %Schema{type: :string, format: :uri} - ] - }, - shortcode: %Schema{ - type: :string, - description: - "Shortcode for new emoji, must be unique for all emoji. If not sended, shortcode will be taken from original filename." - }, - filename: %Schema{ - type: :string, - description: - "New emoji file name. If not specified will be taken from original filename." - } - } - } - end - - def update_file_operation do - %Operation{ - tags: ["Emoji Packs"], - summary: "Add new file to the pack", - operationId: "PleromaAPI.EmojiPackController.update_file", - security: [%{"oAuth" => ["write"]}], - requestBody: request_body("Parameters", update_file_request(), required: true), - parameters: [name_param()], - responses: %{ - 200 => Operation.response("Files Object", "application/json", files_object()), - 400 => Operation.response("Bad Request", "application/json", ApiError), - 409 => Operation.response("Conflict", "application/json", ApiError) - } - } - end - - defp update_file_request do - %Schema{ - type: :object, - required: [:shortcode, :new_shortcode, :new_filename], - properties: %{ - shortcode: %Schema{ - type: :string, - description: "Emoji file shortcode" - }, - new_shortcode: %Schema{ - type: :string, - description: "New emoji file shortcode" - }, - new_filename: %Schema{ - type: :string, - description: "New filename for emoji file" - }, - force: %Schema{ - type: :boolean, - description: "With true value to overwrite existing emoji with new shortcode", - default: false - } - } - } - end - - def delete_file_operation do - %Operation{ - tags: ["Emoji Packs"], - summary: "Delete emoji file from pack", - operationId: "PleromaAPI.EmojiPackController.delete_file", - security: [%{"oAuth" => ["write"]}], - parameters: [ - name_param(), - Operation.parameter(:shortcode, :query, :string, "File shortcode", - example: "cofe", - required: true - ) - ], - responses: %{ - 200 => Operation.response("Files Object", "application/json", files_object()), - 400 => Operation.response("Bad Request", "application/json", ApiError) - } - } - end - def import_from_filesystem_operation do %Operation{ tags: ["Emoji Packs"], @@ -297,7 +206,7 @@ def import_from_filesystem_operation do end defp name_param do - Operation.parameter(:name, :path, :string, "Pack Name", example: "cofe", required: true) + Operation.parameter(:name, :query, :string, "Pack Name", example: "cofe", required: true) end defp url_param do diff --git a/lib/pleroma/web/api_spec/operations/status_operation.ex b/lib/pleroma/web/api_spec/operations/status_operation.ex index 5bd4619d5..d7ebde6f6 100644 --- a/lib/pleroma/web/api_spec/operations/status_operation.ex +++ b/lib/pleroma/web/api_spec/operations/status_operation.ex @@ -55,7 +55,7 @@ def create_operation do "application/json", %Schema{oneOf: [Status, ScheduledStatus]} ), - 422 => Operation.response("Bad Request", "application/json", ApiError) + 422 => Operation.response("Bad Request / MRF Rejection", "application/json", ApiError) } } end diff --git a/lib/pleroma/web/api_spec/operations/user_import_operation.ex b/lib/pleroma/web/api_spec/operations/user_import_operation.ex new file mode 100644 index 000000000..a50314fb7 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/user_import_operation.ex @@ -0,0 +1,80 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.UserImportOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.ApiError + + import Pleroma.Web.ApiSpec.Helpers + + @spec open_api_operation(atom) :: Operation.t() + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def follow_operation do + %Operation{ + tags: ["follow_import"], + summary: "Imports your follows.", + operationId: "UserImportController.follow", + requestBody: request_body("Parameters", import_request(), required: true), + responses: %{ + 200 => ok_response(), + 500 => Operation.response("Error", "application/json", ApiError) + }, + security: [%{"oAuth" => ["write:follow"]}] + } + end + + def blocks_operation do + %Operation{ + tags: ["blocks_import"], + summary: "Imports your blocks.", + operationId: "UserImportController.blocks", + requestBody: request_body("Parameters", import_request(), required: true), + responses: %{ + 200 => ok_response(), + 500 => Operation.response("Error", "application/json", ApiError) + }, + security: [%{"oAuth" => ["write:blocks"]}] + } + end + + def mutes_operation do + %Operation{ + tags: ["mutes_import"], + summary: "Imports your mutes.", + operationId: "UserImportController.mutes", + requestBody: request_body("Parameters", import_request(), required: true), + responses: %{ + 200 => ok_response(), + 500 => Operation.response("Error", "application/json", ApiError) + }, + security: [%{"oAuth" => ["write:mutes"]}] + } + end + + defp import_request do + %Schema{ + type: :object, + required: [:list], + properties: %{ + list: %Schema{ + description: + "STRING or FILE containing a whitespace-separated list of accounts to import.", + anyOf: [ + %Schema{type: :string, format: :binary}, + %Schema{type: :string} + ] + } + } + } + end + + defp ok_response do + Operation.response("Ok", "application/json", %Schema{type: :string, example: "ok"}) + end +end diff --git a/lib/pleroma/web/api_spec/schemas/chat_message.ex b/lib/pleroma/web/api_spec/schemas/chat_message.ex index bbf2a4427..9d2799618 100644 --- a/lib/pleroma/web/api_spec/schemas/chat_message.ex +++ b/lib/pleroma/web/api_spec/schemas/chat_message.ex @@ -4,6 +4,7 @@ defmodule Pleroma.Web.ApiSpec.Schemas.ChatMessage do alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.Emoji require OpenApiSpex @@ -18,7 +19,7 @@ defmodule Pleroma.Web.ApiSpec.Schemas.ChatMessage do chat_id: %Schema{type: :string}, content: %Schema{type: :string, nullable: true}, created_at: %Schema{type: :string, format: :"date-time"}, - emojis: %Schema{type: :array}, + emojis: %Schema{type: :array, items: Emoji}, attachment: %Schema{type: :object, nullable: true}, card: %Schema{ type: :object, diff --git a/lib/pleroma/web/api_spec/schemas/scheduled_status.ex b/lib/pleroma/web/api_spec/schemas/scheduled_status.ex index 0520d0848..addefa9d3 100644 --- a/lib/pleroma/web/api_spec/schemas/scheduled_status.ex +++ b/lib/pleroma/web/api_spec/schemas/scheduled_status.ex @@ -27,9 +27,9 @@ defmodule Pleroma.Web.ApiSpec.Schemas.ScheduledStatus do media_ids: %Schema{type: :array, nullable: true, items: %Schema{type: :string}}, sensitive: %Schema{type: :boolean, nullable: true}, spoiler_text: %Schema{type: :string, nullable: true}, - visibility: %Schema{type: VisibilityScope, nullable: true}, + visibility: %Schema{allOf: [VisibilityScope], nullable: true}, scheduled_at: %Schema{type: :string, format: :"date-time", nullable: true}, - poll: %Schema{type: Poll, nullable: true}, + poll: %Schema{allOf: [Poll], nullable: true}, in_reply_to_id: %Schema{type: :string, nullable: true} } } diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index 500c3883e..60a50b027 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -48,6 +48,9 @@ def post_chat_message(%User{} = user, %User{} = recipient, content, opts \\ []) local: true )} do {:ok, activity} + else + {:common_pipeline, {:reject, _} = e} -> e + e -> e end end @@ -550,4 +553,21 @@ def hide_reblogs(%User{} = user, %User{} = target) do def show_reblogs(%User{} = user, %User{} = target) do UserRelationship.delete_reblog_mute(user, target) end + + def get_user(ap_id, fake_record_fallback \\ true) do + cond do + user = User.get_cached_by_ap_id(ap_id) -> + user + + user = User.get_by_guessed_nickname(ap_id) -> + user + + fake_record_fallback -> + # TODO: refactor (fake records is never a good idea) + User.error_user(ap_id) + + true -> + nil + end + end end diff --git a/lib/pleroma/web/controller_helper.ex b/lib/pleroma/web/controller_helper.ex index 6445966e0..69188a882 100644 --- a/lib/pleroma/web/controller_helper.ex +++ b/lib/pleroma/web/controller_helper.ex @@ -48,13 +48,13 @@ defp param_to_integer(val, default) when is_binary(val) do defp param_to_integer(_, default), do: default - def add_link_headers(conn, activities, extra_params \\ %{}) + def add_link_headers(conn, entries, extra_params \\ %{}) - def add_link_headers(%{assigns: %{skip_link_headers: true}} = conn, _activities, _extra_params), + def add_link_headers(%{assigns: %{skip_link_headers: true}} = conn, _entries, _extra_params), do: conn - def add_link_headers(conn, activities, extra_params) do - case get_pagination_fields(conn, activities, extra_params) do + def add_link_headers(conn, entries, extra_params) do + case get_pagination_fields(conn, entries, extra_params) do %{"next" => next_url, "prev" => prev_url} -> put_resp_header(conn, "link", "<#{next_url}>; rel=\"next\", <#{prev_url}>; rel=\"prev\"") @@ -78,19 +78,15 @@ defp build_pagination_fields(conn, min_id, max_id, extra_params) do } end - def get_pagination_fields(conn, activities, extra_params \\ %{}) do - case List.last(activities) do + def get_pagination_fields(conn, entries, extra_params \\ %{}) do + case List.last(entries) do %{pagination_id: max_id} when not is_nil(max_id) -> - %{pagination_id: min_id} = - activities - |> List.first() + %{pagination_id: min_id} = List.first(entries) build_pagination_fields(conn, min_id, max_id, extra_params) %{id: max_id} -> - %{id: min_id} = - activities - |> List.first() + %{id: min_id} = List.first(entries) build_pagination_fields(conn, min_id, max_id, extra_params) diff --git a/lib/pleroma/web/fed_sockets/fed_registry.ex b/lib/pleroma/web/fed_sockets/fed_registry.ex new file mode 100644 index 000000000..e00ea69c0 --- /dev/null +++ b/lib/pleroma/web/fed_sockets/fed_registry.ex @@ -0,0 +1,185 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.FedSockets.FedRegistry do + @moduledoc """ + The FedRegistry stores the active FedSockets for quick retrieval. + + The storage and retrieval portion of the FedRegistry is done in process through + elixir's `Registry` module for speed and its ability to monitor for terminated processes. + + Dropped connections will be caught by `Registry` and deleted. Since the next + message will initiate a new connection there is no reason to try and reconnect at that point. + + Normally outside modules should have no need to call or use the FedRegistry themselves. + """ + + alias Pleroma.Web.FedSockets.FedSocket + alias Pleroma.Web.FedSockets.SocketInfo + + require Logger + + @default_rejection_duration 15 * 60 * 1000 + @rejections :fed_socket_rejections + + @doc """ + Retrieves a FedSocket from the Registry given it's origin. + + The origin is expected to be a string identifying the endpoint "example.com" or "example2.com:8080" + + Will return: + * {:ok, fed_socket} for working FedSockets + * {:error, :rejected} for origins that have been tried and refused within the rejection duration interval + * {:error, some_reason} usually :missing for unknown origins + """ + def get_fed_socket(origin) do + case get_registry_data(origin) do + {:error, reason} -> + {:error, reason} + + {:ok, %{state: :connected} = socket_info} -> + {:ok, socket_info} + end + end + + @doc """ + Adds a connected FedSocket to the Registry. + + Always returns {:ok, fed_socket} + """ + def add_fed_socket(origin, pid \\ nil) do + origin + |> SocketInfo.build(pid) + |> SocketInfo.connect() + |> add_socket_info + end + + defp add_socket_info(%{origin: origin, state: :connected} = socket_info) do + case Registry.register(FedSockets.Registry, origin, socket_info) do + {:ok, _owner} -> + clear_prior_rejection(origin) + Logger.debug("fedsocket added: #{inspect(origin)}") + + {:ok, socket_info} + + {:error, {:already_registered, _pid}} -> + FedSocket.close(socket_info) + existing_socket_info = Registry.lookup(FedSockets.Registry, origin) + + {:ok, existing_socket_info} + + _ -> + {:error, :error_adding_socket} + end + end + + @doc """ + Mark this origin as having rejected a connection attempt. + This will keep it from getting additional connection attempts + for a period of time specified in the config. + + Always returns {:ok, new_reg_data} + """ + def set_host_rejected(uri) do + new_reg_data = + uri + |> SocketInfo.origin() + |> get_or_create_registry_data() + |> set_to_rejected() + |> save_registry_data() + + {:ok, new_reg_data} + end + + @doc """ + Retrieves the FedRegistryData from the Registry given it's origin. + + The origin is expected to be a string identifying the endpoint "example.com" or "example2.com:8080" + + Will return: + * {:ok, fed_registry_data} for known origins + * {:error, :missing} for uniknown origins + * {:error, :cache_error} indicating some low level runtime issues + """ + def get_registry_data(origin) do + case Registry.lookup(FedSockets.Registry, origin) do + [] -> + if is_rejected?(origin) do + Logger.debug("previously rejected fedsocket requested") + {:error, :rejected} + else + {:error, :missing} + end + + [{_pid, %{state: :connected} = socket_info}] -> + {:ok, socket_info} + + _ -> + {:error, :cache_error} + end + end + + @doc """ + Retrieves a map of all sockets from the Registry. The keys are the origins and the values are the corresponding SocketInfo + """ + def list_all do + (list_all_connected() ++ list_all_rejected()) + |> Enum.into(%{}) + end + + defp list_all_connected do + FedSockets.Registry + |> Registry.select([{{:"$1", :_, :"$3"}, [], [{{:"$1", :"$3"}}]}]) + end + + defp list_all_rejected do + {:ok, keys} = Cachex.keys(@rejections) + + {:ok, registry_data} = + Cachex.execute(@rejections, fn worker -> + Enum.map(keys, fn k -> {k, Cachex.get!(worker, k)} end) + end) + + registry_data + end + + defp clear_prior_rejection(origin), + do: Cachex.del(@rejections, origin) + + defp is_rejected?(origin) do + case Cachex.get(@rejections, origin) do + {:ok, nil} -> + false + + {:ok, _} -> + true + end + end + + defp get_or_create_registry_data(origin) do + case get_registry_data(origin) do + {:error, :missing} -> + %SocketInfo{origin: origin} + + {:ok, socket_info} -> + socket_info + end + end + + defp save_registry_data(%SocketInfo{origin: origin, state: :connected} = socket_info) do + {:ok, true} = Registry.update_value(FedSockets.Registry, origin, fn _ -> socket_info end) + socket_info + end + + defp save_registry_data(%SocketInfo{origin: origin, state: :rejected} = socket_info) do + rejection_expiration = + Pleroma.Config.get([:fed_sockets, :rejection_duration], @default_rejection_duration) + + {:ok, true} = Cachex.put(@rejections, origin, socket_info, ttl: rejection_expiration) + socket_info + end + + defp set_to_rejected(%SocketInfo{} = socket_info), + do: %SocketInfo{socket_info | state: :rejected} +end diff --git a/lib/pleroma/web/fed_sockets/fed_socket.ex b/lib/pleroma/web/fed_sockets/fed_socket.ex new file mode 100644 index 000000000..98d64e65a --- /dev/null +++ b/lib/pleroma/web/fed_sockets/fed_socket.ex @@ -0,0 +1,137 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.FedSockets.FedSocket do + @moduledoc """ + The FedSocket module abstracts the actions to be taken taken on connections regardless of + whether the connection started as inbound or outbound. + + + Normally outside modules will have no need to call the FedSocket module directly. + """ + + alias Pleroma.Object + alias Pleroma.Object.Containment + alias Pleroma.User + alias Pleroma.Web.ActivityPub.ObjectView + alias Pleroma.Web.ActivityPub.UserView + alias Pleroma.Web.ActivityPub.Visibility + alias Pleroma.Web.FedSockets.FetchRegistry + alias Pleroma.Web.FedSockets.IngesterWorker + alias Pleroma.Web.FedSockets.OutgoingHandler + alias Pleroma.Web.FedSockets.SocketInfo + + require Logger + + @shake "61dd18f7-f1e6-49a4-939a-a749fcdc1103" + + def connect_to_host(uri) do + case OutgoingHandler.start_link(uri) do + {:ok, pid} -> + {:ok, pid} + + error -> + {:error, error} + end + end + + def close(%SocketInfo{pid: socket_pid}), + do: Process.send(socket_pid, :close, []) + + def publish(%SocketInfo{pid: socket_pid}, json) do + %{action: :publish, data: json} + |> Jason.encode!() + |> send_packet(socket_pid) + end + + def fetch(%SocketInfo{pid: socket_pid}, id) do + fetch_uuid = FetchRegistry.register_fetch(id) + + %{action: :fetch, data: id, uuid: fetch_uuid} + |> Jason.encode!() + |> send_packet(socket_pid) + + wait_for_fetch_to_return(fetch_uuid, 0) + end + + def receive_package(%SocketInfo{} = fed_socket, json) do + json + |> Jason.decode!() + |> process_package(fed_socket) + end + + defp wait_for_fetch_to_return(uuid, cntr) do + case FetchRegistry.check_fetch(uuid) do + {:error, :waiting} -> + Process.sleep(:math.pow(cntr, 3) |> Kernel.trunc()) + wait_for_fetch_to_return(uuid, cntr + 1) + + {:error, :missing} -> + Logger.error("FedSocket fetch timed out - #{inspect(uuid)}") + {:error, :timeout} + + {:ok, _fr} -> + FetchRegistry.pop_fetch(uuid) + end + end + + defp process_package(%{"action" => "publish", "data" => data}, %{origin: origin} = _fed_socket) do + if Containment.contain_origin(origin, data) do + IngesterWorker.enqueue("ingest", %{"object" => data}) + end + + {:reply, %{"action" => "publish_reply", "status" => "processed"}} + end + + defp process_package(%{"action" => "fetch_reply", "uuid" => uuid, "data" => data}, _fed_socket) do + FetchRegistry.register_fetch_received(uuid, data) + {:noreply, nil} + end + + defp process_package(%{"action" => "fetch", "uuid" => uuid, "data" => ap_id}, _fed_socket) do + {:ok, data} = render_fetched_data(ap_id, uuid) + {:reply, data} + end + + defp process_package(%{"action" => "publish_reply"}, _fed_socket) do + {:noreply, nil} + end + + defp process_package(other, _fed_socket) do + Logger.warn("unknown json packages received #{inspect(other)}") + {:noreply, nil} + end + + defp render_fetched_data(ap_id, uuid) do + {:ok, + %{ + "action" => "fetch_reply", + "status" => "processed", + "uuid" => uuid, + "data" => represent_item(ap_id) + }} + end + + defp represent_item(ap_id) do + case User.get_by_ap_id(ap_id) do + nil -> + object = Object.get_cached_by_ap_id(ap_id) + + if Visibility.is_public?(object) do + Phoenix.View.render_to_string(ObjectView, "object.json", object: object) + else + nil + end + + user -> + Phoenix.View.render_to_string(UserView, "user.json", user: user) + end + end + + defp send_packet(data, socket_pid) do + Process.send(socket_pid, {:send, data}, []) + end + + def shake, do: @shake +end diff --git a/lib/pleroma/web/fed_sockets/fed_sockets.ex b/lib/pleroma/web/fed_sockets/fed_sockets.ex new file mode 100644 index 000000000..1fd5899c8 --- /dev/null +++ b/lib/pleroma/web/fed_sockets/fed_sockets.ex @@ -0,0 +1,185 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.FedSockets do + @moduledoc """ + This documents the FedSockets framework. A framework for federating + ActivityPub objects between servers via persistant WebSocket connections. + + FedSockets allow servers to authenticate on first contact and maintain that + connection, eliminating the need to authenticate every time data needs to be shared. + + ## Protocol + FedSockets currently support 2 types of data transfer: + * `publish` method which doesn't require a response + * `fetch` method requires a response be sent + + ### Publish + The publish operation sends a json encoded map of the shape: + %{action: :publish, data: json} + and accepts (but does not require) a reply of form: + %{"action" => "publish_reply"} + + The outgoing params represent + * data: ActivityPub object encoded into json + + + ### Fetch + The fetch operation sends a json encoded map of the shape: + %{action: :fetch, data: id, uuid: fetch_uuid} + and requires a reply of form: + %{"action" => "fetch_reply", "uuid" => uuid, "data" => data} + + The outgoing params represent + * id: an ActivityPub object URI + * uuid: a unique uuid generated by the sender + + The reply params represent + * data: an ActivityPub object encoded into json + * uuid: the uuid sent along with the fetch request + + ## Examples + Clients of FedSocket transfers shouldn't need to use any of the functions outside of this module. + + A typical publish operation can be performed through the following code, and a fetch operation in a similar manner. + + case FedSockets.get_or_create_fed_socket(inbox) do + {:ok, fedsocket} -> + FedSockets.publish(fedsocket, json) + + _ -> + alternative_publish(inbox, actor, json, params) + end + + ## Configuration + FedSockets have the following config settings + + config :pleroma, :fed_sockets, + enabled: true, + ping_interval: :timer.seconds(15), + connection_duration: :timer.hours(1), + rejection_duration: :timer.hours(1), + fed_socket_fetches: [ + default: 12_000, + interval: 3_000, + lazy: false + ] + * enabled - turn FedSockets on or off with this flag. Can be toggled at runtime. + * connection_duration - How long a FedSocket can sit idle before it's culled. + * rejection_duration - After failing to make a FedSocket connection a host will be excluded + from further connections for this amount of time + * fed_socket_fetches - Use these parameters to pass options to the Cachex queue backing the FetchRegistry + * fed_socket_rejections - Use these parameters to pass options to the Cachex queue backing the FedRegistry + + Cachex options are + * default: the minimum amount of time a fetch can wait before it times out. + * interval: the interval between checks for timed out entries. This plus the default represent the maximum time allowed + * lazy: leave at false for consistant and fast lookups, set to true for stricter timeout enforcement + + """ + require Logger + + alias Pleroma.Web.FedSockets.FedRegistry + alias Pleroma.Web.FedSockets.FedSocket + alias Pleroma.Web.FedSockets.SocketInfo + + @doc """ + returns a FedSocket for the given origin. Will reuse an existing one or create a new one. + + address is expected to be a fully formed URL such as: + "http://www.example.com" or "http://www.example.com:8080" + + It can and usually does include additional path parameters, + but these are ignored as the FedSockets are organized by host and port info alone. + """ + def get_or_create_fed_socket(address) do + with {:cache, {:error, :missing}} <- {:cache, get_fed_socket(address)}, + {:connect, {:ok, _pid}} <- {:connect, FedSocket.connect_to_host(address)}, + {:cache, {:ok, fed_socket}} <- {:cache, get_fed_socket(address)} do + Logger.debug("fedsocket created for - #{inspect(address)}") + {:ok, fed_socket} + else + {:cache, {:ok, socket}} -> + Logger.debug("fedsocket found in cache - #{inspect(address)}") + {:ok, socket} + + {:cache, {:error, :rejected} = e} -> + e + + {:connect, {:error, _host}} -> + Logger.debug("set host rejected for - #{inspect(address)}") + FedRegistry.set_host_rejected(address) + {:error, :rejected} + + {_, {:error, :disabled}} -> + {:error, :disabled} + + {_, {:error, reason}} -> + Logger.warn("get_or_create_fed_socket error - #{inspect(reason)}") + {:error, reason} + end + end + + @doc """ + returns a FedSocket for the given origin. Will not create a new FedSocket if one does not exist. + + address is expected to be a fully formed URL such as: + "http://www.example.com" or "http://www.example.com:8080" + """ + def get_fed_socket(address) do + origin = SocketInfo.origin(address) + + with {:config, true} <- {:config, Pleroma.Config.get([:fed_sockets, :enabled], false)}, + {:ok, socket} <- FedRegistry.get_fed_socket(origin) do + {:ok, socket} + else + {:config, _} -> + {:error, :disabled} + + {:error, :rejected} -> + Logger.debug("FedSocket previously rejected - #{inspect(origin)}") + {:error, :rejected} + + {:error, reason} -> + {:error, reason} + end + end + + @doc """ + Sends the supplied data via the publish protocol. + It will not block waiting for a reply. + Returns :ok but this is not an indication of a successful transfer. + + the data is expected to be JSON encoded binary data. + """ + def publish(%SocketInfo{} = fed_socket, json) do + FedSocket.publish(fed_socket, json) + end + + @doc """ + Sends the supplied data via the fetch protocol. + It will block waiting for a reply or timeout. + + Returns {:ok, object} where object is the requested object (or nil) + {:error, :timeout} in the event the message was not responded to + + the id is expected to be the URI of an ActivityPub object. + """ + def fetch(%SocketInfo{} = fed_socket, id) do + FedSocket.fetch(fed_socket, id) + end + + @doc """ + Disconnect all and restart FedSockets. + This is mainly used in development and testing but could be useful in production. + """ + def reset do + FedRegistry + |> Process.whereis() + |> Process.exit(:testing) + end + + def uri_for_origin(origin), + do: "ws://#{origin}/api/fedsocket/v1" +end diff --git a/lib/pleroma/web/fed_sockets/fetch_registry.ex b/lib/pleroma/web/fed_sockets/fetch_registry.ex new file mode 100644 index 000000000..7897f0fc6 --- /dev/null +++ b/lib/pleroma/web/fed_sockets/fetch_registry.ex @@ -0,0 +1,151 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.FedSockets.FetchRegistry do + @moduledoc """ + The FetchRegistry acts as a broker for fetch requests and return values. + This allows calling processes to block while waiting for a reply. + It doesn't impose it's own process instead using `Cachex` to handle fetches in process, allowing + multi threaded processes to avoid bottlenecking. + + Normally outside modules will have no need to call or use the FetchRegistry themselves. + + The `Cachex` parameters can be controlled from the config. Since exact timeout intervals + aren't necessary the following settings are used by default: + + config :pleroma, :fed_sockets, + fed_socket_fetches: [ + default: 12_000, + interval: 3_000, + lazy: false + ] + + """ + + defmodule FetchRegistryData do + defstruct uuid: nil, + sent_json: nil, + received_json: nil, + sent_at: nil, + received_at: nil + end + + alias Ecto.UUID + + require Logger + + @fetches :fed_socket_fetches + + @doc """ + Registers a json request wth the FetchRegistry and returns the identifying UUID. + """ + def register_fetch(json) do + %FetchRegistryData{uuid: uuid} = + json + |> new_registry_data + |> save_registry_data + + uuid + end + + @doc """ + Reports on the status of a Fetch given the identifying UUID. + + Will return + * {:ok, fetched_object} if a fetch has completed + * {:error, :waiting} if a fetch is still pending + * {:error, other_error} usually :missing to indicate a fetch that has timed out + """ + def check_fetch(uuid) do + case get_registry_data(uuid) do + {:ok, %FetchRegistryData{received_at: nil}} -> + {:error, :waiting} + + {:ok, %FetchRegistryData{} = reg_data} -> + {:ok, reg_data} + + e -> + e + end + end + + @doc """ + Retrieves the response to a fetch given the identifying UUID. + The completed fetch will be deleted from the FetchRegistry + + Will return + * {:ok, fetched_object} if a fetch has completed + * {:error, :waiting} if a fetch is still pending + * {:error, other_error} usually :missing to indicate a fetch that has timed out + """ + def pop_fetch(uuid) do + case check_fetch(uuid) do + {:ok, %FetchRegistryData{received_json: received_json}} -> + delete_registry_data(uuid) + {:ok, received_json} + + e -> + e + end + end + + @doc """ + This is called to register a fetch has returned. + It expects the result data along with the UUID that was sent in the request + + Will return the fetched object or :error + """ + def register_fetch_received(uuid, data) do + case get_registry_data(uuid) do + {:ok, %FetchRegistryData{received_at: nil} = reg_data} -> + reg_data + |> set_fetch_received(data) + |> save_registry_data() + + {:ok, %FetchRegistryData{} = reg_data} -> + Logger.warn("tried to add fetched data twice - #{uuid}") + reg_data + + {:error, _} -> + Logger.warn("Error adding fetch to registry - #{uuid}") + :error + end + end + + defp new_registry_data(json) do + %FetchRegistryData{ + uuid: UUID.generate(), + sent_json: json, + sent_at: :erlang.monotonic_time(:millisecond) + } + end + + defp get_registry_data(origin) do + case Cachex.get(@fetches, origin) do + {:ok, nil} -> + {:error, :missing} + + {:ok, reg_data} -> + {:ok, reg_data} + + _ -> + {:error, :cache_error} + end + end + + defp set_fetch_received(%FetchRegistryData{} = reg_data, data), + do: %FetchRegistryData{ + reg_data + | received_at: :erlang.monotonic_time(:millisecond), + received_json: data + } + + defp save_registry_data(%FetchRegistryData{uuid: uuid} = reg_data) do + {:ok, true} = Cachex.put(@fetches, uuid, reg_data) + reg_data + end + + defp delete_registry_data(origin), + do: {:ok, true} = Cachex.del(@fetches, origin) +end diff --git a/lib/pleroma/web/fed_sockets/incoming_handler.ex b/lib/pleroma/web/fed_sockets/incoming_handler.ex new file mode 100644 index 000000000..49d0d9d84 --- /dev/null +++ b/lib/pleroma/web/fed_sockets/incoming_handler.ex @@ -0,0 +1,88 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.FedSockets.IncomingHandler do + require Logger + + alias Pleroma.Web.FedSockets.FedRegistry + alias Pleroma.Web.FedSockets.FedSocket + alias Pleroma.Web.FedSockets.SocketInfo + + import HTTPSignatures, only: [validate_conn: 1, split_signature: 1] + + @behaviour :cowboy_websocket + + def init(req, state) do + shake = FedSocket.shake() + + with true <- Pleroma.Config.get([:fed_sockets, :enabled]), + sec_protocol <- :cowboy_req.header("sec-websocket-protocol", req, nil), + headers = %{"(request-target)" => ^shake} <- :cowboy_req.headers(req), + true <- validate_conn(%{req_headers: headers}), + %{"keyId" => origin} <- split_signature(headers["signature"]) do + req = + if is_nil(sec_protocol) do + req + else + :cowboy_req.set_resp_header("sec-websocket-protocol", sec_protocol, req) + end + + {:cowboy_websocket, req, %{origin: origin}, %{}} + else + _ -> + {:ok, req, state} + end + end + + def websocket_init(%{origin: origin}) do + case FedRegistry.add_fed_socket(origin) do + {:ok, socket_info} -> + {:ok, socket_info} + + e -> + Logger.error("FedSocket websocket_init failed - #{inspect(e)}") + {:error, inspect(e)} + end + end + + # Use the ping to check if the connection should be expired + def websocket_handle(:ping, socket_info) do + if SocketInfo.expired?(socket_info) do + {:stop, socket_info} + else + {:ok, socket_info, :hibernate} + end + end + + def websocket_handle({:text, data}, socket_info) do + socket_info = SocketInfo.touch(socket_info) + + case FedSocket.receive_package(socket_info, data) do + {:noreply, _} -> + {:ok, socket_info} + + {:reply, reply} -> + {:reply, {:text, Jason.encode!(reply)}, socket_info} + + {:error, reason} -> + Logger.error("incoming error - receive_package: #{inspect(reason)}") + {:ok, socket_info} + end + end + + def websocket_info({:send, message}, socket_info) do + socket_info = SocketInfo.touch(socket_info) + + {:reply, {:text, message}, socket_info} + end + + def websocket_info(:close, state) do + {:stop, state} + end + + def websocket_info(message, state) do + Logger.debug("#{__MODULE__} unknown message #{inspect(message)}") + {:ok, state} + end +end diff --git a/lib/pleroma/web/fed_sockets/ingester_worker.ex b/lib/pleroma/web/fed_sockets/ingester_worker.ex new file mode 100644 index 000000000..325f2a4ab --- /dev/null +++ b/lib/pleroma/web/fed_sockets/ingester_worker.ex @@ -0,0 +1,33 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.FedSockets.IngesterWorker do + use Pleroma.Workers.WorkerHelper, queue: "ingestion_queue" + require Logger + + alias Pleroma.Web.Federator + + @impl Oban.Worker + def perform(%Job{args: %{"op" => "ingest", "object" => ingestee}}) do + try do + ingestee + |> Jason.decode!() + |> do_ingestion() + rescue + e -> + Logger.error("IngesterWorker error - #{inspect(e)}") + e + end + end + + defp do_ingestion(params) do + case Federator.incoming_ap_doc(params) do + {:error, reason} -> + {:error, reason} + + {:ok, object} -> + {:ok, object} + end + end +end diff --git a/lib/pleroma/web/fed_sockets/outgoing_handler.ex b/lib/pleroma/web/fed_sockets/outgoing_handler.ex new file mode 100644 index 000000000..e235a7c43 --- /dev/null +++ b/lib/pleroma/web/fed_sockets/outgoing_handler.ex @@ -0,0 +1,151 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.FedSockets.OutgoingHandler do + use GenServer + + require Logger + + alias Pleroma.Application + alias Pleroma.Web.ActivityPub.InternalFetchActor + alias Pleroma.Web.FedSockets + alias Pleroma.Web.FedSockets.FedRegistry + alias Pleroma.Web.FedSockets.FedSocket + alias Pleroma.Web.FedSockets.SocketInfo + + def start_link(uri) do + GenServer.start_link(__MODULE__, %{uri: uri}) + end + + def init(%{uri: uri}) do + case initiate_connection(uri) do + {:ok, ws_origin, conn_pid} -> + FedRegistry.add_fed_socket(ws_origin, conn_pid) + + {:error, reason} -> + Logger.debug("Outgoing connection failed - #{inspect(reason)}") + :ignore + end + end + + def handle_info({:gun_ws, conn_pid, _ref, {:text, data}}, socket_info) do + socket_info = SocketInfo.touch(socket_info) + + case FedSocket.receive_package(socket_info, data) do + {:noreply, _} -> + {:noreply, socket_info} + + {:reply, reply} -> + :gun.ws_send(conn_pid, {:text, Jason.encode!(reply)}) + {:noreply, socket_info} + + {:error, reason} -> + Logger.error("incoming error - receive_package: #{inspect(reason)}") + {:noreply, socket_info} + end + end + + def handle_info(:close, state) do + Logger.debug("Sending close frame !!!!!!!") + {:close, state} + end + + def handle_info({:gun_down, _pid, _prot, :closed, _}, state) do + {:stop, :normal, state} + end + + def handle_info({:send, data}, %{conn_pid: conn_pid} = socket_info) do + socket_info = SocketInfo.touch(socket_info) + :gun.ws_send(conn_pid, {:text, data}) + {:noreply, socket_info} + end + + def handle_info({:gun_ws, _, _, :pong}, state) do + {:noreply, state, :hibernate} + end + + def handle_info(msg, state) do + Logger.debug("#{__MODULE__} unhandled event #{inspect(msg)}") + {:noreply, state} + end + + def terminate(reason, state) do + Logger.debug( + "#{__MODULE__} terminating outgoing connection for #{inspect(state)} for #{inspect(reason)}" + ) + + {:ok, state} + end + + def initiate_connection(uri) do + ws_uri = + uri + |> SocketInfo.origin() + |> FedSockets.uri_for_origin() + + %{host: host, port: port, path: path} = URI.parse(ws_uri) + + with {:ok, conn_pid} <- :gun.open(to_charlist(host), port, %{protocols: [:http]}), + {:ok, _} <- :gun.await_up(conn_pid), + reference <- + :gun.get(conn_pid, to_charlist(path), [ + {'user-agent', to_charlist(Application.user_agent())} + ]), + {:response, :fin, 204, _} <- :gun.await(conn_pid, reference), + headers <- build_headers(uri), + ref <- :gun.ws_upgrade(conn_pid, to_charlist(path), headers, %{silence_pings: false}) do + receive do + {:gun_upgrade, ^conn_pid, ^ref, [<<"websocket">>], _} -> + {:ok, ws_uri, conn_pid} + after + 15_000 -> + Logger.debug("Fedsocket timeout connecting to #{inspect(uri)}") + {:error, :timeout} + end + else + {:response, :nofin, 404, _} -> + {:error, :fedsockets_not_supported} + + e -> + Logger.debug("Fedsocket error connecting to #{inspect(uri)}") + {:error, e} + end + end + + defp build_headers(uri) do + host_for_sig = uri |> URI.parse() |> host_signature() + + shake = FedSocket.shake() + digest = "SHA-256=" <> (:crypto.hash(:sha256, shake) |> Base.encode64()) + date = Pleroma.Signature.signed_date() + shake_size = byte_size(shake) + + signature_opts = %{ + "(request-target)": shake, + "content-length": to_charlist("#{shake_size}"), + date: date, + digest: digest, + host: host_for_sig + } + + signature = Pleroma.Signature.sign(InternalFetchActor.get_actor(), signature_opts) + + [ + {'signature', to_charlist(signature)}, + {'date', date}, + {'digest', to_charlist(digest)}, + {'content-length', to_charlist("#{shake_size}")}, + {to_charlist("(request-target)"), to_charlist(shake)}, + {'user-agent', to_charlist(Application.user_agent())} + ] + end + + defp host_signature(%{host: host, scheme: scheme, port: port}) do + if port == URI.default_port(scheme) do + host + else + "#{host}:#{port}" + end + end +end diff --git a/lib/pleroma/web/fed_sockets/socket_info.ex b/lib/pleroma/web/fed_sockets/socket_info.ex new file mode 100644 index 000000000..d6fdffe1a --- /dev/null +++ b/lib/pleroma/web/fed_sockets/socket_info.ex @@ -0,0 +1,52 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.FedSockets.SocketInfo do + defstruct origin: nil, + pid: nil, + conn_pid: nil, + state: :default, + connected_until: nil + + alias Pleroma.Web.FedSockets.SocketInfo + @default_connection_duration 15 * 60 * 1000 + + def build(uri, conn_pid \\ nil) do + uri + |> build_origin() + |> build_pids(conn_pid) + |> touch() + end + + def touch(%SocketInfo{} = socket_info), + do: %{socket_info | connected_until: new_ttl()} + + def connect(%SocketInfo{} = socket_info), + do: %{socket_info | state: :connected} + + def expired?(%{connected_until: connected_until}), + do: connected_until < :erlang.monotonic_time(:millisecond) + + def origin(uri), + do: build_origin(uri).origin + + defp build_pids(socket_info, conn_pid), + do: struct(socket_info, pid: self(), conn_pid: conn_pid) + + defp build_origin(uri) when is_binary(uri), + do: uri |> URI.parse() |> build_origin + + defp build_origin(%{host: host, port: nil, scheme: scheme}), + do: build_origin(%{host: host, port: URI.default_port(scheme)}) + + defp build_origin(%{host: host, port: port}), + do: %SocketInfo{origin: "#{host}:#{port}"} + + defp new_ttl do + connection_duration = + Pleroma.Config.get([:fed_sockets, :connection_duration], @default_connection_duration) + + :erlang.monotonic_time(:millisecond) + connection_duration + end +end diff --git a/lib/pleroma/web/fed_sockets/supervisor.ex b/lib/pleroma/web/fed_sockets/supervisor.ex new file mode 100644 index 000000000..a5f4bebfb --- /dev/null +++ b/lib/pleroma/web/fed_sockets/supervisor.ex @@ -0,0 +1,59 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.FedSockets.Supervisor do + use Supervisor + import Cachex.Spec + + def start_link(opts) do + Supervisor.start_link(__MODULE__, opts, name: __MODULE__) + end + + def init(args) do + children = [ + build_cache(:fed_socket_fetches, args), + build_cache(:fed_socket_rejections, args), + {Registry, keys: :unique, name: FedSockets.Registry, meta: [rejected: %{}]} + ] + + opts = [strategy: :one_for_all, name: Pleroma.Web.Streamer.Supervisor] + Supervisor.init(children, opts) + end + + defp build_cache(name, args) do + opts = get_opts(name, args) + + %{ + id: String.to_atom("#{name}_cache"), + start: {Cachex, :start_link, [name, opts]}, + type: :worker + } + end + + defp get_opts(cache_name, args) + when cache_name in [:fed_socket_fetches, :fed_socket_rejections] do + default = get_opts_or_config(args, cache_name, :default, 15_000) + interval = get_opts_or_config(args, cache_name, :interval, 3_000) + lazy = get_opts_or_config(args, cache_name, :lazy, false) + + [expiration: expiration(default: default, interval: interval, lazy: lazy)] + end + + defp get_opts(name, args) do + Keyword.get(args, name, []) + end + + defp get_opts_or_config(args, name, key, default) do + args + |> Keyword.get(name, []) + |> Keyword.get(key) + |> case do + nil -> + Pleroma.Config.get([:fed_sockets, name, key], default) + + value -> + value + end + end +end diff --git a/lib/pleroma/web/federator/federator.ex b/lib/pleroma/web/federator/federator.ex index f5803578d..130654145 100644 --- a/lib/pleroma/web/federator/federator.ex +++ b/lib/pleroma/web/federator/federator.ex @@ -66,14 +66,17 @@ def perform(:publish, activity) do def perform(:incoming_ap_doc, params) do Logger.debug("Handling incoming AP activity") - params = Utils.normalize_params(params) + actor = + params + |> Map.get("actor") + |> Utils.get_ap_id() # NOTE: we use the actor ID to do the containment, this is fine because an # actor shouldn't be acting on objects outside their own AP server. - with {:ok, _user} <- ap_enabled_actor(params["actor"]), + with {_, {:ok, _user}} <- {:actor, ap_enabled_actor(actor)}, nil <- Activity.normalize(params["id"]), {_, :ok} <- - {:correct_origin?, Containment.contain_origin_from_id(params["actor"], params)}, + {:correct_origin?, Containment.contain_origin_from_id(actor, params)}, {:ok, activity} <- Transmogrifier.handle_incoming(params) do {:ok, activity} else @@ -85,10 +88,13 @@ def perform(:incoming_ap_doc, params) do Logger.debug("Already had #{params["id"]}") {:error, :already_present} + {:actor, e} -> + Logger.debug("Unhandled actor #{actor}, #{inspect(e)}") + {:error, e} + e -> # Just drop those for now - Logger.debug("Unhandled activity") - Logger.debug(Jason.encode!(params, pretty: true)) + Logger.debug(fn -> "Unhandled activity\n" <> Jason.encode!(params, pretty: true) end) {:error, e} end end diff --git a/lib/pleroma/web/instance_document.ex b/lib/pleroma/web/instance_document.ex new file mode 100644 index 000000000..df5caebf0 --- /dev/null +++ b/lib/pleroma/web/instance_document.ex @@ -0,0 +1,62 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.InstanceDocument do + alias Pleroma.Config + alias Pleroma.Web.Endpoint + + @instance_documents %{ + "terms-of-service" => "/static/terms-of-service.html", + "instance-panel" => "/instance/panel.html" + } + + @spec get(String.t()) :: {:ok, String.t()} | {:error, atom()} + def get(document_name) do + case Map.fetch(@instance_documents, document_name) do + {:ok, path} -> {:ok, path} + _ -> {:error, :not_found} + end + end + + @spec put(String.t(), String.t()) :: {:ok, String.t()} | {:error, atom()} + def put(document_name, origin_path) do + with {_, {:ok, destination_path}} <- + {:instance_document, Map.fetch(@instance_documents, document_name)}, + :ok <- put_file(origin_path, destination_path) do + {:ok, Path.join(Endpoint.url(), destination_path)} + else + {:instance_document, :error} -> {:error, :not_found} + error -> error + end + end + + @spec delete(String.t()) :: :ok | {:error, atom()} + def delete(document_name) do + with {_, {:ok, path}} <- {:instance_document, Map.fetch(@instance_documents, document_name)}, + instance_static_dir_path <- instance_static_dir(path), + :ok <- File.rm(instance_static_dir_path) do + :ok + else + {:instance_document, :error} -> {:error, :not_found} + {:error, :enoent} -> {:error, :not_found} + error -> error + end + end + + defp put_file(origin_path, destination_path) do + with destination <- instance_static_dir(destination_path), + {_, :ok} <- {:mkdir_p, File.mkdir_p(Path.dirname(destination))}, + {_, {:ok, _}} <- {:copy, File.copy(origin_path, destination)} do + :ok + else + {error, _} -> {:error, error} + end + end + + defp instance_static_dir(filename) do + [:instance, :static_dir] + |> Config.get!() + |> Path.join(filename) + end +end diff --git a/lib/pleroma/web/mastodon_api/controllers/auth_controller.ex b/lib/pleroma/web/mastodon_api/controllers/auth_controller.ex index 9f09550e1..57c0be5fe 100644 --- a/lib/pleroma/web/mastodon_api/controllers/auth_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/auth_controller.ex @@ -5,6 +5,8 @@ defmodule Pleroma.Web.MastodonAPI.AuthController do use Pleroma.Web, :controller + import Pleroma.Web.ControllerHelper, only: [json_response: 3] + alias Pleroma.User alias Pleroma.Web.OAuth.App alias Pleroma.Web.OAuth.Authorization @@ -61,9 +63,7 @@ def password_reset(conn, params) do TwitterAPI.password_reset(nickname_or_email) - conn - |> put_status(:no_content) - |> json("") + json_response(conn, :no_content, "") end defp local_mastodon_root_path(conn) do diff --git a/lib/pleroma/web/mastodon_api/views/account_view.ex b/lib/pleroma/web/mastodon_api/views/account_view.ex index d2a30a548..121ba1693 100644 --- a/lib/pleroma/web/mastodon_api/views/account_view.ex +++ b/lib/pleroma/web/mastodon_api/views/account_view.ex @@ -181,8 +181,10 @@ defp do_render("show.json", %{user: user} = opts) do user = User.sanitize_html(user, User.html_filter_policy(opts[:for])) display_name = user.name || user.nickname - image = User.avatar_url(user) |> MediaProxy.url() + avatar = User.avatar_url(user) |> MediaProxy.url() + avatar_static = User.avatar_url(user) |> MediaProxy.preview_url(static: true) header = User.banner_url(user) |> MediaProxy.url() + header_static = User.banner_url(user) |> MediaProxy.preview_url(static: true) following_count = if !user.hide_follows_count or !user.hide_follows or opts[:for] == user do @@ -247,10 +249,10 @@ defp do_render("show.json", %{user: user} = opts) do statuses_count: user.note_count, note: user.bio, url: user.uri || user.ap_id, - avatar: image, - avatar_static: image, + avatar: avatar, + avatar_static: avatar_static, header: header, - header_static: header, + header_static: header_static, emojis: emojis, fields: user.fields, bot: bot, diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex index ca42917fc..435bcde15 100644 --- a/lib/pleroma/web/mastodon_api/views/status_view.ex +++ b/lib/pleroma/web/mastodon_api/views/status_view.ex @@ -55,23 +55,6 @@ defp get_replied_to_activities(activities) do end) end - def get_user(ap_id, fake_record_fallback \\ true) do - cond do - user = User.get_cached_by_ap_id(ap_id) -> - user - - user = User.get_by_guessed_nickname(ap_id) -> - user - - fake_record_fallback -> - # TODO: refactor (fake records is never a good idea) - User.error_user(ap_id) - - true -> - nil - end - end - defp get_context_id(%{data: %{"context_id" => context_id}}) when not is_nil(context_id), do: context_id @@ -119,7 +102,7 @@ def render("index.json", opts) do # Note: unresolved users are filtered out actors = (activities ++ parent_activities) - |> Enum.map(&get_user(&1.data["actor"], false)) + |> Enum.map(&CommonAPI.get_user(&1.data["actor"], false)) |> Enum.filter(& &1) UserRelationship.view_relationships_option(reading_user, actors, subset: :source_mutes) @@ -138,7 +121,7 @@ def render( "show.json", %{activity: %{data: %{"type" => "Announce", "object" => _object}} = activity} = opts ) do - user = get_user(activity.data["actor"]) + user = CommonAPI.get_user(activity.data["actor"]) created_at = Utils.to_masto_date(activity.data["published"]) activity_object = Object.normalize(activity) @@ -211,7 +194,7 @@ def render( def render("show.json", %{activity: %{data: %{"object" => _object}} = activity} = opts) do object = Object.normalize(activity) - user = get_user(activity.data["actor"]) + user = CommonAPI.get_user(activity.data["actor"]) user_follower_address = user.follower_address like_count = object.data["like_count"] || 0 @@ -265,7 +248,7 @@ def render("show.json", %{activity: %{data: %{"object" => _object}} = activity} reply_to = get_reply_to(activity, opts) - reply_to_user = reply_to && get_user(reply_to.data["actor"]) + reply_to_user = reply_to && CommonAPI.get_user(reply_to.data["actor"]) content = object @@ -432,6 +415,7 @@ def render("attachment.json", %{attachment: attachment}) do [attachment_url | _] = attachment["url"] media_type = attachment_url["mediaType"] || attachment_url["mimeType"] || "image" href = attachment_url["href"] |> MediaProxy.url() + href_preview = attachment_url["href"] |> MediaProxy.preview_url() type = cond do @@ -447,7 +431,7 @@ def render("attachment.json", %{attachment: attachment}) do id: to_string(attachment["id"] || hash_id), url: href, remote_url: href, - preview_url: href, + preview_url: href_preview, text_url: href, type: type, description: attachment["name"], diff --git a/lib/pleroma/web/mastodon_api/websocket_handler.ex b/lib/pleroma/web/mastodon_api/websocket_handler.ex index cf923ded8..439cdd716 100644 --- a/lib/pleroma/web/mastodon_api/websocket_handler.ex +++ b/lib/pleroma/web/mastodon_api/websocket_handler.ex @@ -23,8 +23,8 @@ def init(%{qs: qs} = req, state) do with params <- Enum.into(:cow_qs.parse_qs(qs), %{}), sec_websocket <- :cowboy_req.header("sec-websocket-protocol", req, nil), access_token <- Map.get(params, "access_token"), - {:ok, user} <- authenticate_request(access_token, sec_websocket), - {:ok, topic} <- Streamer.get_topic(Map.get(params, "stream"), user, params) do + {:ok, user, oauth_token} <- authenticate_request(access_token, sec_websocket), + {:ok, topic} <- Streamer.get_topic(params["stream"], user, oauth_token, params) do req = if sec_websocket do :cowboy_req.set_resp_header("sec-websocket-protocol", sec_websocket, req) @@ -117,7 +117,7 @@ def terminate(reason, _req, state) do # Public streams without authentication. defp authenticate_request(nil, nil) do - {:ok, nil} + {:ok, nil, nil} end # Authenticated streams. @@ -125,9 +125,9 @@ defp authenticate_request(access_token, sec_websocket) do token = access_token || sec_websocket with true <- is_bitstring(token), - %Token{user_id: user_id} <- Repo.get_by(Token, token: token), + oauth_token = %Token{user_id: user_id} <- Repo.get_by(Token, token: token), user = %User{} <- User.get_cached_by_id(user_id) do - {:ok, user} + {:ok, user, oauth_token} else _ -> {:error, :unauthorized} end diff --git a/lib/pleroma/web/media_proxy/invalidation.ex b/lib/pleroma/web/media_proxy/invalidation.ex index 5808861e6..4f4340478 100644 --- a/lib/pleroma/web/media_proxy/invalidation.ex +++ b/lib/pleroma/web/media_proxy/invalidation.ex @@ -33,6 +33,8 @@ defp do_purge(urls) do def prepare_urls(urls) do urls |> List.wrap() - |> Enum.map(&MediaProxy.url/1) + |> Enum.map(fn url -> [MediaProxy.url(url), MediaProxy.preview_url(url)] end) + |> List.flatten() + |> Enum.uniq() end end diff --git a/lib/pleroma/web/media_proxy/media_proxy.ex b/lib/pleroma/web/media_proxy/media_proxy.ex index e18dd8224..8656b8cad 100644 --- a/lib/pleroma/web/media_proxy/media_proxy.ex +++ b/lib/pleroma/web/media_proxy/media_proxy.ex @@ -4,6 +4,7 @@ defmodule Pleroma.Web.MediaProxy do alias Pleroma.Config + alias Pleroma.Helpers.UriHelper alias Pleroma.Upload alias Pleroma.Web alias Pleroma.Web.MediaProxy.Invalidation @@ -40,27 +41,35 @@ def url(url) when is_nil(url) or url == "", do: nil def url("/" <> _ = url), do: url def url(url) do - if disabled?() or not url_proxiable?(url) do - url - else + if enabled?() and url_proxiable?(url) do encode_url(url) + else + url end end @spec url_proxiable?(String.t()) :: boolean() def url_proxiable?(url) do - if local?(url) or whitelisted?(url) do - false + not local?(url) and not whitelisted?(url) + end + + def preview_url(url, preview_params \\ []) do + if preview_enabled?() do + encode_preview_url(url, preview_params) else - true + url(url) end end - defp disabled?, do: !Config.get([:media_proxy, :enabled], false) + def enabled?, do: Config.get([:media_proxy, :enabled], false) - defp local?(url), do: String.starts_with?(url, Pleroma.Web.base_url()) + # Note: media proxy must be enabled for media preview proxy in order to load all + # non-local non-whitelisted URLs through it and be sure that body size constraint is preserved. + def preview_enabled?, do: enabled?() and !!Config.get([:media_preview_proxy, :enabled]) - defp whitelisted?(url) do + def local?(url), do: String.starts_with?(url, Pleroma.Web.base_url()) + + def whitelisted?(url) do %{host: domain} = URI.parse(url) mediaproxy_whitelist_domains = @@ -85,17 +94,29 @@ defp maybe_get_domain_from_url("http" <> _ = url) do defp maybe_get_domain_from_url(domain), do: domain - def encode_url(url) do + defp base64_sig64(url) do base64 = Base.url_encode64(url, @base64_opts) sig64 = base64 - |> signed_url + |> signed_url() |> Base.url_encode64(@base64_opts) + {base64, sig64} + end + + def encode_url(url) do + {base64, sig64} = base64_sig64(url) + build_url(sig64, base64, filename(url)) end + def encode_preview_url(url, preview_params \\ []) do + {base64, sig64} = base64_sig64(url) + + build_preview_url(sig64, base64, filename(url), preview_params) + end + def decode_url(sig, url) do with {:ok, sig} <- Base.url_decode64(sig, @base64_opts), signature when signature == sig <- signed_url(url) do @@ -113,10 +134,14 @@ def filename(url_or_path) do if path = URI.parse(url_or_path).path, do: Path.basename(path) end - def build_url(sig_base64, url_base64, filename \\ nil) do + def base_url do + Config.get([:media_proxy, :base_url], Web.base_url()) + end + + defp proxy_url(path, sig_base64, url_base64, filename) do [ - Config.get([:media_proxy, :base_url], Web.base_url()), - "proxy", + base_url(), + path, sig_base64, url_base64, filename @@ -124,4 +149,38 @@ def build_url(sig_base64, url_base64, filename \\ nil) do |> Enum.filter(& &1) |> Path.join() end + + def build_url(sig_base64, url_base64, filename \\ nil) do + proxy_url("proxy", sig_base64, url_base64, filename) + end + + def build_preview_url(sig_base64, url_base64, filename \\ nil, preview_params \\ []) do + uri = proxy_url("proxy/preview", sig_base64, url_base64, filename) + + UriHelper.modify_uri_params(uri, preview_params) + end + + def verify_request_path_and_url( + %Plug.Conn{params: %{"filename" => _}, request_path: request_path}, + url + ) do + verify_request_path_and_url(request_path, url) + end + + def verify_request_path_and_url(request_path, url) when is_binary(request_path) do + filename = filename(url) + + if filename && not basename_matches?(request_path, filename) do + {:wrong_filename, filename} + else + :ok + end + end + + def verify_request_path_and_url(_, _), do: :ok + + defp basename_matches?(path, filename) do + basename = Path.basename(path) + basename == filename or URI.decode(basename) == filename or URI.encode(basename) == filename + end end diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index 9a64b0ef3..90651ed9b 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -5,44 +5,201 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do use Pleroma.Web, :controller + alias Pleroma.Config + alias Pleroma.Helpers.MediaHelper + alias Pleroma.Helpers.UriHelper alias Pleroma.ReverseProxy alias Pleroma.Web.MediaProxy + alias Plug.Conn - @default_proxy_opts [max_body_length: 25 * 1_048_576, http: [follow_redirect: true]] - - def remote(conn, %{"sig" => sig64, "url" => url64} = params) do - with config <- Pleroma.Config.get([:media_proxy], []), - true <- Keyword.get(config, :enabled, false), + def remote(conn, %{"sig" => sig64, "url" => url64}) do + with {_, true} <- {:enabled, MediaProxy.enabled?()}, {:ok, url} <- MediaProxy.decode_url(sig64, url64), {_, false} <- {:in_banned_urls, MediaProxy.in_banned_urls(url)}, - :ok <- filename_matches(params, conn.request_path, url) do - ReverseProxy.call(conn, url, Keyword.get(config, :proxy_opts, @default_proxy_opts)) + :ok <- MediaProxy.verify_request_path_and_url(conn, url) do + ReverseProxy.call(conn, url, media_proxy_opts()) else - error when error in [false, {:in_banned_urls, true}] -> - send_resp(conn, 404, Plug.Conn.Status.reason_phrase(404)) + {:enabled, false} -> + send_resp(conn, 404, Conn.Status.reason_phrase(404)) + + {:in_banned_urls, true} -> + send_resp(conn, 404, Conn.Status.reason_phrase(404)) {:error, :invalid_signature} -> - send_resp(conn, 403, Plug.Conn.Status.reason_phrase(403)) + send_resp(conn, 403, Conn.Status.reason_phrase(403)) {:wrong_filename, filename} -> redirect(conn, external: MediaProxy.build_url(sig64, url64, filename)) end end - def filename_matches(%{"filename" => _} = _, path, url) do - filename = MediaProxy.filename(url) - - if filename && does_not_match(path, filename) do - {:wrong_filename, filename} + def preview(%Conn{} = conn, %{"sig" => sig64, "url" => url64}) do + with {_, true} <- {:enabled, MediaProxy.preview_enabled?()}, + {:ok, url} <- MediaProxy.decode_url(sig64, url64), + :ok <- MediaProxy.verify_request_path_and_url(conn, url) do + handle_preview(conn, url) else - :ok + {:enabled, false} -> + send_resp(conn, 404, Conn.Status.reason_phrase(404)) + + {:error, :invalid_signature} -> + send_resp(conn, 403, Conn.Status.reason_phrase(403)) + + {:wrong_filename, filename} -> + redirect(conn, external: MediaProxy.build_preview_url(sig64, url64, filename)) end end - def filename_matches(_, _, _), do: :ok + defp handle_preview(conn, url) do + media_proxy_url = MediaProxy.url(url) - defp does_not_match(path, filename) do - basename = Path.basename(path) - basename != filename and URI.decode(basename) != filename and URI.encode(basename) != filename + with {:ok, %{status: status} = head_response} when status in 200..299 <- + Pleroma.HTTP.request("head", media_proxy_url, [], [], pool: :media) do + content_type = Tesla.get_header(head_response, "content-type") + content_length = Tesla.get_header(head_response, "content-length") + content_length = content_length && String.to_integer(content_length) + static = conn.params["static"] in ["true", true] + + cond do + static and content_type == "image/gif" -> + handle_jpeg_preview(conn, media_proxy_url) + + static -> + drop_static_param_and_redirect(conn) + + content_type == "image/gif" -> + redirect(conn, external: media_proxy_url) + + min_content_length_for_preview() > 0 and content_length > 0 and + content_length < min_content_length_for_preview() -> + redirect(conn, external: media_proxy_url) + + true -> + handle_preview(content_type, conn, media_proxy_url) + end + else + # If HEAD failed, redirecting to media proxy URI doesn't make much sense; returning an error + {_, %{status: status}} -> + send_resp(conn, :failed_dependency, "Can't fetch HTTP headers (HTTP #{status}).") + + {:error, :recv_response_timeout} -> + send_resp(conn, :failed_dependency, "HEAD request timeout.") + + _ -> + send_resp(conn, :failed_dependency, "Can't fetch HTTP headers.") + end + end + + defp handle_preview("image/png" <> _ = _content_type, conn, media_proxy_url) do + handle_png_preview(conn, media_proxy_url) + end + + defp handle_preview("image/" <> _ = _content_type, conn, media_proxy_url) do + handle_jpeg_preview(conn, media_proxy_url) + end + + defp handle_preview("video/" <> _ = _content_type, conn, media_proxy_url) do + handle_video_preview(conn, media_proxy_url) + end + + defp handle_preview(_unsupported_content_type, conn, media_proxy_url) do + fallback_on_preview_error(conn, media_proxy_url) + end + + defp handle_png_preview(conn, media_proxy_url) do + quality = Config.get!([:media_preview_proxy, :image_quality]) + {thumbnail_max_width, thumbnail_max_height} = thumbnail_max_dimensions() + + with {:ok, thumbnail_binary} <- + MediaHelper.image_resize( + media_proxy_url, + %{ + max_width: thumbnail_max_width, + max_height: thumbnail_max_height, + quality: quality, + format: "png" + } + ) do + conn + |> put_preview_response_headers(["image/png", "preview.png"]) + |> send_resp(200, thumbnail_binary) + else + _ -> + fallback_on_preview_error(conn, media_proxy_url) + end + end + + defp handle_jpeg_preview(conn, media_proxy_url) do + quality = Config.get!([:media_preview_proxy, :image_quality]) + {thumbnail_max_width, thumbnail_max_height} = thumbnail_max_dimensions() + + with {:ok, thumbnail_binary} <- + MediaHelper.image_resize( + media_proxy_url, + %{max_width: thumbnail_max_width, max_height: thumbnail_max_height, quality: quality} + ) do + conn + |> put_preview_response_headers() + |> send_resp(200, thumbnail_binary) + else + _ -> + fallback_on_preview_error(conn, media_proxy_url) + end + end + + defp handle_video_preview(conn, media_proxy_url) do + with {:ok, thumbnail_binary} <- + MediaHelper.video_framegrab(media_proxy_url) do + conn + |> put_preview_response_headers() + |> send_resp(200, thumbnail_binary) + else + _ -> + fallback_on_preview_error(conn, media_proxy_url) + end + end + + defp drop_static_param_and_redirect(conn) do + uri_without_static_param = + conn + |> current_url() + |> UriHelper.modify_uri_params(%{}, ["static"]) + + redirect(conn, external: uri_without_static_param) + end + + defp fallback_on_preview_error(conn, media_proxy_url) do + redirect(conn, external: media_proxy_url) + end + + defp put_preview_response_headers( + conn, + [content_type, filename] = _content_info \\ ["image/jpeg", "preview.jpg"] + ) do + conn + |> put_resp_header("content-type", content_type) + |> put_resp_header("content-disposition", "inline; filename=\"#{filename}\"") + |> put_resp_header("cache-control", ReverseProxy.default_cache_control_header()) + end + + defp thumbnail_max_dimensions do + config = media_preview_proxy_config() + + thumbnail_max_width = Keyword.fetch!(config, :thumbnail_max_width) + thumbnail_max_height = Keyword.fetch!(config, :thumbnail_max_height) + + {thumbnail_max_width, thumbnail_max_height} + end + + defp min_content_length_for_preview do + Keyword.get(media_preview_proxy_config(), :min_content_length, 0) + end + + defp media_preview_proxy_config do + Config.get!([:media_preview_proxy]) + end + + defp media_proxy_opts do + Config.get([:media_proxy, :proxy_opts], []) end end diff --git a/lib/pleroma/web/metadata/restrict_indexing.ex b/lib/pleroma/web/metadata/restrict_indexing.ex index f15607896..a1dcb6e15 100644 --- a/lib/pleroma/web/metadata/restrict_indexing.ex +++ b/lib/pleroma/web/metadata/restrict_indexing.ex @@ -10,7 +10,9 @@ defmodule Pleroma.Web.Metadata.Providers.RestrictIndexing do """ @impl true - def build_tags(%{user: %{local: false}}) do + def build_tags(%{user: %{local: true, discoverable: true}}), do: [] + + def build_tags(_) do [ {:meta, [ @@ -19,7 +21,4 @@ def build_tags(%{user: %{local: false}}) do ], []} ] end - - @impl true - def build_tags(%{user: %{local: true}}), do: [] end diff --git a/lib/pleroma/web/metadata/utils.ex b/lib/pleroma/web/metadata/utils.ex index 2f0dfb474..8a206e019 100644 --- a/lib/pleroma/web/metadata/utils.ex +++ b/lib/pleroma/web/metadata/utils.ex @@ -38,7 +38,7 @@ def scrub_html(content) when is_binary(content) do def scrub_html(content), do: content def attachment_url(url) do - MediaProxy.url(url) + MediaProxy.preview_url(url) end def user_name_string(user) do diff --git a/lib/pleroma/web/oauth/oauth_controller.ex b/lib/pleroma/web/oauth/oauth_controller.ex index 26e68be42..a4152e840 100644 --- a/lib/pleroma/web/oauth/oauth_controller.ex +++ b/lib/pleroma/web/oauth/oauth_controller.ex @@ -119,7 +119,7 @@ defp handle_existing_authorization( redirect_uri = redirect_uri(conn, redirect_uri) url_params = %{access_token: token.token} url_params = Maps.put_if_present(url_params, :state, params["state"]) - url = UriHelper.append_uri_params(redirect_uri, url_params) + url = UriHelper.modify_uri_params(redirect_uri, url_params) redirect(conn, external: url) else conn @@ -161,7 +161,7 @@ def after_create_authorization(%Plug.Conn{} = conn, %Authorization{} = auth, %{ redirect_uri = redirect_uri(conn, redirect_uri) url_params = %{code: auth.token} url_params = Maps.put_if_present(url_params, :state, auth_attrs["state"]) - url = UriHelper.append_uri_params(redirect_uri, url_params) + url = UriHelper.modify_uri_params(redirect_uri, url_params) redirect(conn, external: url) else conn diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex index e8a1746d4..e667831c5 100644 --- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex @@ -4,6 +4,8 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do use Pleroma.Web, :controller + import Pleroma.Web.ControllerHelper, only: [add_link_headers: 2] + alias Pleroma.Activity alias Pleroma.Chat alias Pleroma.Chat.MessageReference @@ -47,7 +49,7 @@ def delete_message(%{assigns: %{user: %{id: user_id} = user}} = conn, %{ }) do with %MessageReference{} = cm_ref <- MessageReference.get_by_id(message_id), - ^chat_id <- cm_ref.chat_id |> to_string(), + ^chat_id <- to_string(cm_ref.chat_id), %Chat{user_id: ^user_id} <- Chat.get_by_id(chat_id), {:ok, _} <- remove_or_delete(cm_ref, user) do conn @@ -68,18 +70,13 @@ defp remove_or_delete( end end - defp remove_or_delete(cm_ref, _) do - cm_ref - |> MessageReference.delete() - end + defp remove_or_delete(cm_ref, _), do: MessageReference.delete(cm_ref) def post_chat_message( - %{body_params: params, assigns: %{user: %{id: user_id} = user}} = conn, - %{ - id: id - } + %{body_params: params, assigns: %{user: user}} = conn, + %{id: id} ) do - with %Chat{} = chat <- Repo.get_by(Chat, id: id, user_id: user_id), + with {:ok, chat} <- Chat.get_by_user_and_id(user, id), %User{} = recipient <- User.get_cached_by_ap_id(chat.recipient), {:ok, activity} <- CommonAPI.post_chat_message(user, recipient, params[:content], @@ -90,16 +87,25 @@ def post_chat_message( conn |> put_view(MessageReferenceView) |> render("show.json", chat_message_reference: cm_ref) + else + {:reject, message} -> + conn + |> put_status(:unprocessable_entity) + |> json(%{error: message}) + + {:error, message} -> + conn + |> put_status(:bad_request) + |> json(%{error: message}) end end - def mark_message_as_read(%{assigns: %{user: %{id: user_id}}} = conn, %{ - id: chat_id, - message_id: message_id - }) do - with %MessageReference{} = cm_ref <- - MessageReference.get_by_id(message_id), - ^chat_id <- cm_ref.chat_id |> to_string(), + def mark_message_as_read( + %{assigns: %{user: %{id: user_id}}} = conn, + %{id: chat_id, message_id: message_id} + ) do + with %MessageReference{} = cm_ref <- MessageReference.get_by_id(message_id), + ^chat_id <- to_string(cm_ref.chat_id), %Chat{user_id: ^user_id} <- Chat.get_by_id(chat_id), {:ok, cm_ref} <- MessageReference.mark_as_read(cm_ref) do conn @@ -109,36 +115,28 @@ def mark_message_as_read(%{assigns: %{user: %{id: user_id}}} = conn, %{ end def mark_as_read( - %{ - body_params: %{last_read_id: last_read_id}, - assigns: %{user: %{id: user_id}} - } = conn, + %{body_params: %{last_read_id: last_read_id}, assigns: %{user: user}} = conn, %{id: id} ) do - with %Chat{} = chat <- Repo.get_by(Chat, id: id, user_id: user_id), - {_n, _} <- - MessageReference.set_all_seen_for_chat(chat, last_read_id) do + with {:ok, chat} <- Chat.get_by_user_and_id(user, id), + {_n, _} <- MessageReference.set_all_seen_for_chat(chat, last_read_id) do conn |> put_view(ChatView) |> render("show.json", chat: chat) end end - def messages(%{assigns: %{user: %{id: user_id}}} = conn, %{id: id} = params) do - with %Chat{} = chat <- Repo.get_by(Chat, id: id, user_id: user_id) do - cm_refs = + def messages(%{assigns: %{user: user}} = conn, %{id: id} = params) do + with {:ok, chat} <- Chat.get_by_user_and_id(user, id) do + chat_message_refs = chat |> MessageReference.for_chat_query() |> Pagination.fetch_paginated(params) conn + |> add_link_headers(chat_message_refs) |> put_view(MessageReferenceView) - |> render("index.json", chat_message_references: cm_refs) - else - _ -> - conn - |> put_status(:not_found) - |> json(%{error: "not found"}) + |> render("index.json", chat_message_references: chat_message_refs) end end @@ -146,11 +144,8 @@ def index(%{assigns: %{user: %{id: user_id} = user}} = conn, _params) do blocked_ap_ids = User.blocked_users_ap_ids(user) chats = - from(c in Chat, - where: c.user_id == ^user_id, - where: c.recipient not in ^blocked_ap_ids, - order_by: [desc: c.updated_at] - ) + Chat.for_user_query(user_id) + |> where([c], c.recipient not in ^blocked_ap_ids) |> Repo.all() conn @@ -158,8 +153,8 @@ def index(%{assigns: %{user: %{id: user_id} = user}} = conn, _params) do |> render("index.json", chats: chats) end - def create(%{assigns: %{user: user}} = conn, params) do - with %User{ap_id: recipient} <- User.get_by_id(params[:id]), + def create(%{assigns: %{user: user}} = conn, %{id: id}) do + with %User{ap_id: recipient} <- User.get_cached_by_id(id), {:ok, %Chat{} = chat} <- Chat.get_or_create(user.id, recipient) do conn |> put_view(ChatView) @@ -167,8 +162,8 @@ def create(%{assigns: %{user: user}} = conn, params) do end end - def show(%{assigns: %{user: user}} = conn, params) do - with %Chat{} = chat <- Repo.get_by(Chat, user_id: user.id, id: params[:id]) do + def show(%{assigns: %{user: user}} = conn, %{id: id}) do + with {:ok, chat} <- Chat.get_by_user_and_id(user, id) do conn |> put_view(ChatView) |> render("show.json", chat: chat) diff --git a/lib/pleroma/web/pleroma_api/controllers/emoji_file_controller.ex b/lib/pleroma/web/pleroma_api/controllers/emoji_file_controller.ex new file mode 100644 index 000000000..71c53df1d --- /dev/null +++ b/lib/pleroma/web/pleroma_api/controllers/emoji_file_controller.ex @@ -0,0 +1,133 @@ +defmodule Pleroma.Web.PleromaAPI.EmojiFileController do + use Pleroma.Web, :controller + + alias Pleroma.Emoji.Pack + alias Pleroma.Web.ApiSpec + + plug(Pleroma.Web.ApiSpec.CastAndValidate) + + plug( + Pleroma.Plugs.OAuthScopesPlug, + %{scopes: ["write"], admin: true} + when action in [ + :create, + :update, + :delete + ] + ) + + defdelegate open_api_operation(action), to: ApiSpec.PleromaEmojiFileOperation + + def create(%{body_params: params} = conn, %{name: pack_name}) do + filename = params[:filename] || get_filename(params[:file]) + shortcode = params[:shortcode] || Path.basename(filename, Path.extname(filename)) + + with {:ok, pack} <- Pack.load_pack(pack_name), + {:ok, file} <- get_file(params[:file]), + {:ok, pack} <- Pack.add_file(pack, shortcode, filename, file) do + json(conn, pack.files) + else + {:error, :already_exists} -> + conn + |> put_status(:conflict) + |> json(%{error: "An emoji with the \"#{shortcode}\" shortcode already exists"}) + + {:error, :empty_values} -> + conn + |> put_status(:unprocessable_entity) + |> json(%{error: "pack name, shortcode or filename cannot be empty"}) + + {:error, _} = error -> + handle_error(conn, error, %{pack_name: pack_name}) + end + end + + def update(%{body_params: %{shortcode: shortcode} = params} = conn, %{name: pack_name}) do + new_shortcode = params[:new_shortcode] + new_filename = params[:new_filename] + force = params[:force] + + with {:ok, pack} <- Pack.load_pack(pack_name), + {:ok, pack} <- Pack.update_file(pack, shortcode, new_shortcode, new_filename, force) do + json(conn, pack.files) + else + {:error, :already_exists} -> + conn + |> put_status(:conflict) + |> json(%{ + error: + "New shortcode \"#{new_shortcode}\" is already used. If you want to override emoji use 'force' option" + }) + + {:error, :empty_values} -> + conn + |> put_status(:unprocessable_entity) + |> json(%{error: "new_shortcode or new_filename cannot be empty"}) + + {:error, _} = error -> + handle_error(conn, error, %{pack_name: pack_name, code: shortcode}) + end + end + + def delete(conn, %{name: pack_name, shortcode: shortcode}) do + with {:ok, pack} <- Pack.load_pack(pack_name), + {:ok, pack} <- Pack.delete_file(pack, shortcode) do + json(conn, pack.files) + else + {:error, :empty_values} -> + conn + |> put_status(:unprocessable_entity) + |> json(%{error: "pack name or shortcode cannot be empty"}) + + {:error, _} = error -> + handle_error(conn, error, %{pack_name: pack_name, code: shortcode}) + end + end + + defp handle_error(conn, {:error, :doesnt_exist}, %{code: emoji_code}) do + conn + |> put_status(:bad_request) + |> json(%{error: "Emoji \"#{emoji_code}\" does not exist"}) + end + + defp handle_error(conn, {:error, :not_found}, %{pack_name: pack_name}) do + conn + |> put_status(:not_found) + |> json(%{error: "pack \"#{pack_name}\" is not found"}) + end + + defp handle_error(conn, {:error, _}, _) do + render_error( + conn, + :internal_server_error, + "Unexpected error occurred while adding file to pack." + ) + end + + defp get_filename(%Plug.Upload{filename: filename}), do: filename + defp get_filename(url) when is_binary(url), do: Path.basename(url) + + def get_file(%Plug.Upload{} = file), do: {:ok, file} + + def get_file(url) when is_binary(url) do + with {:ok, %Tesla.Env{body: body, status: code, headers: headers}} + when code in 200..299 <- Pleroma.HTTP.get(url) do + path = Plug.Upload.random_file!("emoji") + + content_type = + case List.keyfind(headers, "content-type", 0) do + {"content-type", value} -> value + nil -> nil + end + + File.write(path, body) + + {:ok, + %Plug.Upload{ + filename: Path.basename(url), + path: path, + content_type: content_type + }} + end + end +end diff --git a/lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex b/lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex index 657f46324..6696f8b92 100644 --- a/lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex @@ -14,10 +14,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackController do :download, :create, :update, - :delete, - :add_file, - :update_file, - :delete_file + :delete ] ) @@ -26,8 +23,9 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackController do defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaEmojiPackOperation - def remote(conn, %{url: url}) do - with {:ok, packs} <- Pack.list_remote(url) do + def remote(conn, params) do + with {:ok, packs} <- + Pack.list_remote(url: params.url, page_size: params.page_size, page: params.page) do json(conn, packs) else {:error, :not_shareable} -> @@ -184,105 +182,6 @@ def update(%{body_params: %{metadata: metadata}} = conn, %{name: name}) do end end - def add_file(%{body_params: params} = conn, %{name: name}) do - filename = params[:filename] || get_filename(params[:file]) - shortcode = params[:shortcode] || Path.basename(filename, Path.extname(filename)) - - with {:ok, pack} <- Pack.add_file(name, shortcode, filename, params[:file]) do - json(conn, pack.files) - else - {:error, :already_exists} -> - conn - |> put_status(:conflict) - |> json(%{error: "An emoji with the \"#{shortcode}\" shortcode already exists"}) - - {:error, :not_found} -> - conn - |> put_status(:bad_request) - |> json(%{error: "pack \"#{name}\" is not found"}) - - {:error, :empty_values} -> - conn - |> put_status(:bad_request) - |> json(%{error: "pack name, shortcode or filename cannot be empty"}) - - {:error, _} -> - render_error( - conn, - :internal_server_error, - "Unexpected error occurred while adding file to pack." - ) - end - end - - def update_file(%{body_params: %{shortcode: shortcode} = params} = conn, %{name: name}) do - new_shortcode = params[:new_shortcode] - new_filename = params[:new_filename] - force = params[:force] - - with {:ok, pack} <- Pack.update_file(name, shortcode, new_shortcode, new_filename, force) do - json(conn, pack.files) - else - {:error, :doesnt_exist} -> - conn - |> put_status(:bad_request) - |> json(%{error: "Emoji \"#{shortcode}\" does not exist"}) - - {:error, :already_exists} -> - conn - |> put_status(:conflict) - |> json(%{ - error: - "New shortcode \"#{new_shortcode}\" is already used. If you want to override emoji use 'force' option" - }) - - {:error, :not_found} -> - conn - |> put_status(:bad_request) - |> json(%{error: "pack \"#{name}\" is not found"}) - - {:error, :empty_values} -> - conn - |> put_status(:bad_request) - |> json(%{error: "new_shortcode or new_filename cannot be empty"}) - - {:error, _} -> - render_error( - conn, - :internal_server_error, - "Unexpected error occurred while updating file in pack." - ) - end - end - - def delete_file(conn, %{name: name, shortcode: shortcode}) do - with {:ok, pack} <- Pack.delete_file(name, shortcode) do - json(conn, pack.files) - else - {:error, :doesnt_exist} -> - conn - |> put_status(:bad_request) - |> json(%{error: "Emoji \"#{shortcode}\" does not exist"}) - - {:error, :not_found} -> - conn - |> put_status(:bad_request) - |> json(%{error: "pack \"#{name}\" is not found"}) - - {:error, :empty_values} -> - conn - |> put_status(:bad_request) - |> json(%{error: "pack name or shortcode cannot be empty"}) - - {:error, _} -> - render_error( - conn, - :internal_server_error, - "Unexpected error occurred while removing file from pack." - ) - end - end - def import_from_filesystem(conn, _params) do with {:ok, names} <- Pack.import_from_filesystem() do json(conn, names) @@ -298,7 +197,4 @@ def import_from_filesystem(conn, _params) do |> json(%{error: "Error accessing emoji pack directory"}) end end - - defp get_filename(%Plug.Upload{filename: filename}), do: filename - defp get_filename(url) when is_binary(url), do: Path.basename(url) end diff --git a/lib/pleroma/web/pleroma_api/controllers/user_import_controller.ex b/lib/pleroma/web/pleroma_api/controllers/user_import_controller.ex new file mode 100644 index 000000000..f10c45750 --- /dev/null +++ b/lib/pleroma/web/pleroma_api/controllers/user_import_controller.ex @@ -0,0 +1,61 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PleromaAPI.UserImportController do + use Pleroma.Web, :controller + + require Logger + + alias Pleroma.Plugs.OAuthScopesPlug + alias Pleroma.User + alias Pleroma.Web.ApiSpec + + plug(OAuthScopesPlug, %{scopes: ["follow", "write:follows"]} when action == :follow) + plug(OAuthScopesPlug, %{scopes: ["follow", "write:blocks"]} when action == :blocks) + plug(OAuthScopesPlug, %{scopes: ["follow", "write:mutes"]} when action == :mutes) + + plug(OpenApiSpex.Plug.CastAndValidate) + defdelegate open_api_operation(action), to: ApiSpec.UserImportOperation + + def follow(%{body_params: %{list: %Plug.Upload{path: path}}} = conn, _) do + follow(%Plug.Conn{conn | body_params: %{list: File.read!(path)}}, %{}) + end + + def follow(%{assigns: %{user: follower}, body_params: %{list: list}} = conn, _) do + identifiers = + list + |> String.split("\n") + |> Enum.map(&(&1 |> String.split(",") |> List.first())) + |> List.delete("Account address") + |> Enum.map(&(&1 |> String.trim() |> String.trim_leading("@"))) + |> Enum.reject(&(&1 == "")) + + User.Import.follow_import(follower, identifiers) + json(conn, "job started") + end + + def blocks(%{body_params: %{list: %Plug.Upload{path: path}}} = conn, _) do + blocks(%Plug.Conn{conn | body_params: %{list: File.read!(path)}}, %{}) + end + + def blocks(%{assigns: %{user: blocker}, body_params: %{list: list}} = conn, _) do + User.Import.blocks_import(blocker, prepare_user_identifiers(list)) + json(conn, "job started") + end + + def mutes(%{body_params: %{list: %Plug.Upload{path: path}}} = conn, _) do + mutes(%Plug.Conn{conn | body_params: %{list: File.read!(path)}}, %{}) + end + + def mutes(%{assigns: %{user: user}, body_params: %{list: list}} = conn, _) do + User.Import.mutes_import(user, prepare_user_identifiers(list)) + json(conn, "job started") + end + + defp prepare_user_identifiers(list) do + list + |> String.split() + |> Enum.map(&String.trim_leading(&1, "@")) + end +end diff --git a/lib/pleroma/web/pleroma_api/views/scrobble_view.ex b/lib/pleroma/web/pleroma_api/views/scrobble_view.ex index bbff93abe..95bd4c368 100644 --- a/lib/pleroma/web/pleroma_api/views/scrobble_view.ex +++ b/lib/pleroma/web/pleroma_api/views/scrobble_view.ex @@ -10,14 +10,14 @@ defmodule Pleroma.Web.PleromaAPI.ScrobbleView do alias Pleroma.Activity alias Pleroma.HTML alias Pleroma.Object + alias Pleroma.Web.CommonAPI alias Pleroma.Web.CommonAPI.Utils alias Pleroma.Web.MastodonAPI.AccountView - alias Pleroma.Web.MastodonAPI.StatusView def render("show.json", %{activity: %Activity{data: %{"type" => "Listen"}} = activity} = opts) do object = Object.normalize(activity) - user = StatusView.get_user(activity.data["actor"]) + user = CommonAPI.get_user(activity.data["actor"]) created_at = Utils.to_masto_date(activity.data["published"]) %{ diff --git a/lib/pleroma/web/push/impl.ex b/lib/pleroma/web/push/impl.ex index 16368485e..da535aa68 100644 --- a/lib/pleroma/web/push/impl.ex +++ b/lib/pleroma/web/push/impl.ex @@ -19,7 +19,7 @@ defmodule Pleroma.Web.Push.Impl do @types ["Create", "Follow", "Announce", "Like", "Move"] @doc "Performs sending notifications for user subscriptions" - @spec perform(Notification.t()) :: list(any) | :error + @spec perform(Notification.t()) :: list(any) | :error | {:error, :unknown_type} def perform( %{ activity: %{data: %{"type" => activity_type}} = activity, @@ -64,20 +64,20 @@ def perform(_) do @doc "Push message to web" def push_message(body, sub, api_key, subscription) do case WebPushEncryption.send_web_push(body, sub, api_key) do - {:ok, %{status_code: code}} when 400 <= code and code < 500 -> + {:ok, %{status: code}} when code in 400..499 -> Logger.debug("Removing subscription record") Repo.delete!(subscription) :ok - {:ok, %{status_code: code}} when 200 <= code and code < 300 -> + {:ok, %{status: code}} when code in 200..299 -> :ok - {:ok, %{status_code: code}} -> + {:ok, %{status: code}} -> Logger.error("Web Push Notification failed with code: #{code}") :error - _ -> - Logger.error("Web Push Notification failed with unknown error") + error -> + Logger.error("Web Push Notification failed with #{inspect(error)}") :error end end diff --git a/lib/pleroma/web/rich_media/helpers.ex b/lib/pleroma/web/rich_media/helpers.ex index bd7f03cbe..d67b594b5 100644 --- a/lib/pleroma/web/rich_media/helpers.ex +++ b/lib/pleroma/web/rich_media/helpers.ex @@ -57,7 +57,6 @@ defp get_tld(host) do def fetch_data_for_object(object) do with true <- Config.get([:rich_media, :enabled]), - false <- object.data["sensitive"] || false, {:ok, page_url} <- HTML.extract_first_external_url_from_object(object), :ok <- validate_page_url(page_url), @@ -87,6 +86,50 @@ def perform(:fetch, %Activity{} = activity) do def rich_media_get(url) do headers = [{"user-agent", Pleroma.Application.user_agent() <> "; Bot"}] - Pleroma.HTTP.get(url, headers, @options) + head_check = + case Pleroma.HTTP.head(url, headers, @options) do + # If the HEAD request didn't reach the server for whatever reason, + # we assume the GET that comes right after won't either + {:error, _} = e -> + e + + {:ok, %Tesla.Env{status: 200, headers: headers}} -> + with :ok <- check_content_type(headers), + :ok <- check_content_length(headers), + do: :ok + + _ -> + :ok + end + + with :ok <- head_check, do: Pleroma.HTTP.get(url, headers, @options) + end + + defp check_content_type(headers) do + case List.keyfind(headers, "content-type", 0) do + {_, content_type} -> + case Plug.Conn.Utils.media_type(content_type) do + {:ok, "text", "html", _} -> :ok + _ -> {:error, {:content_type, content_type}} + end + + _ -> + :ok + end + end + + @max_body @options[:max_body] + defp check_content_length(headers) do + case List.keyfind(headers, "content-length", 0) do + {_, maybe_content_length} -> + case Integer.parse(maybe_content_length) do + {content_length, ""} when content_length <= @max_body -> :ok + {_, ""} -> {:error, :body_too_large} + _ -> :ok + end + + _ -> + :ok + end end end diff --git a/lib/pleroma/web/rich_media/parser.ex b/lib/pleroma/web/rich_media/parser.ex index 5727fda18..c70d2fdba 100644 --- a/lib/pleroma/web/rich_media/parser.ex +++ b/lib/pleroma/web/rich_media/parser.ex @@ -20,28 +20,61 @@ def parse(url) do with {:ok, data} <- get_cached_or_parse(url), {:ok, _} <- set_ttl_based_on_image(data, url) do {:ok, data} - else - {:error, {:invalid_metadata, data}} = e -> - Logger.debug(fn -> "Incomplete or invalid metadata for #{url}: #{inspect(data)}" end) - e - - error -> - Logger.error(fn -> "Rich media error for #{url}: #{inspect(error)}" end) - error end end defp get_cached_or_parse(url) do - case Cachex.fetch!(:rich_media_cache, url, fn _ -> {:commit, parse_url(url)} end) do - {:ok, _data} = res -> - res + case Cachex.fetch(:rich_media_cache, url, fn -> + case parse_url(url) do + {:ok, _} = res -> + {:commit, res} - {:error, _} = e -> - ttl = Pleroma.Config.get([:rich_media, :failure_backoff], 60_000) - Cachex.expire(:rich_media_cache, url, ttl) - e + {:error, reason} = e -> + # Unfortunately we have to log errors here, instead of doing that + # along with ttl setting at the bottom. Otherwise we can get log spam + # if more than one process was waiting for the rich media card + # while it was generated. Ideally we would set ttl here as well, + # so we don't override it number_of_waiters_on_generation + # times, but one, obviously, can't set ttl for not-yet-created entry + # and Cachex doesn't support returning ttl from the fetch callback. + log_error(url, reason) + {:commit, e} + end + end) do + {action, res} when action in [:commit, :ok] -> + case res do + {:ok, _data} = res -> + res + + {:error, reason} = e -> + if action == :commit, do: set_error_ttl(url, reason) + e + end + + {:error, e} -> + {:error, {:cachex_error, e}} end end + + defp set_error_ttl(_url, :body_too_large), do: :ok + defp set_error_ttl(_url, {:content_type, _}), do: :ok + + # The TTL is not set for the errors above, since they are unlikely to change + # with time + + defp set_error_ttl(url, _reason) do + ttl = Pleroma.Config.get([:rich_media, :failure_backoff], 60_000) + Cachex.expire(:rich_media_cache, url, ttl) + :ok + end + + defp log_error(url, {:invalid_metadata, data}) do + Logger.debug(fn -> "Incomplete or invalid metadata for #{url}: #{inspect(data)}" end) + end + + defp log_error(url, reason) do + Logger.warn(fn -> "Rich media error for #{url}: #{inspect(reason)}" end) + end end @doc """ diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index c6433cc53..e22b31b4c 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -178,9 +178,14 @@ defmodule Pleroma.Web.Router do get("/users", AdminAPIController, :list_users) get("/users/:nickname", AdminAPIController, :user_show) get("/users/:nickname/statuses", AdminAPIController, :list_user_statuses) + get("/users/:nickname/chats", AdminAPIController, :list_user_chats) get("/instances/:instance/statuses", AdminAPIController, :list_instance_statuses) + get("/instance_document/:name", InstanceDocumentController, :show) + patch("/instance_document/:name", InstanceDocumentController, :update) + delete("/instance_document/:name", InstanceDocumentController, :delete) + patch("/users/confirm_email", AdminAPIController, :confirm_email) patch("/users/resend_confirmation_email", AdminAPIController, :resend_confirmation_email) @@ -214,9 +219,27 @@ defmodule Pleroma.Web.Router do get("/media_proxy_caches", MediaProxyCacheController, :index) post("/media_proxy_caches/delete", MediaProxyCacheController, :delete) post("/media_proxy_caches/purge", MediaProxyCacheController, :purge) + + get("/chats/:id", ChatController, :show) + get("/chats/:id/messages", ChatController, :messages) + delete("/chats/:id/messages/:message_id", ChatController, :delete_message) end scope "/api/pleroma/emoji", Pleroma.Web.PleromaAPI do + scope "/pack" do + pipe_through(:admin_api) + + post("/", EmojiPackController, :create) + patch("/", EmojiPackController, :update) + delete("/", EmojiPackController, :delete) + end + + scope "/pack" do + pipe_through(:api) + + get("/", EmojiPackController, :show) + end + # Modifying packs scope "/packs" do pipe_through(:admin_api) @@ -225,21 +248,17 @@ defmodule Pleroma.Web.Router do get("/remote", EmojiPackController, :remote) post("/download", EmojiPackController, :download) - post("/:name", EmojiPackController, :create) - patch("/:name", EmojiPackController, :update) - delete("/:name", EmojiPackController, :delete) - - post("/:name/files", EmojiPackController, :add_file) - patch("/:name/files", EmojiPackController, :update_file) - delete("/:name/files", EmojiPackController, :delete_file) + post("/files", EmojiFileController, :create) + patch("/files", EmojiFileController, :update) + delete("/files", EmojiFileController, :delete) end # Pack info / downloading scope "/packs" do pipe_through(:api) + get("/", EmojiPackController, :index) - get("/:name", EmojiPackController, :show) - get("/:name/archive", EmojiPackController, :archive) + get("/archive", EmojiPackController, :archive) end end @@ -260,14 +279,15 @@ defmodule Pleroma.Web.Router do post("/delete_account", UtilController, :delete_account) put("/notification_settings", UtilController, :update_notificaton_settings) post("/disable_account", UtilController, :disable_account) - - post("/blocks_import", UtilController, :blocks_import) - post("/follow_import", UtilController, :follow_import) end scope "/api/pleroma", Pleroma.Web.PleromaAPI do pipe_through(:authenticated_api) + post("/mutes_import", UserImportController, :mutes) + post("/blocks_import", UserImportController, :blocks) + post("/follow_import", UserImportController, :follow) + get("/accounts/mfa", TwoFactorAuthenticationController, :settings) get("/accounts/mfa/backup_codes", TwoFactorAuthenticationController, :backup_codes) get("/accounts/mfa/setup/:method", TwoFactorAuthenticationController, :setup) @@ -670,6 +690,8 @@ defmodule Pleroma.Web.Router do end scope "/proxy/", Pleroma.Web.MediaProxy do + get("/preview/:sig/:url", MediaProxyController, :preview) + get("/preview/:sig/:url/:filename", MediaProxyController, :preview) get("/:sig/:url", MediaProxyController, :remote) get("/:sig/:url/:filename", MediaProxyController, :remote) end diff --git a/lib/pleroma/web/streamer/streamer.ex b/lib/pleroma/web/streamer/streamer.ex index d1d70e556..5475f18a6 100644 --- a/lib/pleroma/web/streamer/streamer.ex +++ b/lib/pleroma/web/streamer/streamer.ex @@ -11,10 +11,12 @@ defmodule Pleroma.Web.Streamer do alias Pleroma.Conversation.Participation alias Pleroma.Notification alias Pleroma.Object + alias Pleroma.Plugs.OAuthScopesPlug alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.ActivityPub.Visibility alias Pleroma.Web.CommonAPI + alias Pleroma.Web.OAuth.Token alias Pleroma.Web.StreamerView @mix_env Mix.env() @@ -26,53 +28,87 @@ def registry, do: @registry @user_streams ["user", "user:notification", "direct", "user:pleroma_chat"] @doc "Expands and authorizes a stream, and registers the process for streaming." - @spec get_topic_and_add_socket(stream :: String.t(), User.t() | nil, Map.t() | nil) :: + @spec get_topic_and_add_socket( + stream :: String.t(), + User.t() | nil, + Token.t() | nil, + Map.t() | nil + ) :: {:ok, topic :: String.t()} | {:error, :bad_topic} | {:error, :unauthorized} - def get_topic_and_add_socket(stream, user, params \\ %{}) do - case get_topic(stream, user, params) do + def get_topic_and_add_socket(stream, user, oauth_token, params \\ %{}) do + case get_topic(stream, user, oauth_token, params) do {:ok, topic} -> add_socket(topic, user) error -> error end end @doc "Expand and authorizes a stream" - @spec get_topic(stream :: String.t(), User.t() | nil, Map.t()) :: + @spec get_topic(stream :: String.t(), User.t() | nil, Token.t() | nil, Map.t()) :: {:ok, topic :: String.t()} | {:error, :bad_topic} - def get_topic(stream, user, params \\ %{}) + def get_topic(stream, user, oauth_token, params \\ %{}) # Allow all public steams. - def get_topic(stream, _, _) when stream in @public_streams do + def get_topic(stream, _user, _oauth_token, _params) when stream in @public_streams do {:ok, stream} end # Allow all hashtags streams. - def get_topic("hashtag", _, %{"tag" => tag}) do + def get_topic("hashtag", _user, _oauth_token, %{"tag" => tag} = _params) do {:ok, "hashtag:" <> tag} end # Expand user streams. - def get_topic(stream, %User{} = user, _) when stream in @user_streams do - {:ok, stream <> ":" <> to_string(user.id)} + def get_topic( + stream, + %User{id: user_id} = user, + %Token{user_id: token_user_id} = oauth_token, + _params + ) + when stream in @user_streams and user_id == token_user_id do + # Note: "read" works for all user streams (not mentioning it since it's an ancestor scope) + required_scopes = + if stream == "user:notification" do + ["read:notifications"] + else + ["read:statuses"] + end + + if OAuthScopesPlug.filter_descendants(required_scopes, oauth_token.scopes) == [] do + {:error, :unauthorized} + else + {:ok, stream <> ":" <> to_string(user.id)} + end end - def get_topic(stream, _, _) when stream in @user_streams do + def get_topic(stream, _user, _oauth_token, _params) when stream in @user_streams do {:error, :unauthorized} end # List streams. - def get_topic("list", %User{} = user, %{"list" => id}) do - if Pleroma.List.get(id, user) do - {:ok, "list:" <> to_string(id)} - else - {:error, :bad_topic} + def get_topic( + "list", + %User{id: user_id} = user, + %Token{user_id: token_user_id} = oauth_token, + %{"list" => id} + ) + when user_id == token_user_id do + cond do + OAuthScopesPlug.filter_descendants(["read", "read:lists"], oauth_token.scopes) == [] -> + {:error, :unauthorized} + + Pleroma.List.get(id, user) -> + {:ok, "list:" <> to_string(id)} + + true -> + {:error, :bad_topic} end end - def get_topic("list", _, _) do + def get_topic("list", _user, _oauth_token, _params) do {:error, :unauthorized} end - def get_topic(_, _, _) do + def get_topic(_stream, _user, _oauth_token, _params) do {:error, :bad_topic} end diff --git a/lib/pleroma/web/twitter_api/controllers/util_controller.ex b/lib/pleroma/web/twitter_api/controllers/util_controller.ex index f02c4075c..70b0fbd54 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -18,14 +18,6 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do plug(Pleroma.Web.FederatingPlug when action == :remote_subscribe) - plug( - OAuthScopesPlug, - %{scopes: ["follow", "write:follows"]} - when action == :follow_import - ) - - plug(OAuthScopesPlug, %{scopes: ["follow", "write:blocks"]} when action == :blocks_import) - plug( OAuthScopesPlug, %{scopes: ["write:accounts"]} @@ -104,33 +96,6 @@ def update_notificaton_settings(%{assigns: %{user: user}} = conn, params) do end end - def follow_import(conn, %{"list" => %Plug.Upload{} = listfile}) do - follow_import(conn, %{"list" => File.read!(listfile.path)}) - end - - def follow_import(%{assigns: %{user: follower}} = conn, %{"list" => list}) do - followed_identifiers = - list - |> String.split("\n") - |> Enum.map(&(&1 |> String.split(",") |> List.first())) - |> List.delete("Account address") - |> Enum.map(&(&1 |> String.trim() |> String.trim_leading("@"))) - |> Enum.reject(&(&1 == "")) - - User.follow_import(follower, followed_identifiers) - json(conn, "job started") - end - - def blocks_import(conn, %{"list" => %Plug.Upload{} = listfile}) do - blocks_import(conn, %{"list" => File.read!(listfile.path)}) - end - - def blocks_import(%{assigns: %{user: blocker}} = conn, %{"list" => list}) do - blocked_identifiers = list |> String.split() |> Enum.map(&String.trim_leading(&1, "@")) - User.blocks_import(blocker, blocked_identifiers) - json(conn, "job started") - end - def change_password(%{assigns: %{user: user}} = conn, params) do case CommonAPI.Utils.confirm_current_password(user, params["password"]) do {:ok, user} -> diff --git a/lib/pleroma/workers/background_worker.ex b/lib/pleroma/workers/background_worker.ex index cec5a7462..55b5a13d9 100644 --- a/lib/pleroma/workers/background_worker.ex +++ b/lib/pleroma/workers/background_worker.ex @@ -26,26 +26,10 @@ def perform(%Job{args: %{"op" => "force_password_reset", "user_id" => user_id}}) User.perform(:force_password_reset, user) end - def perform(%Job{ - args: %{ - "op" => "blocks_import", - "blocker_id" => blocker_id, - "blocked_identifiers" => blocked_identifiers - } - }) do - blocker = User.get_cached_by_id(blocker_id) - {:ok, User.perform(:blocks_import, blocker, blocked_identifiers)} - end - - def perform(%Job{ - args: %{ - "op" => "follow_import", - "follower_id" => follower_id, - "followed_identifiers" => followed_identifiers - } - }) do - follower = User.get_cached_by_id(follower_id) - {:ok, User.perform(:follow_import, follower, followed_identifiers)} + def perform(%Job{args: %{"op" => op, "user_id" => user_id, "identifiers" => identifiers}}) + when op in ["blocks_import", "follow_import", "mutes_import"] do + user = User.get_cached_by_id(user_id) + {:ok, User.Import.perform(String.to_atom(op), user, identifiers)} end def perform(%Job{args: %{"op" => "media_proxy_preload", "message" => message}}) do diff --git a/mix.exs b/mix.exs index d2a40bcc8..c6e94aff7 100644 --- a/mix.exs +++ b/mix.exs @@ -122,7 +122,7 @@ defp deps do {:ecto_enum, "~> 1.4"}, {:ecto_sql, "~> 3.4.4"}, {:postgrex, ">= 0.15.5"}, - {:oban, "~> 2.0.0"}, + {:oban, "~> 2.1.0"}, {:gettext, "~> 0.18"}, {:pbkdf2_elixir, "~> 1.2"}, {:bcrypt_elixir, "~> 2.2"}, diff --git a/mix.lock b/mix.lock index 96d10641f..73d84d7cc 100644 --- a/mix.lock +++ b/mix.lock @@ -24,13 +24,14 @@ "crypt": {:git, "https://github.com/msantos/crypt.git", "f63a705f92c26955977ee62a313012e309a4d77a", [ref: "f63a705f92c26955977ee62a313012e309a4d77a"]}, "custom_base": {:hex, :custom_base, "0.2.1", "4a832a42ea0552299d81652aa0b1f775d462175293e99dfbe4d7dbaab785a706", [:mix], [], "hexpm", "8df019facc5ec9603e94f7270f1ac73ddf339f56ade76a721eaa57c1493ba463"}, "db_connection": {:hex, :db_connection, "2.2.2", "3bbca41b199e1598245b716248964926303b5d4609ff065125ce98bcd368939e", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, repo: "hexpm", optional: false]}], "hexpm", "642af240d8a8affb93b4ba5a6fcd2bbcbdc327e1a524b825d383711536f8070c"}, - "decimal": {:hex, :decimal, "1.8.1", "a4ef3f5f3428bdbc0d35374029ffcf4ede8533536fa79896dd450168d9acdf3c", [:mix], [], "hexpm", "3cb154b00225ac687f6cbd4acc4b7960027c757a5152b369923ead9ddbca7aec"}, + "decimal": {:hex, :decimal, "2.0.0", "a78296e617b0f5dd4c6caf57c714431347912ffb1d0842e998e9792b5642d697", [:mix], [], "hexpm", "34666e9c55dea81013e77d9d87370fe6cb6291d1ef32f46a1600230b1d44f577"}, "deep_merge": {:hex, :deep_merge, "1.0.0", "b4aa1a0d1acac393bdf38b2291af38cb1d4a52806cf7a4906f718e1feb5ee961", [:mix], [], "hexpm", "ce708e5f094b9cd4e8f2be4f00d2f4250c4095be93f8cd6d018c753894885430"}, "earmark": {:hex, :earmark, "1.4.3", "364ca2e9710f6bff494117dbbd53880d84bebb692dafc3a78eb50aa3183f2bfd", [:mix], [], "hexpm", "8cf8a291ebf1c7b9539e3cddb19e9cef066c2441b1640f13c34c1d3cfc825fec"}, "earmark_parser": {:hex, :earmark_parser, "1.4.10", "6603d7a603b9c18d3d20db69921527f82ef09990885ed7525003c7fe7dc86c56", [:mix], [], "hexpm", "8e2d5370b732385db2c9b22215c3f59c84ac7dda7ed7e544d7c459496ae519c0"}, - "ecto": {:hex, :ecto, "3.4.5", "2bcd262f57b2c888b0bd7f7a28c8a48aa11dc1a2c6a858e45dd8f8426d504265", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "8c6d1d4d524559e9b7a062f0498e2c206122552d63eacff0a6567ffe7a8e8691"}, + "ecto": {:hex, :ecto, "3.4.6", "08f7afad3257d6eb8613309af31037e16c36808dfda5a3cd0cb4e9738db030e4", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "6f13a9e2a62e75c2dcfc7207bfc65645ab387af8360db4c89fee8b5a4bf3f70b"}, "ecto_enum": {:hex, :ecto_enum, "1.4.0", "d14b00e04b974afc69c251632d1e49594d899067ee2b376277efd8233027aec8", [:mix], [{:ecto, ">= 3.0.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:ecto_sql, "> 3.0.0", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:mariaex, ">= 0.0.0", [hex: :mariaex, repo: "hexpm", optional: true]}, {:postgrex, ">= 0.0.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "8fb55c087181c2b15eee406519dc22578fa60dd82c088be376d0010172764ee4"}, "ecto_sql": {:hex, :ecto_sql, "3.4.5", "30161f81b167d561a9a2df4329c10ae05ff36eca7ccc84628f2c8b9fa1e43323", [:mix], [{:db_connection, "~> 2.2", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.4.3", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.3.0 or ~> 0.4.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.0", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "31990c6a3579b36a3c0841d34a94c275e727de8b84f58509da5f1b2032c98ac2"}, + "eimp": {:hex, :eimp, "1.0.14", "fc297f0c7e2700457a95a60c7010a5f1dcb768a083b6d53f49cd94ab95a28f22", [:rebar3], [{:p1_utils, "1.0.18", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "501133f3112079b92d9e22da8b88bf4f0e13d4d67ae9c15c42c30bd25ceb83b6"}, "elixir_make": {:hex, :elixir_make, "0.6.0", "38349f3e29aff4864352084fc736fa7fa0f2995a819a737554f7ebd28b85aaab", [:mix], [], "hexpm", "d522695b93b7f0b4c0fcb2dfe73a6b905b1c301226a5a55cb42e5b14d509e050"}, "esshd": {:hex, :esshd, "0.1.1", "d4dd4c46698093a40a56afecce8a46e246eb35463c457c246dacba2e056f31b5", [:mix], [], "hexpm", "d73e341e3009d390aa36387dc8862860bf9f874c94d9fd92ade2926376f49981"}, "eternal": {:hex, :eternal, "1.2.1", "d5b6b2499ba876c57be2581b5b999ee9bdf861c647401066d3eeed111d096bc4", [:mix], [], "hexpm", "b14f1dc204321429479c569cfbe8fb287541184ed040956c8862cb7a677b8406"}, @@ -58,7 +59,7 @@ "httpoison": {:hex, :httpoison, "1.6.2", "ace7c8d3a361cebccbed19c283c349b3d26991eff73a1eaaa8abae2e3c8089b6", [:mix], [{:hackney, "~> 1.15 and >= 1.15.2", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "aa2c74bd271af34239a3948779612f87df2422c2fdcfdbcec28d9c105f0773fe"}, "idna": {:hex, :idna, "6.0.0", "689c46cbcdf3524c44d5f3dde8001f364cd7608a99556d8fbd8239a5798d4c10", [:rebar3], [{:unicode_util_compat, "0.4.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "4bdd305eb64e18b0273864920695cb18d7a2021f31a11b9c5fbcd9a253f936e2"}, "inet_cidr": {:hex, :inet_cidr, "1.0.4", "a05744ab7c221ca8e395c926c3919a821eb512e8f36547c062f62c4ca0cf3d6e", [:mix], [], "hexpm", "64a2d30189704ae41ca7dbdd587f5291db5d1dda1414e0774c29ffc81088c1bc"}, - "jason": {:hex, :jason, "1.2.1", "12b22825e22f468c02eb3e4b9985f3d0cb8dc40b9bd704730efa11abd2708c44", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "b659b8571deedf60f79c5a608e15414085fa141344e2716fbd6988a084b5f993"}, + "jason": {:hex, :jason, "1.2.2", "ba43e3f2709fd1aa1dce90aaabfd039d000469c05c56f0b8e31978e03fa39052", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "18a228f5f0058ee183f29f9eae0805c6e59d61c3b006760668d8d18ff0d12179"}, "joken": {:hex, :joken, "2.2.0", "2daa1b12be05184aff7b5ace1d43ca1f81345962285fff3f88db74927c954d3a", [:mix], [{:jose, "~> 1.9", [hex: :jose, repo: "hexpm", optional: false]}], "hexpm", "b4f92e30388206f869dd25d1af628a1d99d7586e5cf0672f64d4df84c4d2f5e9"}, "jose": {:hex, :jose, "1.10.1", "16d8e460dae7203c6d1efa3f277e25b5af8b659febfc2f2eb4bacf87f128b80a", [:mix, :rebar3], [], "hexpm", "3c7ddc8a9394b92891db7c2771da94bf819834a1a4c92e30857b7d582e2f8257"}, "jumper": {:hex, :jumper, "1.0.1", "3c00542ef1a83532b72269fab9f0f0c82bf23a35e27d278bfd9ed0865cecabff", [:mix], [], "hexpm", "318c59078ac220e966d27af3646026db9b5a5e6703cb2aa3e26bcfaba65b7433"}, @@ -79,8 +80,9 @@ "nimble_parsec": {:hex, :nimble_parsec, "0.6.0", "32111b3bf39137144abd7ba1cce0914533b2d16ef35e8abc5ec8be6122944263", [:mix], [], "hexpm", "27eac315a94909d4dc68bc07a4a83e06c8379237c5ea528a9acff4ca1c873c52"}, "nimble_pool": {:hex, :nimble_pool, "0.1.0", "ffa9d5be27eee2b00b0c634eb649aa27f97b39186fec3c493716c2a33e784ec6", [:mix], [], "hexpm", "343a1eaa620ddcf3430a83f39f2af499fe2370390d4f785cd475b4df5acaf3f9"}, "nodex": {:git, "https://git.pleroma.social/pleroma/nodex", "cb6730f943cfc6aad674c92161be23a8411f15d1", [ref: "cb6730f943cfc6aad674c92161be23a8411f15d1"]}, - "oban": {:hex, :oban, "2.0.0", "e6ce70d94dd46815ec0882a1ffb7356df9a9d5b8a40a64ce5c2536617a447379", [:mix], [{:ecto_sql, ">= 3.4.3", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.14", [hex: :postgrex, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "cf574813bd048b98a698aa587c21367d2e06842d4e1b1993dcd6a696e9e633bd"}, + "oban": {:hex, :oban, "2.1.0", "034144686f7e76a102b5d67731f098d98a9e4a52b07c25ad580a01f83a7f1cf5", [:mix], [{:ecto_sql, ">= 3.4.3", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.14", [hex: :postgrex, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c6f067fa3b308ed9e0e6beb2b34277c9c4e48bf95338edabd8f4a757a26e04c2"}, "open_api_spex": {:git, "https://git.pleroma.social/pleroma/elixir-libraries/open_api_spex.git", "f296ac0924ba3cf79c7a588c4c252889df4c2edd", [ref: "f296ac0924ba3cf79c7a588c4c252889df4c2edd"]}, + "p1_utils": {:hex, :p1_utils, "1.0.18", "3fe224de5b2e190d730a3c5da9d6e8540c96484cf4b4692921d1e28f0c32b01c", [:rebar3], [], "hexpm", "1fc8773a71a15553b179c986b22fbeead19b28fe486c332d4929700ffeb71f88"}, "parse_trans": {:hex, :parse_trans, "3.3.0", "09765507a3c7590a784615cfd421d101aec25098d50b89d7aa1d66646bc571c1", [:rebar3], [], "hexpm", "17ef63abde837ad30680ea7f857dd9e7ced9476cdd7b0394432af4bfc241b960"}, "pbkdf2_elixir": {:hex, :pbkdf2_elixir, "1.2.1", "9cbe354b58121075bd20eb83076900a3832324b7dd171a6895fab57b6bb2752c", [:mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}], "hexpm", "d3b40a4a4630f0b442f19eca891fcfeeee4c40871936fed2f68e1c4faa30481f"}, "phoenix": {:hex, :phoenix, "1.4.17", "1b1bd4cff7cfc87c94deaa7d60dd8c22e04368ab95499483c50640ef3bd838d8", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 1.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:plug, "~> 1.8.1 or ~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 1.0 or ~> 2.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3a8e5d7a3d76d452bb5fb86e8b7bd115f737e4f8efe202a463d4aeb4a5809611"}, @@ -94,7 +96,7 @@ "plug_static_index_html": {:hex, :plug_static_index_html, "1.0.0", "840123d4d3975585133485ea86af73cb2600afd7f2a976f9f5fd8b3808e636a0", [:mix], [{:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "79fd4fcf34d110605c26560cbae8f23c603ec4158c08298bd4360fdea90bb5cf"}, "poison": {:hex, :poison, "3.1.0", "d9eb636610e096f86f25d9a46f35a9facac35609a7591b3be3326e99a0484665", [:mix], [], "hexpm", "fec8660eb7733ee4117b85f55799fd3833eb769a6df71ccf8903e8dc5447cfce"}, "poolboy": {:hex, :poolboy, "1.5.2", "392b007a1693a64540cead79830443abf5762f5d30cf50bc95cb2c1aaafa006b", [:rebar3], [], "hexpm", "dad79704ce5440f3d5a3681c8590b9dc25d1a561e8f5a9c995281012860901e3"}, - "postgrex": {:hex, :postgrex, "0.15.5", "aec40306a622d459b01bff890fa42f1430dac61593b122754144ad9033a2152f", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "ed90c81e1525f65a2ba2279dbcebf030d6d13328daa2f8088b9661eb9143af7f"}, + "postgrex": {:hex, :postgrex, "0.15.6", "a464c72010a56e3214fe2b99c1a76faab4c2bb0255cabdef30dea763a3569aa2", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "f99268325ac8f66ffd6c4964faab9e70fbf721234ab2ad238c00f9530b8cdd55"}, "pot": {:hex, :pot, "0.11.0", "61bad869a94534739dd4614a25a619bc5c47b9970e9a0ea5bef4628036fc7a16", [:rebar3], [], "hexpm", "57ee6ee6bdeb639661ffafb9acefe3c8f966e45394de6a766813bb9e1be4e54b"}, "prometheus": {:hex, :prometheus, "4.6.0", "20510f381db1ccab818b4cf2fac5fa6ab5cc91bc364a154399901c001465f46f", [:mix, :rebar3], [], "hexpm", "4905fd2992f8038eccd7aa0cd22f40637ed618c0bed1f75c05aacec15b7545de"}, "prometheus_ecto": {:hex, :prometheus_ecto, "1.4.3", "3dd4da1812b8e0dbee81ea58bb3b62ed7588f2eae0c9e97e434c46807ff82311", [:mix], [{:ecto, "~> 2.0 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:prometheus_ex, "~> 1.1 or ~> 2.0 or ~> 3.0", [hex: :prometheus_ex, repo: "hexpm", optional: false]}], "hexpm", "8d66289f77f913b37eda81fd287340c17e61a447549deb28efc254532b2bed82"}, diff --git a/priv/gettext/es/LC_MESSAGES/errors.po b/priv/gettext/es/LC_MESSAGES/errors.po index ba75936a9..0a6fceaad 100644 --- a/priv/gettext/es/LC_MESSAGES/errors.po +++ b/priv/gettext/es/LC_MESSAGES/errors.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-09-09 09:49+0000\n" -"PO-Revision-Date: 2020-09-09 10:52+0000\n" +"PO-Revision-Date: 2020-09-11 21:26+0000\n" "Last-Translator: tarteka \n" "Language-Team: Spanish \n" @@ -94,52 +94,52 @@ msgid "must be less than %{number}" msgstr "" msgid "must be greater than %{number}" -msgstr "" +msgstr "debe ser mayor que %{number}" msgid "must be less than or equal to %{number}" -msgstr "" +msgstr "debe ser menor o igual que %{number}" msgid "must be greater than or equal to %{number}" -msgstr "" +msgstr "deber ser mayor o igual que %{number}" msgid "must be equal to %{number}" -msgstr "" +msgstr "deber ser igual a %{number}" #: lib/pleroma/web/common_api/common_api.ex:505 #, elixir-format msgid "Account not found" -msgstr "" +msgstr "Cuenta no encontrada" #: lib/pleroma/web/common_api/common_api.ex:339 #, elixir-format msgid "Already voted" -msgstr "" +msgstr "Ya has votado" #: lib/pleroma/web/oauth/oauth_controller.ex:359 #, elixir-format msgid "Bad request" -msgstr "" +msgstr "Solicitud incorrecta" #: lib/pleroma/web/activity_pub/activity_pub_controller.ex:426 #, elixir-format msgid "Can't delete object" -msgstr "" +msgstr "No se puede eliminar el objeto" #: lib/pleroma/web/controller_helper.ex:105 #: lib/pleroma/web/controller_helper.ex:111 #, elixir-format msgid "Can't display this activity" -msgstr "" +msgstr "No se puede mostrar esta actividad" #: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:285 #, elixir-format msgid "Can't find user" -msgstr "" +msgstr "No se puede encontrar al usuario" #: lib/pleroma/web/pleroma_api/controllers/account_controller.ex:61 #, elixir-format msgid "Can't get favorites" -msgstr "" +msgstr "No se puede obtener los favoritos" #: lib/pleroma/web/activity_pub/activity_pub_controller.ex:438 #, elixir-format @@ -149,7 +149,7 @@ msgstr "" #: lib/pleroma/web/common_api/utils.ex:563 #, elixir-format msgid "Cannot post an empty status without attachments" -msgstr "" +msgstr "No se puede publicar un estado vacío y sin archivos adjuntos" #: lib/pleroma/web/common_api/utils.ex:511 #, elixir-format diff --git a/priv/gettext/zh_Hans/LC_MESSAGES/errors.po b/priv/gettext/zh_Hans/LC_MESSAGES/errors.po new file mode 100644 index 000000000..4f029d558 --- /dev/null +++ b/priv/gettext/zh_Hans/LC_MESSAGES/errors.po @@ -0,0 +1,580 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-09-20 13:18+0000\n" +"PO-Revision-Date: 2020-09-20 14:48+0000\n" +"Last-Translator: Kana \n" +"Language-Team: Chinese (Simplified) \n" +"Language: zh_Hans\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.0.4\n" + +## This file is a PO Template file. +## +## `msgid`s here are often extracted from source code. +## Add new translations manually only if they're dynamic +## translations that can't be statically extracted. +## +## Run `mix gettext.extract` to bring this file up to +## date. Leave `msgstr`s empty as changing them here as no +## effect: edit them in PO (`.po`) files instead. +## From Ecto.Changeset.cast/4 +msgid "can't be blank" +msgstr "不能为空" + +## From Ecto.Changeset.unique_constraint/3 +msgid "has already been taken" +msgstr "已被占用" + +## From Ecto.Changeset.put_change/3 +msgid "is invalid" +msgstr "不合法" + +## From Ecto.Changeset.validate_format/3 +msgid "has invalid format" +msgstr "的格式不合法" + +## From Ecto.Changeset.validate_subset/3 +msgid "has an invalid entry" +msgstr "中存在不合法的项目" + +## From Ecto.Changeset.validate_exclusion/3 +msgid "is reserved" +msgstr "是被保留的" + +## From Ecto.Changeset.validate_confirmation/3 +msgid "does not match confirmation" +msgstr "" + +## From Ecto.Changeset.no_assoc_constraint/3 +msgid "is still associated with this entry" +msgstr "仍与该项目相关联" + +msgid "are still associated with this entry" +msgstr "仍与该项目相关联" + +## From Ecto.Changeset.validate_length/3 +msgid "should be %{count} character(s)" +msgid_plural "should be %{count} character(s)" +msgstr[0] "应为 %{count} 个字符" + +msgid "should have %{count} item(s)" +msgid_plural "should have %{count} item(s)" +msgstr[0] "应有 %{item} 项" + +msgid "should be at least %{count} character(s)" +msgid_plural "should be at least %{count} character(s)" +msgstr[0] "应至少有 %{count} 个字符" + +msgid "should have at least %{count} item(s)" +msgid_plural "should have at least %{count} item(s)" +msgstr[0] "应至少有 %{count} 项" + +msgid "should be at most %{count} character(s)" +msgid_plural "should be at most %{count} character(s)" +msgstr[0] "应至多有 %{count} 个字符" + +msgid "should have at most %{count} item(s)" +msgid_plural "should have at most %{count} item(s)" +msgstr[0] "应至多有 %{count} 项" + +## From Ecto.Changeset.validate_number/3 +msgid "must be less than %{number}" +msgstr "必须小于 %{number}" + +msgid "must be greater than %{number}" +msgstr "必须大于 %{number}" + +msgid "must be less than or equal to %{number}" +msgstr "必须小于等于 %{number}" + +msgid "must be greater than or equal to %{number}" +msgstr "必须大于等于 %{number}" + +msgid "must be equal to %{number}" +msgstr "必须等于 %{number}" + +#: lib/pleroma/web/common_api/common_api.ex:505 +#, elixir-format +msgid "Account not found" +msgstr "未找到账号" + +#: lib/pleroma/web/common_api/common_api.ex:339 +#, elixir-format +msgid "Already voted" +msgstr "已经进行了投票" + +#: lib/pleroma/web/oauth/oauth_controller.ex:359 +#, elixir-format +msgid "Bad request" +msgstr "不正确的请求" + +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:426 +#, elixir-format +msgid "Can't delete object" +msgstr "不能删除对象" + +#: lib/pleroma/web/controller_helper.ex:105 +#: lib/pleroma/web/controller_helper.ex:111 +#, elixir-format +msgid "Can't display this activity" +msgstr "不能显示该活动" + +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:285 +#, elixir-format +msgid "Can't find user" +msgstr "找不到用户" + +#: lib/pleroma/web/pleroma_api/controllers/account_controller.ex:61 +#, elixir-format +msgid "Can't get favorites" +msgstr "不能获取收藏" + +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:438 +#, elixir-format +msgid "Can't like object" +msgstr "" + +#: lib/pleroma/web/common_api/utils.ex:563 +#, elixir-format +msgid "Cannot post an empty status without attachments" +msgstr "" + +#: lib/pleroma/web/common_api/utils.ex:511 +#, elixir-format +msgid "Comment must be up to %{max_size} characters" +msgstr "" + +#: lib/pleroma/config/config_db.ex:191 +#, elixir-format +msgid "Config with params %{params} not found" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:181 +#: lib/pleroma/web/common_api/common_api.ex:185 +#, elixir-format +msgid "Could not delete" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:231 +#, elixir-format +msgid "Could not favorite" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:453 +#, elixir-format +msgid "Could not pin" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:278 +#, elixir-format +msgid "Could not unfavorite" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:463 +#, elixir-format +msgid "Could not unpin" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:216 +#, elixir-format +msgid "Could not unrepeat" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:512 +#: lib/pleroma/web/common_api/common_api.ex:521 +#, elixir-format +msgid "Could not update state" +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:207 +#, elixir-format +msgid "Error." +msgstr "" + +#: lib/pleroma/web/twitter_api/twitter_api.ex:106 +#, elixir-format +msgid "Invalid CAPTCHA" +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:116 +#: lib/pleroma/web/oauth/oauth_controller.ex:568 +#, elixir-format +msgid "Invalid credentials" +msgstr "" + +#: lib/pleroma/plugs/ensure_authenticated_plug.ex:38 +#, elixir-format +msgid "Invalid credentials." +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:355 +#, elixir-format +msgid "Invalid indices" +msgstr "" + +#: lib/pleroma/web/admin_api/controllers/fallback_controller.ex:29 +#, elixir-format +msgid "Invalid parameters" +msgstr "" + +#: lib/pleroma/web/common_api/utils.ex:414 +#, elixir-format +msgid "Invalid password." +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:220 +#, elixir-format +msgid "Invalid request" +msgstr "" + +#: lib/pleroma/web/twitter_api/twitter_api.ex:109 +#, elixir-format +msgid "Kocaptcha service unavailable" +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:112 +#, elixir-format +msgid "Missing parameters" +msgstr "" + +#: lib/pleroma/web/common_api/utils.ex:547 +#, elixir-format +msgid "No such conversation" +msgstr "" + +#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:388 +#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:414 lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:456 +#, elixir-format +msgid "No such permission_group" +msgstr "" + +#: lib/pleroma/plugs/uploaded_media.ex:84 +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:486 lib/pleroma/web/admin_api/controllers/fallback_controller.ex:11 +#: lib/pleroma/web/feed/user_controller.ex:71 lib/pleroma/web/ostatus/ostatus_controller.ex:143 +#, elixir-format +msgid "Not found" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:331 +#, elixir-format +msgid "Poll's author can't vote" +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:20 +#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:37 lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:49 +#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:50 lib/pleroma/web/mastodon_api/controllers/status_controller.ex:306 +#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:71 +#, elixir-format +msgid "Record not found" +msgstr "" + +#: lib/pleroma/web/admin_api/controllers/fallback_controller.ex:35 +#: lib/pleroma/web/feed/user_controller.ex:77 lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:36 +#: lib/pleroma/web/ostatus/ostatus_controller.ex:149 +#, elixir-format +msgid "Something went wrong" +msgstr "" + +#: lib/pleroma/web/common_api/activity_draft.ex:107 +#, elixir-format +msgid "The message visibility must be direct" +msgstr "" + +#: lib/pleroma/web/common_api/utils.ex:573 +#, elixir-format +msgid "The status is over the character limit" +msgstr "" + +#: lib/pleroma/plugs/ensure_public_or_authenticated_plug.ex:31 +#, elixir-format +msgid "This resource requires authentication." +msgstr "" + +#: lib/pleroma/plugs/rate_limiter/rate_limiter.ex:206 +#, elixir-format +msgid "Throttled" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:356 +#, elixir-format +msgid "Too many choices" +msgstr "" + +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:443 +#, elixir-format +msgid "Unhandled activity type" +msgstr "" + +#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:485 +#, elixir-format +msgid "You can't revoke your own admin status." +msgstr "" + +#: lib/pleroma/web/oauth/oauth_controller.ex:221 +#: lib/pleroma/web/oauth/oauth_controller.ex:308 +#, elixir-format +msgid "Your account is currently disabled" +msgstr "" + +#: lib/pleroma/web/oauth/oauth_controller.ex:183 +#: lib/pleroma/web/oauth/oauth_controller.ex:331 +#, elixir-format +msgid "Your login is missing a confirmed e-mail address" +msgstr "" + +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:390 +#, elixir-format +msgid "can't read inbox of %{nickname} as %{as_nickname}" +msgstr "" + +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:473 +#, elixir-format +msgid "can't update outbox of %{nickname} as %{as_nickname}" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:471 +#, elixir-format +msgid "conversation is already muted" +msgstr "" + +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:314 +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:492 +#, elixir-format +msgid "error" +msgstr "" + +#: lib/pleroma/web/pleroma_api/controllers/mascot_controller.ex:32 +#, elixir-format +msgid "mascots can only be images" +msgstr "" + +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:62 +#, elixir-format +msgid "not found" +msgstr "" + +#: lib/pleroma/web/oauth/oauth_controller.ex:394 +#, elixir-format +msgid "Bad OAuth request." +msgstr "" + +#: lib/pleroma/web/twitter_api/twitter_api.ex:115 +#, elixir-format +msgid "CAPTCHA already used" +msgstr "" + +#: lib/pleroma/web/twitter_api/twitter_api.ex:112 +#, elixir-format +msgid "CAPTCHA expired" +msgstr "" + +#: lib/pleroma/plugs/uploaded_media.ex:57 +#, elixir-format +msgid "Failed" +msgstr "" + +#: lib/pleroma/web/oauth/oauth_controller.ex:410 +#, elixir-format +msgid "Failed to authenticate: %{message}." +msgstr "" + +#: lib/pleroma/web/oauth/oauth_controller.ex:441 +#, elixir-format +msgid "Failed to set up user account." +msgstr "" + +#: lib/pleroma/plugs/oauth_scopes_plug.ex:38 +#, elixir-format +msgid "Insufficient permissions: %{permissions}." +msgstr "" + +#: lib/pleroma/plugs/uploaded_media.ex:104 +#, elixir-format +msgid "Internal Error" +msgstr "" + +#: lib/pleroma/web/oauth/fallback_controller.ex:22 +#: lib/pleroma/web/oauth/fallback_controller.ex:29 +#, elixir-format +msgid "Invalid Username/Password" +msgstr "" + +#: lib/pleroma/web/twitter_api/twitter_api.ex:118 +#, elixir-format +msgid "Invalid answer data" +msgstr "" + +#: lib/pleroma/web/nodeinfo/nodeinfo_controller.ex:33 +#, elixir-format +msgid "Nodeinfo schema version not handled" +msgstr "" + +#: lib/pleroma/web/oauth/oauth_controller.ex:172 +#, elixir-format +msgid "This action is outside the authorized scopes" +msgstr "" + +#: lib/pleroma/web/oauth/fallback_controller.ex:14 +#, elixir-format +msgid "Unknown error, please check the details and try again." +msgstr "" + +#: lib/pleroma/web/oauth/oauth_controller.ex:119 +#: lib/pleroma/web/oauth/oauth_controller.ex:158 +#, elixir-format +msgid "Unlisted redirect_uri." +msgstr "" + +#: lib/pleroma/web/oauth/oauth_controller.ex:390 +#, elixir-format +msgid "Unsupported OAuth provider: %{provider}." +msgstr "" + +#: lib/pleroma/uploaders/uploader.ex:72 +#, elixir-format +msgid "Uploader callback timeout" +msgstr "" + +#: lib/pleroma/web/uploader_controller.ex:23 +#, elixir-format +msgid "bad request" +msgstr "" + +#: lib/pleroma/web/twitter_api/twitter_api.ex:103 +#, elixir-format +msgid "CAPTCHA Error" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:290 +#, elixir-format +msgid "Could not add reaction emoji" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:301 +#, elixir-format +msgid "Could not remove reaction emoji" +msgstr "" + +#: lib/pleroma/web/twitter_api/twitter_api.ex:129 +#, elixir-format +msgid "Invalid CAPTCHA (Missing parameter: %{name})" +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/list_controller.ex:92 +#, elixir-format +msgid "List not found" +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:123 +#, elixir-format +msgid "Missing parameter: %{name}" +msgstr "" + +#: lib/pleroma/web/oauth/oauth_controller.ex:210 +#: lib/pleroma/web/oauth/oauth_controller.ex:321 +#, elixir-format +msgid "Password reset is required" +msgstr "" + +#: lib/pleroma/tests/auth_test_controller.ex:9 +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:6 lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:6 +#: lib/pleroma/web/admin_api/controllers/config_controller.ex:6 lib/pleroma/web/admin_api/controllers/fallback_controller.ex:6 +#: lib/pleroma/web/admin_api/controllers/invite_controller.ex:6 lib/pleroma/web/admin_api/controllers/media_proxy_cache_controller.ex:6 +#: lib/pleroma/web/admin_api/controllers/oauth_app_controller.ex:6 lib/pleroma/web/admin_api/controllers/relay_controller.ex:6 +#: lib/pleroma/web/admin_api/controllers/report_controller.ex:6 lib/pleroma/web/admin_api/controllers/status_controller.ex:6 +#: lib/pleroma/web/controller_helper.ex:6 lib/pleroma/web/embed_controller.ex:6 +#: lib/pleroma/web/fallback_redirect_controller.ex:6 lib/pleroma/web/feed/tag_controller.ex:6 +#: lib/pleroma/web/feed/user_controller.ex:6 lib/pleroma/web/mailer/subscription_controller.ex:2 +#: lib/pleroma/web/masto_fe_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/account_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/app_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/auth_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/conversation_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/custom_emoji_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/domain_block_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/filter_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/follow_request_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/instance_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/list_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/marker_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex:14 +#: lib/pleroma/web/mastodon_api/controllers/media_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/notification_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/report_controller.ex:8 +#: lib/pleroma/web/mastodon_api/controllers/scheduled_activity_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/search_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/status_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:7 +#: lib/pleroma/web/mastodon_api/controllers/suggestion_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:6 +#: lib/pleroma/web/media_proxy/media_proxy_controller.ex:6 lib/pleroma/web/mongooseim/mongoose_im_controller.ex:6 +#: lib/pleroma/web/nodeinfo/nodeinfo_controller.ex:6 lib/pleroma/web/oauth/fallback_controller.ex:6 +#: lib/pleroma/web/oauth/mfa_controller.ex:10 lib/pleroma/web/oauth/oauth_controller.ex:6 +#: lib/pleroma/web/ostatus/ostatus_controller.ex:6 lib/pleroma/web/pleroma_api/controllers/account_controller.ex:6 +#: lib/pleroma/web/pleroma_api/controllers/chat_controller.ex:5 lib/pleroma/web/pleroma_api/controllers/conversation_controller.ex:6 +#: lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex:2 lib/pleroma/web/pleroma_api/controllers/emoji_reaction_controller.ex:6 +#: lib/pleroma/web/pleroma_api/controllers/mascot_controller.ex:6 lib/pleroma/web/pleroma_api/controllers/notification_controller.ex:6 +#: lib/pleroma/web/pleroma_api/controllers/scrobble_controller.ex:6 +#: lib/pleroma/web/pleroma_api/controllers/two_factor_authentication_controller.ex:7 lib/pleroma/web/static_fe/static_fe_controller.ex:6 +#: lib/pleroma/web/twitter_api/controllers/password_controller.ex:10 lib/pleroma/web/twitter_api/controllers/remote_follow_controller.ex:6 +#: lib/pleroma/web/twitter_api/controllers/util_controller.ex:6 lib/pleroma/web/twitter_api/twitter_api_controller.ex:6 +#: lib/pleroma/web/uploader_controller.ex:6 lib/pleroma/web/web_finger/web_finger_controller.ex:6 +#, elixir-format +msgid "Security violation: OAuth scopes check was neither handled nor explicitly skipped." +msgstr "" + +#: lib/pleroma/plugs/ensure_authenticated_plug.ex:28 +#, elixir-format +msgid "Two-factor authentication enabled, you must use a access token." +msgstr "" + +#: lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex:210 +#, elixir-format +msgid "Unexpected error occurred while adding file to pack." +msgstr "" + +#: lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex:138 +#, elixir-format +msgid "Unexpected error occurred while creating pack." +msgstr "" + +#: lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex:278 +#, elixir-format +msgid "Unexpected error occurred while removing file from pack." +msgstr "" + +#: lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex:250 +#, elixir-format +msgid "Unexpected error occurred while updating file in pack." +msgstr "" + +#: lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex:179 +#, elixir-format +msgid "Unexpected error occurred while updating pack metadata." +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:61 +#, elixir-format +msgid "Web push subscription is disabled on this Pleroma instance" +msgstr "" + +#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:451 +#, elixir-format +msgid "You can't revoke your own admin/moderator status." +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:126 +#, elixir-format +msgid "authorization required for timeline view" +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:24 +#, elixir-format +msgid "Access denied" +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:282 +#, elixir-format +msgid "This API requires an authenticated user" +msgstr "" + +#: lib/pleroma/plugs/user_is_admin_plug.ex:21 +#, elixir-format +msgid "User is not an admin." +msgstr "" diff --git a/priv/repo/migrations/20200825061316_move_activity_expirations_to_oban.exs b/priv/repo/migrations/20200825061316_move_activity_expirations_to_oban.exs index cdc00d20b..a703af83f 100644 --- a/priv/repo/migrations/20200825061316_move_activity_expirations_to_oban.exs +++ b/priv/repo/migrations/20200825061316_move_activity_expirations_to_oban.exs @@ -4,6 +4,8 @@ defmodule Pleroma.Repo.Migrations.MoveActivityExpirationsToOban do import Ecto.Query, only: [from: 2] def change do + Pleroma.Config.Oban.warn() + Supervisor.start_link([{Oban, Pleroma.Config.get(Oban)}], strategy: :one_for_one, name: Pleroma.Supervisor diff --git a/priv/repo/migrations/20200907092050_move_tokens_expiration_into_oban.exs b/priv/repo/migrations/20200907092050_move_tokens_expiration_into_oban.exs index 832bd02a7..9e49ddacb 100644 --- a/priv/repo/migrations/20200907092050_move_tokens_expiration_into_oban.exs +++ b/priv/repo/migrations/20200907092050_move_tokens_expiration_into_oban.exs @@ -4,6 +4,8 @@ defmodule Pleroma.Repo.Migrations.MoveTokensExpirationIntoOban do import Ecto.Query, only: [from: 2] def change do + Pleroma.Config.Oban.warn() + Supervisor.start_link([{Oban, Pleroma.Config.get(Oban)}], strategy: :one_for_one, name: Pleroma.Supervisor diff --git a/priv/repo/migrations/20200910113106_remove_managed_config_from_db.exs b/priv/repo/migrations/20200910113106_remove_managed_config_from_db.exs new file mode 100644 index 000000000..e27a9ae48 --- /dev/null +++ b/priv/repo/migrations/20200910113106_remove_managed_config_from_db.exs @@ -0,0 +1,27 @@ +defmodule Pleroma.Repo.Migrations.RemoveManagedConfigFromDb do + use Ecto.Migration + import Ecto.Query + alias Pleroma.ConfigDB + alias Pleroma.Repo + + def up do + config_entry = + from(c in ConfigDB, + select: [:id, :value], + where: c.group == ^:pleroma and c.key == ^:instance + ) + |> Repo.one() + + if config_entry do + {_, value} = Keyword.pop(config_entry.value, :managed_config) + + config_entry + |> Ecto.Changeset.change(value: value) + |> Repo.update() + end + end + + def down do + :ok + end +end diff --git a/priv/repo/migrations/20200911055909_remove_cron_jobs.exs b/priv/repo/migrations/20200911055909_remove_cron_jobs.exs new file mode 100644 index 000000000..33897d128 --- /dev/null +++ b/priv/repo/migrations/20200911055909_remove_cron_jobs.exs @@ -0,0 +1,20 @@ +defmodule Pleroma.Repo.Migrations.RemoveCronJobs do + use Ecto.Migration + + import Ecto.Query, only: [from: 2] + + def up do + from(j in "oban_jobs", + where: + j.worker in ^[ + "Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker", + "Pleroma.Workers.Cron.StatsWorker", + "Pleroma.Workers.Cron.ClearOauthTokenWorker" + ], + select: [:id] + ) + |> Pleroma.Repo.delete_all() + end + + def down, do: :ok +end diff --git a/priv/repo/migrations/20200914105638_delete_notification_without_activity.exs b/priv/repo/migrations/20200914105638_delete_notification_without_activity.exs new file mode 100644 index 000000000..9333fc5a1 --- /dev/null +++ b/priv/repo/migrations/20200914105638_delete_notification_without_activity.exs @@ -0,0 +1,30 @@ +defmodule Pleroma.Repo.Migrations.DeleteNotificationWithoutActivity do + use Ecto.Migration + + import Ecto.Query + alias Pleroma.Repo + + def up do + from( + q in Pleroma.Notification, + left_join: c in assoc(q, :activity), + select: %{id: type(q.id, :integer)}, + where: is_nil(c.id) + ) + |> Repo.chunk_stream(1_000, :batches) + |> Stream.each(fn records -> + notification_ids = Enum.map(records, fn %{id: id} -> id end) + + Repo.delete_all( + from(n in "notifications", + where: n.id in ^notification_ids + ) + ) + end) + |> Stream.run() + end + + def down do + :ok + end +end diff --git a/priv/repo/migrations/20200914105800_add_notification_constraints.exs b/priv/repo/migrations/20200914105800_add_notification_constraints.exs new file mode 100644 index 000000000..a65c35fd0 --- /dev/null +++ b/priv/repo/migrations/20200914105800_add_notification_constraints.exs @@ -0,0 +1,23 @@ +defmodule Pleroma.Repo.Migrations.AddNotificationConstraints do + use Ecto.Migration + + def up do + drop(constraint(:notifications, "notifications_activity_id_fkey")) + + alter table(:notifications) do + modify(:activity_id, references(:activities, type: :uuid, on_delete: :delete_all), + null: false + ) + end + end + + def down do + drop(constraint(:notifications, "notifications_activity_id_fkey")) + + alter table(:notifications) do + modify(:activity_id, references(:activities, type: :uuid, on_delete: :delete_all), + null: true + ) + end + end +end diff --git a/priv/repo/migrations/20200925065249_make_user_ids_ci.exs b/priv/repo/migrations/20200925065249_make_user_ids_ci.exs new file mode 100644 index 000000000..8ea0f2cf1 --- /dev/null +++ b/priv/repo/migrations/20200925065249_make_user_ids_ci.exs @@ -0,0 +1,9 @@ +defmodule Pleroma.Repo.Migrations.MakeUserIdsCI do + use Ecto.Migration + + def change do + # Migration retired, see + # https://git.pleroma.social/pleroma/pleroma/-/issues/2188 + :noop + end +end diff --git a/priv/repo/migrations/20200928145912_revert_citext_change.exs b/priv/repo/migrations/20200928145912_revert_citext_change.exs new file mode 100644 index 000000000..685a98533 --- /dev/null +++ b/priv/repo/migrations/20200928145912_revert_citext_change.exs @@ -0,0 +1,11 @@ +defmodule Pleroma.Repo.Migrations.RevertCitextChange do + use Ecto.Migration + + def change do + alter table(:users) do + modify(:uri, :text) + end + + # create_if_not_exists(unique_index(:users, :uri)) + end +end diff --git a/priv/repo/migrations/20200930082320_user_ur_is_index_part_three.exs b/priv/repo/migrations/20200930082320_user_ur_is_index_part_three.exs new file mode 100644 index 000000000..816c6526e --- /dev/null +++ b/priv/repo/migrations/20200930082320_user_ur_is_index_part_three.exs @@ -0,0 +1,8 @@ +defmodule Pleroma.Repo.Migrations.UserURIsIndexPartThree do + use Ecto.Migration + + def change do + drop_if_exists(unique_index(:users, :uri)) + create_if_not_exists(index(:users, :uri)) + end +end diff --git a/priv/static/index.html b/priv/static/index.html index 6fa237768..f5690a8d6 100644 --- a/priv/static/index.html +++ b/priv/static/index.html @@ -1 +1 @@ -Pleroma
\ No newline at end of file +Pleroma
\ No newline at end of file diff --git a/priv/static/static/font/fontello.1599568314856.woff b/priv/static/static/font/fontello.1599568314856.woff deleted file mode 100644 index 64f566383..000000000 Binary files a/priv/static/static/font/fontello.1599568314856.woff and /dev/null differ diff --git a/priv/static/static/font/fontello.1599568314856.woff2 b/priv/static/static/font/fontello.1599568314856.woff2 deleted file mode 100644 index 972e70831..000000000 Binary files a/priv/static/static/font/fontello.1599568314856.woff2 and /dev/null differ diff --git a/priv/static/static/font/fontello.1599568314856.eot b/priv/static/static/font/fontello.1600365488745.eot similarity index 89% rename from priv/static/static/font/fontello.1599568314856.eot rename to priv/static/static/font/fontello.1600365488745.eot index 1a6931a0e..255f50372 100644 Binary files a/priv/static/static/font/fontello.1599568314856.eot and b/priv/static/static/font/fontello.1600365488745.eot differ diff --git a/priv/static/static/font/fontello.1599568314856.svg b/priv/static/static/font/fontello.1600365488745.svg similarity index 98% rename from priv/static/static/font/fontello.1599568314856.svg rename to priv/static/static/font/fontello.1600365488745.svg index 71b5d70af..9eddf62ea 100644 --- a/priv/static/static/font/fontello.1599568314856.svg +++ b/priv/static/static/font/fontello.1600365488745.svg @@ -92,6 +92,8 @@ + + diff --git a/priv/static/static/font/fontello.1599568314856.ttf b/priv/static/static/font/fontello.1600365488745.ttf similarity index 89% rename from priv/static/static/font/fontello.1599568314856.ttf rename to priv/static/static/font/fontello.1600365488745.ttf index 795464475..6bda99d50 100644 Binary files a/priv/static/static/font/fontello.1599568314856.ttf and b/priv/static/static/font/fontello.1600365488745.ttf differ diff --git a/priv/static/static/font/fontello.1600365488745.woff b/priv/static/static/font/fontello.1600365488745.woff new file mode 100644 index 000000000..11c866ae0 Binary files /dev/null and b/priv/static/static/font/fontello.1600365488745.woff differ diff --git a/priv/static/static/font/fontello.1600365488745.woff2 b/priv/static/static/font/fontello.1600365488745.woff2 new file mode 100644 index 000000000..06151d28c Binary files /dev/null and b/priv/static/static/font/fontello.1600365488745.woff2 differ diff --git a/priv/static/static/fontello.1599568314856.css b/priv/static/static/fontello.1600365488745.css similarity index 89% rename from priv/static/static/fontello.1599568314856.css rename to priv/static/static/fontello.1600365488745.css index e636286c0..781ff7620 100644 --- a/priv/static/static/fontello.1599568314856.css +++ b/priv/static/static/fontello.1600365488745.css @@ -1,11 +1,11 @@ @font-face { font-family: "Icons"; - src: url("./font/fontello.1599568314856.eot"); - src: url("./font/fontello.1599568314856.eot") format("embedded-opentype"), - url("./font/fontello.1599568314856.woff2") format("woff2"), - url("./font/fontello.1599568314856.woff") format("woff"), - url("./font/fontello.1599568314856.ttf") format("truetype"), - url("./font/fontello.1599568314856.svg") format("svg"); + src: url("./font/fontello.1600365488745.eot"); + src: url("./font/fontello.1600365488745.eot") format("embedded-opentype"), + url("./font/fontello.1600365488745.woff2") format("woff2"), + url("./font/fontello.1600365488745.woff") format("woff"), + url("./font/fontello.1600365488745.ttf") format("truetype"), + url("./font/fontello.1600365488745.svg") format("svg"); font-weight: normal; font-style: normal; } @@ -156,3 +156,5 @@ .icon-music::before { content: "\e828"; } .icon-doc::before { content: "\e829"; } .icon-block::before { content: "\e82a"; } + +.icon-megaphone::before { content: "\e82b"; } diff --git a/priv/static/static/fontello.json b/priv/static/static/fontello.json index 706800cdb..b0136fd90 100644 --- a/priv/static/static/fontello.json +++ b/priv/static/static/fontello.json @@ -405,6 +405,12 @@ "css": "block", "code": 59434, "src": "fontawesome" + }, + { + "uid": "3e674995cacc2b09692c096ea7eb6165", + "css": "megaphone", + "code": 59435, + "src": "fontawesome" } ] } \ No newline at end of file diff --git a/priv/static/static/js/2.c92f4803ff24726cea58.js.map b/priv/static/static/js/2.c92f4803ff24726cea58.js.map deleted file mode 100644 index e3cc6a3fb..000000000 --- a/priv/static/static/js/2.c92f4803ff24726cea58.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/components/settings_modal/settings_modal_content.scss?d424","webpack:///./src/components/settings_modal/settings_modal_content.scss","webpack:///./src/components/importer/importer.vue?7798","webpack:///./src/components/importer/importer.vue?6af6","webpack:///./src/components/exporter/exporter.vue?dea3","webpack:///./src/components/exporter/exporter.vue?cc2b","webpack:///./src/components/settings_modal/tabs/mutes_and_blocks_tab.scss?4d0c","webpack:///./src/components/settings_modal/tabs/mutes_and_blocks_tab.scss","webpack:///./src/components/autosuggest/autosuggest.vue?9908","webpack:///./src/components/autosuggest/autosuggest.vue?9383","webpack:///./src/components/block_card/block_card.vue?7ad7","webpack:///./src/components/block_card/block_card.vue?ddc8","webpack:///./src/components/mute_card/mute_card.vue?c72f","webpack:///./src/components/mute_card/mute_card.vue?1268","webpack:///./src/components/domain_mute_card/domain_mute_card.vue?a613","webpack:///./src/components/domain_mute_card/domain_mute_card.vue?c85e","webpack:///./src/components/selectable_list/selectable_list.vue?a6e3","webpack:///./src/components/selectable_list/selectable_list.vue?c2f8","webpack:///./src/components/settings_modal/tabs/security_tab/mfa.vue?540b","webpack:///./src/components/settings_modal/tabs/security_tab/mfa.vue?cd9f","webpack:///./src/components/settings_modal/tabs/security_tab/mfa_backup_codes.vue?da3d","webpack:///./src/components/settings_modal/tabs/security_tab/mfa_backup_codes.vue?57b8","webpack:///./src/components/settings_modal/tabs/profile_tab.scss?588b","webpack:///./src/components/settings_modal/tabs/profile_tab.scss","webpack:///./src/components/image_cropper/image_cropper.vue?f169","webpack:///./src/components/image_cropper/image_cropper.vue?6235","webpack:///./src/components/settings_modal/tabs/theme_tab/theme_tab.scss?080d","webpack:///./src/components/settings_modal/tabs/theme_tab/theme_tab.scss","webpack:///./src/components/color_input/color_input.scss?c457","webpack:///./src/components/color_input/color_input.scss","webpack:///./src/components/color_input/color_input.vue?6a4c","webpack:///./src/components/color_input/color_input.vue?bb22","webpack:///./src/components/shadow_control/shadow_control.vue?bfd4","webpack:///./src/components/shadow_control/shadow_control.vue?78ef","webpack:///./src/components/font_control/font_control.vue?5f33","webpack:///./src/components/font_control/font_control.vue?bef4","webpack:///./src/components/contrast_ratio/contrast_ratio.vue?a340","webpack:///./src/components/contrast_ratio/contrast_ratio.vue?32fa","webpack:///./src/components/export_import/export_import.vue?5952","webpack:///./src/components/export_import/export_import.vue?aed6","webpack:///./src/components/settings_modal/tabs/theme_tab/preview.vue?1ae8","webpack:///./src/components/settings_modal/tabs/theme_tab/preview.vue?ab81","webpack:///./src/components/importer/importer.js","webpack:///./src/components/importer/importer.vue","webpack:///./src/components/importer/importer.vue?320c","webpack:///./src/components/exporter/exporter.js","webpack:///./src/components/exporter/exporter.vue","webpack:///./src/components/exporter/exporter.vue?7e42","webpack:///./src/components/settings_modal/tabs/data_import_export_tab.js","webpack:///./src/components/settings_modal/tabs/data_import_export_tab.vue","webpack:///./src/components/settings_modal/tabs/data_import_export_tab.vue?40b4","webpack:///./src/components/autosuggest/autosuggest.js","webpack:///./src/components/autosuggest/autosuggest.vue","webpack:///./src/components/autosuggest/autosuggest.vue?b400","webpack:///./src/components/block_card/block_card.js","webpack:///./src/components/block_card/block_card.vue","webpack:///./src/components/block_card/block_card.vue?7b44","webpack:///./src/components/mute_card/mute_card.js","webpack:///./src/components/mute_card/mute_card.vue","webpack:///./src/components/mute_card/mute_card.vue?6bc9","webpack:///./src/components/domain_mute_card/domain_mute_card.js","webpack:///./src/components/domain_mute_card/domain_mute_card.vue","webpack:///./src/components/domain_mute_card/domain_mute_card.vue?7cf0","webpack:///./src/components/selectable_list/selectable_list.js","webpack:///./src/components/selectable_list/selectable_list.vue","webpack:///./src/components/selectable_list/selectable_list.vue?5686","webpack:///./src/hocs/with_subscription/with_subscription.js","webpack:///./src/components/settings_modal/tabs/mutes_and_blocks_tab.js","webpack:///./src/components/settings_modal/tabs/mutes_and_blocks_tab.vue","webpack:///./src/components/settings_modal/tabs/mutes_and_blocks_tab.vue?0687","webpack:///./src/components/settings_modal/tabs/notifications_tab.js","webpack:///./src/components/settings_modal/tabs/notifications_tab.vue","webpack:///./src/components/settings_modal/tabs/notifications_tab.vue?6dcc","webpack:///./src/components/settings_modal/helpers/shared_computed_object.js","webpack:///./src/components/settings_modal/tabs/filtering_tab.js","webpack:///./src/components/settings_modal/tabs/filtering_tab.vue","webpack:///./src/components/settings_modal/tabs/filtering_tab.vue?3af7","webpack:///./src/components/settings_modal/tabs/security_tab/mfa_backup_codes.js","webpack:///./src/components/settings_modal/tabs/security_tab/mfa_backup_codes.vue","webpack:///./src/components/settings_modal/tabs/security_tab/mfa_backup_codes.vue?198f","webpack:///./src/components/settings_modal/tabs/security_tab/confirm.js","webpack:///./src/components/settings_modal/tabs/security_tab/confirm.vue","webpack:///./src/components/settings_modal/tabs/security_tab/confirm.vue?da03","webpack:///./src/components/settings_modal/tabs/security_tab/mfa_totp.js","webpack:///./src/components/settings_modal/tabs/security_tab/mfa.js","webpack:///./src/components/settings_modal/tabs/security_tab/mfa_totp.vue","webpack:///./src/components/settings_modal/tabs/security_tab/mfa_totp.vue?cdbe","webpack:///./src/components/settings_modal/tabs/security_tab/mfa.vue","webpack:///./src/components/settings_modal/tabs/security_tab/mfa.vue?8795","webpack:///./src/components/settings_modal/tabs/security_tab/security_tab.js","webpack:///./src/components/settings_modal/tabs/security_tab/security_tab.vue","webpack:///./src/components/settings_modal/tabs/security_tab/security_tab.vue?0d38","webpack:///./src/components/image_cropper/image_cropper.js","webpack:///./src/components/image_cropper/image_cropper.vue","webpack:///./src/components/image_cropper/image_cropper.vue?017e","webpack:///./src/components/settings_modal/tabs/profile_tab.js","webpack:///./src/components/settings_modal/tabs/profile_tab.vue","webpack:///./src/components/settings_modal/tabs/profile_tab.vue?4eea","webpack:///src/components/interface_language_switcher/interface_language_switcher.vue","webpack:///./src/components/interface_language_switcher/interface_language_switcher.vue","webpack:///./src/components/interface_language_switcher/interface_language_switcher.vue?d9d4","webpack:///./src/components/settings_modal/tabs/general_tab.js","webpack:///./src/components/settings_modal/tabs/general_tab.vue","webpack:///./src/components/settings_modal/tabs/general_tab.vue?2e10","webpack:///./src/components/settings_modal/tabs/version_tab.js","webpack:///./src/services/version/version.service.js","webpack:///./src/components/settings_modal/tabs/version_tab.vue","webpack:///./src/components/settings_modal/tabs/version_tab.vue?7cbe","webpack:///src/components/color_input/color_input.vue","webpack:///./src/components/color_input/color_input.vue","webpack:///./src/components/color_input/color_input.vue?3d5b","webpack:///./src/components/range_input/range_input.vue","webpack:///src/components/range_input/range_input.vue","webpack:///./src/components/range_input/range_input.vue?202a","webpack:///src/components/opacity_input/opacity_input.vue","webpack:///./src/components/opacity_input/opacity_input.vue","webpack:///./src/components/opacity_input/opacity_input.vue?0078","webpack:///./src/components/shadow_control/shadow_control.js","webpack:///./src/components/shadow_control/shadow_control.vue","webpack:///./src/components/shadow_control/shadow_control.vue?c9d6","webpack:///./src/components/font_control/font_control.js","webpack:///./src/components/font_control/font_control.vue","webpack:///./src/components/font_control/font_control.vue?184b","webpack:///src/components/contrast_ratio/contrast_ratio.vue","webpack:///./src/components/contrast_ratio/contrast_ratio.vue","webpack:///./src/components/contrast_ratio/contrast_ratio.vue?73bf","webpack:///src/components/export_import/export_import.vue","webpack:///./src/components/export_import/export_import.vue","webpack:///./src/components/export_import/export_import.vue?9130","webpack:///./src/components/settings_modal/tabs/theme_tab/preview.vue","webpack:///./src/components/settings_modal/tabs/theme_tab/preview.vue?4c36","webpack:///./src/components/settings_modal/tabs/theme_tab/theme_tab.js","webpack:///./src/components/settings_modal/tabs/theme_tab/theme_tab.vue","webpack:///./src/components/settings_modal/tabs/theme_tab/theme_tab.vue?0f73","webpack:///./src/components/settings_modal/settings_modal_content.js","webpack:///./src/components/settings_modal/settings_modal_content.vue","webpack:///./src/components/settings_modal/settings_modal_content.vue?458b"],"names":["content","__webpack_require__","module","i","locals","exports","add","default","push","Importer","props","submitHandler","type","Function","required","submitButtonLabel","String","this","$t","successMessage","errorMessage","data","file","error","success","submitting","methods","change","$refs","input","files","submit","_this","dismiss","then","__vue_styles__","context","importer_importer","Object","component_normalizer","importer","_vm","_h","$createElement","_c","_self","staticClass","ref","attrs","on","_v","click","_s","_e","Exporter","getContent","filename","exportButtonLabel","processingMessage","processing","process","fileToDownload","document","createElement","setAttribute","encodeURIComponent","style","display","body","appendChild","removeChild","setTimeout","exporter_vue_styles_","exporter_exporter","exporter","DataImportExportTab","activeTab","newDomainToMute","created","$store","dispatch","components","Checkbox","computed","user","state","users","currentUser","getFollowsContent","api","backendInteractor","exportFriends","id","generateExportableUsersContent","getBlocksContent","fetchBlocks","importFollows","status","Error","importBlocks","map","is_local","screen_name","location","hostname","join","tabs_data_import_export_tab","data_import_export_tab","label","submit-handler","success-message","error-message","get-content","export-button-label","autosuggest","query","filter","placeholder","term","timeout","results","resultsVisible","filtered","watch","val","fetchResults","clearTimeout","onInputClick","onClickOutside","autosuggest_vue_styles_","autosuggest_autosuggest","directives","name","rawName","value","expression","domProps","$event","target","composing","length","_l","item","_t","BlockCard","progress","getters","findUser","userId","relationship","blocked","blocking","BasicUserCard","unblockUser","blockUser","_this2","block_card_vue_styles_","block_card_block_card","block_card","disabled","MuteCard","muted","muting","unmuteUser","muteUser","mute_card_vue_styles_","mute_card_mute_card","mute_card","DomainMuteCard","ProgressButton","domainMutes","includes","domain","unmuteDomain","muteDomain","domain_mute_card_vue_styles_","domain_mute_card_domain_mute_card","domain_mute_card","slot","SelectableList","List","items","Array","getKey","selected","allKeys","filteredSelected","key","indexOf","allSelected","noneSelected","someSelected","isSelected","toggle","checked","splice","toggleAll","slice","selectable_list_vue_styles_","selectable_list_selectable_list","selectable_list","indeterminate","get-key","scopedSlots","_u","fn","class","selectable-list-item-selected-inner","withSubscription","_ref","fetch","select","_ref$childPropName","childPropName","_ref$additionalPropNa","additionalPropNames","WrappedComponent","keys","getComponentProps","v","concat","Vue","component","toConsumableArray_default","loading","fetchedData","$props","refresh","isEmpty","fetchData","render","h","_objectSpread","defineProperty_default","$listeners","$scopedSlots","children","entries","$slots","_ref2","_ref3","slicedToArray_default","helper_default","BlockList","get","MuteList","DomainMuteList","MutesAndBlocks","TabSwitcher","Autosuggest","knownDomains","instance","activateTab","tabName","filterUnblockedUsers","userIds","reject","filterUnMutedUsers","queryUserIds","blockUsers","ids","unblockUsers","muteUsers","unmuteUsers","filterUnMutedDomains","urls","_this3","url","queryKnownDomains","_this4","Promise","resolve","toLowerCase","unmuteDomains","domains","mutes_and_blocks_tab_vue_styles_","tabs_mutes_and_blocks_tab","mutes_and_blocks_tab","scrollable-tabs","row","user-id","NotificationsTab","notificationSettings","notification_settings","updateNotificationSettings","settings","tabs_notifications_tab","notifications_tab","model","callback","$$v","$set","SharedComputedObject","shared_computed_object_objectSpread","instanceDefaultProperties","multiChoiceProperties","instanceDefaultConfig","reduce","acc","_ref4","configDefaultState","mergedConfig","set","_ref5","_ref6","useStreamingApi","e","console","FilteringTab","muteWordsStringLocal","muteWords","filtering_tab_objectSpread","muteWordsString","filter_default","split","word","trim_default","notificationVisibility","handler","deep","replyVisibility","tabs_filtering_tab","filtering_tab","for","$$selectedVal","prototype","call","options","o","_value","multiple","hidePostStats","hidePostStatsLocalizedValue","hideUserStats","hideUserStatsLocalizedValue","hideFilteredStatuses","hideFilteredStatusesLocalizedValue","mfa_backup_codes","backupCodes","inProgress","codes","ready","displayTitle","mfa_backup_codes_vue_styles_","security_tab_mfa_backup_codes","code","Confirm","confirm","$emit","cancel","tabs_security_tab_confirm","security_tab_confirm","mfa_totp","currentPassword","deactivate","mfa_totp_objectSpread","isActivated","totp","mapState","doActivate","cancelDeactivate","doDeactivate","confirmDeactivate","mfaDisableOTP","password","res","Mfa","available","enabled","setupState","setupOTPState","getNewCodes","otpSettings","provisioning_uri","otpConfirmToken","readyInit","recovery-codes","RecoveryCodes","totp-item","qrcode","VueQrcode","mfa_objectSpread","canSetupOTP","setupInProgress","backupCodesPrepared","setupOTPInProgress","completedOTP","prepareOTP","confirmOTP","confirmNewBackupCodes","activateOTP","fetchBackupCodes","generateMfaBackupCodes","getBackupCodes","confirmBackupCodes","cancelBackupCodes","setupOTP","mfaSetupOTP","doConfirmOTP","mfaConfirmOTP","token","completeSetup","fetchSettings","cancelSetup","result","regenerator_default","a","async","_context","prev","next","awrap","settingsMFA","sent","abrupt","stop","mounted","_this5","mfa_vue_styles_","security_tab_mfa","mfa","activate","backup-codes","width","SecurityTab","newEmail","changeEmailError","changeEmailPassword","changedEmail","deletingAccount","deleteAccountConfirmPasswordInput","deleteAccountError","changePasswordInputs","changedPassword","changePasswordError","pleromaBackend","oauthTokens","tokens","oauthToken","appName","app_name","validUntil","Date","valid_until","toLocaleDateString","confirmDelete","deleteAccount","$router","changePassword","params","newPassword","newPasswordConfirmation","logout","changeEmail","email","replace","revokeToken","window","$i18n","t","security_tab_security_tab","security_tab","autocomplete","ImageCropper","trigger","Element","cropperOptions","aspectRatio","autoCropArea","viewMode","movable","zoomable","guides","mimes","saveButtonLabel","saveWithoutCroppingButtonlabel","cancelButtonLabel","cropper","undefined","dataUrl","submitError","saveText","saveWithoutCroppingText","cancelText","submitErrorMsg","toString","destroy","cropping","arguments","avatarUploadError","err","pickImage","createCropper","Cropper","img","getTriggerDOM","typeof_default","querySelector","readFile","fileInput","reader","FileReader","onload","readAsDataURL","clearError","addEventListener","beforeDestroy","removeEventListener","image_cropper_vue_styles_","image_cropper_image_cropper","image_cropper","src","alt","load","stopPropagation","textContent","accept","ProfileTab","newName","newBio","unescape","description","newLocked","locked","newNoRichText","no_rich_text","newDefaultScope","default_scope","newFields","fields","field","hideFollows","hide_follows","hideFollowers","hide_followers","hideFollowsCount","hide_follows_count","hideFollowersCount","hide_followers_count","showRole","show_role","role","discoverable","bot","allowFollowingMove","allow_following_move","pickAvatarBtnVisible","bannerUploading","backgroundUploading","banner","bannerPreview","background","backgroundPreview","bannerUploadError","backgroundUploadError","ScopeSelector","EmojiInput","emojiUserSuggestor","suggestor","emoji","customEmoji","updateUsersList","emojiSuggestor","userSuggestor","fieldsLimits","maxFields","defaultAvatar","server","defaultBanner","isDefaultAvatar","baseAvatar","profile_image_url","isDefaultBanner","baseBanner","cover_photo","isDefaultBackground","background_image","avatarImgSrc","profile_image_url_original","bannerImgSrc","updateProfile","note","display_name","fields_attributes","el","merge","commit","changeVis","visibility","addField","deleteField","index","event","$delete","uploadFile","size","filesize","fileSizeFormatService","fileSizeFormat","allowedsize","num","filesizeunit","unit","allowedsizeunit","resetAvatar","submitAvatar","resetBanner","submitBanner","resetBackground","submitBackground","that","updateAvatar","avatar","updateProfileImages","message","getCroppedCanvas","toBlob","_this6","profile_tab_vue_styles_","tabs_profile_tab","profile_tab","enable-emoji-picker","suggest","classname","show-all","user-default","initial-scope","on-scope-change","_","hide-emoji-button","title","open","close","clearUploadError","interface_language_switcher","languageCodes","messages","languages","languageNames","map_default","getLanguageName","language","interfaceLanguage","ja","ja_easy","zh","getName","interface_language_switcher_interface_language_switcher","langCode","GeneralTab","loopSilentAvailable","getOwnPropertyDescriptor","HTMLVideoElement","HTMLMediaElement","InterfaceLanguageSwitcher","general_tab_objectSpread","postFormats","instanceSpecificPanelPresent","showInstanceSpecificPanel","tabs_general_tab","general_tab","hideISP","hideMutedPosts","hideMutedPostsLocalizedValue","collapseMessageWithSubject","collapseMessageWithSubjectLocalizedValue","streaming","pauseOnUnfocused","emojiReactionsOnTimeline","scopeCopy","scopeCopyLocalizedValue","alwaysShowSubjectInput","alwaysShowSubjectInputLocalizedValue","subjectLineBehavior","subjectLineBehaviorDefaultValue","postContentType","postFormat","postContentTypeDefaultValue","minimalScopesMode","minimalScopesModeLocalizedValue","autohideFloatingPostButton","padEmoji","hideAttachments","hideAttachmentsInConv","modifiers","number","min","step","maxThumbnails","_n","blur","$forceUpdate","hideNsfw","preloadImage","useOneClickNsfw","stopGifs","loopVideo","loopVideoSilentOnly","playVideosInModal","useContainFit","webPushNotifications","greentext","greentextLocalizedValue","VersionTab","backendVersion","frontendVersion","frontendVersionLink","backendVersionLink","versionString","matches","match","tabs_version_tab","version_tab","href","color_input","checkbox_checkbox","fallback","Boolean","showOptionalTickbox","present","validColor","color_convert","transparentColor","computedColor","startsWith","color_input_vue_styles_","color_input_color_input","backgroundColor","range_input_range_input","max","hardMax","hardMin","opacity_input","opacity_input_opacity_input","toModel","shadow_control_objectSpread","x","y","spread","inset","color","alpha","shadow_control","selectedId","cValue","ColorInput","OpacityInput","del","Math","moveUp","moveDn","beforeUpdate","anyShadows","anyShadowsFallback","currentFallback","moveUpValid","moveDnValid","usingFallback","rgb","hex2rgb","boxShadow","getCssShadow","shadow_control_vue_styles_","shadow_control_shadow_control","__r","shadow","isArray","_i","$$a","$$el","$$c","$$i","show-optional-tickbox","path","tag","font_control","lValue","availableOptions","noInherit","dValue","family","isCustom","preset","font_control_vue_styles_","font_control_font_control","custom","option","contrast_ratio","large","contrast","hint","levelVal","aaa","aa","level","ratio","text","hint_18pt","laaa","laa","contrast_ratio_vue_styles_","contrast_ratio_contrast_ratio","export_import","importFailed","exportData","stringified","JSON","stringify","exportObject","btoa","importData","filePicker","parsed","parse","validator","onImport","readAsText","export_import_vue_styles_","export_import_export_import","exportLabel","importLabel","importFailedText","preview_vue_styles_","theme_tab_preview","staticStyle","font-family","_m","v1OnlyNames","theme_tab","theme_tab_objectSpread","availableStyles","theme","themeWarning","tempImportFile","engineVersion","previewShadows","previewColors","previewRadii","previewFonts","shadowsInvalid","colorsInvalid","radiiInvalid","keepColor","keepShadows","keepOpacity","keepRoundness","keepFonts","SLOT_INHERITANCE","OPACITIES","shadowSelected","shadowsLocal","fontsLocal","btnRadiusLocal","inputRadiusLocal","checkboxRadiusLocal","panelRadiusLocal","avatarRadiusLocal","avatarAltRadiusLocal","attachmentRadiusLocal","tooltipRadiusLocal","chatMessageRadiusLocal","self","getThemes","promises","all","k","themes","_ref7","_ref8","themesComplete","loadThemeFromLocalStorage","shadowsAvailable","themeWarningHelp","pre","_this$themeWarning","origin","themeEngineVersion","noActionsPossible","CURRENT_VERSION","selectedVersion","currentColors","_ref9","_ref10","currentOpacity","_ref11","_ref12","currentRadii","btn","checkbox","panel","avatarAlt","tooltip","attachment","chatMessage","preview","composePreset","previewTheme","colors","opacity","radii","shadows","fonts","previewContrast","bg","colorsConverted","_ref13","_ref14","ratios","_ref15","_ref16","slotIsBaseText","textColor","_ref17","layer","variant","opacitySlot","getOpacitySlot","textColors","layers","getLayers","textColorKey","newKey","toUpperCase","getContrastRatioLayers","_ref18","_ref19","toPrecision","warn","previewRules","rules","values","DEFAULT_SHADOWS","sort","currentShadowOverriden","currentShadow","currentShadowFallback","assign","themeValid","exportedTheme","saveEverything","source","_pleroma_theme_version","RangeInput","ContrastRatio","ShadowControl","FontControl","Preview","ExportImport","loadTheme","_ref20","fileVersion","forceUseSource","dismissWarning","version","snapshotEngineVersion","versionsMatch","sourceSnapshotMismatch","forcedSourceLoad","normalizeLocalState","forceLoadLocalStorage","forceLoad","forceSnapshot","confirmLoadSource","_this$$store$getters$","customTheme","customThemeSource","themeData","setCustomTheme","updatePreviewColorsAndShadows","generateColors","generateShadows","mod","forceSource","importValidator","clearAll","clearV1","$data","endsWith","forEach","clearRoundness","clearOpacity","clearShadows","clearFonts","colors2to3","fg","fgColorLocal","rgb2hex","textColorLocal","Set","hex","_ref21","_ref22","Number","isNaN","_ref23","_ref24","shadows2to3","generateRadii","getOwnPropertyNames","generateFonts","fontsInvalid","bgColorLocal","linkColorLocal","cRedColorLocal","cGreenColorLocal","cBlueColorLocal","cOrangeColorLocal","theme_tab_vue_styles_","theme_tab_theme_tab","export-object","export-label","import-label","import-failed-text","on-import","bgOpacityLocal","bgText","link","accentColorLocal","accent","bgLink","fgText","fgTextColorLocal","fgLink","fgLinkColorLocal","bgCRed","bgCBlue","bgCGreen","bgCOrange","postLinkColorLocal","postLink","cGreen","postGreentextColorLocal","postGreentext","alertError","alertErrorColorLocal","alertErrorText","alertErrorTextColorLocal","alertWarning","alertWarningColorLocal","alertWarningText","alertWarningTextColorLocal","alertNeutral","alertNeutralColorLocal","alertNeutralText","alertNeutralTextColorLocal","alert","alertOpacityLocal","badgeNotification","badgeNotificationColorLocal","badgeNotificationText","badgeNotificationTextColorLocal","panelColorLocal","panelOpacityLocal","panelText","panelTextColorLocal","panelLink","panelLinkColorLocal","topBar","topBarColorLocal","topBarText","topBarTextColorLocal","topBarLink","topBarLinkColorLocal","inputColorLocal","inputOpacityLocal","inputText","inputTextColorLocal","btnColorLocal","btnOpacityLocal","btnText","btnTextColorLocal","btnPanelText","btnPanelTextColorLocal","btnTopBarText","btnTopBarTextColorLocal","btnPressed","btnPressedColorLocal","btnPressedText","btnPressedTextColorLocal","btnPressedPanelText","btnPressedPanelTextColorLocal","btnPressedTopBarText","btnPressedTopBarTextColorLocal","btnDisabled","btnDisabledColorLocal","btnDisabledText","btnDisabledTextColorLocal","btnDisabledPanelText","btnDisabledPanelTextColorLocal","btnDisabledTopBarText","btnDisabledTopBarTextColorLocal","btnToggled","btnToggledColorLocal","btnToggledText","btnToggledTextColorLocal","btnToggledPanelText","btnToggledPanelTextColorLocal","btnToggledTopBarText","btnToggledTopBarTextColorLocal","tab","tabColorLocal","tabText","tabTextColorLocal","tabActiveText","tabActiveTextColorLocal","border","borderColorLocal","borderOpacityLocal","faint","faintColorLocal","faintLink","faintLinkColorLocal","panelFaint","panelFaintColorLocal","faintOpacityLocal","underlay","underlayColorLocal","underlayOpacityLocal","poll","pollColorLocal","pollText","pollTextColorLocal","icon","iconColorLocal","highlight","highlightColorLocal","highlightText","highlightTextColorLocal","highlightLink","highlightLinkColorLocal","popover","popoverColorLocal","popoverOpacityLocal","popoverText","popoverTextColorLocal","popoverLink","popoverLinkColorLocal","selectedPost","selectedPostColorLocal","selectedPostText","selectedPostTextColorLocal","selectedPostLink","selectedPostLinkColorLocal","selectedMenu","selectedMenuColorLocal","selectedMenuText","selectedMenuTextColorLocal","selectedMenuLink","selectedMenuLinkColorLocal","chatBgColorLocal","chatMessageIncomingBgColorLocal","chatMessageIncomingTextColorLocal","chatMessageIncomingLinkColorLocal","chatMessageIncomingBorderColorLocal","chatMessageOutgoingBgColorLocal","chatMessageOutgoingTextColorLocal","chatMessageOutgoingLinkColorLocal","chatMessageOutgoingBorderColorLocal","hard-min","interface","no-inherit","post","postCode","SettingsModalContent","MutesAndBlocksTab","ThemeTab","isLoggedIn","settingsModalState","onOpen","targetTab","settingsModalTargetTab","tabIndex","tabSwitcher","findIndex","elm","setTab","settings_modal_content_vue_styles_","settings_modal_content_Component","settings_modal_content","side-tab-bar","data-tab-name","fullHeight","__webpack_exports__"],"mappings":"6EAGA,IAAAA,EAAcC,EAAQ,KACtB,iBAAAD,MAAA,EAA4CE,EAAAC,EAASH,EAAA,MACrDA,EAAAI,SAAAF,EAAAG,QAAAL,EAAAI,SAGAE,EADUL,EAAQ,GAAgEM,SAClF,WAAAP,GAAA,4BCRAE,EAAAG,QAA2BJ,EAAQ,EAARA,EAA0D,IAKrFO,KAAA,CAAcN,EAAAC,EAAS,4tBAA4tB,0BCFnvB,IAAAH,EAAcC,EAAQ,KACtB,iBAAAD,MAAA,EAA4CE,EAAAC,EAASH,EAAA,MACrDA,EAAAI,SAAAF,EAAAG,QAAAL,EAAAI,SAGAE,EADUL,EAAQ,GAAgEM,SAClF,WAAAP,GAAA,4BCRAE,EAAAG,QAA2BJ,EAAQ,EAARA,EAA0D,IAKrFO,KAAA,CAAcN,EAAAC,EAAS,oDAAoD,0BCF3E,IAAAH,EAAcC,EAAQ,KACtB,iBAAAD,MAAA,EAA4CE,EAAAC,EAASH,EAAA,MACrDA,EAAAI,SAAAF,EAAAG,QAAAL,EAAAI,SAGAE,EADUL,EAAQ,GAAgEM,SAClF,WAAAP,GAAA,4BCRAE,EAAAG,QAA2BJ,EAAQ,EAARA,EAA0D,IAKrFO,KAAA,CAAcN,EAAAC,EAAS,qDAAqD,0BCF5E,IAAAH,EAAcC,EAAQ,KACtB,iBAAAD,MAAA,EAA4CE,EAAAC,EAASH,EAAA,MACrDA,EAAAI,SAAAF,EAAAG,QAAAL,EAAAI,SAGAE,EADUL,EAAQ,GAAmEM,SACrF,WAAAP,GAAA,4BCRAE,EAAAG,QAA2BJ,EAAQ,EAARA,EAA6D,IAKxFO,KAAA,CAAcN,EAAAC,EAAS,wdAAwd,0BCF/e,IAAAH,EAAcC,EAAQ,KACtB,iBAAAD,MAAA,EAA4CE,EAAAC,EAASH,EAAA,MACrDA,EAAAI,SAAAF,EAAAG,QAAAL,EAAAI,SAGAE,EADUL,EAAQ,GAAgEM,SAClF,WAAAP,GAAA,4BCRAE,EAAAG,QAA2BJ,EAAQ,EAARA,EAA0D,IAKrFO,KAAA,CAAcN,EAAAC,EAAS,wdAAwd,0BCF/e,IAAAH,EAAcC,EAAQ,KACtB,iBAAAD,MAAA,EAA4CE,EAAAC,EAASH,EAAA,MACrDA,EAAAI,SAAAF,EAAAG,QAAAL,EAAAI,SAGAE,EADUL,EAAQ,GAAgEM,SAClF,WAAAP,GAAA,4BCRAE,EAAAG,QAA2BJ,EAAQ,EAARA,EAA0D,IAKrFO,KAAA,CAAcN,EAAAC,EAAS,kHAAkH,0BCFzI,IAAAH,EAAcC,EAAQ,KACtB,iBAAAD,MAAA,EAA4CE,EAAAC,EAASH,EAAA,MACrDA,EAAAI,SAAAF,EAAAG,QAAAL,EAAAI,SAGAE,EADUL,EAAQ,GAAgEM,SAClF,WAAAP,GAAA,4BCRAE,EAAAG,QAA2BJ,EAAQ,EAARA,EAA0D,IAKrFO,KAAA,CAAcN,EAAAC,EAAS,gHAAgH,0BCFvI,IAAAH,EAAcC,EAAQ,KACtB,iBAAAD,MAAA,EAA4CE,EAAAC,EAASH,EAAA,MACrDA,EAAAI,SAAAF,EAAAG,QAAAL,EAAAI,SAGAE,EADUL,EAAQ,GAAgEM,SAClF,WAAAP,GAAA,4BCRAE,EAAAG,QAA2BJ,EAAQ,EAARA,EAA0D,IAKrFO,KAAA,CAAcN,EAAAC,EAAS,8WAA8W,0BCFrY,IAAAH,EAAcC,EAAQ,KACtB,iBAAAD,MAAA,EAA4CE,EAAAC,EAASH,EAAA,MACrDA,EAAAI,SAAAF,EAAAG,QAAAL,EAAAI,SAGAE,EADUL,EAAQ,GAAgEM,SAClF,WAAAP,GAAA,4BCRAE,EAAAG,QAA2BJ,EAAQ,EAARA,EAA0D,IAKrFO,KAAA,CAAcN,EAAAC,EAAS,q0BAAq0B,gDCF51B,IAAAH,EAAcC,EAAQ,KACtB,iBAAAD,MAAA,EAA4CE,EAAAC,EAASH,EAAA,MACrDA,EAAAI,SAAAF,EAAAG,QAAAL,EAAAI,SAGAE,EADUL,EAAQ,GAAsEM,SACxF,WAAAP,GAAA,4BCRAE,EAAAG,QAA2BJ,EAAQ,EAARA,EAAgE,IAK3FO,KAAA,CAAcN,EAAAC,EAAS,6pBAA6pB,0BCFprB,IAAAH,EAAcC,EAAQ,KACtB,iBAAAD,MAAA,EAA4CE,EAAAC,EAASH,EAAA,MACrDA,EAAAI,SAAAF,EAAAG,QAAAL,EAAAI,SAGAE,EADUL,EAAQ,GAAsEM,SACxF,WAAAP,GAAA,4BCRAE,EAAAG,QAA2BJ,EAAQ,EAARA,EAAgE,IAK3FO,KAAA,CAAcN,EAAAC,EAAS,iJAAiJ,0BCFxK,IAAAH,EAAcC,EAAQ,KACtB,iBAAAD,MAAA,EAA4CE,EAAAC,EAASH,EAAA,MACrDA,EAAAI,SAAAF,EAAAG,QAAAL,EAAAI,SAGAE,EADUL,EAAQ,GAAmEM,SACrF,WAAAP,GAAA,4BCRAE,EAAAG,QAA2BJ,EAAQ,EAARA,EAA6D,IAKxFO,KAAA,CAAcN,EAAAC,EAAS,ytDAAytD,0BCFhvD,IAAAH,EAAcC,EAAQ,KACtB,iBAAAD,MAAA,EAA4CE,EAAAC,EAASH,EAAA,MACrDA,EAAAI,SAAAF,EAAAG,QAAAL,EAAAI,SAGAE,EADUL,EAAQ,GAAgEM,SAClF,WAAAP,GAAA,4BCRAE,EAAAG,QAA2BJ,EAAQ,EAARA,EAA0D,IAKrFO,KAAA,CAAcN,EAAAC,EAAS,8PAA8P,0BCFrR,IAAAH,EAAcC,EAAQ,KACtB,iBAAAD,MAAA,EAA4CE,EAAAC,EAASH,EAAA,MACrDA,EAAAI,SAAAF,EAAAG,QAAAL,EAAAI,SAGAE,EADUL,EAAQ,GAAsEM,SACxF,WAAAP,GAAA,4BCRAE,EAAAG,QAA2BJ,EAAQ,EAARA,EAAgE,IAK3FO,KAAA,CAAcN,EAAAC,EAAS,suNAAsuN,0BCF7vN,IAAAH,EAAcC,EAAQ,KACtB,iBAAAD,MAAA,EAA4CE,EAAAC,EAASH,EAAA,MACrDA,EAAAI,SAAAF,EAAAG,QAAAL,EAAAI,SAGAE,EADUL,EAAQ,GAAgEM,SAClF,WAAAP,GAAA,4BCRAE,EAAAG,QAA2BJ,EAAQ,EAARA,EAA0D,IAKrFO,KAAA,CAAcN,EAAAC,EAAS,2oCAA6oC,0BCFpqC,IAAAH,EAAcC,EAAQ,KACtB,iBAAAD,MAAA,EAA4CE,EAAAC,EAASH,EAAA,MACrDA,EAAAI,SAAAF,EAAAG,QAAAL,EAAAI,SAGAE,EADUL,EAAQ,GAAgEM,SAClF,WAAAP,GAAA,4BCRAE,EAAAG,QAA2BJ,EAAQ,EAARA,EAA0D,IAKrFO,KAAA,CAAcN,EAAAC,EAAS,mEAAmE,0BCF1F,IAAAH,EAAcC,EAAQ,KACtB,iBAAAD,MAAA,EAA4CE,EAAAC,EAASH,EAAA,MACrDA,EAAAI,SAAAF,EAAAG,QAAAL,EAAAI,SAGAE,EADUL,EAAQ,GAAgEM,SAClF,WAAAP,GAAA,4BCRAE,EAAAG,QAA2BJ,EAAQ,EAARA,EAA0D,IAKrFO,KAAA,CAAcN,EAAAC,EAAS,gqFAAgqF,0BCFvrF,IAAAH,EAAcC,EAAQ,KACtB,iBAAAD,MAAA,EAA4CE,EAAAC,EAASH,EAAA,MACrDA,EAAAI,SAAAF,EAAAG,QAAAL,EAAAI,SAGAE,EADUL,EAAQ,GAAgEM,SAClF,WAAAP,GAAA,4BCRAE,EAAAG,QAA2BJ,EAAQ,EAARA,EAA0D,IAKrFO,KAAA,CAAcN,EAAAC,EAAS,6NAA6N,0BCFpP,IAAAH,EAAcC,EAAQ,KACtB,iBAAAD,MAAA,EAA4CE,EAAAC,EAASH,EAAA,MACrDA,EAAAI,SAAAF,EAAAG,QAAAL,EAAAI,SAGAE,EADUL,EAAQ,GAAgEM,SAClF,WAAAP,GAAA,4BCRAE,EAAAG,QAA2BJ,EAAQ,EAARA,EAA0D,IAKrFO,KAAA,CAAcN,EAAAC,EAAS,wOAAwO,0BCF/P,IAAAH,EAAcC,EAAQ,KACtB,iBAAAD,MAAA,EAA4CE,EAAAC,EAASH,EAAA,MACrDA,EAAAI,SAAAF,EAAAG,QAAAL,EAAAI,SAGAE,EADUL,EAAQ,GAAgEM,SAClF,WAAAP,GAAA,4BCRAE,EAAAG,QAA2BJ,EAAQ,EAARA,EAA0D,IAKrFO,KAAA,CAAcN,EAAAC,EAAS,wLAAwL,0BCF/M,IAAAH,EAAcC,EAAQ,KACtB,iBAAAD,MAAA,EAA4CE,EAAAC,EAASH,EAAA,MACrDA,EAAAI,SAAAF,EAAAG,QAAAL,EAAAI,SAGAE,EADUL,EAAQ,GAAsEM,SACxF,WAAAP,GAAA,4BCRAE,EAAAG,QAA2BJ,EAAQ,EAARA,EAAgE,IAK3FO,KAAA,CAAcN,EAAAC,EAAS,gHAAgH,2DC+CxHM,EApDE,CACfC,MAAO,CACLC,cAAe,CACbC,KAAMC,SACNC,UAAU,GAEZC,kBAAmB,CACjBH,KAAMI,OADWT,QAAA,WAGf,OAAOU,KAAKC,GAAG,qBAGnBC,eAAgB,CACdP,KAAMI,OADQT,QAAA,WAGZ,OAAOU,KAAKC,GAAG,sBAGnBE,aAAc,CACZR,KAAMI,OADMT,QAAA,WAGV,OAAOU,KAAKC,GAAG,qBAIrBG,KAzBe,WA0Bb,MAAO,CACLC,KAAM,KACNC,OAAO,EACPC,SAAS,EACTC,YAAY,IAGhBC,QAAS,CACPC,OADO,WAELV,KAAKK,KAAOL,KAAKW,MAAMC,MAAMC,MAAM,IAErCC,OAJO,WAIG,IAAAC,EAAAf,KACRA,KAAKgB,UACLhB,KAAKQ,YAAa,EAClBR,KAAKN,cAAcM,KAAKK,MACrBY,KAAK,WAAQF,EAAKR,SAAU,IAD/B,MAES,WAAQQ,EAAKT,OAAQ,IAF9B,QAGW,WAAQS,EAAKP,YAAa,KAEvCQ,QAZO,WAaLhB,KAAKO,SAAU,EACfP,KAAKM,OAAQ,YCvCnB,IAEAY,EAVA,SAAAC,GACEnC,EAAQ,MAyBKoC,EAVCC,OAAAC,EAAA,EAAAD,CACdE,ECjBQ,WAAgB,IAAAC,EAAAxB,KAAayB,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBE,YAAA,YAAuB,CAAAF,EAAA,QAAAA,EAAA,SAAyBG,IAAA,QAAAC,MAAA,CAAmBpC,KAAA,QAAcqC,GAAA,CAAKtB,OAAAc,EAAAd,YAAqBc,EAAAS,GAAA,KAAAT,EAAA,WAAAG,EAAA,KAAyCE,YAAA,+CAAyDF,EAAA,UAAeE,YAAA,kBAAAG,GAAA,CAAkCE,MAAAV,EAAAV,SAAoB,CAAAU,EAAAS,GAAA,SAAAT,EAAAW,GAAAX,EAAA1B,mBAAA,UAAA0B,EAAAS,GAAA,KAAAT,EAAA,QAAAG,EAAA,OAAAA,EAAA,KAAsGE,YAAA,aAAAG,GAAA,CAA6BE,MAAAV,EAAAR,WAAqBQ,EAAAS,GAAA,KAAAN,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAtB,qBAAAsB,EAAA,MAAAG,EAAA,OAAAA,EAAA,KAA2FE,YAAA,aAAAG,GAAA,CAA6BE,MAAAV,EAAAR,WAAqBQ,EAAAS,GAAA,KAAAN,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAArB,mBAAAqB,EAAAY,QACjqB,IDOA,EAaAlB,EATA,KAEA,MAYgC,QEqBjBmB,EA/CE,CACf5C,MAAO,CACL6C,WAAY,CACV3C,KAAMC,SACNC,UAAU,GAEZ0C,SAAU,CACR5C,KAAMI,OACNT,QAAS,cAEXkD,kBAAmB,CACjB7C,KAAMI,OADWT,QAAA,WAGf,OAAOU,KAAKC,GAAG,qBAGnBwC,kBAAmB,CACjB9C,KAAMI,OADWT,QAAA,WAGf,OAAOU,KAAKC,GAAG,0BAIrBG,KAvBe,WAwBb,MAAO,CACLsC,YAAY,IAGhBjC,QAAS,CACPkC,QADO,WACI,IAAA5B,EAAAf,KACTA,KAAK0C,YAAa,EAClB1C,KAAKsC,aACFrB,KAAK,SAAClC,GACL,IAAM6D,EAAiBC,SAASC,cAAc,KAC9CF,EAAeG,aAAa,OAAQ,iCAAmCC,mBAAmBjE,IAC1F6D,EAAeG,aAAa,WAAYhC,EAAKwB,UAC7CK,EAAeK,MAAMC,QAAU,OAC/BL,SAASM,KAAKC,YAAYR,GAC1BA,EAAeV,QACfW,SAASM,KAAKE,YAAYT,GAE1BU,WAAW,WAAQvC,EAAK2B,YAAa,GAAS,UCjCxD,IAEIa,EAVJ,SAAoBpC,GAClBnC,EAAQ,MAyBKwE,EAVCnC,OAAAC,EAAA,EAAAD,CACdoC,ECjBQ,WAAgB,IAAAjC,EAAAxB,KAAayB,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBE,YAAA,YAAuB,CAAAL,EAAA,WAAAG,EAAA,OAAAA,EAAA,KAAqCE,YAAA,gDAA0DL,EAAAS,GAAA,KAAAN,EAAA,QAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAiB,wBAAAd,EAAA,UAAgFE,YAAA,kBAAAG,GAAA,CAAkCE,MAAAV,EAAAmB,UAAqB,CAAAnB,EAAAS,GAAA,SAAAT,EAAAW,GAAAX,EAAAgB,mBAAA,aACpV,IDOY,EAa7Be,EATiB,KAEU,MAYG,gBEsCjBG,EA5Da,CAC1BtD,KAD0B,WAExB,MAAO,CACLuD,UAAW,UACXC,gBAAiB,KAGrBC,QAP0B,WAQxB7D,KAAK8D,OAAOC,SAAS,gBAEvBC,WAAY,CACVxE,WACA6C,WACA4B,cAEFC,SAAU,CACRC,KADQ,WAEN,OAAOnE,KAAK8D,OAAOM,MAAMC,MAAMC,cAGnC7D,QAAS,CACP8D,kBADO,WAEL,OAAOvE,KAAK8D,OAAOM,MAAMI,IAAIC,kBAAkBC,cAAc,CAAEC,GAAI3E,KAAK8D,OAAOM,MAAMC,MAAMC,YAAYK,KACpG1D,KAAKjB,KAAK4E,iCAEfC,iBALO,WAML,OAAO7E,KAAK8D,OAAOM,MAAMI,IAAIC,kBAAkBK,cAC5C7D,KAAKjB,KAAK4E,iCAEfG,cATO,SASQ1E,GACb,OAAOL,KAAK8D,OAAOM,MAAMI,IAAIC,kBAAkBM,cAAc,CAAE1E,SAC5DY,KAAK,SAAC+D,GACL,IAAKA,EACH,MAAM,IAAIC,MAAM,aAIxBC,aAjBO,SAiBO7E,GACZ,OAAOL,KAAK8D,OAAOM,MAAMI,IAAIC,kBAAkBS,aAAa,CAAE7E,SAC3DY,KAAK,SAAC+D,GACL,IAAKA,EACH,MAAM,IAAIC,MAAM,aAIxBL,+BAzBO,SAyByBP,GAE9B,OAAOA,EAAMc,IAAI,SAAChB,GAEhB,OAAIA,GAAQA,EAAKiB,SAGRjB,EAAKkB,YAAc,IAAMC,SAASC,SAEpCpB,EAAKkB,cACXG,KAAK,SCpCCC,EAVCpE,OAAAC,EAAA,EAAAD,CACdqE,ECdQ,WAAgB,IAAAlE,EAAAxB,KAAayB,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBI,MAAA,CAAO4D,MAAAnE,EAAAvB,GAAA,qCAAmD,CAAA0B,EAAA,OAAYE,YAAA,gBAA2B,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,8BAAAuB,EAAAS,GAAA,KAAAN,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,iDAAAuB,EAAAS,GAAA,KAAAN,EAAA,YAAmLI,MAAA,CAAO6D,iBAAApE,EAAAuD,cAAAc,kBAAArE,EAAAvB,GAAA,6BAAA6F,gBAAAtE,EAAAvB,GAAA,oCAAiJ,GAAAuB,EAAAS,GAAA,KAAAN,EAAA,OAA4BE,YAAA,gBAA2B,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,8BAAAuB,EAAAS,GAAA,KAAAN,EAAA,YAAyFI,MAAA,CAAOgE,cAAAvE,EAAA+C,kBAAAhC,SAAA,cAAAyD,sBAAAxE,EAAAvB,GAAA,qCAA4H,GAAAuB,EAAAS,GAAA,KAAAN,EAAA,OAA4BE,YAAA,gBAA2B,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,6BAAAuB,EAAAS,GAAA,KAAAN,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,8CAAAuB,EAAAS,GAAA,KAAAN,EAAA,YAA+KI,MAAA,CAAO6D,iBAAApE,EAAA0D,aAAAW,kBAAArE,EAAAvB,GAAA,4BAAA6F,gBAAAtE,EAAAvB,GAAA,mCAA8I,GAAAuB,EAAAS,GAAA,KAAAN,EAAA,OAA4BE,YAAA,gBAA2B,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,6BAAAuB,EAAAS,GAAA,KAAAN,EAAA,YAAwFI,MAAA,CAAOgE,cAAAvE,EAAAqD,iBAAAtC,SAAA,aAAAyD,sBAAAxE,EAAAvB,GAAA,oCAAyH,MACh6C,IDIY,EAEb,KAEC,KAEU,MAYG,4DErBjBgG,EAAA,CACbxG,MAAO,CACLyG,MAAO,CACLvG,KAAMC,SACNC,UAAU,GAEZsG,OAAQ,CACNxG,KAAMC,UAERwG,YAAa,CACXzG,KAAMI,OACNT,QAAS,cAGbc,KAda,WAeX,MAAO,CACLiG,KAAM,GACNC,QAAS,KACTC,QAAS,GACTC,gBAAgB,IAGpBtC,SAAU,CACRuC,SADQ,WAEN,OAAOzG,KAAKmG,OAASnG,KAAKmG,OAAOnG,KAAKuG,SAAWvG,KAAKuG,UAG1DG,MAAO,CACLL,KADK,SACCM,GACJ3G,KAAK4G,aAAaD,KAGtBlG,QAAS,CACPmG,aADO,SACOP,GAAM,IAAAtF,EAAAf,KAClB6G,aAAa7G,KAAKsG,SAClBtG,KAAKsG,QAAUhD,WAAW,WACxBvC,EAAKwF,QAAU,GACXF,GACFtF,EAAKmF,MAAMG,GAAMpF,KAAK,SAACsF,GAAcxF,EAAKwF,QAAUA,KAxCjC,MA4CzBO,aAVO,WAWL9G,KAAKwG,gBAAiB,GAExBO,eAbO,WAcL/G,KAAKwG,gBAAiB,KCxC5B,IAEIQ,EAVJ,SAAoB7F,GAClBnC,EAAQ,MAyBKiI,EAVC5F,OAAAC,EAAA,EAAAD,CACd4E,ECjBQ,WAAgB,IAAAzE,EAAAxB,KAAayB,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBuF,WAAA,EAAaC,KAAA,gBAAAC,QAAA,kBAAAC,MAAA7F,EAAA,eAAA8F,WAAA,mBAAsGzF,YAAA,eAA4B,CAAAF,EAAA,SAAcuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAA,KAAA8F,WAAA,SAAkEzF,YAAA,oBAAAE,MAAA,CAAyCqE,YAAA5E,EAAA4E,aAA8BmB,SAAA,CAAWF,MAAA7F,EAAA,MAAmBQ,GAAA,CAAKE,MAAAV,EAAAsF,aAAAlG,MAAA,SAAA4G,GAAkDA,EAAAC,OAAAC,YAAsClG,EAAA6E,KAAAmB,EAAAC,OAAAJ,WAA+B7F,EAAAS,GAAA,KAAAT,EAAAgF,gBAAAhF,EAAAiF,SAAAkB,OAAA,EAAAhG,EAAA,OAAwEE,YAAA,uBAAkC,CAAAL,EAAAoG,GAAApG,EAAA,kBAAAqG,GAAuC,OAAArG,EAAAsG,GAAA,gBAA8BD,YAAc,GAAArG,EAAAY,QACjuB,IDOY,EAa7B4E,EATiB,KAEU,MAYG,gBEajBe,EArCG,CAChBtI,MAAO,CAAC,UACRW,KAFgB,WAGd,MAAO,CACL4H,UAAU,IAGd9D,SAAU,CACRC,KADQ,WAEN,OAAOnE,KAAK8D,OAAOmE,QAAQC,SAASlI,KAAKmI,SAE3CC,aAJQ,WAKN,OAAOpI,KAAK8D,OAAOmE,QAAQG,aAAapI,KAAKmI,SAE/CE,QAPQ,WAQN,OAAOrI,KAAKoI,aAAaE,WAG7BtE,WAAY,CACVuE,mBAEF9H,QAAS,CACP+H,YADO,WACQ,IAAAzH,EAAAf,KACbA,KAAKgI,UAAW,EAChBhI,KAAK8D,OAAOC,SAAS,cAAe/D,KAAKmE,KAAKQ,IAAI1D,KAAK,WACrDF,EAAKiH,UAAW,KAGpBS,UAPO,WAOM,IAAAC,EAAA1I,KACXA,KAAKgI,UAAW,EAChBhI,KAAK8D,OAAOC,SAAS,YAAa/D,KAAKmE,KAAKQ,IAAI1D,KAAK,WACnDyH,EAAKV,UAAW,OCzBxB,IAEIW,EAVJ,SAAoBxH,GAClBnC,EAAQ,MAyBK4J,EAVCvH,OAAAC,EAAA,EAAAD,CACdwH,ECjBQ,WAAgB,IAAArH,EAAAxB,KAAayB,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,mBAA6BI,MAAA,CAAOoC,KAAA3C,EAAA2C,OAAiB,CAAAxC,EAAA,OAAYE,YAAA,gCAA2C,CAAAL,EAAA,QAAAG,EAAA,UAA6BE,YAAA,kBAAAE,MAAA,CAAqC+G,SAAAtH,EAAAwG,UAAwBhG,GAAA,CAAKE,MAAAV,EAAAgH,cAAyB,CAAAhH,EAAA,UAAAA,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,6CAAAuB,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,uCAAA0B,EAAA,UAAuLE,YAAA,kBAAAE,MAAA,CAAqC+G,SAAAtH,EAAAwG,UAAwBhG,GAAA,CAAKE,MAAAV,EAAAiH,YAAuB,CAAAjH,EAAA,UAAAA,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,2CAAAuB,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,0CAC1jB,IDOY,EAa7B0I,EATiB,KAEU,MAYG,QEajBI,EArCE,CACftJ,MAAO,CAAC,UACRW,KAFe,WAGb,MAAO,CACL4H,UAAU,IAGd9D,SAAU,CACRC,KADQ,WAEN,OAAOnE,KAAK8D,OAAOmE,QAAQC,SAASlI,KAAKmI,SAE3CC,aAJQ,WAKN,OAAOpI,KAAK8D,OAAOmE,QAAQG,aAAapI,KAAKmI,SAE/Ca,MAPQ,WAQN,OAAOhJ,KAAKoI,aAAaa,SAG7BjF,WAAY,CACVuE,mBAEF9H,QAAS,CACPyI,WADO,WACO,IAAAnI,EAAAf,KACZA,KAAKgI,UAAW,EAChBhI,KAAK8D,OAAOC,SAAS,aAAc/D,KAAKmI,QAAQlH,KAAK,WACnDF,EAAKiH,UAAW,KAGpBmB,SAPO,WAOK,IAAAT,EAAA1I,KACVA,KAAKgI,UAAW,EAChBhI,KAAK8D,OAAOC,SAAS,WAAY/D,KAAKmI,QAAQlH,KAAK,WACjDyH,EAAKV,UAAW,OCzBxB,IAEIoB,EAVJ,SAAoBjI,GAClBnC,EAAQ,MAyBKqK,EAVChI,OAAAC,EAAA,EAAAD,CACdiI,ECjBQ,WAAgB,IAAA9H,EAAAxB,KAAayB,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,mBAA6BI,MAAA,CAAOoC,KAAA3C,EAAA2C,OAAiB,CAAAxC,EAAA,OAAYE,YAAA,+BAA0C,CAAAL,EAAA,MAAAG,EAAA,UAA2BE,YAAA,kBAAAE,MAAA,CAAqC+G,SAAAtH,EAAAwG,UAAwBhG,GAAA,CAAKE,MAAAV,EAAA0H,aAAwB,CAAA1H,EAAA,UAAAA,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,4CAAAuB,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,sCAAA0B,EAAA,UAAqLE,YAAA,kBAAAE,MAAA,CAAqC+G,SAAAtH,EAAAwG,UAAwBhG,GAAA,CAAKE,MAAAV,EAAA2H,WAAsB,CAAA3H,EAAA,UAAAA,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,0CAAAuB,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,yCACnjB,IDOY,EAa7BmJ,EATiB,KAEU,MAYG,gBEDjBG,EAvBQ,CACrB9J,MAAO,CAAC,UACRuE,WAAY,CACVwF,oBAEFtF,SAAU,CACRC,KADQ,WAEN,OAAOnE,KAAK8D,OAAOM,MAAMC,MAAMC,aAEjC0E,MAJQ,WAKN,OAAOhJ,KAAKmE,KAAKsF,YAAYC,SAAS1J,KAAK2J,UAG/ClJ,QAAS,CACPmJ,aADO,WAEL,OAAO5J,KAAK8D,OAAOC,SAAS,eAAgB/D,KAAK2J,SAEnDE,WAJO,WAKL,OAAO7J,KAAK8D,OAAOC,SAAS,aAAc/D,KAAK2J,WCZrD,IAEIG,EAVJ,SAAoB3I,GAClBnC,EAAQ,MAyBK+K,EAVC1I,OAAAC,EAAA,EAAAD,CACd2I,ECjBQ,WAAgB,IAAAxI,EAAAxB,KAAayB,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBE,YAAA,oBAA+B,CAAAF,EAAA,OAAYE,YAAA,2BAAsC,CAAAL,EAAAS,GAAA,SAAAT,EAAAW,GAAAX,EAAAmI,QAAA,UAAAnI,EAAAS,GAAA,KAAAT,EAAA,MAAAG,EAAA,kBAA4FE,YAAA,kBAAAE,MAAA,CAAqCG,MAAAV,EAAAoI,eAA0B,CAAApI,EAAAS,GAAA,SAAAT,EAAAW,GAAAX,EAAAvB,GAAA,sCAAA0B,EAAA,YAAqFsI,KAAA,YAAgB,CAAAzI,EAAAS,GAAA,WAAAT,EAAAW,GAAAX,EAAAvB,GAAA,qDAAA0B,EAAA,kBAA4GE,YAAA,kBAAAE,MAAA,CAAqCG,MAAAV,EAAAqI,aAAwB,CAAArI,EAAAS,GAAA,SAAAT,EAAAW,GAAAX,EAAAvB,GAAA,oCAAA0B,EAAA,YAAmFsI,KAAA,YAAgB,CAAAzI,EAAAS,GAAA,WAAAT,EAAAW,GAAAX,EAAAvB,GAAA,wDACprB,IDOY,EAa7B6J,EATiB,KAEU,MAYG,QEuCjBI,EA9DQ,CACrBlG,WAAY,CACVmG,aACAlG,cAEFxE,MAAO,CACL2K,MAAO,CACLzK,KAAM0K,MACN/K,QAAS,iBAAM,KAEjBgL,OAAQ,CACN3K,KAAMC,SACNN,QAAS,SAAAuI,GAAI,OAAIA,EAAKlD,MAG1BvE,KAfqB,WAgBnB,MAAO,CACLmK,SAAU,KAGdrG,SAAU,CACRsG,QADQ,WAEN,OAAOxK,KAAKoK,MAAMjF,IAAInF,KAAKsK,SAE7BG,iBAJQ,WAIY,IAAA1J,EAAAf,KAClB,OAAOA,KAAKwK,QAAQrE,OAAO,SAAAuE,GAAG,OAAoC,IAAhC3J,EAAKwJ,SAASI,QAAQD,MAE1DE,YAPQ,WAQN,OAAO5K,KAAKyK,iBAAiB9C,SAAW3H,KAAKoK,MAAMzC,QAErDkD,aAVQ,WAWN,OAAwC,IAAjC7K,KAAKyK,iBAAiB9C,QAE/BmD,aAbQ,WAcN,OAAQ9K,KAAK4K,cAAgB5K,KAAK6K,eAGtCpK,QAAS,CACPsK,WADO,SACKlD,GACV,OAA6D,IAAtD7H,KAAKyK,iBAAiBE,QAAQ3K,KAAKsK,OAAOzC,KAEnDmD,OAJO,SAICC,EAASpD,GACf,IAAM6C,EAAM1K,KAAKsK,OAAOzC,GAEpBoD,IADejL,KAAK+K,WAAWL,KAE7BO,EACFjL,KAAKuK,SAAShL,KAAKmL,GAEnB1K,KAAKuK,SAASW,OAAOlL,KAAKuK,SAASI,QAAQD,GAAM,KAIvDS,UAfO,SAeI9D,GAEPrH,KAAKuK,SADHlD,EACcrH,KAAKwK,QAAQY,MAAM,GAEnB,MCnDxB,IAEIC,EAVJ,SAAoBlK,GAClBnC,EAAQ,MAyBKsM,EAVCjK,OAAAC,EAAA,EAAAD,CACdkK,ECjBQ,WAAgB,IAAA/J,EAAAxB,KAAayB,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBE,YAAA,mBAA8B,CAAAL,EAAA4I,MAAAzC,OAAA,EAAAhG,EAAA,OAAmCE,YAAA,0BAAqC,CAAAF,EAAA,OAAYE,YAAA,oCAA+C,CAAAF,EAAA,YAAiBI,MAAA,CAAOkJ,QAAAzJ,EAAAoJ,YAAAY,cAAAhK,EAAAsJ,cAA2D9I,GAAA,CAAKtB,OAAAc,EAAA2J,YAAwB,CAAA3J,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,iDAAAuB,EAAAS,GAAA,KAAAN,EAAA,OAA2GE,YAAA,kCAA6C,CAAAL,EAAAsG,GAAA,eAAwByC,SAAA/I,EAAAiJ,oBAAgC,KAAAjJ,EAAAY,KAAAZ,EAAAS,GAAA,KAAAN,EAAA,QAAwCI,MAAA,CAAOqI,MAAA5I,EAAA4I,MAAAqB,UAAAjK,EAAA8I,QAAuCoB,YAAAlK,EAAAmK,GAAA,EAAsBjB,IAAA,OAAAkB,GAAA,SAAA9J,GACvrB,IAAA+F,EAAA/F,EAAA+F,KACA,OAAAlG,EAAA,OAAkBE,YAAA,6BAAAgK,MAAA,CAAgDC,sCAAAtK,EAAAuJ,WAAAlD,KAA+D,CAAAlG,EAAA,OAAYE,YAAA,oCAA+C,CAAAF,EAAA,YAAiBI,MAAA,CAAOkJ,QAAAzJ,EAAAuJ,WAAAlD,IAA+B7F,GAAA,CAAKtB,OAAA,SAAAuK,GAA6B,OAAAzJ,EAAAwJ,OAAAC,EAAApD,QAAsC,GAAArG,EAAAS,GAAA,KAAAT,EAAAsG,GAAA,aAAsCD,UAAY,OAAQ,UAAa,CAAArG,EAAAS,GAAA,KAAAN,EAAA,YAA6BsI,KAAA,SAAa,CAAAzI,EAAAsG,GAAA,sBACzZ,IDKY,EAa7BuD,EATiB,KAEU,MAYG,wrBErBhC,IA8EeU,EA9EU,SAAAC,GAAA,IACvBC,EADuBD,EACvBC,MACAC,EAFuBF,EAEvBE,OAFuBC,EAAAH,EAGvBI,qBAHuB,IAAAD,EAGP,UAHOA,EAAAE,EAAAL,EAIvBM,2BAJuB,IAAAD,EAID,GAJCA,EAAA,OAKnB,SAACE,GACL,IACM9M,EADgB4B,OAAOmL,KAAKC,YAAkBF,IACxBpG,OAAO,SAAAuG,GAAC,OAAIA,IAAMN,IAAeO,OAAOL,GAEpE,OAAOM,IAAIC,UAAU,mBAAoB,CACvCpN,MAAK,GAAAkN,OAAAG,IACArN,GADA,CAEH,YAEFW,KALuC,WAMrC,MAAO,CACL2M,SAAS,EACTzM,OAAO,IAGX4D,SAAU,CACR8I,YADQ,WAEN,OAAOd,EAAOlM,KAAKiN,OAAQjN,KAAK8D,UAGpCD,QAhBuC,YAiBjC7D,KAAKkN,SAAWC,IAAQnN,KAAKgN,eAC/BhN,KAAKoN,aAGT3M,QAAS,CACP2M,UADO,WACM,IAAArM,EAAAf,KACNA,KAAK+M,UACR/M,KAAK+M,SAAU,EACf/M,KAAKM,OAAQ,EACb2L,EAAMjM,KAAKiN,OAAQjN,KAAK8D,QACrB7C,KAAK,WACJF,EAAKgM,SAAU,IAFnB,MAIS,WACLhM,EAAKT,OAAQ,EACbS,EAAKgM,SAAU,OAKzBM,OArCuC,SAqC/BC,GACN,GAAKtN,KAAKM,OAAUN,KAAK+M,QAkBvB,OAAAO,EAAA,OAAAzB,MACa,6BADb,CAEK7L,KAAKM,MAALgN,EAAA,KAAAtL,GAAA,CAAAE,MACelC,KAAKoN,WADpBvB,MACqC,eADrC,CACoD7L,KAAKC,GAAG,2BAD5DqN,EAAA,KAAAzB,MAEY,8BArBjB,IAAMpM,EAAQ,CACZA,MAAK8N,EAAA,GACAvN,KAAKiN,OADLO,IAAA,GAEFpB,EAAgBpM,KAAKgN,cAExBhL,GAAIhC,KAAKyN,WACT/B,YAAa1L,KAAK0N,cAEdC,EAAWtM,OAAOuM,QAAQ5N,KAAK6N,QAAQ1I,IAAI,SAAA2I,GAAA,IAAAC,EAAAC,IAAAF,EAAA,GAAEpD,EAAFqD,EAAA,GAAO1G,EAAP0G,EAAA,UAAkBT,EAAE,WAAY,CAAErD,KAAMS,GAAOrD,KAChG,OAAAiG,EAAA,OAAAzB,MACa,qBADb,CAAAyB,EAAAf,EAAA0B,IAAA,IAE0BxO,IAF1B,CAGOkO,WCpDTO,EAAYnC,EAAiB,CACjCE,MAAO,SAACxM,EAAOqE,GAAR,OAAmBA,EAAOC,SAAS,gBAC1CmI,OAAQ,SAACzM,EAAOqE,GAAR,OAAmBqK,IAAIrK,EAAOM,MAAMC,MAAMC,YAAa,WAAY,KAC3E8H,cAAe,SAHCL,CAIf7B,GAEGkE,GAAWrC,EAAiB,CAChCE,MAAO,SAACxM,EAAOqE,GAAR,OAAmBA,EAAOC,SAAS,eAC1CmI,OAAQ,SAACzM,EAAOqE,GAAR,OAAmBqK,IAAIrK,EAAOM,MAAMC,MAAMC,YAAa,UAAW,KAC1E8H,cAAe,SAHAL,CAId7B,GAEGmE,GAAiBtC,EAAiB,CACtCE,MAAO,SAACxM,EAAOqE,GAAR,OAAmBA,EAAOC,SAAS,qBAC1CmI,OAAQ,SAACzM,EAAOqE,GAAR,OAAmBqK,IAAIrK,EAAOM,MAAMC,MAAMC,YAAa,cAAe,KAC9E8H,cAAe,SAHML,CAIpB7B,GA0GYoE,GAxGQ,CACrBlO,KADqB,WAEnB,MAAO,CACLuD,UAAW,YAGfE,QANqB,WAOnB7D,KAAK8D,OAAOC,SAAS,eACrB/D,KAAK8D,OAAOC,SAAS,oBAEvBC,WAAY,CACVuK,gBACAL,YACAE,YACAC,kBACAtG,YACAgB,WACAQ,iBACAC,mBACAgF,cACAvK,cAEFC,SAAU,CACRuK,aADQ,WAEN,OAAOzO,KAAK8D,OAAOM,MAAMsK,SAASD,cAEpCtK,KAJQ,WAKN,OAAOnE,KAAK8D,OAAOM,MAAMC,MAAMC,cAGnC7D,QAAS,CACPsE,cADO,SACQ1E,GACb,OAAOL,KAAK8D,OAAOM,MAAMI,IAAIC,kBAAkBM,cAAc,CAAE1E,SAC5DY,KAAK,SAAC+D,GACL,IAAKA,EACH,MAAM,IAAIC,MAAM,aAIxBC,aATO,SASO7E,GACZ,OAAOL,KAAK8D,OAAOM,MAAMI,IAAIC,kBAAkBS,aAAa,CAAE7E,SAC3DY,KAAK,SAAC+D,GACL,IAAKA,EACH,MAAM,IAAIC,MAAM,aAIxBL,+BAjBO,SAiByBP,GAE9B,OAAOA,EAAMc,IAAI,SAAChB,GAEhB,OAAIA,GAAQA,EAAKiB,SAGRjB,EAAKkB,YAAc,IAAMC,SAASC,SAEpCpB,EAAKkB,cACXG,KAAK,OAEVmJ,YA7BO,SA6BMC,GACX5O,KAAK2D,UAAYiL,GAEnBC,qBAhCO,SAgCeC,GAAS,IAAA/N,EAAAf,KAC7B,OAAO+O,IAAOD,EAAS,SAAC3G,GAEtB,OADqBpH,EAAK+C,OAAOmE,QAAQG,aAAarH,EAAKoH,QACvCG,UAAYH,IAAWpH,EAAKoD,KAAKQ,MAGzDqK,mBAtCO,SAsCaF,GAAS,IAAApG,EAAA1I,KAC3B,OAAO+O,IAAOD,EAAS,SAAC3G,GAEtB,OADqBO,EAAK5E,OAAOmE,QAAQG,aAAaM,EAAKP,QACvCc,QAAUd,IAAWO,EAAKvE,KAAKQ,MAGvDsK,aA5CO,SA4CO/I,GACZ,OAAOlG,KAAK8D,OAAOC,SAAS,cAAe,CAAEmC,UAC1CjF,KAAK,SAACoD,GAAD,OAAWc,IAAId,EAAO,SAEhC6K,WAhDO,SAgDKC,GACV,OAAOnP,KAAK8D,OAAOC,SAAS,aAAcoL,IAE5CC,aAnDO,SAmDOD,GACZ,OAAOnP,KAAK8D,OAAOC,SAAS,eAAgBoL,IAE9CE,UAtDO,SAsDIF,GACT,OAAOnP,KAAK8D,OAAOC,SAAS,YAAaoL,IAE3CG,YAzDO,SAyDMH,GACX,OAAOnP,KAAK8D,OAAOC,SAAS,cAAeoL,IAE7CI,qBA5DO,SA4DeC,GAAM,IAAAC,EAAAzP,KAC1B,OAAOwP,EAAKrJ,OAAO,SAAAuJ,GAAG,OAAKD,EAAKtL,KAAKsF,YAAYC,SAASgG,MAE5DC,kBA/DO,SA+DYzJ,GAAO,IAAA0J,EAAA5P,KACxB,OAAO,IAAI6P,QAAQ,SAACC,EAASf,GAC3Be,EAAQF,EAAKnB,aAAatI,OAAO,SAAAuJ,GAAG,OAAIA,EAAIK,cAAcrG,SAASxD,SAGvE8J,cApEO,SAoEQC,GACb,OAAOjQ,KAAK8D,OAAOC,SAAS,gBAAiBkM,MC1HnD,IAEIC,GAVJ,SAAoB/O,GAClBnC,EAAQ,MAyBKmR,GAVC9O,OAAAC,EAAA,EAAAD,CACd+O,GCjBQ,WAAgB,IAAA5O,EAAAxB,KAAayB,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,gBAA0BE,YAAA,uBAAAE,MAAA,CAA0CsO,mBAAA,IAAwB,CAAA1O,EAAA,OAAYI,MAAA,CAAO4D,MAAAnE,EAAAvB,GAAA,yBAAuC,CAAA0B,EAAA,OAAYE,YAAA,sBAAiC,CAAAF,EAAA,eAAoBI,MAAA,CAAOoE,OAAA3E,EAAAqN,qBAAA3I,MAAA1E,EAAAyN,aAAA7I,YAAA5E,EAAAvB,GAAA,kCAAiHyL,YAAAlK,EAAAmK,GAAA,EAAsBjB,IAAA,UAAAkB,GAAA,SAAA0E,GAA+B,OAAA3O,EAAA,aAAuBI,MAAA,CAAOwO,UAAAD,EAAAzI,eAA0B,GAAArG,EAAAS,GAAA,KAAAN,EAAA,aAAkCI,MAAA,CAAOmL,SAAA,EAAAzB,UAAA,SAAAvM,GAAuC,OAAAA,IAAawM,YAAAlK,EAAAmK,GAAA,EAAsBjB,IAAA,SAAAkB,GAAA,SAAA9J,GACxoB,IAAAyI,EAAAzI,EAAAyI,SACA,OAAA5I,EAAA,OAAkBE,YAAA,gBAA2B,CAAA0I,EAAA5C,OAAA,EAAAhG,EAAA,kBAA6CE,YAAA,qCAAAE,MAAA,CAAwDG,MAAA,WAAqB,OAAAV,EAAA0N,WAAA3E,MAAqC,CAAA/I,EAAAS,GAAA,iBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,sCAAA0B,EAAA,YAA6FsI,KAAA,YAAgB,CAAAzI,EAAAS,GAAA,mBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,qDAAAuB,EAAAY,KAAAZ,EAAAS,GAAA,KAAAsI,EAAA5C,OAAA,EAAAhG,EAAA,kBAA+JE,YAAA,kBAAAE,MAAA,CAAqCG,MAAA,WAAqB,OAAAV,EAAA4N,aAAA7E,MAAuC,CAAA/I,EAAAS,GAAA,iBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,wCAAA0B,EAAA,YAA+FsI,KAAA,YAAgB,CAAAzI,EAAAS,GAAA,mBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,uDAAAuB,EAAAY,MAAA,MAAgH,CAAEsI,IAAA,OAAAkB,GAAA,SAAA9J,GAC1xB,IAAA+F,EAAA/F,EAAA+F,KACA,OAAAlG,EAAA,aAAwBI,MAAA,CAAOwO,UAAA1I,WAAuB,CAAArG,EAAAS,GAAA,KAAAT,EAAAS,GAAA,KAAAN,EAAA,YAAyCsI,KAAA,SAAa,CAAAzI,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,6CAAAuB,EAAAS,GAAA,KAAAN,EAAA,OAAuGI,MAAA,CAAO4D,MAAAnE,EAAAvB,GAAA,wBAAsC,CAAA0B,EAAA,gBAAAA,EAAA,OAA+BI,MAAA,CAAO4D,MAAA,UAAiB,CAAAhE,EAAA,OAAYE,YAAA,sBAAiC,CAAAF,EAAA,eAAoBI,MAAA,CAAOoE,OAAA3E,EAAAwN,mBAAA9I,MAAA1E,EAAAyN,aAAA7I,YAAA5E,EAAAvB,GAAA,iCAA8GyL,YAAAlK,EAAAmK,GAAA,EAAsBjB,IAAA,UAAAkB,GAAA,SAAA0E,GAA+B,OAAA3O,EAAA,YAAsBI,MAAA,CAAOwO,UAAAD,EAAAzI,eAA0B,GAAArG,EAAAS,GAAA,KAAAN,EAAA,YAAiCI,MAAA,CAAOmL,SAAA,EAAAzB,UAAA,SAAAvM,GAAuC,OAAAA,IAAawM,YAAAlK,EAAAmK,GAAA,EAAsBjB,IAAA,SAAAkB,GAAA,SAAA9J,GAC3sB,IAAAyI,EAAAzI,EAAAyI,SACA,OAAA5I,EAAA,OAAkBE,YAAA,gBAA2B,CAAA0I,EAAA5C,OAAA,EAAAhG,EAAA,kBAA6CE,YAAA,kBAAAE,MAAA,CAAqCG,MAAA,WAAqB,OAAAV,EAAA6N,UAAA9E,MAAoC,CAAA/I,EAAAS,GAAA,qBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,yCAAA0B,EAAA,YAAoGsI,KAAA,YAAgB,CAAAzI,EAAAS,GAAA,uBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,wDAAAuB,EAAAY,KAAAZ,EAAAS,GAAA,KAAAsI,EAAA5C,OAAA,EAAAhG,EAAA,kBAAsKE,YAAA,kBAAAE,MAAA,CAAqCG,MAAA,WAAqB,OAAAV,EAAA8N,YAAA/E,MAAsC,CAAA/I,EAAAS,GAAA,qBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,2CAAA0B,EAAA,YAAsGsI,KAAA,YAAgB,CAAAzI,EAAAS,GAAA,uBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,0DAAAuB,EAAAY,MAAA,MAAuH,CAAEsI,IAAA,OAAAkB,GAAA,SAAA9J,GACjyB,IAAA+F,EAAA/F,EAAA+F,KACA,OAAAlG,EAAA,YAAuBI,MAAA,CAAOwO,UAAA1I,WAAuB,CAAArG,EAAAS,GAAA,KAAAT,EAAAS,GAAA,KAAAN,EAAA,YAAyCsI,KAAA,SAAa,CAAAzI,EAAAS,GAAA,iBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,gDAAAuB,EAAAS,GAAA,KAAAN,EAAA,OAA8GI,MAAA,CAAO4D,MAAAnE,EAAAvB,GAAA,2BAAyC,CAAA0B,EAAA,OAAYE,YAAA,oBAA+B,CAAAF,EAAA,eAAoBI,MAAA,CAAOoE,OAAA3E,EAAA+N,qBAAArJ,MAAA1E,EAAAmO,kBAAAvJ,YAAA5E,EAAAvB,GAAA,kCAAsHyL,YAAAlK,EAAAmK,GAAA,EAAsBjB,IAAA,UAAAkB,GAAA,SAAA0E,GAA+B,OAAA3O,EAAA,kBAA4BI,MAAA,CAAO4H,OAAA2G,EAAAzI,eAAyB,GAAArG,EAAAS,GAAA,KAAAN,EAAA,kBAAuCI,MAAA,CAAOmL,SAAA,EAAAzB,UAAA,SAAAvM,GAAuC,OAAAA,IAAawM,YAAAlK,EAAAmK,GAAA,EAAsBjB,IAAA,SAAAkB,GAAA,SAAA9J,GAC9qB,IAAAyI,EAAAzI,EAAAyI,SACA,OAAA5I,EAAA,OAAkBE,YAAA,gBAA2B,CAAA0I,EAAA5C,OAAA,EAAAhG,EAAA,kBAA6CE,YAAA,kBAAAE,MAAA,CAAqCG,MAAA,WAAqB,OAAAV,EAAAwO,cAAAzF,MAAwC,CAAA/I,EAAAS,GAAA,qBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,kDAAA0B,EAAA,YAA6GsI,KAAA,YAAgB,CAAAzI,EAAAS,GAAA,uBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,iEAAAuB,EAAAY,MAAA,MAA8H,CAAEsI,IAAA,OAAAkB,GAAA,SAAA9J,GACzb,IAAA+F,EAAA/F,EAAA+F,KACA,OAAAlG,EAAA,kBAA6BI,MAAA,CAAO4H,OAAA9B,WAAsB,CAAArG,EAAAS,GAAA,KAAAT,EAAAS,GAAA,KAAAN,EAAA,YAAyCsI,KAAA,SAAa,CAAAzI,EAAAS,GAAA,iBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,yDAC7F,IDLY,EAa7BiQ,GATiB,KAEU,MAYG,QEAjBM,GAxBU,CACvBpQ,KADuB,WAErB,MAAO,CACLuD,UAAW,UACX8M,qBAAsBzQ,KAAK8D,OAAOM,MAAMC,MAAMC,YAAYoM,sBAC1D9M,gBAAiB,KAGrBI,WAAY,CACVC,cAEFC,SAAU,CACRC,KADQ,WAEN,OAAOnE,KAAK8D,OAAOM,MAAMC,MAAMC,cAGnC7D,QAAS,CACPkQ,2BADO,WAEL3Q,KAAK8D,OAAOM,MAAMI,IAAIC,kBACnBkM,2BAA2B,CAAEC,SAAU5Q,KAAKyQ,0BCEtCI,GAVCxP,OAAAC,EAAA,EAAAD,CACdyP,GCdQ,WAAgB,IAAAtP,EAAAxB,KAAayB,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBI,MAAA,CAAO4D,MAAAnE,EAAAvB,GAAA,4BAA0C,CAAA0B,EAAA,OAAYE,YAAA,gBAA2B,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,6CAAAuB,EAAAS,GAAA,KAAAN,EAAA,KAAAA,EAAA,YAAgHoP,MAAA,CAAO1J,MAAA7F,EAAAiP,qBAAA,qBAAAO,SAAA,SAAAC,GAA+EzP,EAAA0P,KAAA1P,EAAAiP,qBAAA,uBAAAQ,IAAgE3J,WAAA,8CAAyD,CAAA9F,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,2EAAAuB,EAAAS,GAAA,KAAAN,EAAA,OAAqIE,YAAA,gBAA2B,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,6CAAAuB,EAAAS,GAAA,KAAAN,EAAA,KAAAA,EAAA,YAAgHoP,MAAA,CAAO1J,MAAA7F,EAAAiP,qBAAA,2BAAAO,SAAA,SAAAC,GAAqFzP,EAAA0P,KAAA1P,EAAAiP,qBAAA,6BAAAQ,IAAsE3J,WAAA,oDAA+D,CAAA9F,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,iFAAAuB,EAAAS,GAAA,KAAAN,EAAA,OAA2IE,YAAA,gBAA2B,CAAAF,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,mCAAAuB,EAAAS,GAAA,KAAAN,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,oCAAAuB,EAAAS,GAAA,KAAAN,EAAA,UAAwKE,YAAA,kBAAAG,GAAA,CAAkCE,MAAAV,EAAAmP,6BAAwC,CAAAnP,EAAAS,GAAA,WAAAT,EAAAW,GAAAX,EAAAvB,GAAA,oCACv3C,IDIY,EAEb,KAEC,KAEU,MAYG,ynBEjBhC,IAmDekR,GAnDc,kBAAAC,GAAA,CAC3BjN,KAD2B,WAEzB,OAAOnE,KAAK8D,OAAOM,MAAMC,MAAMC,cAG9B+M,KACAlL,OAAO,SAAAuE,GAAG,OAAI4G,KAAsB5H,SAASgB,KAC7CvF,IAAI,SAAAuF,GAAG,MAAI,CACVA,EAAM,eACN,WACE,OAAO1K,KAAK8D,OAAOmE,QAAQsJ,sBAAsB7G,OAGpD8G,OAAO,SAACC,EAADzF,GAAA,IAAA8B,EAAAE,IAAAhC,EAAA,GAAOtB,EAAPoD,EAAA,GAAYzG,EAAZyG,EAAA,UAAAsD,GAAA,GAA6BK,EAA7BjE,IAAA,GAAmC9C,EAAMrD,KAAU,IAblC,GAcxBgK,KACAlL,OAAO,SAAAuE,GAAG,OAAK4G,KAAsB5H,SAASgB,KAC9CvF,IAAI,SAAAuF,GAAG,MAAI,CACVA,EAAM,iBACN,WACE,OAAO1K,KAAKC,GAAG,mBAAqBD,KAAK8D,OAAOmE,QAAQsJ,sBAAsB7G,QAGjF8G,OAAO,SAACC,EAAD1D,GAAA,IAAA2D,EAAA1D,IAAAD,EAAA,GAAOrD,EAAPgH,EAAA,GAAYrK,EAAZqK,EAAA,UAAAN,GAAA,GAA6BK,EAA7BjE,IAAA,GAAmC9C,EAAMrD,KAAU,IAtBlC,GAwBxBhG,OAAOmL,KAAKmF,MACZxM,IAAI,SAAAuF,GAAG,MAAI,CAACA,EAAK,CAChByD,IADgB,WACP,OAAOnO,KAAK8D,OAAOmE,QAAQ2J,aAAalH,IACjDmH,IAFgB,SAEXxK,GACHrH,KAAK8D,OAAOC,SAAS,YAAa,CAAEoD,KAAMuD,EAAKrD,eAGlDmK,OAAO,SAACC,EAADK,GAAA,IAAAC,EAAA/D,IAAA8D,EAAA,GAAOpH,EAAPqH,EAAA,GAAY1K,EAAZ0K,EAAA,UAAAX,GAAA,GAA6BK,EAA7BjE,IAAA,GAAmC9C,EAAMrD,KAAU,IA/BlC,CAiC3B2K,gBAAiB,CACf7D,IADe,WACN,OAAOnO,KAAK8D,OAAOmE,QAAQ2J,aAAaI,iBACjDH,IAFe,SAEVxK,GAAO,IAAAtG,EAAAf,MACMqH,EACZrH,KAAK8D,OAAOC,SAAS,sBACrB/D,KAAK8D,OAAOC,SAAS,wBAEjB9C,KAAK,WACXF,EAAK+C,OAAOC,SAAS,YAAa,CAAEoD,KAAM,kBAAmBE,YAD/D,MAES,SAAC4K,GACRC,QAAQ5R,MAAM,4CAA6C2R,GAC3DlR,EAAK+C,OAAOC,SAAS,uBACrBhD,EAAK+C,OAAOC,SAAS,YAAa,CAAEoD,KAAM,kBAAmBE,OAAO,wOC9C5E,IAyCe8K,GAzCM,CACnB/R,KADmB,WAEjB,MAAO,CACLgS,qBAAsBpS,KAAK8D,OAAOmE,QAAQ2J,aAAaS,UAAU7M,KAAK,QAG1ExB,WAAY,CACVC,cAEFC,wWAAUoO,CAAA,GACLnB,KADG,CAENoB,gBAAiB,CACfpE,IADe,WAEb,OAAOnO,KAAKoS,sBAEdP,IAJe,SAIVxK,GACHrH,KAAKoS,qBAAuB/K,EAC5BrH,KAAK8D,OAAOC,SAAS,YAAa,CAChCoD,KAAM,YACNE,MAAOmL,KAAOnL,EAAMoL,MAAM,MAAO,SAACC,GAAD,OAAUC,KAAKD,GAAM/K,OAAS,UAMvEjB,MAAO,CACLkM,uBAAwB,CACtBC,QADsB,SACbxL,GACPrH,KAAK8D,OAAOC,SAAS,YAAa,CAChCoD,KAAM,yBACNE,MAAOrH,KAAK8D,OAAOmE,QAAQ2J,aAAagB,0BAG5CE,MAAM,GAERC,gBAVK,WAWH/S,KAAK8D,OAAOC,SAAS,oBClBZiP,GAVC3R,OAAAC,EAAA,EAAAD,CACd4R,GCdQ,WAAgB,IAAAzR,EAAAxB,KAAayB,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBI,MAAA,CAAO4D,MAAAnE,EAAAvB,GAAA,wBAAsC,CAAA0B,EAAA,OAAYE,YAAA,gBAA2B,CAAAF,EAAA,OAAYE,YAAA,mBAA8B,CAAAF,EAAA,QAAaE,YAAA,SAAoB,CAAAL,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,wCAAAuB,EAAAS,GAAA,KAAAN,EAAA,MAAoFE,YAAA,eAA0B,CAAAF,EAAA,MAAAA,EAAA,YAA0BoP,MAAA,CAAO1J,MAAA7F,EAAAoR,uBAAA,MAAA5B,SAAA,SAAAC,GAAkEzP,EAAA0P,KAAA1P,EAAAoR,uBAAA,QAAA3B,IAAmD3J,WAAA,iCAA4C,CAAA9F,EAAAS,GAAA,iBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,iEAAAuB,EAAAS,GAAA,KAAAN,EAAA,MAAAA,EAAA,YAA6IoP,MAAA,CAAO1J,MAAA7F,EAAAoR,uBAAA,QAAA5B,SAAA,SAAAC,GAAoEzP,EAAA0P,KAAA1P,EAAAoR,uBAAA,UAAA3B,IAAqD3J,WAAA,mCAA8C,CAAA9F,EAAAS,GAAA,iBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,mEAAAuB,EAAAS,GAAA,KAAAN,EAAA,MAAAA,EAAA,YAA+IoP,MAAA,CAAO1J,MAAA7F,EAAAoR,uBAAA,QAAA5B,SAAA,SAAAC,GAAoEzP,EAAA0P,KAAA1P,EAAAoR,uBAAA,UAAA3B,IAAqD3J,WAAA,mCAA8C,CAAA9F,EAAAS,GAAA,iBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,mEAAAuB,EAAAS,GAAA,KAAAN,EAAA,MAAAA,EAAA,YAA+IoP,MAAA,CAAO1J,MAAA7F,EAAAoR,uBAAA,SAAA5B,SAAA,SAAAC,GAAqEzP,EAAA0P,KAAA1P,EAAAoR,uBAAA,WAAA3B,IAAsD3J,WAAA,oCAA+C,CAAA9F,EAAAS,GAAA,iBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,oEAAAuB,EAAAS,GAAA,KAAAN,EAAA,MAAAA,EAAA,YAAgJoP,MAAA,CAAO1J,MAAA7F,EAAAoR,uBAAA,MAAA5B,SAAA,SAAAC,GAAkEzP,EAAA0P,KAAA1P,EAAAoR,uBAAA,QAAA3B,IAAmD3J,WAAA,iCAA4C,CAAA9F,EAAAS,GAAA,iBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,iEAAAuB,EAAAS,GAAA,KAAAN,EAAA,MAAAA,EAAA,YAA6IoP,MAAA,CAAO1J,MAAA7F,EAAAoR,uBAAA,eAAA5B,SAAA,SAAAC,GAA2EzP,EAAA0P,KAAA1P,EAAAoR,uBAAA,iBAAA3B,IAA4D3J,WAAA,0CAAqD,CAAA9F,EAAAS,GAAA,iBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,+EAAAuB,EAAAS,GAAA,KAAAN,EAAA,OAAAH,EAAAS,GAAA,WAAAT,EAAAW,GAAAX,EAAAvB,GAAA,6CAAA0B,EAAA,SAAsOE,YAAA,SAAAE,MAAA,CAA4BmR,IAAA,oBAAyB,CAAAvR,EAAA,UAAeuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAA,gBAAA8F,WAAA,oBAAwFvF,MAAA,CAAS4C,GAAA,mBAAuB3C,GAAA,CAAKtB,OAAA,SAAA8G,GAA0B,IAAA2L,EAAA9I,MAAA+I,UAAAjN,OAAAkN,KAAA7L,EAAAC,OAAA6L,QAAA,SAAAC,GAAkF,OAAAA,EAAAhJ,WAAkBpF,IAAA,SAAAoO,GAA+D,MAA7C,WAAAA,IAAAC,OAAAD,EAAAlM,QAA0D7F,EAAAuR,gBAAAvL,EAAAC,OAAAgM,SAAAN,IAAA,MAAiF,CAAAxR,EAAA,UAAeI,MAAA,CAAOsF,MAAA,MAAAkD,SAAA,KAA6B,CAAA/I,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,qCAAAuB,EAAAS,GAAA,KAAAN,EAAA,UAAqFI,MAAA,CAAOsF,MAAA,cAAqB,CAAA7F,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,2CAAAuB,EAAAS,GAAA,KAAAN,EAAA,UAA2FI,MAAA,CAAOsF,MAAA,SAAgB,CAAA7F,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,wCAAAuB,EAAAS,GAAA,KAAAN,EAAA,KAAmFE,YAAA,uBAA6BL,EAAAS,GAAA,KAAAN,EAAA,OAAAA,EAAA,YAA2CoP,MAAA,CAAO1J,MAAA7F,EAAA,cAAAwP,SAAA,SAAAC,GAAmDzP,EAAAkS,cAAAzC,GAAsB3J,WAAA,kBAA6B,CAAA9F,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,iCAAAuB,EAAAW,GAAAX,EAAAvB,GAAA,6BAAiHoH,MAAA7F,EAAAmS,+BAAyC,kBAAAnS,EAAAS,GAAA,KAAAN,EAAA,OAAAA,EAAA,YAA0DoP,MAAA,CAAO1J,MAAA7F,EAAA,cAAAwP,SAAA,SAAAC,GAAmDzP,EAAAoS,cAAA3C,GAAsB3J,WAAA,kBAA6B,CAAA9F,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,iCAAAuB,EAAAW,GAAAX,EAAAvB,GAAA,6BAAiHoH,MAAA7F,EAAAqS,+BAAyC,oBAAArS,EAAAS,GAAA,KAAAN,EAAA,OAA6CE,YAAA,gBAA2B,CAAAF,EAAA,OAAAA,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,sCAAAuB,EAAAS,GAAA,KAAAN,EAAA,YAA0GuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAA,gBAAA8F,WAAA,oBAAwFvF,MAAA,CAAS4C,GAAA,aAAiB4C,SAAA,CAAWF,MAAA7F,EAAA,iBAA8BQ,GAAA,CAAKpB,MAAA,SAAA4G,GAAyBA,EAAAC,OAAAC,YAAsClG,EAAA+Q,gBAAA/K,EAAAC,OAAAJ,aAA0C7F,EAAAS,GAAA,KAAAN,EAAA,OAAAA,EAAA,YAAyCoP,MAAA,CAAO1J,MAAA7F,EAAA,qBAAAwP,SAAA,SAAAC,GAA0DzP,EAAAsS,qBAAA7C,GAA6B3J,WAAA,yBAAoC,CAAA9F,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,wCAAAuB,EAAAW,GAAAX,EAAAvB,GAAA,6BAAwHoH,MAAA7F,EAAAuS,sCAAgD,uBACzkJ,IDIY,EAEb,KAEC,KAEU,MAYG,2BEvBjBC,GAAA,CACbvU,MAAO,CACLwU,YAAa,CACXtU,KAAM0B,OACN/B,QAAS,iBAAO,CACd4U,YAAY,EACZC,MAAO,OAIb/T,KAAM,iBAAO,IACb8D,SAAU,CACRgQ,WADQ,WACQ,OAAOlU,KAAKiU,YAAYC,YACxCE,MAFQ,WAEG,OAAOpU,KAAKiU,YAAYE,MAAMxM,OAAS,GAClD0M,aAHQ,WAGU,OAAOrU,KAAKkU,YAAclU,KAAKoU,SCNrD,IAEIE,GAVJ,SAAoBnT,GAClBnC,EAAQ,MAyBKuV,GAVClT,OAAAC,EAAA,EAAAD,CACd2S,GCjBQ,WAAgB,IAAAxS,EAAAxB,KAAayB,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBE,YAAA,oBAA+B,CAAAL,EAAA,aAAAG,EAAA,MAAAH,EAAAS,GAAA,SAAAT,EAAAW,GAAAX,EAAAvB,GAAA,0CAAAuB,EAAAY,KAAAZ,EAAAS,GAAA,KAAAT,EAAA,WAAAG,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,6CAAAuB,EAAAY,KAAAZ,EAAAS,GAAA,KAAAT,EAAA,OAAAG,EAAA,KAAgQE,YAAA,iBAA4B,CAAAL,EAAAS,GAAA,WAAAT,EAAAW,GAAAX,EAAAvB,GAAA,oDAAAuB,EAAAS,GAAA,KAAAN,EAAA,MAA2GE,YAAA,gBAA2BL,EAAAoG,GAAApG,EAAAyS,YAAA,eAAAO,GAA+C,OAAA7S,EAAA,MAAgB+I,IAAA8J,GAAS,CAAAhT,EAAAS,GAAA,aAAAT,EAAAW,GAAAqS,GAAA,gBAAiD,IAAAhT,EAAAY,MAAA,IACjpB,IDOY,EAa7BkS,GATiB,KAEU,MAYG,QElBjBG,GARC,CACdhV,MAAO,CAAC,YACRW,KAAM,iBAAO,IACbK,QAAS,CACPiU,QADO,WACM1U,KAAK2U,MAAM,YACxBC,OAFO,WAEK5U,KAAK2U,MAAM,aCkBZE,GAVCxT,OAAAC,EAAA,EAAAD,CACdyT,GCdQ,WAAgB,IAAAtT,EAAAxB,KAAayB,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAAH,EAAAsG,GAAA,WAAAtG,EAAAS,GAAA,KAAAN,EAAA,UAA4DE,YAAA,kBAAAE,MAAA,CAAqC+G,SAAAtH,EAAAsH,UAAwB9G,GAAA,CAAKE,MAAAV,EAAAkT,UAAqB,CAAAlT,EAAAS,GAAA,SAAAT,EAAAW,GAAAX,EAAAvB,GAAA,8BAAAuB,EAAAS,GAAA,KAAAN,EAAA,UAAuFE,YAAA,kBAAAE,MAAA,CAAqC+G,SAAAtH,EAAAsH,UAAwB9G,GAAA,CAAKE,MAAAV,EAAAoT,SAAoB,CAAApT,EAAAS,GAAA,SAAAT,EAAAW,GAAAX,EAAAvB,GAAA,kCACtY,IDIY,EAEb,KAEC,KAEU,MAYG,6OEpBjB,IAAA8U,GAAA,CACbtV,MAAO,CAAC,YACRW,KAAM,iBAAO,CACXE,OAAO,EACP0U,gBAAiB,GACjBC,YAAY,EACZf,YAAY,IAEdlQ,WAAY,CACV0Q,QAAWD,IAEbvQ,wWAAUgR,CAAA,CACRC,YADM,WAEJ,OAAOnV,KAAK4Q,SAASwE,OAEpBC,aAAS,CACV5Q,kBAAmB,SAACL,GAAD,OAAWA,EAAMI,IAAIC,sBAG5ChE,QAAS,CACP6U,WADO,WAELtV,KAAK2U,MAAM,aAEbY,iBAJO,WAIevV,KAAKiV,YAAa,GACxCO,aALO,WAMLxV,KAAKM,MAAQ,KACbN,KAAKiV,YAAa,GAEpBQ,kBATO,WASc,IAAA1U,EAAAf,KACnBA,KAAKM,MAAQ,KACbN,KAAKkU,YAAa,EAClBlU,KAAKyE,kBAAkBiR,cAAc,CACnCC,SAAU3V,KAAKgV,kBAEd/T,KAAK,SAAC2U,GACL7U,EAAKmT,YAAa,EACd0B,EAAItV,MACNS,EAAKT,MAAQsV,EAAItV,OAGnBS,EAAKkU,YAAa,EAClBlU,EAAK4T,MAAM,iPCtCrB,IAoJekB,GApJH,CACVzV,KAAM,iBAAO,CACXwQ,SAAU,CACRkF,WAAW,EACXC,SAAS,EACTX,MAAM,GAERY,WAAY,CACV5R,MAAO,GACP6R,cAAe,IAEjBhC,YAAa,CACXiC,aAAa,EACbhC,YAAY,EACZC,MAAO,IAETgC,YAAa,CACXC,iBAAkB,GAClB1L,IAAK,IAEPsK,gBAAiB,KACjBqB,gBAAiB,KACjB/V,MAAO,KACPgW,WAAW,IAEbtS,WAAY,CACVuS,iBAAkBC,GAClBC,YCpBYpV,OAAAC,EAAA,EAAAD,CACd0T,GCdQ,WAAgB,IAAAvT,EAAAxB,KAAayB,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAAA,EAAA,OAA2BE,YAAA,eAA0B,CAAAF,EAAA,UAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,wBAAAuB,EAAAS,GAAA,KAAAT,EAAA2T,YAAkK3T,EAAAY,KAAlKT,EAAA,UAAwGE,YAAA,kBAAAG,GAAA,CAAkCE,MAAAV,EAAA8T,aAAwB,CAAA9T,EAAAS,GAAA,WAAAT,EAAAW,GAAAX,EAAAvB,GAAA,+BAAAuB,EAAAS,GAAA,KAAAT,EAAA,YAAAG,EAAA,UAAqHE,YAAA,kBAAAE,MAAA,CAAqC+G,SAAAtH,EAAAyT,YAA0BjT,GAAA,CAAKE,MAAAV,EAAAgU,eAA0B,CAAAhU,EAAAS,GAAA,WAAAT,EAAAW,GAAAX,EAAAvB,GAAA,gCAAAuB,EAAAY,OAAAZ,EAAAS,GAAA,KAAAT,EAAA,WAAAG,EAAA,WAAwHI,MAAA,CAAO+G,SAAAtH,EAAA0S,YAA0BlS,GAAA,CAAK0S,QAAAlT,EAAAiU,kBAAAb,OAAApT,EAAA+T,mBAA+D,CAAA/T,EAAAS,GAAA,SAAAT,EAAAW,GAAAX,EAAAvB,GAAA,0DAAA0B,EAAA,SAAsGuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAA,gBAAA8F,WAAA,oBAAwFvF,MAAA,CAASpC,KAAA,YAAkB4H,SAAA,CAAWF,MAAA7F,EAAA,iBAA8BQ,GAAA,CAAKpB,MAAA,SAAA4G,GAAyBA,EAAAC,OAAAC,YAAsClG,EAAAwT,gBAAAxN,EAAAC,OAAAJ,aAA0C7F,EAAAY,KAAAZ,EAAAS,GAAA,KAAAT,EAAA,MAAAG,EAAA,OAA+CE,YAAA,eAA0B,CAAAL,EAAAS,GAAA,SAAAT,EAAAW,GAAAX,EAAAlB,OAAA,UAAAkB,EAAAY,MAAA,IACnpC,IDIY,EAEb,KAEC,KAEU,MAYG,QDW5BsU,cAAUC,EACVjC,QAAWD,IAEbvQ,wWAAU0S,CAAA,CACRC,YADM,WAEJ,OACG7W,KAAK8W,iBAAmB9W,KAAK+W,qBAC5B/W,KAAK4Q,SAASmF,WACZ/V,KAAK4Q,SAASwE,OAASpV,KAAKgX,oBAEpCF,gBAPM,WAQJ,MAAiC,KAA1B9W,KAAKgW,WAAW5R,OAA0C,aAA1BpE,KAAKgW,WAAW5R,OAEzD4S,mBAVM,WAWJ,MAAiC,aAA1BhX,KAAKgW,WAAW5R,QAAyBpE,KAAKiX,cAEvDC,WAbM,WAcJ,MAAyC,YAAlClX,KAAKgW,WAAWC,eAEzBkB,WAhBM,WAiBJ,MAAyC,YAAlCnX,KAAKgW,WAAWC,eAEzBgB,aAnBM,WAoBJ,MAAyC,cAAlCjX,KAAKgW,WAAWC,eAEzBc,oBAtBM,WAuBJ,OAAQ/W,KAAKiU,YAAYC,YAAclU,KAAKiU,YAAYE,MAAMxM,OAAS,GAEzEyP,sBAzBM,WA0BJ,OAAOpX,KAAKiU,YAAYiC,cAEvBb,aAAS,CACV5Q,kBAAmB,SAACL,GAAD,OAAWA,EAAMI,IAAIC,sBAI5ChE,QAAS,CACP4W,YADO,WAEArX,KAAK4Q,SAASmF,UACjB/V,KAAKgW,WAAW5R,MAAQ,iBACxBpE,KAAKsX,qBAGTA,iBAPO,WAOa,IAAAvW,EAAAf,KAIlB,OAHAA,KAAKiU,YAAYC,YAAa,EAC9BlU,KAAKiU,YAAYE,MAAQ,GAElBnU,KAAKyE,kBAAkB8S,yBAC3BtW,KAAK,SAAC2U,GACL7U,EAAKkT,YAAYE,MAAQyB,EAAIzB,MAC7BpT,EAAKkT,YAAYC,YAAa,KAGpCsD,eAjBO,WAkBLxX,KAAKiU,YAAYiC,aAAc,GAEjCuB,mBApBO,WAoBe,IAAA/O,EAAA1I,KACpBA,KAAKsX,mBAAmBrW,KAAK,SAAC2U,GAC5BlN,EAAKuL,YAAYiC,aAAc,KAGnCwB,kBAzBO,WA0BL1X,KAAKiU,YAAYiC,aAAc,GAIjCyB,SA9BO,WA8BK,IAAAlI,EAAAzP,KACVA,KAAKgW,WAAW5R,MAAQ,WACxBpE,KAAKgW,WAAWC,cAAgB,UAChCjW,KAAKyE,kBAAkBmT,cACpB3W,KAAK,SAAC2U,GACLnG,EAAK0G,YAAcP,EACnBnG,EAAKuG,WAAWC,cAAgB,aAGtC4B,aAvCO,WAuCS,IAAAjI,EAAA5P,KACdA,KAAKM,MAAQ,KACbN,KAAKyE,kBAAkBqT,cAAc,CACnCC,MAAO/X,KAAKqW,gBACZV,SAAU3V,KAAKgV,kBAEd/T,KAAK,SAAC2U,GACDA,EAAItV,MACNsP,EAAKtP,MAAQsV,EAAItV,MAGnBsP,EAAKoI,mBAIXA,cAtDO,WAuDLhY,KAAKgW,WAAWC,cAAgB,WAChCjW,KAAKgW,WAAW5R,MAAQ,WACxBpE,KAAKgV,gBAAkB,KACvBhV,KAAKM,MAAQ,KACbN,KAAKiY,iBAEPC,YA7DO,WA8DLlY,KAAKgW,WAAWC,cAAgB,GAChCjW,KAAKgW,WAAW5R,MAAQ,GACxBpE,KAAKgV,gBAAkB,KACvBhV,KAAKM,MAAQ,MAKT2X,cAtEC,eAAAE,EAAA,OAAAC,GAAAC,EAAAC,MAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,cAAAF,EAAAE,KAAA,EAAAL,GAAAC,EAAAK,MAuEc1Y,KAAKyE,kBAAkBkU,eAvErC,YAuEDR,EAvECI,EAAAK,MAwEMtY,MAxEN,CAAAiY,EAAAE,KAAA,eAAAF,EAAAM,OAAA,wBAyEL7Y,KAAK4Q,SAAWuH,EAAOvH,SACvB5Q,KAAK4Q,SAASkF,WAAY,EA1ErByC,EAAAM,OAAA,SA2EEV,GA3EF,wBAAAI,EAAAO,SAAA,KAAA9Y,QA8ET+Y,QA9IU,WA8IC,IAAAC,EAAAhZ,KACTA,KAAKiY,gBAAgBhX,KAAK,WACxB+X,EAAK1C,WAAY,MG9IvB,IAEI2C,GAVJ,SAAoB9X,GAClBnC,EAAQ,MAyBKka,GAVC7X,OAAAC,EAAA,EAAAD,CACd8X,GCjBQ,WAAgB,IAAA3X,EAAAxB,KAAayB,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAD,EAAA8U,WAAA9U,EAAAoP,SAAAkF,UAAAnU,EAAA,OAA2DE,YAAA,6BAAwC,CAAAF,EAAA,OAAYE,YAAA,eAA0B,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,4BAAAuB,EAAAS,GAAA,KAAAN,EAAA,OAAAH,EAAAsV,gBAA+6BtV,EAAAY,KAA/6BT,EAAA,OAAmHE,YAAA,gBAA2B,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,2CAAAuB,EAAAS,GAAA,KAAAN,EAAA,aAAuGI,MAAA,CAAO6O,SAAApP,EAAAoP,UAAwB5O,GAAA,CAAKiT,WAAAzT,EAAAyW,cAAAmB,SAAA5X,EAAA6V,eAA2D7V,EAAAS,GAAA,KAAAN,EAAA,MAAAH,EAAAS,GAAA,KAAAT,EAAAoP,SAAA,QAAAjP,EAAA,OAAAH,EAAA4V,sBAA6J5V,EAAAY,KAA7JT,EAAA,kBAAsHI,MAAA,CAAOsX,eAAA7X,EAAAyS,eAAgCzS,EAAAS,GAAA,KAAAT,EAAA4V,sBAA+H5V,EAAAY,KAA/HT,EAAA,UAAiEE,YAAA,kBAAAG,GAAA,CAAkCE,MAAAV,EAAAgW,iBAA4B,CAAAhW,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAAvB,GAAA,6DAAAuB,EAAAS,GAAA,KAAAT,EAAA,sBAAAG,EAAA,OAAAA,EAAA,WAA4KI,MAAA,CAAO+G,SAAAtH,EAAAyS,YAAAC,YAAsClS,GAAA,CAAK0S,QAAAlT,EAAAiW,mBAAA7C,OAAApT,EAAAkW,oBAAiE,CAAA/V,EAAA,KAAUE,YAAA,WAAsB,CAAAL,EAAAS,GAAA,mBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,yEAAAuB,EAAAY,MAAA,GAAAZ,EAAAY,MAAA,GAAAZ,EAAAS,GAAA,KAAAT,EAAA,gBAAAG,EAAA,OAAAA,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,8BAAAuB,EAAAS,GAAA,KAAAT,EAAAwV,mBAAgWxV,EAAAY,KAAhWT,EAAA,kBAAyTI,MAAA,CAAOsX,eAAA7X,EAAAyS,eAAgCzS,EAAAS,GAAA,KAAAT,EAAA,YAAAG,EAAA,UAAsDE,YAAA,kBAAAG,GAAA,CAAkCE,MAAAV,EAAA0W,cAAyB,CAAA1W,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,iCAAAuB,EAAAY,KAAAZ,EAAAS,GAAA,KAAAT,EAAA,YAAAG,EAAA,UAAyHE,YAAA,kBAAAG,GAAA,CAAkCE,MAAAV,EAAAmW,WAAsB,CAAAnW,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,yCAAAuB,EAAAY,KAAAZ,EAAAS,GAAA,KAAAT,EAAA,oBAAAA,EAAA,WAAAG,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,uCAAAuB,EAAAY,KAAAZ,EAAAS,GAAA,KAAAT,EAAA,WAAAG,EAAA,OAAAA,EAAA,OAA2QE,YAAA,aAAwB,CAAAF,EAAA,OAAYE,YAAA,WAAsB,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,+BAAAuB,EAAAS,GAAA,KAAAN,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,8BAAAuB,EAAAS,GAAA,KAAAN,EAAA,UAA+JI,MAAA,CAAOsF,MAAA7F,EAAA2U,YAAAC,iBAAA9C,QAAA,CAAoDgG,MAAA,QAAe9X,EAAAS,GAAA,KAAAN,EAAA,KAAAH,EAAAS,GAAA,qBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,wDAAAuB,EAAAW,GAAAX,EAAA2U,YAAAzL,KAAA,0BAAAlJ,EAAAS,GAAA,KAAAN,EAAA,OAAoME,YAAA,UAAqB,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,sBAAAuB,EAAAS,GAAA,KAAAN,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,gCAAAuB,EAAAS,GAAA,KAAAN,EAAA,SAAuJuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAA,gBAAA8F,WAAA,oBAAwFvF,MAAA,CAASpC,KAAA,QAAc4H,SAAA,CAAWF,MAAA7F,EAAA,iBAA8BQ,GAAA,CAAKpB,MAAA,SAAA4G,GAAyBA,EAAAC,OAAAC,YAAsClG,EAAA6U,gBAAA7O,EAAAC,OAAAJ,WAA0C7F,EAAAS,GAAA,KAAAN,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,sDAAAuB,EAAAS,GAAA,KAAAN,EAAA,SAAyHuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAA,gBAAA8F,WAAA,oBAAwFvF,MAAA,CAASpC,KAAA,YAAkB4H,SAAA,CAAWF,MAAA7F,EAAA,iBAA8BQ,GAAA,CAAKpB,MAAA,SAAA4G,GAAyBA,EAAAC,OAAAC,YAAsClG,EAAAwT,gBAAAxN,EAAAC,OAAAJ,WAA0C7F,EAAAS,GAAA,KAAAN,EAAA,OAAwBE,YAAA,uBAAkC,CAAAF,EAAA,UAAeE,YAAA,kBAAAG,GAAA,CAAkCE,MAAAV,EAAAqW,eAA0B,CAAArW,EAAAS,GAAA,uBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,4DAAAuB,EAAAS,GAAA,KAAAN,EAAA,UAAmIE,YAAA,kBAAAG,GAAA,CAAkCE,MAAAV,EAAA0W,cAAyB,CAAA1W,EAAAS,GAAA,uBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,6CAAAuB,EAAAS,GAAA,KAAAT,EAAA,MAAAG,EAAA,OAA6HE,YAAA,eAA0B,CAAAL,EAAAS,GAAA,qBAAAT,EAAAW,GAAAX,EAAAlB,OAAA,sBAAAkB,EAAAY,WAAAZ,EAAAY,MAAAZ,EAAAY,MAAA,GAAAZ,EAAAY,SAAAZ,EAAAY,MAC3xH,IDOY,EAa7B6W,GATiB,KAEU,MAYG,QE+EjBM,GArGK,CAClBnZ,KADkB,WAEhB,MAAO,CACLoZ,SAAU,GACVC,kBAAkB,EAClBC,oBAAqB,GACrBC,cAAc,EACdC,iBAAiB,EACjBC,kCAAmC,GACnCC,oBAAoB,EACpBC,qBAAsB,CAAE,GAAI,GAAI,IAChCC,iBAAiB,EACjBC,qBAAqB,IAGzBpW,QAfkB,WAgBhB7D,KAAK8D,OAAOC,SAAS,gBAEvBC,WAAY,CACVwF,mBACAqM,OACA5R,cAEFC,SAAU,CACRC,KADQ,WAEN,OAAOnE,KAAK8D,OAAOM,MAAMC,MAAMC,aAEjC4V,eAJQ,WAKN,OAAOla,KAAK8D,OAAOM,MAAMsK,SAASwL,gBAEpCC,YAPQ,WAQN,OAAOna,KAAK8D,OAAOM,MAAM+V,YAAYC,OAAOjV,IAAI,SAAAkV,GAC9C,MAAO,CACL1V,GAAI0V,EAAW1V,GACf2V,QAASD,EAAWE,SACpBC,WAAY,IAAIC,KAAKJ,EAAWK,aAAaC,0BAKrDla,QAAS,CACPma,cADO,WAEL5a,KAAK4Z,iBAAkB,GAEzBiB,cAJO,WAIU,IAAA9Z,EAAAf,KACfA,KAAK8D,OAAOM,MAAMI,IAAIC,kBAAkBoW,cAAc,CAAElF,SAAU3V,KAAK6Z,oCACpE5Y,KAAK,SAAC2U,GACc,YAAfA,EAAI5Q,QACNjE,EAAK+C,OAAOC,SAAS,UACrBhD,EAAK+Z,QAAQvb,KAAK,CAAE4H,KAAM,UAE1BpG,EAAK+Y,mBAAqBlE,EAAItV,SAItCya,eAfO,WAeW,IAAArS,EAAA1I,KACVgb,EAAS,CACbrF,SAAU3V,KAAK+Z,qBAAqB,GACpCkB,YAAajb,KAAK+Z,qBAAqB,GACvCmB,wBAAyBlb,KAAK+Z,qBAAqB,IAErD/Z,KAAK8D,OAAOM,MAAMI,IAAIC,kBAAkBsW,eAAeC,GACpD/Z,KAAK,SAAC2U,GACc,YAAfA,EAAI5Q,QACN0D,EAAKsR,iBAAkB,EACvBtR,EAAKuR,qBAAsB,EAC3BvR,EAAKyS,WAELzS,EAAKsR,iBAAkB,EACvBtR,EAAKuR,oBAAsBrE,EAAItV,UAIvC8a,YAjCO,WAiCQ,IAAA3L,EAAAzP,KACPgb,EAAS,CACbK,MAAOrb,KAAKwZ,SACZ7D,SAAU3V,KAAK0Z,qBAEjB1Z,KAAK8D,OAAOM,MAAMI,IAAIC,kBAAkB2W,YAAYJ,GACjD/Z,KAAK,SAAC2U,GACc,YAAfA,EAAI5Q,QACNyK,EAAKkK,cAAe,EACpBlK,EAAKgK,kBAAmB,IAExBhK,EAAKkK,cAAe,EACpBlK,EAAKgK,iBAAmB7D,EAAItV,UAIpC6a,OAjDO,WAkDLnb,KAAK8D,OAAOC,SAAS,UACrB/D,KAAK8a,QAAQQ,QAAQ,MAEvBC,YArDO,SAqDM5W,GACP6W,OAAO9G,QAAP,GAAA/H,OAAkB3M,KAAKyb,MAAMC,EAAE,yBAA/B,OACF1b,KAAK8D,OAAOC,SAAS,cAAeY,MC5E7BgX,GAVCta,OAAAC,EAAA,EAAAD,CACdua,GCdQ,WAAgB,IAAApa,EAAAxB,KAAayB,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBI,MAAA,CAAO4D,MAAAnE,EAAAvB,GAAA,2BAAyC,CAAA0B,EAAA,OAAYE,YAAA,gBAA2B,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,6BAAAuB,EAAAS,GAAA,KAAAN,EAAA,OAAAA,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,0BAAAuB,EAAAS,GAAA,KAAAN,EAAA,SAAkKuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAA,SAAA8F,WAAA,aAA0EvF,MAAA,CAASpC,KAAA,QAAAkc,aAAA,SAAsCtU,SAAA,CAAWF,MAAA7F,EAAA,UAAuBQ,GAAA,CAAKpB,MAAA,SAAA4G,GAAyBA,EAAAC,OAAAC,YAAsClG,EAAAgY,SAAAhS,EAAAC,OAAAJ,aAAmC7F,EAAAS,GAAA,KAAAN,EAAA,OAAAA,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,iCAAAuB,EAAAS,GAAA,KAAAN,EAAA,SAAgHuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAA,oBAAA8F,WAAA,wBAAgGvF,MAAA,CAASpC,KAAA,WAAAkc,aAAA,oBAAoDtU,SAAA,CAAWF,MAAA7F,EAAA,qBAAkCQ,GAAA,CAAKpB,MAAA,SAAA4G,GAAyBA,EAAAC,OAAAC,YAAsClG,EAAAkY,oBAAAlS,EAAAC,OAAAJ,aAA8C7F,EAAAS,GAAA,KAAAN,EAAA,UAA6BE,YAAA,kBAAAG,GAAA,CAAkCE,MAAAV,EAAA4Z,cAAyB,CAAA5Z,EAAAS,GAAA,WAAAT,EAAAW,GAAAX,EAAAvB,GAAA,+BAAAuB,EAAAS,GAAA,KAAAT,EAAA,aAAAG,EAAA,KAAAH,EAAAS,GAAA,WAAAT,EAAAW,GAAAX,EAAAvB,GAAA,uCAAAuB,EAAAY,KAAAZ,EAAAS,GAAA,UAAAT,EAAAiY,iBAAA,CAAA9X,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,mCAAAuB,EAAAS,GAAA,KAAAN,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAiY,sBAAAjY,EAAAY,MAAA,GAAAZ,EAAAS,GAAA,KAAAN,EAAA,OAAqYE,YAAA,gBAA2B,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,gCAAAuB,EAAAS,GAAA,KAAAN,EAAA,OAAAA,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,iCAAAuB,EAAAS,GAAA,KAAAN,EAAA,SAA4KuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAAuY,qBAAA,GAAAzS,WAAA,4BAAwGvF,MAAA,CAASpC,KAAA,YAAkB4H,SAAA,CAAWF,MAAA7F,EAAAuY,qBAAA,IAAsC/X,GAAA,CAAKpB,MAAA,SAAA4G,GAAyBA,EAAAC,OAAAC,WAAsClG,EAAA0P,KAAA1P,EAAAuY,qBAAA,EAAAvS,EAAAC,OAAAJ,aAA6D7F,EAAAS,GAAA,KAAAN,EAAA,OAAAA,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,6BAAAuB,EAAAS,GAAA,KAAAN,EAAA,SAA4GuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAAuY,qBAAA,GAAAzS,WAAA,4BAAwGvF,MAAA,CAASpC,KAAA,YAAkB4H,SAAA,CAAWF,MAAA7F,EAAAuY,qBAAA,IAAsC/X,GAAA,CAAKpB,MAAA,SAAA4G,GAAyBA,EAAAC,OAAAC,WAAsClG,EAAA0P,KAAA1P,EAAAuY,qBAAA,EAAAvS,EAAAC,OAAAJ,aAA6D7F,EAAAS,GAAA,KAAAN,EAAA,OAAAA,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,qCAAAuB,EAAAS,GAAA,KAAAN,EAAA,SAAoHuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAAuY,qBAAA,GAAAzS,WAAA,4BAAwGvF,MAAA,CAASpC,KAAA,YAAkB4H,SAAA,CAAWF,MAAA7F,EAAAuY,qBAAA,IAAsC/X,GAAA,CAAKpB,MAAA,SAAA4G,GAAyBA,EAAAC,OAAAC,WAAsClG,EAAA0P,KAAA1P,EAAAuY,qBAAA,EAAAvS,EAAAC,OAAAJ,aAA6D7F,EAAAS,GAAA,KAAAN,EAAA,UAA6BE,YAAA,kBAAAG,GAAA,CAAkCE,MAAAV,EAAAuZ,iBAA4B,CAAAvZ,EAAAS,GAAA,WAAAT,EAAAW,GAAAX,EAAAvB,GAAA,+BAAAuB,EAAAS,GAAA,KAAAT,EAAA,gBAAAG,EAAA,KAAAH,EAAAS,GAAA,WAAAT,EAAAW,GAAAX,EAAAvB,GAAA,+CAAAuB,EAAAyY,oBAAAtY,EAAA,KAAAH,EAAAS,GAAA,WAAAT,EAAAW,GAAAX,EAAAvB,GAAA,+CAAAuB,EAAAY,KAAAZ,EAAAS,GAAA,KAAAT,EAAA,oBAAAG,EAAA,KAAAH,EAAAS,GAAA,WAAAT,EAAAW,GAAAX,EAAAyY,qBAAA,YAAAzY,EAAAY,OAAAZ,EAAAS,GAAA,KAAAN,EAAA,OAAscE,YAAA,gBAA2B,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,6BAAAuB,EAAAS,GAAA,KAAAN,EAAA,SAAqFE,YAAA,gBAA2B,CAAAF,EAAA,SAAAA,EAAA,MAAAA,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,yBAAAuB,EAAAS,GAAA,KAAAN,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,4BAAAuB,EAAAS,GAAA,KAAAN,EAAA,UAAAH,EAAAS,GAAA,KAAAN,EAAA,QAAAH,EAAAoG,GAAApG,EAAA,qBAAA6Y,GAAkP,OAAA1Y,EAAA,MAAgB+I,IAAA2P,EAAA1V,IAAkB,CAAAhD,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAkY,EAAAC,YAAA9Y,EAAAS,GAAA,KAAAN,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAkY,EAAAG,eAAAhZ,EAAAS,GAAA,KAAAN,EAAA,MAAkIE,YAAA,WAAsB,CAAAF,EAAA,UAAeE,YAAA,kBAAAG,GAAA,CAAkCE,MAAA,SAAAsF,GAAyB,OAAAhG,EAAA+Z,YAAAlB,EAAA1V,OAAwC,CAAAnD,EAAAS,GAAA,mBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,oDAA4F,OAAAuB,EAAAS,GAAA,KAAAN,EAAA,OAAAH,EAAAS,GAAA,KAAAN,EAAA,OAAqDE,YAAA,gBAA2B,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,+BAAAuB,EAAAS,GAAA,KAAAT,EAAAoY,gBAAApY,EAAAY,KAAAT,EAAA,KAAAH,EAAAS,GAAA,WAAAT,EAAAW,GAAAX,EAAAvB,GAAA,oDAAAuB,EAAAS,GAAA,KAAAT,EAAA,gBAAAG,EAAA,OAAAA,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,4CAAAuB,EAAAS,GAAA,KAAAN,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,sBAAAuB,EAAAS,GAAA,KAAAN,EAAA,SAAmZuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAA,kCAAA8F,WAAA,sCAA4HvF,MAAA,CAASpC,KAAA,YAAkB4H,SAAA,CAAWF,MAAA7F,EAAA,mCAAgDQ,GAAA,CAAKpB,MAAA,SAAA4G,GAAyBA,EAAAC,OAAAC,YAAsClG,EAAAqY,kCAAArS,EAAAC,OAAAJ,WAA4D7F,EAAAS,GAAA,KAAAN,EAAA,UAA2BE,YAAA,kBAAAG,GAAA,CAAkCE,MAAAV,EAAAqZ,gBAA2B,CAAArZ,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,4CAAAuB,EAAAY,KAAAZ,EAAAS,GAAA,UAAAT,EAAAsY,mBAAAnY,EAAA,KAAAH,EAAAS,GAAA,WAAAT,EAAAW,GAAAX,EAAAvB,GAAA,8CAAAuB,EAAAY,KAAAZ,EAAAS,GAAA,KAAAT,EAAA,mBAAAG,EAAA,KAAAH,EAAAS,GAAA,WAAAT,EAAAW,GAAAX,EAAAsY,oBAAA,YAAAtY,EAAAY,KAAAZ,EAAAS,GAAA,KAAAT,EAAAoY,gBAAucpY,EAAAY,KAAvcT,EAAA,UAA0YE,YAAA,kBAAAG,GAAA,CAAkCE,MAAAV,EAAAoZ,gBAA2B,CAAApZ,EAAAS,GAAA,WAAAT,EAAAW,GAAAX,EAAAvB,GAAA,sCACz+K,IDIY,EAEb,KAEC,KAEU,MAYG,+EE8GjB6b,WAlIM,CACnBrc,MAAO,CACLsc,QAAS,CACPpc,KAAM,CAACI,OAAQyb,OAAOQ,SACtBnc,UAAU,GAEZH,cAAe,CACbC,KAAMC,SACNC,UAAU,GAEZoc,eAAgB,CACdtc,KAAM0B,OADQ/B,QAAA,WAGZ,MAAO,CACL4c,YAAa,EACbC,aAAc,EACdC,SAAU,EACVC,SAAS,EACTC,UAAU,EACVC,QAAQ,KAIdC,MAAO,CACL7c,KAAMI,OACNT,QAAS,6DAEXmd,gBAAiB,CACf9c,KAAMI,QAER2c,+BAAgC,CAC9B/c,KAAMI,QAER4c,kBAAmB,CACjBhd,KAAMI,SAGVK,KArCmB,WAsCjB,MAAO,CACLwc,aAASC,EACTC,aAASD,EACTta,cAAUsa,EACVrc,YAAY,EACZuc,YAAa,OAGjB7Y,SAAU,CACR8Y,SADQ,WAEN,OAAOhd,KAAKyc,iBAAmBzc,KAAKC,GAAG,uBAEzCgd,wBAJQ,WAKN,OAAOjd,KAAK0c,gCAAkC1c,KAAKC,GAAG,wCAExDid,WAPQ,WAQN,OAAOld,KAAK2c,mBAAqB3c,KAAKC,GAAG,yBAE3Ckd,eAVQ,WAWN,OAAOnd,KAAK+c,aAAe/c,KAAK+c,uBAAuB9X,MAAQjF,KAAK+c,YAAYK,WAAapd,KAAK+c,cAGtGtc,QAAS,CACP4c,QADO,WAEDrd,KAAK4c,SACP5c,KAAK4c,QAAQS,UAEfrd,KAAKW,MAAMC,MAAMyG,MAAQ,GACzBrH,KAAK8c,aAAUD,EACf7c,KAAK2U,MAAM,UAEb7T,OATO,WASkB,IAAAC,EAAAf,KAAjBsd,IAAiBC,UAAA5V,OAAA,QAAAkV,IAAAU,UAAA,KAAAA,UAAA,GACvBvd,KAAKQ,YAAa,EAClBR,KAAKwd,kBAAoB,KACzBxd,KAAKN,cAAc4d,GAAYtd,KAAK4c,QAAS5c,KAAKK,MAC/CY,KAAK,kBAAMF,EAAKsc,YADnB,MAES,SAACI,GACN1c,EAAKgc,YAAcU,IAHvB,QAKW,WACP1c,EAAKP,YAAa,KAGxBkd,UArBO,WAsBL1d,KAAKW,MAAMC,MAAMsB,SAEnByb,cAxBO,WAyBL3d,KAAK4c,QAAU,IAAIgB,KAAQ5d,KAAKW,MAAMkd,IAAK7d,KAAKic,iBAElD6B,cA3BO,WA4BL,MAA+B,WAAxBC,KAAO/d,KAAK+b,SAAuB/b,KAAK+b,QAAUlZ,SAASmb,cAAche,KAAK+b,UAEvFkC,SA9BO,WA8BK,IAAAvV,EAAA1I,KACJke,EAAYle,KAAKW,MAAMC,MAC7B,GAAuB,MAAnBsd,EAAUrd,OAAuC,MAAtBqd,EAAUrd,MAAM,GAAY,CACzDb,KAAKK,KAAO6d,EAAUrd,MAAM,GAC5B,IAAIsd,EAAS,IAAI3C,OAAO4C,WACxBD,EAAOE,OAAS,SAACpM,GACfvJ,EAAKoU,QAAU7K,EAAExK,OAAO0Q,OACxBzP,EAAKiM,MAAM,SAEbwJ,EAAOG,cAActe,KAAKK,MAC1BL,KAAK2U,MAAM,UAAW3U,KAAKK,KAAM8d,KAGrCI,WA3CO,WA4CLve,KAAK+c,YAAc,OAGvBhE,QA3GmB,WA6GjB,IAAMgD,EAAU/b,KAAK8d,gBAChB/B,EAGHA,EAAQyC,iBAAiB,QAASxe,KAAK0d,WAFvC1d,KAAK2U,MAAM,QAAS,+BAAgC,QAKpC3U,KAAKW,MAAMC,MACnB4d,iBAAiB,SAAUxe,KAAKie,WAE5CQ,cAAe,WAEb,IAAM1C,EAAU/b,KAAK8d,gBACjB/B,GACFA,EAAQ2C,oBAAoB,QAAS1e,KAAK0d,WAE1B1d,KAAKW,MAAMC,MACnB8d,oBAAoB,SAAU1e,KAAKie,aCzHjD,IAEIU,GAVJ,SAAoBxd,GAClBnC,EAAQ,MAyBK4f,GAVCvd,OAAAC,EAAA,EAAAD,CACdwd,GCjBQ,WAAgB,IAAArd,EAAAxB,KAAayB,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBE,YAAA,iBAA4B,CAAAL,EAAA,QAAAG,EAAA,OAAAA,EAAA,OAAoCE,YAAA,iCAA4C,CAAAF,EAAA,OAAYG,IAAA,MAAAC,MAAA,CAAiB+c,IAAAtd,EAAAsb,QAAAiC,IAAA,IAA2B/c,GAAA,CAAKgd,KAAA,SAAAxX,GAAiD,OAAzBA,EAAAyX,kBAAyBzd,EAAAmc,cAAAnW,SAAmChG,EAAAS,GAAA,KAAAN,EAAA,OAA0BE,YAAA,iCAA4C,CAAAF,EAAA,UAAeE,YAAA,MAAAE,MAAA,CAAyBpC,KAAA,SAAAmJ,SAAAtH,EAAAhB,YAA0C+G,SAAA,CAAW2X,YAAA1d,EAAAW,GAAAX,EAAAwb,WAAmChb,GAAA,CAAKE,MAAA,SAAAsF,GAAyB,OAAAhG,EAAAV,aAAsBU,EAAAS,GAAA,KAAAN,EAAA,UAA2BE,YAAA,MAAAE,MAAA,CAAyBpC,KAAA,SAAAmJ,SAAAtH,EAAAhB,YAA0C+G,SAAA,CAAW2X,YAAA1d,EAAAW,GAAAX,EAAA0b,aAAqClb,GAAA,CAAKE,MAAAV,EAAA6b,WAAqB7b,EAAAS,GAAA,KAAAN,EAAA,UAA2BE,YAAA,MAAAE,MAAA,CAAyBpC,KAAA,SAAAmJ,SAAAtH,EAAAhB,YAA0C+G,SAAA,CAAW2X,YAAA1d,EAAAW,GAAAX,EAAAyb,0BAAkDjb,GAAA,CAAKE,MAAA,SAAAsF,GAAyB,OAAAhG,EAAAV,QAAA,OAA2BU,EAAAS,GAAA,KAAAT,EAAA,WAAAG,EAAA,KAAuCE,YAAA,4BAAsCL,EAAAY,OAAAZ,EAAAS,GAAA,KAAAT,EAAA,YAAAG,EAAA,OAAqDE,YAAA,eAA0B,CAAAL,EAAAS,GAAA,WAAAT,EAAAW,GAAAX,EAAA2b,gBAAA,YAAAxb,EAAA,KAAmEE,YAAA,0BAAAG,GAAA,CAA0CE,MAAAV,EAAA+c,gBAAwB/c,EAAAY,OAAAZ,EAAAY,KAAAZ,EAAAS,GAAA,KAAAN,EAAA,SAAgDG,IAAA,QAAAD,YAAA,0BAAAE,MAAA,CAAyDpC,KAAA,OAAAwf,OAAA3d,EAAAgb,YACp1C,IDOY,EAa7BmC,GATiB,KAEU,MAYG,gDEkOjBS,GAjPI,CACjBhf,KADiB,WAEf,MAAO,CACLif,QAASrf,KAAK8D,OAAOM,MAAMC,MAAMC,YAAY6C,KAC7CmY,OAAQC,KAASvf,KAAK8D,OAAOM,MAAMC,MAAMC,YAAYkb,aACrDC,UAAWzf,KAAK8D,OAAOM,MAAMC,MAAMC,YAAYob,OAC/CC,cAAe3f,KAAK8D,OAAOM,MAAMC,MAAMC,YAAYsb,aACnDC,gBAAiB7f,KAAK8D,OAAOM,MAAMC,MAAMC,YAAYwb,cACrDC,UAAW/f,KAAK8D,OAAOM,MAAMC,MAAMC,YAAY0b,OAAO7a,IAAI,SAAA8a,GAAK,MAAK,CAAE9Y,KAAM8Y,EAAM9Y,KAAME,MAAO4Y,EAAM5Y,SACrG6Y,YAAalgB,KAAK8D,OAAOM,MAAMC,MAAMC,YAAY6b,aACjDC,cAAepgB,KAAK8D,OAAOM,MAAMC,MAAMC,YAAY+b,eACnDC,iBAAkBtgB,KAAK8D,OAAOM,MAAMC,MAAMC,YAAYic,mBACtDC,mBAAoBxgB,KAAK8D,OAAOM,MAAMC,MAAMC,YAAYmc,qBACxDC,SAAU1gB,KAAK8D,OAAOM,MAAMC,MAAMC,YAAYqc,UAC9CC,KAAM5gB,KAAK8D,OAAOM,MAAMC,MAAMC,YAAYsc,KAC1CC,aAAc7gB,KAAK8D,OAAOM,MAAMC,MAAMC,YAAYuc,aAClDC,IAAK9gB,KAAK8D,OAAOM,MAAMC,MAAMC,YAAYwc,IACzCC,mBAAoB/gB,KAAK8D,OAAOM,MAAMC,MAAMC,YAAY0c,qBACxDC,sBAAsB,EACtBC,iBAAiB,EACjBC,qBAAqB,EACrBC,OAAQ,KACRC,cAAe,KACfC,WAAY,KACZC,kBAAmB,KACnBC,kBAAmB,KACnBC,sBAAuB,OAG3Bzd,WAAY,CACV0d,mBACA5F,gBACA6F,gBACAnT,cACAhF,mBACAvF,cAEFC,SAAU,CACRC,KADQ,WAEN,OAAOnE,KAAK8D,OAAOM,MAAMC,MAAMC,aAEjCsd,mBAJQ,WAIc,IAAA7gB,EAAAf,KACpB,OAAO6hB,aAAU,CACfC,MAAK,GAAAnV,OAAAG,IACA9M,KAAK8D,OAAOM,MAAMsK,SAASoT,OAD3BhV,IAEA9M,KAAK8D,OAAOM,MAAMsK,SAASqT,cAEhC1d,MAAOrE,KAAK8D,OAAOM,MAAMC,MAAMA,MAC/B2d,gBAAiB,SAAC9b,GAAD,OAAWnF,EAAK+C,OAAOC,SAAS,cAAe,CAAEmC,cAGtE+b,eAdQ,WAeN,OAAOJ,aAAU,CAAEC,MAAK,GAAAnV,OAAAG,IACnB9M,KAAK8D,OAAOM,MAAMsK,SAASoT,OADRhV,IAEnB9M,KAAK8D,OAAOM,MAAMsK,SAASqT,iBAGlCG,cApBQ,WAoBS,IAAAxZ,EAAA1I,KACf,OAAO6hB,aAAU,CACfxd,MAAOrE,KAAK8D,OAAOM,MAAMC,MAAMA,MAC/B2d,gBAAiB,SAAC9b,GAAD,OAAWwC,EAAK5E,OAAOC,SAAS,cAAe,CAAEmC,cAGtEic,aA1BQ,WA2BN,OAAOniB,KAAK8D,OAAOM,MAAMsK,SAASyT,cAEpCC,UA7BQ,WA8BN,OAAOpiB,KAAKmiB,aAAeniB,KAAKmiB,aAAaC,UAAY,GAE3DC,cAhCQ,WAiCN,OAAOriB,KAAK8D,OAAOM,MAAMsK,SAAS4T,OAAStiB,KAAK8D,OAAOM,MAAMsK,SAAS2T,eAExEE,cAnCQ,WAoCN,OAAOviB,KAAK8D,OAAOM,MAAMsK,SAAS4T,OAAStiB,KAAK8D,OAAOM,MAAMsK,SAAS6T,eAExEC,gBAtCQ,WAuCN,IAAMC,EAAaziB,KAAK8D,OAAOM,MAAMsK,SAAS2T,cAC9C,OAASriB,KAAK8D,OAAOM,MAAMC,MAAMC,YAAYoe,mBAC7C1iB,KAAK8D,OAAOM,MAAMC,MAAMC,YAAYoe,kBAAkBhZ,SAAS+Y,IAEjEE,gBA3CQ,WA4CN,IAAMC,EAAa5iB,KAAK8D,OAAOM,MAAMsK,SAAS6T,cAC9C,OAASviB,KAAK8D,OAAOM,MAAMC,MAAMC,YAAYue,aAC7C7iB,KAAK8D,OAAOM,MAAMC,MAAMC,YAAYue,YAAYnZ,SAASkZ,IAE3DE,oBAhDQ,WAiDN,OAAS9iB,KAAK8D,OAAOM,MAAMC,MAAMC,YAAYye,kBAE/CC,aAnDQ,WAoDN,IAAMlE,EAAM9e,KAAK8D,OAAOM,MAAMC,MAAMC,YAAY2e,2BAChD,OAASnE,GAAO9e,KAAKqiB,eAEvBa,aAvDQ,WAwDN,IAAMpE,EAAM9e,KAAK8D,OAAOM,MAAMC,MAAMC,YAAYue,YAChD,OAAS/D,GAAO9e,KAAKuiB,gBAGzB9hB,QAAS,CACP0iB,cADO,WACU,IAAA1T,EAAAzP,KACfA,KAAK8D,OAAOM,MAAMI,IAAIC,kBACnB0e,cAAc,CACbnI,OAAQ,CACNoI,KAAMpjB,KAAKsf,OACXI,OAAQ1f,KAAKyf,UAGb4D,aAAcrjB,KAAKqf,QACnBiE,kBAAmBtjB,KAAK+f,UAAU5Z,OAAO,SAAAod,GAAE,OAAU,MAANA,IAC/CzD,cAAe9f,KAAK6f,gBACpBD,aAAc5f,KAAK2f,cACnBQ,aAAcngB,KAAKkgB,YACnBG,eAAgBrgB,KAAKogB,cACrBS,aAAc7gB,KAAK6gB,aACnBC,IAAK9gB,KAAK8gB,IACVE,qBAAsBhhB,KAAK+gB,mBAC3BR,mBAAoBvgB,KAAKsgB,iBACzBG,qBAAsBzgB,KAAKwgB,mBAC3BG,UAAW3gB,KAAK0gB,YAEbzf,KAAK,SAACkD,GACXsL,EAAKsQ,UAAU7U,OAAO/G,EAAK6b,OAAOrY,QAClC6b,KAAM/T,EAAKsQ,UAAW5b,EAAK6b,QAC3BvQ,EAAK3L,OAAO2f,OAAO,cAAe,CAACtf,IACnCsL,EAAK3L,OAAO2f,OAAO,iBAAkBtf,MAG3Cuf,UA7BO,SA6BIC,GACT3jB,KAAK6f,gBAAkB8D,GAEzBC,SAhCO,WAiCL,OAAI5jB,KAAK+f,UAAUpY,OAAS3H,KAAKoiB,YAC/BpiB,KAAK+f,UAAUxgB,KAAK,CAAE4H,KAAM,GAAIE,MAAO,MAChC,IAIXwc,YAvCO,SAuCMC,EAAOC,GAClB/jB,KAAKgkB,QAAQhkB,KAAK+f,UAAW+D,IAE/BG,WA1CO,SA0CKha,EAAMgI,GAAG,IAAArC,EAAA5P,KACbK,EAAO4R,EAAExK,OAAO5G,MAAM,GAC5B,GAAKR,EACL,GAAIA,EAAK6jB,KAAOlkB,KAAK8D,OAAOM,MAAMsK,SAASzE,EAAO,SAAlD,CACE,IAAMka,EAAWC,KAAsBC,eAAehkB,EAAK6jB,MACrDI,EAAcF,KAAsBC,eAAerkB,KAAK8D,OAAOM,MAAMsK,SAASzE,EAAO,UAC3FjK,KAAKiK,EAAO,eAAiB,CAC3BjK,KAAKC,GAAG,qBACRD,KAAKC,GACH,4BACA,CACEkkB,SAAUA,EAASI,IACnBC,aAAcL,EAASM,KACvBH,YAAaA,EAAYC,IACzBG,gBAAiBJ,EAAYG,QAGjCjf,KAAK,SAdT,CAkBA,IAAM2Y,EAAS,IAAIC,WACnBD,EAAOE,OAAS,SAAArS,GAAgB,IACxB6R,EADwB7R,EAAbvE,OACE0Q,OACnBvI,EAAK3F,EAAO,WAAa4T,EACzBjO,EAAK3F,GAAQ5J,GAEf8d,EAAOG,cAAcje,KAEvBskB,YAvEO,WAwEanJ,OAAO9G,QAAQ1U,KAAKC,GAAG,mCAEvCD,KAAK4kB,kBAAa/H,EAAW,KAGjCgI,YA7EO,WA8EarJ,OAAO9G,QAAQ1U,KAAKC,GAAG,mCAEvCD,KAAK8kB,aAAa,KAGtBC,gBAnFO,WAoFavJ,OAAO9G,QAAQ1U,KAAKC,GAAG,uCAEvCD,KAAKglB,iBAAiB,KAG1BJ,aAzFO,SAyFOhI,EAASvc,GACrB,IAAM4kB,EAAOjlB,KACb,OAAO,IAAI6P,QAAQ,SAACC,EAASf,GAC3B,SAASmW,EAAcC,GACrBF,EAAKnhB,OAAOM,MAAMI,IAAIC,kBAAkB2gB,oBAAoB,CAAED,WAC3DlkB,KAAK,SAACkD,GACL8gB,EAAKnhB,OAAO2f,OAAO,cAAe,CAACtf,IACnC8gB,EAAKnhB,OAAO2f,OAAO,iBAAkBtf,GACrC2L,MAJJ,MAMS,SAAC2N,GACN1O,EAAO,IAAI9J,MAAMggB,EAAKhlB,GAAG,qBAAuB,IAAMwd,EAAI4H,YAI5DzI,EACFA,EAAQ0I,mBAAmBC,OAAOL,EAAc7kB,EAAKV,MAErDulB,EAAa7kB,MAInBykB,aA/GO,SA+GO1D,GAAQ,IAAApI,EAAAhZ,MACfA,KAAKqhB,eAA4B,KAAXD,KAE3BphB,KAAKkhB,iBAAkB,EACvBlhB,KAAK8D,OAAOM,MAAMI,IAAIC,kBAAkB2gB,oBAAoB,CAAEhE,WAC3DngB,KAAK,SAACkD,GACL6U,EAAKlV,OAAO2f,OAAO,cAAe,CAACtf,IACnC6U,EAAKlV,OAAO2f,OAAO,iBAAkBtf,GACrC6U,EAAKqI,cAAgB,OAJzB,MAMS,SAAC5D,GACNzE,EAAKwI,kBAAoBxI,EAAK/Y,GAAG,qBAAuB,IAAMwd,EAAI4H,UAEnEpkB,KAAK,WAAQ+X,EAAKkI,iBAAkB,MAEzC8D,iBA9HO,SA8HW1D,GAAY,IAAAkE,EAAAxlB,MACvBA,KAAKuhB,mBAAoC,KAAfD,KAE/BthB,KAAKmhB,qBAAsB,EAC3BnhB,KAAK8D,OAAOM,MAAMI,IAAIC,kBAAkB2gB,oBAAoB,CAAE9D,eAAcrgB,KAAK,SAACb,GAC3EA,EAAKE,MAKRklB,EAAK/D,sBAAwB+D,EAAKvlB,GAAG,qBAAuBG,EAAKE,OAJjEklB,EAAK1hB,OAAO2f,OAAO,cAAe,CAACrjB,IACnColB,EAAK1hB,OAAO2f,OAAO,iBAAkBrjB,GACrColB,EAAKjE,kBAAoB,MAI3BiE,EAAKrE,qBAAsB,QC9OnC,IAEIsE,GAVJ,SAAoBtkB,GAClBnC,EAAQ,MAyBK0mB,GAVCrkB,OAAAC,EAAA,EAAAD,CACdskB,GCjBQ,WAAgB,IAAAnkB,EAAAxB,KAAayB,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBE,YAAA,eAA0B,CAAAF,EAAA,OAAYE,YAAA,gBAA2B,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,yBAAAuB,EAAAS,GAAA,KAAAN,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,qBAAAuB,EAAAS,GAAA,KAAAN,EAAA,cAAoJI,MAAA,CAAO6jB,sBAAA,GAAAC,QAAArkB,EAAAygB,gBAAsDlR,MAAA,CAAQ1J,MAAA7F,EAAA,QAAAwP,SAAA,SAAAC,GAA6CzP,EAAA6d,QAAApO,GAAgB3J,WAAA,YAAuB,CAAA3F,EAAA,SAAcuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAA,QAAA8F,WAAA,YAAwEvF,MAAA,CAAS4C,GAAA,WAAAmhB,UAAA,gBAA2Cve,SAAA,CAAWF,MAAA7F,EAAA,SAAsBQ,GAAA,CAAKpB,MAAA,SAAA4G,GAAyBA,EAAAC,OAAAC,YAAsClG,EAAA6d,QAAA7X,EAAAC,OAAAJ,aAAkC7F,EAAAS,GAAA,KAAAN,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,oBAAAuB,EAAAS,GAAA,KAAAN,EAAA,cAA8FI,MAAA,CAAO6jB,sBAAA,GAAAC,QAAArkB,EAAAogB,oBAA0D7Q,MAAA,CAAQ1J,MAAA7F,EAAA,OAAAwP,SAAA,SAAAC,GAA4CzP,EAAA8d,OAAArO,GAAe3J,WAAA,WAAsB,CAAA3F,EAAA,YAAiBuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAA,OAAA8F,WAAA,WAAsEvF,MAAA,CAAS+jB,UAAA,OAAkBve,SAAA,CAAWF,MAAA7F,EAAA,QAAqBQ,GAAA,CAAKpB,MAAA,SAAA4G,GAAyBA,EAAAC,OAAAC,YAAsClG,EAAA8d,OAAA9X,EAAAC,OAAAJ,aAAiC7F,EAAAS,GAAA,KAAAN,EAAA,KAAAA,EAAA,YAAuCoP,MAAA,CAAO1J,MAAA7F,EAAA,UAAAwP,SAAA,SAAAC,GAA+CzP,EAAAie,UAAAxO,GAAkB3J,WAAA,cAAyB,CAAA9F,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,wDAAAuB,EAAAS,GAAA,KAAAN,EAAA,OAAAA,EAAA,SAA8HI,MAAA,CAAOmR,IAAA,gBAAqB,CAAA1R,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,4BAAAuB,EAAAS,GAAA,KAAAN,EAAA,OAAyEE,YAAA,kBAAAE,MAAA,CAAqC4C,GAAA,gBAAoB,CAAAhD,EAAA,kBAAuBI,MAAA,CAAOgkB,YAAA,EAAAC,eAAAxkB,EAAAqe,gBAAAoG,gBAAAzkB,EAAAqe,gBAAAqG,kBAAA1kB,EAAAkiB,cAAwH,KAAAliB,EAAAS,GAAA,KAAAN,EAAA,KAAAA,EAAA,YAA2CoP,MAAA,CAAO1J,MAAA7F,EAAA,cAAAwP,SAAA,SAAAC,GAAmDzP,EAAAme,cAAA1O,GAAsB3J,WAAA,kBAA6B,CAAA9F,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,wDAAAuB,EAAAS,GAAA,KAAAN,EAAA,KAAAA,EAAA,YAA+HoP,MAAA,CAAO1J,MAAA7F,EAAA,YAAAwP,SAAA,SAAAC,GAAiDzP,EAAA0e,YAAAjP,GAAoB3J,WAAA,gBAA2B,CAAA9F,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,wDAAAuB,EAAAS,GAAA,KAAAN,EAAA,KAAgHE,YAAA,mBAA8B,CAAAF,EAAA,YAAiBI,MAAA,CAAO+G,UAAAtH,EAAA0e,aAA4BnP,MAAA,CAAQ1J,MAAA7F,EAAA,iBAAAwP,SAAA,SAAAC,GAAsDzP,EAAA8e,iBAAArP,GAAyB3J,WAAA,qBAAgC,CAAA9F,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,8DAAAuB,EAAAS,GAAA,KAAAN,EAAA,KAAAA,EAAA,YAAqIoP,MAAA,CAAO1J,MAAA7F,EAAA,cAAAwP,SAAA,SAAAC,GAAmDzP,EAAA4e,cAAAnP,GAAsB3J,WAAA,kBAA6B,CAAA9F,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,0DAAAuB,EAAAS,GAAA,KAAAN,EAAA,KAAkHE,YAAA,mBAA8B,CAAAF,EAAA,YAAiBI,MAAA,CAAO+G,UAAAtH,EAAA4e,eAA8BrP,MAAA,CAAQ1J,MAAA7F,EAAA,mBAAAwP,SAAA,SAAAC,GAAwDzP,EAAAgf,mBAAAvP,GAA2B3J,WAAA,uBAAkC,CAAA9F,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,gEAAAuB,EAAAS,GAAA,KAAAN,EAAA,KAAAA,EAAA,YAAuIoP,MAAA,CAAO1J,MAAA7F,EAAA,mBAAAwP,SAAA,SAAAC,GAAwDzP,EAAAuf,mBAAA9P,GAA2B3J,WAAA,uBAAkC,CAAA9F,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,oDAAAuB,EAAAS,GAAA,eAAAT,EAAAof,MAAA,cAAApf,EAAAof,KAAAjf,EAAA,KAAAA,EAAA,YAA8KoP,MAAA,CAAO1J,MAAA7F,EAAA,SAAAwP,SAAA,SAAAC,GAA8CzP,EAAAkf,SAAAzP,GAAiB3J,WAAA,aAAwB,WAAA9F,EAAAof,KAAA,CAAApf,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAAvB,GAAA,6CAAAuB,EAAAY,KAAAZ,EAAAS,GAAA,mBAAAT,EAAAof,KAAA,CAAApf,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAAvB,GAAA,iDAAAuB,EAAAY,MAAA,OAAAZ,EAAAY,KAAAZ,EAAAS,GAAA,KAAAN,EAAA,KAAAA,EAAA,YAA8SoP,MAAA,CAAO1J,MAAA7F,EAAA,aAAAwP,SAAA,SAAAC,GAAkDzP,EAAAqf,aAAA5P,GAAqB3J,WAAA,iBAA4B,CAAA9F,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,4CAAAuB,EAAAS,GAAA,KAAAT,EAAA4gB,UAAA,EAAAzgB,EAAA,OAAAA,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,qCAAAuB,EAAAS,GAAA,KAAAT,EAAAoG,GAAApG,EAAA,mBAAA2kB,EAAAjnB,GAA6O,OAAAyC,EAAA,OAAiB+I,IAAAxL,EAAA2C,YAAA,kBAAmC,CAAAF,EAAA,cAAmBI,MAAA,CAAO6jB,sBAAA,GAAAQ,oBAAA,GAAAP,QAAArkB,EAAA0gB,eAA4EnR,MAAA,CAAQ1J,MAAA7F,EAAAue,UAAA7gB,GAAA,KAAA8R,SAAA,SAAAC,GAAuDzP,EAAA0P,KAAA1P,EAAAue,UAAA7gB,GAAA,OAAA+R,IAAwC3J,WAAA,sBAAiC,CAAA3F,EAAA,SAAcuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAAue,UAAA7gB,GAAA,KAAAoI,WAAA,sBAA4FvF,MAAA,CAASqE,YAAA5E,EAAAvB,GAAA,iCAAqDsH,SAAA,CAAWF,MAAA7F,EAAAue,UAAA7gB,GAAA,MAAgC8C,GAAA,CAAKpB,MAAA,SAAA4G,GAAyBA,EAAAC,OAAAC,WAAsClG,EAAA0P,KAAA1P,EAAAue,UAAA7gB,GAAA,OAAAsI,EAAAC,OAAAJ,aAA0D7F,EAAAS,GAAA,KAAAN,EAAA,cAAiCI,MAAA,CAAO6jB,sBAAA,GAAAQ,oBAAA,GAAAP,QAAArkB,EAAA0gB,eAA4EnR,MAAA,CAAQ1J,MAAA7F,EAAAue,UAAA7gB,GAAA,MAAA8R,SAAA,SAAAC,GAAwDzP,EAAA0P,KAAA1P,EAAAue,UAAA7gB,GAAA,QAAA+R,IAAyC3J,WAAA,uBAAkC,CAAA3F,EAAA,SAAcuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAAue,UAAA7gB,GAAA,MAAAoI,WAAA,uBAA8FvF,MAAA,CAASqE,YAAA5E,EAAAvB,GAAA,kCAAsDsH,SAAA,CAAWF,MAAA7F,EAAAue,UAAA7gB,GAAA,OAAiC8C,GAAA,CAAKpB,MAAA,SAAA4G,GAAyBA,EAAAC,OAAAC,WAAsClG,EAAA0P,KAAA1P,EAAAue,UAAA7gB,GAAA,QAAAsI,EAAAC,OAAAJ,aAA2D7F,EAAAS,GAAA,KAAAN,EAAA,OAA0BE,YAAA,kBAA6B,CAAAF,EAAA,KAAUuF,WAAA,EAAaC,KAAA,OAAAC,QAAA,SAAAC,MAAA7F,EAAAue,UAAApY,OAAA,EAAAL,WAAA,yBAAgGzF,YAAA,cAAAG,GAAA,CAAgCE,MAAA,SAAAsF,GAAyB,OAAAhG,EAAAqiB,YAAA3kB,UAA4B,KAAQsC,EAAAS,GAAA,KAAAT,EAAAue,UAAApY,OAAAnG,EAAA4gB,UAAAzgB,EAAA,KAA6DE,YAAA,kBAAAG,GAAA,CAAkCE,MAAAV,EAAAoiB,WAAsB,CAAAjiB,EAAA,KAAUE,YAAA,cAAwBL,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,oDAAAuB,EAAAY,MAAA,GAAAZ,EAAAY,KAAAZ,EAAAS,GAAA,KAAAN,EAAA,KAAAA,EAAA,YAAiJoP,MAAA,CAAO1J,MAAA7F,EAAA,IAAAwP,SAAA,SAAAC,GAAyCzP,EAAAsf,IAAA7P,GAAY3J,WAAA,QAAmB,CAAA9F,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,mCAAAuB,EAAAS,GAAA,KAAAN,EAAA,UAAgGE,YAAA,kBAAAE,MAAA,CAAqC+G,SAAAtH,EAAA6d,SAAA,IAAA7d,EAAA6d,QAAA1X,QAAmD3F,GAAA,CAAKE,MAAAV,EAAA2hB,gBAA2B,CAAA3hB,EAAAS,GAAA,WAAAT,EAAAW,GAAAX,EAAAvB,GAAA,mCAAAuB,EAAAS,GAAA,KAAAN,EAAA,OAA2FE,YAAA,gBAA2B,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,uBAAAuB,EAAAS,GAAA,KAAAN,EAAA,KAA2EE,YAAA,qBAAgC,CAAAL,EAAAS,GAAA,WAAAT,EAAAW,GAAAX,EAAAvB,GAAA,iDAAAuB,EAAAS,GAAA,KAAAN,EAAA,OAAyGE,YAAA,4BAAuC,CAAAF,EAAA,OAAYE,YAAA,iBAAAE,MAAA,CAAoC+c,IAAAtd,EAAA2C,KAAA8e,8BAA2CzhB,EAAAS,GAAA,MAAAT,EAAAghB,iBAAAhhB,EAAAyf,qBAAAtf,EAAA,KAAyEE,YAAA,2BAAAE,MAAA,CAA8CskB,MAAA7kB,EAAAvB,GAAA,yBAAAN,KAAA,UAAwDqC,GAAA,CAAKE,MAAAV,EAAAmjB,eAAyBnjB,EAAAY,OAAAZ,EAAAS,GAAA,KAAAN,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,+BAAAuB,EAAAS,GAAA,KAAAN,EAAA,UAA8GuF,WAAA,EAAaC,KAAA,OAAAC,QAAA,SAAAC,MAAA7F,EAAA,qBAAA8F,WAAA,yBAAgGzF,YAAA,MAAAE,MAAA,CAA2B4C,GAAA,cAAAhF,KAAA,WAAoC,CAAA6B,EAAAS,GAAA,WAAAT,EAAAW,GAAAX,EAAAvB,GAAA,wCAAAuB,EAAAS,GAAA,KAAAN,EAAA,iBAA0GI,MAAA,CAAOga,QAAA,eAAAnW,iBAAApE,EAAAojB,cAA2D5iB,GAAA,CAAKskB,KAAA,SAAA9e,GAAwBhG,EAAAyf,sBAAA,GAA+BsF,MAAA,SAAA/e,GAA0BhG,EAAAyf,sBAAA,OAAgC,GAAAzf,EAAAS,GAAA,KAAAN,EAAA,OAA4BE,YAAA,gBAA2B,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,+BAAAuB,EAAAS,GAAA,KAAAN,EAAA,OAAqFE,YAAA,6BAAwC,CAAAF,EAAA,OAAYI,MAAA,CAAO+c,IAAAtd,EAAA2C,KAAA0e,eAA4BrhB,EAAAS,GAAA,KAAAT,EAAAmhB,gBAAyLnhB,EAAAY,KAAzLT,EAAA,KAA6CE,YAAA,2BAAAE,MAAA,CAA8CskB,MAAA7kB,EAAAvB,GAAA,iCAAAN,KAAA,UAAgEqC,GAAA,CAAKE,MAAAV,EAAAqjB,iBAAyBrjB,EAAAS,GAAA,KAAAN,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,uCAAAuB,EAAAS,GAAA,KAAAT,EAAA,cAAAG,EAAA,OAAuIE,YAAA,4BAAAE,MAAA,CAA+C+c,IAAAtd,EAAA6f,iBAAyB7f,EAAAY,KAAAZ,EAAAS,GAAA,KAAAN,EAAA,OAAAA,EAAA,SAA6CI,MAAA,CAAOpC,KAAA,QAAcqC,GAAA,CAAKtB,OAAA,SAAA8G,GAA0B,OAAAhG,EAAAyiB,WAAA,SAAAzc,SAA0ChG,EAAAS,GAAA,KAAAT,EAAA,gBAAAG,EAAA,KAA8CE,YAAA,uCAAiDL,EAAA,cAAAG,EAAA,UAAmCE,YAAA,kBAAAG,GAAA,CAAkCE,MAAA,SAAAsF,GAAyB,OAAAhG,EAAAsjB,aAAAtjB,EAAA4f,WAAsC,CAAA5f,EAAAS,GAAA,WAAAT,EAAAW,GAAAX,EAAAvB,GAAA,+BAAAuB,EAAAY,KAAAZ,EAAAS,GAAA,KAAAT,EAAA,kBAAAG,EAAA,OAAwHE,YAAA,eAA0B,CAAAL,EAAAS,GAAA,kBAAAT,EAAAW,GAAAX,EAAAggB,mBAAA,YAAA7f,EAAA,KAA6EE,YAAA,0BAAAG,GAAA,CAA0CE,MAAA,SAAAsF,GAAyB,OAAAhG,EAAAglB,iBAAA,gBAAwChlB,EAAAY,OAAAZ,EAAAS,GAAA,KAAAN,EAAA,OAAqCE,YAAA,gBAA2B,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,mCAAAuB,EAAAS,GAAA,KAAAN,EAAA,OAAyFE,YAAA,6BAAwC,CAAAF,EAAA,OAAYI,MAAA,CAAO+c,IAAAtd,EAAA2C,KAAA4e,oBAAiCvhB,EAAAS,GAAA,KAAAT,EAAAshB,oBAAqMthB,EAAAY,KAArMT,EAAA,KAAiDE,YAAA,2BAAAE,MAAA,CAA8CskB,MAAA7kB,EAAAvB,GAAA,qCAAAN,KAAA,UAAoEqC,GAAA,CAAKE,MAAAV,EAAAujB,qBAA6BvjB,EAAAS,GAAA,KAAAN,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,2CAAAuB,EAAAS,GAAA,KAAAT,EAAA,kBAAAG,EAAA,OAA+IE,YAAA,4BAAAE,MAAA,CAA+C+c,IAAAtd,EAAA+f,qBAA6B/f,EAAAY,KAAAZ,EAAAS,GAAA,KAAAN,EAAA,OAAAA,EAAA,SAA6CI,MAAA,CAAOpC,KAAA,QAAcqC,GAAA,CAAKtB,OAAA,SAAA8G,GAA0B,OAAAhG,EAAAyiB,WAAA,aAAAzc,SAA8ChG,EAAAS,GAAA,KAAAT,EAAA,oBAAAG,EAAA,KAAkDE,YAAA,uCAAiDL,EAAA,kBAAAG,EAAA,UAAuCE,YAAA,kBAAAG,GAAA,CAAkCE,MAAA,SAAAsF,GAAyB,OAAAhG,EAAAwjB,iBAAAxjB,EAAA8f,eAA8C,CAAA9f,EAAAS,GAAA,WAAAT,EAAAW,GAAAX,EAAAvB,GAAA,+BAAAuB,EAAAY,KAAAZ,EAAAS,GAAA,KAAAT,EAAA,sBAAAG,EAAA,OAA4HE,YAAA,eAA0B,CAAAL,EAAAS,GAAA,kBAAAT,EAAAW,GAAAX,EAAAigB,uBAAA,YAAA9f,EAAA,KAAiFE,YAAA,0BAAAG,GAAA,CAA0CE,MAAA,SAAAsF,GAAyB,OAAAhG,EAAAglB,iBAAA,oBAA4ChlB,EAAAY,UAC1jU,IDOY,EAa7BqjB,GATiB,KAEU,MAYG,2BEKhCgB,GAAA,CACAviB,SAAA,CACAwiB,cADA,WAEA,OAAAC,GAAA,EAAAC,WAGAC,cALA,WAMA,OAAAC,IAAA9mB,KAAA0mB,cAAA1mB,KAAA+mB,kBAGAC,SAAA,CACA7Y,IAAA,kBAAAnO,KAAA8D,OAAAmE,QAAA2J,aAAAqV,mBACApV,IAAA,SAAAlL,GACA3G,KAAA8D,OAAAC,SAAA,aAAAoD,KAAA,oBAAAE,MAAAV,OAKAlG,QAAA,CACAsmB,gBADA,SACAvS,GAMA,MALA,CACA0S,GAAA,iBACAC,QAAA,sBACAC,GAAA,kBAEA5S,IAAAsK,GAAA,EAAAuI,QAAA7S,MChCe8S,GAVCjmB,OAAAC,EAAA,EAAAD,CACdolB,GCfQ,WAAgB,IAAAjlB,EAAAxB,KAAayB,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAAA,EAAA,SAA6BI,MAAA,CAAOmR,IAAA,gCAAqC,CAAA1R,EAAAS,GAAA,SAAAT,EAAAW,GAAAX,EAAAvB,GAAA,yCAAAuB,EAAAS,GAAA,KAAAN,EAAA,SAAiGE,YAAA,SAAAE,MAAA,CAA4BmR,IAAA,gCAAqC,CAAAvR,EAAA,UAAeuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAA,SAAA8F,WAAA,aAA0EvF,MAAA,CAAS4C,GAAA,+BAAmC3C,GAAA,CAAKtB,OAAA,SAAA8G,GAA0B,IAAA2L,EAAA9I,MAAA+I,UAAAjN,OAAAkN,KAAA7L,EAAAC,OAAA6L,QAAA,SAAAC,GAAkF,OAAAA,EAAAhJ,WAAkBpF,IAAA,SAAAoO,GAA+D,MAA7C,WAAAA,IAAAC,OAAAD,EAAAlM,QAA0D7F,EAAAwlB,SAAAxf,EAAAC,OAAAgM,SAAAN,IAAA,MAA0E3R,EAAAoG,GAAApG,EAAA,uBAAA+lB,EAAAroB,GAAiD,OAAAyC,EAAA,UAAoB+I,IAAA6c,EAAAhgB,SAAA,CAAuBF,MAAAkgB,IAAkB,CAAA/lB,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAqlB,cAAA3nB,IAAA,gBAAiE,GAAAsC,EAAAS,GAAA,KAAAN,EAAA,KAAyBE,YAAA,wBACp6B,IDKY,EAEb,KAEC,KAEU,MAYG,qOEnBhC,IAyBe2lB,GAzBI,CACjBpnB,KADiB,WAEf,MAAO,CACLqnB,oBAEApmB,OAAOqmB,yBAAyBC,iBAAiBvU,UAAW,gBAE5D/R,OAAOqmB,yBAAyBE,iBAAiBxU,UAAW,gCAE5D/R,OAAOqmB,yBAAyBE,iBAAiBxU,UAAW,iBAGhEpP,WAAY,CACVC,aACA4jB,8BAEF3jB,wWAAU4jB,CAAA,CACRC,YADM,WAEJ,OAAO/nB,KAAK8D,OAAOM,MAAMsK,SAASqZ,aAAe,IAEnDC,6BAJM,WAI4B,OAAOhoB,KAAK8D,OAAOM,MAAMsK,SAASuZ,4BACjE9W,OCHQ+W,GAVC7mB,OAAAC,EAAA,EAAAD,CACd8mB,GCdQ,WAAgB,IAAA3mB,EAAAxB,KAAayB,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBI,MAAA,CAAO4D,MAAAnE,EAAAvB,GAAA,sBAAoC,CAAA0B,EAAA,OAAYE,YAAA,gBAA2B,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,0BAAAuB,EAAAS,GAAA,KAAAN,EAAA,MAA+EE,YAAA,gBAA2B,CAAAF,EAAA,MAAAA,EAAA,mCAAAH,EAAAS,GAAA,KAAAT,EAAA,6BAAAG,EAAA,MAAAA,EAAA,YAAwHoP,MAAA,CAAO1J,MAAA7F,EAAA,QAAAwP,SAAA,SAAAC,GAA6CzP,EAAA4mB,QAAAnX,GAAgB3J,WAAA,YAAuB,CAAA9F,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAAvB,GAAA,0CAAAuB,EAAAY,SAAAZ,EAAAS,GAAA,KAAAN,EAAA,OAAmHE,YAAA,gBAA2B,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,oBAAAuB,EAAAS,GAAA,KAAAN,EAAA,MAAyEE,YAAA,gBAA2B,CAAAF,EAAA,MAAAA,EAAA,YAA0BoP,MAAA,CAAO1J,MAAA7F,EAAA,eAAAwP,SAAA,SAAAC,GAAoDzP,EAAA6mB,eAAApX,GAAuB3J,WAAA,mBAA8B,CAAA9F,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAAvB,GAAA,kCAAAuB,EAAAW,GAAAX,EAAAvB,GAAA,6BAAoHoH,MAAA7F,EAAA8mB,gCAA0C,oBAAA9mB,EAAAS,GAAA,KAAAN,EAAA,MAAAA,EAAA,YAA2DoP,MAAA,CAAO1J,MAAA7F,EAAA,2BAAAwP,SAAA,SAAAC,GAAgEzP,EAAA+mB,2BAAAtX,GAAmC3J,WAAA,+BAA0C,CAAA9F,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAAvB,GAAA,kCAAAuB,EAAAW,GAAAX,EAAAvB,GAAA,6BAAoHoH,MAAA7F,EAAAgnB,4CAAsD,oBAAAhnB,EAAAS,GAAA,KAAAN,EAAA,MAAAA,EAAA,YAA2DoP,MAAA,CAAO1J,MAAA7F,EAAA,UAAAwP,SAAA,SAAAC,GAA+CzP,EAAAinB,UAAAxX,GAAkB3J,WAAA,cAAyB,CAAA9F,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAAvB,GAAA,uCAAAuB,EAAAS,GAAA,KAAAN,EAAA,MAAkGE,YAAA,0BAAAgK,MAAA,EAA8C/C,UAAAtH,EAAAinB,aAA2B,CAAA9mB,EAAA,MAAAA,EAAA,YAA0BI,MAAA,CAAO+G,UAAAtH,EAAAinB,WAA0B1X,MAAA,CAAQ1J,MAAA7F,EAAA,iBAAAwP,SAAA,SAAAC,GAAsDzP,EAAAknB,iBAAAzX,GAAyB3J,WAAA,qBAAgC,CAAA9F,EAAAS,GAAA,mBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,8DAAAuB,EAAAS,GAAA,KAAAN,EAAA,MAAAA,EAAA,YAA4IoP,MAAA,CAAO1J,MAAA7F,EAAA,gBAAAwP,SAAA,SAAAC,GAAqDzP,EAAAwQ,gBAAAf,GAAwB3J,WAAA,oBAA+B,CAAA9F,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAAvB,GAAA,6CAAA0B,EAAA,MAAAH,EAAAS,GAAA,KAAAN,EAAA,SAAAH,EAAAS,GAAA,iBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,4DAAAuB,EAAAS,GAAA,KAAAN,EAAA,MAAAA,EAAA,YAA0PoP,MAAA,CAAO1J,MAAA7F,EAAA,yBAAAwP,SAAA,SAAAC,GAA8DzP,EAAAmnB,yBAAA1X,GAAiC3J,WAAA,6BAAwC,CAAA9F,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAAvB,GAAA,iEAAAuB,EAAAS,GAAA,KAAAN,EAAA,OAA6HE,YAAA,gBAA2B,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,0BAAAuB,EAAAS,GAAA,KAAAN,EAAA,MAA+EE,YAAA,gBAA2B,CAAAF,EAAA,MAAAA,EAAA,YAA0BoP,MAAA,CAAO1J,MAAA7F,EAAA,UAAAwP,SAAA,SAAAC,GAA+CzP,EAAAonB,UAAA3X,GAAkB3J,WAAA,cAAyB,CAAA9F,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAAvB,GAAA,4BAAAuB,EAAAW,GAAAX,EAAAvB,GAAA,6BAA8GoH,MAAA7F,EAAAqnB,2BAAqC,oBAAArnB,EAAAS,GAAA,KAAAN,EAAA,MAAAA,EAAA,YAA2DoP,MAAA,CAAO1J,MAAA7F,EAAA,uBAAAwP,SAAA,SAAAC,GAA4DzP,EAAAsnB,uBAAA7X,GAA+B3J,WAAA,2BAAsC,CAAA9F,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAAvB,GAAA,2CAAAuB,EAAAW,GAAAX,EAAAvB,GAAA,6BAA6HoH,MAAA7F,EAAAunB,wCAAkD,oBAAAvnB,EAAAS,GAAA,KAAAN,EAAA,MAAAA,EAAA,OAAAH,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAAvB,GAAA,mDAAA0B,EAAA,SAAyJE,YAAA,SAAAE,MAAA,CAA4BmR,IAAA,wBAA6B,CAAAvR,EAAA,UAAeuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAA,oBAAA8F,WAAA,wBAAgGvF,MAAA,CAAS4C,GAAA,uBAA2B3C,GAAA,CAAKtB,OAAA,SAAA8G,GAA0B,IAAA2L,EAAA9I,MAAA+I,UAAAjN,OAAAkN,KAAA7L,EAAAC,OAAA6L,QAAA,SAAAC,GAAkF,OAAAA,EAAAhJ,WAAkBpF,IAAA,SAAAoO,GAA+D,MAA7C,WAAAA,IAAAC,OAAAD,EAAAlM,QAA0D7F,EAAAwnB,oBAAAxhB,EAAAC,OAAAgM,SAAAN,IAAA,MAAqF,CAAAxR,EAAA,UAAeI,MAAA,CAAOsF,MAAA,UAAiB,CAAA7F,EAAAS,GAAA,qBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,qDAAAuB,EAAAW,GAAA,SAAAX,EAAAynB,gCAAAznB,EAAAvB,GAAA,8DAAAuB,EAAAS,GAAA,KAAAN,EAAA,UAAyPI,MAAA,CAAOsF,MAAA,UAAiB,CAAA7F,EAAAS,GAAA,qBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,wDAAAuB,EAAAW,GAAA,YAAAX,EAAAynB,gCAAAznB,EAAAvB,GAAA,8DAAAuB,EAAAS,GAAA,KAAAN,EAAA,UAA+PI,MAAA,CAAOsF,MAAA,SAAgB,CAAA7F,EAAAS,GAAA,qBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,oDAAAuB,EAAAW,GAAA,QAAAX,EAAAynB,gCAAAznB,EAAAvB,GAAA,gEAAAuB,EAAAS,GAAA,KAAAN,EAAA,KAAoPE,YAAA,yBAA6BL,EAAAS,GAAA,KAAAT,EAAAumB,YAAApgB,OAAA,EAAAhG,EAAA,MAAAA,EAAA,OAAAH,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAAvB,GAAA,sDAAA0B,EAAA,SAA0KE,YAAA,SAAAE,MAAA,CAA4BmR,IAAA,oBAAyB,CAAAvR,EAAA,UAAeuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAA,gBAAA8F,WAAA,oBAAwFvF,MAAA,CAAS4C,GAAA,mBAAuB3C,GAAA,CAAKtB,OAAA,SAAA8G,GAA0B,IAAA2L,EAAA9I,MAAA+I,UAAAjN,OAAAkN,KAAA7L,EAAAC,OAAA6L,QAAA,SAAAC,GAAkF,OAAAA,EAAAhJ,WAAkBpF,IAAA,SAAAoO,GAA+D,MAA7C,WAAAA,IAAAC,OAAAD,EAAAlM,QAA0D7F,EAAA0nB,gBAAA1hB,EAAAC,OAAAgM,SAAAN,IAAA,MAAiF3R,EAAAoG,GAAApG,EAAA,qBAAA2nB,GAA+C,OAAAxnB,EAAA,UAAoB+I,IAAAye,EAAA5hB,SAAA,CAAyBF,MAAA8hB,IAAoB,CAAA3nB,EAAAS,GAAA,qBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,6BAAAkpB,EAAA,4BAAA3nB,EAAAW,GAAAX,EAAA4nB,8BAAAD,EAAA3nB,EAAAvB,GAAA,gEAAuP,GAAAuB,EAAAS,GAAA,KAAAN,EAAA,KAAyBE,YAAA,yBAA6BL,EAAAY,KAAAZ,EAAAS,GAAA,KAAAN,EAAA,MAAAA,EAAA,YAAqDoP,MAAA,CAAO1J,MAAA7F,EAAA,kBAAAwP,SAAA,SAAAC,GAAuDzP,EAAA6nB,kBAAApY,GAA0B3J,WAAA,sBAAiC,CAAA9F,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAAvB,GAAA,qCAAAuB,EAAAW,GAAAX,EAAAvB,GAAA,6BAAuHoH,MAAA7F,EAAA8nB,mCAA6C,oBAAA9nB,EAAAS,GAAA,KAAAN,EAAA,MAAAA,EAAA,YAA2DoP,MAAA,CAAO1J,MAAA7F,EAAA,2BAAAwP,SAAA,SAAAC,GAAgEzP,EAAA+nB,2BAAAtY,GAAmC3J,WAAA,+BAA0C,CAAA9F,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAAvB,GAAA,+DAAAuB,EAAAS,GAAA,KAAAN,EAAA,MAAAA,EAAA,YAAyIoP,MAAA,CAAO1J,MAAA7F,EAAA,SAAAwP,SAAA,SAAAC,GAA8CzP,EAAAgoB,SAAAvY,GAAiB3J,WAAA,aAAwB,CAAA9F,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAAvB,GAAA,+CAAAuB,EAAAS,GAAA,KAAAN,EAAA,OAA2GE,YAAA,gBAA2B,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,4BAAAuB,EAAAS,GAAA,KAAAN,EAAA,MAAiFE,YAAA,gBAA2B,CAAAF,EAAA,MAAAA,EAAA,YAA0BoP,MAAA,CAAO1J,MAAA7F,EAAA,gBAAAwP,SAAA,SAAAC,GAAqDzP,EAAAioB,gBAAAxY,GAAwB3J,WAAA,oBAA+B,CAAA9F,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAAvB,GAAA,wDAAAuB,EAAAS,GAAA,KAAAN,EAAA,MAAAA,EAAA,YAAkIoP,MAAA,CAAO1J,MAAA7F,EAAA,sBAAAwP,SAAA,SAAAC,GAA2DzP,EAAAkoB,sBAAAzY,GAA8B3J,WAAA,0BAAqC,CAAA9F,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAAvB,GAAA,2DAAAuB,EAAAS,GAAA,KAAAN,EAAA,MAAAA,EAAA,SAAkII,MAAA,CAAOmR,IAAA,kBAAuB,CAAA1R,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAAvB,GAAA,4CAAAuB,EAAAS,GAAA,KAAAN,EAAA,SAA0GuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,iBAAAC,MAAA7F,EAAA,cAAA8F,WAAA,gBAAAqiB,UAAA,CAAsGC,QAAA,KAAe/nB,YAAA,eAAAE,MAAA,CAAoC4C,GAAA,gBAAAhF,KAAA,SAAAkqB,IAAA,IAAAC,KAAA,KAA0DviB,SAAA,CAAWF,MAAA7F,EAAA,eAA4BQ,GAAA,CAAKpB,MAAA,SAAA4G,GAAyBA,EAAAC,OAAAC,YAAsClG,EAAAuoB,cAAAvoB,EAAAwoB,GAAAxiB,EAAAC,OAAAJ,SAA8C4iB,KAAA,SAAAziB,GAAyB,OAAAhG,EAAA0oB,qBAA4B1oB,EAAAS,GAAA,KAAAN,EAAA,MAAAA,EAAA,YAAwCoP,MAAA,CAAO1J,MAAA7F,EAAA,SAAAwP,SAAA,SAAAC,GAA8CzP,EAAA2oB,SAAAlZ,GAAiB3J,WAAA,aAAwB,CAAA9F,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAAvB,GAAA,mDAAAuB,EAAAS,GAAA,KAAAN,EAAA,MAA8GE,YAAA,2BAAsC,CAAAF,EAAA,MAAAA,EAAA,YAA0BI,MAAA,CAAO+G,UAAAtH,EAAA2oB,UAAyBpZ,MAAA,CAAQ1J,MAAA7F,EAAA,aAAAwP,SAAA,SAAAC,GAAkDzP,EAAA4oB,aAAAnZ,GAAqB3J,WAAA,iBAA4B,CAAA9F,EAAAS,GAAA,iBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,kDAAAuB,EAAAS,GAAA,KAAAN,EAAA,MAAAA,EAAA,YAA8HI,MAAA,CAAO+G,UAAAtH,EAAA2oB,UAAyBpZ,MAAA,CAAQ1J,MAAA7F,EAAA,gBAAAwP,SAAA,SAAAC,GAAqDzP,EAAA6oB,gBAAApZ,GAAwB3J,WAAA,oBAA+B,CAAA9F,EAAAS,GAAA,iBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,wDAAAuB,EAAAS,GAAA,KAAAN,EAAA,MAAAA,EAAA,YAAoIoP,MAAA,CAAO1J,MAAA7F,EAAA,SAAAwP,SAAA,SAAAC,GAA8CzP,EAAA8oB,SAAArZ,GAAiB3J,WAAA,aAAwB,CAAA9F,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAAvB,GAAA,2CAAAuB,EAAAS,GAAA,KAAAN,EAAA,MAAAA,EAAA,YAAqHoP,MAAA,CAAO1J,MAAA7F,EAAA,UAAAwP,SAAA,SAAAC,GAA+CzP,EAAA+oB,UAAAtZ,GAAkB3J,WAAA,cAAyB,CAAA9F,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAAvB,GAAA,wCAAAuB,EAAAS,GAAA,KAAAN,EAAA,MAAmGE,YAAA,0BAAAgK,MAAA,EAA8C/C,UAAAtH,EAAAinB,aAA2B,CAAA9mB,EAAA,MAAAA,EAAA,YAA0BI,MAAA,CAAO+G,UAAAtH,EAAA+oB,YAAA/oB,EAAAimB,qBAAsD1W,MAAA,CAAQ1J,MAAA7F,EAAA,oBAAAwP,SAAA,SAAAC,GAAyDzP,EAAAgpB,oBAAAvZ,GAA4B3J,WAAA,wBAAmC,CAAA9F,EAAAS,GAAA,mBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,wDAAAuB,EAAAS,GAAA,KAAAT,EAAAimB,oBAAgNjmB,EAAAY,KAAhNT,EAAA,OAAmJE,YAAA,eAA0B,CAAAF,EAAA,KAAUE,YAAA,eAAyBL,EAAAS,GAAA,KAAAT,EAAAW,GAAAX,EAAAvB,GAAA,gEAAAuB,EAAAS,GAAA,KAAAN,EAAA,MAAAA,EAAA,YAAyIoP,MAAA,CAAO1J,MAAA7F,EAAA,kBAAAwP,SAAA,SAAAC,GAAuDzP,EAAAipB,kBAAAxZ,GAA0B3J,WAAA,sBAAiC,CAAA9F,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAAvB,GAAA,sDAAAuB,EAAAS,GAAA,KAAAN,EAAA,MAAAA,EAAA,YAAgIoP,MAAA,CAAO1J,MAAA7F,EAAA,cAAAwP,SAAA,SAAAC,GAAmDzP,EAAAkpB,cAAAzZ,GAAsB3J,WAAA,kBAA6B,CAAA9F,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAAvB,GAAA,qDAAAuB,EAAAS,GAAA,KAAAN,EAAA,OAAiHE,YAAA,gBAA2B,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,8BAAAuB,EAAAS,GAAA,KAAAN,EAAA,MAAmFE,YAAA,gBAA2B,CAAAF,EAAA,MAAAA,EAAA,YAA0BoP,MAAA,CAAO1J,MAAA7F,EAAA,qBAAAwP,SAAA,SAAAC,GAA0DzP,EAAAmpB,qBAAA1Z,GAA6B3J,WAAA,yBAAoC,CAAA9F,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAAvB,GAAA,mEAAAuB,EAAAS,GAAA,KAAAN,EAAA,OAA+HE,YAAA,gBAA2B,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,oBAAAuB,EAAAS,GAAA,KAAAN,EAAA,MAAyEE,YAAA,gBAA2B,CAAAF,EAAA,MAAAA,EAAA,YAA0BoP,MAAA,CAAO1J,MAAA7F,EAAA,UAAAwP,SAAA,SAAAC,GAA+CzP,EAAAopB,UAAA3Z,GAAkB3J,WAAA,cAAyB,CAAA9F,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAAvB,GAAA,2BAAAuB,EAAAW,GAAAX,EAAAvB,GAAA,6BAA6GoH,MAAA7F,EAAAqpB,2BAAqC,2BACllW,IDIY,EAEb,KAEC,KAEU,MAYG,QEAjBC,GAlBI,CACjB1qB,KADiB,WAEf,IAAMsO,EAAW1O,KAAK8D,OAAOM,MAAMsK,SACnC,MAAO,CACLqc,eAAgBrc,EAASqc,eACzBC,gBAAiBtc,EAASsc,kBAG9B9mB,SAAU,CACR+mB,oBADQ,WAEN,MAbqB,wDAaOjrB,KAAKgrB,iBAEnCE,mBAJQ,WAKN,MAfqB,sDCFEC,EDiBmBnrB,KAAK+qB,gBCf7CK,EAAUD,EAAcE,MADhB,aAEGD,EAAQ,GAAK,IAHH,IAAAD,EAErBC,KCoBOE,GAVCjqB,OAAAC,EAAA,EAAAD,CACdkqB,GCdQ,WAAgB,IAAA/pB,EAAAxB,KAAayB,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBI,MAAA,CAAO4D,MAAAnE,EAAAvB,GAAA,4BAA0C,CAAA0B,EAAA,OAAYE,YAAA,gBAA2B,CAAAF,EAAA,MAAWE,YAAA,gBAA2B,CAAAF,EAAA,MAAAA,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,wCAAAuB,EAAAS,GAAA,KAAAN,EAAA,MAAqGE,YAAA,eAA0B,CAAAF,EAAA,MAAAA,EAAA,KAAmBI,MAAA,CAAOypB,KAAAhqB,EAAA0pB,mBAAAzjB,OAAA,WAAiD,CAAAjG,EAAAS,GAAAT,EAAAW,GAAAX,EAAAupB,yBAAAvpB,EAAAS,GAAA,KAAAN,EAAA,MAAAA,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,yCAAAuB,EAAAS,GAAA,KAAAN,EAAA,MAA6JE,YAAA,eAA0B,CAAAF,EAAA,MAAAA,EAAA,KAAmBI,MAAA,CAAOypB,KAAAhqB,EAAAypB,oBAAAxjB,OAAA,WAAkD,CAAAjG,EAAAS,GAAAT,EAAAW,GAAAX,EAAAwpB,iCAClqB,IDIY,EAEb,KAEC,KAEU,MAYG,2CE6BhCS,GAAA,CACAznB,WAAA,CACAC,SAAAynB,EAAA,GAEAjsB,MAAA,CAEA0H,KAAA,CACAtH,UAAA,EACAF,KAAAI,QAGA4F,MAAA,CACA9F,UAAA,EACAF,KAAAI,QAIAsH,MAAA,CACAxH,UAAA,EACAF,KAAAI,OACAT,aAAAud,GAGA8O,SAAA,CACA9rB,UAAA,EACAF,KAAAI,OACAT,aAAAud,GAGA/T,SAAA,CACAjJ,UAAA,EACAF,KAAAisB,QACAtsB,SAAA,GAGAusB,oBAAA,CACAhsB,UAAA,EACAF,KAAAisB,QACAtsB,SAAA,IAGA4E,SAAA,CACA4nB,QADA,WAEA,gBAAA9rB,KAAAqH,OAEA0kB,WAJA,WAKA,OAAA1qB,OAAA2qB,GAAA,EAAA3qB,CAAArB,KAAAqH,OAAArH,KAAA2rB,WAEAM,iBAPA,WAQA,sBAAAjsB,KAAAqH,OAEA6kB,cAVA,WAWA,OAAAlsB,KAAAqH,OAAArH,KAAAqH,MAAA8kB,WAAA,SC9FA,IAEIC,GAZJ,SAAoBjrB,GAClBnC,EAAQ,KACRA,EAAQ,MA0BKqtB,GAVChrB,OAAAC,EAAA,EAAAD,CACdoqB,GCnBQ,WAAgB,IAAAjqB,EAAAxB,KAAayB,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBE,YAAA,4BAAAgK,MAAA,CAA+C/C,UAAAtH,EAAAsqB,SAAAtqB,EAAAsH,WAA0C,CAAAnH,EAAA,SAAcE,YAAA,QAAAE,MAAA,CAA2BmR,IAAA1R,EAAA2F,OAAgB,CAAA3F,EAAAS,GAAA,SAAAT,EAAAW,GAAAX,EAAAmE,OAAA,UAAAnE,EAAAS,GAAA,cAAAT,EAAAmqB,UAAAnqB,EAAAqqB,oBAAAlqB,EAAA,YAA0IE,YAAA,MAAAE,MAAA,CAAyBkJ,QAAAzJ,EAAAsqB,QAAAhjB,SAAAtH,EAAAsH,UAA8C9G,GAAA,CAAKtB,OAAA,SAAA8G,GAA0B,OAAAhG,EAAAmT,MAAA,iBAAAnT,EAAA6F,MAAA7F,EAAAmqB,cAAA9O,OAAyFrb,EAAAY,KAAAZ,EAAAS,GAAA,KAAAN,EAAA,OAAiCE,YAAA,2BAAsC,CAAAF,EAAA,SAAcE,YAAA,qBAAAE,MAAA,CAAwC4C,GAAAnD,EAAA2F,KAAA,KAAAxH,KAAA,OAAAmJ,UAAAtH,EAAAsqB,SAAAtqB,EAAAsH,UAA2EvB,SAAA,CAAWF,MAAA7F,EAAA6F,OAAA7F,EAAAmqB,UAAkC3pB,GAAA,CAAKpB,MAAA,SAAA4G,GAAyB,OAAAhG,EAAAmT,MAAA,QAAAnN,EAAAC,OAAAJ,WAAiD7F,EAAAS,GAAA,KAAAT,EAAA,WAAAG,EAAA,SAA2CE,YAAA,uBAAAE,MAAA,CAA0C4C,GAAAnD,EAAA2F,KAAAxH,KAAA,QAAAmJ,UAAAtH,EAAAsqB,SAAAtqB,EAAAsH,UAAqEvB,SAAA,CAAWF,MAAA7F,EAAA6F,OAAA7F,EAAAmqB,UAAkC3pB,GAAA,CAAKpB,MAAA,SAAA4G,GAAyB,OAAAhG,EAAAmT,MAAA,QAAAnN,EAAAC,OAAAJ,WAAiD7F,EAAAY,KAAAZ,EAAAS,GAAA,KAAAT,EAAA,iBAAAG,EAAA,OAAwDE,YAAA,yBAAmCL,EAAAY,KAAAZ,EAAAS,GAAA,KAAAT,EAAA,cAAAG,EAAA,OAAqDE,YAAA,oBAAAoB,MAAA,CAAwCqpB,gBAAA9qB,EAAAmqB,YAAgCnqB,EAAAY,QAAA,IACp2C,IDSY,EAa7BgqB,GATiB,KAEU,MAYG,QEJjBG,GAVClrB,OAAAC,EAAA,EAAAD,CCoChB,CACA5B,MAAA,CACA,qFAEAyE,SAAA,CACA4nB,QADA,WAEA,gBAAA9rB,KAAAqH,SCxDU,WAAgB,IAAA7F,EAAAxB,KAAayB,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBE,YAAA,8BAAAgK,MAAA,CAAiD/C,UAAAtH,EAAAsqB,SAAAtqB,EAAAsH,WAA0C,CAAAnH,EAAA,SAAcE,YAAA,QAAAE,MAAA,CAA2BmR,IAAA1R,EAAA2F,OAAgB,CAAA3F,EAAAS,GAAA,SAAAT,EAAAW,GAAAX,EAAAmE,OAAA,UAAAnE,EAAAS,GAAA,cAAAT,EAAAmqB,SAAAhqB,EAAA,SAA4GE,YAAA,MAAAE,MAAA,CAAyB4C,GAAAnD,EAAA2F,KAAA,KAAAxH,KAAA,YAAuC4H,SAAA,CAAW0D,QAAAzJ,EAAAsqB,SAAsB9pB,GAAA,CAAKpB,MAAA,SAAA4G,GAAyB,OAAAhG,EAAAmT,MAAA,QAAAnT,EAAAsqB,aAAAjP,EAAArb,EAAAmqB,cAAqEnqB,EAAAY,KAAAZ,EAAAS,GAAA,cAAAT,EAAAmqB,SAAAhqB,EAAA,SAAyEE,YAAA,QAAAE,MAAA,CAA2BmR,IAAA1R,EAAA2F,KAAA,QAAuB3F,EAAAY,KAAAZ,EAAAS,GAAA,KAAAN,EAAA,SAAmCE,YAAA,eAAAE,MAAA,CAAkC4C,GAAAnD,EAAA2F,KAAAxH,KAAA,QAAAmJ,UAAAtH,EAAAsqB,SAAAtqB,EAAAsH,SAAA0jB,IAAAhrB,EAAAgrB,KAAAhrB,EAAAirB,SAAA,IAAA5C,IAAAroB,EAAAqoB,KAAAroB,EAAAkrB,SAAA,EAAA5C,KAAAtoB,EAAAsoB,MAAA,GAAgKviB,SAAA,CAAWF,MAAA7F,EAAA6F,OAAA7F,EAAAmqB,UAAkC3pB,GAAA,CAAKpB,MAAA,SAAA4G,GAAyB,OAAAhG,EAAAmT,MAAA,QAAAnN,EAAAC,OAAAJ,WAAiD7F,EAAAS,GAAA,KAAAN,EAAA,SAA0BE,YAAA,eAAAE,MAAA,CAAkC4C,GAAAnD,EAAA2F,KAAAxH,KAAA,SAAAmJ,UAAAtH,EAAAsqB,SAAAtqB,EAAAsH,SAAA0jB,IAAAhrB,EAAAirB,QAAA5C,IAAAroB,EAAAkrB,QAAA5C,KAAAtoB,EAAAsoB,MAAA,GAA+HviB,SAAA,CAAWF,MAAA7F,EAAA6F,OAAA7F,EAAAmqB,UAAkC3pB,GAAA,CAAKpB,MAAA,SAAA4G,GAAyB,OAAAhG,EAAAmT,MAAA,QAAAnN,EAAAC,OAAAJ,cAC7vC,IFKY,EAEb,KAEC,KAEU,MAYG,QGUhCslB,GAAA,CACA3oB,WAAA,CACAC,SAAAynB,EAAA,GAEAjsB,MAAA,CACA,sCAEAyE,SAAA,CACA4nB,QADA,WAEA,gBAAA9rB,KAAAqH,SCnBeulB,GAVCvrB,OAAAC,EAAA,EAAAD,CACdsrB,GCfQ,WAAgB,IAAAnrB,EAAAxB,KAAayB,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBE,YAAA,gCAAAgK,MAAA,CAAmD/C,UAAAtH,EAAAsqB,SAAAtqB,EAAAsH,WAA0C,CAAAnH,EAAA,SAAcE,YAAA,QAAAE,MAAA,CAA2BmR,IAAA1R,EAAA2F,OAAgB,CAAA3F,EAAAS,GAAA,SAAAT,EAAAW,GAAAX,EAAAvB,GAAA,4CAAAuB,EAAAS,GAAA,cAAAT,EAAAmqB,SAAAhqB,EAAA,YAA6IE,YAAA,MAAAE,MAAA,CAAyBkJ,QAAAzJ,EAAAsqB,QAAAhjB,SAAAtH,EAAAsH,UAA8C9G,GAAA,CAAKtB,OAAA,SAAA8G,GAA0B,OAAAhG,EAAAmT,MAAA,QAAAnT,EAAAsqB,aAAAjP,EAAArb,EAAAmqB,cAAqEnqB,EAAAY,KAAAZ,EAAAS,GAAA,KAAAN,EAAA,SAAmCE,YAAA,eAAAE,MAAA,CAAkC4C,GAAAnD,EAAA2F,KAAAxH,KAAA,SAAAmJ,UAAAtH,EAAAsqB,SAAAtqB,EAAAsH,SAAA0jB,IAAA,IAAA3C,IAAA,IAAAC,KAAA,OAAuGviB,SAAA,CAAWF,MAAA7F,EAAA6F,OAAA7F,EAAAmqB,UAAkC3pB,GAAA,CAAKpB,MAAA,SAAA4G,GAAyB,OAAAhG,EAAAmT,MAAA,QAAAnN,EAAAC,OAAAJ,YAAiD,IAC70B,IDKY,EAEb,KAEC,KAEU,MAYG,qOEnBhC,IAAMwlB,GAAU,iXAAAC,CAAA,CACdC,EAAG,EACHC,EAAG,EACH/C,KAAM,EACNgD,OAAQ,EACRC,OAAO,EACPC,MAAO,UACPC,MAAO,GAPO7P,UAAA5V,OAAA,QAAAkV,IAAAU,UAAA,GAAAA,UAAA,GAAU,KAWX8P,GAAA,CAKb5tB,MAAO,CACL,QAAS,WAAY,SAEvBW,KARa,WASX,MAAO,CACLktB,WAAY,EAEZC,QAASvtB,KAAKqH,OAASrH,KAAK2rB,UAAY,IAAIxmB,IAAI0nB,MAGpD7oB,WAAY,CACVwpB,cACAC,iBAEFhtB,QAAS,CACPpB,IADO,WAELW,KAAKutB,OAAOhuB,KAAKstB,GAAQ7sB,KAAKuK,WAC9BvK,KAAKstB,WAAattB,KAAKutB,OAAO5lB,OAAS,GAEzC+lB,IALO,WAML1tB,KAAKutB,OAAOriB,OAAOlL,KAAKstB,WAAY,GACpCttB,KAAKstB,WAAoC,IAAvBttB,KAAKutB,OAAO5lB,YAAekV,EAAY8Q,KAAKnB,IAAIxsB,KAAKstB,WAAa,EAAG,IAEzFM,OATO,WAUL,IAAMvR,EAAUrc,KAAKutB,OAAOriB,OAAOlL,KAAKstB,WAAY,GAAG,GACvDttB,KAAKutB,OAAOriB,OAAOlL,KAAKstB,WAAa,EAAG,EAAGjR,GAC3Crc,KAAKstB,YAAc,GAErBO,OAdO,WAeL,IAAMxR,EAAUrc,KAAKutB,OAAOriB,OAAOlL,KAAKstB,WAAY,GAAG,GACvDttB,KAAKutB,OAAOriB,OAAOlL,KAAKstB,WAAa,EAAG,EAAGjR,GAC3Crc,KAAKstB,YAAc,IAGvBQ,aAvCa,WAwCX9tB,KAAKutB,OAASvtB,KAAKqH,OAASrH,KAAK2rB,UAEnCznB,SAAU,CACR6pB,WADQ,WAEN,OAAO/tB,KAAKutB,OAAO5lB,OAAS,GAE9BqmB,mBAJQ,WAKN,OAAOhuB,KAAK2rB,SAAShkB,OAAS,GAEhC4C,SAPQ,WAQN,OAAIvK,KAAKoU,OAASpU,KAAK+tB,WACd/tB,KAAKutB,OAAOvtB,KAAKstB,YAEjBT,GAAQ,KAGnBoB,gBAdQ,WAeN,OAAIjuB,KAAKoU,OAASpU,KAAKguB,mBACdhuB,KAAK2rB,SAAS3rB,KAAKstB,YAEnBT,GAAQ,KAGnBqB,YArBQ,WAsBN,OAAOluB,KAAKoU,OAASpU,KAAKstB,WAAa,GAEzCa,YAxBQ,WAyBN,OAAOnuB,KAAKoU,OAASpU,KAAKstB,WAAattB,KAAKutB,OAAO5lB,OAAS,GAE9DmkB,QA3BQ,WA4BN,OAAO9rB,KAAKoU,YAC8B,IAAjCpU,KAAKutB,OAAOvtB,KAAKstB,cACvBttB,KAAKouB,eAEVA,cAhCQ,WAiCN,YAA6B,IAAfpuB,KAAKqH,OAErBgnB,IAnCQ,WAoCN,OAAOC,aAAQtuB,KAAKuK,SAAS4iB,QAE/BlqB,MAtCQ,WAuCN,OAAOjD,KAAKoU,MAAQ,CAClBma,UAAWC,aAAaxuB,KAAK2rB,WAC3B,MC3FV,IAEI8C,GAVJ,SAAoBttB,GAClBnC,EAAQ,MAyBK0vB,GAVCrtB,OAAAC,EAAA,EAAAD,CACdgsB,GCjBQ,WAAgB,IAAA7rB,EAAAxB,KAAayB,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBE,YAAA,iBAAAgK,MAAA,CAAoC/C,UAAAtH,EAAAsqB,UAA0B,CAAAnqB,EAAA,OAAYE,YAAA,4BAAuC,CAAAF,EAAA,OAAYE,YAAA,kBAAAE,MAAA,CAAqC+G,UAAAtH,EAAAsqB,UAAyB,CAAAnqB,EAAA,SAAcuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAA+I,SAAA,EAAAjD,WAAA,eAA8EzF,YAAA,eAAAE,MAAA,CAAoC+G,UAAAtH,EAAAsqB,QAAAnsB,KAAA,UAAwC4H,SAAA,CAAWF,MAAA7F,EAAA+I,SAAA,GAAyBvI,GAAA,CAAKpB,MAAA,SAAA4G,GAAyBA,EAAAC,OAAAC,WAAsClG,EAAA0P,KAAA1P,EAAA+I,SAAA,IAAA/C,EAAAC,OAAAJ,WAAmD7F,EAAAS,GAAA,KAAAN,EAAA,OAAwBE,YAAA,QAAmB,CAAAF,EAAA,SAAcuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAA+I,SAAA,EAAAjD,WAAA,eAA8EzF,YAAA,cAAAE,MAAA,CAAmC+G,UAAAtH,EAAAsqB,QAAAnsB,KAAA,QAAA6sB,IAAA,KAAA3C,IAAA,OAA8DtiB,SAAA,CAAWF,MAAA7F,EAAA+I,SAAA,GAAyBvI,GAAA,CAAK2sB,IAAA,SAAAnnB,GAAuB,OAAAhG,EAAA0P,KAAA1P,EAAA+I,SAAA,IAAA/C,EAAAC,OAAAJ,eAA0D7F,EAAAS,GAAA,KAAAN,EAAA,OAA4BE,YAAA,kBAA6B,CAAAF,EAAA,OAAYE,YAAA,gBAAAoB,MAAAzB,EAAA,UAA8CA,EAAAS,GAAA,KAAAN,EAAA,OAA0BE,YAAA,kBAAAE,MAAA,CAAqC+G,UAAAtH,EAAAsqB,UAAyB,CAAAnqB,EAAA,SAAcuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAA+I,SAAA,EAAAjD,WAAA,eAA8EzF,YAAA,eAAAE,MAAA,CAAoC+G,UAAAtH,EAAAsqB,QAAAnsB,KAAA,UAAwC4H,SAAA,CAAWF,MAAA7F,EAAA+I,SAAA,GAAyBvI,GAAA,CAAKpB,MAAA,SAAA4G,GAAyBA,EAAAC,OAAAC,WAAsClG,EAAA0P,KAAA1P,EAAA+I,SAAA,IAAA/C,EAAAC,OAAAJ,WAAmD7F,EAAAS,GAAA,KAAAN,EAAA,OAAwBE,YAAA,QAAmB,CAAAF,EAAA,SAAcuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAA+I,SAAA,EAAAjD,WAAA,eAA8EzF,YAAA,cAAAE,MAAA,CAAmC+G,UAAAtH,EAAAsqB,QAAAnsB,KAAA,QAAA6sB,IAAA,KAAA3C,IAAA,OAA8DtiB,SAAA,CAAWF,MAAA7F,EAAA+I,SAAA,GAAyBvI,GAAA,CAAK2sB,IAAA,SAAAnnB,GAAuB,OAAAhG,EAAA0P,KAAA1P,EAAA+I,SAAA,IAAA/C,EAAAC,OAAAJ,iBAA0D7F,EAAAS,GAAA,KAAAN,EAAA,OAA8BE,YAAA,gBAA2B,CAAAF,EAAA,OAAYE,YAAA,2BAAAE,MAAA,CAA8C+G,SAAAtH,EAAA4sB,gBAA8B,CAAAzsB,EAAA,SAAcE,YAAA,SAAAE,MAAA,CAA4BmR,IAAA,kBAAApK,UAAAtH,EAAA4S,OAAA5S,EAAA4sB,gBAAoE,CAAAzsB,EAAA,UAAeuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAA,WAAA8F,WAAA,eAA8EzF,YAAA,kBAAAE,MAAA,CAAuC4C,GAAA,kBAAAmE,UAAAtH,EAAA4S,OAAA5S,EAAA4sB,eAAkEpsB,GAAA,CAAKtB,OAAA,SAAA8G,GAA0B,IAAA2L,EAAA9I,MAAA+I,UAAAjN,OAAAkN,KAAA7L,EAAAC,OAAA6L,QAAA,SAAAC,GAAkF,OAAAA,EAAAhJ,WAAkBpF,IAAA,SAAAoO,GAA+D,MAA7C,WAAAA,IAAAC,OAAAD,EAAAlM,QAA0D7F,EAAA8rB,WAAA9lB,EAAAC,OAAAgM,SAAAN,IAAA,MAA4E3R,EAAAoG,GAAApG,EAAA,gBAAAotB,EAAA9K,GAA4C,OAAAniB,EAAA,UAAoB+I,IAAAoZ,EAAAvc,SAAA,CAAoBF,MAAAyc,IAAe,CAAAtiB,EAAAS,GAAA,iBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,oCAA6EoH,MAAAyc,KAAe,oBAAqB,GAAAtiB,EAAAS,GAAA,KAAAN,EAAA,KAAyBE,YAAA,qBAA6BL,EAAAS,GAAA,KAAAN,EAAA,UAA6BE,YAAA,kBAAAE,MAAA,CAAqC+G,UAAAtH,EAAA4S,QAAA5S,EAAAsqB,SAAsC9pB,GAAA,CAAKE,MAAAV,EAAAksB,MAAiB,CAAA/rB,EAAA,KAAUE,YAAA,kBAA0BL,EAAAS,GAAA,KAAAN,EAAA,UAA6BE,YAAA,kBAAAE,MAAA,CAAqC+G,UAAAtH,EAAA0sB,aAA4BlsB,GAAA,CAAKE,MAAAV,EAAAosB,SAAoB,CAAAjsB,EAAA,KAAUE,YAAA,mBAA2BL,EAAAS,GAAA,KAAAN,EAAA,UAA6BE,YAAA,kBAAAE,MAAA,CAAqC+G,UAAAtH,EAAA2sB,aAA4BnsB,GAAA,CAAKE,MAAAV,EAAAqsB,SAAoB,CAAAlsB,EAAA,KAAUE,YAAA,qBAA6BL,EAAAS,GAAA,KAAAN,EAAA,UAA6BE,YAAA,kBAAAE,MAAA,CAAqC+G,SAAAtH,EAAA4sB,eAA6BpsB,GAAA,CAAKE,MAAAV,EAAAnC,MAAiB,CAAAsC,EAAA,KAAUE,YAAA,kBAAwBL,EAAAS,GAAA,KAAAN,EAAA,OAA4BE,YAAA,8BAAAE,MAAA,CAAiD+G,UAAAtH,EAAAsqB,UAAyB,CAAAnqB,EAAA,SAAcE,YAAA,QAAAE,MAAA,CAA2BmR,IAAA,UAAe,CAAA1R,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,+CAAAuB,EAAAS,GAAA,KAAAN,EAAA,SAA2GuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAA+I,SAAA,MAAAjD,WAAA,mBAAsFzF,YAAA,cAAAE,MAAA,CAAmC4C,GAAA,QAAAmE,UAAAtH,EAAAsqB,QAAA3kB,KAAA,QAAAxH,KAAA,YAAsE4H,SAAA,CAAW0D,QAAAZ,MAAAwkB,QAAArtB,EAAA+I,SAAA2iB,OAAA1rB,EAAAstB,GAAAttB,EAAA+I,SAAA2iB,MAAA,SAAA1rB,EAAA+I,SAAA,OAAoGvI,GAAA,CAAKtB,OAAA,SAAA8G,GAA0B,IAAAunB,EAAAvtB,EAAA+I,SAAA2iB,MAAA8B,EAAAxnB,EAAAC,OAAAwnB,IAAAD,EAAA/jB,QAA8E,GAAAZ,MAAAwkB,QAAAE,GAAA,CAAuB,IAAAG,EAAA1tB,EAAAstB,GAAAC,EAAA,MAAiCC,EAAA/jB,QAAiBikB,EAAA,GAAA1tB,EAAA0P,KAAA1P,EAAA+I,SAAA,QAAAwkB,EAAApiB,OAAA,CAAlD,QAAmHuiB,GAAA,GAAA1tB,EAAA0P,KAAA1P,EAAA+I,SAAA,QAAAwkB,EAAA3jB,MAAA,EAAA8jB,GAAAviB,OAAAoiB,EAAA3jB,MAAA8jB,EAAA,UAA2F1tB,EAAA0P,KAAA1P,EAAA+I,SAAA,QAAA0kB,OAAwCztB,EAAAS,GAAA,KAAAN,EAAA,SAA0BE,YAAA,iBAAAE,MAAA,CAAoCmR,IAAA,aAAe1R,EAAAS,GAAA,KAAAN,EAAA,OAA0BE,YAAA,6BAAAE,MAAA,CAAgD+G,UAAAtH,EAAAsqB,UAAyB,CAAAnqB,EAAA,SAAcE,YAAA,QAAAE,MAAA,CAA2BmR,IAAA,WAAgB,CAAA1R,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,8CAAAuB,EAAAS,GAAA,KAAAN,EAAA,SAA0GuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAA+I,SAAA,KAAAjD,WAAA,kBAAoFzF,YAAA,cAAAE,MAAA,CAAmC4C,GAAA,OAAAmE,UAAAtH,EAAAsqB,QAAA3kB,KAAA,OAAAxH,KAAA,QAAA6sB,IAAA,KAAA3C,IAAA,KAAsFtiB,SAAA,CAAWF,MAAA7F,EAAA+I,SAAA,MAA4BvI,GAAA,CAAK2sB,IAAA,SAAAnnB,GAAuB,OAAAhG,EAAA0P,KAAA1P,EAAA+I,SAAA,OAAA/C,EAAAC,OAAAJ,WAA6D7F,EAAAS,GAAA,KAAAN,EAAA,SAA0BuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAA+I,SAAA,KAAAjD,WAAA,kBAAoFzF,YAAA,eAAAE,MAAA,CAAoC+G,UAAAtH,EAAAsqB,QAAAnsB,KAAA,SAAAkqB,IAAA,KAAkDtiB,SAAA,CAAWF,MAAA7F,EAAA+I,SAAA,MAA4BvI,GAAA,CAAKpB,MAAA,SAAA4G,GAAyBA,EAAAC,OAAAC,WAAsClG,EAAA0P,KAAA1P,EAAA+I,SAAA,OAAA/C,EAAAC,OAAAJ,aAAsD7F,EAAAS,GAAA,KAAAN,EAAA,OAA0BE,YAAA,+BAAAE,MAAA,CAAkD+G,UAAAtH,EAAAsqB,UAAyB,CAAAnqB,EAAA,SAAcE,YAAA,QAAAE,MAAA,CAA2BmR,IAAA,WAAgB,CAAA1R,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,gDAAAuB,EAAAS,GAAA,KAAAN,EAAA,SAA4GuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAA+I,SAAA,OAAAjD,WAAA,oBAAwFzF,YAAA,cAAAE,MAAA,CAAmC4C,GAAA,SAAAmE,UAAAtH,EAAAsqB,QAAA3kB,KAAA,SAAAxH,KAAA,QAAA6sB,IAAA,KAAA3C,IAAA,OAA4FtiB,SAAA,CAAWF,MAAA7F,EAAA+I,SAAA,QAA8BvI,GAAA,CAAK2sB,IAAA,SAAAnnB,GAAuB,OAAAhG,EAAA0P,KAAA1P,EAAA+I,SAAA,SAAA/C,EAAAC,OAAAJ,WAA+D7F,EAAAS,GAAA,KAAAN,EAAA,SAA0BuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAA+I,SAAA,OAAAjD,WAAA,oBAAwFzF,YAAA,eAAAE,MAAA,CAAoC+G,UAAAtH,EAAAsqB,QAAAnsB,KAAA,UAAwC4H,SAAA,CAAWF,MAAA7F,EAAA+I,SAAA,QAA8BvI,GAAA,CAAKpB,MAAA,SAAA4G,GAAyBA,EAAAC,OAAAC,WAAsClG,EAAA0P,KAAA1P,EAAA+I,SAAA,SAAA/C,EAAAC,OAAAJ,aAAwD7F,EAAAS,GAAA,KAAAN,EAAA,cAAiCI,MAAA,CAAO+G,UAAAtH,EAAAsqB,QAAAnmB,MAAAnE,EAAAvB,GAAA,+BAAA0rB,SAAAnqB,EAAAysB,gBAAAd,MAAAgC,yBAAA,EAAAhoB,KAAA,UAAyJ4J,MAAA,CAAQ1J,MAAA7F,EAAA+I,SAAA,MAAAyG,SAAA,SAAAC,GAAoDzP,EAAA0P,KAAA1P,EAAA+I,SAAA,QAAA0G,IAAqC3J,WAAA,oBAA8B9F,EAAAS,GAAA,KAAAN,EAAA,gBAAiCI,MAAA,CAAO+G,UAAAtH,EAAAsqB,SAAwB/a,MAAA,CAAQ1J,MAAA7F,EAAA+I,SAAA,MAAAyG,SAAA,SAAAC,GAAoDzP,EAAA0P,KAAA1P,EAAA+I,SAAA,QAAA0G,IAAqC3J,WAAA,oBAA8B9F,EAAAS,GAAA,KAAAN,EAAA,QAAyBI,MAAA,CAAOqtB,KAAA,gCAAAC,IAAA,MAAkD,CAAA1tB,EAAA,QAAAH,EAAAS,GAAA,6BACr9N,IDOY,EAa7BwsB,GATiB,KAEU,MAYG,QExBjBa,GAAA,CACb7vB,MAAO,CACL,OAAQ,QAAS,QAAS,WAAY,UAAW,cAEnDW,KAJa,WAKX,MAAO,CACLmvB,OAAQvvB,KAAKqH,MACbmoB,iBAAkB,CAChBxvB,KAAKyvB,UAAY,GAAK,UACtB,UAFgB9iB,OAAAG,IAGZ9M,KAAKsT,SAAW,IAHJ,CAIhB,QACA,YACA,eACAnN,OAAO,SAAAggB,GAAC,OAAIA,MAGlB2H,aAjBa,WAkBX9tB,KAAKuvB,OAASvvB,KAAKqH,OAErBnD,SAAU,CACR4nB,QADQ,WAEN,YAA8B,IAAhB9rB,KAAKuvB,QAErBG,OAJQ,WAKN,OAAO1vB,KAAKuvB,QAAUvvB,KAAK2rB,UAAY,IAEzCgE,OAAQ,CACNxhB,IADM,WAEJ,OAAOnO,KAAK0vB,OAAOC,QAErB9d,IAJM,SAIDnF,GACHmF,cAAI7R,KAAKuvB,OAAQ,SAAU7iB,GAC3B1M,KAAK2U,MAAM,QAAS3U,KAAKuvB,UAG7BK,SAhBQ,WAiBN,MAAuB,WAAhB5vB,KAAK6vB,QAEdA,OAAQ,CACN1hB,IADM,WAEJ,MAAoB,UAAhBnO,KAAK2vB,QACW,eAAhB3vB,KAAK2vB,QACW,cAAhB3vB,KAAK2vB,QACW,YAAhB3vB,KAAK2vB,OACA3vB,KAAK2vB,OAEL,UAGX9d,IAXM,SAWDnF,GACH1M,KAAK2vB,OAAe,WAANjjB,EAAiB,GAAKA,MC7C5C,IAEIojB,GAVJ,SAAoB3uB,GAClBnC,EAAQ,MAyBK+wB,GAVC1uB,OAAAC,EAAA,EAAAD,CACdiuB,GCjBQ,WAAgB,IAAA9tB,EAAAxB,KAAayB,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBE,YAAA,6BAAAgK,MAAA,CAAgDmkB,OAAAxuB,EAAAouB,WAAwB,CAAAjuB,EAAA,SAAcE,YAAA,QAAAE,MAAA,CAA2BmR,IAAA,WAAA1R,EAAAquB,OAAAruB,EAAA2F,KAAA3F,EAAA2F,KAAA,mBAAwE,CAAA3F,EAAAS,GAAA,SAAAT,EAAAW,GAAAX,EAAAmE,OAAA,UAAAnE,EAAAS,GAAA,cAAAT,EAAAmqB,SAAAhqB,EAAA,SAA4GE,YAAA,uBAAAE,MAAA,CAA0C4C,GAAAnD,EAAA2F,KAAA,KAAAxH,KAAA,YAAuC4H,SAAA,CAAW0D,QAAAzJ,EAAAsqB,SAAsB9pB,GAAA,CAAKpB,MAAA,SAAA4G,GAAyB,OAAAhG,EAAAmT,MAAA,iBAAAnT,EAAA6F,MAAA7F,EAAAmqB,cAAA9O,OAAyFrb,EAAAY,KAAAZ,EAAAS,GAAA,cAAAT,EAAAmqB,SAAAhqB,EAAA,SAAyEE,YAAA,QAAAE,MAAA,CAA2BmR,IAAA1R,EAAA2F,KAAA,QAAuB3F,EAAAY,KAAAZ,EAAAS,GAAA,KAAAN,EAAA,SAAmCE,YAAA,SAAAE,MAAA,CAA4BmR,IAAA1R,EAAA2F,KAAA,iBAAA2B,UAAAtH,EAAAsqB,UAA2D,CAAAnqB,EAAA,UAAeuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAA,OAAA8F,WAAA,WAAsEzF,YAAA,gBAAAE,MAAA,CAAqC4C,GAAAnD,EAAA2F,KAAA,iBAAA2B,UAAAtH,EAAAsqB,SAAyD9pB,GAAA,CAAKtB,OAAA,SAAA8G,GAA0B,IAAA2L,EAAA9I,MAAA+I,UAAAjN,OAAAkN,KAAA7L,EAAAC,OAAA6L,QAAA,SAAAC,GAAkF,OAAAA,EAAAhJ,WAAkBpF,IAAA,SAAAoO,GAA+D,MAA7C,WAAAA,IAAAC,OAAAD,EAAAlM,QAA0D7F,EAAAquB,OAAAroB,EAAAC,OAAAgM,SAAAN,IAAA,MAAwE3R,EAAAoG,GAAApG,EAAA,0BAAAyuB,GAAgD,OAAAtuB,EAAA,UAAoB+I,IAAAulB,EAAA1oB,SAAA,CAAqBF,MAAA4oB,IAAgB,CAAAzuB,EAAAS,GAAA,aAAAT,EAAAW,GAAA,WAAA8tB,EAAAzuB,EAAAvB,GAAA,+BAAAgwB,GAAA,gBAAiH,GAAAzuB,EAAAS,GAAA,KAAAN,EAAA,KAAyBE,YAAA,qBAA6BL,EAAAS,GAAA,KAAAT,EAAA,SAAAG,EAAA,SAA2CuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAA,OAAA8F,WAAA,WAAsEzF,YAAA,cAAAE,MAAA,CAAmC4C,GAAAnD,EAAA2F,KAAAxH,KAAA,QAA4B4H,SAAA,CAAWF,MAAA7F,EAAA,QAAqBQ,GAAA,CAAKpB,MAAA,SAAA4G,GAAyBA,EAAAC,OAAAC,YAAsClG,EAAAmuB,OAAAnoB,EAAAC,OAAAJ,WAAiC7F,EAAAY,QACn4D,IDOY,EAa7B0tB,GATiB,KAEU,MAYG,QEYhCI,GAAA,CACAzwB,MAAA,CACA0wB,MAAA,CACAtwB,UAAA,GAIAuwB,SAAA,CACAvwB,UAAA,EACAF,KAAA0B,SAGA6C,SAAA,CACAmsB,KADA,WAEA,IAAAC,EAAAtwB,KAAAowB,SAAAG,IAAA,MAAAvwB,KAAAowB,SAAAI,GAAA,WACAC,EAAAzwB,KAAAC,GAAA,wCAAA0M,OAAA2jB,IACAnvB,EAAAnB,KAAAC,GAAA,+CACAywB,EAAA1wB,KAAAowB,SAAAO,KACA,OAAA3wB,KAAAC,GAAA,uCAAAwwB,QAAAtvB,UAAAuvB,WAEAE,UARA,WASA,IAAAN,EAAAtwB,KAAAowB,SAAAS,KAAA,MAAA7wB,KAAAowB,SAAAU,IAAA,WACAL,EAAAzwB,KAAAC,GAAA,wCAAA0M,OAAA2jB,IACAnvB,EAAAnB,KAAAC,GAAA,+CACAywB,EAAA1wB,KAAAowB,SAAAO,KACA,OAAA3wB,KAAAC,GAAA,uCAAAwwB,QAAAtvB,UAAAuvB,aCtDA,IAEIK,GAXJ,SAAoB5vB,GAClBnC,EAAQ,MA0BKgyB,GAVC3vB,OAAAC,EAAA,EAAAD,CACd6uB,GClBQ,WAAgB,IAAA1uB,EAAAxB,KAAayB,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAD,EAAA,SAAAG,EAAA,QAAiCE,YAAA,kBAA6B,CAAAF,EAAA,QAAaE,YAAA,SAAAE,MAAA,CAA4BskB,MAAA7kB,EAAA6uB,OAAkB,CAAA7uB,EAAA4uB,SAAA,IAAAzuB,EAAA,QAAAA,EAAA,KAAwCE,YAAA,yBAAiCL,EAAAY,KAAAZ,EAAAS,GAAA,MAAAT,EAAA4uB,SAAAG,KAAA/uB,EAAA4uB,SAAAI,GAAA7uB,EAAA,QAAAA,EAAA,KAAmFE,YAAA,kBAA0BL,EAAAY,KAAAZ,EAAAS,GAAA,KAAAT,EAAA4uB,SAAAG,KAAA/uB,EAAA4uB,SAAAI,GAAiHhvB,EAAAY,KAAjHT,EAAA,QAAAA,EAAA,KAAoFE,YAAA,uBAA6BL,EAAAS,GAAA,KAAAT,EAAA4uB,UAAA5uB,EAAA2uB,MAAAxuB,EAAA,QAAkEE,YAAA,SAAAE,MAAA,CAA4BskB,MAAA7kB,EAAAovB,YAAuB,CAAApvB,EAAA4uB,SAAA,KAAAzuB,EAAA,QAAAA,EAAA,KAAyCE,YAAA,yBAAiCL,EAAAY,KAAAZ,EAAAS,GAAA,MAAAT,EAAA4uB,SAAAS,MAAArvB,EAAA4uB,SAAAU,IAAAnvB,EAAA,QAAAA,EAAA,KAAqFE,YAAA,kBAA0BL,EAAAY,KAAAZ,EAAAS,GAAA,KAAAT,EAAA4uB,SAAAS,MAAArvB,EAAA4uB,SAAAU,IAAmHtvB,EAAAY,KAAnHT,EAAA,QAAAA,EAAA,KAAsFE,YAAA,uBAA6BL,EAAAY,OAAAZ,EAAAY,MACv4B,IDQY,EAa7B2uB,GATiB,KAEU,MAYG,QEAhCE,GAAA,CACAxxB,MAAA,CACA,eACA,cACA,cACA,mBACA,YACA,WACA,mBAEAW,KAVA,WAWA,OACA8wB,cAAA,IAGAzwB,QAAA,CACA0wB,WADA,WAEA,IAAAC,EAAAC,KAAAC,UAAAtxB,KAAAuxB,aAAA,QAGAtf,EAAApP,SAAAC,cAAA,KACAmP,EAAAlP,aAAA,iCACAkP,EAAAlP,aAAA,uCAAAyY,OAAAgW,KAAAJ,IACAnf,EAAAhP,MAAAC,QAAA,OAEAL,SAAAM,KAAAC,YAAA6O,GACAA,EAAA/P,QACAW,SAAAM,KAAAE,YAAA4O,IAEAwf,WAdA,WAcA,IAAA1wB,EAAAf,KACAA,KAAAkxB,cAAA,EACA,IAAAQ,EAAA7uB,SAAAC,cAAA,SACA4uB,EAAA3uB,aAAA,eACA2uB,EAAA3uB,aAAA,kBAEA2uB,EAAAlT,iBAAA,kBAAAuF,GACA,GAAAA,EAAAtc,OAAA5G,MAAA,IAEA,IAAAsd,EAAA,IAAAC,WACAD,EAAAE,OAAA,SAAArS,GAAA,IAAAvE,EAAAuE,EAAAvE,OACA,IACA,IAAAkqB,EAAAN,KAAAO,MAAAnqB,EAAA0Q,QACApX,EAAA8wB,UAAAF,GAEA5wB,EAAA+wB,SAAAH,GAEA5wB,EAAAmwB,cAAA,EAGA,MAAAjf,GAEAlR,EAAAmwB,cAAA,IAIA/S,EAAA4T,WAAAhO,EAAAtc,OAAA5G,MAAA,OAIAgC,SAAAM,KAAAC,YAAAsuB,GACAA,EAAAxvB,QACAW,SAAAM,KAAAE,YAAAquB,MC/EA,IAEIM,GAXJ,SAAoB7wB,GAClBnC,EAAQ,MA0BKizB,GAVC5wB,OAAAC,EAAA,EAAAD,CACd4vB,GClBQ,WAAgB,IAAAzvB,EAAAxB,KAAayB,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBE,YAAA,2BAAsC,CAAAL,EAAAsG,GAAA,UAAAtG,EAAAS,GAAA,KAAAN,EAAA,UAA4CE,YAAA,MAAAG,GAAA,CAAsBE,MAAAV,EAAA2vB,aAAwB,CAAA3vB,EAAAS,GAAA,SAAAT,EAAAW,GAAAX,EAAA0wB,aAAA,UAAA1wB,EAAAS,GAAA,KAAAN,EAAA,UAA6EE,YAAA,MAAAG,GAAA,CAAsBE,MAAAV,EAAAiwB,aAAwB,CAAAjwB,EAAAS,GAAA,SAAAT,EAAAW,GAAAX,EAAA2wB,aAAA,UAAA3wB,EAAAS,GAAA,KAAAT,EAAAsG,GAAA,gBAAAtG,EAAAS,GAAA,KAAAT,EAAA,aAAAG,EAAA,KAA8HE,YAAA,eAA0B,CAAAL,EAAAS,GAAA,SAAAT,EAAAW,GAAAX,EAAA4wB,kBAAA,UAAA5wB,EAAAY,KAAAZ,EAAAS,GAAA,KAAAT,EAAAsG,GAAA,mBAC1e,IDQY,EAa7BkqB,GATiB,KAEU,MAYG,QEvBhC,IAMIK,GAVJ,SAAoBlxB,GAClBnC,EAAQ,MAyBKszB,GAVCjxB,OAAAC,EAAA,EAAAD,CAZhB,KCJU,WAAgB,IAAAG,EAAAxB,KAAayB,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBE,YAAA,qBAAgC,CAAAF,EAAA,OAAYE,YAAA,8BAAwCL,EAAAS,GAAA,KAAAN,EAAA,OAAwBE,YAAA,eAA0B,CAAAF,EAAA,OAAYE,YAAA,iBAA4B,CAAAF,EAAA,OAAYE,YAAA,SAAoB,CAAAL,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,gDAAA0B,EAAA,QAA+FE,YAAA,4BAAuC,CAAAL,EAAAS,GAAA,gCAAAT,EAAAS,GAAA,KAAAN,EAAA,QAAgEE,YAAA,SAAoB,CAAAL,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,sDAAAuB,EAAAS,GAAA,KAAAN,EAAA,QAAiHE,YAAA,eAA0B,CAAAL,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,+CAAAuB,EAAAS,GAAA,KAAAN,EAAA,UAA4GE,YAAA,OAAkB,CAAAL,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,kDAAAuB,EAAAS,GAAA,KAAAN,EAAA,OAA4GE,YAAA,oCAA+C,CAAAF,EAAA,OAAYE,YAAA,QAAmB,CAAAF,EAAA,OAAYE,YAAA,sBAAiC,CAAAL,EAAAS,GAAA,uCAAAT,EAAAS,GAAA,KAAAN,EAAA,OAAsEE,YAAA,WAAsB,CAAAF,EAAA,MAAAH,EAAAS,GAAA,iBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,qDAAAuB,EAAAS,GAAA,KAAAN,EAAA,QAA6HI,MAAA,CAAOqtB,KAAA,gCAAsC,CAAAztB,EAAA,QAAa4wB,YAAA,CAAaC,cAAA,wBAAqC,CAAAhxB,EAAAS,GAAA,mBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,oDAAAuB,EAAAS,GAAA,KAAAN,EAAA,KAAkH4wB,YAAA,CAAapF,MAAA,gBAAuB,CAAA3rB,EAAAS,GAAA,mBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,sDAAAuB,EAAAS,GAAA,KAAAT,EAAAixB,GAAA,SAAAjxB,EAAAS,GAAA,KAAAN,EAAA,OAAkJE,YAAA,cAAyB,CAAAF,EAAA,OAAYE,YAAA,cAAyB,CAAAL,EAAAS,GAAA,+BAAAT,EAAAS,GAAA,KAAAN,EAAA,OAA8DE,YAAA,WAAsB,CAAAF,EAAA,QAAaE,YAAA,QAAAE,MAAA,CAA2BqtB,KAAA,oCAAAC,IAAA,SAAyD,CAAA1tB,EAAA,KAAU4wB,YAAA,CAAapF,MAAA,qBAA4B,CAAA3rB,EAAAS,GAAA,mBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,kEAAAuB,EAAAS,GAAA,KAAAN,EAAA,OAAkIE,YAAA,cAAwBL,EAAAS,GAAA,KAAAN,EAAA,QAAyBE,YAAA,eAA0B,CAAAL,EAAAS,GAAA,aAAAT,EAAAW,GAAAX,EAAAvB,GAAA,+CAAAuB,EAAAS,GAAA,KAAAN,EAAA,SAA2GI,MAAA,CAAOpC,KAAA,QAAc4H,SAAA,CAAWF,MAAA7F,EAAAvB,GAAA,mCAAgDuB,EAAAS,GAAA,KAAAN,EAAA,OAAwBE,YAAA,WAAsB,CAAAF,EAAA,QAAaE,YAAA,YAAuB,CAAAF,EAAA,SAAcI,MAAA,CAAO4C,GAAA,mBAAAsG,QAAA,WAAAtL,KAAA,cAAgE6B,EAAAS,GAAA,KAAAN,EAAA,SAA0BI,MAAA,CAAOmR,IAAA,qBAA0B,CAAA1R,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,yCAAAuB,EAAAS,GAAA,KAAAN,EAAA,UAAyFE,YAAA,OAAkB,CAAAL,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAAvB,GAAA,2DACvlF,YAAiB,IAAawB,EAAbzB,KAAa0B,eAA0BC,EAAvC3B,KAAuC4B,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBE,YAAA,SAAoB,CAAAF,EAAA,KAAUE,YAAA,yBAAA0wB,YAAA,CAAkDpF,MAAA,kBAAhKntB,KAAwLiC,GAAA,KAAAN,EAAA,KAAsBE,YAAA,2BAAA0wB,YAAA,CAAoDpF,MAAA,mBAAlQntB,KAA2RiC,GAAA,KAAAN,EAAA,KAAsBE,YAAA,wBAAA0wB,YAAA,CAAiDpF,MAAA,oBAAlWntB,KAA4XiC,GAAA,KAAAN,EAAA,KAAsBE,YAAA,0BAAA0wB,YAAA,CAAmDpF,MAAA,sBDO1c,EAa7BkF,GATiB,KAEU,MAYG,ukBEahC,IAAMK,GAAc,CAClB,KACA,KACA,OACA,OACA,OACA,SACA,QACA,WACAvtB,IAAI,SAAAghB,GAAC,OAAIA,EAAI,eAUAwM,GAAA,CACbvyB,KADa,WAEX,OAAAwyB,GAAA,CACEC,gBAAiB,GACjBtoB,SAAUvK,KAAK8D,OAAOmE,QAAQ2J,aAAakhB,MAC3CC,kBAAclW,EACdmW,oBAAgBnW,EAChBoW,cAAe,EAEfC,eAAgB,GAChBC,cAAe,GACfC,aAAc,GACdC,aAAc,GAEdC,gBAAgB,EAChBC,eAAe,EACfC,cAAc,EAEdC,WAAW,EACXC,aAAa,EACbC,aAAa,EACbC,eAAe,EACfC,WAAW,GAERxyB,OAAOmL,KAAKsnB,MACZ3uB,IAAI,SAAAuF,GAAG,MAAI,CAACA,EAAK,MACjB8G,OAAO,SAACC,EAADzF,GAAA,IAAA8B,EAAAE,IAAAhC,EAAA,GAAOtB,EAAPoD,EAAA,GAAYnH,EAAZmH,EAAA,UAAA8kB,GAAA,GAA2BnhB,EAA3BjE,IAAA,GAAkC9C,EAAM,aAAgB/D,KAAQ,IAxB5E,GA0BKtF,OAAOmL,KAAKunB,MACZ5uB,IAAI,SAAAuF,GAAG,MAAI,CAACA,EAAK,MACjB8G,OAAO,SAACC,EAAD1D,GAAA,IAAA2D,EAAA1D,IAAAD,EAAA,GAAOrD,EAAPgH,EAAA,GAAY/K,EAAZ+K,EAAA,UAAAkhB,GAAA,GAA2BnhB,EAA3BjE,IAAA,GAAkC9C,EAAM,eAAkB/D,KAAQ,IA5B9E,CA8BEqtB,oBAAgBnX,EAChBoX,aAAc,GACdC,WAAY,GAEZC,eAAgB,GAChBC,iBAAkB,GAClBC,oBAAqB,GACrBC,iBAAkB,GAClBC,kBAAmB,GACnBC,qBAAsB,GACtBC,sBAAuB,GACvBC,mBAAoB,GACpBC,uBAAwB,MAG5B9wB,QA/Ca,WAgDX,IAAM+wB,EAAO50B,KAEb60B,eACG5zB,KAAK,SAAC6zB,GACL,OAAOjlB,QAAQklB,IACb1zB,OAAOuM,QAAQknB,GACZ3vB,IAAI,SAAA2M,GAAA,IAAAC,EAAA/D,IAAA8D,EAAA,GAAEkjB,EAAFjjB,EAAA,UAAAA,EAAA,GAAc9Q,KAAK,SAAA2U,GAAG,MAAI,CAACof,EAAGpf,UAGxC3U,KAAK,SAAAg0B,GAAM,OAAIA,EAAOzjB,OAAO,SAACC,EAADyjB,GAAiB,IAAAC,EAAAnnB,IAAAknB,EAAA,GAAVF,EAAUG,EAAA,GAAPzoB,EAAOyoB,EAAA,GAC7C,OAAIzoB,EACFkmB,GAAA,GACKnhB,EADLjE,IAAA,GAEGwnB,EAAItoB,IAGA+E,GAER,MACFxQ,KAAK,SAACm0B,GACLR,EAAK/B,gBAAkBuC,KAG7Brc,QAvEa,WAwEX/Y,KAAKq1B,iCAC8B,IAAxBr1B,KAAKg0B,iBACdh0B,KAAKg0B,eAAiBh0B,KAAKs1B,iBAAiB,KAGhDpxB,SAAU,CACRqxB,iBADQ,WAEN,GAAKv1B,KAAK+yB,aAAV,CACA,IAAMrX,EAAI1b,KAAKC,GACTu1B,EAAM,gCAHMC,EASdz1B,KAAK+yB,aAJP2C,EALgBD,EAKhBC,OACAC,EANgBF,EAMhBE,mBACAh2B,EAPgB81B,EAOhB91B,KACAi2B,EARgBH,EAQhBG,kBAEF,GAAe,SAAXF,EAAmB,CAErB,GAA2B,IAAvBC,GAAqC,kBAATh2B,EAC9B,OAAO+b,EAAE8Z,EAAM,eAEjB,GAAIG,EAAqBE,KACvB,OAAOna,EAAE8Z,EAAM,2BAA6B,IAGpC9Z,EADJka,EACMJ,EAAM,mBACNA,EAAM,oBAGlB,GAAIG,EAAqBE,KACvB,OAAOna,EAAE8Z,EAAM,2BAA6B,IAGpC9Z,EADJka,EACMJ,EAAM,mBACNA,EAAM,yBAGb,GAAe,iBAAXE,EAA2B,CACpC,GAAa,6BAAT/1B,EACF,OAAO+b,EAAE8Z,EAAM,4BAGjB,GAA2B,IAAvBG,EACF,OAAOja,EAAE8Z,EAAM,oBAGjB,GAAIG,EAAqBE,KACvB,OAAOna,EAAE8Z,EAAM,iBAAmB,IAG1B9Z,EADJka,EACMJ,EAAM,wBACNA,EAAM,2BAIlB,GAAIG,EAAqBE,KACvB,OAAOna,EAAE8Z,EAAM,eAAiB,IAGxB9Z,EADJka,EACMJ,EAAM,wBACNA,EAAM,8BAKtBM,gBA5DQ,WA6DN,OAAOzrB,MAAMwkB,QAAQ7uB,KAAKuK,UAAY,EAAI,GAE5CwrB,cA/DQ,WA+DS,IAAAh1B,EAAAf,KACf,OAAOqB,OAAOmL,KAAKsnB,MAChB3uB,IAAI,SAAAuF,GAAG,MAAI,CAACA,EAAK3J,EAAK2J,EAAM,iBAC5B8G,OAAO,SAACC,EAADukB,GAAA,IAAAC,EAAAjoB,IAAAgoB,EAAA,GAAOtrB,EAAPurB,EAAA,GAAYtvB,EAAZsvB,EAAA,UAAArD,GAAA,GAA2BnhB,EAA3BjE,IAAA,GAAkC9C,EAAO/D,KAAQ,KAE7DuvB,eApEQ,WAoEU,IAAAxtB,EAAA1I,KAChB,OAAOqB,OAAOmL,KAAKunB,MAChB5uB,IAAI,SAAAuF,GAAG,MAAI,CAACA,EAAKhC,EAAKgC,EAAM,mBAC5B8G,OAAO,SAACC,EAAD0kB,GAAA,IAAAC,EAAApoB,IAAAmoB,EAAA,GAAOzrB,EAAP0rB,EAAA,GAAYzvB,EAAZyvB,EAAA,UAAAxD,GAAA,GAA2BnhB,EAA3BjE,IAAA,GAAkC9C,EAAO/D,KAAQ,KAE7D0vB,aAzEQ,WA0EN,MAAO,CACLC,IAAKt2B,KAAKm0B,eACVvzB,MAAOZ,KAAKo0B,iBACZmC,SAAUv2B,KAAKq0B,oBACfmC,MAAOx2B,KAAKs0B,iBACZnP,OAAQnlB,KAAKu0B,kBACbkC,UAAWz2B,KAAKw0B,qBAChBkC,QAAS12B,KAAK00B,mBACdiC,WAAY32B,KAAKy0B,sBACjBmC,YAAa52B,KAAK20B,yBAGtBkC,QAtFQ,WAuFN,OAAOC,aAAc92B,KAAKmzB,cAAenzB,KAAKozB,aAAcpzB,KAAKkzB,eAAgBlzB,KAAKqzB,eAExF0D,aAzFQ,WA0FN,OAAK/2B,KAAK62B,QAAQ/D,MAAMkE,OACjBh3B,KAAK62B,QAAQ/D,MADmB,CAAEkE,OAAQ,GAAIC,QAAS,GAAIC,MAAO,GAAIC,QAAS,GAAIC,MAAO,KAInGC,gBA9FQ,WA+FN,IACE,IAAKr3B,KAAK+2B,aAAaC,OAAOM,GAAI,MAAO,GACzC,IAAMN,EAASh3B,KAAK+2B,aAAaC,OAC3BC,EAAUj3B,KAAK+2B,aAAaE,QAClC,IAAKD,EAAOM,GAAI,MAAO,GACvB,IASMC,EAAkBl2B,OAAOuM,QAAQopB,GAAQxlB,OAAO,SAACC,EAAD+lB,GAAA,IAlMxCrK,EAkMwCsK,EAAAzpB,IAAAwpB,EAAA,GAAO9sB,EAAP+sB,EAAA,GAAYpwB,EAAZowB,EAAA,UAAA7E,GAAA,GAA6BnhB,EAA7BjE,IAAA,GAAmC9C,GAlM3EyiB,EAkM8F9lB,GAjMxG8kB,WAAW,OAAmB,gBAAVgB,EACrBA,EAEAmB,aAAQnB,MA8L4G,IAEjHuK,EAASr2B,OAAOuM,QAAQkmB,MAAkBtiB,OAAO,SAACC,EAADkmB,GAAuB,IAAAC,EAAA5pB,IAAA2pB,EAAA,GAAhBjtB,EAAgBktB,EAAA,GAAXvwB,EAAWuwB,EAAA,GACtEC,EAAyB,SAARntB,GAA0B,SAARA,EAIzC,KAHmBmtB,GACA,WAAjB9Z,KAAO1W,IAAgC,OAAVA,GAAkBA,EAAMywB,WAEtC,OAAOrmB,EALoD,IAAAsmB,EAMjDF,EAAiB,CAAEG,MAAO,MAAS3wB,EAAtD2wB,EANoED,EAMpEC,MAAOC,EAN6DF,EAM7DE,QACT3W,EAAa2W,GAAWD,EACxBE,EAAcC,aAAe7W,GAC7B8W,EAAU,CACd1tB,GADciC,OAAAG,IAEK,OAAfwU,EAAsB,CAAC,OAAQ,SAAU,QAAS,WAAa,KAG/D+W,EAASC,aACbN,EACAC,GAAWD,EACXE,EACAX,EACAN,GAGF,OAAArE,GAAA,GACKnhB,EADL,GAEK2mB,EAAW5mB,OAAO,SAACC,EAAK8mB,GACzB,IAAMC,EAASX,EACX,KAAOU,EAAa,GAAGE,cAAgBF,EAAantB,MAAM,GAC1DmtB,EACJ,OAAA3F,GAAA,GACKnhB,EADLjE,IAAA,GAEGgrB,EAASE,aACRnB,EAAgBgB,GAChBF,EACAd,EAAgBgB,OAGnB,MAEJ,IAEH,OAAOl3B,OAAOuM,QAAQ8pB,GAAQlmB,OAAO,SAACC,EAADknB,GAAiB,IAnDvCjI,EAmDuCkI,EAAA5qB,IAAA2qB,EAAA,GAAV3D,EAAU4D,EAAA,GAAPlsB,EAAOksB,EAAA,GAAqB,OAAnBnnB,EAAIujB,GAnDlC,CACxBrE,MADaD,EAmDwDhkB,GAlDzDmsB,YAAY,GAAK,KAE7BrI,GAAIE,GAAS,IACbH,IAAKG,GAAS,EAEdI,IAAKJ,GAAS,EACdG,KAAMH,GAAS,KA4CiEjf,GAAO,IACzF,MAAOQ,GACPC,QAAQ4mB,KAAK,8BAA+B7mB,KAGhD8mB,aA5JQ,WA6JN,OAAK/4B,KAAK62B,QAAQmC,MACX,GAAArsB,OAAAG,IACFzL,OAAO43B,OAAOj5B,KAAK62B,QAAQmC,QADzB,CAEL,qBACA,kDACAxzB,KAAK,KALyB,IAOlC8vB,iBApKQ,WAqKN,OAAOj0B,OAAOmL,KAAK0sB,MAAiBC,QAEtCC,uBAAwB,CACtBjrB,IADsB,WAEpB,QAASnO,KAAKq5B,eAEhBxnB,IAJsB,SAIjBlL,GACCA,EACFkL,cAAI7R,KAAKi0B,aAAcj0B,KAAKg0B,eAAgBh0B,KAAKs5B,sBAAsBn0B,IAAI,SAAAghB,GAAC,OAAI9kB,OAAOk4B,OAAO,GAAIpT,MAElGuH,iBAAI1tB,KAAKi0B,aAAcj0B,KAAKg0B,kBAIlCsF,sBAnLQ,WAoLN,OAAQt5B,KAAK+2B,aAAaI,SAAW,IAAIn3B,KAAKg0B,iBAEhDqF,cAAe,CACblrB,IADa,WAEX,OAAOnO,KAAKi0B,aAAaj0B,KAAKg0B,iBAEhCniB,IAJa,SAIRnF,GACHmF,cAAI7R,KAAKi0B,aAAcj0B,KAAKg0B,eAAgBtnB,KAGhD8sB,WA9LQ,WA+LN,OAAQx5B,KAAKszB,iBAAmBtzB,KAAKuzB,gBAAkBvzB,KAAKwzB,cAE9DiG,cAjMQ,WAkMN,IAAMC,IACH15B,KAAK6zB,WACL7zB,KAAK0zB,aACL1zB,KAAK2zB,aACL3zB,KAAK4zB,eACL5zB,KAAKyzB,WAGFkG,EAAS,CACbhE,mBAAoBE,MAwBtB,OArBI71B,KAAK6zB,WAAa6F,KACpBC,EAAOvC,MAAQp3B,KAAKk0B,aAElBl0B,KAAK0zB,aAAegG,KACtBC,EAAOxC,QAAUn3B,KAAKi0B,eAEpBj0B,KAAK2zB,aAAe+F,KACtBC,EAAO1C,QAAUj3B,KAAKk2B,iBAEpBl2B,KAAKyzB,WAAaiG,KACpBC,EAAO3C,OAASh3B,KAAK+1B,gBAEnB/1B,KAAK4zB,eAAiB8F,KACxBC,EAAOzC,MAAQl3B,KAAKq2B,cAQf,CAELuD,uBAAwB,EAAG9G,MAPfF,GAAA,CACZ+C,mBAAoBE,MACjB71B,KAAK+2B,cAK0B4C,YAIxC31B,WAAY,CACVwpB,cACAC,gBACAoM,cACAC,iBACAC,iBACAC,eACAzrB,gBACA0rB,WACAC,gBACAj2B,cAEFxD,QAAS,CACP05B,UADO,SAAAC,EAOL1E,GAEA,IANE5C,EAMFsH,EANEtH,MACA6G,EAKFS,EALET,OACwBU,EAI1BD,EAJER,uBAGFU,EACA/c,UAAA5V,OAAA,QAAAkV,IAAAU,UAAA,IAAAA,UAAA,GAEA,GADAvd,KAAKu6B,kBACAZ,IAAW7G,EACd,MAAM,IAAI7tB,MAAM,2BAElB,IAAMu1B,EAAsB,iBAAX9E,GAA8B5C,EAAMkE,OAEjDqD,EADA,KAEEI,GAAyB3H,GAAS,IAAI6C,mBACtCA,GAAsBgE,GAAU,IAAIhE,oBAAsB,EAC1D+E,EAAgB/E,IAAuBE,KACvC8E,OACM9d,IAAViW,QACajW,IAAX8c,GACAhE,IAAuB8E,EAIrBG,EAAoBjB,GAAUW,IAAoBxH,EAClD4H,IAAkBC,GACnBC,GACW,OAAZJ,GACW,aAAX9E,IAEEiF,GAAqC,iBAAXjF,EAC5B11B,KAAK+yB,aAAe,CAClB2C,SACAC,qBACAh2B,KAAM,4BAEEmzB,EAOA4H,IACV16B,KAAK+yB,aAAe,CAClB2C,SACAE,mBAAoB+D,EACpBhE,qBACAh2B,KAAM,kBAXRK,KAAK+yB,aAAe,CAClB2C,SACAE,mBAAmB,EACnBD,qBACAh2B,KAAM,4BAWZK,KAAK66B,oBAAoB/H,EAAO0H,EAASb,EAAQiB,IAEnDE,sBAzDO,WA0DL96B,KAAKq1B,2BAA0B,IAEjCkF,eA5DO,WA6DLv6B,KAAK+yB,kBAAelW,EACpB7c,KAAKgzB,oBAAiBnW,GAExBke,UAhEO,WAkEL,OADmB/6B,KAAK+yB,aAAhB2C,QAEN,IAAK,eACH11B,KAAKq1B,2BAA0B,GAC/B,MACF,IAAK,OACHr1B,KAAK8xB,SAAS9xB,KAAKgzB,gBAAgB,GAGvChzB,KAAKu6B,kBAEPS,cA5EO,WA8EL,OADmBh7B,KAAK+yB,aAAhB2C,QAEN,IAAK,eACH11B,KAAKq1B,2BAA0B,GAAO,GACtC,MACF,IAAK,OACHnjB,QAAQuL,IAAI,oDAGhBzd,KAAKu6B,kBAEPlF,0BAxFO,WAwFsE,IAAlD4F,EAAkD1d,UAAA5V,OAAA,QAAAkV,IAAAU,UAAA,IAAAA,UAAA,GAAvByd,EAAuBzd,UAAA5V,OAAA,QAAAkV,IAAAU,UAAA,IAAAA,UAAA,GAAA2d,EAIvEl7B,KAAK8D,OAAOmE,QAAQ2J,aAFTkhB,EAF4DoI,EAEzEC,YACmBxB,EAHsDuB,EAGzEE,kBAEGtI,GAAU6G,EAQb35B,KAAKm6B,UACH,CACErH,QACA6G,OAAQqB,EAAgBlI,EAAQ6G,GAElC,eACAsB,GAZFj7B,KAAKm6B,UACHn6B,KAAK8D,OAAOM,MAAMsK,SAAS2sB,UAC3B,WACAJ,IAaNK,eA/GO,WAgHLt7B,KAAK8D,OAAOC,SAAS,YAAa,CAChCoD,KAAM,cACNE,MAAOurB,GAAA,CACL+C,mBAAoBE,MACjB71B,KAAK+2B,gBAGZ/2B,KAAK8D,OAAOC,SAAS,YAAa,CAChCoD,KAAM,oBACNE,MAAO,CACLsuB,mBAAoBE,KACpBsB,QAASn3B,KAAKi0B,aACdmD,MAAOp3B,KAAKk0B,WACZ+C,QAASj3B,KAAKk2B,eACdc,OAAQh3B,KAAK+1B,cACbmB,MAAOl3B,KAAKq2B,iBAIlBkF,8BAnIO,WAoILv7B,KAAKmzB,cAAgBqI,aAAe,CAClCvE,QAASj3B,KAAKk2B,eACdc,OAAQh3B,KAAK+1B,gBAEf/1B,KAAKkzB,eAAiBuI,aACpB,CAAEtE,QAASn3B,KAAKi0B,aAAcgD,QAASj3B,KAAK+2B,aAAaE,QAAStB,mBAAoB31B,KAAKizB,eAC3FjzB,KAAKmzB,cAAcL,MAAMkE,OACzBh3B,KAAKmzB,cAAcuI,MAGvB5J,SA9IO,SA8IGH,GAA6B,IAArBgK,EAAqBpe,UAAA5V,OAAA,QAAAkV,IAAAU,UAAA,IAAAA,UAAA,GACrCvd,KAAKgzB,eAAiBrB,EACtB3xB,KAAKm6B,UAAUxI,EAAQ,OAAQgK,IAEjCC,gBAlJO,SAkJUjK,GACf,IAAM6I,EAAU7I,EAAOiI,uBACvB,OAAOY,GAAW,GAAKA,GAAW,GAEpCqB,SAtJO,WAuJL77B,KAAKq1B,6BAIPyG,QA3JO,WA2JI,IAAArsB,EAAAzP,KACTqB,OAAOmL,KAAKxM,KAAK+7B,OACd51B,OAAO,SAAAggB,GAAC,OAAIA,EAAE6V,SAAS,eAAiB7V,EAAE6V,SAAS,kBACnD71B,OAAO,SAAAggB,GAAC,OAAKuM,GAAYhpB,SAASyc,KAClC8V,QAAQ,SAAAvxB,GACPmH,cAAIpC,EAAKssB,MAAOrxB,OAAKmS,MAI3Bqf,eApKO,WAoKW,IAAAtsB,EAAA5P,KAChBqB,OAAOmL,KAAKxM,KAAK+7B,OACd51B,OAAO,SAAAggB,GAAC,OAAIA,EAAE6V,SAAS,iBACvBC,QAAQ,SAAAvxB,GACPmH,cAAIjC,EAAKmsB,MAAOrxB,OAAKmS,MAI3Bsf,aA5KO,WA4KS,IAAAnjB,EAAAhZ,KACdqB,OAAOmL,KAAKxM,KAAK+7B,OACd51B,OAAO,SAAAggB,GAAC,OAAIA,EAAE6V,SAAS,kBACvBC,QAAQ,SAAAvxB,GACPmH,cAAImH,EAAK+iB,MAAOrxB,OAAKmS,MAI3Buf,aApLO,WAqLLp8B,KAAKi0B,aAAe,IAGtBoI,WAxLO,WAyLLr8B,KAAKk0B,WAAa,IAgBpB2G,oBAzMO,SAyMc/H,GAAiD,IAChElyB,EADgE4kB,EAAAxlB,KAA1Cw6B,EAA0Cjd,UAAA5V,OAAA,QAAAkV,IAAAU,UAAA,GAAAA,UAAA,GAAhC,EAAGoc,EAA6Bpc,UAAA5V,OAAA,EAAA4V,UAAA,QAAAV,EAArB8e,EAAqBpe,UAAA5V,OAAA,QAAAkV,IAAAU,UAAA,IAAAA,UAAA,QAE9C,IAAXoc,IACLgC,GAAehC,EAAOhE,qBAAuBE,OAC/Cj1B,EAAQ+4B,EACRa,EAAUb,EAAOhE,oBAKnB/0B,EAAQkyB,EAGV,IAAMoE,EAAQt2B,EAAMs2B,OAASt2B,EACvBq2B,EAAUr2B,EAAMq2B,QAChBE,EAAUv2B,EAAMu2B,SAAW,GAC3BC,EAAQx2B,EAAMw2B,OAAS,GACvBJ,EAAUp2B,EAAM+0B,mBAElB/0B,EAAMo2B,QAAUp2B,EADhB07B,aAAW17B,EAAMo2B,QAAUp2B,GAuB/B,GApBgB,IAAZ45B,IACE55B,EAAM45B,UAASA,EAAU55B,EAAM45B,cAER,IAAhBxD,EAAOrG,WAA6C,IAAdqG,EAAOuF,KACtD/B,EAAU,QAGe,IAAhBxD,EAAOrG,WAA6C,IAAdqG,EAAOuF,KACtD/B,EAAU,IAIdx6B,KAAKizB,cAAgBuH,EAGL,IAAZA,IACFx6B,KAAKw8B,aAAeC,aAAQzF,EAAOV,KACnCt2B,KAAK08B,eAAiBD,aAAQzF,EAAOuF,MAGlCv8B,KAAKyzB,UAAW,CACnBzzB,KAAK87B,UACL,IAAMtvB,EAAO,IAAImwB,IAAgB,IAAZnC,EAAgBn5B,OAAOmL,KAAKsnB,MAAoB,IACrD,IAAZ0G,GAA6B,OAAZA,GACnBhuB,EACGnN,IAAI,MACJA,IAAI,QACJA,IAAI,QACJA,IAAI,SACJA,IAAI,UACJA,IAAI,WAGTmN,EAAKyvB,QAAQ,SAAAvxB,GACX,IAAMyiB,EAAQ6J,EAAOtsB,GACfkyB,EAAMH,aAAQzF,EAAOtsB,IAC3B8a,EAAK9a,EAAM,cAAwB,QAARkyB,EAAgBzP,EAAQyP,IAInD3F,IAAYj3B,KAAK2zB,cACnB3zB,KAAKm8B,eACL96B,OAAOuM,QAAQqpB,GAASgF,QAAQ,SAAAY,GAAY,IAAAC,EAAA9uB,IAAA6uB,EAAA,GAAV7H,EAAU8H,EAAA,GAAPpwB,EAAOowB,EAAA,GACtC,MAAOpwB,GAAmCqwB,OAAOC,MAAMtwB,KAC3D8Y,EAAKwP,EAAI,gBAAkBtoB,MAI1B1M,KAAK4zB,gBACR5zB,KAAKk8B,iBACL76B,OAAOuM,QAAQspB,GAAO+E,QAAQ,SAAAgB,GAAY,IAAAC,EAAAlvB,IAAAivB,EAAA,GAAVjI,EAAUkI,EAAA,GAAPxwB,EAAOwwB,EAAA,GAElCxyB,EAAMsqB,EAAEgH,SAAS,UAAYhH,EAAEviB,MAAM,UAAU,GAAKuiB,EAC1DxP,EAAK9a,EAAM,eAAiBgC,KAI3B1M,KAAK0zB,cACR1zB,KAAKo8B,eAEHp8B,KAAKi0B,aADS,IAAZuG,EACkB2C,aAAYhG,EAASn3B,KAAK+2B,aAAaE,SAEvCE,EAEtBn3B,KAAKg0B,eAAiBh0B,KAAKs1B,iBAAiB,IAGzCt1B,KAAK6zB,YACR7zB,KAAKq8B,aACLr8B,KAAKk0B,WAAakD,KAIxB1wB,MAAO,CACL2vB,aADK,WAEH,IACEr2B,KAAKozB,aAAegK,aAAc,CAAElG,MAAOl3B,KAAKq2B,eAChDr2B,KAAKwzB,cAAe,EACpB,MAAOvhB,GACPjS,KAAKwzB,cAAe,EACpBthB,QAAQ4mB,KAAK7mB,KAGjBgiB,aAAc,CACZphB,QADY,WAEV,GAA8D,IAA1DxR,OAAOg8B,oBAAoBr9B,KAAKmzB,eAAexrB,OACnD,IACE3H,KAAKu7B,gCACLv7B,KAAKszB,gBAAiB,EACtB,MAAOrhB,GACPjS,KAAKszB,gBAAiB,EACtBphB,QAAQ4mB,KAAK7mB,KAGjBa,MAAM,GAERohB,WAAY,CACVrhB,QADU,WAER,IACE7S,KAAKqzB,aAAeiK,aAAc,CAAElG,MAAOp3B,KAAKk0B,aAChDl0B,KAAKu9B,cAAe,EACpB,MAAOtrB,GACPjS,KAAKu9B,cAAe,EACpBrrB,QAAQ4mB,KAAK7mB,KAGjBa,MAAM,GAERijB,cAnCK,WAoCH,IACE/1B,KAAKu7B,gCACLv7B,KAAKuzB,eAAgB,EACrBvzB,KAAKszB,gBAAiB,EACtB,MAAOrhB,GACPjS,KAAKuzB,eAAgB,EACrBvzB,KAAKszB,gBAAiB,EACtBphB,QAAQ4mB,KAAK7mB,KAGjBikB,eA9CK,WA+CH,IACEl2B,KAAKu7B,gCACL,MAAOtpB,GACPC,QAAQ4mB,KAAK7mB,KAGjB1H,SArDK,WAsDHvK,KAAKu6B,iBACwB,IAAzBv6B,KAAK81B,iBACF91B,KAAK4zB,eACR5zB,KAAKk8B,iBAGFl8B,KAAK0zB,aACR1zB,KAAKo8B,eAGFp8B,KAAK2zB,aACR3zB,KAAKm8B,eAGFn8B,KAAKyzB,YACRzzB,KAAK87B,UAEL97B,KAAKw9B,aAAex9B,KAAKuK,SAAS,GAClCvK,KAAKw8B,aAAex8B,KAAKuK,SAAS,GAClCvK,KAAK08B,eAAiB18B,KAAKuK,SAAS,GACpCvK,KAAKy9B,eAAiBz9B,KAAKuK,SAAS,GACpCvK,KAAK09B,eAAiB19B,KAAKuK,SAAS,GACpCvK,KAAK29B,iBAAmB39B,KAAKuK,SAAS,GACtCvK,KAAK49B,gBAAkB59B,KAAKuK,SAAS,GACrCvK,KAAK69B,kBAAoB79B,KAAKuK,SAAS,KAEhCvK,KAAK81B,iBAAmB,GACjC91B,KAAK66B,oBAAoB76B,KAAKuK,SAASuoB,MAAO,EAAG9yB,KAAKuK,SAASovB,WC5uBvE,IAEImE,GAVJ,SAAoB38B,GAClBnC,EAAQ,MAyBK++B,GAVC18B,OAAAC,EAAA,EAAAD,CACdsxB,GCjBQ,WAAgB,IAAAnxB,EAAAxB,KAAayB,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBE,YAAA,aAAwB,CAAAF,EAAA,OAAYE,YAAA,qBAAgC,CAAAF,EAAA,OAAYE,YAAA,aAAwB,CAAAL,EAAA,aAAAG,EAAA,OAA+BE,YAAA,iBAA4B,CAAAF,EAAA,OAAYE,YAAA,iBAA4B,CAAAL,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAA+zB,kBAAA,gBAAA/zB,EAAAS,GAAA,KAAAN,EAAA,OAA2FE,YAAA,WAAsB,8BAAAL,EAAAuxB,aAAApzB,KAAA,CAAAgC,EAAA,UAAuEE,YAAA,MAAAG,GAAA,CAAsBE,MAAAV,EAAAu5B,YAAuB,CAAAv5B,EAAAS,GAAA,mBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,2DAAAuB,EAAAS,GAAA,KAAAN,EAAA,UAA8HE,YAAA,MAAAG,GAAA,CAAsBE,MAAAV,EAAAw5B,gBAA2B,CAAAx5B,EAAAS,GAAA,mBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,8DAAAuB,EAAAuxB,aAAA,mBAAApxB,EAAA,UAA2JE,YAAA,MAAAG,GAAA,CAAsBE,MAAAV,EAAA+4B,iBAA4B,CAAA/4B,EAAAS,GAAA,mBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,0CAAA0B,EAAA,UAAiGE,YAAA,MAAAG,GAAA,CAAsBE,MAAAV,EAAAu5B,YAAuB,CAAAv5B,EAAAS,GAAA,mBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,2DAAAuB,EAAAS,GAAA,KAAAN,EAAA,UAA8HE,YAAA,MAAAG,GAAA,CAAsBE,MAAAV,EAAA+4B,iBAA4B,CAAA/4B,EAAAS,GAAA,mBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,kEAAAuB,EAAAY,KAAAZ,EAAAS,GAAA,KAAAN,EAAA,gBAAoJI,MAAA,CAAOi8B,gBAAAx8B,EAAAi4B,cAAAwE,eAAAz8B,EAAAvB,GAAA,yBAAAi+B,eAAA18B,EAAAvB,GAAA,yBAAAk+B,qBAAA38B,EAAAvB,GAAA,mCAAAm+B,YAAA58B,EAAAswB,SAAAD,UAAArwB,EAAAo6B,kBAAyP,CAAAj6B,EAAA,YAAiBsI,KAAA,UAAc,CAAAtI,EAAA,OAAYE,YAAA,WAAsB,CAAAL,EAAAS,GAAA,iBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,uCAAA0B,EAAA,SAA2FE,YAAA,SAAAE,MAAA,CAA4BmR,IAAA,oBAAyB,CAAAvR,EAAA,UAAeuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAA,SAAA8F,WAAA,aAA0EzF,YAAA,kBAAAE,MAAA,CAAuC4C,GAAA,mBAAuB3C,GAAA,CAAKtB,OAAA,SAAA8G,GAA0B,IAAA2L,EAAA9I,MAAA+I,UAAAjN,OAAAkN,KAAA7L,EAAAC,OAAA6L,QAAA,SAAAC,GAAkF,OAAAA,EAAAhJ,WAAkBpF,IAAA,SAAAoO,GAA+D,MAA7C,WAAAA,IAAAC,OAAAD,EAAAlM,QAA0D7F,EAAA+I,SAAA/C,EAAAC,OAAAgM,SAAAN,IAAA,MAA0E3R,EAAAoG,GAAApG,EAAA,yBAAAyB,GAA8C,OAAAtB,EAAA,UAAoB+I,IAAAzH,EAAAkE,KAAAlE,MAAA,CACxzEqpB,gBAAArpB,EAAA,KAAAA,EAAA6vB,OAAA7vB,EAAA02B,QAAA3C,OAAAM,GACAnK,MAAAlqB,EAAA,KAAAA,EAAA6vB,OAAA7vB,EAAA02B,QAAA3C,OAAArG,MACmBppB,SAAA,CAAYF,MAAApE,IAAe,CAAAzB,EAAAS,GAAA,uBAAAT,EAAAW,GAAAc,EAAA,IAAAA,EAAAkE,MAAA,0BAAuF,GAAA3F,EAAAS,GAAA,KAAAN,EAAA,KAAyBE,YAAA,0BAA6B,OAAAL,EAAAS,GAAA,KAAAN,EAAA,OAAsCE,YAAA,qBAAgC,CAAAF,EAAA,QAAaE,YAAA,eAA0B,CAAAF,EAAA,YAAiBoP,MAAA,CAAO1J,MAAA7F,EAAA,UAAAwP,SAAA,SAAAC,GAA+CzP,EAAAiyB,UAAAxiB,GAAkB3J,WAAA,cAAyB,CAAA9F,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAAvB,GAAA,2DAAAuB,EAAAS,GAAA,KAAAN,EAAA,QAAwHE,YAAA,eAA0B,CAAAF,EAAA,YAAiBoP,MAAA,CAAO1J,MAAA7F,EAAA,YAAAwP,SAAA,SAAAC,GAAiDzP,EAAAkyB,YAAAziB,GAAoB3J,WAAA,gBAA2B,CAAA9F,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAAvB,GAAA,6DAAAuB,EAAAS,GAAA,KAAAN,EAAA,QAA0HE,YAAA,eAA0B,CAAAF,EAAA,YAAiBoP,MAAA,CAAO1J,MAAA7F,EAAA,YAAAwP,SAAA,SAAAC,GAAiDzP,EAAAmyB,YAAA1iB,GAAoB3J,WAAA,gBAA2B,CAAA9F,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAAvB,GAAA,6DAAAuB,EAAAS,GAAA,KAAAN,EAAA,QAA0HE,YAAA,eAA0B,CAAAF,EAAA,YAAiBoP,MAAA,CAAO1J,MAAA7F,EAAA,cAAAwP,SAAA,SAAAC,GAAmDzP,EAAAoyB,cAAA3iB,GAAsB3J,WAAA,kBAA6B,CAAA9F,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAAvB,GAAA,+DAAAuB,EAAAS,GAAA,KAAAN,EAAA,QAA4HE,YAAA,eAA0B,CAAAF,EAAA,YAAiBoP,MAAA,CAAO1J,MAAA7F,EAAA,UAAAwP,SAAA,SAAAC,GAA+CzP,EAAAqyB,UAAA5iB,GAAkB3J,WAAA,cAAyB,CAAA9F,EAAAS,GAAA,eAAAT,EAAAW,GAAAX,EAAAvB,GAAA,2DAAAuB,EAAAS,GAAA,KAAAN,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,kDAAAuB,EAAAS,GAAA,KAAAN,EAAA,WAAsNsB,MAAAzB,EAAA,eAAyBA,EAAAS,GAAA,KAAAN,EAAA,cAAAA,EAAA,gBAAkD+I,IAAA,eAAkB,CAAA/I,EAAA,OAAYE,YAAA,kBAAAE,MAAA,CAAqC4D,MAAAnE,EAAAvB,GAAA,6CAA2D,CAAA0B,EAAA,OAAYE,YAAA,cAAyB,CAAAF,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,2BAAAuB,EAAAS,GAAA,KAAAN,EAAA,OAAgFE,YAAA,sBAAiC,CAAAF,EAAA,UAAeE,YAAA,MAAAG,GAAA,CAAsBE,MAAAV,EAAA26B,eAA0B,CAAA36B,EAAAS,GAAA,mBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,8DAAAuB,EAAAS,GAAA,KAAAN,EAAA,UAAiIE,YAAA,MAAAG,GAAA,CAAsBE,MAAAV,EAAAs6B,UAAqB,CAAAt6B,EAAAS,GAAA,mBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,8DAAAuB,EAAAS,GAAA,KAAAN,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,gCAAAuB,EAAAS,GAAA,KAAAN,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,yCAAAuB,EAAAS,GAAA,KAAAN,EAAA,OAA0RE,YAAA,cAAyB,CAAAF,EAAA,cAAmBI,MAAA,CAAOoF,KAAA,UAAAxB,MAAAnE,EAAAvB,GAAA,wBAAuD8Q,MAAA,CAAQ1J,MAAA7F,EAAA,aAAAwP,SAAA,SAAAC,GAAkDzP,EAAAg8B,aAAAvsB,GAAqB3J,WAAA,kBAA4B9F,EAAAS,GAAA,KAAAN,EAAA,gBAAiCI,MAAA,CAAOoF,KAAA,YAAAwkB,SAAAnqB,EAAAu1B,aAAAE,QAAAK,IAA0DvmB,MAAA,CAAQ1J,MAAA7F,EAAA,eAAAwP,SAAA,SAAAC,GAAoDzP,EAAA68B,eAAAptB,GAAuB3J,WAAA,oBAA8B9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,YAAAxB,MAAAnE,EAAAvB,GAAA,kBAAmD8Q,MAAA,CAAQ1J,MAAA7F,EAAA,eAAAwP,SAAA,SAAAC,GAAoDzP,EAAAk7B,eAAAzrB,GAAuB3J,WAAA,oBAA8B9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAAiH,UAAuC98B,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,cAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAAuH,KAAA54B,MAAAnE,EAAAvB,GAAA,mBAAAkvB,6BAAA,IAAA3tB,EAAAi8B,gBAAiK1sB,MAAA,CAAQ1J,MAAA7F,EAAA,iBAAAwP,SAAA,SAAAC,GAAsDzP,EAAAg9B,iBAAAvtB,GAAyB3J,WAAA,sBAAgC9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,YAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAAyH,OAAA94B,MAAAnE,EAAAvB,GAAA,kBAAAkvB,6BAAA,IAAA3tB,EAAAg9B,kBAAkKztB,MAAA,CAAQ1J,MAAA7F,EAAA,eAAAwP,SAAA,SAAAC,GAAoDzP,EAAAi8B,eAAAxsB,GAAuB3J,WAAA,oBAA8B9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAAqH,WAAuC,GAAAl9B,EAAAS,GAAA,KAAAN,EAAA,OAA4BE,YAAA,cAAyB,CAAAF,EAAA,cAAmBI,MAAA,CAAOoF,KAAA,UAAAxB,MAAAnE,EAAAvB,GAAA,wBAAuD8Q,MAAA,CAAQ1J,MAAA7F,EAAA,aAAAwP,SAAA,SAAAC,GAAkDzP,EAAAg7B,aAAAvrB,GAAqB3J,WAAA,kBAA4B9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,cAAAxB,MAAAnE,EAAAvB,GAAA,iBAAA0rB,SAAAnqB,EAAAu1B,aAAAC,OAAA2H,QAA+F5tB,MAAA,CAAQ1J,MAAA7F,EAAA,iBAAAwP,SAAA,SAAAC,GAAsDzP,EAAAo9B,iBAAA3tB,GAAyB3J,WAAA,sBAAgC9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,cAAAxB,MAAAnE,EAAAvB,GAAA,kBAAA0rB,SAAAnqB,EAAAu1B,aAAAC,OAAA6H,QAAgG9tB,MAAA,CAAQ1J,MAAA7F,EAAA,iBAAAwP,SAAA,SAAAC,GAAsDzP,EAAAs9B,iBAAA7tB,GAAyB3J,WAAA,sBAAgC9F,EAAAS,GAAA,KAAAN,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,wDAAAuB,EAAAS,GAAA,KAAAN,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,yCAAAuB,EAAAS,GAAA,KAAAN,EAAA,OAA4ME,YAAA,cAAyB,CAAAF,EAAA,cAAmBI,MAAA,CAAOoF,KAAA,YAAAxB,MAAAnE,EAAAvB,GAAA,kBAAmD8Q,MAAA,CAAQ1J,MAAA7F,EAAA,eAAAwP,SAAA,SAAAC,GAAoDzP,EAAAk8B,eAAAzsB,GAAuB3J,WAAA,oBAA8B9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAA0H,UAAuCv9B,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,aAAAxB,MAAAnE,EAAAvB,GAAA,mBAAqD8Q,MAAA,CAAQ1J,MAAA7F,EAAA,gBAAAwP,SAAA,SAAAC,GAAqDzP,EAAAo8B,gBAAA3sB,GAAwB3J,WAAA,qBAA+B9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAA2H,YAAwC,GAAAx9B,EAAAS,GAAA,KAAAN,EAAA,OAA4BE,YAAA,cAAyB,CAAAF,EAAA,cAAmBI,MAAA,CAAOoF,KAAA,cAAAxB,MAAAnE,EAAAvB,GAAA,oBAAuD8Q,MAAA,CAAQ1J,MAAA7F,EAAA,iBAAAwP,SAAA,SAAAC,GAAsDzP,EAAAm8B,iBAAA1sB,GAAyB3J,WAAA,sBAAgC9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAA4H,YAAyCz9B,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,eAAAxB,MAAAnE,EAAAvB,GAAA,qBAAyD8Q,MAAA,CAAQ1J,MAAA7F,EAAA,kBAAAwP,SAAA,SAAAC,GAAuDzP,EAAAq8B,kBAAA5sB,GAA0B3J,WAAA,uBAAiC9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAA6H,cAA0C,GAAA19B,EAAAS,GAAA,KAAAN,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,kCAAAuB,EAAAS,GAAA,KAAAN,EAAA,OAAuGE,YAAA,kBAAAE,MAAA,CAAqC4D,MAAAnE,EAAAvB,GAAA,+CAA6D,CAAA0B,EAAA,OAAYE,YAAA,cAAyB,CAAAF,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,2BAAAuB,EAAAS,GAAA,KAAAN,EAAA,UAAmFE,YAAA,MAAAG,GAAA,CAAsBE,MAAAV,EAAA26B,eAA0B,CAAA36B,EAAAS,GAAA,iBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,4DAAAuB,EAAAS,GAAA,KAAAN,EAAA,UAA6HE,YAAA,MAAAG,GAAA,CAAsBE,MAAAV,EAAAs6B,UAAqB,CAAAt6B,EAAAS,GAAA,iBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,0DAAAuB,EAAAS,GAAA,KAAAN,EAAA,OAAwHE,YAAA,cAAyB,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,2CAAAuB,EAAAS,GAAA,KAAAN,EAAA,cAAwGI,MAAA,CAAOoF,KAAA,gBAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAAyH,OAAA94B,MAAAnE,EAAAvB,GAAA,mBAAkG8Q,MAAA,CAAQ1J,MAAA7F,EAAA,mBAAAwP,SAAA,SAAAC,GAAwDzP,EAAA29B,mBAAAluB,GAA2B3J,WAAA,wBAAkC9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAA+H,YAAyC59B,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,qBAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAAqI,OAAA15B,MAAAnE,EAAAvB,GAAA,uBAA2G8Q,MAAA,CAAQ1J,MAAA7F,EAAA,wBAAAwP,SAAA,SAAAC,GAA6DzP,EAAA89B,wBAAAruB,GAAgC3J,WAAA,6BAAuC9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAAkI,iBAA8C/9B,EAAAS,GAAA,KAAAN,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,4CAAAuB,EAAAS,GAAA,KAAAN,EAAA,cAAqHI,MAAA,CAAOoF,KAAA,aAAAxB,MAAAnE,EAAAvB,GAAA,8CAAA0rB,SAAAnqB,EAAAu1B,aAAAC,OAAAwI,YAA+HzuB,MAAA,CAAQ1J,MAAA7F,EAAA,qBAAAwP,SAAA,SAAAC,GAA0DzP,EAAAi+B,qBAAAxuB,GAA6B3J,WAAA,0BAAoC9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,iBAAAxB,MAAAnE,EAAAvB,GAAA,iBAAA0rB,SAAAnqB,EAAAu1B,aAAAC,OAAA0I,gBAA0G3uB,MAAA,CAAQ1J,MAAA7F,EAAA,yBAAAwP,SAAA,SAAAC,GAA8DzP,EAAAm+B,yBAAA1uB,GAAiC3J,WAAA,8BAAwC9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAAqI,eAAAvP,MAAA,UAA8D3uB,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,eAAAxB,MAAAnE,EAAAvB,GAAA,gDAAA0rB,SAAAnqB,EAAAu1B,aAAAC,OAAA4I,cAAqI7uB,MAAA,CAAQ1J,MAAA7F,EAAA,uBAAAwP,SAAA,SAAAC,GAA4DzP,EAAAq+B,uBAAA5uB,GAA+B3J,WAAA,4BAAsC9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,mBAAAxB,MAAAnE,EAAAvB,GAAA,iBAAA0rB,SAAAnqB,EAAAu1B,aAAAC,OAAA8I,kBAA8G/uB,MAAA,CAAQ1J,MAAA7F,EAAA,2BAAAwP,SAAA,SAAAC,GAAgEzP,EAAAu+B,2BAAA9uB,GAAmC3J,WAAA,gCAA0C9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAAyI,iBAAA3P,MAAA,UAAgE3uB,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,eAAAxB,MAAAnE,EAAAvB,GAAA,gDAAA0rB,SAAAnqB,EAAAu1B,aAAAC,OAAAgJ,cAAqIjvB,MAAA,CAAQ1J,MAAA7F,EAAA,uBAAAwP,SAAA,SAAAC,GAA4DzP,EAAAy+B,uBAAAhvB,GAA+B3J,WAAA,4BAAsC9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,mBAAAxB,MAAAnE,EAAAvB,GAAA,iBAAA0rB,SAAAnqB,EAAAu1B,aAAAC,OAAAkJ,kBAA8GnvB,MAAA,CAAQ1J,MAAA7F,EAAA,2BAAAwP,SAAA,SAAAC,GAAgEzP,EAAA2+B,2BAAAlvB,GAAmC3J,WAAA,gCAA0C9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAA6I,iBAAA/P,MAAA,UAAgE3uB,EAAAS,GAAA,KAAAN,EAAA,gBAAiCI,MAAA,CAAOoF,KAAA,eAAAwkB,SAAAnqB,EAAAu1B,aAAAE,QAAAmJ,OAAgErvB,MAAA,CAAQ1J,MAAA7F,EAAA,kBAAAwP,SAAA,SAAAC,GAAuDzP,EAAA6+B,kBAAApvB,GAA0B3J,WAAA,wBAAiC,GAAA9F,EAAAS,GAAA,KAAAN,EAAA,OAA4BE,YAAA,cAAyB,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,4CAAAuB,EAAAS,GAAA,KAAAN,EAAA,cAAyGI,MAAA,CAAOoF,KAAA,oBAAAxB,MAAAnE,EAAAvB,GAAA,qDAAA0rB,SAAAnqB,EAAAu1B,aAAAC,OAAAsJ,mBAAoJvvB,MAAA,CAAQ1J,MAAA7F,EAAA,4BAAAwP,SAAA,SAAAC,GAAiEzP,EAAA++B,4BAAAtvB,GAAoC3J,WAAA,iCAA2C9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,wBAAAxB,MAAAnE,EAAAvB,GAAA,iBAAA0rB,SAAAnqB,EAAAu1B,aAAAC,OAAAwJ,uBAAwHzvB,MAAA,CAAQ1J,MAAA7F,EAAA,gCAAAwP,SAAA,SAAAC,GAAqEzP,EAAAi/B,gCAAAxvB,GAAwC3J,WAAA,qCAA+C9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAAmJ,sBAAArQ,MAAA,WAAqE,GAAA3uB,EAAAS,GAAA,KAAAN,EAAA,OAA4BE,YAAA,cAAyB,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,mDAAAuB,EAAAS,GAAA,KAAAN,EAAA,cAAgHI,MAAA,CAAOoF,KAAA,aAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAAR,MAAA7wB,MAAAnE,EAAAvB,GAAA,wBAAmG8Q,MAAA,CAAQ1J,MAAA7F,EAAA,gBAAAwP,SAAA,SAAAC,GAAqDzP,EAAAk/B,gBAAAzvB,GAAwB3J,WAAA,qBAA+B9F,EAAAS,GAAA,KAAAN,EAAA,gBAAiCI,MAAA,CAAOoF,KAAA,eAAAwkB,SAAAnqB,EAAAu1B,aAAAE,QAAAT,MAAA1tB,SAAA,gBAAAtH,EAAAk/B,iBAAiH3vB,MAAA,CAAQ1J,MAAA7F,EAAA,kBAAAwP,SAAA,SAAAC,GAAuDzP,EAAAm/B,kBAAA1vB,GAA0B3J,WAAA,uBAAiC9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,iBAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAA4J,UAAAj7B,MAAAnE,EAAAvB,GAAA,kBAAqG8Q,MAAA,CAAQ1J,MAAA7F,EAAA,oBAAAwP,SAAA,SAAAC,GAAyDzP,EAAAq/B,oBAAA5vB,GAA4B3J,WAAA,yBAAmC9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAAuJ,UAAAzQ,MAAA,UAAyD3uB,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,iBAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAA8J,UAAAn7B,MAAAnE,EAAAvB,GAAA,mBAAsG8Q,MAAA,CAAQ1J,MAAA7F,EAAA,oBAAAwP,SAAA,SAAAC,GAAyDzP,EAAAu/B,oBAAA9vB,GAA4B3J,WAAA,yBAAmC9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAAyJ,UAAA3Q,MAAA,WAAyD,GAAA3uB,EAAAS,GAAA,KAAAN,EAAA,OAA4BE,YAAA,cAAyB,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,8CAAAuB,EAAAS,GAAA,KAAAN,EAAA,cAA2GI,MAAA,CAAOoF,KAAA,cAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAAgK,OAAAr7B,MAAAnE,EAAAvB,GAAA,wBAAqG8Q,MAAA,CAAQ1J,MAAA7F,EAAA,iBAAAwP,SAAA,SAAAC,GAAsDzP,EAAAy/B,iBAAAhwB,GAAyB3J,WAAA,sBAAgC9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,kBAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAAkK,WAAAv7B,MAAAnE,EAAAvB,GAAA,kBAAuG8Q,MAAA,CAAQ1J,MAAA7F,EAAA,qBAAAwP,SAAA,SAAAC,GAA0DzP,EAAA2/B,qBAAAlwB,GAA6B3J,WAAA,0BAAoC9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAA6J,cAA2C1/B,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,kBAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAAoK,WAAAz7B,MAAAnE,EAAAvB,GAAA,mBAAwG8Q,MAAA,CAAQ1J,MAAA7F,EAAA,qBAAAwP,SAAA,SAAAC,GAA0DzP,EAAA6/B,qBAAApwB,GAA6B3J,WAAA,0BAAoC9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAA+J,eAA2C,GAAA5/B,EAAAS,GAAA,KAAAN,EAAA,OAA4BE,YAAA,cAAyB,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,6CAAAuB,EAAAS,GAAA,KAAAN,EAAA,cAA0GI,MAAA,CAAOoF,KAAA,aAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAAp2B,MAAA+E,MAAAnE,EAAAvB,GAAA,wBAAmG8Q,MAAA,CAAQ1J,MAAA7F,EAAA,gBAAAwP,SAAA,SAAAC,GAAqDzP,EAAA8/B,gBAAArwB,GAAwB3J,WAAA,qBAA+B9F,EAAAS,GAAA,KAAAN,EAAA,gBAAiCI,MAAA,CAAOoF,KAAA,eAAAwkB,SAAAnqB,EAAAu1B,aAAAE,QAAAr2B,MAAAkI,SAAA,gBAAAtH,EAAA8/B,iBAAiHvwB,MAAA,CAAQ1J,MAAA7F,EAAA,kBAAAwP,SAAA,SAAAC,GAAuDzP,EAAA+/B,kBAAAtwB,GAA0B3J,WAAA,uBAAiC9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,iBAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAAwK,UAAA77B,MAAAnE,EAAAvB,GAAA,kBAAqG8Q,MAAA,CAAQ1J,MAAA7F,EAAA,oBAAAwP,SAAA,SAAAC,GAAyDzP,EAAAigC,oBAAAxwB,GAA4B3J,WAAA,yBAAmC9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAAmK,cAA0C,GAAAhgC,EAAAS,GAAA,KAAAN,EAAA,OAA4BE,YAAA,cAAyB,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,8CAAAuB,EAAAS,GAAA,KAAAN,EAAA,cAA2GI,MAAA,CAAOoF,KAAA,WAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAAV,IAAA3wB,MAAAnE,EAAAvB,GAAA,wBAA+F8Q,MAAA,CAAQ1J,MAAA7F,EAAA,cAAAwP,SAAA,SAAAC,GAAmDzP,EAAAkgC,cAAAzwB,GAAsB3J,WAAA,mBAA6B9F,EAAAS,GAAA,KAAAN,EAAA,gBAAiCI,MAAA,CAAOoF,KAAA,aAAAwkB,SAAAnqB,EAAAu1B,aAAAE,QAAAX,IAAAxtB,SAAA,gBAAAtH,EAAAkgC,eAA2G3wB,MAAA,CAAQ1J,MAAA7F,EAAA,gBAAAwP,SAAA,SAAAC,GAAqDzP,EAAAmgC,gBAAA1wB,GAAwB3J,WAAA,qBAA+B9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,eAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAA4K,QAAAj8B,MAAAnE,EAAAvB,GAAA,kBAAiG8Q,MAAA,CAAQ1J,MAAA7F,EAAA,kBAAAwP,SAAA,SAAAC,GAAuDzP,EAAAqgC,kBAAA5wB,GAA0B3J,WAAA,uBAAiC9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAAuK,WAAwCpgC,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,oBAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAA8K,aAAAn8B,MAAAnE,EAAAvB,GAAA,gDAAyI8Q,MAAA,CAAQ1J,MAAA7F,EAAA,uBAAAwP,SAAA,SAAAC,GAA4DzP,EAAAugC,uBAAA9wB,GAA+B3J,WAAA,4BAAsC9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAAyK,gBAA6CtgC,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,qBAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAAgL,cAAAr8B,MAAAnE,EAAAvB,GAAA,2CAAsI8Q,MAAA,CAAQ1J,MAAA7F,EAAA,wBAAAwP,SAAA,SAAAC,GAA6DzP,EAAAygC,wBAAAhxB,GAAgC3J,WAAA,6BAAuC9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAA2K,iBAA8CxgC,EAAAS,GAAA,KAAAN,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,8CAAAuB,EAAAS,GAAA,KAAAN,EAAA,cAAuHI,MAAA,CAAOoF,KAAA,kBAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAAkL,WAAAv8B,MAAAnE,EAAAvB,GAAA,wBAA6G8Q,MAAA,CAAQ1J,MAAA7F,EAAA,qBAAAwP,SAAA,SAAAC,GAA0DzP,EAAA2gC,qBAAAlxB,GAA6B3J,WAAA,0BAAoC9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,sBAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAAoL,eAAAz8B,MAAAnE,EAAAvB,GAAA,kBAA+G8Q,MAAA,CAAQ1J,MAAA7F,EAAA,yBAAAwP,SAAA,SAAAC,GAA8DzP,EAAA6gC,yBAAApxB,GAAiC3J,WAAA,8BAAwC9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAA+K,kBAA+C5gC,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,2BAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAAsL,oBAAA38B,MAAAnE,EAAAvB,GAAA,gDAAuJ8Q,MAAA,CAAQ1J,MAAA7F,EAAA,8BAAAwP,SAAA,SAAAC,GAAmEzP,EAAA+gC,8BAAAtxB,GAAsC3J,WAAA,mCAA6C9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAAiL,uBAAoD9gC,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,4BAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAAwL,qBAAA78B,MAAAnE,EAAAvB,GAAA,2CAAoJ8Q,MAAA,CAAQ1J,MAAA7F,EAAA,+BAAAwP,SAAA,SAAAC,GAAoEzP,EAAAihC,+BAAAxxB,GAAuC3J,WAAA,oCAA8C9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAAmL,wBAAqDhhC,EAAAS,GAAA,KAAAN,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,+CAAAuB,EAAAS,GAAA,KAAAN,EAAA,cAAwHI,MAAA,CAAOoF,KAAA,mBAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAA0L,YAAA/8B,MAAAnE,EAAAvB,GAAA,wBAA+G8Q,MAAA,CAAQ1J,MAAA7F,EAAA,sBAAAwP,SAAA,SAAAC,GAA2DzP,EAAAmhC,sBAAA1xB,GAA8B3J,WAAA,2BAAqC9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,uBAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAA4L,gBAAAj9B,MAAAnE,EAAAvB,GAAA,kBAAiH8Q,MAAA,CAAQ1J,MAAA7F,EAAA,0BAAAwP,SAAA,SAAAC,GAA+DzP,EAAAqhC,0BAAA5xB,GAAkC3J,WAAA,+BAAyC9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,4BAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAA8L,qBAAAn9B,MAAAnE,EAAAvB,GAAA,gDAAyJ8Q,MAAA,CAAQ1J,MAAA7F,EAAA,+BAAAwP,SAAA,SAAAC,GAAoEzP,EAAAuhC,+BAAA9xB,GAAuC3J,WAAA,oCAA8C9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,6BAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAAgM,sBAAAr9B,MAAAnE,EAAAvB,GAAA,2CAAsJ8Q,MAAA,CAAQ1J,MAAA7F,EAAA,gCAAAwP,SAAA,SAAAC,GAAqEzP,EAAAyhC,gCAAAhyB,GAAwC3J,WAAA,qCAA+C9F,EAAAS,GAAA,KAAAN,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,8CAAAuB,EAAAS,GAAA,KAAAN,EAAA,cAAuHI,MAAA,CAAOoF,KAAA,kBAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAAkM,WAAAv9B,MAAAnE,EAAAvB,GAAA,wBAA6G8Q,MAAA,CAAQ1J,MAAA7F,EAAA,qBAAAwP,SAAA,SAAAC,GAA0DzP,EAAA2hC,qBAAAlyB,GAA6B3J,WAAA,0BAAoC9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,sBAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAAoM,eAAAz9B,MAAAnE,EAAAvB,GAAA,kBAA+G8Q,MAAA,CAAQ1J,MAAA7F,EAAA,yBAAAwP,SAAA,SAAAC,GAA8DzP,EAAA6hC,yBAAApyB,GAAiC3J,WAAA,8BAAwC9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAA+L,kBAA+C5hC,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,2BAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAAsM,oBAAA39B,MAAAnE,EAAAvB,GAAA,gDAAuJ8Q,MAAA,CAAQ1J,MAAA7F,EAAA,8BAAAwP,SAAA,SAAAC,GAAmEzP,EAAA+hC,8BAAAtyB,GAAsC3J,WAAA,mCAA6C9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAAiM,uBAAoD9hC,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,4BAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAAwM,qBAAA79B,MAAAnE,EAAAvB,GAAA,2CAAoJ8Q,MAAA,CAAQ1J,MAAA7F,EAAA,+BAAAwP,SAAA,SAAAC,GAAoEzP,EAAAiiC,+BAAAxyB,GAAuC3J,WAAA,oCAA8C9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAAmM,yBAAqD,GAAAhiC,EAAAS,GAAA,KAAAN,EAAA,OAA4BE,YAAA,cAAyB,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,2CAAAuB,EAAAS,GAAA,KAAAN,EAAA,cAAwGI,MAAA,CAAOoF,KAAA,WAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAA0M,IAAA/9B,MAAAnE,EAAAvB,GAAA,wBAA+F8Q,MAAA,CAAQ1J,MAAA7F,EAAA,cAAAwP,SAAA,SAAAC,GAAmDzP,EAAAmiC,cAAA1yB,GAAsB3J,WAAA,mBAA6B9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,eAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAA4M,QAAAj+B,MAAAnE,EAAAvB,GAAA,kBAAiG8Q,MAAA,CAAQ1J,MAAA7F,EAAA,kBAAAwP,SAAA,SAAAC,GAAuDzP,EAAAqiC,kBAAA5yB,GAA0B3J,WAAA,uBAAiC9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAAuM,WAAwCpiC,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,qBAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAA8M,cAAAn+B,MAAAnE,EAAAvB,GAAA,kBAA6G8Q,MAAA,CAAQ1J,MAAA7F,EAAA,wBAAAwP,SAAA,SAAAC,GAA6DzP,EAAAuiC,wBAAA9yB,GAAgC3J,WAAA,6BAAuC9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAAyM,kBAA8C,GAAAtiC,EAAAS,GAAA,KAAAN,EAAA,OAA4BE,YAAA,cAAyB,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,8CAAAuB,EAAAS,GAAA,KAAAN,EAAA,cAA2GI,MAAA,CAAOoF,KAAA,cAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAAgN,OAAAr+B,MAAAnE,EAAAvB,GAAA,gCAA6G8Q,MAAA,CAAQ1J,MAAA7F,EAAA,iBAAAwP,SAAA,SAAAC,GAAsDzP,EAAAyiC,iBAAAhzB,GAAyB3J,WAAA,sBAAgC9F,EAAAS,GAAA,KAAAN,EAAA,gBAAiCI,MAAA,CAAOoF,KAAA,gBAAAwkB,SAAAnqB,EAAAu1B,aAAAE,QAAA+M,OAAAl7B,SAAA,gBAAAtH,EAAAyiC,kBAAoHlzB,MAAA,CAAQ1J,MAAA7F,EAAA,mBAAAwP,SAAA,SAAAC,GAAwDzP,EAAA0iC,mBAAAjzB,GAA2B3J,WAAA,yBAAkC,GAAA9F,EAAAS,GAAA,KAAAN,EAAA,OAA4BE,YAAA,cAAyB,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,iDAAAuB,EAAAS,GAAA,KAAAN,EAAA,cAA8GI,MAAA,CAAOoF,KAAA,aAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAAmN,MAAAx+B,MAAAnE,EAAAvB,GAAA,kBAA6F8Q,MAAA,CAAQ1J,MAAA7F,EAAA,gBAAAwP,SAAA,SAAAC,GAAqDzP,EAAA4iC,gBAAAnzB,GAAwB3J,WAAA,qBAA+B9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,iBAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAAqN,UAAA1+B,MAAAnE,EAAAvB,GAAA,mBAAsG8Q,MAAA,CAAQ1J,MAAA7F,EAAA,oBAAAwP,SAAA,SAAAC,GAAyDzP,EAAA8iC,oBAAArzB,GAA4B3J,WAAA,yBAAmC9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,kBAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAAuN,WAAA5+B,MAAAnE,EAAAvB,GAAA,gDAAqI8Q,MAAA,CAAQ1J,MAAA7F,EAAA,qBAAAwP,SAAA,SAAAC,GAA0DzP,EAAAgjC,qBAAAvzB,GAA6B3J,WAAA,0BAAoC9F,EAAAS,GAAA,KAAAN,EAAA,gBAAiCI,MAAA,CAAOoF,KAAA,eAAAwkB,SAAAnqB,EAAAu1B,aAAAE,QAAAkN,OAAgEpzB,MAAA,CAAQ1J,MAAA7F,EAAA,kBAAAwP,SAAA,SAAAC,GAAuDzP,EAAAijC,kBAAAxzB,GAA0B3J,WAAA,wBAAiC,GAAA9F,EAAAS,GAAA,KAAAN,EAAA,OAA4BE,YAAA,cAAyB,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,+CAAAuB,EAAAS,GAAA,KAAAN,EAAA,cAA4GI,MAAA,CAAOoF,KAAA,WAAAxB,MAAAnE,EAAAvB,GAAA,2CAAA0rB,SAAAnqB,EAAAu1B,aAAAC,OAAA0N,UAAwH3zB,MAAA,CAAQ1J,MAAA7F,EAAA,mBAAAwP,SAAA,SAAAC,GAAwDzP,EAAAmjC,mBAAA1zB,GAA2B3J,WAAA,wBAAkC9F,EAAAS,GAAA,KAAAN,EAAA,gBAAiCI,MAAA,CAAOoF,KAAA,kBAAAwkB,SAAAnqB,EAAAu1B,aAAAE,QAAAyN,SAAA57B,SAAA,gBAAAtH,EAAAojC,sBAA4H7zB,MAAA,CAAQ1J,MAAA7F,EAAA,qBAAAwP,SAAA,SAAAC,GAA0DzP,EAAAojC,qBAAA3zB,GAA6B3J,WAAA,2BAAoC,GAAA9F,EAAAS,GAAA,KAAAN,EAAA,OAA4BE,YAAA,cAAyB,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,2CAAAuB,EAAAS,GAAA,KAAAN,EAAA,cAAwGI,MAAA,CAAOoF,KAAA,OAAAxB,MAAAnE,EAAAvB,GAAA,uBAAA0rB,SAAAnqB,EAAAu1B,aAAAC,OAAA6N,MAA4F9zB,MAAA,CAAQ1J,MAAA7F,EAAA,eAAAwP,SAAA,SAAAC,GAAoDzP,EAAAsjC,eAAA7zB,GAAuB3J,WAAA,oBAA8B9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,WAAAxB,MAAAnE,EAAAvB,GAAA,iBAAA0rB,SAAAnqB,EAAAu1B,aAAAC,OAAA+N,UAA8Fh0B,MAAA,CAAQ1J,MAAA7F,EAAA,mBAAAwP,SAAA,SAAAC,GAAwDzP,EAAAwjC,mBAAA/zB,GAA2B3J,WAAA,yBAAkC,GAAA9F,EAAAS,GAAA,KAAAN,EAAA,OAA4BE,YAAA,cAAyB,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,4CAAAuB,EAAAS,GAAA,KAAAN,EAAA,cAAyGI,MAAA,CAAOoF,KAAA,OAAAxB,MAAAnE,EAAAvB,GAAA,wCAAA0rB,SAAAnqB,EAAAu1B,aAAAC,OAAAiO,MAA6Gl0B,MAAA,CAAQ1J,MAAA7F,EAAA,eAAAwP,SAAA,SAAAC,GAAoDzP,EAAA0jC,eAAAj0B,GAAuB3J,WAAA,qBAA8B,GAAA9F,EAAAS,GAAA,KAAAN,EAAA,OAA4BE,YAAA,cAAyB,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,gDAAAuB,EAAAS,GAAA,KAAAN,EAAA,cAA6GI,MAAA,CAAOoF,KAAA,YAAAxB,MAAAnE,EAAAvB,GAAA,uBAAA0rB,SAAAnqB,EAAAu1B,aAAAC,OAAAmO,WAAsGp0B,MAAA,CAAQ1J,MAAA7F,EAAA,oBAAAwP,SAAA,SAAAC,GAAyDzP,EAAA4jC,oBAAAn0B,GAA4B3J,WAAA,yBAAmC9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,gBAAAxB,MAAAnE,EAAAvB,GAAA,iBAAA0rB,SAAAnqB,EAAAu1B,aAAAC,OAAAqO,eAAwGt0B,MAAA,CAAQ1J,MAAA7F,EAAA,wBAAAwP,SAAA,SAAAC,GAA6DzP,EAAA8jC,wBAAAr0B,GAAgC3J,WAAA,6BAAuC9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAAgO,iBAA8C7jC,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,gBAAAxB,MAAAnE,EAAAvB,GAAA,kBAAA0rB,SAAAnqB,EAAAu1B,aAAAC,OAAAuO,eAAyGx0B,MAAA,CAAQ1J,MAAA7F,EAAA,wBAAAwP,SAAA,SAAAC,GAA6DzP,EAAAgkC,wBAAAv0B,GAAgC3J,WAAA,6BAAuC9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAAkO,kBAA8C,GAAA/jC,EAAAS,GAAA,KAAAN,EAAA,OAA4BE,YAAA,cAAyB,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,8CAAAuB,EAAAS,GAAA,KAAAN,EAAA,cAA2GI,MAAA,CAAOoF,KAAA,UAAAxB,MAAAnE,EAAAvB,GAAA,uBAAA0rB,SAAAnqB,EAAAu1B,aAAAC,OAAAyO,SAAkG10B,MAAA,CAAQ1J,MAAA7F,EAAA,kBAAAwP,SAAA,SAAAC,GAAuDzP,EAAAkkC,kBAAAz0B,GAA0B3J,WAAA,uBAAiC9F,EAAAS,GAAA,KAAAN,EAAA,gBAAiCI,MAAA,CAAOoF,KAAA,iBAAAwkB,SAAAnqB,EAAAu1B,aAAAE,QAAAwO,QAAA38B,SAAA,gBAAAtH,EAAAmkC,qBAAyH50B,MAAA,CAAQ1J,MAAA7F,EAAA,oBAAAwP,SAAA,SAAAC,GAAyDzP,EAAAmkC,oBAAA10B,GAA4B3J,WAAA,yBAAmC9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,cAAAxB,MAAAnE,EAAAvB,GAAA,iBAAA0rB,SAAAnqB,EAAAu1B,aAAAC,OAAA4O,aAAoG70B,MAAA,CAAQ1J,MAAA7F,EAAA,sBAAAwP,SAAA,SAAAC,GAA2DzP,EAAAqkC,sBAAA50B,GAA8B3J,WAAA,2BAAqC9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAAuO,eAA4CpkC,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,cAAAxB,MAAAnE,EAAAvB,GAAA,kBAAA0rB,SAAAnqB,EAAAu1B,aAAAC,OAAA8O,aAAqG/0B,MAAA,CAAQ1J,MAAA7F,EAAA,sBAAAwP,SAAA,SAAAC,GAA2DzP,EAAAukC,sBAAA90B,GAA8B3J,WAAA,2BAAqC9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAAyO,gBAA4C,GAAAtkC,EAAAS,GAAA,KAAAN,EAAA,OAA4BE,YAAA,cAAyB,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,mDAAAuB,EAAAS,GAAA,KAAAN,EAAA,cAAgHI,MAAA,CAAOoF,KAAA,eAAAxB,MAAAnE,EAAAvB,GAAA,uBAAA0rB,SAAAnqB,EAAAu1B,aAAAC,OAAAgP,cAA4Gj1B,MAAA,CAAQ1J,MAAA7F,EAAA,uBAAAwP,SAAA,SAAAC,GAA4DzP,EAAAykC,uBAAAh1B,GAA+B3J,WAAA,4BAAsC9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,mBAAAxB,MAAAnE,EAAAvB,GAAA,iBAAA0rB,SAAAnqB,EAAAu1B,aAAAC,OAAAkP,kBAA8Gn1B,MAAA,CAAQ1J,MAAA7F,EAAA,2BAAAwP,SAAA,SAAAC,GAAgEzP,EAAA2kC,2BAAAl1B,GAAmC3J,WAAA,gCAA0C9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAA6O,oBAAiD1kC,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,mBAAAxB,MAAAnE,EAAAvB,GAAA,kBAAA0rB,SAAAnqB,EAAAu1B,aAAAC,OAAAoP,kBAA+Gr1B,MAAA,CAAQ1J,MAAA7F,EAAA,2BAAAwP,SAAA,SAAAC,GAAgEzP,EAAA6kC,2BAAAp1B,GAAmC3J,WAAA,gCAA0C9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAA+O,qBAAiD,GAAA5kC,EAAAS,GAAA,KAAAN,EAAA,OAA4BE,YAAA,cAAyB,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,mDAAAuB,EAAAS,GAAA,KAAAN,EAAA,cAAgHI,MAAA,CAAOoF,KAAA,eAAAxB,MAAAnE,EAAAvB,GAAA,uBAAA0rB,SAAAnqB,EAAAu1B,aAAAC,OAAAsP,cAA4Gv1B,MAAA,CAAQ1J,MAAA7F,EAAA,uBAAAwP,SAAA,SAAAC,GAA4DzP,EAAA+kC,uBAAAt1B,GAA+B3J,WAAA,4BAAsC9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,mBAAAxB,MAAAnE,EAAAvB,GAAA,iBAAA0rB,SAAAnqB,EAAAu1B,aAAAC,OAAAwP,kBAA8Gz1B,MAAA,CAAQ1J,MAAA7F,EAAA,2BAAAwP,SAAA,SAAAC,GAAgEzP,EAAAilC,2BAAAx1B,GAAmC3J,WAAA,gCAA0C9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAAmP,oBAAiDhlC,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,mBAAAxB,MAAAnE,EAAAvB,GAAA,kBAAA0rB,SAAAnqB,EAAAu1B,aAAAC,OAAA0P,kBAA+G31B,MAAA,CAAQ1J,MAAA7F,EAAA,2BAAAwP,SAAA,SAAAC,GAAgEzP,EAAAmlC,2BAAA11B,GAAmC3J,WAAA,gCAA0C9F,EAAAS,GAAA,KAAAN,EAAA,iBAAkCI,MAAA,CAAOquB,SAAA5uB,EAAA61B,gBAAAqP,qBAAiD,GAAAllC,EAAAS,GAAA,KAAAN,EAAA,OAA4BE,YAAA,cAAyB,CAAAF,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,mBAAAuB,EAAAS,GAAA,KAAAN,EAAA,cAAgFI,MAAA,CAAOoF,KAAA,cAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAAM,IAAA,EAAA3xB,MAAAnE,EAAAvB,GAAA,wBAAsG8Q,MAAA,CAAQ1J,MAAA7F,EAAA,iBAAAwP,SAAA,SAAAC,GAAsDzP,EAAAolC,iBAAA31B,GAAyB3J,WAAA,sBAAgC9F,EAAAS,GAAA,KAAAN,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,oDAAAuB,EAAAS,GAAA,KAAAN,EAAA,cAA6HI,MAAA,CAAOoF,KAAA,6BAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAAM,IAAA,EAAA3xB,MAAAnE,EAAAvB,GAAA,wBAAqH8Q,MAAA,CAAQ1J,MAAA7F,EAAA,gCAAAwP,SAAA,SAAAC,GAAqEzP,EAAAqlC,gCAAA51B,GAAwC3J,WAAA,qCAA+C9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,+BAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAArG,MAAA,EAAAhrB,MAAAnE,EAAAvB,GAAA,kBAAmH8Q,MAAA,CAAQ1J,MAAA7F,EAAA,kCAAAwP,SAAA,SAAAC,GAAuEzP,EAAAslC,kCAAA71B,GAA0C3J,WAAA,uCAAiD9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,+BAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAAuH,MAAA,EAAA54B,MAAAnE,EAAAvB,GAAA,mBAAoH8Q,MAAA,CAAQ1J,MAAA7F,EAAA,kCAAAwP,SAAA,SAAAC,GAAuEzP,EAAAulC,kCAAA91B,GAA0C3J,WAAA,uCAAiD9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,qCAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAAuF,IAAA,EAAA52B,MAAAnE,EAAAvB,GAAA,+CAAoJ8Q,MAAA,CAAQ1J,MAAA7F,EAAA,oCAAAwP,SAAA,SAAAC,GAAyEzP,EAAAwlC,oCAAA/1B,GAA4C3J,WAAA,yCAAmD9F,EAAAS,GAAA,KAAAN,EAAA,MAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,oDAAAuB,EAAAS,GAAA,KAAAN,EAAA,cAA6HI,MAAA,CAAOoF,KAAA,6BAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAAM,IAAA,EAAA3xB,MAAAnE,EAAAvB,GAAA,wBAAqH8Q,MAAA,CAAQ1J,MAAA7F,EAAA,gCAAAwP,SAAA,SAAAC,GAAqEzP,EAAAylC,gCAAAh2B,GAAwC3J,WAAA,qCAA+C9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,+BAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAArG,MAAA,EAAAhrB,MAAAnE,EAAAvB,GAAA,kBAAmH8Q,MAAA,CAAQ1J,MAAA7F,EAAA,kCAAAwP,SAAA,SAAAC,GAAuEzP,EAAA0lC,kCAAAj2B,GAA0C3J,WAAA,uCAAiD9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,+BAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAAuH,MAAA,EAAA54B,MAAAnE,EAAAvB,GAAA,mBAAoH8Q,MAAA,CAAQ1J,MAAA7F,EAAA,kCAAAwP,SAAA,SAAAC,GAAuEzP,EAAA2lC,kCAAAl2B,GAA0C3J,WAAA,uCAAiD9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,qCAAAwkB,SAAAnqB,EAAAu1B,aAAAC,OAAAM,IAAA,EAAA3xB,MAAAnE,EAAAvB,GAAA,+CAAoJ8Q,MAAA,CAAQ1J,MAAA7F,EAAA,oCAAAwP,SAAA,SAAAC,GAAyEzP,EAAA4lC,oCAAAn2B,GAA4C3J,WAAA,0CAAmD,KAAA9F,EAAAS,GAAA,KAAAN,EAAA,OAA8BE,YAAA,mBAAAE,MAAA,CAAsC4D,MAAAnE,EAAAvB,GAAA,qCAAmD,CAAA0B,EAAA,OAAYE,YAAA,cAAyB,CAAAF,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,2BAAAuB,EAAAS,GAAA,KAAAN,EAAA,UAAmFE,YAAA,MAAAG,GAAA,CAAsBE,MAAAV,EAAA06B,iBAA4B,CAAA16B,EAAAS,GAAA,iBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,0DAAAuB,EAAAS,GAAA,KAAAN,EAAA,cAA+HI,MAAA,CAAOoF,KAAA,YAAAxB,MAAAnE,EAAAvB,GAAA,sBAAA0rB,SAAAnqB,EAAAu1B,aAAAG,MAAAZ,IAAA9J,IAAA,KAAA6a,WAAA,KAAwHt2B,MAAA,CAAQ1J,MAAA7F,EAAA,eAAAwP,SAAA,SAAAC,GAAoDzP,EAAA2yB,eAAAljB,GAAuB3J,WAAA,oBAA8B9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,cAAAxB,MAAAnE,EAAAvB,GAAA,wBAAA0rB,SAAAnqB,EAAAu1B,aAAAG,MAAAt2B,MAAA4rB,IAAA,IAAA6a,WAAA,KAA6Ht2B,MAAA,CAAQ1J,MAAA7F,EAAA,iBAAAwP,SAAA,SAAAC,GAAsDzP,EAAA4yB,iBAAAnjB,GAAyB3J,WAAA,sBAAgC9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,iBAAAxB,MAAAnE,EAAAvB,GAAA,2BAAA0rB,SAAAnqB,EAAAu1B,aAAAG,MAAAX,SAAA/J,IAAA,KAAA6a,WAAA,KAAuIt2B,MAAA,CAAQ1J,MAAA7F,EAAA,oBAAAwP,SAAA,SAAAC,GAAyDzP,EAAA6yB,oBAAApjB,GAA4B3J,WAAA,yBAAmC9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,cAAAxB,MAAAnE,EAAAvB,GAAA,wBAAA0rB,SAAAnqB,EAAAu1B,aAAAG,MAAAV,MAAAhK,IAAA,KAAA6a,WAAA,KAA8Ht2B,MAAA,CAAQ1J,MAAA7F,EAAA,iBAAAwP,SAAA,SAAAC,GAAsDzP,EAAA8yB,iBAAArjB,GAAyB3J,WAAA,sBAAgC9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,eAAAxB,MAAAnE,EAAAvB,GAAA,yBAAA0rB,SAAAnqB,EAAAu1B,aAAAG,MAAA/R,OAAAqH,IAAA,KAAA6a,WAAA,KAAiIt2B,MAAA,CAAQ1J,MAAA7F,EAAA,kBAAAwP,SAAA,SAAAC,GAAuDzP,EAAA+yB,kBAAAtjB,GAA0B3J,WAAA,uBAAiC9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,kBAAAxB,MAAAnE,EAAAvB,GAAA,4BAAA0rB,SAAAnqB,EAAAu1B,aAAAG,MAAAT,UAAAjK,IAAA,KAAA6a,WAAA,KAA0It2B,MAAA,CAAQ1J,MAAA7F,EAAA,qBAAAwP,SAAA,SAAAC,GAA0DzP,EAAAgzB,qBAAAvjB,GAA6B3J,WAAA,0BAAoC9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,mBAAAxB,MAAAnE,EAAAvB,GAAA,6BAAA0rB,SAAAnqB,EAAAu1B,aAAAG,MAAAP,WAAAnK,IAAA,KAAA6a,WAAA,KAA6It2B,MAAA,CAAQ1J,MAAA7F,EAAA,sBAAAwP,SAAA,SAAAC,GAA2DzP,EAAAizB,sBAAAxjB,GAA8B3J,WAAA,2BAAqC9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,gBAAAxB,MAAAnE,EAAAvB,GAAA,0BAAA0rB,SAAAnqB,EAAAu1B,aAAAG,MAAAR,QAAAlK,IAAA,KAAA6a,WAAA,KAAoIt2B,MAAA,CAAQ1J,MAAA7F,EAAA,mBAAAwP,SAAA,SAAAC,GAAwDzP,EAAAkzB,mBAAAzjB,GAA2B3J,WAAA,wBAAkC9F,EAAAS,GAAA,KAAAN,EAAA,cAA+BI,MAAA,CAAOoF,KAAA,oBAAAxB,MAAAnE,EAAAvB,GAAA,8BAAA0rB,SAAAnqB,EAAAu1B,aAAAG,MAAAN,aAAA,EAAApK,IAAA,KAAA6a,WAAA,KAAqJt2B,MAAA,CAAQ1J,MAAA7F,EAAA,uBAAAwP,SAAA,SAAAC,GAA4DzP,EAAAmzB,uBAAA1jB,GAA+B3J,WAAA,6BAAsC,GAAA9F,EAAAS,GAAA,KAAAN,EAAA,OAA4BE,YAAA,mBAAAE,MAAA,CAAsC4D,MAAAnE,EAAAvB,GAAA,uCAAqD,CAAA0B,EAAA,OAAYE,YAAA,8BAAyC,CAAAF,EAAA,OAAYE,YAAA,oBAA+B,CAAAL,EAAAS,GAAA,iBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,uDAAA0B,EAAA,SAA2GE,YAAA,SAAAE,MAAA,CAA4BmR,IAAA,oBAAyB,CAAAvR,EAAA,UAAeuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAA,eAAA8F,WAAA,mBAAsFzF,YAAA,kBAAAE,MAAA,CAAuC4C,GAAA,mBAAuB3C,GAAA,CAAKtB,OAAA,SAAA8G,GAA0B,IAAA2L,EAAA9I,MAAA+I,UAAAjN,OAAAkN,KAAA7L,EAAAC,OAAA6L,QAAA,SAAAC,GAAkF,OAAAA,EAAAhJ,WAAkBpF,IAAA,SAAAoO,GAA+D,MAA7C,WAAAA,IAAAC,OAAAD,EAAAlM,QAA0D7F,EAAAwyB,eAAAxsB,EAAAC,OAAAgM,SAAAN,IAAA,MAAgF3R,EAAAoG,GAAApG,EAAA,0BAAAotB,GAAgD,OAAAjtB,EAAA,UAAoB+I,IAAAkkB,EAAArnB,SAAA,CAAqBF,MAAAunB,IAAgB,CAAAptB,EAAAS,GAAA,uBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,qCAAA2uB,IAAA,0BAAsH,GAAAptB,EAAAS,GAAA,KAAAN,EAAA,KAAyBE,YAAA,uBAA6BL,EAAAS,GAAA,KAAAN,EAAA,OAA4BE,YAAA,YAAuB,CAAAF,EAAA,SAAcE,YAAA,QAAAE,MAAA,CAA2BmR,IAAA,aAAkB,CAAA1R,EAAAS,GAAA,mBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,wDAAAuB,EAAAS,GAAA,KAAAN,EAAA,SAA0HuF,WAAA,EAAaC,KAAA,QAAAC,QAAA,UAAAC,MAAA7F,EAAA,uBAAA8F,WAAA,2BAAsGzF,YAAA,iBAAAE,MAAA,CAAsC4C,GAAA,WAAAwC,KAAA,WAAAxH,KAAA,YAAoD4H,SAAA,CAAW0D,QAAAZ,MAAAwkB,QAAArtB,EAAA43B,wBAAA53B,EAAAstB,GAAAttB,EAAA43B,uBAAA,SAAA53B,EAAA,wBAA4HQ,GAAA,CAAKtB,OAAA,SAAA8G,GAA0B,IAAAunB,EAAAvtB,EAAA43B,uBAAApK,EAAAxnB,EAAAC,OAAAwnB,IAAAD,EAAA/jB,QAAsF,GAAAZ,MAAAwkB,QAAAE,GAAA,CAAuB,IAAAG,EAAA1tB,EAAAstB,GAAAC,EAAA,MAAiCC,EAAA/jB,QAAiBikB,EAAA,IAAA1tB,EAAA43B,uBAAArK,EAAApiB,OAAA,CAAlD,QAA6GuiB,GAAA,IAAA1tB,EAAA43B,uBAAArK,EAAA3jB,MAAA,EAAA8jB,GAAAviB,OAAAoiB,EAAA3jB,MAAA8jB,EAAA,UAAqF1tB,EAAA43B,uBAAAnK,MAAkCztB,EAAAS,GAAA,KAAAN,EAAA,SAA0BE,YAAA,iBAAAE,MAAA,CAAoCmR,IAAA,gBAAkB1R,EAAAS,GAAA,KAAAN,EAAA,UAA6BE,YAAA,MAAAG,GAAA,CAAsBE,MAAAV,EAAA46B,eAA0B,CAAA56B,EAAAS,GAAA,iBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,0DAAAuB,EAAAS,GAAA,KAAAN,EAAA,iBAAkII,MAAA,CAAOqS,QAAA5S,EAAA83B,sBAAA3N,SAAAnqB,EAAA83B,uBAAyEvoB,MAAA,CAAQ1J,MAAA7F,EAAA,cAAAwP,SAAA,SAAAC,GAAmDzP,EAAA63B,cAAApoB,GAAsB3J,WAAA,mBAA6B9F,EAAAS,GAAA,gBAAAT,EAAAwyB,gBAAA,iBAAAxyB,EAAAwyB,eAAAryB,EAAA,OAAAA,EAAA,QAA8GI,MAAA,CAAOqtB,KAAA,wDAAAC,IAAA,MAA0E,CAAA1tB,EAAA,QAAAH,EAAAS,GAAA,6BAAAT,EAAAS,GAAA,KAAAN,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,uDAAAuB,EAAAS,GAAA,KAAAN,EAAA,QAAwKI,MAAA,CAAOqtB,KAAA,wDAAAC,IAAA,MAA0E,CAAA1tB,EAAA,QAAAH,EAAAS,GAAA,iBAAAT,EAAAS,GAAA,KAAAN,EAAA,QAAAH,EAAAS,GAAA,mBAAAT,EAAAS,GAAA,KAAAN,EAAA,QAAAH,EAAAS,GAAA,aAAAT,EAAAS,GAAA,KAAAN,EAAA,QAAwJI,MAAA,CAAOqtB,KAAA,mDAAAC,IAAA,MAAqE,CAAA1tB,EAAA,QAAAH,EAAAS,GAAA,kBAAAT,EAAAS,GAAA,KAAAN,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,0DAAAuB,EAAAY,MAAA,GAAAZ,EAAAS,GAAA,KAAAN,EAAA,OAA4KE,YAAA,kBAAAE,MAAA,CAAqC4D,MAAAnE,EAAAvB,GAAA,qCAAmD,CAAA0B,EAAA,OAAYE,YAAA,cAAyB,CAAAF,EAAA,KAAAH,EAAAS,GAAAT,EAAAW,GAAAX,EAAAvB,GAAA,iCAAAuB,EAAAS,GAAA,KAAAN,EAAA,UAAyFE,YAAA,MAAAG,GAAA,CAAsBE,MAAAV,EAAA66B,aAAwB,CAAA76B,EAAAS,GAAA,iBAAAT,EAAAW,GAAAX,EAAAvB,GAAA,0DAAAuB,EAAAS,GAAA,KAAAN,EAAA,eAAgII,MAAA,CAAOoF,KAAA,KAAAxB,MAAAnE,EAAAvB,GAAA,6CAAA0rB,SAAAnqB,EAAAu1B,aAAAK,MAAAkQ,UAAAC,aAAA,KAAqIx2B,MAAA,CAAQ1J,MAAA7F,EAAA0yB,WAAA,UAAAljB,SAAA,SAAAC,GAA0DzP,EAAA0P,KAAA1P,EAAA0yB,WAAA,YAAAjjB,IAA2C3J,WAAA,0BAAoC9F,EAAAS,GAAA,KAAAN,EAAA,eAAgCI,MAAA,CAAOoF,KAAA,QAAAxB,MAAAnE,EAAAvB,GAAA,yCAAA0rB,SAAAnqB,EAAAu1B,aAAAK,MAAAx2B,OAA+GmQ,MAAA,CAAQ1J,MAAA7F,EAAA0yB,WAAA,MAAAljB,SAAA,SAAAC,GAAsDzP,EAAA0P,KAAA1P,EAAA0yB,WAAA,QAAAjjB,IAAuC3J,WAAA,sBAAgC9F,EAAAS,GAAA,KAAAN,EAAA,eAAgCI,MAAA,CAAOoF,KAAA,OAAAxB,MAAAnE,EAAAvB,GAAA,wCAAA0rB,SAAAnqB,EAAAu1B,aAAAK,MAAAoQ,MAA4Gz2B,MAAA,CAAQ1J,MAAA7F,EAAA0yB,WAAA,KAAAljB,SAAA,SAAAC,GAAqDzP,EAAA0P,KAAA1P,EAAA0yB,WAAA,OAAAjjB,IAAsC3J,WAAA,qBAA+B9F,EAAAS,GAAA,KAAAN,EAAA,eAAgCI,MAAA,CAAOoF,KAAA,WAAAxB,MAAAnE,EAAAvB,GAAA,4CAAA0rB,SAAAnqB,EAAAu1B,aAAAK,MAAAqQ,UAAwH12B,MAAA,CAAQ1J,MAAA7F,EAAA0yB,WAAA,SAAAljB,SAAA,SAAAC,GAAyDzP,EAAA0P,KAAA1P,EAAA0yB,WAAA,WAAAjjB,IAA0C3J,WAAA,0BAAmC,SAAA9F,EAAAS,GAAA,KAAAN,EAAA,OAAkCE,YAAA,mBAA8B,CAAAF,EAAA,UAAeE,YAAA,aAAAE,MAAA,CAAgC+G,UAAAtH,EAAAg4B,YAA2Bx3B,GAAA,CAAKE,MAAAV,EAAA85B,iBAA4B,CAAA95B,EAAAS,GAAA,WAAAT,EAAAW,GAAAX,EAAAvB,GAAA,8BAAAuB,EAAAS,GAAA,KAAAN,EAAA,UAAyFE,YAAA,MAAAG,GAAA,CAAsBE,MAAAV,EAAAq6B,WAAsB,CAAAr6B,EAAAS,GAAA,WAAAT,EAAAW,GAAAX,EAAAvB,GAAA,qDACl3xC,IDIY,EAa7B69B,GATiB,KAEU,MAYG,QEmCjB4J,GAjDc,CAC3B1jC,WAAY,CACVuK,gBAEA7K,sBACAikC,qBACAn3B,oBACA2B,gBACAoH,eACA6F,cACAoI,cACAsD,cACA8c,aAEF1jC,SAAU,CACR2jC,WADQ,WAEN,QAAS7nC,KAAK8D,OAAOM,MAAMC,MAAMC,aAEnCgiB,KAJQ,WAKN,MAA0D,WAAnDtmB,KAAK8D,OAAOM,MAAZ,UAA4B0jC,qBAGvCrnC,QAAS,CACPsnC,OADO,WAEL,IAAMC,EAAYhoC,KAAK8D,OAAOM,MAAZ,UAA4B6jC,uBAE9C,GAAID,EAAW,CACb,IAAME,EAAWloC,KAAKW,MAAMwnC,YAAYt6B,OAAvB,QAAsCu6B,UAAU,SAAAC,GAC/D,OAAOA,EAAIjoC,MAAQioC,EAAIjoC,KAAK2B,MAAM,mBAAqBimC,IAErDE,GAAY,GACdloC,KAAKW,MAAMwnC,YAAYG,OAAOJ,GAKlCloC,KAAK8D,OAAOC,SAAS,iCAGzBgV,QAvC2B,WAwCzB/Y,KAAK+nC,UAEPrhC,MAAO,CACL4f,KAAM,SAAUjf,GACVA,GAAOrH,KAAK+nC,YChDtB,IAEIQ,GAVJ,SAAoBpnC,GAClBnC,EAAQ,MAeNwpC,GAAYnnC,OAAAC,EAAA,EAAAD,CACdonC,GCjBQ,WAAgB,IAAAjnC,EAAAxB,KAAayB,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,gBAA0BG,IAAA,cAAAD,YAAA,wBAAAE,MAAA,CAA6D2mC,gBAAA,EAAAr4B,mBAAA,IAA4C,CAAA1O,EAAA,OAAYI,MAAA,CAAO4D,MAAAnE,EAAAvB,GAAA,oBAAAglC,KAAA,SAAA0D,gBAAA,YAA8E,CAAAhnC,EAAA,kBAAAH,EAAAS,GAAA,KAAAT,EAAA,WAAAG,EAAA,OAA8DI,MAAA,CAAO4D,MAAAnE,EAAAvB,GAAA,wBAAAglC,KAAA,OAAA0D,gBAAA,YAAgF,CAAAhnC,EAAA,kBAAAH,EAAAY,KAAAZ,EAAAS,GAAA,KAAAT,EAAA,WAAAG,EAAA,OAAuEI,MAAA,CAAO4D,MAAAnE,EAAAvB,GAAA,yBAAAglC,KAAA,OAAA0D,gBAAA,aAAkF,CAAAhnC,EAAA,mBAAAH,EAAAY,KAAAZ,EAAAS,GAAA,KAAAN,EAAA,OAAuDI,MAAA,CAAO4D,MAAAnE,EAAAvB,GAAA,sBAAAglC,KAAA,SAAA0D,gBAAA,cAAkF,CAAAhnC,EAAA,oBAAAH,EAAAS,GAAA,KAAAN,EAAA,OAA+CI,MAAA,CAAO4D,MAAAnE,EAAAvB,GAAA,kBAAAglC,KAAA,QAAA0D,gBAAA,UAAyE,CAAAhnC,EAAA,gBAAAH,EAAAS,GAAA,KAAAT,EAAA,WAAAG,EAAA,OAA4DI,MAAA,CAAO4D,MAAAnE,EAAAvB,GAAA,0BAAAglC,KAAA,iBAAA0D,gBAAA,kBAAkG,CAAAhnC,EAAA,wBAAAH,EAAAY,KAAAZ,EAAAS,GAAA,KAAAT,EAAA,WAAAG,EAAA,OAA6EI,MAAA,CAAO4D,MAAAnE,EAAAvB,GAAA,mCAAAglC,KAAA,WAAA0D,gBAAA,qBAAwG,CAAAhnC,EAAA,2BAAAH,EAAAY,KAAAZ,EAAAS,GAAA,KAAAT,EAAA,WAAAG,EAAA,OAAgFI,MAAA,CAAO4D,MAAAnE,EAAAvB,GAAA,6BAAA2oC,YAAA,EAAA3D,KAAA,UAAA0D,gBAAA,mBAAiH,CAAAhnC,EAAA,yBAAAH,EAAAY,KAAAZ,EAAAS,GAAA,KAAAN,EAAA,OAA6DI,MAAA,CAAO4D,MAAAnE,EAAAvB,GAAA,0BAAAglC,KAAA,eAAA0D,gBAAA,YAA0F,CAAAhnC,EAAA,qBACrjD,IDOY,EAa7B4mC,GATiB,KAEU,MAYdM,EAAA,QAAAL,GAAiB","file":"static/js/2.c92f4803ff24726cea58.js","sourcesContent":["// style-loader: Adds some css to the DOM by adding a \n\n\n\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!./color_input.scss\")\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=1!./color_input.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./color_input.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./color_input.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-77e407b6\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./color_input.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"color-input style-control\",class:{ disabled: !_vm.present || _vm.disabled }},[_c('label',{staticClass:\"label\",attrs:{\"for\":_vm.name}},[_vm._v(\"\\n \"+_vm._s(_vm.label)+\"\\n \")]),_vm._v(\" \"),(typeof _vm.fallback !== 'undefined' && _vm.showOptionalTickbox)?_c('Checkbox',{staticClass:\"opt\",attrs:{\"checked\":_vm.present,\"disabled\":_vm.disabled},on:{\"change\":function($event){return _vm.$emit('input', typeof _vm.value === 'undefined' ? _vm.fallback : undefined)}}}):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"input color-input-field\"},[_c('input',{staticClass:\"textColor unstyled\",attrs:{\"id\":_vm.name + '-t',\"type\":\"text\",\"disabled\":!_vm.present || _vm.disabled},domProps:{\"value\":_vm.value || _vm.fallback},on:{\"input\":function($event){return _vm.$emit('input', $event.target.value)}}}),_vm._v(\" \"),(_vm.validColor)?_c('input',{staticClass:\"nativeColor unstyled\",attrs:{\"id\":_vm.name,\"type\":\"color\",\"disabled\":!_vm.present || _vm.disabled},domProps:{\"value\":_vm.value || _vm.fallback},on:{\"input\":function($event){return _vm.$emit('input', $event.target.value)}}}):_vm._e(),_vm._v(\" \"),(_vm.transparentColor)?_c('div',{staticClass:\"transparentIndicator\"}):_vm._e(),_vm._v(\" \"),(_vm.computedColor)?_c('div',{staticClass:\"computedIndicator\",style:({backgroundColor: _vm.fallback})}):_vm._e()])],1)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./range_input.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./range_input.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-6a3c1a26\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./range_input.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"range-control style-control\",class:{ disabled: !_vm.present || _vm.disabled }},[_c('label',{staticClass:\"label\",attrs:{\"for\":_vm.name}},[_vm._v(\"\\n \"+_vm._s(_vm.label)+\"\\n \")]),_vm._v(\" \"),(typeof _vm.fallback !== 'undefined')?_c('input',{staticClass:\"opt\",attrs:{\"id\":_vm.name + '-o',\"type\":\"checkbox\"},domProps:{\"checked\":_vm.present},on:{\"input\":function($event){return _vm.$emit('input', !_vm.present ? _vm.fallback : undefined)}}}):_vm._e(),_vm._v(\" \"),(typeof _vm.fallback !== 'undefined')?_c('label',{staticClass:\"opt-l\",attrs:{\"for\":_vm.name + '-o'}}):_vm._e(),_vm._v(\" \"),_c('input',{staticClass:\"input-number\",attrs:{\"id\":_vm.name,\"type\":\"range\",\"disabled\":!_vm.present || _vm.disabled,\"max\":_vm.max || _vm.hardMax || 100,\"min\":_vm.min || _vm.hardMin || 0,\"step\":_vm.step || 1},domProps:{\"value\":_vm.value || _vm.fallback},on:{\"input\":function($event){return _vm.$emit('input', $event.target.value)}}}),_vm._v(\" \"),_c('input',{staticClass:\"input-number\",attrs:{\"id\":_vm.name,\"type\":\"number\",\"disabled\":!_vm.present || _vm.disabled,\"max\":_vm.hardMax,\"min\":_vm.hardMin,\"step\":_vm.step || 1},domProps:{\"value\":_vm.value || _vm.fallback},on:{\"input\":function($event){return _vm.$emit('input', $event.target.value)}}})])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","\n\n\n","/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./opacity_input.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./opacity_input.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-3b48fa39\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./opacity_input.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"opacity-control style-control\",class:{ disabled: !_vm.present || _vm.disabled }},[_c('label',{staticClass:\"label\",attrs:{\"for\":_vm.name}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.common.opacity'))+\"\\n \")]),_vm._v(\" \"),(typeof _vm.fallback !== 'undefined')?_c('Checkbox',{staticClass:\"opt\",attrs:{\"checked\":_vm.present,\"disabled\":_vm.disabled},on:{\"change\":function($event){return _vm.$emit('input', !_vm.present ? _vm.fallback : undefined)}}}):_vm._e(),_vm._v(\" \"),_c('input',{staticClass:\"input-number\",attrs:{\"id\":_vm.name,\"type\":\"number\",\"disabled\":!_vm.present || _vm.disabled,\"max\":\"1\",\"min\":\"0\",\"step\":\".05\"},domProps:{\"value\":_vm.value || _vm.fallback},on:{\"input\":function($event){return _vm.$emit('input', $event.target.value)}}})],1)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import ColorInput from '../color_input/color_input.vue'\nimport OpacityInput from '../opacity_input/opacity_input.vue'\nimport { getCssShadow } from '../../services/style_setter/style_setter.js'\nimport { hex2rgb } from '../../services/color_convert/color_convert.js'\n\nconst toModel = (object = {}) => ({\n x: 0,\n y: 0,\n blur: 0,\n spread: 0,\n inset: false,\n color: '#000000',\n alpha: 1,\n ...object\n})\n\nexport default {\n // 'Value' and 'Fallback' can be undefined, but if they are\n // initially vue won't detect it when they become something else\n // therefore i'm using \"ready\" which should be passed as true when\n // data becomes available\n props: [\n 'value', 'fallback', 'ready'\n ],\n data () {\n return {\n selectedId: 0,\n // TODO there are some bugs regarding display of array (it's not getting updated when deleting for some reason)\n cValue: (this.value || this.fallback || []).map(toModel)\n }\n },\n components: {\n ColorInput,\n OpacityInput\n },\n methods: {\n add () {\n this.cValue.push(toModel(this.selected))\n this.selectedId = this.cValue.length - 1\n },\n del () {\n this.cValue.splice(this.selectedId, 1)\n this.selectedId = this.cValue.length === 0 ? undefined : Math.max(this.selectedId - 1, 0)\n },\n moveUp () {\n const movable = this.cValue.splice(this.selectedId, 1)[0]\n this.cValue.splice(this.selectedId - 1, 0, movable)\n this.selectedId -= 1\n },\n moveDn () {\n const movable = this.cValue.splice(this.selectedId, 1)[0]\n this.cValue.splice(this.selectedId + 1, 0, movable)\n this.selectedId += 1\n }\n },\n beforeUpdate () {\n this.cValue = this.value || this.fallback\n },\n computed: {\n anyShadows () {\n return this.cValue.length > 0\n },\n anyShadowsFallback () {\n return this.fallback.length > 0\n },\n selected () {\n if (this.ready && this.anyShadows) {\n return this.cValue[this.selectedId]\n } else {\n return toModel({})\n }\n },\n currentFallback () {\n if (this.ready && this.anyShadowsFallback) {\n return this.fallback[this.selectedId]\n } else {\n return toModel({})\n }\n },\n moveUpValid () {\n return this.ready && this.selectedId > 0\n },\n moveDnValid () {\n return this.ready && this.selectedId < this.cValue.length - 1\n },\n present () {\n return this.ready &&\n typeof this.cValue[this.selectedId] !== 'undefined' &&\n !this.usingFallback\n },\n usingFallback () {\n return typeof this.value === 'undefined'\n },\n rgb () {\n return hex2rgb(this.selected.color)\n },\n style () {\n return this.ready ? {\n boxShadow: getCssShadow(this.fallback)\n } : {}\n }\n }\n}\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./shadow_control.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./shadow_control.js\"\nimport __vue_script__ from \"!!babel-loader!./shadow_control.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-5c532734\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./shadow_control.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"shadow-control\",class:{ disabled: !_vm.present }},[_c('div',{staticClass:\"shadow-preview-container\"},[_c('div',{staticClass:\"y-shift-control\",attrs:{\"disabled\":!_vm.present}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.y),expression:\"selected.y\"}],staticClass:\"input-number\",attrs:{\"disabled\":!_vm.present,\"type\":\"number\"},domProps:{\"value\":(_vm.selected.y)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.selected, \"y\", $event.target.value)}}}),_vm._v(\" \"),_c('div',{staticClass:\"wrap\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.y),expression:\"selected.y\"}],staticClass:\"input-range\",attrs:{\"disabled\":!_vm.present,\"type\":\"range\",\"max\":\"20\",\"min\":\"-20\"},domProps:{\"value\":(_vm.selected.y)},on:{\"__r\":function($event){return _vm.$set(_vm.selected, \"y\", $event.target.value)}}})])]),_vm._v(\" \"),_c('div',{staticClass:\"preview-window\"},[_c('div',{staticClass:\"preview-block\",style:(_vm.style)})]),_vm._v(\" \"),_c('div',{staticClass:\"x-shift-control\",attrs:{\"disabled\":!_vm.present}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.x),expression:\"selected.x\"}],staticClass:\"input-number\",attrs:{\"disabled\":!_vm.present,\"type\":\"number\"},domProps:{\"value\":(_vm.selected.x)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.selected, \"x\", $event.target.value)}}}),_vm._v(\" \"),_c('div',{staticClass:\"wrap\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.x),expression:\"selected.x\"}],staticClass:\"input-range\",attrs:{\"disabled\":!_vm.present,\"type\":\"range\",\"max\":\"20\",\"min\":\"-20\"},domProps:{\"value\":(_vm.selected.x)},on:{\"__r\":function($event){return _vm.$set(_vm.selected, \"x\", $event.target.value)}}})])])]),_vm._v(\" \"),_c('div',{staticClass:\"shadow-tweak\"},[_c('div',{staticClass:\"id-control style-control\",attrs:{\"disabled\":_vm.usingFallback}},[_c('label',{staticClass:\"select\",attrs:{\"for\":\"shadow-switcher\",\"disabled\":!_vm.ready || _vm.usingFallback}},[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selectedId),expression:\"selectedId\"}],staticClass:\"shadow-switcher\",attrs:{\"id\":\"shadow-switcher\",\"disabled\":!_vm.ready || _vm.usingFallback},on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.selectedId=$event.target.multiple ? $$selectedVal : $$selectedVal[0]}}},_vm._l((_vm.cValue),function(shadow,index){return _c('option',{key:index,domProps:{\"value\":index}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.shadows.shadow_id', { value: index }))+\"\\n \")])}),0),_vm._v(\" \"),_c('i',{staticClass:\"icon-down-open\"})]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-default\",attrs:{\"disabled\":!_vm.ready || !_vm.present},on:{\"click\":_vm.del}},[_c('i',{staticClass:\"icon-cancel\"})]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-default\",attrs:{\"disabled\":!_vm.moveUpValid},on:{\"click\":_vm.moveUp}},[_c('i',{staticClass:\"icon-up-open\"})]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-default\",attrs:{\"disabled\":!_vm.moveDnValid},on:{\"click\":_vm.moveDn}},[_c('i',{staticClass:\"icon-down-open\"})]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-default\",attrs:{\"disabled\":_vm.usingFallback},on:{\"click\":_vm.add}},[_c('i',{staticClass:\"icon-plus\"})])]),_vm._v(\" \"),_c('div',{staticClass:\"inset-control style-control\",attrs:{\"disabled\":!_vm.present}},[_c('label',{staticClass:\"label\",attrs:{\"for\":\"inset\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.shadows.inset'))+\"\\n \")]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.inset),expression:\"selected.inset\"}],staticClass:\"input-inset\",attrs:{\"id\":\"inset\",\"disabled\":!_vm.present,\"name\":\"inset\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.selected.inset)?_vm._i(_vm.selected.inset,null)>-1:(_vm.selected.inset)},on:{\"change\":function($event){var $$a=_vm.selected.inset,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.selected, \"inset\", $$a.concat([$$v])))}else{$$i>-1&&(_vm.$set(_vm.selected, \"inset\", $$a.slice(0,$$i).concat($$a.slice($$i+1))))}}else{_vm.$set(_vm.selected, \"inset\", $$c)}}}}),_vm._v(\" \"),_c('label',{staticClass:\"checkbox-label\",attrs:{\"for\":\"inset\"}})]),_vm._v(\" \"),_c('div',{staticClass:\"blur-control style-control\",attrs:{\"disabled\":!_vm.present}},[_c('label',{staticClass:\"label\",attrs:{\"for\":\"spread\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.shadows.blur'))+\"\\n \")]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.blur),expression:\"selected.blur\"}],staticClass:\"input-range\",attrs:{\"id\":\"blur\",\"disabled\":!_vm.present,\"name\":\"blur\",\"type\":\"range\",\"max\":\"20\",\"min\":\"0\"},domProps:{\"value\":(_vm.selected.blur)},on:{\"__r\":function($event){return _vm.$set(_vm.selected, \"blur\", $event.target.value)}}}),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.blur),expression:\"selected.blur\"}],staticClass:\"input-number\",attrs:{\"disabled\":!_vm.present,\"type\":\"number\",\"min\":\"0\"},domProps:{\"value\":(_vm.selected.blur)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.selected, \"blur\", $event.target.value)}}})]),_vm._v(\" \"),_c('div',{staticClass:\"spread-control style-control\",attrs:{\"disabled\":!_vm.present}},[_c('label',{staticClass:\"label\",attrs:{\"for\":\"spread\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.shadows.spread'))+\"\\n \")]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.spread),expression:\"selected.spread\"}],staticClass:\"input-range\",attrs:{\"id\":\"spread\",\"disabled\":!_vm.present,\"name\":\"spread\",\"type\":\"range\",\"max\":\"20\",\"min\":\"-20\"},domProps:{\"value\":(_vm.selected.spread)},on:{\"__r\":function($event){return _vm.$set(_vm.selected, \"spread\", $event.target.value)}}}),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.spread),expression:\"selected.spread\"}],staticClass:\"input-number\",attrs:{\"disabled\":!_vm.present,\"type\":\"number\"},domProps:{\"value\":(_vm.selected.spread)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.selected, \"spread\", $event.target.value)}}})]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"disabled\":!_vm.present,\"label\":_vm.$t('settings.style.common.color'),\"fallback\":_vm.currentFallback.color,\"show-optional-tickbox\":false,\"name\":\"shadow\"},model:{value:(_vm.selected.color),callback:function ($$v) {_vm.$set(_vm.selected, \"color\", $$v)},expression:\"selected.color\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"disabled\":!_vm.present},model:{value:(_vm.selected.alpha),callback:function ($$v) {_vm.$set(_vm.selected, \"alpha\", $$v)},expression:\"selected.alpha\"}}),_vm._v(\" \"),_c('i18n',{attrs:{\"path\":\"settings.style.shadows.hintV3\",\"tag\":\"p\"}},[_c('code',[_vm._v(\"--variable,mod\")])])],1)])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import { set } from 'vue'\n\nexport default {\n props: [\n 'name', 'label', 'value', 'fallback', 'options', 'no-inherit'\n ],\n data () {\n return {\n lValue: this.value,\n availableOptions: [\n this.noInherit ? '' : 'inherit',\n 'custom',\n ...(this.options || []),\n 'serif',\n 'monospace',\n 'sans-serif'\n ].filter(_ => _)\n }\n },\n beforeUpdate () {\n this.lValue = this.value\n },\n computed: {\n present () {\n return typeof this.lValue !== 'undefined'\n },\n dValue () {\n return this.lValue || this.fallback || {}\n },\n family: {\n get () {\n return this.dValue.family\n },\n set (v) {\n set(this.lValue, 'family', v)\n this.$emit('input', this.lValue)\n }\n },\n isCustom () {\n return this.preset === 'custom'\n },\n preset: {\n get () {\n if (this.family === 'serif' ||\n this.family === 'sans-serif' ||\n this.family === 'monospace' ||\n this.family === 'inherit') {\n return this.family\n } else {\n return 'custom'\n }\n },\n set (v) {\n this.family = v === 'custom' ? '' : v\n }\n }\n }\n}\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./font_control.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./font_control.js\"\nimport __vue_script__ from \"!!babel-loader!./font_control.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-0edf8dfc\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./font_control.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"font-control style-control\",class:{ custom: _vm.isCustom }},[_c('label',{staticClass:\"label\",attrs:{\"for\":_vm.preset === 'custom' ? _vm.name : _vm.name + '-font-switcher'}},[_vm._v(\"\\n \"+_vm._s(_vm.label)+\"\\n \")]),_vm._v(\" \"),(typeof _vm.fallback !== 'undefined')?_c('input',{staticClass:\"opt exlcude-disabled\",attrs:{\"id\":_vm.name + '-o',\"type\":\"checkbox\"},domProps:{\"checked\":_vm.present},on:{\"input\":function($event){return _vm.$emit('input', typeof _vm.value === 'undefined' ? _vm.fallback : undefined)}}}):_vm._e(),_vm._v(\" \"),(typeof _vm.fallback !== 'undefined')?_c('label',{staticClass:\"opt-l\",attrs:{\"for\":_vm.name + '-o'}}):_vm._e(),_vm._v(\" \"),_c('label',{staticClass:\"select\",attrs:{\"for\":_vm.name + '-font-switcher',\"disabled\":!_vm.present}},[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.preset),expression:\"preset\"}],staticClass:\"font-switcher\",attrs:{\"id\":_vm.name + '-font-switcher',\"disabled\":!_vm.present},on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.preset=$event.target.multiple ? $$selectedVal : $$selectedVal[0]}}},_vm._l((_vm.availableOptions),function(option){return _c('option',{key:option,domProps:{\"value\":option}},[_vm._v(\"\\n \"+_vm._s(option === 'custom' ? _vm.$t('settings.style.fonts.custom') : option)+\"\\n \")])}),0),_vm._v(\" \"),_c('i',{staticClass:\"icon-down-open\"})]),_vm._v(\" \"),(_vm.isCustom)?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.family),expression:\"family\"}],staticClass:\"custom-font\",attrs:{\"id\":_vm.name,\"type\":\"text\"},domProps:{\"value\":(_vm.family)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.family=$event.target.value}}}):_vm._e()])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","\n\n\n\n\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./contrast_ratio.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./contrast_ratio.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./contrast_ratio.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-2507acc6\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./contrast_ratio.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.contrast)?_c('span',{staticClass:\"contrast-ratio\"},[_c('span',{staticClass:\"rating\",attrs:{\"title\":_vm.hint}},[(_vm.contrast.aaa)?_c('span',[_c('i',{staticClass:\"icon-thumbs-up-alt\"})]):_vm._e(),_vm._v(\" \"),(!_vm.contrast.aaa && _vm.contrast.aa)?_c('span',[_c('i',{staticClass:\"icon-adjust\"})]):_vm._e(),_vm._v(\" \"),(!_vm.contrast.aaa && !_vm.contrast.aa)?_c('span',[_c('i',{staticClass:\"icon-attention\"})]):_vm._e()]),_vm._v(\" \"),(_vm.contrast && _vm.large)?_c('span',{staticClass:\"rating\",attrs:{\"title\":_vm.hint_18pt}},[(_vm.contrast.laaa)?_c('span',[_c('i',{staticClass:\"icon-thumbs-up-alt\"})]):_vm._e(),_vm._v(\" \"),(!_vm.contrast.laaa && _vm.contrast.laa)?_c('span',[_c('i',{staticClass:\"icon-adjust\"})]):_vm._e(),_vm._v(\" \"),(!_vm.contrast.laaa && !_vm.contrast.laa)?_c('span',[_c('i',{staticClass:\"icon-attention\"})]):_vm._e()]):_vm._e()]):_vm._e()}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","\n\n\n\n\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./export_import.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./export_import.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./export_import.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-3d9b5a74\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./export_import.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"import-export-container\"},[_vm._t(\"before\"),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.exportData}},[_vm._v(\"\\n \"+_vm._s(_vm.exportLabel)+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.importData}},[_vm._v(\"\\n \"+_vm._s(_vm.importLabel)+\"\\n \")]),_vm._v(\" \"),_vm._t(\"afterButtons\"),_vm._v(\" \"),(_vm.importFailed)?_c('p',{staticClass:\"alert error\"},[_vm._v(\"\\n \"+_vm._s(_vm.importFailedText)+\"\\n \")]):_vm._e(),_vm._v(\" \"),_vm._t(\"afterError\")],2)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./preview.vue\")\n}\n/* script */\nvar __vue_script__ = null\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-1a88be74\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./preview.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"preview-container\"},[_c('div',{staticClass:\"underlay underlay-preview\"}),_vm._v(\" \"),_c('div',{staticClass:\"panel dummy\"},[_c('div',{staticClass:\"panel-heading\"},[_c('div',{staticClass:\"title\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.header'))+\"\\n \"),_c('span',{staticClass:\"badge badge-notification\"},[_vm._v(\"\\n 99\\n \")])]),_vm._v(\" \"),_c('span',{staticClass:\"faint\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.header_faint'))+\"\\n \")]),_vm._v(\" \"),_c('span',{staticClass:\"alert error\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.error'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.button'))+\"\\n \")])]),_vm._v(\" \"),_c('div',{staticClass:\"panel-body theme-preview-content\"},[_c('div',{staticClass:\"post\"},[_c('div',{staticClass:\"avatar still-image\"},[_vm._v(\"\\n ( ͡° ͜ʖ ͡°)\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"content\"},[_c('h4',[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.content'))+\"\\n \")]),_vm._v(\" \"),_c('i18n',{attrs:{\"path\":\"settings.style.preview.text\"}},[_c('code',{staticStyle:{\"font-family\":\"var(--postCodeFont)\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.mono'))+\"\\n \")]),_vm._v(\" \"),_c('a',{staticStyle:{\"color\":\"var(--link)\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.link'))+\"\\n \")])]),_vm._v(\" \"),_vm._m(0)],1)]),_vm._v(\" \"),_c('div',{staticClass:\"after-post\"},[_c('div',{staticClass:\"avatar-alt\"},[_vm._v(\"\\n :^)\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"content\"},[_c('i18n',{staticClass:\"faint\",attrs:{\"path\":\"settings.style.preview.fine_print\",\"tag\":\"span\"}},[_c('a',{staticStyle:{\"color\":\"var(--faintLink)\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.faint_link'))+\"\\n \")])])],1)]),_vm._v(\" \"),_c('div',{staticClass:\"separator\"}),_vm._v(\" \"),_c('span',{staticClass:\"alert error\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.error'))+\"\\n \")]),_vm._v(\" \"),_c('input',{attrs:{\"type\":\"text\"},domProps:{\"value\":_vm.$t('settings.style.preview.input')}}),_vm._v(\" \"),_c('div',{staticClass:\"actions\"},[_c('span',{staticClass:\"checkbox\"},[_c('input',{attrs:{\"id\":\"preview_checkbox\",\"checked\":\"very yes\",\"type\":\"checkbox\"}}),_vm._v(\" \"),_c('label',{attrs:{\"for\":\"preview_checkbox\"}},[_vm._v(_vm._s(_vm.$t('settings.style.preview.checkbox')))])]),_vm._v(\" \"),_c('button',{staticClass:\"btn\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.button'))+\"\\n \")])])])])])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"icons\"},[_c('i',{staticClass:\"button-icon icon-reply\",staticStyle:{\"color\":\"var(--cBlue)\"}}),_vm._v(\" \"),_c('i',{staticClass:\"button-icon icon-retweet\",staticStyle:{\"color\":\"var(--cGreen)\"}}),_vm._v(\" \"),_c('i',{staticClass:\"button-icon icon-star\",staticStyle:{\"color\":\"var(--cOrange)\"}}),_vm._v(\" \"),_c('i',{staticClass:\"button-icon icon-cancel\",staticStyle:{\"color\":\"var(--cRed)\"}})])}]\nexport { render, staticRenderFns }","import { set, delete as del } from 'vue'\nimport {\n rgb2hex,\n hex2rgb,\n getContrastRatioLayers\n} from 'src/services/color_convert/color_convert.js'\nimport {\n DEFAULT_SHADOWS,\n generateColors,\n generateShadows,\n generateRadii,\n generateFonts,\n composePreset,\n getThemes,\n shadows2to3,\n colors2to3\n} from 'src/services/style_setter/style_setter.js'\nimport {\n SLOT_INHERITANCE\n} from 'src/services/theme_data/pleromafe.js'\nimport {\n CURRENT_VERSION,\n OPACITIES,\n getLayers,\n getOpacitySlot\n} from 'src/services/theme_data/theme_data.service.js'\nimport ColorInput from 'src/components/color_input/color_input.vue'\nimport RangeInput from 'src/components/range_input/range_input.vue'\nimport OpacityInput from 'src/components/opacity_input/opacity_input.vue'\nimport ShadowControl from 'src/components/shadow_control/shadow_control.vue'\nimport FontControl from 'src/components/font_control/font_control.vue'\nimport ContrastRatio from 'src/components/contrast_ratio/contrast_ratio.vue'\nimport TabSwitcher from 'src/components/tab_switcher/tab_switcher.js'\nimport ExportImport from 'src/components/export_import/export_import.vue'\nimport Checkbox from 'src/components/checkbox/checkbox.vue'\n\nimport Preview from './preview.vue'\n\n// List of color values used in v1\nconst v1OnlyNames = [\n 'bg',\n 'fg',\n 'text',\n 'link',\n 'cRed',\n 'cGreen',\n 'cBlue',\n 'cOrange'\n].map(_ => _ + 'ColorLocal')\n\nconst colorConvert = (color) => {\n if (color.startsWith('--') || color === 'transparent') {\n return color\n } else {\n return hex2rgb(color)\n }\n}\n\nexport default {\n data () {\n return {\n availableStyles: [],\n selected: this.$store.getters.mergedConfig.theme,\n themeWarning: undefined,\n tempImportFile: undefined,\n engineVersion: 0,\n\n previewShadows: {},\n previewColors: {},\n previewRadii: {},\n previewFonts: {},\n\n shadowsInvalid: true,\n colorsInvalid: true,\n radiiInvalid: true,\n\n keepColor: false,\n keepShadows: false,\n keepOpacity: false,\n keepRoundness: false,\n keepFonts: false,\n\n ...Object.keys(SLOT_INHERITANCE)\n .map(key => [key, ''])\n .reduce((acc, [key, val]) => ({ ...acc, [ key + 'ColorLocal' ]: val }), {}),\n\n ...Object.keys(OPACITIES)\n .map(key => [key, ''])\n .reduce((acc, [key, val]) => ({ ...acc, [ key + 'OpacityLocal' ]: val }), {}),\n\n shadowSelected: undefined,\n shadowsLocal: {},\n fontsLocal: {},\n\n btnRadiusLocal: '',\n inputRadiusLocal: '',\n checkboxRadiusLocal: '',\n panelRadiusLocal: '',\n avatarRadiusLocal: '',\n avatarAltRadiusLocal: '',\n attachmentRadiusLocal: '',\n tooltipRadiusLocal: '',\n chatMessageRadiusLocal: ''\n }\n },\n created () {\n const self = this\n\n getThemes()\n .then((promises) => {\n return Promise.all(\n Object.entries(promises)\n .map(([k, v]) => v.then(res => [k, res]))\n )\n })\n .then(themes => themes.reduce((acc, [k, v]) => {\n if (v) {\n return {\n ...acc,\n [k]: v\n }\n } else {\n return acc\n }\n }, {}))\n .then((themesComplete) => {\n self.availableStyles = themesComplete\n })\n },\n mounted () {\n this.loadThemeFromLocalStorage()\n if (typeof this.shadowSelected === 'undefined') {\n this.shadowSelected = this.shadowsAvailable[0]\n }\n },\n computed: {\n themeWarningHelp () {\n if (!this.themeWarning) return\n const t = this.$t\n const pre = 'settings.style.switcher.help.'\n const {\n origin,\n themeEngineVersion,\n type,\n noActionsPossible\n } = this.themeWarning\n if (origin === 'file') {\n // Loaded v2 theme from file\n if (themeEngineVersion === 2 && type === 'wrong_version') {\n return t(pre + 'v2_imported')\n }\n if (themeEngineVersion > CURRENT_VERSION) {\n return t(pre + 'future_version_imported') + ' ' +\n (\n noActionsPossible\n ? t(pre + 'snapshot_missing')\n : t(pre + 'snapshot_present')\n )\n }\n if (themeEngineVersion < CURRENT_VERSION) {\n return t(pre + 'future_version_imported') + ' ' +\n (\n noActionsPossible\n ? t(pre + 'snapshot_missing')\n : t(pre + 'snapshot_present')\n )\n }\n } else if (origin === 'localStorage') {\n if (type === 'snapshot_source_mismatch') {\n return t(pre + 'snapshot_source_mismatch')\n }\n // FE upgraded from v2\n if (themeEngineVersion === 2) {\n return t(pre + 'upgraded_from_v2')\n }\n // Admin downgraded FE\n if (themeEngineVersion > CURRENT_VERSION) {\n return t(pre + 'fe_downgraded') + ' ' +\n (\n noActionsPossible\n ? t(pre + 'migration_snapshot_ok')\n : t(pre + 'migration_snapshot_gone')\n )\n }\n // Admin upgraded FE\n if (themeEngineVersion < CURRENT_VERSION) {\n return t(pre + 'fe_upgraded') + ' ' +\n (\n noActionsPossible\n ? t(pre + 'migration_snapshot_ok')\n : t(pre + 'migration_snapshot_gone')\n )\n }\n }\n },\n selectedVersion () {\n return Array.isArray(this.selected) ? 1 : 2\n },\n currentColors () {\n return Object.keys(SLOT_INHERITANCE)\n .map(key => [key, this[key + 'ColorLocal']])\n .reduce((acc, [key, val]) => ({ ...acc, [ key ]: val }), {})\n },\n currentOpacity () {\n return Object.keys(OPACITIES)\n .map(key => [key, this[key + 'OpacityLocal']])\n .reduce((acc, [key, val]) => ({ ...acc, [ key ]: val }), {})\n },\n currentRadii () {\n return {\n btn: this.btnRadiusLocal,\n input: this.inputRadiusLocal,\n checkbox: this.checkboxRadiusLocal,\n panel: this.panelRadiusLocal,\n avatar: this.avatarRadiusLocal,\n avatarAlt: this.avatarAltRadiusLocal,\n tooltip: this.tooltipRadiusLocal,\n attachment: this.attachmentRadiusLocal,\n chatMessage: this.chatMessageRadiusLocal\n }\n },\n preview () {\n return composePreset(this.previewColors, this.previewRadii, this.previewShadows, this.previewFonts)\n },\n previewTheme () {\n if (!this.preview.theme.colors) return { colors: {}, opacity: {}, radii: {}, shadows: {}, fonts: {} }\n return this.preview.theme\n },\n // This needs optimization maybe\n previewContrast () {\n try {\n if (!this.previewTheme.colors.bg) return {}\n const colors = this.previewTheme.colors\n const opacity = this.previewTheme.opacity\n if (!colors.bg) return {}\n const hints = (ratio) => ({\n text: ratio.toPrecision(3) + ':1',\n // AA level, AAA level\n aa: ratio >= 4.5,\n aaa: ratio >= 7,\n // same but for 18pt+ texts\n laa: ratio >= 3,\n laaa: ratio >= 4.5\n })\n const colorsConverted = Object.entries(colors).reduce((acc, [key, value]) => ({ ...acc, [key]: colorConvert(value) }), {})\n\n const ratios = Object.entries(SLOT_INHERITANCE).reduce((acc, [key, value]) => {\n const slotIsBaseText = key === 'text' || key === 'link'\n const slotIsText = slotIsBaseText || (\n typeof value === 'object' && value !== null && value.textColor\n )\n if (!slotIsText) return acc\n const { layer, variant } = slotIsBaseText ? { layer: 'bg' } : value\n const background = variant || layer\n const opacitySlot = getOpacitySlot(background)\n const textColors = [\n key,\n ...(background === 'bg' ? ['cRed', 'cGreen', 'cBlue', 'cOrange'] : [])\n ]\n\n const layers = getLayers(\n layer,\n variant || layer,\n opacitySlot,\n colorsConverted,\n opacity\n )\n\n return {\n ...acc,\n ...textColors.reduce((acc, textColorKey) => {\n const newKey = slotIsBaseText\n ? 'bg' + textColorKey[0].toUpperCase() + textColorKey.slice(1)\n : textColorKey\n return {\n ...acc,\n [newKey]: getContrastRatioLayers(\n colorsConverted[textColorKey],\n layers,\n colorsConverted[textColorKey]\n )\n }\n }, {})\n }\n }, {})\n\n return Object.entries(ratios).reduce((acc, [k, v]) => { acc[k] = hints(v); return acc }, {})\n } catch (e) {\n console.warn('Failure computing contrasts', e)\n }\n },\n previewRules () {\n if (!this.preview.rules) return ''\n return [\n ...Object.values(this.preview.rules),\n 'color: var(--text)',\n 'font-family: var(--interfaceFont, sans-serif)'\n ].join(';')\n },\n shadowsAvailable () {\n return Object.keys(DEFAULT_SHADOWS).sort()\n },\n currentShadowOverriden: {\n get () {\n return !!this.currentShadow\n },\n set (val) {\n if (val) {\n set(this.shadowsLocal, this.shadowSelected, this.currentShadowFallback.map(_ => Object.assign({}, _)))\n } else {\n del(this.shadowsLocal, this.shadowSelected)\n }\n }\n },\n currentShadowFallback () {\n return (this.previewTheme.shadows || {})[this.shadowSelected]\n },\n currentShadow: {\n get () {\n return this.shadowsLocal[this.shadowSelected]\n },\n set (v) {\n set(this.shadowsLocal, this.shadowSelected, v)\n }\n },\n themeValid () {\n return !this.shadowsInvalid && !this.colorsInvalid && !this.radiiInvalid\n },\n exportedTheme () {\n const saveEverything = (\n !this.keepFonts &&\n !this.keepShadows &&\n !this.keepOpacity &&\n !this.keepRoundness &&\n !this.keepColor\n )\n\n const source = {\n themeEngineVersion: CURRENT_VERSION\n }\n\n if (this.keepFonts || saveEverything) {\n source.fonts = this.fontsLocal\n }\n if (this.keepShadows || saveEverything) {\n source.shadows = this.shadowsLocal\n }\n if (this.keepOpacity || saveEverything) {\n source.opacity = this.currentOpacity\n }\n if (this.keepColor || saveEverything) {\n source.colors = this.currentColors\n }\n if (this.keepRoundness || saveEverything) {\n source.radii = this.currentRadii\n }\n\n const theme = {\n themeEngineVersion: CURRENT_VERSION,\n ...this.previewTheme\n }\n\n return {\n // To separate from other random JSON files and possible future source formats\n _pleroma_theme_version: 2, theme, source\n }\n }\n },\n components: {\n ColorInput,\n OpacityInput,\n RangeInput,\n ContrastRatio,\n ShadowControl,\n FontControl,\n TabSwitcher,\n Preview,\n ExportImport,\n Checkbox\n },\n methods: {\n loadTheme (\n {\n theme,\n source,\n _pleroma_theme_version: fileVersion\n },\n origin,\n forceUseSource = false\n ) {\n this.dismissWarning()\n if (!source && !theme) {\n throw new Error('Can\\'t load theme: empty')\n }\n const version = (origin === 'localStorage' && !theme.colors)\n ? 'l1'\n : fileVersion\n const snapshotEngineVersion = (theme || {}).themeEngineVersion\n const themeEngineVersion = (source || {}).themeEngineVersion || 2\n const versionsMatch = themeEngineVersion === CURRENT_VERSION\n const sourceSnapshotMismatch = (\n theme !== undefined &&\n source !== undefined &&\n themeEngineVersion !== snapshotEngineVersion\n )\n // Force loading of source if user requested it or if snapshot\n // is unavailable\n const forcedSourceLoad = (source && forceUseSource) || !theme\n if (!(versionsMatch && !sourceSnapshotMismatch) &&\n !forcedSourceLoad &&\n version !== 'l1' &&\n origin !== 'defaults'\n ) {\n if (sourceSnapshotMismatch && origin === 'localStorage') {\n this.themeWarning = {\n origin,\n themeEngineVersion,\n type: 'snapshot_source_mismatch'\n }\n } else if (!theme) {\n this.themeWarning = {\n origin,\n noActionsPossible: true,\n themeEngineVersion,\n type: 'no_snapshot_old_version'\n }\n } else if (!versionsMatch) {\n this.themeWarning = {\n origin,\n noActionsPossible: !source,\n themeEngineVersion,\n type: 'wrong_version'\n }\n }\n }\n this.normalizeLocalState(theme, version, source, forcedSourceLoad)\n },\n forceLoadLocalStorage () {\n this.loadThemeFromLocalStorage(true)\n },\n dismissWarning () {\n this.themeWarning = undefined\n this.tempImportFile = undefined\n },\n forceLoad () {\n const { origin } = this.themeWarning\n switch (origin) {\n case 'localStorage':\n this.loadThemeFromLocalStorage(true)\n break\n case 'file':\n this.onImport(this.tempImportFile, true)\n break\n }\n this.dismissWarning()\n },\n forceSnapshot () {\n const { origin } = this.themeWarning\n switch (origin) {\n case 'localStorage':\n this.loadThemeFromLocalStorage(false, true)\n break\n case 'file':\n console.err('Forcing snapshout from file is not supported yet')\n break\n }\n this.dismissWarning()\n },\n loadThemeFromLocalStorage (confirmLoadSource = false, forceSnapshot = false) {\n const {\n customTheme: theme,\n customThemeSource: source\n } = this.$store.getters.mergedConfig\n if (!theme && !source) {\n // Anon user or never touched themes\n this.loadTheme(\n this.$store.state.instance.themeData,\n 'defaults',\n confirmLoadSource\n )\n } else {\n this.loadTheme(\n {\n theme,\n source: forceSnapshot ? theme : source\n },\n 'localStorage',\n confirmLoadSource\n )\n }\n },\n setCustomTheme () {\n this.$store.dispatch('setOption', {\n name: 'customTheme',\n value: {\n themeEngineVersion: CURRENT_VERSION,\n ...this.previewTheme\n }\n })\n this.$store.dispatch('setOption', {\n name: 'customThemeSource',\n value: {\n themeEngineVersion: CURRENT_VERSION,\n shadows: this.shadowsLocal,\n fonts: this.fontsLocal,\n opacity: this.currentOpacity,\n colors: this.currentColors,\n radii: this.currentRadii\n }\n })\n },\n updatePreviewColorsAndShadows () {\n this.previewColors = generateColors({\n opacity: this.currentOpacity,\n colors: this.currentColors\n })\n this.previewShadows = generateShadows(\n { shadows: this.shadowsLocal, opacity: this.previewTheme.opacity, themeEngineVersion: this.engineVersion },\n this.previewColors.theme.colors,\n this.previewColors.mod\n )\n },\n onImport (parsed, forceSource = false) {\n this.tempImportFile = parsed\n this.loadTheme(parsed, 'file', forceSource)\n },\n importValidator (parsed) {\n const version = parsed._pleroma_theme_version\n return version >= 1 || version <= 2\n },\n clearAll () {\n this.loadThemeFromLocalStorage()\n },\n\n // Clears all the extra stuff when loading V1 theme\n clearV1 () {\n Object.keys(this.$data)\n .filter(_ => _.endsWith('ColorLocal') || _.endsWith('OpacityLocal'))\n .filter(_ => !v1OnlyNames.includes(_))\n .forEach(key => {\n set(this.$data, key, undefined)\n })\n },\n\n clearRoundness () {\n Object.keys(this.$data)\n .filter(_ => _.endsWith('RadiusLocal'))\n .forEach(key => {\n set(this.$data, key, undefined)\n })\n },\n\n clearOpacity () {\n Object.keys(this.$data)\n .filter(_ => _.endsWith('OpacityLocal'))\n .forEach(key => {\n set(this.$data, key, undefined)\n })\n },\n\n clearShadows () {\n this.shadowsLocal = {}\n },\n\n clearFonts () {\n this.fontsLocal = {}\n },\n\n /**\n * This applies stored theme data onto form. Supports three versions of data:\n * v3 (version >= 3) - newest version of themes which supports snapshots for better compatiblity\n * v2 (version = 2) - newer version of themes.\n * v1 (version = 1) - older version of themes (import from file)\n * v1l (version = l1) - older version of theme (load from local storage)\n * v1 and v1l differ because of way themes were stored/exported.\n * @param {Object} theme - theme data (snapshot)\n * @param {Number} version - version of data. 0 means try to guess based on data. \"l1\" means v1, locastorage type\n * @param {Object} source - theme source - this will be used if compatible\n * @param {Boolean} source - by default source won't be used if version doesn't match since it might render differently\n * this allows importing source anyway\n */\n normalizeLocalState (theme, version = 0, source, forceSource = false) {\n let input\n if (typeof source !== 'undefined') {\n if (forceSource || source.themeEngineVersion === CURRENT_VERSION) {\n input = source\n version = source.themeEngineVersion\n } else {\n input = theme\n }\n } else {\n input = theme\n }\n\n const radii = input.radii || input\n const opacity = input.opacity\n const shadows = input.shadows || {}\n const fonts = input.fonts || {}\n const colors = !input.themeEngineVersion\n ? colors2to3(input.colors || input)\n : input.colors || input\n\n if (version === 0) {\n if (input.version) version = input.version\n // Old v1 naming: fg is text, btn is foreground\n if (typeof colors.text === 'undefined' && typeof colors.fg !== 'undefined') {\n version = 1\n }\n // New v2 naming: text is text, fg is foreground\n if (typeof colors.text !== 'undefined' && typeof colors.fg !== 'undefined') {\n version = 2\n }\n }\n\n this.engineVersion = version\n\n // Stuff that differs between V1 and V2\n if (version === 1) {\n this.fgColorLocal = rgb2hex(colors.btn)\n this.textColorLocal = rgb2hex(colors.fg)\n }\n\n if (!this.keepColor) {\n this.clearV1()\n const keys = new Set(version !== 1 ? Object.keys(SLOT_INHERITANCE) : [])\n if (version === 1 || version === 'l1') {\n keys\n .add('bg')\n .add('link')\n .add('cRed')\n .add('cBlue')\n .add('cGreen')\n .add('cOrange')\n }\n\n keys.forEach(key => {\n const color = colors[key]\n const hex = rgb2hex(colors[key])\n this[key + 'ColorLocal'] = hex === '#aN' ? color : hex\n })\n }\n\n if (opacity && !this.keepOpacity) {\n this.clearOpacity()\n Object.entries(opacity).forEach(([k, v]) => {\n if (typeof v === 'undefined' || v === null || Number.isNaN(v)) return\n this[k + 'OpacityLocal'] = v\n })\n }\n\n if (!this.keepRoundness) {\n this.clearRoundness()\n Object.entries(radii).forEach(([k, v]) => {\n // 'Radius' is kept mostly for v1->v2 localstorage transition\n const key = k.endsWith('Radius') ? k.split('Radius')[0] : k\n this[key + 'RadiusLocal'] = v\n })\n }\n\n if (!this.keepShadows) {\n this.clearShadows()\n if (version === 2) {\n this.shadowsLocal = shadows2to3(shadows, this.previewTheme.opacity)\n } else {\n this.shadowsLocal = shadows\n }\n this.shadowSelected = this.shadowsAvailable[0]\n }\n\n if (!this.keepFonts) {\n this.clearFonts()\n this.fontsLocal = fonts\n }\n }\n },\n watch: {\n currentRadii () {\n try {\n this.previewRadii = generateRadii({ radii: this.currentRadii })\n this.radiiInvalid = false\n } catch (e) {\n this.radiiInvalid = true\n console.warn(e)\n }\n },\n shadowsLocal: {\n handler () {\n if (Object.getOwnPropertyNames(this.previewColors).length === 1) return\n try {\n this.updatePreviewColorsAndShadows()\n this.shadowsInvalid = false\n } catch (e) {\n this.shadowsInvalid = true\n console.warn(e)\n }\n },\n deep: true\n },\n fontsLocal: {\n handler () {\n try {\n this.previewFonts = generateFonts({ fonts: this.fontsLocal })\n this.fontsInvalid = false\n } catch (e) {\n this.fontsInvalid = true\n console.warn(e)\n }\n },\n deep: true\n },\n currentColors () {\n try {\n this.updatePreviewColorsAndShadows()\n this.colorsInvalid = false\n this.shadowsInvalid = false\n } catch (e) {\n this.colorsInvalid = true\n this.shadowsInvalid = true\n console.warn(e)\n }\n },\n currentOpacity () {\n try {\n this.updatePreviewColorsAndShadows()\n } catch (e) {\n console.warn(e)\n }\n },\n selected () {\n this.dismissWarning()\n if (this.selectedVersion === 1) {\n if (!this.keepRoundness) {\n this.clearRoundness()\n }\n\n if (!this.keepShadows) {\n this.clearShadows()\n }\n\n if (!this.keepOpacity) {\n this.clearOpacity()\n }\n\n if (!this.keepColor) {\n this.clearV1()\n\n this.bgColorLocal = this.selected[1]\n this.fgColorLocal = this.selected[2]\n this.textColorLocal = this.selected[3]\n this.linkColorLocal = this.selected[4]\n this.cRedColorLocal = this.selected[5]\n this.cGreenColorLocal = this.selected[6]\n this.cBlueColorLocal = this.selected[7]\n this.cOrangeColorLocal = this.selected[8]\n }\n } else if (this.selectedVersion >= 2) {\n this.normalizeLocalState(this.selected.theme, 2, this.selected.source)\n }\n }\n }\n}\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!./theme_tab.scss\")\n}\n/* script */\nexport * from \"!!babel-loader!./theme_tab.js\"\nimport __vue_script__ from \"!!babel-loader!./theme_tab.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-af7d0e5c\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./theme_tab.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"theme-tab\"},[_c('div',{staticClass:\"presets-container\"},[_c('div',{staticClass:\"save-load\"},[(_vm.themeWarning)?_c('div',{staticClass:\"theme-warning\"},[_c('div',{staticClass:\"alert warning\"},[_vm._v(\"\\n \"+_vm._s(_vm.themeWarningHelp)+\"\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"buttons\"},[(_vm.themeWarning.type === 'snapshot_source_mismatch')?[_c('button',{staticClass:\"btn\",on:{\"click\":_vm.forceLoad}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.use_source'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.forceSnapshot}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.use_snapshot'))+\"\\n \")])]:(_vm.themeWarning.noActionsPossible)?[_c('button',{staticClass:\"btn\",on:{\"click\":_vm.dismissWarning}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('general.dismiss'))+\"\\n \")])]:[_c('button',{staticClass:\"btn\",on:{\"click\":_vm.forceLoad}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.load_theme'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.dismissWarning}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.keep_as_is'))+\"\\n \")])]],2)]):_vm._e(),_vm._v(\" \"),_c('ExportImport',{attrs:{\"export-object\":_vm.exportedTheme,\"export-label\":_vm.$t(\"settings.export_theme\"),\"import-label\":_vm.$t(\"settings.import_theme\"),\"import-failed-text\":_vm.$t(\"settings.invalid_theme_imported\"),\"on-import\":_vm.onImport,\"validator\":_vm.importValidator}},[_c('template',{slot:\"before\"},[_c('div',{staticClass:\"presets\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.presets'))+\"\\n \"),_c('label',{staticClass:\"select\",attrs:{\"for\":\"preset-switcher\"}},[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected),expression:\"selected\"}],staticClass:\"preset-switcher\",attrs:{\"id\":\"preset-switcher\"},on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.selected=$event.target.multiple ? $$selectedVal : $$selectedVal[0]}}},_vm._l((_vm.availableStyles),function(style){return _c('option',{key:style.name,style:({\n backgroundColor: style[1] || (style.theme || style.source).colors.bg,\n color: style[3] || (style.theme || style.source).colors.text\n }),domProps:{\"value\":style}},[_vm._v(\"\\n \"+_vm._s(style[0] || style.name)+\"\\n \")])}),0),_vm._v(\" \"),_c('i',{staticClass:\"icon-down-open\"})])])])],2)],1),_vm._v(\" \"),_c('div',{staticClass:\"save-load-options\"},[_c('span',{staticClass:\"keep-option\"},[_c('Checkbox',{model:{value:(_vm.keepColor),callback:function ($$v) {_vm.keepColor=$$v},expression:\"keepColor\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.keep_color'))+\"\\n \")])],1),_vm._v(\" \"),_c('span',{staticClass:\"keep-option\"},[_c('Checkbox',{model:{value:(_vm.keepShadows),callback:function ($$v) {_vm.keepShadows=$$v},expression:\"keepShadows\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.keep_shadows'))+\"\\n \")])],1),_vm._v(\" \"),_c('span',{staticClass:\"keep-option\"},[_c('Checkbox',{model:{value:(_vm.keepOpacity),callback:function ($$v) {_vm.keepOpacity=$$v},expression:\"keepOpacity\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.keep_opacity'))+\"\\n \")])],1),_vm._v(\" \"),_c('span',{staticClass:\"keep-option\"},[_c('Checkbox',{model:{value:(_vm.keepRoundness),callback:function ($$v) {_vm.keepRoundness=$$v},expression:\"keepRoundness\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.keep_roundness'))+\"\\n \")])],1),_vm._v(\" \"),_c('span',{staticClass:\"keep-option\"},[_c('Checkbox',{model:{value:(_vm.keepFonts),callback:function ($$v) {_vm.keepFonts=$$v},expression:\"keepFonts\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.keep_fonts'))+\"\\n \")])],1),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('settings.style.switcher.save_load_hint')))])])]),_vm._v(\" \"),_c('preview',{style:(_vm.previewRules)}),_vm._v(\" \"),_c('keep-alive',[_c('tab-switcher',{key:\"style-tweak\"},[_c('div',{staticClass:\"color-container\",attrs:{\"label\":_vm.$t('settings.style.common_colors._tab_label')}},[_c('div',{staticClass:\"tab-header\"},[_c('p',[_vm._v(_vm._s(_vm.$t('settings.theme_help')))]),_vm._v(\" \"),_c('div',{staticClass:\"tab-header-buttons\"},[_c('button',{staticClass:\"btn\",on:{\"click\":_vm.clearOpacity}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.clear_opacity'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.clearV1}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.clear_all'))+\"\\n \")])])]),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('settings.theme_help_v2_1')))]),_vm._v(\" \"),_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.common_colors.main')))]),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('ColorInput',{attrs:{\"name\":\"bgColor\",\"label\":_vm.$t('settings.background')},model:{value:(_vm.bgColorLocal),callback:function ($$v) {_vm.bgColorLocal=$$v},expression:\"bgColorLocal\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"bgOpacity\",\"fallback\":_vm.previewTheme.opacity.bg},model:{value:(_vm.bgOpacityLocal),callback:function ($$v) {_vm.bgOpacityLocal=$$v},expression:\"bgOpacityLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"textColor\",\"label\":_vm.$t('settings.text')},model:{value:(_vm.textColorLocal),callback:function ($$v) {_vm.textColorLocal=$$v},expression:\"textColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.bgText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"accentColor\",\"fallback\":_vm.previewTheme.colors.link,\"label\":_vm.$t('settings.accent'),\"show-optional-tickbox\":typeof _vm.linkColorLocal !== 'undefined'},model:{value:(_vm.accentColorLocal),callback:function ($$v) {_vm.accentColorLocal=$$v},expression:\"accentColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"linkColor\",\"fallback\":_vm.previewTheme.colors.accent,\"label\":_vm.$t('settings.links'),\"show-optional-tickbox\":typeof _vm.accentColorLocal !== 'undefined'},model:{value:(_vm.linkColorLocal),callback:function ($$v) {_vm.linkColorLocal=$$v},expression:\"linkColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.bgLink}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('ColorInput',{attrs:{\"name\":\"fgColor\",\"label\":_vm.$t('settings.foreground')},model:{value:(_vm.fgColorLocal),callback:function ($$v) {_vm.fgColorLocal=$$v},expression:\"fgColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"fgTextColor\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.fgText},model:{value:(_vm.fgTextColorLocal),callback:function ($$v) {_vm.fgTextColorLocal=$$v},expression:\"fgTextColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"fgLinkColor\",\"label\":_vm.$t('settings.links'),\"fallback\":_vm.previewTheme.colors.fgLink},model:{value:(_vm.fgLinkColorLocal),callback:function ($$v) {_vm.fgLinkColorLocal=$$v},expression:\"fgLinkColorLocal\"}}),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('settings.style.common_colors.foreground_hint')))])],1),_vm._v(\" \"),_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.common_colors.rgbo')))]),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('ColorInput',{attrs:{\"name\":\"cRedColor\",\"label\":_vm.$t('settings.cRed')},model:{value:(_vm.cRedColorLocal),callback:function ($$v) {_vm.cRedColorLocal=$$v},expression:\"cRedColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.bgCRed}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"cBlueColor\",\"label\":_vm.$t('settings.cBlue')},model:{value:(_vm.cBlueColorLocal),callback:function ($$v) {_vm.cBlueColorLocal=$$v},expression:\"cBlueColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.bgCBlue}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('ColorInput',{attrs:{\"name\":\"cGreenColor\",\"label\":_vm.$t('settings.cGreen')},model:{value:(_vm.cGreenColorLocal),callback:function ($$v) {_vm.cGreenColorLocal=$$v},expression:\"cGreenColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.bgCGreen}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"cOrangeColor\",\"label\":_vm.$t('settings.cOrange')},model:{value:(_vm.cOrangeColorLocal),callback:function ($$v) {_vm.cOrangeColorLocal=$$v},expression:\"cOrangeColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.bgCOrange}})],1),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('settings.theme_help_v2_2')))])]),_vm._v(\" \"),_c('div',{staticClass:\"color-container\",attrs:{\"label\":_vm.$t('settings.style.advanced_colors._tab_label')}},[_c('div',{staticClass:\"tab-header\"},[_c('p',[_vm._v(_vm._s(_vm.$t('settings.theme_help')))]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.clearOpacity}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.clear_opacity'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.clearV1}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.clear_all'))+\"\\n \")])]),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.post')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"postLinkColor\",\"fallback\":_vm.previewTheme.colors.accent,\"label\":_vm.$t('settings.links')},model:{value:(_vm.postLinkColorLocal),callback:function ($$v) {_vm.postLinkColorLocal=$$v},expression:\"postLinkColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.postLink}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"postGreentextColor\",\"fallback\":_vm.previewTheme.colors.cGreen,\"label\":_vm.$t('settings.greentext')},model:{value:(_vm.postGreentextColorLocal),callback:function ($$v) {_vm.postGreentextColorLocal=$$v},expression:\"postGreentextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.postGreentext}}),_vm._v(\" \"),_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.alert')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"alertError\",\"label\":_vm.$t('settings.style.advanced_colors.alert_error'),\"fallback\":_vm.previewTheme.colors.alertError},model:{value:(_vm.alertErrorColorLocal),callback:function ($$v) {_vm.alertErrorColorLocal=$$v},expression:\"alertErrorColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"alertErrorText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.alertErrorText},model:{value:(_vm.alertErrorTextColorLocal),callback:function ($$v) {_vm.alertErrorTextColorLocal=$$v},expression:\"alertErrorTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.alertErrorText,\"large\":\"true\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"alertWarning\",\"label\":_vm.$t('settings.style.advanced_colors.alert_warning'),\"fallback\":_vm.previewTheme.colors.alertWarning},model:{value:(_vm.alertWarningColorLocal),callback:function ($$v) {_vm.alertWarningColorLocal=$$v},expression:\"alertWarningColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"alertWarningText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.alertWarningText},model:{value:(_vm.alertWarningTextColorLocal),callback:function ($$v) {_vm.alertWarningTextColorLocal=$$v},expression:\"alertWarningTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.alertWarningText,\"large\":\"true\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"alertNeutral\",\"label\":_vm.$t('settings.style.advanced_colors.alert_neutral'),\"fallback\":_vm.previewTheme.colors.alertNeutral},model:{value:(_vm.alertNeutralColorLocal),callback:function ($$v) {_vm.alertNeutralColorLocal=$$v},expression:\"alertNeutralColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"alertNeutralText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.alertNeutralText},model:{value:(_vm.alertNeutralTextColorLocal),callback:function ($$v) {_vm.alertNeutralTextColorLocal=$$v},expression:\"alertNeutralTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.alertNeutralText,\"large\":\"true\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"alertOpacity\",\"fallback\":_vm.previewTheme.opacity.alert},model:{value:(_vm.alertOpacityLocal),callback:function ($$v) {_vm.alertOpacityLocal=$$v},expression:\"alertOpacityLocal\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.badge')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"badgeNotification\",\"label\":_vm.$t('settings.style.advanced_colors.badge_notification'),\"fallback\":_vm.previewTheme.colors.badgeNotification},model:{value:(_vm.badgeNotificationColorLocal),callback:function ($$v) {_vm.badgeNotificationColorLocal=$$v},expression:\"badgeNotificationColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"badgeNotificationText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.badgeNotificationText},model:{value:(_vm.badgeNotificationTextColorLocal),callback:function ($$v) {_vm.badgeNotificationTextColorLocal=$$v},expression:\"badgeNotificationTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.badgeNotificationText,\"large\":\"true\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.panel_header')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"panelColor\",\"fallback\":_vm.previewTheme.colors.panel,\"label\":_vm.$t('settings.background')},model:{value:(_vm.panelColorLocal),callback:function ($$v) {_vm.panelColorLocal=$$v},expression:\"panelColorLocal\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"panelOpacity\",\"fallback\":_vm.previewTheme.opacity.panel,\"disabled\":_vm.panelColorLocal === 'transparent'},model:{value:(_vm.panelOpacityLocal),callback:function ($$v) {_vm.panelOpacityLocal=$$v},expression:\"panelOpacityLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"panelTextColor\",\"fallback\":_vm.previewTheme.colors.panelText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.panelTextColorLocal),callback:function ($$v) {_vm.panelTextColorLocal=$$v},expression:\"panelTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.panelText,\"large\":\"true\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"panelLinkColor\",\"fallback\":_vm.previewTheme.colors.panelLink,\"label\":_vm.$t('settings.links')},model:{value:(_vm.panelLinkColorLocal),callback:function ($$v) {_vm.panelLinkColorLocal=$$v},expression:\"panelLinkColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.panelLink,\"large\":\"true\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.top_bar')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"topBarColor\",\"fallback\":_vm.previewTheme.colors.topBar,\"label\":_vm.$t('settings.background')},model:{value:(_vm.topBarColorLocal),callback:function ($$v) {_vm.topBarColorLocal=$$v},expression:\"topBarColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"topBarTextColor\",\"fallback\":_vm.previewTheme.colors.topBarText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.topBarTextColorLocal),callback:function ($$v) {_vm.topBarTextColorLocal=$$v},expression:\"topBarTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.topBarText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"topBarLinkColor\",\"fallback\":_vm.previewTheme.colors.topBarLink,\"label\":_vm.$t('settings.links')},model:{value:(_vm.topBarLinkColorLocal),callback:function ($$v) {_vm.topBarLinkColorLocal=$$v},expression:\"topBarLinkColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.topBarLink}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.inputs')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"inputColor\",\"fallback\":_vm.previewTheme.colors.input,\"label\":_vm.$t('settings.background')},model:{value:(_vm.inputColorLocal),callback:function ($$v) {_vm.inputColorLocal=$$v},expression:\"inputColorLocal\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"inputOpacity\",\"fallback\":_vm.previewTheme.opacity.input,\"disabled\":_vm.inputColorLocal === 'transparent'},model:{value:(_vm.inputOpacityLocal),callback:function ($$v) {_vm.inputOpacityLocal=$$v},expression:\"inputOpacityLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"inputTextColor\",\"fallback\":_vm.previewTheme.colors.inputText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.inputTextColorLocal),callback:function ($$v) {_vm.inputTextColorLocal=$$v},expression:\"inputTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.inputText}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.buttons')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnColor\",\"fallback\":_vm.previewTheme.colors.btn,\"label\":_vm.$t('settings.background')},model:{value:(_vm.btnColorLocal),callback:function ($$v) {_vm.btnColorLocal=$$v},expression:\"btnColorLocal\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"btnOpacity\",\"fallback\":_vm.previewTheme.opacity.btn,\"disabled\":_vm.btnColorLocal === 'transparent'},model:{value:(_vm.btnOpacityLocal),callback:function ($$v) {_vm.btnOpacityLocal=$$v},expression:\"btnOpacityLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnTextColor\",\"fallback\":_vm.previewTheme.colors.btnText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.btnTextColorLocal),callback:function ($$v) {_vm.btnTextColorLocal=$$v},expression:\"btnTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnPanelTextColor\",\"fallback\":_vm.previewTheme.colors.btnPanelText,\"label\":_vm.$t('settings.style.advanced_colors.panel_header')},model:{value:(_vm.btnPanelTextColorLocal),callback:function ($$v) {_vm.btnPanelTextColorLocal=$$v},expression:\"btnPanelTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnPanelText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnTopBarTextColor\",\"fallback\":_vm.previewTheme.colors.btnTopBarText,\"label\":_vm.$t('settings.style.advanced_colors.top_bar')},model:{value:(_vm.btnTopBarTextColorLocal),callback:function ($$v) {_vm.btnTopBarTextColorLocal=$$v},expression:\"btnTopBarTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnTopBarText}}),_vm._v(\" \"),_c('h5',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.pressed')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnPressedColor\",\"fallback\":_vm.previewTheme.colors.btnPressed,\"label\":_vm.$t('settings.background')},model:{value:(_vm.btnPressedColorLocal),callback:function ($$v) {_vm.btnPressedColorLocal=$$v},expression:\"btnPressedColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnPressedTextColor\",\"fallback\":_vm.previewTheme.colors.btnPressedText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.btnPressedTextColorLocal),callback:function ($$v) {_vm.btnPressedTextColorLocal=$$v},expression:\"btnPressedTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnPressedText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnPressedPanelTextColor\",\"fallback\":_vm.previewTheme.colors.btnPressedPanelText,\"label\":_vm.$t('settings.style.advanced_colors.panel_header')},model:{value:(_vm.btnPressedPanelTextColorLocal),callback:function ($$v) {_vm.btnPressedPanelTextColorLocal=$$v},expression:\"btnPressedPanelTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnPressedPanelText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnPressedTopBarTextColor\",\"fallback\":_vm.previewTheme.colors.btnPressedTopBarText,\"label\":_vm.$t('settings.style.advanced_colors.top_bar')},model:{value:(_vm.btnPressedTopBarTextColorLocal),callback:function ($$v) {_vm.btnPressedTopBarTextColorLocal=$$v},expression:\"btnPressedTopBarTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnPressedTopBarText}}),_vm._v(\" \"),_c('h5',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.disabled')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnDisabledColor\",\"fallback\":_vm.previewTheme.colors.btnDisabled,\"label\":_vm.$t('settings.background')},model:{value:(_vm.btnDisabledColorLocal),callback:function ($$v) {_vm.btnDisabledColorLocal=$$v},expression:\"btnDisabledColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnDisabledTextColor\",\"fallback\":_vm.previewTheme.colors.btnDisabledText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.btnDisabledTextColorLocal),callback:function ($$v) {_vm.btnDisabledTextColorLocal=$$v},expression:\"btnDisabledTextColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnDisabledPanelTextColor\",\"fallback\":_vm.previewTheme.colors.btnDisabledPanelText,\"label\":_vm.$t('settings.style.advanced_colors.panel_header')},model:{value:(_vm.btnDisabledPanelTextColorLocal),callback:function ($$v) {_vm.btnDisabledPanelTextColorLocal=$$v},expression:\"btnDisabledPanelTextColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnDisabledTopBarTextColor\",\"fallback\":_vm.previewTheme.colors.btnDisabledTopBarText,\"label\":_vm.$t('settings.style.advanced_colors.top_bar')},model:{value:(_vm.btnDisabledTopBarTextColorLocal),callback:function ($$v) {_vm.btnDisabledTopBarTextColorLocal=$$v},expression:\"btnDisabledTopBarTextColorLocal\"}}),_vm._v(\" \"),_c('h5',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.toggled')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnToggledColor\",\"fallback\":_vm.previewTheme.colors.btnToggled,\"label\":_vm.$t('settings.background')},model:{value:(_vm.btnToggledColorLocal),callback:function ($$v) {_vm.btnToggledColorLocal=$$v},expression:\"btnToggledColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnToggledTextColor\",\"fallback\":_vm.previewTheme.colors.btnToggledText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.btnToggledTextColorLocal),callback:function ($$v) {_vm.btnToggledTextColorLocal=$$v},expression:\"btnToggledTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnToggledText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnToggledPanelTextColor\",\"fallback\":_vm.previewTheme.colors.btnToggledPanelText,\"label\":_vm.$t('settings.style.advanced_colors.panel_header')},model:{value:(_vm.btnToggledPanelTextColorLocal),callback:function ($$v) {_vm.btnToggledPanelTextColorLocal=$$v},expression:\"btnToggledPanelTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnToggledPanelText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnToggledTopBarTextColor\",\"fallback\":_vm.previewTheme.colors.btnToggledTopBarText,\"label\":_vm.$t('settings.style.advanced_colors.top_bar')},model:{value:(_vm.btnToggledTopBarTextColorLocal),callback:function ($$v) {_vm.btnToggledTopBarTextColorLocal=$$v},expression:\"btnToggledTopBarTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnToggledTopBarText}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.tabs')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"tabColor\",\"fallback\":_vm.previewTheme.colors.tab,\"label\":_vm.$t('settings.background')},model:{value:(_vm.tabColorLocal),callback:function ($$v) {_vm.tabColorLocal=$$v},expression:\"tabColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"tabTextColor\",\"fallback\":_vm.previewTheme.colors.tabText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.tabTextColorLocal),callback:function ($$v) {_vm.tabTextColorLocal=$$v},expression:\"tabTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.tabText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"tabActiveTextColor\",\"fallback\":_vm.previewTheme.colors.tabActiveText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.tabActiveTextColorLocal),callback:function ($$v) {_vm.tabActiveTextColorLocal=$$v},expression:\"tabActiveTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.tabActiveText}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.borders')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"borderColor\",\"fallback\":_vm.previewTheme.colors.border,\"label\":_vm.$t('settings.style.common.color')},model:{value:(_vm.borderColorLocal),callback:function ($$v) {_vm.borderColorLocal=$$v},expression:\"borderColorLocal\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"borderOpacity\",\"fallback\":_vm.previewTheme.opacity.border,\"disabled\":_vm.borderColorLocal === 'transparent'},model:{value:(_vm.borderOpacityLocal),callback:function ($$v) {_vm.borderOpacityLocal=$$v},expression:\"borderOpacityLocal\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.faint_text')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"faintColor\",\"fallback\":_vm.previewTheme.colors.faint,\"label\":_vm.$t('settings.text')},model:{value:(_vm.faintColorLocal),callback:function ($$v) {_vm.faintColorLocal=$$v},expression:\"faintColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"faintLinkColor\",\"fallback\":_vm.previewTheme.colors.faintLink,\"label\":_vm.$t('settings.links')},model:{value:(_vm.faintLinkColorLocal),callback:function ($$v) {_vm.faintLinkColorLocal=$$v},expression:\"faintLinkColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"panelFaintColor\",\"fallback\":_vm.previewTheme.colors.panelFaint,\"label\":_vm.$t('settings.style.advanced_colors.panel_header')},model:{value:(_vm.panelFaintColorLocal),callback:function ($$v) {_vm.panelFaintColorLocal=$$v},expression:\"panelFaintColorLocal\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"faintOpacity\",\"fallback\":_vm.previewTheme.opacity.faint},model:{value:(_vm.faintOpacityLocal),callback:function ($$v) {_vm.faintOpacityLocal=$$v},expression:\"faintOpacityLocal\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.underlay')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"underlay\",\"label\":_vm.$t('settings.style.advanced_colors.underlay'),\"fallback\":_vm.previewTheme.colors.underlay},model:{value:(_vm.underlayColorLocal),callback:function ($$v) {_vm.underlayColorLocal=$$v},expression:\"underlayColorLocal\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"underlayOpacity\",\"fallback\":_vm.previewTheme.opacity.underlay,\"disabled\":_vm.underlayOpacityLocal === 'transparent'},model:{value:(_vm.underlayOpacityLocal),callback:function ($$v) {_vm.underlayOpacityLocal=$$v},expression:\"underlayOpacityLocal\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.poll')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"poll\",\"label\":_vm.$t('settings.background'),\"fallback\":_vm.previewTheme.colors.poll},model:{value:(_vm.pollColorLocal),callback:function ($$v) {_vm.pollColorLocal=$$v},expression:\"pollColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"pollText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.pollText},model:{value:(_vm.pollTextColorLocal),callback:function ($$v) {_vm.pollTextColorLocal=$$v},expression:\"pollTextColorLocal\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.icons')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"icon\",\"label\":_vm.$t('settings.style.advanced_colors.icons'),\"fallback\":_vm.previewTheme.colors.icon},model:{value:(_vm.iconColorLocal),callback:function ($$v) {_vm.iconColorLocal=$$v},expression:\"iconColorLocal\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.highlight')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"highlight\",\"label\":_vm.$t('settings.background'),\"fallback\":_vm.previewTheme.colors.highlight},model:{value:(_vm.highlightColorLocal),callback:function ($$v) {_vm.highlightColorLocal=$$v},expression:\"highlightColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"highlightText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.highlightText},model:{value:(_vm.highlightTextColorLocal),callback:function ($$v) {_vm.highlightTextColorLocal=$$v},expression:\"highlightTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.highlightText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"highlightLink\",\"label\":_vm.$t('settings.links'),\"fallback\":_vm.previewTheme.colors.highlightLink},model:{value:(_vm.highlightLinkColorLocal),callback:function ($$v) {_vm.highlightLinkColorLocal=$$v},expression:\"highlightLinkColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.highlightLink}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.popover')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"popover\",\"label\":_vm.$t('settings.background'),\"fallback\":_vm.previewTheme.colors.popover},model:{value:(_vm.popoverColorLocal),callback:function ($$v) {_vm.popoverColorLocal=$$v},expression:\"popoverColorLocal\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"popoverOpacity\",\"fallback\":_vm.previewTheme.opacity.popover,\"disabled\":_vm.popoverOpacityLocal === 'transparent'},model:{value:(_vm.popoverOpacityLocal),callback:function ($$v) {_vm.popoverOpacityLocal=$$v},expression:\"popoverOpacityLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"popoverText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.popoverText},model:{value:(_vm.popoverTextColorLocal),callback:function ($$v) {_vm.popoverTextColorLocal=$$v},expression:\"popoverTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.popoverText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"popoverLink\",\"label\":_vm.$t('settings.links'),\"fallback\":_vm.previewTheme.colors.popoverLink},model:{value:(_vm.popoverLinkColorLocal),callback:function ($$v) {_vm.popoverLinkColorLocal=$$v},expression:\"popoverLinkColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.popoverLink}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.selectedPost')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"selectedPost\",\"label\":_vm.$t('settings.background'),\"fallback\":_vm.previewTheme.colors.selectedPost},model:{value:(_vm.selectedPostColorLocal),callback:function ($$v) {_vm.selectedPostColorLocal=$$v},expression:\"selectedPostColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"selectedPostText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.selectedPostText},model:{value:(_vm.selectedPostTextColorLocal),callback:function ($$v) {_vm.selectedPostTextColorLocal=$$v},expression:\"selectedPostTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.selectedPostText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"selectedPostLink\",\"label\":_vm.$t('settings.links'),\"fallback\":_vm.previewTheme.colors.selectedPostLink},model:{value:(_vm.selectedPostLinkColorLocal),callback:function ($$v) {_vm.selectedPostLinkColorLocal=$$v},expression:\"selectedPostLinkColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.selectedPostLink}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.selectedMenu')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"selectedMenu\",\"label\":_vm.$t('settings.background'),\"fallback\":_vm.previewTheme.colors.selectedMenu},model:{value:(_vm.selectedMenuColorLocal),callback:function ($$v) {_vm.selectedMenuColorLocal=$$v},expression:\"selectedMenuColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"selectedMenuText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.selectedMenuText},model:{value:(_vm.selectedMenuTextColorLocal),callback:function ($$v) {_vm.selectedMenuTextColorLocal=$$v},expression:\"selectedMenuTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.selectedMenuText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"selectedMenuLink\",\"label\":_vm.$t('settings.links'),\"fallback\":_vm.previewTheme.colors.selectedMenuLink},model:{value:(_vm.selectedMenuLinkColorLocal),callback:function ($$v) {_vm.selectedMenuLinkColorLocal=$$v},expression:\"selectedMenuLinkColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.selectedMenuLink}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('chats.chats')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatBgColor\",\"fallback\":_vm.previewTheme.colors.bg || 1,\"label\":_vm.$t('settings.background')},model:{value:(_vm.chatBgColorLocal),callback:function ($$v) {_vm.chatBgColorLocal=$$v},expression:\"chatBgColorLocal\"}}),_vm._v(\" \"),_c('h5',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.chat.incoming')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatMessageIncomingBgColor\",\"fallback\":_vm.previewTheme.colors.bg || 1,\"label\":_vm.$t('settings.background')},model:{value:(_vm.chatMessageIncomingBgColorLocal),callback:function ($$v) {_vm.chatMessageIncomingBgColorLocal=$$v},expression:\"chatMessageIncomingBgColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatMessageIncomingTextColor\",\"fallback\":_vm.previewTheme.colors.text || 1,\"label\":_vm.$t('settings.text')},model:{value:(_vm.chatMessageIncomingTextColorLocal),callback:function ($$v) {_vm.chatMessageIncomingTextColorLocal=$$v},expression:\"chatMessageIncomingTextColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatMessageIncomingLinkColor\",\"fallback\":_vm.previewTheme.colors.link || 1,\"label\":_vm.$t('settings.links')},model:{value:(_vm.chatMessageIncomingLinkColorLocal),callback:function ($$v) {_vm.chatMessageIncomingLinkColorLocal=$$v},expression:\"chatMessageIncomingLinkColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatMessageIncomingBorderLinkColor\",\"fallback\":_vm.previewTheme.colors.fg || 1,\"label\":_vm.$t('settings.style.advanced_colors.chat.border')},model:{value:(_vm.chatMessageIncomingBorderColorLocal),callback:function ($$v) {_vm.chatMessageIncomingBorderColorLocal=$$v},expression:\"chatMessageIncomingBorderColorLocal\"}}),_vm._v(\" \"),_c('h5',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.chat.outgoing')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatMessageOutgoingBgColor\",\"fallback\":_vm.previewTheme.colors.bg || 1,\"label\":_vm.$t('settings.background')},model:{value:(_vm.chatMessageOutgoingBgColorLocal),callback:function ($$v) {_vm.chatMessageOutgoingBgColorLocal=$$v},expression:\"chatMessageOutgoingBgColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatMessageOutgoingTextColor\",\"fallback\":_vm.previewTheme.colors.text || 1,\"label\":_vm.$t('settings.text')},model:{value:(_vm.chatMessageOutgoingTextColorLocal),callback:function ($$v) {_vm.chatMessageOutgoingTextColorLocal=$$v},expression:\"chatMessageOutgoingTextColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatMessageOutgoingLinkColor\",\"fallback\":_vm.previewTheme.colors.link || 1,\"label\":_vm.$t('settings.links')},model:{value:(_vm.chatMessageOutgoingLinkColorLocal),callback:function ($$v) {_vm.chatMessageOutgoingLinkColorLocal=$$v},expression:\"chatMessageOutgoingLinkColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatMessageOutgoingBorderLinkColor\",\"fallback\":_vm.previewTheme.colors.bg || 1,\"label\":_vm.$t('settings.style.advanced_colors.chat.border')},model:{value:(_vm.chatMessageOutgoingBorderColorLocal),callback:function ($$v) {_vm.chatMessageOutgoingBorderColorLocal=$$v},expression:\"chatMessageOutgoingBorderColorLocal\"}})],1)]),_vm._v(\" \"),_c('div',{staticClass:\"radius-container\",attrs:{\"label\":_vm.$t('settings.style.radii._tab_label')}},[_c('div',{staticClass:\"tab-header\"},[_c('p',[_vm._v(_vm._s(_vm.$t('settings.radii_help')))]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.clearRoundness}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.clear_all'))+\"\\n \")])]),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"btnRadius\",\"label\":_vm.$t('settings.btnRadius'),\"fallback\":_vm.previewTheme.radii.btn,\"max\":\"16\",\"hard-min\":\"0\"},model:{value:(_vm.btnRadiusLocal),callback:function ($$v) {_vm.btnRadiusLocal=$$v},expression:\"btnRadiusLocal\"}}),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"inputRadius\",\"label\":_vm.$t('settings.inputRadius'),\"fallback\":_vm.previewTheme.radii.input,\"max\":\"9\",\"hard-min\":\"0\"},model:{value:(_vm.inputRadiusLocal),callback:function ($$v) {_vm.inputRadiusLocal=$$v},expression:\"inputRadiusLocal\"}}),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"checkboxRadius\",\"label\":_vm.$t('settings.checkboxRadius'),\"fallback\":_vm.previewTheme.radii.checkbox,\"max\":\"16\",\"hard-min\":\"0\"},model:{value:(_vm.checkboxRadiusLocal),callback:function ($$v) {_vm.checkboxRadiusLocal=$$v},expression:\"checkboxRadiusLocal\"}}),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"panelRadius\",\"label\":_vm.$t('settings.panelRadius'),\"fallback\":_vm.previewTheme.radii.panel,\"max\":\"50\",\"hard-min\":\"0\"},model:{value:(_vm.panelRadiusLocal),callback:function ($$v) {_vm.panelRadiusLocal=$$v},expression:\"panelRadiusLocal\"}}),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"avatarRadius\",\"label\":_vm.$t('settings.avatarRadius'),\"fallback\":_vm.previewTheme.radii.avatar,\"max\":\"28\",\"hard-min\":\"0\"},model:{value:(_vm.avatarRadiusLocal),callback:function ($$v) {_vm.avatarRadiusLocal=$$v},expression:\"avatarRadiusLocal\"}}),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"avatarAltRadius\",\"label\":_vm.$t('settings.avatarAltRadius'),\"fallback\":_vm.previewTheme.radii.avatarAlt,\"max\":\"28\",\"hard-min\":\"0\"},model:{value:(_vm.avatarAltRadiusLocal),callback:function ($$v) {_vm.avatarAltRadiusLocal=$$v},expression:\"avatarAltRadiusLocal\"}}),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"attachmentRadius\",\"label\":_vm.$t('settings.attachmentRadius'),\"fallback\":_vm.previewTheme.radii.attachment,\"max\":\"50\",\"hard-min\":\"0\"},model:{value:(_vm.attachmentRadiusLocal),callback:function ($$v) {_vm.attachmentRadiusLocal=$$v},expression:\"attachmentRadiusLocal\"}}),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"tooltipRadius\",\"label\":_vm.$t('settings.tooltipRadius'),\"fallback\":_vm.previewTheme.radii.tooltip,\"max\":\"50\",\"hard-min\":\"0\"},model:{value:(_vm.tooltipRadiusLocal),callback:function ($$v) {_vm.tooltipRadiusLocal=$$v},expression:\"tooltipRadiusLocal\"}}),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"chatMessageRadius\",\"label\":_vm.$t('settings.chatMessageRadius'),\"fallback\":_vm.previewTheme.radii.chatMessage || 2,\"max\":\"50\",\"hard-min\":\"0\"},model:{value:(_vm.chatMessageRadiusLocal),callback:function ($$v) {_vm.chatMessageRadiusLocal=$$v},expression:\"chatMessageRadiusLocal\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"shadow-container\",attrs:{\"label\":_vm.$t('settings.style.shadows._tab_label')}},[_c('div',{staticClass:\"tab-header shadow-selector\"},[_c('div',{staticClass:\"select-container\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.shadows.component'))+\"\\n \"),_c('label',{staticClass:\"select\",attrs:{\"for\":\"shadow-switcher\"}},[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.shadowSelected),expression:\"shadowSelected\"}],staticClass:\"shadow-switcher\",attrs:{\"id\":\"shadow-switcher\"},on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.shadowSelected=$event.target.multiple ? $$selectedVal : $$selectedVal[0]}}},_vm._l((_vm.shadowsAvailable),function(shadow){return _c('option',{key:shadow,domProps:{\"value\":shadow}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.shadows.components.' + shadow))+\"\\n \")])}),0),_vm._v(\" \"),_c('i',{staticClass:\"icon-down-open\"})])]),_vm._v(\" \"),_c('div',{staticClass:\"override\"},[_c('label',{staticClass:\"label\",attrs:{\"for\":\"override\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.shadows.override'))+\"\\n \")]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.currentShadowOverriden),expression:\"currentShadowOverriden\"}],staticClass:\"input-override\",attrs:{\"id\":\"override\",\"name\":\"override\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.currentShadowOverriden)?_vm._i(_vm.currentShadowOverriden,null)>-1:(_vm.currentShadowOverriden)},on:{\"change\":function($event){var $$a=_vm.currentShadowOverriden,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.currentShadowOverriden=$$a.concat([$$v]))}else{$$i>-1&&(_vm.currentShadowOverriden=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.currentShadowOverriden=$$c}}}}),_vm._v(\" \"),_c('label',{staticClass:\"checkbox-label\",attrs:{\"for\":\"override\"}})]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.clearShadows}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.clear_all'))+\"\\n \")])]),_vm._v(\" \"),_c('ShadowControl',{attrs:{\"ready\":!!_vm.currentShadowFallback,\"fallback\":_vm.currentShadowFallback},model:{value:(_vm.currentShadow),callback:function ($$v) {_vm.currentShadow=$$v},expression:\"currentShadow\"}}),_vm._v(\" \"),(_vm.shadowSelected === 'avatar' || _vm.shadowSelected === 'avatarStatus')?_c('div',[_c('i18n',{attrs:{\"path\":\"settings.style.shadows.filter_hint.always_drop_shadow\",\"tag\":\"p\"}},[_c('code',[_vm._v(\"filter: drop-shadow()\")])]),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('settings.style.shadows.filter_hint.avatar_inset')))]),_vm._v(\" \"),_c('i18n',{attrs:{\"path\":\"settings.style.shadows.filter_hint.drop_shadow_syntax\",\"tag\":\"p\"}},[_c('code',[_vm._v(\"drop-shadow\")]),_vm._v(\" \"),_c('code',[_vm._v(\"spread-radius\")]),_vm._v(\" \"),_c('code',[_vm._v(\"inset\")])]),_vm._v(\" \"),_c('i18n',{attrs:{\"path\":\"settings.style.shadows.filter_hint.inset_classic\",\"tag\":\"p\"}},[_c('code',[_vm._v(\"box-shadow\")])]),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('settings.style.shadows.filter_hint.spread_zero')))])],1):_vm._e()],1),_vm._v(\" \"),_c('div',{staticClass:\"fonts-container\",attrs:{\"label\":_vm.$t('settings.style.fonts._tab_label')}},[_c('div',{staticClass:\"tab-header\"},[_c('p',[_vm._v(_vm._s(_vm.$t('settings.style.fonts.help')))]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.clearFonts}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.clear_all'))+\"\\n \")])]),_vm._v(\" \"),_c('FontControl',{attrs:{\"name\":\"ui\",\"label\":_vm.$t('settings.style.fonts.components.interface'),\"fallback\":_vm.previewTheme.fonts.interface,\"no-inherit\":\"1\"},model:{value:(_vm.fontsLocal.interface),callback:function ($$v) {_vm.$set(_vm.fontsLocal, \"interface\", $$v)},expression:\"fontsLocal.interface\"}}),_vm._v(\" \"),_c('FontControl',{attrs:{\"name\":\"input\",\"label\":_vm.$t('settings.style.fonts.components.input'),\"fallback\":_vm.previewTheme.fonts.input},model:{value:(_vm.fontsLocal.input),callback:function ($$v) {_vm.$set(_vm.fontsLocal, \"input\", $$v)},expression:\"fontsLocal.input\"}}),_vm._v(\" \"),_c('FontControl',{attrs:{\"name\":\"post\",\"label\":_vm.$t('settings.style.fonts.components.post'),\"fallback\":_vm.previewTheme.fonts.post},model:{value:(_vm.fontsLocal.post),callback:function ($$v) {_vm.$set(_vm.fontsLocal, \"post\", $$v)},expression:\"fontsLocal.post\"}}),_vm._v(\" \"),_c('FontControl',{attrs:{\"name\":\"postCode\",\"label\":_vm.$t('settings.style.fonts.components.postCode'),\"fallback\":_vm.previewTheme.fonts.postCode},model:{value:(_vm.fontsLocal.postCode),callback:function ($$v) {_vm.$set(_vm.fontsLocal, \"postCode\", $$v)},expression:\"fontsLocal.postCode\"}})],1)])],1),_vm._v(\" \"),_c('div',{staticClass:\"apply-container\"},[_c('button',{staticClass:\"btn submit\",attrs:{\"disabled\":!_vm.themeValid},on:{\"click\":_vm.setCustomTheme}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('general.apply'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.clearAll}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.reset'))+\"\\n \")])])],1)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import TabSwitcher from 'src/components/tab_switcher/tab_switcher.js'\n\nimport DataImportExportTab from './tabs/data_import_export_tab.vue'\nimport MutesAndBlocksTab from './tabs/mutes_and_blocks_tab.vue'\nimport NotificationsTab from './tabs/notifications_tab.vue'\nimport FilteringTab from './tabs/filtering_tab.vue'\nimport SecurityTab from './tabs/security_tab/security_tab.vue'\nimport ProfileTab from './tabs/profile_tab.vue'\nimport GeneralTab from './tabs/general_tab.vue'\nimport VersionTab from './tabs/version_tab.vue'\nimport ThemeTab from './tabs/theme_tab/theme_tab.vue'\n\nconst SettingsModalContent = {\n components: {\n TabSwitcher,\n\n DataImportExportTab,\n MutesAndBlocksTab,\n NotificationsTab,\n FilteringTab,\n SecurityTab,\n ProfileTab,\n GeneralTab,\n VersionTab,\n ThemeTab\n },\n computed: {\n isLoggedIn () {\n return !!this.$store.state.users.currentUser\n },\n open () {\n return this.$store.state.interface.settingsModalState !== 'hidden'\n }\n },\n methods: {\n onOpen () {\n const targetTab = this.$store.state.interface.settingsModalTargetTab\n // We're being told to open in specific tab\n if (targetTab) {\n const tabIndex = this.$refs.tabSwitcher.$slots.default.findIndex(elm => {\n return elm.data && elm.data.attrs['data-tab-name'] === targetTab\n })\n if (tabIndex >= 0) {\n this.$refs.tabSwitcher.setTab(tabIndex)\n }\n }\n // Clear the state of target tab, so that next time settings is opened\n // it doesn't force it.\n this.$store.dispatch('clearSettingsModalTargetTab')\n }\n },\n mounted () {\n this.onOpen()\n },\n watch: {\n open: function (value) {\n if (value) this.onOpen()\n }\n }\n}\n\nexport default SettingsModalContent\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!./settings_modal_content.scss\")\n}\n/* script */\nexport * from \"!!babel-loader!./settings_modal_content.js\"\nimport __vue_script__ from \"!!babel-loader!./settings_modal_content.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-da72a86e\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./settings_modal_content.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('tab-switcher',{ref:\"tabSwitcher\",staticClass:\"settings_tab-switcher\",attrs:{\"side-tab-bar\":true,\"scrollable-tabs\":true}},[_c('div',{attrs:{\"label\":_vm.$t('settings.general'),\"icon\":\"wrench\",\"data-tab-name\":\"general\"}},[_c('GeneralTab')],1),_vm._v(\" \"),(_vm.isLoggedIn)?_c('div',{attrs:{\"label\":_vm.$t('settings.profile_tab'),\"icon\":\"user\",\"data-tab-name\":\"profile\"}},[_c('ProfileTab')],1):_vm._e(),_vm._v(\" \"),(_vm.isLoggedIn)?_c('div',{attrs:{\"label\":_vm.$t('settings.security_tab'),\"icon\":\"lock\",\"data-tab-name\":\"security\"}},[_c('SecurityTab')],1):_vm._e(),_vm._v(\" \"),_c('div',{attrs:{\"label\":_vm.$t('settings.filtering'),\"icon\":\"filter\",\"data-tab-name\":\"filtering\"}},[_c('FilteringTab')],1),_vm._v(\" \"),_c('div',{attrs:{\"label\":_vm.$t('settings.theme'),\"icon\":\"brush\",\"data-tab-name\":\"theme\"}},[_c('ThemeTab')],1),_vm._v(\" \"),(_vm.isLoggedIn)?_c('div',{attrs:{\"label\":_vm.$t('settings.notifications'),\"icon\":\"bell-ringing-o\",\"data-tab-name\":\"notifications\"}},[_c('NotificationsTab')],1):_vm._e(),_vm._v(\" \"),(_vm.isLoggedIn)?_c('div',{attrs:{\"label\":_vm.$t('settings.data_import_export_tab'),\"icon\":\"download\",\"data-tab-name\":\"dataImportExport\"}},[_c('DataImportExportTab')],1):_vm._e(),_vm._v(\" \"),(_vm.isLoggedIn)?_c('div',{attrs:{\"label\":_vm.$t('settings.mutes_and_blocks'),\"fullHeight\":true,\"icon\":\"eye-off\",\"data-tab-name\":\"mutesAndBlocks\"}},[_c('MutesAndBlocksTab')],1):_vm._e(),_vm._v(\" \"),_c('div',{attrs:{\"label\":_vm.$t('settings.version.title'),\"icon\":\"info-circled\",\"data-tab-name\":\"version\"}},[_c('VersionTab')],1)])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/static/js/2.c92f4803ff24726cea58.js b/priv/static/static/js/2.e852a6b4b3bba752b838.js similarity index 66% rename from priv/static/static/js/2.c92f4803ff24726cea58.js rename to priv/static/static/js/2.e852a6b4b3bba752b838.js index 55aa1f44e..42e446575 100644 --- a/priv/static/static/js/2.c92f4803ff24726cea58.js +++ b/priv/static/static/js/2.e852a6b4b3bba752b838.js @@ -1,2 +1,2 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{591:function(t,e,s){var a=s(592);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("a45e17ec",a,!0,{})},592:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".settings_tab-switcher{height:100%}.settings_tab-switcher .setting-item{border-bottom:2px solid var(--fg,#182230);margin:1em 1em 1.4em;padding-bottom:1.4em}.settings_tab-switcher .setting-item>div{margin-bottom:.5em}.settings_tab-switcher .setting-item>div:last-child{margin-bottom:0}.settings_tab-switcher .setting-item:last-child{border-bottom:none;padding-bottom:0;margin-bottom:1em}.settings_tab-switcher .setting-item select{min-width:10em}.settings_tab-switcher .setting-item textarea{width:100%;max-width:100%;height:100px}.settings_tab-switcher .setting-item .unavailable,.settings_tab-switcher .setting-item .unavailable i{color:var(--cRed,red);color:red}.settings_tab-switcher .setting-item .number-input{max-width:6em}",""])},593:function(t,e,s){var a=s(594);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("5bed876c",a,!0,{})},594:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".importer-uploading{font-size:1.5em;margin:.25em}",""])},595:function(t,e,s){var a=s(596);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("432fc7c6",a,!0,{})},596:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".exporter-processing{font-size:1.5em;margin:.25em}",""])},597:function(t,e,s){var a=s(598);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("33ca0d90",a,!0,{})},598:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".mutes-and-blocks-tab{height:100%}.mutes-and-blocks-tab .usersearch-wrapper{padding:1em}.mutes-and-blocks-tab .bulk-actions{text-align:right;padding:0 1em;min-height:28px}.mutes-and-blocks-tab .bulk-action-button{width:10em}.mutes-and-blocks-tab .domain-mute-form{padding:1em;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.mutes-and-blocks-tab .domain-mute-button{-ms-flex-item-align:end;align-self:flex-end;margin-top:1em;width:10em}",""])},599:function(t,e,s){var a=s(600);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("3a9ec1bf",a,!0,{})},600:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".autosuggest{position:relative}.autosuggest-input{display:block;width:100%}.autosuggest-results{position:absolute;left:0;top:100%;right:0;max-height:400px;background-color:#121a24;background-color:var(--bg,#121a24);border-color:#222;border:1px solid var(--border,#222);border-radius:4px;border-radius:var(--inputRadius,4px);border-top-left-radius:0;border-top-right-radius:0;box-shadow:1px 1px 4px rgba(0,0,0,.6);box-shadow:var(--panelShadow);overflow-y:auto;z-index:1}",""])},601:function(t,e,s){var a=s(602);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("211aa67c",a,!0,{})},602:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".block-card-content-container{margin-top:.5em;text-align:right}.block-card-content-container button{width:10em}",""])},603:function(t,e,s){var a=s(604);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("7ea980e0",a,!0,{})},604:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".mute-card-content-container{margin-top:.5em;text-align:right}.mute-card-content-container button{width:10em}",""])},605:function(t,e,s){var a=s(606);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("39a942c3",a,!0,{})},606:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".domain-mute-card{-ms-flex:1 0;flex:1 0;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-align:center;align-items:center;padding:.6em 1em .6em 0}.domain-mute-card-domain{margin-right:1em;overflow:hidden;text-overflow:ellipsis}.domain-mute-card button{width:10em}.autosuggest-results .domain-mute-card{padding-left:1em}",""])},607:function(t,e,s){var a=s(608);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("3724291e",a,!0,{})},608:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".selectable-list-item-inner{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.selectable-list-item-inner>*{min-width:0}.selectable-list-item-selected-inner{background-color:#151e2a;background-color:var(--selectedMenu,#151e2a);color:var(--selectedMenuText,#b9b9ba);--faint:var(--selectedMenuFaintText,$fallback--faint);--faintLink:var(--selectedMenuFaintLink,$fallback--faint);--lightText:var(--selectedMenuLightText,$fallback--lightText);--icon:var(--selectedMenuIcon,$fallback--icon)}.selectable-list-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.6em 0;border-bottom:2px solid;border-bottom-color:#222;border-bottom-color:var(--border,#222)}.selectable-list-header-actions{-ms-flex:1;flex:1}.selectable-list-checkbox-wrapper{padding:0 10px;-ms-flex:none;flex:none}",""])},609:function(t,e,s){},613:function(t,e,s){var a=s(614);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("a588473e",a,!0,{})},614:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".mfa-settings .method-item,.mfa-settings .mfa-heading{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-align:baseline;align-items:baseline}.mfa-settings .warning{color:orange;color:var(--cOrange,orange)}.mfa-settings .setup-otp{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.mfa-settings .setup-otp .qr-code{-ms-flex:1;flex:1;padding-right:10px}.mfa-settings .setup-otp .verify{-ms-flex:1;flex:1}.mfa-settings .setup-otp .error{margin:4px 0 0}.mfa-settings .setup-otp .confirm-otp-actions button{width:15em;margin-top:5px}",""])},615:function(t,e,s){var a=s(616);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("4065bf15",a,!0,{})},616:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".mfa-backup-codes .warning{color:orange;color:var(--cOrange,orange)}.mfa-backup-codes .backup-codes{font-family:var(--postCodeFont,monospace)}",""])},618:function(t,e,s){var a=s(619);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("27925ae8",a,!0,{})},619:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".profile-tab .bio{margin:0}.profile-tab .visibility-tray{padding-top:5px}.profile-tab input[type=file]{padding:5px;height:auto}.profile-tab .banner-background-preview{max-width:100%;width:300px;position:relative}.profile-tab .banner-background-preview img{width:100%}.profile-tab .uploading{font-size:1.5em;margin:.25em}.profile-tab .name-changer{width:100%}.profile-tab .current-avatar-container{position:relative;width:150px;height:150px}.profile-tab .current-avatar{display:block;width:100%;height:100%;border-radius:4px;border-radius:var(--avatarRadius,4px)}.profile-tab .reset-button{position:absolute;top:.2em;right:.2em;border-radius:5px;border-radius:var(--tooltipRadius,5px);background-color:rgba(0,0,0,.6);opacity:.7;color:#fff;width:1.5em;height:1.5em;text-align:center;line-height:1.5em;font-size:1.5em;cursor:pointer}.profile-tab .reset-button:hover{opacity:1}.profile-tab .oauth-tokens{width:100%}.profile-tab .oauth-tokens th{text-align:left}.profile-tab .oauth-tokens .actions{text-align:right}.profile-tab-usersearch-wrapper{padding:1em}.profile-tab-bulk-actions{text-align:right;padding:0 1em;min-height:28px}.profile-tab-bulk-actions button{width:10em}.profile-tab-domain-mute-form{padding:1em;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.profile-tab-domain-mute-form button{-ms-flex-item-align:end;align-self:flex-end;margin-top:1em;width:10em}.profile-tab .setting-subitem{margin-left:1.75em}.profile-tab .profile-fields{display:-ms-flexbox;display:flex}.profile-tab .profile-fields>.emoji-input{-ms-flex:1 1 auto;flex:1 1 auto;margin:0 .2em .5em;min-width:0}.profile-tab .profile-fields>.icon-container{width:20px}.profile-tab .profile-fields>.icon-container>.icon-cancel{vertical-align:sub}",""])},620:function(t,e,s){var a=s(621);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("0dfd0b33",a,!0,{})},621:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".image-cropper-img-input{display:none}.image-cropper-image-container{position:relative}.image-cropper-image-container img{display:block;max-width:100%}.image-cropper-buttons-wrapper{margin-top:10px}.image-cropper-buttons-wrapper button{margin-top:5px}",""])},624:function(t,e,s){var a=s(625);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("4fafab12",a,!0,{})},625:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".theme-tab{padding-bottom:2em}.theme-tab .theme-warning{display:-ms-flexbox;display:flex;-ms-flex-align:baseline;align-items:baseline;margin-bottom:.5em}.theme-tab .theme-warning .buttons .btn{margin-bottom:.5em}.theme-tab .preset-switcher{margin-right:1em}.theme-tab .style-control{display:-ms-flexbox;display:flex;-ms-flex-align:baseline;align-items:baseline;margin-bottom:5px}.theme-tab .style-control .label{-ms-flex:1;flex:1}.theme-tab .style-control.disabled input,.theme-tab .style-control.disabled select{opacity:.5}.theme-tab .style-control .opt{margin:.5em}.theme-tab .style-control .color-input{-ms-flex:0 0 0px;flex:0 0 0}.theme-tab .style-control input,.theme-tab .style-control select{min-width:3em;margin:0;-ms-flex:0;flex:0}.theme-tab .style-control input[type=number],.theme-tab .style-control select[type=number]{min-width:5em}.theme-tab .style-control input[type=range],.theme-tab .style-control select[type=range]{-ms-flex:1;flex:1;min-width:3em;-ms-flex-item-align:start;align-self:flex-start}.theme-tab .reset-container{-ms-flex-wrap:wrap;flex-wrap:wrap}.theme-tab .apply-container,.theme-tab .color-container,.theme-tab .fonts-container,.theme-tab .radius-container,.theme-tab .reset-container{display:-ms-flexbox;display:flex}.theme-tab .fonts-container,.theme-tab .radius-container{-ms-flex-direction:column;flex-direction:column}.theme-tab .color-container{-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between}.theme-tab .color-container>h4{width:99%}.theme-tab .color-container,.theme-tab .fonts-container,.theme-tab .presets-container,.theme-tab .radius-container,.theme-tab .shadow-container{margin:1em 1em 0}.theme-tab .tab-header{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-align:baseline;align-items:baseline;width:100%;min-height:30px;margin-bottom:1em}.theme-tab .tab-header p{-ms-flex:1;flex:1;margin:0;margin-right:.5em}.theme-tab .tab-header-buttons{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.theme-tab .tab-header-buttons .btn{min-width:1px;-ms-flex:0 auto;flex:0 auto;padding:0 1em;margin-bottom:.5em}.theme-tab .shadow-selector .override{-ms-flex:1;flex:1;margin-left:.5em}.theme-tab .shadow-selector .select-container{margin-top:-4px;margin-bottom:-3px}.theme-tab .save-load,.theme-tab .save-load-options{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:baseline;align-items:baseline;-ms-flex-wrap:wrap;flex-wrap:wrap}.theme-tab .save-load-options .import-export,.theme-tab .save-load-options .presets,.theme-tab .save-load .import-export,.theme-tab .save-load .presets{margin-bottom:.5em}.theme-tab .save-load-options .import-export,.theme-tab .save-load .import-export{display:-ms-flexbox;display:flex}.theme-tab .save-load-options .override,.theme-tab .save-load .override{margin-left:.5em}.theme-tab .save-load-options{-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:.5em;-ms-flex-pack:center;justify-content:center}.theme-tab .save-load-options .keep-option{margin:0 .5em .5em;min-width:25%}.theme-tab .preview-container{border-top:1px dashed;border-bottom:1px dashed;border-color:#222;border-color:var(--border,#222);margin:1em 0;padding:1em;background:var(--body-background-image);background-size:cover;background-position:50% 50%}.theme-tab .preview-container .dummy .post{font-family:var(--postFont);display:-ms-flexbox;display:flex}.theme-tab .preview-container .dummy .post .content{-ms-flex:1;flex:1}.theme-tab .preview-container .dummy .post .content h4{margin-bottom:.25em}.theme-tab .preview-container .dummy .post .content .icons{margin-top:.5em;display:-ms-flexbox;display:flex}.theme-tab .preview-container .dummy .post .content .icons i{margin-right:1em}.theme-tab .preview-container .dummy .after-post{margin-top:1em;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.theme-tab .preview-container .dummy .avatar,.theme-tab .preview-container .dummy .avatar-alt{background:linear-gradient(135deg,#b8e1fc,#a9d2f3 10%,#90bae4 25%,#90bcea 37%,#90bff0 50%,#6ba8e5 51%,#a2daf5 83%,#bdf3fd);color:#000;font-family:sans-serif;text-align:center;margin-right:1em}.theme-tab .preview-container .dummy .avatar-alt{-ms-flex:0 auto;flex:0 auto;margin-left:28px;font-size:12px;min-width:20px;min-height:20px;line-height:20px;border-radius:10px;border-radius:var(--avatarAltRadius,10px)}.theme-tab .preview-container .dummy .avatar{-ms-flex:0 auto;flex:0 auto;width:48px;height:48px;font-size:14px;line-height:48px}.theme-tab .preview-container .dummy .actions{display:-ms-flexbox;display:flex;-ms-flex-align:baseline;align-items:baseline}.theme-tab .preview-container .dummy .actions .checkbox{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:baseline;align-items:baseline;margin-right:1em;-ms-flex:1;flex:1}.theme-tab .preview-container .dummy .separator{margin:1em;border-bottom:1px solid;border-color:#222;border-color:var(--border,#222)}.theme-tab .preview-container .dummy .panel-heading .alert,.theme-tab .preview-container .dummy .panel-heading .badge,.theme-tab .preview-container .dummy .panel-heading .btn,.theme-tab .preview-container .dummy .panel-heading .faint{margin-left:1em;white-space:nowrap}.theme-tab .preview-container .dummy .panel-heading .faint{text-overflow:ellipsis;min-width:2em;overflow-x:hidden}.theme-tab .preview-container .dummy .panel-heading .flex-spacer{-ms-flex:1;flex:1}.theme-tab .preview-container .dummy .btn{margin-left:0;padding:0 1em;min-width:3em;min-height:30px}.theme-tab .apply-container{-ms-flex-pack:center;justify-content:center}.theme-tab .color-item,.theme-tab .radius-item{min-width:20em;margin:5px 6px 0 0;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex:1 1 0px;flex:1 1 0}.theme-tab .color-item.wide,.theme-tab .radius-item.wide{min-width:60%}.theme-tab .color-item:not(.wide):nth-child(odd),.theme-tab .radius-item:not(.wide):nth-child(odd){margin-right:7px}.theme-tab .color-item .color,.theme-tab .color-item .opacity,.theme-tab .radius-item .color,.theme-tab .radius-item .opacity{display:-ms-flexbox;display:flex;-ms-flex-align:baseline;align-items:baseline}.theme-tab .radius-item{-ms-flex-preferred-size:auto;flex-basis:auto}.theme-tab .theme-color-cl,.theme-tab .theme-radius-rn{border:0;box-shadow:none;background:transparent;color:var(--faint,hsla(240,1%,73%,.5));-ms-flex-item-align:stretch;-ms-grid-row-align:stretch;align-self:stretch}.theme-tab .theme-color-cl,.theme-tab .theme-color-in,.theme-tab .theme-radius-in{margin-left:4px}.theme-tab .theme-radius-in{min-width:1em;max-width:7em;-ms-flex:1;flex:1}.theme-tab .theme-radius-lb{max-width:50em}.theme-tab .theme-preview-content{padding:20px}.theme-tab .apply-container .btn{min-height:28px;min-width:10em;padding:0 2em}.theme-tab .btn{margin-left:.25em;margin-right:.25em}",""])},626:function(t,e,s){var a=s(627);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("7e57f952",a,!0,{})},627:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,'.color-input,.color-input-field.input{display:-ms-inline-flexbox;display:inline-flex}.color-input-field.input{-ms-flex:0 0 0px;flex:0 0 0;max-width:9em;-ms-flex-align:stretch;align-items:stretch;padding:.2em 8px}.color-input-field.input input{background:none;color:#b9b9ba;color:var(--inputText,#b9b9ba);border:none;padding:0;margin:0}.color-input-field.input input.textColor{-ms-flex:1 0 3em;flex:1 0 3em;min-width:3em;padding:0}.color-input-field.input .computedIndicator,.color-input-field.input .transparentIndicator,.color-input-field.input input.nativeColor{-ms-flex:0 0 2em;flex:0 0 2em;min-width:2em;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;height:100%}.color-input-field.input .transparentIndicator{background-color:#f0f;position:relative}.color-input-field.input .transparentIndicator:after,.color-input-field.input .transparentIndicator:before{display:block;content:"";background-color:#000;position:absolute;height:50%;width:50%}.color-input-field.input .transparentIndicator:after{top:0;left:0}.color-input-field.input .transparentIndicator:before{bottom:0;right:0}.color-input .label{-ms-flex:1 1 auto;flex:1 1 auto}',""])},628:function(t,e,s){var a=s(629);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("6c632637",a,!0,{})},629:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".color-control input.text-input{max-width:7em;-ms-flex:1;flex:1}",""])},630:function(t,e,s){var a=s(631);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("d219da80",a,!0,{})},631:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".shadow-control{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:center;justify-content:center;margin-bottom:1em}.shadow-control .shadow-preview-container,.shadow-control .shadow-tweak{margin:5px 6px 0 0}.shadow-control .shadow-preview-container{-ms-flex:0;flex:0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.shadow-control .shadow-preview-container input[type=number]{width:5em;min-width:2em}.shadow-control .shadow-preview-container .x-shift-control,.shadow-control .shadow-preview-container .y-shift-control{display:-ms-flexbox;display:flex;-ms-flex:0;flex:0}.shadow-control .shadow-preview-container .x-shift-control[disabled=disabled] *,.shadow-control .shadow-preview-container .y-shift-control[disabled=disabled] *{opacity:.5}.shadow-control .shadow-preview-container .x-shift-control{-ms-flex-align:start;align-items:flex-start}.shadow-control .shadow-preview-container .x-shift-control .wrap,.shadow-control .shadow-preview-container input[type=range]{margin:0;width:15em;height:2em}.shadow-control .shadow-preview-container .y-shift-control{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:end;align-items:flex-end}.shadow-control .shadow-preview-container .y-shift-control .wrap{width:2em;height:15em}.shadow-control .shadow-preview-container .y-shift-control input[type=range]{transform-origin:1em 1em;transform:rotate(90deg)}.shadow-control .shadow-preview-container .preview-window{-ms-flex:1;flex:1;background-color:#999;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;background-image:linear-gradient(45deg,#666 25%,transparent 0),linear-gradient(-45deg,#666 25%,transparent 0),linear-gradient(45deg,transparent 75%,#666 0),linear-gradient(-45deg,transparent 75%,#666 0);background-size:20px 20px;background-position:0 0,0 10px,10px -10px,-10px 0;border-radius:4px;border-radius:var(--inputRadius,4px)}.shadow-control .shadow-preview-container .preview-window .preview-block{width:33%;height:33%;background-color:#121a24;background-color:var(--bg,#121a24);border-radius:10px;border-radius:var(--panelRadius,10px)}.shadow-control .shadow-tweak{-ms-flex:1;flex:1;min-width:280px}.shadow-control .shadow-tweak .id-control{-ms-flex-align:stretch;align-items:stretch}.shadow-control .shadow-tweak .id-control .btn,.shadow-control .shadow-tweak .id-control .select{min-width:1px;margin-right:5px}.shadow-control .shadow-tweak .id-control .btn{padding:0 .4em;margin:0 .1em}.shadow-control .shadow-tweak .id-control .select{-ms-flex:1;flex:1}.shadow-control .shadow-tweak .id-control .select select{-ms-flex-item-align:initial;-ms-grid-row-align:initial;align-self:auto}",""])},632:function(t,e,s){var a=s(633);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("d9c0acde",a,!0,{})},633:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".font-control input.custom-font{min-width:10em}.font-control.custom .select{border-top-right-radius:0;border-bottom-right-radius:0}.font-control.custom .custom-font{border-top-left-radius:0;border-bottom-left-radius:0}",""])},634:function(t,e,s){var a=s(635);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("b94bc120",a,!0,{})},635:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".contrast-ratio{display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end;margin-top:-4px;margin-bottom:5px}.contrast-ratio .label{margin-right:1em}.contrast-ratio .rating{display:inline-block;text-align:center}",""])},636:function(t,e,s){var a=s(637);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("66a4eaba",a,!0,{})},637:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".import-export-container{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:baseline;align-items:baseline;-ms-flex-pack:center;justify-content:center}",""])},638:function(t,e,s){var a=s(639);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("6fe23c76",a,!0,{})},639:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".preview-container{position:relative}.underlay-preview{position:absolute;top:0;bottom:0;left:10px;right:10px}",""])},641:function(t,e,s){"use strict";s.r(e);var a=s(141),n={props:{submitHandler:{type:Function,required:!0},submitButtonLabel:{type:String,default:function(){return this.$t("importer.submit")}},successMessage:{type:String,default:function(){return this.$t("importer.success")}},errorMessage:{type:String,default:function(){return this.$t("importer.error")}}},data:function(){return{file:null,error:!1,success:!1,submitting:!1}},methods:{change:function(){this.file=this.$refs.input.files[0]},submit:function(){var t=this;this.dismiss(),this.submitting=!0,this.submitHandler(this.file).then(function(){t.success=!0}).catch(function(){t.error=!0}).finally(function(){t.submitting=!1})},dismiss:function(){this.success=!1,this.error=!1}}},o=s(0);var i=function(t){s(593)},r=Object(o.a)(n,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"importer"},[s("form",[s("input",{ref:"input",attrs:{type:"file"},on:{change:t.change}})]),t._v(" "),t.submitting?s("i",{staticClass:"icon-spin4 animate-spin importer-uploading"}):s("button",{staticClass:"btn btn-default",on:{click:t.submit}},[t._v("\n "+t._s(t.submitButtonLabel)+"\n ")]),t._v(" "),t.success?s("div",[s("i",{staticClass:"icon-cross",on:{click:t.dismiss}}),t._v(" "),s("p",[t._v(t._s(t.successMessage))])]):t.error?s("div",[s("i",{staticClass:"icon-cross",on:{click:t.dismiss}}),t._v(" "),s("p",[t._v(t._s(t.errorMessage))])]):t._e()])},[],!1,i,null,null).exports,l={props:{getContent:{type:Function,required:!0},filename:{type:String,default:"export.csv"},exportButtonLabel:{type:String,default:function(){return this.$t("exporter.export")}},processingMessage:{type:String,default:function(){return this.$t("exporter.processing")}}},data:function(){return{processing:!1}},methods:{process:function(){var t=this;this.processing=!0,this.getContent().then(function(e){var s=document.createElement("a");s.setAttribute("href","data:text/plain;charset=utf-8,"+encodeURIComponent(e)),s.setAttribute("download",t.filename),s.style.display="none",document.body.appendChild(s),s.click(),document.body.removeChild(s),setTimeout(function(){t.processing=!1},2e3)})}}};var c=function(t){s(595)},u=Object(o.a)(l,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"exporter"},[t.processing?s("div",[s("i",{staticClass:"icon-spin4 animate-spin exporter-processing"}),t._v(" "),s("span",[t._v(t._s(t.processingMessage))])]):s("button",{staticClass:"btn btn-default",on:{click:t.process}},[t._v("\n "+t._s(t.exportButtonLabel)+"\n ")])])},[],!1,c,null,null).exports,d=s(54),p={data:function(){return{activeTab:"profile",newDomainToMute:""}},created:function(){this.$store.dispatch("fetchTokens")},components:{Importer:r,Exporter:u,Checkbox:d.a},computed:{user:function(){return this.$store.state.users.currentUser}},methods:{getFollowsContent:function(){return this.$store.state.api.backendInteractor.exportFriends({id:this.$store.state.users.currentUser.id}).then(this.generateExportableUsersContent)},getBlocksContent:function(){return this.$store.state.api.backendInteractor.fetchBlocks().then(this.generateExportableUsersContent)},importFollows:function(t){return this.$store.state.api.backendInteractor.importFollows({file:t}).then(function(t){if(!t)throw new Error("failed")})},importBlocks:function(t){return this.$store.state.api.backendInteractor.importBlocks({file:t}).then(function(t){if(!t)throw new Error("failed")})},generateExportableUsersContent:function(t){return t.map(function(t){return t&&t.is_local?t.screen_name+"@"+location.hostname:t.screen_name}).join("\n")}}},m=Object(o.a)(p,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{attrs:{label:t.$t("settings.data_import_export_tab")}},[s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.follow_import")))]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.import_followers_from_a_csv_file")))]),t._v(" "),s("Importer",{attrs:{"submit-handler":t.importFollows,"success-message":t.$t("settings.follows_imported"),"error-message":t.$t("settings.follow_import_error")}})],1),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.follow_export")))]),t._v(" "),s("Exporter",{attrs:{"get-content":t.getFollowsContent,filename:"friends.csv","export-button-label":t.$t("settings.follow_export_button")}})],1),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.block_import")))]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.import_blocks_from_a_csv_file")))]),t._v(" "),s("Importer",{attrs:{"submit-handler":t.importBlocks,"success-message":t.$t("settings.blocks_imported"),"error-message":t.$t("settings.block_import_error")}})],1),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.block_export")))]),t._v(" "),s("Exporter",{attrs:{"get-content":t.getBlocksContent,filename:"blocks.csv","export-button-label":t.$t("settings.block_export_button")}})],1)])},[],!1,null,null,null).exports,v=s(12),h=s.n(v),b=s(15),f=s.n(b),g=s(189),_=s.n(g),w={props:{query:{type:Function,required:!0},filter:{type:Function},placeholder:{type:String,default:"Search..."}},data:function(){return{term:"",timeout:null,results:[],resultsVisible:!1}},computed:{filtered:function(){return this.filter?this.filter(this.results):this.results}},watch:{term:function(t){this.fetchResults(t)}},methods:{fetchResults:function(t){var e=this;clearTimeout(this.timeout),this.timeout=setTimeout(function(){e.results=[],t&&e.query(t).then(function(t){e.results=t})},500)},onInputClick:function(){this.resultsVisible=!0},onClickOutside:function(){this.resultsVisible=!1}}};var C=function(t){s(599)},x=Object(o.a)(w,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{directives:[{name:"click-outside",rawName:"v-click-outside",value:t.onClickOutside,expression:"onClickOutside"}],staticClass:"autosuggest"},[s("input",{directives:[{name:"model",rawName:"v-model",value:t.term,expression:"term"}],staticClass:"autosuggest-input",attrs:{placeholder:t.placeholder},domProps:{value:t.term},on:{click:t.onInputClick,input:function(e){e.target.composing||(t.term=e.target.value)}}}),t._v(" "),t.resultsVisible&&t.filtered.length>0?s("div",{staticClass:"autosuggest-results"},[t._l(t.filtered,function(e){return t._t("default",null,{item:e})})],2):t._e()])},[],!1,C,null,null).exports,k=s(38),y={props:["userId"],data:function(){return{progress:!1}},computed:{user:function(){return this.$store.getters.findUser(this.userId)},relationship:function(){return this.$store.getters.relationship(this.userId)},blocked:function(){return this.relationship.blocking}},components:{BasicUserCard:k.a},methods:{unblockUser:function(){var t=this;this.progress=!0,this.$store.dispatch("unblockUser",this.user.id).then(function(){t.progress=!1})},blockUser:function(){var t=this;this.progress=!0,this.$store.dispatch("blockUser",this.user.id).then(function(){t.progress=!1})}}};var $=function(t){s(601)},L=Object(o.a)(y,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("basic-user-card",{attrs:{user:t.user}},[s("div",{staticClass:"block-card-content-container"},[t.blocked?s("button",{staticClass:"btn btn-default",attrs:{disabled:t.progress},on:{click:t.unblockUser}},[t.progress?[t._v("\n "+t._s(t.$t("user_card.unblock_progress"))+"\n ")]:[t._v("\n "+t._s(t.$t("user_card.unblock"))+"\n ")]],2):s("button",{staticClass:"btn btn-default",attrs:{disabled:t.progress},on:{click:t.blockUser}},[t.progress?[t._v("\n "+t._s(t.$t("user_card.block_progress"))+"\n ")]:[t._v("\n "+t._s(t.$t("user_card.block"))+"\n ")]],2)])])},[],!1,$,null,null).exports,T={props:["userId"],data:function(){return{progress:!1}},computed:{user:function(){return this.$store.getters.findUser(this.userId)},relationship:function(){return this.$store.getters.relationship(this.userId)},muted:function(){return this.relationship.muting}},components:{BasicUserCard:k.a},methods:{unmuteUser:function(){var t=this;this.progress=!0,this.$store.dispatch("unmuteUser",this.userId).then(function(){t.progress=!1})},muteUser:function(){var t=this;this.progress=!0,this.$store.dispatch("muteUser",this.userId).then(function(){t.progress=!1})}}};var O=function(t){s(603)},P=Object(o.a)(T,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("basic-user-card",{attrs:{user:t.user}},[s("div",{staticClass:"mute-card-content-container"},[t.muted?s("button",{staticClass:"btn btn-default",attrs:{disabled:t.progress},on:{click:t.unmuteUser}},[t.progress?[t._v("\n "+t._s(t.$t("user_card.unmute_progress"))+"\n ")]:[t._v("\n "+t._s(t.$t("user_card.unmute"))+"\n ")]],2):s("button",{staticClass:"btn btn-default",attrs:{disabled:t.progress},on:{click:t.muteUser}},[t.progress?[t._v("\n "+t._s(t.$t("user_card.mute_progress"))+"\n ")]:[t._v("\n "+t._s(t.$t("user_card.mute"))+"\n ")]],2)])])},[],!1,O,null,null).exports,S=s(78),I={props:["domain"],components:{ProgressButton:S.a},computed:{user:function(){return this.$store.state.users.currentUser},muted:function(){return this.user.domainMutes.includes(this.domain)}},methods:{unmuteDomain:function(){return this.$store.dispatch("unmuteDomain",this.domain)},muteDomain:function(){return this.$store.dispatch("muteDomain",this.domain)}}};var j=function(t){s(605)},E=Object(o.a)(I,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"domain-mute-card"},[s("div",{staticClass:"domain-mute-card-domain"},[t._v("\n "+t._s(t.domain)+"\n ")]),t._v(" "),t.muted?s("ProgressButton",{staticClass:"btn btn-default",attrs:{click:t.unmuteDomain}},[t._v("\n "+t._s(t.$t("domain_mute_card.unmute"))+"\n "),s("template",{slot:"progress"},[t._v("\n "+t._s(t.$t("domain_mute_card.unmute_progress"))+"\n ")])],2):s("ProgressButton",{staticClass:"btn btn-default",attrs:{click:t.muteDomain}},[t._v("\n "+t._s(t.$t("domain_mute_card.mute"))+"\n "),s("template",{slot:"progress"},[t._v("\n "+t._s(t.$t("domain_mute_card.mute_progress"))+"\n ")])],2)],1)},[],!1,j,null,null).exports,R={components:{List:s(52).a,Checkbox:d.a},props:{items:{type:Array,default:function(){return[]}},getKey:{type:Function,default:function(t){return t.id}}},data:function(){return{selected:[]}},computed:{allKeys:function(){return this.items.map(this.getKey)},filteredSelected:function(){var t=this;return this.allKeys.filter(function(e){return-1!==t.selected.indexOf(e)})},allSelected:function(){return this.filteredSelected.length===this.items.length},noneSelected:function(){return 0===this.filteredSelected.length},someSelected:function(){return!this.allSelected&&!this.noneSelected}},methods:{isSelected:function(t){return-1!==this.filteredSelected.indexOf(this.getKey(t))},toggle:function(t,e){var s=this.getKey(e);t!==this.isSelected(s)&&(t?this.selected.push(s):this.selected.splice(this.selected.indexOf(s),1))},toggleAll:function(t){this.selected=t?this.allKeys.slice(0):[]}}};var B=function(t){s(607)},F=Object(o.a)(R,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"selectable-list"},[t.items.length>0?s("div",{staticClass:"selectable-list-header"},[s("div",{staticClass:"selectable-list-checkbox-wrapper"},[s("Checkbox",{attrs:{checked:t.allSelected,indeterminate:t.someSelected},on:{change:t.toggleAll}},[t._v("\n "+t._s(t.$t("selectable_list.select_all"))+"\n ")])],1),t._v(" "),s("div",{staticClass:"selectable-list-header-actions"},[t._t("header",null,{selected:t.filteredSelected})],2)]):t._e(),t._v(" "),s("List",{attrs:{items:t.items,"get-key":t.getKey},scopedSlots:t._u([{key:"item",fn:function(e){var a=e.item;return[s("div",{staticClass:"selectable-list-item-inner",class:{"selectable-list-item-selected-inner":t.isSelected(a)}},[s("div",{staticClass:"selectable-list-checkbox-wrapper"},[s("Checkbox",{attrs:{checked:t.isSelected(a)},on:{change:function(e){return t.toggle(e,a)}}})],1),t._v(" "),t._t("item",null,{item:a})],2)]}}],null,!0)},[t._v(" "),s("template",{slot:"empty"},[t._t("empty")],2)],2)],1)},[],!1,B,null,null).exports,M=s(190),U=s.n(M),V=s(7),A=s.n(V),D=s(1),N=s.n(D),W=s(10),z=s.n(W),q=s(6),G=s.n(q),H=s(191),K=s.n(H),J=s(192);s(609);function Q(t,e){var s=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),s.push.apply(s,a)}return s}function X(t){for(var e=1;e0?s("ProgressButton",{staticClass:"btn btn-default bulk-action-button",attrs:{click:function(){return t.blockUsers(a)}}},[t._v("\n "+t._s(t.$t("user_card.block"))+"\n "),s("template",{slot:"progress"},[t._v("\n "+t._s(t.$t("user_card.block_progress"))+"\n ")])],2):t._e(),t._v(" "),a.length>0?s("ProgressButton",{staticClass:"btn btn-default",attrs:{click:function(){return t.unblockUsers(a)}}},[t._v("\n "+t._s(t.$t("user_card.unblock"))+"\n "),s("template",{slot:"progress"},[t._v("\n "+t._s(t.$t("user_card.unblock_progress"))+"\n ")])],2):t._e()],1)]}},{key:"item",fn:function(t){var e=t.item;return[s("BlockCard",{attrs:{"user-id":e}})]}}])},[t._v(" "),t._v(" "),s("template",{slot:"empty"},[t._v("\n "+t._s(t.$t("settings.no_blocks"))+"\n ")])],2)],1),t._v(" "),s("div",{attrs:{label:t.$t("settings.mutes_tab")}},[s("tab-switcher",[s("div",{attrs:{label:"Users"}},[s("div",{staticClass:"usersearch-wrapper"},[s("Autosuggest",{attrs:{filter:t.filterUnMutedUsers,query:t.queryUserIds,placeholder:t.$t("settings.search_user_to_mute")},scopedSlots:t._u([{key:"default",fn:function(t){return s("MuteCard",{attrs:{"user-id":t.item}})}}])})],1),t._v(" "),s("MuteList",{attrs:{refresh:!0,"get-key":function(t){return t}},scopedSlots:t._u([{key:"header",fn:function(e){var a=e.selected;return[s("div",{staticClass:"bulk-actions"},[a.length>0?s("ProgressButton",{staticClass:"btn btn-default",attrs:{click:function(){return t.muteUsers(a)}}},[t._v("\n "+t._s(t.$t("user_card.mute"))+"\n "),s("template",{slot:"progress"},[t._v("\n "+t._s(t.$t("user_card.mute_progress"))+"\n ")])],2):t._e(),t._v(" "),a.length>0?s("ProgressButton",{staticClass:"btn btn-default",attrs:{click:function(){return t.unmuteUsers(a)}}},[t._v("\n "+t._s(t.$t("user_card.unmute"))+"\n "),s("template",{slot:"progress"},[t._v("\n "+t._s(t.$t("user_card.unmute_progress"))+"\n ")])],2):t._e()],1)]}},{key:"item",fn:function(t){var e=t.item;return[s("MuteCard",{attrs:{"user-id":e}})]}}])},[t._v(" "),t._v(" "),s("template",{slot:"empty"},[t._v("\n "+t._s(t.$t("settings.no_mutes"))+"\n ")])],2)],1),t._v(" "),s("div",{attrs:{label:t.$t("settings.domain_mutes")}},[s("div",{staticClass:"domain-mute-form"},[s("Autosuggest",{attrs:{filter:t.filterUnMutedDomains,query:t.queryKnownDomains,placeholder:t.$t("settings.type_domains_to_mute")},scopedSlots:t._u([{key:"default",fn:function(t){return s("DomainMuteCard",{attrs:{domain:t.item}})}}])})],1),t._v(" "),s("DomainMuteList",{attrs:{refresh:!0,"get-key":function(t){return t}},scopedSlots:t._u([{key:"header",fn:function(e){var a=e.selected;return[s("div",{staticClass:"bulk-actions"},[a.length>0?s("ProgressButton",{staticClass:"btn btn-default",attrs:{click:function(){return t.unmuteDomains(a)}}},[t._v("\n "+t._s(t.$t("domain_mute_card.unmute"))+"\n "),s("template",{slot:"progress"},[t._v("\n "+t._s(t.$t("domain_mute_card.unmute_progress"))+"\n ")])],2):t._e()],1)]}},{key:"item",fn:function(t){var e=t.item;return[s("DomainMuteCard",{attrs:{domain:e}})]}}])},[t._v(" "),t._v(" "),s("template",{slot:"empty"},[t._v("\n "+t._s(t.$t("settings.no_mutes"))+"\n ")])],2)],1)])],1)])},[],!1,at,null,null).exports,ot={data:function(){return{activeTab:"profile",notificationSettings:this.$store.state.users.currentUser.notification_settings,newDomainToMute:""}},components:{Checkbox:d.a},computed:{user:function(){return this.$store.state.users.currentUser}},methods:{updateNotificationSettings:function(){this.$store.state.api.backendInteractor.updateNotificationSettings({settings:this.notificationSettings})}}},it=Object(o.a)(ot,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{attrs:{label:t.$t("settings.notifications")}},[s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.notification_setting_filters")))]),t._v(" "),s("p",[s("Checkbox",{model:{value:t.notificationSettings.block_from_strangers,callback:function(e){t.$set(t.notificationSettings,"block_from_strangers",e)},expression:"notificationSettings.block_from_strangers"}},[t._v("\n "+t._s(t.$t("settings.notification_setting_block_from_strangers"))+"\n ")])],1)]),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.notification_setting_privacy")))]),t._v(" "),s("p",[s("Checkbox",{model:{value:t.notificationSettings.hide_notification_contents,callback:function(e){t.$set(t.notificationSettings,"hide_notification_contents",e)},expression:"notificationSettings.hide_notification_contents"}},[t._v("\n "+t._s(t.$t("settings.notification_setting_hide_notification_contents"))+"\n ")])],1)]),t._v(" "),s("div",{staticClass:"setting-item"},[s("p",[t._v(t._s(t.$t("settings.notification_mutes")))]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.notification_blocks")))]),t._v(" "),s("button",{staticClass:"btn btn-default",on:{click:t.updateNotificationSettings}},[t._v("\n "+t._s(t.$t("general.submit"))+"\n ")])])])},[],!1,null,null,null).exports,rt=s(610),lt=s.n(rt),ct=s(37),ut=s.n(ct),dt=s(95);function pt(t,e){var s=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),s.push.apply(s,a)}return s}function mt(t){for(var e=1;e0})})}}}),watch:{notificationVisibility:{handler:function(t){this.$store.dispatch("setOption",{name:"notificationVisibility",value:this.$store.getters.mergedConfig.notificationVisibility})},deep:!0},replyVisibility:function(){this.$store.dispatch("queueFlushAll")}}},ft=Object(o.a)(bt,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{attrs:{label:t.$t("settings.filtering")}},[s("div",{staticClass:"setting-item"},[s("div",{staticClass:"select-multiple"},[s("span",{staticClass:"label"},[t._v(t._s(t.$t("settings.notification_visibility")))]),t._v(" "),s("ul",{staticClass:"option-list"},[s("li",[s("Checkbox",{model:{value:t.notificationVisibility.likes,callback:function(e){t.$set(t.notificationVisibility,"likes",e)},expression:"notificationVisibility.likes"}},[t._v("\n "+t._s(t.$t("settings.notification_visibility_likes"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.notificationVisibility.repeats,callback:function(e){t.$set(t.notificationVisibility,"repeats",e)},expression:"notificationVisibility.repeats"}},[t._v("\n "+t._s(t.$t("settings.notification_visibility_repeats"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.notificationVisibility.follows,callback:function(e){t.$set(t.notificationVisibility,"follows",e)},expression:"notificationVisibility.follows"}},[t._v("\n "+t._s(t.$t("settings.notification_visibility_follows"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.notificationVisibility.mentions,callback:function(e){t.$set(t.notificationVisibility,"mentions",e)},expression:"notificationVisibility.mentions"}},[t._v("\n "+t._s(t.$t("settings.notification_visibility_mentions"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.notificationVisibility.moves,callback:function(e){t.$set(t.notificationVisibility,"moves",e)},expression:"notificationVisibility.moves"}},[t._v("\n "+t._s(t.$t("settings.notification_visibility_moves"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.notificationVisibility.emojiReactions,callback:function(e){t.$set(t.notificationVisibility,"emojiReactions",e)},expression:"notificationVisibility.emojiReactions"}},[t._v("\n "+t._s(t.$t("settings.notification_visibility_emoji_reactions"))+"\n ")])],1)])]),t._v(" "),s("div",[t._v("\n "+t._s(t.$t("settings.replies_in_timeline"))+"\n "),s("label",{staticClass:"select",attrs:{for:"replyVisibility"}},[s("select",{directives:[{name:"model",rawName:"v-model",value:t.replyVisibility,expression:"replyVisibility"}],attrs:{id:"replyVisibility"},on:{change:function(e){var s=Array.prototype.filter.call(e.target.options,function(t){return t.selected}).map(function(t){return"_value"in t?t._value:t.value});t.replyVisibility=e.target.multiple?s:s[0]}}},[s("option",{attrs:{value:"all",selected:""}},[t._v(t._s(t.$t("settings.reply_visibility_all")))]),t._v(" "),s("option",{attrs:{value:"following"}},[t._v(t._s(t.$t("settings.reply_visibility_following")))]),t._v(" "),s("option",{attrs:{value:"self"}},[t._v(t._s(t.$t("settings.reply_visibility_self")))])]),t._v(" "),s("i",{staticClass:"icon-down-open"})])]),t._v(" "),s("div",[s("Checkbox",{model:{value:t.hidePostStats,callback:function(e){t.hidePostStats=e},expression:"hidePostStats"}},[t._v("\n "+t._s(t.$t("settings.hide_post_stats"))+" "+t._s(t.$t("settings.instance_default",{value:t.hidePostStatsLocalizedValue}))+"\n ")])],1),t._v(" "),s("div",[s("Checkbox",{model:{value:t.hideUserStats,callback:function(e){t.hideUserStats=e},expression:"hideUserStats"}},[t._v("\n "+t._s(t.$t("settings.hide_user_stats"))+" "+t._s(t.$t("settings.instance_default",{value:t.hideUserStatsLocalizedValue}))+"\n ")])],1)]),t._v(" "),s("div",{staticClass:"setting-item"},[s("div",[s("p",[t._v(t._s(t.$t("settings.filtering_explanation")))]),t._v(" "),s("textarea",{directives:[{name:"model",rawName:"v-model",value:t.muteWordsString,expression:"muteWordsString"}],attrs:{id:"muteWords"},domProps:{value:t.muteWordsString},on:{input:function(e){e.target.composing||(t.muteWordsString=e.target.value)}}})]),t._v(" "),s("div",[s("Checkbox",{model:{value:t.hideFilteredStatuses,callback:function(e){t.hideFilteredStatuses=e},expression:"hideFilteredStatuses"}},[t._v("\n "+t._s(t.$t("settings.hide_filtered_statuses"))+" "+t._s(t.$t("settings.instance_default",{value:t.hideFilteredStatusesLocalizedValue}))+"\n ")])],1)])])},[],!1,null,null,null).exports,gt=s(3),_t=s.n(gt),wt={props:{backupCodes:{type:Object,default:function(){return{inProgress:!1,codes:[]}}}},data:function(){return{}},computed:{inProgress:function(){return this.backupCodes.inProgress},ready:function(){return this.backupCodes.codes.length>0},displayTitle:function(){return this.inProgress||this.ready}}};var Ct=function(t){s(615)},xt=Object(o.a)(wt,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"mfa-backup-codes"},[t.displayTitle?s("h4",[t._v("\n "+t._s(t.$t("settings.mfa.recovery_codes"))+"\n ")]):t._e(),t._v(" "),t.inProgress?s("i",[t._v(t._s(t.$t("settings.mfa.waiting_a_recovery_codes")))]):t._e(),t._v(" "),t.ready?[s("p",{staticClass:"alert warning"},[t._v("\n "+t._s(t.$t("settings.mfa.recovery_codes_warning"))+"\n ")]),t._v(" "),s("ul",{staticClass:"backup-codes"},t._l(t.backupCodes.codes,function(e){return s("li",{key:e},[t._v("\n "+t._s(e)+"\n ")])}),0)]:t._e()],2)},[],!1,Ct,null,null).exports,kt={props:["disabled"],data:function(){return{}},methods:{confirm:function(){this.$emit("confirm")},cancel:function(){this.$emit("cancel")}}},yt=Object(o.a)(kt,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",[t._t("default"),t._v(" "),s("button",{staticClass:"btn btn-default",attrs:{disabled:t.disabled},on:{click:t.confirm}},[t._v("\n "+t._s(t.$t("general.confirm"))+"\n ")]),t._v(" "),s("button",{staticClass:"btn btn-default",attrs:{disabled:t.disabled},on:{click:t.cancel}},[t._v("\n "+t._s(t.$t("general.cancel"))+"\n ")])],2)},[],!1,null,null,null).exports,$t=s(2);function Lt(t,e){var s=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),s.push.apply(s,a)}return s}var Tt={props:["settings"],data:function(){return{error:!1,currentPassword:"",deactivate:!1,inProgress:!1}},components:{confirm:yt},computed:function(t){for(var e=1;e0},confirmNewBackupCodes:function(){return this.backupCodes.getNewCodes}},Object($t.e)({backendInteractor:function(t){return t.api.backendInteractor}})),methods:{activateOTP:function(){this.settings.enabled||(this.setupState.state="getBackupcodes",this.fetchBackupCodes())},fetchBackupCodes:function(){var t=this;return this.backupCodes.inProgress=!0,this.backupCodes.codes=[],this.backendInteractor.generateMfaBackupCodes().then(function(e){t.backupCodes.codes=e.codes,t.backupCodes.inProgress=!1})},getBackupCodes:function(){this.backupCodes.getNewCodes=!0},confirmBackupCodes:function(){var t=this;this.fetchBackupCodes().then(function(e){t.backupCodes.getNewCodes=!1})},cancelBackupCodes:function(){this.backupCodes.getNewCodes=!1},setupOTP:function(){var t=this;this.setupState.state="setupOTP",this.setupState.setupOTPState="prepare",this.backendInteractor.mfaSetupOTP().then(function(e){t.otpSettings=e,t.setupState.setupOTPState="confirm"})},doConfirmOTP:function(){var t=this;this.error=null,this.backendInteractor.mfaConfirmOTP({token:this.otpConfirmToken,password:this.currentPassword}).then(function(e){e.error?t.error=e.error:t.completeSetup()})},completeSetup:function(){this.setupState.setupOTPState="complete",this.setupState.state="complete",this.currentPassword=null,this.error=null,this.fetchSettings()},cancelSetup:function(){this.setupState.setupOTPState="",this.setupState.state="",this.currentPassword=null,this.error=null},fetchSettings:function(){var t;return _t.a.async(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,_t.a.awrap(this.backendInteractor.settingsMFA());case 2:if(!(t=e.sent).error){e.next=5;break}return e.abrupt("return");case 5:return this.settings=t.settings,this.settings.available=!0,e.abrupt("return",t);case 8:case"end":return e.stop()}},null,this)}},mounted:function(){var t=this;this.fetchSettings().then(function(){t.readyInit=!0})}};var St=function(t){s(613)},It=Object(o.a)(Pt,function(){var t=this,e=t.$createElement,s=t._self._c||e;return t.readyInit&&t.settings.available?s("div",{staticClass:"setting-item mfa-settings"},[s("div",{staticClass:"mfa-heading"},[s("h2",[t._v(t._s(t.$t("settings.mfa.title")))])]),t._v(" "),s("div",[t.setupInProgress?t._e():s("div",{staticClass:"setting-item"},[s("h3",[t._v(t._s(t.$t("settings.mfa.authentication_methods")))]),t._v(" "),s("totp-item",{attrs:{settings:t.settings},on:{deactivate:t.fetchSettings,activate:t.activateOTP}}),t._v(" "),s("br"),t._v(" "),t.settings.enabled?s("div",[t.confirmNewBackupCodes?t._e():s("recovery-codes",{attrs:{"backup-codes":t.backupCodes}}),t._v(" "),t.confirmNewBackupCodes?t._e():s("button",{staticClass:"btn btn-default",on:{click:t.getBackupCodes}},[t._v("\n "+t._s(t.$t("settings.mfa.generate_new_recovery_codes"))+"\n ")]),t._v(" "),t.confirmNewBackupCodes?s("div",[s("confirm",{attrs:{disabled:t.backupCodes.inProgress},on:{confirm:t.confirmBackupCodes,cancel:t.cancelBackupCodes}},[s("p",{staticClass:"warning"},[t._v("\n "+t._s(t.$t("settings.mfa.warning_of_generate_new_codes"))+"\n ")])])],1):t._e()],1):t._e()],1),t._v(" "),t.setupInProgress?s("div",[s("h3",[t._v(t._s(t.$t("settings.mfa.setup_otp")))]),t._v(" "),t.setupOTPInProgress?t._e():s("recovery-codes",{attrs:{"backup-codes":t.backupCodes}}),t._v(" "),t.canSetupOTP?s("button",{staticClass:"btn btn-default",on:{click:t.cancelSetup}},[t._v("\n "+t._s(t.$t("general.cancel"))+"\n ")]):t._e(),t._v(" "),t.canSetupOTP?s("button",{staticClass:"btn btn-default",on:{click:t.setupOTP}},[t._v("\n "+t._s(t.$t("settings.mfa.setup_otp"))+"\n ")]):t._e(),t._v(" "),t.setupOTPInProgress?[t.prepareOTP?s("i",[t._v(t._s(t.$t("settings.mfa.wait_pre_setup_otp")))]):t._e(),t._v(" "),t.confirmOTP?s("div",[s("div",{staticClass:"setup-otp"},[s("div",{staticClass:"qr-code"},[s("h4",[t._v(t._s(t.$t("settings.mfa.scan.title")))]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.mfa.scan.desc")))]),t._v(" "),s("qrcode",{attrs:{value:t.otpSettings.provisioning_uri,options:{width:200}}}),t._v(" "),s("p",[t._v("\n "+t._s(t.$t("settings.mfa.scan.secret_code"))+":\n "+t._s(t.otpSettings.key)+"\n ")])],1),t._v(" "),s("div",{staticClass:"verify"},[s("h4",[t._v(t._s(t.$t("general.verify")))]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.mfa.verify.desc")))]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.otpConfirmToken,expression:"otpConfirmToken"}],attrs:{type:"text"},domProps:{value:t.otpConfirmToken},on:{input:function(e){e.target.composing||(t.otpConfirmToken=e.target.value)}}}),t._v(" "),s("p",[t._v(t._s(t.$t("settings.enter_current_password_to_confirm"))+":")]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.currentPassword,expression:"currentPassword"}],attrs:{type:"password"},domProps:{value:t.currentPassword},on:{input:function(e){e.target.composing||(t.currentPassword=e.target.value)}}}),t._v(" "),s("div",{staticClass:"confirm-otp-actions"},[s("button",{staticClass:"btn btn-default",on:{click:t.doConfirmOTP}},[t._v("\n "+t._s(t.$t("settings.mfa.confirm_and_enable"))+"\n ")]),t._v(" "),s("button",{staticClass:"btn btn-default",on:{click:t.cancelSetup}},[t._v("\n "+t._s(t.$t("general.cancel"))+"\n ")])]),t._v(" "),t.error?s("div",{staticClass:"alert error"},[t._v("\n "+t._s(t.error)+"\n ")]):t._e()])])]):t._e()]:t._e()],2):t._e()])]):t._e()},[],!1,St,null,null).exports,jt={data:function(){return{newEmail:"",changeEmailError:!1,changeEmailPassword:"",changedEmail:!1,deletingAccount:!1,deleteAccountConfirmPasswordInput:"",deleteAccountError:!1,changePasswordInputs:["","",""],changedPassword:!1,changePasswordError:!1}},created:function(){this.$store.dispatch("fetchTokens")},components:{ProgressButton:S.a,Mfa:It,Checkbox:d.a},computed:{user:function(){return this.$store.state.users.currentUser},pleromaBackend:function(){return this.$store.state.instance.pleromaBackend},oauthTokens:function(){return this.$store.state.oauthTokens.tokens.map(function(t){return{id:t.id,appName:t.app_name,validUntil:new Date(t.valid_until).toLocaleDateString()}})}},methods:{confirmDelete:function(){this.deletingAccount=!0},deleteAccount:function(){var t=this;this.$store.state.api.backendInteractor.deleteAccount({password:this.deleteAccountConfirmPasswordInput}).then(function(e){"success"===e.status?(t.$store.dispatch("logout"),t.$router.push({name:"root"})):t.deleteAccountError=e.error})},changePassword:function(){var t=this,e={password:this.changePasswordInputs[0],newPassword:this.changePasswordInputs[1],newPasswordConfirmation:this.changePasswordInputs[2]};this.$store.state.api.backendInteractor.changePassword(e).then(function(e){"success"===e.status?(t.changedPassword=!0,t.changePasswordError=!1,t.logout()):(t.changedPassword=!1,t.changePasswordError=e.error)})},changeEmail:function(){var t=this,e={email:this.newEmail,password:this.changeEmailPassword};this.$store.state.api.backendInteractor.changeEmail(e).then(function(e){"success"===e.status?(t.changedEmail=!0,t.changeEmailError=!1):(t.changedEmail=!1,t.changeEmailError=e.error)})},logout:function(){this.$store.dispatch("logout"),this.$router.replace("/")},revokeToken:function(t){window.confirm("".concat(this.$i18n.t("settings.revoke_token"),"?"))&&this.$store.dispatch("revokeToken",t)}}},Et=Object(o.a)(jt,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{attrs:{label:t.$t("settings.security_tab")}},[s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.change_email")))]),t._v(" "),s("div",[s("p",[t._v(t._s(t.$t("settings.new_email")))]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.newEmail,expression:"newEmail"}],attrs:{type:"email",autocomplete:"email"},domProps:{value:t.newEmail},on:{input:function(e){e.target.composing||(t.newEmail=e.target.value)}}})]),t._v(" "),s("div",[s("p",[t._v(t._s(t.$t("settings.current_password")))]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.changeEmailPassword,expression:"changeEmailPassword"}],attrs:{type:"password",autocomplete:"current-password"},domProps:{value:t.changeEmailPassword},on:{input:function(e){e.target.composing||(t.changeEmailPassword=e.target.value)}}})]),t._v(" "),s("button",{staticClass:"btn btn-default",on:{click:t.changeEmail}},[t._v("\n "+t._s(t.$t("general.submit"))+"\n ")]),t._v(" "),t.changedEmail?s("p",[t._v("\n "+t._s(t.$t("settings.changed_email"))+"\n ")]):t._e(),t._v(" "),!1!==t.changeEmailError?[s("p",[t._v(t._s(t.$t("settings.change_email_error")))]),t._v(" "),s("p",[t._v(t._s(t.changeEmailError))])]:t._e()],2),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.change_password")))]),t._v(" "),s("div",[s("p",[t._v(t._s(t.$t("settings.current_password")))]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.changePasswordInputs[0],expression:"changePasswordInputs[0]"}],attrs:{type:"password"},domProps:{value:t.changePasswordInputs[0]},on:{input:function(e){e.target.composing||t.$set(t.changePasswordInputs,0,e.target.value)}}})]),t._v(" "),s("div",[s("p",[t._v(t._s(t.$t("settings.new_password")))]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.changePasswordInputs[1],expression:"changePasswordInputs[1]"}],attrs:{type:"password"},domProps:{value:t.changePasswordInputs[1]},on:{input:function(e){e.target.composing||t.$set(t.changePasswordInputs,1,e.target.value)}}})]),t._v(" "),s("div",[s("p",[t._v(t._s(t.$t("settings.confirm_new_password")))]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.changePasswordInputs[2],expression:"changePasswordInputs[2]"}],attrs:{type:"password"},domProps:{value:t.changePasswordInputs[2]},on:{input:function(e){e.target.composing||t.$set(t.changePasswordInputs,2,e.target.value)}}})]),t._v(" "),s("button",{staticClass:"btn btn-default",on:{click:t.changePassword}},[t._v("\n "+t._s(t.$t("general.submit"))+"\n ")]),t._v(" "),t.changedPassword?s("p",[t._v("\n "+t._s(t.$t("settings.changed_password"))+"\n ")]):!1!==t.changePasswordError?s("p",[t._v("\n "+t._s(t.$t("settings.change_password_error"))+"\n ")]):t._e(),t._v(" "),t.changePasswordError?s("p",[t._v("\n "+t._s(t.changePasswordError)+"\n ")]):t._e()]),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.oauth_tokens")))]),t._v(" "),s("table",{staticClass:"oauth-tokens"},[s("thead",[s("tr",[s("th",[t._v(t._s(t.$t("settings.app_name")))]),t._v(" "),s("th",[t._v(t._s(t.$t("settings.valid_until")))]),t._v(" "),s("th")])]),t._v(" "),s("tbody",t._l(t.oauthTokens,function(e){return s("tr",{key:e.id},[s("td",[t._v(t._s(e.appName))]),t._v(" "),s("td",[t._v(t._s(e.validUntil))]),t._v(" "),s("td",{staticClass:"actions"},[s("button",{staticClass:"btn btn-default",on:{click:function(s){return t.revokeToken(e.id)}}},[t._v("\n "+t._s(t.$t("settings.revoke_token"))+"\n ")])])])}),0)])]),t._v(" "),s("mfa"),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.delete_account")))]),t._v(" "),t.deletingAccount?t._e():s("p",[t._v("\n "+t._s(t.$t("settings.delete_account_description"))+"\n ")]),t._v(" "),t.deletingAccount?s("div",[s("p",[t._v(t._s(t.$t("settings.delete_account_instructions")))]),t._v(" "),s("p",[t._v(t._s(t.$t("login.password")))]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.deleteAccountConfirmPasswordInput,expression:"deleteAccountConfirmPasswordInput"}],attrs:{type:"password"},domProps:{value:t.deleteAccountConfirmPasswordInput},on:{input:function(e){e.target.composing||(t.deleteAccountConfirmPasswordInput=e.target.value)}}}),t._v(" "),s("button",{staticClass:"btn btn-default",on:{click:t.deleteAccount}},[t._v("\n "+t._s(t.$t("settings.delete_account"))+"\n ")])]):t._e(),t._v(" "),!1!==t.deleteAccountError?s("p",[t._v("\n "+t._s(t.$t("settings.delete_account_error"))+"\n ")]):t._e(),t._v(" "),t.deleteAccountError?s("p",[t._v("\n "+t._s(t.deleteAccountError)+"\n ")]):t._e(),t._v(" "),t.deletingAccount?t._e():s("button",{staticClass:"btn btn-default",on:{click:t.confirmDelete}},[t._v("\n "+t._s(t.$t("general.submit"))+"\n ")])])],1)},[],!1,null,null,null).exports,Rt=s(188),Bt=s.n(Rt),Ft=s(96),Mt=s.n(Ft),Ut=s(27),Vt=s.n(Ut),At=s(622),Dt=(s(623),{props:{trigger:{type:[String,window.Element],required:!0},submitHandler:{type:Function,required:!0},cropperOptions:{type:Object,default:function(){return{aspectRatio:1,autoCropArea:1,viewMode:1,movable:!1,zoomable:!1,guides:!1}}},mimes:{type:String,default:"image/png, image/gif, image/jpeg, image/bmp, image/x-icon"},saveButtonLabel:{type:String},saveWithoutCroppingButtonlabel:{type:String},cancelButtonLabel:{type:String}},data:function(){return{cropper:void 0,dataUrl:void 0,filename:void 0,submitting:!1,submitError:null}},computed:{saveText:function(){return this.saveButtonLabel||this.$t("image_cropper.save")},saveWithoutCroppingText:function(){return this.saveWithoutCroppingButtonlabel||this.$t("image_cropper.save_without_cropping")},cancelText:function(){return this.cancelButtonLabel||this.$t("image_cropper.cancel")},submitErrorMsg:function(){return this.submitError&&this.submitError instanceof Error?this.submitError.toString():this.submitError}},methods:{destroy:function(){this.cropper&&this.cropper.destroy(),this.$refs.input.value="",this.dataUrl=void 0,this.$emit("close")},submit:function(){var t=this,e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.submitting=!0,this.avatarUploadError=null,this.submitHandler(e&&this.cropper,this.file).then(function(){return t.destroy()}).catch(function(e){t.submitError=e}).finally(function(){t.submitting=!1})},pickImage:function(){this.$refs.input.click()},createCropper:function(){this.cropper=new At.a(this.$refs.img,this.cropperOptions)},getTriggerDOM:function(){return"object"===Vt()(this.trigger)?this.trigger:document.querySelector(this.trigger)},readFile:function(){var t=this,e=this.$refs.input;if(null!=e.files&&null!=e.files[0]){this.file=e.files[0];var s=new window.FileReader;s.onload=function(e){t.dataUrl=e.target.result,t.$emit("open")},s.readAsDataURL(this.file),this.$emit("changed",this.file,s)}},clearError:function(){this.submitError=null}},mounted:function(){var t=this.getTriggerDOM();t?t.addEventListener("click",this.pickImage):this.$emit("error","No image make trigger found.","user"),this.$refs.input.addEventListener("change",this.readFile)},beforeDestroy:function(){var t=this.getTriggerDOM();t&&t.removeEventListener("click",this.pickImage),this.$refs.input.removeEventListener("change",this.readFile)}});var Nt=function(t){s(620)},Wt=Object(o.a)(Dt,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"image-cropper"},[t.dataUrl?s("div",[s("div",{staticClass:"image-cropper-image-container"},[s("img",{ref:"img",attrs:{src:t.dataUrl,alt:""},on:{load:function(e){return e.stopPropagation(),t.createCropper(e)}}})]),t._v(" "),s("div",{staticClass:"image-cropper-buttons-wrapper"},[s("button",{staticClass:"btn",attrs:{type:"button",disabled:t.submitting},domProps:{textContent:t._s(t.saveText)},on:{click:function(e){return t.submit()}}}),t._v(" "),s("button",{staticClass:"btn",attrs:{type:"button",disabled:t.submitting},domProps:{textContent:t._s(t.cancelText)},on:{click:t.destroy}}),t._v(" "),s("button",{staticClass:"btn",attrs:{type:"button",disabled:t.submitting},domProps:{textContent:t._s(t.saveWithoutCroppingText)},on:{click:function(e){return t.submit(!1)}}}),t._v(" "),t.submitting?s("i",{staticClass:"icon-spin4 animate-spin"}):t._e()]),t._v(" "),t.submitError?s("div",{staticClass:"alert error"},[t._v("\n "+t._s(t.submitErrorMsg)+"\n "),s("i",{staticClass:"button-icon icon-cancel",on:{click:t.clearError}})]):t._e()]):t._e(),t._v(" "),s("input",{ref:"input",staticClass:"image-cropper-img-input",attrs:{type:"file",accept:t.mimes}})])},[],!1,Nt,null,null).exports,zt=s(196),qt=s(134),Gt=s(195),Ht=s(135),Kt={data:function(){return{newName:this.$store.state.users.currentUser.name,newBio:Bt()(this.$store.state.users.currentUser.description),newLocked:this.$store.state.users.currentUser.locked,newNoRichText:this.$store.state.users.currentUser.no_rich_text,newDefaultScope:this.$store.state.users.currentUser.default_scope,newFields:this.$store.state.users.currentUser.fields.map(function(t){return{name:t.name,value:t.value}}),hideFollows:this.$store.state.users.currentUser.hide_follows,hideFollowers:this.$store.state.users.currentUser.hide_followers,hideFollowsCount:this.$store.state.users.currentUser.hide_follows_count,hideFollowersCount:this.$store.state.users.currentUser.hide_followers_count,showRole:this.$store.state.users.currentUser.show_role,role:this.$store.state.users.currentUser.role,discoverable:this.$store.state.users.currentUser.discoverable,bot:this.$store.state.users.currentUser.bot,allowFollowingMove:this.$store.state.users.currentUser.allow_following_move,pickAvatarBtnVisible:!0,bannerUploading:!1,backgroundUploading:!1,banner:null,bannerPreview:null,background:null,backgroundPreview:null,bannerUploadError:null,backgroundUploadError:null}},components:{ScopeSelector:zt.a,ImageCropper:Wt,EmojiInput:Gt.a,Autosuggest:x,ProgressButton:S.a,Checkbox:d.a},computed:{user:function(){return this.$store.state.users.currentUser},emojiUserSuggestor:function(){var t=this;return Object(Ht.a)({emoji:[].concat(z()(this.$store.state.instance.emoji),z()(this.$store.state.instance.customEmoji)),users:this.$store.state.users.users,updateUsersList:function(e){return t.$store.dispatch("searchUsers",{query:e})}})},emojiSuggestor:function(){return Object(Ht.a)({emoji:[].concat(z()(this.$store.state.instance.emoji),z()(this.$store.state.instance.customEmoji))})},userSuggestor:function(){var t=this;return Object(Ht.a)({users:this.$store.state.users.users,updateUsersList:function(e){return t.$store.dispatch("searchUsers",{query:e})}})},fieldsLimits:function(){return this.$store.state.instance.fieldsLimits},maxFields:function(){return this.fieldsLimits?this.fieldsLimits.maxFields:0},defaultAvatar:function(){return this.$store.state.instance.server+this.$store.state.instance.defaultAvatar},defaultBanner:function(){return this.$store.state.instance.server+this.$store.state.instance.defaultBanner},isDefaultAvatar:function(){var t=this.$store.state.instance.defaultAvatar;return!this.$store.state.users.currentUser.profile_image_url||this.$store.state.users.currentUser.profile_image_url.includes(t)},isDefaultBanner:function(){var t=this.$store.state.instance.defaultBanner;return!this.$store.state.users.currentUser.cover_photo||this.$store.state.users.currentUser.cover_photo.includes(t)},isDefaultBackground:function(){return!this.$store.state.users.currentUser.background_image},avatarImgSrc:function(){var t=this.$store.state.users.currentUser.profile_image_url_original;return t||this.defaultAvatar},bannerImgSrc:function(){var t=this.$store.state.users.currentUser.cover_photo;return t||this.defaultBanner}},methods:{updateProfile:function(){var t=this;this.$store.state.api.backendInteractor.updateProfile({params:{note:this.newBio,locked:this.newLocked,display_name:this.newName,fields_attributes:this.newFields.filter(function(t){return null!=t}),default_scope:this.newDefaultScope,no_rich_text:this.newNoRichText,hide_follows:this.hideFollows,hide_followers:this.hideFollowers,discoverable:this.discoverable,bot:this.bot,allow_following_move:this.allowFollowingMove,hide_follows_count:this.hideFollowsCount,hide_followers_count:this.hideFollowersCount,show_role:this.showRole}}).then(function(e){t.newFields.splice(e.fields.length),Mt()(t.newFields,e.fields),t.$store.commit("addNewUsers",[e]),t.$store.commit("setCurrentUser",e)})},changeVis:function(t){this.newDefaultScope=t},addField:function(){return this.newFields.lengththis.$store.state.instance[t+"limit"]){var n=qt.a.fileSizeFormat(a.size),o=qt.a.fileSizeFormat(this.$store.state.instance[t+"limit"]);this[t+"UploadError"]=[this.$t("upload.error.base"),this.$t("upload.error.file_too_big",{filesize:n.num,filesizeunit:n.unit,allowedsize:o.num,allowedsizeunit:o.unit})].join(" ")}else{var i=new FileReader;i.onload=function(e){var n=e.target.result;s[t+"Preview"]=n,s[t]=a},i.readAsDataURL(a)}},resetAvatar:function(){window.confirm(this.$t("settings.reset_avatar_confirm"))&&this.submitAvatar(void 0,"")},resetBanner:function(){window.confirm(this.$t("settings.reset_banner_confirm"))&&this.submitBanner("")},resetBackground:function(){window.confirm(this.$t("settings.reset_background_confirm"))&&this.submitBackground("")},submitAvatar:function(t,e){var s=this;return new Promise(function(a,n){function o(t){s.$store.state.api.backendInteractor.updateProfileImages({avatar:t}).then(function(t){s.$store.commit("addNewUsers",[t]),s.$store.commit("setCurrentUser",t),a()}).catch(function(t){n(new Error(s.$t("upload.error.base")+" "+t.message))})}t?t.getCroppedCanvas().toBlob(o,e.type):o(e)})},submitBanner:function(t){var e=this;(this.bannerPreview||""===t)&&(this.bannerUploading=!0,this.$store.state.api.backendInteractor.updateProfileImages({banner:t}).then(function(t){e.$store.commit("addNewUsers",[t]),e.$store.commit("setCurrentUser",t),e.bannerPreview=null}).catch(function(t){e.bannerUploadError=e.$t("upload.error.base")+" "+t.message}).then(function(){e.bannerUploading=!1}))},submitBackground:function(t){var e=this;(this.backgroundPreview||""===t)&&(this.backgroundUploading=!0,this.$store.state.api.backendInteractor.updateProfileImages({background:t}).then(function(t){t.error?e.backgroundUploadError=e.$t("upload.error.base")+t.error:(e.$store.commit("addNewUsers",[t]),e.$store.commit("setCurrentUser",t),e.backgroundPreview=null),e.backgroundUploading=!1}))}}};var Jt=function(t){s(618)},Qt=Object(o.a)(Kt,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"profile-tab"},[s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.name_bio")))]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.name")))]),t._v(" "),s("EmojiInput",{attrs:{"enable-emoji-picker":"",suggest:t.emojiSuggestor},model:{value:t.newName,callback:function(e){t.newName=e},expression:"newName"}},[s("input",{directives:[{name:"model",rawName:"v-model",value:t.newName,expression:"newName"}],attrs:{id:"username",classname:"name-changer"},domProps:{value:t.newName},on:{input:function(e){e.target.composing||(t.newName=e.target.value)}}})]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.bio")))]),t._v(" "),s("EmojiInput",{attrs:{"enable-emoji-picker":"",suggest:t.emojiUserSuggestor},model:{value:t.newBio,callback:function(e){t.newBio=e},expression:"newBio"}},[s("textarea",{directives:[{name:"model",rawName:"v-model",value:t.newBio,expression:"newBio"}],attrs:{classname:"bio"},domProps:{value:t.newBio},on:{input:function(e){e.target.composing||(t.newBio=e.target.value)}}})]),t._v(" "),s("p",[s("Checkbox",{model:{value:t.newLocked,callback:function(e){t.newLocked=e},expression:"newLocked"}},[t._v("\n "+t._s(t.$t("settings.lock_account_description"))+"\n ")])],1),t._v(" "),s("div",[s("label",{attrs:{for:"default-vis"}},[t._v(t._s(t.$t("settings.default_vis")))]),t._v(" "),s("div",{staticClass:"visibility-tray",attrs:{id:"default-vis"}},[s("scope-selector",{attrs:{"show-all":!0,"user-default":t.newDefaultScope,"initial-scope":t.newDefaultScope,"on-scope-change":t.changeVis}})],1)]),t._v(" "),s("p",[s("Checkbox",{model:{value:t.newNoRichText,callback:function(e){t.newNoRichText=e},expression:"newNoRichText"}},[t._v("\n "+t._s(t.$t("settings.no_rich_text_description"))+"\n ")])],1),t._v(" "),s("p",[s("Checkbox",{model:{value:t.hideFollows,callback:function(e){t.hideFollows=e},expression:"hideFollows"}},[t._v("\n "+t._s(t.$t("settings.hide_follows_description"))+"\n ")])],1),t._v(" "),s("p",{staticClass:"setting-subitem"},[s("Checkbox",{attrs:{disabled:!t.hideFollows},model:{value:t.hideFollowsCount,callback:function(e){t.hideFollowsCount=e},expression:"hideFollowsCount"}},[t._v("\n "+t._s(t.$t("settings.hide_follows_count_description"))+"\n ")])],1),t._v(" "),s("p",[s("Checkbox",{model:{value:t.hideFollowers,callback:function(e){t.hideFollowers=e},expression:"hideFollowers"}},[t._v("\n "+t._s(t.$t("settings.hide_followers_description"))+"\n ")])],1),t._v(" "),s("p",{staticClass:"setting-subitem"},[s("Checkbox",{attrs:{disabled:!t.hideFollowers},model:{value:t.hideFollowersCount,callback:function(e){t.hideFollowersCount=e},expression:"hideFollowersCount"}},[t._v("\n "+t._s(t.$t("settings.hide_followers_count_description"))+"\n ")])],1),t._v(" "),s("p",[s("Checkbox",{model:{value:t.allowFollowingMove,callback:function(e){t.allowFollowingMove=e},expression:"allowFollowingMove"}},[t._v("\n "+t._s(t.$t("settings.allow_following_move"))+"\n ")])],1),t._v(" "),"admin"===t.role||"moderator"===t.role?s("p",[s("Checkbox",{model:{value:t.showRole,callback:function(e){t.showRole=e},expression:"showRole"}},["admin"===t.role?[t._v("\n "+t._s(t.$t("settings.show_admin_badge"))+"\n ")]:t._e(),t._v(" "),"moderator"===t.role?[t._v("\n "+t._s(t.$t("settings.show_moderator_badge"))+"\n ")]:t._e()],2)],1):t._e(),t._v(" "),s("p",[s("Checkbox",{model:{value:t.discoverable,callback:function(e){t.discoverable=e},expression:"discoverable"}},[t._v("\n "+t._s(t.$t("settings.discoverable"))+"\n ")])],1),t._v(" "),t.maxFields>0?s("div",[s("p",[t._v(t._s(t.$t("settings.profile_fields.label")))]),t._v(" "),t._l(t.newFields,function(e,a){return s("div",{key:a,staticClass:"profile-fields"},[s("EmojiInput",{attrs:{"enable-emoji-picker":"","hide-emoji-button":"",suggest:t.userSuggestor},model:{value:t.newFields[a].name,callback:function(e){t.$set(t.newFields[a],"name",e)},expression:"newFields[i].name"}},[s("input",{directives:[{name:"model",rawName:"v-model",value:t.newFields[a].name,expression:"newFields[i].name"}],attrs:{placeholder:t.$t("settings.profile_fields.name")},domProps:{value:t.newFields[a].name},on:{input:function(e){e.target.composing||t.$set(t.newFields[a],"name",e.target.value)}}})]),t._v(" "),s("EmojiInput",{attrs:{"enable-emoji-picker":"","hide-emoji-button":"",suggest:t.userSuggestor},model:{value:t.newFields[a].value,callback:function(e){t.$set(t.newFields[a],"value",e)},expression:"newFields[i].value"}},[s("input",{directives:[{name:"model",rawName:"v-model",value:t.newFields[a].value,expression:"newFields[i].value"}],attrs:{placeholder:t.$t("settings.profile_fields.value")},domProps:{value:t.newFields[a].value},on:{input:function(e){e.target.composing||t.$set(t.newFields[a],"value",e.target.value)}}})]),t._v(" "),s("div",{staticClass:"icon-container"},[s("i",{directives:[{name:"show",rawName:"v-show",value:t.newFields.length>1,expression:"newFields.length > 1"}],staticClass:"icon-cancel",on:{click:function(e){return t.deleteField(a)}}})])],1)}),t._v(" "),t.newFields.length0?s("li",[s("div",[t._v("\n "+t._s(t.$t("settings.post_status_content_type"))+"\n "),s("label",{staticClass:"select",attrs:{for:"postContentType"}},[s("select",{directives:[{name:"model",rawName:"v-model",value:t.postContentType,expression:"postContentType"}],attrs:{id:"postContentType"},on:{change:function(e){var s=Array.prototype.filter.call(e.target.options,function(t){return t.selected}).map(function(t){return"_value"in t?t._value:t.value});t.postContentType=e.target.multiple?s:s[0]}}},t._l(t.postFormats,function(e){return s("option",{key:e,domProps:{value:e}},[t._v("\n "+t._s(t.$t('post_status.content_type["'+e+'"]'))+"\n "+t._s(t.postContentTypeDefaultValue===e?t.$t("settings.instance_default_simple"):"")+"\n ")])}),0),t._v(" "),s("i",{staticClass:"icon-down-open"})])])]):t._e(),t._v(" "),s("li",[s("Checkbox",{model:{value:t.minimalScopesMode,callback:function(e){t.minimalScopesMode=e},expression:"minimalScopesMode"}},[t._v("\n "+t._s(t.$t("settings.minimal_scopes_mode"))+" "+t._s(t.$t("settings.instance_default",{value:t.minimalScopesModeLocalizedValue}))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.autohideFloatingPostButton,callback:function(e){t.autohideFloatingPostButton=e},expression:"autohideFloatingPostButton"}},[t._v("\n "+t._s(t.$t("settings.autohide_floating_post_button"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.padEmoji,callback:function(e){t.padEmoji=e},expression:"padEmoji"}},[t._v("\n "+t._s(t.$t("settings.pad_emoji"))+"\n ")])],1)])]),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.attachments")))]),t._v(" "),s("ul",{staticClass:"setting-list"},[s("li",[s("Checkbox",{model:{value:t.hideAttachments,callback:function(e){t.hideAttachments=e},expression:"hideAttachments"}},[t._v("\n "+t._s(t.$t("settings.hide_attachments_in_tl"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.hideAttachmentsInConv,callback:function(e){t.hideAttachmentsInConv=e},expression:"hideAttachmentsInConv"}},[t._v("\n "+t._s(t.$t("settings.hide_attachments_in_convo"))+"\n ")])],1),t._v(" "),s("li",[s("label",{attrs:{for:"maxThumbnails"}},[t._v("\n "+t._s(t.$t("settings.max_thumbnails"))+"\n ")]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model.number",value:t.maxThumbnails,expression:"maxThumbnails",modifiers:{number:!0}}],staticClass:"number-input",attrs:{id:"maxThumbnails",type:"number",min:"0",step:"1"},domProps:{value:t.maxThumbnails},on:{input:function(e){e.target.composing||(t.maxThumbnails=t._n(e.target.value))},blur:function(e){return t.$forceUpdate()}}})]),t._v(" "),s("li",[s("Checkbox",{model:{value:t.hideNsfw,callback:function(e){t.hideNsfw=e},expression:"hideNsfw"}},[t._v("\n "+t._s(t.$t("settings.nsfw_clickthrough"))+"\n ")])],1),t._v(" "),s("ul",{staticClass:"setting-list suboptions"},[s("li",[s("Checkbox",{attrs:{disabled:!t.hideNsfw},model:{value:t.preloadImage,callback:function(e){t.preloadImage=e},expression:"preloadImage"}},[t._v("\n "+t._s(t.$t("settings.preload_images"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{attrs:{disabled:!t.hideNsfw},model:{value:t.useOneClickNsfw,callback:function(e){t.useOneClickNsfw=e},expression:"useOneClickNsfw"}},[t._v("\n "+t._s(t.$t("settings.use_one_click_nsfw"))+"\n ")])],1)]),t._v(" "),s("li",[s("Checkbox",{model:{value:t.stopGifs,callback:function(e){t.stopGifs=e},expression:"stopGifs"}},[t._v("\n "+t._s(t.$t("settings.stop_gifs"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.loopVideo,callback:function(e){t.loopVideo=e},expression:"loopVideo"}},[t._v("\n "+t._s(t.$t("settings.loop_video"))+"\n ")]),t._v(" "),s("ul",{staticClass:"setting-list suboptions",class:[{disabled:!t.streaming}]},[s("li",[s("Checkbox",{attrs:{disabled:!t.loopVideo||!t.loopSilentAvailable},model:{value:t.loopVideoSilentOnly,callback:function(e){t.loopVideoSilentOnly=e},expression:"loopVideoSilentOnly"}},[t._v("\n "+t._s(t.$t("settings.loop_video_silent_only"))+"\n ")]),t._v(" "),t.loopSilentAvailable?t._e():s("div",{staticClass:"unavailable"},[s("i",{staticClass:"icon-globe"}),t._v("! "+t._s(t.$t("settings.limited_availability"))+"\n ")])],1)])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.playVideosInModal,callback:function(e){t.playVideosInModal=e},expression:"playVideosInModal"}},[t._v("\n "+t._s(t.$t("settings.play_videos_in_modal"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.useContainFit,callback:function(e){t.useContainFit=e},expression:"useContainFit"}},[t._v("\n "+t._s(t.$t("settings.use_contain_fit"))+"\n ")])],1)])]),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.notifications")))]),t._v(" "),s("ul",{staticClass:"setting-list"},[s("li",[s("Checkbox",{model:{value:t.webPushNotifications,callback:function(e){t.webPushNotifications=e},expression:"webPushNotifications"}},[t._v("\n "+t._s(t.$t("settings.enable_web_push_notifications"))+"\n ")])],1)])]),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.fun")))]),t._v(" "),s("ul",{staticClass:"setting-list"},[s("li",[s("Checkbox",{model:{value:t.greentext,callback:function(e){t.greentext=e},expression:"greentext"}},[t._v("\n "+t._s(t.$t("settings.greentext"))+" "+t._s(t.$t("settings.instance_default",{value:t.greentextLocalizedValue}))+"\n ")])],1)])])])},[],!1,null,null,null).exports,ne={data:function(){var t=this.$store.state.instance;return{backendVersion:t.backendVersion,frontendVersion:t.frontendVersion}},computed:{frontendVersionLink:function(){return"https://git.pleroma.social/pleroma/pleroma-fe/commit/"+this.frontendVersion},backendVersionLink:function(){return"https://git.pleroma.social/pleroma/pleroma/commit/"+(t=this.backendVersion,(e=t.match(/-g(\w+)/i))?e[1]:"");var t,e}}},oe=Object(o.a)(ne,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{attrs:{label:t.$t("settings.version.title")}},[s("div",{staticClass:"setting-item"},[s("ul",{staticClass:"setting-list"},[s("li",[s("p",[t._v(t._s(t.$t("settings.version.backend_version")))]),t._v(" "),s("ul",{staticClass:"option-list"},[s("li",[s("a",{attrs:{href:t.backendVersionLink,target:"_blank"}},[t._v(t._s(t.backendVersion))])])])]),t._v(" "),s("li",[s("p",[t._v(t._s(t.$t("settings.version.frontend_version")))]),t._v(" "),s("ul",{staticClass:"option-list"},[s("li",[s("a",{attrs:{href:t.frontendVersionLink,target:"_blank"}},[t._v(t._s(t.frontendVersion))])])])])])])])},[],!1,null,null,null).exports,ie=s(9),re=s(32),le=s(29),ce=s(39),ue={components:{Checkbox:d.a},props:{name:{required:!0,type:String},label:{required:!0,type:String},value:{required:!1,type:String,default:void 0},fallback:{required:!1,type:String,default:void 0},disabled:{required:!1,type:Boolean,default:!1},showOptionalTickbox:{required:!1,type:Boolean,default:!0}},computed:{present:function(){return void 0!==this.value},validColor:function(){return Object(ie.f)(this.value||this.fallback)},transparentColor:function(){return"transparent"===this.value},computedColor:function(){return this.value&&this.value.startsWith("--")}}};var de=function(t){s(626),s(628)},pe=Object(o.a)(ue,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"color-input style-control",class:{disabled:!t.present||t.disabled}},[s("label",{staticClass:"label",attrs:{for:t.name}},[t._v("\n "+t._s(t.label)+"\n ")]),t._v(" "),void 0!==t.fallback&&t.showOptionalTickbox?s("Checkbox",{staticClass:"opt",attrs:{checked:t.present,disabled:t.disabled},on:{change:function(e){return t.$emit("input",void 0===t.value?t.fallback:void 0)}}}):t._e(),t._v(" "),s("div",{staticClass:"input color-input-field"},[s("input",{staticClass:"textColor unstyled",attrs:{id:t.name+"-t",type:"text",disabled:!t.present||t.disabled},domProps:{value:t.value||t.fallback},on:{input:function(e){return t.$emit("input",e.target.value)}}}),t._v(" "),t.validColor?s("input",{staticClass:"nativeColor unstyled",attrs:{id:t.name,type:"color",disabled:!t.present||t.disabled},domProps:{value:t.value||t.fallback},on:{input:function(e){return t.$emit("input",e.target.value)}}}):t._e(),t._v(" "),t.transparentColor?s("div",{staticClass:"transparentIndicator"}):t._e(),t._v(" "),t.computedColor?s("div",{staticClass:"computedIndicator",style:{backgroundColor:t.fallback}}):t._e()])],1)},[],!1,de,null,null).exports,me=Object(o.a)({props:["name","value","fallback","disabled","label","max","min","step","hardMin","hardMax"],computed:{present:function(){return void 0!==this.value}}},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"range-control style-control",class:{disabled:!t.present||t.disabled}},[s("label",{staticClass:"label",attrs:{for:t.name}},[t._v("\n "+t._s(t.label)+"\n ")]),t._v(" "),void 0!==t.fallback?s("input",{staticClass:"opt",attrs:{id:t.name+"-o",type:"checkbox"},domProps:{checked:t.present},on:{input:function(e){return t.$emit("input",t.present?void 0:t.fallback)}}}):t._e(),t._v(" "),void 0!==t.fallback?s("label",{staticClass:"opt-l",attrs:{for:t.name+"-o"}}):t._e(),t._v(" "),s("input",{staticClass:"input-number",attrs:{id:t.name,type:"range",disabled:!t.present||t.disabled,max:t.max||t.hardMax||100,min:t.min||t.hardMin||0,step:t.step||1},domProps:{value:t.value||t.fallback},on:{input:function(e){return t.$emit("input",e.target.value)}}}),t._v(" "),s("input",{staticClass:"input-number",attrs:{id:t.name,type:"number",disabled:!t.present||t.disabled,max:t.hardMax,min:t.hardMin,step:t.step||1},domProps:{value:t.value||t.fallback},on:{input:function(e){return t.$emit("input",e.target.value)}}})])},[],!1,null,null,null).exports,ve={components:{Checkbox:d.a},props:["name","value","fallback","disabled"],computed:{present:function(){return void 0!==this.value}}},he=Object(o.a)(ve,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"opacity-control style-control",class:{disabled:!t.present||t.disabled}},[s("label",{staticClass:"label",attrs:{for:t.name}},[t._v("\n "+t._s(t.$t("settings.style.common.opacity"))+"\n ")]),t._v(" "),void 0!==t.fallback?s("Checkbox",{staticClass:"opt",attrs:{checked:t.present,disabled:t.disabled},on:{change:function(e){return t.$emit("input",t.present?void 0:t.fallback)}}}):t._e(),t._v(" "),s("input",{staticClass:"input-number",attrs:{id:t.name,type:"number",disabled:!t.present||t.disabled,max:"1",min:"0",step:".05"},domProps:{value:t.value||t.fallback},on:{input:function(e){return t.$emit("input",e.target.value)}}})],1)},[],!1,null,null,null).exports;function be(t,e){var s=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),s.push.apply(s,a)}return s}var fe=function(){return function(t){for(var e=1;e0&&void 0!==arguments[0]?arguments[0]:{})},ge={props:["value","fallback","ready"],data:function(){return{selectedId:0,cValue:(this.value||this.fallback||[]).map(fe)}},components:{ColorInput:pe,OpacityInput:he},methods:{add:function(){this.cValue.push(fe(this.selected)),this.selectedId=this.cValue.length-1},del:function(){this.cValue.splice(this.selectedId,1),this.selectedId=0===this.cValue.length?void 0:Math.max(this.selectedId-1,0)},moveUp:function(){var t=this.cValue.splice(this.selectedId,1)[0];this.cValue.splice(this.selectedId-1,0,t),this.selectedId-=1},moveDn:function(){var t=this.cValue.splice(this.selectedId,1)[0];this.cValue.splice(this.selectedId+1,0,t),this.selectedId+=1}},beforeUpdate:function(){this.cValue=this.value||this.fallback},computed:{anyShadows:function(){return this.cValue.length>0},anyShadowsFallback:function(){return this.fallback.length>0},selected:function(){return this.ready&&this.anyShadows?this.cValue[this.selectedId]:fe({})},currentFallback:function(){return this.ready&&this.anyShadowsFallback?this.fallback[this.selectedId]:fe({})},moveUpValid:function(){return this.ready&&this.selectedId>0},moveDnValid:function(){return this.ready&&this.selectedId-1:t.selected.inset},on:{change:function(e){var s=t.selected.inset,a=e.target,n=!!a.checked;if(Array.isArray(s)){var o=t._i(s,null);a.checked?o<0&&t.$set(t.selected,"inset",s.concat([null])):o>-1&&t.$set(t.selected,"inset",s.slice(0,o).concat(s.slice(o+1)))}else t.$set(t.selected,"inset",n)}}}),t._v(" "),s("label",{staticClass:"checkbox-label",attrs:{for:"inset"}})]),t._v(" "),s("div",{staticClass:"blur-control style-control",attrs:{disabled:!t.present}},[s("label",{staticClass:"label",attrs:{for:"spread"}},[t._v("\n "+t._s(t.$t("settings.style.shadows.blur"))+"\n ")]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.selected.blur,expression:"selected.blur"}],staticClass:"input-range",attrs:{id:"blur",disabled:!t.present,name:"blur",type:"range",max:"20",min:"0"},domProps:{value:t.selected.blur},on:{__r:function(e){return t.$set(t.selected,"blur",e.target.value)}}}),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.selected.blur,expression:"selected.blur"}],staticClass:"input-number",attrs:{disabled:!t.present,type:"number",min:"0"},domProps:{value:t.selected.blur},on:{input:function(e){e.target.composing||t.$set(t.selected,"blur",e.target.value)}}})]),t._v(" "),s("div",{staticClass:"spread-control style-control",attrs:{disabled:!t.present}},[s("label",{staticClass:"label",attrs:{for:"spread"}},[t._v("\n "+t._s(t.$t("settings.style.shadows.spread"))+"\n ")]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.selected.spread,expression:"selected.spread"}],staticClass:"input-range",attrs:{id:"spread",disabled:!t.present,name:"spread",type:"range",max:"20",min:"-20"},domProps:{value:t.selected.spread},on:{__r:function(e){return t.$set(t.selected,"spread",e.target.value)}}}),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.selected.spread,expression:"selected.spread"}],staticClass:"input-number",attrs:{disabled:!t.present,type:"number"},domProps:{value:t.selected.spread},on:{input:function(e){e.target.composing||t.$set(t.selected,"spread",e.target.value)}}})]),t._v(" "),s("ColorInput",{attrs:{disabled:!t.present,label:t.$t("settings.style.common.color"),fallback:t.currentFallback.color,"show-optional-tickbox":!1,name:"shadow"},model:{value:t.selected.color,callback:function(e){t.$set(t.selected,"color",e)},expression:"selected.color"}}),t._v(" "),s("OpacityInput",{attrs:{disabled:!t.present},model:{value:t.selected.alpha,callback:function(e){t.$set(t.selected,"alpha",e)},expression:"selected.alpha"}}),t._v(" "),s("i18n",{attrs:{path:"settings.style.shadows.hintV3",tag:"p"}},[s("code",[t._v("--variable,mod")])])],1)])},[],!1,_e,null,null).exports,Ce={props:["name","label","value","fallback","options","no-inherit"],data:function(){return{lValue:this.value,availableOptions:[this.noInherit?"":"inherit","custom"].concat(z()(this.options||[]),["serif","monospace","sans-serif"]).filter(function(t){return t})}},beforeUpdate:function(){this.lValue=this.value},computed:{present:function(){return void 0!==this.lValue},dValue:function(){return this.lValue||this.fallback||{}},family:{get:function(){return this.dValue.family},set:function(t){Object(q.set)(this.lValue,"family",t),this.$emit("input",this.lValue)}},isCustom:function(){return"custom"===this.preset},preset:{get:function(){return"serif"===this.family||"sans-serif"===this.family||"monospace"===this.family||"inherit"===this.family?this.family:"custom"},set:function(t){this.family="custom"===t?"":t}}}};var xe=function(t){s(632)},ke=Object(o.a)(Ce,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"font-control style-control",class:{custom:t.isCustom}},[s("label",{staticClass:"label",attrs:{for:"custom"===t.preset?t.name:t.name+"-font-switcher"}},[t._v("\n "+t._s(t.label)+"\n ")]),t._v(" "),void 0!==t.fallback?s("input",{staticClass:"opt exlcude-disabled",attrs:{id:t.name+"-o",type:"checkbox"},domProps:{checked:t.present},on:{input:function(e){return t.$emit("input",void 0===t.value?t.fallback:void 0)}}}):t._e(),t._v(" "),void 0!==t.fallback?s("label",{staticClass:"opt-l",attrs:{for:t.name+"-o"}}):t._e(),t._v(" "),s("label",{staticClass:"select",attrs:{for:t.name+"-font-switcher",disabled:!t.present}},[s("select",{directives:[{name:"model",rawName:"v-model",value:t.preset,expression:"preset"}],staticClass:"font-switcher",attrs:{id:t.name+"-font-switcher",disabled:!t.present},on:{change:function(e){var s=Array.prototype.filter.call(e.target.options,function(t){return t.selected}).map(function(t){return"_value"in t?t._value:t.value});t.preset=e.target.multiple?s:s[0]}}},t._l(t.availableOptions,function(e){return s("option",{key:e,domProps:{value:e}},[t._v("\n "+t._s("custom"===e?t.$t("settings.style.fonts.custom"):e)+"\n ")])}),0),t._v(" "),s("i",{staticClass:"icon-down-open"})]),t._v(" "),t.isCustom?s("input",{directives:[{name:"model",rawName:"v-model",value:t.family,expression:"family"}],staticClass:"custom-font",attrs:{id:t.name,type:"text"},domProps:{value:t.family},on:{input:function(e){e.target.composing||(t.family=e.target.value)}}}):t._e()])},[],!1,xe,null,null).exports,ye={props:{large:{required:!1},contrast:{required:!1,type:Object}},computed:{hint:function(){var t=this.contrast.aaa?"aaa":this.contrast.aa?"aa":"bad",e=this.$t("settings.style.common.contrast.level.".concat(t)),s=this.$t("settings.style.common.contrast.context.text"),a=this.contrast.text;return this.$t("settings.style.common.contrast.hint",{level:e,context:s,ratio:a})},hint_18pt:function(){var t=this.contrast.laaa?"aaa":this.contrast.laa?"aa":"bad",e=this.$t("settings.style.common.contrast.level.".concat(t)),s=this.$t("settings.style.common.contrast.context.18pt"),a=this.contrast.text;return this.$t("settings.style.common.contrast.hint",{level:e,context:s,ratio:a})}}};var $e=function(t){s(634)},Le=Object(o.a)(ye,function(){var t=this,e=t.$createElement,s=t._self._c||e;return t.contrast?s("span",{staticClass:"contrast-ratio"},[s("span",{staticClass:"rating",attrs:{title:t.hint}},[t.contrast.aaa?s("span",[s("i",{staticClass:"icon-thumbs-up-alt"})]):t._e(),t._v(" "),!t.contrast.aaa&&t.contrast.aa?s("span",[s("i",{staticClass:"icon-adjust"})]):t._e(),t._v(" "),t.contrast.aaa||t.contrast.aa?t._e():s("span",[s("i",{staticClass:"icon-attention"})])]),t._v(" "),t.contrast&&t.large?s("span",{staticClass:"rating",attrs:{title:t.hint_18pt}},[t.contrast.laaa?s("span",[s("i",{staticClass:"icon-thumbs-up-alt"})]):t._e(),t._v(" "),!t.contrast.laaa&&t.contrast.laa?s("span",[s("i",{staticClass:"icon-adjust"})]):t._e(),t._v(" "),t.contrast.laaa||t.contrast.laa?t._e():s("span",[s("i",{staticClass:"icon-attention"})])]):t._e()]):t._e()},[],!1,$e,null,null).exports,Te={props:["exportObject","importLabel","exportLabel","importFailedText","validator","onImport","onImportFailure"],data:function(){return{importFailed:!1}},methods:{exportData:function(){var t=JSON.stringify(this.exportObject,null,2),e=document.createElement("a");e.setAttribute("download","pleroma_theme.json"),e.setAttribute("href","data:application/json;base64,"+window.btoa(t)),e.style.display="none",document.body.appendChild(e),e.click(),document.body.removeChild(e)},importData:function(){var t=this;this.importFailed=!1;var e=document.createElement("input");e.setAttribute("type","file"),e.setAttribute("accept",".json"),e.addEventListener("change",function(e){if(e.target.files[0]){var s=new FileReader;s.onload=function(e){var s=e.target;try{var a=JSON.parse(s.result);t.validator(a)?t.onImport(a):t.importFailed=!0}catch(e){t.importFailed=!0}},s.readAsText(e.target.files[0])}}),document.body.appendChild(e),e.click(),document.body.removeChild(e)}}};var Oe=function(t){s(636)},Pe=Object(o.a)(Te,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"import-export-container"},[t._t("before"),t._v(" "),s("button",{staticClass:"btn",on:{click:t.exportData}},[t._v("\n "+t._s(t.exportLabel)+"\n ")]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.importData}},[t._v("\n "+t._s(t.importLabel)+"\n ")]),t._v(" "),t._t("afterButtons"),t._v(" "),t.importFailed?s("p",{staticClass:"alert error"},[t._v("\n "+t._s(t.importFailedText)+"\n ")]):t._e(),t._v(" "),t._t("afterError")],2)},[],!1,Oe,null,null).exports;var Se=function(t){s(638)},Ie=Object(o.a)(null,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"preview-container"},[s("div",{staticClass:"underlay underlay-preview"}),t._v(" "),s("div",{staticClass:"panel dummy"},[s("div",{staticClass:"panel-heading"},[s("div",{staticClass:"title"},[t._v("\n "+t._s(t.$t("settings.style.preview.header"))+"\n "),s("span",{staticClass:"badge badge-notification"},[t._v("\n 99\n ")])]),t._v(" "),s("span",{staticClass:"faint"},[t._v("\n "+t._s(t.$t("settings.style.preview.header_faint"))+"\n ")]),t._v(" "),s("span",{staticClass:"alert error"},[t._v("\n "+t._s(t.$t("settings.style.preview.error"))+"\n ")]),t._v(" "),s("button",{staticClass:"btn"},[t._v("\n "+t._s(t.$t("settings.style.preview.button"))+"\n ")])]),t._v(" "),s("div",{staticClass:"panel-body theme-preview-content"},[s("div",{staticClass:"post"},[s("div",{staticClass:"avatar still-image"},[t._v("\n ( ͡° ͜ʖ ͡°)\n ")]),t._v(" "),s("div",{staticClass:"content"},[s("h4",[t._v("\n "+t._s(t.$t("settings.style.preview.content"))+"\n ")]),t._v(" "),s("i18n",{attrs:{path:"settings.style.preview.text"}},[s("code",{staticStyle:{"font-family":"var(--postCodeFont)"}},[t._v("\n "+t._s(t.$t("settings.style.preview.mono"))+"\n ")]),t._v(" "),s("a",{staticStyle:{color:"var(--link)"}},[t._v("\n "+t._s(t.$t("settings.style.preview.link"))+"\n ")])]),t._v(" "),t._m(0)],1)]),t._v(" "),s("div",{staticClass:"after-post"},[s("div",{staticClass:"avatar-alt"},[t._v("\n :^)\n ")]),t._v(" "),s("div",{staticClass:"content"},[s("i18n",{staticClass:"faint",attrs:{path:"settings.style.preview.fine_print",tag:"span"}},[s("a",{staticStyle:{color:"var(--faintLink)"}},[t._v("\n "+t._s(t.$t("settings.style.preview.faint_link"))+"\n ")])])],1)]),t._v(" "),s("div",{staticClass:"separator"}),t._v(" "),s("span",{staticClass:"alert error"},[t._v("\n "+t._s(t.$t("settings.style.preview.error"))+"\n ")]),t._v(" "),s("input",{attrs:{type:"text"},domProps:{value:t.$t("settings.style.preview.input")}}),t._v(" "),s("div",{staticClass:"actions"},[s("span",{staticClass:"checkbox"},[s("input",{attrs:{id:"preview_checkbox",checked:"very yes",type:"checkbox"}}),t._v(" "),s("label",{attrs:{for:"preview_checkbox"}},[t._v(t._s(t.$t("settings.style.preview.checkbox")))])]),t._v(" "),s("button",{staticClass:"btn"},[t._v("\n "+t._s(t.$t("settings.style.preview.button"))+"\n ")])])])])])},[function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"icons"},[e("i",{staticClass:"button-icon icon-reply",staticStyle:{color:"var(--cBlue)"}}),this._v(" "),e("i",{staticClass:"button-icon icon-retweet",staticStyle:{color:"var(--cGreen)"}}),this._v(" "),e("i",{staticClass:"button-icon icon-star",staticStyle:{color:"var(--cOrange)"}}),this._v(" "),e("i",{staticClass:"button-icon icon-cancel",staticStyle:{color:"var(--cRed)"}})])}],!1,Se,null,null).exports;function je(t,e){var s=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),s.push.apply(s,a)}return s}function Ee(t){for(var e=1;ece.a)return t(e+"future_version_imported")+" "+t(i?e+"snapshot_missing":e+"snapshot_present");if(nce.a)return t(e+"fe_downgraded")+" "+t(i?e+"migration_snapshot_ok":e+"migration_snapshot_gone");if(n=4.5,aaa:s>=7,laa:s>=3,laaa:s>=4.5},t},{})}catch(t){console.warn("Failure computing contrasts",t)}},previewRules:function(){return this.preview.rules?[].concat(z()(Object.values(this.preview.rules)),["color: var(--text)","font-family: var(--interfaceFont, sans-serif)"]).join(";"):""},shadowsAvailable:function(){return Object.keys(re.a).sort()},currentShadowOverriden:{get:function(){return!!this.currentShadow},set:function(t){t?Object(q.set)(this.shadowsLocal,this.shadowSelected,this.currentShadowFallback.map(function(t){return Object.assign({},t)})):Object(q.delete)(this.shadowsLocal,this.shadowSelected)}},currentShadowFallback:function(){return(this.previewTheme.shadows||{})[this.shadowSelected]},currentShadow:{get:function(){return this.shadowsLocal[this.shadowSelected]},set:function(t){Object(q.set)(this.shadowsLocal,this.shadowSelected,t)}},themeValid:function(){return!this.shadowsInvalid&&!this.colorsInvalid&&!this.radiiInvalid},exportedTheme:function(){var t=!(this.keepFonts||this.keepShadows||this.keepOpacity||this.keepRoundness||this.keepColor),e={themeEngineVersion:ce.a};return(this.keepFonts||t)&&(e.fonts=this.fontsLocal),(this.keepShadows||t)&&(e.shadows=this.shadowsLocal),(this.keepOpacity||t)&&(e.opacity=this.currentOpacity),(this.keepColor||t)&&(e.colors=this.currentColors),(this.keepRoundness||t)&&(e.radii=this.currentRadii),{_pleroma_theme_version:2,theme:Ee({themeEngineVersion:ce.a},this.previewTheme),source:e}}},components:{ColorInput:pe,OpacityInput:he,RangeInput:me,ContrastRatio:Le,ShadowControl:we,FontControl:ke,TabSwitcher:a.a,Preview:Ie,ExportImport:Pe,Checkbox:d.a},methods:{loadTheme:function(t,e){var s=t.theme,a=t.source,n=t._pleroma_theme_version,o=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(this.dismissWarning(),!a&&!s)throw new Error("Can't load theme: empty");var i="localStorage"!==e||s.colors?n:"l1",r=(s||{}).themeEngineVersion,l=(a||{}).themeEngineVersion||2,c=l===ce.a,u=void 0!==s&&void 0!==a&&l!==r,d=a&&o||!s;c&&!u||d||"l1"===i||"defaults"===e||(u&&"localStorage"===e?this.themeWarning={origin:e,themeEngineVersion:l,type:"snapshot_source_mismatch"}:s?c||(this.themeWarning={origin:e,noActionsPossible:!a,themeEngineVersion:l,type:"wrong_version"}):this.themeWarning={origin:e,noActionsPossible:!0,themeEngineVersion:l,type:"no_snapshot_old_version"}),this.normalizeLocalState(s,i,a,d)},forceLoadLocalStorage:function(){this.loadThemeFromLocalStorage(!0)},dismissWarning:function(){this.themeWarning=void 0,this.tempImportFile=void 0},forceLoad:function(){switch(this.themeWarning.origin){case"localStorage":this.loadThemeFromLocalStorage(!0);break;case"file":this.onImport(this.tempImportFile,!0)}this.dismissWarning()},forceSnapshot:function(){switch(this.themeWarning.origin){case"localStorage":this.loadThemeFromLocalStorage(!1,!0);break;case"file":console.err("Forcing snapshout from file is not supported yet")}this.dismissWarning()},loadThemeFromLocalStorage:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],s=this.$store.getters.mergedConfig,a=s.customTheme,n=s.customThemeSource;a||n?this.loadTheme({theme:a,source:e?a:n},"localStorage",t):this.loadTheme(this.$store.state.instance.themeData,"defaults",t)},setCustomTheme:function(){this.$store.dispatch("setOption",{name:"customTheme",value:Ee({themeEngineVersion:ce.a},this.previewTheme)}),this.$store.dispatch("setOption",{name:"customThemeSource",value:{themeEngineVersion:ce.a,shadows:this.shadowsLocal,fonts:this.fontsLocal,opacity:this.currentOpacity,colors:this.currentColors,radii:this.currentRadii}})},updatePreviewColorsAndShadows:function(){this.previewColors=Object(re.e)({opacity:this.currentOpacity,colors:this.currentColors}),this.previewShadows=Object(re.h)({shadows:this.shadowsLocal,opacity:this.previewTheme.opacity,themeEngineVersion:this.engineVersion},this.previewColors.theme.colors,this.previewColors.mod)},onImport:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];this.tempImportFile=t,this.loadTheme(t,"file",e)},importValidator:function(t){var e=t._pleroma_theme_version;return e>=1||e<=2},clearAll:function(){this.loadThemeFromLocalStorage()},clearV1:function(){var t=this;Object.keys(this.$data).filter(function(t){return t.endsWith("ColorLocal")||t.endsWith("OpacityLocal")}).filter(function(t){return!Re.includes(t)}).forEach(function(e){Object(q.set)(t.$data,e,void 0)})},clearRoundness:function(){var t=this;Object.keys(this.$data).filter(function(t){return t.endsWith("RadiusLocal")}).forEach(function(e){Object(q.set)(t.$data,e,void 0)})},clearOpacity:function(){var t=this;Object.keys(this.$data).filter(function(t){return t.endsWith("OpacityLocal")}).forEach(function(e){Object(q.set)(t.$data,e,void 0)})},clearShadows:function(){this.shadowsLocal={}},clearFonts:function(){this.fontsLocal={}},normalizeLocalState:function(t){var e,s=this,a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2?arguments[2]:void 0,o=arguments.length>3&&void 0!==arguments[3]&&arguments[3];void 0!==n&&(o||n.themeEngineVersion===ce.a)?(e=n,a=n.themeEngineVersion):e=t;var i=e.radii||e,r=e.opacity,l=e.shadows||{},c=e.fonts||{},u=e.themeEngineVersion?e.colors||e:Object(re.c)(e.colors||e);if(0===a&&(e.version&&(a=e.version),void 0===u.text&&void 0!==u.fg&&(a=1),void 0!==u.text&&void 0!==u.fg&&(a=2)),this.engineVersion=a,1===a&&(this.fgColorLocal=Object(ie.i)(u.btn),this.textColorLocal=Object(ie.i)(u.fg)),!this.keepColor){this.clearV1();var d=new Set(1!==a?Object.keys(le.c):[]);1!==a&&"l1"!==a||d.add("bg").add("link").add("cRed").add("cBlue").add("cGreen").add("cOrange"),d.forEach(function(t){var e=u[t],a=Object(ie.i)(u[t]);s[t+"ColorLocal"]="#aN"===a?e:a})}r&&!this.keepOpacity&&(this.clearOpacity(),Object.entries(r).forEach(function(t){var e=A()(t,2),a=e[0],n=e[1];null==n||Number.isNaN(n)||(s[a+"OpacityLocal"]=n)})),this.keepRoundness||(this.clearRoundness(),Object.entries(i).forEach(function(t){var e=A()(t,2),a=e[0],n=e[1],o=a.endsWith("Radius")?a.split("Radius")[0]:a;s[o+"RadiusLocal"]=n})),this.keepShadows||(this.clearShadows(),this.shadowsLocal=2===a?Object(re.m)(l,this.previewTheme.opacity):l,this.shadowSelected=this.shadowsAvailable[0]),this.keepFonts||(this.clearFonts(),this.fontsLocal=c)}},watch:{currentRadii:function(){try{this.previewRadii=Object(re.g)({radii:this.currentRadii}),this.radiiInvalid=!1}catch(t){this.radiiInvalid=!0,console.warn(t)}},shadowsLocal:{handler:function(){if(1!==Object.getOwnPropertyNames(this.previewColors).length)try{this.updatePreviewColorsAndShadows(),this.shadowsInvalid=!1}catch(t){this.shadowsInvalid=!0,console.warn(t)}},deep:!0},fontsLocal:{handler:function(){try{this.previewFonts=Object(re.f)({fonts:this.fontsLocal}),this.fontsInvalid=!1}catch(t){this.fontsInvalid=!0,console.warn(t)}},deep:!0},currentColors:function(){try{this.updatePreviewColorsAndShadows(),this.colorsInvalid=!1,this.shadowsInvalid=!1}catch(t){this.colorsInvalid=!0,this.shadowsInvalid=!0,console.warn(t)}},currentOpacity:function(){try{this.updatePreviewColorsAndShadows()}catch(t){console.warn(t)}},selected:function(){this.dismissWarning(),1===this.selectedVersion?(this.keepRoundness||this.clearRoundness(),this.keepShadows||this.clearShadows(),this.keepOpacity||this.clearOpacity(),this.keepColor||(this.clearV1(),this.bgColorLocal=this.selected[1],this.fgColorLocal=this.selected[2],this.textColorLocal=this.selected[3],this.linkColorLocal=this.selected[4],this.cRedColorLocal=this.selected[5],this.cGreenColorLocal=this.selected[6],this.cBlueColorLocal=this.selected[7],this.cOrangeColorLocal=this.selected[8])):this.selectedVersion>=2&&this.normalizeLocalState(this.selected.theme,2,this.selected.source)}}};var Fe=function(t){s(624)},Me=Object(o.a)(Be,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"theme-tab"},[s("div",{staticClass:"presets-container"},[s("div",{staticClass:"save-load"},[t.themeWarning?s("div",{staticClass:"theme-warning"},[s("div",{staticClass:"alert warning"},[t._v("\n "+t._s(t.themeWarningHelp)+"\n ")]),t._v(" "),s("div",{staticClass:"buttons"},["snapshot_source_mismatch"===t.themeWarning.type?[s("button",{staticClass:"btn",on:{click:t.forceLoad}},[t._v("\n "+t._s(t.$t("settings.style.switcher.use_source"))+"\n ")]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.forceSnapshot}},[t._v("\n "+t._s(t.$t("settings.style.switcher.use_snapshot"))+"\n ")])]:t.themeWarning.noActionsPossible?[s("button",{staticClass:"btn",on:{click:t.dismissWarning}},[t._v("\n "+t._s(t.$t("general.dismiss"))+"\n ")])]:[s("button",{staticClass:"btn",on:{click:t.forceLoad}},[t._v("\n "+t._s(t.$t("settings.style.switcher.load_theme"))+"\n ")]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.dismissWarning}},[t._v("\n "+t._s(t.$t("settings.style.switcher.keep_as_is"))+"\n ")])]],2)]):t._e(),t._v(" "),s("ExportImport",{attrs:{"export-object":t.exportedTheme,"export-label":t.$t("settings.export_theme"),"import-label":t.$t("settings.import_theme"),"import-failed-text":t.$t("settings.invalid_theme_imported"),"on-import":t.onImport,validator:t.importValidator}},[s("template",{slot:"before"},[s("div",{staticClass:"presets"},[t._v("\n "+t._s(t.$t("settings.presets"))+"\n "),s("label",{staticClass:"select",attrs:{for:"preset-switcher"}},[s("select",{directives:[{name:"model",rawName:"v-model",value:t.selected,expression:"selected"}],staticClass:"preset-switcher",attrs:{id:"preset-switcher"},on:{change:function(e){var s=Array.prototype.filter.call(e.target.options,function(t){return t.selected}).map(function(t){return"_value"in t?t._value:t.value});t.selected=e.target.multiple?s:s[0]}}},t._l(t.availableStyles,function(e){return s("option",{key:e.name,style:{backgroundColor:e[1]||(e.theme||e.source).colors.bg,color:e[3]||(e.theme||e.source).colors.text},domProps:{value:e}},[t._v("\n "+t._s(e[0]||e.name)+"\n ")])}),0),t._v(" "),s("i",{staticClass:"icon-down-open"})])])])],2)],1),t._v(" "),s("div",{staticClass:"save-load-options"},[s("span",{staticClass:"keep-option"},[s("Checkbox",{model:{value:t.keepColor,callback:function(e){t.keepColor=e},expression:"keepColor"}},[t._v("\n "+t._s(t.$t("settings.style.switcher.keep_color"))+"\n ")])],1),t._v(" "),s("span",{staticClass:"keep-option"},[s("Checkbox",{model:{value:t.keepShadows,callback:function(e){t.keepShadows=e},expression:"keepShadows"}},[t._v("\n "+t._s(t.$t("settings.style.switcher.keep_shadows"))+"\n ")])],1),t._v(" "),s("span",{staticClass:"keep-option"},[s("Checkbox",{model:{value:t.keepOpacity,callback:function(e){t.keepOpacity=e},expression:"keepOpacity"}},[t._v("\n "+t._s(t.$t("settings.style.switcher.keep_opacity"))+"\n ")])],1),t._v(" "),s("span",{staticClass:"keep-option"},[s("Checkbox",{model:{value:t.keepRoundness,callback:function(e){t.keepRoundness=e},expression:"keepRoundness"}},[t._v("\n "+t._s(t.$t("settings.style.switcher.keep_roundness"))+"\n ")])],1),t._v(" "),s("span",{staticClass:"keep-option"},[s("Checkbox",{model:{value:t.keepFonts,callback:function(e){t.keepFonts=e},expression:"keepFonts"}},[t._v("\n "+t._s(t.$t("settings.style.switcher.keep_fonts"))+"\n ")])],1),t._v(" "),s("p",[t._v(t._s(t.$t("settings.style.switcher.save_load_hint")))])])]),t._v(" "),s("preview",{style:t.previewRules}),t._v(" "),s("keep-alive",[s("tab-switcher",{key:"style-tweak"},[s("div",{staticClass:"color-container",attrs:{label:t.$t("settings.style.common_colors._tab_label")}},[s("div",{staticClass:"tab-header"},[s("p",[t._v(t._s(t.$t("settings.theme_help")))]),t._v(" "),s("div",{staticClass:"tab-header-buttons"},[s("button",{staticClass:"btn",on:{click:t.clearOpacity}},[t._v("\n "+t._s(t.$t("settings.style.switcher.clear_opacity"))+"\n ")]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.clearV1}},[t._v("\n "+t._s(t.$t("settings.style.switcher.clear_all"))+"\n ")])])]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.theme_help_v2_1")))]),t._v(" "),s("h4",[t._v(t._s(t.$t("settings.style.common_colors.main")))]),t._v(" "),s("div",{staticClass:"color-item"},[s("ColorInput",{attrs:{name:"bgColor",label:t.$t("settings.background")},model:{value:t.bgColorLocal,callback:function(e){t.bgColorLocal=e},expression:"bgColorLocal"}}),t._v(" "),s("OpacityInput",{attrs:{name:"bgOpacity",fallback:t.previewTheme.opacity.bg},model:{value:t.bgOpacityLocal,callback:function(e){t.bgOpacityLocal=e},expression:"bgOpacityLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"textColor",label:t.$t("settings.text")},model:{value:t.textColorLocal,callback:function(e){t.textColorLocal=e},expression:"textColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.bgText}}),t._v(" "),s("ColorInput",{attrs:{name:"accentColor",fallback:t.previewTheme.colors.link,label:t.$t("settings.accent"),"show-optional-tickbox":void 0!==t.linkColorLocal},model:{value:t.accentColorLocal,callback:function(e){t.accentColorLocal=e},expression:"accentColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"linkColor",fallback:t.previewTheme.colors.accent,label:t.$t("settings.links"),"show-optional-tickbox":void 0!==t.accentColorLocal},model:{value:t.linkColorLocal,callback:function(e){t.linkColorLocal=e},expression:"linkColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.bgLink}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("ColorInput",{attrs:{name:"fgColor",label:t.$t("settings.foreground")},model:{value:t.fgColorLocal,callback:function(e){t.fgColorLocal=e},expression:"fgColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"fgTextColor",label:t.$t("settings.text"),fallback:t.previewTheme.colors.fgText},model:{value:t.fgTextColorLocal,callback:function(e){t.fgTextColorLocal=e},expression:"fgTextColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"fgLinkColor",label:t.$t("settings.links"),fallback:t.previewTheme.colors.fgLink},model:{value:t.fgLinkColorLocal,callback:function(e){t.fgLinkColorLocal=e},expression:"fgLinkColorLocal"}}),t._v(" "),s("p",[t._v(t._s(t.$t("settings.style.common_colors.foreground_hint")))])],1),t._v(" "),s("h4",[t._v(t._s(t.$t("settings.style.common_colors.rgbo")))]),t._v(" "),s("div",{staticClass:"color-item"},[s("ColorInput",{attrs:{name:"cRedColor",label:t.$t("settings.cRed")},model:{value:t.cRedColorLocal,callback:function(e){t.cRedColorLocal=e},expression:"cRedColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.bgCRed}}),t._v(" "),s("ColorInput",{attrs:{name:"cBlueColor",label:t.$t("settings.cBlue")},model:{value:t.cBlueColorLocal,callback:function(e){t.cBlueColorLocal=e},expression:"cBlueColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.bgCBlue}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("ColorInput",{attrs:{name:"cGreenColor",label:t.$t("settings.cGreen")},model:{value:t.cGreenColorLocal,callback:function(e){t.cGreenColorLocal=e},expression:"cGreenColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.bgCGreen}}),t._v(" "),s("ColorInput",{attrs:{name:"cOrangeColor",label:t.$t("settings.cOrange")},model:{value:t.cOrangeColorLocal,callback:function(e){t.cOrangeColorLocal=e},expression:"cOrangeColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.bgCOrange}})],1),t._v(" "),s("p",[t._v(t._s(t.$t("settings.theme_help_v2_2")))])]),t._v(" "),s("div",{staticClass:"color-container",attrs:{label:t.$t("settings.style.advanced_colors._tab_label")}},[s("div",{staticClass:"tab-header"},[s("p",[t._v(t._s(t.$t("settings.theme_help")))]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.clearOpacity}},[t._v("\n "+t._s(t.$t("settings.style.switcher.clear_opacity"))+"\n ")]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.clearV1}},[t._v("\n "+t._s(t.$t("settings.style.switcher.clear_all"))+"\n ")])]),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.post")))]),t._v(" "),s("ColorInput",{attrs:{name:"postLinkColor",fallback:t.previewTheme.colors.accent,label:t.$t("settings.links")},model:{value:t.postLinkColorLocal,callback:function(e){t.postLinkColorLocal=e},expression:"postLinkColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.postLink}}),t._v(" "),s("ColorInput",{attrs:{name:"postGreentextColor",fallback:t.previewTheme.colors.cGreen,label:t.$t("settings.greentext")},model:{value:t.postGreentextColorLocal,callback:function(e){t.postGreentextColorLocal=e},expression:"postGreentextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.postGreentext}}),t._v(" "),s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.alert")))]),t._v(" "),s("ColorInput",{attrs:{name:"alertError",label:t.$t("settings.style.advanced_colors.alert_error"),fallback:t.previewTheme.colors.alertError},model:{value:t.alertErrorColorLocal,callback:function(e){t.alertErrorColorLocal=e},expression:"alertErrorColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"alertErrorText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.alertErrorText},model:{value:t.alertErrorTextColorLocal,callback:function(e){t.alertErrorTextColorLocal=e},expression:"alertErrorTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.alertErrorText,large:"true"}}),t._v(" "),s("ColorInput",{attrs:{name:"alertWarning",label:t.$t("settings.style.advanced_colors.alert_warning"),fallback:t.previewTheme.colors.alertWarning},model:{value:t.alertWarningColorLocal,callback:function(e){t.alertWarningColorLocal=e},expression:"alertWarningColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"alertWarningText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.alertWarningText},model:{value:t.alertWarningTextColorLocal,callback:function(e){t.alertWarningTextColorLocal=e},expression:"alertWarningTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.alertWarningText,large:"true"}}),t._v(" "),s("ColorInput",{attrs:{name:"alertNeutral",label:t.$t("settings.style.advanced_colors.alert_neutral"),fallback:t.previewTheme.colors.alertNeutral},model:{value:t.alertNeutralColorLocal,callback:function(e){t.alertNeutralColorLocal=e},expression:"alertNeutralColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"alertNeutralText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.alertNeutralText},model:{value:t.alertNeutralTextColorLocal,callback:function(e){t.alertNeutralTextColorLocal=e},expression:"alertNeutralTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.alertNeutralText,large:"true"}}),t._v(" "),s("OpacityInput",{attrs:{name:"alertOpacity",fallback:t.previewTheme.opacity.alert},model:{value:t.alertOpacityLocal,callback:function(e){t.alertOpacityLocal=e},expression:"alertOpacityLocal"}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.badge")))]),t._v(" "),s("ColorInput",{attrs:{name:"badgeNotification",label:t.$t("settings.style.advanced_colors.badge_notification"),fallback:t.previewTheme.colors.badgeNotification},model:{value:t.badgeNotificationColorLocal,callback:function(e){t.badgeNotificationColorLocal=e},expression:"badgeNotificationColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"badgeNotificationText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.badgeNotificationText},model:{value:t.badgeNotificationTextColorLocal,callback:function(e){t.badgeNotificationTextColorLocal=e},expression:"badgeNotificationTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.badgeNotificationText,large:"true"}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.panel_header")))]),t._v(" "),s("ColorInput",{attrs:{name:"panelColor",fallback:t.previewTheme.colors.panel,label:t.$t("settings.background")},model:{value:t.panelColorLocal,callback:function(e){t.panelColorLocal=e},expression:"panelColorLocal"}}),t._v(" "),s("OpacityInput",{attrs:{name:"panelOpacity",fallback:t.previewTheme.opacity.panel,disabled:"transparent"===t.panelColorLocal},model:{value:t.panelOpacityLocal,callback:function(e){t.panelOpacityLocal=e},expression:"panelOpacityLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"panelTextColor",fallback:t.previewTheme.colors.panelText,label:t.$t("settings.text")},model:{value:t.panelTextColorLocal,callback:function(e){t.panelTextColorLocal=e},expression:"panelTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.panelText,large:"true"}}),t._v(" "),s("ColorInput",{attrs:{name:"panelLinkColor",fallback:t.previewTheme.colors.panelLink,label:t.$t("settings.links")},model:{value:t.panelLinkColorLocal,callback:function(e){t.panelLinkColorLocal=e},expression:"panelLinkColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.panelLink,large:"true"}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.top_bar")))]),t._v(" "),s("ColorInput",{attrs:{name:"topBarColor",fallback:t.previewTheme.colors.topBar,label:t.$t("settings.background")},model:{value:t.topBarColorLocal,callback:function(e){t.topBarColorLocal=e},expression:"topBarColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"topBarTextColor",fallback:t.previewTheme.colors.topBarText,label:t.$t("settings.text")},model:{value:t.topBarTextColorLocal,callback:function(e){t.topBarTextColorLocal=e},expression:"topBarTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.topBarText}}),t._v(" "),s("ColorInput",{attrs:{name:"topBarLinkColor",fallback:t.previewTheme.colors.topBarLink,label:t.$t("settings.links")},model:{value:t.topBarLinkColorLocal,callback:function(e){t.topBarLinkColorLocal=e},expression:"topBarLinkColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.topBarLink}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.inputs")))]),t._v(" "),s("ColorInput",{attrs:{name:"inputColor",fallback:t.previewTheme.colors.input,label:t.$t("settings.background")},model:{value:t.inputColorLocal,callback:function(e){t.inputColorLocal=e},expression:"inputColorLocal"}}),t._v(" "),s("OpacityInput",{attrs:{name:"inputOpacity",fallback:t.previewTheme.opacity.input,disabled:"transparent"===t.inputColorLocal},model:{value:t.inputOpacityLocal,callback:function(e){t.inputOpacityLocal=e},expression:"inputOpacityLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"inputTextColor",fallback:t.previewTheme.colors.inputText,label:t.$t("settings.text")},model:{value:t.inputTextColorLocal,callback:function(e){t.inputTextColorLocal=e},expression:"inputTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.inputText}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.buttons")))]),t._v(" "),s("ColorInput",{attrs:{name:"btnColor",fallback:t.previewTheme.colors.btn,label:t.$t("settings.background")},model:{value:t.btnColorLocal,callback:function(e){t.btnColorLocal=e},expression:"btnColorLocal"}}),t._v(" "),s("OpacityInput",{attrs:{name:"btnOpacity",fallback:t.previewTheme.opacity.btn,disabled:"transparent"===t.btnColorLocal},model:{value:t.btnOpacityLocal,callback:function(e){t.btnOpacityLocal=e},expression:"btnOpacityLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"btnTextColor",fallback:t.previewTheme.colors.btnText,label:t.$t("settings.text")},model:{value:t.btnTextColorLocal,callback:function(e){t.btnTextColorLocal=e},expression:"btnTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnText}}),t._v(" "),s("ColorInput",{attrs:{name:"btnPanelTextColor",fallback:t.previewTheme.colors.btnPanelText,label:t.$t("settings.style.advanced_colors.panel_header")},model:{value:t.btnPanelTextColorLocal,callback:function(e){t.btnPanelTextColorLocal=e},expression:"btnPanelTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnPanelText}}),t._v(" "),s("ColorInput",{attrs:{name:"btnTopBarTextColor",fallback:t.previewTheme.colors.btnTopBarText,label:t.$t("settings.style.advanced_colors.top_bar")},model:{value:t.btnTopBarTextColorLocal,callback:function(e){t.btnTopBarTextColorLocal=e},expression:"btnTopBarTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnTopBarText}}),t._v(" "),s("h5",[t._v(t._s(t.$t("settings.style.advanced_colors.pressed")))]),t._v(" "),s("ColorInput",{attrs:{name:"btnPressedColor",fallback:t.previewTheme.colors.btnPressed,label:t.$t("settings.background")},model:{value:t.btnPressedColorLocal,callback:function(e){t.btnPressedColorLocal=e},expression:"btnPressedColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"btnPressedTextColor",fallback:t.previewTheme.colors.btnPressedText,label:t.$t("settings.text")},model:{value:t.btnPressedTextColorLocal,callback:function(e){t.btnPressedTextColorLocal=e},expression:"btnPressedTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnPressedText}}),t._v(" "),s("ColorInput",{attrs:{name:"btnPressedPanelTextColor",fallback:t.previewTheme.colors.btnPressedPanelText,label:t.$t("settings.style.advanced_colors.panel_header")},model:{value:t.btnPressedPanelTextColorLocal,callback:function(e){t.btnPressedPanelTextColorLocal=e},expression:"btnPressedPanelTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnPressedPanelText}}),t._v(" "),s("ColorInput",{attrs:{name:"btnPressedTopBarTextColor",fallback:t.previewTheme.colors.btnPressedTopBarText,label:t.$t("settings.style.advanced_colors.top_bar")},model:{value:t.btnPressedTopBarTextColorLocal,callback:function(e){t.btnPressedTopBarTextColorLocal=e},expression:"btnPressedTopBarTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnPressedTopBarText}}),t._v(" "),s("h5",[t._v(t._s(t.$t("settings.style.advanced_colors.disabled")))]),t._v(" "),s("ColorInput",{attrs:{name:"btnDisabledColor",fallback:t.previewTheme.colors.btnDisabled,label:t.$t("settings.background")},model:{value:t.btnDisabledColorLocal,callback:function(e){t.btnDisabledColorLocal=e},expression:"btnDisabledColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"btnDisabledTextColor",fallback:t.previewTheme.colors.btnDisabledText,label:t.$t("settings.text")},model:{value:t.btnDisabledTextColorLocal,callback:function(e){t.btnDisabledTextColorLocal=e},expression:"btnDisabledTextColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"btnDisabledPanelTextColor",fallback:t.previewTheme.colors.btnDisabledPanelText,label:t.$t("settings.style.advanced_colors.panel_header")},model:{value:t.btnDisabledPanelTextColorLocal,callback:function(e){t.btnDisabledPanelTextColorLocal=e},expression:"btnDisabledPanelTextColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"btnDisabledTopBarTextColor",fallback:t.previewTheme.colors.btnDisabledTopBarText,label:t.$t("settings.style.advanced_colors.top_bar")},model:{value:t.btnDisabledTopBarTextColorLocal,callback:function(e){t.btnDisabledTopBarTextColorLocal=e},expression:"btnDisabledTopBarTextColorLocal"}}),t._v(" "),s("h5",[t._v(t._s(t.$t("settings.style.advanced_colors.toggled")))]),t._v(" "),s("ColorInput",{attrs:{name:"btnToggledColor",fallback:t.previewTheme.colors.btnToggled,label:t.$t("settings.background")},model:{value:t.btnToggledColorLocal,callback:function(e){t.btnToggledColorLocal=e},expression:"btnToggledColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"btnToggledTextColor",fallback:t.previewTheme.colors.btnToggledText,label:t.$t("settings.text")},model:{value:t.btnToggledTextColorLocal,callback:function(e){t.btnToggledTextColorLocal=e},expression:"btnToggledTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnToggledText}}),t._v(" "),s("ColorInput",{attrs:{name:"btnToggledPanelTextColor",fallback:t.previewTheme.colors.btnToggledPanelText,label:t.$t("settings.style.advanced_colors.panel_header")},model:{value:t.btnToggledPanelTextColorLocal,callback:function(e){t.btnToggledPanelTextColorLocal=e},expression:"btnToggledPanelTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnToggledPanelText}}),t._v(" "),s("ColorInput",{attrs:{name:"btnToggledTopBarTextColor",fallback:t.previewTheme.colors.btnToggledTopBarText,label:t.$t("settings.style.advanced_colors.top_bar")},model:{value:t.btnToggledTopBarTextColorLocal,callback:function(e){t.btnToggledTopBarTextColorLocal=e},expression:"btnToggledTopBarTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnToggledTopBarText}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.tabs")))]),t._v(" "),s("ColorInput",{attrs:{name:"tabColor",fallback:t.previewTheme.colors.tab,label:t.$t("settings.background")},model:{value:t.tabColorLocal,callback:function(e){t.tabColorLocal=e},expression:"tabColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"tabTextColor",fallback:t.previewTheme.colors.tabText,label:t.$t("settings.text")},model:{value:t.tabTextColorLocal,callback:function(e){t.tabTextColorLocal=e},expression:"tabTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.tabText}}),t._v(" "),s("ColorInput",{attrs:{name:"tabActiveTextColor",fallback:t.previewTheme.colors.tabActiveText,label:t.$t("settings.text")},model:{value:t.tabActiveTextColorLocal,callback:function(e){t.tabActiveTextColorLocal=e},expression:"tabActiveTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.tabActiveText}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.borders")))]),t._v(" "),s("ColorInput",{attrs:{name:"borderColor",fallback:t.previewTheme.colors.border,label:t.$t("settings.style.common.color")},model:{value:t.borderColorLocal,callback:function(e){t.borderColorLocal=e},expression:"borderColorLocal"}}),t._v(" "),s("OpacityInput",{attrs:{name:"borderOpacity",fallback:t.previewTheme.opacity.border,disabled:"transparent"===t.borderColorLocal},model:{value:t.borderOpacityLocal,callback:function(e){t.borderOpacityLocal=e},expression:"borderOpacityLocal"}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.faint_text")))]),t._v(" "),s("ColorInput",{attrs:{name:"faintColor",fallback:t.previewTheme.colors.faint,label:t.$t("settings.text")},model:{value:t.faintColorLocal,callback:function(e){t.faintColorLocal=e},expression:"faintColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"faintLinkColor",fallback:t.previewTheme.colors.faintLink,label:t.$t("settings.links")},model:{value:t.faintLinkColorLocal,callback:function(e){t.faintLinkColorLocal=e},expression:"faintLinkColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"panelFaintColor",fallback:t.previewTheme.colors.panelFaint,label:t.$t("settings.style.advanced_colors.panel_header")},model:{value:t.panelFaintColorLocal,callback:function(e){t.panelFaintColorLocal=e},expression:"panelFaintColorLocal"}}),t._v(" "),s("OpacityInput",{attrs:{name:"faintOpacity",fallback:t.previewTheme.opacity.faint},model:{value:t.faintOpacityLocal,callback:function(e){t.faintOpacityLocal=e},expression:"faintOpacityLocal"}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.underlay")))]),t._v(" "),s("ColorInput",{attrs:{name:"underlay",label:t.$t("settings.style.advanced_colors.underlay"),fallback:t.previewTheme.colors.underlay},model:{value:t.underlayColorLocal,callback:function(e){t.underlayColorLocal=e},expression:"underlayColorLocal"}}),t._v(" "),s("OpacityInput",{attrs:{name:"underlayOpacity",fallback:t.previewTheme.opacity.underlay,disabled:"transparent"===t.underlayOpacityLocal},model:{value:t.underlayOpacityLocal,callback:function(e){t.underlayOpacityLocal=e},expression:"underlayOpacityLocal"}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.poll")))]),t._v(" "),s("ColorInput",{attrs:{name:"poll",label:t.$t("settings.background"),fallback:t.previewTheme.colors.poll},model:{value:t.pollColorLocal,callback:function(e){t.pollColorLocal=e},expression:"pollColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"pollText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.pollText},model:{value:t.pollTextColorLocal,callback:function(e){t.pollTextColorLocal=e},expression:"pollTextColorLocal"}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.icons")))]),t._v(" "),s("ColorInput",{attrs:{name:"icon",label:t.$t("settings.style.advanced_colors.icons"),fallback:t.previewTheme.colors.icon},model:{value:t.iconColorLocal,callback:function(e){t.iconColorLocal=e},expression:"iconColorLocal"}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.highlight")))]),t._v(" "),s("ColorInput",{attrs:{name:"highlight",label:t.$t("settings.background"),fallback:t.previewTheme.colors.highlight},model:{value:t.highlightColorLocal,callback:function(e){t.highlightColorLocal=e},expression:"highlightColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"highlightText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.highlightText},model:{value:t.highlightTextColorLocal,callback:function(e){t.highlightTextColorLocal=e},expression:"highlightTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.highlightText}}),t._v(" "),s("ColorInput",{attrs:{name:"highlightLink",label:t.$t("settings.links"),fallback:t.previewTheme.colors.highlightLink},model:{value:t.highlightLinkColorLocal,callback:function(e){t.highlightLinkColorLocal=e},expression:"highlightLinkColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.highlightLink}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.popover")))]),t._v(" "),s("ColorInput",{attrs:{name:"popover",label:t.$t("settings.background"),fallback:t.previewTheme.colors.popover},model:{value:t.popoverColorLocal,callback:function(e){t.popoverColorLocal=e},expression:"popoverColorLocal"}}),t._v(" "),s("OpacityInput",{attrs:{name:"popoverOpacity",fallback:t.previewTheme.opacity.popover,disabled:"transparent"===t.popoverOpacityLocal},model:{value:t.popoverOpacityLocal,callback:function(e){t.popoverOpacityLocal=e},expression:"popoverOpacityLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"popoverText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.popoverText},model:{value:t.popoverTextColorLocal,callback:function(e){t.popoverTextColorLocal=e},expression:"popoverTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.popoverText}}),t._v(" "),s("ColorInput",{attrs:{name:"popoverLink",label:t.$t("settings.links"),fallback:t.previewTheme.colors.popoverLink},model:{value:t.popoverLinkColorLocal,callback:function(e){t.popoverLinkColorLocal=e},expression:"popoverLinkColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.popoverLink}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.selectedPost")))]),t._v(" "),s("ColorInput",{attrs:{name:"selectedPost",label:t.$t("settings.background"),fallback:t.previewTheme.colors.selectedPost},model:{value:t.selectedPostColorLocal,callback:function(e){t.selectedPostColorLocal=e},expression:"selectedPostColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"selectedPostText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.selectedPostText},model:{value:t.selectedPostTextColorLocal,callback:function(e){t.selectedPostTextColorLocal=e},expression:"selectedPostTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.selectedPostText}}),t._v(" "),s("ColorInput",{attrs:{name:"selectedPostLink",label:t.$t("settings.links"),fallback:t.previewTheme.colors.selectedPostLink},model:{value:t.selectedPostLinkColorLocal,callback:function(e){t.selectedPostLinkColorLocal=e},expression:"selectedPostLinkColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.selectedPostLink}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.selectedMenu")))]),t._v(" "),s("ColorInput",{attrs:{name:"selectedMenu",label:t.$t("settings.background"),fallback:t.previewTheme.colors.selectedMenu},model:{value:t.selectedMenuColorLocal,callback:function(e){t.selectedMenuColorLocal=e},expression:"selectedMenuColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"selectedMenuText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.selectedMenuText},model:{value:t.selectedMenuTextColorLocal,callback:function(e){t.selectedMenuTextColorLocal=e},expression:"selectedMenuTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.selectedMenuText}}),t._v(" "),s("ColorInput",{attrs:{name:"selectedMenuLink",label:t.$t("settings.links"),fallback:t.previewTheme.colors.selectedMenuLink},model:{value:t.selectedMenuLinkColorLocal,callback:function(e){t.selectedMenuLinkColorLocal=e},expression:"selectedMenuLinkColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.selectedMenuLink}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("chats.chats")))]),t._v(" "),s("ColorInput",{attrs:{name:"chatBgColor",fallback:t.previewTheme.colors.bg||1,label:t.$t("settings.background")},model:{value:t.chatBgColorLocal,callback:function(e){t.chatBgColorLocal=e},expression:"chatBgColorLocal"}}),t._v(" "),s("h5",[t._v(t._s(t.$t("settings.style.advanced_colors.chat.incoming")))]),t._v(" "),s("ColorInput",{attrs:{name:"chatMessageIncomingBgColor",fallback:t.previewTheme.colors.bg||1,label:t.$t("settings.background")},model:{value:t.chatMessageIncomingBgColorLocal,callback:function(e){t.chatMessageIncomingBgColorLocal=e},expression:"chatMessageIncomingBgColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"chatMessageIncomingTextColor",fallback:t.previewTheme.colors.text||1,label:t.$t("settings.text")},model:{value:t.chatMessageIncomingTextColorLocal,callback:function(e){t.chatMessageIncomingTextColorLocal=e},expression:"chatMessageIncomingTextColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"chatMessageIncomingLinkColor",fallback:t.previewTheme.colors.link||1,label:t.$t("settings.links")},model:{value:t.chatMessageIncomingLinkColorLocal,callback:function(e){t.chatMessageIncomingLinkColorLocal=e},expression:"chatMessageIncomingLinkColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"chatMessageIncomingBorderLinkColor",fallback:t.previewTheme.colors.fg||1,label:t.$t("settings.style.advanced_colors.chat.border")},model:{value:t.chatMessageIncomingBorderColorLocal,callback:function(e){t.chatMessageIncomingBorderColorLocal=e},expression:"chatMessageIncomingBorderColorLocal"}}),t._v(" "),s("h5",[t._v(t._s(t.$t("settings.style.advanced_colors.chat.outgoing")))]),t._v(" "),s("ColorInput",{attrs:{name:"chatMessageOutgoingBgColor",fallback:t.previewTheme.colors.bg||1,label:t.$t("settings.background")},model:{value:t.chatMessageOutgoingBgColorLocal,callback:function(e){t.chatMessageOutgoingBgColorLocal=e},expression:"chatMessageOutgoingBgColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"chatMessageOutgoingTextColor",fallback:t.previewTheme.colors.text||1,label:t.$t("settings.text")},model:{value:t.chatMessageOutgoingTextColorLocal,callback:function(e){t.chatMessageOutgoingTextColorLocal=e},expression:"chatMessageOutgoingTextColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"chatMessageOutgoingLinkColor",fallback:t.previewTheme.colors.link||1,label:t.$t("settings.links")},model:{value:t.chatMessageOutgoingLinkColorLocal,callback:function(e){t.chatMessageOutgoingLinkColorLocal=e},expression:"chatMessageOutgoingLinkColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"chatMessageOutgoingBorderLinkColor",fallback:t.previewTheme.colors.bg||1,label:t.$t("settings.style.advanced_colors.chat.border")},model:{value:t.chatMessageOutgoingBorderColorLocal,callback:function(e){t.chatMessageOutgoingBorderColorLocal=e},expression:"chatMessageOutgoingBorderColorLocal"}})],1)]),t._v(" "),s("div",{staticClass:"radius-container",attrs:{label:t.$t("settings.style.radii._tab_label")}},[s("div",{staticClass:"tab-header"},[s("p",[t._v(t._s(t.$t("settings.radii_help")))]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.clearRoundness}},[t._v("\n "+t._s(t.$t("settings.style.switcher.clear_all"))+"\n ")])]),t._v(" "),s("RangeInput",{attrs:{name:"btnRadius",label:t.$t("settings.btnRadius"),fallback:t.previewTheme.radii.btn,max:"16","hard-min":"0"},model:{value:t.btnRadiusLocal,callback:function(e){t.btnRadiusLocal=e},expression:"btnRadiusLocal"}}),t._v(" "),s("RangeInput",{attrs:{name:"inputRadius",label:t.$t("settings.inputRadius"),fallback:t.previewTheme.radii.input,max:"9","hard-min":"0"},model:{value:t.inputRadiusLocal,callback:function(e){t.inputRadiusLocal=e},expression:"inputRadiusLocal"}}),t._v(" "),s("RangeInput",{attrs:{name:"checkboxRadius",label:t.$t("settings.checkboxRadius"),fallback:t.previewTheme.radii.checkbox,max:"16","hard-min":"0"},model:{value:t.checkboxRadiusLocal,callback:function(e){t.checkboxRadiusLocal=e},expression:"checkboxRadiusLocal"}}),t._v(" "),s("RangeInput",{attrs:{name:"panelRadius",label:t.$t("settings.panelRadius"),fallback:t.previewTheme.radii.panel,max:"50","hard-min":"0"},model:{value:t.panelRadiusLocal,callback:function(e){t.panelRadiusLocal=e},expression:"panelRadiusLocal"}}),t._v(" "),s("RangeInput",{attrs:{name:"avatarRadius",label:t.$t("settings.avatarRadius"),fallback:t.previewTheme.radii.avatar,max:"28","hard-min":"0"},model:{value:t.avatarRadiusLocal,callback:function(e){t.avatarRadiusLocal=e},expression:"avatarRadiusLocal"}}),t._v(" "),s("RangeInput",{attrs:{name:"avatarAltRadius",label:t.$t("settings.avatarAltRadius"),fallback:t.previewTheme.radii.avatarAlt,max:"28","hard-min":"0"},model:{value:t.avatarAltRadiusLocal,callback:function(e){t.avatarAltRadiusLocal=e},expression:"avatarAltRadiusLocal"}}),t._v(" "),s("RangeInput",{attrs:{name:"attachmentRadius",label:t.$t("settings.attachmentRadius"),fallback:t.previewTheme.radii.attachment,max:"50","hard-min":"0"},model:{value:t.attachmentRadiusLocal,callback:function(e){t.attachmentRadiusLocal=e},expression:"attachmentRadiusLocal"}}),t._v(" "),s("RangeInput",{attrs:{name:"tooltipRadius",label:t.$t("settings.tooltipRadius"),fallback:t.previewTheme.radii.tooltip,max:"50","hard-min":"0"},model:{value:t.tooltipRadiusLocal,callback:function(e){t.tooltipRadiusLocal=e},expression:"tooltipRadiusLocal"}}),t._v(" "),s("RangeInput",{attrs:{name:"chatMessageRadius",label:t.$t("settings.chatMessageRadius"),fallback:t.previewTheme.radii.chatMessage||2,max:"50","hard-min":"0"},model:{value:t.chatMessageRadiusLocal,callback:function(e){t.chatMessageRadiusLocal=e},expression:"chatMessageRadiusLocal"}})],1),t._v(" "),s("div",{staticClass:"shadow-container",attrs:{label:t.$t("settings.style.shadows._tab_label")}},[s("div",{staticClass:"tab-header shadow-selector"},[s("div",{staticClass:"select-container"},[t._v("\n "+t._s(t.$t("settings.style.shadows.component"))+"\n "),s("label",{staticClass:"select",attrs:{for:"shadow-switcher"}},[s("select",{directives:[{name:"model",rawName:"v-model",value:t.shadowSelected,expression:"shadowSelected"}],staticClass:"shadow-switcher",attrs:{id:"shadow-switcher"},on:{change:function(e){var s=Array.prototype.filter.call(e.target.options,function(t){return t.selected}).map(function(t){return"_value"in t?t._value:t.value});t.shadowSelected=e.target.multiple?s:s[0]}}},t._l(t.shadowsAvailable,function(e){return s("option",{key:e,domProps:{value:e}},[t._v("\n "+t._s(t.$t("settings.style.shadows.components."+e))+"\n ")])}),0),t._v(" "),s("i",{staticClass:"icon-down-open"})])]),t._v(" "),s("div",{staticClass:"override"},[s("label",{staticClass:"label",attrs:{for:"override"}},[t._v("\n "+t._s(t.$t("settings.style.shadows.override"))+"\n ")]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.currentShadowOverriden,expression:"currentShadowOverriden"}],staticClass:"input-override",attrs:{id:"override",name:"override",type:"checkbox"},domProps:{checked:Array.isArray(t.currentShadowOverriden)?t._i(t.currentShadowOverriden,null)>-1:t.currentShadowOverriden},on:{change:function(e){var s=t.currentShadowOverriden,a=e.target,n=!!a.checked;if(Array.isArray(s)){var o=t._i(s,null);a.checked?o<0&&(t.currentShadowOverriden=s.concat([null])):o>-1&&(t.currentShadowOverriden=s.slice(0,o).concat(s.slice(o+1)))}else t.currentShadowOverriden=n}}}),t._v(" "),s("label",{staticClass:"checkbox-label",attrs:{for:"override"}})]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.clearShadows}},[t._v("\n "+t._s(t.$t("settings.style.switcher.clear_all"))+"\n ")])]),t._v(" "),s("ShadowControl",{attrs:{ready:!!t.currentShadowFallback,fallback:t.currentShadowFallback},model:{value:t.currentShadow,callback:function(e){t.currentShadow=e},expression:"currentShadow"}}),t._v(" "),"avatar"===t.shadowSelected||"avatarStatus"===t.shadowSelected?s("div",[s("i18n",{attrs:{path:"settings.style.shadows.filter_hint.always_drop_shadow",tag:"p"}},[s("code",[t._v("filter: drop-shadow()")])]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.style.shadows.filter_hint.avatar_inset")))]),t._v(" "),s("i18n",{attrs:{path:"settings.style.shadows.filter_hint.drop_shadow_syntax",tag:"p"}},[s("code",[t._v("drop-shadow")]),t._v(" "),s("code",[t._v("spread-radius")]),t._v(" "),s("code",[t._v("inset")])]),t._v(" "),s("i18n",{attrs:{path:"settings.style.shadows.filter_hint.inset_classic",tag:"p"}},[s("code",[t._v("box-shadow")])]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.style.shadows.filter_hint.spread_zero")))])],1):t._e()],1),t._v(" "),s("div",{staticClass:"fonts-container",attrs:{label:t.$t("settings.style.fonts._tab_label")}},[s("div",{staticClass:"tab-header"},[s("p",[t._v(t._s(t.$t("settings.style.fonts.help")))]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.clearFonts}},[t._v("\n "+t._s(t.$t("settings.style.switcher.clear_all"))+"\n ")])]),t._v(" "),s("FontControl",{attrs:{name:"ui",label:t.$t("settings.style.fonts.components.interface"),fallback:t.previewTheme.fonts.interface,"no-inherit":"1"},model:{value:t.fontsLocal.interface,callback:function(e){t.$set(t.fontsLocal,"interface",e)},expression:"fontsLocal.interface"}}),t._v(" "),s("FontControl",{attrs:{name:"input",label:t.$t("settings.style.fonts.components.input"),fallback:t.previewTheme.fonts.input},model:{value:t.fontsLocal.input,callback:function(e){t.$set(t.fontsLocal,"input",e)},expression:"fontsLocal.input"}}),t._v(" "),s("FontControl",{attrs:{name:"post",label:t.$t("settings.style.fonts.components.post"),fallback:t.previewTheme.fonts.post},model:{value:t.fontsLocal.post,callback:function(e){t.$set(t.fontsLocal,"post",e)},expression:"fontsLocal.post"}}),t._v(" "),s("FontControl",{attrs:{name:"postCode",label:t.$t("settings.style.fonts.components.postCode"),fallback:t.previewTheme.fonts.postCode},model:{value:t.fontsLocal.postCode,callback:function(e){t.$set(t.fontsLocal,"postCode",e)},expression:"fontsLocal.postCode"}})],1)])],1),t._v(" "),s("div",{staticClass:"apply-container"},[s("button",{staticClass:"btn submit",attrs:{disabled:!t.themeValid},on:{click:t.setCustomTheme}},[t._v("\n "+t._s(t.$t("general.apply"))+"\n ")]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.clearAll}},[t._v("\n "+t._s(t.$t("settings.style.switcher.reset"))+"\n ")])])],1)},[],!1,Fe,null,null).exports,Ue={components:{TabSwitcher:a.a,DataImportExportTab:m,MutesAndBlocksTab:nt,NotificationsTab:it,FilteringTab:ft,SecurityTab:Et,ProfileTab:Qt,GeneralTab:ae,VersionTab:oe,ThemeTab:Me},computed:{isLoggedIn:function(){return!!this.$store.state.users.currentUser},open:function(){return"hidden"!==this.$store.state.interface.settingsModalState}},methods:{onOpen:function(){var t=this.$store.state.interface.settingsModalTargetTab;if(t){var e=this.$refs.tabSwitcher.$slots.default.findIndex(function(e){return e.data&&e.data.attrs["data-tab-name"]===t});e>=0&&this.$refs.tabSwitcher.setTab(e)}this.$store.dispatch("clearSettingsModalTargetTab")}},mounted:function(){this.onOpen()},watch:{open:function(t){t&&this.onOpen()}}};var Ve=function(t){s(591)},Ae=Object(o.a)(Ue,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("tab-switcher",{ref:"tabSwitcher",staticClass:"settings_tab-switcher",attrs:{"side-tab-bar":!0,"scrollable-tabs":!0}},[s("div",{attrs:{label:t.$t("settings.general"),icon:"wrench","data-tab-name":"general"}},[s("GeneralTab")],1),t._v(" "),t.isLoggedIn?s("div",{attrs:{label:t.$t("settings.profile_tab"),icon:"user","data-tab-name":"profile"}},[s("ProfileTab")],1):t._e(),t._v(" "),t.isLoggedIn?s("div",{attrs:{label:t.$t("settings.security_tab"),icon:"lock","data-tab-name":"security"}},[s("SecurityTab")],1):t._e(),t._v(" "),s("div",{attrs:{label:t.$t("settings.filtering"),icon:"filter","data-tab-name":"filtering"}},[s("FilteringTab")],1),t._v(" "),s("div",{attrs:{label:t.$t("settings.theme"),icon:"brush","data-tab-name":"theme"}},[s("ThemeTab")],1),t._v(" "),t.isLoggedIn?s("div",{attrs:{label:t.$t("settings.notifications"),icon:"bell-ringing-o","data-tab-name":"notifications"}},[s("NotificationsTab")],1):t._e(),t._v(" "),t.isLoggedIn?s("div",{attrs:{label:t.$t("settings.data_import_export_tab"),icon:"download","data-tab-name":"dataImportExport"}},[s("DataImportExportTab")],1):t._e(),t._v(" "),t.isLoggedIn?s("div",{attrs:{label:t.$t("settings.mutes_and_blocks"),fullHeight:!0,icon:"eye-off","data-tab-name":"mutesAndBlocks"}},[s("MutesAndBlocksTab")],1):t._e(),t._v(" "),s("div",{attrs:{label:t.$t("settings.version.title"),icon:"info-circled","data-tab-name":"version"}},[s("VersionTab")],1)])},[],!1,Ve,null,null);e.default=Ae.exports}}]); -//# sourceMappingURL=2.c92f4803ff24726cea58.js.map \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{591:function(t,e,s){var a=s(592);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("a45e17ec",a,!0,{})},592:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".settings_tab-switcher{height:100%}.settings_tab-switcher .setting-item{border-bottom:2px solid var(--fg,#182230);margin:1em 1em 1.4em;padding-bottom:1.4em}.settings_tab-switcher .setting-item>div{margin-bottom:.5em}.settings_tab-switcher .setting-item>div:last-child{margin-bottom:0}.settings_tab-switcher .setting-item:last-child{border-bottom:none;padding-bottom:0;margin-bottom:1em}.settings_tab-switcher .setting-item select{min-width:10em}.settings_tab-switcher .setting-item textarea{width:100%;max-width:100%;height:100px}.settings_tab-switcher .setting-item .unavailable,.settings_tab-switcher .setting-item .unavailable i{color:var(--cRed,red);color:red}.settings_tab-switcher .setting-item .number-input{max-width:6em}",""])},593:function(t,e,s){var a=s(594);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("5bed876c",a,!0,{})},594:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".importer-uploading{font-size:1.5em;margin:.25em}",""])},595:function(t,e,s){var a=s(596);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("432fc7c6",a,!0,{})},596:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".exporter-processing{font-size:1.5em;margin:.25em}",""])},597:function(t,e,s){var a=s(598);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("33ca0d90",a,!0,{})},598:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".mutes-and-blocks-tab{height:100%}.mutes-and-blocks-tab .usersearch-wrapper{padding:1em}.mutes-and-blocks-tab .bulk-actions{text-align:right;padding:0 1em;min-height:28px}.mutes-and-blocks-tab .bulk-action-button{width:10em}.mutes-and-blocks-tab .domain-mute-form{padding:1em;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.mutes-and-blocks-tab .domain-mute-button{-ms-flex-item-align:end;align-self:flex-end;margin-top:1em;width:10em}",""])},599:function(t,e,s){var a=s(600);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("3a9ec1bf",a,!0,{})},600:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".autosuggest{position:relative}.autosuggest-input{display:block;width:100%}.autosuggest-results{position:absolute;left:0;top:100%;right:0;max-height:400px;background-color:#121a24;background-color:var(--bg,#121a24);border-color:#222;border:1px solid var(--border,#222);border-radius:4px;border-radius:var(--inputRadius,4px);border-top-left-radius:0;border-top-right-radius:0;box-shadow:1px 1px 4px rgba(0,0,0,.6);box-shadow:var(--panelShadow);overflow-y:auto;z-index:1}",""])},601:function(t,e,s){var a=s(602);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("211aa67c",a,!0,{})},602:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".block-card-content-container{margin-top:.5em;text-align:right}.block-card-content-container button{width:10em}",""])},603:function(t,e,s){var a=s(604);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("7ea980e0",a,!0,{})},604:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".mute-card-content-container{margin-top:.5em;text-align:right}.mute-card-content-container button{width:10em}",""])},605:function(t,e,s){var a=s(606);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("39a942c3",a,!0,{})},606:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".domain-mute-card{-ms-flex:1 0;flex:1 0;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-align:center;align-items:center;padding:.6em 1em .6em 0}.domain-mute-card-domain{margin-right:1em;overflow:hidden;text-overflow:ellipsis}.domain-mute-card button{width:10em}.autosuggest-results .domain-mute-card{padding-left:1em}",""])},607:function(t,e,s){var a=s(608);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("3724291e",a,!0,{})},608:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".selectable-list-item-inner{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.selectable-list-item-inner>*{min-width:0}.selectable-list-item-selected-inner{background-color:#151e2a;background-color:var(--selectedMenu,#151e2a);color:var(--selectedMenuText,#b9b9ba);--faint:var(--selectedMenuFaintText,$fallback--faint);--faintLink:var(--selectedMenuFaintLink,$fallback--faint);--lightText:var(--selectedMenuLightText,$fallback--lightText);--icon:var(--selectedMenuIcon,$fallback--icon)}.selectable-list-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.6em 0;border-bottom:2px solid;border-bottom-color:#222;border-bottom-color:var(--border,#222)}.selectable-list-header-actions{-ms-flex:1;flex:1}.selectable-list-checkbox-wrapper{padding:0 10px;-ms-flex:none;flex:none}",""])},609:function(t,e,s){},613:function(t,e,s){var a=s(614);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("a588473e",a,!0,{})},614:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".mfa-settings .method-item,.mfa-settings .mfa-heading{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-align:baseline;align-items:baseline}.mfa-settings .warning{color:orange;color:var(--cOrange,orange)}.mfa-settings .setup-otp{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.mfa-settings .setup-otp .qr-code{-ms-flex:1;flex:1;padding-right:10px}.mfa-settings .setup-otp .verify{-ms-flex:1;flex:1}.mfa-settings .setup-otp .error{margin:4px 0 0}.mfa-settings .setup-otp .confirm-otp-actions button{width:15em;margin-top:5px}",""])},615:function(t,e,s){var a=s(616);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("4065bf15",a,!0,{})},616:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".mfa-backup-codes .warning{color:orange;color:var(--cOrange,orange)}.mfa-backup-codes .backup-codes{font-family:var(--postCodeFont,monospace)}",""])},618:function(t,e,s){var a=s(619);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("27925ae8",a,!0,{})},619:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".profile-tab .bio{margin:0}.profile-tab .visibility-tray{padding-top:5px}.profile-tab input[type=file]{padding:5px;height:auto}.profile-tab .banner-background-preview{max-width:100%;width:300px;position:relative}.profile-tab .banner-background-preview img{width:100%}.profile-tab .uploading{font-size:1.5em;margin:.25em}.profile-tab .name-changer{width:100%}.profile-tab .current-avatar-container{position:relative;width:150px;height:150px}.profile-tab .current-avatar{display:block;width:100%;height:100%;border-radius:4px;border-radius:var(--avatarRadius,4px)}.profile-tab .reset-button{position:absolute;top:.2em;right:.2em;border-radius:5px;border-radius:var(--tooltipRadius,5px);background-color:rgba(0,0,0,.6);opacity:.7;color:#fff;width:1.5em;height:1.5em;text-align:center;line-height:1.5em;font-size:1.5em;cursor:pointer}.profile-tab .reset-button:hover{opacity:1}.profile-tab .oauth-tokens{width:100%}.profile-tab .oauth-tokens th{text-align:left}.profile-tab .oauth-tokens .actions{text-align:right}.profile-tab-usersearch-wrapper{padding:1em}.profile-tab-bulk-actions{text-align:right;padding:0 1em;min-height:28px}.profile-tab-bulk-actions button{width:10em}.profile-tab-domain-mute-form{padding:1em;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.profile-tab-domain-mute-form button{-ms-flex-item-align:end;align-self:flex-end;margin-top:1em;width:10em}.profile-tab .setting-subitem{margin-left:1.75em}.profile-tab .profile-fields{display:-ms-flexbox;display:flex}.profile-tab .profile-fields>.emoji-input{-ms-flex:1 1 auto;flex:1 1 auto;margin:0 .2em .5em;min-width:0}.profile-tab .profile-fields>.icon-container{width:20px}.profile-tab .profile-fields>.icon-container>.icon-cancel{vertical-align:sub}",""])},620:function(t,e,s){var a=s(621);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("0dfd0b33",a,!0,{})},621:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".image-cropper-img-input{display:none}.image-cropper-image-container{position:relative}.image-cropper-image-container img{display:block;max-width:100%}.image-cropper-buttons-wrapper{margin-top:10px}.image-cropper-buttons-wrapper button{margin-top:5px}",""])},624:function(t,e,s){var a=s(625);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("4fafab12",a,!0,{})},625:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".theme-tab{padding-bottom:2em}.theme-tab .theme-warning{display:-ms-flexbox;display:flex;-ms-flex-align:baseline;align-items:baseline;margin-bottom:.5em}.theme-tab .theme-warning .buttons .btn{margin-bottom:.5em}.theme-tab .preset-switcher{margin-right:1em}.theme-tab .style-control{display:-ms-flexbox;display:flex;-ms-flex-align:baseline;align-items:baseline;margin-bottom:5px}.theme-tab .style-control .label{-ms-flex:1;flex:1}.theme-tab .style-control.disabled input,.theme-tab .style-control.disabled select{opacity:.5}.theme-tab .style-control .opt{margin:.5em}.theme-tab .style-control .color-input{-ms-flex:0 0 0px;flex:0 0 0}.theme-tab .style-control input,.theme-tab .style-control select{min-width:3em;margin:0;-ms-flex:0;flex:0}.theme-tab .style-control input[type=number],.theme-tab .style-control select[type=number]{min-width:5em}.theme-tab .style-control input[type=range],.theme-tab .style-control select[type=range]{-ms-flex:1;flex:1;min-width:3em;-ms-flex-item-align:start;align-self:flex-start}.theme-tab .reset-container{-ms-flex-wrap:wrap;flex-wrap:wrap}.theme-tab .apply-container,.theme-tab .color-container,.theme-tab .fonts-container,.theme-tab .radius-container,.theme-tab .reset-container{display:-ms-flexbox;display:flex}.theme-tab .fonts-container,.theme-tab .radius-container{-ms-flex-direction:column;flex-direction:column}.theme-tab .color-container{-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between}.theme-tab .color-container>h4{width:99%}.theme-tab .color-container,.theme-tab .fonts-container,.theme-tab .presets-container,.theme-tab .radius-container,.theme-tab .shadow-container{margin:1em 1em 0}.theme-tab .tab-header{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-align:baseline;align-items:baseline;width:100%;min-height:30px;margin-bottom:1em}.theme-tab .tab-header p{-ms-flex:1;flex:1;margin:0;margin-right:.5em}.theme-tab .tab-header-buttons{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.theme-tab .tab-header-buttons .btn{min-width:1px;-ms-flex:0 auto;flex:0 auto;padding:0 1em;margin-bottom:.5em}.theme-tab .shadow-selector .override{-ms-flex:1;flex:1;margin-left:.5em}.theme-tab .shadow-selector .select-container{margin-top:-4px;margin-bottom:-3px}.theme-tab .save-load,.theme-tab .save-load-options{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:baseline;align-items:baseline;-ms-flex-wrap:wrap;flex-wrap:wrap}.theme-tab .save-load-options .import-export,.theme-tab .save-load-options .presets,.theme-tab .save-load .import-export,.theme-tab .save-load .presets{margin-bottom:.5em}.theme-tab .save-load-options .import-export,.theme-tab .save-load .import-export{display:-ms-flexbox;display:flex}.theme-tab .save-load-options .override,.theme-tab .save-load .override{margin-left:.5em}.theme-tab .save-load-options{-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:.5em;-ms-flex-pack:center;justify-content:center}.theme-tab .save-load-options .keep-option{margin:0 .5em .5em;min-width:25%}.theme-tab .preview-container{border-top:1px dashed;border-bottom:1px dashed;border-color:#222;border-color:var(--border,#222);margin:1em 0;padding:1em;background:var(--body-background-image);background-size:cover;background-position:50% 50%}.theme-tab .preview-container .dummy .post{font-family:var(--postFont);display:-ms-flexbox;display:flex}.theme-tab .preview-container .dummy .post .content{-ms-flex:1;flex:1}.theme-tab .preview-container .dummy .post .content h4{margin-bottom:.25em}.theme-tab .preview-container .dummy .post .content .icons{margin-top:.5em;display:-ms-flexbox;display:flex}.theme-tab .preview-container .dummy .post .content .icons i{margin-right:1em}.theme-tab .preview-container .dummy .after-post{margin-top:1em;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.theme-tab .preview-container .dummy .avatar,.theme-tab .preview-container .dummy .avatar-alt{background:linear-gradient(135deg,#b8e1fc,#a9d2f3 10%,#90bae4 25%,#90bcea 37%,#90bff0 50%,#6ba8e5 51%,#a2daf5 83%,#bdf3fd);color:#000;font-family:sans-serif;text-align:center;margin-right:1em}.theme-tab .preview-container .dummy .avatar-alt{-ms-flex:0 auto;flex:0 auto;margin-left:28px;font-size:12px;min-width:20px;min-height:20px;line-height:20px;border-radius:10px;border-radius:var(--avatarAltRadius,10px)}.theme-tab .preview-container .dummy .avatar{-ms-flex:0 auto;flex:0 auto;width:48px;height:48px;font-size:14px;line-height:48px}.theme-tab .preview-container .dummy .actions{display:-ms-flexbox;display:flex;-ms-flex-align:baseline;align-items:baseline}.theme-tab .preview-container .dummy .actions .checkbox{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:baseline;align-items:baseline;margin-right:1em;-ms-flex:1;flex:1}.theme-tab .preview-container .dummy .separator{margin:1em;border-bottom:1px solid;border-color:#222;border-color:var(--border,#222)}.theme-tab .preview-container .dummy .panel-heading .alert,.theme-tab .preview-container .dummy .panel-heading .badge,.theme-tab .preview-container .dummy .panel-heading .btn,.theme-tab .preview-container .dummy .panel-heading .faint{margin-left:1em;white-space:nowrap}.theme-tab .preview-container .dummy .panel-heading .faint{text-overflow:ellipsis;min-width:2em;overflow-x:hidden}.theme-tab .preview-container .dummy .panel-heading .flex-spacer{-ms-flex:1;flex:1}.theme-tab .preview-container .dummy .btn{margin-left:0;padding:0 1em;min-width:3em;min-height:30px}.theme-tab .apply-container{-ms-flex-pack:center;justify-content:center}.theme-tab .color-item,.theme-tab .radius-item{min-width:20em;margin:5px 6px 0 0;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex:1 1 0px;flex:1 1 0}.theme-tab .color-item.wide,.theme-tab .radius-item.wide{min-width:60%}.theme-tab .color-item:not(.wide):nth-child(odd),.theme-tab .radius-item:not(.wide):nth-child(odd){margin-right:7px}.theme-tab .color-item .color,.theme-tab .color-item .opacity,.theme-tab .radius-item .color,.theme-tab .radius-item .opacity{display:-ms-flexbox;display:flex;-ms-flex-align:baseline;align-items:baseline}.theme-tab .radius-item{-ms-flex-preferred-size:auto;flex-basis:auto}.theme-tab .theme-color-cl,.theme-tab .theme-radius-rn{border:0;box-shadow:none;background:transparent;color:var(--faint,hsla(240,1%,73%,.5));-ms-flex-item-align:stretch;-ms-grid-row-align:stretch;align-self:stretch}.theme-tab .theme-color-cl,.theme-tab .theme-color-in,.theme-tab .theme-radius-in{margin-left:4px}.theme-tab .theme-radius-in{min-width:1em;max-width:7em;-ms-flex:1;flex:1}.theme-tab .theme-radius-lb{max-width:50em}.theme-tab .theme-preview-content{padding:20px}.theme-tab .apply-container .btn{min-height:28px;min-width:10em;padding:0 2em}.theme-tab .btn{margin-left:.25em;margin-right:.25em}",""])},626:function(t,e,s){var a=s(627);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("7e57f952",a,!0,{})},627:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,'.color-input,.color-input-field.input{display:-ms-inline-flexbox;display:inline-flex}.color-input-field.input{-ms-flex:0 0 0px;flex:0 0 0;max-width:9em;-ms-flex-align:stretch;align-items:stretch;padding:.2em 8px}.color-input-field.input input{background:none;color:#b9b9ba;color:var(--inputText,#b9b9ba);border:none;padding:0;margin:0}.color-input-field.input input.textColor{-ms-flex:1 0 3em;flex:1 0 3em;min-width:3em;padding:0}.color-input-field.input .computedIndicator,.color-input-field.input .transparentIndicator,.color-input-field.input input.nativeColor{-ms-flex:0 0 2em;flex:0 0 2em;min-width:2em;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;height:100%}.color-input-field.input .transparentIndicator{background-color:#f0f;position:relative}.color-input-field.input .transparentIndicator:after,.color-input-field.input .transparentIndicator:before{display:block;content:"";background-color:#000;position:absolute;height:50%;width:50%}.color-input-field.input .transparentIndicator:after{top:0;left:0}.color-input-field.input .transparentIndicator:before{bottom:0;right:0}.color-input .label{-ms-flex:1 1 auto;flex:1 1 auto}',""])},628:function(t,e,s){var a=s(629);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("6c632637",a,!0,{})},629:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".color-control input.text-input{max-width:7em;-ms-flex:1;flex:1}",""])},630:function(t,e,s){var a=s(631);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("d219da80",a,!0,{})},631:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".shadow-control{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:center;justify-content:center;margin-bottom:1em}.shadow-control .shadow-preview-container,.shadow-control .shadow-tweak{margin:5px 6px 0 0}.shadow-control .shadow-preview-container{-ms-flex:0;flex:0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.shadow-control .shadow-preview-container input[type=number]{width:5em;min-width:2em}.shadow-control .shadow-preview-container .x-shift-control,.shadow-control .shadow-preview-container .y-shift-control{display:-ms-flexbox;display:flex;-ms-flex:0;flex:0}.shadow-control .shadow-preview-container .x-shift-control[disabled=disabled] *,.shadow-control .shadow-preview-container .y-shift-control[disabled=disabled] *{opacity:.5}.shadow-control .shadow-preview-container .x-shift-control{-ms-flex-align:start;align-items:flex-start}.shadow-control .shadow-preview-container .x-shift-control .wrap,.shadow-control .shadow-preview-container input[type=range]{margin:0;width:15em;height:2em}.shadow-control .shadow-preview-container .y-shift-control{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:end;align-items:flex-end}.shadow-control .shadow-preview-container .y-shift-control .wrap{width:2em;height:15em}.shadow-control .shadow-preview-container .y-shift-control input[type=range]{transform-origin:1em 1em;transform:rotate(90deg)}.shadow-control .shadow-preview-container .preview-window{-ms-flex:1;flex:1;background-color:#999;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;background-image:linear-gradient(45deg,#666 25%,transparent 0),linear-gradient(-45deg,#666 25%,transparent 0),linear-gradient(45deg,transparent 75%,#666 0),linear-gradient(-45deg,transparent 75%,#666 0);background-size:20px 20px;background-position:0 0,0 10px,10px -10px,-10px 0;border-radius:4px;border-radius:var(--inputRadius,4px)}.shadow-control .shadow-preview-container .preview-window .preview-block{width:33%;height:33%;background-color:#121a24;background-color:var(--bg,#121a24);border-radius:10px;border-radius:var(--panelRadius,10px)}.shadow-control .shadow-tweak{-ms-flex:1;flex:1;min-width:280px}.shadow-control .shadow-tweak .id-control{-ms-flex-align:stretch;align-items:stretch}.shadow-control .shadow-tweak .id-control .btn,.shadow-control .shadow-tweak .id-control .select{min-width:1px;margin-right:5px}.shadow-control .shadow-tweak .id-control .btn{padding:0 .4em;margin:0 .1em}.shadow-control .shadow-tweak .id-control .select{-ms-flex:1;flex:1}.shadow-control .shadow-tweak .id-control .select select{-ms-flex-item-align:initial;-ms-grid-row-align:initial;align-self:auto}",""])},632:function(t,e,s){var a=s(633);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("d9c0acde",a,!0,{})},633:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".font-control input.custom-font{min-width:10em}.font-control.custom .select{border-top-right-radius:0;border-bottom-right-radius:0}.font-control.custom .custom-font{border-top-left-radius:0;border-bottom-left-radius:0}",""])},634:function(t,e,s){var a=s(635);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("b94bc120",a,!0,{})},635:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".contrast-ratio{display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end;margin-top:-4px;margin-bottom:5px}.contrast-ratio .label{margin-right:1em}.contrast-ratio .rating{display:inline-block;text-align:center}",""])},636:function(t,e,s){var a=s(637);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("66a4eaba",a,!0,{})},637:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".import-export-container{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:baseline;align-items:baseline;-ms-flex-pack:center;justify-content:center}",""])},638:function(t,e,s){var a=s(639);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("6fe23c76",a,!0,{})},639:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".preview-container{position:relative}.underlay-preview{position:absolute;top:0;bottom:0;left:10px;right:10px}",""])},641:function(t,e,s){"use strict";s.r(e);var a=s(141),n={props:{submitHandler:{type:Function,required:!0},submitButtonLabel:{type:String,default:function(){return this.$t("importer.submit")}},successMessage:{type:String,default:function(){return this.$t("importer.success")}},errorMessage:{type:String,default:function(){return this.$t("importer.error")}}},data:function(){return{file:null,error:!1,success:!1,submitting:!1}},methods:{change:function(){this.file=this.$refs.input.files[0]},submit:function(){var t=this;this.dismiss(),this.submitting=!0,this.submitHandler(this.file).then(function(){t.success=!0}).catch(function(){t.error=!0}).finally(function(){t.submitting=!1})},dismiss:function(){this.success=!1,this.error=!1}}},o=s(0);var i=function(t){s(593)},r=Object(o.a)(n,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"importer"},[s("form",[s("input",{ref:"input",attrs:{type:"file"},on:{change:t.change}})]),t._v(" "),t.submitting?s("i",{staticClass:"icon-spin4 animate-spin importer-uploading"}):s("button",{staticClass:"btn btn-default",on:{click:t.submit}},[t._v("\n "+t._s(t.submitButtonLabel)+"\n ")]),t._v(" "),t.success?s("div",[s("i",{staticClass:"icon-cross",on:{click:t.dismiss}}),t._v(" "),s("p",[t._v(t._s(t.successMessage))])]):t.error?s("div",[s("i",{staticClass:"icon-cross",on:{click:t.dismiss}}),t._v(" "),s("p",[t._v(t._s(t.errorMessage))])]):t._e()])},[],!1,i,null,null).exports,l={props:{getContent:{type:Function,required:!0},filename:{type:String,default:"export.csv"},exportButtonLabel:{type:String,default:function(){return this.$t("exporter.export")}},processingMessage:{type:String,default:function(){return this.$t("exporter.processing")}}},data:function(){return{processing:!1}},methods:{process:function(){var t=this;this.processing=!0,this.getContent().then(function(e){var s=document.createElement("a");s.setAttribute("href","data:text/plain;charset=utf-8,"+encodeURIComponent(e)),s.setAttribute("download",t.filename),s.style.display="none",document.body.appendChild(s),s.click(),document.body.removeChild(s),setTimeout(function(){t.processing=!1},2e3)})}}};var c=function(t){s(595)},u=Object(o.a)(l,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"exporter"},[t.processing?s("div",[s("i",{staticClass:"icon-spin4 animate-spin exporter-processing"}),t._v(" "),s("span",[t._v(t._s(t.processingMessage))])]):s("button",{staticClass:"btn btn-default",on:{click:t.process}},[t._v("\n "+t._s(t.exportButtonLabel)+"\n ")])])},[],!1,c,null,null).exports,d=s(54),p={data:function(){return{activeTab:"profile",newDomainToMute:""}},created:function(){this.$store.dispatch("fetchTokens")},components:{Importer:r,Exporter:u,Checkbox:d.a},computed:{user:function(){return this.$store.state.users.currentUser}},methods:{getFollowsContent:function(){return this.$store.state.api.backendInteractor.exportFriends({id:this.$store.state.users.currentUser.id}).then(this.generateExportableUsersContent)},getBlocksContent:function(){return this.$store.state.api.backendInteractor.fetchBlocks().then(this.generateExportableUsersContent)},importFollows:function(t){return this.$store.state.api.backendInteractor.importFollows({file:t}).then(function(t){if(!t)throw new Error("failed")})},importBlocks:function(t){return this.$store.state.api.backendInteractor.importBlocks({file:t}).then(function(t){if(!t)throw new Error("failed")})},generateExportableUsersContent:function(t){return t.map(function(t){return t&&t.is_local?t.screen_name+"@"+location.hostname:t.screen_name}).join("\n")}}},m=Object(o.a)(p,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{attrs:{label:t.$t("settings.data_import_export_tab")}},[s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.follow_import")))]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.import_followers_from_a_csv_file")))]),t._v(" "),s("Importer",{attrs:{"submit-handler":t.importFollows,"success-message":t.$t("settings.follows_imported"),"error-message":t.$t("settings.follow_import_error")}})],1),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.follow_export")))]),t._v(" "),s("Exporter",{attrs:{"get-content":t.getFollowsContent,filename:"friends.csv","export-button-label":t.$t("settings.follow_export_button")}})],1),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.block_import")))]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.import_blocks_from_a_csv_file")))]),t._v(" "),s("Importer",{attrs:{"submit-handler":t.importBlocks,"success-message":t.$t("settings.blocks_imported"),"error-message":t.$t("settings.block_import_error")}})],1),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.block_export")))]),t._v(" "),s("Exporter",{attrs:{"get-content":t.getBlocksContent,filename:"blocks.csv","export-button-label":t.$t("settings.block_export_button")}})],1)])},[],!1,null,null,null).exports,v=s(12),h=s.n(v),b=s(15),f=s.n(b),g=s(189),_=s.n(g),w={props:{query:{type:Function,required:!0},filter:{type:Function},placeholder:{type:String,default:"Search..."}},data:function(){return{term:"",timeout:null,results:[],resultsVisible:!1}},computed:{filtered:function(){return this.filter?this.filter(this.results):this.results}},watch:{term:function(t){this.fetchResults(t)}},methods:{fetchResults:function(t){var e=this;clearTimeout(this.timeout),this.timeout=setTimeout(function(){e.results=[],t&&e.query(t).then(function(t){e.results=t})},500)},onInputClick:function(){this.resultsVisible=!0},onClickOutside:function(){this.resultsVisible=!1}}};var C=function(t){s(599)},x=Object(o.a)(w,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{directives:[{name:"click-outside",rawName:"v-click-outside",value:t.onClickOutside,expression:"onClickOutside"}],staticClass:"autosuggest"},[s("input",{directives:[{name:"model",rawName:"v-model",value:t.term,expression:"term"}],staticClass:"autosuggest-input",attrs:{placeholder:t.placeholder},domProps:{value:t.term},on:{click:t.onInputClick,input:function(e){e.target.composing||(t.term=e.target.value)}}}),t._v(" "),t.resultsVisible&&t.filtered.length>0?s("div",{staticClass:"autosuggest-results"},[t._l(t.filtered,function(e){return t._t("default",null,{item:e})})],2):t._e()])},[],!1,C,null,null).exports,k=s(38),y={props:["userId"],data:function(){return{progress:!1}},computed:{user:function(){return this.$store.getters.findUser(this.userId)},relationship:function(){return this.$store.getters.relationship(this.userId)},blocked:function(){return this.relationship.blocking}},components:{BasicUserCard:k.a},methods:{unblockUser:function(){var t=this;this.progress=!0,this.$store.dispatch("unblockUser",this.user.id).then(function(){t.progress=!1})},blockUser:function(){var t=this;this.progress=!0,this.$store.dispatch("blockUser",this.user.id).then(function(){t.progress=!1})}}};var $=function(t){s(601)},L=Object(o.a)(y,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("basic-user-card",{attrs:{user:t.user}},[s("div",{staticClass:"block-card-content-container"},[t.blocked?s("button",{staticClass:"btn btn-default",attrs:{disabled:t.progress},on:{click:t.unblockUser}},[t.progress?[t._v("\n "+t._s(t.$t("user_card.unblock_progress"))+"\n ")]:[t._v("\n "+t._s(t.$t("user_card.unblock"))+"\n ")]],2):s("button",{staticClass:"btn btn-default",attrs:{disabled:t.progress},on:{click:t.blockUser}},[t.progress?[t._v("\n "+t._s(t.$t("user_card.block_progress"))+"\n ")]:[t._v("\n "+t._s(t.$t("user_card.block"))+"\n ")]],2)])])},[],!1,$,null,null).exports,T={props:["userId"],data:function(){return{progress:!1}},computed:{user:function(){return this.$store.getters.findUser(this.userId)},relationship:function(){return this.$store.getters.relationship(this.userId)},muted:function(){return this.relationship.muting}},components:{BasicUserCard:k.a},methods:{unmuteUser:function(){var t=this;this.progress=!0,this.$store.dispatch("unmuteUser",this.userId).then(function(){t.progress=!1})},muteUser:function(){var t=this;this.progress=!0,this.$store.dispatch("muteUser",this.userId).then(function(){t.progress=!1})}}};var O=function(t){s(603)},P=Object(o.a)(T,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("basic-user-card",{attrs:{user:t.user}},[s("div",{staticClass:"mute-card-content-container"},[t.muted?s("button",{staticClass:"btn btn-default",attrs:{disabled:t.progress},on:{click:t.unmuteUser}},[t.progress?[t._v("\n "+t._s(t.$t("user_card.unmute_progress"))+"\n ")]:[t._v("\n "+t._s(t.$t("user_card.unmute"))+"\n ")]],2):s("button",{staticClass:"btn btn-default",attrs:{disabled:t.progress},on:{click:t.muteUser}},[t.progress?[t._v("\n "+t._s(t.$t("user_card.mute_progress"))+"\n ")]:[t._v("\n "+t._s(t.$t("user_card.mute"))+"\n ")]],2)])])},[],!1,O,null,null).exports,S=s(78),I={props:["domain"],components:{ProgressButton:S.a},computed:{user:function(){return this.$store.state.users.currentUser},muted:function(){return this.user.domainMutes.includes(this.domain)}},methods:{unmuteDomain:function(){return this.$store.dispatch("unmuteDomain",this.domain)},muteDomain:function(){return this.$store.dispatch("muteDomain",this.domain)}}};var j=function(t){s(605)},E=Object(o.a)(I,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"domain-mute-card"},[s("div",{staticClass:"domain-mute-card-domain"},[t._v("\n "+t._s(t.domain)+"\n ")]),t._v(" "),t.muted?s("ProgressButton",{staticClass:"btn btn-default",attrs:{click:t.unmuteDomain}},[t._v("\n "+t._s(t.$t("domain_mute_card.unmute"))+"\n "),s("template",{slot:"progress"},[t._v("\n "+t._s(t.$t("domain_mute_card.unmute_progress"))+"\n ")])],2):s("ProgressButton",{staticClass:"btn btn-default",attrs:{click:t.muteDomain}},[t._v("\n "+t._s(t.$t("domain_mute_card.mute"))+"\n "),s("template",{slot:"progress"},[t._v("\n "+t._s(t.$t("domain_mute_card.mute_progress"))+"\n ")])],2)],1)},[],!1,j,null,null).exports,R={components:{List:s(52).a,Checkbox:d.a},props:{items:{type:Array,default:function(){return[]}},getKey:{type:Function,default:function(t){return t.id}}},data:function(){return{selected:[]}},computed:{allKeys:function(){return this.items.map(this.getKey)},filteredSelected:function(){var t=this;return this.allKeys.filter(function(e){return-1!==t.selected.indexOf(e)})},allSelected:function(){return this.filteredSelected.length===this.items.length},noneSelected:function(){return 0===this.filteredSelected.length},someSelected:function(){return!this.allSelected&&!this.noneSelected}},methods:{isSelected:function(t){return-1!==this.filteredSelected.indexOf(this.getKey(t))},toggle:function(t,e){var s=this.getKey(e);t!==this.isSelected(s)&&(t?this.selected.push(s):this.selected.splice(this.selected.indexOf(s),1))},toggleAll:function(t){this.selected=t?this.allKeys.slice(0):[]}}};var B=function(t){s(607)},F=Object(o.a)(R,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"selectable-list"},[t.items.length>0?s("div",{staticClass:"selectable-list-header"},[s("div",{staticClass:"selectable-list-checkbox-wrapper"},[s("Checkbox",{attrs:{checked:t.allSelected,indeterminate:t.someSelected},on:{change:t.toggleAll}},[t._v("\n "+t._s(t.$t("selectable_list.select_all"))+"\n ")])],1),t._v(" "),s("div",{staticClass:"selectable-list-header-actions"},[t._t("header",null,{selected:t.filteredSelected})],2)]):t._e(),t._v(" "),s("List",{attrs:{items:t.items,"get-key":t.getKey},scopedSlots:t._u([{key:"item",fn:function(e){var a=e.item;return[s("div",{staticClass:"selectable-list-item-inner",class:{"selectable-list-item-selected-inner":t.isSelected(a)}},[s("div",{staticClass:"selectable-list-checkbox-wrapper"},[s("Checkbox",{attrs:{checked:t.isSelected(a)},on:{change:function(e){return t.toggle(e,a)}}})],1),t._v(" "),t._t("item",null,{item:a})],2)]}}],null,!0)},[t._v(" "),s("template",{slot:"empty"},[t._t("empty")],2)],2)],1)},[],!1,B,null,null).exports,M=s(190),U=s.n(M),V=s(7),A=s.n(V),D=s(1),N=s.n(D),W=s(10),z=s.n(W),q=s(6),G=s.n(q),H=s(191),K=s.n(H),J=s(192);s(609);function Q(t,e){var s=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),s.push.apply(s,a)}return s}function X(t){for(var e=1;e0?s("ProgressButton",{staticClass:"btn btn-default bulk-action-button",attrs:{click:function(){return t.blockUsers(a)}}},[t._v("\n "+t._s(t.$t("user_card.block"))+"\n "),s("template",{slot:"progress"},[t._v("\n "+t._s(t.$t("user_card.block_progress"))+"\n ")])],2):t._e(),t._v(" "),a.length>0?s("ProgressButton",{staticClass:"btn btn-default",attrs:{click:function(){return t.unblockUsers(a)}}},[t._v("\n "+t._s(t.$t("user_card.unblock"))+"\n "),s("template",{slot:"progress"},[t._v("\n "+t._s(t.$t("user_card.unblock_progress"))+"\n ")])],2):t._e()],1)]}},{key:"item",fn:function(t){var e=t.item;return[s("BlockCard",{attrs:{"user-id":e}})]}}])},[t._v(" "),t._v(" "),s("template",{slot:"empty"},[t._v("\n "+t._s(t.$t("settings.no_blocks"))+"\n ")])],2)],1),t._v(" "),s("div",{attrs:{label:t.$t("settings.mutes_tab")}},[s("tab-switcher",[s("div",{attrs:{label:"Users"}},[s("div",{staticClass:"usersearch-wrapper"},[s("Autosuggest",{attrs:{filter:t.filterUnMutedUsers,query:t.queryUserIds,placeholder:t.$t("settings.search_user_to_mute")},scopedSlots:t._u([{key:"default",fn:function(t){return s("MuteCard",{attrs:{"user-id":t.item}})}}])})],1),t._v(" "),s("MuteList",{attrs:{refresh:!0,"get-key":function(t){return t}},scopedSlots:t._u([{key:"header",fn:function(e){var a=e.selected;return[s("div",{staticClass:"bulk-actions"},[a.length>0?s("ProgressButton",{staticClass:"btn btn-default",attrs:{click:function(){return t.muteUsers(a)}}},[t._v("\n "+t._s(t.$t("user_card.mute"))+"\n "),s("template",{slot:"progress"},[t._v("\n "+t._s(t.$t("user_card.mute_progress"))+"\n ")])],2):t._e(),t._v(" "),a.length>0?s("ProgressButton",{staticClass:"btn btn-default",attrs:{click:function(){return t.unmuteUsers(a)}}},[t._v("\n "+t._s(t.$t("user_card.unmute"))+"\n "),s("template",{slot:"progress"},[t._v("\n "+t._s(t.$t("user_card.unmute_progress"))+"\n ")])],2):t._e()],1)]}},{key:"item",fn:function(t){var e=t.item;return[s("MuteCard",{attrs:{"user-id":e}})]}}])},[t._v(" "),t._v(" "),s("template",{slot:"empty"},[t._v("\n "+t._s(t.$t("settings.no_mutes"))+"\n ")])],2)],1),t._v(" "),s("div",{attrs:{label:t.$t("settings.domain_mutes")}},[s("div",{staticClass:"domain-mute-form"},[s("Autosuggest",{attrs:{filter:t.filterUnMutedDomains,query:t.queryKnownDomains,placeholder:t.$t("settings.type_domains_to_mute")},scopedSlots:t._u([{key:"default",fn:function(t){return s("DomainMuteCard",{attrs:{domain:t.item}})}}])})],1),t._v(" "),s("DomainMuteList",{attrs:{refresh:!0,"get-key":function(t){return t}},scopedSlots:t._u([{key:"header",fn:function(e){var a=e.selected;return[s("div",{staticClass:"bulk-actions"},[a.length>0?s("ProgressButton",{staticClass:"btn btn-default",attrs:{click:function(){return t.unmuteDomains(a)}}},[t._v("\n "+t._s(t.$t("domain_mute_card.unmute"))+"\n "),s("template",{slot:"progress"},[t._v("\n "+t._s(t.$t("domain_mute_card.unmute_progress"))+"\n ")])],2):t._e()],1)]}},{key:"item",fn:function(t){var e=t.item;return[s("DomainMuteCard",{attrs:{domain:e}})]}}])},[t._v(" "),t._v(" "),s("template",{slot:"empty"},[t._v("\n "+t._s(t.$t("settings.no_mutes"))+"\n ")])],2)],1)])],1)])},[],!1,at,null,null).exports,ot={data:function(){return{activeTab:"profile",notificationSettings:this.$store.state.users.currentUser.notification_settings,newDomainToMute:""}},components:{Checkbox:d.a},computed:{user:function(){return this.$store.state.users.currentUser}},methods:{updateNotificationSettings:function(){this.$store.state.api.backendInteractor.updateNotificationSettings({settings:this.notificationSettings})}}},it=Object(o.a)(ot,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{attrs:{label:t.$t("settings.notifications")}},[s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.notification_setting_filters")))]),t._v(" "),s("p",[s("Checkbox",{model:{value:t.notificationSettings.block_from_strangers,callback:function(e){t.$set(t.notificationSettings,"block_from_strangers",e)},expression:"notificationSettings.block_from_strangers"}},[t._v("\n "+t._s(t.$t("settings.notification_setting_block_from_strangers"))+"\n ")])],1)]),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.notification_setting_privacy")))]),t._v(" "),s("p",[s("Checkbox",{model:{value:t.notificationSettings.hide_notification_contents,callback:function(e){t.$set(t.notificationSettings,"hide_notification_contents",e)},expression:"notificationSettings.hide_notification_contents"}},[t._v("\n "+t._s(t.$t("settings.notification_setting_hide_notification_contents"))+"\n ")])],1)]),t._v(" "),s("div",{staticClass:"setting-item"},[s("p",[t._v(t._s(t.$t("settings.notification_mutes")))]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.notification_blocks")))]),t._v(" "),s("button",{staticClass:"btn btn-default",on:{click:t.updateNotificationSettings}},[t._v("\n "+t._s(t.$t("general.submit"))+"\n ")])])])},[],!1,null,null,null).exports,rt=s(610),lt=s.n(rt),ct=s(37),ut=s.n(ct),dt=s(95);function pt(t,e){var s=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),s.push.apply(s,a)}return s}function mt(t){for(var e=1;e0})})}}}),watch:{notificationVisibility:{handler:function(t){this.$store.dispatch("setOption",{name:"notificationVisibility",value:this.$store.getters.mergedConfig.notificationVisibility})},deep:!0},replyVisibility:function(){this.$store.dispatch("queueFlushAll")}}},ft=Object(o.a)(bt,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{attrs:{label:t.$t("settings.filtering")}},[s("div",{staticClass:"setting-item"},[s("div",{staticClass:"select-multiple"},[s("span",{staticClass:"label"},[t._v(t._s(t.$t("settings.notification_visibility")))]),t._v(" "),s("ul",{staticClass:"option-list"},[s("li",[s("Checkbox",{model:{value:t.notificationVisibility.likes,callback:function(e){t.$set(t.notificationVisibility,"likes",e)},expression:"notificationVisibility.likes"}},[t._v("\n "+t._s(t.$t("settings.notification_visibility_likes"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.notificationVisibility.repeats,callback:function(e){t.$set(t.notificationVisibility,"repeats",e)},expression:"notificationVisibility.repeats"}},[t._v("\n "+t._s(t.$t("settings.notification_visibility_repeats"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.notificationVisibility.follows,callback:function(e){t.$set(t.notificationVisibility,"follows",e)},expression:"notificationVisibility.follows"}},[t._v("\n "+t._s(t.$t("settings.notification_visibility_follows"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.notificationVisibility.mentions,callback:function(e){t.$set(t.notificationVisibility,"mentions",e)},expression:"notificationVisibility.mentions"}},[t._v("\n "+t._s(t.$t("settings.notification_visibility_mentions"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.notificationVisibility.moves,callback:function(e){t.$set(t.notificationVisibility,"moves",e)},expression:"notificationVisibility.moves"}},[t._v("\n "+t._s(t.$t("settings.notification_visibility_moves"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.notificationVisibility.emojiReactions,callback:function(e){t.$set(t.notificationVisibility,"emojiReactions",e)},expression:"notificationVisibility.emojiReactions"}},[t._v("\n "+t._s(t.$t("settings.notification_visibility_emoji_reactions"))+"\n ")])],1)])]),t._v(" "),s("div",[t._v("\n "+t._s(t.$t("settings.replies_in_timeline"))+"\n "),s("label",{staticClass:"select",attrs:{for:"replyVisibility"}},[s("select",{directives:[{name:"model",rawName:"v-model",value:t.replyVisibility,expression:"replyVisibility"}],attrs:{id:"replyVisibility"},on:{change:function(e){var s=Array.prototype.filter.call(e.target.options,function(t){return t.selected}).map(function(t){return"_value"in t?t._value:t.value});t.replyVisibility=e.target.multiple?s:s[0]}}},[s("option",{attrs:{value:"all",selected:""}},[t._v(t._s(t.$t("settings.reply_visibility_all")))]),t._v(" "),s("option",{attrs:{value:"following"}},[t._v(t._s(t.$t("settings.reply_visibility_following")))]),t._v(" "),s("option",{attrs:{value:"self"}},[t._v(t._s(t.$t("settings.reply_visibility_self")))])]),t._v(" "),s("i",{staticClass:"icon-down-open"})])]),t._v(" "),s("div",[s("Checkbox",{model:{value:t.hidePostStats,callback:function(e){t.hidePostStats=e},expression:"hidePostStats"}},[t._v("\n "+t._s(t.$t("settings.hide_post_stats"))+" "+t._s(t.$t("settings.instance_default",{value:t.hidePostStatsLocalizedValue}))+"\n ")])],1),t._v(" "),s("div",[s("Checkbox",{model:{value:t.hideUserStats,callback:function(e){t.hideUserStats=e},expression:"hideUserStats"}},[t._v("\n "+t._s(t.$t("settings.hide_user_stats"))+" "+t._s(t.$t("settings.instance_default",{value:t.hideUserStatsLocalizedValue}))+"\n ")])],1)]),t._v(" "),s("div",{staticClass:"setting-item"},[s("div",[s("p",[t._v(t._s(t.$t("settings.filtering_explanation")))]),t._v(" "),s("textarea",{directives:[{name:"model",rawName:"v-model",value:t.muteWordsString,expression:"muteWordsString"}],attrs:{id:"muteWords"},domProps:{value:t.muteWordsString},on:{input:function(e){e.target.composing||(t.muteWordsString=e.target.value)}}})]),t._v(" "),s("div",[s("Checkbox",{model:{value:t.hideFilteredStatuses,callback:function(e){t.hideFilteredStatuses=e},expression:"hideFilteredStatuses"}},[t._v("\n "+t._s(t.$t("settings.hide_filtered_statuses"))+" "+t._s(t.$t("settings.instance_default",{value:t.hideFilteredStatusesLocalizedValue}))+"\n ")])],1)])])},[],!1,null,null,null).exports,gt=s(3),_t=s.n(gt),wt={props:{backupCodes:{type:Object,default:function(){return{inProgress:!1,codes:[]}}}},data:function(){return{}},computed:{inProgress:function(){return this.backupCodes.inProgress},ready:function(){return this.backupCodes.codes.length>0},displayTitle:function(){return this.inProgress||this.ready}}};var Ct=function(t){s(615)},xt=Object(o.a)(wt,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"mfa-backup-codes"},[t.displayTitle?s("h4",[t._v("\n "+t._s(t.$t("settings.mfa.recovery_codes"))+"\n ")]):t._e(),t._v(" "),t.inProgress?s("i",[t._v(t._s(t.$t("settings.mfa.waiting_a_recovery_codes")))]):t._e(),t._v(" "),t.ready?[s("p",{staticClass:"alert warning"},[t._v("\n "+t._s(t.$t("settings.mfa.recovery_codes_warning"))+"\n ")]),t._v(" "),s("ul",{staticClass:"backup-codes"},t._l(t.backupCodes.codes,function(e){return s("li",{key:e},[t._v("\n "+t._s(e)+"\n ")])}),0)]:t._e()],2)},[],!1,Ct,null,null).exports,kt={props:["disabled"],data:function(){return{}},methods:{confirm:function(){this.$emit("confirm")},cancel:function(){this.$emit("cancel")}}},yt=Object(o.a)(kt,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",[t._t("default"),t._v(" "),s("button",{staticClass:"btn btn-default",attrs:{disabled:t.disabled},on:{click:t.confirm}},[t._v("\n "+t._s(t.$t("general.confirm"))+"\n ")]),t._v(" "),s("button",{staticClass:"btn btn-default",attrs:{disabled:t.disabled},on:{click:t.cancel}},[t._v("\n "+t._s(t.$t("general.cancel"))+"\n ")])],2)},[],!1,null,null,null).exports,$t=s(2);function Lt(t,e){var s=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),s.push.apply(s,a)}return s}var Tt={props:["settings"],data:function(){return{error:!1,currentPassword:"",deactivate:!1,inProgress:!1}},components:{confirm:yt},computed:function(t){for(var e=1;e0},confirmNewBackupCodes:function(){return this.backupCodes.getNewCodes}},Object($t.e)({backendInteractor:function(t){return t.api.backendInteractor}})),methods:{activateOTP:function(){this.settings.enabled||(this.setupState.state="getBackupcodes",this.fetchBackupCodes())},fetchBackupCodes:function(){var t=this;return this.backupCodes.inProgress=!0,this.backupCodes.codes=[],this.backendInteractor.generateMfaBackupCodes().then(function(e){t.backupCodes.codes=e.codes,t.backupCodes.inProgress=!1})},getBackupCodes:function(){this.backupCodes.getNewCodes=!0},confirmBackupCodes:function(){var t=this;this.fetchBackupCodes().then(function(e){t.backupCodes.getNewCodes=!1})},cancelBackupCodes:function(){this.backupCodes.getNewCodes=!1},setupOTP:function(){var t=this;this.setupState.state="setupOTP",this.setupState.setupOTPState="prepare",this.backendInteractor.mfaSetupOTP().then(function(e){t.otpSettings=e,t.setupState.setupOTPState="confirm"})},doConfirmOTP:function(){var t=this;this.error=null,this.backendInteractor.mfaConfirmOTP({token:this.otpConfirmToken,password:this.currentPassword}).then(function(e){e.error?t.error=e.error:t.completeSetup()})},completeSetup:function(){this.setupState.setupOTPState="complete",this.setupState.state="complete",this.currentPassword=null,this.error=null,this.fetchSettings()},cancelSetup:function(){this.setupState.setupOTPState="",this.setupState.state="",this.currentPassword=null,this.error=null},fetchSettings:function(){var t;return _t.a.async(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,_t.a.awrap(this.backendInteractor.settingsMFA());case 2:if(!(t=e.sent).error){e.next=5;break}return e.abrupt("return");case 5:return this.settings=t.settings,this.settings.available=!0,e.abrupt("return",t);case 8:case"end":return e.stop()}},null,this)}},mounted:function(){var t=this;this.fetchSettings().then(function(){t.readyInit=!0})}};var St=function(t){s(613)},It=Object(o.a)(Pt,function(){var t=this,e=t.$createElement,s=t._self._c||e;return t.readyInit&&t.settings.available?s("div",{staticClass:"setting-item mfa-settings"},[s("div",{staticClass:"mfa-heading"},[s("h2",[t._v(t._s(t.$t("settings.mfa.title")))])]),t._v(" "),s("div",[t.setupInProgress?t._e():s("div",{staticClass:"setting-item"},[s("h3",[t._v(t._s(t.$t("settings.mfa.authentication_methods")))]),t._v(" "),s("totp-item",{attrs:{settings:t.settings},on:{deactivate:t.fetchSettings,activate:t.activateOTP}}),t._v(" "),s("br"),t._v(" "),t.settings.enabled?s("div",[t.confirmNewBackupCodes?t._e():s("recovery-codes",{attrs:{"backup-codes":t.backupCodes}}),t._v(" "),t.confirmNewBackupCodes?t._e():s("button",{staticClass:"btn btn-default",on:{click:t.getBackupCodes}},[t._v("\n "+t._s(t.$t("settings.mfa.generate_new_recovery_codes"))+"\n ")]),t._v(" "),t.confirmNewBackupCodes?s("div",[s("confirm",{attrs:{disabled:t.backupCodes.inProgress},on:{confirm:t.confirmBackupCodes,cancel:t.cancelBackupCodes}},[s("p",{staticClass:"warning"},[t._v("\n "+t._s(t.$t("settings.mfa.warning_of_generate_new_codes"))+"\n ")])])],1):t._e()],1):t._e()],1),t._v(" "),t.setupInProgress?s("div",[s("h3",[t._v(t._s(t.$t("settings.mfa.setup_otp")))]),t._v(" "),t.setupOTPInProgress?t._e():s("recovery-codes",{attrs:{"backup-codes":t.backupCodes}}),t._v(" "),t.canSetupOTP?s("button",{staticClass:"btn btn-default",on:{click:t.cancelSetup}},[t._v("\n "+t._s(t.$t("general.cancel"))+"\n ")]):t._e(),t._v(" "),t.canSetupOTP?s("button",{staticClass:"btn btn-default",on:{click:t.setupOTP}},[t._v("\n "+t._s(t.$t("settings.mfa.setup_otp"))+"\n ")]):t._e(),t._v(" "),t.setupOTPInProgress?[t.prepareOTP?s("i",[t._v(t._s(t.$t("settings.mfa.wait_pre_setup_otp")))]):t._e(),t._v(" "),t.confirmOTP?s("div",[s("div",{staticClass:"setup-otp"},[s("div",{staticClass:"qr-code"},[s("h4",[t._v(t._s(t.$t("settings.mfa.scan.title")))]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.mfa.scan.desc")))]),t._v(" "),s("qrcode",{attrs:{value:t.otpSettings.provisioning_uri,options:{width:200}}}),t._v(" "),s("p",[t._v("\n "+t._s(t.$t("settings.mfa.scan.secret_code"))+":\n "+t._s(t.otpSettings.key)+"\n ")])],1),t._v(" "),s("div",{staticClass:"verify"},[s("h4",[t._v(t._s(t.$t("general.verify")))]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.mfa.verify.desc")))]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.otpConfirmToken,expression:"otpConfirmToken"}],attrs:{type:"text"},domProps:{value:t.otpConfirmToken},on:{input:function(e){e.target.composing||(t.otpConfirmToken=e.target.value)}}}),t._v(" "),s("p",[t._v(t._s(t.$t("settings.enter_current_password_to_confirm"))+":")]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.currentPassword,expression:"currentPassword"}],attrs:{type:"password"},domProps:{value:t.currentPassword},on:{input:function(e){e.target.composing||(t.currentPassword=e.target.value)}}}),t._v(" "),s("div",{staticClass:"confirm-otp-actions"},[s("button",{staticClass:"btn btn-default",on:{click:t.doConfirmOTP}},[t._v("\n "+t._s(t.$t("settings.mfa.confirm_and_enable"))+"\n ")]),t._v(" "),s("button",{staticClass:"btn btn-default",on:{click:t.cancelSetup}},[t._v("\n "+t._s(t.$t("general.cancel"))+"\n ")])]),t._v(" "),t.error?s("div",{staticClass:"alert error"},[t._v("\n "+t._s(t.error)+"\n ")]):t._e()])])]):t._e()]:t._e()],2):t._e()])]):t._e()},[],!1,St,null,null).exports,jt={data:function(){return{newEmail:"",changeEmailError:!1,changeEmailPassword:"",changedEmail:!1,deletingAccount:!1,deleteAccountConfirmPasswordInput:"",deleteAccountError:!1,changePasswordInputs:["","",""],changedPassword:!1,changePasswordError:!1}},created:function(){this.$store.dispatch("fetchTokens")},components:{ProgressButton:S.a,Mfa:It,Checkbox:d.a},computed:{user:function(){return this.$store.state.users.currentUser},pleromaBackend:function(){return this.$store.state.instance.pleromaBackend},oauthTokens:function(){return this.$store.state.oauthTokens.tokens.map(function(t){return{id:t.id,appName:t.app_name,validUntil:new Date(t.valid_until).toLocaleDateString()}})}},methods:{confirmDelete:function(){this.deletingAccount=!0},deleteAccount:function(){var t=this;this.$store.state.api.backendInteractor.deleteAccount({password:this.deleteAccountConfirmPasswordInput}).then(function(e){"success"===e.status?(t.$store.dispatch("logout"),t.$router.push({name:"root"})):t.deleteAccountError=e.error})},changePassword:function(){var t=this,e={password:this.changePasswordInputs[0],newPassword:this.changePasswordInputs[1],newPasswordConfirmation:this.changePasswordInputs[2]};this.$store.state.api.backendInteractor.changePassword(e).then(function(e){"success"===e.status?(t.changedPassword=!0,t.changePasswordError=!1,t.logout()):(t.changedPassword=!1,t.changePasswordError=e.error)})},changeEmail:function(){var t=this,e={email:this.newEmail,password:this.changeEmailPassword};this.$store.state.api.backendInteractor.changeEmail(e).then(function(e){"success"===e.status?(t.changedEmail=!0,t.changeEmailError=!1):(t.changedEmail=!1,t.changeEmailError=e.error)})},logout:function(){this.$store.dispatch("logout"),this.$router.replace("/")},revokeToken:function(t){window.confirm("".concat(this.$i18n.t("settings.revoke_token"),"?"))&&this.$store.dispatch("revokeToken",t)}}},Et=Object(o.a)(jt,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{attrs:{label:t.$t("settings.security_tab")}},[s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.change_email")))]),t._v(" "),s("div",[s("p",[t._v(t._s(t.$t("settings.new_email")))]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.newEmail,expression:"newEmail"}],attrs:{type:"email",autocomplete:"email"},domProps:{value:t.newEmail},on:{input:function(e){e.target.composing||(t.newEmail=e.target.value)}}})]),t._v(" "),s("div",[s("p",[t._v(t._s(t.$t("settings.current_password")))]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.changeEmailPassword,expression:"changeEmailPassword"}],attrs:{type:"password",autocomplete:"current-password"},domProps:{value:t.changeEmailPassword},on:{input:function(e){e.target.composing||(t.changeEmailPassword=e.target.value)}}})]),t._v(" "),s("button",{staticClass:"btn btn-default",on:{click:t.changeEmail}},[t._v("\n "+t._s(t.$t("general.submit"))+"\n ")]),t._v(" "),t.changedEmail?s("p",[t._v("\n "+t._s(t.$t("settings.changed_email"))+"\n ")]):t._e(),t._v(" "),!1!==t.changeEmailError?[s("p",[t._v(t._s(t.$t("settings.change_email_error")))]),t._v(" "),s("p",[t._v(t._s(t.changeEmailError))])]:t._e()],2),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.change_password")))]),t._v(" "),s("div",[s("p",[t._v(t._s(t.$t("settings.current_password")))]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.changePasswordInputs[0],expression:"changePasswordInputs[0]"}],attrs:{type:"password"},domProps:{value:t.changePasswordInputs[0]},on:{input:function(e){e.target.composing||t.$set(t.changePasswordInputs,0,e.target.value)}}})]),t._v(" "),s("div",[s("p",[t._v(t._s(t.$t("settings.new_password")))]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.changePasswordInputs[1],expression:"changePasswordInputs[1]"}],attrs:{type:"password"},domProps:{value:t.changePasswordInputs[1]},on:{input:function(e){e.target.composing||t.$set(t.changePasswordInputs,1,e.target.value)}}})]),t._v(" "),s("div",[s("p",[t._v(t._s(t.$t("settings.confirm_new_password")))]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.changePasswordInputs[2],expression:"changePasswordInputs[2]"}],attrs:{type:"password"},domProps:{value:t.changePasswordInputs[2]},on:{input:function(e){e.target.composing||t.$set(t.changePasswordInputs,2,e.target.value)}}})]),t._v(" "),s("button",{staticClass:"btn btn-default",on:{click:t.changePassword}},[t._v("\n "+t._s(t.$t("general.submit"))+"\n ")]),t._v(" "),t.changedPassword?s("p",[t._v("\n "+t._s(t.$t("settings.changed_password"))+"\n ")]):!1!==t.changePasswordError?s("p",[t._v("\n "+t._s(t.$t("settings.change_password_error"))+"\n ")]):t._e(),t._v(" "),t.changePasswordError?s("p",[t._v("\n "+t._s(t.changePasswordError)+"\n ")]):t._e()]),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.oauth_tokens")))]),t._v(" "),s("table",{staticClass:"oauth-tokens"},[s("thead",[s("tr",[s("th",[t._v(t._s(t.$t("settings.app_name")))]),t._v(" "),s("th",[t._v(t._s(t.$t("settings.valid_until")))]),t._v(" "),s("th")])]),t._v(" "),s("tbody",t._l(t.oauthTokens,function(e){return s("tr",{key:e.id},[s("td",[t._v(t._s(e.appName))]),t._v(" "),s("td",[t._v(t._s(e.validUntil))]),t._v(" "),s("td",{staticClass:"actions"},[s("button",{staticClass:"btn btn-default",on:{click:function(s){return t.revokeToken(e.id)}}},[t._v("\n "+t._s(t.$t("settings.revoke_token"))+"\n ")])])])}),0)])]),t._v(" "),s("mfa"),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.delete_account")))]),t._v(" "),t.deletingAccount?t._e():s("p",[t._v("\n "+t._s(t.$t("settings.delete_account_description"))+"\n ")]),t._v(" "),t.deletingAccount?s("div",[s("p",[t._v(t._s(t.$t("settings.delete_account_instructions")))]),t._v(" "),s("p",[t._v(t._s(t.$t("login.password")))]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.deleteAccountConfirmPasswordInput,expression:"deleteAccountConfirmPasswordInput"}],attrs:{type:"password"},domProps:{value:t.deleteAccountConfirmPasswordInput},on:{input:function(e){e.target.composing||(t.deleteAccountConfirmPasswordInput=e.target.value)}}}),t._v(" "),s("button",{staticClass:"btn btn-default",on:{click:t.deleteAccount}},[t._v("\n "+t._s(t.$t("settings.delete_account"))+"\n ")])]):t._e(),t._v(" "),!1!==t.deleteAccountError?s("p",[t._v("\n "+t._s(t.$t("settings.delete_account_error"))+"\n ")]):t._e(),t._v(" "),t.deleteAccountError?s("p",[t._v("\n "+t._s(t.deleteAccountError)+"\n ")]):t._e(),t._v(" "),t.deletingAccount?t._e():s("button",{staticClass:"btn btn-default",on:{click:t.confirmDelete}},[t._v("\n "+t._s(t.$t("general.submit"))+"\n ")])])],1)},[],!1,null,null,null).exports,Rt=s(188),Bt=s.n(Rt),Ft=s(96),Mt=s.n(Ft),Ut=s(27),Vt=s.n(Ut),At=s(622),Dt=(s(623),{props:{trigger:{type:[String,window.Element],required:!0},submitHandler:{type:Function,required:!0},cropperOptions:{type:Object,default:function(){return{aspectRatio:1,autoCropArea:1,viewMode:1,movable:!1,zoomable:!1,guides:!1}}},mimes:{type:String,default:"image/png, image/gif, image/jpeg, image/bmp, image/x-icon"},saveButtonLabel:{type:String},saveWithoutCroppingButtonlabel:{type:String},cancelButtonLabel:{type:String}},data:function(){return{cropper:void 0,dataUrl:void 0,filename:void 0,submitting:!1,submitError:null}},computed:{saveText:function(){return this.saveButtonLabel||this.$t("image_cropper.save")},saveWithoutCroppingText:function(){return this.saveWithoutCroppingButtonlabel||this.$t("image_cropper.save_without_cropping")},cancelText:function(){return this.cancelButtonLabel||this.$t("image_cropper.cancel")},submitErrorMsg:function(){return this.submitError&&this.submitError instanceof Error?this.submitError.toString():this.submitError}},methods:{destroy:function(){this.cropper&&this.cropper.destroy(),this.$refs.input.value="",this.dataUrl=void 0,this.$emit("close")},submit:function(){var t=this,e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.submitting=!0,this.avatarUploadError=null,this.submitHandler(e&&this.cropper,this.file).then(function(){return t.destroy()}).catch(function(e){t.submitError=e}).finally(function(){t.submitting=!1})},pickImage:function(){this.$refs.input.click()},createCropper:function(){this.cropper=new At.a(this.$refs.img,this.cropperOptions)},getTriggerDOM:function(){return"object"===Vt()(this.trigger)?this.trigger:document.querySelector(this.trigger)},readFile:function(){var t=this,e=this.$refs.input;if(null!=e.files&&null!=e.files[0]){this.file=e.files[0];var s=new window.FileReader;s.onload=function(e){t.dataUrl=e.target.result,t.$emit("open")},s.readAsDataURL(this.file),this.$emit("changed",this.file,s)}},clearError:function(){this.submitError=null}},mounted:function(){var t=this.getTriggerDOM();t?t.addEventListener("click",this.pickImage):this.$emit("error","No image make trigger found.","user"),this.$refs.input.addEventListener("change",this.readFile)},beforeDestroy:function(){var t=this.getTriggerDOM();t&&t.removeEventListener("click",this.pickImage),this.$refs.input.removeEventListener("change",this.readFile)}});var Nt=function(t){s(620)},Wt=Object(o.a)(Dt,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"image-cropper"},[t.dataUrl?s("div",[s("div",{staticClass:"image-cropper-image-container"},[s("img",{ref:"img",attrs:{src:t.dataUrl,alt:""},on:{load:function(e){return e.stopPropagation(),t.createCropper(e)}}})]),t._v(" "),s("div",{staticClass:"image-cropper-buttons-wrapper"},[s("button",{staticClass:"btn",attrs:{type:"button",disabled:t.submitting},domProps:{textContent:t._s(t.saveText)},on:{click:function(e){return t.submit()}}}),t._v(" "),s("button",{staticClass:"btn",attrs:{type:"button",disabled:t.submitting},domProps:{textContent:t._s(t.cancelText)},on:{click:t.destroy}}),t._v(" "),s("button",{staticClass:"btn",attrs:{type:"button",disabled:t.submitting},domProps:{textContent:t._s(t.saveWithoutCroppingText)},on:{click:function(e){return t.submit(!1)}}}),t._v(" "),t.submitting?s("i",{staticClass:"icon-spin4 animate-spin"}):t._e()]),t._v(" "),t.submitError?s("div",{staticClass:"alert error"},[t._v("\n "+t._s(t.submitErrorMsg)+"\n "),s("i",{staticClass:"button-icon icon-cancel",on:{click:t.clearError}})]):t._e()]):t._e(),t._v(" "),s("input",{ref:"input",staticClass:"image-cropper-img-input",attrs:{type:"file",accept:t.mimes}})])},[],!1,Nt,null,null).exports,zt=s(196),qt=s(134),Gt=s(195),Ht=s(135),Kt={data:function(){return{newName:this.$store.state.users.currentUser.name,newBio:Bt()(this.$store.state.users.currentUser.description),newLocked:this.$store.state.users.currentUser.locked,newNoRichText:this.$store.state.users.currentUser.no_rich_text,newDefaultScope:this.$store.state.users.currentUser.default_scope,newFields:this.$store.state.users.currentUser.fields.map(function(t){return{name:t.name,value:t.value}}),hideFollows:this.$store.state.users.currentUser.hide_follows,hideFollowers:this.$store.state.users.currentUser.hide_followers,hideFollowsCount:this.$store.state.users.currentUser.hide_follows_count,hideFollowersCount:this.$store.state.users.currentUser.hide_followers_count,showRole:this.$store.state.users.currentUser.show_role,role:this.$store.state.users.currentUser.role,discoverable:this.$store.state.users.currentUser.discoverable,bot:this.$store.state.users.currentUser.bot,allowFollowingMove:this.$store.state.users.currentUser.allow_following_move,pickAvatarBtnVisible:!0,bannerUploading:!1,backgroundUploading:!1,banner:null,bannerPreview:null,background:null,backgroundPreview:null,bannerUploadError:null,backgroundUploadError:null}},components:{ScopeSelector:zt.a,ImageCropper:Wt,EmojiInput:Gt.a,Autosuggest:x,ProgressButton:S.a,Checkbox:d.a},computed:{user:function(){return this.$store.state.users.currentUser},emojiUserSuggestor:function(){var t=this;return Object(Ht.a)({emoji:[].concat(z()(this.$store.state.instance.emoji),z()(this.$store.state.instance.customEmoji)),users:this.$store.state.users.users,updateUsersList:function(e){return t.$store.dispatch("searchUsers",{query:e})}})},emojiSuggestor:function(){return Object(Ht.a)({emoji:[].concat(z()(this.$store.state.instance.emoji),z()(this.$store.state.instance.customEmoji))})},userSuggestor:function(){var t=this;return Object(Ht.a)({users:this.$store.state.users.users,updateUsersList:function(e){return t.$store.dispatch("searchUsers",{query:e})}})},fieldsLimits:function(){return this.$store.state.instance.fieldsLimits},maxFields:function(){return this.fieldsLimits?this.fieldsLimits.maxFields:0},defaultAvatar:function(){return this.$store.state.instance.server+this.$store.state.instance.defaultAvatar},defaultBanner:function(){return this.$store.state.instance.server+this.$store.state.instance.defaultBanner},isDefaultAvatar:function(){var t=this.$store.state.instance.defaultAvatar;return!this.$store.state.users.currentUser.profile_image_url||this.$store.state.users.currentUser.profile_image_url.includes(t)},isDefaultBanner:function(){var t=this.$store.state.instance.defaultBanner;return!this.$store.state.users.currentUser.cover_photo||this.$store.state.users.currentUser.cover_photo.includes(t)},isDefaultBackground:function(){return!this.$store.state.users.currentUser.background_image},avatarImgSrc:function(){var t=this.$store.state.users.currentUser.profile_image_url_original;return t||this.defaultAvatar},bannerImgSrc:function(){var t=this.$store.state.users.currentUser.cover_photo;return t||this.defaultBanner}},methods:{updateProfile:function(){var t=this;this.$store.state.api.backendInteractor.updateProfile({params:{note:this.newBio,locked:this.newLocked,display_name:this.newName,fields_attributes:this.newFields.filter(function(t){return null!=t}),default_scope:this.newDefaultScope,no_rich_text:this.newNoRichText,hide_follows:this.hideFollows,hide_followers:this.hideFollowers,discoverable:this.discoverable,bot:this.bot,allow_following_move:this.allowFollowingMove,hide_follows_count:this.hideFollowsCount,hide_followers_count:this.hideFollowersCount,show_role:this.showRole}}).then(function(e){t.newFields.splice(e.fields.length),Mt()(t.newFields,e.fields),t.$store.commit("addNewUsers",[e]),t.$store.commit("setCurrentUser",e)})},changeVis:function(t){this.newDefaultScope=t},addField:function(){return this.newFields.lengththis.$store.state.instance[t+"limit"]){var n=qt.a.fileSizeFormat(a.size),o=qt.a.fileSizeFormat(this.$store.state.instance[t+"limit"]);this[t+"UploadError"]=[this.$t("upload.error.base"),this.$t("upload.error.file_too_big",{filesize:n.num,filesizeunit:n.unit,allowedsize:o.num,allowedsizeunit:o.unit})].join(" ")}else{var i=new FileReader;i.onload=function(e){var n=e.target.result;s[t+"Preview"]=n,s[t]=a},i.readAsDataURL(a)}},resetAvatar:function(){window.confirm(this.$t("settings.reset_avatar_confirm"))&&this.submitAvatar(void 0,"")},resetBanner:function(){window.confirm(this.$t("settings.reset_banner_confirm"))&&this.submitBanner("")},resetBackground:function(){window.confirm(this.$t("settings.reset_background_confirm"))&&this.submitBackground("")},submitAvatar:function(t,e){var s=this;return new Promise(function(a,n){function o(t){s.$store.state.api.backendInteractor.updateProfileImages({avatar:t}).then(function(t){s.$store.commit("addNewUsers",[t]),s.$store.commit("setCurrentUser",t),a()}).catch(function(t){n(new Error(s.$t("upload.error.base")+" "+t.message))})}t?t.getCroppedCanvas().toBlob(o,e.type):o(e)})},submitBanner:function(t){var e=this;(this.bannerPreview||""===t)&&(this.bannerUploading=!0,this.$store.state.api.backendInteractor.updateProfileImages({banner:t}).then(function(t){e.$store.commit("addNewUsers",[t]),e.$store.commit("setCurrentUser",t),e.bannerPreview=null}).catch(function(t){e.bannerUploadError=e.$t("upload.error.base")+" "+t.message}).then(function(){e.bannerUploading=!1}))},submitBackground:function(t){var e=this;(this.backgroundPreview||""===t)&&(this.backgroundUploading=!0,this.$store.state.api.backendInteractor.updateProfileImages({background:t}).then(function(t){t.error?e.backgroundUploadError=e.$t("upload.error.base")+t.error:(e.$store.commit("addNewUsers",[t]),e.$store.commit("setCurrentUser",t),e.backgroundPreview=null),e.backgroundUploading=!1}))}}};var Jt=function(t){s(618)},Qt=Object(o.a)(Kt,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"profile-tab"},[s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.name_bio")))]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.name")))]),t._v(" "),s("EmojiInput",{attrs:{"enable-emoji-picker":"",suggest:t.emojiSuggestor},model:{value:t.newName,callback:function(e){t.newName=e},expression:"newName"}},[s("input",{directives:[{name:"model",rawName:"v-model",value:t.newName,expression:"newName"}],attrs:{id:"username",classname:"name-changer"},domProps:{value:t.newName},on:{input:function(e){e.target.composing||(t.newName=e.target.value)}}})]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.bio")))]),t._v(" "),s("EmojiInput",{attrs:{"enable-emoji-picker":"",suggest:t.emojiUserSuggestor},model:{value:t.newBio,callback:function(e){t.newBio=e},expression:"newBio"}},[s("textarea",{directives:[{name:"model",rawName:"v-model",value:t.newBio,expression:"newBio"}],attrs:{classname:"bio"},domProps:{value:t.newBio},on:{input:function(e){e.target.composing||(t.newBio=e.target.value)}}})]),t._v(" "),s("p",[s("Checkbox",{model:{value:t.newLocked,callback:function(e){t.newLocked=e},expression:"newLocked"}},[t._v("\n "+t._s(t.$t("settings.lock_account_description"))+"\n ")])],1),t._v(" "),s("div",[s("label",{attrs:{for:"default-vis"}},[t._v(t._s(t.$t("settings.default_vis")))]),t._v(" "),s("div",{staticClass:"visibility-tray",attrs:{id:"default-vis"}},[s("scope-selector",{attrs:{"show-all":!0,"user-default":t.newDefaultScope,"initial-scope":t.newDefaultScope,"on-scope-change":t.changeVis}})],1)]),t._v(" "),s("p",[s("Checkbox",{model:{value:t.newNoRichText,callback:function(e){t.newNoRichText=e},expression:"newNoRichText"}},[t._v("\n "+t._s(t.$t("settings.no_rich_text_description"))+"\n ")])],1),t._v(" "),s("p",[s("Checkbox",{model:{value:t.hideFollows,callback:function(e){t.hideFollows=e},expression:"hideFollows"}},[t._v("\n "+t._s(t.$t("settings.hide_follows_description"))+"\n ")])],1),t._v(" "),s("p",{staticClass:"setting-subitem"},[s("Checkbox",{attrs:{disabled:!t.hideFollows},model:{value:t.hideFollowsCount,callback:function(e){t.hideFollowsCount=e},expression:"hideFollowsCount"}},[t._v("\n "+t._s(t.$t("settings.hide_follows_count_description"))+"\n ")])],1),t._v(" "),s("p",[s("Checkbox",{model:{value:t.hideFollowers,callback:function(e){t.hideFollowers=e},expression:"hideFollowers"}},[t._v("\n "+t._s(t.$t("settings.hide_followers_description"))+"\n ")])],1),t._v(" "),s("p",{staticClass:"setting-subitem"},[s("Checkbox",{attrs:{disabled:!t.hideFollowers},model:{value:t.hideFollowersCount,callback:function(e){t.hideFollowersCount=e},expression:"hideFollowersCount"}},[t._v("\n "+t._s(t.$t("settings.hide_followers_count_description"))+"\n ")])],1),t._v(" "),s("p",[s("Checkbox",{model:{value:t.allowFollowingMove,callback:function(e){t.allowFollowingMove=e},expression:"allowFollowingMove"}},[t._v("\n "+t._s(t.$t("settings.allow_following_move"))+"\n ")])],1),t._v(" "),"admin"===t.role||"moderator"===t.role?s("p",[s("Checkbox",{model:{value:t.showRole,callback:function(e){t.showRole=e},expression:"showRole"}},["admin"===t.role?[t._v("\n "+t._s(t.$t("settings.show_admin_badge"))+"\n ")]:t._e(),t._v(" "),"moderator"===t.role?[t._v("\n "+t._s(t.$t("settings.show_moderator_badge"))+"\n ")]:t._e()],2)],1):t._e(),t._v(" "),s("p",[s("Checkbox",{model:{value:t.discoverable,callback:function(e){t.discoverable=e},expression:"discoverable"}},[t._v("\n "+t._s(t.$t("settings.discoverable"))+"\n ")])],1),t._v(" "),t.maxFields>0?s("div",[s("p",[t._v(t._s(t.$t("settings.profile_fields.label")))]),t._v(" "),t._l(t.newFields,function(e,a){return s("div",{key:a,staticClass:"profile-fields"},[s("EmojiInput",{attrs:{"enable-emoji-picker":"","hide-emoji-button":"",suggest:t.userSuggestor},model:{value:t.newFields[a].name,callback:function(e){t.$set(t.newFields[a],"name",e)},expression:"newFields[i].name"}},[s("input",{directives:[{name:"model",rawName:"v-model",value:t.newFields[a].name,expression:"newFields[i].name"}],attrs:{placeholder:t.$t("settings.profile_fields.name")},domProps:{value:t.newFields[a].name},on:{input:function(e){e.target.composing||t.$set(t.newFields[a],"name",e.target.value)}}})]),t._v(" "),s("EmojiInput",{attrs:{"enable-emoji-picker":"","hide-emoji-button":"",suggest:t.userSuggestor},model:{value:t.newFields[a].value,callback:function(e){t.$set(t.newFields[a],"value",e)},expression:"newFields[i].value"}},[s("input",{directives:[{name:"model",rawName:"v-model",value:t.newFields[a].value,expression:"newFields[i].value"}],attrs:{placeholder:t.$t("settings.profile_fields.value")},domProps:{value:t.newFields[a].value},on:{input:function(e){e.target.composing||t.$set(t.newFields[a],"value",e.target.value)}}})]),t._v(" "),s("div",{staticClass:"icon-container"},[s("i",{directives:[{name:"show",rawName:"v-show",value:t.newFields.length>1,expression:"newFields.length > 1"}],staticClass:"icon-cancel",on:{click:function(e){return t.deleteField(a)}}})])],1)}),t._v(" "),t.newFields.length0?s("li",[s("div",[t._v("\n "+t._s(t.$t("settings.post_status_content_type"))+"\n "),s("label",{staticClass:"select",attrs:{for:"postContentType"}},[s("select",{directives:[{name:"model",rawName:"v-model",value:t.postContentType,expression:"postContentType"}],attrs:{id:"postContentType"},on:{change:function(e){var s=Array.prototype.filter.call(e.target.options,function(t){return t.selected}).map(function(t){return"_value"in t?t._value:t.value});t.postContentType=e.target.multiple?s:s[0]}}},t._l(t.postFormats,function(e){return s("option",{key:e,domProps:{value:e}},[t._v("\n "+t._s(t.$t('post_status.content_type["'+e+'"]'))+"\n "+t._s(t.postContentTypeDefaultValue===e?t.$t("settings.instance_default_simple"):"")+"\n ")])}),0),t._v(" "),s("i",{staticClass:"icon-down-open"})])])]):t._e(),t._v(" "),s("li",[s("Checkbox",{model:{value:t.minimalScopesMode,callback:function(e){t.minimalScopesMode=e},expression:"minimalScopesMode"}},[t._v("\n "+t._s(t.$t("settings.minimal_scopes_mode"))+" "+t._s(t.$t("settings.instance_default",{value:t.minimalScopesModeLocalizedValue}))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.autohideFloatingPostButton,callback:function(e){t.autohideFloatingPostButton=e},expression:"autohideFloatingPostButton"}},[t._v("\n "+t._s(t.$t("settings.autohide_floating_post_button"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.padEmoji,callback:function(e){t.padEmoji=e},expression:"padEmoji"}},[t._v("\n "+t._s(t.$t("settings.pad_emoji"))+"\n ")])],1)])]),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.attachments")))]),t._v(" "),s("ul",{staticClass:"setting-list"},[s("li",[s("Checkbox",{model:{value:t.hideAttachments,callback:function(e){t.hideAttachments=e},expression:"hideAttachments"}},[t._v("\n "+t._s(t.$t("settings.hide_attachments_in_tl"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.hideAttachmentsInConv,callback:function(e){t.hideAttachmentsInConv=e},expression:"hideAttachmentsInConv"}},[t._v("\n "+t._s(t.$t("settings.hide_attachments_in_convo"))+"\n ")])],1),t._v(" "),s("li",[s("label",{attrs:{for:"maxThumbnails"}},[t._v("\n "+t._s(t.$t("settings.max_thumbnails"))+"\n ")]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model.number",value:t.maxThumbnails,expression:"maxThumbnails",modifiers:{number:!0}}],staticClass:"number-input",attrs:{id:"maxThumbnails",type:"number",min:"0",step:"1"},domProps:{value:t.maxThumbnails},on:{input:function(e){e.target.composing||(t.maxThumbnails=t._n(e.target.value))},blur:function(e){return t.$forceUpdate()}}})]),t._v(" "),s("li",[s("Checkbox",{model:{value:t.hideNsfw,callback:function(e){t.hideNsfw=e},expression:"hideNsfw"}},[t._v("\n "+t._s(t.$t("settings.nsfw_clickthrough"))+"\n ")])],1),t._v(" "),s("ul",{staticClass:"setting-list suboptions"},[s("li",[s("Checkbox",{attrs:{disabled:!t.hideNsfw},model:{value:t.preloadImage,callback:function(e){t.preloadImage=e},expression:"preloadImage"}},[t._v("\n "+t._s(t.$t("settings.preload_images"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{attrs:{disabled:!t.hideNsfw},model:{value:t.useOneClickNsfw,callback:function(e){t.useOneClickNsfw=e},expression:"useOneClickNsfw"}},[t._v("\n "+t._s(t.$t("settings.use_one_click_nsfw"))+"\n ")])],1)]),t._v(" "),s("li",[s("Checkbox",{model:{value:t.stopGifs,callback:function(e){t.stopGifs=e},expression:"stopGifs"}},[t._v("\n "+t._s(t.$t("settings.stop_gifs"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.loopVideo,callback:function(e){t.loopVideo=e},expression:"loopVideo"}},[t._v("\n "+t._s(t.$t("settings.loop_video"))+"\n ")]),t._v(" "),s("ul",{staticClass:"setting-list suboptions",class:[{disabled:!t.streaming}]},[s("li",[s("Checkbox",{attrs:{disabled:!t.loopVideo||!t.loopSilentAvailable},model:{value:t.loopVideoSilentOnly,callback:function(e){t.loopVideoSilentOnly=e},expression:"loopVideoSilentOnly"}},[t._v("\n "+t._s(t.$t("settings.loop_video_silent_only"))+"\n ")]),t._v(" "),t.loopSilentAvailable?t._e():s("div",{staticClass:"unavailable"},[s("i",{staticClass:"icon-globe"}),t._v("! "+t._s(t.$t("settings.limited_availability"))+"\n ")])],1)])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.playVideosInModal,callback:function(e){t.playVideosInModal=e},expression:"playVideosInModal"}},[t._v("\n "+t._s(t.$t("settings.play_videos_in_modal"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.useContainFit,callback:function(e){t.useContainFit=e},expression:"useContainFit"}},[t._v("\n "+t._s(t.$t("settings.use_contain_fit"))+"\n ")])],1)])]),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.notifications")))]),t._v(" "),s("ul",{staticClass:"setting-list"},[s("li",[s("Checkbox",{model:{value:t.webPushNotifications,callback:function(e){t.webPushNotifications=e},expression:"webPushNotifications"}},[t._v("\n "+t._s(t.$t("settings.enable_web_push_notifications"))+"\n ")])],1)])]),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.fun")))]),t._v(" "),s("ul",{staticClass:"setting-list"},[s("li",[s("Checkbox",{model:{value:t.greentext,callback:function(e){t.greentext=e},expression:"greentext"}},[t._v("\n "+t._s(t.$t("settings.greentext"))+" "+t._s(t.$t("settings.instance_default",{value:t.greentextLocalizedValue}))+"\n ")])],1)])])])},[],!1,null,null,null).exports,ne={data:function(){var t=this.$store.state.instance;return{backendVersion:t.backendVersion,frontendVersion:t.frontendVersion}},computed:{frontendVersionLink:function(){return"https://git.pleroma.social/pleroma/pleroma-fe/commit/"+this.frontendVersion},backendVersionLink:function(){return"https://git.pleroma.social/pleroma/pleroma/commit/"+(t=this.backendVersion,(e=t.match(/-g(\w+)/i))?e[1]:"");var t,e}}},oe=Object(o.a)(ne,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{attrs:{label:t.$t("settings.version.title")}},[s("div",{staticClass:"setting-item"},[s("ul",{staticClass:"setting-list"},[s("li",[s("p",[t._v(t._s(t.$t("settings.version.backend_version")))]),t._v(" "),s("ul",{staticClass:"option-list"},[s("li",[s("a",{attrs:{href:t.backendVersionLink,target:"_blank"}},[t._v(t._s(t.backendVersion))])])])]),t._v(" "),s("li",[s("p",[t._v(t._s(t.$t("settings.version.frontend_version")))]),t._v(" "),s("ul",{staticClass:"option-list"},[s("li",[s("a",{attrs:{href:t.frontendVersionLink,target:"_blank"}},[t._v(t._s(t.frontendVersion))])])])])])])])},[],!1,null,null,null).exports,ie=s(9),re=s(32),le=s(29),ce=s(39),ue={components:{Checkbox:d.a},props:{name:{required:!0,type:String},label:{required:!0,type:String},value:{required:!1,type:String,default:void 0},fallback:{required:!1,type:String,default:void 0},disabled:{required:!1,type:Boolean,default:!1},showOptionalTickbox:{required:!1,type:Boolean,default:!0}},computed:{present:function(){return void 0!==this.value},validColor:function(){return Object(ie.f)(this.value||this.fallback)},transparentColor:function(){return"transparent"===this.value},computedColor:function(){return this.value&&this.value.startsWith("--")}}};var de=function(t){s(626),s(628)},pe=Object(o.a)(ue,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"color-input style-control",class:{disabled:!t.present||t.disabled}},[s("label",{staticClass:"label",attrs:{for:t.name}},[t._v("\n "+t._s(t.label)+"\n ")]),t._v(" "),void 0!==t.fallback&&t.showOptionalTickbox?s("Checkbox",{staticClass:"opt",attrs:{checked:t.present,disabled:t.disabled},on:{change:function(e){return t.$emit("input",void 0===t.value?t.fallback:void 0)}}}):t._e(),t._v(" "),s("div",{staticClass:"input color-input-field"},[s("input",{staticClass:"textColor unstyled",attrs:{id:t.name+"-t",type:"text",disabled:!t.present||t.disabled},domProps:{value:t.value||t.fallback},on:{input:function(e){return t.$emit("input",e.target.value)}}}),t._v(" "),t.validColor?s("input",{staticClass:"nativeColor unstyled",attrs:{id:t.name,type:"color",disabled:!t.present||t.disabled},domProps:{value:t.value||t.fallback},on:{input:function(e){return t.$emit("input",e.target.value)}}}):t._e(),t._v(" "),t.transparentColor?s("div",{staticClass:"transparentIndicator"}):t._e(),t._v(" "),t.computedColor?s("div",{staticClass:"computedIndicator",style:{backgroundColor:t.fallback}}):t._e()])],1)},[],!1,de,null,null).exports,me=Object(o.a)({props:["name","value","fallback","disabled","label","max","min","step","hardMin","hardMax"],computed:{present:function(){return void 0!==this.value}}},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"range-control style-control",class:{disabled:!t.present||t.disabled}},[s("label",{staticClass:"label",attrs:{for:t.name}},[t._v("\n "+t._s(t.label)+"\n ")]),t._v(" "),void 0!==t.fallback?s("input",{staticClass:"opt",attrs:{id:t.name+"-o",type:"checkbox"},domProps:{checked:t.present},on:{input:function(e){return t.$emit("input",t.present?void 0:t.fallback)}}}):t._e(),t._v(" "),void 0!==t.fallback?s("label",{staticClass:"opt-l",attrs:{for:t.name+"-o"}}):t._e(),t._v(" "),s("input",{staticClass:"input-number",attrs:{id:t.name,type:"range",disabled:!t.present||t.disabled,max:t.max||t.hardMax||100,min:t.min||t.hardMin||0,step:t.step||1},domProps:{value:t.value||t.fallback},on:{input:function(e){return t.$emit("input",e.target.value)}}}),t._v(" "),s("input",{staticClass:"input-number",attrs:{id:t.name,type:"number",disabled:!t.present||t.disabled,max:t.hardMax,min:t.hardMin,step:t.step||1},domProps:{value:t.value||t.fallback},on:{input:function(e){return t.$emit("input",e.target.value)}}})])},[],!1,null,null,null).exports,ve={components:{Checkbox:d.a},props:["name","value","fallback","disabled"],computed:{present:function(){return void 0!==this.value}}},he=Object(o.a)(ve,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"opacity-control style-control",class:{disabled:!t.present||t.disabled}},[s("label",{staticClass:"label",attrs:{for:t.name}},[t._v("\n "+t._s(t.$t("settings.style.common.opacity"))+"\n ")]),t._v(" "),void 0!==t.fallback?s("Checkbox",{staticClass:"opt",attrs:{checked:t.present,disabled:t.disabled},on:{change:function(e){return t.$emit("input",t.present?void 0:t.fallback)}}}):t._e(),t._v(" "),s("input",{staticClass:"input-number",attrs:{id:t.name,type:"number",disabled:!t.present||t.disabled,max:"1",min:"0",step:".05"},domProps:{value:t.value||t.fallback},on:{input:function(e){return t.$emit("input",e.target.value)}}})],1)},[],!1,null,null,null).exports;function be(t,e){var s=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),s.push.apply(s,a)}return s}var fe=function(){return function(t){for(var e=1;e0&&void 0!==arguments[0]?arguments[0]:{})},ge={props:["value","fallback","ready"],data:function(){return{selectedId:0,cValue:(this.value||this.fallback||[]).map(fe)}},components:{ColorInput:pe,OpacityInput:he},methods:{add:function(){this.cValue.push(fe(this.selected)),this.selectedId=this.cValue.length-1},del:function(){this.cValue.splice(this.selectedId,1),this.selectedId=0===this.cValue.length?void 0:Math.max(this.selectedId-1,0)},moveUp:function(){var t=this.cValue.splice(this.selectedId,1)[0];this.cValue.splice(this.selectedId-1,0,t),this.selectedId-=1},moveDn:function(){var t=this.cValue.splice(this.selectedId,1)[0];this.cValue.splice(this.selectedId+1,0,t),this.selectedId+=1}},beforeUpdate:function(){this.cValue=this.value||this.fallback},computed:{anyShadows:function(){return this.cValue.length>0},anyShadowsFallback:function(){return this.fallback.length>0},selected:function(){return this.ready&&this.anyShadows?this.cValue[this.selectedId]:fe({})},currentFallback:function(){return this.ready&&this.anyShadowsFallback?this.fallback[this.selectedId]:fe({})},moveUpValid:function(){return this.ready&&this.selectedId>0},moveDnValid:function(){return this.ready&&this.selectedId-1:t.selected.inset},on:{change:function(e){var s=t.selected.inset,a=e.target,n=!!a.checked;if(Array.isArray(s)){var o=t._i(s,null);a.checked?o<0&&t.$set(t.selected,"inset",s.concat([null])):o>-1&&t.$set(t.selected,"inset",s.slice(0,o).concat(s.slice(o+1)))}else t.$set(t.selected,"inset",n)}}}),t._v(" "),s("label",{staticClass:"checkbox-label",attrs:{for:"inset"}})]),t._v(" "),s("div",{staticClass:"blur-control style-control",attrs:{disabled:!t.present}},[s("label",{staticClass:"label",attrs:{for:"spread"}},[t._v("\n "+t._s(t.$t("settings.style.shadows.blur"))+"\n ")]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.selected.blur,expression:"selected.blur"}],staticClass:"input-range",attrs:{id:"blur",disabled:!t.present,name:"blur",type:"range",max:"20",min:"0"},domProps:{value:t.selected.blur},on:{__r:function(e){return t.$set(t.selected,"blur",e.target.value)}}}),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.selected.blur,expression:"selected.blur"}],staticClass:"input-number",attrs:{disabled:!t.present,type:"number",min:"0"},domProps:{value:t.selected.blur},on:{input:function(e){e.target.composing||t.$set(t.selected,"blur",e.target.value)}}})]),t._v(" "),s("div",{staticClass:"spread-control style-control",attrs:{disabled:!t.present}},[s("label",{staticClass:"label",attrs:{for:"spread"}},[t._v("\n "+t._s(t.$t("settings.style.shadows.spread"))+"\n ")]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.selected.spread,expression:"selected.spread"}],staticClass:"input-range",attrs:{id:"spread",disabled:!t.present,name:"spread",type:"range",max:"20",min:"-20"},domProps:{value:t.selected.spread},on:{__r:function(e){return t.$set(t.selected,"spread",e.target.value)}}}),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.selected.spread,expression:"selected.spread"}],staticClass:"input-number",attrs:{disabled:!t.present,type:"number"},domProps:{value:t.selected.spread},on:{input:function(e){e.target.composing||t.$set(t.selected,"spread",e.target.value)}}})]),t._v(" "),s("ColorInput",{attrs:{disabled:!t.present,label:t.$t("settings.style.common.color"),fallback:t.currentFallback.color,"show-optional-tickbox":!1,name:"shadow"},model:{value:t.selected.color,callback:function(e){t.$set(t.selected,"color",e)},expression:"selected.color"}}),t._v(" "),s("OpacityInput",{attrs:{disabled:!t.present},model:{value:t.selected.alpha,callback:function(e){t.$set(t.selected,"alpha",e)},expression:"selected.alpha"}}),t._v(" "),s("i18n",{attrs:{path:"settings.style.shadows.hintV3",tag:"p"}},[s("code",[t._v("--variable,mod")])])],1)])},[],!1,_e,null,null).exports,Ce={props:["name","label","value","fallback","options","no-inherit"],data:function(){return{lValue:this.value,availableOptions:[this.noInherit?"":"inherit","custom"].concat(z()(this.options||[]),["serif","monospace","sans-serif"]).filter(function(t){return t})}},beforeUpdate:function(){this.lValue=this.value},computed:{present:function(){return void 0!==this.lValue},dValue:function(){return this.lValue||this.fallback||{}},family:{get:function(){return this.dValue.family},set:function(t){Object(q.set)(this.lValue,"family",t),this.$emit("input",this.lValue)}},isCustom:function(){return"custom"===this.preset},preset:{get:function(){return"serif"===this.family||"sans-serif"===this.family||"monospace"===this.family||"inherit"===this.family?this.family:"custom"},set:function(t){this.family="custom"===t?"":t}}}};var xe=function(t){s(632)},ke=Object(o.a)(Ce,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"font-control style-control",class:{custom:t.isCustom}},[s("label",{staticClass:"label",attrs:{for:"custom"===t.preset?t.name:t.name+"-font-switcher"}},[t._v("\n "+t._s(t.label)+"\n ")]),t._v(" "),void 0!==t.fallback?s("input",{staticClass:"opt exlcude-disabled",attrs:{id:t.name+"-o",type:"checkbox"},domProps:{checked:t.present},on:{input:function(e){return t.$emit("input",void 0===t.value?t.fallback:void 0)}}}):t._e(),t._v(" "),void 0!==t.fallback?s("label",{staticClass:"opt-l",attrs:{for:t.name+"-o"}}):t._e(),t._v(" "),s("label",{staticClass:"select",attrs:{for:t.name+"-font-switcher",disabled:!t.present}},[s("select",{directives:[{name:"model",rawName:"v-model",value:t.preset,expression:"preset"}],staticClass:"font-switcher",attrs:{id:t.name+"-font-switcher",disabled:!t.present},on:{change:function(e){var s=Array.prototype.filter.call(e.target.options,function(t){return t.selected}).map(function(t){return"_value"in t?t._value:t.value});t.preset=e.target.multiple?s:s[0]}}},t._l(t.availableOptions,function(e){return s("option",{key:e,domProps:{value:e}},[t._v("\n "+t._s("custom"===e?t.$t("settings.style.fonts.custom"):e)+"\n ")])}),0),t._v(" "),s("i",{staticClass:"icon-down-open"})]),t._v(" "),t.isCustom?s("input",{directives:[{name:"model",rawName:"v-model",value:t.family,expression:"family"}],staticClass:"custom-font",attrs:{id:t.name,type:"text"},domProps:{value:t.family},on:{input:function(e){e.target.composing||(t.family=e.target.value)}}}):t._e()])},[],!1,xe,null,null).exports,ye={props:{large:{required:!1,type:Boolean,default:!1},contrast:{required:!1,type:Object,default:function(){return{}}}},computed:{hint:function(){var t=this.contrast.aaa?"aaa":this.contrast.aa?"aa":"bad",e=this.$t("settings.style.common.contrast.level.".concat(t)),s=this.$t("settings.style.common.contrast.context.text"),a=this.contrast.text;return this.$t("settings.style.common.contrast.hint",{level:e,context:s,ratio:a})},hint_18pt:function(){var t=this.contrast.laaa?"aaa":this.contrast.laa?"aa":"bad",e=this.$t("settings.style.common.contrast.level.".concat(t)),s=this.$t("settings.style.common.contrast.context.18pt"),a=this.contrast.text;return this.$t("settings.style.common.contrast.hint",{level:e,context:s,ratio:a})}}};var $e=function(t){s(634)},Le=Object(o.a)(ye,function(){var t=this,e=t.$createElement,s=t._self._c||e;return t.contrast?s("span",{staticClass:"contrast-ratio"},[s("span",{staticClass:"rating",attrs:{title:t.hint}},[t.contrast.aaa?s("span",[s("i",{staticClass:"icon-thumbs-up-alt"})]):t._e(),t._v(" "),!t.contrast.aaa&&t.contrast.aa?s("span",[s("i",{staticClass:"icon-adjust"})]):t._e(),t._v(" "),t.contrast.aaa||t.contrast.aa?t._e():s("span",[s("i",{staticClass:"icon-attention"})])]),t._v(" "),t.contrast&&t.large?s("span",{staticClass:"rating",attrs:{title:t.hint_18pt}},[t.contrast.laaa?s("span",[s("i",{staticClass:"icon-thumbs-up-alt"})]):t._e(),t._v(" "),!t.contrast.laaa&&t.contrast.laa?s("span",[s("i",{staticClass:"icon-adjust"})]):t._e(),t._v(" "),t.contrast.laaa||t.contrast.laa?t._e():s("span",[s("i",{staticClass:"icon-attention"})])]):t._e()]):t._e()},[],!1,$e,null,null).exports,Te={props:["exportObject","importLabel","exportLabel","importFailedText","validator","onImport","onImportFailure"],data:function(){return{importFailed:!1}},methods:{exportData:function(){var t=JSON.stringify(this.exportObject,null,2),e=document.createElement("a");e.setAttribute("download","pleroma_theme.json"),e.setAttribute("href","data:application/json;base64,"+window.btoa(t)),e.style.display="none",document.body.appendChild(e),e.click(),document.body.removeChild(e)},importData:function(){var t=this;this.importFailed=!1;var e=document.createElement("input");e.setAttribute("type","file"),e.setAttribute("accept",".json"),e.addEventListener("change",function(e){if(e.target.files[0]){var s=new FileReader;s.onload=function(e){var s=e.target;try{var a=JSON.parse(s.result);t.validator(a)?t.onImport(a):t.importFailed=!0}catch(e){t.importFailed=!0}},s.readAsText(e.target.files[0])}}),document.body.appendChild(e),e.click(),document.body.removeChild(e)}}};var Oe=function(t){s(636)},Pe=Object(o.a)(Te,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"import-export-container"},[t._t("before"),t._v(" "),s("button",{staticClass:"btn",on:{click:t.exportData}},[t._v("\n "+t._s(t.exportLabel)+"\n ")]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.importData}},[t._v("\n "+t._s(t.importLabel)+"\n ")]),t._v(" "),t._t("afterButtons"),t._v(" "),t.importFailed?s("p",{staticClass:"alert error"},[t._v("\n "+t._s(t.importFailedText)+"\n ")]):t._e(),t._v(" "),t._t("afterError")],2)},[],!1,Oe,null,null).exports;var Se=function(t){s(638)},Ie=Object(o.a)(null,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"preview-container"},[s("div",{staticClass:"underlay underlay-preview"}),t._v(" "),s("div",{staticClass:"panel dummy"},[s("div",{staticClass:"panel-heading"},[s("div",{staticClass:"title"},[t._v("\n "+t._s(t.$t("settings.style.preview.header"))+"\n "),s("span",{staticClass:"badge badge-notification"},[t._v("\n 99\n ")])]),t._v(" "),s("span",{staticClass:"faint"},[t._v("\n "+t._s(t.$t("settings.style.preview.header_faint"))+"\n ")]),t._v(" "),s("span",{staticClass:"alert error"},[t._v("\n "+t._s(t.$t("settings.style.preview.error"))+"\n ")]),t._v(" "),s("button",{staticClass:"btn"},[t._v("\n "+t._s(t.$t("settings.style.preview.button"))+"\n ")])]),t._v(" "),s("div",{staticClass:"panel-body theme-preview-content"},[s("div",{staticClass:"post"},[s("div",{staticClass:"avatar still-image"},[t._v("\n ( ͡° ͜ʖ ͡°)\n ")]),t._v(" "),s("div",{staticClass:"content"},[s("h4",[t._v("\n "+t._s(t.$t("settings.style.preview.content"))+"\n ")]),t._v(" "),s("i18n",{attrs:{path:"settings.style.preview.text"}},[s("code",{staticStyle:{"font-family":"var(--postCodeFont)"}},[t._v("\n "+t._s(t.$t("settings.style.preview.mono"))+"\n ")]),t._v(" "),s("a",{staticStyle:{color:"var(--link)"}},[t._v("\n "+t._s(t.$t("settings.style.preview.link"))+"\n ")])]),t._v(" "),t._m(0)],1)]),t._v(" "),s("div",{staticClass:"after-post"},[s("div",{staticClass:"avatar-alt"},[t._v("\n :^)\n ")]),t._v(" "),s("div",{staticClass:"content"},[s("i18n",{staticClass:"faint",attrs:{path:"settings.style.preview.fine_print",tag:"span"}},[s("a",{staticStyle:{color:"var(--faintLink)"}},[t._v("\n "+t._s(t.$t("settings.style.preview.faint_link"))+"\n ")])])],1)]),t._v(" "),s("div",{staticClass:"separator"}),t._v(" "),s("span",{staticClass:"alert error"},[t._v("\n "+t._s(t.$t("settings.style.preview.error"))+"\n ")]),t._v(" "),s("input",{attrs:{type:"text"},domProps:{value:t.$t("settings.style.preview.input")}}),t._v(" "),s("div",{staticClass:"actions"},[s("span",{staticClass:"checkbox"},[s("input",{attrs:{id:"preview_checkbox",checked:"very yes",type:"checkbox"}}),t._v(" "),s("label",{attrs:{for:"preview_checkbox"}},[t._v(t._s(t.$t("settings.style.preview.checkbox")))])]),t._v(" "),s("button",{staticClass:"btn"},[t._v("\n "+t._s(t.$t("settings.style.preview.button"))+"\n ")])])])])])},[function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"icons"},[e("i",{staticClass:"button-icon icon-reply",staticStyle:{color:"var(--cBlue)"}}),this._v(" "),e("i",{staticClass:"button-icon icon-retweet",staticStyle:{color:"var(--cGreen)"}}),this._v(" "),e("i",{staticClass:"button-icon icon-star",staticStyle:{color:"var(--cOrange)"}}),this._v(" "),e("i",{staticClass:"button-icon icon-cancel",staticStyle:{color:"var(--cRed)"}})])}],!1,Se,null,null).exports;function je(t,e){var s=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),s.push.apply(s,a)}return s}function Ee(t){for(var e=1;ece.a)return t(e+"future_version_imported")+" "+t(i?e+"snapshot_missing":e+"snapshot_present");if(nce.a)return t(e+"fe_downgraded")+" "+t(i?e+"migration_snapshot_ok":e+"migration_snapshot_gone");if(n=4.5,aaa:s>=7,laa:s>=3,laaa:s>=4.5},t},{})}catch(t){console.warn("Failure computing contrasts",t)}},previewRules:function(){return this.preview.rules?[].concat(z()(Object.values(this.preview.rules)),["color: var(--text)","font-family: var(--interfaceFont, sans-serif)"]).join(";"):""},shadowsAvailable:function(){return Object.keys(re.a).sort()},currentShadowOverriden:{get:function(){return!!this.currentShadow},set:function(t){t?Object(q.set)(this.shadowsLocal,this.shadowSelected,this.currentShadowFallback.map(function(t){return Object.assign({},t)})):Object(q.delete)(this.shadowsLocal,this.shadowSelected)}},currentShadowFallback:function(){return(this.previewTheme.shadows||{})[this.shadowSelected]},currentShadow:{get:function(){return this.shadowsLocal[this.shadowSelected]},set:function(t){Object(q.set)(this.shadowsLocal,this.shadowSelected,t)}},themeValid:function(){return!this.shadowsInvalid&&!this.colorsInvalid&&!this.radiiInvalid},exportedTheme:function(){var t=!(this.keepFonts||this.keepShadows||this.keepOpacity||this.keepRoundness||this.keepColor),e={themeEngineVersion:ce.a};return(this.keepFonts||t)&&(e.fonts=this.fontsLocal),(this.keepShadows||t)&&(e.shadows=this.shadowsLocal),(this.keepOpacity||t)&&(e.opacity=this.currentOpacity),(this.keepColor||t)&&(e.colors=this.currentColors),(this.keepRoundness||t)&&(e.radii=this.currentRadii),{_pleroma_theme_version:2,theme:Ee({themeEngineVersion:ce.a},this.previewTheme),source:e}}},components:{ColorInput:pe,OpacityInput:he,RangeInput:me,ContrastRatio:Le,ShadowControl:we,FontControl:ke,TabSwitcher:a.a,Preview:Ie,ExportImport:Pe,Checkbox:d.a},methods:{loadTheme:function(t,e){var s=t.theme,a=t.source,n=t._pleroma_theme_version,o=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(this.dismissWarning(),!a&&!s)throw new Error("Can't load theme: empty");var i="localStorage"!==e||s.colors?n:"l1",r=(s||{}).themeEngineVersion,l=(a||{}).themeEngineVersion||2,c=l===ce.a,u=void 0!==s&&void 0!==a&&l!==r,d=a&&o||!s;c&&!u||d||"l1"===i||"defaults"===e||(u&&"localStorage"===e?this.themeWarning={origin:e,themeEngineVersion:l,type:"snapshot_source_mismatch"}:s?c||(this.themeWarning={origin:e,noActionsPossible:!a,themeEngineVersion:l,type:"wrong_version"}):this.themeWarning={origin:e,noActionsPossible:!0,themeEngineVersion:l,type:"no_snapshot_old_version"}),this.normalizeLocalState(s,i,a,d)},forceLoadLocalStorage:function(){this.loadThemeFromLocalStorage(!0)},dismissWarning:function(){this.themeWarning=void 0,this.tempImportFile=void 0},forceLoad:function(){switch(this.themeWarning.origin){case"localStorage":this.loadThemeFromLocalStorage(!0);break;case"file":this.onImport(this.tempImportFile,!0)}this.dismissWarning()},forceSnapshot:function(){switch(this.themeWarning.origin){case"localStorage":this.loadThemeFromLocalStorage(!1,!0);break;case"file":console.err("Forcing snapshout from file is not supported yet")}this.dismissWarning()},loadThemeFromLocalStorage:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],s=this.$store.getters.mergedConfig,a=s.customTheme,n=s.customThemeSource;a||n?this.loadTheme({theme:a,source:e?a:n},"localStorage",t):this.loadTheme(this.$store.state.instance.themeData,"defaults",t)},setCustomTheme:function(){this.$store.dispatch("setOption",{name:"customTheme",value:Ee({themeEngineVersion:ce.a},this.previewTheme)}),this.$store.dispatch("setOption",{name:"customThemeSource",value:{themeEngineVersion:ce.a,shadows:this.shadowsLocal,fonts:this.fontsLocal,opacity:this.currentOpacity,colors:this.currentColors,radii:this.currentRadii}})},updatePreviewColorsAndShadows:function(){this.previewColors=Object(re.e)({opacity:this.currentOpacity,colors:this.currentColors}),this.previewShadows=Object(re.h)({shadows:this.shadowsLocal,opacity:this.previewTheme.opacity,themeEngineVersion:this.engineVersion},this.previewColors.theme.colors,this.previewColors.mod)},onImport:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];this.tempImportFile=t,this.loadTheme(t,"file",e)},importValidator:function(t){var e=t._pleroma_theme_version;return e>=1||e<=2},clearAll:function(){this.loadThemeFromLocalStorage()},clearV1:function(){var t=this;Object.keys(this.$data).filter(function(t){return t.endsWith("ColorLocal")||t.endsWith("OpacityLocal")}).filter(function(t){return!Re.includes(t)}).forEach(function(e){Object(q.set)(t.$data,e,void 0)})},clearRoundness:function(){var t=this;Object.keys(this.$data).filter(function(t){return t.endsWith("RadiusLocal")}).forEach(function(e){Object(q.set)(t.$data,e,void 0)})},clearOpacity:function(){var t=this;Object.keys(this.$data).filter(function(t){return t.endsWith("OpacityLocal")}).forEach(function(e){Object(q.set)(t.$data,e,void 0)})},clearShadows:function(){this.shadowsLocal={}},clearFonts:function(){this.fontsLocal={}},normalizeLocalState:function(t){var e,s=this,a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2?arguments[2]:void 0,o=arguments.length>3&&void 0!==arguments[3]&&arguments[3];void 0!==n&&(o||n.themeEngineVersion===ce.a)?(e=n,a=n.themeEngineVersion):e=t;var i=e.radii||e,r=e.opacity,l=e.shadows||{},c=e.fonts||{},u=e.themeEngineVersion?e.colors||e:Object(re.c)(e.colors||e);if(0===a&&(e.version&&(a=e.version),void 0===u.text&&void 0!==u.fg&&(a=1),void 0!==u.text&&void 0!==u.fg&&(a=2)),this.engineVersion=a,1===a&&(this.fgColorLocal=Object(ie.i)(u.btn),this.textColorLocal=Object(ie.i)(u.fg)),!this.keepColor){this.clearV1();var d=new Set(1!==a?Object.keys(le.c):[]);1!==a&&"l1"!==a||d.add("bg").add("link").add("cRed").add("cBlue").add("cGreen").add("cOrange"),d.forEach(function(t){var e=u[t],a=Object(ie.i)(u[t]);s[t+"ColorLocal"]="#aN"===a?e:a})}r&&!this.keepOpacity&&(this.clearOpacity(),Object.entries(r).forEach(function(t){var e=A()(t,2),a=e[0],n=e[1];null==n||Number.isNaN(n)||(s[a+"OpacityLocal"]=n)})),this.keepRoundness||(this.clearRoundness(),Object.entries(i).forEach(function(t){var e=A()(t,2),a=e[0],n=e[1],o=a.endsWith("Radius")?a.split("Radius")[0]:a;s[o+"RadiusLocal"]=n})),this.keepShadows||(this.clearShadows(),this.shadowsLocal=2===a?Object(re.m)(l,this.previewTheme.opacity):l,this.shadowSelected=this.shadowsAvailable[0]),this.keepFonts||(this.clearFonts(),this.fontsLocal=c)}},watch:{currentRadii:function(){try{this.previewRadii=Object(re.g)({radii:this.currentRadii}),this.radiiInvalid=!1}catch(t){this.radiiInvalid=!0,console.warn(t)}},shadowsLocal:{handler:function(){if(1!==Object.getOwnPropertyNames(this.previewColors).length)try{this.updatePreviewColorsAndShadows(),this.shadowsInvalid=!1}catch(t){this.shadowsInvalid=!0,console.warn(t)}},deep:!0},fontsLocal:{handler:function(){try{this.previewFonts=Object(re.f)({fonts:this.fontsLocal}),this.fontsInvalid=!1}catch(t){this.fontsInvalid=!0,console.warn(t)}},deep:!0},currentColors:function(){try{this.updatePreviewColorsAndShadows(),this.colorsInvalid=!1,this.shadowsInvalid=!1}catch(t){this.colorsInvalid=!0,this.shadowsInvalid=!0,console.warn(t)}},currentOpacity:function(){try{this.updatePreviewColorsAndShadows()}catch(t){console.warn(t)}},selected:function(){this.dismissWarning(),1===this.selectedVersion?(this.keepRoundness||this.clearRoundness(),this.keepShadows||this.clearShadows(),this.keepOpacity||this.clearOpacity(),this.keepColor||(this.clearV1(),this.bgColorLocal=this.selected[1],this.fgColorLocal=this.selected[2],this.textColorLocal=this.selected[3],this.linkColorLocal=this.selected[4],this.cRedColorLocal=this.selected[5],this.cGreenColorLocal=this.selected[6],this.cBlueColorLocal=this.selected[7],this.cOrangeColorLocal=this.selected[8])):this.selectedVersion>=2&&this.normalizeLocalState(this.selected.theme,2,this.selected.source)}}};var Fe=function(t){s(624)},Me=Object(o.a)(Be,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"theme-tab"},[s("div",{staticClass:"presets-container"},[s("div",{staticClass:"save-load"},[t.themeWarning?s("div",{staticClass:"theme-warning"},[s("div",{staticClass:"alert warning"},[t._v("\n "+t._s(t.themeWarningHelp)+"\n ")]),t._v(" "),s("div",{staticClass:"buttons"},["snapshot_source_mismatch"===t.themeWarning.type?[s("button",{staticClass:"btn",on:{click:t.forceLoad}},[t._v("\n "+t._s(t.$t("settings.style.switcher.use_source"))+"\n ")]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.forceSnapshot}},[t._v("\n "+t._s(t.$t("settings.style.switcher.use_snapshot"))+"\n ")])]:t.themeWarning.noActionsPossible?[s("button",{staticClass:"btn",on:{click:t.dismissWarning}},[t._v("\n "+t._s(t.$t("general.dismiss"))+"\n ")])]:[s("button",{staticClass:"btn",on:{click:t.forceLoad}},[t._v("\n "+t._s(t.$t("settings.style.switcher.load_theme"))+"\n ")]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.dismissWarning}},[t._v("\n "+t._s(t.$t("settings.style.switcher.keep_as_is"))+"\n ")])]],2)]):t._e(),t._v(" "),s("ExportImport",{attrs:{"export-object":t.exportedTheme,"export-label":t.$t("settings.export_theme"),"import-label":t.$t("settings.import_theme"),"import-failed-text":t.$t("settings.invalid_theme_imported"),"on-import":t.onImport,validator:t.importValidator}},[s("template",{slot:"before"},[s("div",{staticClass:"presets"},[t._v("\n "+t._s(t.$t("settings.presets"))+"\n "),s("label",{staticClass:"select",attrs:{for:"preset-switcher"}},[s("select",{directives:[{name:"model",rawName:"v-model",value:t.selected,expression:"selected"}],staticClass:"preset-switcher",attrs:{id:"preset-switcher"},on:{change:function(e){var s=Array.prototype.filter.call(e.target.options,function(t){return t.selected}).map(function(t){return"_value"in t?t._value:t.value});t.selected=e.target.multiple?s:s[0]}}},t._l(t.availableStyles,function(e){return s("option",{key:e.name,style:{backgroundColor:e[1]||(e.theme||e.source).colors.bg,color:e[3]||(e.theme||e.source).colors.text},domProps:{value:e}},[t._v("\n "+t._s(e[0]||e.name)+"\n ")])}),0),t._v(" "),s("i",{staticClass:"icon-down-open"})])])])],2)],1),t._v(" "),s("div",{staticClass:"save-load-options"},[s("span",{staticClass:"keep-option"},[s("Checkbox",{model:{value:t.keepColor,callback:function(e){t.keepColor=e},expression:"keepColor"}},[t._v("\n "+t._s(t.$t("settings.style.switcher.keep_color"))+"\n ")])],1),t._v(" "),s("span",{staticClass:"keep-option"},[s("Checkbox",{model:{value:t.keepShadows,callback:function(e){t.keepShadows=e},expression:"keepShadows"}},[t._v("\n "+t._s(t.$t("settings.style.switcher.keep_shadows"))+"\n ")])],1),t._v(" "),s("span",{staticClass:"keep-option"},[s("Checkbox",{model:{value:t.keepOpacity,callback:function(e){t.keepOpacity=e},expression:"keepOpacity"}},[t._v("\n "+t._s(t.$t("settings.style.switcher.keep_opacity"))+"\n ")])],1),t._v(" "),s("span",{staticClass:"keep-option"},[s("Checkbox",{model:{value:t.keepRoundness,callback:function(e){t.keepRoundness=e},expression:"keepRoundness"}},[t._v("\n "+t._s(t.$t("settings.style.switcher.keep_roundness"))+"\n ")])],1),t._v(" "),s("span",{staticClass:"keep-option"},[s("Checkbox",{model:{value:t.keepFonts,callback:function(e){t.keepFonts=e},expression:"keepFonts"}},[t._v("\n "+t._s(t.$t("settings.style.switcher.keep_fonts"))+"\n ")])],1),t._v(" "),s("p",[t._v(t._s(t.$t("settings.style.switcher.save_load_hint")))])])]),t._v(" "),s("preview",{style:t.previewRules}),t._v(" "),s("keep-alive",[s("tab-switcher",{key:"style-tweak"},[s("div",{staticClass:"color-container",attrs:{label:t.$t("settings.style.common_colors._tab_label")}},[s("div",{staticClass:"tab-header"},[s("p",[t._v(t._s(t.$t("settings.theme_help")))]),t._v(" "),s("div",{staticClass:"tab-header-buttons"},[s("button",{staticClass:"btn",on:{click:t.clearOpacity}},[t._v("\n "+t._s(t.$t("settings.style.switcher.clear_opacity"))+"\n ")]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.clearV1}},[t._v("\n "+t._s(t.$t("settings.style.switcher.clear_all"))+"\n ")])])]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.theme_help_v2_1")))]),t._v(" "),s("h4",[t._v(t._s(t.$t("settings.style.common_colors.main")))]),t._v(" "),s("div",{staticClass:"color-item"},[s("ColorInput",{attrs:{name:"bgColor",label:t.$t("settings.background")},model:{value:t.bgColorLocal,callback:function(e){t.bgColorLocal=e},expression:"bgColorLocal"}}),t._v(" "),s("OpacityInput",{attrs:{name:"bgOpacity",fallback:t.previewTheme.opacity.bg},model:{value:t.bgOpacityLocal,callback:function(e){t.bgOpacityLocal=e},expression:"bgOpacityLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"textColor",label:t.$t("settings.text")},model:{value:t.textColorLocal,callback:function(e){t.textColorLocal=e},expression:"textColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.bgText}}),t._v(" "),s("ColorInput",{attrs:{name:"accentColor",fallback:t.previewTheme.colors.link,label:t.$t("settings.accent"),"show-optional-tickbox":void 0!==t.linkColorLocal},model:{value:t.accentColorLocal,callback:function(e){t.accentColorLocal=e},expression:"accentColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"linkColor",fallback:t.previewTheme.colors.accent,label:t.$t("settings.links"),"show-optional-tickbox":void 0!==t.accentColorLocal},model:{value:t.linkColorLocal,callback:function(e){t.linkColorLocal=e},expression:"linkColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.bgLink}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("ColorInput",{attrs:{name:"fgColor",label:t.$t("settings.foreground")},model:{value:t.fgColorLocal,callback:function(e){t.fgColorLocal=e},expression:"fgColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"fgTextColor",label:t.$t("settings.text"),fallback:t.previewTheme.colors.fgText},model:{value:t.fgTextColorLocal,callback:function(e){t.fgTextColorLocal=e},expression:"fgTextColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"fgLinkColor",label:t.$t("settings.links"),fallback:t.previewTheme.colors.fgLink},model:{value:t.fgLinkColorLocal,callback:function(e){t.fgLinkColorLocal=e},expression:"fgLinkColorLocal"}}),t._v(" "),s("p",[t._v(t._s(t.$t("settings.style.common_colors.foreground_hint")))])],1),t._v(" "),s("h4",[t._v(t._s(t.$t("settings.style.common_colors.rgbo")))]),t._v(" "),s("div",{staticClass:"color-item"},[s("ColorInput",{attrs:{name:"cRedColor",label:t.$t("settings.cRed")},model:{value:t.cRedColorLocal,callback:function(e){t.cRedColorLocal=e},expression:"cRedColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.bgCRed}}),t._v(" "),s("ColorInput",{attrs:{name:"cBlueColor",label:t.$t("settings.cBlue")},model:{value:t.cBlueColorLocal,callback:function(e){t.cBlueColorLocal=e},expression:"cBlueColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.bgCBlue}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("ColorInput",{attrs:{name:"cGreenColor",label:t.$t("settings.cGreen")},model:{value:t.cGreenColorLocal,callback:function(e){t.cGreenColorLocal=e},expression:"cGreenColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.bgCGreen}}),t._v(" "),s("ColorInput",{attrs:{name:"cOrangeColor",label:t.$t("settings.cOrange")},model:{value:t.cOrangeColorLocal,callback:function(e){t.cOrangeColorLocal=e},expression:"cOrangeColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.bgCOrange}})],1),t._v(" "),s("p",[t._v(t._s(t.$t("settings.theme_help_v2_2")))])]),t._v(" "),s("div",{staticClass:"color-container",attrs:{label:t.$t("settings.style.advanced_colors._tab_label")}},[s("div",{staticClass:"tab-header"},[s("p",[t._v(t._s(t.$t("settings.theme_help")))]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.clearOpacity}},[t._v("\n "+t._s(t.$t("settings.style.switcher.clear_opacity"))+"\n ")]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.clearV1}},[t._v("\n "+t._s(t.$t("settings.style.switcher.clear_all"))+"\n ")])]),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.post")))]),t._v(" "),s("ColorInput",{attrs:{name:"postLinkColor",fallback:t.previewTheme.colors.accent,label:t.$t("settings.links")},model:{value:t.postLinkColorLocal,callback:function(e){t.postLinkColorLocal=e},expression:"postLinkColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.postLink}}),t._v(" "),s("ColorInput",{attrs:{name:"postGreentextColor",fallback:t.previewTheme.colors.cGreen,label:t.$t("settings.greentext")},model:{value:t.postGreentextColorLocal,callback:function(e){t.postGreentextColorLocal=e},expression:"postGreentextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.postGreentext}}),t._v(" "),s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.alert")))]),t._v(" "),s("ColorInput",{attrs:{name:"alertError",label:t.$t("settings.style.advanced_colors.alert_error"),fallback:t.previewTheme.colors.alertError},model:{value:t.alertErrorColorLocal,callback:function(e){t.alertErrorColorLocal=e},expression:"alertErrorColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"alertErrorText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.alertErrorText},model:{value:t.alertErrorTextColorLocal,callback:function(e){t.alertErrorTextColorLocal=e},expression:"alertErrorTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.alertErrorText,large:""}}),t._v(" "),s("ColorInput",{attrs:{name:"alertWarning",label:t.$t("settings.style.advanced_colors.alert_warning"),fallback:t.previewTheme.colors.alertWarning},model:{value:t.alertWarningColorLocal,callback:function(e){t.alertWarningColorLocal=e},expression:"alertWarningColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"alertWarningText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.alertWarningText},model:{value:t.alertWarningTextColorLocal,callback:function(e){t.alertWarningTextColorLocal=e},expression:"alertWarningTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.alertWarningText,large:""}}),t._v(" "),s("ColorInput",{attrs:{name:"alertNeutral",label:t.$t("settings.style.advanced_colors.alert_neutral"),fallback:t.previewTheme.colors.alertNeutral},model:{value:t.alertNeutralColorLocal,callback:function(e){t.alertNeutralColorLocal=e},expression:"alertNeutralColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"alertNeutralText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.alertNeutralText},model:{value:t.alertNeutralTextColorLocal,callback:function(e){t.alertNeutralTextColorLocal=e},expression:"alertNeutralTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.alertNeutralText,large:""}}),t._v(" "),s("OpacityInput",{attrs:{name:"alertOpacity",fallback:t.previewTheme.opacity.alert},model:{value:t.alertOpacityLocal,callback:function(e){t.alertOpacityLocal=e},expression:"alertOpacityLocal"}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.badge")))]),t._v(" "),s("ColorInput",{attrs:{name:"badgeNotification",label:t.$t("settings.style.advanced_colors.badge_notification"),fallback:t.previewTheme.colors.badgeNotification},model:{value:t.badgeNotificationColorLocal,callback:function(e){t.badgeNotificationColorLocal=e},expression:"badgeNotificationColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"badgeNotificationText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.badgeNotificationText},model:{value:t.badgeNotificationTextColorLocal,callback:function(e){t.badgeNotificationTextColorLocal=e},expression:"badgeNotificationTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.badgeNotificationText,large:""}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.panel_header")))]),t._v(" "),s("ColorInput",{attrs:{name:"panelColor",fallback:t.previewTheme.colors.panel,label:t.$t("settings.background")},model:{value:t.panelColorLocal,callback:function(e){t.panelColorLocal=e},expression:"panelColorLocal"}}),t._v(" "),s("OpacityInput",{attrs:{name:"panelOpacity",fallback:t.previewTheme.opacity.panel,disabled:"transparent"===t.panelColorLocal},model:{value:t.panelOpacityLocal,callback:function(e){t.panelOpacityLocal=e},expression:"panelOpacityLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"panelTextColor",fallback:t.previewTheme.colors.panelText,label:t.$t("settings.text")},model:{value:t.panelTextColorLocal,callback:function(e){t.panelTextColorLocal=e},expression:"panelTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.panelText,large:""}}),t._v(" "),s("ColorInput",{attrs:{name:"panelLinkColor",fallback:t.previewTheme.colors.panelLink,label:t.$t("settings.links")},model:{value:t.panelLinkColorLocal,callback:function(e){t.panelLinkColorLocal=e},expression:"panelLinkColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.panelLink,large:""}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.top_bar")))]),t._v(" "),s("ColorInput",{attrs:{name:"topBarColor",fallback:t.previewTheme.colors.topBar,label:t.$t("settings.background")},model:{value:t.topBarColorLocal,callback:function(e){t.topBarColorLocal=e},expression:"topBarColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"topBarTextColor",fallback:t.previewTheme.colors.topBarText,label:t.$t("settings.text")},model:{value:t.topBarTextColorLocal,callback:function(e){t.topBarTextColorLocal=e},expression:"topBarTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.topBarText}}),t._v(" "),s("ColorInput",{attrs:{name:"topBarLinkColor",fallback:t.previewTheme.colors.topBarLink,label:t.$t("settings.links")},model:{value:t.topBarLinkColorLocal,callback:function(e){t.topBarLinkColorLocal=e},expression:"topBarLinkColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.topBarLink}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.inputs")))]),t._v(" "),s("ColorInput",{attrs:{name:"inputColor",fallback:t.previewTheme.colors.input,label:t.$t("settings.background")},model:{value:t.inputColorLocal,callback:function(e){t.inputColorLocal=e},expression:"inputColorLocal"}}),t._v(" "),s("OpacityInput",{attrs:{name:"inputOpacity",fallback:t.previewTheme.opacity.input,disabled:"transparent"===t.inputColorLocal},model:{value:t.inputOpacityLocal,callback:function(e){t.inputOpacityLocal=e},expression:"inputOpacityLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"inputTextColor",fallback:t.previewTheme.colors.inputText,label:t.$t("settings.text")},model:{value:t.inputTextColorLocal,callback:function(e){t.inputTextColorLocal=e},expression:"inputTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.inputText}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.buttons")))]),t._v(" "),s("ColorInput",{attrs:{name:"btnColor",fallback:t.previewTheme.colors.btn,label:t.$t("settings.background")},model:{value:t.btnColorLocal,callback:function(e){t.btnColorLocal=e},expression:"btnColorLocal"}}),t._v(" "),s("OpacityInput",{attrs:{name:"btnOpacity",fallback:t.previewTheme.opacity.btn,disabled:"transparent"===t.btnColorLocal},model:{value:t.btnOpacityLocal,callback:function(e){t.btnOpacityLocal=e},expression:"btnOpacityLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"btnTextColor",fallback:t.previewTheme.colors.btnText,label:t.$t("settings.text")},model:{value:t.btnTextColorLocal,callback:function(e){t.btnTextColorLocal=e},expression:"btnTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnText}}),t._v(" "),s("ColorInput",{attrs:{name:"btnPanelTextColor",fallback:t.previewTheme.colors.btnPanelText,label:t.$t("settings.style.advanced_colors.panel_header")},model:{value:t.btnPanelTextColorLocal,callback:function(e){t.btnPanelTextColorLocal=e},expression:"btnPanelTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnPanelText}}),t._v(" "),s("ColorInput",{attrs:{name:"btnTopBarTextColor",fallback:t.previewTheme.colors.btnTopBarText,label:t.$t("settings.style.advanced_colors.top_bar")},model:{value:t.btnTopBarTextColorLocal,callback:function(e){t.btnTopBarTextColorLocal=e},expression:"btnTopBarTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnTopBarText}}),t._v(" "),s("h5",[t._v(t._s(t.$t("settings.style.advanced_colors.pressed")))]),t._v(" "),s("ColorInput",{attrs:{name:"btnPressedColor",fallback:t.previewTheme.colors.btnPressed,label:t.$t("settings.background")},model:{value:t.btnPressedColorLocal,callback:function(e){t.btnPressedColorLocal=e},expression:"btnPressedColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"btnPressedTextColor",fallback:t.previewTheme.colors.btnPressedText,label:t.$t("settings.text")},model:{value:t.btnPressedTextColorLocal,callback:function(e){t.btnPressedTextColorLocal=e},expression:"btnPressedTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnPressedText}}),t._v(" "),s("ColorInput",{attrs:{name:"btnPressedPanelTextColor",fallback:t.previewTheme.colors.btnPressedPanelText,label:t.$t("settings.style.advanced_colors.panel_header")},model:{value:t.btnPressedPanelTextColorLocal,callback:function(e){t.btnPressedPanelTextColorLocal=e},expression:"btnPressedPanelTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnPressedPanelText}}),t._v(" "),s("ColorInput",{attrs:{name:"btnPressedTopBarTextColor",fallback:t.previewTheme.colors.btnPressedTopBarText,label:t.$t("settings.style.advanced_colors.top_bar")},model:{value:t.btnPressedTopBarTextColorLocal,callback:function(e){t.btnPressedTopBarTextColorLocal=e},expression:"btnPressedTopBarTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnPressedTopBarText}}),t._v(" "),s("h5",[t._v(t._s(t.$t("settings.style.advanced_colors.disabled")))]),t._v(" "),s("ColorInput",{attrs:{name:"btnDisabledColor",fallback:t.previewTheme.colors.btnDisabled,label:t.$t("settings.background")},model:{value:t.btnDisabledColorLocal,callback:function(e){t.btnDisabledColorLocal=e},expression:"btnDisabledColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"btnDisabledTextColor",fallback:t.previewTheme.colors.btnDisabledText,label:t.$t("settings.text")},model:{value:t.btnDisabledTextColorLocal,callback:function(e){t.btnDisabledTextColorLocal=e},expression:"btnDisabledTextColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"btnDisabledPanelTextColor",fallback:t.previewTheme.colors.btnDisabledPanelText,label:t.$t("settings.style.advanced_colors.panel_header")},model:{value:t.btnDisabledPanelTextColorLocal,callback:function(e){t.btnDisabledPanelTextColorLocal=e},expression:"btnDisabledPanelTextColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"btnDisabledTopBarTextColor",fallback:t.previewTheme.colors.btnDisabledTopBarText,label:t.$t("settings.style.advanced_colors.top_bar")},model:{value:t.btnDisabledTopBarTextColorLocal,callback:function(e){t.btnDisabledTopBarTextColorLocal=e},expression:"btnDisabledTopBarTextColorLocal"}}),t._v(" "),s("h5",[t._v(t._s(t.$t("settings.style.advanced_colors.toggled")))]),t._v(" "),s("ColorInput",{attrs:{name:"btnToggledColor",fallback:t.previewTheme.colors.btnToggled,label:t.$t("settings.background")},model:{value:t.btnToggledColorLocal,callback:function(e){t.btnToggledColorLocal=e},expression:"btnToggledColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"btnToggledTextColor",fallback:t.previewTheme.colors.btnToggledText,label:t.$t("settings.text")},model:{value:t.btnToggledTextColorLocal,callback:function(e){t.btnToggledTextColorLocal=e},expression:"btnToggledTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnToggledText}}),t._v(" "),s("ColorInput",{attrs:{name:"btnToggledPanelTextColor",fallback:t.previewTheme.colors.btnToggledPanelText,label:t.$t("settings.style.advanced_colors.panel_header")},model:{value:t.btnToggledPanelTextColorLocal,callback:function(e){t.btnToggledPanelTextColorLocal=e},expression:"btnToggledPanelTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnToggledPanelText}}),t._v(" "),s("ColorInput",{attrs:{name:"btnToggledTopBarTextColor",fallback:t.previewTheme.colors.btnToggledTopBarText,label:t.$t("settings.style.advanced_colors.top_bar")},model:{value:t.btnToggledTopBarTextColorLocal,callback:function(e){t.btnToggledTopBarTextColorLocal=e},expression:"btnToggledTopBarTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnToggledTopBarText}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.tabs")))]),t._v(" "),s("ColorInput",{attrs:{name:"tabColor",fallback:t.previewTheme.colors.tab,label:t.$t("settings.background")},model:{value:t.tabColorLocal,callback:function(e){t.tabColorLocal=e},expression:"tabColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"tabTextColor",fallback:t.previewTheme.colors.tabText,label:t.$t("settings.text")},model:{value:t.tabTextColorLocal,callback:function(e){t.tabTextColorLocal=e},expression:"tabTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.tabText}}),t._v(" "),s("ColorInput",{attrs:{name:"tabActiveTextColor",fallback:t.previewTheme.colors.tabActiveText,label:t.$t("settings.text")},model:{value:t.tabActiveTextColorLocal,callback:function(e){t.tabActiveTextColorLocal=e},expression:"tabActiveTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.tabActiveText}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.borders")))]),t._v(" "),s("ColorInput",{attrs:{name:"borderColor",fallback:t.previewTheme.colors.border,label:t.$t("settings.style.common.color")},model:{value:t.borderColorLocal,callback:function(e){t.borderColorLocal=e},expression:"borderColorLocal"}}),t._v(" "),s("OpacityInput",{attrs:{name:"borderOpacity",fallback:t.previewTheme.opacity.border,disabled:"transparent"===t.borderColorLocal},model:{value:t.borderOpacityLocal,callback:function(e){t.borderOpacityLocal=e},expression:"borderOpacityLocal"}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.faint_text")))]),t._v(" "),s("ColorInput",{attrs:{name:"faintColor",fallback:t.previewTheme.colors.faint,label:t.$t("settings.text")},model:{value:t.faintColorLocal,callback:function(e){t.faintColorLocal=e},expression:"faintColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"faintLinkColor",fallback:t.previewTheme.colors.faintLink,label:t.$t("settings.links")},model:{value:t.faintLinkColorLocal,callback:function(e){t.faintLinkColorLocal=e},expression:"faintLinkColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"panelFaintColor",fallback:t.previewTheme.colors.panelFaint,label:t.$t("settings.style.advanced_colors.panel_header")},model:{value:t.panelFaintColorLocal,callback:function(e){t.panelFaintColorLocal=e},expression:"panelFaintColorLocal"}}),t._v(" "),s("OpacityInput",{attrs:{name:"faintOpacity",fallback:t.previewTheme.opacity.faint},model:{value:t.faintOpacityLocal,callback:function(e){t.faintOpacityLocal=e},expression:"faintOpacityLocal"}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.underlay")))]),t._v(" "),s("ColorInput",{attrs:{name:"underlay",label:t.$t("settings.style.advanced_colors.underlay"),fallback:t.previewTheme.colors.underlay},model:{value:t.underlayColorLocal,callback:function(e){t.underlayColorLocal=e},expression:"underlayColorLocal"}}),t._v(" "),s("OpacityInput",{attrs:{name:"underlayOpacity",fallback:t.previewTheme.opacity.underlay,disabled:"transparent"===t.underlayOpacityLocal},model:{value:t.underlayOpacityLocal,callback:function(e){t.underlayOpacityLocal=e},expression:"underlayOpacityLocal"}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.poll")))]),t._v(" "),s("ColorInput",{attrs:{name:"poll",label:t.$t("settings.background"),fallback:t.previewTheme.colors.poll},model:{value:t.pollColorLocal,callback:function(e){t.pollColorLocal=e},expression:"pollColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"pollText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.pollText},model:{value:t.pollTextColorLocal,callback:function(e){t.pollTextColorLocal=e},expression:"pollTextColorLocal"}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.icons")))]),t._v(" "),s("ColorInput",{attrs:{name:"icon",label:t.$t("settings.style.advanced_colors.icons"),fallback:t.previewTheme.colors.icon},model:{value:t.iconColorLocal,callback:function(e){t.iconColorLocal=e},expression:"iconColorLocal"}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.highlight")))]),t._v(" "),s("ColorInput",{attrs:{name:"highlight",label:t.$t("settings.background"),fallback:t.previewTheme.colors.highlight},model:{value:t.highlightColorLocal,callback:function(e){t.highlightColorLocal=e},expression:"highlightColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"highlightText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.highlightText},model:{value:t.highlightTextColorLocal,callback:function(e){t.highlightTextColorLocal=e},expression:"highlightTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.highlightText}}),t._v(" "),s("ColorInput",{attrs:{name:"highlightLink",label:t.$t("settings.links"),fallback:t.previewTheme.colors.highlightLink},model:{value:t.highlightLinkColorLocal,callback:function(e){t.highlightLinkColorLocal=e},expression:"highlightLinkColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.highlightLink}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.popover")))]),t._v(" "),s("ColorInput",{attrs:{name:"popover",label:t.$t("settings.background"),fallback:t.previewTheme.colors.popover},model:{value:t.popoverColorLocal,callback:function(e){t.popoverColorLocal=e},expression:"popoverColorLocal"}}),t._v(" "),s("OpacityInput",{attrs:{name:"popoverOpacity",fallback:t.previewTheme.opacity.popover,disabled:"transparent"===t.popoverOpacityLocal},model:{value:t.popoverOpacityLocal,callback:function(e){t.popoverOpacityLocal=e},expression:"popoverOpacityLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"popoverText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.popoverText},model:{value:t.popoverTextColorLocal,callback:function(e){t.popoverTextColorLocal=e},expression:"popoverTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.popoverText}}),t._v(" "),s("ColorInput",{attrs:{name:"popoverLink",label:t.$t("settings.links"),fallback:t.previewTheme.colors.popoverLink},model:{value:t.popoverLinkColorLocal,callback:function(e){t.popoverLinkColorLocal=e},expression:"popoverLinkColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.popoverLink}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.selectedPost")))]),t._v(" "),s("ColorInput",{attrs:{name:"selectedPost",label:t.$t("settings.background"),fallback:t.previewTheme.colors.selectedPost},model:{value:t.selectedPostColorLocal,callback:function(e){t.selectedPostColorLocal=e},expression:"selectedPostColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"selectedPostText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.selectedPostText},model:{value:t.selectedPostTextColorLocal,callback:function(e){t.selectedPostTextColorLocal=e},expression:"selectedPostTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.selectedPostText}}),t._v(" "),s("ColorInput",{attrs:{name:"selectedPostLink",label:t.$t("settings.links"),fallback:t.previewTheme.colors.selectedPostLink},model:{value:t.selectedPostLinkColorLocal,callback:function(e){t.selectedPostLinkColorLocal=e},expression:"selectedPostLinkColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.selectedPostLink}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.selectedMenu")))]),t._v(" "),s("ColorInput",{attrs:{name:"selectedMenu",label:t.$t("settings.background"),fallback:t.previewTheme.colors.selectedMenu},model:{value:t.selectedMenuColorLocal,callback:function(e){t.selectedMenuColorLocal=e},expression:"selectedMenuColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"selectedMenuText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.selectedMenuText},model:{value:t.selectedMenuTextColorLocal,callback:function(e){t.selectedMenuTextColorLocal=e},expression:"selectedMenuTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.selectedMenuText}}),t._v(" "),s("ColorInput",{attrs:{name:"selectedMenuLink",label:t.$t("settings.links"),fallback:t.previewTheme.colors.selectedMenuLink},model:{value:t.selectedMenuLinkColorLocal,callback:function(e){t.selectedMenuLinkColorLocal=e},expression:"selectedMenuLinkColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.selectedMenuLink}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("chats.chats")))]),t._v(" "),s("ColorInput",{attrs:{name:"chatBgColor",fallback:t.previewTheme.colors.bg,label:t.$t("settings.background")},model:{value:t.chatBgColorLocal,callback:function(e){t.chatBgColorLocal=e},expression:"chatBgColorLocal"}}),t._v(" "),s("h5",[t._v(t._s(t.$t("settings.style.advanced_colors.chat.incoming")))]),t._v(" "),s("ColorInput",{attrs:{name:"chatMessageIncomingBgColor",fallback:t.previewTheme.colors.bg,label:t.$t("settings.background")},model:{value:t.chatMessageIncomingBgColorLocal,callback:function(e){t.chatMessageIncomingBgColorLocal=e},expression:"chatMessageIncomingBgColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"chatMessageIncomingTextColor",fallback:t.previewTheme.colors.text,label:t.$t("settings.text")},model:{value:t.chatMessageIncomingTextColorLocal,callback:function(e){t.chatMessageIncomingTextColorLocal=e},expression:"chatMessageIncomingTextColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"chatMessageIncomingLinkColor",fallback:t.previewTheme.colors.link,label:t.$t("settings.links")},model:{value:t.chatMessageIncomingLinkColorLocal,callback:function(e){t.chatMessageIncomingLinkColorLocal=e},expression:"chatMessageIncomingLinkColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"chatMessageIncomingBorderLinkColor",fallback:t.previewTheme.colors.fg,label:t.$t("settings.style.advanced_colors.chat.border")},model:{value:t.chatMessageIncomingBorderColorLocal,callback:function(e){t.chatMessageIncomingBorderColorLocal=e},expression:"chatMessageIncomingBorderColorLocal"}}),t._v(" "),s("h5",[t._v(t._s(t.$t("settings.style.advanced_colors.chat.outgoing")))]),t._v(" "),s("ColorInput",{attrs:{name:"chatMessageOutgoingBgColor",fallback:t.previewTheme.colors.bg,label:t.$t("settings.background")},model:{value:t.chatMessageOutgoingBgColorLocal,callback:function(e){t.chatMessageOutgoingBgColorLocal=e},expression:"chatMessageOutgoingBgColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"chatMessageOutgoingTextColor",fallback:t.previewTheme.colors.text,label:t.$t("settings.text")},model:{value:t.chatMessageOutgoingTextColorLocal,callback:function(e){t.chatMessageOutgoingTextColorLocal=e},expression:"chatMessageOutgoingTextColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"chatMessageOutgoingLinkColor",fallback:t.previewTheme.colors.link,label:t.$t("settings.links")},model:{value:t.chatMessageOutgoingLinkColorLocal,callback:function(e){t.chatMessageOutgoingLinkColorLocal=e},expression:"chatMessageOutgoingLinkColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"chatMessageOutgoingBorderLinkColor",fallback:t.previewTheme.colors.bg,label:t.$t("settings.style.advanced_colors.chat.border")},model:{value:t.chatMessageOutgoingBorderColorLocal,callback:function(e){t.chatMessageOutgoingBorderColorLocal=e},expression:"chatMessageOutgoingBorderColorLocal"}})],1)]),t._v(" "),s("div",{staticClass:"radius-container",attrs:{label:t.$t("settings.style.radii._tab_label")}},[s("div",{staticClass:"tab-header"},[s("p",[t._v(t._s(t.$t("settings.radii_help")))]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.clearRoundness}},[t._v("\n "+t._s(t.$t("settings.style.switcher.clear_all"))+"\n ")])]),t._v(" "),s("RangeInput",{attrs:{name:"btnRadius",label:t.$t("settings.btnRadius"),fallback:t.previewTheme.radii.btn,max:"16","hard-min":"0"},model:{value:t.btnRadiusLocal,callback:function(e){t.btnRadiusLocal=e},expression:"btnRadiusLocal"}}),t._v(" "),s("RangeInput",{attrs:{name:"inputRadius",label:t.$t("settings.inputRadius"),fallback:t.previewTheme.radii.input,max:"9","hard-min":"0"},model:{value:t.inputRadiusLocal,callback:function(e){t.inputRadiusLocal=e},expression:"inputRadiusLocal"}}),t._v(" "),s("RangeInput",{attrs:{name:"checkboxRadius",label:t.$t("settings.checkboxRadius"),fallback:t.previewTheme.radii.checkbox,max:"16","hard-min":"0"},model:{value:t.checkboxRadiusLocal,callback:function(e){t.checkboxRadiusLocal=e},expression:"checkboxRadiusLocal"}}),t._v(" "),s("RangeInput",{attrs:{name:"panelRadius",label:t.$t("settings.panelRadius"),fallback:t.previewTheme.radii.panel,max:"50","hard-min":"0"},model:{value:t.panelRadiusLocal,callback:function(e){t.panelRadiusLocal=e},expression:"panelRadiusLocal"}}),t._v(" "),s("RangeInput",{attrs:{name:"avatarRadius",label:t.$t("settings.avatarRadius"),fallback:t.previewTheme.radii.avatar,max:"28","hard-min":"0"},model:{value:t.avatarRadiusLocal,callback:function(e){t.avatarRadiusLocal=e},expression:"avatarRadiusLocal"}}),t._v(" "),s("RangeInput",{attrs:{name:"avatarAltRadius",label:t.$t("settings.avatarAltRadius"),fallback:t.previewTheme.radii.avatarAlt,max:"28","hard-min":"0"},model:{value:t.avatarAltRadiusLocal,callback:function(e){t.avatarAltRadiusLocal=e},expression:"avatarAltRadiusLocal"}}),t._v(" "),s("RangeInput",{attrs:{name:"attachmentRadius",label:t.$t("settings.attachmentRadius"),fallback:t.previewTheme.radii.attachment,max:"50","hard-min":"0"},model:{value:t.attachmentRadiusLocal,callback:function(e){t.attachmentRadiusLocal=e},expression:"attachmentRadiusLocal"}}),t._v(" "),s("RangeInput",{attrs:{name:"tooltipRadius",label:t.$t("settings.tooltipRadius"),fallback:t.previewTheme.radii.tooltip,max:"50","hard-min":"0"},model:{value:t.tooltipRadiusLocal,callback:function(e){t.tooltipRadiusLocal=e},expression:"tooltipRadiusLocal"}}),t._v(" "),s("RangeInput",{attrs:{name:"chatMessageRadius",label:t.$t("settings.chatMessageRadius"),fallback:t.previewTheme.radii.chatMessage||2,max:"50","hard-min":"0"},model:{value:t.chatMessageRadiusLocal,callback:function(e){t.chatMessageRadiusLocal=e},expression:"chatMessageRadiusLocal"}})],1),t._v(" "),s("div",{staticClass:"shadow-container",attrs:{label:t.$t("settings.style.shadows._tab_label")}},[s("div",{staticClass:"tab-header shadow-selector"},[s("div",{staticClass:"select-container"},[t._v("\n "+t._s(t.$t("settings.style.shadows.component"))+"\n "),s("label",{staticClass:"select",attrs:{for:"shadow-switcher"}},[s("select",{directives:[{name:"model",rawName:"v-model",value:t.shadowSelected,expression:"shadowSelected"}],staticClass:"shadow-switcher",attrs:{id:"shadow-switcher"},on:{change:function(e){var s=Array.prototype.filter.call(e.target.options,function(t){return t.selected}).map(function(t){return"_value"in t?t._value:t.value});t.shadowSelected=e.target.multiple?s:s[0]}}},t._l(t.shadowsAvailable,function(e){return s("option",{key:e,domProps:{value:e}},[t._v("\n "+t._s(t.$t("settings.style.shadows.components."+e))+"\n ")])}),0),t._v(" "),s("i",{staticClass:"icon-down-open"})])]),t._v(" "),s("div",{staticClass:"override"},[s("label",{staticClass:"label",attrs:{for:"override"}},[t._v("\n "+t._s(t.$t("settings.style.shadows.override"))+"\n ")]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.currentShadowOverriden,expression:"currentShadowOverriden"}],staticClass:"input-override",attrs:{id:"override",name:"override",type:"checkbox"},domProps:{checked:Array.isArray(t.currentShadowOverriden)?t._i(t.currentShadowOverriden,null)>-1:t.currentShadowOverriden},on:{change:function(e){var s=t.currentShadowOverriden,a=e.target,n=!!a.checked;if(Array.isArray(s)){var o=t._i(s,null);a.checked?o<0&&(t.currentShadowOverriden=s.concat([null])):o>-1&&(t.currentShadowOverriden=s.slice(0,o).concat(s.slice(o+1)))}else t.currentShadowOverriden=n}}}),t._v(" "),s("label",{staticClass:"checkbox-label",attrs:{for:"override"}})]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.clearShadows}},[t._v("\n "+t._s(t.$t("settings.style.switcher.clear_all"))+"\n ")])]),t._v(" "),s("ShadowControl",{attrs:{ready:!!t.currentShadowFallback,fallback:t.currentShadowFallback},model:{value:t.currentShadow,callback:function(e){t.currentShadow=e},expression:"currentShadow"}}),t._v(" "),"avatar"===t.shadowSelected||"avatarStatus"===t.shadowSelected?s("div",[s("i18n",{attrs:{path:"settings.style.shadows.filter_hint.always_drop_shadow",tag:"p"}},[s("code",[t._v("filter: drop-shadow()")])]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.style.shadows.filter_hint.avatar_inset")))]),t._v(" "),s("i18n",{attrs:{path:"settings.style.shadows.filter_hint.drop_shadow_syntax",tag:"p"}},[s("code",[t._v("drop-shadow")]),t._v(" "),s("code",[t._v("spread-radius")]),t._v(" "),s("code",[t._v("inset")])]),t._v(" "),s("i18n",{attrs:{path:"settings.style.shadows.filter_hint.inset_classic",tag:"p"}},[s("code",[t._v("box-shadow")])]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.style.shadows.filter_hint.spread_zero")))])],1):t._e()],1),t._v(" "),s("div",{staticClass:"fonts-container",attrs:{label:t.$t("settings.style.fonts._tab_label")}},[s("div",{staticClass:"tab-header"},[s("p",[t._v(t._s(t.$t("settings.style.fonts.help")))]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.clearFonts}},[t._v("\n "+t._s(t.$t("settings.style.switcher.clear_all"))+"\n ")])]),t._v(" "),s("FontControl",{attrs:{name:"ui",label:t.$t("settings.style.fonts.components.interface"),fallback:t.previewTheme.fonts.interface,"no-inherit":"1"},model:{value:t.fontsLocal.interface,callback:function(e){t.$set(t.fontsLocal,"interface",e)},expression:"fontsLocal.interface"}}),t._v(" "),s("FontControl",{attrs:{name:"input",label:t.$t("settings.style.fonts.components.input"),fallback:t.previewTheme.fonts.input},model:{value:t.fontsLocal.input,callback:function(e){t.$set(t.fontsLocal,"input",e)},expression:"fontsLocal.input"}}),t._v(" "),s("FontControl",{attrs:{name:"post",label:t.$t("settings.style.fonts.components.post"),fallback:t.previewTheme.fonts.post},model:{value:t.fontsLocal.post,callback:function(e){t.$set(t.fontsLocal,"post",e)},expression:"fontsLocal.post"}}),t._v(" "),s("FontControl",{attrs:{name:"postCode",label:t.$t("settings.style.fonts.components.postCode"),fallback:t.previewTheme.fonts.postCode},model:{value:t.fontsLocal.postCode,callback:function(e){t.$set(t.fontsLocal,"postCode",e)},expression:"fontsLocal.postCode"}})],1)])],1),t._v(" "),s("div",{staticClass:"apply-container"},[s("button",{staticClass:"btn submit",attrs:{disabled:!t.themeValid},on:{click:t.setCustomTheme}},[t._v("\n "+t._s(t.$t("general.apply"))+"\n ")]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.clearAll}},[t._v("\n "+t._s(t.$t("settings.style.switcher.reset"))+"\n ")])])],1)},[],!1,Fe,null,null).exports,Ue={components:{TabSwitcher:a.a,DataImportExportTab:m,MutesAndBlocksTab:nt,NotificationsTab:it,FilteringTab:ft,SecurityTab:Et,ProfileTab:Qt,GeneralTab:ae,VersionTab:oe,ThemeTab:Me},computed:{isLoggedIn:function(){return!!this.$store.state.users.currentUser},open:function(){return"hidden"!==this.$store.state.interface.settingsModalState}},methods:{onOpen:function(){var t=this.$store.state.interface.settingsModalTargetTab;if(t){var e=this.$refs.tabSwitcher.$slots.default.findIndex(function(e){return e.data&&e.data.attrs["data-tab-name"]===t});e>=0&&this.$refs.tabSwitcher.setTab(e)}this.$store.dispatch("clearSettingsModalTargetTab")}},mounted:function(){this.onOpen()},watch:{open:function(t){t&&this.onOpen()}}};var Ve=function(t){s(591)},Ae=Object(o.a)(Ue,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("tab-switcher",{ref:"tabSwitcher",staticClass:"settings_tab-switcher",attrs:{"side-tab-bar":!0,"scrollable-tabs":!0}},[s("div",{attrs:{label:t.$t("settings.general"),icon:"wrench","data-tab-name":"general"}},[s("GeneralTab")],1),t._v(" "),t.isLoggedIn?s("div",{attrs:{label:t.$t("settings.profile_tab"),icon:"user","data-tab-name":"profile"}},[s("ProfileTab")],1):t._e(),t._v(" "),t.isLoggedIn?s("div",{attrs:{label:t.$t("settings.security_tab"),icon:"lock","data-tab-name":"security"}},[s("SecurityTab")],1):t._e(),t._v(" "),s("div",{attrs:{label:t.$t("settings.filtering"),icon:"filter","data-tab-name":"filtering"}},[s("FilteringTab")],1),t._v(" "),s("div",{attrs:{label:t.$t("settings.theme"),icon:"brush","data-tab-name":"theme"}},[s("ThemeTab")],1),t._v(" "),t.isLoggedIn?s("div",{attrs:{label:t.$t("settings.notifications"),icon:"bell-ringing-o","data-tab-name":"notifications"}},[s("NotificationsTab")],1):t._e(),t._v(" "),t.isLoggedIn?s("div",{attrs:{label:t.$t("settings.data_import_export_tab"),icon:"download","data-tab-name":"dataImportExport"}},[s("DataImportExportTab")],1):t._e(),t._v(" "),t.isLoggedIn?s("div",{attrs:{label:t.$t("settings.mutes_and_blocks"),fullHeight:!0,icon:"eye-off","data-tab-name":"mutesAndBlocks"}},[s("MutesAndBlocksTab")],1):t._e(),t._v(" "),s("div",{attrs:{label:t.$t("settings.version.title"),icon:"info-circled","data-tab-name":"version"}},[s("VersionTab")],1)])},[],!1,Ve,null,null);e.default=Ae.exports}}]); +//# sourceMappingURL=2.e852a6b4b3bba752b838.js.map \ No newline at end of file diff --git a/priv/static/static/js/2.e852a6b4b3bba752b838.js.map b/priv/static/static/js/2.e852a6b4b3bba752b838.js.map new file mode 100644 index 000000000..d698f09e1 --- /dev/null +++ b/priv/static/static/js/2.e852a6b4b3bba752b838.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/components/settings_modal/settings_modal_content.scss?d424","webpack:///./src/components/settings_modal/settings_modal_content.scss","webpack:///./src/components/importer/importer.vue?7798","webpack:///./src/components/importer/importer.vue?6af6","webpack:///./src/components/exporter/exporter.vue?dea3","webpack:///./src/components/exporter/exporter.vue?cc2b","webpack:///./src/components/settings_modal/tabs/mutes_and_blocks_tab.scss?4d0c","webpack:///./src/components/settings_modal/tabs/mutes_and_blocks_tab.scss","webpack:///./src/components/autosuggest/autosuggest.vue?9908","webpack:///./src/components/autosuggest/autosuggest.vue?9383","webpack:///./src/components/block_card/block_card.vue?7ad7","webpack:///./src/components/block_card/block_card.vue?ddc8","webpack:///./src/components/mute_card/mute_card.vue?c72f","webpack:///./src/components/mute_card/mute_card.vue?1268","webpack:///./src/components/domain_mute_card/domain_mute_card.vue?a613","webpack:///./src/components/domain_mute_card/domain_mute_card.vue?c85e","webpack:///./src/components/selectable_list/selectable_list.vue?a6e3","webpack:///./src/components/selectable_list/selectable_list.vue?c2f8","webpack:///./src/components/settings_modal/tabs/security_tab/mfa.vue?540b","webpack:///./src/components/settings_modal/tabs/security_tab/mfa.vue?cd9f","webpack:///./src/components/settings_modal/tabs/security_tab/mfa_backup_codes.vue?da3d","webpack:///./src/components/settings_modal/tabs/security_tab/mfa_backup_codes.vue?57b8","webpack:///./src/components/settings_modal/tabs/profile_tab.scss?588b","webpack:///./src/components/settings_modal/tabs/profile_tab.scss","webpack:///./src/components/image_cropper/image_cropper.vue?f169","webpack:///./src/components/image_cropper/image_cropper.vue?6235","webpack:///./src/components/settings_modal/tabs/theme_tab/theme_tab.scss?080d","webpack:///./src/components/settings_modal/tabs/theme_tab/theme_tab.scss","webpack:///./src/components/color_input/color_input.scss?c457","webpack:///./src/components/color_input/color_input.scss","webpack:///./src/components/color_input/color_input.vue?6a4c","webpack:///./src/components/color_input/color_input.vue?bb22","webpack:///./src/components/shadow_control/shadow_control.vue?bfd4","webpack:///./src/components/shadow_control/shadow_control.vue?78ef","webpack:///./src/components/font_control/font_control.vue?5f33","webpack:///./src/components/font_control/font_control.vue?bef4","webpack:///./src/components/contrast_ratio/contrast_ratio.vue?a340","webpack:///./src/components/contrast_ratio/contrast_ratio.vue?32fa","webpack:///./src/components/export_import/export_import.vue?5952","webpack:///./src/components/export_import/export_import.vue?aed6","webpack:///./src/components/settings_modal/tabs/theme_tab/preview.vue?1ae8","webpack:///./src/components/settings_modal/tabs/theme_tab/preview.vue?ab81","webpack:///./src/components/importer/importer.js","webpack:///./src/components/importer/importer.vue","webpack:///./src/components/importer/importer.vue?320c","webpack:///./src/components/exporter/exporter.js","webpack:///./src/components/exporter/exporter.vue","webpack:///./src/components/exporter/exporter.vue?7e42","webpack:///./src/components/settings_modal/tabs/data_import_export_tab.js","webpack:///./src/components/settings_modal/tabs/data_import_export_tab.vue","webpack:///./src/components/settings_modal/tabs/data_import_export_tab.vue?40b4","webpack:///./src/components/autosuggest/autosuggest.js","webpack:///./src/components/autosuggest/autosuggest.vue","webpack:///./src/components/autosuggest/autosuggest.vue?b400","webpack:///./src/components/block_card/block_card.js","webpack:///./src/components/block_card/block_card.vue","webpack:///./src/components/block_card/block_card.vue?7b44","webpack:///./src/components/mute_card/mute_card.js","webpack:///./src/components/mute_card/mute_card.vue","webpack:///./src/components/mute_card/mute_card.vue?6bc9","webpack:///./src/components/domain_mute_card/domain_mute_card.js","webpack:///./src/components/domain_mute_card/domain_mute_card.vue","webpack:///./src/components/domain_mute_card/domain_mute_card.vue?7cf0","webpack:///./src/components/selectable_list/selectable_list.js","webpack:///./src/components/selectable_list/selectable_list.vue","webpack:///./src/components/selectable_list/selectable_list.vue?5686","webpack:///./src/hocs/with_subscription/with_subscription.js","webpack:///./src/components/settings_modal/tabs/mutes_and_blocks_tab.js","webpack:///./src/components/settings_modal/tabs/mutes_and_blocks_tab.vue","webpack:///./src/components/settings_modal/tabs/mutes_and_blocks_tab.vue?0687","webpack:///./src/components/settings_modal/tabs/notifications_tab.js","webpack:///./src/components/settings_modal/tabs/notifications_tab.vue","webpack:///./src/components/settings_modal/tabs/notifications_tab.vue?6dcc","webpack:///./src/components/settings_modal/helpers/shared_computed_object.js","webpack:///./src/components/settings_modal/tabs/filtering_tab.js","webpack:///./src/components/settings_modal/tabs/filtering_tab.vue","webpack:///./src/components/settings_modal/tabs/filtering_tab.vue?3af7","webpack:///./src/components/settings_modal/tabs/security_tab/mfa_backup_codes.js","webpack:///./src/components/settings_modal/tabs/security_tab/mfa_backup_codes.vue","webpack:///./src/components/settings_modal/tabs/security_tab/mfa_backup_codes.vue?198f","webpack:///./src/components/settings_modal/tabs/security_tab/confirm.js","webpack:///./src/components/settings_modal/tabs/security_tab/confirm.vue","webpack:///./src/components/settings_modal/tabs/security_tab/confirm.vue?da03","webpack:///./src/components/settings_modal/tabs/security_tab/mfa_totp.js","webpack:///./src/components/settings_modal/tabs/security_tab/mfa.js","webpack:///./src/components/settings_modal/tabs/security_tab/mfa_totp.vue","webpack:///./src/components/settings_modal/tabs/security_tab/mfa_totp.vue?cdbe","webpack:///./src/components/settings_modal/tabs/security_tab/mfa.vue","webpack:///./src/components/settings_modal/tabs/security_tab/mfa.vue?8795","webpack:///./src/components/settings_modal/tabs/security_tab/security_tab.js","webpack:///./src/components/settings_modal/tabs/security_tab/security_tab.vue","webpack:///./src/components/settings_modal/tabs/security_tab/security_tab.vue?0d38","webpack:///./src/components/image_cropper/image_cropper.js","webpack:///./src/components/image_cropper/image_cropper.vue","webpack:///./src/components/image_cropper/image_cropper.vue?017e","webpack:///./src/components/settings_modal/tabs/profile_tab.js","webpack:///./src/components/settings_modal/tabs/profile_tab.vue","webpack:///./src/components/settings_modal/tabs/profile_tab.vue?4eea","webpack:///src/components/interface_language_switcher/interface_language_switcher.vue","webpack:///./src/components/interface_language_switcher/interface_language_switcher.vue","webpack:///./src/components/interface_language_switcher/interface_language_switcher.vue?d9d4","webpack:///./src/components/settings_modal/tabs/general_tab.js","webpack:///./src/components/settings_modal/tabs/general_tab.vue","webpack:///./src/components/settings_modal/tabs/general_tab.vue?2e10","webpack:///./src/components/settings_modal/tabs/version_tab.js","webpack:///./src/services/version/version.service.js","webpack:///./src/components/settings_modal/tabs/version_tab.vue","webpack:///./src/components/settings_modal/tabs/version_tab.vue?7cbe","webpack:///src/components/color_input/color_input.vue","webpack:///./src/components/color_input/color_input.vue","webpack:///./src/components/color_input/color_input.vue?3d5b","webpack:///./src/components/range_input/range_input.vue","webpack:///src/components/range_input/range_input.vue","webpack:///./src/components/range_input/range_input.vue?202a","webpack:///src/components/opacity_input/opacity_input.vue","webpack:///./src/components/opacity_input/opacity_input.vue","webpack:///./src/components/opacity_input/opacity_input.vue?0078","webpack:///./src/components/shadow_control/shadow_control.js","webpack:///./src/components/shadow_control/shadow_control.vue","webpack:///./src/components/shadow_control/shadow_control.vue?c9d6","webpack:///./src/components/font_control/font_control.js","webpack:///./src/components/font_control/font_control.vue","webpack:///./src/components/font_control/font_control.vue?184b","webpack:///src/components/contrast_ratio/contrast_ratio.vue","webpack:///./src/components/contrast_ratio/contrast_ratio.vue","webpack:///./src/components/contrast_ratio/contrast_ratio.vue?efc3","webpack:///src/components/export_import/export_import.vue","webpack:///./src/components/export_import/export_import.vue","webpack:///./src/components/export_import/export_import.vue?9130","webpack:///./src/components/settings_modal/tabs/theme_tab/preview.vue","webpack:///./src/components/settings_modal/tabs/theme_tab/preview.vue?4c36","webpack:///./src/components/settings_modal/tabs/theme_tab/theme_tab.js","webpack:///./src/components/settings_modal/tabs/theme_tab/theme_tab.vue","webpack:///./src/components/settings_modal/tabs/theme_tab/theme_tab.vue?1515","webpack:///./src/components/settings_modal/settings_modal_content.js","webpack:///./src/components/settings_modal/settings_modal_content.vue","webpack:///./src/components/settings_modal/settings_modal_content.vue?458b"],"names":["content","__webpack_require__","module","i","locals","exports","add","default","push","Importer","props","submitHandler","type","Function","required","submitButtonLabel","String","this","$t","successMessage","errorMessage","data","file","error","success","submitting","methods","change","$refs","input","files","submit","_this","dismiss","then","__vue_styles__","context","importer_importer","Object","component_normalizer","importer","_vm","_h","$createElement","_c","_self","staticClass","ref","attrs","on","_v","click","_s","_e","Exporter","getContent","filename","exportButtonLabel","processingMessage","processing","process","fileToDownload","document","createElement","setAttribute","encodeURIComponent","style","display","body","appendChild","removeChild","setTimeout","exporter_vue_styles_","exporter_exporter","exporter","DataImportExportTab","activeTab","newDomainToMute","created","$store","dispatch","components","Checkbox","computed","user","state","users","currentUser","getFollowsContent","api","backendInteractor","exportFriends","id","generateExportableUsersContent","getBlocksContent","fetchBlocks","importFollows","status","Error","importBlocks","map","is_local","screen_name","location","hostname","join","tabs_data_import_export_tab","data_import_export_tab","label","submit-handler","success-message","error-message","get-content","export-button-label","autosuggest","query","filter","placeholder","term","timeout","results","resultsVisible","filtered","watch","val","fetchResults","clearTimeout","onInputClick","onClickOutside","autosuggest_vue_styles_","autosuggest_autosuggest","directives","name","rawName","value","expression","domProps","$event","target","composing","length","_l","item","_t","BlockCard","progress","getters","findUser","userId","relationship","blocked","blocking","BasicUserCard","unblockUser","blockUser","_this2","block_card_vue_styles_","block_card_block_card","block_card","disabled","MuteCard","muted","muting","unmuteUser","muteUser","mute_card_vue_styles_","mute_card_mute_card","mute_card","DomainMuteCard","ProgressButton","domainMutes","includes","domain","unmuteDomain","muteDomain","domain_mute_card_vue_styles_","domain_mute_card_domain_mute_card","domain_mute_card","slot","SelectableList","List","items","Array","getKey","selected","allKeys","filteredSelected","key","indexOf","allSelected","noneSelected","someSelected","isSelected","toggle","checked","splice","toggleAll","slice","selectable_list_vue_styles_","selectable_list_selectable_list","selectable_list","indeterminate","get-key","scopedSlots","_u","fn","class","selectable-list-item-selected-inner","withSubscription","_ref","fetch","select","_ref$childPropName","childPropName","_ref$additionalPropNa","additionalPropNames","WrappedComponent","keys","getComponentProps","v","concat","Vue","component","toConsumableArray_default","loading","fetchedData","$props","refresh","isEmpty","fetchData","render","h","_objectSpread","defineProperty_default","$listeners","$scopedSlots","children","entries","$slots","_ref2","_ref3","slicedToArray_default","helper_default","BlockList","get","MuteList","DomainMuteList","MutesAndBlocks","TabSwitcher","Autosuggest","knownDomains","instance","activateTab","tabName","filterUnblockedUsers","userIds","reject","filterUnMutedUsers","queryUserIds","blockUsers","ids","unblockUsers","muteUsers","unmuteUsers","filterUnMutedDomains","urls","_this3","url","queryKnownDomains","_this4","Promise","resolve","toLowerCase","unmuteDomains","domains","mutes_and_blocks_tab_vue_styles_","tabs_mutes_and_blocks_tab","mutes_and_blocks_tab","scrollable-tabs","row","user-id","NotificationsTab","notificationSettings","notification_settings","updateNotificationSettings","settings","tabs_notifications_tab","notifications_tab","model","callback","$$v","$set","SharedComputedObject","shared_computed_object_objectSpread","instanceDefaultProperties","multiChoiceProperties","instanceDefaultConfig","reduce","acc","_ref4","configDefaultState","mergedConfig","set","_ref5","_ref6","useStreamingApi","e","console","FilteringTab","muteWordsStringLocal","muteWords","filtering_tab_objectSpread","muteWordsString","filter_default","split","word","trim_default","notificationVisibility","handler","deep","replyVisibility","tabs_filtering_tab","filtering_tab","for","$$selectedVal","prototype","call","options","o","_value","multiple","hidePostStats","hidePostStatsLocalizedValue","hideUserStats","hideUserStatsLocalizedValue","hideFilteredStatuses","hideFilteredStatusesLocalizedValue","mfa_backup_codes","backupCodes","inProgress","codes","ready","displayTitle","mfa_backup_codes_vue_styles_","security_tab_mfa_backup_codes","code","Confirm","confirm","$emit","cancel","tabs_security_tab_confirm","security_tab_confirm","mfa_totp","currentPassword","deactivate","mfa_totp_objectSpread","isActivated","totp","mapState","doActivate","cancelDeactivate","doDeactivate","confirmDeactivate","mfaDisableOTP","password","res","Mfa","available","enabled","setupState","setupOTPState","getNewCodes","otpSettings","provisioning_uri","otpConfirmToken","readyInit","recovery-codes","RecoveryCodes","totp-item","qrcode","VueQrcode","mfa_objectSpread","canSetupOTP","setupInProgress","backupCodesPrepared","setupOTPInProgress","completedOTP","prepareOTP","confirmOTP","confirmNewBackupCodes","activateOTP","fetchBackupCodes","generateMfaBackupCodes","getBackupCodes","confirmBackupCodes","cancelBackupCodes","setupOTP","mfaSetupOTP","doConfirmOTP","mfaConfirmOTP","token","completeSetup","fetchSettings","cancelSetup","result","regenerator_default","a","async","_context","prev","next","awrap","settingsMFA","sent","abrupt","stop","mounted","_this5","mfa_vue_styles_","security_tab_mfa","mfa","activate","backup-codes","width","SecurityTab","newEmail","changeEmailError","changeEmailPassword","changedEmail","deletingAccount","deleteAccountConfirmPasswordInput","deleteAccountError","changePasswordInputs","changedPassword","changePasswordError","pleromaBackend","oauthTokens","tokens","oauthToken","appName","app_name","validUntil","Date","valid_until","toLocaleDateString","confirmDelete","deleteAccount","$router","changePassword","params","newPassword","newPasswordConfirmation","logout","changeEmail","email","replace","revokeToken","window","$i18n","t","security_tab_security_tab","security_tab","autocomplete","ImageCropper","trigger","Element","cropperOptions","aspectRatio","autoCropArea","viewMode","movable","zoomable","guides","mimes","saveButtonLabel","saveWithoutCroppingButtonlabel","cancelButtonLabel","cropper","undefined","dataUrl","submitError","saveText","saveWithoutCroppingText","cancelText","submitErrorMsg","toString","destroy","cropping","arguments","avatarUploadError","err","pickImage","createCropper","Cropper","img","getTriggerDOM","typeof_default","querySelector","readFile","fileInput","reader","FileReader","onload","readAsDataURL","clearError","addEventListener","beforeDestroy","removeEventListener","image_cropper_vue_styles_","image_cropper_image_cropper","image_cropper","src","alt","load","stopPropagation","textContent","accept","ProfileTab","newName","newBio","unescape","description","newLocked","locked","newNoRichText","no_rich_text","newDefaultScope","default_scope","newFields","fields","field","hideFollows","hide_follows","hideFollowers","hide_followers","hideFollowsCount","hide_follows_count","hideFollowersCount","hide_followers_count","showRole","show_role","role","discoverable","bot","allowFollowingMove","allow_following_move","pickAvatarBtnVisible","bannerUploading","backgroundUploading","banner","bannerPreview","background","backgroundPreview","bannerUploadError","backgroundUploadError","ScopeSelector","EmojiInput","emojiUserSuggestor","suggestor","emoji","customEmoji","updateUsersList","emojiSuggestor","userSuggestor","fieldsLimits","maxFields","defaultAvatar","server","defaultBanner","isDefaultAvatar","baseAvatar","profile_image_url","isDefaultBanner","baseBanner","cover_photo","isDefaultBackground","background_image","avatarImgSrc","profile_image_url_original","bannerImgSrc","updateProfile","note","display_name","fields_attributes","el","merge","commit","changeVis","visibility","addField","deleteField","index","event","$delete","uploadFile","size","filesize","fileSizeFormatService","fileSizeFormat","allowedsize","num","filesizeunit","unit","allowedsizeunit","resetAvatar","submitAvatar","resetBanner","submitBanner","resetBackground","submitBackground","that","updateAvatar","avatar","updateProfileImages","message","getCroppedCanvas","toBlob","_this6","profile_tab_vue_styles_","tabs_profile_tab","profile_tab","enable-emoji-picker","suggest","classname","show-all","user-default","initial-scope","on-scope-change","_","hide-emoji-button","title","open","close","clearUploadError","interface_language_switcher","languageCodes","messages","languages","languageNames","map_default","getLanguageName","language","interfaceLanguage","ja","ja_easy","zh","getName","interface_language_switcher_interface_language_switcher","langCode","GeneralTab","loopSilentAvailable","getOwnPropertyDescriptor","HTMLVideoElement","HTMLMediaElement","InterfaceLanguageSwitcher","general_tab_objectSpread","postFormats","instanceSpecificPanelPresent","showInstanceSpecificPanel","tabs_general_tab","general_tab","hideISP","hideMutedPosts","hideMutedPostsLocalizedValue","collapseMessageWithSubject","collapseMessageWithSubjectLocalizedValue","streaming","pauseOnUnfocused","emojiReactionsOnTimeline","scopeCopy","scopeCopyLocalizedValue","alwaysShowSubjectInput","alwaysShowSubjectInputLocalizedValue","subjectLineBehavior","subjectLineBehaviorDefaultValue","postContentType","postFormat","postContentTypeDefaultValue","minimalScopesMode","minimalScopesModeLocalizedValue","autohideFloatingPostButton","padEmoji","hideAttachments","hideAttachmentsInConv","modifiers","number","min","step","maxThumbnails","_n","blur","$forceUpdate","hideNsfw","preloadImage","useOneClickNsfw","stopGifs","loopVideo","loopVideoSilentOnly","playVideosInModal","useContainFit","webPushNotifications","greentext","greentextLocalizedValue","VersionTab","backendVersion","frontendVersion","frontendVersionLink","backendVersionLink","versionString","matches","match","tabs_version_tab","version_tab","href","color_input","checkbox_checkbox","fallback","Boolean","showOptionalTickbox","present","validColor","color_convert","transparentColor","computedColor","startsWith","color_input_vue_styles_","color_input_color_input","backgroundColor","range_input_range_input","max","hardMax","hardMin","opacity_input","opacity_input_opacity_input","toModel","shadow_control_objectSpread","x","y","spread","inset","color","alpha","shadow_control","selectedId","cValue","ColorInput","OpacityInput","del","Math","moveUp","moveDn","beforeUpdate","anyShadows","anyShadowsFallback","currentFallback","moveUpValid","moveDnValid","usingFallback","rgb","hex2rgb","boxShadow","getCssShadow","shadow_control_vue_styles_","shadow_control_shadow_control","__r","shadow","isArray","_i","$$a","$$el","$$c","$$i","show-optional-tickbox","path","tag","font_control","lValue","availableOptions","noInherit","dValue","family","isCustom","preset","font_control_vue_styles_","font_control_font_control","custom","option","contrast_ratio","large","contrast","hint","levelVal","aaa","aa","level","ratio","text","hint_18pt","laaa","laa","contrast_ratio_vue_styles_","contrast_ratio_contrast_ratio","export_import","importFailed","exportData","stringified","JSON","stringify","exportObject","btoa","importData","filePicker","parsed","parse","validator","onImport","readAsText","export_import_vue_styles_","export_import_export_import","exportLabel","importLabel","importFailedText","preview_vue_styles_","theme_tab_preview","staticStyle","font-family","_m","v1OnlyNames","theme_tab","theme_tab_objectSpread","availableStyles","theme","themeWarning","tempImportFile","engineVersion","previewShadows","previewColors","previewRadii","previewFonts","shadowsInvalid","colorsInvalid","radiiInvalid","keepColor","keepShadows","keepOpacity","keepRoundness","keepFonts","SLOT_INHERITANCE","OPACITIES","shadowSelected","shadowsLocal","fontsLocal","btnRadiusLocal","inputRadiusLocal","checkboxRadiusLocal","panelRadiusLocal","avatarRadiusLocal","avatarAltRadiusLocal","attachmentRadiusLocal","tooltipRadiusLocal","chatMessageRadiusLocal","self","getThemes","promises","all","k","themes","_ref7","_ref8","themesComplete","loadThemeFromLocalStorage","shadowsAvailable","themeWarningHelp","pre","_this$themeWarning","origin","themeEngineVersion","noActionsPossible","CURRENT_VERSION","selectedVersion","currentColors","_ref9","_ref10","currentOpacity","_ref11","_ref12","currentRadii","btn","checkbox","panel","avatarAlt","tooltip","attachment","chatMessage","preview","composePreset","previewTheme","colors","opacity","radii","shadows","fonts","previewContrast","bg","colorsConverted","_ref13","_ref14","ratios","_ref15","_ref16","slotIsBaseText","textColor","_ref17","layer","variant","opacitySlot","getOpacitySlot","textColors","layers","getLayers","textColorKey","newKey","toUpperCase","getContrastRatioLayers","_ref18","_ref19","toPrecision","warn","previewRules","rules","values","DEFAULT_SHADOWS","sort","currentShadowOverriden","currentShadow","currentShadowFallback","assign","themeValid","exportedTheme","saveEverything","source","_pleroma_theme_version","RangeInput","ContrastRatio","ShadowControl","FontControl","Preview","ExportImport","loadTheme","_ref20","fileVersion","forceUseSource","dismissWarning","version","snapshotEngineVersion","versionsMatch","sourceSnapshotMismatch","forcedSourceLoad","normalizeLocalState","forceLoadLocalStorage","forceLoad","forceSnapshot","confirmLoadSource","_this$$store$getters$","customTheme","customThemeSource","themeData","setCustomTheme","updatePreviewColorsAndShadows","generateColors","generateShadows","mod","forceSource","importValidator","clearAll","clearV1","$data","endsWith","forEach","clearRoundness","clearOpacity","clearShadows","clearFonts","colors2to3","fg","fgColorLocal","rgb2hex","textColorLocal","Set","hex","_ref21","_ref22","Number","isNaN","_ref23","_ref24","shadows2to3","generateRadii","getOwnPropertyNames","generateFonts","fontsInvalid","bgColorLocal","linkColorLocal","cRedColorLocal","cGreenColorLocal","cBlueColorLocal","cOrangeColorLocal","theme_tab_vue_styles_","theme_tab_theme_tab","export-object","export-label","import-label","import-failed-text","on-import","bgOpacityLocal","bgText","link","accentColorLocal","accent","bgLink","fgText","fgTextColorLocal","fgLink","fgLinkColorLocal","bgCRed","bgCBlue","bgCGreen","bgCOrange","postLinkColorLocal","postLink","cGreen","postGreentextColorLocal","postGreentext","alertError","alertErrorColorLocal","alertErrorText","alertErrorTextColorLocal","alertWarning","alertWarningColorLocal","alertWarningText","alertWarningTextColorLocal","alertNeutral","alertNeutralColorLocal","alertNeutralText","alertNeutralTextColorLocal","alert","alertOpacityLocal","badgeNotification","badgeNotificationColorLocal","badgeNotificationText","badgeNotificationTextColorLocal","panelColorLocal","panelOpacityLocal","panelText","panelTextColorLocal","panelLink","panelLinkColorLocal","topBar","topBarColorLocal","topBarText","topBarTextColorLocal","topBarLink","topBarLinkColorLocal","inputColorLocal","inputOpacityLocal","inputText","inputTextColorLocal","btnColorLocal","btnOpacityLocal","btnText","btnTextColorLocal","btnPanelText","btnPanelTextColorLocal","btnTopBarText","btnTopBarTextColorLocal","btnPressed","btnPressedColorLocal","btnPressedText","btnPressedTextColorLocal","btnPressedPanelText","btnPressedPanelTextColorLocal","btnPressedTopBarText","btnPressedTopBarTextColorLocal","btnDisabled","btnDisabledColorLocal","btnDisabledText","btnDisabledTextColorLocal","btnDisabledPanelText","btnDisabledPanelTextColorLocal","btnDisabledTopBarText","btnDisabledTopBarTextColorLocal","btnToggled","btnToggledColorLocal","btnToggledText","btnToggledTextColorLocal","btnToggledPanelText","btnToggledPanelTextColorLocal","btnToggledTopBarText","btnToggledTopBarTextColorLocal","tab","tabColorLocal","tabText","tabTextColorLocal","tabActiveText","tabActiveTextColorLocal","border","borderColorLocal","borderOpacityLocal","faint","faintColorLocal","faintLink","faintLinkColorLocal","panelFaint","panelFaintColorLocal","faintOpacityLocal","underlay","underlayColorLocal","underlayOpacityLocal","poll","pollColorLocal","pollText","pollTextColorLocal","icon","iconColorLocal","highlight","highlightColorLocal","highlightText","highlightTextColorLocal","highlightLink","highlightLinkColorLocal","popover","popoverColorLocal","popoverOpacityLocal","popoverText","popoverTextColorLocal","popoverLink","popoverLinkColorLocal","selectedPost","selectedPostColorLocal","selectedPostText","selectedPostTextColorLocal","selectedPostLink","selectedPostLinkColorLocal","selectedMenu","selectedMenuColorLocal","selectedMenuText","selectedMenuTextColorLocal","selectedMenuLink","selectedMenuLinkColorLocal","chatBgColorLocal","chatMessageIncomingBgColorLocal","chatMessageIncomingTextColorLocal","chatMessageIncomingLinkColorLocal","chatMessageIncomingBorderColorLocal","chatMessageOutgoingBgColorLocal","chatMessageOutgoingTextColorLocal","chatMessageOutgoingLinkColorLocal","chatMessageOutgoingBorderColorLocal","hard-min","interface","no-inherit","post","postCode","SettingsModalContent","MutesAndBlocksTab","ThemeTab","isLoggedIn","settingsModalState","onOpen","targetTab","settingsModalTargetTab","tabIndex","tabSwitcher","findIndex","elm","setTab","settings_modal_content_vue_styles_","settings_modal_content_Component","settings_modal_content","side-tab-bar","data-tab-name","fullHeight","__webpack_exports__"],"mappings":"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","file":"static/js/2.e852a6b4b3bba752b838.js","sourcesContent":["// style-loader: Adds some css to the DOM by adding a \n\n\n\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!./color_input.scss\")\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=1!./color_input.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./color_input.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./color_input.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-77e407b6\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./color_input.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"color-input style-control\",class:{ disabled: !_vm.present || _vm.disabled }},[_c('label',{staticClass:\"label\",attrs:{\"for\":_vm.name}},[_vm._v(\"\\n \"+_vm._s(_vm.label)+\"\\n \")]),_vm._v(\" \"),(typeof _vm.fallback !== 'undefined' && _vm.showOptionalTickbox)?_c('Checkbox',{staticClass:\"opt\",attrs:{\"checked\":_vm.present,\"disabled\":_vm.disabled},on:{\"change\":function($event){return _vm.$emit('input', typeof _vm.value === 'undefined' ? _vm.fallback : undefined)}}}):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"input color-input-field\"},[_c('input',{staticClass:\"textColor unstyled\",attrs:{\"id\":_vm.name + '-t',\"type\":\"text\",\"disabled\":!_vm.present || _vm.disabled},domProps:{\"value\":_vm.value || _vm.fallback},on:{\"input\":function($event){return _vm.$emit('input', $event.target.value)}}}),_vm._v(\" \"),(_vm.validColor)?_c('input',{staticClass:\"nativeColor unstyled\",attrs:{\"id\":_vm.name,\"type\":\"color\",\"disabled\":!_vm.present || _vm.disabled},domProps:{\"value\":_vm.value || _vm.fallback},on:{\"input\":function($event){return _vm.$emit('input', $event.target.value)}}}):_vm._e(),_vm._v(\" \"),(_vm.transparentColor)?_c('div',{staticClass:\"transparentIndicator\"}):_vm._e(),_vm._v(\" \"),(_vm.computedColor)?_c('div',{staticClass:\"computedIndicator\",style:({backgroundColor: _vm.fallback})}):_vm._e()])],1)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./range_input.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./range_input.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-6a3c1a26\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./range_input.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"range-control style-control\",class:{ disabled: !_vm.present || _vm.disabled }},[_c('label',{staticClass:\"label\",attrs:{\"for\":_vm.name}},[_vm._v(\"\\n \"+_vm._s(_vm.label)+\"\\n \")]),_vm._v(\" \"),(typeof _vm.fallback !== 'undefined')?_c('input',{staticClass:\"opt\",attrs:{\"id\":_vm.name + '-o',\"type\":\"checkbox\"},domProps:{\"checked\":_vm.present},on:{\"input\":function($event){return _vm.$emit('input', !_vm.present ? _vm.fallback : undefined)}}}):_vm._e(),_vm._v(\" \"),(typeof _vm.fallback !== 'undefined')?_c('label',{staticClass:\"opt-l\",attrs:{\"for\":_vm.name + '-o'}}):_vm._e(),_vm._v(\" \"),_c('input',{staticClass:\"input-number\",attrs:{\"id\":_vm.name,\"type\":\"range\",\"disabled\":!_vm.present || _vm.disabled,\"max\":_vm.max || _vm.hardMax || 100,\"min\":_vm.min || _vm.hardMin || 0,\"step\":_vm.step || 1},domProps:{\"value\":_vm.value || _vm.fallback},on:{\"input\":function($event){return _vm.$emit('input', $event.target.value)}}}),_vm._v(\" \"),_c('input',{staticClass:\"input-number\",attrs:{\"id\":_vm.name,\"type\":\"number\",\"disabled\":!_vm.present || _vm.disabled,\"max\":_vm.hardMax,\"min\":_vm.hardMin,\"step\":_vm.step || 1},domProps:{\"value\":_vm.value || _vm.fallback},on:{\"input\":function($event){return _vm.$emit('input', $event.target.value)}}})])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","\n\n\n","/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./opacity_input.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./opacity_input.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-3b48fa39\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./opacity_input.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"opacity-control style-control\",class:{ disabled: !_vm.present || _vm.disabled }},[_c('label',{staticClass:\"label\",attrs:{\"for\":_vm.name}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.common.opacity'))+\"\\n \")]),_vm._v(\" \"),(typeof _vm.fallback !== 'undefined')?_c('Checkbox',{staticClass:\"opt\",attrs:{\"checked\":_vm.present,\"disabled\":_vm.disabled},on:{\"change\":function($event){return _vm.$emit('input', !_vm.present ? _vm.fallback : undefined)}}}):_vm._e(),_vm._v(\" \"),_c('input',{staticClass:\"input-number\",attrs:{\"id\":_vm.name,\"type\":\"number\",\"disabled\":!_vm.present || _vm.disabled,\"max\":\"1\",\"min\":\"0\",\"step\":\".05\"},domProps:{\"value\":_vm.value || _vm.fallback},on:{\"input\":function($event){return _vm.$emit('input', $event.target.value)}}})],1)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import ColorInput from '../color_input/color_input.vue'\nimport OpacityInput from '../opacity_input/opacity_input.vue'\nimport { getCssShadow } from '../../services/style_setter/style_setter.js'\nimport { hex2rgb } from '../../services/color_convert/color_convert.js'\n\nconst toModel = (object = {}) => ({\n x: 0,\n y: 0,\n blur: 0,\n spread: 0,\n inset: false,\n color: '#000000',\n alpha: 1,\n ...object\n})\n\nexport default {\n // 'Value' and 'Fallback' can be undefined, but if they are\n // initially vue won't detect it when they become something else\n // therefore i'm using \"ready\" which should be passed as true when\n // data becomes available\n props: [\n 'value', 'fallback', 'ready'\n ],\n data () {\n return {\n selectedId: 0,\n // TODO there are some bugs regarding display of array (it's not getting updated when deleting for some reason)\n cValue: (this.value || this.fallback || []).map(toModel)\n }\n },\n components: {\n ColorInput,\n OpacityInput\n },\n methods: {\n add () {\n this.cValue.push(toModel(this.selected))\n this.selectedId = this.cValue.length - 1\n },\n del () {\n this.cValue.splice(this.selectedId, 1)\n this.selectedId = this.cValue.length === 0 ? undefined : Math.max(this.selectedId - 1, 0)\n },\n moveUp () {\n const movable = this.cValue.splice(this.selectedId, 1)[0]\n this.cValue.splice(this.selectedId - 1, 0, movable)\n this.selectedId -= 1\n },\n moveDn () {\n const movable = this.cValue.splice(this.selectedId, 1)[0]\n this.cValue.splice(this.selectedId + 1, 0, movable)\n this.selectedId += 1\n }\n },\n beforeUpdate () {\n this.cValue = this.value || this.fallback\n },\n computed: {\n anyShadows () {\n return this.cValue.length > 0\n },\n anyShadowsFallback () {\n return this.fallback.length > 0\n },\n selected () {\n if (this.ready && this.anyShadows) {\n return this.cValue[this.selectedId]\n } else {\n return toModel({})\n }\n },\n currentFallback () {\n if (this.ready && this.anyShadowsFallback) {\n return this.fallback[this.selectedId]\n } else {\n return toModel({})\n }\n },\n moveUpValid () {\n return this.ready && this.selectedId > 0\n },\n moveDnValid () {\n return this.ready && this.selectedId < this.cValue.length - 1\n },\n present () {\n return this.ready &&\n typeof this.cValue[this.selectedId] !== 'undefined' &&\n !this.usingFallback\n },\n usingFallback () {\n return typeof this.value === 'undefined'\n },\n rgb () {\n return hex2rgb(this.selected.color)\n },\n style () {\n return this.ready ? {\n boxShadow: getCssShadow(this.fallback)\n } : {}\n }\n }\n}\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./shadow_control.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./shadow_control.js\"\nimport __vue_script__ from \"!!babel-loader!./shadow_control.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-5c532734\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./shadow_control.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"shadow-control\",class:{ disabled: !_vm.present }},[_c('div',{staticClass:\"shadow-preview-container\"},[_c('div',{staticClass:\"y-shift-control\",attrs:{\"disabled\":!_vm.present}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.y),expression:\"selected.y\"}],staticClass:\"input-number\",attrs:{\"disabled\":!_vm.present,\"type\":\"number\"},domProps:{\"value\":(_vm.selected.y)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.selected, \"y\", $event.target.value)}}}),_vm._v(\" \"),_c('div',{staticClass:\"wrap\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.y),expression:\"selected.y\"}],staticClass:\"input-range\",attrs:{\"disabled\":!_vm.present,\"type\":\"range\",\"max\":\"20\",\"min\":\"-20\"},domProps:{\"value\":(_vm.selected.y)},on:{\"__r\":function($event){return _vm.$set(_vm.selected, \"y\", $event.target.value)}}})])]),_vm._v(\" \"),_c('div',{staticClass:\"preview-window\"},[_c('div',{staticClass:\"preview-block\",style:(_vm.style)})]),_vm._v(\" \"),_c('div',{staticClass:\"x-shift-control\",attrs:{\"disabled\":!_vm.present}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.x),expression:\"selected.x\"}],staticClass:\"input-number\",attrs:{\"disabled\":!_vm.present,\"type\":\"number\"},domProps:{\"value\":(_vm.selected.x)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.selected, \"x\", $event.target.value)}}}),_vm._v(\" \"),_c('div',{staticClass:\"wrap\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.x),expression:\"selected.x\"}],staticClass:\"input-range\",attrs:{\"disabled\":!_vm.present,\"type\":\"range\",\"max\":\"20\",\"min\":\"-20\"},domProps:{\"value\":(_vm.selected.x)},on:{\"__r\":function($event){return _vm.$set(_vm.selected, \"x\", $event.target.value)}}})])])]),_vm._v(\" \"),_c('div',{staticClass:\"shadow-tweak\"},[_c('div',{staticClass:\"id-control style-control\",attrs:{\"disabled\":_vm.usingFallback}},[_c('label',{staticClass:\"select\",attrs:{\"for\":\"shadow-switcher\",\"disabled\":!_vm.ready || _vm.usingFallback}},[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selectedId),expression:\"selectedId\"}],staticClass:\"shadow-switcher\",attrs:{\"id\":\"shadow-switcher\",\"disabled\":!_vm.ready || _vm.usingFallback},on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.selectedId=$event.target.multiple ? $$selectedVal : $$selectedVal[0]}}},_vm._l((_vm.cValue),function(shadow,index){return _c('option',{key:index,domProps:{\"value\":index}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.shadows.shadow_id', { value: index }))+\"\\n \")])}),0),_vm._v(\" \"),_c('i',{staticClass:\"icon-down-open\"})]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-default\",attrs:{\"disabled\":!_vm.ready || !_vm.present},on:{\"click\":_vm.del}},[_c('i',{staticClass:\"icon-cancel\"})]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-default\",attrs:{\"disabled\":!_vm.moveUpValid},on:{\"click\":_vm.moveUp}},[_c('i',{staticClass:\"icon-up-open\"})]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-default\",attrs:{\"disabled\":!_vm.moveDnValid},on:{\"click\":_vm.moveDn}},[_c('i',{staticClass:\"icon-down-open\"})]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-default\",attrs:{\"disabled\":_vm.usingFallback},on:{\"click\":_vm.add}},[_c('i',{staticClass:\"icon-plus\"})])]),_vm._v(\" \"),_c('div',{staticClass:\"inset-control style-control\",attrs:{\"disabled\":!_vm.present}},[_c('label',{staticClass:\"label\",attrs:{\"for\":\"inset\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.shadows.inset'))+\"\\n \")]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.inset),expression:\"selected.inset\"}],staticClass:\"input-inset\",attrs:{\"id\":\"inset\",\"disabled\":!_vm.present,\"name\":\"inset\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.selected.inset)?_vm._i(_vm.selected.inset,null)>-1:(_vm.selected.inset)},on:{\"change\":function($event){var $$a=_vm.selected.inset,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.selected, \"inset\", $$a.concat([$$v])))}else{$$i>-1&&(_vm.$set(_vm.selected, \"inset\", $$a.slice(0,$$i).concat($$a.slice($$i+1))))}}else{_vm.$set(_vm.selected, \"inset\", $$c)}}}}),_vm._v(\" \"),_c('label',{staticClass:\"checkbox-label\",attrs:{\"for\":\"inset\"}})]),_vm._v(\" \"),_c('div',{staticClass:\"blur-control style-control\",attrs:{\"disabled\":!_vm.present}},[_c('label',{staticClass:\"label\",attrs:{\"for\":\"spread\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.shadows.blur'))+\"\\n \")]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.blur),expression:\"selected.blur\"}],staticClass:\"input-range\",attrs:{\"id\":\"blur\",\"disabled\":!_vm.present,\"name\":\"blur\",\"type\":\"range\",\"max\":\"20\",\"min\":\"0\"},domProps:{\"value\":(_vm.selected.blur)},on:{\"__r\":function($event){return _vm.$set(_vm.selected, \"blur\", $event.target.value)}}}),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.blur),expression:\"selected.blur\"}],staticClass:\"input-number\",attrs:{\"disabled\":!_vm.present,\"type\":\"number\",\"min\":\"0\"},domProps:{\"value\":(_vm.selected.blur)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.selected, \"blur\", $event.target.value)}}})]),_vm._v(\" \"),_c('div',{staticClass:\"spread-control style-control\",attrs:{\"disabled\":!_vm.present}},[_c('label',{staticClass:\"label\",attrs:{\"for\":\"spread\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.shadows.spread'))+\"\\n \")]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.spread),expression:\"selected.spread\"}],staticClass:\"input-range\",attrs:{\"id\":\"spread\",\"disabled\":!_vm.present,\"name\":\"spread\",\"type\":\"range\",\"max\":\"20\",\"min\":\"-20\"},domProps:{\"value\":(_vm.selected.spread)},on:{\"__r\":function($event){return _vm.$set(_vm.selected, \"spread\", $event.target.value)}}}),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.spread),expression:\"selected.spread\"}],staticClass:\"input-number\",attrs:{\"disabled\":!_vm.present,\"type\":\"number\"},domProps:{\"value\":(_vm.selected.spread)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.selected, \"spread\", $event.target.value)}}})]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"disabled\":!_vm.present,\"label\":_vm.$t('settings.style.common.color'),\"fallback\":_vm.currentFallback.color,\"show-optional-tickbox\":false,\"name\":\"shadow\"},model:{value:(_vm.selected.color),callback:function ($$v) {_vm.$set(_vm.selected, \"color\", $$v)},expression:\"selected.color\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"disabled\":!_vm.present},model:{value:(_vm.selected.alpha),callback:function ($$v) {_vm.$set(_vm.selected, \"alpha\", $$v)},expression:\"selected.alpha\"}}),_vm._v(\" \"),_c('i18n',{attrs:{\"path\":\"settings.style.shadows.hintV3\",\"tag\":\"p\"}},[_c('code',[_vm._v(\"--variable,mod\")])])],1)])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import { set } from 'vue'\n\nexport default {\n props: [\n 'name', 'label', 'value', 'fallback', 'options', 'no-inherit'\n ],\n data () {\n return {\n lValue: this.value,\n availableOptions: [\n this.noInherit ? '' : 'inherit',\n 'custom',\n ...(this.options || []),\n 'serif',\n 'monospace',\n 'sans-serif'\n ].filter(_ => _)\n }\n },\n beforeUpdate () {\n this.lValue = this.value\n },\n computed: {\n present () {\n return typeof this.lValue !== 'undefined'\n },\n dValue () {\n return this.lValue || this.fallback || {}\n },\n family: {\n get () {\n return this.dValue.family\n },\n set (v) {\n set(this.lValue, 'family', v)\n this.$emit('input', this.lValue)\n }\n },\n isCustom () {\n return this.preset === 'custom'\n },\n preset: {\n get () {\n if (this.family === 'serif' ||\n this.family === 'sans-serif' ||\n this.family === 'monospace' ||\n this.family === 'inherit') {\n return this.family\n } else {\n return 'custom'\n }\n },\n set (v) {\n this.family = v === 'custom' ? '' : v\n }\n }\n }\n}\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./font_control.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./font_control.js\"\nimport __vue_script__ from \"!!babel-loader!./font_control.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-0edf8dfc\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./font_control.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"font-control style-control\",class:{ custom: _vm.isCustom }},[_c('label',{staticClass:\"label\",attrs:{\"for\":_vm.preset === 'custom' ? _vm.name : _vm.name + '-font-switcher'}},[_vm._v(\"\\n \"+_vm._s(_vm.label)+\"\\n \")]),_vm._v(\" \"),(typeof _vm.fallback !== 'undefined')?_c('input',{staticClass:\"opt exlcude-disabled\",attrs:{\"id\":_vm.name + '-o',\"type\":\"checkbox\"},domProps:{\"checked\":_vm.present},on:{\"input\":function($event){return _vm.$emit('input', typeof _vm.value === 'undefined' ? _vm.fallback : undefined)}}}):_vm._e(),_vm._v(\" \"),(typeof _vm.fallback !== 'undefined')?_c('label',{staticClass:\"opt-l\",attrs:{\"for\":_vm.name + '-o'}}):_vm._e(),_vm._v(\" \"),_c('label',{staticClass:\"select\",attrs:{\"for\":_vm.name + '-font-switcher',\"disabled\":!_vm.present}},[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.preset),expression:\"preset\"}],staticClass:\"font-switcher\",attrs:{\"id\":_vm.name + '-font-switcher',\"disabled\":!_vm.present},on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.preset=$event.target.multiple ? $$selectedVal : $$selectedVal[0]}}},_vm._l((_vm.availableOptions),function(option){return _c('option',{key:option,domProps:{\"value\":option}},[_vm._v(\"\\n \"+_vm._s(option === 'custom' ? _vm.$t('settings.style.fonts.custom') : option)+\"\\n \")])}),0),_vm._v(\" \"),_c('i',{staticClass:\"icon-down-open\"})]),_vm._v(\" \"),(_vm.isCustom)?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.family),expression:\"family\"}],staticClass:\"custom-font\",attrs:{\"id\":_vm.name,\"type\":\"text\"},domProps:{\"value\":(_vm.family)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.family=$event.target.value}}}):_vm._e()])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","\n\n\n\n\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./contrast_ratio.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./contrast_ratio.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./contrast_ratio.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-7974f5b3\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./contrast_ratio.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.contrast)?_c('span',{staticClass:\"contrast-ratio\"},[_c('span',{staticClass:\"rating\",attrs:{\"title\":_vm.hint}},[(_vm.contrast.aaa)?_c('span',[_c('i',{staticClass:\"icon-thumbs-up-alt\"})]):_vm._e(),_vm._v(\" \"),(!_vm.contrast.aaa && _vm.contrast.aa)?_c('span',[_c('i',{staticClass:\"icon-adjust\"})]):_vm._e(),_vm._v(\" \"),(!_vm.contrast.aaa && !_vm.contrast.aa)?_c('span',[_c('i',{staticClass:\"icon-attention\"})]):_vm._e()]),_vm._v(\" \"),(_vm.contrast && _vm.large)?_c('span',{staticClass:\"rating\",attrs:{\"title\":_vm.hint_18pt}},[(_vm.contrast.laaa)?_c('span',[_c('i',{staticClass:\"icon-thumbs-up-alt\"})]):_vm._e(),_vm._v(\" \"),(!_vm.contrast.laaa && _vm.contrast.laa)?_c('span',[_c('i',{staticClass:\"icon-adjust\"})]):_vm._e(),_vm._v(\" \"),(!_vm.contrast.laaa && !_vm.contrast.laa)?_c('span',[_c('i',{staticClass:\"icon-attention\"})]):_vm._e()]):_vm._e()]):_vm._e()}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","\n\n\n\n\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./export_import.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./export_import.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./export_import.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-3d9b5a74\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./export_import.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"import-export-container\"},[_vm._t(\"before\"),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.exportData}},[_vm._v(\"\\n \"+_vm._s(_vm.exportLabel)+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.importData}},[_vm._v(\"\\n \"+_vm._s(_vm.importLabel)+\"\\n \")]),_vm._v(\" \"),_vm._t(\"afterButtons\"),_vm._v(\" \"),(_vm.importFailed)?_c('p',{staticClass:\"alert error\"},[_vm._v(\"\\n \"+_vm._s(_vm.importFailedText)+\"\\n \")]):_vm._e(),_vm._v(\" \"),_vm._t(\"afterError\")],2)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./preview.vue\")\n}\n/* script */\nvar __vue_script__ = null\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-1a88be74\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./preview.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"preview-container\"},[_c('div',{staticClass:\"underlay underlay-preview\"}),_vm._v(\" \"),_c('div',{staticClass:\"panel dummy\"},[_c('div',{staticClass:\"panel-heading\"},[_c('div',{staticClass:\"title\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.header'))+\"\\n \"),_c('span',{staticClass:\"badge badge-notification\"},[_vm._v(\"\\n 99\\n \")])]),_vm._v(\" \"),_c('span',{staticClass:\"faint\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.header_faint'))+\"\\n \")]),_vm._v(\" \"),_c('span',{staticClass:\"alert error\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.error'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.button'))+\"\\n \")])]),_vm._v(\" \"),_c('div',{staticClass:\"panel-body theme-preview-content\"},[_c('div',{staticClass:\"post\"},[_c('div',{staticClass:\"avatar still-image\"},[_vm._v(\"\\n ( ͡° ͜ʖ ͡°)\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"content\"},[_c('h4',[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.content'))+\"\\n \")]),_vm._v(\" \"),_c('i18n',{attrs:{\"path\":\"settings.style.preview.text\"}},[_c('code',{staticStyle:{\"font-family\":\"var(--postCodeFont)\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.mono'))+\"\\n \")]),_vm._v(\" \"),_c('a',{staticStyle:{\"color\":\"var(--link)\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.link'))+\"\\n \")])]),_vm._v(\" \"),_vm._m(0)],1)]),_vm._v(\" \"),_c('div',{staticClass:\"after-post\"},[_c('div',{staticClass:\"avatar-alt\"},[_vm._v(\"\\n :^)\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"content\"},[_c('i18n',{staticClass:\"faint\",attrs:{\"path\":\"settings.style.preview.fine_print\",\"tag\":\"span\"}},[_c('a',{staticStyle:{\"color\":\"var(--faintLink)\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.faint_link'))+\"\\n \")])])],1)]),_vm._v(\" \"),_c('div',{staticClass:\"separator\"}),_vm._v(\" \"),_c('span',{staticClass:\"alert error\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.error'))+\"\\n \")]),_vm._v(\" \"),_c('input',{attrs:{\"type\":\"text\"},domProps:{\"value\":_vm.$t('settings.style.preview.input')}}),_vm._v(\" \"),_c('div',{staticClass:\"actions\"},[_c('span',{staticClass:\"checkbox\"},[_c('input',{attrs:{\"id\":\"preview_checkbox\",\"checked\":\"very yes\",\"type\":\"checkbox\"}}),_vm._v(\" \"),_c('label',{attrs:{\"for\":\"preview_checkbox\"}},[_vm._v(_vm._s(_vm.$t('settings.style.preview.checkbox')))])]),_vm._v(\" \"),_c('button',{staticClass:\"btn\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.button'))+\"\\n \")])])])])])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"icons\"},[_c('i',{staticClass:\"button-icon icon-reply\",staticStyle:{\"color\":\"var(--cBlue)\"}}),_vm._v(\" \"),_c('i',{staticClass:\"button-icon icon-retweet\",staticStyle:{\"color\":\"var(--cGreen)\"}}),_vm._v(\" \"),_c('i',{staticClass:\"button-icon icon-star\",staticStyle:{\"color\":\"var(--cOrange)\"}}),_vm._v(\" \"),_c('i',{staticClass:\"button-icon icon-cancel\",staticStyle:{\"color\":\"var(--cRed)\"}})])}]\nexport { render, staticRenderFns }","import { set, delete as del } from 'vue'\nimport {\n rgb2hex,\n hex2rgb,\n getContrastRatioLayers\n} from 'src/services/color_convert/color_convert.js'\nimport {\n DEFAULT_SHADOWS,\n generateColors,\n generateShadows,\n generateRadii,\n generateFonts,\n composePreset,\n getThemes,\n shadows2to3,\n colors2to3\n} from 'src/services/style_setter/style_setter.js'\nimport {\n SLOT_INHERITANCE\n} from 'src/services/theme_data/pleromafe.js'\nimport {\n CURRENT_VERSION,\n OPACITIES,\n getLayers,\n getOpacitySlot\n} from 'src/services/theme_data/theme_data.service.js'\nimport ColorInput from 'src/components/color_input/color_input.vue'\nimport RangeInput from 'src/components/range_input/range_input.vue'\nimport OpacityInput from 'src/components/opacity_input/opacity_input.vue'\nimport ShadowControl from 'src/components/shadow_control/shadow_control.vue'\nimport FontControl from 'src/components/font_control/font_control.vue'\nimport ContrastRatio from 'src/components/contrast_ratio/contrast_ratio.vue'\nimport TabSwitcher from 'src/components/tab_switcher/tab_switcher.js'\nimport ExportImport from 'src/components/export_import/export_import.vue'\nimport Checkbox from 'src/components/checkbox/checkbox.vue'\n\nimport Preview from './preview.vue'\n\n// List of color values used in v1\nconst v1OnlyNames = [\n 'bg',\n 'fg',\n 'text',\n 'link',\n 'cRed',\n 'cGreen',\n 'cBlue',\n 'cOrange'\n].map(_ => _ + 'ColorLocal')\n\nconst colorConvert = (color) => {\n if (color.startsWith('--') || color === 'transparent') {\n return color\n } else {\n return hex2rgb(color)\n }\n}\n\nexport default {\n data () {\n return {\n availableStyles: [],\n selected: this.$store.getters.mergedConfig.theme,\n themeWarning: undefined,\n tempImportFile: undefined,\n engineVersion: 0,\n\n previewShadows: {},\n previewColors: {},\n previewRadii: {},\n previewFonts: {},\n\n shadowsInvalid: true,\n colorsInvalid: true,\n radiiInvalid: true,\n\n keepColor: false,\n keepShadows: false,\n keepOpacity: false,\n keepRoundness: false,\n keepFonts: false,\n\n ...Object.keys(SLOT_INHERITANCE)\n .map(key => [key, ''])\n .reduce((acc, [key, val]) => ({ ...acc, [ key + 'ColorLocal' ]: val }), {}),\n\n ...Object.keys(OPACITIES)\n .map(key => [key, ''])\n .reduce((acc, [key, val]) => ({ ...acc, [ key + 'OpacityLocal' ]: val }), {}),\n\n shadowSelected: undefined,\n shadowsLocal: {},\n fontsLocal: {},\n\n btnRadiusLocal: '',\n inputRadiusLocal: '',\n checkboxRadiusLocal: '',\n panelRadiusLocal: '',\n avatarRadiusLocal: '',\n avatarAltRadiusLocal: '',\n attachmentRadiusLocal: '',\n tooltipRadiusLocal: '',\n chatMessageRadiusLocal: ''\n }\n },\n created () {\n const self = this\n\n getThemes()\n .then((promises) => {\n return Promise.all(\n Object.entries(promises)\n .map(([k, v]) => v.then(res => [k, res]))\n )\n })\n .then(themes => themes.reduce((acc, [k, v]) => {\n if (v) {\n return {\n ...acc,\n [k]: v\n }\n } else {\n return acc\n }\n }, {}))\n .then((themesComplete) => {\n self.availableStyles = themesComplete\n })\n },\n mounted () {\n this.loadThemeFromLocalStorage()\n if (typeof this.shadowSelected === 'undefined') {\n this.shadowSelected = this.shadowsAvailable[0]\n }\n },\n computed: {\n themeWarningHelp () {\n if (!this.themeWarning) return\n const t = this.$t\n const pre = 'settings.style.switcher.help.'\n const {\n origin,\n themeEngineVersion,\n type,\n noActionsPossible\n } = this.themeWarning\n if (origin === 'file') {\n // Loaded v2 theme from file\n if (themeEngineVersion === 2 && type === 'wrong_version') {\n return t(pre + 'v2_imported')\n }\n if (themeEngineVersion > CURRENT_VERSION) {\n return t(pre + 'future_version_imported') + ' ' +\n (\n noActionsPossible\n ? t(pre + 'snapshot_missing')\n : t(pre + 'snapshot_present')\n )\n }\n if (themeEngineVersion < CURRENT_VERSION) {\n return t(pre + 'future_version_imported') + ' ' +\n (\n noActionsPossible\n ? t(pre + 'snapshot_missing')\n : t(pre + 'snapshot_present')\n )\n }\n } else if (origin === 'localStorage') {\n if (type === 'snapshot_source_mismatch') {\n return t(pre + 'snapshot_source_mismatch')\n }\n // FE upgraded from v2\n if (themeEngineVersion === 2) {\n return t(pre + 'upgraded_from_v2')\n }\n // Admin downgraded FE\n if (themeEngineVersion > CURRENT_VERSION) {\n return t(pre + 'fe_downgraded') + ' ' +\n (\n noActionsPossible\n ? t(pre + 'migration_snapshot_ok')\n : t(pre + 'migration_snapshot_gone')\n )\n }\n // Admin upgraded FE\n if (themeEngineVersion < CURRENT_VERSION) {\n return t(pre + 'fe_upgraded') + ' ' +\n (\n noActionsPossible\n ? t(pre + 'migration_snapshot_ok')\n : t(pre + 'migration_snapshot_gone')\n )\n }\n }\n },\n selectedVersion () {\n return Array.isArray(this.selected) ? 1 : 2\n },\n currentColors () {\n return Object.keys(SLOT_INHERITANCE)\n .map(key => [key, this[key + 'ColorLocal']])\n .reduce((acc, [key, val]) => ({ ...acc, [ key ]: val }), {})\n },\n currentOpacity () {\n return Object.keys(OPACITIES)\n .map(key => [key, this[key + 'OpacityLocal']])\n .reduce((acc, [key, val]) => ({ ...acc, [ key ]: val }), {})\n },\n currentRadii () {\n return {\n btn: this.btnRadiusLocal,\n input: this.inputRadiusLocal,\n checkbox: this.checkboxRadiusLocal,\n panel: this.panelRadiusLocal,\n avatar: this.avatarRadiusLocal,\n avatarAlt: this.avatarAltRadiusLocal,\n tooltip: this.tooltipRadiusLocal,\n attachment: this.attachmentRadiusLocal,\n chatMessage: this.chatMessageRadiusLocal\n }\n },\n preview () {\n return composePreset(this.previewColors, this.previewRadii, this.previewShadows, this.previewFonts)\n },\n previewTheme () {\n if (!this.preview.theme.colors) return { colors: {}, opacity: {}, radii: {}, shadows: {}, fonts: {} }\n return this.preview.theme\n },\n // This needs optimization maybe\n previewContrast () {\n try {\n if (!this.previewTheme.colors.bg) return {}\n const colors = this.previewTheme.colors\n const opacity = this.previewTheme.opacity\n if (!colors.bg) return {}\n const hints = (ratio) => ({\n text: ratio.toPrecision(3) + ':1',\n // AA level, AAA level\n aa: ratio >= 4.5,\n aaa: ratio >= 7,\n // same but for 18pt+ texts\n laa: ratio >= 3,\n laaa: ratio >= 4.5\n })\n const colorsConverted = Object.entries(colors).reduce((acc, [key, value]) => ({ ...acc, [key]: colorConvert(value) }), {})\n\n const ratios = Object.entries(SLOT_INHERITANCE).reduce((acc, [key, value]) => {\n const slotIsBaseText = key === 'text' || key === 'link'\n const slotIsText = slotIsBaseText || (\n typeof value === 'object' && value !== null && value.textColor\n )\n if (!slotIsText) return acc\n const { layer, variant } = slotIsBaseText ? { layer: 'bg' } : value\n const background = variant || layer\n const opacitySlot = getOpacitySlot(background)\n const textColors = [\n key,\n ...(background === 'bg' ? ['cRed', 'cGreen', 'cBlue', 'cOrange'] : [])\n ]\n\n const layers = getLayers(\n layer,\n variant || layer,\n opacitySlot,\n colorsConverted,\n opacity\n )\n\n return {\n ...acc,\n ...textColors.reduce((acc, textColorKey) => {\n const newKey = slotIsBaseText\n ? 'bg' + textColorKey[0].toUpperCase() + textColorKey.slice(1)\n : textColorKey\n return {\n ...acc,\n [newKey]: getContrastRatioLayers(\n colorsConverted[textColorKey],\n layers,\n colorsConverted[textColorKey]\n )\n }\n }, {})\n }\n }, {})\n\n return Object.entries(ratios).reduce((acc, [k, v]) => { acc[k] = hints(v); return acc }, {})\n } catch (e) {\n console.warn('Failure computing contrasts', e)\n }\n },\n previewRules () {\n if (!this.preview.rules) return ''\n return [\n ...Object.values(this.preview.rules),\n 'color: var(--text)',\n 'font-family: var(--interfaceFont, sans-serif)'\n ].join(';')\n },\n shadowsAvailable () {\n return Object.keys(DEFAULT_SHADOWS).sort()\n },\n currentShadowOverriden: {\n get () {\n return !!this.currentShadow\n },\n set (val) {\n if (val) {\n set(this.shadowsLocal, this.shadowSelected, this.currentShadowFallback.map(_ => Object.assign({}, _)))\n } else {\n del(this.shadowsLocal, this.shadowSelected)\n }\n }\n },\n currentShadowFallback () {\n return (this.previewTheme.shadows || {})[this.shadowSelected]\n },\n currentShadow: {\n get () {\n return this.shadowsLocal[this.shadowSelected]\n },\n set (v) {\n set(this.shadowsLocal, this.shadowSelected, v)\n }\n },\n themeValid () {\n return !this.shadowsInvalid && !this.colorsInvalid && !this.radiiInvalid\n },\n exportedTheme () {\n const saveEverything = (\n !this.keepFonts &&\n !this.keepShadows &&\n !this.keepOpacity &&\n !this.keepRoundness &&\n !this.keepColor\n )\n\n const source = {\n themeEngineVersion: CURRENT_VERSION\n }\n\n if (this.keepFonts || saveEverything) {\n source.fonts = this.fontsLocal\n }\n if (this.keepShadows || saveEverything) {\n source.shadows = this.shadowsLocal\n }\n if (this.keepOpacity || saveEverything) {\n source.opacity = this.currentOpacity\n }\n if (this.keepColor || saveEverything) {\n source.colors = this.currentColors\n }\n if (this.keepRoundness || saveEverything) {\n source.radii = this.currentRadii\n }\n\n const theme = {\n themeEngineVersion: CURRENT_VERSION,\n ...this.previewTheme\n }\n\n return {\n // To separate from other random JSON files and possible future source formats\n _pleroma_theme_version: 2, theme, source\n }\n }\n },\n components: {\n ColorInput,\n OpacityInput,\n RangeInput,\n ContrastRatio,\n ShadowControl,\n FontControl,\n TabSwitcher,\n Preview,\n ExportImport,\n Checkbox\n },\n methods: {\n loadTheme (\n {\n theme,\n source,\n _pleroma_theme_version: fileVersion\n },\n origin,\n forceUseSource = false\n ) {\n this.dismissWarning()\n if (!source && !theme) {\n throw new Error('Can\\'t load theme: empty')\n }\n const version = (origin === 'localStorage' && !theme.colors)\n ? 'l1'\n : fileVersion\n const snapshotEngineVersion = (theme || {}).themeEngineVersion\n const themeEngineVersion = (source || {}).themeEngineVersion || 2\n const versionsMatch = themeEngineVersion === CURRENT_VERSION\n const sourceSnapshotMismatch = (\n theme !== undefined &&\n source !== undefined &&\n themeEngineVersion !== snapshotEngineVersion\n )\n // Force loading of source if user requested it or if snapshot\n // is unavailable\n const forcedSourceLoad = (source && forceUseSource) || !theme\n if (!(versionsMatch && !sourceSnapshotMismatch) &&\n !forcedSourceLoad &&\n version !== 'l1' &&\n origin !== 'defaults'\n ) {\n if (sourceSnapshotMismatch && origin === 'localStorage') {\n this.themeWarning = {\n origin,\n themeEngineVersion,\n type: 'snapshot_source_mismatch'\n }\n } else if (!theme) {\n this.themeWarning = {\n origin,\n noActionsPossible: true,\n themeEngineVersion,\n type: 'no_snapshot_old_version'\n }\n } else if (!versionsMatch) {\n this.themeWarning = {\n origin,\n noActionsPossible: !source,\n themeEngineVersion,\n type: 'wrong_version'\n }\n }\n }\n this.normalizeLocalState(theme, version, source, forcedSourceLoad)\n },\n forceLoadLocalStorage () {\n this.loadThemeFromLocalStorage(true)\n },\n dismissWarning () {\n this.themeWarning = undefined\n this.tempImportFile = undefined\n },\n forceLoad () {\n const { origin } = this.themeWarning\n switch (origin) {\n case 'localStorage':\n this.loadThemeFromLocalStorage(true)\n break\n case 'file':\n this.onImport(this.tempImportFile, true)\n break\n }\n this.dismissWarning()\n },\n forceSnapshot () {\n const { origin } = this.themeWarning\n switch (origin) {\n case 'localStorage':\n this.loadThemeFromLocalStorage(false, true)\n break\n case 'file':\n console.err('Forcing snapshout from file is not supported yet')\n break\n }\n this.dismissWarning()\n },\n loadThemeFromLocalStorage (confirmLoadSource = false, forceSnapshot = false) {\n const {\n customTheme: theme,\n customThemeSource: source\n } = this.$store.getters.mergedConfig\n if (!theme && !source) {\n // Anon user or never touched themes\n this.loadTheme(\n this.$store.state.instance.themeData,\n 'defaults',\n confirmLoadSource\n )\n } else {\n this.loadTheme(\n {\n theme,\n source: forceSnapshot ? theme : source\n },\n 'localStorage',\n confirmLoadSource\n )\n }\n },\n setCustomTheme () {\n this.$store.dispatch('setOption', {\n name: 'customTheme',\n value: {\n themeEngineVersion: CURRENT_VERSION,\n ...this.previewTheme\n }\n })\n this.$store.dispatch('setOption', {\n name: 'customThemeSource',\n value: {\n themeEngineVersion: CURRENT_VERSION,\n shadows: this.shadowsLocal,\n fonts: this.fontsLocal,\n opacity: this.currentOpacity,\n colors: this.currentColors,\n radii: this.currentRadii\n }\n })\n },\n updatePreviewColorsAndShadows () {\n this.previewColors = generateColors({\n opacity: this.currentOpacity,\n colors: this.currentColors\n })\n this.previewShadows = generateShadows(\n { shadows: this.shadowsLocal, opacity: this.previewTheme.opacity, themeEngineVersion: this.engineVersion },\n this.previewColors.theme.colors,\n this.previewColors.mod\n )\n },\n onImport (parsed, forceSource = false) {\n this.tempImportFile = parsed\n this.loadTheme(parsed, 'file', forceSource)\n },\n importValidator (parsed) {\n const version = parsed._pleroma_theme_version\n return version >= 1 || version <= 2\n },\n clearAll () {\n this.loadThemeFromLocalStorage()\n },\n\n // Clears all the extra stuff when loading V1 theme\n clearV1 () {\n Object.keys(this.$data)\n .filter(_ => _.endsWith('ColorLocal') || _.endsWith('OpacityLocal'))\n .filter(_ => !v1OnlyNames.includes(_))\n .forEach(key => {\n set(this.$data, key, undefined)\n })\n },\n\n clearRoundness () {\n Object.keys(this.$data)\n .filter(_ => _.endsWith('RadiusLocal'))\n .forEach(key => {\n set(this.$data, key, undefined)\n })\n },\n\n clearOpacity () {\n Object.keys(this.$data)\n .filter(_ => _.endsWith('OpacityLocal'))\n .forEach(key => {\n set(this.$data, key, undefined)\n })\n },\n\n clearShadows () {\n this.shadowsLocal = {}\n },\n\n clearFonts () {\n this.fontsLocal = {}\n },\n\n /**\n * This applies stored theme data onto form. Supports three versions of data:\n * v3 (version >= 3) - newest version of themes which supports snapshots for better compatiblity\n * v2 (version = 2) - newer version of themes.\n * v1 (version = 1) - older version of themes (import from file)\n * v1l (version = l1) - older version of theme (load from local storage)\n * v1 and v1l differ because of way themes were stored/exported.\n * @param {Object} theme - theme data (snapshot)\n * @param {Number} version - version of data. 0 means try to guess based on data. \"l1\" means v1, locastorage type\n * @param {Object} source - theme source - this will be used if compatible\n * @param {Boolean} source - by default source won't be used if version doesn't match since it might render differently\n * this allows importing source anyway\n */\n normalizeLocalState (theme, version = 0, source, forceSource = false) {\n let input\n if (typeof source !== 'undefined') {\n if (forceSource || source.themeEngineVersion === CURRENT_VERSION) {\n input = source\n version = source.themeEngineVersion\n } else {\n input = theme\n }\n } else {\n input = theme\n }\n\n const radii = input.radii || input\n const opacity = input.opacity\n const shadows = input.shadows || {}\n const fonts = input.fonts || {}\n const colors = !input.themeEngineVersion\n ? colors2to3(input.colors || input)\n : input.colors || input\n\n if (version === 0) {\n if (input.version) version = input.version\n // Old v1 naming: fg is text, btn is foreground\n if (typeof colors.text === 'undefined' && typeof colors.fg !== 'undefined') {\n version = 1\n }\n // New v2 naming: text is text, fg is foreground\n if (typeof colors.text !== 'undefined' && typeof colors.fg !== 'undefined') {\n version = 2\n }\n }\n\n this.engineVersion = version\n\n // Stuff that differs between V1 and V2\n if (version === 1) {\n this.fgColorLocal = rgb2hex(colors.btn)\n this.textColorLocal = rgb2hex(colors.fg)\n }\n\n if (!this.keepColor) {\n this.clearV1()\n const keys = new Set(version !== 1 ? Object.keys(SLOT_INHERITANCE) : [])\n if (version === 1 || version === 'l1') {\n keys\n .add('bg')\n .add('link')\n .add('cRed')\n .add('cBlue')\n .add('cGreen')\n .add('cOrange')\n }\n\n keys.forEach(key => {\n const color = colors[key]\n const hex = rgb2hex(colors[key])\n this[key + 'ColorLocal'] = hex === '#aN' ? color : hex\n })\n }\n\n if (opacity && !this.keepOpacity) {\n this.clearOpacity()\n Object.entries(opacity).forEach(([k, v]) => {\n if (typeof v === 'undefined' || v === null || Number.isNaN(v)) return\n this[k + 'OpacityLocal'] = v\n })\n }\n\n if (!this.keepRoundness) {\n this.clearRoundness()\n Object.entries(radii).forEach(([k, v]) => {\n // 'Radius' is kept mostly for v1->v2 localstorage transition\n const key = k.endsWith('Radius') ? k.split('Radius')[0] : k\n this[key + 'RadiusLocal'] = v\n })\n }\n\n if (!this.keepShadows) {\n this.clearShadows()\n if (version === 2) {\n this.shadowsLocal = shadows2to3(shadows, this.previewTheme.opacity)\n } else {\n this.shadowsLocal = shadows\n }\n this.shadowSelected = this.shadowsAvailable[0]\n }\n\n if (!this.keepFonts) {\n this.clearFonts()\n this.fontsLocal = fonts\n }\n }\n },\n watch: {\n currentRadii () {\n try {\n this.previewRadii = generateRadii({ radii: this.currentRadii })\n this.radiiInvalid = false\n } catch (e) {\n this.radiiInvalid = true\n console.warn(e)\n }\n },\n shadowsLocal: {\n handler () {\n if (Object.getOwnPropertyNames(this.previewColors).length === 1) return\n try {\n this.updatePreviewColorsAndShadows()\n this.shadowsInvalid = false\n } catch (e) {\n this.shadowsInvalid = true\n console.warn(e)\n }\n },\n deep: true\n },\n fontsLocal: {\n handler () {\n try {\n this.previewFonts = generateFonts({ fonts: this.fontsLocal })\n this.fontsInvalid = false\n } catch (e) {\n this.fontsInvalid = true\n console.warn(e)\n }\n },\n deep: true\n },\n currentColors () {\n try {\n this.updatePreviewColorsAndShadows()\n this.colorsInvalid = false\n this.shadowsInvalid = false\n } catch (e) {\n this.colorsInvalid = true\n this.shadowsInvalid = true\n console.warn(e)\n }\n },\n currentOpacity () {\n try {\n this.updatePreviewColorsAndShadows()\n } catch (e) {\n console.warn(e)\n }\n },\n selected () {\n this.dismissWarning()\n if (this.selectedVersion === 1) {\n if (!this.keepRoundness) {\n this.clearRoundness()\n }\n\n if (!this.keepShadows) {\n this.clearShadows()\n }\n\n if (!this.keepOpacity) {\n this.clearOpacity()\n }\n\n if (!this.keepColor) {\n this.clearV1()\n\n this.bgColorLocal = this.selected[1]\n this.fgColorLocal = this.selected[2]\n this.textColorLocal = this.selected[3]\n this.linkColorLocal = this.selected[4]\n this.cRedColorLocal = this.selected[5]\n this.cGreenColorLocal = this.selected[6]\n this.cBlueColorLocal = this.selected[7]\n this.cOrangeColorLocal = this.selected[8]\n }\n } else if (this.selectedVersion >= 2) {\n this.normalizeLocalState(this.selected.theme, 2, this.selected.source)\n }\n }\n }\n}\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!./theme_tab.scss\")\n}\n/* script */\nexport * from \"!!babel-loader!./theme_tab.js\"\nimport __vue_script__ from \"!!babel-loader!./theme_tab.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-03c6cfba\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./theme_tab.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"theme-tab\"},[_c('div',{staticClass:\"presets-container\"},[_c('div',{staticClass:\"save-load\"},[(_vm.themeWarning)?_c('div',{staticClass:\"theme-warning\"},[_c('div',{staticClass:\"alert warning\"},[_vm._v(\"\\n \"+_vm._s(_vm.themeWarningHelp)+\"\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"buttons\"},[(_vm.themeWarning.type === 'snapshot_source_mismatch')?[_c('button',{staticClass:\"btn\",on:{\"click\":_vm.forceLoad}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.use_source'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.forceSnapshot}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.use_snapshot'))+\"\\n \")])]:(_vm.themeWarning.noActionsPossible)?[_c('button',{staticClass:\"btn\",on:{\"click\":_vm.dismissWarning}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('general.dismiss'))+\"\\n \")])]:[_c('button',{staticClass:\"btn\",on:{\"click\":_vm.forceLoad}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.load_theme'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.dismissWarning}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.keep_as_is'))+\"\\n \")])]],2)]):_vm._e(),_vm._v(\" \"),_c('ExportImport',{attrs:{\"export-object\":_vm.exportedTheme,\"export-label\":_vm.$t(\"settings.export_theme\"),\"import-label\":_vm.$t(\"settings.import_theme\"),\"import-failed-text\":_vm.$t(\"settings.invalid_theme_imported\"),\"on-import\":_vm.onImport,\"validator\":_vm.importValidator}},[_c('template',{slot:\"before\"},[_c('div',{staticClass:\"presets\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.presets'))+\"\\n \"),_c('label',{staticClass:\"select\",attrs:{\"for\":\"preset-switcher\"}},[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected),expression:\"selected\"}],staticClass:\"preset-switcher\",attrs:{\"id\":\"preset-switcher\"},on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.selected=$event.target.multiple ? $$selectedVal : $$selectedVal[0]}}},_vm._l((_vm.availableStyles),function(style){return _c('option',{key:style.name,style:({\n backgroundColor: style[1] || (style.theme || style.source).colors.bg,\n color: style[3] || (style.theme || style.source).colors.text\n }),domProps:{\"value\":style}},[_vm._v(\"\\n \"+_vm._s(style[0] || style.name)+\"\\n \")])}),0),_vm._v(\" \"),_c('i',{staticClass:\"icon-down-open\"})])])])],2)],1),_vm._v(\" \"),_c('div',{staticClass:\"save-load-options\"},[_c('span',{staticClass:\"keep-option\"},[_c('Checkbox',{model:{value:(_vm.keepColor),callback:function ($$v) {_vm.keepColor=$$v},expression:\"keepColor\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.keep_color'))+\"\\n \")])],1),_vm._v(\" \"),_c('span',{staticClass:\"keep-option\"},[_c('Checkbox',{model:{value:(_vm.keepShadows),callback:function ($$v) {_vm.keepShadows=$$v},expression:\"keepShadows\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.keep_shadows'))+\"\\n \")])],1),_vm._v(\" \"),_c('span',{staticClass:\"keep-option\"},[_c('Checkbox',{model:{value:(_vm.keepOpacity),callback:function ($$v) {_vm.keepOpacity=$$v},expression:\"keepOpacity\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.keep_opacity'))+\"\\n \")])],1),_vm._v(\" \"),_c('span',{staticClass:\"keep-option\"},[_c('Checkbox',{model:{value:(_vm.keepRoundness),callback:function ($$v) {_vm.keepRoundness=$$v},expression:\"keepRoundness\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.keep_roundness'))+\"\\n \")])],1),_vm._v(\" \"),_c('span',{staticClass:\"keep-option\"},[_c('Checkbox',{model:{value:(_vm.keepFonts),callback:function ($$v) {_vm.keepFonts=$$v},expression:\"keepFonts\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.keep_fonts'))+\"\\n \")])],1),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('settings.style.switcher.save_load_hint')))])])]),_vm._v(\" \"),_c('preview',{style:(_vm.previewRules)}),_vm._v(\" \"),_c('keep-alive',[_c('tab-switcher',{key:\"style-tweak\"},[_c('div',{staticClass:\"color-container\",attrs:{\"label\":_vm.$t('settings.style.common_colors._tab_label')}},[_c('div',{staticClass:\"tab-header\"},[_c('p',[_vm._v(_vm._s(_vm.$t('settings.theme_help')))]),_vm._v(\" \"),_c('div',{staticClass:\"tab-header-buttons\"},[_c('button',{staticClass:\"btn\",on:{\"click\":_vm.clearOpacity}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.clear_opacity'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.clearV1}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.clear_all'))+\"\\n \")])])]),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('settings.theme_help_v2_1')))]),_vm._v(\" \"),_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.common_colors.main')))]),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('ColorInput',{attrs:{\"name\":\"bgColor\",\"label\":_vm.$t('settings.background')},model:{value:(_vm.bgColorLocal),callback:function ($$v) {_vm.bgColorLocal=$$v},expression:\"bgColorLocal\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"bgOpacity\",\"fallback\":_vm.previewTheme.opacity.bg},model:{value:(_vm.bgOpacityLocal),callback:function ($$v) {_vm.bgOpacityLocal=$$v},expression:\"bgOpacityLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"textColor\",\"label\":_vm.$t('settings.text')},model:{value:(_vm.textColorLocal),callback:function ($$v) {_vm.textColorLocal=$$v},expression:\"textColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.bgText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"accentColor\",\"fallback\":_vm.previewTheme.colors.link,\"label\":_vm.$t('settings.accent'),\"show-optional-tickbox\":typeof _vm.linkColorLocal !== 'undefined'},model:{value:(_vm.accentColorLocal),callback:function ($$v) {_vm.accentColorLocal=$$v},expression:\"accentColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"linkColor\",\"fallback\":_vm.previewTheme.colors.accent,\"label\":_vm.$t('settings.links'),\"show-optional-tickbox\":typeof _vm.accentColorLocal !== 'undefined'},model:{value:(_vm.linkColorLocal),callback:function ($$v) {_vm.linkColorLocal=$$v},expression:\"linkColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.bgLink}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('ColorInput',{attrs:{\"name\":\"fgColor\",\"label\":_vm.$t('settings.foreground')},model:{value:(_vm.fgColorLocal),callback:function ($$v) {_vm.fgColorLocal=$$v},expression:\"fgColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"fgTextColor\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.fgText},model:{value:(_vm.fgTextColorLocal),callback:function ($$v) {_vm.fgTextColorLocal=$$v},expression:\"fgTextColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"fgLinkColor\",\"label\":_vm.$t('settings.links'),\"fallback\":_vm.previewTheme.colors.fgLink},model:{value:(_vm.fgLinkColorLocal),callback:function ($$v) {_vm.fgLinkColorLocal=$$v},expression:\"fgLinkColorLocal\"}}),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('settings.style.common_colors.foreground_hint')))])],1),_vm._v(\" \"),_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.common_colors.rgbo')))]),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('ColorInput',{attrs:{\"name\":\"cRedColor\",\"label\":_vm.$t('settings.cRed')},model:{value:(_vm.cRedColorLocal),callback:function ($$v) {_vm.cRedColorLocal=$$v},expression:\"cRedColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.bgCRed}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"cBlueColor\",\"label\":_vm.$t('settings.cBlue')},model:{value:(_vm.cBlueColorLocal),callback:function ($$v) {_vm.cBlueColorLocal=$$v},expression:\"cBlueColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.bgCBlue}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('ColorInput',{attrs:{\"name\":\"cGreenColor\",\"label\":_vm.$t('settings.cGreen')},model:{value:(_vm.cGreenColorLocal),callback:function ($$v) {_vm.cGreenColorLocal=$$v},expression:\"cGreenColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.bgCGreen}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"cOrangeColor\",\"label\":_vm.$t('settings.cOrange')},model:{value:(_vm.cOrangeColorLocal),callback:function ($$v) {_vm.cOrangeColorLocal=$$v},expression:\"cOrangeColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.bgCOrange}})],1),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('settings.theme_help_v2_2')))])]),_vm._v(\" \"),_c('div',{staticClass:\"color-container\",attrs:{\"label\":_vm.$t('settings.style.advanced_colors._tab_label')}},[_c('div',{staticClass:\"tab-header\"},[_c('p',[_vm._v(_vm._s(_vm.$t('settings.theme_help')))]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.clearOpacity}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.clear_opacity'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.clearV1}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.clear_all'))+\"\\n \")])]),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.post')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"postLinkColor\",\"fallback\":_vm.previewTheme.colors.accent,\"label\":_vm.$t('settings.links')},model:{value:(_vm.postLinkColorLocal),callback:function ($$v) {_vm.postLinkColorLocal=$$v},expression:\"postLinkColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.postLink}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"postGreentextColor\",\"fallback\":_vm.previewTheme.colors.cGreen,\"label\":_vm.$t('settings.greentext')},model:{value:(_vm.postGreentextColorLocal),callback:function ($$v) {_vm.postGreentextColorLocal=$$v},expression:\"postGreentextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.postGreentext}}),_vm._v(\" \"),_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.alert')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"alertError\",\"label\":_vm.$t('settings.style.advanced_colors.alert_error'),\"fallback\":_vm.previewTheme.colors.alertError},model:{value:(_vm.alertErrorColorLocal),callback:function ($$v) {_vm.alertErrorColorLocal=$$v},expression:\"alertErrorColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"alertErrorText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.alertErrorText},model:{value:(_vm.alertErrorTextColorLocal),callback:function ($$v) {_vm.alertErrorTextColorLocal=$$v},expression:\"alertErrorTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.alertErrorText,\"large\":\"\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"alertWarning\",\"label\":_vm.$t('settings.style.advanced_colors.alert_warning'),\"fallback\":_vm.previewTheme.colors.alertWarning},model:{value:(_vm.alertWarningColorLocal),callback:function ($$v) {_vm.alertWarningColorLocal=$$v},expression:\"alertWarningColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"alertWarningText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.alertWarningText},model:{value:(_vm.alertWarningTextColorLocal),callback:function ($$v) {_vm.alertWarningTextColorLocal=$$v},expression:\"alertWarningTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.alertWarningText,\"large\":\"\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"alertNeutral\",\"label\":_vm.$t('settings.style.advanced_colors.alert_neutral'),\"fallback\":_vm.previewTheme.colors.alertNeutral},model:{value:(_vm.alertNeutralColorLocal),callback:function ($$v) {_vm.alertNeutralColorLocal=$$v},expression:\"alertNeutralColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"alertNeutralText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.alertNeutralText},model:{value:(_vm.alertNeutralTextColorLocal),callback:function ($$v) {_vm.alertNeutralTextColorLocal=$$v},expression:\"alertNeutralTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.alertNeutralText,\"large\":\"\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"alertOpacity\",\"fallback\":_vm.previewTheme.opacity.alert},model:{value:(_vm.alertOpacityLocal),callback:function ($$v) {_vm.alertOpacityLocal=$$v},expression:\"alertOpacityLocal\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.badge')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"badgeNotification\",\"label\":_vm.$t('settings.style.advanced_colors.badge_notification'),\"fallback\":_vm.previewTheme.colors.badgeNotification},model:{value:(_vm.badgeNotificationColorLocal),callback:function ($$v) {_vm.badgeNotificationColorLocal=$$v},expression:\"badgeNotificationColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"badgeNotificationText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.badgeNotificationText},model:{value:(_vm.badgeNotificationTextColorLocal),callback:function ($$v) {_vm.badgeNotificationTextColorLocal=$$v},expression:\"badgeNotificationTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.badgeNotificationText,\"large\":\"\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.panel_header')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"panelColor\",\"fallback\":_vm.previewTheme.colors.panel,\"label\":_vm.$t('settings.background')},model:{value:(_vm.panelColorLocal),callback:function ($$v) {_vm.panelColorLocal=$$v},expression:\"panelColorLocal\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"panelOpacity\",\"fallback\":_vm.previewTheme.opacity.panel,\"disabled\":_vm.panelColorLocal === 'transparent'},model:{value:(_vm.panelOpacityLocal),callback:function ($$v) {_vm.panelOpacityLocal=$$v},expression:\"panelOpacityLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"panelTextColor\",\"fallback\":_vm.previewTheme.colors.panelText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.panelTextColorLocal),callback:function ($$v) {_vm.panelTextColorLocal=$$v},expression:\"panelTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.panelText,\"large\":\"\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"panelLinkColor\",\"fallback\":_vm.previewTheme.colors.panelLink,\"label\":_vm.$t('settings.links')},model:{value:(_vm.panelLinkColorLocal),callback:function ($$v) {_vm.panelLinkColorLocal=$$v},expression:\"panelLinkColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.panelLink,\"large\":\"\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.top_bar')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"topBarColor\",\"fallback\":_vm.previewTheme.colors.topBar,\"label\":_vm.$t('settings.background')},model:{value:(_vm.topBarColorLocal),callback:function ($$v) {_vm.topBarColorLocal=$$v},expression:\"topBarColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"topBarTextColor\",\"fallback\":_vm.previewTheme.colors.topBarText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.topBarTextColorLocal),callback:function ($$v) {_vm.topBarTextColorLocal=$$v},expression:\"topBarTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.topBarText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"topBarLinkColor\",\"fallback\":_vm.previewTheme.colors.topBarLink,\"label\":_vm.$t('settings.links')},model:{value:(_vm.topBarLinkColorLocal),callback:function ($$v) {_vm.topBarLinkColorLocal=$$v},expression:\"topBarLinkColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.topBarLink}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.inputs')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"inputColor\",\"fallback\":_vm.previewTheme.colors.input,\"label\":_vm.$t('settings.background')},model:{value:(_vm.inputColorLocal),callback:function ($$v) {_vm.inputColorLocal=$$v},expression:\"inputColorLocal\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"inputOpacity\",\"fallback\":_vm.previewTheme.opacity.input,\"disabled\":_vm.inputColorLocal === 'transparent'},model:{value:(_vm.inputOpacityLocal),callback:function ($$v) {_vm.inputOpacityLocal=$$v},expression:\"inputOpacityLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"inputTextColor\",\"fallback\":_vm.previewTheme.colors.inputText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.inputTextColorLocal),callback:function ($$v) {_vm.inputTextColorLocal=$$v},expression:\"inputTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.inputText}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.buttons')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnColor\",\"fallback\":_vm.previewTheme.colors.btn,\"label\":_vm.$t('settings.background')},model:{value:(_vm.btnColorLocal),callback:function ($$v) {_vm.btnColorLocal=$$v},expression:\"btnColorLocal\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"btnOpacity\",\"fallback\":_vm.previewTheme.opacity.btn,\"disabled\":_vm.btnColorLocal === 'transparent'},model:{value:(_vm.btnOpacityLocal),callback:function ($$v) {_vm.btnOpacityLocal=$$v},expression:\"btnOpacityLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnTextColor\",\"fallback\":_vm.previewTheme.colors.btnText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.btnTextColorLocal),callback:function ($$v) {_vm.btnTextColorLocal=$$v},expression:\"btnTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnPanelTextColor\",\"fallback\":_vm.previewTheme.colors.btnPanelText,\"label\":_vm.$t('settings.style.advanced_colors.panel_header')},model:{value:(_vm.btnPanelTextColorLocal),callback:function ($$v) {_vm.btnPanelTextColorLocal=$$v},expression:\"btnPanelTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnPanelText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnTopBarTextColor\",\"fallback\":_vm.previewTheme.colors.btnTopBarText,\"label\":_vm.$t('settings.style.advanced_colors.top_bar')},model:{value:(_vm.btnTopBarTextColorLocal),callback:function ($$v) {_vm.btnTopBarTextColorLocal=$$v},expression:\"btnTopBarTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnTopBarText}}),_vm._v(\" \"),_c('h5',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.pressed')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnPressedColor\",\"fallback\":_vm.previewTheme.colors.btnPressed,\"label\":_vm.$t('settings.background')},model:{value:(_vm.btnPressedColorLocal),callback:function ($$v) {_vm.btnPressedColorLocal=$$v},expression:\"btnPressedColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnPressedTextColor\",\"fallback\":_vm.previewTheme.colors.btnPressedText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.btnPressedTextColorLocal),callback:function ($$v) {_vm.btnPressedTextColorLocal=$$v},expression:\"btnPressedTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnPressedText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnPressedPanelTextColor\",\"fallback\":_vm.previewTheme.colors.btnPressedPanelText,\"label\":_vm.$t('settings.style.advanced_colors.panel_header')},model:{value:(_vm.btnPressedPanelTextColorLocal),callback:function ($$v) {_vm.btnPressedPanelTextColorLocal=$$v},expression:\"btnPressedPanelTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnPressedPanelText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnPressedTopBarTextColor\",\"fallback\":_vm.previewTheme.colors.btnPressedTopBarText,\"label\":_vm.$t('settings.style.advanced_colors.top_bar')},model:{value:(_vm.btnPressedTopBarTextColorLocal),callback:function ($$v) {_vm.btnPressedTopBarTextColorLocal=$$v},expression:\"btnPressedTopBarTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnPressedTopBarText}}),_vm._v(\" \"),_c('h5',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.disabled')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnDisabledColor\",\"fallback\":_vm.previewTheme.colors.btnDisabled,\"label\":_vm.$t('settings.background')},model:{value:(_vm.btnDisabledColorLocal),callback:function ($$v) {_vm.btnDisabledColorLocal=$$v},expression:\"btnDisabledColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnDisabledTextColor\",\"fallback\":_vm.previewTheme.colors.btnDisabledText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.btnDisabledTextColorLocal),callback:function ($$v) {_vm.btnDisabledTextColorLocal=$$v},expression:\"btnDisabledTextColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnDisabledPanelTextColor\",\"fallback\":_vm.previewTheme.colors.btnDisabledPanelText,\"label\":_vm.$t('settings.style.advanced_colors.panel_header')},model:{value:(_vm.btnDisabledPanelTextColorLocal),callback:function ($$v) {_vm.btnDisabledPanelTextColorLocal=$$v},expression:\"btnDisabledPanelTextColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnDisabledTopBarTextColor\",\"fallback\":_vm.previewTheme.colors.btnDisabledTopBarText,\"label\":_vm.$t('settings.style.advanced_colors.top_bar')},model:{value:(_vm.btnDisabledTopBarTextColorLocal),callback:function ($$v) {_vm.btnDisabledTopBarTextColorLocal=$$v},expression:\"btnDisabledTopBarTextColorLocal\"}}),_vm._v(\" \"),_c('h5',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.toggled')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnToggledColor\",\"fallback\":_vm.previewTheme.colors.btnToggled,\"label\":_vm.$t('settings.background')},model:{value:(_vm.btnToggledColorLocal),callback:function ($$v) {_vm.btnToggledColorLocal=$$v},expression:\"btnToggledColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnToggledTextColor\",\"fallback\":_vm.previewTheme.colors.btnToggledText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.btnToggledTextColorLocal),callback:function ($$v) {_vm.btnToggledTextColorLocal=$$v},expression:\"btnToggledTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnToggledText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnToggledPanelTextColor\",\"fallback\":_vm.previewTheme.colors.btnToggledPanelText,\"label\":_vm.$t('settings.style.advanced_colors.panel_header')},model:{value:(_vm.btnToggledPanelTextColorLocal),callback:function ($$v) {_vm.btnToggledPanelTextColorLocal=$$v},expression:\"btnToggledPanelTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnToggledPanelText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnToggledTopBarTextColor\",\"fallback\":_vm.previewTheme.colors.btnToggledTopBarText,\"label\":_vm.$t('settings.style.advanced_colors.top_bar')},model:{value:(_vm.btnToggledTopBarTextColorLocal),callback:function ($$v) {_vm.btnToggledTopBarTextColorLocal=$$v},expression:\"btnToggledTopBarTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnToggledTopBarText}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.tabs')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"tabColor\",\"fallback\":_vm.previewTheme.colors.tab,\"label\":_vm.$t('settings.background')},model:{value:(_vm.tabColorLocal),callback:function ($$v) {_vm.tabColorLocal=$$v},expression:\"tabColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"tabTextColor\",\"fallback\":_vm.previewTheme.colors.tabText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.tabTextColorLocal),callback:function ($$v) {_vm.tabTextColorLocal=$$v},expression:\"tabTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.tabText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"tabActiveTextColor\",\"fallback\":_vm.previewTheme.colors.tabActiveText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.tabActiveTextColorLocal),callback:function ($$v) {_vm.tabActiveTextColorLocal=$$v},expression:\"tabActiveTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.tabActiveText}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.borders')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"borderColor\",\"fallback\":_vm.previewTheme.colors.border,\"label\":_vm.$t('settings.style.common.color')},model:{value:(_vm.borderColorLocal),callback:function ($$v) {_vm.borderColorLocal=$$v},expression:\"borderColorLocal\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"borderOpacity\",\"fallback\":_vm.previewTheme.opacity.border,\"disabled\":_vm.borderColorLocal === 'transparent'},model:{value:(_vm.borderOpacityLocal),callback:function ($$v) {_vm.borderOpacityLocal=$$v},expression:\"borderOpacityLocal\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.faint_text')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"faintColor\",\"fallback\":_vm.previewTheme.colors.faint,\"label\":_vm.$t('settings.text')},model:{value:(_vm.faintColorLocal),callback:function ($$v) {_vm.faintColorLocal=$$v},expression:\"faintColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"faintLinkColor\",\"fallback\":_vm.previewTheme.colors.faintLink,\"label\":_vm.$t('settings.links')},model:{value:(_vm.faintLinkColorLocal),callback:function ($$v) {_vm.faintLinkColorLocal=$$v},expression:\"faintLinkColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"panelFaintColor\",\"fallback\":_vm.previewTheme.colors.panelFaint,\"label\":_vm.$t('settings.style.advanced_colors.panel_header')},model:{value:(_vm.panelFaintColorLocal),callback:function ($$v) {_vm.panelFaintColorLocal=$$v},expression:\"panelFaintColorLocal\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"faintOpacity\",\"fallback\":_vm.previewTheme.opacity.faint},model:{value:(_vm.faintOpacityLocal),callback:function ($$v) {_vm.faintOpacityLocal=$$v},expression:\"faintOpacityLocal\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.underlay')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"underlay\",\"label\":_vm.$t('settings.style.advanced_colors.underlay'),\"fallback\":_vm.previewTheme.colors.underlay},model:{value:(_vm.underlayColorLocal),callback:function ($$v) {_vm.underlayColorLocal=$$v},expression:\"underlayColorLocal\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"underlayOpacity\",\"fallback\":_vm.previewTheme.opacity.underlay,\"disabled\":_vm.underlayOpacityLocal === 'transparent'},model:{value:(_vm.underlayOpacityLocal),callback:function ($$v) {_vm.underlayOpacityLocal=$$v},expression:\"underlayOpacityLocal\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.poll')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"poll\",\"label\":_vm.$t('settings.background'),\"fallback\":_vm.previewTheme.colors.poll},model:{value:(_vm.pollColorLocal),callback:function ($$v) {_vm.pollColorLocal=$$v},expression:\"pollColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"pollText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.pollText},model:{value:(_vm.pollTextColorLocal),callback:function ($$v) {_vm.pollTextColorLocal=$$v},expression:\"pollTextColorLocal\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.icons')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"icon\",\"label\":_vm.$t('settings.style.advanced_colors.icons'),\"fallback\":_vm.previewTheme.colors.icon},model:{value:(_vm.iconColorLocal),callback:function ($$v) {_vm.iconColorLocal=$$v},expression:\"iconColorLocal\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.highlight')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"highlight\",\"label\":_vm.$t('settings.background'),\"fallback\":_vm.previewTheme.colors.highlight},model:{value:(_vm.highlightColorLocal),callback:function ($$v) {_vm.highlightColorLocal=$$v},expression:\"highlightColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"highlightText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.highlightText},model:{value:(_vm.highlightTextColorLocal),callback:function ($$v) {_vm.highlightTextColorLocal=$$v},expression:\"highlightTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.highlightText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"highlightLink\",\"label\":_vm.$t('settings.links'),\"fallback\":_vm.previewTheme.colors.highlightLink},model:{value:(_vm.highlightLinkColorLocal),callback:function ($$v) {_vm.highlightLinkColorLocal=$$v},expression:\"highlightLinkColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.highlightLink}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.popover')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"popover\",\"label\":_vm.$t('settings.background'),\"fallback\":_vm.previewTheme.colors.popover},model:{value:(_vm.popoverColorLocal),callback:function ($$v) {_vm.popoverColorLocal=$$v},expression:\"popoverColorLocal\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"popoverOpacity\",\"fallback\":_vm.previewTheme.opacity.popover,\"disabled\":_vm.popoverOpacityLocal === 'transparent'},model:{value:(_vm.popoverOpacityLocal),callback:function ($$v) {_vm.popoverOpacityLocal=$$v},expression:\"popoverOpacityLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"popoverText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.popoverText},model:{value:(_vm.popoverTextColorLocal),callback:function ($$v) {_vm.popoverTextColorLocal=$$v},expression:\"popoverTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.popoverText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"popoverLink\",\"label\":_vm.$t('settings.links'),\"fallback\":_vm.previewTheme.colors.popoverLink},model:{value:(_vm.popoverLinkColorLocal),callback:function ($$v) {_vm.popoverLinkColorLocal=$$v},expression:\"popoverLinkColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.popoverLink}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.selectedPost')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"selectedPost\",\"label\":_vm.$t('settings.background'),\"fallback\":_vm.previewTheme.colors.selectedPost},model:{value:(_vm.selectedPostColorLocal),callback:function ($$v) {_vm.selectedPostColorLocal=$$v},expression:\"selectedPostColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"selectedPostText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.selectedPostText},model:{value:(_vm.selectedPostTextColorLocal),callback:function ($$v) {_vm.selectedPostTextColorLocal=$$v},expression:\"selectedPostTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.selectedPostText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"selectedPostLink\",\"label\":_vm.$t('settings.links'),\"fallback\":_vm.previewTheme.colors.selectedPostLink},model:{value:(_vm.selectedPostLinkColorLocal),callback:function ($$v) {_vm.selectedPostLinkColorLocal=$$v},expression:\"selectedPostLinkColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.selectedPostLink}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.selectedMenu')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"selectedMenu\",\"label\":_vm.$t('settings.background'),\"fallback\":_vm.previewTheme.colors.selectedMenu},model:{value:(_vm.selectedMenuColorLocal),callback:function ($$v) {_vm.selectedMenuColorLocal=$$v},expression:\"selectedMenuColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"selectedMenuText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.selectedMenuText},model:{value:(_vm.selectedMenuTextColorLocal),callback:function ($$v) {_vm.selectedMenuTextColorLocal=$$v},expression:\"selectedMenuTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.selectedMenuText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"selectedMenuLink\",\"label\":_vm.$t('settings.links'),\"fallback\":_vm.previewTheme.colors.selectedMenuLink},model:{value:(_vm.selectedMenuLinkColorLocal),callback:function ($$v) {_vm.selectedMenuLinkColorLocal=$$v},expression:\"selectedMenuLinkColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.selectedMenuLink}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('chats.chats')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatBgColor\",\"fallback\":_vm.previewTheme.colors.bg,\"label\":_vm.$t('settings.background')},model:{value:(_vm.chatBgColorLocal),callback:function ($$v) {_vm.chatBgColorLocal=$$v},expression:\"chatBgColorLocal\"}}),_vm._v(\" \"),_c('h5',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.chat.incoming')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatMessageIncomingBgColor\",\"fallback\":_vm.previewTheme.colors.bg,\"label\":_vm.$t('settings.background')},model:{value:(_vm.chatMessageIncomingBgColorLocal),callback:function ($$v) {_vm.chatMessageIncomingBgColorLocal=$$v},expression:\"chatMessageIncomingBgColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatMessageIncomingTextColor\",\"fallback\":_vm.previewTheme.colors.text,\"label\":_vm.$t('settings.text')},model:{value:(_vm.chatMessageIncomingTextColorLocal),callback:function ($$v) {_vm.chatMessageIncomingTextColorLocal=$$v},expression:\"chatMessageIncomingTextColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatMessageIncomingLinkColor\",\"fallback\":_vm.previewTheme.colors.link,\"label\":_vm.$t('settings.links')},model:{value:(_vm.chatMessageIncomingLinkColorLocal),callback:function ($$v) {_vm.chatMessageIncomingLinkColorLocal=$$v},expression:\"chatMessageIncomingLinkColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatMessageIncomingBorderLinkColor\",\"fallback\":_vm.previewTheme.colors.fg,\"label\":_vm.$t('settings.style.advanced_colors.chat.border')},model:{value:(_vm.chatMessageIncomingBorderColorLocal),callback:function ($$v) {_vm.chatMessageIncomingBorderColorLocal=$$v},expression:\"chatMessageIncomingBorderColorLocal\"}}),_vm._v(\" \"),_c('h5',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.chat.outgoing')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatMessageOutgoingBgColor\",\"fallback\":_vm.previewTheme.colors.bg,\"label\":_vm.$t('settings.background')},model:{value:(_vm.chatMessageOutgoingBgColorLocal),callback:function ($$v) {_vm.chatMessageOutgoingBgColorLocal=$$v},expression:\"chatMessageOutgoingBgColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatMessageOutgoingTextColor\",\"fallback\":_vm.previewTheme.colors.text,\"label\":_vm.$t('settings.text')},model:{value:(_vm.chatMessageOutgoingTextColorLocal),callback:function ($$v) {_vm.chatMessageOutgoingTextColorLocal=$$v},expression:\"chatMessageOutgoingTextColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatMessageOutgoingLinkColor\",\"fallback\":_vm.previewTheme.colors.link,\"label\":_vm.$t('settings.links')},model:{value:(_vm.chatMessageOutgoingLinkColorLocal),callback:function ($$v) {_vm.chatMessageOutgoingLinkColorLocal=$$v},expression:\"chatMessageOutgoingLinkColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatMessageOutgoingBorderLinkColor\",\"fallback\":_vm.previewTheme.colors.bg,\"label\":_vm.$t('settings.style.advanced_colors.chat.border')},model:{value:(_vm.chatMessageOutgoingBorderColorLocal),callback:function ($$v) {_vm.chatMessageOutgoingBorderColorLocal=$$v},expression:\"chatMessageOutgoingBorderColorLocal\"}})],1)]),_vm._v(\" \"),_c('div',{staticClass:\"radius-container\",attrs:{\"label\":_vm.$t('settings.style.radii._tab_label')}},[_c('div',{staticClass:\"tab-header\"},[_c('p',[_vm._v(_vm._s(_vm.$t('settings.radii_help')))]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.clearRoundness}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.clear_all'))+\"\\n \")])]),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"btnRadius\",\"label\":_vm.$t('settings.btnRadius'),\"fallback\":_vm.previewTheme.radii.btn,\"max\":\"16\",\"hard-min\":\"0\"},model:{value:(_vm.btnRadiusLocal),callback:function ($$v) {_vm.btnRadiusLocal=$$v},expression:\"btnRadiusLocal\"}}),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"inputRadius\",\"label\":_vm.$t('settings.inputRadius'),\"fallback\":_vm.previewTheme.radii.input,\"max\":\"9\",\"hard-min\":\"0\"},model:{value:(_vm.inputRadiusLocal),callback:function ($$v) {_vm.inputRadiusLocal=$$v},expression:\"inputRadiusLocal\"}}),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"checkboxRadius\",\"label\":_vm.$t('settings.checkboxRadius'),\"fallback\":_vm.previewTheme.radii.checkbox,\"max\":\"16\",\"hard-min\":\"0\"},model:{value:(_vm.checkboxRadiusLocal),callback:function ($$v) {_vm.checkboxRadiusLocal=$$v},expression:\"checkboxRadiusLocal\"}}),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"panelRadius\",\"label\":_vm.$t('settings.panelRadius'),\"fallback\":_vm.previewTheme.radii.panel,\"max\":\"50\",\"hard-min\":\"0\"},model:{value:(_vm.panelRadiusLocal),callback:function ($$v) {_vm.panelRadiusLocal=$$v},expression:\"panelRadiusLocal\"}}),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"avatarRadius\",\"label\":_vm.$t('settings.avatarRadius'),\"fallback\":_vm.previewTheme.radii.avatar,\"max\":\"28\",\"hard-min\":\"0\"},model:{value:(_vm.avatarRadiusLocal),callback:function ($$v) {_vm.avatarRadiusLocal=$$v},expression:\"avatarRadiusLocal\"}}),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"avatarAltRadius\",\"label\":_vm.$t('settings.avatarAltRadius'),\"fallback\":_vm.previewTheme.radii.avatarAlt,\"max\":\"28\",\"hard-min\":\"0\"},model:{value:(_vm.avatarAltRadiusLocal),callback:function ($$v) {_vm.avatarAltRadiusLocal=$$v},expression:\"avatarAltRadiusLocal\"}}),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"attachmentRadius\",\"label\":_vm.$t('settings.attachmentRadius'),\"fallback\":_vm.previewTheme.radii.attachment,\"max\":\"50\",\"hard-min\":\"0\"},model:{value:(_vm.attachmentRadiusLocal),callback:function ($$v) {_vm.attachmentRadiusLocal=$$v},expression:\"attachmentRadiusLocal\"}}),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"tooltipRadius\",\"label\":_vm.$t('settings.tooltipRadius'),\"fallback\":_vm.previewTheme.radii.tooltip,\"max\":\"50\",\"hard-min\":\"0\"},model:{value:(_vm.tooltipRadiusLocal),callback:function ($$v) {_vm.tooltipRadiusLocal=$$v},expression:\"tooltipRadiusLocal\"}}),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"chatMessageRadius\",\"label\":_vm.$t('settings.chatMessageRadius'),\"fallback\":_vm.previewTheme.radii.chatMessage || 2,\"max\":\"50\",\"hard-min\":\"0\"},model:{value:(_vm.chatMessageRadiusLocal),callback:function ($$v) {_vm.chatMessageRadiusLocal=$$v},expression:\"chatMessageRadiusLocal\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"shadow-container\",attrs:{\"label\":_vm.$t('settings.style.shadows._tab_label')}},[_c('div',{staticClass:\"tab-header shadow-selector\"},[_c('div',{staticClass:\"select-container\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.shadows.component'))+\"\\n \"),_c('label',{staticClass:\"select\",attrs:{\"for\":\"shadow-switcher\"}},[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.shadowSelected),expression:\"shadowSelected\"}],staticClass:\"shadow-switcher\",attrs:{\"id\":\"shadow-switcher\"},on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.shadowSelected=$event.target.multiple ? $$selectedVal : $$selectedVal[0]}}},_vm._l((_vm.shadowsAvailable),function(shadow){return _c('option',{key:shadow,domProps:{\"value\":shadow}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.shadows.components.' + shadow))+\"\\n \")])}),0),_vm._v(\" \"),_c('i',{staticClass:\"icon-down-open\"})])]),_vm._v(\" \"),_c('div',{staticClass:\"override\"},[_c('label',{staticClass:\"label\",attrs:{\"for\":\"override\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.shadows.override'))+\"\\n \")]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.currentShadowOverriden),expression:\"currentShadowOverriden\"}],staticClass:\"input-override\",attrs:{\"id\":\"override\",\"name\":\"override\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.currentShadowOverriden)?_vm._i(_vm.currentShadowOverriden,null)>-1:(_vm.currentShadowOverriden)},on:{\"change\":function($event){var $$a=_vm.currentShadowOverriden,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.currentShadowOverriden=$$a.concat([$$v]))}else{$$i>-1&&(_vm.currentShadowOverriden=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.currentShadowOverriden=$$c}}}}),_vm._v(\" \"),_c('label',{staticClass:\"checkbox-label\",attrs:{\"for\":\"override\"}})]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.clearShadows}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.clear_all'))+\"\\n \")])]),_vm._v(\" \"),_c('ShadowControl',{attrs:{\"ready\":!!_vm.currentShadowFallback,\"fallback\":_vm.currentShadowFallback},model:{value:(_vm.currentShadow),callback:function ($$v) {_vm.currentShadow=$$v},expression:\"currentShadow\"}}),_vm._v(\" \"),(_vm.shadowSelected === 'avatar' || _vm.shadowSelected === 'avatarStatus')?_c('div',[_c('i18n',{attrs:{\"path\":\"settings.style.shadows.filter_hint.always_drop_shadow\",\"tag\":\"p\"}},[_c('code',[_vm._v(\"filter: drop-shadow()\")])]),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('settings.style.shadows.filter_hint.avatar_inset')))]),_vm._v(\" \"),_c('i18n',{attrs:{\"path\":\"settings.style.shadows.filter_hint.drop_shadow_syntax\",\"tag\":\"p\"}},[_c('code',[_vm._v(\"drop-shadow\")]),_vm._v(\" \"),_c('code',[_vm._v(\"spread-radius\")]),_vm._v(\" \"),_c('code',[_vm._v(\"inset\")])]),_vm._v(\" \"),_c('i18n',{attrs:{\"path\":\"settings.style.shadows.filter_hint.inset_classic\",\"tag\":\"p\"}},[_c('code',[_vm._v(\"box-shadow\")])]),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('settings.style.shadows.filter_hint.spread_zero')))])],1):_vm._e()],1),_vm._v(\" \"),_c('div',{staticClass:\"fonts-container\",attrs:{\"label\":_vm.$t('settings.style.fonts._tab_label')}},[_c('div',{staticClass:\"tab-header\"},[_c('p',[_vm._v(_vm._s(_vm.$t('settings.style.fonts.help')))]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.clearFonts}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.clear_all'))+\"\\n \")])]),_vm._v(\" \"),_c('FontControl',{attrs:{\"name\":\"ui\",\"label\":_vm.$t('settings.style.fonts.components.interface'),\"fallback\":_vm.previewTheme.fonts.interface,\"no-inherit\":\"1\"},model:{value:(_vm.fontsLocal.interface),callback:function ($$v) {_vm.$set(_vm.fontsLocal, \"interface\", $$v)},expression:\"fontsLocal.interface\"}}),_vm._v(\" \"),_c('FontControl',{attrs:{\"name\":\"input\",\"label\":_vm.$t('settings.style.fonts.components.input'),\"fallback\":_vm.previewTheme.fonts.input},model:{value:(_vm.fontsLocal.input),callback:function ($$v) {_vm.$set(_vm.fontsLocal, \"input\", $$v)},expression:\"fontsLocal.input\"}}),_vm._v(\" \"),_c('FontControl',{attrs:{\"name\":\"post\",\"label\":_vm.$t('settings.style.fonts.components.post'),\"fallback\":_vm.previewTheme.fonts.post},model:{value:(_vm.fontsLocal.post),callback:function ($$v) {_vm.$set(_vm.fontsLocal, \"post\", $$v)},expression:\"fontsLocal.post\"}}),_vm._v(\" \"),_c('FontControl',{attrs:{\"name\":\"postCode\",\"label\":_vm.$t('settings.style.fonts.components.postCode'),\"fallback\":_vm.previewTheme.fonts.postCode},model:{value:(_vm.fontsLocal.postCode),callback:function ($$v) {_vm.$set(_vm.fontsLocal, \"postCode\", $$v)},expression:\"fontsLocal.postCode\"}})],1)])],1),_vm._v(\" \"),_c('div',{staticClass:\"apply-container\"},[_c('button',{staticClass:\"btn submit\",attrs:{\"disabled\":!_vm.themeValid},on:{\"click\":_vm.setCustomTheme}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('general.apply'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.clearAll}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.reset'))+\"\\n \")])])],1)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import TabSwitcher from 'src/components/tab_switcher/tab_switcher.js'\n\nimport DataImportExportTab from './tabs/data_import_export_tab.vue'\nimport MutesAndBlocksTab from './tabs/mutes_and_blocks_tab.vue'\nimport NotificationsTab from './tabs/notifications_tab.vue'\nimport FilteringTab from './tabs/filtering_tab.vue'\nimport SecurityTab from './tabs/security_tab/security_tab.vue'\nimport ProfileTab from './tabs/profile_tab.vue'\nimport GeneralTab from './tabs/general_tab.vue'\nimport VersionTab from './tabs/version_tab.vue'\nimport ThemeTab from './tabs/theme_tab/theme_tab.vue'\n\nconst SettingsModalContent = {\n components: {\n TabSwitcher,\n\n DataImportExportTab,\n MutesAndBlocksTab,\n NotificationsTab,\n FilteringTab,\n SecurityTab,\n ProfileTab,\n GeneralTab,\n VersionTab,\n ThemeTab\n },\n computed: {\n isLoggedIn () {\n return !!this.$store.state.users.currentUser\n },\n open () {\n return this.$store.state.interface.settingsModalState !== 'hidden'\n }\n },\n methods: {\n onOpen () {\n const targetTab = this.$store.state.interface.settingsModalTargetTab\n // We're being told to open in specific tab\n if (targetTab) {\n const tabIndex = this.$refs.tabSwitcher.$slots.default.findIndex(elm => {\n return elm.data && elm.data.attrs['data-tab-name'] === targetTab\n })\n if (tabIndex >= 0) {\n this.$refs.tabSwitcher.setTab(tabIndex)\n }\n }\n // Clear the state of target tab, so that next time settings is opened\n // it doesn't force it.\n this.$store.dispatch('clearSettingsModalTargetTab')\n }\n },\n mounted () {\n this.onOpen()\n },\n watch: {\n open: function (value) {\n if (value) this.onOpen()\n }\n }\n}\n\nexport default SettingsModalContent\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!./settings_modal_content.scss\")\n}\n/* script */\nexport * from \"!!babel-loader!./settings_modal_content.js\"\nimport __vue_script__ from \"!!babel-loader!./settings_modal_content.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-da72a86e\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./settings_modal_content.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('tab-switcher',{ref:\"tabSwitcher\",staticClass:\"settings_tab-switcher\",attrs:{\"side-tab-bar\":true,\"scrollable-tabs\":true}},[_c('div',{attrs:{\"label\":_vm.$t('settings.general'),\"icon\":\"wrench\",\"data-tab-name\":\"general\"}},[_c('GeneralTab')],1),_vm._v(\" \"),(_vm.isLoggedIn)?_c('div',{attrs:{\"label\":_vm.$t('settings.profile_tab'),\"icon\":\"user\",\"data-tab-name\":\"profile\"}},[_c('ProfileTab')],1):_vm._e(),_vm._v(\" \"),(_vm.isLoggedIn)?_c('div',{attrs:{\"label\":_vm.$t('settings.security_tab'),\"icon\":\"lock\",\"data-tab-name\":\"security\"}},[_c('SecurityTab')],1):_vm._e(),_vm._v(\" \"),_c('div',{attrs:{\"label\":_vm.$t('settings.filtering'),\"icon\":\"filter\",\"data-tab-name\":\"filtering\"}},[_c('FilteringTab')],1),_vm._v(\" \"),_c('div',{attrs:{\"label\":_vm.$t('settings.theme'),\"icon\":\"brush\",\"data-tab-name\":\"theme\"}},[_c('ThemeTab')],1),_vm._v(\" \"),(_vm.isLoggedIn)?_c('div',{attrs:{\"label\":_vm.$t('settings.notifications'),\"icon\":\"bell-ringing-o\",\"data-tab-name\":\"notifications\"}},[_c('NotificationsTab')],1):_vm._e(),_vm._v(\" \"),(_vm.isLoggedIn)?_c('div',{attrs:{\"label\":_vm.$t('settings.data_import_export_tab'),\"icon\":\"download\",\"data-tab-name\":\"dataImportExport\"}},[_c('DataImportExportTab')],1):_vm._e(),_vm._v(\" \"),(_vm.isLoggedIn)?_c('div',{attrs:{\"label\":_vm.$t('settings.mutes_and_blocks'),\"fullHeight\":true,\"icon\":\"eye-off\",\"data-tab-name\":\"mutesAndBlocks\"}},[_c('MutesAndBlocksTab')],1):_vm._e(),_vm._v(\" \"),_c('div',{attrs:{\"label\":_vm.$t('settings.version.title'),\"icon\":\"info-circled\",\"data-tab-name\":\"version\"}},[_c('VersionTab')],1)])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/static/js/app.55d173dc5e39519aa518.js b/priv/static/static/js/app.55d173dc5e39519aa518.js deleted file mode 100644 index d04ae3499..000000000 --- a/priv/static/static/js/app.55d173dc5e39519aa518.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(t){function e(e){for(var i,o,a=e[0],c=e[1],l=e[2],u=0,p=[];u]*>/g,"")),value:unescape(t.value.replace(/<[^>]*>/g,""))}}),e.profile_image_url=t.avatar,e.profile_image_url_original=t.avatar,e.cover_photo=t.header,e.friends_count=t.following_count,e.bot=t.bot,t.pleroma){var o=t.pleroma.relationship;e.background_image=t.pleroma.background_image,e.favicon=t.pleroma.favicon,e.token=t.pleroma.chat_token,o&&(e.relationship=o),e.allow_following_move=t.pleroma.allow_following_move,e.hide_follows=t.pleroma.hide_follows,e.hide_followers=t.pleroma.hide_followers,e.hide_follows_count=t.pleroma.hide_follows_count,e.hide_followers_count=t.pleroma.hide_followers_count,e.rights={moderator:t.pleroma.is_moderator,admin:t.pleroma.is_admin},e.rights.admin?e.role="admin":e.rights.moderator?e.role="moderator":e.role="member"}t.source&&(e.description=t.source.note,e.default_scope=t.source.privacy,e.fields=t.source.fields,t.source.pleroma&&(e.no_rich_text=t.source.pleroma.no_rich_text,e.show_role=t.source.pleroma.show_role,e.discoverable=t.source.pleroma.discoverable)),e.is_local=!e.screen_name.includes("@")}else e.screen_name=t.screen_name,e.name=t.name,e.name_html=t.name_html,e.description=t.description,e.description_html=t.description_html,e.profile_image_url=t.profile_image_url,e.profile_image_url_original=t.profile_image_url_original,e.cover_photo=t.cover_photo,e.friends_count=t.friends_count,e.statusnet_profile_url=t.statusnet_profile_url,e.is_local=t.is_local,e.role=t.role,e.show_role=t.show_role,t.rights&&(e.rights={moderator:t.rights.delete_others_notice,admin:t.rights.admin}),e.no_rich_text=t.no_rich_text,e.default_scope=t.default_scope,e.hide_follows=t.hide_follows,e.hide_followers=t.hide_followers,e.hide_follows_count=t.hide_follows_count,e.hide_followers_count=t.hide_followers_count,e.background_image=t.background_image,e.token=t.token,e.relationship={muting:t.muted,blocking:t.statusnet_blocking,followed_by:t.follows_you,following:t.following};return e.created_at=new Date(t.created_at),e.locked=t.locked,e.followers_count=t.followers_count,e.statuses_count=t.statuses_count,e.friendIds=[],e.followerIds=[],e.pinnedStatusIds=[],t.pleroma&&(e.follow_request_count=t.pleroma.follow_request_count,e.tags=t.pleroma.tags,e.deactivated=t.pleroma.deactivated,e.notification_settings=t.pleroma.notification_settings,e.unread_chat_count=t.pleroma.unread_chat_count),e.tags=e.tags||[],e.rights=e.rights||{},e.notification_settings=e.notification_settings||{},e},p=function(t){var e={};return!t.hasOwnProperty("oembed")?(e.mimetype=t.pleroma?t.pleroma.mime_type:t.type,e.meta=t.meta,e.id=t.id):e.mimetype=t.mimetype,e.url=t.url,e.large_thumb_url=t.preview_url,e.description=t.description,e},f=function(t,e){var n=/[|\\{}()[\]^$+*?.-]/g;return e.reduce(function(t,e){var i=e.shortcode.replace(n,"\\$&");return t.replace(new RegExp(":".concat(i,":"),"g"),":").concat(e.shortcode,":"))},t)},h=function t(e){var n,i={},r=e.hasOwnProperty("account");if(r){if(i.favorited=e.favourited,i.fave_num=e.favourites_count,i.repeated=e.reblogged,i.repeat_num=e.reblogs_count,i.bookmarked=e.bookmarked,i.type=e.reblog?"retweet":"status",i.nsfw=e.sensitive,i.statusnet_html=f(e.content,e.emojis),i.tags=e.tags,e.pleroma){var a=e.pleroma;i.text=a.content?e.pleroma.content["text/plain"]:e.content,i.summary=a.spoiler_text?e.pleroma.spoiler_text["text/plain"]:e.spoiler_text,i.statusnet_conversation_id=e.pleroma.conversation_id,i.is_local=a.local,i.in_reply_to_screen_name=e.pleroma.in_reply_to_account_acct,i.thread_muted=a.thread_muted,i.emoji_reactions=a.emoji_reactions,i.parent_visible=void 0===a.parent_visible||a.parent_visible}else i.text=e.content,i.summary=e.spoiler_text;i.in_reply_to_status_id=e.in_reply_to_id,i.in_reply_to_user_id=e.in_reply_to_account_id,i.replies_count=e.replies_count,"retweet"===i.type&&(i.retweeted_status=t(e.reblog)),i.summary_html=f(s()(e.spoiler_text),e.emojis),i.external_url=e.url,i.poll=e.poll,i.poll&&(i.poll.options=(i.poll.options||[]).map(function(t){return function(t){for(var e=1;e1&&void 0!==arguments[1]?arguments[1]:{}).flakeId,n=c()(t);if(n){var i=n.next.max_id,o=n.prev.min_id;return{maxId:e?i:parseInt(i,10),minId:e?o:parseInt(o,10)}}},b=function(t){var e={};return e.id=t.id,e.account=d(t.account),e.unread=t.unread,e.lastMessage=w(t.last_message),e.updated_at=new Date(t.updated_at),e},w=function(t){if(t){if(t.isNormalized)return t;var e=t;return e.id=t.id,e.created_at=new Date(t.created_at),e.chat_id=t.chat_id,t.content?e.content=f(t.content,t.emojis):e.content="",t.attachment?e.attachments=[p(t.attachment)]:e.attachments=[],e.isNormalized=!0,e}}},function(t,e,n){"use strict";n.d(e,"i",function(){return d}),n.d(e,"h",function(){return f}),n.d(e,"c",function(){return m}),n.d(e,"a",function(){return g}),n.d(e,"b",function(){return v}),n.d(e,"f",function(){return b}),n.d(e,"g",function(){return w}),n.d(e,"j",function(){return _}),n.d(e,"e",function(){return x}),n.d(e,"d",function(){return y});var i=n(1),o=n.n(i),r=n(7),s=n.n(r),a=n(27),c=n.n(a),l=n(14);function u(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}var d=function(t,e,n){if(null!=t){if("#"===t[0]||"transparent"===t)return t;if("object"===c()(t)){var i=t;t=i.r,e=i.g,n=i.b}var o=[t,e,n].map(function(t){return t=(t=(t=Math.ceil(t))<0?0:t)>255?255:t}),r=s()(o,3);return t=r[0],e=r[1],n=r[2],"#".concat(((1<<24)+(t<<16)+(e<<8)+n).toString(16).slice(1))}},p=function(t){return"rgb".split("").reduce(function(e,n){return e[n]=function(t){var e=t/255;return e<.03928?e/12.92:Math.pow((e+.055)/1.055,2.4)}(t[n]),e},{})},f=function(t){var e=p(t);return.2126*e.r+.7152*e.g+.0722*e.b},h=function(t,e){var n=f(t),i=f(e),o=n>i?[n,i]:[i,n],r=s()(o,2);return(r[0]+.05)/(r[1]+.05)},m=function(t,e,n){return h(v(n,e),t)},g=function(t,e,n){return 1===e||void 0===e?t:"rgb".split("").reduce(function(i,o){return i[o]=t[o]*e+n[o]*(1-e),i},{})},v=function(t,e){return e.reduce(function(t,e){var n=s()(e,2),i=n[0],o=n[1];return g(i,o,t)},t)},b=function(t){var e=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);return e?{r:parseInt(e[1],16),g:parseInt(e[2],16),b:parseInt(e[3],16)}:null},w=function(t,e){return"rgb".split("").reduce(function(n,i){return n[i]=(t[i]+e[i])/2,n},{})},_=function(t){return"rgba(".concat(Math.floor(t.r),", ").concat(Math.floor(t.g),", ").concat(Math.floor(t.b),", ").concat(t.a,")")},x=function(t,e,n){if(h(t,e)<4.5){var i=void 0!==e.a?{a:e.a}:{},o=Object.assign(i,Object(l.invertLightness)(e).rgb);return!n&&h(t,o)<4.5?Object(l.contrastRatio)(t,e).rgb:o}return e},y=function(t,e){var n={};if("object"===c()(t))n=t;else if("string"==typeof t){if(!t.startsWith("#"))return t;n=b(t)}return _(function(t){for(var e=1;e2&&void 0!==arguments[2]?arguments[2]:function(t){return t};t.addEventListener(e,function(t){s.dispatchEvent(new CustomEvent(e,{detail:n(t)}))})};return a.addEventListener("open",function(t){console.debug("[WS][".concat(r,"] Socket connected"),t)}),a.addEventListener("error",function(t){console.debug("[WS][".concat(r,"] Socket errored"),t)}),a.addEventListener("close",function(t){console.debug("[WS][".concat(r,"] Socket disconnected with code ").concat(t.code),t)}),c(a,"open"),c(a,"close"),c(a,"message",i),c(a,"error"),s.close=function(){a.close(1e3,"Shutting down socket")},s},St=function(t){var e=t.data;if(e){var n=JSON.parse(e),i=n.event,o=n.payload;if(!yt.has(i)&&!kt.has(i))return console.warn("Unknown event",t),null;if("delete"===i)return{event:i,id:o};var r=o?JSON.parse(o):null;return"update"===i?{event:i,status:Object(x.f)(r)}:"notification"===i?{event:i,notification:Object(x.e)(r)}:"pleroma:chat_update"===i?{event:i,chatUpdate:Object(x.b)(r)}:void 0}},jt=Object.freeze({JOINED:1,CLOSED:2,ERROR:3}),Ot={verifyCredentials:function(t){return vt("/api/v1/accounts/verify_credentials",{headers:wt(t)}).then(function(t){return t.ok?t.json():{error:t}}).then(function(t){return t.error?t:Object(x.g)(t)})},fetchTimeline:function(t){var e=t.timeline,n=t.credentials,i=t.since,o=void 0!==i&&i,r=t.until,s=void 0!==r&&r,a=t.userId,c=void 0!==a&&a,l=t.tag,u=void 0!==l&&l,d=t.withMuted,p=void 0!==d&&d,f=t.replyVisibility,h=void 0===f?"all":f,m="notifications"===e,g=[],v={public:"/api/v1/timelines/public",friends:"/api/v1/timelines/home",dms:"/api/v1/timelines/direct",notifications:"/api/v1/notifications",publicAndExternal:"/api/v1/timelines/public",user:J,media:J,favorites:"/api/v1/favourites",tag:X,bookmarks:"/api/v1/bookmarks"}[e];"user"!==e&&"media"!==e||(v=v(c)),o&&g.push(["since_id",o]),s&&g.push(["max_id",s]),u&&(v=v(u)),"media"===e&&g.push(["only_media",1]),"public"===e&&g.push(["local",!0]),"public"!==e&&"publicAndExternal"!==e||g.push(["only_media",!1]),"favorites"!==e&&"bookmarks"!==e&&g.push(["with_muted",p]),"all"!==h&&g.push(["reply_visibility",h]),g.push(["limit",20]);var w=b()(g,function(t){return"".concat(t[0],"=").concat(t[1])}).join("&");v+="?".concat(w);var _="",y="",k={};return vt(v,{headers:wt(n)}).then(function(t){return _=t.status,y=t.statusText,k=Object(x.d)(t.headers.get("Link"),{flakeId:"bookmarks"!==e&&"notifications"!==e}),t}).then(function(t){return t.json()}).then(function(t){return t.error?(t.status=_,t.statusText=y,t):{data:t.map(m?x.e:x.f),pagination:k}})},fetchPinnedStatuses:function(t){var e=t.id,n=t.credentials,i=J(e)+"?pinned=true";return bt({url:i,credentials:n}).then(function(t){return t.map(x.f)})},fetchConversation:function(t){var e=t.id,n=t.credentials,i=function(t){return"/api/v1/statuses/".concat(t,"/context")}(e);return vt(i,{headers:wt(n)}).then(function(t){if(t.ok)return t;throw new Error("Error fetching timeline",t)}).then(function(t){return t.json()}).then(function(t){var e=t.ancestors,n=t.descendants;return{ancestors:e.map(x.f),descendants:n.map(x.f)}})},fetchStatus:function(t){var e=t.id,n=t.credentials,i=function(t){return"/api/v1/statuses/".concat(t)}(e);return vt(i,{headers:wt(n)}).then(function(t){if(t.ok)return t;throw new Error("Error fetching timeline",t)}).then(function(t){return t.json()}).then(function(t){return Object(x.f)(t)})},fetchFriends:_t,exportFriends:function(t){var e=t.id,n=t.credentials;return new Promise(function(t,i){var r,s,a,c;return o.a.async(function(l){for(;;)switch(l.prev=l.next){case 0:l.prev=0,r=[],s=!0;case 3:if(!s){l.next=12;break}return a=r.length>0?h()(r).id:void 0,l.next=7,o.a.awrap(_t({id:e,maxId:a,credentials:n}));case 7:c=l.sent,r=g()(r,c),0===c.length&&(s=!1),l.next=3;break;case 12:t(r),l.next=18;break;case 15:l.prev=15,l.t0=l.catch(0),i(l.t0);case 18:case"end":return l.stop()}},null,null,[[0,15]])})},fetchFollowers:function(t){var e=t.id,n=t.maxId,i=t.sinceId,o=t.limit,r=void 0===o?20:o,s=t.credentials,a=function(t){return"/api/v1/accounts/".concat(t,"/followers")}(e),c=[n&&"max_id=".concat(n),i&&"since_id=".concat(i),r&&"limit=".concat(r),"with_relationships=true"].filter(function(t){return t}).join("&");return vt(a+=c?"?"+c:"",{headers:wt(s)}).then(function(t){return t.json()}).then(function(t){return t.map(x.g)})},followUser:function(t){var e=t.id,n=t.credentials,i=s()(t,["id","credentials"]),o=function(t){return"/api/v1/accounts/".concat(t,"/follow")}(e),r={};return void 0!==i.reblogs&&(r.reblogs=i.reblogs),vt(o,{body:JSON.stringify(r),headers:H({},wt(n),{"Content-Type":"application/json"}),method:"POST"}).then(function(t){return t.json()})},unfollowUser:function(t){var e=t.id,n=t.credentials,i=function(t){return"/api/v1/accounts/".concat(t,"/unfollow")}(e);return vt(i,{headers:wt(n),method:"POST"}).then(function(t){return t.json()})},pinOwnStatus:function(t){var e=t.id,n=t.credentials;return bt({url:st(e),credentials:n,method:"POST"}).then(function(t){return Object(x.f)(t)})},unpinOwnStatus:function(t){var e=t.id,n=t.credentials;return bt({url:at(e),credentials:n,method:"POST"}).then(function(t){return Object(x.f)(t)})},muteConversation:function(t){var e=t.id,n=t.credentials;return bt({url:ct(e),credentials:n,method:"POST"}).then(function(t){return Object(x.f)(t)})},unmuteConversation:function(t){var e=t.id,n=t.credentials;return bt({url:lt(e),credentials:n,method:"POST"}).then(function(t){return Object(x.f)(t)})},blockUser:function(t){var e=t.id,n=t.credentials;return vt(function(t){return"/api/v1/accounts/".concat(t,"/block")}(e),{headers:wt(n),method:"POST"}).then(function(t){return t.json()})},unblockUser:function(t){var e=t.id,n=t.credentials;return vt(function(t){return"/api/v1/accounts/".concat(t,"/unblock")}(e),{headers:wt(n),method:"POST"}).then(function(t){return t.json()})},fetchUser:function(t){var e=t.id,n=t.credentials,i="".concat("/api/v1/accounts","/").concat(e);return bt({url:i,credentials:n}).then(function(t){return Object(x.g)(t)})},fetchUserRelationship:function(t){var e=t.id,n=t.credentials,i="".concat("/api/v1/accounts/relationships","/?id=").concat(e);return vt(i,{headers:wt(n)}).then(function(t){return new Promise(function(e,n){return t.json().then(function(o){return t.ok?e(o):n(new A(t.status,o,{url:i},t))})})})},favorite:function(t){var e=t.id,n=t.credentials;return bt({url:V(e),method:"POST",credentials:n}).then(function(t){return Object(x.f)(t)})},unfavorite:function(t){var e=t.id,n=t.credentials;return bt({url:G(e),method:"POST",credentials:n}).then(function(t){return Object(x.f)(t)})},retweet:function(t){var e=t.id,n=t.credentials;return bt({url:K(e),method:"POST",credentials:n}).then(function(t){return Object(x.f)(t)})},unretweet:function(t){var e=t.id,n=t.credentials;return bt({url:Y(e),method:"POST",credentials:n}).then(function(t){return Object(x.f)(t)})},bookmarkStatus:function(t){var e=t.id,n=t.credentials;return bt({url:nt(e),headers:wt(n),method:"POST"})},unbookmarkStatus:function(t){var e=t.id,n=t.credentials;return bt({url:it(e),headers:wt(n),method:"POST"})},postStatus:function(t){var e=t.credentials,n=t.status,i=t.spoilerText,o=t.visibility,r=t.sensitive,s=t.poll,a=t.mediaIds,c=void 0===a?[]:a,l=t.inReplyToStatusId,u=t.contentType,d=t.preview,p=t.idempotencyKey,f=new FormData,h=s.options||[];if(f.append("status",n),f.append("source","Pleroma FE"),i&&f.append("spoiler_text",i),o&&f.append("visibility",o),r&&f.append("sensitive",r),u&&f.append("content_type",u),c.forEach(function(t){f.append("media_ids[]",t)}),h.some(function(t){return""!==t})){var m={expires_in:s.expiresIn,multiple:s.multiple};Object.keys(m).forEach(function(t){f.append("poll[".concat(t,"]"),m[t])}),h.forEach(function(t){f.append("poll[options][]",t)})}l&&f.append("in_reply_to_id",l),d&&f.append("preview","true");var g=wt(e);return p&&(g["idempotency-key"]=p),vt("/api/v1/statuses",{body:f,method:"POST",headers:g}).then(function(t){return t.json()}).then(function(t){return t.error?t:Object(x.f)(t)})},deleteStatus:function(t){var e=t.id,n=t.credentials;return vt(function(t){return"/api/v1/statuses/".concat(t)}(e),{headers:wt(n),method:"DELETE"})},uploadMedia:function(t){var e=t.formData,n=t.credentials;return vt("/api/v1/media",{body:e,method:"POST",headers:wt(n)}).then(function(t){return t.json()}).then(function(t){return Object(x.a)(t)})},setMediaDescription:function(t){var e=t.id,n=t.description,i=t.credentials;return bt({url:"".concat("/api/v1/media","/").concat(e),method:"PUT",headers:wt(i),payload:{description:n}}).then(function(t){return Object(x.a)(t)})},fetchMutes:function(t){var e=t.credentials;return bt({url:"/api/v1/mutes/",credentials:e}).then(function(t){return t.map(x.g)})},muteUser:function(t){var e=t.id,n=t.credentials;return bt({url:Q(e),credentials:n,method:"POST"})},unmuteUser:function(t){var e=t.id,n=t.credentials;return bt({url:Z(e),credentials:n,method:"POST"})},subscribeUser:function(t){var e=t.id,n=t.credentials;return bt({url:tt(e),credentials:n,method:"POST"})},unsubscribeUser:function(t){var e=t.id,n=t.credentials;return bt({url:et(e),credentials:n,method:"POST"})},fetchBlocks:function(t){var e=t.credentials;return bt({url:"/api/v1/blocks/",credentials:e}).then(function(t){return t.map(x.g)})},fetchOAuthTokens:function(t){var e=t.credentials;return vt("/api/oauth_tokens.json",{headers:wt(e)}).then(function(t){if(t.ok)return t.json();throw new Error("Error fetching auth tokens",t)})},revokeOAuthToken:function(t){var e=t.id,n=t.credentials,i="/api/oauth_tokens/".concat(e);return vt(i,{headers:wt(n),method:"DELETE"})},tagUser:function(t){var e=t.tag,n=t.credentials,i={nicknames:[t.user.screen_name],tags:[e]},o=wt(n);return o["Content-Type"]="application/json",vt("/api/pleroma/admin/users/tag",{method:"PUT",headers:o,body:JSON.stringify(i)})},untagUser:function(t){var e=t.tag,n=t.credentials,i={nicknames:[t.user.screen_name],tags:[e]},o=wt(n);return o["Content-Type"]="application/json",vt("/api/pleroma/admin/users/tag",{method:"DELETE",headers:o,body:JSON.stringify(i)})},deleteUser:function(t){var e=t.credentials,n=t.user.screen_name,i=wt(e);return vt("".concat("/api/pleroma/admin/users","?nickname=").concat(n),{method:"DELETE",headers:i})},addRight:function(t){var e=t.right,n=t.credentials,i=t.user.screen_name;return vt(q(i,e),{method:"POST",headers:wt(n),body:{}})},deleteRight:function(t){var e=t.right,n=t.credentials,i=t.user.screen_name;return vt(q(i,e),{method:"DELETE",headers:wt(n),body:{}})},activateUser:function(t){var e=t.credentials,n=t.user.screen_name;return bt({url:"/api/pleroma/admin/users/activate",method:"PATCH",credentials:e,payload:{nicknames:[n]}}).then(function(t){return p()(t,"users.0")})},deactivateUser:function(t){var e=t.credentials,n=t.user.screen_name;return bt({url:"/api/pleroma/admin/users/deactivate",method:"PATCH",credentials:e,payload:{nicknames:[n]}}).then(function(t){return p()(t,"users.0")})},register:function(t){var e=t.params,n=t.credentials,i=e.nickname,o=s()(e,["nickname"]);return vt("/api/v1/accounts",{method:"POST",headers:H({},wt(n),{"Content-Type":"application/json"}),body:JSON.stringify(H({nickname:i,locale:"en_US",agreement:!0},o))}).then(function(t){return t.ok?t.json():t.json().then(function(t){throw new B(t)})})},getCaptcha:function(){return vt("/api/pleroma/captcha").then(function(t){return t.json()})},updateProfileImages:function(t){var e=t.credentials,n=t.avatar,i=void 0===n?null:n,o=t.banner,r=void 0===o?null:o,s=t.background,a=void 0===s?null:s,c=new FormData;return null!==i&&c.append("avatar",i),null!==r&&c.append("header",r),null!==a&&c.append("pleroma_background_image",a),vt("/api/v1/accounts/update_credentials",{headers:wt(e),method:"PATCH",body:c}).then(function(t){return t.json()}).then(function(t){return Object(x.g)(t)})},updateProfile:function(t){var e=t.credentials,n=t.params;return bt({url:"/api/v1/accounts/update_credentials",method:"PATCH",payload:n,credentials:e}).then(function(t){return Object(x.g)(t)})},importBlocks:function(t){var e=t.file,n=t.credentials,i=new FormData;return i.append("list",e),vt("/api/pleroma/blocks_import",{body:i,method:"POST",headers:wt(n)}).then(function(t){return t.ok})},importFollows:function(t){var e=t.file,n=t.credentials,i=new FormData;return i.append("list",e),vt("/api/pleroma/follow_import",{body:i,method:"POST",headers:wt(n)}).then(function(t){return t.ok})},deleteAccount:function(t){var e=t.credentials,n=t.password,i=new FormData;return i.append("password",n),vt("/api/pleroma/delete_account",{body:i,method:"POST",headers:wt(e)}).then(function(t){return t.json()})},changeEmail:function(t){var e=t.credentials,n=t.email,i=t.password,o=new FormData;return o.append("email",n),o.append("password",i),vt("/api/pleroma/change_email",{body:o,method:"POST",headers:wt(e)}).then(function(t){return t.json()})},changePassword:function(t){var e=t.credentials,n=t.password,i=t.newPassword,o=t.newPasswordConfirmation,r=new FormData;return r.append("password",n),r.append("new_password",i),r.append("new_password_confirmation",o),vt("/api/pleroma/change_password",{body:r,method:"POST",headers:wt(e)}).then(function(t){return t.json()})},settingsMFA:function(t){var e=t.credentials;return vt("/api/pleroma/accounts/mfa",{headers:wt(e),method:"GET"}).then(function(t){return t.json()})},mfaDisableOTP:function(t){var e=t.credentials,n=t.password,i=new FormData;return i.append("password",n),vt("/api/pleroma/accounts/mfa/totp",{body:i,method:"DELETE",headers:wt(e)}).then(function(t){return t.json()})},generateMfaBackupCodes:function(t){var e=t.credentials;return vt("/api/pleroma/accounts/mfa/backup_codes",{headers:wt(e),method:"GET"}).then(function(t){return t.json()})},mfaSetupOTP:function(t){var e=t.credentials;return vt("/api/pleroma/accounts/mfa/setup/totp",{headers:wt(e),method:"GET"}).then(function(t){return t.json()})},mfaConfirmOTP:function(t){var e=t.credentials,n=t.password,i=t.token,o=new FormData;return o.append("password",n),o.append("code",i),vt("/api/pleroma/accounts/mfa/confirm/totp",{body:o,headers:wt(e),method:"POST"}).then(function(t){return t.json()})},fetchFollowRequests:function(t){var e=t.credentials;return vt("/api/v1/follow_requests",{headers:wt(e)}).then(function(t){return t.json()}).then(function(t){return t.map(x.g)})},approveUser:function(t){var e=t.id,n=t.credentials,i=function(t){return"/api/v1/follow_requests/".concat(t,"/authorize")}(e);return vt(i,{headers:wt(n),method:"POST"}).then(function(t){return t.json()})},denyUser:function(t){var e=t.id,n=t.credentials,i=function(t){return"/api/v1/follow_requests/".concat(t,"/reject")}(e);return vt(i,{headers:wt(n),method:"POST"}).then(function(t){return t.json()})},suggestions:function(t){var e=t.credentials;return vt("/api/v1/suggestions",{headers:wt(e)}).then(function(t){return t.json()})},markNotificationsAsSeen:function(t){var e=t.id,n=t.credentials,i=t.single,o=void 0!==i&&i,r=new FormData;return o?r.append("id",e):r.append("max_id",e),vt("/api/v1/pleroma/notifications/read",{body:r,headers:wt(n),method:"POST"}).then(function(t){return t.json()})},dismissNotification:function(t){var e=t.credentials,n=t.id;return bt({url:W(n),method:"POST",payload:{id:n},credentials:e})},vote:function(t){var e,n=t.pollId,i=t.choices,o=t.credentials;return(new FormData).append("choices",i),bt({url:(e=encodeURIComponent(n),"/api/v1/polls/".concat(e,"/votes")),method:"POST",credentials:o,payload:{choices:i}})},fetchPoll:function(t){var e,n=t.pollId,i=t.credentials;return bt({url:(e=encodeURIComponent(n),"/api/v1/polls/".concat(e)),method:"GET",credentials:i})},fetchFavoritedByUsers:function(t){var e=t.id,n=t.credentials;return bt({url:ot(e),method:"GET",credentials:n}).then(function(t){return t.map(x.g)})},fetchRebloggedByUsers:function(t){var e=t.id,n=t.credentials;return bt({url:rt(e),method:"GET",credentials:n}).then(function(t){return t.map(x.g)})},fetchEmojiReactions:function(t){var e=t.id,n=t.credentials;return bt({url:ut(e),credentials:n}).then(function(t){return t.map(function(t){return t.accounts=t.accounts.map(x.g),t})})},reactWithEmoji:function(t){var e=t.id,n=t.emoji,i=t.credentials;return bt({url:dt(e,n),method:"PUT",credentials:i}).then(x.f)},unreactWithEmoji:function(t){var e=t.id,n=t.emoji,i=t.credentials;return bt({url:pt(e,n),method:"DELETE",credentials:i}).then(x.f)},reportUser:function(t){var e=t.credentials,n=t.userId,i=t.statusIds,o=t.comment,r=t.forward;return bt({url:"/api/v1/reports",method:"POST",payload:{account_id:n,status_ids:i,comment:o,forward:r},credentials:e})},updateNotificationSettings:function(t){var e=t.credentials,n=t.settings,i=new FormData;return _()(n,function(t,e){i.append(e,t)}),vt("/api/pleroma/notification_settings",{headers:wt(e),method:"PUT",body:i}).then(function(t){return t.json()})},search2:function(t){var e=t.credentials,n=t.q,i=t.resolve,o=t.limit,r=t.offset,s=t.following,a="/api/v2/search",c=[];n&&c.push(["q",encodeURIComponent(n)]),i&&c.push(["resolve",i]),o&&c.push(["limit",o]),r&&c.push(["offset",r]),s&&c.push(["following",!0]),c.push(["with_relationships",!0]);var l=b()(c,function(t){return"".concat(t[0],"=").concat(t[1])}).join("&");return a+="?".concat(l),vt(a,{headers:wt(e)}).then(function(t){if(t.ok)return t;throw new Error("Error fetching search result",t)}).then(function(t){return t.json()}).then(function(t){return t.accounts=t.accounts.slice(0,o).map(function(t){return Object(x.g)(t)}),t.statuses=t.statuses.slice(0,o).map(function(t){return Object(x.f)(t)}),t})},searchUsers:function(t){var e=t.credentials,n=t.query;return bt({url:"/api/v1/accounts/search",params:{q:n,resolve:!0},credentials:e}).then(function(t){return t.map(x.g)})},fetchKnownDomains:function(t){var e=t.credentials;return bt({url:"/api/v1/instance/peers",credentials:e})},fetchDomainMutes:function(t){var e=t.credentials;return bt({url:"/api/v1/domain_blocks",credentials:e})},muteDomain:function(t){var e=t.domain,n=t.credentials;return bt({url:"/api/v1/domain_blocks",method:"POST",payload:{domain:e},credentials:n})},unmuteDomain:function(t){var e=t.domain,n=t.credentials;return bt({url:"/api/v1/domain_blocks",method:"DELETE",payload:{domain:e},credentials:n})},chats:function(t){var e=t.credentials;return vt("/api/v1/pleroma/chats",{headers:wt(e)}).then(function(t){return t.json()}).then(function(t){return{chats:t.map(x.b).filter(function(t){return t})}})},getOrCreateChat:function(t){var e,n=t.accountId,i=t.credentials;return bt({url:(e=n,"/api/v1/pleroma/chats/by-account-id/".concat(e)),method:"POST",credentials:i})},chatMessages:function(t){var e=t.id,n=t.credentials,i=t.maxId,o=t.sinceId,r=t.limit,s=void 0===r?20:r,a=ft(e),c=[i&&"max_id=".concat(i),o&&"since_id=".concat(o),s&&"limit=".concat(s)].filter(function(t){return t}).join("&");return bt({url:a+=c?"?"+c:"",method:"GET",credentials:n})},sendChatMessage:function(t){var e=t.id,n=t.content,i=t.mediaId,o=void 0===i?null:i,r=t.credentials,s={content:n};return o&&(s.media_id=o),bt({url:ft(e),method:"POST",payload:s,credentials:r})},readChat:function(t){var e=t.id,n=t.lastReadId,i=t.credentials;return bt({url:ht(e),method:"POST",payload:{last_read_id:n},credentials:i})},deleteChatMessage:function(t){var e=t.chatId,n=t.messageId,i=t.credentials;return bt({url:mt(e,n),method:"DELETE",credentials:i})}};e.c=Ot},,,,,,function(t,e,n){"use strict";var i=n(97),o=n.n(i),r=function(t){return t&&t.includes("@")};e.a=function(t,e,n){var i=!e||r(e)||o()(n,e);return{name:i?"external-user-profile":"user-profile",params:i?{id:t}:{name:e}}}},function(t,e,n){"use strict";n.r(e);var i={props:["user","betterShadow","compact"],data:function(){return{showPlaceholder:!1,defaultAvatar:"".concat(this.$store.state.instance.server+this.$store.state.instance.defaultAvatar)}},components:{StillImage:n(62).a},methods:{imgSrc:function(t){return!t||this.showPlaceholder?this.defaultAvatar:t},imageLoadError:function(){this.showPlaceholder=!0}}},o=n(0);var r=function(t){n(415)},s=Object(o.a)(i,function(){var t=this.$createElement;return(this._self._c||t)("StillImage",{staticClass:"Avatar",class:{"avatar-compact":this.compact,"better-shadow":this.betterShadow},attrs:{alt:this.user.screen_name,title:this.user.screen_name,src:this.imgSrc(this.user.profile_image_url_original),"image-load-error":this.imageLoadError}})},[],!1,r,null,null);e.default=s.exports},function(t,e,n){"use strict";n.d(e,"d",function(){return d}),n.d(e,"b",function(){return h}),n.d(e,"c",function(){return g}),n.d(e,"a",function(){return v}),n.d(e,"e",function(){return b});var i=n(97),o=n.n(i),r=n(98),s=n.n(r),a=n(37),c=n.n(a),l=n(99),u=n(100),d=function(t){return t.state.statuses.notifications.data},p=function(t){var e=t.rootState||t.state;return[e.config.notificationVisibility.likes&&"like",e.config.notificationVisibility.mentions&&"mention",e.config.notificationVisibility.repeats&&"repeat",e.config.notificationVisibility.follows&&"follow",e.config.notificationVisibility.followRequest&&"follow_request",e.config.notificationVisibility.moves&&"move",e.config.notificationVisibility.emojiReactions&&"pleroma:emoji_reaction"].filter(function(t){return t})},f=["like","mention","repeat","pleroma:emoji_reaction"],h=function(t){return o()(f,t)},m=function(t,e){var n=Number(t.id),i=Number(e.id),o=!Number.isNaN(n),r=!Number.isNaN(i);return o&&r?n>i?-1:1:o&&!r?1:!o&&r?-1:t.id>e.id?-1:1},g=function(t,e){var n=t.rootState||t.state;if(!e.seen&&p(t).includes(e.type)&&("mention"!==e.type||!function(t,e){if(e.status)return e.status.muted||Object(l.a)(e.status,t.rootGetters.mergedConfig.muteWords).length>0}(t,e))){var i=w(e,t.rootGetters.i18n);Object(u.a)(n,i)}},v=function(t,e){var n=d(t).map(function(t){return t}).sort(m);return(n=s()(n,"seen")).filter(function(n){return(e||p(t)).includes(n.type)})},b=function(t){return c()(v(t),function(t){return!t.seen})},w=function(t,e){var n,i={tag:t.id},o=t.status,r=t.from_profile.name;switch(i.title=r,i.icon=t.from_profile.profile_image_url,t.type){case"like":n="favorited_you";break;case"repeat":n="repeated_you";break;case"follow":n="followed_you";break;case"move":n="migrated_to";break;case"follow_request":n="follow_request"}return"pleroma:emoji_reaction"===t.type?i.body=e.t("notifications.reacted_with",[t.emoji]):n?i.body=e.t("notifications."+n):h(t.type)&&(i.body=t.status.text),o&&o.attachments&&o.attachments.length>0&&!o.nsfw&&o.attachments[0].mimetype.startsWith("image/")&&(i.image=o.attachments[0].url),i}},,function(t,e,n){"use strict";var i=function(t){return t.match(/text\/html/)?"html":t.match(/image/)?"image":t.match(/video/)?"video":t.match(/audio/)?"audio":"unknown"},o={fileType:i,fileMatchesSomeType:function(t,e){return t.some(function(t){return i(e.mimetype)===t})}};e.a=o},function(t,e,n){"use strict";n.r(e);var i={name:"Popover",props:{trigger:String,placement:String,boundTo:Object,boundToSelector:String,margin:Object,offset:Object,popoverClass:String},data:function(){return{hidden:!0,styles:{opacity:0},oldSize:{width:0,height:0}}},methods:{containerBoundingClientRect:function(){return(this.boundToSelector?this.$el.closest(this.boundToSelector):this.$el.offsetParent).getBoundingClientRect()},updateStyles:function(){if(this.hidden)this.styles={opacity:0};else{var t=this.$refs.trigger&&this.$refs.trigger.children[0]||this.$el,e=t.getBoundingClientRect(),n=e.left+.5*e.width,i=e.top,o=this.$refs.content,r=this.boundTo&&("container"===this.boundTo.x||"container"===this.boundTo.y)&&this.containerBoundingClientRect(),s=this.margin||{},a=this.boundTo&&"container"===this.boundTo.x?{min:r.left+(s.left||0),max:r.right-(s.right||0)}:{min:0+(s.left||10),max:window.innerWidth-(s.right||10)},c=this.boundTo&&"container"===this.boundTo.y?{min:r.top+(s.top||0),max:r.bottom-(s.bottom||0)}:{min:0+(s.top||50),max:window.innerHeight-(s.bottom||5)},l=0;n-.5*o.offsetWidtha.max&&(l-=n+l+.5*o.offsetWidth-a.max);var u="bottom"!==this.placement;i+o.offsetHeight>c.max&&(u=!0),i-o.offsetHeight0?n("span",[t._v(t._s(t.status.fave_num))]):t._e()]):n("div",[n("i",{staticClass:"button-icon favorite-button",class:t.classes,attrs:{title:t.$t("tool_tip.favorite")}}),t._v(" "),!t.mergedConfig.hidePostStats&&t.status.fave_num>0?n("span",[t._v(t._s(t.status.fave_num))]):t._e()])},[],!1,f,null,null).exports,m=n(22);function g(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}var v={props:["status"],data:function(){return{filterWord:""}},components:{Popover:m.default},methods:{addReaction:function(t,e,n){var i=this.status.emoji_reactions.find(function(t){return t.name===e});i&&i.me?this.$store.dispatch("unreactWithEmoji",{id:this.status.id,emoji:e}):this.$store.dispatch("reactWithEmoji",{id:this.status.id,emoji:e}),n()}},computed:function(t){for(var e=1;e0?n("span",[t._v(t._s(t.status.repeat_num))]):t._e()]:[n("i",{staticClass:"button-icon icon-lock",class:t.classes,attrs:{title:t.$t("timeline.no_retweet_hint")}})]],2):t.loggedIn?t._e():n("div",[n("i",{staticClass:"button-icon icon-retweet",class:t.classes,attrs:{title:t.$t("tool_tip.repeat")}}),t._v(" "),!t.mergedConfig.hidePostStats&&t.status.repeat_num>0?n("span",[t._v(t._s(t.status.repeat_num))]):t._e()])},[],!1,y,null,null).exports,C={props:["status"],components:{Popover:m.default},methods:{deleteStatus:function(){window.confirm(this.$t("status.delete_confirm"))&&this.$store.dispatch("deleteStatus",{id:this.status.id})},pinStatus:function(){var t=this;this.$store.dispatch("pinStatus",this.status.id).then(function(){return t.$emit("onSuccess")}).catch(function(e){return t.$emit("onError",e.error.error)})},unpinStatus:function(){var t=this;this.$store.dispatch("unpinStatus",this.status.id).then(function(){return t.$emit("onSuccess")}).catch(function(e){return t.$emit("onError",e.error.error)})},muteConversation:function(){var t=this;this.$store.dispatch("muteConversation",this.status.id).then(function(){return t.$emit("onSuccess")}).catch(function(e){return t.$emit("onError",e.error.error)})},unmuteConversation:function(){var t=this;this.$store.dispatch("unmuteConversation",this.status.id).then(function(){return t.$emit("onSuccess")}).catch(function(e){return t.$emit("onError",e.error.error)})},copyLink:function(){var t=this;navigator.clipboard.writeText(this.statusLink).then(function(){return t.$emit("onSuccess")}).catch(function(e){return t.$emit("onError",e.error.error)})},bookmarkStatus:function(){var t=this;this.$store.dispatch("bookmark",{id:this.status.id}).then(function(){return t.$emit("onSuccess")}).catch(function(e){return t.$emit("onError",e.error.error)})},unbookmarkStatus:function(){var t=this;this.$store.dispatch("unbookmark",{id:this.status.id}).then(function(){return t.$emit("onSuccess")}).catch(function(e){return t.$emit("onError",e.error.error)})}},computed:{currentUser:function(){return this.$store.state.users.currentUser},canDelete:function(){if(this.currentUser)return this.currentUser.rights.moderator||this.currentUser.rights.admin||this.status.user.id===this.currentUser.id},ownStatus:function(){return this.status.user.id===this.currentUser.id},canPin:function(){return this.ownStatus&&("public"===this.status.visibility||"unlisted"===this.status.visibility)},canMute:function(){return!!this.currentUser},statusLink:function(){return"".concat(this.$store.state.instance.server).concat(this.$router.resolve({name:"conversation",params:{id:this.status.id}}).href)}}};var S=function(t){n(385)},j=Object(p.a)(C,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("Popover",{staticClass:"extra-button-popover",attrs:{trigger:"click",placement:"top","bound-to":{x:"container"}},scopedSlots:t._u([{key:"content",fn:function(e){var i=e.close;return n("div",{},[n("div",{staticClass:"dropdown-menu"},[t.canMute&&!t.status.thread_muted?n("button",{staticClass:"dropdown-item dropdown-item-icon",on:{click:function(e){return e.preventDefault(),t.muteConversation(e)}}},[n("i",{staticClass:"icon-eye-off"}),n("span",[t._v(t._s(t.$t("status.mute_conversation")))])]):t._e(),t._v(" "),t.canMute&&t.status.thread_muted?n("button",{staticClass:"dropdown-item dropdown-item-icon",on:{click:function(e){return e.preventDefault(),t.unmuteConversation(e)}}},[n("i",{staticClass:"icon-eye-off"}),n("span",[t._v(t._s(t.$t("status.unmute_conversation")))])]):t._e(),t._v(" "),!t.status.pinned&&t.canPin?n("button",{staticClass:"dropdown-item dropdown-item-icon",on:{click:[function(e){return e.preventDefault(),t.pinStatus(e)},i]}},[n("i",{staticClass:"icon-pin"}),n("span",[t._v(t._s(t.$t("status.pin")))])]):t._e(),t._v(" "),t.status.pinned&&t.canPin?n("button",{staticClass:"dropdown-item dropdown-item-icon",on:{click:[function(e){return e.preventDefault(),t.unpinStatus(e)},i]}},[n("i",{staticClass:"icon-pin"}),n("span",[t._v(t._s(t.$t("status.unpin")))])]):t._e(),t._v(" "),t.status.bookmarked?t._e():n("button",{staticClass:"dropdown-item dropdown-item-icon",on:{click:[function(e){return e.preventDefault(),t.bookmarkStatus(e)},i]}},[n("i",{staticClass:"icon-bookmark-empty"}),n("span",[t._v(t._s(t.$t("status.bookmark")))])]),t._v(" "),t.status.bookmarked?n("button",{staticClass:"dropdown-item dropdown-item-icon",on:{click:[function(e){return e.preventDefault(),t.unbookmarkStatus(e)},i]}},[n("i",{staticClass:"icon-bookmark"}),n("span",[t._v(t._s(t.$t("status.unbookmark")))])]):t._e(),t._v(" "),t.canDelete?n("button",{staticClass:"dropdown-item dropdown-item-icon",on:{click:[function(e){return e.preventDefault(),t.deleteStatus(e)},i]}},[n("i",{staticClass:"icon-cancel"}),n("span",[t._v(t._s(t.$t("status.delete")))])]):t._e(),t._v(" "),n("button",{staticClass:"dropdown-item dropdown-item-icon",on:{click:[function(e){return e.preventDefault(),t.copyLink(e)},i]}},[n("i",{staticClass:"icon-share"}),n("span",[t._v(t._s(t.$t("status.copy_link")))])])])])}}])},[t._v(" "),n("i",{staticClass:"icon-ellipsis button-icon",attrs:{slot:"trigger"},slot:"trigger"})])},[],!1,S,null,null).exports,O=n(42),P=n(28),$=n(18),T=n(114),I=n(44),E=n(34),M=n(25),U=n.n(M),F={name:"StatusPopover",props:["statusId"],data:function(){return{error:!1}},computed:{status:function(){return U()(this.$store.state.statuses.allStatuses,{id:this.statusId})}},components:{Status:function(){return Promise.resolve().then(n.bind(null,33))},Popover:function(){return Promise.resolve().then(n.bind(null,22))}},methods:{enter:function(){var t=this;if(!this.status){if(!this.statusId)return void(this.error=!0);this.$store.dispatch("fetchStatus",this.statusId).then(function(e){return t.error=!1}).catch(function(e){return t.error=!0})}}}};var D=function(t){n(427)},L=Object(p.a)(F,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("Popover",{attrs:{trigger:"hover","popover-class":"popover-default status-popover","bound-to":{x:"container"}},on:{show:t.enter}},[n("template",{slot:"trigger"},[t._t("default")],2),t._v(" "),n("div",{attrs:{slot:"content"},slot:"content"},[t.status?n("Status",{attrs:{"is-preview":!0,statusoid:t.status,compact:!0}}):t.error?n("div",{staticClass:"status-preview-no-content faint"},[t._v("\n "+t._s(t.$t("status.status_unavailable"))+"\n ")]):n("div",{staticClass:"status-preview-no-content"},[n("i",{staticClass:"icon-spin4 animate-spin"})])],1)],2)},[],!1,D,null,null).exports,N={name:"UserListPopover",props:["users"],components:{Popover:function(){return Promise.resolve().then(n.bind(null,22))},UserAvatar:function(){return Promise.resolve().then(n.bind(null,18))}},computed:{usersCapped:function(){return this.users.slice(0,16)}}};var R=function(t){n(429)},A=Object(p.a)(N,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("Popover",{attrs:{trigger:"hover",placement:"top",offset:{y:5}}},[n("template",{slot:"trigger"},[t._t("default")],2),t._v(" "),n("div",{staticClass:"user-list-popover",attrs:{slot:"content"},slot:"content"},[t.users.length?n("div",t._l(t.usersCapped,function(e){return n("div",{key:e.id,staticClass:"user-list-row"},[n("UserAvatar",{staticClass:"avatar-small",attrs:{user:e,compact:!0}}),t._v(" "),n("div",{staticClass:"user-list-names"},[n("span",{domProps:{innerHTML:t._s(e.name_html)}}),t._v(" "),n("span",{staticClass:"user-list-screen-name"},[t._v(t._s(e.screen_name))])])],1)}),0):n("div",[n("i",{staticClass:"icon-spin4 animate-spin"})])])],2)},[],!1,R,null,null).exports,B={name:"EmojiReactions",components:{UserAvatar:$.default,UserListPopover:A},props:["status"],data:function(){return{showAll:!1}},computed:{tooManyReactions:function(){return this.status.emoji_reactions.length>12},emojiReactions:function(){return this.showAll?this.status.emoji_reactions:this.status.emoji_reactions.slice(0,12)},showMoreString:function(){return"+".concat(this.status.emoji_reactions.length-12)},accountsForEmoji:function(){return this.status.emoji_reactions.reduce(function(t,e){return t[e.name]=e.accounts||[],t},{})},loggedIn:function(){return!!this.$store.state.users.currentUser}},methods:{toggleShowAll:function(){this.showAll=!this.showAll},reactedWith:function(t){return this.status.emoji_reactions.find(function(e){return e.name===t}).me},fetchEmojiReactionsByIfMissing:function(){this.status.emoji_reactions.find(function(t){return!t.accounts})&&this.$store.dispatch("fetchEmojiReactionsBy",this.status.id)},reactWith:function(t){this.$store.dispatch("reactWithEmoji",{id:this.status.id,emoji:t})},unreact:function(t){this.$store.dispatch("unreactWithEmoji",{id:this.status.id,emoji:t})},emojiOnClick:function(t,e){this.loggedIn&&(this.reactedWith(t)?this.unreact(t):this.reactWith(t))}}};var z=function(t){n(431)},H=Object(p.a)(B,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"emoji-reactions"},[t._l(t.emojiReactions,function(e){return n("UserListPopover",{key:e.name,attrs:{users:t.accountsForEmoji[e.name]}},[n("button",{staticClass:"emoji-reaction btn btn-default",class:{"picked-reaction":t.reactedWith(e.name),"not-clickable":!t.loggedIn},on:{click:function(n){return t.emojiOnClick(e.name,n)},mouseenter:function(e){return t.fetchEmojiReactionsByIfMissing()}}},[n("span",{staticClass:"reaction-emoji"},[t._v(t._s(e.name))]),t._v(" "),n("span",[t._v(t._s(e.count))])])])}),t._v(" "),t.tooManyReactions?n("a",{staticClass:"emoji-reaction-expand faint",attrs:{href:"javascript:void(0)"},on:{click:t.toggleShowAll}},[t._v("\n "+t._s(t.showAll?t.$t("general.show_less"):t.showMoreString)+"\n ")]):t._e()],2)},[],!1,z,null,null).exports,q=n(17),W=n(46),V=n(99);function G(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}var K={name:"Status",components:{FavoriteButton:h,ReactButton:w,RetweetButton:k,ExtraButtons:j,PostStatusForm:O.a,UserCard:P.a,UserAvatar:$.default,AvatarList:T.a,Timeago:I.a,StatusPopover:L,UserListPopover:A,EmojiReactions:H,StatusContent:E.a},props:["statusoid","expandable","inConversation","focused","highlight","compact","replies","isPreview","noHeading","inlineExpanded","showPinned","inProfile","profileUserId"],data:function(){return{replying:!1,unmuted:!1,userExpanded:!1,error:null}},computed:function(t){for(var e=1;e0,r=(this.inProfile&&(!e&&t.user.id===this.profileUserId||e&&e.user.id===this.profileUserId)||this.inConversation&&t.thread_muted)&&!this.muteWordHits.length>0;return!this.unmuted&&!r&&o},hideFilteredStatuses:function(){return this.mergedConfig.hideFilteredStatuses},hideStatus:function(){return this.deleted||this.muted&&this.hideFilteredStatuses},isFocused:function(){return!!this.focused||!!this.inConversation&&this.status.id===this.highlight},isReply:function(){return!(!this.status.in_reply_to_status_id||!this.status.in_reply_to_user_id)},replyToName:function(){if(this.status.in_reply_to_screen_name)return this.status.in_reply_to_screen_name;var t=this.$store.getters.findUser(this.status.in_reply_to_user_id);return t&&t.screen_name},replySubject:function(){if(!this.status.summary)return"";var t=c()(this.status.summary),e=this.mergedConfig.subjectLineBehavior,n=t.match(/^re[: ]/i);return"noop"!==e&&n||"masto"===e?t:"email"===e?"re: ".concat(t):"noop"===e?"":void 0},combinedFavsAndRepeatsUsers:function(){var t=[].concat(this.statusFromGlobalRepository.favoritedBy,this.statusFromGlobalRepository.rebloggedBy);return s()(t,"id")},tags:function(){return this.status.tags.filter(function(t){return t.hasOwnProperty("name")}).map(function(t){return t.name}).join(" ")},hidePostStats:function(){return this.mergedConfig.hidePostStats}},Object(l.c)(["mergedConfig"]),{},Object(l.e)({betterShadow:function(t){return t.interface.browserSupport.cssFilter},currentUser:function(t){return t.users.currentUser}})),methods:{visibilityIcon:function(t){switch(t){case"private":return"icon-lock";case"unlisted":return"icon-lock-open-alt";case"direct":return"icon-mail-alt";default:return"icon-globe"}},showError:function(t){this.error=t},clearError:function(){this.error=void 0},toggleReplying:function(){this.replying=!this.replying},gotoOriginal:function(t){this.inConversation&&this.$emit("goto",t)},toggleExpanded:function(){this.$emit("toggleExpanded")},toggleMute:function(){this.unmuted=!this.unmuted},toggleUserExpanded:function(){this.userExpanded=!this.userExpanded},generateUserProfileLink:function(t,e){return Object(q.a)(t,e,this.$store.state.instance.restrictedNicknames)}},watch:{highlight:function(t){if(this.status.id===t){var e=this.$el.getBoundingClientRect();e.top<100?window.scrollBy(0,e.top-100):e.height>=window.innerHeight-50?window.scrollBy(0,e.top-100):e.bottom>window.innerHeight-50&&window.scrollBy(0,e.bottom-window.innerHeight+50)}},"status.repeat_num":function(t){this.isFocused&&this.statusFromGlobalRepository.rebloggedBy&&this.statusFromGlobalRepository.rebloggedBy.length!==t&&this.$store.dispatch("fetchRepeats",this.status.id)},"status.fave_num":function(t){this.isFocused&&this.statusFromGlobalRepository.favoritedBy&&this.statusFromGlobalRepository.favoritedBy.length!==t&&this.$store.dispatch("fetchFavs",this.status.id)}},filters:{capitalize:function(t){return t.charAt(0).toUpperCase()+t.slice(1)}}};var Y=function(t){n(374)},J=Object(p.a)(K,function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.hideStatus?t._e():n("div",{staticClass:"Status",class:[{"-focused":t.isFocused},{"-conversation":t.inlineExpanded}]},[t.error?n("div",{staticClass:"alert error"},[t._v("\n "+t._s(t.error)+"\n "),n("i",{staticClass:"button-icon icon-cancel",on:{click:t.clearError}})]):t._e(),t._v(" "),t.muted&&!t.isPreview?[n("div",{staticClass:"status-csontainer muted"},[n("small",{staticClass:"status-username"},[t.muted&&t.retweet?n("i",{staticClass:"button-icon icon-retweet"}):t._e(),t._v(" "),n("router-link",{attrs:{to:t.userProfileLink}},[t._v("\n "+t._s(t.status.user.screen_name)+"\n ")])],1),t._v(" "),t.showReasonMutedThread?n("small",{staticClass:"mute-thread"},[t._v("\n "+t._s(t.$t("status.thread_muted"))+"\n ")]):t._e(),t._v(" "),t.showReasonMutedThread&&t.muteWordHits.length>0?n("small",{staticClass:"mute-thread"},[t._v("\n "+t._s(t.$t("status.thread_muted_and_words"))+"\n ")]):t._e(),t._v(" "),n("small",{staticClass:"mute-words",attrs:{title:t.muteWordHits.join(", ")}},[t._v("\n "+t._s(t.muteWordHits.join(", "))+"\n ")]),t._v(" "),n("a",{staticClass:"unmute",attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),t.toggleMute(e)}}},[n("i",{staticClass:"button-icon icon-eye-off"})])])]:[t.showPinned?n("div",{staticClass:"pin"},[n("i",{staticClass:"fa icon-pin faint"}),t._v(" "),n("span",{staticClass:"faint"},[t._v(t._s(t.$t("status.pinned")))])]):t._e(),t._v(" "),!t.retweet||t.noHeading||t.inConversation?t._e():n("div",{staticClass:"status-container repeat-info",class:[t.repeaterClass,{highlighted:t.repeaterStyle}],style:[t.repeaterStyle]},[t.retweet?n("UserAvatar",{staticClass:"left-side repeater-avatar",attrs:{"better-shadow":t.betterShadow,user:t.statusoid.user}}):t._e(),t._v(" "),n("div",{staticClass:"right-side faint"},[n("span",{staticClass:"status-username repeater-name",attrs:{title:t.retweeter}},[t.retweeterHtml?n("router-link",{attrs:{to:t.retweeterProfileLink},domProps:{innerHTML:t._s(t.retweeterHtml)}}):n("router-link",{attrs:{to:t.retweeterProfileLink}},[t._v(t._s(t.retweeter))])],1),t._v(" "),n("i",{staticClass:"fa icon-retweet retweeted",attrs:{title:t.$t("tool_tip.repeat")}}),t._v("\n "+t._s(t.$t("timeline.repeated"))+"\n ")])],1),t._v(" "),n("div",{staticClass:"status-container",class:[t.userClass,{highlighted:t.userStyle,"-repeat":t.retweet&&!t.inConversation}],style:[t.userStyle],attrs:{"data-tags":t.tags}},[t.noHeading?t._e():n("div",{staticClass:"left-side"},[n("router-link",{attrs:{to:t.userProfileLink},nativeOn:{"!click":function(e){return e.stopPropagation(),e.preventDefault(),t.toggleUserExpanded(e)}}},[n("UserAvatar",{attrs:{compact:t.compact,"better-shadow":t.betterShadow,user:t.status.user}})],1)],1),t._v(" "),n("div",{staticClass:"right-side"},[t.userExpanded?n("UserCard",{staticClass:"usercard",attrs:{"user-id":t.status.user.id,rounded:!0,bordered:!0}}):t._e(),t._v(" "),t.noHeading?t._e():n("div",{staticClass:"status-heading"},[n("div",{staticClass:"heading-name-row"},[n("div",{staticClass:"heading-left"},[t.status.user.name_html?n("h4",{staticClass:"status-username",attrs:{title:t.status.user.name},domProps:{innerHTML:t._s(t.status.user.name_html)}}):n("h4",{staticClass:"status-username",attrs:{title:t.status.user.name}},[t._v("\n "+t._s(t.status.user.name)+"\n ")]),t._v(" "),n("router-link",{staticClass:"account-name",attrs:{title:t.status.user.screen_name,to:t.userProfileLink}},[t._v("\n "+t._s(t.status.user.screen_name)+"\n ")]),t._v(" "),t.status.user&&t.status.user.favicon?n("img",{staticClass:"status-favicon",attrs:{src:t.status.user.favicon}}):t._e()],1),t._v(" "),n("span",{staticClass:"heading-right"},[n("router-link",{staticClass:"timeago faint-link",attrs:{to:{name:"conversation",params:{id:t.status.id}}}},[n("Timeago",{attrs:{time:t.status.created_at,"auto-update":60}})],1),t._v(" "),t.status.visibility?n("div",{staticClass:"button-icon visibility-icon"},[n("i",{class:t.visibilityIcon(t.status.visibility),attrs:{title:t._f("capitalize")(t.status.visibility)}})]):t._e(),t._v(" "),t.status.is_local||t.isPreview?t._e():n("a",{staticClass:"source_url",attrs:{href:t.status.external_url,target:"_blank",title:"Source"}},[n("i",{staticClass:"button-icon icon-link-ext-alt"})]),t._v(" "),t.expandable&&!t.isPreview?[n("a",{attrs:{href:"#",title:"Expand"},on:{click:function(e){return e.preventDefault(),t.toggleExpanded(e)}}},[n("i",{staticClass:"button-icon icon-plus-squared"})])]:t._e(),t._v(" "),t.unmuted?n("a",{attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),t.toggleMute(e)}}},[n("i",{staticClass:"button-icon icon-eye-off"})]):t._e()],2)]),t._v(" "),n("div",{staticClass:"heading-reply-row"},[t.isReply?n("div",{staticClass:"reply-to-and-accountname"},[t.isPreview?n("span",{staticClass:"reply-to-no-popover"},[n("span",{staticClass:"reply-to-text"},[t._v(t._s(t.$t("status.reply_to")))])]):n("StatusPopover",{staticClass:"reply-to-popover",class:{"-strikethrough":!t.status.parent_visible},staticStyle:{"min-width":"0"},attrs:{"status-id":t.status.parent_visible&&t.status.in_reply_to_status_id}},[n("a",{staticClass:"reply-to",attrs:{href:"#","aria-label":t.$t("tool_tip.reply")},on:{click:function(e){return e.preventDefault(),t.gotoOriginal(t.status.in_reply_to_status_id)}}},[n("i",{staticClass:"button-icon reply-button icon-reply"}),t._v(" "),n("span",{staticClass:"faint-link reply-to-text"},[t._v("\n "+t._s(t.$t("status.reply_to"))+"\n ")])])]),t._v(" "),n("router-link",{staticClass:"reply-to-link",attrs:{title:t.replyToName,to:t.replyProfileLink}},[t._v("\n "+t._s(t.replyToName)+"\n ")]),t._v(" "),t.replies&&t.replies.length?n("span",{staticClass:"faint replies-separator"},[t._v("\n -\n ")]):t._e()],1):t._e(),t._v(" "),t.inConversation&&!t.isPreview&&t.replies&&t.replies.length?n("div",{staticClass:"replies"},[n("span",{staticClass:"faint"},[t._v(t._s(t.$t("status.replies_list")))]),t._v(" "),t._l(t.replies,function(e){return n("StatusPopover",{key:e.id,attrs:{"status-id":e.id}},[n("a",{staticClass:"reply-link",attrs:{href:"#"},on:{click:function(n){return n.preventDefault(),t.gotoOriginal(e.id)}}},[t._v(t._s(e.name))])])})],2):t._e()])]),t._v(" "),n("StatusContent",{attrs:{status:t.status,"no-heading":t.noHeading,highlight:t.highlight,focused:t.isFocused}}),t._v(" "),n("transition",{attrs:{name:"fade"}},[!t.hidePostStats&&t.isFocused&&t.combinedFavsAndRepeatsUsers.length>0?n("div",{staticClass:"favs-repeated-users"},[n("div",{staticClass:"stats"},[t.statusFromGlobalRepository.rebloggedBy&&t.statusFromGlobalRepository.rebloggedBy.length>0?n("UserListPopover",{attrs:{users:t.statusFromGlobalRepository.rebloggedBy}},[n("div",{staticClass:"stat-count"},[n("a",{staticClass:"stat-title"},[t._v(t._s(t.$t("status.repeats")))]),t._v(" "),n("div",{staticClass:"stat-number"},[t._v("\n "+t._s(t.statusFromGlobalRepository.rebloggedBy.length)+"\n ")])])]):t._e(),t._v(" "),t.statusFromGlobalRepository.favoritedBy&&t.statusFromGlobalRepository.favoritedBy.length>0?n("UserListPopover",{attrs:{users:t.statusFromGlobalRepository.favoritedBy}},[n("div",{staticClass:"stat-count"},[n("a",{staticClass:"stat-title"},[t._v(t._s(t.$t("status.favorites")))]),t._v(" "),n("div",{staticClass:"stat-number"},[t._v("\n "+t._s(t.statusFromGlobalRepository.favoritedBy.length)+"\n ")])])]):t._e(),t._v(" "),n("div",{staticClass:"avatar-row"},[n("AvatarList",{attrs:{users:t.combinedFavsAndRepeatsUsers}})],1)],1)]):t._e()]),t._v(" "),!t.mergedConfig.emojiReactionsOnTimeline&&!t.isFocused||t.noHeading||t.isPreview?t._e():n("EmojiReactions",{attrs:{status:t.status}}),t._v(" "),t.noHeading||t.isPreview?t._e():n("div",{staticClass:"status-actions"},[n("div",[t.loggedIn?n("i",{staticClass:"button-icon button-reply icon-reply",class:{"-active":t.replying},attrs:{title:t.$t("tool_tip.reply")},on:{click:function(e){return e.preventDefault(),t.toggleReplying(e)}}}):n("i",{staticClass:"button-icon button-reply -disabled icon-reply",attrs:{title:t.$t("tool_tip.reply")}}),t._v(" "),t.status.replies_count>0?n("span",[t._v(t._s(t.status.replies_count))]):t._e()]),t._v(" "),n("retweet-button",{attrs:{visibility:t.status.visibility,"logged-in":t.loggedIn,status:t.status}}),t._v(" "),n("favorite-button",{attrs:{"logged-in":t.loggedIn,status:t.status}}),t._v(" "),t.loggedIn?n("ReactButton",{attrs:{status:t.status}}):t._e(),t._v(" "),n("extra-buttons",{attrs:{status:t.status},on:{onError:t.showError,onSuccess:t.clearError}})],1)],1)]),t._v(" "),t.replying?n("div",{staticClass:"status-container reply-form"},[n("PostStatusForm",{staticClass:"reply-body",attrs:{"reply-to":t.status.id,attentions:t.status.attentions,"replied-user":t.status.user,"copy-message-scope":t.status.visibility,subject:t.replySubject},on:{posted:t.toggleReplying}})],1):t._e()]],2)},[],!1,Y,null,null);e.default=J.exports},function(t,e,n){"use strict";var i=n(1),o=n.n(i),r=n(43),s=n(15),a=n.n(s),c=n(130),l=n.n(c),u={name:"Poll",props:["basePoll"],components:{Timeago:n(44).a},data:function(){return{loading:!1,choices:[]}},created:function(){this.$store.state.polls.pollsObject[this.pollId]||this.$store.dispatch("mergeOrAddPoll",this.basePoll),this.$store.dispatch("trackPoll",this.pollId)},destroyed:function(){this.$store.dispatch("untrackPoll",this.pollId)},computed:{pollId:function(){return this.basePoll.id},poll:function(){return this.$store.state.polls.pollsObject[this.pollId]||{}},options:function(){return this.poll&&this.poll.options||[]},expiresAt:function(){return this.poll&&this.poll.expires_at||0},expired:function(){return this.poll&&this.poll.expired||!1},loggedIn:function(){return this.$store.state.users.currentUser},showResults:function(){return this.poll.voted||this.expired||!this.loggedIn},totalVotesCount:function(){return this.poll.votes_count},containerClass:function(){return{loading:this.loading}},choiceIndices:function(){return this.choices.map(function(t,e){return t&&e}).filter(function(t){return"number"==typeof t})},isDisabled:function(){var t=0===this.choiceIndices.length;return this.loading||t}},methods:{percentageForOption:function(t){return 0===this.totalVotesCount?0:Math.round(t/this.totalVotesCount*100)},resultTitle:function(t){return"".concat(t.votes_count,"/").concat(this.totalVotesCount," ").concat(this.$t("polls.votes"))},fetchPoll:function(){this.$store.dispatch("refreshPoll",{id:this.statusId,pollId:this.poll.id})},activateOption:function(t){var e=this.$el.querySelectorAll("input"),n=this.$el.querySelector('input[value="'.concat(t,'"]'));this.poll.multiple?n.checked=!n.checked:(l()(e,function(t){t.checked=!1}),n.checked=!0),this.choices=a()(e,function(t){return t.checked})},optionId:function(t){return"poll".concat(this.poll.id,"-").concat(t)},vote:function(){var t=this;0!==this.choiceIndices.length&&(this.loading=!0,this.$store.dispatch("votePoll",{id:this.statusId,pollId:this.poll.id,choices:this.choiceIndices}).then(function(e){t.loading=!1}))}}},d=n(0);var p=function(t){n(407)},f=Object(d.a)(u,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"poll",class:t.containerClass},[t._l(t.options,function(e,i){return n("div",{key:i,staticClass:"poll-option"},[t.showResults?n("div",{staticClass:"option-result",attrs:{title:t.resultTitle(e)}},[n("div",{staticClass:"option-result-label"},[n("span",{staticClass:"result-percentage"},[t._v("\n "+t._s(t.percentageForOption(e.votes_count))+"%\n ")]),t._v(" "),n("span",{domProps:{innerHTML:t._s(e.title_html)}})]),t._v(" "),n("div",{staticClass:"result-fill",style:{width:t.percentageForOption(e.votes_count)+"%"}})]):n("div",{on:{click:function(e){return t.activateOption(i)}}},[t.poll.multiple?n("input",{attrs:{type:"checkbox",disabled:t.loading},domProps:{value:i}}):n("input",{attrs:{type:"radio",disabled:t.loading},domProps:{value:i}}),t._v(" "),n("label",{staticClass:"option-vote"},[n("div",[t._v(t._s(e.title))])])])])}),t._v(" "),n("div",{staticClass:"footer faint"},[t.showResults?t._e():n("button",{staticClass:"btn btn-default poll-vote-button",attrs:{type:"button",disabled:t.isDisabled},on:{click:t.vote}},[t._v("\n "+t._s(t.$t("polls.vote"))+"\n ")]),t._v(" "),n("div",{staticClass:"total"},[t._v("\n "+t._s(t.totalVotesCount)+" "+t._s(t.$t("polls.votes"))+" · \n ")]),t._v(" "),n("i18n",{attrs:{path:t.expired?"polls.expired":"polls.expires_in"}},[n("Timeago",{attrs:{time:t.expiresAt,"auto-update":60,"now-threshold":0}})],1)],1)],2)},[],!1,p,null,null).exports,h=n(111),m=n(112),g=n(17),v=n(21),b=n(7),w=n.n(b),_=n(2);function x(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}var y={name:"StatusContent",props:["status","focused","noHeading","fullContent","singleLine"],data:function(){return{showingTall:this.fullContent||this.inConversation&&this.focused,showingLongSubject:!1,expandingSubject:!this.$store.getters.mergedConfig.collapseMessageWithSubject}},computed:function(t){for(var e=1;e20},longSubject:function(){return this.status.summary.length>240},mightHideBecauseSubject:function(){return!!this.status.summary&&this.localCollapseSubjectDefault},mightHideBecauseTall:function(){return this.tallStatus&&!(this.status.summary&&this.localCollapseSubjectDefault)},hideSubjectStatus:function(){return this.mightHideBecauseSubject&&!this.expandingSubject},hideTallStatus:function(){return this.mightHideBecauseTall&&!this.showingTall},showingMore:function(){return this.mightHideBecauseTall&&this.showingTall||this.mightHideBecauseSubject&&this.expandingSubject},nsfwClickthrough:function(){return!!this.status.nsfw&&(!this.status.summary||!this.localCollapseSubjectDefault)},attachmentSize:function(){return this.mergedConfig.hideAttachments&&!this.inConversation||this.mergedConfig.hideAttachmentsInConv&&this.inConversation||this.status.attachments.length>this.maxThumbnails?"hide":this.compact?"small":"normal"},galleryTypes:function(){return"hide"===this.attachmentSize?[]:this.mergedConfig.playVideosInModal?["image","video"]:["image"]},galleryAttachments:function(){var t=this;return this.status.attachments.filter(function(e){return v.a.fileMatchesSomeType(t.galleryTypes,e)})},nonGalleryAttachments:function(){var t=this;return this.status.attachments.filter(function(e){return!v.a.fileMatchesSomeType(t.galleryTypes,e)})},attachmentTypes:function(){return this.status.attachments.map(function(t){return v.a.fileType(t.mimetype)})},maxThumbnails:function(){return this.mergedConfig.maxThumbnails},postBodyHtml:function(){var t=this.status.statusnet_html;if(!this.mergedConfig.greentext)return t;try{return t.includes(">")?function(t,e){for(var n,i=new Set(["p","br","div"]),o=new Set(["p","div"]),r="",s=[],a="",c=null,l=function(){a.trim().length>0?r+=e(a):r+=a,a=""},u=function(t){l(),r+=t},d=function(t){l(),r+=t,s.push(t)},p=function(t){l(),r+=t,s[s.length-1]===t&&s.pop()},f=0;f"!==h&&null!==c)c+=h;else if(">"===h&&null!==c){var m=c+=h;c=null;var g=(n=void 0,(n=/(?:<\/(\w+)>|<(\w+)\s?[^/]*?\/?>)/gi.exec(m))&&(n[1]||n[2]));i.has(g)?"br"===g?u(m):o.has(g)&&("/"===m[1]?p(m):"/"===m[m.length-2]?u(m):d(m)):a+=m}else"\n"===h?u(h):a+=h}return c&&(a+=c),l(),r}(t,function(t){return t.includes(">")&&t.replace(/<[^>]+?>/gi,"").replace(/@\w+/gi,"").trim().startsWith(">")?"".concat(t,""):t}):t}catch(e){return console.err("Failed to process status html",e),t}}},Object(_.c)(["mergedConfig"]),{},Object(_.e)({betterShadow:function(t){return t.interface.browserSupport.cssFilter},currentUser:function(t){return t.users.currentUser}})),components:{Attachment:r.a,Poll:f,Gallery:h.a,LinkPreview:m.a},methods:{linkClicked:function(t){var e,n,i=t.target.closest(".status-content a");if(i){if(i.className.match(/mention/)){var o=i.href,r=this.status.attentions.find(function(t){return function(t,e){if(e===t.statusnet_profile_url)return!0;var n=t.screen_name.split("@"),i=w()(n,2),o=i[0],r=i[1],s=new RegExp("://"+r+"/.*"+o+"$","g");return!!e.match(s)}(t,o)});if(r){t.stopPropagation(),t.preventDefault();var s=this.generateUserProfileLink(r.id,r.screen_name);return void this.$router.push(s)}}if(i.rel.match(/(?:^|\s)tag(?:$|\s)/)||i.className.match(/hashtag/)){var a=i.dataset.tag||(e=i.href,!!(n=/tag[s]*\/(\w+)$/g.exec(e))&&n[1]);if(a){var c=this.generateTagLink(a);return void this.$router.push(c)}}window.open(i.href,"_blank")}},toggleShowMore:function(){this.mightHideBecauseTall?this.showingTall=!this.showingTall:this.mightHideBecauseSubject&&(this.expandingSubject=!this.expandingSubject)},generateUserProfileLink:function(t,e){return Object(g.a)(t,e,this.$store.state.instance.restrictedNicknames)},generateTagLink:function(t){return"/tag/".concat(t)},setMedia:function(){var t=this,e="hide"===this.attachmentSize?this.status.attachments:this.galleryAttachments;return function(){return t.$store.dispatch("setMedia",e)}}}};var k=function(t){n(405)},C=Object(d.a)(y,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"StatusContent"},[t._t("header"),t._v(" "),t.status.summary_html?n("div",{staticClass:"summary-wrapper",class:{"tall-subject":t.longSubject&&!t.showingLongSubject}},[n("div",{staticClass:"media-body summary",domProps:{innerHTML:t._s(t.status.summary_html)},on:{click:function(e){return e.preventDefault(),t.linkClicked(e)}}}),t._v(" "),t.longSubject&&t.showingLongSubject?n("a",{staticClass:"tall-subject-hider",attrs:{href:"#"},on:{click:function(e){e.preventDefault(),t.showingLongSubject=!1}}},[t._v(t._s(t.$t("status.hide_full_subject")))]):t.longSubject?n("a",{staticClass:"tall-subject-hider",class:{"tall-subject-hider_focused":t.focused},attrs:{href:"#"},on:{click:function(e){e.preventDefault(),t.showingLongSubject=!0}}},[t._v("\n "+t._s(t.$t("status.show_full_subject"))+"\n ")]):t._e()]):t._e(),t._v(" "),n("div",{staticClass:"status-content-wrapper",class:{"tall-status":t.hideTallStatus}},[t.hideTallStatus?n("a",{staticClass:"tall-status-hider",class:{"tall-status-hider_focused":t.focused},attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),t.toggleShowMore(e)}}},[t._v("\n "+t._s(t.$t("general.show_more"))+"\n ")]):t._e(),t._v(" "),t.hideSubjectStatus?t._e():n("div",{staticClass:"status-content media-body",class:{"single-line":t.singleLine},domProps:{innerHTML:t._s(t.postBodyHtml)},on:{click:function(e){return e.preventDefault(),t.linkClicked(e)}}}),t._v(" "),t.hideSubjectStatus?n("a",{staticClass:"cw-status-hider",attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),t.toggleShowMore(e)}}},[t._v("\n "+t._s(t.$t("status.show_content"))+"\n "),t.attachmentTypes.includes("image")?n("span",{staticClass:"icon-picture"}):t._e(),t._v(" "),t.attachmentTypes.includes("video")?n("span",{staticClass:"icon-video"}):t._e(),t._v(" "),t.attachmentTypes.includes("audio")?n("span",{staticClass:"icon-music"}):t._e(),t._v(" "),t.attachmentTypes.includes("unknown")?n("span",{staticClass:"icon-doc"}):t._e(),t._v(" "),t.status.poll&&t.status.poll.options?n("span",{staticClass:"icon-chart-bar"}):t._e(),t._v(" "),t.status.card?n("span",{staticClass:"icon-link"}):t._e()]):t._e(),t._v(" "),t.showingMore&&!t.fullContent?n("a",{staticClass:"status-unhider",attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),t.toggleShowMore(e)}}},[t._v("\n "+t._s(t.tallStatus?t.$t("general.show_less"):t.$t("status.hide_content"))+"\n ")]):t._e()]),t._v(" "),t.status.poll&&t.status.poll.options&&!t.hideSubjectStatus?n("div",[n("poll",{attrs:{"base-poll":t.status.poll}})],1):t._e(),t._v(" "),0===t.status.attachments.length||t.hideSubjectStatus&&!t.showingLongSubject?t._e():n("div",{staticClass:"attachments media-body"},[t._l(t.nonGalleryAttachments,function(e){return n("attachment",{key:e.id,staticClass:"non-gallery",attrs:{size:t.attachmentSize,nsfw:t.nsfwClickthrough,attachment:e,"allow-play":!0,"set-media":t.setMedia()}})}),t._v(" "),t.galleryAttachments.length>0?n("gallery",{attrs:{nsfw:t.nsfwClickthrough,attachments:t.galleryAttachments,"set-media":t.setMedia()}}):t._e()],2),t._v(" "),!t.status.card||t.hideSubjectStatus||t.noHeading?t._e():n("div",{staticClass:"link-preview media-body"},[n("link-preview",{attrs:{card:t.status.card,size:t.attachmentSize,nsfw:t.nsfwClickthrough}})],1),t._v(" "),t._t("footer")],2)},[],!1,k,null,null);e.a=C.exports},function(t,e,n){"use strict";n.d(e,"c",function(){return i}),n.d(e,"b",function(){return o}),n.d(e,"a",function(){return r}),n.d(e,"d",function(){return l}),n.d(e,"e",function(){return u});var i=6e4,o=60*i,r=24*o,s=7*r,a=30*r,c=365.25*r,l=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;"string"==typeof t&&(t=Date.parse(t));var n=Date.now()>t?Math.floor:Math.ceil,l=Math.abs(Date.now()-t),u={num:n(l/c),key:"time.years"};return l<1e3*e?(u.num=0,u.key="time.now"):l1&&void 0!==arguments[1]?arguments[1]:1,n=l(t,e);return n.key+="_short",n}},,,function(t,e,n){"use strict";var i=n(28),o=n(18),r=n(17),s={props:["user"],data:function(){return{userExpanded:!1}},components:{UserCard:i.a,UserAvatar:o.default},methods:{toggleUserExpanded:function(){this.userExpanded=!this.userExpanded},userProfileLink:function(t){return Object(r.a)(t.id,t.screen_name,this.$store.state.instance.restrictedNicknames)}}},a=n(0);var c=function(t){n(463)},l=Object(a.a)(s,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"basic-user-card"},[n("router-link",{attrs:{to:t.userProfileLink(t.user)}},[n("UserAvatar",{staticClass:"avatar",attrs:{user:t.user},nativeOn:{click:function(e){return e.preventDefault(),t.toggleUserExpanded(e)}}})],1),t._v(" "),t.userExpanded?n("div",{staticClass:"basic-user-card-expanded-content"},[n("UserCard",{attrs:{"user-id":t.user.id,rounded:!0,bordered:!0}})],1):n("div",{staticClass:"basic-user-card-collapsed-content"},[n("div",{staticClass:"basic-user-card-user-name",attrs:{title:t.user.name}},[t.user.name_html?n("span",{staticClass:"basic-user-card-user-name-value",domProps:{innerHTML:t._s(t.user.name_html)}}):n("span",{staticClass:"basic-user-card-user-name-value"},[t._v(t._s(t.user.name))])]),t._v(" "),n("div",[n("router-link",{staticClass:"basic-user-card-screen-name",attrs:{to:t.userProfileLink(t.user)}},[t._v("\n @"+t._s(t.user.screen_name)+"\n ")])],1),t._v(" "),t._t("default")],2)],1)},[],!1,c,null,null);e.a=l.exports},function(t,e,n){"use strict";n.d(e,"a",function(){return g}),n.d(e,"e",function(){return b}),n.d(e,"f",function(){return x}),n.d(e,"b",function(){return C}),n.d(e,"c",function(){return S}),n.d(e,"d",function(){return j});var i=n(1),o=n.n(i),r=n(7),s=n.n(r),a=n(27),c=n.n(a),l=n(10),u=n.n(l),d=n(14),p=n(9),f=n(29);function h(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}function m(t){for(var e=1;e1&&void 0!==arguments[1]?arguments[1]:f.b,n=[t],i=e[t];i;)n.unshift(i),i=e[i];return n},b=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t,n=arguments.length>2?arguments[2]:void 0,i=arguments.length>3?arguments[3]:void 0,o=arguments.length>4?arguments[4]:void 0;return v(t).map(function(r){return[r===t?i[e]:i[r],r===t?o[n]||1:o[r]]})},w=function(t,e){var n=e[t];if("string"==typeof n&&n.startsWith("--"))return[n.substring(2)];if(null===n)return[];var i=n.depends,o=n.layer,r=n.variant,s=o?v(o).map(function(t){return t===o?r||o:t}):[];return Array.isArray(i)?[].concat(u()(i),u()(s)):u()(s)},_=function(t){return"object"===c()(t)?t:{depends:t.startsWith("--")?[t.substring(2)]:[],default:t.startsWith("#")?t:void 0}},x=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:f.c,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:w,i=_(e[t]);if(null!==i.opacity){if(i.opacity)return i.opacity;return i.depends?function i(o){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[t],s=n(o,e)[0];if(void 0!==s){var a=e[s];if(void 0!==a)return a.opacity||null===a?a.opacity:a.depends&&r.includes(s)?i(s,[].concat(u()(r),[s])):null}}(t):void 0}},y=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:f.c,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:w,i=_(e[t]);if(f.b[t])return t;if(null!==i.layer){if(i.layer)return i.layer;return i.depends?function i(o){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[t],s=n(o,e)[0];if(void 0!==s){var a=e[s];if(void 0!==a)return a.layer||null===a?a.layer:a.depends?i(a,[].concat(u()(r),[s])):null}}(t):void 0}},k=function(){for(var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:f.c,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:w,n=Object.keys(t),i=new Set(n),o=new Set,r=new Set,s=u()(n),a=[],c=function n(s){if(i.has(s))i.delete(s),o.add(s),e(s,t).forEach(n),o.delete(s),r.add(s),a.push(s);else if(o.has(s))console.debug("Cyclic depenency in topoSort, ignoring"),a.push(s);else if(!r.has(s))throw new Error("Unintended condition in topoSort!")};s.length>0;)c(s.pop());return a.map(function(t,e){return{data:t,index:e}}).sort(function(n,i){var o=n.data,r=n.index,s=i.data,a=i.index,c=e(o,t).length,l=e(s,t).length;return c===l||0!==l&&0!==c?r-a:0===c&&0!==l?-1:0===l&&0!==c?1:void 0}).map(function(t){return t.data})}(Object.entries(f.c).sort(function(t,e){var n=s()(t,2),i=(n[0],n[1]),o=s()(e,2),r=(o[0],o[1]);return(i&&i.priority||0)-(r&&r.priority||0)}).reduce(function(t,e){var n=s()(e,2),i=n[0],r=n[1];return m({},t,o()({},i,r))},{})),C=Object.entries(f.c).reduce(function(t,e){var n=s()(e,2),i=n[0],r=(n[1],x(i,f.c,w));return r?m({},t,o()({},r,{defaultValue:f.a[r]||1,affectedSlots:[].concat(u()(t[r]&&t[r].affectedSlots||[]),[i])})):t},{}),S=function(t,e,n){if("string"!=typeof t||!t.startsWith("--"))return t;var i=null,o=t.split(/,/g).map(function(t){return t.trim()}),r=s()(o,2),a=r[0],c=r[1];return i=e(a.substring(2)),c&&(i=Object(d.brightness)(Number.parseFloat(c)*n,i).rgb),i},j=function(t,e){return k.reduce(function(n,i){var r=n.colors,s=n.opacity,a=t[i],c=_(f.c[i]),l=w(i,f.c),h=!!c.textColor,g=c.variant||c.layer,v=null;v=h?Object(p.b)(m({},r[l[0]]||Object(d.convert)(t[i]||"#FF00FF").rgb),b(y(i)||"bg",g||"bg",x(g),r,s)):g&&g!==i?r[g]||Object(d.convert)(t[g]).rgb:r.bg||Object(d.convert)(t.bg);var k=Object(p.h)(v)<.5?1:-1,j=null;if(a){var O=a;if("transparent"===O){var P=b(y(i),i,x(i)||i,r,s).slice(0,-1);O=m({},Object(p.b)(Object(d.convert)("#FF00FF").rgb,P),{a:0})}else"string"==typeof a&&a.startsWith("--")?O=S(a,function(e){return r[e]||t[e]},k):"string"==typeof a&&a.startsWith("#")&&(O=Object(d.convert)(O).rgb);j=m({},O)}else if(c.default)j=Object(d.convert)(c.default).rgb;else{var $=c.color||function(t,e){return m({},e)};if(c.textColor)if("bw"===c.textColor)j=Object(d.contrastRatio)(v).rgb;else{var T=m({},r[l[0]]);c.color&&(T=$.apply(void 0,[k].concat(u()(l.map(function(t){return m({},r[t])}))))),j=Object(p.e)(v,m({},T),"preserve"===c.textColor)}else j=$.apply(void 0,[k].concat(u()(l.map(function(t){return m({},r[t])}))))}if(!j)throw new Error("Couldn't generate color for "+i);var I=c.opacity||x(i),E=c.opacity;if(null===E)j.a=1;else if("transparent"===a)j.a=0;else{var M=E&&void 0!==e[I],U=l[0],F=U&&r[U];E||!F||c.textColor||null===E?F||I?F&&0===F.a?j.a=0:j.a=Number(M?e[I]:(C[I]||{}).defaultValue):delete j.a:j.a=F.a}return(Number.isNaN(j.a)||void 0===j.a)&&(j.a=1),I?{colors:m({},r,o()({},i,j)),opacity:m({},s,o()({},I,j.a))}:{colors:m({},r,o()({},i,j)),opacity:s}},{colors:{},opacity:{}})}},,,function(t,e,n){"use strict";var i=n(3),o=n.n(i),r=n(1),s=n.n(r),a=n(10),c=n.n(a),l=n(41),u=n.n(l),d=n(106),p=n.n(d),f=n(15),h=n.n(f),m=n(189),g=n.n(m),v=n(61),b=n(134),w={data:function(){return{uploadCount:0,uploadReady:!0}},computed:{uploading:function(){return this.uploadCount>0}},methods:{uploadFile:function(t){var e=this,n=this.$store;if(t.size>n.state.instance.uploadlimit){var i=b.a.fileSizeFormat(t.size),o=b.a.fileSizeFormat(n.state.instance.uploadlimit);e.$emit("upload-failed","file_too_big",{filesize:i.num,filesizeunit:i.unit,allowedsize:o.num,allowedsizeunit:o.unit})}else{var r=new FormData;r.append("file",t),e.$emit("uploading"),e.uploadCount++,v.a.uploadMedia({store:n,formData:r}).then(function(t){e.$emit("uploaded",t),e.decreaseUploadCount()},function(t){e.$emit("upload-failed","default"),e.decreaseUploadCount()})}},decreaseUploadCount:function(){this.uploadCount--,0===this.uploadCount&&this.$emit("all-uploaded")},clearFile:function(){var t=this;this.uploadReady=!1,this.$nextTick(function(){t.uploadReady=!0})},multiUpload:function(t){var e=!0,n=!1,i=void 0;try{for(var o,r=t[Symbol.iterator]();!(e=(o=r.next()).done);e=!0){var s=o.value;this.uploadFile(s)}}catch(t){n=!0,i=t}finally{try{e||null==r.return||r.return()}finally{if(n)throw i}}},change:function(t){var e=t.target;this.multiUpload(e.files)}},props:["dropFiles","disabled"],watch:{dropFiles:function(t){this.uploading||this.multiUpload(t)}}},_=n(0);var x=function(t){n(389)},y=Object(_.a)(w,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"media-upload",class:{disabled:t.disabled}},[n("label",{staticClass:"label",attrs:{title:t.$t("tool_tip.media_upload")}},[t.uploading?n("i",{staticClass:"progress-icon icon-spin4 animate-spin"}):t._e(),t._v(" "),t.uploading?t._e():n("i",{staticClass:"new-icon icon-upload"}),t._v(" "),t.uploadReady?n("input",{staticStyle:{position:"fixed",top:"-100em"},attrs:{disabled:t.disabled,type:"file",multiple:"true"},on:{change:t.change}}):t._e()])])},[],!1,x,null,null).exports,k=n(196),C=n(195),S=n(77),j=n.n(S),O=n(35),P={name:"PollForm",props:["visible"],data:function(){return{pollType:"single",options:["",""],expiryAmount:10,expiryUnit:"minutes"}},computed:{pollLimits:function(){return this.$store.state.instance.pollLimits},maxOptions:function(){return this.pollLimits.max_options},maxLength:function(){return this.pollLimits.max_option_chars},expiryUnits:function(){var t=this,e=this.convertExpiryFromUnit;return["minutes","hours","days"].filter(function(n){return t.pollLimits.max_expiration>=e(n,1)})},minExpirationInCurrentUnit:function(){return Math.ceil(this.convertExpiryToUnit(this.expiryUnit,this.pollLimits.min_expiration))},maxExpirationInCurrentUnit:function(){return Math.floor(this.convertExpiryToUnit(this.expiryUnit,this.pollLimits.max_expiration))}},methods:{clear:function(){this.pollType="single",this.options=["",""],this.expiryAmount=10,this.expiryUnit="minutes"},nextOption:function(t){var e=this.$el.querySelector("#poll-".concat(t+1));e?e.focus():this.addOption()&&this.$nextTick(function(){this.nextOption(t)})},addOption:function(){return this.options.length2&&(this.options.splice(t,1),this.updatePollToParent())},convertExpiryToUnit:function(t,e){switch(t){case"minutes":return 1e3*e/O.c;case"hours":return 1e3*e/O.b;case"days":return 1e3*e/O.a}},convertExpiryFromUnit:function(t,e){switch(t){case"minutes":return.001*e*O.c;case"hours":return.001*e*O.b;case"days":return.001*e*O.a}},expiryAmountChange:function(){this.expiryAmount=Math.max(this.minExpirationInCurrentUnit,this.expiryAmount),this.expiryAmount=Math.min(this.maxExpirationInCurrentUnit,this.expiryAmount),this.updatePollToParent()},updatePollToParent:function(){var t=this.convertExpiryFromUnit(this.expiryUnit,this.expiryAmount),e=j()(this.options.filter(function(t){return""!==t}));e.length<2?this.$emit("update-poll",{error:this.$t("polls.not_enough_options")}):this.$emit("update-poll",{options:e,multiple:"multiple"===this.pollType,expiresIn:t})}}};var $=function(t){n(399)},T=Object(_.a)(P,function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.visible?n("div",{staticClass:"poll-form"},[t._l(t.options,function(e,i){return n("div",{key:i,staticClass:"poll-option"},[n("div",{staticClass:"input-container"},[n("input",{directives:[{name:"model",rawName:"v-model",value:t.options[i],expression:"options[index]"}],staticClass:"poll-option-input",attrs:{id:"poll-"+i,type:"text",placeholder:t.$t("polls.option"),maxlength:t.maxLength},domProps:{value:t.options[i]},on:{change:t.updatePollToParent,keydown:function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"enter",13,e.key,"Enter")?null:(e.stopPropagation(),e.preventDefault(),t.nextOption(i))},input:function(e){e.target.composing||t.$set(t.options,i,e.target.value)}}})]),t._v(" "),t.options.length>2?n("div",{staticClass:"icon-container"},[n("i",{staticClass:"icon-cancel",on:{click:function(e){return t.deleteOption(i)}}})]):t._e()])}),t._v(" "),t.options.length0?s.join(" ")+" ":""}({user:this.repliedUser,attentions:this.attentions},n)}var i=this.copyMessageScope&&e||"direct"===this.copyMessageScope?this.copyMessageScope:this.$store.state.users.currentUser.default_scope,o=this.$store.getters.mergedConfig.postContentType;return{dropFiles:[],uploadingFiles:!1,error:null,posting:!1,highlighted:0,newStatus:{spoilerText:this.subject||"",status:t,nsfw:!1,files:[],poll:{},mediaDescriptions:{},visibility:i,contentType:o},caret:0,pollFormVisible:!1,showDropIcon:"hide",dropStopTimeout:null,preview:null,previewLoading:!1,emojiInputShown:!1,idempotencyKey:""}},computed:function(t){for(var e=1;e0},charactersLeft:function(){return this.statusLengthLimit-(this.statusLength+this.spoilerTextLength)},isOverLengthLimit:function(){return this.hasStatusLengthLimit&&this.charactersLeft<0},minimalScopesMode:function(){return this.$store.state.instance.minimalScopesMode},alwaysShowSubject:function(){return this.mergedConfig.alwaysShowSubjectInput},postFormats:function(){return this.$store.state.instance.postFormats||[]},safeDMEnabled:function(){return this.$store.state.instance.safeDM},pollsAvailable:function(){return this.$store.state.instance.pollsAvailable&&this.$store.state.instance.pollLimits.max_options>=2&&!0!==this.disablePolls},hideScopeNotice:function(){return this.disableNotice||this.$store.getters.mergedConfig.hideScopeNotice},pollContentError:function(){return this.pollFormVisible&&this.newStatus.poll&&this.newStatus.poll.error},showPreview:function(){return!this.disablePreview&&(!!this.preview||this.previewLoading)},emptyStatus:function(){return""===this.newStatus.status.trim()&&0===this.newStatus.files.length},uploadFileLimitReached:function(){return this.newStatus.files.length>=this.fileLimit}},Object(D.c)(["mergedConfig"]),{},Object(D.e)({mobileLayout:function(t){return t.interface.mobileLayout}})),watch:{newStatus:{deep:!0,handler:function(){this.statusChanged()}}},methods:{statusChanged:function(){this.autoPreview(),this.updateIdempotencyKey()},clearStatus:function(){var t=this,e=this.newStatus;this.newStatus={status:"",spoilerText:"",files:[],visibility:e.visibility,contentType:e.contentType,poll:{},mediaDescriptions:{}},this.pollFormVisible=!1,this.$refs.mediaUpload&&this.$refs.mediaUpload.clearFile(),this.clearPollForm(),this.preserveFocus&&this.$nextTick(function(){t.$refs.textarea.focus()});var n=this.$el.querySelector("textarea");n.style.height="auto",n.style.height=void 0,this.error=null,this.preview&&this.previewStatus()},postStatus:function(t,e){var n,i,r=this,s=arguments;return o.a.async(function(a){for(;;)switch(a.prev=a.next){case 0:if(s.length>2&&void 0!==s[2]?s[2]:{},!this.posting){a.next=3;break}return a.abrupt("return");case 3:if(!this.disableSubmit){a.next=5;break}return a.abrupt("return");case 5:if(!this.emojiInputShown){a.next=7;break}return a.abrupt("return");case 7:if(this.submitOnEnter&&(t.stopPropagation(),t.preventDefault()),!this.emptyStatus){a.next=11;break}return this.error=this.$t("post_status.empty_status_error"),a.abrupt("return");case 11:if(n=this.pollFormVisible?this.newStatus.poll:{},!this.pollContentError){a.next=15;break}return this.error=this.pollContentError,a.abrupt("return");case 15:return this.posting=!0,a.prev=16,a.next=19,o.a.awrap(this.setAllMediaDescriptions());case 19:a.next=26;break;case 21:return a.prev=21,a.t0=a.catch(16),this.error=this.$t("post_status.media_description_error"),this.posting=!1,a.abrupt("return");case 26:i={status:e.status,spoilerText:e.spoilerText||null,visibility:e.visibility,sensitive:e.nsfw,media:e.files,store:this.$store,inReplyToStatusId:this.replyTo,contentType:e.contentType,poll:n,idempotencyKey:this.idempotencyKey},(this.postHandler?this.postHandler:v.a.postStatus)(i).then(function(t){t.error?r.error=t.error:(r.clearStatus(),r.$emit("posted",t)),r.posting=!1});case 29:case"end":return a.stop()}},null,this,[[16,21]])},previewStatus:function(){var t=this;if(this.emptyStatus&&""===this.newStatus.spoilerText.trim())return this.preview={error:this.$t("post_status.preview_empty")},void(this.previewLoading=!1);var e=this.newStatus;this.previewLoading=!0,v.a.postStatus({status:e.status,spoilerText:e.spoilerText||null,visibility:e.visibility,sensitive:e.nsfw,media:[],store:this.$store,inReplyToStatusId:this.replyTo,contentType:e.contentType,poll:{},preview:!0}).then(function(e){t.previewLoading&&(e.error?t.preview={error:e.error}:t.preview=e)}).catch(function(e){t.preview={error:e}}).finally(function(){t.previewLoading=!1})},debouncePreviewStatus:u()(function(){this.previewStatus()},500),autoPreview:function(){this.preview&&(this.previewLoading=!0,this.debouncePreviewStatus())},closePreview:function(){this.preview=null,this.previewLoading=!1},togglePreview:function(){this.showPreview?this.closePreview():this.previewStatus()},addMediaFile:function(t){this.newStatus.files.push(t),this.$emit("resize",{delayed:!0})},removeMediaFile:function(t){var e=this.newStatus.files.indexOf(t);this.newStatus.files.splice(e,1),this.$emit("resize")},uploadFailed:function(t,e){e=e||{},this.error=this.$t("upload.error.base")+" "+this.$t("upload.error."+t,e)},startedUploadingFiles:function(){this.uploadingFiles=!0},finishedUploadingFiles:function(){this.$emit("resize"),this.uploadingFiles=!1},type:function(t){return M.a.fileType(t.mimetype)},paste:function(t){this.autoPreview(),this.resize(t),t.clipboardData.files.length>0&&(t.preventDefault(),this.dropFiles=[t.clipboardData.files[0]])},fileDrop:function(t){t.dataTransfer&&t.dataTransfer.types.includes("Files")&&(t.preventDefault(),this.dropFiles=t.dataTransfer.files,clearTimeout(this.dropStopTimeout),this.showDropIcon="hide")},fileDragStop:function(t){var e=this;clearTimeout(this.dropStopTimeout),this.showDropIcon="fade",this.dropStopTimeout=setTimeout(function(){return e.showDropIcon="hide"},500)},fileDrag:function(t){t.dataTransfer.dropEffect=this.uploadFileLimitReached?"none":"copy",t.dataTransfer&&t.dataTransfer.types.includes("Files")&&(clearTimeout(this.dropStopTimeout),this.showDropIcon="show")},onEmojiInputInput:function(t){var e=this;this.$nextTick(function(){e.resize(e.$refs.textarea)})},resize:function(t){var e=t.target||t;if(e instanceof window.Element){if(""===e.value)return e.style.height=null,this.$emit("resize"),void this.$refs["emoji-input"].resize();var n=this.$refs.form,i=this.$refs.bottom,o=window.getComputedStyle(i)["padding-bottom"],r=R(o),s=this.$el.closest(".sidebar-scroller")||this.$el.closest(".post-form-modal-view")||window,a=window.getComputedStyle(e)["padding-top"],c=window.getComputedStyle(e)["padding-bottom"],l=R(a)+R(c),u=R(e.style.height),d=s===window?s.scrollY:s.scrollTop,p=s===window?s.innerHeight:s.offsetHeight,f=d+p;e.style.height="auto";var h=Math.floor(e.scrollHeight-l),m=this.maxHeight?Math.min(h,this.maxHeight):h;Math.abs(m-u)<=1&&(m=u),e.style.height="".concat(m,"px"),this.$emit("resize",m);var g=i.offsetHeight+Object(U.a)(i,s).top+r,v=f1?n("div",{staticClass:"text-format"},[n("label",{staticClass:"select",attrs:{for:"post-content-type"}},[n("select",{directives:[{name:"model",rawName:"v-model",value:t.newStatus.contentType,expression:"newStatus.contentType"}],staticClass:"form-control",attrs:{id:"post-content-type"},on:{change:function(e){var n=Array.prototype.filter.call(e.target.options,function(t){return t.selected}).map(function(t){return"_value"in t?t._value:t.value});t.$set(t.newStatus,"contentType",e.target.multiple?n:n[0])}}},t._l(t.postFormats,function(e){return n("option",{key:e,domProps:{value:e}},[t._v("\n "+t._s(t.$t('post_status.content_type["'+e+'"]'))+"\n ")])}),0),t._v(" "),n("i",{staticClass:"icon-down-open"})])]):t._e(),t._v(" "),1===t.postFormats.length&&"text/plain"!==t.postFormats[0]?n("div",{staticClass:"text-format"},[n("span",{staticClass:"only-format"},[t._v("\n "+t._s(t.$t('post_status.content_type["'+t.postFormats[0]+'"]'))+"\n ")])]):t._e()],1)],1),t._v(" "),t.pollsAvailable?n("poll-form",{ref:"pollForm",attrs:{visible:t.pollFormVisible},on:{"update-poll":t.setPoll}}):t._e(),t._v(" "),n("div",{ref:"bottom",staticClass:"form-bottom"},[n("div",{staticClass:"form-bottom-left"},[n("media-upload",{ref:"mediaUpload",staticClass:"media-upload-icon",attrs:{"drop-files":t.dropFiles,disabled:t.uploadFileLimitReached},on:{uploading:t.startedUploadingFiles,uploaded:t.addMediaFile,"upload-failed":t.uploadFailed,"all-uploaded":t.finishedUploadingFiles}}),t._v(" "),n("div",{staticClass:"emoji-icon"},[n("i",{staticClass:"icon-smile btn btn-default",attrs:{title:t.$t("emoji.add_emoji")},on:{click:t.showEmojiPicker}})]),t._v(" "),t.pollsAvailable?n("div",{staticClass:"poll-icon",class:{selected:t.pollFormVisible}},[n("i",{staticClass:"icon-chart-bar btn btn-default",attrs:{title:t.$t("polls.add_poll")},on:{click:t.togglePollForm}})]):t._e()],1),t._v(" "),t.posting?n("button",{staticClass:"btn btn-default",attrs:{disabled:""}},[t._v("\n "+t._s(t.$t("post_status.posting"))+"\n ")]):t.isOverLengthLimit?n("button",{staticClass:"btn btn-default",attrs:{disabled:""}},[t._v("\n "+t._s(t.$t("general.submit"))+"\n ")]):n("button",{staticClass:"btn btn-default",attrs:{disabled:t.uploadingFiles||t.disableSubmit},on:{touchstart:function(e){return e.stopPropagation(),e.preventDefault(),t.postStatus(e,t.newStatus)},click:function(e){return e.stopPropagation(),e.preventDefault(),t.postStatus(e,t.newStatus)}}},[t._v("\n "+t._s(t.$t("general.submit"))+"\n ")])]),t._v(" "),t.error?n("div",{staticClass:"alert error"},[t._v("\n Error: "+t._s(t.error)+"\n "),n("i",{staticClass:"button-icon icon-cancel",on:{click:t.clearError}})]):t._e(),t._v(" "),n("div",{staticClass:"attachments"},t._l(t.newStatus.files,function(e){return n("div",{key:e.url,staticClass:"media-upload-wrapper"},[n("i",{staticClass:"fa button-icon icon-cancel",on:{click:function(n){return t.removeMediaFile(e)}}}),t._v(" "),n("attachment",{attrs:{attachment:e,"set-media":function(){return t.$store.dispatch("setMedia",t.newStatus.files)},size:"small","allow-play":"false"}}),t._v(" "),n("input",{directives:[{name:"model",rawName:"v-model",value:t.newStatus.mediaDescriptions[e.id],expression:"newStatus.mediaDescriptions[file.id]"}],attrs:{type:"text",placeholder:t.$t("post_status.media_description")},domProps:{value:t.newStatus.mediaDescriptions[e.id]},on:{keydown:function(e){if(!e.type.indexOf("key")&&t._k(e.keyCode,"enter",13,e.key,"Enter"))return null;e.preventDefault()},input:function(n){n.target.composing||t.$set(t.newStatus.mediaDescriptions,e.id,n.target.value)}}})],1)}),0),t._v(" "),t.newStatus.files.length>0&&!t.disableSensitivityCheckbox?n("div",{staticClass:"upload_settings"},[n("Checkbox",{model:{value:t.newStatus.nsfw,callback:function(e){t.$set(t.newStatus,"nsfw",e)},expression:"newStatus.nsfw"}},[t._v("\n "+t._s(t.$t("post_status.attachments_sensitive"))+"\n ")])],1):t._e()],1)])},[],!1,B,null,null);e.a=z.exports},function(t,e,n){"use strict";var i=n(1),o=n.n(i),r=n(62),s=n(110),a=n(216),c=n.n(a),l=n(21),u=n(2);function d(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}var p={props:["attachment","nsfw","size","allowPlay","setMedia","naturalSizeLoad"],data:function(){return{nsfwImage:this.$store.state.instance.nsfwCensorImage||c.a,hideNsfwLocal:this.$store.getters.mergedConfig.hideNsfw,preloadImage:this.$store.getters.mergedConfig.preloadImage,loading:!1,img:"image"===l.a.fileType(this.attachment.mimetype)&&document.createElement("img"),modalOpen:!1,showHidden:!1}},components:{StillImage:r.a,VideoAttachment:s.a},computed:function(t){for(var e=1;e2&&void 0!==arguments[2]?arguments[2]:{},r=i.top,s=void 0===r?0:r,a=i.left,c=void 0===a?0:a,l=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],u={top:s+e.offsetTop,left:c+e.offsetLeft};if(!l&&e!==window){var d=o(e),p=d.topPadding,f=d.leftPadding;u.top+=l?0:p,u.left+=l?0:f}if(e.offsetParent&&(n===window||n.contains(e.offsetParent)||n===e.offsetParent))return t(e.offsetParent,n,u,!1);if(n!==window){var h=o(n),m=h.topPadding,g=h.leftPadding;u.top+=m,u.left+=g}return u},o=function(t){var e=window.getComputedStyle(t)["padding-top"],n=Number(e.substring(0,e.length-2)),i=window.getComputedStyle(t)["padding-left"];return{topPadding:n,leftPadding:Number(i.substring(0,i.length-2))}}},,function(t,e,n){"use strict";var i=n(7),o=n.n(i),r=function(t,e){return new Promise(function(n,i){e.state.api.backendInteractor.followUser({id:t}).then(function(t){if(e.commit("updateUserRelationship",[t]),!(t.following||t.locked&&t.requested))return function t(e,n,i){return new Promise(function(t,o){setTimeout(function(){i.state.api.backendInteractor.fetchUserRelationship({id:n}).then(function(t){return i.commit("updateUserRelationship",[t]),t}).then(function(n){return t([n.following,n.requested,n.locked,e])}).catch(function(t){return o(t)})},500)}).then(function(e){var r=o()(e,4),s=r[0],a=r[1],c=r[2],l=r[3];s||c&&a||!(l<=3)||t(++l,n,i)})}(1,t,e).then(function(){n()});n()})})},s={props:["relationship","labelFollowing","buttonClass"],data:function(){return{inProgress:!1}},computed:{isPressed:function(){return this.inProgress||this.relationship.following},title:function(){return this.inProgress||this.relationship.following?this.$t("user_card.follow_unfollow"):this.relationship.requested?this.$t("user_card.follow_again"):this.$t("user_card.follow")},label:function(){return this.inProgress?this.$t("user_card.follow_progress"):this.relationship.following?this.labelFollowing||this.$t("user_card.following"):this.relationship.requested?this.$t("user_card.follow_sent"):this.$t("user_card.follow")}},methods:{onClick:function(){this.relationship.following?this.unfollow():this.follow()},follow:function(){var t=this;this.inProgress=!0,r(this.relationship.id,this.$store).then(function(){t.inProgress=!1})},unfollow:function(){var t=this,e=this.$store;this.inProgress=!0,function(t,e){return new Promise(function(n,i){e.state.api.backendInteractor.unfollowUser({id:t}).then(function(t){e.commit("updateUserRelationship",[t]),n({updated:t})})})}(this.relationship.id,e).then(function(){t.inProgress=!1,e.commit("removeStatus",{timeline:"friends",userId:t.relationship.id})})}}},a=n(0),c=Object(a.a)(s,function(){var t=this.$createElement;return(this._self._c||t)("button",{staticClass:"btn btn-default follow-button",class:{toggled:this.isPressed},attrs:{disabled:this.inProgress,title:this.title},on:{click:this.onClick}},[this._v("\n "+this._s(this.label)+"\n")])},[],!1,null,null,null);e.a=c.exports},function(t,e,n){"use strict";var i={props:["attachment","controls"],data:function(){return{loopVideo:this.$store.getters.mergedConfig.loopVideo}},methods:{onVideoDataLoad:function(t){var e=t.srcElement||t.target;void 0!==e.webkitAudioDecodedByteCount?e.webkitAudioDecodedByteCount>0&&(this.loopVideo=this.loopVideo&&!this.$store.getters.mergedConfig.loopVideoSilentOnly):void 0!==e.mozHasAudio?e.mozHasAudio&&(this.loopVideo=this.loopVideo&&!this.$store.getters.mergedConfig.loopVideoSilentOnly):void 0!==e.audioTracks&&e.audioTracks.length>0&&(this.loopVideo=this.loopVideo&&!this.$store.getters.mergedConfig.loopVideoSilentOnly)}}},o=n(0),r=Object(o.a)(i,function(){var t=this.$createElement;return(this._self._c||t)("video",{staticClass:"video",attrs:{src:this.attachment.url,loop:this.loopVideo,controls:this.controls,alt:this.attachment.description,title:this.attachment.description,playsinline:""},on:{loadeddata:this.onVideoDataLoad}})},[],!1,null,null,null);e.a=r.exports},function(t,e,n){"use strict";var i=n(104),o=n.n(i),r=n(217),s=n.n(r),a=n(23),c=n.n(a),l=n(218),u=n.n(l),d={props:["attachments","nsfw","setMedia"],data:function(){return{sizes:{}}},components:{Attachment:n(43).a},computed:{rows:function(){if(!this.attachments)return[];var t=u()(this.attachments,3);if(1===c()(t).length&&t.length>1){var e=c()(t)[0],n=s()(t);return c()(n).push(e),n}return t},useContainFit:function(){return this.$store.getters.mergedConfig.useContainFit}},methods:{onNaturalSizeLoad:function(t,e){this.$set(this.sizes,t,e)},rowStyle:function(t){return{"padding-bottom":"".concat(100/(t+.6),"%")}},itemStyle:function(t,e){var n=this,i=o()(e,function(t){return n.getAspectRatio(t.id)});return{flex:"".concat(this.getAspectRatio(t)/i," 1 0%")}},getAspectRatio:function(t){var e=this.sizes[t];return e?e.width/e.height:1}}},p=n(0);var f=function(t){n(409)},h=Object(p.a)(d,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{ref:"galleryContainer",staticStyle:{width:"100%"}},t._l(t.rows,function(e,i){return n("div",{key:i,staticClass:"gallery-row",class:{"contain-fit":t.useContainFit,"cover-fit":!t.useContainFit},style:t.rowStyle(e.length)},[n("div",{staticClass:"gallery-row-inner"},t._l(e,function(i){return n("attachment",{key:i.id,style:t.itemStyle(i.id,e),attrs:{"set-media":t.setMedia,nsfw:t.nsfw,attachment:i,"allow-play":!1,"natural-size-load":t.onNaturalSizeLoad.bind(null,i.id)}})}),1)])}),0)},[],!1,f,null,null);e.a=h.exports},function(t,e,n){"use strict";var i={name:"LinkPreview",props:["card","size","nsfw"],data:function(){return{imageLoaded:!1}},computed:{useImage:function(){return this.card.image&&!this.nsfw&&"hide"!==this.size},useDescription:function(){return this.card.description&&/\S/.test(this.card.description)}},created:function(){var t=this;if(this.useImage){var e=new Image;e.onload=function(){t.imageLoaded=!0},e.src=this.card.image}}},o=n(0);var r=function(t){n(411)},s=Object(o.a)(i,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("a",{staticClass:"link-preview-card",attrs:{href:t.card.url,target:"_blank",rel:"noopener"}},[t.useImage&&t.imageLoaded?n("div",{staticClass:"card-image",class:{"small-image":"small"===t.size}},[n("img",{attrs:{src:t.card.image}})]):t._e(),t._v(" "),n("div",{staticClass:"card-content"},[n("span",{staticClass:"card-host faint"},[t._v(t._s(t.card.provider_name))]),t._v(" "),n("h4",{staticClass:"card-title"},[t._v(t._s(t.card.title))]),t._v(" "),t.useDescription?n("p",{staticClass:"card-description"},[t._v(t._s(t.card.description))]):t._e()])])])},[],!1,r,null,null);e.a=s.exports},function(t,e,n){"use strict";var i={props:["user"],computed:{subscribeUrl:function(){var t=new URL(this.user.statusnet_profile_url);return"".concat(t.protocol,"//").concat(t.host,"/main/ostatus")}}},o=n(0);var r=function(t){n(417)},s=Object(o.a)(i,function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"remote-follow"},[e("form",{attrs:{method:"POST",action:this.subscribeUrl}},[e("input",{attrs:{type:"hidden",name:"nickname"},domProps:{value:this.user.screen_name}}),this._v(" "),e("input",{attrs:{type:"hidden",name:"profile",value:""}}),this._v(" "),e("button",{staticClass:"remote-button",attrs:{click:"submit"}},[this._v("\n "+this._s(this.$t("user_card.remote_follow"))+"\n ")])])])},[],!1,r,null,null);e.a=s.exports},function(t,e,n){"use strict";var i=n(18),o=n(17),r={props:["users"],computed:{slicedUsers:function(){return this.users?this.users.slice(0,15):[]}},components:{UserAvatar:i.default},methods:{userProfileLink:function(t){return Object(o.a)(t.id,t.screen_name,this.$store.state.instance.restrictedNicknames)}}},s=n(0);var a=function(t){n(425)},c=Object(s.a)(r,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"avatars"},t._l(t.slicedUsers,function(e){return n("router-link",{key:e.id,staticClass:"avatars-item",attrs:{to:t.userProfileLink(e)}},[n("UserAvatar",{staticClass:"avatar-small",attrs:{user:e}})],1)}),1)},[],!1,a,null,null);e.a=c.exports},,,,,,,,,,,,,,,,,,,,function(t,e,n){"use strict";var i={fileSizeFormat:function(t){var e,n=["B","KiB","MiB","GiB","TiB"];return t<1?t+" "+n[0]:(e=Math.min(Math.floor(Math.log(t)/Math.log(1024)),n.length-1),{num:t=1*(t/Math.pow(1024,e)).toFixed(2),unit:n[e]})}};e.a=i},function(t,e,n){"use strict";var i=n(41),o=n.n(i)()(function(t,e){t.updateUsersList(e)},500);e.a=function(t){return function(e){var n=e[0];return":"===n&&t.emoji?r(t.emoji)(e):"@"===n&&t.users?s(t)(e):[]}};var r=function(t){return function(e){var n=e.toLowerCase().substr(1);return t.filter(function(t){return t.displayText.toLowerCase().match(n)}).sort(function(t,e){var i=0,o=0;return i+=t.displayText.toLowerCase()===n?200:0,o+=e.displayText.toLowerCase()===n?200:0,i+=t.imageUrl?100:0,o+=e.imageUrl?100:0,i+=t.displayText.toLowerCase().startsWith(n)?10:0,o+=e.displayText.toLowerCase().startsWith(n)?10:0,i-=t.displayText.length,(o-=e.displayText.length)-i+(t.displayText>e.displayText?.5:-.5)})}},s=function(t){return function(e){var n=e.toLowerCase().substr(1),i=t.users.filter(function(t){return t.screen_name.toLowerCase().startsWith(n)||t.name.toLowerCase().startsWith(n)}).slice(0,20).sort(function(t,e){var i=0,o=0;return i+=t.screen_name.toLowerCase().startsWith(n)?2:0,o+=e.screen_name.toLowerCase().startsWith(n)?2:0,i+=t.name.toLowerCase().startsWith(n)?1:0,10*((o+=e.name.toLowerCase().startsWith(n)?1:0)-i)+(t.name>e.name?1:-1)+(t.screen_name>e.screen_name?1:-1)}).map(function(t){var e=t.screen_name;return{displayText:e,detailText:t.name,imageUrl:t.profile_image_url_original,replacement:"@"+e+" "}});return t.updateUsersList&&o(t,n),i}}},,,,,,function(t,e,n){"use strict";var i=n(1),o=n.n(i),r=n(6),s=n.n(r),a=n(2);n(475);function c(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}e.a=s.a.component("tab-switcher",{name:"TabSwitcher",props:{renderOnlyFocused:{required:!1,type:Boolean,default:!1},onSwitch:{required:!1,type:Function,default:void 0},activeTab:{required:!1,type:String,default:void 0},scrollableTabs:{required:!1,type:Boolean,default:!1},sideTabBar:{required:!1,type:Boolean,default:!1}},data:function(){return{active:this.$slots.default.findIndex(function(t){return t.tag})}},computed:function(t){for(var e=1;e0){var i=t.pop();n.start+=i.end,n.end+=i.end,t.push(i)}return t.push(n),t},[])},h=function(t){for(var e=[],n="",i=0;ie})},addPositionToWords:f,splitByWhitespaceBoundary:h,replaceWord:function(t,e,n){return t.slice(0,e.start)+n+t.slice(e.end)}},g=n(54),v=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return t.filter(function(t){return t.displayText.includes(e)})},b={props:{enableStickerPicker:{required:!1,type:Boolean,default:!1}},data:function(){return{keyword:"",activeGroup:"custom",showingStickers:!1,groupsScrolledClass:"scrolled-top",keepOpen:!1,customEmojiBufferSlice:60,customEmojiTimeout:null,customEmojiLoadAllConfirmed:!1}},components:{StickerPicker:function(){return n.e(4).then(n.bind(null,642))},Checkbox:g.a},methods:{onStickerUploaded:function(t){this.$emit("sticker-uploaded",t)},onStickerUploadFailed:function(t){this.$emit("sticker-upload-failed",t)},onEmoji:function(t){var e=t.imageUrl?":".concat(t.displayText,":"):t.replacement;this.$emit("emoji",{insertion:e,keepOpen:this.keepOpen})},onScroll:function(t){var e=t&&t.target||this.$refs["emoji-groups"];this.updateScrolledClass(e),this.scrolledGroup(e),this.triggerLoadMore(e)},highlight:function(t){var e=this,n=this.$refs["group-"+t][0].offsetTop;this.setShowStickers(!1),this.activeGroup=t,this.$nextTick(function(){e.$refs["emoji-groups"].scrollTop=n+1})},updateScrolledClass:function(t){t.scrollTop<=5?this.groupsScrolledClass="scrolled-top":t.scrollTop>=t.scrollTopMax-5?this.groupsScrolledClass="scrolled-bottom":this.groupsScrolledClass="scrolled-middle"},triggerLoadMore:function(t){var e=this.$refs["group-end-custom"][0];if(e){var n=e.offsetTop+e.offsetHeight,i=t.scrollTop+t.clientHeight,o=t.scrollTop,r=t.scrollHeight;n0&&void 0!==arguments[0]&&arguments[0];e||(this.keyword=""),this.$nextTick(function(){t.$refs["emoji-groups"].scrollTop=0}),this.customEmojiBuffer.length===this.filteredEmoji.length&&!e||(this.customEmojiBufferSlice=60)},toggleStickers:function(){this.showingStickers=!this.showingStickers},setShowStickers:function(t){this.showingStickers=t}},watch:{keyword:function(){this.customEmojiLoadAllConfirmed=!1,this.onScroll(),this.startEmojiLoad(!0)}},computed:{activeGroupView:function(){return this.showingStickers?"":this.activeGroup},stickersAvailable:function(){return this.$store.state.instance.stickers?this.$store.state.instance.stickers.length>0:0},filteredEmoji:function(){return v(this.$store.state.instance.customEmoji||[],this.keyword)},customEmojiBuffer:function(){return this.filteredEmoji.slice(0,this.customEmojiBufferSlice)},emojis:function(){var t=this.$store.state.instance.emoji||[],e=this.customEmojiBuffer;return[{id:"custom",text:this.$t("emoji.custom"),icon:"icon-smile",emojis:e},{id:"standard",text:this.$t("emoji.unicode"),icon:"icon-picture",emojis:v(t,this.keyword)}]},emojisView:function(){return this.emojis.filter(function(t){return t.emojis.length>0})},stickerPickerEnabled:function(){return 0!==(this.$store.state.instance.stickers||[]).length}}},w=n(0);var _=function(t){n(395)},x=Object(w.a)(b,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"emoji-picker panel panel-default panel-body"},[n("div",{staticClass:"heading"},[n("span",{staticClass:"emoji-tabs"},t._l(t.emojis,function(e){return n("span",{key:e.id,staticClass:"emoji-tabs-item",class:{active:t.activeGroupView===e.id,disabled:0===e.emojis.length},attrs:{title:e.text},on:{click:function(n){return n.preventDefault(),t.highlight(e.id)}}},[n("i",{class:e.icon})])}),0),t._v(" "),t.stickerPickerEnabled?n("span",{staticClass:"additional-tabs"},[n("span",{staticClass:"stickers-tab-icon additional-tabs-item",class:{active:t.showingStickers},attrs:{title:t.$t("emoji.stickers")},on:{click:function(e){return e.preventDefault(),t.toggleStickers(e)}}},[n("i",{staticClass:"icon-star"})])]):t._e()]),t._v(" "),n("div",{staticClass:"content"},[n("div",{staticClass:"emoji-content",class:{hidden:t.showingStickers}},[n("div",{staticClass:"emoji-search"},[n("input",{directives:[{name:"model",rawName:"v-model",value:t.keyword,expression:"keyword"}],staticClass:"form-control",attrs:{type:"text",placeholder:t.$t("emoji.search_emoji")},domProps:{value:t.keyword},on:{input:function(e){e.target.composing||(t.keyword=e.target.value)}}})]),t._v(" "),n("div",{ref:"emoji-groups",staticClass:"emoji-groups",class:t.groupsScrolledClass,on:{scroll:t.onScroll}},t._l(t.emojisView,function(e){return n("div",{key:e.id,staticClass:"emoji-group"},[n("h6",{ref:"group-"+e.id,refInFor:!0,staticClass:"emoji-group-title"},[t._v("\n "+t._s(e.text)+"\n ")]),t._v(" "),t._l(e.emojis,function(i){return n("span",{key:e.id+i.displayText,staticClass:"emoji-item",attrs:{title:i.displayText},on:{click:function(e){return e.stopPropagation(),e.preventDefault(),t.onEmoji(i)}}},[i.imageUrl?n("img",{attrs:{src:i.imageUrl}}):n("span",[t._v(t._s(i.replacement))])])}),t._v(" "),n("span",{ref:"group-end-"+e.id,refInFor:!0})],2)}),0),t._v(" "),n("div",{staticClass:"keep-open"},[n("Checkbox",{model:{value:t.keepOpen,callback:function(e){t.keepOpen=e},expression:"keepOpen"}},[t._v("\n "+t._s(t.$t("emoji.keep_open"))+"\n ")])],1)]),t._v(" "),t.showingStickers?n("div",{staticClass:"stickers-content"},[n("sticker-picker",{on:{uploaded:t.onStickerUploaded,"upload-failed":t.onStickerUploadFailed}})],1):t._e()])])},[],!1,_,null,null).exports,y=n(107);function k(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}var C={props:{suggest:{required:!0,type:Function},value:{required:!0,type:String},enableEmojiPicker:{required:!1,type:Boolean,default:!1},hideEmojiButton:{required:!1,type:Boolean,default:!1},enableStickerPicker:{required:!1,type:Boolean,default:!1},placement:{required:!1,type:String,default:"auto"},newlineOnCtrlEnter:{required:!1,type:Boolean,default:!1}},data:function(){return{input:void 0,highlighted:0,caret:0,focused:!1,blurTimeout:null,showPicker:!1,temporarilyHideSuggestions:!1,keepOpen:!1,disableClickOutside:!1}},components:{EmojiPicker:x},computed:{padEmoji:function(){return this.$store.getters.mergedConfig.padEmoji},suggestions:function(){var t=this,e=this.textAtCaret.charAt(0);if(this.textAtCaret===e)return[];var n=this.suggest(this.textAtCaret);return n.length<=0?[]:c()(n,5).map(function(e,n){var i=e.imageUrl;return function(t){for(var e=1;e0&&!this.showPicker&&!this.temporarilyHideSuggestions},textAtCaret:function(){return(this.wordAtCaret||{}).word||""},wordAtCaret:function(){if(this.value&&this.caret)return m.wordAtPosition(this.value,this.caret-1)||{}}},mounted:function(){var t=this.$slots.default;if(t&&0!==t.length){var e=t.find(function(t){return["input","textarea"].includes(t.tag)});e&&(this.input=e,this.resize(),e.elm.addEventListener("blur",this.onBlur),e.elm.addEventListener("focus",this.onFocus),e.elm.addEventListener("paste",this.onPaste),e.elm.addEventListener("keyup",this.onKeyUp),e.elm.addEventListener("keydown",this.onKeyDown),e.elm.addEventListener("click",this.onClickInput),e.elm.addEventListener("transitionend",this.onTransition),e.elm.addEventListener("input",this.onInput))}},unmounted:function(){var t=this.input;t&&(t.elm.removeEventListener("blur",this.onBlur),t.elm.removeEventListener("focus",this.onFocus),t.elm.removeEventListener("paste",this.onPaste),t.elm.removeEventListener("keyup",this.onKeyUp),t.elm.removeEventListener("keydown",this.onKeyDown),t.elm.removeEventListener("click",this.onClickInput),t.elm.removeEventListener("transitionend",this.onTransition),t.elm.removeEventListener("input",this.onInput))},watch:{showSuggestions:function(t){this.$emit("shown",t)}},methods:{triggerShowPicker:function(){var t=this;this.showPicker=!0,this.$refs.picker.startEmojiLoad(),this.$nextTick(function(){t.scrollIntoView()}),this.disableClickOutside=!0,setTimeout(function(){t.disableClickOutside=!1},0)},togglePicker:function(){this.input.elm.focus(),this.showPicker=!this.showPicker,this.showPicker&&(this.scrollIntoView(),this.$refs.picker.startEmojiLoad())},replace:function(t){var e=m.replaceWord(this.value,this.wordAtCaret,t);this.$emit("input",e),this.caret=0},insert:function(t){var e=t.insertion,n=t.keepOpen,i=t.surroundingSpace,o=void 0===i||i,r=this.value.substring(0,this.caret)||"",s=this.value.substring(this.caret)||"",a=/\s/,c=o&&!a.exec(r.slice(-1))&&r.length&&this.padEmoji>0?" ":"",l=o&&!a.exec(s[0])&&this.padEmoji?" ":"",u=[r,c,e,l,s].join("");this.keepOpen=n,this.$emit("input",u);var d=this.caret+(e+l+c).length;n||this.input.elm.focus(),this.$nextTick(function(){this.input.elm.setSelectionRange(d,d),this.caret=d})},replaceText:function(t,e){var n=this.suggestions.length||0;if(1!==this.textAtCaret.length&&(n>0||e)){var i=(e||this.suggestions[this.highlighted]).replacement,o=m.replaceWord(this.value,this.wordAtCaret,i);this.$emit("input",o),this.highlighted=0;var r=this.wordAtCaret.start+i.length;this.$nextTick(function(){this.input.elm.focus(),this.input.elm.setSelectionRange(r,r),this.caret=r}),t.preventDefault()}},cycleBackward:function(t){(this.suggestions.length||0)>1?(this.highlighted-=1,this.highlighted<0&&(this.highlighted=this.suggestions.length-1),t.preventDefault()):this.highlighted=0},cycleForward:function(t){var e=this.suggestions.length||0;e>1?(this.highlighted+=1,this.highlighted>=e&&(this.highlighted=0),t.preventDefault()):this.highlighted=0},scrollIntoView:function(){var t=this,e=this.$refs.picker.$el,n=this.$el.closest(".sidebar-scroller")||this.$el.closest(".post-form-modal-view")||window,i=n===window?n.scrollY:n.scrollTop,o=i+(n===window?n.innerHeight:n.offsetHeight),r=e.offsetHeight+Object(y.a)(e,n).top,s=i+Math.max(0,r-o);n===window?n.scroll(0,s):n.scrollTop=s,this.$nextTick(function(){var e=t.input.elm.offsetHeight,n=t.$refs.picker;n.$el.getBoundingClientRect().bottom>window.innerHeight&&(n.$el.style.top="auto",n.$el.style.bottom=e+"px")})},onTransition:function(t){this.resize()},onBlur:function(t){var e=this;this.blurTimeout=setTimeout(function(){e.focused=!1,e.setCaret(t),e.resize()},200)},onClick:function(t,e){this.replaceText(t,e)},onFocus:function(t){this.blurTimeout&&(clearTimeout(this.blurTimeout),this.blurTimeout=null),this.keepOpen||(this.showPicker=!1),this.focused=!0,this.setCaret(t),this.resize(),this.temporarilyHideSuggestions=!1},onKeyUp:function(t){var e=t.key;this.setCaret(t),this.resize(),this.temporarilyHideSuggestions="Escape"===e},onPaste:function(t){this.setCaret(t),this.resize()},onKeyDown:function(t){var e=this,n=t.ctrlKey,i=t.shiftKey,o=t.key;this.newlineOnCtrlEnter&&n&&"Enter"===o&&(this.insert({insertion:"\n",surroundingSpace:!1}),t.stopPropagation(),t.preventDefault(),this.$nextTick(function(){e.input.elm.blur(),e.input.elm.focus()})),this.temporarilyHideSuggestions||("Tab"===o&&(i?this.cycleBackward(t):this.cycleForward(t)),"ArrowUp"===o?this.cycleBackward(t):"ArrowDown"===o&&this.cycleForward(t),"Enter"===o&&(n||this.replaceText(t))),"Escape"===o&&(this.temporarilyHideSuggestions||this.input.elm.focus()),this.showPicker=!1,this.resize()},onInput:function(t){this.showPicker=!1,this.setCaret(t),this.resize(),this.$emit("input",t.target.value)},onClickInput:function(t){this.showPicker=!1},onClickOutside:function(t){this.disableClickOutside||(this.showPicker=!1)},onStickerUploaded:function(t){this.showPicker=!1,this.$emit("sticker-uploaded",t)},onStickerUploadFailed:function(t){this.showPicker=!1,this.$emit("sticker-upload-Failed",t)},setCaret:function(t){var e=t.target.selectionStart;this.caret=e},resize:function(){var t=this.$refs.panel;if(t){var e=this.$refs.picker.$el,n=this.$refs["panel-body"],i=this.input.elm,o=i.offsetHeight,r=i.offsetTop+o;this.setPlacement(n,t,r),this.setPlacement(e,e,r)}},setPlacement:function(t,e,n){t&&e&&(e.style.top=n+"px",e.style.bottom="auto",("top"===this.placement||"auto"===this.placement&&this.overflowsBottom(t))&&(e.style.top="auto",e.style.bottom=this.input.elm.offsetHeight+"px"))},overflowsBottom:function(t){return t.getBoundingClientRect().bottom>window.innerHeight}}};var S=function(t){n(393)},j=Object(w.a)(C,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{directives:[{name:"click-outside",rawName:"v-click-outside",value:t.onClickOutside,expression:"onClickOutside"}],staticClass:"emoji-input",class:{"with-picker":!t.hideEmojiButton}},[t._t("default"),t._v(" "),t.enableEmojiPicker?[t.hideEmojiButton?t._e():n("div",{staticClass:"emoji-picker-icon",on:{click:function(e){return e.preventDefault(),t.togglePicker(e)}}},[n("i",{staticClass:"icon-smile"})]),t._v(" "),t.enableEmojiPicker?n("EmojiPicker",{ref:"picker",staticClass:"emoji-picker-panel",class:{hide:!t.showPicker},attrs:{"enable-sticker-picker":t.enableStickerPicker},on:{emoji:t.insert,"sticker-uploaded":t.onStickerUploaded,"sticker-upload-failed":t.onStickerUploadFailed}}):t._e()]:t._e(),t._v(" "),n("div",{ref:"panel",staticClass:"autocomplete-panel",class:{hide:!t.showSuggestions}},[n("div",{ref:"panel-body",staticClass:"autocomplete-panel-body"},t._l(t.suggestions,function(e,i){return n("div",{key:i,staticClass:"autocomplete-item",class:{highlighted:e.highlighted},on:{click:function(n){return n.stopPropagation(),n.preventDefault(),t.onClick(n,e)}}},[n("span",{staticClass:"image"},[e.img?n("img",{attrs:{src:e.img}}):n("span",[t._v(t._s(e.replacement))])]),t._v(" "),n("div",{staticClass:"label"},[n("span",{staticClass:"displayText"},[t._v(t._s(e.displayText))]),t._v(" "),n("span",{staticClass:"detailText"},[t._v(t._s(e.detailText))])])])}),0)])],2)},[],!1,S,null,null);e.a=j.exports},function(t,e,n){"use strict";var i={props:["showAll","userDefault","originalScope","initialScope","onScopeChange"],data:function(){return{currentScope:this.initialScope}},computed:{showNothing:function(){return!(this.showPublic||this.showUnlisted||this.showPrivate||this.showDirect)},showPublic:function(){return"direct"!==this.originalScope&&this.shouldShow("public")},showUnlisted:function(){return"direct"!==this.originalScope&&this.shouldShow("unlisted")},showPrivate:function(){return"direct"!==this.originalScope&&this.shouldShow("private")},showDirect:function(){return this.shouldShow("direct")},css:function(){return{public:{selected:"public"===this.currentScope},unlisted:{selected:"unlisted"===this.currentScope},private:{selected:"private"===this.currentScope},direct:{selected:"direct"===this.currentScope}}}},methods:{shouldShow:function(t){return this.showAll||this.currentScope===t||this.originalScope===t||this.userDefault===t||"direct"===t},changeVis:function(t){this.currentScope=t,this.onScopeChange&&this.onScopeChange(t)}}},o=n(0);var r=function(t){n(391)},s=Object(o.a)(i,function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.showNothing?t._e():n("div",{staticClass:"scope-selector"},[t.showDirect?n("i",{staticClass:"icon-mail-alt",class:t.css.direct,attrs:{title:t.$t("post_status.scope.direct")},on:{click:function(e){return t.changeVis("direct")}}}):t._e(),t._v(" "),t.showPrivate?n("i",{staticClass:"icon-lock",class:t.css.private,attrs:{title:t.$t("post_status.scope.private")},on:{click:function(e){return t.changeVis("private")}}}):t._e(),t._v(" "),t.showUnlisted?n("i",{staticClass:"icon-lock-open-alt",class:t.css.unlisted,attrs:{title:t.$t("post_status.scope.unlisted")},on:{click:function(e){return t.changeVis("unlisted")}}}):t._e(),t._v(" "),t.showPublic?n("i",{staticClass:"icon-globe",class:t.css.public,attrs:{title:t.$t("post_status.scope.public")},on:{click:function(e){return t.changeVis("public")}}}):t._e()])},[],!1,r,null,null);e.a=s.exports},,,,,,,,,,,,,,,,,,,,function(t,e,n){t.exports=n.p+"static/img/nsfw.74818f9.png"},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(t){t.exports={about:{mrf:{federation:"Federation",keyword:{keyword_policies:"Keyword Policies",ftl_removal:'Removal from "The Whole Known Network" Timeline',reject:"Reject",replace:"Replace",is_replaced_by:"→"},mrf_policies:"Enabled MRF Policies",mrf_policies_desc:"MRF policies manipulate the federation behaviour of the instance. The following policies are enabled:",simple:{simple_policies:"Instance-specific Policies",accept:"Accept",accept_desc:"This instance only accepts messages from the following instances:",reject:"Reject",reject_desc:"This instance will not accept messages from the following instances:",quarantine:"Quarantine",quarantine_desc:"This instance will send only public posts to the following instances:",ftl_removal:'Removal from "The Whole Known Network" Timeline',ftl_removal_desc:'This instance removes these instances from "The Whole Known Network" timeline:',media_removal:"Media Removal",media_removal_desc:"This instance removes media from posts on the following instances:",media_nsfw:"Media Force-set As Sensitive",media_nsfw_desc:"This instance forces media to be set sensitive in posts on the following instances:"}},staff:"Staff"},shoutbox:{title:"Shoutbox"},domain_mute_card:{mute:"Mute",mute_progress:"Muting…",unmute:"Unmute",unmute_progress:"Unmuting…"},exporter:{export:"Export",processing:"Processing, you'll soon be asked to download your file"},features_panel:{chat:"Chat",pleroma_chat_messages:"Pleroma Chat",gopher:"Gopher",media_proxy:"Media proxy",scope_options:"Scope options",text_limit:"Text limit",title:"Features",who_to_follow:"Who to follow"},finder:{error_fetching_user:"Error fetching user",find_user:"Find user"},general:{apply:"Apply",submit:"Submit",more:"More",loading:"Loading…",generic_error:"An error occured",error_retry:"Please try again",retry:"Try again",optional:"optional",show_more:"Show more",show_less:"Show less",dismiss:"Dismiss",cancel:"Cancel",disable:"Disable",enable:"Enable",confirm:"Confirm",verify:"Verify",close:"Close",peek:"Peek"},image_cropper:{crop_picture:"Crop picture",save:"Save",save_without_cropping:"Save without cropping",cancel:"Cancel"},importer:{submit:"Submit",success:"Imported successfully.",error:"An error occured while importing this file."},login:{login:"Log in",description:"Log in with OAuth",logout:"Log out",password:"Password",placeholder:"e.g. lain",register:"Register",username:"Username",hint:"Log in to join the discussion",authentication_code:"Authentication code",enter_recovery_code:"Enter a recovery code",enter_two_factor_code:"Enter a two-factor code",recovery_code:"Recovery code",heading:{totp:"Two-factor authentication",recovery:"Two-factor recovery"}},media_modal:{previous:"Previous",next:"Next"},nav:{about:"About",administration:"Administration",back:"Back",chat:"Local Chat",friend_requests:"Follow Requests",mentions:"Mentions",interactions:"Interactions",dms:"Direct Messages",public_tl:"Public Timeline",timeline:"Timeline",twkn:"Known Network",bookmarks:"Bookmarks",user_search:"User Search",search:"Search",who_to_follow:"Who to follow",preferences:"Preferences",timelines:"Timelines",chats:"Chats"},notifications:{broken_favorite:"Unknown status, searching for it…",favorited_you:"favorited your status",followed_you:"followed you",follow_request:"wants to follow you",load_older:"Load older notifications",notifications:"Notifications",read:"Read!",repeated_you:"repeated your status",no_more_notifications:"No more notifications",migrated_to:"migrated to",reacted_with:"reacted with {0}"},polls:{add_poll:"Add Poll",add_option:"Add Option",option:"Option",votes:"votes",vote:"Vote",type:"Poll type",single_choice:"Single choice",multiple_choices:"Multiple choices",expiry:"Poll age",expires_in:"Poll ends in {0}",expired:"Poll ended {0} ago",not_enough_options:"Too few unique options in poll"},emoji:{stickers:"Stickers",emoji:"Emoji",keep_open:"Keep picker open",search_emoji:"Search for an emoji",add_emoji:"Insert emoji",custom:"Custom emoji",unicode:"Unicode emoji",load_all_hint:"Loaded first {saneAmount} emoji, loading all emoji may cause performance issues.",load_all:"Loading all {emojiAmount} emoji"},errors:{storage_unavailable:"Pleroma could not access browser storage. Your login or your local settings won't be saved and you might encounter unexpected issues. Try enabling cookies."},interactions:{favs_repeats:"Repeats and Favorites",follows:"New follows",moves:"User migrates",load_older:"Load older interactions"},post_status:{new_status:"Post new status",account_not_locked_warning:"Your account is not {0}. Anyone can follow you to view your follower-only posts.",account_not_locked_warning_link:"locked",attachments_sensitive:"Mark attachments as sensitive",media_description:"Media description",content_type:{"text/plain":"Plain text","text/html":"HTML","text/markdown":"Markdown","text/bbcode":"BBCode"},content_warning:"Subject (optional)",default:"Just landed in L.A.",direct_warning_to_all:"This post will be visible to all the mentioned users.",direct_warning_to_first_only:"This post will only be visible to the mentioned users at the beginning of the message.",posting:"Posting",preview:"Preview",preview_empty:"Empty",empty_status_error:"Can't post an empty status with no files",media_description_error:"Failed to update media, try again",scope_notice:{public:"This post will be visible to everyone",private:"This post will be visible to your followers only",unlisted:"This post will not be visible in Public Timeline and The Whole Known Network"},scope:{direct:"Direct - Post to mentioned users only",private:"Followers-only - Post to followers only",public:"Public - Post to public timelines",unlisted:"Unlisted - Do not post to public timelines"}},registration:{bio:"Bio",email:"Email",fullname:"Display name",password_confirm:"Password confirmation",registration:"Registration",token:"Invite token",captcha:"CAPTCHA",new_captcha:"Click the image to get a new captcha",username_placeholder:"e.g. lain",fullname_placeholder:"e.g. Lain Iwakura",bio_placeholder:"e.g.\nHi, I'm Lain.\nI’m an anime girl living in suburban Japan. You may know me from the Wired.",validations:{username_required:"cannot be left blank",fullname_required:"cannot be left blank",email_required:"cannot be left blank",password_required:"cannot be left blank",password_confirmation_required:"cannot be left blank",password_confirmation_match:"should be the same as password"}},remote_user_resolver:{remote_user_resolver:"Remote user resolver",searching_for:"Searching for",error:"Not found."},selectable_list:{select_all:"Select all"},settings:{app_name:"App name",security:"Security",enter_current_password_to_confirm:"Enter your current password to confirm your identity",mfa:{otp:"OTP",setup_otp:"Setup OTP",wait_pre_setup_otp:"presetting OTP",confirm_and_enable:"Confirm & enable OTP",title:"Two-factor Authentication",generate_new_recovery_codes:"Generate new recovery codes",warning_of_generate_new_codes:"When you generate new recovery codes, your old codes won’t work anymore.",recovery_codes:"Recovery codes.",waiting_a_recovery_codes:"Receiving backup codes…",recovery_codes_warning:"Write the codes down or save them somewhere secure - otherwise you won't see them again. If you lose access to your 2FA app and recovery codes you'll be locked out of your account.",authentication_methods:"Authentication methods",scan:{title:"Scan",desc:"Using your two-factor app, scan this QR code or enter text key:",secret_code:"Key"},verify:{desc:"To enable two-factor authentication, enter the code from your two-factor app:"}},allow_following_move:"Allow auto-follow when following account moves",attachmentRadius:"Attachments",attachments:"Attachments",avatar:"Avatar",avatarAltRadius:"Avatars (Notifications)",avatarRadius:"Avatars",background:"Background",bio:"Bio",block_export:"Block export",block_export_button:"Export your blocks to a csv file",block_import:"Block import",block_import_error:"Error importing blocks",blocks_imported:"Blocks imported! Processing them will take a while.",blocks_tab:"Blocks",bot:"This is a bot account",btnRadius:"Buttons",cBlue:"Blue (Reply, follow)",cGreen:"Green (Retweet)",cOrange:"Orange (Favorite)",cRed:"Red (Cancel)",change_email:"Change Email",change_email_error:"There was an issue changing your email.",changed_email:"Email changed successfully!",change_password:"Change Password",change_password_error:"There was an issue changing your password.",changed_password:"Password changed successfully!",chatMessageRadius:"Chat message",collapse_subject:"Collapse posts with subjects",composing:"Composing",confirm_new_password:"Confirm new password",current_password:"Current password",mutes_and_blocks:"Mutes and Blocks",data_import_export_tab:"Data Import / Export",default_vis:"Default visibility scope",delete_account:"Delete Account",delete_account_description:"Permanently delete your data and deactivate your account.",delete_account_error:"There was an issue deleting your account. If this persists please contact your instance administrator.",delete_account_instructions:"Type your password in the input below to confirm account deletion.",discoverable:"Allow discovery of this account in search results and other services",domain_mutes:"Domains",avatar_size_instruction:"The recommended minimum size for avatar images is 150x150 pixels.",pad_emoji:"Pad emoji with spaces when adding from picker",emoji_reactions_on_timeline:"Show emoji reactions on timeline",export_theme:"Save preset",filtering:"Filtering",filtering_explanation:"All statuses containing these words will be muted, one per line",follow_export:"Follow export",follow_export_button:"Export your follows to a csv file",follow_import:"Follow import",follow_import_error:"Error importing followers",follows_imported:"Follows imported! Processing them will take a while.",accent:"Accent",foreground:"Foreground",general:"General",hide_attachments_in_convo:"Hide attachments in conversations",hide_attachments_in_tl:"Hide attachments in timeline",hide_muted_posts:"Hide posts of muted users",max_thumbnails:"Maximum amount of thumbnails per post",hide_isp:"Hide instance-specific panel",preload_images:"Preload images",use_one_click_nsfw:"Open NSFW attachments with just one click",hide_post_stats:"Hide post statistics (e.g. the number of favorites)",hide_user_stats:"Hide user statistics (e.g. the number of followers)",hide_filtered_statuses:"Hide filtered statuses",import_blocks_from_a_csv_file:"Import blocks from a csv file",import_followers_from_a_csv_file:"Import follows from a csv file",import_theme:"Load preset",inputRadius:"Input fields",checkboxRadius:"Checkboxes",instance_default:"(default: {value})",instance_default_simple:"(default)",interface:"Interface",interfaceLanguage:"Interface language",invalid_theme_imported:"The selected file is not a supported Pleroma theme. No changes to your theme were made.",limited_availability:"Unavailable in your browser",links:"Links",lock_account_description:"Restrict your account to approved followers only",loop_video:"Loop videos",loop_video_silent_only:'Loop only videos without sound (i.e. Mastodon\'s "gifs")',mutes_tab:"Mutes",play_videos_in_modal:"Play videos in a popup frame",profile_fields:{label:"Profile metadata",add_field:"Add Field",name:"Label",value:"Content"},use_contain_fit:"Don't crop the attachment in thumbnails",name:"Name",name_bio:"Name & Bio",new_email:"New Email",new_password:"New password",notification_visibility:"Types of notifications to show",notification_visibility_follows:"Follows",notification_visibility_likes:"Likes",notification_visibility_mentions:"Mentions",notification_visibility_repeats:"Repeats",notification_visibility_moves:"User Migrates",notification_visibility_emoji_reactions:"Reactions",no_rich_text_description:"Strip rich text formatting from all posts",no_blocks:"No blocks",no_mutes:"No mutes",hide_follows_description:"Don't show who I'm following",hide_followers_description:"Don't show who's following me",hide_follows_count_description:"Don't show follow count",hide_followers_count_description:"Don't show follower count",show_admin_badge:"Show Admin badge in my profile",show_moderator_badge:"Show Moderator badge in my profile",nsfw_clickthrough:"Enable clickthrough NSFW attachment hiding",oauth_tokens:"OAuth tokens",token:"Token",refresh_token:"Refresh Token",valid_until:"Valid Until",revoke_token:"Revoke",panelRadius:"Panels",pause_on_unfocused:"Pause streaming when tab is not focused",presets:"Presets",profile_background:"Profile Background",profile_banner:"Profile Banner",profile_tab:"Profile",radii_help:"Set up interface edge rounding (in pixels)",replies_in_timeline:"Replies in timeline",reply_visibility_all:"Show all replies",reply_visibility_following:"Only show replies directed at me or users I'm following",reply_visibility_self:"Only show replies directed at me",autohide_floating_post_button:"Automatically hide New Post button (mobile)",saving_err:"Error saving settings",saving_ok:"Settings saved",search_user_to_block:"Search whom you want to block",search_user_to_mute:"Search whom you want to mute",security_tab:"Security",scope_copy:"Copy scope when replying (DMs are always copied)",minimal_scopes_mode:"Minimize post scope selection options",set_new_avatar:"Set new avatar",set_new_profile_background:"Set new profile background",set_new_profile_banner:"Set new profile banner",reset_avatar:"Reset avatar",reset_profile_background:"Reset profile background",reset_profile_banner:"Reset profile banner",reset_avatar_confirm:"Do you really want to reset the avatar?",reset_banner_confirm:"Do you really want to reset the banner?",reset_background_confirm:"Do you really want to reset the background?",settings:"Settings",subject_input_always_show:"Always show subject field",subject_line_behavior:"Copy subject when replying",subject_line_email:'Like email: "re: subject"',subject_line_mastodon:"Like mastodon: copy as is",subject_line_noop:"Do not copy",post_status_content_type:"Post status content type",stop_gifs:"Play-on-hover GIFs",streaming:"Enable automatic streaming of new posts when scrolled to the top",user_mutes:"Users",useStreamingApi:"Receive posts and notifications real-time",useStreamingApiWarning:"(Not recommended, experimental, known to skip posts)",text:"Text",theme:"Theme",theme_help:"Use hex color codes (#rrggbb) to customize your color theme.",theme_help_v2_1:'You can also override certain component\'s colors and opacity by toggling the checkbox, use "Clear all" button to clear all overrides.',theme_help_v2_2:"Icons underneath some entries are background/text contrast indicators, hover over for detailed info. Please keep in mind that when using transparency contrast indicators show the worst possible case.",tooltipRadius:"Tooltips/alerts",type_domains_to_mute:"Search domains to mute",upload_a_photo:"Upload a photo",user_settings:"User Settings",values:{false:"no",true:"yes"},fun:"Fun",greentext:"Meme arrows",notifications:"Notifications",notification_setting_filters:"Filters",notification_setting_block_from_strangers:"Block notifications from users who you do not follow",notification_setting_privacy:"Privacy",notification_setting_hide_notification_contents:"Hide the sender and contents of push notifications",notification_mutes:"To stop receiving notifications from a specific user, use a mute.",notification_blocks:"Blocking a user stops all notifications as well as unsubscribes them.",enable_web_push_notifications:"Enable web push notifications",style:{switcher:{keep_color:"Keep colors",keep_shadows:"Keep shadows",keep_opacity:"Keep opacity",keep_roundness:"Keep roundness",keep_fonts:"Keep fonts",save_load_hint:'"Keep" options preserve currently set options when selecting or loading themes, it also stores said options when exporting a theme. When all checkboxes unset, exporting theme will save everything.',reset:"Reset",clear_all:"Clear all",clear_opacity:"Clear opacity",load_theme:"Load theme",keep_as_is:"Keep as is",use_snapshot:"Old version",use_source:"New version",help:{upgraded_from_v2:"PleromaFE has been upgraded, theme could look a little bit different than you remember.",v2_imported:"File you imported was made for older FE. We try to maximize compatibility but there still could be inconsistencies.",future_version_imported:"File you imported was made in newer version of FE.",older_version_imported:"File you imported was made in older version of FE.",snapshot_present:"Theme snapshot is loaded, so all values are overriden. You can load theme's actual data instead.",snapshot_missing:"No theme snapshot was in the file so it could look different than originally envisioned.",fe_upgraded:"PleromaFE's theme engine upgraded after version update.",fe_downgraded:"PleromaFE's version rolled back.",migration_snapshot_ok:"Just to be safe, theme snapshot loaded. You can try loading theme data.",migration_napshot_gone:"For whatever reason snapshot was missing, some stuff could look different than you remember.",snapshot_source_mismatch:"Versions conflict: most likely FE was rolled back and updated again, if you changed theme using older version of FE you most likely want to use old version, otherwise use new version."}},common:{color:"Color",opacity:"Opacity",contrast:{hint:"Contrast ratio is {ratio}, it {level} {context}",level:{aa:"meets Level AA guideline (minimal)",aaa:"meets Level AAA guideline (recommended)",bad:"doesn't meet any accessibility guidelines"},context:{"18pt":"for large (18pt+) text",text:"for text"}}},common_colors:{_tab_label:"Common",main:"Common colors",foreground_hint:'See "Advanced" tab for more detailed control',rgbo:"Icons, accents, badges"},advanced_colors:{_tab_label:"Advanced",alert:"Alert background",alert_error:"Error",alert_warning:"Warning",alert_neutral:"Neutral",post:"Posts/User bios",badge:"Badge background",popover:"Tooltips, menus, popovers",badge_notification:"Notification",panel_header:"Panel header",top_bar:"Top bar",borders:"Borders",buttons:"Buttons",inputs:"Input fields",faint_text:"Faded text",underlay:"Underlay",poll:"Poll graph",icons:"Icons",highlight:"Highlighted elements",pressed:"Pressed",selectedPost:"Selected post",selectedMenu:"Selected menu item",disabled:"Disabled",toggled:"Toggled",tabs:"Tabs",chat:{incoming:"Incoming",outgoing:"Outgoing",border:"Border"}},radii:{_tab_label:"Roundness"},shadows:{_tab_label:"Shadow and lighting",component:"Component",override:"Override",shadow_id:"Shadow #{value}",blur:"Blur",spread:"Spread",inset:"Inset",hintV3:"For shadows you can also use the {0} notation to use other color slot.",filter_hint:{always_drop_shadow:"Warning, this shadow always uses {0} when browser supports it.",drop_shadow_syntax:"{0} does not support {1} parameter and {2} keyword.",avatar_inset:"Please note that combining both inset and non-inset shadows on avatars might give unexpected results with transparent avatars.",spread_zero:"Shadows with spread > 0 will appear as if it was set to zero",inset_classic:"Inset shadows will be using {0}"},components:{panel:"Panel",panelHeader:"Panel header",topBar:"Top bar",avatar:"User avatar (in profile view)",avatarStatus:"User avatar (in post display)",popup:"Popups and tooltips",button:"Button",buttonHover:"Button (hover)",buttonPressed:"Button (pressed)",buttonPressedHover:"Button (pressed+hover)",input:"Input field"}},fonts:{_tab_label:"Fonts",help:'Select font to use for elements of UI. For "custom" you have to enter exact font name as it appears in system.',components:{interface:"Interface",input:"Input fields",post:"Post text",postCode:"Monospaced text in a post (rich text)"},family:"Font name",size:"Size (in px)",weight:"Weight (boldness)",custom:"Custom"},preview:{header:"Preview",content:"Content",error:"Example error",button:"Button",text:"A bunch of more {0} and {1}",mono:"content",input:"Just landed in L.A.",faint_link:"helpful manual",fine_print:"Read our {0} to learn nothing useful!",header_faint:"This is fine",checkbox:"I have skimmed over terms and conditions",link:"a nice lil' link"}},version:{title:"Version",backend_version:"Backend Version",frontend_version:"Frontend Version"}},time:{day:"{0} day",days:"{0} days",day_short:"{0}d",days_short:"{0}d",hour:"{0} hour",hours:"{0} hours",hour_short:"{0}h",hours_short:"{0}h",in_future:"in {0}",in_past:"{0} ago",minute:"{0} minute",minutes:"{0} minutes",minute_short:"{0}min",minutes_short:"{0}min",month:"{0} month",months:"{0} months",month_short:"{0}mo",months_short:"{0}mo",now:"just now",now_short:"now",second:"{0} second",seconds:"{0} seconds",second_short:"{0}s",seconds_short:"{0}s",week:"{0} week",weeks:"{0} weeks",week_short:"{0}w",weeks_short:"{0}w",year:"{0} year",years:"{0} years",year_short:"{0}y",years_short:"{0}y"},timeline:{collapse:"Collapse",conversation:"Conversation",error_fetching:"Error fetching updates",load_older:"Load older statuses",no_retweet_hint:"Post is marked as followers-only or direct and cannot be repeated",repeated:"repeated",show_new:"Show new",reload:"Reload",up_to_date:"Up-to-date",no_more_statuses:"No more statuses",no_statuses:"No statuses"},status:{favorites:"Favorites",repeats:"Repeats",delete:"Delete status",pin:"Pin on profile",unpin:"Unpin from profile",pinned:"Pinned",bookmark:"Bookmark",unbookmark:"Unbookmark",delete_confirm:"Do you really want to delete this status?",reply_to:"Reply to",replies_list:"Replies:",mute_conversation:"Mute conversation",unmute_conversation:"Unmute conversation",status_unavailable:"Status unavailable",copy_link:"Copy link to status",thread_muted:"Thread muted",thread_muted_and_words:", has words:",show_full_subject:"Show full subject",hide_full_subject:"Hide full subject",show_content:"Show content",hide_content:"Hide content"},user_card:{approve:"Approve",block:"Block",blocked:"Blocked!",deny:"Deny",favorites:"Favorites",follow:"Follow",follow_sent:"Request sent!",follow_progress:"Requesting…",follow_again:"Send request again?",follow_unfollow:"Unfollow",followees:"Following",followers:"Followers",following:"Following!",follows_you:"Follows you!",hidden:"Hidden",its_you:"It's you!",media:"Media",mention:"Mention",message:"Message",mute:"Mute",muted:"Muted",per_day:"per day",remote_follow:"Remote follow",report:"Report",statuses:"Statuses",subscribe:"Subscribe",unsubscribe:"Unsubscribe",unblock:"Unblock",unblock_progress:"Unblocking…",block_progress:"Blocking…",unmute:"Unmute",unmute_progress:"Unmuting…",mute_progress:"Muting…",hide_repeats:"Hide repeats",show_repeats:"Show repeats",admin_menu:{moderation:"Moderation",grant_admin:"Grant Admin",revoke_admin:"Revoke Admin",grant_moderator:"Grant Moderator",revoke_moderator:"Revoke Moderator",activate_account:"Activate account",deactivate_account:"Deactivate account",delete_account:"Delete account",force_nsfw:"Mark all posts as NSFW",strip_media:"Remove media from posts",force_unlisted:"Force posts to be unlisted",sandbox:"Force posts to be followers-only",disable_remote_subscription:"Disallow following user from remote instances",disable_any_subscription:"Disallow following user at all",quarantine:"Disallow user posts from federating",delete_user:"Delete user",delete_user_confirmation:"Are you absolutely sure? This action cannot be undone."}},user_profile:{timeline_title:"User Timeline",profile_does_not_exist:"Sorry, this profile does not exist.",profile_loading_error:"Sorry, there was an error loading this profile."},user_reporting:{title:"Reporting {0}",add_comment_description:"The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:",additional_comments:"Additional comments",forward_description:"The account is from another server. Send a copy of the report there as well?",forward_to:"Forward to {0}",submit:"Submit",generic_error:"An error occurred while processing your request."},who_to_follow:{more:"More",who_to_follow:"Who to follow"},tool_tip:{media_upload:"Upload Media",repeat:"Repeat",reply:"Reply",favorite:"Favorite",add_reaction:"Add Reaction",user_settings:"User Settings",accept_follow_request:"Accept follow request",reject_follow_request:"Reject follow request",bookmark:"Bookmark"},upload:{error:{base:"Upload failed.",file_too_big:"File too big [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]",default:"Try again later"},file_size_units:{B:"B",KiB:"KiB",MiB:"MiB",GiB:"GiB",TiB:"TiB"}},search:{people:"People",hashtags:"Hashtags",person_talking:"{count} person talking",people_talking:"{count} people talking",no_results:"No results"},password_reset:{forgot_password:"Forgot password?",password_reset:"Password reset",instruction:"Enter your email address or username. We will send you a link to reset your password.",placeholder:"Your email or username",check_email:"Check your email for a link to reset your password.",return_home:"Return to the home page",too_many_requests:"You have reached the limit of attempts, try again later.",password_reset_disabled:"Password reset is disabled. Please contact your instance administrator.",password_reset_required:"You must reset your password to log in.",password_reset_required_but_mailer_is_disabled:"You must reset your password, but password reset is disabled. Please contact your instance administrator."},chats:{you:"You:",message_user:"Message {nickname}",delete:"Delete",chats:"Chats",new:"New Chat",empty_message_error:"Cannot post empty message",more:"More",delete_confirm:"Do you really want to delete this message?",error_loading_chat:"Something went wrong when loading the chat.",error_sending_message:"Something went wrong when sending the message.",empty_chat_list_placeholder:"You don't have any chats yet. Start a new chat!"},file_type:{audio:"Audio",video:"Video",image:"Image",file:"File"},display_date:{today:"Today"}}},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(t,e,n){var i=n(369);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("0084eb3d",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".timeline .loadmore-text{opacity:1}.timeline-heading{max-width:100%;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.timeline-heading .loadmore-button,.timeline-heading .loadmore-text{-ms-flex-negative:0;flex-shrink:0}.timeline-heading .loadmore-text{line-height:1em}",""])},,,,,function(t,e,n){var i=n(375);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("80571546",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,'.Status{min-width:0}.Status:hover{--still-image-img:visible;--still-image-canvas:hidden}.Status.-focused{background-color:#151e2a;background-color:var(--selectedPost,#151e2a);color:#b9b9ba;color:var(--selectedPostText,#b9b9ba);--lightText:var(--selectedPostLightText,$fallback--light);--faint:var(--selectedPostFaintText,$fallback--faint);--faintLink:var(--selectedPostFaintLink,$fallback--faint);--postLink:var(--selectedPostPostLink,$fallback--faint);--postFaintLink:var(--selectedPostFaintPostLink,$fallback--faint);--icon:var(--selectedPostIcon,$fallback--icon)}.Status .status-container{display:-ms-flexbox;display:flex;padding:.75em}.Status .status-container.-repeat{padding-top:0}.Status .pin{padding:.75em .75em 0;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end}.Status .left-side{margin-right:.75em}.Status .right-side{-ms-flex:1;flex:1;min-width:0}.Status .usercard{margin-bottom:.75em}.Status .status-username{white-space:nowrap;font-size:14px;overflow:hidden;max-width:85%;font-weight:700;-ms-flex-negative:1;flex-shrink:1;margin-right:.4em;text-overflow:ellipsis}.Status .status-username .emoji{width:14px;height:14px;vertical-align:middle;-o-object-fit:contain;object-fit:contain}.Status .status-favicon{height:18px;width:18px;margin-right:.4em}.Status .status-heading{margin-bottom:.5em}.Status .heading-name-row{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;line-height:18px}.Status .heading-name-row a{display:inline-block;word-break:break-all}.Status .account-name{min-width:1.6em;margin-right:.4em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-ms-flex:1 1 0px;flex:1 1 0}.Status .heading-left{display:-ms-flexbox;display:flex;min-width:0}.Status .heading-right{display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0}.Status .timeago{margin-right:.2em}.Status .heading-reply-row{position:relative;-ms-flex-line-pack:baseline;align-content:baseline;font-size:12px;line-height:18px;max-width:100%;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch}.Status .reply-to-and-accountname{display:-ms-flexbox;display:flex;height:18px;margin-right:.5em;max-width:100%}.Status .reply-to-and-accountname .reply-to-link{white-space:nowrap;word-break:break-word;text-overflow:ellipsis;overflow-x:hidden}.Status .reply-to-and-accountname .icon-reply{transform:scaleX(-1)}.Status .reply-to-no-popover,.Status .reply-to-popover{min-width:0;margin-right:.4em;-ms-flex-negative:0;flex-shrink:0}.Status .reply-to-popover .reply-to:hover:before{content:"";display:block;position:absolute;bottom:0;width:100%;border-bottom:1px solid var(--faint);pointer-events:none}.Status .reply-to-popover .faint-link:hover{text-decoration:none}.Status .reply-to-popover.-strikethrough .reply-to:after{content:"";display:block;position:absolute;top:50%;width:100%;border-bottom:1px solid var(--faint);pointer-events:none}.Status .reply-to{display:-ms-flexbox;display:flex;position:relative}.Status .reply-to-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-left:.2em}.Status .replies-separator{margin-left:.4em}.Status .replies{line-height:18px;font-size:12px;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.Status .replies>*{margin-right:.4em}.Status .reply-link{height:17px}.Status .repeat-info{padding:.4em .75em;line-height:22px}.Status .repeat-info .right-side{display:-ms-flexbox;display:flex;-ms-flex-line-pack:center;align-content:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.Status .repeat-info i{padding:0 .2em}.Status .repeater-avatar{border-radius:var(--avatarAltRadius,10px);margin-left:28px;width:20px;height:20px}.Status .repeater-name{text-overflow:ellipsis;margin-right:0}.Status .repeater-name .emoji{width:14px;height:14px;vertical-align:middle;-o-object-fit:contain;object-fit:contain}.Status .status-fadein{animation-duration:.4s;animation-name:fadein}@keyframes fadein{0%{opacity:0}to{opacity:1}}.Status .status-actions{position:relative;width:100%;display:-ms-flexbox;display:flex;margin-top:.75em}.Status .status-actions>*{max-width:4em;-ms-flex:1;flex:1}.Status .button-reply:not(.-disabled){cursor:pointer}.Status .button-reply.-active,.Status .button-reply:not(.-disabled):hover{color:#0095ff;color:var(--cBlue,#0095ff)}.Status .muted{padding:.25em .6em;height:1.2em;line-height:1.2em;text-overflow:ellipsis;overflow:hidden;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.Status .muted .mute-thread,.Status .muted .mute-words,.Status .muted .status-username{word-wrap:normal;word-break:normal;white-space:nowrap}.Status .muted .mute-words,.Status .muted .status-username{text-overflow:ellipsis;overflow:hidden}.Status .muted .status-username{font-weight:400;-ms-flex:0 1 auto;flex:0 1 auto;margin-right:.2em;font-size:smaller}.Status .muted .mute-thread{-ms-flex:0 0 auto;flex:0 0 auto}.Status .muted .mute-words{-ms-flex:1 0 5em;flex:1 0 5em;margin-left:.2em}.Status .muted .mute-words:before{content:" "}.Status .muted .unmute{-ms-flex:0 0 auto;flex:0 0 auto;margin-left:auto;display:block}.Status .reply-form{padding-top:0;padding-bottom:0}.Status .reply-body{-ms-flex:1;flex:1}.Status .favs-repeated-users{margin-top:.75em}.Status .stats{width:100%;display:-ms-flexbox;display:flex;line-height:1em}.Status .avatar-row{-ms-flex:1;flex:1;overflow:hidden;position:relative;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.Status .avatar-row:before{content:"";position:absolute;height:100%;width:1px;left:0;background-color:var(--faint,hsla(240,1%,73%,.5))}.Status .stat-count{margin-right:.75em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.Status .stat-count .stat-title{color:var(--faint,hsla(240,1%,73%,.5));font-size:12px;text-transform:uppercase;position:relative}.Status .stat-count .stat-number{font-weight:bolder;font-size:16px;line-height:1em}.Status .stat-count:hover .stat-title{text-decoration:underline}@media (max-width:800px){.Status .repeater-avatar{margin-left:20px}.Status .avatar:not(.repeater-avatar){width:40px;height:40px}.Status .avatar:not(.repeater-avatar).avatar-compact{width:32px;height:32px}}',""])},,function(t,e,n){var i=n(378);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("7d4fb47f",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".fav-active{cursor:pointer;animation-duration:.6s}.fav-active:hover,.favorite-button.icon-star{color:orange;color:var(--cOrange,orange)}",""])},function(t,e,n){var i=n(380);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("b98558e8",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".reaction-picker-filter{padding:.5em;display:-ms-flexbox;display:flex}.reaction-picker-filter input{-ms-flex:1;flex:1}.reaction-picker-divider{height:1px;width:100%;margin:.5em;background-color:var(--border,#222)}.reaction-picker{width:10em;height:9em;font-size:1.5em;overflow-y:scroll;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.5em;text-align:center;-ms-flex-line-pack:start;align-content:flex-start;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-mask:linear-gradient(0deg,#fff 0,transparent) bottom no-repeat,linear-gradient(180deg,#fff 0,transparent) top no-repeat,linear-gradient(0deg,#fff,#fff);mask:linear-gradient(0deg,#fff 0,transparent) bottom no-repeat,linear-gradient(180deg,#fff 0,transparent) top no-repeat,linear-gradient(0deg,#fff,#fff);transition:-webkit-mask-size .15s;transition:mask-size .15s;transition:mask-size .15s,-webkit-mask-size .15s;-webkit-mask-size:100% 20px,100% 20px,auto;mask-size:100% 20px,100% 20px,auto;-webkit-mask-composite:xor;mask-composite:exclude}.reaction-picker .emoji-button{cursor:pointer;-ms-flex-preferred-size:20%;flex-basis:20%;line-height:1.5em;-ms-flex-line-pack:center;align-content:center}.reaction-picker .emoji-button:hover{transform:scale(1.25)}.add-reaction-button{cursor:pointer}.add-reaction-button:hover{color:#b9b9ba;color:var(--text,#b9b9ba)}",""])},function(t,e,n){var i=n(382);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("92bf6e22",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".popover{z-index:8;position:absolute;min-width:0}.popover-default{transition:opacity .3s;box-shadow:1px 1px 4px rgba(0,0,0,.6);box-shadow:var(--panelShadow);border-radius:4px;border-radius:var(--btnRadius,4px);background-color:#121a24;background-color:var(--popover,#121a24);color:#b9b9ba;color:var(--popoverText,#b9b9ba);--faint:var(--popoverFaintText,$fallback--faint);--faintLink:var(--popoverFaintLink,$fallback--faint);--lightText:var(--popoverLightText,$fallback--lightText);--postLink:var(--popoverPostLink,$fallback--link);--postFaintLink:var(--popoverPostFaintLink,$fallback--link);--icon:var(--popoverIcon,$fallback--icon)}.dropdown-menu{display:block;padding:.5rem 0;font-size:1rem;text-align:left;list-style:none;max-width:100vw;z-index:10;white-space:nowrap}.dropdown-menu .dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #222;border-top:1px solid var(--border,#222)}.dropdown-menu .dropdown-item{line-height:21px;margin-right:5px;overflow:auto;display:block;padding:.25rem 1rem .25rem 1.5rem;clear:both;font-weight:400;text-align:inherit;white-space:nowrap;border:none;border-radius:0;background-color:transparent;box-shadow:none;width:100%;height:100%;--btnText:var(--popoverText,$fallback--text)}.dropdown-menu .dropdown-item-icon{padding-left:.5rem}.dropdown-menu .dropdown-item-icon i{margin-right:.25rem;color:var(--menuPopoverIcon,#666)}.dropdown-menu .dropdown-item:active,.dropdown-menu .dropdown-item:hover{background-color:#151e2a;background-color:var(--selectedMenuPopover,#151e2a);color:#d8a070;color:var(--selectedMenuPopoverText,#d8a070);--faint:var(--selectedMenuPopoverFaintText,$fallback--faint);--faintLink:var(--selectedMenuPopoverFaintLink,$fallback--faint);--lightText:var(--selectedMenuPopoverLightText,$fallback--lightText);--icon:var(--selectedMenuPopoverIcon,$fallback--icon)}.dropdown-menu .dropdown-item:active i,.dropdown-menu .dropdown-item:hover i{color:var(--selectedMenuPopoverIcon,#666)}",""])},function(t,e,n){var i=n(384);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("2c52cbcb",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".rt-active{cursor:pointer;animation-duration:.6s}.icon-retweet.retweeted,.rt-active:hover{color:#0fa00f;color:var(--cGreen,#0fa00f)}",""])},function(t,e,n){var i=n(386);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("0d2c533c",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".icon-ellipsis{cursor:pointer}.extra-button-popover.open .icon-ellipsis,.icon-ellipsis:hover{color:#b9b9ba;color:var(--text,#b9b9ba)}",""])},function(t,e,n){var i=n(388);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("ce7966a8",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".tribute-container ul{padding:0}.tribute-container ul li{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.tribute-container img{padding:3px;width:16px;height:16px;border-radius:10px;border-radius:var(--avatarAltRadius,10px)}.post-status-form{position:relative}.post-status-form .form-bottom{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5em;height:32px}.post-status-form .form-bottom button{width:10em}.post-status-form .form-bottom p{margin:.35em;padding:.35em;display:-ms-flexbox;display:flex}.post-status-form .form-bottom-left{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;padding-right:7px;margin-right:7px;max-width:10em}.post-status-form .preview-heading{padding-left:.5em;display:-ms-flexbox;display:flex;width:100%}.post-status-form .preview-heading .icon-spin3{margin-left:auto}.post-status-form .preview-toggle{display:-ms-flexbox;display:flex;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.post-status-form .preview-toggle:hover{text-decoration:underline}.post-status-form .preview-toggle i{margin-left:.2em;font-size:.8em;transform:rotate(90deg)}.post-status-form .preview-container{margin-bottom:1em}.post-status-form .preview-error{font-style:italic;color:hsla(240,1%,73%,.5);color:var(--faint,hsla(240,1%,73%,.5))}.post-status-form .preview-status{border:1px solid #222;border:1px solid var(--border,#222);border-radius:5px;border-radius:var(--tooltipRadius,5px);padding:.5em;margin:0;line-height:1.4em}.post-status-form .text-format .only-format{color:hsla(240,1%,73%,.5);color:var(--faint,hsla(240,1%,73%,.5))}.post-status-form .visibility-tray{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding-top:5px}.post-status-form .emoji-icon,.post-status-form .media-upload-icon,.post-status-form .poll-icon{font-size:26px;-ms-flex:1;flex:1}.post-status-form .emoji-icon.selected i,.post-status-form .emoji-icon.selected label,.post-status-form .emoji-icon:hover i,.post-status-form .emoji-icon:hover label,.post-status-form .media-upload-icon.selected i,.post-status-form .media-upload-icon.selected label,.post-status-form .media-upload-icon:hover i,.post-status-form .media-upload-icon:hover label,.post-status-form .poll-icon.selected i,.post-status-form .poll-icon.selected label,.post-status-form .poll-icon:hover i,.post-status-form .poll-icon:hover label{color:#b9b9ba;color:var(--lightText,#b9b9ba)}.post-status-form .emoji-icon.disabled i,.post-status-form .media-upload-icon.disabled i,.post-status-form .poll-icon.disabled i{cursor:not-allowed;color:#666;color:var(--btnDisabledText,#666)}.post-status-form .emoji-icon.disabled i:hover,.post-status-form .media-upload-icon.disabled i:hover,.post-status-form .poll-icon.disabled i:hover{color:#666;color:var(--btnDisabledText,#666)}.post-status-form .media-upload-icon{-ms-flex-order:1;order:1;text-align:left}.post-status-form .emoji-icon{-ms-flex-order:2;order:2;text-align:center}.post-status-form .poll-icon{-ms-flex-order:3;order:3;text-align:right}.post-status-form .icon-chart-bar{cursor:pointer}.post-status-form .error{text-align:center}.post-status-form .media-upload-wrapper{margin-right:.2em;margin-bottom:.5em;width:18em}.post-status-form .media-upload-wrapper .icon-cancel{display:inline-block;position:static;margin:0;padding-bottom:0;margin-left:10px;margin-left:var(--attachmentRadius,10px);background-color:#182230;background-color:var(--btn,#182230);border-bottom-left-radius:0;border-bottom-right-radius:0}.post-status-form .media-upload-wrapper img,.post-status-form .media-upload-wrapper video{-o-object-fit:contain;object-fit:contain;max-height:10em}.post-status-form .media-upload-wrapper .video{max-height:10em}.post-status-form .media-upload-wrapper input{-ms-flex:1;flex:1;width:100%}.post-status-form .status-input-wrapper{display:-ms-flexbox;display:flex;position:relative;width:100%;-ms-flex-direction:column;flex-direction:column}.post-status-form .media-upload-wrapper .attachments{padding:0 .5em}.post-status-form .media-upload-wrapper .attachments .attachment{margin:0;padding:0;position:relative}.post-status-form .media-upload-wrapper .attachments i{position:absolute;margin:10px;padding:5px;background:hsla(0,0%,90%,.6);border-radius:10px;border-radius:var(--attachmentRadius,10px);font-weight:700}.post-status-form form{margin:.6em;position:relative}.post-status-form .form-group,.post-status-form form{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.post-status-form .form-group{padding:.25em .5em .5em;line-height:24px}.post-status-form .form-post-body,.post-status-form form textarea.form-cw{line-height:16px;resize:none;overflow:hidden;transition:min-height .2s .1s;min-height:1px}.post-status-form .form-post-body{height:16px;padding-bottom:1.75em;box-sizing:content-box}.post-status-form .form-post-body.scrollable-form{overflow-y:auto}.post-status-form .main-input{position:relative}.post-status-form .character-counter{position:absolute;bottom:0;right:0;padding:0;margin:0 .5em}.post-status-form .character-counter.error{color:red;color:var(--cRed,red)}.post-status-form .btn{cursor:pointer}.post-status-form .btn[disabled]{cursor:not-allowed}.post-status-form .icon-cancel{cursor:pointer;z-index:4}@keyframes fade-in{0%{opacity:0}to{opacity:.6}}@keyframes fade-out{0%{opacity:.6}to{opacity:0}}.post-status-form .drop-indicator{position:absolute;z-index:1;width:100%;height:100%;font-size:5em;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;opacity:.6;color:#b9b9ba;color:var(--text,#b9b9ba);background-color:#121a24;background-color:var(--bg,#121a24);border-radius:5px;border-radius:var(--tooltipRadius,5px);border:2px dashed #b9b9ba;border:2px dashed var(--text,#b9b9ba)}.media-upload-container>video,img.media-upload{line-height:0;max-height:200px;max-width:100%}",""])},function(t,e,n){var i=n(390);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("8585287c",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".media-upload .label{display:inline-block}.media-upload .new-icon{cursor:pointer}.media-upload .progress-icon{display:inline-block;line-height:0}.media-upload .progress-icon:before{margin:0;line-height:0}",""])},function(t,e,n){var i=n(392);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("770eecd8",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".scope-selector i{font-size:1.2em;cursor:pointer}.scope-selector i.selected{color:#b9b9ba;color:var(--lightText,#b9b9ba)}",""])},function(t,e,n){var i=n(394);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("d6bd964a",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".emoji-input{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;position:relative}.emoji-input.with-picker input{padding-right:30px}.emoji-input .emoji-picker-icon{position:absolute;top:0;right:0;margin:.2em .25em;font-size:16px;cursor:pointer;line-height:24px}.emoji-input .emoji-picker-icon:hover i{color:#b9b9ba;color:var(--text,#b9b9ba)}.emoji-input .emoji-picker-panel{position:absolute;z-index:20;margin-top:2px}.emoji-input .emoji-picker-panel.hide{display:none}.emoji-input .autocomplete-panel{position:absolute;z-index:20;margin-top:2px}.emoji-input .autocomplete-panel.hide{display:none}.emoji-input .autocomplete-panel-body{margin:0 .5em;border-radius:5px;border-radius:var(--tooltipRadius,5px);box-shadow:1px 2px 4px rgba(0,0,0,.5);box-shadow:var(--popupShadow);min-width:75%;background-color:#121a24;background-color:var(--popover,#121a24);color:#d8a070;color:var(--popoverText,#d8a070);--faint:var(--popoverFaintText,$fallback--faint);--faintLink:var(--popoverFaintLink,$fallback--faint);--lightText:var(--popoverLightText,$fallback--lightText);--postLink:var(--popoverPostLink,$fallback--link);--postFaintLink:var(--popoverPostFaintLink,$fallback--link);--icon:var(--popoverIcon,$fallback--icon)}.emoji-input .autocomplete-item{display:-ms-flexbox;display:flex;cursor:pointer;padding:.2em .4em;border-bottom:1px solid rgba(0,0,0,.4);height:32px}.emoji-input .autocomplete-item .image{width:32px;height:32px;line-height:32px;text-align:center;font-size:32px;margin-right:4px}.emoji-input .autocomplete-item .image img{width:32px;height:32px;-o-object-fit:contain;object-fit:contain}.emoji-input .autocomplete-item .label{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;margin:0 .1em 0 .2em}.emoji-input .autocomplete-item .label .displayText{line-height:1.5}.emoji-input .autocomplete-item .label .detailText{font-size:9px;line-height:9px}.emoji-input .autocomplete-item.highlighted{background-color:#182230;background-color:var(--selectedMenuPopover,#182230);color:var(--selectedMenuPopoverText,#b9b9ba);--faint:var(--selectedMenuPopoverFaintText,$fallback--faint);--faintLink:var(--selectedMenuPopoverFaintLink,$fallback--faint);--lightText:var(--selectedMenuPopoverLightText,$fallback--lightText);--icon:var(--selectedMenuPopoverIcon,$fallback--icon)}.emoji-input input,.emoji-input textarea{-ms-flex:1 0 auto;flex:1 0 auto}",""])},function(t,e,n){var i=n(396);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("7bb72e68",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".emoji-picker{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;position:absolute;right:0;left:0;margin:0!important;z-index:1;background-color:#121a24;background-color:var(--popover,#121a24);color:#d8a070;color:var(--popoverText,#d8a070);--lightText:var(--popoverLightText,$fallback--faint);--faint:var(--popoverFaintText,$fallback--faint);--faintLink:var(--popoverFaintLink,$fallback--faint);--lightText:var(--popoverLightText,$fallback--lightText);--icon:var(--popoverIcon,$fallback--icon)}.emoji-picker .keep-open,.emoji-picker .too-many-emoji{padding:7px;line-height:normal}.emoji-picker .too-many-emoji{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.emoji-picker .keep-open-label{padding:0 7px;display:-ms-flexbox;display:flex}.emoji-picker .heading{display:-ms-flexbox;display:flex;height:32px;padding:10px 7px 5px}.emoji-picker .content{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex:1 1 auto;flex:1 1 auto;min-height:0}.emoji-picker .emoji-tabs{-ms-flex-positive:1;flex-grow:1}.emoji-picker .emoji-groups{min-height:200px}.emoji-picker .additional-tabs{border-left:1px solid;border-left-color:#666;border-left-color:var(--icon,#666);padding-left:7px;-ms-flex:0 0 auto;flex:0 0 auto}.emoji-picker .additional-tabs,.emoji-picker .emoji-tabs{display:block;min-width:0;-ms-flex-preferred-size:auto;flex-basis:auto;-ms-flex-negative:1;flex-shrink:1}.emoji-picker .additional-tabs-item,.emoji-picker .emoji-tabs-item{padding:0 7px;cursor:pointer;font-size:24px}.emoji-picker .additional-tabs-item.disabled,.emoji-picker .emoji-tabs-item.disabled{opacity:.5;pointer-events:none}.emoji-picker .additional-tabs-item.active,.emoji-picker .emoji-tabs-item.active{border-bottom:4px solid}.emoji-picker .additional-tabs-item.active i,.emoji-picker .emoji-tabs-item.active i{color:#b9b9ba;color:var(--lightText,#b9b9ba)}.emoji-picker .sticker-picker{-ms-flex:1 1 auto;flex:1 1 auto}.emoji-picker .emoji-content,.emoji-picker .stickers-content{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex:1 1 auto;flex:1 1 auto;min-height:0}.emoji-picker .emoji-content.hidden,.emoji-picker .stickers-content.hidden{opacity:0;pointer-events:none;position:absolute}.emoji-picker .emoji-search{padding:5px;-ms-flex:0 0 auto;flex:0 0 auto}.emoji-picker .emoji-search input{width:100%}.emoji-picker .emoji-groups{-ms-flex:1 1 1px;flex:1 1 1px;position:relative;overflow:auto;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-mask:linear-gradient(0deg,#fff 0,transparent) bottom no-repeat,linear-gradient(180deg,#fff 0,transparent) top no-repeat,linear-gradient(0deg,#fff,#fff);mask:linear-gradient(0deg,#fff 0,transparent) bottom no-repeat,linear-gradient(180deg,#fff 0,transparent) top no-repeat,linear-gradient(0deg,#fff,#fff);transition:-webkit-mask-size .15s;transition:mask-size .15s;transition:mask-size .15s,-webkit-mask-size .15s;-webkit-mask-size:100% 20px,100% 20px,auto;mask-size:100% 20px,100% 20px,auto;-webkit-mask-composite:xor;mask-composite:exclude}.emoji-picker .emoji-groups.scrolled-top{-webkit-mask-size:100% 20px,100% 0,auto;mask-size:100% 20px,100% 0,auto}.emoji-picker .emoji-groups.scrolled-bottom{-webkit-mask-size:100% 0,100% 20px,auto;mask-size:100% 0,100% 20px,auto}.emoji-picker .emoji-group{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:5px;-ms-flex-pack:left;justify-content:left}.emoji-picker .emoji-group-title{font-size:12px;width:100%;margin:0}.emoji-picker .emoji-group-title.disabled{display:none}.emoji-picker .emoji-item{width:32px;height:32px;box-sizing:border-box;display:-ms-flexbox;display:flex;font-size:32px;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin:4px;cursor:pointer}.emoji-picker .emoji-item img{-o-object-fit:contain;object-fit:contain;max-width:100%;max-height:100%}",""])},function(t,e,n){var i=n(398);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("002629bb",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,'.checkbox{position:relative;display:inline-block;min-height:1.2em}.checkbox-indicator{position:relative;padding-left:1.2em}.checkbox-indicator:before{position:absolute;right:0;top:0;display:block;content:"\\2713";transition:color .2s;width:1.1em;height:1.1em;border-radius:2px;border-radius:var(--checkboxRadius,2px);box-shadow:inset 0 0 2px #000;box-shadow:var(--inputShadow);background-color:#182230;background-color:var(--input,#182230);vertical-align:top;text-align:center;line-height:1.1em;font-size:1.1em;color:transparent;overflow:hidden;box-sizing:border-box}.checkbox.disabled .checkbox-indicator:before,.checkbox.disabled .label{opacity:.5}.checkbox.disabled .label{color:hsla(240,1%,73%,.5);color:var(--faint,hsla(240,1%,73%,.5))}.checkbox input[type=checkbox]{display:none}.checkbox input[type=checkbox]:checked+.checkbox-indicator:before{color:#b9b9ba;color:var(--inputText,#b9b9ba)}.checkbox input[type=checkbox]:indeterminate+.checkbox-indicator:before{content:"\\2013";color:#b9b9ba;color:var(--inputText,#b9b9ba)}.checkbox>span{margin-left:.5em}',""])},function(t,e,n){var i=n(400);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("60db0262",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".poll-form{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding:0 .5em .5em}.poll-form .add-option{-ms-flex-item-align:start;align-self:flex-start;padding-top:.25em;cursor:pointer}.poll-form .poll-option{display:-ms-flexbox;display:flex;-ms-flex-align:baseline;align-items:baseline;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.25em}.poll-form .input-container{width:100%}.poll-form .input-container input{padding-right:2.5em;width:100%}.poll-form .icon-container{width:2em;margin-left:-2em;z-index:1}.poll-form .poll-type-expiry{margin-top:.5em;display:-ms-flexbox;display:flex;width:100%}.poll-form .poll-type{margin-right:.75em;-ms-flex:1 1 60%;flex:1 1 60%}.poll-form .poll-type .select{border:none;box-shadow:none;background-color:transparent}.poll-form .poll-expiry{display:-ms-flexbox;display:flex}.poll-form .poll-expiry .expiry-amount{width:3em;text-align:right}.poll-form .poll-expiry .expiry-unit{border:none;box-shadow:none;background-color:transparent}",""])},function(t,e,n){var i=n(402);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("60b296ca",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".attachments{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.attachments .non-gallery{max-width:100%}.attachments .placeholder{display:inline-block;padding:.3em 1em .3em 0;color:#d8a070;color:var(--postLink,#d8a070);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;max-width:100%}.attachments .nsfw-placeholder{cursor:pointer}.attachments .nsfw-placeholder.loading{cursor:progress}.attachments .attachment{position:relative;margin-top:.5em;-ms-flex-item-align:start;align-self:flex-start;line-height:0;border-radius:10px;border-radius:var(--attachmentRadius,10px);border-color:#222;border:1px solid var(--border,#222);overflow:hidden}.attachments .non-gallery.attachment.video{-ms-flex:1 0 40%;flex:1 0 40%}.attachments .non-gallery.attachment .nsfw{height:260px}.attachments .non-gallery.attachment .small{height:120px;-ms-flex-positive:0;flex-grow:0}.attachments .non-gallery.attachment .video{height:260px;display:-ms-flexbox;display:flex}.attachments .non-gallery.attachment video{max-height:100%;-o-object-fit:contain;object-fit:contain}.attachments .fullwidth{-ms-flex-preferred-size:100%;flex-basis:100%}.attachments.video{line-height:0}.attachments .video-container{display:-ms-flexbox;display:flex;max-height:100%}.attachments .video{width:100%;height:100%}.attachments .play-icon{position:absolute;font-size:64px;top:calc(50% - 32px);left:calc(50% - 32px);color:hsla(0,0%,100%,.75);text-shadow:0 0 2px rgba(0,0,0,.4)}.attachments .play-icon:before{margin:0}.attachments.html{-ms-flex-preferred-size:90%;flex-basis:90%;width:100%;display:-ms-flexbox;display:flex}.attachments .hider{position:absolute;right:0;white-space:nowrap;margin:10px;padding:5px;background:hsla(0,0%,90%,.6);font-weight:700;z-index:4;line-height:1;border-radius:5px;border-radius:var(--tooltipRadius,5px)}.attachments video{z-index:0}.attachments audio{width:100%}.attachments img.media-upload{line-height:0;max-height:200px;max-width:100%}.attachments .oembed{line-height:1.2em;-ms-flex:1 0 100%;flex:1 0 100%;width:100%;margin-right:15px;display:-ms-flexbox;display:flex}.attachments .oembed img{width:100%}.attachments .oembed .image{-ms-flex:1;flex:1}.attachments .oembed .image img{border:0;border-radius:5px;height:100%;-o-object-fit:cover;object-fit:cover}.attachments .oembed .text{-ms-flex:2;flex:2;margin:8px;word-break:break-all}.attachments .oembed .text h1{font-size:14px;margin:0}.attachments .image-attachment,.attachments .image-attachment .image{width:100%;height:100%}.attachments .image-attachment.hidden{display:none}.attachments .image-attachment .nsfw{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.attachments .image-attachment img{image-orientation:from-image}",""])},function(t,e,n){var i=n(404);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("24ab97e0",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,'.still-image{position:relative;line-height:0;overflow:hidden;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.still-image canvas{position:absolute;top:0;bottom:0;left:0;right:0;height:100%;visibility:var(--still-image-canvas,visible)}.still-image canvas,.still-image img{width:100%;-o-object-fit:contain;object-fit:contain}.still-image img{min-height:100%}.still-image.animated:before{content:"gif";position:absolute;line-height:10px;font-size:10px;top:5px;left:5px;background:hsla(0,0%,50%,.5);color:#fff;display:block;padding:2px 4px;border-radius:5px;border-radius:var(--tooltipRadius,5px);z-index:2;visibility:var(--still-image-label-visibility,visible)}.still-image.animated:hover canvas{display:none}.still-image.animated:hover:before,.still-image.animated img{visibility:var(--still-image-img,hidden)}.still-image.animated:hover img{visibility:visible}',""])},function(t,e,n){var i=n(406);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("af4a4f5c",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".StatusContent{-ms-flex:1;flex:1;min-width:0}.StatusContent .status-content-wrapper{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.StatusContent .tall-status{position:relative;height:220px;overflow-x:hidden;overflow-y:hidden;z-index:1}.StatusContent .tall-status .status-content{min-height:0;-webkit-mask:linear-gradient(0deg,#fff,transparent) bottom/100% 70px no-repeat,linear-gradient(0deg,#fff,#fff);mask:linear-gradient(0deg,#fff,transparent) bottom/100% 70px no-repeat,linear-gradient(0deg,#fff,#fff);-webkit-mask-composite:xor;mask-composite:exclude}.StatusContent .tall-status-hider{position:absolute;height:70px;margin-top:150px;line-height:110px;z-index:2}.StatusContent .cw-status-hider,.StatusContent .status-unhider,.StatusContent .tall-status-hider{display:inline-block;word-break:break-all;width:100%;text-align:center}.StatusContent img,.StatusContent video{max-width:100%;max-height:400px;vertical-align:middle;-o-object-fit:contain;object-fit:contain}.StatusContent img.emoji,.StatusContent video.emoji{width:32px;height:32px}.StatusContent .summary-wrapper{margin-bottom:.5em;border-style:solid;border-width:0 0 1px;border-color:var(--border,#222);-ms-flex-positive:0;flex-grow:0}.StatusContent .summary{font-style:italic;padding-bottom:.5em}.StatusContent .tall-subject{position:relative}.StatusContent .tall-subject .summary{max-height:2em;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.StatusContent .tall-subject-hider{display:inline-block;word-break:break-all;width:100%;text-align:center;padding-bottom:.5em}.StatusContent .status-content{font-family:var(--postFont,sans-serif);line-height:1.4em;white-space:pre-wrap;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word}.StatusContent .status-content blockquote{margin:.2em 0 .2em 2em;font-style:italic}.StatusContent .status-content pre{overflow:auto}.StatusContent .status-content code,.StatusContent .status-content kbd,.StatusContent .status-content pre,.StatusContent .status-content samp,.StatusContent .status-content var{font-family:var(--postCodeFont,monospace)}.StatusContent .status-content p{margin:0 0 1em}.StatusContent .status-content p:last-child{margin:0}.StatusContent .status-content h1{font-size:1.1em;line-height:1.2em;margin:1.4em 0}.StatusContent .status-content h2{font-size:1.1em;margin:1em 0}.StatusContent .status-content h3{font-size:1em;margin:1.2em 0}.StatusContent .status-content h4{margin:1.1em 0}.StatusContent .status-content.single-line{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;height:1.4em}.greentext{color:#0fa00f;color:var(--postGreentext,#0fa00f)}",""])},function(t,e,n){var i=n(408);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("1a8b173f",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".poll .votes{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;margin:0 0 .5em}.poll .poll-option{margin:.75em .5em}.poll .option-result{height:100%;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;position:relative;color:#b9b9ba;color:var(--lightText,#b9b9ba)}.poll .option-result-label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.1em .25em;z-index:1;word-break:break-word}.poll .result-percentage{width:3.5em;-ms-flex-negative:0;flex-shrink:0}.poll .result-fill{height:100%;position:absolute;color:#b9b9ba;color:var(--pollText,#b9b9ba);background-color:#151e2a;background-color:var(--poll,#151e2a);border-radius:10px;border-radius:var(--panelRadius,10px);top:0;left:0;transition:width .5s}.poll .option-vote{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.poll input{width:3.5em}.poll .footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.poll.loading *{cursor:progress}.poll .poll-vote-button{padding:0 .5em;margin-right:.5em}",""])},function(t,e,n){var i=n(410);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("6c9d5cbc",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".gallery-row{position:relative;height:0;width:100%;-ms-flex-positive:1;flex-grow:1;margin-top:.5em}.gallery-row .gallery-row-inner{position:absolute;top:0;left:0;right:0;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-line-pack:stretch;align-content:stretch}.gallery-row .gallery-row-inner .attachment{margin:0 .5em 0 0;-ms-flex-positive:1;flex-grow:1;height:100%;box-sizing:border-box;min-width:2em}.gallery-row .gallery-row-inner .attachment:last-child{margin:0}.gallery-row .image-attachment{width:100%;height:100%}.gallery-row .video-container{height:100%}.gallery-row.contain-fit canvas,.gallery-row.contain-fit img,.gallery-row.contain-fit video{-o-object-fit:contain;object-fit:contain;height:100%}.gallery-row.cover-fit canvas,.gallery-row.cover-fit img,.gallery-row.cover-fit video{-o-object-fit:cover;object-fit:cover}",""])},function(t,e,n){var i=n(412);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("c13d6bee",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".link-preview-card{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;cursor:pointer;overflow:hidden;margin-top:.5em;color:#b9b9ba;color:var(--text,#b9b9ba);border-radius:10px;border-radius:var(--attachmentRadius,10px);border-color:#222;border:1px solid var(--border,#222)}.link-preview-card .card-image{-ms-flex-negative:0;flex-shrink:0;width:120px;max-width:25%}.link-preview-card .card-image img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;border-radius:10px;border-radius:var(--attachmentRadius,10px)}.link-preview-card .small-image{width:80px}.link-preview-card .card-content{max-height:100%;margin:.5em;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.link-preview-card .card-host{font-size:12px}.link-preview-card .card-description{margin:.5em 0 0;overflow:hidden;text-overflow:ellipsis;word-break:break-word;line-height:1.2em;max-height:calc(1.2em * 3 - 1px)}",""])},function(t,e,n){var i=n(414);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("0060b6a4",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".user-card{position:relative}.user-card .panel-heading{padding:.5em 0;text-align:center;box-shadow:none;background:transparent;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:stretch;align-items:stretch;position:relative}.user-card .panel-body{word-wrap:break-word;border-bottom-right-radius:inherit;border-bottom-left-radius:inherit;position:relative}.user-card .background-image{position:absolute;top:0;left:0;right:0;bottom:0;-webkit-mask:linear-gradient(0deg,#fff,transparent) bottom no-repeat,linear-gradient(0deg,#fff,#fff);mask:linear-gradient(0deg,#fff,transparent) bottom no-repeat,linear-gradient(0deg,#fff,#fff);-webkit-mask-composite:xor;mask-composite:exclude;background-size:cover;-webkit-mask-size:100% 60%;mask-size:100% 60%;border-top-left-radius:calc(var(--panelRadius) - 1px);border-top-right-radius:calc(var(--panelRadius) - 1px);background-color:var(--profileBg)}.user-card .background-image.hide-bio{-webkit-mask-size:100% 40px;mask-size:100% 40px}.user-card p{margin-bottom:0}.user-card-bio{text-align:center}.user-card-bio a{color:#d8a070;color:var(--postLink,#d8a070)}.user-card-bio img{-o-object-fit:contain;object-fit:contain;vertical-align:middle;max-width:100%;max-height:400px}.user-card-bio img.emoji{width:32px;height:32px}.user-card-rounded-t{border-top-left-radius:10px;border-top-left-radius:var(--panelRadius,10px);border-top-right-radius:10px;border-top-right-radius:var(--panelRadius,10px)}.user-card-rounded{border-radius:10px;border-radius:var(--panelRadius,10px)}.user-card-bordered{border-color:#222;border:1px solid var(--border,#222)}.user-info{color:#b9b9ba;color:var(--lightText,#b9b9ba);padding:0 26px}.user-info .container{padding:16px 0 6px;display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;max-height:56px}.user-info .container .Avatar{-ms-flex:1 0 100%;flex:1 0 100%;width:56px;height:56px;box-shadow:0 1px 8px rgba(0,0,0,.75);box-shadow:var(--avatarShadow);-o-object-fit:cover;object-fit:cover}.user-info:hover .Avatar{--still-image-img:visible;--still-image-canvas:hidden}.user-info-avatar-link{position:relative;cursor:pointer}.user-info-avatar-link-overlay{position:absolute;left:0;top:0;right:0;bottom:0;background-color:rgba(0,0,0,.3);display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;border-radius:4px;border-radius:var(--avatarRadius,4px);opacity:0;transition:opacity .2s ease}.user-info-avatar-link-overlay i{color:#fff}.user-info-avatar-link:hover .user-info-avatar-link-overlay{opacity:1}.user-info .usersettings{color:#b9b9ba;color:var(--lightText,#b9b9ba);opacity:.8}.user-info .user-summary{display:block;margin-left:.6em;text-align:left;text-overflow:ellipsis;white-space:nowrap;-ms-flex:1 1 0px;flex:1 1 0;z-index:1}.user-info .user-summary img{width:26px;height:26px;vertical-align:middle;-o-object-fit:contain;object-fit:contain}.user-info .user-summary .top-line{display:-ms-flexbox;display:flex}.user-info .user-name{text-overflow:ellipsis;overflow:hidden;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:1em;font-size:15px}.user-info .user-name img{-o-object-fit:contain;object-fit:contain;height:16px;width:16px;vertical-align:middle}.user-info .bottom-line{display:-ms-flexbox;display:flex;font-weight:light;font-size:15px}.user-info .bottom-line .user-screen-name{min-width:1px;-ms-flex:0 1 auto;flex:0 1 auto;text-overflow:ellipsis;overflow:hidden;color:#b9b9ba;color:var(--lightText,#b9b9ba)}.user-info .bottom-line .dailyAvg{min-width:1px;-ms-flex:0 0 auto;flex:0 0 auto;margin-left:1em;font-size:.7em;color:#b9b9ba;color:var(--text,#b9b9ba)}.user-info .bottom-line .user-role{-ms-flex:none;flex:none;text-transform:capitalize;color:#b9b9ba;color:var(--alertNeutralText,#b9b9ba);background-color:#182230;background-color:var(--alertNeutral,#182230)}.user-info .user-meta{margin-bottom:.15em;display:-ms-flexbox;display:flex;-ms-flex-align:baseline;align-items:baseline;font-size:14px;line-height:22px;-ms-flex-wrap:wrap;flex-wrap:wrap}.user-info .user-meta .following{-ms-flex:1 0 auto;flex:1 0 auto;margin:0;margin-bottom:.25em;text-align:left}.user-info .user-meta .highlighter{-ms-flex:0 1 auto;flex:0 1 auto;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-.5em;-ms-flex-item-align:start;align-self:start}.user-info .user-meta .highlighter .userHighlightCl{padding:2px 10px;-ms-flex:1 0 auto;flex:1 0 auto}.user-info .user-meta .highlighter .userHighlightSel,.user-info .user-meta .highlighter .userHighlightSel.select{padding-top:0;padding-bottom:0;-ms-flex:1 0 auto;flex:1 0 auto}.user-info .user-meta .highlighter .userHighlightSel.select i{line-height:22px}.user-info .user-meta .highlighter .userHighlightText{width:70px;-ms-flex:1 0 auto;flex:1 0 auto}.user-info .user-meta .highlighter .userHighlightCl,.user-info .user-meta .highlighter .userHighlightSel,.user-info .user-meta .highlighter .userHighlightSel.select,.user-info .user-meta .highlighter .userHighlightText{height:22px;vertical-align:top;margin-right:.5em;margin-bottom:.25em}.user-info .user-interactions{position:relative;display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-.75em}.user-info .user-interactions>*{margin:0 .75em .6em 0;white-space:nowrap;min-width:95px}.user-info .user-interactions button{margin:0}.user-counts{display:-ms-flexbox;display:flex;line-height:16px;padding:.5em 1.5em 0;text-align:center;-ms-flex-pack:justify;justify-content:space-between;color:#b9b9ba;color:var(--lightText,#b9b9ba);-ms-flex-wrap:wrap;flex-wrap:wrap}.user-count{-ms-flex:1 0 auto;flex:1 0 auto;padding:.5em 0;margin:0 .5em}.user-count h5{font-size:1em;font-weight:bolder;margin:0 0 .25em}.user-count a{text-decoration:none}",""])},function(t,e,n){var i=n(416);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("6b6f3617",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".Avatar{--still-image-label-visibility:hidden;width:48px;height:48px;box-shadow:var(--avatarStatusShadow);border-radius:4px;border-radius:var(--avatarRadius,4px)}.Avatar img{width:100%;height:100%}.Avatar.better-shadow{box-shadow:var(--avatarStatusShadowInset);filter:var(--avatarStatusShadowFilter)}.Avatar.animated:before{display:none}.Avatar.avatar-compact{width:32px;height:32px;border-radius:10px;border-radius:var(--avatarAltRadius,10px)}",""])},function(t,e,n){var i=n(418);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("4852bbb4",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".remote-follow{max-width:220px}.remote-follow .remote-button{width:100%;min-height:28px}",""])},function(t,e,n){var i=n(420);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("2c0672fc",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,'.menu-checkbox{float:right;min-width:22px;max-width:22px;min-height:22px;max-height:22px;line-height:22px;text-align:center;border-radius:0;background-color:#182230;background-color:var(--input,#182230);box-shadow:inset 0 0 2px #000;box-shadow:var(--inputShadow)}.menu-checkbox.menu-checkbox-checked:after{content:"\\2714"}.moderation-tools-popover{height:100%}.moderation-tools-popover .trigger{display:-ms-flexbox!important;display:flex!important;height:100%}',""])},function(t,e,n){var i=n(422);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("56d82e88",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,'.dark-overlay:before{bottom:0;content:" ";left:0;right:0;background:rgba(27,31,35,.5);z-index:99}.dark-overlay:before,.dialog-modal.panel{display:block;cursor:default;position:fixed;top:0}.dialog-modal.panel{left:50%;max-height:80vh;max-width:90vw;margin:15vh auto;transform:translateX(-50%);z-index:999;background-color:#121a24;background-color:var(--bg,#121a24)}.dialog-modal.panel .dialog-modal-heading{padding:.5em;margin-right:auto;margin-bottom:0;white-space:nowrap;color:var(--panelText);background-color:#182230;background-color:var(--panel,#182230)}.dialog-modal.panel .dialog-modal-heading .title{margin-bottom:0;text-align:center}.dialog-modal.panel .dialog-modal-content{margin:0;padding:1rem;background-color:#121a24;background-color:var(--bg,#121a24);white-space:normal}.dialog-modal.panel .dialog-modal-footer{margin:0;padding:.5em;background-color:#121a24;background-color:var(--bg,#121a24);border-top:1px solid #222;border-top:1px solid var(--border,#222);display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end}.dialog-modal.panel .dialog-modal-footer button{width:auto;margin-left:.5rem}',""])},function(t,e,n){var i=n(424);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("8c9d5016",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".account-actions{margin:0 .8em}.account-actions button.dropdown-item{margin-left:0}.account-actions .trigger-button{color:#b9b9ba;color:var(--lightText,#b9b9ba);opacity:.8;cursor:pointer}.account-actions .trigger-button:hover{color:#b9b9ba;color:var(--text,#b9b9ba)}",""])},function(t,e,n){var i=n(426);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("7096a06e",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".avatars{display:-ms-flexbox;display:flex;margin:0;padding:0;-ms-flex-wrap:wrap;flex-wrap:wrap;height:24px}.avatars .avatars-item{margin:0 0 5px 5px}.avatars .avatars-item:first-child{padding-left:5px}.avatars .avatars-item .avatar-small{border-radius:10px;border-radius:var(--avatarAltRadius,10px);height:24px;width:24px}",""])},function(t,e,n){var i=n(428);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("14cff5b4",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".status-popover.popover{font-size:1rem;min-width:15em;max-width:95%;border-color:#222;border:1px solid var(--border,#222);border-radius:5px;border-radius:var(--tooltipRadius,5px);box-shadow:2px 2px 3px rgba(0,0,0,.5);box-shadow:var(--popupShadow)}.status-popover.popover .Status.Status{border:none}.status-popover.popover .status-preview-no-content{padding:1em;text-align:center}.status-popover.popover .status-preview-no-content i{font-size:2em}",""])},function(t,e,n){var i=n(430);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("50540f22",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".user-list-popover{padding:.5em}.user-list-popover .user-list-row{padding:.25em;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.user-list-popover .user-list-row .user-list-names{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;margin-left:.5em;min-width:5em}.user-list-popover .user-list-row .user-list-names img{width:1em;height:1em}.user-list-popover .user-list-row .user-list-screen-name{font-size:9px}",""])},function(t,e,n){var i=n(432);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("cf35b50a",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".emoji-reactions{display:-ms-flexbox;display:flex;margin-top:.25em;-ms-flex-wrap:wrap;flex-wrap:wrap}.emoji-reaction{padding:0 .5em;margin-right:.5em;margin-top:.5em;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;box-sizing:border-box}.emoji-reaction .reaction-emoji{width:1.25em;margin-right:.25em}.emoji-reaction:focus{outline:none}.emoji-reaction.not-clickable{cursor:default}.emoji-reaction.not-clickable:hover{box-shadow:0 0 2px 0 #000,inset 0 1px 0 0 hsla(0,0%,100%,.2),inset 0 -1px 0 0 rgba(0,0,0,.2);box-shadow:var(--buttonShadow)}.emoji-reaction-expand{padding:0 .5em;margin-right:.5em;margin-top:.5em;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.emoji-reaction-expand:hover{text-decoration:underline}.picked-reaction{border:1px solid var(--accent,#d8a070);margin-left:-1px;margin-right:calc(.5em - 1px)}",""])},function(t,e,n){var i=n(434);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("93498d0a",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".Conversation .conversation-status{border-left:none;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:var(--border,#222);border-radius:0}.Conversation.-expanded .conversation-status{border-color:#222;border-color:var(--border,#222);border-left:4px solid red;border-left:4px solid var(--cRed,red)}.Conversation.-expanded .conversation-status:last-child{border-bottom:none;border-radius:0 0 10px 10px;border-radius:0 0 var(--panelRadius,10px) var(--panelRadius,10px)}",""])},,,,,,,,,,,,,,,function(t,e,n){var i=n(450);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("b449a0b2",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".timeline-menu{-ms-flex-negative:1;flex-shrink:1;margin-right:auto;min-width:0;width:24rem}.timeline-menu .timeline-menu-popover-wrap{overflow:hidden;margin-top:.6rem;padding:0 15px 15px}.timeline-menu .timeline-menu-popover{width:24rem;max-width:100vw;margin:0;font-size:1rem;transform:translateY(-100%);transition:transform .1s}.timeline-menu .panel:after,.timeline-menu .timeline-menu-popover{border-top-right-radius:0;border-top-left-radius:0}.timeline-menu.open .timeline-menu-popover{transform:translateY(0)}.timeline-menu .timeline-menu-title{margin:0;cursor:pointer;display:-ms-flexbox;display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.timeline-menu .timeline-menu-title span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.timeline-menu .timeline-menu-title i{margin-left:.6em;-ms-flex-negative:0;flex-shrink:0;font-size:1rem;transition:transform .1s}.timeline-menu.open .timeline-menu-title i{color:#b9b9ba;color:var(--panelText,#b9b9ba);transform:rotate(180deg)}.timeline-menu .panel{box-shadow:var(--popoverShadow)}.timeline-menu ul{list-style:none;margin:0;padding:0}.timeline-menu li{border-bottom:1px solid;border-color:#222;border-color:var(--border,#222);padding:0}.timeline-menu li:last-child a{border-bottom-right-radius:10px;border-bottom-right-radius:var(--panelRadius,10px);border-bottom-left-radius:10px;border-bottom-left-radius:var(--panelRadius,10px)}.timeline-menu li:last-child{border:none}.timeline-menu li i{margin:0 .5em}.timeline-menu a{display:block;padding:.6em 0}.timeline-menu a:hover{color:#d8a070;color:var(--selectedMenuText,#d8a070)}.timeline-menu a.router-link-active,.timeline-menu a:hover{background-color:#151e2a;background-color:var(--selectedMenu,#151e2a);--faint:var(--selectedMenuFaintText,$fallback--faint);--faintLink:var(--selectedMenuFaintLink,$fallback--faint);--lightText:var(--selectedMenuLightText,$fallback--lightText);--icon:var(--selectedMenuIcon,$fallback--icon)}.timeline-menu a.router-link-active{font-weight:bolder;color:#b9b9ba;color:var(--selectedMenuText,#b9b9ba)}.timeline-menu a.router-link-active:hover{text-decoration:underline}",""])},function(t,e,n){var i=n(452);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("87e1cf2e",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".notifications:not(.minimal){padding-bottom:15em}.notifications .loadmore-error{color:#b9b9ba;color:var(--text,#b9b9ba)}.notifications .notification{position:relative}.notifications .notification .notification-overlay{position:absolute;top:0;right:0;left:0;bottom:0;pointer-events:none}.notifications .notification.unseen .notification-overlay{background-image:linear-gradient(135deg,var(--badgeNotification,red) 4px,transparent 10px)}.notification{box-sizing:border-box;border-bottom:1px solid;border-color:#222;border-color:var(--border,#222);word-wrap:break-word;word-break:break-word}.notification:hover .animated.Avatar canvas{display:none}.notification:hover .animated.Avatar img{visibility:visible}.notification .non-mention{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:.6em;min-width:0;--link:var(--faintLink);--text:var(--faint)}.notification .non-mention .avatar-container{width:32px;height:32px}.notification .follow-request-accept{cursor:pointer}.notification .follow-request-accept:hover{color:#b9b9ba;color:var(--text,#b9b9ba)}.notification .follow-request-reject{cursor:pointer}.notification .follow-request-reject:hover{color:red;color:var(--cRed,red)}.notification .follow-text,.notification .move-text{padding:.5em 0;overflow-wrap:break-word;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.notification .follow-text .follow-name,.notification .move-text .follow-name{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.notification .Status{-ms-flex:1;flex:1}.notification time{white-space:nowrap}.notification .notification-right{-ms-flex:1;flex:1;padding-left:.8em;min-width:0}.notification .notification-right .timeago{min-width:3em;text-align:right}.notification .emoji-reaction-emoji{font-size:16px}.notification .notification-details{min-width:0;word-wrap:break-word;line-height:18px;position:relative;overflow:hidden;width:100%;-ms-flex:1 1 0px;flex:1 1 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:justify;justify-content:space-between}.notification .notification-details .name-and-action{-ms-flex:1;flex:1;overflow:hidden;text-overflow:ellipsis}.notification .notification-details .username{font-weight:bolder;max-width:100%;text-overflow:ellipsis;white-space:nowrap}.notification .notification-details .username img{width:14px;height:14px;vertical-align:middle;-o-object-fit:contain;object-fit:contain}.notification .notification-details .timeago{margin-right:.2em}.notification .notification-details .icon-retweet.lit{color:#0fa00f;color:var(--cGreen,#0fa00f)}.notification .notification-details .icon-reply.lit,.notification .notification-details .icon-user-plus.lit,.notification .notification-details .icon-user.lit{color:#0095ff;color:var(--cBlue,#0095ff)}.notification .notification-details .icon-star.lit{color:orange;color:var(--cOrange,orange)}.notification .notification-details .icon-arrow-curved.lit{color:#0095ff;color:var(--cBlue,#0095ff)}.notification .notification-details .status-content{margin:0;max-height:300px}.notification .notification-details h1{word-break:break-all;margin:0 0 .3em;padding:0;font-size:1em;line-height:20px}.notification .notification-details h1 small{font-weight:lighter}.notification .notification-details p{margin:0;margin-top:0;margin-bottom:.3em}",""])},function(t,e,n){var i=n(454);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("41041624",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,'.Notification.-muted{padding:.25em .6em;height:1.2em;line-height:1.2em;text-overflow:ellipsis;overflow:hidden;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.Notification.-muted .mute-thread,.Notification.-muted .mute-words,.Notification.-muted .status-username{word-wrap:normal;word-break:normal;white-space:nowrap}.Notification.-muted .mute-words,.Notification.-muted .status-username{text-overflow:ellipsis;overflow:hidden}.Notification.-muted .status-username{font-weight:400;-ms-flex:0 1 auto;flex:0 1 auto;margin-right:.2em;font-size:smaller}.Notification.-muted .mute-thread{-ms-flex:0 0 auto;flex:0 0 auto}.Notification.-muted .mute-words{-ms-flex:1 0 5em;flex:1 0 5em;margin-left:.2em}.Notification.-muted .mute-words:before{content:" "}.Notification.-muted .unmute{-ms-flex:0 0 auto;flex:0 0 auto;margin-left:auto;display:block}',""])},function(t,e,n){var i=n(456);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("3a6f72a2",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".chat-list{min-height:25em;margin-bottom:0}.emtpy-chat-list-alert{padding:3em;font-size:1.2em;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;color:#b9b9ba;color:var(--faint,#b9b9ba)}",""])},function(t,e,n){var i=n(458);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("33c6b65e",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".chat-list-item{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;padding:.75em;height:5em;overflow:hidden;box-sizing:border-box;cursor:pointer}.chat-list-item :focus{outline:none}.chat-list-item:hover{background-color:var(--selectedPost,#151e2a);box-shadow:0 0 3px 1px rgba(0,0,0,.1)}.chat-list-item .chat-list-item-left{margin-right:1em}.chat-list-item .chat-list-item-center{width:100%;box-sizing:border-box;overflow:hidden;word-wrap:break-word}.chat-list-item .heading{width:100%;display:-ms-inline-flexbox;display:inline-flex;-ms-flex-pack:justify;justify-content:space-between;line-height:1em}.chat-list-item .heading-right{white-space:nowrap}.chat-list-item .name-and-account-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;-ms-flex-negative:1;flex-shrink:1;line-height:1.4em}.chat-list-item .chat-preview{display:-ms-inline-flexbox;display:inline-flex;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;margin:.35em 0;color:#b9b9ba;color:var(--faint,#b9b9ba);width:100%}.chat-list-item a{color:var(--faintLink,#d8a070);text-decoration:none;pointer-events:none}.chat-list-item:hover .animated.avatar canvas{display:none}.chat-list-item:hover .animated.avatar img{visibility:visible}.chat-list-item .Avatar{border-radius:10px;border-radius:var(--avatarAltRadius,10px)}.chat-list-item .StatusContent img.emoji{width:1.4em;height:1.4em}.chat-list-item .time-wrapper{line-height:1.4em}.chat-list-item .single-line{padding-right:1em}",""])},function(t,e,n){var i=n(460);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("3dcd538d",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".chat-title{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.chat-title,.chat-title .username{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chat-title .username{max-width:100%;display:inline;word-wrap:break-word}.chat-title .username .emoji{width:14px;height:14px;vertical-align:middle;-o-object-fit:contain;object-fit:contain}.chat-title .Avatar{width:23px;height:23px;margin-right:.5em;border-radius:10px;border-radius:var(--avatarAltRadius,10px)}.chat-title .Avatar.animated:before{display:none}",""])},function(t,e,n){var i=n(462);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("ca48b176",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".chat-new .input-wrap{display:-ms-flexbox;display:flex;margin:.7em .5em}.chat-new .input-wrap input{width:100%}.chat-new .icon-search{font-size:1.5em;float:right;margin-right:.3em}.chat-new .member-list{padding-bottom:.7rem}.chat-new .basic-user-card:hover{cursor:pointer;background-color:var(--selectedPost,#151e2a)}.chat-new .go-back-button{cursor:pointer}",""])},function(t,e,n){var i=n(464);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("119ab786",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".basic-user-card{display:-ms-flexbox;display:flex;-ms-flex:1 0;flex:1 0;margin:0;padding:.6em 1em}.basic-user-card-collapsed-content{margin-left:.7em;text-align:left;-ms-flex:1;flex:1;min-width:0}.basic-user-card-user-name img{-o-object-fit:contain;object-fit:contain;height:16px;width:16px;vertical-align:middle}.basic-user-card-screen-name,.basic-user-card-user-name-value{display:inline-block;max-width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.basic-user-card-expanded-content{-ms-flex:1;flex:1;margin-left:.7em;min-width:0}",""])},function(t,e,n){var i=n(466);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("33745640",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".list-item:not(:last-child){border-bottom:1px solid;border-bottom-color:#222;border-bottom-color:var(--border,#222)}.list-empty-content{text-align:center;padding:10px}",""])},function(t,e,n){var i=n(468);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("0f673926",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".chat-view{display:-ms-flexbox;display:flex;height:calc(100vh - 60px);width:100%}.chat-view .chat-title{height:28px}.chat-view .chat-view-inner{height:auto;margin:.5em .5em 0}.chat-view .chat-view-body,.chat-view .chat-view-inner{width:100%;overflow:visible;display:-ms-flexbox;display:flex}.chat-view .chat-view-body{background-color:var(--chatBg,#121a24);-ms-flex-direction:column;flex-direction:column;min-height:100%;margin:0;border-radius:10px 10px 0 0;border-radius:var(--panelRadius,10px) var(--panelRadius,10px) 0 0}.chat-view .chat-view-body:after{border-radius:0}.chat-view .scrollable-message-list{padding:0 .8em;height:100%;overflow-y:scroll;overflow-x:hidden;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.chat-view .footer{position:-webkit-sticky;position:sticky;bottom:0}.chat-view .chat-view-heading{-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;top:50px;display:-ms-flexbox;display:flex;z-index:2;position:-webkit-sticky;position:sticky;overflow:hidden}.chat-view .go-back-button{cursor:pointer;margin-right:1.4em}.chat-view .go-back-button i,.chat-view .jump-to-bottom-button{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.chat-view .jump-to-bottom-button{width:2.5em;height:2.5em;border-radius:100%;position:absolute;right:1.3em;top:-3.2em;background-color:#182230;background-color:var(--btn,#182230);-ms-flex-pack:center;justify-content:center;box-shadow:0 1px 1px rgba(0,0,0,.3),0 2px 4px rgba(0,0,0,.3);z-index:10;transition:all .35s;transition-timing-function:cubic-bezier(0,1,.5,1);opacity:0;visibility:hidden;cursor:pointer}.chat-view .jump-to-bottom-button.visible{opacity:1;visibility:visible}.chat-view .jump-to-bottom-button i{font-size:1em;color:#b9b9ba;color:var(--text,#b9b9ba)}.chat-view .jump-to-bottom-button .unread-message-count{font-size:.8em;left:50%;transform:translate(-50%);border-radius:100%;margin-top:-1rem;padding:0}.chat-view .jump-to-bottom-button .chat-loading-error{width:100%;display:-ms-flexbox;display:flex;-ms-flex-align:end;align-items:flex-end;height:100%}.chat-view .jump-to-bottom-button .chat-loading-error .error{width:100%}@media (max-width:800px){.chat-view{height:100%;overflow:hidden}.chat-view .chat-view-inner{overflow:hidden;height:100%;margin-top:0;margin-left:0;margin-right:0}.chat-view .chat-view-body{display:-ms-flexbox;display:flex;min-height:auto;overflow:hidden;height:100%;margin:0;border-radius:0}.chat-view .chat-view-heading{position:static;z-index:9999;top:0;margin-top:0;border-radius:0}.chat-view .scrollable-message-list{display:unset;overflow-y:scroll;overflow-x:hidden;-webkit-overflow-scrolling:touch}.chat-view .footer{position:-webkit-sticky;position:sticky;bottom:auto}}",""])},function(t,e,n){var i=n(470);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("20b81e5e",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,'.chat-message-wrapper.hovered-message-chain .animated.Avatar canvas{display:none}.chat-message-wrapper.hovered-message-chain .animated.Avatar img{visibility:visible}.chat-message-wrapper .chat-message-menu{transition:opacity .1s;opacity:0;position:absolute;top:-.8em}.chat-message-wrapper .chat-message-menu button{padding-top:.2em;padding-bottom:.2em}.chat-message-wrapper .icon-ellipsis{cursor:pointer;border-radius:10px;border-radius:var(--chatMessageRadius,10px)}.chat-message-wrapper .icon-ellipsis:hover,.extra-button-popover.open .chat-message-wrapper .icon-ellipsis{color:#b9b9ba;color:var(--text,#b9b9ba)}.chat-message-wrapper .popover{width:12em}.chat-message-wrapper .chat-message{display:-ms-flexbox;display:flex;padding-bottom:.5em}.chat-message-wrapper .avatar-wrapper{margin-right:.72em;width:32px}.chat-message-wrapper .attachments,.chat-message-wrapper .link-preview{margin-bottom:1em}.chat-message-wrapper .chat-message-inner{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;max-width:80%;min-width:10em;width:100%}.chat-message-wrapper .chat-message-inner.with-media{width:100%}.chat-message-wrapper .chat-message-inner.with-media .gallery-row{overflow:hidden}.chat-message-wrapper .chat-message-inner.with-media .status{width:100%}.chat-message-wrapper .status{border-radius:10px;border-radius:var(--chatMessageRadius,10px);display:-ms-flexbox;display:flex;padding:.75em}.chat-message-wrapper .created-at{position:relative;float:right;font-size:.8em;margin:-1em 0 -.5em;font-style:italic;opacity:.8}.chat-message-wrapper .without-attachment .status-content:after{margin-right:5.4em;content:" ";display:inline-block}.chat-message-wrapper .incoming a{color:var(--chatMessageIncomingLink,#d8a070)}.chat-message-wrapper .incoming .status{background-color:var(--chatMessageIncomingBg,#121a24);border:1px solid var(--chatMessageIncomingBorder,--border)}.chat-message-wrapper .incoming .created-at a,.chat-message-wrapper .incoming .status{color:var(--chatMessageIncomingText,#b9b9ba)}.chat-message-wrapper .incoming .chat-message-menu{left:.4rem}.chat-message-wrapper .outgoing{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-line-pack:end;align-content:end;-ms-flex-pack:end;justify-content:flex-end}.chat-message-wrapper .outgoing a{color:var(--chatMessageOutgoingLink,#d8a070)}.chat-message-wrapper .outgoing .status{color:var(--chatMessageOutgoingText,#b9b9ba);background-color:var(--chatMessageOutgoingBg,#151e2a);border:1px solid var(--chatMessageOutgoingBorder,--lightBg)}.chat-message-wrapper .outgoing .chat-message-inner{-ms-flex-align:end;align-items:flex-end}.chat-message-wrapper .outgoing .chat-message-menu{right:.4rem}.chat-message-wrapper .visible{opacity:1}.chat-message-date-separator{text-align:center;margin:1.4em 0;font-size:.9em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#b9b9ba;color:var(--faintedText,#b9b9ba)}',""])},function(t,e,n){var i=n(472);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("7563b46e",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".user-profile{-ms-flex:2;flex:2;-ms-flex-preferred-size:500px;flex-basis:500px}.user-profile .user-profile-fields{margin:0 .5em}.user-profile .user-profile-fields img{-o-object-fit:contain;object-fit:contain;vertical-align:middle;max-width:100%;max-height:400px}.user-profile .user-profile-fields img.emoji{width:18px;height:18px}.user-profile .user-profile-fields .user-profile-field{display:-ms-flexbox;display:flex;margin:.25em auto;max-width:32em;border:1px solid var(--border,#222);border-radius:4px;border-radius:var(--inputRadius,4px)}.user-profile .user-profile-fields .user-profile-field .user-profile-field-name{-ms-flex:0 1 30%;flex:0 1 30%;font-weight:500;text-align:right;color:var(--lightText);min-width:120px;border-right:1px solid var(--border,#222)}.user-profile .user-profile-fields .user-profile-field .user-profile-field-value{-ms-flex:1 1 70%;flex:1 1 70%;color:var(--text);margin:0 0 0 .25em}.user-profile .user-profile-fields .user-profile-field .user-profile-field-name,.user-profile .user-profile-fields .user-profile-field .user-profile-field-value{line-height:18px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;padding:.5em 1.5em;box-sizing:border-box}.user-profile .userlist-placeholder{-ms-flex-align:middle;align-items:middle;padding:2em}.user-profile .timeline-heading,.user-profile .userlist-placeholder{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.user-profile .timeline-heading .alert,.user-profile .timeline-heading .loadmore-button{-ms-flex:1;flex:1}.user-profile .timeline-heading .loadmore-button{height:28px;margin:10px .6em}.user-profile .timeline-heading .loadmore-text,.user-profile .timeline-heading .title{display:none}.user-profile-placeholder .panel-body{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:middle;align-items:middle;padding:7em}",""])},function(t,e,n){var i=n(474);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("ae955a70",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".follow-card-content-container{-ms-flex-negative:0;flex-shrink:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-wrap:wrap;flex-wrap:wrap;line-height:1.5em}.follow-card-follow-button{margin-top:.5em;margin-left:auto;width:10em}",""])},function(t,e,n){},function(t,e,n){},function(t,e,n){var i=n(478);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("354d66d6",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".search-result-heading{color:hsla(240,1%,73%,.5);color:var(--faint,hsla(240,1%,73%,.5));padding:.75rem;text-align:center}@media (max-width:800px){.search-nav-heading .tab-switcher .tabs .tab-wrapper{display:block;-ms-flex-pack:center;justify-content:center;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}}.search-result{box-sizing:border-box;border-bottom:1px solid;border-color:#222;border-color:var(--border,#222)}.search-result-footer{border-width:1px 0 0;border-style:solid;border-color:var(--border,#222);padding:10px;background-color:#182230;background-color:var(--panel,#182230)}.search-input-container{padding:.8rem;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.search-input-container .search-input{width:100%;line-height:1.125rem;font-size:1rem;padding:.5rem;box-sizing:border-box}.search-input-container .search-button{margin-left:.5em}.loading-icon{padding:1em}.trend{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.trend .hashtag{-ms-flex:1 1 auto;flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trend .count,.trend .hashtag{color:#b9b9ba;color:var(--text,#b9b9ba)}.trend .count{-ms-flex:0 0 auto;flex:0 0 auto;width:2rem;font-size:1.5rem;line-height:2.25rem;font-weight:500;text-align:center}",""])},function(t,e,n){var i=n(480);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("16815f76",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,'.registration-form{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;margin:.6em}.registration-form .container{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.registration-form .terms-of-service{-ms-flex:0 1 50%;flex:0 1 50%;margin:.8em}.registration-form .text-fields{margin-top:.6em;-ms-flex:1 0;flex:1 0;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.registration-form textarea{min-height:100px;resize:vertical}.registration-form .form-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding:.3em 0;line-height:24px;margin-bottom:1em}.registration-form .form-group--error{animation-name:shakeError;animation-duration:.6s;animation-timing-function:ease-in-out}.registration-form .form-group--error .form--label{color:#f04124;color:var(--cRed,#f04124)}.registration-form .form-error{margin-top:-.7em;text-align:left}.registration-form .form-error span{font-size:12px}.registration-form .form-error ul{list-style:none;padding:0 0 0 5px;margin-top:0}.registration-form .form-error ul li:before{content:"\\2022 "}.registration-form form textarea{line-height:16px;resize:vertical}.registration-form .captcha{max-width:350px;margin-bottom:.4em}.registration-form .btn{margin-top:.6em;height:28px}.registration-form .error{text-align:center}@media (max-width:800px){.registration-form .container{-ms-flex-direction:column-reverse;flex-direction:column-reverse}}',""])},,,,,,,,,,,,,,,,,,,,,,,,,function(t,e,n){var i=n(506);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("1ef4fd93",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".password-reset-form{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:center;align-items:center;margin:.6em}.password-reset-form .container{display:-ms-flexbox;display:flex;-ms-flex:1 0;flex:1 0;-ms-flex-direction:column;flex-direction:column;margin-top:.6em;max-width:18rem}.password-reset-form .form-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;margin-bottom:1em;padding:.3em 0;line-height:24px}.password-reset-form .error{text-align:center;animation-name:shakeError;animation-duration:.4s;animation-timing-function:ease-in-out}.password-reset-form .alert{padding:.5em;margin:.3em 0 1em}.password-reset-form .password-reset-required{background-color:var(--alertError,rgba(211,16,20,.5));padding:10px 0}.password-reset-form .notice-dismissible{padding-right:2rem}.password-reset-form .icon-cancel{cursor:pointer}",""])},function(t,e,n){var i=n(508);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("ad510f10",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".follow-request-card-content-container{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap}.follow-request-card-content-container button{margin-top:.5em;margin-right:.5em;-ms-flex:1 1;flex:1 1;max-width:12em;min-width:8em}.follow-request-card-content-container button:last-child{margin-right:0}",""])},function(t,e,n){var i=n(510);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("42704024",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".login-form{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding:.6em}.login-form .btn{min-height:28px;width:10em}.login-form .register{-ms-flex:1 1;flex:1 1}.login-form .login-bottom{margin-top:1em;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.login-form .form-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding:.3em .5em .6em;line-height:24px}.login-form .form-bottom{display:-ms-flexbox;display:flex;padding:.5em;height:32px}.login-form .form-bottom button{width:10em}.login-form .form-bottom p{margin:.35em;padding:.35em;display:-ms-flexbox;display:flex}.login-form .error{text-align:center;animation-name:shakeError;animation-duration:.4s;animation-timing-function:ease-in-out}",""])},function(t,e,n){var i=n(512);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("2c0040e1",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".floating-chat{position:fixed;right:0;bottom:0;z-index:1000;max-width:25em}.chat-panel .chat-heading{cursor:pointer}.chat-panel .chat-heading .icon-comment-empty{color:#b9b9ba;color:var(--text,#b9b9ba)}.chat-panel .chat-window{overflow-y:auto;overflow-x:hidden;max-height:20em}.chat-panel .chat-window-container{height:100%}.chat-panel .chat-message{display:-ms-flexbox;display:flex;padding:.2em .5em}.chat-panel .chat-avatar img{height:24px;width:24px;border-radius:4px;border-radius:var(--avatarRadius,4px);margin-right:.5em;margin-top:.25em}.chat-panel .chat-input{display:-ms-flexbox;display:flex}.chat-panel .chat-input textarea{-ms-flex:1;flex:1;margin:.6em;min-height:3.5em;resize:none}.chat-panel .chat-panel .title{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}",""])},function(t,e,n){var i=n(514);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("c74f4f44",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,"",""])},function(t,e,n){var i=n(516);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("7dfaed97",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,"",""])},function(t,e,n){var i=n(518);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("55ca8508",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".features-panel li{line-height:24px}",""])},function(t,e,n){var i=n(520);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("42aabc98",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".tos-content{margin:1em}",""])},function(t,e,n){var i=n(522);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("5aa588af",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,"",""])},function(t,e,n){var i=n(524);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("72647543",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".mrf-section{margin:1em}",""])},function(t,e,n){var i=n(526);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("67a8aa3d",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,"",""])},function(t,e,n){var i=n(528);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("5c806d03",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,'#app{min-height:100vh;max-width:100%;overflow:hidden}.app-bg-wrapper{position:fixed;z-index:-1;height:100%;left:0;right:-20px;background-size:cover;background-repeat:no-repeat;background-position:0 50%}i[class^=icon-]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}h4{margin:0}#content{box-sizing:border-box;padding-top:60px;margin:auto;min-height:100vh;max-width:980px;-ms-flex-line-pack:start;align-content:flex-start}.underlay{background-color:rgba(0,0,0,.15);background-color:var(--underlay,rgba(0,0,0,.15))}.text-center{text-align:center}html{font-size:14px}body{overscroll-behavior-y:none;font-family:sans-serif;font-family:var(--interfaceFont,sans-serif);margin:0;color:#b9b9ba;color:var(--text,#b9b9ba);max-width:100vw;overflow-x:hidden;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body.hidden{display:none}a{text-decoration:none;color:#d8a070;color:var(--link,#d8a070)}button{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#182230;background-color:var(--btn,#182230);border:none;border-radius:4px;border-radius:var(--btnRadius,4px);cursor:pointer;box-shadow:0 0 2px 0 #000,inset 0 1px 0 0 hsla(0,0%,100%,.2),inset 0 -1px 0 0 rgba(0,0,0,.2);box-shadow:var(--buttonShadow);font-size:14px;font-family:sans-serif;font-family:var(--interfaceFont,sans-serif)}button,button i[class*=icon-]{color:#b9b9ba;color:var(--btnText,#b9b9ba)}button::-moz-focus-inner{border:none}button:hover{box-shadow:0 0 4px hsla(0,0%,100%,.3);box-shadow:var(--buttonHoverShadow)}button:active{box-shadow:0 0 4px 0 hsla(0,0%,100%,.3),inset 0 1px 0 0 rgba(0,0,0,.2),inset 0 -1px 0 0 hsla(0,0%,100%,.2);box-shadow:var(--buttonPressedShadow);background-color:#182230;background-color:var(--btnPressed,#182230)}button:active,button:active i{color:#b9b9ba;color:var(--btnPressedText,#b9b9ba)}button:disabled{cursor:not-allowed;background-color:#182230;background-color:var(--btnDisabled,#182230)}button:disabled,button:disabled i{color:#b9b9ba;color:var(--btnDisabledText,#b9b9ba)}button.toggled{background-color:#182230;background-color:var(--btnToggled,#182230);box-shadow:0 0 4px 0 hsla(0,0%,100%,.3),inset 0 1px 0 0 rgba(0,0,0,.2),inset 0 -1px 0 0 hsla(0,0%,100%,.2);box-shadow:var(--buttonPressedShadow)}button.toggled,button.toggled i{color:#b9b9ba;color:var(--btnToggledText,#b9b9ba)}button.danger{color:#b9b9ba;color:var(--alertErrorPanelText,#b9b9ba);background-color:rgba(211,16,20,.5);background-color:var(--alertError,rgba(211,16,20,.5))}.input,.select,input,textarea{border:none;border-radius:4px;border-radius:var(--inputRadius,4px);box-shadow:inset 0 1px 0 0 rgba(0,0,0,.2),inset 0 -1px 0 0 hsla(0,0%,100%,.2),inset 0 0 2px 0 #000;box-shadow:var(--inputShadow);background-color:#182230;background-color:var(--input,#182230);color:#b9b9ba;color:var(--inputText,#b9b9ba);font-family:sans-serif;font-family:var(--inputFont,sans-serif);font-size:14px;margin:0;box-sizing:border-box;display:inline-block;position:relative;height:28px;line-height:16px;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none;padding:8px .5em}.input.unstyled,.select.unstyled,input.unstyled,textarea.unstyled{border-radius:0;background:none;box-shadow:none;height:unset}.input.select,.select.select,input.select,textarea.select{padding:0}.input:disabled,.input[disabled=disabled],.select:disabled,.select[disabled=disabled],input:disabled,input[disabled=disabled],textarea:disabled,textarea[disabled=disabled]{cursor:not-allowed;opacity:.5}.input .icon-down-open,.select .icon-down-open,input .icon-down-open,textarea .icon-down-open{position:absolute;top:0;bottom:0;right:5px;height:100%;color:#b9b9ba;color:var(--inputText,#b9b9ba);line-height:28px;z-index:0;pointer-events:none}.input select,.select select,input select,textarea select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:none;color:#b9b9ba;color:var(--inputText,--text,#b9b9ba);margin:0;padding:0 2em 0 .2em;font-family:sans-serif;font-family:var(--inputFont,sans-serif);font-size:14px;width:100%;z-index:1;height:28px;line-height:16px}.input[type=range],.select[type=range],input[type=range],textarea[type=range]{background:none;border:none;margin:0;box-shadow:none;-ms-flex:1;flex:1}.input[type=radio],.select[type=radio],input[type=radio],textarea[type=radio]{display:none}.input[type=radio]:checked+label:before,.select[type=radio]:checked+label:before,input[type=radio]:checked+label:before,textarea[type=radio]:checked+label:before{box-shadow:inset 0 0 2px #000,inset 0 0 0 4px #182230;box-shadow:var(--inputShadow),0 0 0 4px var(--fg,#182230) inset;background-color:var(--accent,#d8a070)}.input[type=radio]:disabled,.input[type=radio]:disabled+label,.input[type=radio]:disabled+label:before,.select[type=radio]:disabled,.select[type=radio]:disabled+label,.select[type=radio]:disabled+label:before,input[type=radio]:disabled,input[type=radio]:disabled+label,input[type=radio]:disabled+label:before,textarea[type=radio]:disabled,textarea[type=radio]:disabled+label,textarea[type=radio]:disabled+label:before{opacity:.5}.input[type=radio]+label:before,.select[type=radio]+label:before,input[type=radio]+label:before,textarea[type=radio]+label:before{-ms-flex-negative:0;flex-shrink:0;display:inline-block;content:"";transition:box-shadow .2s;width:1.1em;height:1.1em;border-radius:100%;box-shadow:inset 0 0 2px #000;box-shadow:var(--inputShadow);margin-right:.5em;background-color:#182230;background-color:var(--input,#182230);vertical-align:top;text-align:center;line-height:1.1em;font-size:1.1em;color:transparent;overflow:hidden;box-sizing:border-box}.input[type=checkbox],.select[type=checkbox],input[type=checkbox],textarea[type=checkbox]{display:none}.input[type=checkbox]:checked+label:before,.select[type=checkbox]:checked+label:before,input[type=checkbox]:checked+label:before,textarea[type=checkbox]:checked+label:before{color:#b9b9ba;color:var(--inputText,#b9b9ba)}.input[type=checkbox]:disabled,.input[type=checkbox]:disabled+label,.input[type=checkbox]:disabled+label:before,.select[type=checkbox]:disabled,.select[type=checkbox]:disabled+label,.select[type=checkbox]:disabled+label:before,input[type=checkbox]:disabled,input[type=checkbox]:disabled+label,input[type=checkbox]:disabled+label:before,textarea[type=checkbox]:disabled,textarea[type=checkbox]:disabled+label,textarea[type=checkbox]:disabled+label:before{opacity:.5}.input[type=checkbox]+label:before,.select[type=checkbox]+label:before,input[type=checkbox]+label:before,textarea[type=checkbox]+label:before{-ms-flex-negative:0;flex-shrink:0;display:inline-block;content:"\\2714";transition:color .2s;width:1.1em;height:1.1em;border-radius:2px;border-radius:var(--checkboxRadius,2px);box-shadow:inset 0 0 2px #000;box-shadow:var(--inputShadow);margin-right:.5em;background-color:#182230;background-color:var(--input,#182230);vertical-align:top;text-align:center;line-height:1.1em;font-size:1.1em;color:transparent;overflow:hidden;box-sizing:border-box}option{color:#b9b9ba;color:var(--text,#b9b9ba);background-color:#121a24;background-color:var(--bg,#121a24)}.hide-number-spinner{-moz-appearance:textfield}.hide-number-spinner[type=number]::-webkit-inner-spin-button,.hide-number-spinner[type=number]::-webkit-outer-spin-button{opacity:0;display:none}i[class*=icon-]{color:#666;color:var(--icon,#666)}.btn-block{display:block;width:100%}.btn-group{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group button{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group button:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group button:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.container{-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0;padding:0 10px}.container,.item{display:-ms-flexbox;display:flex}.item{-ms-flex:1;flex:1;line-height:50px;height:50px;overflow:hidden;-ms-flex-wrap:wrap;flex-wrap:wrap}.item .nav-icon{margin-left:.4em}.item.right{-ms-flex-pack:end;justify-content:flex-end}.auto-size{-ms-flex:1;flex:1}.nav-bar{padding:0;width:100%;-ms-flex-align:center;align-items:center;position:fixed;height:50px;box-sizing:border-box}.nav-bar button,.nav-bar button i[class*=icon-]{color:#b9b9ba;color:var(--btnTopBarText,#b9b9ba)}.nav-bar button:active{background-color:#182230;background-color:var(--btnPressedTopBar,#182230);color:#b9b9ba;color:var(--btnPressedTopBarText,#b9b9ba)}.nav-bar button:disabled{color:#b9b9ba;color:var(--btnDisabledTopBarText,#b9b9ba)}.nav-bar button.toggled{color:#b9b9ba;color:var(--btnToggledTopBarText,#b9b9ba);background-color:#182230;background-color:var(--btnToggledTopBar,#182230)}.nav-bar .logo{display:-ms-flexbox;display:flex;-ms-flex-align:stretch;align-items:stretch;-ms-flex-pack:center;justify-content:center;-ms-flex:0 0 auto;flex:0 0 auto;z-index:-1;transition:opacity;transition-timing-function:ease-out;transition-duration:.1s}.nav-bar .logo,.nav-bar .logo .mask{position:absolute;top:0;bottom:0;left:0;right:0}.nav-bar .logo .mask{-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:contain;mask-size:contain;background-color:#182230;background-color:var(--topBarText,#182230)}.nav-bar .logo img{height:100%;-o-object-fit:contain;object-fit:contain;display:block;-ms-flex:0;flex:0}.nav-bar .inner-nav{position:relative;margin:auto;box-sizing:border-box;padding-left:10px;padding-right:10px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-preferred-size:970px;flex-basis:970px;height:50px}.nav-bar .inner-nav a,.nav-bar .inner-nav a i{color:#d8a070;color:var(--topBarLink,#d8a070)}main-router{-ms-flex:1;flex:1}.status.compact{color:rgba(0,0,0,.42);font-weight:300}.status.compact p{margin:0;font-size:.8em}.panel{display:-ms-flexbox;display:flex;position:relative;-ms-flex-direction:column;flex-direction:column;margin:.5em;background-color:#121a24;background-color:var(--bg,#121a24)}.panel,.panel:after{border-radius:10px;border-radius:var(--panelRadius,10px)}.panel:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;pointer-events:none;box-shadow:1px 1px 4px rgba(0,0,0,.6);box-shadow:var(--panelShadow)}.panel-body:empty:before{content:"\\AF\\\\_(\\30C4)_/\\AF";display:block;margin:1em;text-align:center}.panel-heading{display:-ms-flexbox;display:flex;-ms-flex:none;flex:none;border-radius:10px 10px 0 0;border-radius:var(--panelRadius,10px) var(--panelRadius,10px) 0 0;background-size:cover;padding:.6em;text-align:left;line-height:28px;color:var(--panelText);background-color:#182230;background-color:var(--panel,#182230);-ms-flex-align:baseline;align-items:baseline;box-shadow:var(--panelHeaderShadow)}.panel-heading .title{-ms-flex:1 0 auto;flex:1 0 auto;font-size:1.3em}.panel-heading .faint{background-color:transparent;color:hsla(240,1%,73%,.5);color:var(--panelFaint,hsla(240,1%,73%,.5))}.panel-heading .faint-link{color:hsla(240,1%,73%,.5);color:var(--faintLink,hsla(240,1%,73%,.5))}.panel-heading .alert{white-space:nowrap;text-overflow:ellipsis;overflow-x:hidden}.panel-heading button{-ms-flex-negative:0;flex-shrink:0}.panel-heading .alert,.panel-heading button{line-height:21px;min-height:0;box-sizing:border-box;margin:0;margin-left:.5em;min-width:1px;-ms-flex-item-align:stretch;-ms-grid-row-align:stretch;align-self:stretch}.panel-heading button,.panel-heading button i[class*=icon-]{color:#b9b9ba;color:var(--btnPanelText,#b9b9ba)}.panel-heading button:active{background-color:#182230;background-color:var(--btnPressedPanel,#182230);color:#b9b9ba;color:var(--btnPressedPanelText,#b9b9ba)}.panel-heading button:disabled{color:#b9b9ba;color:var(--btnDisabledPanelText,#b9b9ba)}.panel-heading button.toggled{color:#b9b9ba;color:var(--btnToggledPanelText,#b9b9ba)}.panel-heading a{color:#d8a070;color:var(--panelLink,#d8a070)}.panel-heading.stub{border-radius:10px;border-radius:var(--panelRadius,10px)}.panel-footer{border-radius:0 0 10px 10px;border-radius:0 0 var(--panelRadius,10px) var(--panelRadius,10px)}.panel-footer .faint{color:hsla(240,1%,73%,.5);color:var(--panelFaint,hsla(240,1%,73%,.5))}.panel-footer a{color:#d8a070;color:var(--panelLink,#d8a070)}.panel-body>p{line-height:18px;padding:1em;margin:0}.container>*{min-width:0}.fa{color:grey}nav{z-index:1000;color:var(--topBarText);background-color:#182230;background-color:var(--topBar,#182230);color:hsla(240,1%,73%,.5);color:var(--faint,hsla(240,1%,73%,.5));box-shadow:0 0 4px rgba(0,0,0,.6);box-shadow:var(--topBarShadow)}.fade-enter-active,.fade-leave-active{transition:opacity .2s}.fade-enter,.fade-leave-active{opacity:0}.main{-ms-flex-preferred-size:50%;flex-basis:50%;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1}.sidebar-bounds{-ms-flex:0;flex:0;-ms-flex-preferred-size:35%;flex-basis:35%}.sidebar-flexer{-ms-flex:1;flex:1;-ms-flex-preferred-size:345px;flex-basis:345px;width:365px}.mobile-shown{display:none}@media (min-width:800px){body{overflow-y:scroll}.sidebar-bounds{overflow:hidden;max-height:100vh;width:345px;position:fixed;margin-top:-10px}.sidebar-bounds .sidebar-scroller{height:96vh;width:365px;padding-top:10px;padding-right:50px;overflow-x:hidden;overflow-y:scroll}.sidebar-bounds .sidebar{width:345px}.sidebar-flexer{max-height:96vh;-ms-flex-negative:0;flex-shrink:0;-ms-flex-positive:0;flex-grow:0}}.badge{display:inline-block;border-radius:99px;min-width:22px;max-width:22px;min-height:22px;max-height:22px;font-size:15px;line-height:22px;text-align:center;vertical-align:middle;white-space:nowrap;padding:0}.badge.badge-notification{background-color:red;background-color:var(--badgeNotification,red);color:#fff;color:var(--badgeNotificationText,#fff)}.alert{margin:.35em;padding:.25em;border-radius:5px;border-radius:var(--tooltipRadius,5px);min-height:28px;line-height:28px}.alert.error{background-color:rgba(211,16,20,.5);background-color:var(--alertError,rgba(211,16,20,.5));color:#b9b9ba;color:var(--alertErrorText,#b9b9ba)}.panel-heading .alert.error{color:#b9b9ba;color:var(--alertErrorPanelText,#b9b9ba)}.alert.warning{background-color:rgba(111,111,20,.5);background-color:var(--alertWarning,rgba(111,111,20,.5));color:#b9b9ba;color:var(--alertWarningText,#b9b9ba)}.panel-heading .alert.warning{color:#b9b9ba;color:var(--alertWarningPanelText,#b9b9ba)}.faint,.faint-link{color:hsla(240,1%,73%,.5);color:var(--faint,hsla(240,1%,73%,.5))}.faint-link:hover{text-decoration:underline}@media (min-width:800px){.logo{opacity:1!important}}.item.right{text-align:right}.visibility-notice{padding:.5em;border:1px solid hsla(240,1%,73%,.5);border:1px solid var(--faint,hsla(240,1%,73%,.5));border-radius:4px;border-radius:var(--inputRadius,4px)}.notice-dismissible{padding-right:4rem;position:relative}.notice-dismissible .dismiss{position:absolute;top:0;right:0;padding:.5em;color:inherit}.button-icon{font-size:1.2em}@keyframes shakeError{0%{transform:translateX(0)}15%{transform:translateX(.375rem)}30%{transform:translateX(-.375rem)}45%{transform:translateX(.375rem)}60%{transform:translateX(-.375rem)}75%{transform:translateX(.375rem)}90%{transform:translateX(-.375rem)}to{transform:translateX(0)}}@media (max-width:800px){.mobile-hidden{display:none}.panel-switcher{display:-ms-flexbox;display:flex}.container{padding:0}.panel{margin:.5em 0}.menu-button{display:block;margin-right:.8em}.main{margin-bottom:7em}}.select-multiple{display:-ms-flexbox;display:flex}.select-multiple .option-list{margin:0;padding-left:.5em}.option-list,.setting-list{list-style-type:none;padding-left:2em}.option-list li,.setting-list li{margin-bottom:.5em}.option-list .suboptions,.setting-list .suboptions{margin-top:.3em}.login-hint{text-align:center}@media (min-width:801px){.login-hint{display:none}}.login-hint a{display:inline-block;padding:1em 0;width:100%}.btn.btn-default{min-height:28px}.animate-spin{animation:spin 2s infinite linear;display:inline-block}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(359deg)}}.new-status-notification{position:relative;margin-top:-1px;font-size:1.1em;border-width:1px 0 0;border-style:solid;border-color:var(--border,#222);padding:10px;z-index:1;background-color:#182230;background-color:var(--panel,#182230)}.unread-chat-count{font-size:.9em;font-weight:bolder;font-style:normal;position:absolute;right:.6rem;padding:0 .3em;min-width:1.3rem;min-height:1.3rem;max-height:1.3rem;line-height:1.3rem}.chat-layout{overflow:hidden;height:100%}@media (max-width:800px){.chat-layout body{height:100%}.chat-layout #app{height:100%;overflow:hidden;min-height:auto}.chat-layout #app_bg_wrapper{overflow:hidden}.chat-layout .main{overflow:hidden;height:100%}.chat-layout #content{padding-top:0;height:100%;overflow:visible}}',""])},function(t,e,n){var i=n(530);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("04d46dee",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".user-panel .signed-in{overflow:visible}",""])},function(t,e,n){var i=n(532);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("b030addc",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".nav-panel .panel{overflow:hidden;box-shadow:var(--panelShadow)}.nav-panel ul{list-style:none;margin:0;padding:0}.follow-request-count{margin:-6px 10px;background-color:#121a24;background-color:var(--input,hsla(240,1%,73%,.5))}.nav-panel li{border-bottom:1px solid;border-color:#222;border-color:var(--border,#222);padding:0}.nav-panel li:first-child a{border-top-right-radius:10px;border-top-right-radius:var(--panelRadius,10px);border-top-left-radius:10px;border-top-left-radius:var(--panelRadius,10px)}.nav-panel li:last-child a{border-bottom-right-radius:10px;border-bottom-right-radius:var(--panelRadius,10px);border-bottom-left-radius:10px;border-bottom-left-radius:var(--panelRadius,10px)}.nav-panel li:last-child{border:none}.nav-panel a{display:block;padding:.8em .85em}.nav-panel a:hover{color:#d8a070;color:var(--selectedMenuText,#d8a070)}.nav-panel a.router-link-active,.nav-panel a:hover{background-color:#151e2a;background-color:var(--selectedMenu,#151e2a);--faint:var(--selectedMenuFaintText,$fallback--faint);--faintLink:var(--selectedMenuFaintLink,$fallback--faint);--lightText:var(--selectedMenuLightText,$fallback--lightText);--icon:var(--selectedMenuIcon,$fallback--icon)}.nav-panel a.router-link-active{font-weight:bolder;color:#b9b9ba;color:var(--selectedMenuText,#b9b9ba)}.nav-panel a.router-link-active:hover{text-decoration:underline}.nav-panel .button-icon:before{width:1.1em}",""])},function(t,e,n){var i=n(534);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("0ea9aafc",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".search-bar-container{max-width:100%;display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:baseline;align-items:baseline;vertical-align:baseline;-ms-flex-pack:end;justify-content:flex-end}.search-bar-container .search-bar-input,.search-bar-container .search-button{height:29px}.search-bar-container .search-bar-input{max-width:calc(100% - 30px - 30px - 20px)}.search-bar-container .search-button{margin-left:.5em;margin-right:.5em}.search-bar-container .icon-cancel{cursor:pointer}",""])},function(t,e,n){var i=n(536);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("2f18dd03",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".who-to-follow *{vertical-align:middle}.who-to-follow img{width:32px;height:32px}.who-to-follow{padding:0 1em;margin:0}.who-to-follow-items{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding:0;margin:1em 0}.who-to-follow-more{padding:0;margin:1em 0;text-align:center}",""])},,,,function(t,e,n){var i=n(541);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("7272e6fe",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".settings-modal{overflow:hidden}.settings-modal.peek .settings-modal-panel{transform:translateY(calc(((100vh - 100%) / 2 + 100%) - 50px))}@media (max-width:800px){.settings-modal.peek .settings-modal-panel{transform:translateY(calc(100% - 50px))}}.settings-modal .settings-modal-panel{overflow:hidden;transition:transform;transition-timing-function:ease-in-out;transition-duration:.3s;width:1000px;max-width:90vw;height:90vh}@media (max-width:800px){.settings-modal .settings-modal-panel{max-width:100vw;height:100%}}.settings-modal .settings-modal-panel>.panel-body{height:100%;overflow-y:hidden}.settings-modal .settings-modal-panel>.panel-body .btn{min-height:28px;min-width:10em;padding:0 2em}",""])},function(t,e,n){var i=n(543);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("f7395e92",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".modal-view{z-index:1000;position:fixed;top:0;left:0;right:0;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;overflow:auto;pointer-events:none;animation-duration:.2s;animation-name:modal-background-fadein;opacity:0}.modal-view>*{pointer-events:auto}.modal-view.modal-background{pointer-events:auto;background-color:rgba(0,0,0,.5)}.modal-view.open{opacity:1}@keyframes modal-background-fadein{0%{background-color:transparent}to{background-color:rgba(0,0,0,.5)}}",""])},function(t,e,n){var i=n(545);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("1c82888b",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".panel-loading{display:-ms-flexbox;display:flex;height:100%;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;font-size:2em;color:#b9b9ba;color:var(--text,#b9b9ba)}.panel-loading .loading-text i{font-size:3em;line-height:0;vertical-align:middle;color:#b9b9ba;color:var(--text,#b9b9ba)}",""])},function(t,e,n){var i=n(547);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("2970b266",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".async-component-error{display:-ms-flexbox;display:flex;height:100%;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.async-component-error .btn{margin:.5em;padding:.5em 2em}",""])},function(t,e,n){var i=n(549);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("23b00cfc",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".modal-view.media-modal-view{z-index:1001}.modal-view.media-modal-view .modal-view-button-arrow{opacity:.75}.modal-view.media-modal-view .modal-view-button-arrow:focus,.modal-view.media-modal-view .modal-view-button-arrow:hover{outline:none;box-shadow:none}.modal-view.media-modal-view .modal-view-button-arrow:hover{opacity:1}.modal-image{max-width:90%;max-height:90%;box-shadow:0 5px 15px 0 rgba(0,0,0,.5);image-orientation:from-image}.modal-view-button-arrow{position:absolute;display:block;top:50%;margin-top:-50px;width:70px;height:100px;border:0;padding:0;opacity:0;box-shadow:none;background:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;overflow:visible;cursor:pointer;transition:opacity 333ms cubic-bezier(.4,0,.22,1)}.modal-view-button-arrow .arrow-icon{position:absolute;top:35px;height:30px;width:32px;font-size:14px;line-height:30px;color:#fff;text-align:center;background-color:rgba(0,0,0,.3)}.modal-view-button-arrow--prev{left:0}.modal-view-button-arrow--prev .arrow-icon{left:6px}.modal-view-button-arrow--next{right:0}.modal-view-button-arrow--next .arrow-icon{right:6px}",""])},function(t,e,n){var i=n(551);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("34992fba",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".side-drawer-container{position:fixed;z-index:1000;top:0;left:0;width:100%;height:100%;display:-ms-flexbox;display:flex;-ms-flex-align:stretch;align-items:stretch;transition-duration:0s;transition-property:transform}.side-drawer-container-open{transform:translate(0)}.side-drawer-container-closed{transition-delay:.35s;transform:translate(-100%)}.side-drawer-darken{top:0;left:0;width:100vw;height:100vh;position:fixed;z-index:-1;transition:.35s;transition-property:background-color;background-color:rgba(0,0,0,.5)}.side-drawer-darken-closed{background-color:transparent}.side-drawer-click-outside{-ms-flex:1 1 100%;flex:1 1 100%}.side-drawer{overflow-x:hidden;transition-timing-function:cubic-bezier(0,1,.5,1);transition:.35s;transition-property:transform;margin:0 0 0 -100px;padding:0 0 1em 100px;width:80%;max-width:20em;-ms-flex:0 0 80%;flex:0 0 80%;box-shadow:1px 1px 4px rgba(0,0,0,.6);box-shadow:var(--panelShadow);background-color:#121a24;background-color:var(--popover,#121a24);color:#d8a070;color:var(--popoverText,#d8a070);--faint:var(--popoverFaintText,$fallback--faint);--faintLink:var(--popoverFaintLink,$fallback--faint);--lightText:var(--popoverLightText,$fallback--lightText);--icon:var(--popoverIcon,$fallback--icon)}.side-drawer .button-icon:before{width:1.1em}.side-drawer-logo-wrapper{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.85em}.side-drawer-logo-wrapper img{-ms-flex:none;flex:none;height:50px;margin-right:.85em}.side-drawer-logo-wrapper span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.side-drawer-click-outside-closed{-ms-flex:0 0 0px;flex:0 0 0}.side-drawer-closed{transform:translate(-100%)}.side-drawer-heading{background:transparent;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;padding:0;margin:0}.side-drawer ul{list-style:none;margin:0;padding:0;border-bottom:1px solid;border-color:#222;border-color:var(--border,#222);margin:.2em 0}.side-drawer ul:last-child{border:0}.side-drawer li{padding:0}.side-drawer li a{display:block;padding:.5em .85em}.side-drawer li a:hover{background-color:#151e2a;background-color:var(--selectedMenuPopover,#151e2a);color:#b9b9ba;color:var(--selectedMenuPopoverText,#b9b9ba);--faint:var(--selectedMenuPopoverFaintText,$fallback--faint);--faintLink:var(--selectedMenuPopoverFaintLink,$fallback--faint);--lightText:var(--selectedMenuPopoverLightText,$fallback--lightText);--icon:var(--selectedMenuPopoverIcon,$fallback--icon)}",""])},function(t,e,n){var i=n(553);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("7f8eca07",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".new-status-button{width:5em;height:5em;border-radius:100%;position:fixed;bottom:1.5em;right:1.5em;background-color:#182230;background-color:var(--btn,#182230);display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;box-shadow:0 2px 2px rgba(0,0,0,.3),0 4px 6px rgba(0,0,0,.3);z-index:10;transition:transform .35s;transition-timing-function:cubic-bezier(0,1,.5,1)}.new-status-button.hidden{transform:translateY(150%)}.new-status-button i{font-size:1.5em;color:#b9b9ba;color:var(--text,#b9b9ba)}@media (min-width:801px){.new-status-button{display:none}}",""])},function(t,e,n){var i=n(555);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("1e0fbcf8",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".mobile-inner-nav{width:100%;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.mobile-nav-button{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;width:50px;position:relative;cursor:pointer}.alert-dot{border-radius:100%;height:8px;width:8px;position:absolute;left:calc(50% - 4px);top:calc(50% - 4px);margin-left:6px;margin-top:-6px;background-color:red;background-color:var(--badgeNotification,red)}.mobile-notifications-drawer{width:100%;height:100vh;overflow-x:hidden;position:fixed;top:0;left:0;box-shadow:1px 1px 4px rgba(0,0,0,.6);box-shadow:var(--panelShadow);transition-property:transform;transition-duration:.25s;transform:translateX(0);z-index:1001;-webkit-overflow-scrolling:touch}.mobile-notifications-drawer.closed{transform:translateX(100%)}.mobile-notifications-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;z-index:1;width:100%;height:50px;line-height:50px;position:absolute;color:var(--topBarText);background-color:#182230;background-color:var(--topBar,#182230);box-shadow:0 0 4px rgba(0,0,0,.6);box-shadow:var(--topBarShadow)}.mobile-notifications-header .title{font-size:1.3em;margin-left:.6em}.mobile-notifications{margin-top:50px;width:100vw;height:calc(100vh - 50px);overflow-x:hidden;overflow-y:scroll;color:#b9b9ba;color:var(--text,#b9b9ba);background-color:#121a24;background-color:var(--bg,#121a24)}.mobile-notifications .notifications{padding:0;border-radius:0;box-shadow:none}.mobile-notifications .notifications .panel{border-radius:0;margin:0;box-shadow:none}.mobile-notifications .notifications .panel:after{border-radius:0}.mobile-notifications .notifications .panel .panel-heading{border-radius:0;box-shadow:none}",""])},function(t,e,n){var i=n(557);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("10c04f96",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".user-reporting-panel{width:90vw;max-width:700px;min-height:20vh;max-height:80vh}.user-reporting-panel .panel-heading .title{text-align:center;-ms-flex:1;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.user-reporting-panel .panel-body{display:-ms-flexbox;display:flex;-ms-flex-direction:column-reverse;flex-direction:column-reverse;border-top:1px solid;border-color:#222;border-color:var(--border,#222);overflow:hidden}.user-reporting-panel-left{padding:1.1em .7em .7em;line-height:1.4em;box-sizing:border-box}.user-reporting-panel-left>div{margin-bottom:1em}.user-reporting-panel-left>div:last-child{margin-bottom:0}.user-reporting-panel-left p{margin-top:0}.user-reporting-panel-left textarea.form-control{line-height:16px;resize:none;overflow:hidden;transition:min-height .2s .1s;min-height:44px;width:100%}.user-reporting-panel-left .btn{min-width:10em;padding:0 2em}.user-reporting-panel-left .alert{margin:1em 0 0;line-height:1.3em}.user-reporting-panel-right{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;overflow-y:auto}.user-reporting-panel-sitem{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.user-reporting-panel-sitem>.Status{-ms-flex:1;flex:1}.user-reporting-panel-sitem>.checkbox{margin:.75em}@media (min-width:801px){.user-reporting-panel .panel-body{-ms-flex-direction:row;flex-direction:row}.user-reporting-panel-left{width:50%;max-width:320px;border-right:1px solid;border-color:#222;border-color:var(--border,#222);padding:1.1em}.user-reporting-panel-left>div{margin-bottom:2em}.user-reporting-panel-right{width:50%;-ms-flex:1 1 auto;flex:1 1 auto;margin-bottom:12px}}",""])},function(t,e,n){var i=n(559);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("7628c2ae",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".modal-view.post-form-modal-view{-ms-flex-align:start;align-items:flex-start}.post-form-modal-panel{-ms-flex-negative:0;flex-shrink:0;margin-top:25%;margin-bottom:2em;width:100%;max-width:700px}@media (orientation:landscape){.post-form-modal-panel{margin-top:8%}}",""])},function(t,e,n){var i=n(561);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("cdffaf96",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".global-notice-list{position:fixed;top:50px;width:100%;pointer-events:none;z-index:1001;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:center;align-items:center}.global-notice-list .global-notice{pointer-events:auto;text-align:center;width:40em;max-width:calc(100% - 3em);display:-ms-flexbox;display:flex;padding-left:1.5em;line-height:2em}.global-notice-list .global-notice .notice-message{-ms-flex:1 1 100%;flex:1 1 100%}.global-notice-list .global-notice i{-ms-flex:0 0;flex:0 0;width:1.5em;cursor:pointer}.global-notice-list .global-error{background-color:var(--alertPopupError,red)}.global-notice-list .global-error,.global-notice-list .global-error i{color:var(--alertPopupErrorText,#b9b9ba)}.global-notice-list .global-warning{background-color:var(--alertPopupWarning,orange)}.global-notice-list .global-warning,.global-notice-list .global-warning i{color:var(--alertPopupWarningText,#b9b9ba)}.global-notice-list .global-info{background-color:var(--alertPopupNeutral,#182230)}.global-notice-list .global-info,.global-notice-list .global-info i{color:var(--alertPopupNeutralText,#b9b9ba)}",""])},function(t,e,n){"use strict";n.r(e);var i=n(3),o=n.n(i),r=n(6),s=n.n(r),a=n(108),c=n(2),l=(n(226),n(197));try{new EventTarget}catch(t){window.EventTarget=l.a}var u={state:{settingsModalState:"hidden",settingsModalLoaded:!1,settingsModalTargetTab:null,settings:{currentSaveStateNotice:null,noticeClearTimeout:null,notificationPermission:null},browserSupport:{cssFilter:window.CSS&&window.CSS.supports&&(window.CSS.supports("filter","drop-shadow(0 0)")||window.CSS.supports("-webkit-filter","drop-shadow(0 0)"))},mobileLayout:!1,globalNotices:[],layoutHeight:0,lastTimeline:null},mutations:{settingsSaved:function(t,e){var n=e.success,i=e.error;n?(t.noticeClearTimeout&&clearTimeout(t.noticeClearTimeout),Object(r.set)(t.settings,"currentSaveStateNotice",{error:!1,data:n}),Object(r.set)(t.settings,"noticeClearTimeout",setTimeout(function(){return Object(r.delete)(t.settings,"currentSaveStateNotice")},2e3))):Object(r.set)(t.settings,"currentSaveStateNotice",{error:!0,errorData:i})},setNotificationPermission:function(t,e){t.notificationPermission=e},setMobileLayout:function(t,e){t.mobileLayout=e},closeSettingsModal:function(t){t.settingsModalState="hidden"},togglePeekSettingsModal:function(t){switch(t.settingsModalState){case"minimized":return void(t.settingsModalState="visible");case"visible":return void(t.settingsModalState="minimized");default:throw new Error("Illegal minimization state of settings modal")}},openSettingsModal:function(t){t.settingsModalState="visible",t.settingsModalLoaded||(t.settingsModalLoaded=!0)},setSettingsModalTargetTab:function(t,e){t.settingsModalTargetTab=e},pushGlobalNotice:function(t,e){t.globalNotices.push(e)},removeGlobalNotice:function(t,e){t.globalNotices=t.globalNotices.filter(function(t){return t!==e})},setLayoutHeight:function(t,e){t.layoutHeight=e},setLastTimeline:function(t,e){t.lastTimeline=e}},actions:{setPageTitle:function(t){var e=t.rootState,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";document.title="".concat(n," ").concat(e.instance.name)},settingsSaved:function(t,e){var n=t.commit;t.dispatch;n("settingsSaved",{success:e.success,error:e.error})},setNotificationPermission:function(t,e){(0,t.commit)("setNotificationPermission",e)},setMobileLayout:function(t,e){(0,t.commit)("setMobileLayout",e)},closeSettingsModal:function(t){(0,t.commit)("closeSettingsModal")},openSettingsModal:function(t){(0,t.commit)("openSettingsModal")},togglePeekSettingsModal:function(t){(0,t.commit)("togglePeekSettingsModal")},clearSettingsModalTargetTab:function(t){(0,t.commit)("setSettingsModalTargetTab",null)},openSettingsModalTab:function(t,e){var n=t.commit;n("setSettingsModalTargetTab",e),n("openSettingsModal")},pushGlobalNotice:function(t,e){var n=t.commit,i=t.dispatch,o=e.messageKey,r=e.messageArgs,s=void 0===r?{}:r,a=e.level,c=void 0===a?"error":a,l=e.timeout,u=void 0===l?0:l,d={messageKey:o,messageArgs:s,level:c};return u&&setTimeout(function(){return i("removeGlobalNotice",d)},u),n("pushGlobalNotice",d),d},removeGlobalNotice:function(t,e){(0,t.commit)("removeGlobalNotice",e)},setLayoutHeight:function(t,e){(0,t.commit)("setLayoutHeight",e)},setLastTimeline:function(t,e){(0,t.commit)("setLastTimeline",e)}}},d=n(10),p=n.n(d),f=n(1),h=n.n(f),m=n(7),g=n.n(m),v=n(32),b=n(39),w=n(11),_=n(95);function x(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}var y={state:{name:"Pleroma FE",registrationOpen:!0,server:"http://localhost:4040/",textlimit:5e3,themeData:void 0,vapidPublicKey:void 0,alwaysShowSubjectInput:!0,defaultAvatar:"/images/avi.png",defaultBanner:"/images/banner.png",background:"/static/aurora_borealis.jpg",collapseMessageWithSubject:!1,disableChat:!1,greentext:!1,hideFilteredStatuses:!1,hideMutedPosts:!1,hidePostStats:!1,hideSitename:!1,hideUserStats:!1,loginMethod:"password",logo:"/static/logo.png",logoMargin:".2em",logoMask:!0,minimalScopesMode:!1,nsfwCensorImage:void 0,postContentType:"text/plain",redirectRootLogin:"/main/friends",redirectRootNoLogin:"/main/all",scopeCopy:!0,showFeaturesPanel:!0,showInstanceSpecificPanel:!1,sidebarRight:!1,subjectLineBehavior:"email",theme:"pleroma-dark",customEmoji:[],customEmojiFetched:!1,emoji:[],emojiFetched:!1,pleromaBackend:!0,postFormats:[],restrictedNicknames:[],safeDM:!0,knownDomains:[],chatAvailable:!1,pleromaChatMessagesAvailable:!1,gopherAvailable:!1,mediaProxyAvailable:!1,suggestionsEnabled:!1,suggestionsWeb:"",instanceSpecificPanelContent:"",tos:"",backendVersion:"",frontendVersion:"",pollsAvailable:!1,pollLimits:{max_options:4,max_option_chars:255,min_expiration:60,max_expiration:86400}},mutations:{setInstanceOption:function(t,e){var n=e.name,i=e.value;void 0!==i&&Object(r.set)(t,n,i)},setKnownDomains:function(t,e){t.knownDomains=e}},getters:{instanceDefaultConfig:function(t){return _.c.map(function(e){return[e,t[e]]}).reduce(function(t,e){var n=g()(e,2),i=n[0],o=n[1];return function(t){for(var e=1;ee?1:0}):["utf"],replacement:":".concat(i,": ")}}).sort(function(t,e){return t.displayText.toLowerCase()>e.displayText.toLowerCase()?1:0}),e("setInstanceOption",{name:"customEmoji",value:a}),c.next=15;break;case 14:throw i;case 15:c.next=21;break;case 17:c.prev=17,c.t0=c.catch(1),console.warn("Can't load custom emojis"),console.warn(c.t0);case 21:case"end":return c.stop()}},null,null,[[1,17]])},setTheme:function(t,e){var n=t.commit,i=t.rootState;n("setInstanceOption",{name:"theme",value:e}),Object(v.j)(e).then(function(t){if(n("setInstanceOption",{name:"themeData",value:t}),!i.config.customTheme){var e=t.source;!t.theme||e&&e.themeEngineVersion===b.a?Object(v.b)(e):Object(v.b)(t.theme)}})},fetchEmoji:function(t){var e=t.dispatch,n=t.state;n.customEmojiFetched||(n.customEmojiFetched=!0,e("getCustomEmoji")),n.emojiFetched||(n.emojiFetched=!0,e("getStaticEmoji"))},getKnownDomains:function(t){var e,n,i;return o.a.async(function(r){for(;;)switch(r.prev=r.next){case 0:return e=t.commit,n=t.rootState,r.prev=1,r.next=4,o.a.awrap(w.c.fetchKnownDomains({credentials:n.users.currentUser.credentials}));case 4:i=r.sent,e("setKnownDomains",i),r.next=12;break;case 8:r.prev=8,r.t0=r.catch(1),console.warn("Can't load known domains"),console.warn(r.t0);case 12:case"end":return r.stop()}},null,null,[[1,8]])}}},k=n(101),C=n.n(k),S=n(13),j=n.n(S),O=n(23),P=n.n(O),$=n(203),T=n.n($),I=n(96),E=n.n(I),M=n(102),U=n.n(M),F=n(103),D=n.n(F),L=n(25),N=n.n(L),R=n(45),A=n.n(R),B=n(24),z=n.n(B),H=n(204),q=n.n(H),W=n(47),V=n.n(W),G=n(19);function K(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}function Y(t){for(var e=1;e0&&void 0!==arguments[0]?arguments[0]:0,flushMarker:0}},X=function(){return{desktopNotificationSilence:!0,maxId:0,minId:Number.POSITIVE_INFINITY,data:[],idStore:{},loading:!1,error:!1}},Q=function(){return{allStatuses:[],allStatusesObject:{},conversationsObject:{},maxId:0,notifications:X(),favorites:new Set,error:!1,errorData:null,timelines:{mentions:J(),public:J(),user:J(),favorites:J(),media:J(),publicAndExternal:J(),friends:J(),tag:J(),dms:J(),bookmarks:J()}}},Z=function(t,e,n){var i,o=e[n.id];return o?(E()(o,C()(n,function(t,e){return null===t||"user"===e})),o.attachments.splice(o.attachments.length),{item:o,new:!1}):((i=n).deleted=!1,i.attachments=i.attachments||[],t.push(n),Object(r.set)(e,n.id,n),{item:n,new:!0})},tt=function(t,e){var n=Number(t.id),i=Number(e.id),o=!Number.isNaN(n),r=!Number.isNaN(i);return o&&r?n>i?-1:1:o&&!r?1:!o&&r?-1:t.id>e.id?-1:1},et=function(t){return t.visibleStatuses=t.visibleStatuses.sort(tt),t.statuses=t.statuses.sort(tt),t.minVisibleId=(P()(t.visibleStatuses)||{}).id,t},nt=function(t,e){var n=Z(t.allStatuses,t.allStatusesObject,e);if(n.new){var i=n.item,o=t.conversationsObject,s=i.statusnet_conversation_id;o[s]?o[s].push(i):Object(r.set)(o,s,[i])}return n},it={addNewStatuses:function(t,e){var n=e.statuses,i=e.showImmediately,o=void 0!==i&&i,r=e.timeline,s=e.user,a=void 0===s?{}:s,c=e.noIdUpdate,l=void 0!==c&&c,u=e.userId,d=e.pagination,p=void 0===d?{}:d;if(!j()(n))return!1;var f=t.allStatuses,h=t.timelines[r],m=p.maxId||(n.length>0?U()(n,"id").id:0),g=p.minId||(n.length>0?D()(n,"id").id:0),v=r&&(g>h.maxId||0===h.maxId)&&n.length>0,b=r&&(m0;if(!l&&v&&(h.maxId=g),!l&&b&&(h.minId=m),"user"!==r&&"media"!==r||h.userId===u){var w=function(e,n){var i,o=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],s=nt(t,e),c=s.item;if(s.new){if("status"===c.type&&N()(c.attentions,{id:a.id})){var l=t.timelines.mentions;h!==l&&(Z(l.statuses,l.statusesObject,c),l.newStatusCount+=1,et(l))}if("direct"===c.visibility){var u=t.timelines.dms;Z(u.statuses,u.statusesObject,c),u.newStatusCount+=1,et(u)}}return r&&o&&(i=Z(h.statuses,h.statusesObject,c)),r&&n?Z(h.visibleStatuses,h.visibleStatusesObject,c):r&&o&&i.new&&(h.newStatusCount+=1),c},_={status:function(t){w(t,o)},retweet:function(t){var e,n=w(t.retweeted_status,!1,!1);e=r&&N()(h.statuses,function(t){return t.retweeted_status?t.id===n.id||t.retweeted_status.id===n.id:t.id===n.id})?w(t,!1,!1):w(t,o),e.retweeted_status=n},favorite:function(e){t.favorites.has(e.id)||(t.favorites.add(e.id),function(t,e){var n=N()(f,{id:t.in_reply_to_status_id});n&&(t.user.id===a.id?n.favorited=!0:n.fave_num+=1)}(e))},deletion:function(e){var n=e.uri,i=N()(f,{uri:n});i&&(function(t,e){V()(t.allStatuses,{id:e.id}),V()(t.notifications.data,function(t){return t.action.id===e.id});var n=e.statusnet_conversation_id;t.conversationsObject[n]&&V()(t.conversationsObject[n],{id:e.id})}(t,i),r&&(V()(h.statuses,{uri:n}),V()(h.visibleStatuses,{uri:n})))},follow:function(t){},default:function(t){console.log("unknown status type"),console.log(t)}};z()(n,function(t){var e=t.type;(_[e]||_.default)(t)}),r&&"bookmarks"!==r&&et(h)}},addNewNotifications:function(t,e){var n=e.dispatch,i=e.notifications,o=(e.older,e.visibleNotificationTypes,e.rootGetters,e.newNotificationSideEffects);z()(i,function(e){Object(G.b)(e.type)&&(e.action=nt(t,e.action).item,e.status=e.status&&nt(t,e.status).item),"pleroma:emoji_reaction"===e.type&&n("fetchEmojiReactionsBy",e.status.id),t.notifications.idStore.hasOwnProperty(e.id)?e.seen&&(t.notifications.idStore[e.id].seen=!0):(t.notifications.maxId=e.id>t.notifications.maxId?e.id:t.notifications.maxId,t.notifications.minId=e.id0?P()(o.visibleStatuses).id:0,o.maxId=o.statuses.length>0?T()(o.statuses).id:0)},showNewStatuses:function(t,e){var n=e.timeline,i=t.timelines[n];i.newStatusCount=0,i.visibleStatuses=q()(i.statuses,0,50),i.minVisibleId=P()(i.visibleStatuses).id,i.minId=i.minVisibleId,i.visibleStatusesObject={},z()(i.visibleStatuses,function(t){i.visibleStatusesObject[t.id]=t})},resetStatuses:function(t){var e=Q();Object.entries(e).forEach(function(e){var n=g()(e,2),i=n[0],o=n[1];t[i]=o})},clearTimeline:function(t,e){var n=e.timeline,i=e.excludeUserId,o=void 0!==i&&i?t.timelines[n].userId:void 0;t.timelines[n]=J(o)},clearNotifications:function(t){t.notifications=X()},setFavorited:function(t,e){var n=e.status,i=e.value,o=t.allStatusesObject[n.id];o.favorited!==i&&(i?o.fave_num++:o.fave_num--),o.favorited=i},setFavoritedConfirm:function(t,e){var n=e.status,i=e.user,o=t.allStatusesObject[n.id];o.favorited=n.favorited,o.fave_num=n.fave_num;var r=A()(o.favoritedBy,{id:i.id});-1===r||o.favorited?-1===r&&o.favorited&&o.favoritedBy.push(i):o.favoritedBy.splice(r,1)},setMutedStatus:function(t,e){var n=t.allStatusesObject[e.id];n.thread_muted=e.thread_muted,void 0!==n.thread_muted&&t.conversationsObject[n.statusnet_conversation_id].forEach(function(t){t.thread_muted=n.thread_muted})},setRetweeted:function(t,e){var n=e.status,i=e.value,o=t.allStatusesObject[n.id];o.repeated!==i&&(i?o.repeat_num++:o.repeat_num--),o.repeated=i},setRetweetedConfirm:function(t,e){var n=e.status,i=e.user,o=t.allStatusesObject[n.id];o.repeated=n.repeated,o.repeat_num=n.repeat_num;var r=A()(o.rebloggedBy,{id:i.id});-1===r||o.repeated?-1===r&&o.repeated&&o.rebloggedBy.push(i):o.rebloggedBy.splice(r,1)},setBookmarked:function(t,e){var n=e.status,i=e.value;t.allStatusesObject[n.id].bookmarked=i},setBookmarkedConfirm:function(t,e){var n=e.status;t.allStatusesObject[n.id].bookmarked=n.bookmarked},setDeleted:function(t,e){var n=e.status,i=t.allStatusesObject[n.id];i&&(i.deleted=!0)},setManyDeleted:function(t,e){Object.values(t.allStatusesObject).forEach(function(t){e(t)&&(t.deleted=!0)})},setLoading:function(t,e){var n=e.timeline,i=e.value;t.timelines[n].loading=i},setNsfw:function(t,e){var n=e.id,i=e.nsfw;t.allStatusesObject[n].nsfw=i},setError:function(t,e){var n=e.value;t.error=n},setErrorData:function(t,e){var n=e.value;t.errorData=n},setNotificationsLoading:function(t,e){var n=e.value;t.notifications.loading=n},setNotificationsError:function(t,e){var n=e.value;t.notifications.error=n},setNotificationsSilence:function(t,e){var n=e.value;t.notifications.desktopNotificationSilence=n},markNotificationsAsSeen:function(t){z()(t.notifications.data,function(t){t.seen=!0})},markSingleNotificationAsSeen:function(t,e){var n=e.id,i=N()(t.notifications.data,function(t){return t.id===n});i&&(i.seen=!0)},dismissNotification:function(t,e){var n=e.id;t.notifications.data=t.notifications.data.filter(function(t){return t.id!==n})},dismissNotifications:function(t,e){var n=e.finder;t.notifications.data=t.notifications.data.filter(function(t){return n})},updateNotification:function(t,e){var n=e.id,i=e.updater,o=N()(t.notifications.data,function(t){return t.id===n});o&&i(o)},queueFlush:function(t,e){var n=e.timeline,i=e.id;t.timelines[n].flushMarker=i},queueFlushAll:function(t){Object.keys(t.timelines).forEach(function(e){t.timelines[e].flushMarker=t.timelines[e].maxId})},addRepeats:function(t,e){var n=e.id,i=e.rebloggedByUsers,o=e.currentUser,r=t.allStatusesObject[n];r.rebloggedBy=i.filter(function(t){return t}),r.repeat_num=r.rebloggedBy.length,r.repeated=!!r.rebloggedBy.find(function(t){var e=t.id;return o.id===e})},addFavs:function(t,e){var n=e.id,i=e.favoritedByUsers,o=e.currentUser,r=t.allStatusesObject[n];r.favoritedBy=i.filter(function(t){return t}),r.fave_num=r.favoritedBy.length,r.favorited=!!r.favoritedBy.find(function(t){var e=t.id;return o.id===e})},addEmojiReactionsBy:function(t,e){var n=e.id,i=e.emojiReactions,o=(e.currentUser,t.allStatusesObject[n]);Object(r.set)(o,"emoji_reactions",i)},addOwnReaction:function(t,e){var n=e.id,i=e.emoji,o=e.currentUser,s=t.allStatusesObject[n],a=A()(s.emoji_reactions,{name:i}),c=s.emoji_reactions[a]||{name:i,count:0,accounts:[]},l=Y({},c,{count:c.count+1,me:!0,accounts:[].concat(p()(c.accounts),[o])});a>=0?Object(r.set)(s.emoji_reactions,a,l):Object(r.set)(s,"emoji_reactions",[].concat(p()(s.emoji_reactions),[l]))},removeOwnReaction:function(t,e){var n=e.id,i=e.emoji,o=e.currentUser,s=t.allStatusesObject[n],a=A()(s.emoji_reactions,{name:i});if(!(a<0)){var c=s.emoji_reactions[a],l=c.accounts||[],u=Y({},c,{count:c.count-1,me:!1,accounts:l.filter(function(t){return t.id!==o.id})});u.count>0?Object(r.set)(s.emoji_reactions,a,u):Object(r.set)(s,"emoji_reactions",s.emoji_reactions.filter(function(t){return t.name!==i}))}},updateStatusWithPoll:function(t,e){var n=e.id,i=e.poll;t.allStatusesObject[n].poll=i}},ot={state:Q(),actions:{addNewStatuses:function(t,e){var n=t.rootState,i=t.commit,o=e.statuses,r=e.showImmediately,s=void 0!==r&&r,a=e.timeline,c=void 0!==a&&a,l=e.noIdUpdate,u=void 0!==l&&l,d=e.userId,p=e.pagination;i("addNewStatuses",{statuses:o,showImmediately:s,timeline:c,noIdUpdate:u,user:n.users.currentUser,userId:d,pagination:p})},addNewNotifications:function(t,e){var n=e.notifications,i=e.older;(0,t.commit)("addNewNotifications",{dispatch:t.dispatch,notifications:n,older:i,rootGetters:t.rootGetters,newNotificationSideEffects:function(e){Object(G.c)(t,e)}})},setError:function(t,e){t.rootState;(0,t.commit)("setError",{value:e.value})},setErrorData:function(t,e){t.rootState;(0,t.commit)("setErrorData",{value:e.value})},setNotificationsLoading:function(t,e){t.rootState;(0,t.commit)("setNotificationsLoading",{value:e.value})},setNotificationsError:function(t,e){t.rootState;(0,t.commit)("setNotificationsError",{value:e.value})},setNotificationsSilence:function(t,e){t.rootState;(0,t.commit)("setNotificationsSilence",{value:e.value})},fetchStatus:function(t,e){var n=t.rootState,i=t.dispatch;return n.api.backendInteractor.fetchStatus({id:e}).then(function(t){return i("addNewStatuses",{statuses:[t]})})},deleteStatus:function(t,e){var n=t.rootState;(0,t.commit)("setDeleted",{status:e}),w.c.deleteStatus({id:e.id,credentials:n.users.currentUser.credentials})},markStatusesAsDeleted:function(t,e){(0,t.commit)("setManyDeleted",e)},favorite:function(t,e){var n=t.rootState,i=t.commit;i("setFavorited",{status:e,value:!0}),n.api.backendInteractor.favorite({id:e.id}).then(function(t){return i("setFavoritedConfirm",{status:t,user:n.users.currentUser})})},unfavorite:function(t,e){var n=t.rootState,i=t.commit;i("setFavorited",{status:e,value:!1}),n.api.backendInteractor.unfavorite({id:e.id}).then(function(t){return i("setFavoritedConfirm",{status:t,user:n.users.currentUser})})},fetchPinnedStatuses:function(t,e){var n=t.rootState,i=t.dispatch;n.api.backendInteractor.fetchPinnedStatuses({id:e}).then(function(t){return i("addNewStatuses",{statuses:t,timeline:"user",userId:e,showImmediately:!0,noIdUpdate:!0})})},pinStatus:function(t,e){var n=t.rootState,i=t.dispatch;return n.api.backendInteractor.pinOwnStatus({id:e}).then(function(t){return i("addNewStatuses",{statuses:[t]})})},unpinStatus:function(t,e){var n=t.rootState,i=t.dispatch;n.api.backendInteractor.unpinOwnStatus({id:e}).then(function(t){return i("addNewStatuses",{statuses:[t]})})},muteConversation:function(t,e){var n=t.rootState,i=t.commit;return n.api.backendInteractor.muteConversation({id:e}).then(function(t){return i("setMutedStatus",t)})},unmuteConversation:function(t,e){var n=t.rootState,i=t.commit;return n.api.backendInteractor.unmuteConversation({id:e}).then(function(t){return i("setMutedStatus",t)})},retweet:function(t,e){var n=t.rootState,i=t.commit;i("setRetweeted",{status:e,value:!0}),n.api.backendInteractor.retweet({id:e.id}).then(function(t){return i("setRetweetedConfirm",{status:t.retweeted_status,user:n.users.currentUser})})},unretweet:function(t,e){var n=t.rootState,i=t.commit;i("setRetweeted",{status:e,value:!1}),n.api.backendInteractor.unretweet({id:e.id}).then(function(t){return i("setRetweetedConfirm",{status:t,user:n.users.currentUser})})},bookmark:function(t,e){var n=t.rootState,i=t.commit;i("setBookmarked",{status:e,value:!0}),n.api.backendInteractor.bookmarkStatus({id:e.id}).then(function(t){i("setBookmarkedConfirm",{status:t})})},unbookmark:function(t,e){var n=t.rootState,i=t.commit;i("setBookmarked",{status:e,value:!1}),n.api.backendInteractor.unbookmarkStatus({id:e.id}).then(function(t){i("setBookmarkedConfirm",{status:t})})},queueFlush:function(t,e){t.rootState;(0,t.commit)("queueFlush",{timeline:e.timeline,id:e.id})},queueFlushAll:function(t){t.rootState;(0,t.commit)("queueFlushAll")},markNotificationsAsSeen:function(t){var e=t.rootState;(0,t.commit)("markNotificationsAsSeen"),w.c.markNotificationsAsSeen({id:e.statuses.notifications.maxId,credentials:e.users.currentUser.credentials})},markSingleNotificationAsSeen:function(t,e){var n=t.rootState,i=t.commit,o=e.id;i("markSingleNotificationAsSeen",{id:o}),w.c.markNotificationsAsSeen({single:!0,id:o,credentials:n.users.currentUser.credentials})},dismissNotificationLocal:function(t,e){t.rootState;(0,t.commit)("dismissNotification",{id:e.id})},dismissNotification:function(t,e){var n=t.rootState,i=t.commit,o=e.id;i("dismissNotification",{id:o}),n.api.backendInteractor.dismissNotification({id:o})},updateNotification:function(t,e){t.rootState;(0,t.commit)("updateNotification",{id:e.id,updater:e.updater})},fetchFavsAndRepeats:function(t,e){var n=t.rootState,i=t.commit;Promise.all([n.api.backendInteractor.fetchFavoritedByUsers({id:e}),n.api.backendInteractor.fetchRebloggedByUsers({id:e})]).then(function(t){var o=g()(t,2),r=o[0],s=o[1];i("addFavs",{id:e,favoritedByUsers:r,currentUser:n.users.currentUser}),i("addRepeats",{id:e,rebloggedByUsers:s,currentUser:n.users.currentUser})})},reactWithEmoji:function(t,e){var n=t.rootState,i=t.dispatch,o=t.commit,r=e.id,s=e.emoji,a=n.users.currentUser;a&&(o("addOwnReaction",{id:r,emoji:s,currentUser:a}),n.api.backendInteractor.reactWithEmoji({id:r,emoji:s}).then(function(t){i("fetchEmojiReactionsBy",r)}))},unreactWithEmoji:function(t,e){var n=t.rootState,i=t.dispatch,o=t.commit,r=e.id,s=e.emoji,a=n.users.currentUser;a&&(o("removeOwnReaction",{id:r,emoji:s,currentUser:a}),n.api.backendInteractor.unreactWithEmoji({id:r,emoji:s}).then(function(t){i("fetchEmojiReactionsBy",r)}))},fetchEmojiReactionsBy:function(t,e){var n=t.rootState,i=t.commit;n.api.backendInteractor.fetchEmojiReactions({id:e}).then(function(t){i("addEmojiReactionsBy",{id:e,emojiReactions:t,currentUser:n.users.currentUser})})},fetchFavs:function(t,e){var n=t.rootState,i=t.commit;n.api.backendInteractor.fetchFavoritedByUsers({id:e}).then(function(t){return i("addFavs",{id:e,favoritedByUsers:t,currentUser:n.users.currentUser})})},fetchRepeats:function(t,e){var n=t.rootState,i=t.commit;n.api.backendInteractor.fetchRebloggedByUsers({id:e}).then(function(t){return i("addRepeats",{id:e,rebloggedByUsers:t,currentUser:n.users.currentUser})})},search:function(t,e){var n=e.q,i=e.resolve,o=e.limit,r=e.offset,s=e.following;return t.rootState.api.backendInteractor.search2({q:n,resolve:i,limit:o,offset:r,following:s}).then(function(e){return t.commit("addNewUsers",e.accounts),t.commit("addNewStatuses",{statuses:e.statuses}),e})}},mutations:it},rt=n(77),st=n.n(rt),at=n(76),ct=n.n(at),lt=n(115),ut=n.n(lt),dt=n(15),pt=n.n(dt),ft=n(137),ht=n.n(ft),mt=n(116),gt=n.n(mt),vt=function(t){var e=t.store,n=t.credentials,i=t.timeline,o=void 0===i?"friends":i,r=t.older,s=void 0!==r&&r,a=t.showImmediately,c=void 0!==a&&a,l=t.userId,u=void 0!==l&&l,d=t.tag,p=void 0!==d&&d,f=t.until,h={timeline:o,credentials:n},m=e.rootState||e.state,g=e.getters,v=m.statuses.timelines[gt()(o)],b=g.mergedConfig,_=b.hideMutedPosts,x=b.replyVisibility,y=!!m.users.currentUser;s?h.until=f||v.minId:h.since=v.maxId,h.userId=u,h.tag=p,h.withMuted=!_,y&&["friends","public","publicAndExternal"].includes(o)&&(h.replyVisibility=x);var k=v.statuses.length;return w.c.fetchTimeline(h).then(function(t){if(!t.error){var n=t.data,i=t.pagination;return!s&&n.length>=20&&!v.loading&&k>0&&e.dispatch("queueFlush",{timeline:o,id:v.maxId}),function(t){var e=t.store,n=t.statuses,i=t.timeline,o=t.showImmediately,r=t.userId,s=t.pagination,a=gt()(i);e.dispatch("setError",{value:!1}),e.dispatch("setErrorData",{value:null}),e.dispatch("addNewStatuses",{timeline:a,userId:r,statuses:n,showImmediately:o,pagination:s})}({store:e,statuses:n,timeline:o,showImmediately:c,userId:u,pagination:i}),{statuses:n,pagination:i}}e.dispatch("setErrorData",{value:t})},function(){return e.dispatch("setError",{value:!0})})},bt={fetchAndUpdate:vt,startFetching:function(t){var e=t.timeline,n=void 0===e?"friends":e,i=t.credentials,o=t.store,r=t.userId,s=void 0!==r&&r,a=t.tag,c=void 0!==a&&a,l=(o.rootState||o.state).statuses.timelines[gt()(n)],u=0===l.visibleStatuses.length;l.userId=s,vt({timeline:n,credentials:i,store:o,showImmediately:u,userId:s,tag:c});return setInterval(function(){return vt({timeline:n,credentials:i,store:o,userId:s,tag:c})},1e4)}},wt=function(t){var e=t.store,n=t.credentials,i=t.older,o=void 0!==i&&i,r={credentials:n},s=e.getters,a=e.rootState||e.state,c=a.statuses.notifications,l=s.mergedConfig.hideMutedPosts,u=a.users.currentUser.allow_following_move;if(r.withMuted=!l,r.withMove=!u,r.timeline="notifications",o)return c.minId!==Number.POSITIVE_INFINITY&&(r.until=c.minId),_t({store:e,args:r,older:o});c.maxId!==Number.POSITIVE_INFINITY&&(r.since=c.maxId);var d=_t({store:e,args:r,older:o}),f=c.data,h=f.filter(function(t){return t.seen}).map(function(t){return t.id});return f.length-h.length>0&&h.length>0&&(r.since=Math.max.apply(Math,p()(h)),_t({store:e,args:r,older:o})),d},_t=function(t){var e=t.store,n=t.args,i=t.older;return w.c.fetchTimeline(n).then(function(t){var n=t.data;return function(t){var e=t.store,n=t.notifications,i=t.older;e.dispatch("setNotificationsError",{value:!1}),e.dispatch("addNewNotifications",{notifications:n,older:i})}({store:e,notifications:n,older:i}),n},function(){return e.dispatch("setNotificationsError",{value:!0})}).catch(function(){return e.dispatch("setNotificationsError",{value:!0})})},xt={fetchAndUpdate:wt,startFetching:function(t){var e=t.credentials,n=t.store;wt({credentials:e,store:n});return setTimeout(function(){return n.dispatch("setNotificationsSilence",!1)},1e4),setInterval(function(){return wt({credentials:e,store:n})},1e4)}},yt=function(t){var e=t.store,n=t.credentials;return w.c.fetchFollowRequests({credentials:n}).then(function(t){e.commit("setFollowRequests",t),e.commit("addNewUsers",t)},function(){}).catch(function(){})},kt={startFetching:function(t){var e=t.credentials,n=t.store;yt({credentials:e,store:n});return setInterval(function(){return yt({credentials:e,store:n})},1e4)}};function Ct(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}function St(t){for(var e=1;e1&&void 0!==arguments[1]?arguments[1]:[];return Promise.all(e.map(function(e){return zt(t,e)}))},unblockUsers:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return Promise.all(e.map(function(e){return Ht(t,e)}))},fetchMutes:function(t){return t.rootState.api.backendInteractor.fetchMutes().then(function(e){return t.commit("saveMuteIds",pt()(e,"id")),t.commit("addNewUsers",e),e})},muteUser:function(t,e){return qt(t,e)},unmuteUser:function(t,e){return Wt(t,e)},hideReblogs:function(t,e){return function(t,e){return t.rootState.api.backendInteractor.followUser({id:e,reblogs:!1}).then(function(e){t.commit("updateUserRelationship",[e])})}(t,e)},showReblogs:function(t,e){return function(t,e){return t.rootState.api.backendInteractor.followUser({id:e,reblogs:!0}).then(function(e){return t.commit("updateUserRelationship",[e])})}(t,e)},muteUsers:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return Promise.all(e.map(function(e){return qt(t,e)}))},unmuteUsers:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return Promise.all(e.map(function(e){return Wt(t,e)}))},fetchDomainMutes:function(t){return t.rootState.api.backendInteractor.fetchDomainMutes().then(function(e){return t.commit("saveDomainMutes",e),e})},muteDomain:function(t,e){return Vt(t,e)},unmuteDomain:function(t,e){return Gt(t,e)},muteDomains:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return Promise.all(e.map(function(e){return Vt(t,e)}))},unmuteDomains:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return Promise.all(e.map(function(e){return Gt(t,e)}))},fetchFriends:function(t,e){var n=t.rootState,i=t.commit,o=n.users.usersObject[e],r=P()(o.friendIds);return n.api.backendInteractor.fetchFriends({id:e,maxId:r}).then(function(t){return i("addNewUsers",t),i("saveFriendIds",{id:e,friendIds:pt()(t,"id")}),t})},fetchFollowers:function(t,e){var n=t.rootState,i=t.commit,o=n.users.usersObject[e],r=P()(o.followerIds);return n.api.backendInteractor.fetchFollowers({id:e,maxId:r}).then(function(t){return i("addNewUsers",t),i("saveFollowerIds",{id:e,followerIds:pt()(t,"id")}),t})},clearFriends:function(t,e){(0,t.commit)("clearFriends",e)},clearFollowers:function(t,e){(0,t.commit)("clearFollowers",e)},subscribeUser:function(t,e){var n=t.rootState,i=t.commit;return n.api.backendInteractor.subscribeUser({id:e}).then(function(t){return i("updateUserRelationship",[t])})},unsubscribeUser:function(t,e){var n=t.rootState,i=t.commit;return n.api.backendInteractor.unsubscribeUser({id:e}).then(function(t){return i("updateUserRelationship",[t])})},toggleActivationStatus:function(t,e){var n=t.rootState,i=t.commit,o=e.user;(o.deactivated?n.api.backendInteractor.activateUser:n.api.backendInteractor.deactivateUser)({user:o}).then(function(t){var e=t.deactivated;return i("updateActivationStatus",{user:o,deactivated:e})})},registerPushNotifications:function(t){var e=t.state.currentUser.credentials,n=t.rootState.instance.vapidPublicKey;Nt(t.rootState.config.webPushNotifications,n,e,t.rootState.config.notificationVisibility)},unregisterPushNotifications:function(t){!function(t){Ft()&&Promise.all([Lt(t),Dt().then(function(t){return function(t){return t.pushManager.getSubscription().then(function(t){if(null!==t)return t.unsubscribe()})}(t).then(function(e){return[t,e]})}).then(function(t){var e=g()(t,2),n=e[0];return e[1]||console.warn("Push subscription cancellation wasn't successful, killing SW anyway..."),n.unregister().then(function(t){t||console.warn("Failed to kill SW")})})]).catch(function(t){return console.warn("Failed to disable Web Push Notifications: ".concat(t.message))})}(t.state.currentUser.credentials)},addNewUsers:function(t,e){(0,t.commit)("addNewUsers",e)},addNewStatuses:function(t,e){var n=e.statuses,i=pt()(n,"user"),o=ht()(pt()(n,"retweeted_status.user"));t.commit("addNewUsers",i),t.commit("addNewUsers",o),z()(n,function(e){t.commit("setUserForStatus",e),t.commit("setPinnedToUser",e)}),z()(ht()(pt()(n,"retweeted_status")),function(e){t.commit("setUserForStatus",e),t.commit("setPinnedToUser",e)})},addNewNotifications:function(t,e){var n=e.notifications,i=pt()(n,"from_profile"),o=pt()(n,"target").filter(function(t){return t}),r=n.map(function(t){return t.id});t.commit("addNewUsers",i),t.commit("addNewUsers",o);var s=t.rootState.statuses.notifications.idStore,a=Object.entries(s).filter(function(t){var e=g()(t,2),n=e[0];e[1];return r.includes(n)}).map(function(t){var e=g()(t,2);e[0];return e[1]});z()(a,function(e){t.commit("setUserForNotification",e)})},searchUsers:function(t,e){var n=t.rootState,i=t.commit,o=e.query;return n.api.backendInteractor.searchUsers({query:o}).then(function(t){return i("addNewUsers",t),t})},signUp:function(t,e){var n,i,r;return o.a.async(function(s){for(;;)switch(s.prev=s.next){case 0:return t.commit("signUpPending"),n=t.rootState,s.prev=2,s.next=5,o.a.awrap(n.api.backendInteractor.register({params:At({},e)}));case 5:i=s.sent,t.commit("signUpSuccess"),t.commit("setToken",i.access_token),t.dispatch("loginUser",i.access_token),s.next=16;break;case 11:throw s.prev=11,s.t0=s.catch(2),r=s.t0.message,t.commit("signUpFailure",r),s.t0;case 16:case"end":return s.stop()}},null,null,[[2,11]])},getCaptcha:function(t){return o.a.async(function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",t.rootState.api.backendInteractor.getCaptcha());case 1:case"end":return e.stop()}})},logout:function(t){var e=t.rootState,n=e.oauth,i=e.instance,o=At({},n,{commit:t.commit,instance:i.server});return Et.getOrCreateApp(o).then(function(t){var e={app:t,instance:o.instance,token:n.userToken};return Et.revokeToken(e)}).then(function(){t.commit("clearCurrentUser"),t.dispatch("disconnectFromSocket"),t.commit("clearToken"),t.dispatch("stopFetchingTimeline","friends"),t.commit("setBackendInteractor",jt(t.getters.getToken())),t.dispatch("stopFetchingNotifications"),t.dispatch("stopFetchingFollowRequests"),t.commit("clearNotifications"),t.commit("resetStatuses"),t.dispatch("resetChats"),t.dispatch("setLastTimeline","public-timeline")})},loginUser:function(t,e){return new Promise(function(n,i){var o=t.commit;o("beginLogin"),t.rootState.api.backendInteractor.verifyCredentials(e).then(function(r){if(r.error){var s=r.error;o("endLogin"),401===s.status?i(new Error("Wrong username or password")):i(new Error("An error occurred, please try again"))}else{var a=r;a.credentials=e,a.blockIds=[],a.muteIds=[],a.domainMutes=[],o("setCurrentUser",a),o("addNewUsers",[a]),t.dispatch("fetchEmoji"),(l=window.Notification,l?"default"===l.permission?l.requestPermission():Promise.resolve(l.permission):Promise.resolve(null)).then(function(t){return o("setNotificationPermission",t)}),o("setBackendInteractor",jt(e)),a.token&&(t.dispatch("setWsToken",a.token),t.dispatch("initializeSocket"));var c=function(){t.dispatch("startFetchingTimeline",{timeline:"friends"}),t.dispatch("startFetchingNotifications"),t.dispatch("startFetchingChats")};t.getters.mergedConfig.useStreamingApi?t.dispatch("enableMastoSockets").catch(function(t){console.error("Failed initializing MastoAPI Streaming socket",t),c()}).then(function(){t.dispatch("fetchChats",{latest:!0}),setTimeout(function(){return t.dispatch("setNotificationsSilence",!1)},1e4)}):c(),t.dispatch("fetchMutes"),t.rootState.api.backendInteractor.fetchFriends({id:a.id}).then(function(t){return o("addNewUsers",t)})}var l;o("endLogin"),n()}).catch(function(t){console.log(t),o("endLogin"),i(new Error("Failed to connect to server, try again"))})})}}},Yt=n(100),Jt=function(t,e){if(e.lastMessage&&(t.rootState.chats.currentChatId!==e.id||document.hidden)&&t.rootState.users.currentUser.id!==e.lastMessage.account.id){var n={tag:e.lastMessage.id,title:e.account.name,icon:e.account.profile_image_url,body:e.lastMessage.content};e.lastMessage.attachment&&"image"===e.lastMessage.attachment.type&&(n.image=e.lastMessage.attachment.preview_url),Object(Yt.a)(t.rootState,n)}},Xt=n(206),Qt={state:{backendInteractor:jt(),fetchers:{},socket:null,mastoUserSocket:null,mastoUserSocketStatus:null,followRequests:[]},mutations:{setBackendInteractor:function(t,e){t.backendInteractor=e},addFetcher:function(t,e){var n=e.fetcherName,i=e.fetcher;t.fetchers[n]=i},removeFetcher:function(t,e){var n=e.fetcherName,i=e.fetcher;window.clearInterval(i),delete t.fetchers[n]},setWsToken:function(t,e){t.wsToken=e},setSocket:function(t,e){t.socket=e},setFollowRequests:function(t,e){t.followRequests=e},setMastoUserSocketStatus:function(t,e){t.mastoUserSocketStatus=e}},actions:{enableMastoSockets:function(t){var e=t.state,n=t.dispatch;if(!e.mastoUserSocket)return n("startMastoUserSocket")},disableMastoSockets:function(t){var e=t.state,n=t.dispatch;if(e.mastoUserSocket)return n("stopMastoUserSocket")},startMastoUserSocket:function(t){return new Promise(function(e,n){try{var i=t.state,o=t.commit,r=t.dispatch,s=t.rootState.statuses.timelines.friends;i.mastoUserSocket=i.backendInteractor.startUserSocket({store:t}),i.mastoUserSocket.addEventListener("message",function(e){var n=e.detail;n&&("notification"===n.event?r("addNewNotifications",{notifications:[n.notification],older:!1}):"update"===n.event?r("addNewStatuses",{statuses:[n.status],userId:!1,showImmediately:0===s.visibleStatuses.length,timeline:"friends"}):"pleroma:chat_update"===n.event&&(r("addChatMessages",{chatId:n.chatUpdate.id,messages:[n.chatUpdate.lastMessage]}),r("updateChat",{chat:n.chatUpdate}),Jt(t,n.chatUpdate)))}),i.mastoUserSocket.addEventListener("open",function(){o("setMastoUserSocketStatus",w.b.JOINED)}),i.mastoUserSocket.addEventListener("error",function(t){var e=t.detail;console.error("Error in MastoAPI websocket:",e),o("setMastoUserSocketStatus",w.b.ERROR),r("clearOpenedChats")}),i.mastoUserSocket.addEventListener("close",function(t){var e=t.detail,n=new Set([1e3,1001]),i=e.code;n.has(i)?console.debug("Not restarting socket becasue of closure code ".concat(i," is in ignore list")):(console.warn("MastoAPI websocket disconnected, restarting. CloseEvent code: ".concat(i)),r("startFetchingTimeline",{timeline:"friends"}),r("startFetchingNotifications"),r("startFetchingChats"),r("restartMastoUserSocket")),o("setMastoUserSocketStatus",w.b.CLOSED),r("clearOpenedChats")}),e()}catch(t){n(t)}})},restartMastoUserSocket:function(t){var e=t.dispatch;return e("startMastoUserSocket").then(function(){e("stopFetchingTimeline",{timeline:"friends"}),e("stopFetchingNotifications"),e("stopFetchingChats")})},stopMastoUserSocket:function(t){var e=t.state,n=t.dispatch;n("startFetchingTimeline",{timeline:"friends"}),n("startFetchingNotifications"),n("startFetchingChats"),e.mastoUserSocket.close()},startFetchingTimeline:function(t,e){var n=e.timeline,i=void 0===n?"friends":n,o=e.tag,r=void 0!==o&&o,s=e.userId,a=void 0!==s&&s;if(!t.state.fetchers[i]){var c=t.state.backendInteractor.startFetchingTimeline({timeline:i,store:t,userId:a,tag:r});t.commit("addFetcher",{fetcherName:i,fetcher:c})}},stopFetchingTimeline:function(t,e){var n=t.state.fetchers[e];n&&t.commit("removeFetcher",{fetcherName:e,fetcher:n})},startFetchingNotifications:function(t){if(!t.state.fetchers.notifications){var e=t.state.backendInteractor.startFetchingNotifications({store:t});t.commit("addFetcher",{fetcherName:"notifications",fetcher:e})}},stopFetchingNotifications:function(t){var e=t.state.fetchers.notifications;e&&t.commit("removeFetcher",{fetcherName:"notifications",fetcher:e})},startFetchingFollowRequests:function(t){if(!t.state.fetchers.followRequests){var e=t.state.backendInteractor.startFetchingFollowRequests({store:t});t.commit("addFetcher",{fetcherName:"followRequests",fetcher:e})}},stopFetchingFollowRequests:function(t){var e=t.state.fetchers.followRequests;e&&t.commit("removeFetcher",{fetcherName:"followRequests",fetcher:e})},removeFollowRequest:function(t,e){var n=t.state.followRequests.filter(function(t){return t!==e});t.commit("setFollowRequests",n)},setWsToken:function(t,e){t.commit("setWsToken",e)},initializeSocket:function(t){var e=t.dispatch,n=t.commit,i=t.state,o=t.rootState,r=i.wsToken;if(o.instance.chatAvailable&&void 0!==r&&null===i.socket){var s=new Xt.Socket("/socket",{params:{token:r}});s.connect(),n("setSocket",s),e("initializeChat",s)}},disconnectFromSocket:function(t){var e=t.commit,n=t.state;n.socket&&n.socket.disconnect(),e("setSocket",null)}}},Zt={state:{messages:[],channel:{state:""}},mutations:{setChannel:function(t,e){t.channel=e},addMessage:function(t,e){t.messages.push(e),t.messages=t.messages.slice(-19,20)},setMessages:function(t,e){t.messages=e.slice(-19,20)}},actions:{initializeChat:function(t,e){var n=e.channel("chat:public");n.on("new_msg",function(e){t.commit("addMessage",e)}),n.on("messages",function(e){var n=e.messages;t.commit("setMessages",n)}),n.join(),t.commit("setChannel",n)}}},te={state:{clientId:!1,clientSecret:!1,appToken:!1,userToken:!1},mutations:{setClientData:function(t,e){var n=e.clientId,i=e.clientSecret;t.clientId=n,t.clientSecret=i},setAppToken:function(t,e){t.appToken=e},setToken:function(t,e){t.userToken=e},clearToken:function(t){t.userToken=!1,Object(r.delete)(t,"token")}},getters:{getToken:function(t){return function(){return t.userToken||t.token||t.appToken}},getUserToken:function(t){return function(){return t.userToken||t.token}}}},ee=function(t){t.strategy=t.initStrategy,t.settings={}},ne={namespaced:!0,state:{settings:{},strategy:"password",initStrategy:"password"},getters:{settings:function(t,e){return t.settings},requiredPassword:function(t,e,n){return"password"===t.strategy},requiredToken:function(t,e,n){return"token"===t.strategy},requiredTOTP:function(t,e,n){return"totp"===t.strategy},requiredRecovery:function(t,e,n){return"recovery"===t.strategy}},mutations:{setInitialStrategy:function(t,e){e&&(t.initStrategy=e,t.strategy=e)},requirePassword:function(t){t.strategy="password"},requireToken:function(t){t.strategy="token"},requireMFA:function(t,e){var n=e.settings;t.settings=n,t.strategy="totp"},requireRecovery:function(t){t.strategy="recovery"},requireTOTP:function(t){t.strategy="totp"},abortMFA:function(t){ee(t)}},actions:{login:function(t,e){var n,i,r,s;return o.a.async(function(a){for(;;)switch(a.prev=a.next){case 0:return n=t.state,i=t.dispatch,r=t.commit,s=e.access_token,r("setToken",s,{root:!0}),a.next=5,o.a.awrap(i("loginUser",s,{root:!0}));case 5:ee(n);case 6:case"end":return a.stop()}})}}},ie=n(21),oe={state:{media:[],currentIndex:0,activated:!1},mutations:{setMedia:function(t,e){t.media=e},setCurrent:function(t,e){t.activated=!0,t.currentIndex=e},close:function(t){t.activated=!1}},actions:{setMedia:function(t,e){(0,t.commit)("setMedia",e.filter(function(t){var e=ie.a.fileType(t.mimetype);return"image"===e||"video"===e||"audio"===e}))},setCurrent:function(t,e){(0,t.commit)("setCurrent",t.state.media.indexOf(e)||0)},closeMediaViewer:function(t){(0,t.commit)("close")}}},re={state:{tokens:[]},actions:{fetchTokens:function(t){var e=t.rootState,n=t.commit;e.api.backendInteractor.fetchOAuthTokens().then(function(t){n("swapTokens",t)})},revokeToken:function(t,e){var n=t.rootState,i=t.commit,o=t.state;n.api.backendInteractor.revokeOAuthToken({id:e}).then(function(t){201===t.status&&i("swapTokens",o.tokens.filter(function(t){return t.id!==e}))})}},mutations:{swapTokens:function(t,e){t.tokens=e}}},se=n(37),ae=n.n(se),ce={state:{userId:null,statuses:[],modalActivated:!1},mutations:{openUserReportingModal:function(t,e){var n=e.userId,i=e.statuses;t.userId=n,t.statuses=i,t.modalActivated=!0},closeUserReportingModal:function(t){t.modalActivated=!1}},actions:{openUserReportingModal:function(t,e){var n=t.rootState,i=t.commit,o=ae()(n.statuses.allStatuses,function(t){return t.user.id===e});i("openUserReportingModal",{userId:e,statuses:o})},closeUserReportingModal:function(t){(0,t.commit)("closeUserReportingModal")}}},le={state:{trackedPolls:{},pollsObject:{}},mutations:{mergeOrAddPoll:function(t,e){var n=t.pollsObject[e.id];e.expired=Date.now()>Date.parse(e.expires_at),n?Object(r.set)(t.pollsObject,e.id,E()(n,e)):Object(r.set)(t.pollsObject,e.id,e)},trackPoll:function(t,e){var n=t.trackedPolls[e];n?Object(r.set)(t.trackedPolls,e,n+1):Object(r.set)(t.trackedPolls,e,1)},untrackPoll:function(t,e){var n=t.trackedPolls[e];n?Object(r.set)(t.trackedPolls,e,n-1):Object(r.set)(t.trackedPolls,e,0)}},actions:{mergeOrAddPoll:function(t,e){(0,t.commit)("mergeOrAddPoll",e)},updateTrackedPoll:function(t,e){var n=t.rootState,i=t.dispatch,o=t.commit;n.api.backendInteractor.fetchPoll({pollId:e}).then(function(t){setTimeout(function(){n.polls.trackedPolls[e]&&i("updateTrackedPoll",e)},3e4),o("mergeOrAddPoll",t)})},trackPoll:function(t,e){var n=t.rootState,i=t.commit,o=t.dispatch;n.polls.trackedPolls[e]||setTimeout(function(){return o("updateTrackedPoll",e)},3e4),i("trackPoll",e)},untrackPoll:function(t,e){(0,t.commit)("untrackPoll",e)},votePoll:function(t,e){var n=t.rootState,i=t.commit,o=(e.id,e.pollId),r=e.choices;return n.api.backendInteractor.vote({pollId:o,choices:r}).then(function(t){return i("mergeOrAddPoll",t),t})}}},ue={state:{params:null,modalActivated:!1},mutations:{openPostStatusModal:function(t,e){t.params=e,t.modalActivated=!0},closePostStatusModal:function(t){t.modalActivated=!1}},actions:{openPostStatusModal:function(t,e){(0,t.commit)("openPostStatusModal",e)},closePostStatusModal:function(t){(0,t.commit)("closePostStatusModal")}}},de=n(104),pe=n.n(de),fe=n(207),he=n.n(fe),me=n(208),ge=n.n(me),ve=n(98),be=n.n(ve),we={add:function(t,e){var n=e.messages;if(t)for(var i=0;it.lastMessage.id)&&(t.lastMessage=o),t.idIndex[o.id]||(t.lastSeenTimestamp1&&void 0!==arguments[1]&&arguments[1];return n.api.backendInteractor.chats().then(function(t){var n=t.chats;return e("addNewChats",{chats:n}),n})},addNewChats:function(t,e){var n=e.chats;(0,t.commit)("addNewChats",{dispatch:t.dispatch,chats:n,rootGetters:t.rootGetters,newChatMessageSideEffects:function(e){Jt(t,e)}})},updateChat:function(t,e){(0,t.commit)("updateChat",{chat:e.chat})},startFetchingCurrentChat:function(t,e){t.commit;(0,t.dispatch)("setCurrentChatFetcher",{fetcher:e.fetcher})},setCurrentChatFetcher:function(t,e){t.rootState;(0,t.commit)("setCurrentChatFetcher",{fetcher:e.fetcher})},addOpenedChat:function(t,e){t.rootState;var n=t.commit,i=t.dispatch,o=e.chat;n("addOpenedChat",{dispatch:i,chat:Object(_e.b)(o)}),i("addNewUsers",[o.account])},addChatMessages:function(t,e){var n=t.commit;n("addChatMessages",ye({commit:n},e))},resetChatNewMessageCount:function(t,e){(0,t.commit)("resetChatNewMessageCount",e)},clearCurrentChat:function(t,e){t.rootState;var n=t.commit;t.dispatch;n("setCurrentChatId",{chatId:void 0}),n("setCurrentChatFetcher",{fetcher:void 0})},readChat:function(t,e){var n=t.rootState,i=t.commit,o=t.dispatch,r=e.id,s=e.lastReadId;o("resetChatNewMessageCount"),i("readChat",{id:r}),n.api.backendInteractor.readChat({id:r,lastReadId:s})},deleteChatMessage:function(t,e){var n=t.rootState,i=t.commit;n.api.backendInteractor.deleteChatMessage(e),i("deleteChatMessage",ye({commit:i},e))},resetChats:function(t){var e=t.commit;(0,t.dispatch)("clearCurrentChat"),e("resetChats",{commit:e})},clearOpenedChats:function(t){t.rootState;var e=t.commit;t.dispatch,t.rootGetters;e("clearOpenedChats",{commit:e})}},mutations:{setChatListFetcher:function(t,e){e.commit;var n=e.fetcher,i=t.chatListFetcher;i&&clearInterval(i),t.chatListFetcher=n&&n()},setCurrentChatFetcher:function(t,e){var n=e.fetcher,i=t.fetcher;i&&clearInterval(i),t.fetcher=n&&n()},addOpenedChat:function(t,e){e._dispatch;var n=e.chat;t.currentChatId=n.id,s.a.set(t.openedChats,n.id,n),t.openedChatMessageServices[n.id]||s.a.set(t.openedChatMessageServices,n.id,we.empty(n.id))},setCurrentChatId:function(t,e){var n=e.chatId;t.currentChatId=n},addNewChats:function(t,e){var n=e.chats,i=e.newChatMessageSideEffects;n.forEach(function(e){var n=ke(t,e.id);if(n){var o=(n.lastMessage&&n.lastMessage.id)!==(e.lastMessage&&e.lastMessage.id);n.lastMessage=e.lastMessage,n.unread=e.unread,o&&n.unread&&i(e)}else t.chatList.data.push(e),s.a.set(t.chatList.idStore,e.id,e)})},updateChat:function(t,e){e._dispatch;var n=e.chat,i=(e._rootGetters,ke(t,n.id));i&&(i.lastMessage=n.lastMessage,i.unread=n.unread,i.updated_at=n.updated_at),i||t.chatList.data.unshift(n),s.a.set(t.chatList.idStore,n.id,n)},deleteChat:function(t,e){e._dispatch;var n=e.id;e._rootGetters;t.chats.data=t.chats.data.filter(function(t){return t.last_status.id!==n}),t.chats.idStore=C()(t.chats.idStore,function(t){return t.last_status.id===n})},resetChats:function(t,e){var n=e.commit;for(var i in t.chatList={data:[],idStore:{}},t.currentChatId=null,n("setChatListFetcher",{fetcher:void 0}),t.openedChats)we.clear(t.openedChatMessageServices[i]),s.a.delete(t.openedChats,i),s.a.delete(t.openedChatMessageServices,i)},setChatsLoading:function(t,e){var n=e.value;t.chats.loading=n},addChatMessages:function(t,e){var n=e.commit,i=e.chatId,o=e.messages,r=t.openedChatMessageServices[i];r&&(we.add(r,{messages:o.map(_e.c)}),n("refreshLastMessage",{chatId:i}))},refreshLastMessage:function(t,e){var n=e.chatId,i=t.openedChatMessageServices[n];if(i){var o=ke(t,n);o&&(o.lastMessage=i.lastMessage,i.lastMessage&&(o.updated_at=i.lastMessage.created_at))}},deleteChatMessage:function(t,e){var n=e.commit,i=e.chatId,o=e.messageId,r=t.openedChatMessageServices[i];r&&(we.deleteMessage(r,o),n("refreshLastMessage",{chatId:i}))},resetChatNewMessageCount:function(t,e){var n=t.openedChatMessageServices[t.currentChatId];we.resetNewMessageCount(n)},clearOpenedChats:function(t){var e=t.currentChatId;for(var n in t.openedChats)e!==n&&(we.clear(t.openedChatMessageServices[n]),s.a.delete(t.openedChats,n),s.a.delete(t.openedChatMessageServices,n))},readChat:function(t,e){var n=e.id,i=ke(t,n);i&&(i.unread=0)}}},Se=n(138),je=n(27),Oe=n.n(je),Pe=n(209),$e=n.n(Pe),Te=n(12),Ie=n.n(Te),Ee=n(210),Me=n.n(Ee),Ue=n(211),Fe=!1,De=function(t,e){return 0===e.length?t:e.reduce(function(e,n){return $e()(e,n,Ie()(t,n)),e},{})},Le=["markNotificationsAsSeen","clearCurrentUser","setCurrentUser","setHighlight","setOption","setClientData","setToken","clearToken"],Ne=n.n(Ue).a;function Re(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t.key,n=void 0===e?"vuex-lz":e,i=t.paths,o=void 0===i?[]:i,r=t.getState,s=void 0===r?function(t,e){return e.getItem(t)}:r,a=t.setState,c=void 0===a?function(t,e,n){return Fe?n.setItem(t,e):(console.log("waiting for old state to be loaded..."),Promise.resolve())}:a,l=t.reducer,u=void 0===l?De:l,d=t.storage,p=void 0===d?Ne:d,f=t.subscriber,h=void 0===f?function(t){return function(e){return t.subscribe(e)}}:f;return s(n,p).then(function(t){return function(e){try{if(null!==t&&"object"===Oe()(t)){var i=t.users||{};i.usersObject={};var r=i.users||[];z()(r,function(t){i.usersObject[t.id]=t}),t.users=i,e.replaceState(Me()({},e.state,t))}Fe=!0}catch(t){console.log("Couldn't load state"),console.error(t),Fe=!0}h(e)(function(t,i){try{Le.includes(t.type)&&c(n,u(i,o),p).then(function(n){void 0!==n&&("setOption"!==t.type&&"setCurrentUser"!==t.type||e.dispatch("settingsSaved",{success:n}))},function(n){"setOption"!==t.type&&"setCurrentUser"!==t.type||e.dispatch("settingsSaved",{error:n})})}catch(t){console.log("Couldn't persist state:"),console.log(t)}})}})}var Ae,Be,ze=function(t){t.subscribe(function(e,n){var i=n.instance.vapidPublicKey,o=n.config.webPushNotifications,r="granted"===n.interface.notificationPermission,s=n.users.currentUser,a="setCurrentUser"===e.type,c="setInstanceOption"===e.type&&"vapidPublicKey"===e.payload.name,l="setNotificationPermission"===e.type&&"granted"===e.payload,u="setOption"===e.type&&"webPushNotifications"===e.payload.name,d="setOption"===e.type&&"notificationVisibility"===e.payload.name;if(a||c||l||u||d){if(s&&i&&r&&o)return t.dispatch("registerPushNotifications");if(u&&!o)return t.dispatch("unregisterPushNotifications")}})},He=n(74),qe=n(212),We=n.n(qe),Ve=n(213),Ge=n.n(Ve),Ke=n(214),Ye=n.n(Ke),Je=n(139),Xe=new Set([]),Qe=function(t){var e=window.innerWidth-document.documentElement.clientWidth;Je.disableBodyScroll(t,{reserveScrollBarGap:!0}),Xe.add(t),setTimeout(function(){if(Xe.size<=1){if(void 0===Ae){var t=document.getElementById("nav");Ae=window.getComputedStyle(t).getPropertyValue("padding-right"),t.style.paddingRight=Ae?"calc(".concat(Ae," + ").concat(e,"px)"):"".concat(e,"px")}if(void 0===Be){var n=document.getElementById("app_bg_wrapper");Be=window.getComputedStyle(n).getPropertyValue("right"),n.style.right=Be?"calc(".concat(Be," + ").concat(e,"px)"):"".concat(e,"px")}document.body.classList.add("scroll-locked")}})},Ze=function(t){Xe.delete(t),setTimeout(function(){0===Xe.size&&(void 0!==Ae&&(document.getElementById("nav").style.paddingRight=Ae,Ae=void 0),void 0!==Be&&(document.getElementById("app_bg_wrapper").style.right=Be,Be=void 0),document.body.classList.remove("scroll-locked"))}),Je.enableBodyScroll(t)},tn={inserted:function(t,e){e.value&&Qe(t)},componentUpdated:function(t,e){e.oldValue!==e.value&&(e.value?Qe(t):Ze(t))},unbind:function(t){Ze(t)}},en=n(140),nn=n.n(en),on=n(105),rn=n.n(on),sn=n(33),an=n(219),cn=n.n(an),ln=function(t,e){var n="retweet"===t.type?t.retweeted_status.id:t.id,i="retweet"===e.type?e.retweeted_status.id:e.id,o=Number(n),r=Number(i),s=!Number.isNaN(o),a=!Number.isNaN(r);return s&&a?o0||0!==this.timeline.flushMarker)},loadButtonString:function(){return 0!==this.timeline.flushMarker?this.$t("timeline.reload"):"".concat(this.$t("timeline.show_new")," (").concat(this.newStatusCount,")")},classes:function(){return{root:["timeline"].concat(this.embedded?[]:["panel","panel-default"]),header:["timeline-heading"].concat(this.embedded?[]:["panel-heading"]),body:["timeline-body"].concat(this.embedded?[]:["panel-body"]),footer:["timeline-footer"].concat(this.embedded?[]:["panel-footer"])}},excludedStatusIdsObject:function(){var t=function(t,e){var n=[];if(e&&e.length>0){var i=!0,o=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done);i=!0){var c=s.value;if(!e.includes(c.id))break;n.push(c.id)}}catch(t){o=!0,r=t}finally{try{i||null==a.return||a.return()}finally{if(o)throw r}}}return n}(this.timeline.visibleStatuses,this.pinnedStatusIds);return nn()(t)},pinnedStatusIdsObject:function(){return nn()(this.pinnedStatusIds)}},created:function(){var t=this.$store,e=t.state.users.currentUser.credentials,n=0===this.timeline.visibleStatuses.length;if(window.addEventListener("scroll",this.scrollLoad),t.state.api.fetchers[this.timelineName])return!1;bt.fetchAndUpdate({store:t,credentials:e,timeline:this.timelineName,showImmediately:n,userId:this.userId,tag:this.tag})},mounted:function(){void 0!==document.hidden&&(document.addEventListener("visibilitychange",this.handleVisibilityChange,!1),this.unfocused=document.hidden),window.addEventListener("keydown",this.handleShortKey)},destroyed:function(){window.removeEventListener("scroll",this.scrollLoad),window.removeEventListener("keydown",this.handleShortKey),void 0!==document.hidden&&document.removeEventListener("visibilitychange",this.handleVisibilityChange,!1),this.$store.commit("setLoading",{timeline:this.timelineName,value:!1})},methods:{handleShortKey:function(t){["textarea","input"].includes(t.target.tagName.toLowerCase())||"."===t.key&&this.showNewStatuses()},showNewStatuses:function(){0!==this.timeline.flushMarker?(this.$store.commit("clearTimeline",{timeline:this.timelineName,excludeUserId:!0}),this.$store.commit("queueFlush",{timeline:this.timelineName,id:0}),this.fetchOlderStatuses()):(this.$store.commit("showNewStatuses",{timeline:this.timelineName}),this.paused=!1)},fetchOlderStatuses:rn()(function(){var t=this,e=this.$store,n=e.state.users.currentUser.credentials;e.commit("setLoading",{timeline:this.timelineName,value:!0}),bt.fetchAndUpdate({store:e,credentials:n,timeline:this.timelineName,older:!0,showImmediately:!0,userId:this.userId,tag:this.tag}).then(function(n){var i=n.statuses;e.commit("setLoading",{timeline:t.timelineName,value:!1}),i&&0===i.length&&(t.bottomedOut=!0)})},1e3,void 0),scrollLoad:function(t){var e=document.body.getBoundingClientRect(),n=Math.max(e.height,-e.y);!1===this.timeline.loading&&this.$el.offsetHeight>0&&window.innerHeight+window.pageYOffset>=n-750&&this.fetchOlderStatuses()},handleVisibilityChange:function(){this.unfocused=document.hidden}},watch:{newStatusCount:function(t){if(this.$store.getters.mergedConfig.streaming&&t>0){var e=document.documentElement;!((window.pageYOffset||e.scrollTop)-(e.clientTop||0)<15)||this.paused||this.unfocused&&this.$store.getters.mergedConfig.pauseOnUnfocused?this.paused=!0:this.showNewStatuses()}}}};var _n=function(t){n(368)},xn=Object(dn.a)(wn,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{class:[t.classes.root,"timeline"]},[n("div",{class:t.classes.header},[t.embedded?t._e():n("TimelineMenu"),t._v(" "),t.timelineError?n("div",{staticClass:"loadmore-error alert error",on:{click:function(t){t.preventDefault()}}},[t._v("\n "+t._s(t.$t("timeline.error_fetching"))+"\n ")]):t.errorData?n("div",{staticClass:"loadmore-error alert error",on:{click:function(t){t.preventDefault()}}},[t._v("\n "+t._s(t.errorData.statusText)+"\n ")]):t.showLoadButton?n("button",{staticClass:"loadmore-button",on:{click:function(e){return e.preventDefault(),t.showNewStatuses(e)}}},[t._v("\n "+t._s(t.loadButtonString)+"\n ")]):n("div",{staticClass:"loadmore-text faint",on:{click:function(t){t.preventDefault()}}},[t._v("\n "+t._s(t.$t("timeline.up_to_date"))+"\n ")])],1),t._v(" "),n("div",{class:t.classes.body},[n("div",{staticClass:"timeline"},[t._l(t.pinnedStatusIds,function(e){return[t.timeline.statusesObject[e]?n("conversation",{key:e+"-pinned",staticClass:"status-fadein",attrs:{"status-id":e,collapsable:!0,"pinned-status-ids-object":t.pinnedStatusIdsObject,"in-profile":t.inProfile,"profile-user-id":t.userId}}):t._e()]}),t._v(" "),t._l(t.timeline.visibleStatuses,function(e){return[t.excludedStatusIdsObject[e.id]?t._e():n("conversation",{key:e.id,staticClass:"status-fadein",attrs:{"status-id":e.id,collapsable:!0,"in-profile":t.inProfile,"profile-user-id":t.userId}})]})],2)]),t._v(" "),n("div",{class:t.classes.footer},[0===t.count?n("div",{staticClass:"new-status-notification text-center panel-footer faint"},[t._v("\n "+t._s(t.$t("timeline.no_statuses"))+"\n ")]):t.bottomedOut?n("div",{staticClass:"new-status-notification text-center panel-footer faint"},[t._v("\n "+t._s(t.$t("timeline.no_more_statuses"))+"\n ")]):t.timeline.loading||t.errorData?t.errorData?n("a",{attrs:{href:"#"}},[n("div",{staticClass:"new-status-notification text-center panel-footer"},[t._v(t._s(t.errorData.error))])]):n("div",{staticClass:"new-status-notification text-center panel-footer"},[n("i",{staticClass:"icon-spin3 animate-spin"})]):n("a",{attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),t.fetchOlderStatuses()}}},[n("div",{staticClass:"new-status-notification text-center panel-footer"},[t._v(t._s(t.$t("timeline.load_older")))])])])])},[],!1,_n,null,null).exports,yn={components:{Timeline:xn},computed:{timeline:function(){return this.$store.state.statuses.timelines.public}},created:function(){this.$store.dispatch("startFetchingTimeline",{timeline:"public"})},destroyed:function(){this.$store.dispatch("stopFetchingTimeline","public")}},kn=Object(dn.a)(yn,function(){var t=this.$createElement;return(this._self._c||t)("Timeline",{attrs:{title:this.$t("nav.public_tl"),timeline:this.timeline,"timeline-name":"public"}})},[],!1,null,null,null).exports,Cn={components:{Timeline:xn},computed:{timeline:function(){return this.$store.state.statuses.timelines.publicAndExternal}},created:function(){this.$store.dispatch("startFetchingTimeline",{timeline:"publicAndExternal"})},destroyed:function(){this.$store.dispatch("stopFetchingTimeline","publicAndExternal")}},Sn=Object(dn.a)(Cn,function(){var t=this.$createElement;return(this._self._c||t)("Timeline",{attrs:{title:this.$t("nav.twkn"),timeline:this.timeline,"timeline-name":"publicAndExternal"}})},[],!1,null,null,null).exports,jn={components:{Timeline:xn},computed:{timeline:function(){return this.$store.state.statuses.timelines.friends}}},On=Object(dn.a)(jn,function(){var t=this.$createElement;return(this._self._c||t)("Timeline",{attrs:{title:this.$t("nav.timeline"),timeline:this.timeline,"timeline-name":"friends"}})},[],!1,null,null,null).exports,Pn={created:function(){this.$store.commit("clearTimeline",{timeline:"tag"}),this.$store.dispatch("startFetchingTimeline",{timeline:"tag",tag:this.tag})},components:{Timeline:xn},computed:{tag:function(){return this.$route.params.tag},timeline:function(){return this.$store.state.statuses.timelines.tag}},watch:{tag:function(){this.$store.commit("clearTimeline",{timeline:"tag"}),this.$store.dispatch("startFetchingTimeline",{timeline:"tag",tag:this.tag})}},destroyed:function(){this.$store.dispatch("stopFetchingTimeline","tag")}},$n=Object(dn.a)(Pn,function(){var t=this.$createElement;return(this._self._c||t)("Timeline",{attrs:{title:this.tag,timeline:this.timeline,"timeline-name":"tag",tag:this.tag}})},[],!1,null,null,null).exports,Tn={computed:{timeline:function(){return this.$store.state.statuses.timelines.bookmarks}},components:{Timeline:xn},destroyed:function(){this.$store.commit("clearTimeline",{timeline:"bookmarks"})}},In=Object(dn.a)(Tn,function(){var t=this.$createElement;return(this._self._c||t)("Timeline",{attrs:{title:this.$t("nav.bookmarks"),timeline:this.timeline,"timeline-name":"bookmarks"}})},[],!1,null,null,null).exports,En={components:{Conversation:fn},computed:{statusId:function(){return this.$route.params.id}}},Mn=Object(dn.a)(En,function(){var t=this.$createElement;return(this._self._c||t)("conversation",{attrs:{collapsable:!1,"is-page":"true","status-id":this.statusId}})},[],!1,null,null,null).exports,Un=n(34),Fn=n(18),Dn=n(28),Ln=n(44),Nn=n(46),Rn=n(17);function An(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}var Bn={data:function(){return{userExpanded:!1,betterShadow:this.$store.state.interface.browserSupport.cssFilter,unmuted:!1}},props:["notification"],components:{StatusContent:Un.a,UserAvatar:Fn.default,UserCard:Dn.a,Timeago:Ln.a,Status:sn.default},methods:{toggleUserExpanded:function(){this.userExpanded=!this.userExpanded},generateUserProfileLink:function(t){return Object(Rn.a)(t.id,t.screen_name,this.$store.state.instance.restrictedNicknames)},getUser:function(t){return this.$store.state.users.usersObject[t.from_profile.id]},toggleMute:function(){this.unmuted=!this.unmuted},approveUser:function(){this.$store.state.api.backendInteractor.approveUser({id:this.user.id}),this.$store.dispatch("removeFollowRequest",this.user),this.$store.dispatch("markSingleNotificationAsSeen",{id:this.notification.id}),this.$store.dispatch("updateNotification",{id:this.notification.id,updater:function(t){t.type="follow"}})},denyUser:function(){var t=this;this.$store.state.api.backendInteractor.denyUser({id:this.user.id}).then(function(){t.$store.dispatch("dismissNotificationLocal",{id:t.notification.id}),t.$store.dispatch("removeFollowRequest",t.user)})}},computed:function(t){for(var e=1;e0?this.$store.dispatch("setPageTitle","(".concat(t,")")):this.$store.dispatch("setPageTitle","")}},methods:{markAsSeen:function(){this.$store.dispatch("markNotificationsAsSeen"),this.seenToDisplayCount=30},fetchOlderNotifications:function(){var t=this;if(!this.loading){var e=this.filteredNotifications.length-this.unseenCount;if(this.seenToDisplayCounte&&(this.seenToDisplayCount=e);var n=this.$store,i=n.state.users.currentUser.credentials;n.commit("setNotificationsLoading",{value:!0}),xt.fetchAndUpdate({store:n,credentials:i,older:!0}).then(function(e){n.commit("setNotificationsLoading",{value:!1}),0===e.length&&(t.bottomedOut=!0),t.seenToDisplayCount+=e.length})}}}}};var Vn=function(t){n(451)},Gn=Object(dn.a)(Wn,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"notifications",class:{minimal:t.minimalMode}},[n("div",{class:t.mainClass},[t.noHeading?t._e():n("div",{staticClass:"panel-heading"},[n("div",{staticClass:"title"},[t._v("\n "+t._s(t.$t("notifications.notifications"))+"\n "),t.unseenCount?n("span",{staticClass:"badge badge-notification unseen-count"},[t._v(t._s(t.unseenCount))]):t._e()]),t._v(" "),t.error?n("div",{staticClass:"loadmore-error alert error",on:{click:function(t){t.preventDefault()}}},[t._v("\n "+t._s(t.$t("timeline.error_fetching"))+"\n ")]):t._e(),t._v(" "),t.unseenCount?n("button",{staticClass:"read-button",on:{click:function(e){return e.preventDefault(),t.markAsSeen(e)}}},[t._v("\n "+t._s(t.$t("notifications.read"))+"\n ")]):t._e()]),t._v(" "),n("div",{staticClass:"panel-body"},t._l(t.notificationsToDisplay,function(e){return n("div",{key:e.id,staticClass:"notification",class:{unseen:!t.minimalMode&&!e.seen}},[n("div",{staticClass:"notification-overlay"}),t._v(" "),n("notification",{attrs:{notification:e}})],1)}),0),t._v(" "),n("div",{staticClass:"panel-footer"},[t.bottomedOut?n("div",{staticClass:"new-status-notification text-center panel-footer faint"},[t._v("\n "+t._s(t.$t("notifications.no_more_notifications"))+"\n ")]):t.loading?n("div",{staticClass:"new-status-notification text-center panel-footer"},[n("i",{staticClass:"icon-spin3 animate-spin"})]):n("a",{attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),t.fetchOlderNotifications()}}},[n("div",{staticClass:"new-status-notification text-center panel-footer"},[t._v("\n "+t._s(t.minimalMode?t.$t("interactions.load_older"):t.$t("notifications.load_older"))+"\n ")])])])])])},[],!1,Vn,null,null).exports,Kn={mentions:["mention"],"likes+repeats":["repeat","like"],follows:["follow"],moves:["move"]},Yn={data:function(){return{allowFollowingMove:this.$store.state.users.currentUser.allow_following_move,filterMode:Kn.mentions}},methods:{onModeSwitch:function(t){this.filterMode=Kn[t]}},components:{Notifications:Gn}},Jn=Object(dn.a)(Yn,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"panel panel-default"},[n("div",{staticClass:"panel-heading"},[n("div",{staticClass:"title"},[t._v("\n "+t._s(t.$t("nav.interactions"))+"\n ")])]),t._v(" "),n("tab-switcher",{ref:"tabSwitcher",attrs:{"on-switch":t.onModeSwitch}},[n("span",{key:"mentions",attrs:{label:t.$t("nav.mentions")}}),t._v(" "),n("span",{key:"likes+repeats",attrs:{label:t.$t("interactions.favs_repeats")}}),t._v(" "),n("span",{key:"follows",attrs:{label:t.$t("interactions.follows")}}),t._v(" "),t.allowFollowingMove?t._e():n("span",{key:"moves",attrs:{label:t.$t("interactions.moves")}})]),t._v(" "),n("Notifications",{ref:"notifications",attrs:{"no-heading":!0,"minimal-mode":!0,"filter-mode":t.filterMode}})],1)},[],!1,null,null,null).exports,Xn={computed:{timeline:function(){return this.$store.state.statuses.timelines.dms}},components:{Timeline:xn}},Qn=Object(dn.a)(Xn,function(){var t=this.$createElement;return(this._self._c||t)("Timeline",{attrs:{title:this.$t("nav.dms"),timeline:this.timeline,"timeline-name":"dms"}})},[],!1,null,null,null).exports,Zn=n(114),ti=s.a.component("chat-title",{name:"ChatTitle",components:{UserAvatar:Fn.default},props:["user","withAvatar"],computed:{title:function(){return this.user?this.user.screen_name:""},htmlTitle:function(){return this.user?this.user.name_html:""}},methods:{getUserProfileLink:function(t){return Object(Rn.a)(t.id,t.screen_name)}}});var ei=function(t){n(459)},ni=Object(dn.a)(ti,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"chat-title",attrs:{title:t.title}},[t.withAvatar&&t.user?n("router-link",{attrs:{to:t.getUserProfileLink(t.user)}},[n("UserAvatar",{attrs:{user:t.user,width:"23px",height:"23px"}})],1):t._e(),t._v(" "),n("span",{staticClass:"username",domProps:{innerHTML:t._s(t.htmlTitle)}})],1)},[],!1,ei,null,null).exports;function ii(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}var oi={name:"ChatListItem",props:["chat"],components:{UserAvatar:Fn.default,AvatarList:Zn.a,Timeago:Ln.a,ChatTitle:ni,StatusContent:Un.a},computed:function(t){for(var e=1;e".concat(this.$t("chats.you")," ").concat(n):n;return{summary:"",statusnet_html:i,text:i,attachments:[]}}}),methods:{openChat:function(t){this.chat.id&&this.$router.push({name:"chat",params:{username:this.currentUser.screen_name,recipient_id:this.chat.account.id}})}}};var ri=function(t){n(457)},si=Object(dn.a)(oi,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"chat-list-item",on:{"!click":function(e){return e.preventDefault(),t.openChat(e)}}},[n("div",{staticClass:"chat-list-item-left"},[n("UserAvatar",{attrs:{user:t.chat.account,height:"48px",width:"48px"}})],1),t._v(" "),n("div",{staticClass:"chat-list-item-center"},[n("div",{staticClass:"heading"},[t.chat.account?n("span",{staticClass:"name-and-account-name"},[n("ChatTitle",{attrs:{user:t.chat.account}})],1):t._e(),t._v(" "),n("span",{staticClass:"heading-right"})]),t._v(" "),n("div",{staticClass:"chat-preview"},[n("StatusContent",{attrs:{status:t.messageForStatusContent,"single-line":!0}}),t._v(" "),t.chat.unread>0?n("div",{staticClass:"badge badge-notification unread-chat-count"},[t._v("\n "+t._s(t.chat.unread)+"\n ")]):t._e()],1)]),t._v(" "),n("div",{staticClass:"time-wrapper"},[n("Timeago",{attrs:{time:t.chat.updated_at,"auto-update":60}})],1)])},[],!1,ri,null,null).exports,ai=n(38);function ci(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}var li={components:{BasicUserCard:ai.a,UserAvatar:Fn.default},data:function(){return{suggestions:[],userIds:[],loading:!1,query:""}},created:function(){var t,e=this;return o.a.async(function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,o.a.awrap(this.backendInteractor.chats());case 2:t=n.sent,t.chats.forEach(function(t){return e.suggestions.push(t.account)});case 5:case"end":return n.stop()}},null,this)},computed:function(t){for(var e=1;e0?n("div",{staticClass:"timeline"},[n("List",{attrs:{items:t.sortedChatList},scopedSlots:t._u([{key:"item",fn:function(t){var e=t.item;return[n("ChatListItem",{key:e.id,attrs:{compact:!1,chat:e}})]}}],null,!1,1412157271)})],1):n("div",{staticClass:"emtpy-chat-list-alert"},[n("span",[t._v(t._s(t.$t("chats.empty_chat_list_placeholder")))])])])])},[],!1,mi,null,null).exports,vi=n(43),bi=n(111),wi=n(112),_i={name:"Timeago",props:["date"],computed:{displayDate:function(){var t=new Date;return t.setHours(0,0,0,0),this.date.getTime()===t.getTime()?this.$t("display_date.today"):this.date.toLocaleDateString("en",{day:"numeric",month:"long"})}}},xi=Object(dn.a)(_i,function(){var t=this.$createElement;return(this._self._c||t)("time",[this._v("\n "+this._s(this.displayDate)+"\n")])},[],!1,null,null,null).exports;function yi(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}var ki={name:"ChatMessage",props:["author","edited","noHeading","chatViewItem","hoveredMessageChain"],components:{Popover:hn.default,Attachment:vi.a,StatusContent:Un.a,UserAvatar:Fn.default,Gallery:bi.a,LinkPreview:wi.a,ChatMessageDate:xi},computed:function(t){for(var e=1;e0}},Object(c.e)({betterShadow:function(t){return t.interface.browserSupport.cssFilter},currentUser:function(t){return t.users.currentUser},restrictedNicknames:function(t){return t.instance.restrictedNicknames}}),{popoverMarginStyle:function(){return this.isCurrentUser?{}:{left:50}}},Object(c.c)(["mergedConfig","findUser"])),data:function(){return{hovered:!1,menuOpened:!1}},methods:{onHover:function(t){this.$emit("hover",{isHovered:t,messageChainId:this.chatViewItem.messageChainId})},deleteMessage:function(){return o.a.async(function(t){for(;;)switch(t.prev=t.next){case 0:if(!window.confirm(this.$t("chats.delete_confirm"))){t.next=4;break}return t.next=4,o.a.awrap(this.$store.dispatch("deleteChatMessage",{messageId:this.chatViewItem.data.id,chatId:this.chatViewItem.data.chat_id}));case 4:this.hovered=!1,this.menuOpened=!1;case 6:case"end":return t.stop()}},null,this)}}};var Ci=function(t){n(469)},Si=Object(dn.a)(ki,function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.isMessage?n("div",{staticClass:"chat-message-wrapper",class:{"hovered-message-chain":t.hoveredMessageChain},on:{mouseover:function(e){return t.onHover(!0)},mouseleave:function(e){return t.onHover(!1)}}},[n("div",{staticClass:"chat-message",class:[{outgoing:t.isCurrentUser,incoming:!t.isCurrentUser}]},[t.isCurrentUser?t._e():n("div",{staticClass:"avatar-wrapper"},[t.chatViewItem.isHead?n("router-link",{attrs:{to:t.userProfileLink}},[n("UserAvatar",{attrs:{compact:!0,"better-shadow":t.betterShadow,user:t.author}})],1):t._e()],1),t._v(" "),n("div",{staticClass:"chat-message-inner"},[n("div",{staticClass:"status-body",style:{"min-width":t.message.attachment?"80%":""}},[n("div",{staticClass:"media status",class:{"without-attachment":!t.hasAttachment},staticStyle:{position:"relative"},on:{mouseenter:function(e){t.hovered=!0},mouseleave:function(e){t.hovered=!1}}},[n("div",{staticClass:"chat-message-menu",class:{visible:t.hovered||t.menuOpened}},[n("Popover",{attrs:{trigger:"click",placement:"top","bound-to-selector":t.isCurrentUser?"":".scrollable-message-list","bound-to":{x:"container"},margin:t.popoverMarginStyle},on:{show:function(e){t.menuOpened=!0},close:function(e){t.menuOpened=!1}}},[n("div",{attrs:{slot:"content"},slot:"content"},[n("div",{staticClass:"dropdown-menu"},[n("button",{staticClass:"dropdown-item dropdown-item-icon",on:{click:t.deleteMessage}},[n("i",{staticClass:"icon-cancel"}),t._v(" "+t._s(t.$t("chats.delete"))+"\n ")])])]),t._v(" "),n("button",{attrs:{slot:"trigger",title:t.$t("chats.more")},slot:"trigger"},[n("i",{staticClass:"icon-ellipsis"})])])],1),t._v(" "),n("StatusContent",{attrs:{status:t.messageForStatusContent,"full-content":!0}},[n("span",{staticClass:"created-at",attrs:{slot:"footer"},slot:"footer"},[t._v("\n "+t._s(t.createdAt)+"\n ")])])],1)])])])]):n("div",{staticClass:"chat-message-date-separator"},[n("ChatMessageDate",{attrs:{date:t.chatViewItem.date}})],1)},[],!1,Ci,null,null).exports,ji=n(42),Oi=function(t){return{scrollTop:t.scrollTop,scrollHeight:t.scrollHeight,offsetHeight:t.offsetHeight}};function Pi(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}function $i(t){for(var e=1;e0&&void 0!==arguments[0]?arguments[0]:{},n=e.expand,i=void 0!==n&&n,o=e.delayed;void 0!==o&&o?setTimeout(function(){t.handleResize($i({},e,{delayed:!1}))},100):this.$nextTick(function(){t.updateScrollableContainerHeight();var e=t.lastScrollPosition.offsetHeight,n=void 0===e?void 0:e;t.lastScrollPosition=Oi(t.$refs.scrollable);var o=t.lastScrollPosition.offsetHeight-n;(o<0||!t.bottomedOut()&&i)&&t.$nextTick(function(){t.updateScrollableContainerHeight(),t.$refs.scrollable.scrollTo({top:t.$refs.scrollable.scrollTop-o,left:0})})})},scrollDown:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t.behavior,n=void 0===e?"auto":e,i=t.forceRead,o=void 0!==i&&i,r=this.$refs.scrollable;r&&(this.$nextTick(function(){r.scrollTo({top:r.scrollHeight,left:0,behavior:n})}),(o||this.newMessageCount>0)&&this.readChat())},readChat:function(){if(this.currentChatMessageService&&this.currentChatMessageService.lastMessage&&!document.hidden){var t=this.currentChatMessageService.lastMessage.id;this.$store.dispatch("readChat",{id:this.currentChat.id,lastReadId:t})}},bottomedOut:function(t){return function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(t){var n=t.scrollTop+e;return t.scrollHeight-t.offsetHeight<=n}}(this.$refs.scrollable,t)},reachedTop:function(){var t=this.$refs.scrollable;return t&&t.scrollTop<=0},handleScroll:rn()(function(){this.currentChat&&(this.reachedTop()?this.fetchChat({maxId:this.currentChatMessageService.minId}):this.bottomedOut(150)?(this.jumpToBottomButtonVisible=!1,this.newMessageCount>0&&this.readChat()):this.jumpToBottomButtonVisible=!0)},100),handleScrollUp:function(t){var e,n,i=Oi(this.$refs.scrollable);this.$refs.scrollable.scrollTo({top:(e=t,n=i,e.scrollTop+(n.scrollHeight-e.scrollHeight)),left:0})},fetchChat:function(t){var e=this,n=t.isFirstFetch,i=void 0!==n&&n,o=t.fetchLatest,r=void 0!==o&&o,s=t.maxId,a=this.currentChatMessageService;if(a&&(!r||!this.streamingEnabled)){var c=a.chatId,l=!!s,u=r&&a.lastMessage&&a.lastMessage.id;this.backendInteractor.chatMessages({id:c,maxId:s,sinceId:u}).then(function(t){i&&we.clear(a);var n=Oi(e.$refs.scrollable);e.$store.dispatch("addChatMessages",{chatId:c,messages:t}).then(function(){e.$nextTick(function(){l&&e.handleScrollUp(n),i&&e.updateScrollableContainerHeight()})})})}},startFetching:function(){var t,e=this;return o.a.async(function(n){for(;;)switch(n.prev=n.next){case 0:if(t=this.findOpenedChatByRecipientId(this.recipientId)){n.next=12;break}return n.prev=2,n.next=5,o.a.awrap(this.backendInteractor.getOrCreateChat({accountId:this.recipientId}));case 5:t=n.sent,n.next=12;break;case 8:n.prev=8,n.t0=n.catch(2),console.error("Error creating or getting a chat",n.t0),this.errorLoadingChat=!0;case 12:t&&(this.$nextTick(function(){e.scrollDown({forceRead:!0})}),this.$store.dispatch("addOpenedChat",{chat:t}),this.doStartFetching());case 13:case"end":return n.stop()}},null,this,[[2,8]])},doStartFetching:function(){var t=this;this.$store.dispatch("startFetchingCurrentChat",{fetcher:function(){return setInterval(function(){return t.fetchChat({fetchLatest:!0})},5e3)}}),this.fetchChat({isFirstFetch:!0})},sendMessage:function(t){var e=this,n=t.status,i=t.media,o={id:this.currentChat.id,content:n};return i[0]&&(o.mediaId=i[0].id),this.backendInteractor.sendChatMessage(o).then(function(t){return e.$store.dispatch("addChatMessages",{chatId:e.currentChat.id,messages:[t]}).then(function(){e.$nextTick(function(){e.handleResize(),setTimeout(function(){e.updateScrollableContainerHeight()},100),e.scrollDown({forceRead:!0})})}),t}).catch(function(t){return console.error("Error sending message",t),{error:e.$t("chats.error_sending_message")}})},goBack:function(){this.$router.push({name:"chats",params:{username:this.currentUser.screen_name}})}}};var Ii=function(t){n(467)},Ei=Object(dn.a)(Ti,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"chat-view"},[n("div",{staticClass:"chat-view-inner"},[n("div",{ref:"inner",staticClass:"panel-default panel chat-view-body",attrs:{id:"nav"}},[n("div",{ref:"header",staticClass:"panel-heading chat-view-heading mobile-hidden"},[n("a",{staticClass:"go-back-button",on:{click:t.goBack}},[n("i",{staticClass:"button-icon icon-left-open"})]),t._v(" "),n("div",{staticClass:"title text-center"},[n("ChatTitle",{attrs:{user:t.recipient,"with-avatar":!0}})],1)]),t._v(" "),[n("div",{ref:"scrollable",staticClass:"scrollable-message-list",style:{height:t.scrollableContainerHeight},on:{scroll:t.handleScroll}},[t.errorLoadingChat?n("div",{staticClass:"chat-loading-error"},[n("div",{staticClass:"alert error"},[t._v("\n "+t._s(t.$t("chats.error_loading_chat"))+"\n ")])]):t._l(t.chatViewItems,function(e){return n("ChatMessage",{key:e.id,attrs:{author:t.recipient,"chat-view-item":e,"hovered-message-chain":e.messageChainId===t.hoveredMessageChainId},on:{hover:t.onMessageHover}})})],2),t._v(" "),n("div",{ref:"footer",staticClass:"panel-body footer"},[n("div",{staticClass:"jump-to-bottom-button",class:{visible:t.jumpToBottomButtonVisible},on:{click:function(e){return t.scrollDown({behavior:"smooth"})}}},[n("i",{staticClass:"icon-down-open"},[t.newMessageCount?n("div",{staticClass:"badge badge-notification unread-chat-count unread-message-count"},[t._v("\n "+t._s(t.newMessageCount)+"\n ")]):t._e()])]),t._v(" "),n("PostStatusForm",{attrs:{"disable-subject":!0,"disable-scope-selector":!0,"disable-notice":!0,"disable-lock-warning":!0,"disable-polls":!0,"disable-sensitivity-checkbox":!0,"disable-submit":t.errorLoadingChat||!t.currentChat,"disable-preview":!0,"post-handler":t.sendMessage,"submit-on-enter":!t.mobileLayout,"preserve-focus":!t.mobileLayout,"auto-focus":!t.mobileLayout,placeholder:t.formPlaceholder,"file-limit":1,"max-height":"160","emoji-picker-placement":"top"},on:{resize:t.handleResize}})],1)]],2)])])},[],!1,Ii,null,null).exports,Mi=n(113),Ui=n(109),Fi={props:["user","noFollowsYou"],components:{BasicUserCard:ai.a,RemoteFollow:Mi.a,FollowButton:Ui.a},computed:{isMe:function(){return this.$store.state.users.currentUser.id===this.user.id},loggedIn:function(){return this.$store.state.users.currentUser},relationship:function(){return this.$store.getters.relationship(this.user.id)}}};var Di=function(t){n(473)},Li=Object(dn.a)(Fi,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("basic-user-card",{attrs:{user:t.user}},[n("div",{staticClass:"follow-card-content-container"},[t.isMe||!t.noFollowsYou&&t.relationship.followed_by?n("span",{staticClass:"faint"},[t._v("\n "+t._s(t.isMe?t.$t("user_card.its_you"):t.$t("user_card.follows_you"))+"\n ")]):t._e(),t._v(" "),t.loggedIn?t.isMe?t._e():[n("FollowButton",{staticClass:"follow-card-follow-button",attrs:{relationship:t.relationship,"label-following":t.$t("user_card.follow_unfollow")}})]:[t.relationship.following?t._e():n("div",{staticClass:"follow-card-follow-button"},[n("RemoteFollow",{attrs:{user:t.user}})],1)]],2)])},[],!1,Di,null,null).exports,Ni=n(141),Ri=n(190),Ai=n.n(Ri),Bi=n(191),zi=n.n(Bi),Hi=n(192);n(476);function qi(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}function Wi(t){for(var e=1;e0&&window.innerHeight+window.pageYOffset>=n-750&&this.fetchEntries()}},render:function(e){var n={props:Wi({},this.$props,h()({},r,this.entries)),on:this.$listeners,scopedSlots:this.$scopedSlots},i=Object.entries(this.$slots).map(function(t){var n=g()(t,2),i=n[0],o=n[1];return e("template",{slot:i},o)});return e("div",{class:"with-load-more"},[e(t,Ai()([{},n]),[i]),e("div",{class:"with-load-more-footer"},[this.error&&e("a",{on:{click:this.fetchEntries},class:"alert error"},[this.$t("general.generic_error")]),!this.error&&this.loading&&e("i",{class:"icon-spin3 animate-spin"}),!this.error&&!this.loading&&!this.bottomedOut&&e("a",{on:{click:this.fetchEntries}},[this.$t("general.more")])])])}})}},Gi=Vi({fetch:function(t,e){return e.dispatch("fetchFollowers",t.userId)},select:function(t,e){return Ie()(e.getters.findUser(t.userId),"followerIds",[]).map(function(t){return e.getters.findUser(t)})},destroy:function(t,e){return e.dispatch("clearFollowers",t.userId)},childPropName:"items",additionalPropNames:["userId"]})(pi.a),Ki=Vi({fetch:function(t,e){return e.dispatch("fetchFriends",t.userId)},select:function(t,e){return Ie()(e.getters.findUser(t.userId),"friendIds",[]).map(function(t){return e.getters.findUser(t)})},destroy:function(t,e){return e.dispatch("clearFriends",t.userId)},childPropName:"items",additionalPropNames:["userId"]})(pi.a),Yi={data:function(){return{error:!1,userId:null,tab:"statuses"}},created:function(){var t=this.$route.params;this.load(t.name||t.id),this.tab=Ie()(this.$route,"query.tab","statuses")},destroyed:function(){this.stopFetching()},computed:{timeline:function(){return this.$store.state.statuses.timelines.user},favorites:function(){return this.$store.state.statuses.timelines.favorites},media:function(){return this.$store.state.statuses.timelines.media},isUs:function(){return this.userId&&this.$store.state.users.currentUser.id&&this.userId===this.$store.state.users.currentUser.id},user:function(){return this.$store.getters.findUser(this.userId)},isExternal:function(){return"external-user-profile"===this.$route.name},followsTabVisible:function(){return this.isUs||!this.user.hide_follows},followersTabVisible:function(){return this.isUs||!this.user.hide_followers}},methods:{load:function(t){var e=this,n=function(t,n){n!==e.$store.state.statuses.timelines[t].userId&&e.$store.commit("clearTimeline",{timeline:t}),e.$store.dispatch("startFetchingTimeline",{timeline:t,userId:n})},i=function(t){e.userId=t,n("user",t),n("media",t),e.isUs&&n("favorites",t),e.$store.dispatch("fetchPinnedStatuses",t)};this.userId=null,this.error=!1;var o=this.$store.getters.findUser(t);o?i(o.id):this.$store.dispatch("fetchUser",t).then(function(t){var e=t.id;return i(e)}).catch(function(t){var n=Ie()(t,"error.error");e.error="No user with such user_id"===n?e.$t("user_profile.profile_does_not_exist"):n||e.$t("user_profile.profile_loading_error")})},stopFetching:function(){this.$store.dispatch("stopFetchingTimeline","user"),this.$store.dispatch("stopFetchingTimeline","favorites"),this.$store.dispatch("stopFetchingTimeline","media")},switchUser:function(t){this.stopFetching(),this.load(t)},onTabSwitch:function(t){this.tab=t,this.$router.replace({query:{tab:t}})},linkClicked:function(t){var e=t.target;"SPAN"===e.tagName&&(e=e.parentNode),"A"===e.tagName&&window.open(e.href,"_blank")}},watch:{"$route.params.id":function(t){t&&this.switchUser(t)},"$route.params.name":function(t){t&&this.switchUser(t)},"$route.query":function(t){this.tab=t.tab||"statuses"}},components:{UserCard:Dn.a,Timeline:xn,FollowerList:Gi,FriendList:Ki,FollowCard:Li,TabSwitcher:Ni.a,Conversation:fn}};var Ji=function(t){n(471)},Xi=Object(dn.a)(Yi,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[t.user?n("div",{staticClass:"user-profile panel panel-default"},[n("UserCard",{attrs:{"user-id":t.userId,switcher:!0,selected:t.timeline.viewing,"allow-zooming-avatar":!0,rounded:"top"}}),t._v(" "),t.user.fields_html&&t.user.fields_html.length>0?n("div",{staticClass:"user-profile-fields"},t._l(t.user.fields_html,function(e,i){return n("dl",{key:i,staticClass:"user-profile-field"},[n("dt",{staticClass:"user-profile-field-name",attrs:{title:t.user.fields_text[i].name},on:{click:function(e){return e.preventDefault(),t.linkClicked(e)}}},[t._v("\n "+t._s(e.name)+"\n ")]),t._v(" "),n("dd",{staticClass:"user-profile-field-value",attrs:{title:t.user.fields_text[i].value},domProps:{innerHTML:t._s(e.value)},on:{click:function(e){return e.preventDefault(),t.linkClicked(e)}}})])}),0):t._e(),t._v(" "),n("tab-switcher",{attrs:{"active-tab":t.tab,"render-only-focused":!0,"on-switch":t.onTabSwitch}},[n("Timeline",{key:"statuses",attrs:{label:t.$t("user_card.statuses"),count:t.user.statuses_count,embedded:!0,title:t.$t("user_profile.timeline_title"),timeline:t.timeline,"timeline-name":"user","user-id":t.userId,"pinned-status-ids":t.user.pinnedStatusIds,"in-profile":!0}}),t._v(" "),t.followsTabVisible?n("div",{key:"followees",attrs:{label:t.$t("user_card.followees"),disabled:!t.user.friends_count}},[n("FriendList",{attrs:{"user-id":t.userId},scopedSlots:t._u([{key:"item",fn:function(t){var e=t.item;return[n("FollowCard",{attrs:{user:e}})]}}],null,!1,676117295)})],1):t._e(),t._v(" "),t.followersTabVisible?n("div",{key:"followers",attrs:{label:t.$t("user_card.followers"),disabled:!t.user.followers_count}},[n("FollowerList",{attrs:{"user-id":t.userId},scopedSlots:t._u([{key:"item",fn:function(e){var i=e.item;return[n("FollowCard",{attrs:{user:i,"no-follows-you":t.isUs}})]}}],null,!1,3839341157)})],1):t._e(),t._v(" "),n("Timeline",{key:"media",attrs:{label:t.$t("user_card.media"),disabled:!t.media.visibleStatuses.length,embedded:!0,title:t.$t("user_card.media"),"timeline-name":"media",timeline:t.media,"user-id":t.userId,"in-profile":!0}}),t._v(" "),t.isUs?n("Timeline",{key:"favorites",attrs:{label:t.$t("user_card.favorites"),disabled:!t.favorites.visibleStatuses.length,embedded:!0,title:t.$t("user_card.favorites"),"timeline-name":"favorites",timeline:t.favorites,"in-profile":!0}}):t._e()],1)],1):n("div",{staticClass:"panel user-profile-placeholder"},[n("div",{staticClass:"panel-heading"},[n("div",{staticClass:"title"},[t._v("\n "+t._s(t.$t("settings.profile_tab"))+"\n ")])]),t._v(" "),n("div",{staticClass:"panel-body"},[t.error?n("span",[t._v(t._s(t.error))]):n("i",{staticClass:"icon-spin3 animate-spin"})])])])},[],!1,Ji,null,null).exports,Qi={components:{FollowCard:Li,Conversation:fn,Status:sn.default},props:["query"],data:function(){return{loaded:!1,loading:!1,searchTerm:this.query||"",userIds:[],statuses:[],hashtags:[],currenResultTab:"statuses"}},computed:{users:function(){var t=this;return this.userIds.map(function(e){return t.$store.getters.findUser(e)})},visibleStatuses:function(){var t=this.$store.state.statuses.allStatusesObject;return this.statuses.filter(function(e){return t[e.id]&&!t[e.id].deleted})}},mounted:function(){this.search(this.query)},watch:{query:function(t){this.searchTerm=t,this.search(t)}},methods:{newQuery:function(t){this.$router.push({name:"search",query:{query:t}}),this.$refs.searchInput.focus()},search:function(t){var e=this;t?(this.loading=!0,this.userIds=[],this.statuses=[],this.hashtags=[],this.$refs.searchInput.blur(),this.$store.dispatch("search",{q:t,resolve:!0}).then(function(t){e.loading=!1,e.userIds=pt()(t.accounts,"id"),e.statuses=t.statuses,e.hashtags=t.hashtags,e.currenResultTab=e.getActiveTab(),e.loaded=!0})):this.loading=!1},resultCount:function(t){var e=this[t].length;return 0===e?"":" (".concat(e,")")},onResultTabSwitch:function(t){this.currenResultTab=t},getActiveTab:function(){return this.visibleStatuses.length>0?"statuses":this.users.length>0?"people":this.hashtags.length>0?"hashtags":"statuses"},lastHistoryRecord:function(t){return t.history&&t.history[0]}}};var Zi=function(t){n(477)},to=Object(dn.a)(Qi,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"panel panel-default"},[n("div",{staticClass:"panel-heading"},[n("div",{staticClass:"title"},[t._v("\n "+t._s(t.$t("nav.search"))+"\n ")])]),t._v(" "),n("div",{staticClass:"search-input-container"},[n("input",{directives:[{name:"model",rawName:"v-model",value:t.searchTerm,expression:"searchTerm"}],ref:"searchInput",staticClass:"search-input",attrs:{placeholder:t.$t("nav.search")},domProps:{value:t.searchTerm},on:{keyup:function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"enter",13,e.key,"Enter")?null:t.newQuery(t.searchTerm)},input:function(e){e.target.composing||(t.searchTerm=e.target.value)}}}),t._v(" "),n("button",{staticClass:"btn search-button",on:{click:function(e){return t.newQuery(t.searchTerm)}}},[n("i",{staticClass:"icon-search"})])]),t._v(" "),t.loading?n("div",{staticClass:"text-center loading-icon"},[n("i",{staticClass:"icon-spin3 animate-spin"})]):t.loaded?n("div",[n("div",{staticClass:"search-nav-heading"},[n("tab-switcher",{ref:"tabSwitcher",attrs:{"on-switch":t.onResultTabSwitch,"active-tab":t.currenResultTab}},[n("span",{key:"statuses",attrs:{label:t.$t("user_card.statuses")+t.resultCount("visibleStatuses")}}),t._v(" "),n("span",{key:"people",attrs:{label:t.$t("search.people")+t.resultCount("users")}}),t._v(" "),n("span",{key:"hashtags",attrs:{label:t.$t("search.hashtags")+t.resultCount("hashtags")}})])],1)]):t._e(),t._v(" "),n("div",{staticClass:"panel-body"},["statuses"===t.currenResultTab?n("div",[0===t.visibleStatuses.length&&!t.loading&&t.loaded?n("div",{staticClass:"search-result-heading"},[n("h4",[t._v(t._s(t.$t("search.no_results")))])]):t._e(),t._v(" "),t._l(t.visibleStatuses,function(t){return n("Status",{key:t.id,staticClass:"search-result",attrs:{collapsable:!1,expandable:!1,compact:!1,statusoid:t,"no-heading":!1}})})],2):"people"===t.currenResultTab?n("div",[0===t.users.length&&!t.loading&&t.loaded?n("div",{staticClass:"search-result-heading"},[n("h4",[t._v(t._s(t.$t("search.no_results")))])]):t._e(),t._v(" "),t._l(t.users,function(t){return n("FollowCard",{key:t.id,staticClass:"list-item search-result",attrs:{user:t}})})],2):"hashtags"===t.currenResultTab?n("div",[0===t.hashtags.length&&!t.loading&&t.loaded?n("div",{staticClass:"search-result-heading"},[n("h4",[t._v(t._s(t.$t("search.no_results")))])]):t._e(),t._v(" "),t._l(t.hashtags,function(e){return n("div",{key:e.url,staticClass:"status trend search-result"},[n("div",{staticClass:"hashtag"},[n("router-link",{attrs:{to:{name:"tag-timeline",params:{tag:e.name}}}},[t._v("\n #"+t._s(e.name)+"\n ")]),t._v(" "),t.lastHistoryRecord(e)?n("div",[1==t.lastHistoryRecord(e).accounts?n("span",[t._v("\n "+t._s(t.$t("search.person_talking",{count:t.lastHistoryRecord(e).accounts}))+"\n ")]):n("span",[t._v("\n "+t._s(t.$t("search.people_talking",{count:t.lastHistoryRecord(e).accounts}))+"\n ")])]):t._e()],1),t._v(" "),t.lastHistoryRecord(e)?n("div",{staticClass:"count"},[t._v("\n "+t._s(t.lastHistoryRecord(e).uses)+"\n ")]):t._e()])})],2):t._e()]),t._v(" "),n("div",{staticClass:"search-result-footer text-center panel-footer faint"})])},[],!1,Zi,null,null).exports,eo=n(220),no=n(53);function io(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}function oo(t){for(var e=1;e0?n("span",{staticClass:"badge follow-request-count"},[t._v("\n "+t._s(t.followRequestCount)+"\n ")]):t._e()])],1):t._e(),t._v(" "),n("li",[n("router-link",{attrs:{to:{name:"about"}}},[n("i",{staticClass:"button-icon icon-info-circled"}),t._v(" "+t._s(t.$t("nav.about"))+"\n ")])],1)])])])},[],!1,gr,null,null).exports,br={data:function(){return{searchTerm:void 0,hidden:!0,error:!1,loading:!1}},watch:{$route:function(t){"search"===t.name&&(this.searchTerm=t.query.query)}},methods:{find:function(t){this.$router.push({name:"search",query:{query:t}}),this.$refs.searchInput.focus()},toggleHidden:function(){var t=this;this.hidden=!this.hidden,this.$emit("toggled",this.hidden),this.$nextTick(function(){t.hidden||t.$refs.searchInput.focus()})}}};var wr=function(t){n(533)},_r=Object(dn.a)(br,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("div",{staticClass:"search-bar-container"},[t.loading?n("i",{staticClass:"icon-spin4 finder-icon animate-spin-slow"}):t._e(),t._v(" "),t.hidden?n("a",{attrs:{href:"#",title:t.$t("nav.search")}},[n("i",{staticClass:"button-icon icon-search",on:{click:function(e){return e.preventDefault(),e.stopPropagation(),t.toggleHidden(e)}}})]):[n("input",{directives:[{name:"model",rawName:"v-model",value:t.searchTerm,expression:"searchTerm"}],ref:"searchInput",staticClass:"search-bar-input",attrs:{id:"search-bar-input",placeholder:t.$t("nav.search"),type:"text"},domProps:{value:t.searchTerm},on:{keyup:function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"enter",13,e.key,"Enter")?null:t.find(t.searchTerm)},input:function(e){e.target.composing||(t.searchTerm=e.target.value)}}}),t._v(" "),n("button",{staticClass:"btn search-button",on:{click:function(e){return t.find(t.searchTerm)}}},[n("i",{staticClass:"icon-search"})]),t._v(" "),n("i",{staticClass:"button-icon icon-cancel",on:{click:function(e){return e.preventDefault(),e.stopPropagation(),t.toggleHidden(e)}}})]],2)])},[],!1,wr,null,null).exports,xr=n(221),yr=n.n(xr);function kr(t){var e=t.$store.state.users.currentUser.credentials;e&&(t.usersToFollow.forEach(function(t){t.name="Loading..."}),w.c.suggestions({credentials:e}).then(function(e){!function(t,e){var n=this,i=yr()(e);t.usersToFollow.forEach(function(e,o){var r=i[o],s=r.avatar||n.$store.state.instance.defaultAvatar,a=r.acct;e.img=s,e.name=a,t.$store.state.api.backendInteractor.fetchUser({id:a}).then(function(n){n.error||(t.$store.commit("addNewUsers",[n]),e.id=n.id)})})}(t,e)}))}var Cr={data:function(){return{usersToFollow:[]}},computed:{user:function(){return this.$store.state.users.currentUser.screen_name},suggestionsEnabled:function(){return this.$store.state.instance.suggestionsEnabled}},methods:{userProfileLink:function(t,e){return Object(Rn.a)(t,e,this.$store.state.instance.restrictedNicknames)}},watch:{user:function(t,e){this.suggestionsEnabled&&kr(this)}},mounted:function(){var t=this;this.usersToFollow=new Array(3).fill().map(function(e){return{img:t.$store.state.instance.defaultAvatar,name:"",id:0}}),this.suggestionsEnabled&&kr(this)}};var Sr=function(t){n(535)},jr=Object(dn.a)(Cr,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"who-to-follow-panel"},[n("div",{staticClass:"panel panel-default base01-background"},[n("div",{staticClass:"panel-heading timeline-heading base02-background base04"},[n("div",{staticClass:"title"},[t._v("\n "+t._s(t.$t("who_to_follow.who_to_follow"))+"\n ")])]),t._v(" "),n("div",{staticClass:"who-to-follow"},[t._l(t.usersToFollow,function(e){return n("p",{key:e.id,staticClass:"who-to-follow-items"},[n("img",{attrs:{src:e.img}}),t._v(" "),n("router-link",{attrs:{to:t.userProfileLink(e.id,e.name)}},[t._v("\n "+t._s(e.name)+"\n ")]),n("br")],1)}),t._v(" "),n("p",{staticClass:"who-to-follow-more"},[n("router-link",{attrs:{to:{name:"who-to-follow"}}},[t._v("\n "+t._s(t.$t("who_to_follow.more"))+"\n ")])],1)],2)])])},[],!1,Sr,null,null).exports,Or={props:{isOpen:{type:Boolean,default:!0},noBackground:{type:Boolean,default:!1}},computed:{classes:function(){return{"modal-background":!this.noBackground,open:this.isOpen}}}};var Pr=function(t){n(542)},$r=Object(dn.a)(Or,function(){var t=this,e=t.$createElement;return(t._self._c||e)("div",{directives:[{name:"show",rawName:"v-show",value:t.isOpen,expression:"isOpen"},{name:"body-scroll-lock",rawName:"v-body-scroll-lock",value:t.isOpen&&!t.noBackground,expression:"isOpen && !noBackground"}],staticClass:"modal-view",class:t.classes,on:{click:function(e){return e.target!==e.currentTarget?null:t.$emit("backdropClicked")}}},[t._t("default")],2)},[],!1,Pr,null,null).exports;var Tr=function(t){n(544)};var Ir=function(t){n(546)};function Er(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}var Mr={components:{Modal:$r,SettingsModalContent:function(t,e){var n=function(){return function(){return function(t){for(var e=1;e2&&void 0!==arguments[2]?arguments[2]:30,perpendicularTolerance:arguments.length>3&&void 0!==arguments[3]?arguments[3]:1,_startPos:[0,0],_swiping:!1}},beginSwipe:function(t,e){e._startPos=Nr(t),e._swiping=!0},updateSwipe:function(t,e){if(e._swiping){var n,i,o=(n=e._startPos,[(i=Nr(t))[0]-n[0],i[1]-n[1]]);if(!(Rr(o)1},type:function(){return this.currentMedia?ie.a.fileType(this.currentMedia.mimetype):null}},created:function(){this.mediaSwipeGestureRight=zr.swipeGesture(zr.DIRECTION_RIGHT,this.goPrev,50),this.mediaSwipeGestureLeft=zr.swipeGesture(zr.DIRECTION_LEFT,this.goNext,50)},methods:{mediaTouchStart:function(t){zr.beginSwipe(t,this.mediaSwipeGestureRight),zr.beginSwipe(t,this.mediaSwipeGestureLeft)},mediaTouchMove:function(t){zr.updateSwipe(t,this.mediaSwipeGestureRight),zr.updateSwipe(t,this.mediaSwipeGestureLeft)},hide:function(){this.$store.dispatch("closeMediaViewer")},goPrev:function(){if(this.canNavigate){var t=0===this.currentIndex?this.media.length-1:this.currentIndex-1;this.$store.dispatch("setCurrent",this.media[t])}},goNext:function(){if(this.canNavigate){var t=this.currentIndex===this.media.length-1?0:this.currentIndex+1;this.$store.dispatch("setCurrent",this.media[t])}},handleKeyupEvent:function(t){this.showing&&27===t.keyCode&&this.hide()},handleKeydownEvent:function(t){this.showing&&(39===t.keyCode?this.goNext():37===t.keyCode&&this.goPrev())}},mounted:function(){window.addEventListener("popstate",this.hide),document.addEventListener("keyup",this.handleKeyupEvent),document.addEventListener("keydown",this.handleKeydownEvent)},destroyed:function(){window.removeEventListener("popstate",this.hide),document.removeEventListener("keyup",this.handleKeyupEvent),document.removeEventListener("keydown",this.handleKeydownEvent)}};var qr=function(t){n(548)},Wr=Object(dn.a)(Hr,function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.showing?n("Modal",{staticClass:"media-modal-view",on:{backdropClicked:t.hide}},["image"===t.type?n("img",{staticClass:"modal-image",attrs:{src:t.currentMedia.url,alt:t.currentMedia.description,title:t.currentMedia.description},on:{touchstart:function(e){return e.stopPropagation(),t.mediaTouchStart(e)},touchmove:function(e){return e.stopPropagation(),t.mediaTouchMove(e)},click:t.hide}}):t._e(),t._v(" "),"video"===t.type?n("VideoAttachment",{staticClass:"modal-image",attrs:{attachment:t.currentMedia,controls:!0}}):t._e(),t._v(" "),"audio"===t.type?n("audio",{staticClass:"modal-image",attrs:{src:t.currentMedia.url,alt:t.currentMedia.description,title:t.currentMedia.description,controls:""}}):t._e(),t._v(" "),t.canNavigate?n("button",{staticClass:"modal-view-button-arrow modal-view-button-arrow--prev",attrs:{title:t.$t("media_modal.previous")},on:{click:function(e){return e.stopPropagation(),e.preventDefault(),t.goPrev(e)}}},[n("i",{staticClass:"icon-left-open arrow-icon"})]):t._e(),t._v(" "),t.canNavigate?n("button",{staticClass:"modal-view-button-arrow modal-view-button-arrow--next",attrs:{title:t.$t("media_modal.next")},on:{click:function(e){return e.stopPropagation(),e.preventDefault(),t.goNext(e)}}},[n("i",{staticClass:"icon-right-open arrow-icon"})]):t._e()],1):t._e()},[],!1,qr,null,null).exports;function Vr(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}var Gr={props:["logout"],data:function(){return{closed:!0,closeGesture:void 0}},created:function(){this.closeGesture=zr.swipeGesture(zr.DIRECTION_LEFT,this.toggleDrawer),this.currentUser&&this.currentUser.locked&&this.$store.dispatch("startFetchingFollowRequests")},components:{UserCard:Dn.a},computed:function(t){for(var e=1;e0?n("span",{staticClass:"badge follow-request-count"},[t._v("\n "+t._s(t.followRequestCount)+"\n ")]):t._e()])],1):t._e(),t._v(" "),t.chat?n("li",{on:{click:t.toggleDrawer}},[n("router-link",{attrs:{to:{name:"chat"}}},[n("i",{staticClass:"button-icon icon-chat"}),t._v(" "+t._s(t.$t("nav.chat"))+"\n ")])],1):t._e()]):t._e(),t._v(" "),n("ul",[t.currentUser||!t.privateMode?n("li",{on:{click:t.toggleDrawer}},[n("router-link",{attrs:{to:{name:"search"}}},[n("i",{staticClass:"button-icon icon-search"}),t._v(" "+t._s(t.$t("nav.search"))+"\n ")])],1):t._e(),t._v(" "),t.currentUser&&t.suggestionsEnabled?n("li",{on:{click:t.toggleDrawer}},[n("router-link",{attrs:{to:{name:"who-to-follow"}}},[n("i",{staticClass:"button-icon icon-user-plus"}),t._v(" "+t._s(t.$t("nav.who_to_follow"))+"\n ")])],1):t._e(),t._v(" "),n("li",{on:{click:t.toggleDrawer}},[n("a",{attrs:{href:"#"},on:{click:t.openSettingsModal}},[n("i",{staticClass:"button-icon icon-cog"}),t._v(" "+t._s(t.$t("settings.settings"))+"\n ")])]),t._v(" "),n("li",{on:{click:t.toggleDrawer}},[n("router-link",{attrs:{to:{name:"about"}}},[n("i",{staticClass:"button-icon icon-info-circled"}),t._v(" "+t._s(t.$t("nav.about"))+"\n ")])],1),t._v(" "),t.currentUser&&"admin"===t.currentUser.role?n("li",{on:{click:t.toggleDrawer}},[n("a",{attrs:{href:"/pleroma/admin/#/login-pleroma",target:"_blank"}},[n("i",{staticClass:"button-icon icon-gauge"}),t._v(" "+t._s(t.$t("nav.administration"))+"\n ")])]):t._e(),t._v(" "),t.currentUser?n("li",{on:{click:t.toggleDrawer}},[n("a",{attrs:{href:"#"},on:{click:t.doLogout}},[n("i",{staticClass:"button-icon icon-logout"}),t._v(" "+t._s(t.$t("login.logout"))+"\n ")])]):t._e()])]),t._v(" "),n("div",{staticClass:"side-drawer-click-outside",class:{"side-drawer-click-outside-closed":t.closed},on:{click:function(e){return e.stopPropagation(),e.preventDefault(),t.toggleDrawer(e)}}})])},[],!1,Kr,null,null).exports,Jr=n(41),Xr=n.n(Jr),Qr=new Set(["chats","chat"]),Zr={data:function(){return{hidden:!1,scrollingDown:!1,inputActive:!1,oldScrollPos:0,amountScrolled:0}},created:function(){this.autohideFloatingPostButton&&this.activateFloatingPostButtonAutohide(),window.addEventListener("resize",this.handleOSK)},destroyed:function(){this.autohideFloatingPostButton&&this.deactivateFloatingPostButtonAutohide(),window.removeEventListener("resize",this.handleOSK)},computed:{isLoggedIn:function(){return!!this.$store.state.users.currentUser},isHidden:function(){return!!Qr.has(this.$route.name)||this.autohideFloatingPostButton&&(this.hidden||this.inputActive)},autohideFloatingPostButton:function(){return!!this.$store.getters.mergedConfig.autohideFloatingPostButton}},watch:{autohideFloatingPostButton:function(t){t?this.activateFloatingPostButtonAutohide():this.deactivateFloatingPostButtonAutohide()}},methods:{activateFloatingPostButtonAutohide:function(){window.addEventListener("scroll",this.handleScrollStart),window.addEventListener("scroll",this.handleScrollEnd)},deactivateFloatingPostButtonAutohide:function(){window.removeEventListener("scroll",this.handleScrollStart),window.removeEventListener("scroll",this.handleScrollEnd)},openPostForm:function(){this.$store.dispatch("openPostStatusModal")},handleOSK:function(){var t=window.innerWidth<350,e=t&&window.innerHeight<345,n=!t&&window.innerWidth<450&&window.innerHeight<560;this.inputActive=!(!e&&!n)},handleScrollStart:Xr()(function(){window.scrollY>this.oldScrollPos?this.hidden=!0:this.hidden=!1,this.oldScrollPos=window.scrollY},100,{leading:!0,trailing:!1}),handleScrollEnd:Xr()(function(){this.hidden=!1,this.oldScrollPos=window.scrollY},100,{leading:!1,trailing:!0})}};var ts=function(t){n(552)},es=Object(dn.a)(Zr,function(){var t=this.$createElement,e=this._self._c||t;return this.isLoggedIn?e("div",[e("button",{staticClass:"new-status-button",class:{hidden:this.isHidden},on:{click:this.openPostForm}},[e("i",{staticClass:"icon-edit"})])]):this._e()},[],!1,ts,null,null).exports;function ns(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}var is={components:{SideDrawer:Yr,Notifications:Gn},data:function(){return{notificationsCloseGesture:void 0,notificationsOpen:!1}},created:function(){this.notificationsCloseGesture=zr.swipeGesture(zr.DIRECTION_RIGHT,this.closeMobileNotifications,50)},computed:function(t){for(var e=1;e=e.scrollHeight&&this.$refs.notifications.fetchOlderNotifications()}},watch:{$route:function(){this.closeMobileNotifications()}}};var os=function(t){n(554)},rs=Object(dn.a)(is,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("nav",{staticClass:"nav-bar container",class:{"mobile-hidden":t.isChat},attrs:{id:"nav"}},[n("div",{staticClass:"mobile-inner-nav",on:{click:function(e){return t.scrollToTop()}}},[n("div",{staticClass:"item"},[n("a",{staticClass:"mobile-nav-button",attrs:{href:"#"},on:{click:function(e){return e.stopPropagation(),e.preventDefault(),t.toggleMobileSidebar()}}},[n("i",{staticClass:"button-icon icon-menu"}),t._v(" "),t.unreadChatCount?n("div",{staticClass:"alert-dot"}):t._e()]),t._v(" "),t.hideSitename?t._e():n("router-link",{staticClass:"site-name",attrs:{to:{name:"root"},"active-class":"home"}},[t._v("\n "+t._s(t.sitename)+"\n ")])],1),t._v(" "),n("div",{staticClass:"item right"},[t.currentUser?n("a",{staticClass:"mobile-nav-button",attrs:{href:"#"},on:{click:function(e){return e.stopPropagation(),e.preventDefault(),t.openMobileNotifications()}}},[n("i",{staticClass:"button-icon icon-bell-alt"}),t._v(" "),t.unseenNotificationsCount?n("div",{staticClass:"alert-dot"}):t._e()]):t._e()])])]),t._v(" "),t.currentUser?n("div",{staticClass:"mobile-notifications-drawer",class:{closed:!t.notificationsOpen},on:{touchstart:function(e){return e.stopPropagation(),t.notificationsTouchStart(e)},touchmove:function(e){return e.stopPropagation(),t.notificationsTouchMove(e)}}},[n("div",{staticClass:"mobile-notifications-header"},[n("span",{staticClass:"title"},[t._v(t._s(t.$t("notifications.notifications")))]),t._v(" "),n("a",{staticClass:"mobile-nav-button",on:{click:function(e){return e.stopPropagation(),e.preventDefault(),t.closeMobileNotifications()}}},[n("i",{staticClass:"button-icon icon-cancel"})])]),t._v(" "),n("div",{staticClass:"mobile-notifications",on:{scroll:t.onScroll}},[n("Notifications",{ref:"notifications",attrs:{"no-heading":!0}})],1)]):t._e(),t._v(" "),n("SideDrawer",{ref:"sideDrawer",attrs:{logout:t.logout}})],1)},[],!1,os,null,null).exports,ss=n(54);function as(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}var cs={components:{Status:sn.default,List:pi.a,Checkbox:ss.a,Modal:$r},data:function(){return{comment:"",forward:!1,statusIdsToReport:[],processing:!1,error:!1}},computed:{isLoggedIn:function(){return!!this.$store.state.users.currentUser},isOpen:function(){return this.isLoggedIn&&this.$store.state.reports.modalActivated},userId:function(){return this.$store.state.reports.userId},user:function(){return this.$store.getters.findUser(this.userId)},remoteInstance:function(){return!this.user.is_local&&this.user.screen_name.substr(this.user.screen_name.indexOf("@")+1)},statuses:function(){return this.$store.state.reports.statuses}},watch:{userId:"resetState"},methods:{resetState:function(){this.comment="",this.forward=!1,this.statusIdsToReport=[],this.processing=!1,this.error=!1},closeModal:function(){this.$store.dispatch("closeUserReportingModal")},reportUser:function(){var t=this;this.processing=!0,this.error=!1;var e={userId:this.userId,comment:this.comment,forward:this.forward,statusIds:this.statusIdsToReport};this.$store.state.api.backendInteractor.reportUser(function(t){for(var e=1;e {\n if (status.is_post_verb) {\n return 'status'\n }\n\n if (status.retweeted_status) {\n return 'retweet'\n }\n\n if ((typeof status.uri === 'string' && status.uri.match(/(fave|objectType=Favourite)/)) ||\n (typeof status.text === 'string' && status.text.match(/favorited/))) {\n return 'favorite'\n }\n\n if (status.text.match(/deleted notice {{tag/) || status.qvitter_delete_notice) {\n return 'deletion'\n }\n\n if (status.text.match(/started following/) || status.activity_type === 'follow') {\n return 'follow'\n }\n\n return 'unknown'\n}\n\nexport const parseUser = (data) => {\n const output = {}\n const masto = data.hasOwnProperty('acct')\n // case for users in \"mentions\" property for statuses in MastoAPI\n const mastoShort = masto && !data.hasOwnProperty('avatar')\n\n output.id = String(data.id)\n\n if (masto) {\n output.screen_name = data.acct\n output.statusnet_profile_url = data.url\n\n // There's nothing else to get\n if (mastoShort) {\n return output\n }\n\n output.name = data.display_name\n output.name_html = addEmojis(escape(data.display_name), data.emojis)\n\n output.description = data.note\n output.description_html = addEmojis(data.note, data.emojis)\n\n output.fields = data.fields\n output.fields_html = data.fields.map(field => {\n return {\n name: addEmojis(field.name, data.emojis),\n value: addEmojis(field.value, data.emojis)\n }\n })\n output.fields_text = data.fields.map(field => {\n return {\n name: unescape(field.name.replace(/<[^>]*>/g, '')),\n value: unescape(field.value.replace(/<[^>]*>/g, ''))\n }\n })\n\n // Utilize avatar_static for gif avatars?\n output.profile_image_url = data.avatar\n output.profile_image_url_original = data.avatar\n\n // Same, utilize header_static?\n output.cover_photo = data.header\n\n output.friends_count = data.following_count\n\n output.bot = data.bot\n\n if (data.pleroma) {\n const relationship = data.pleroma.relationship\n\n output.background_image = data.pleroma.background_image\n output.favicon = data.pleroma.favicon\n output.token = data.pleroma.chat_token\n\n if (relationship) {\n output.relationship = relationship\n }\n\n output.allow_following_move = data.pleroma.allow_following_move\n\n output.hide_follows = data.pleroma.hide_follows\n output.hide_followers = data.pleroma.hide_followers\n output.hide_follows_count = data.pleroma.hide_follows_count\n output.hide_followers_count = data.pleroma.hide_followers_count\n\n output.rights = {\n moderator: data.pleroma.is_moderator,\n admin: data.pleroma.is_admin\n }\n // TODO: Clean up in UI? This is duplication from what BE does for qvitterapi\n if (output.rights.admin) {\n output.role = 'admin'\n } else if (output.rights.moderator) {\n output.role = 'moderator'\n } else {\n output.role = 'member'\n }\n }\n\n if (data.source) {\n output.description = data.source.note\n output.default_scope = data.source.privacy\n output.fields = data.source.fields\n if (data.source.pleroma) {\n output.no_rich_text = data.source.pleroma.no_rich_text\n output.show_role = data.source.pleroma.show_role\n output.discoverable = data.source.pleroma.discoverable\n }\n }\n\n // TODO: handle is_local\n output.is_local = !output.screen_name.includes('@')\n } else {\n output.screen_name = data.screen_name\n\n output.name = data.name\n output.name_html = data.name_html\n\n output.description = data.description\n output.description_html = data.description_html\n\n output.profile_image_url = data.profile_image_url\n output.profile_image_url_original = data.profile_image_url_original\n\n output.cover_photo = data.cover_photo\n\n output.friends_count = data.friends_count\n\n // output.bot = ??? missing\n\n output.statusnet_profile_url = data.statusnet_profile_url\n\n output.is_local = data.is_local\n output.role = data.role\n output.show_role = data.show_role\n\n if (data.rights) {\n output.rights = {\n moderator: data.rights.delete_others_notice,\n admin: data.rights.admin\n }\n }\n output.no_rich_text = data.no_rich_text\n output.default_scope = data.default_scope\n output.hide_follows = data.hide_follows\n output.hide_followers = data.hide_followers\n output.hide_follows_count = data.hide_follows_count\n output.hide_followers_count = data.hide_followers_count\n output.background_image = data.background_image\n // Websocket token\n output.token = data.token\n\n // Convert relationsip data to expected format\n output.relationship = {\n muting: data.muted,\n blocking: data.statusnet_blocking,\n followed_by: data.follows_you,\n following: data.following\n }\n }\n\n output.created_at = new Date(data.created_at)\n output.locked = data.locked\n output.followers_count = data.followers_count\n output.statuses_count = data.statuses_count\n output.friendIds = []\n output.followerIds = []\n output.pinnedStatusIds = []\n\n if (data.pleroma) {\n output.follow_request_count = data.pleroma.follow_request_count\n\n output.tags = data.pleroma.tags\n output.deactivated = data.pleroma.deactivated\n\n output.notification_settings = data.pleroma.notification_settings\n output.unread_chat_count = data.pleroma.unread_chat_count\n }\n\n output.tags = output.tags || []\n output.rights = output.rights || {}\n output.notification_settings = output.notification_settings || {}\n\n return output\n}\n\nexport const parseAttachment = (data) => {\n const output = {}\n const masto = !data.hasOwnProperty('oembed')\n\n if (masto) {\n // Not exactly same...\n output.mimetype = data.pleroma ? data.pleroma.mime_type : data.type\n output.meta = data.meta // not present in BE yet\n output.id = data.id\n } else {\n output.mimetype = data.mimetype\n // output.meta = ??? missing\n }\n\n output.url = data.url\n output.large_thumb_url = data.preview_url\n output.description = data.description\n\n return output\n}\nexport const addEmojis = (string, emojis) => {\n const matchOperatorsRegex = /[|\\\\{}()[\\]^$+*?.-]/g\n return emojis.reduce((acc, emoji) => {\n const regexSafeShortCode = emoji.shortcode.replace(matchOperatorsRegex, '\\\\$&')\n return acc.replace(\n new RegExp(`:${regexSafeShortCode}:`, 'g'),\n `:${emoji.shortcode}:`\n )\n }, string)\n}\n\nexport const parseStatus = (data) => {\n const output = {}\n const masto = data.hasOwnProperty('account')\n\n if (masto) {\n output.favorited = data.favourited\n output.fave_num = data.favourites_count\n\n output.repeated = data.reblogged\n output.repeat_num = data.reblogs_count\n\n output.bookmarked = data.bookmarked\n\n output.type = data.reblog ? 'retweet' : 'status'\n output.nsfw = data.sensitive\n\n output.statusnet_html = addEmojis(data.content, data.emojis)\n\n output.tags = data.tags\n\n if (data.pleroma) {\n const { pleroma } = data\n output.text = pleroma.content ? data.pleroma.content['text/plain'] : data.content\n output.summary = pleroma.spoiler_text ? data.pleroma.spoiler_text['text/plain'] : data.spoiler_text\n output.statusnet_conversation_id = data.pleroma.conversation_id\n output.is_local = pleroma.local\n output.in_reply_to_screen_name = data.pleroma.in_reply_to_account_acct\n output.thread_muted = pleroma.thread_muted\n output.emoji_reactions = pleroma.emoji_reactions\n output.parent_visible = pleroma.parent_visible === undefined ? true : pleroma.parent_visible\n } else {\n output.text = data.content\n output.summary = data.spoiler_text\n }\n\n output.in_reply_to_status_id = data.in_reply_to_id\n output.in_reply_to_user_id = data.in_reply_to_account_id\n output.replies_count = data.replies_count\n\n if (output.type === 'retweet') {\n output.retweeted_status = parseStatus(data.reblog)\n }\n\n output.summary_html = addEmojis(escape(data.spoiler_text), data.emojis)\n output.external_url = data.url\n output.poll = data.poll\n if (output.poll) {\n output.poll.options = (output.poll.options || []).map(field => ({\n ...field,\n title_html: addEmojis(field.title, data.emojis)\n }))\n }\n output.pinned = data.pinned\n output.muted = data.muted\n } else {\n output.favorited = data.favorited\n output.fave_num = data.fave_num\n\n output.repeated = data.repeated\n output.repeat_num = data.repeat_num\n\n // catchall, temporary\n // Object.assign(output, data)\n\n output.type = qvitterStatusType(data)\n\n if (data.nsfw === undefined) {\n output.nsfw = isNsfw(data)\n if (data.retweeted_status) {\n output.nsfw = data.retweeted_status.nsfw\n }\n } else {\n output.nsfw = data.nsfw\n }\n\n output.statusnet_html = data.statusnet_html\n output.text = data.text\n\n output.in_reply_to_status_id = data.in_reply_to_status_id\n output.in_reply_to_user_id = data.in_reply_to_user_id\n output.in_reply_to_screen_name = data.in_reply_to_screen_name\n output.statusnet_conversation_id = data.statusnet_conversation_id\n\n if (output.type === 'retweet') {\n output.retweeted_status = parseStatus(data.retweeted_status)\n }\n\n output.summary = data.summary\n output.summary_html = data.summary_html\n output.external_url = data.external_url\n output.is_local = data.is_local\n }\n\n output.id = String(data.id)\n output.visibility = data.visibility\n output.card = data.card\n output.created_at = new Date(data.created_at)\n\n // Converting to string, the right way.\n output.in_reply_to_status_id = output.in_reply_to_status_id\n ? String(output.in_reply_to_status_id)\n : null\n output.in_reply_to_user_id = output.in_reply_to_user_id\n ? String(output.in_reply_to_user_id)\n : null\n\n output.user = parseUser(masto ? data.account : data.user)\n\n output.attentions = ((masto ? data.mentions : data.attentions) || []).map(parseUser)\n\n output.attachments = ((masto ? data.media_attachments : data.attachments) || [])\n .map(parseAttachment)\n\n const retweetedStatus = masto ? data.reblog : data.retweeted_status\n if (retweetedStatus) {\n output.retweeted_status = parseStatus(retweetedStatus)\n }\n\n output.favoritedBy = []\n output.rebloggedBy = []\n\n return output\n}\n\nexport const parseNotification = (data) => {\n const mastoDict = {\n 'favourite': 'like',\n 'reblog': 'repeat'\n }\n const masto = !data.hasOwnProperty('ntype')\n const output = {}\n\n if (masto) {\n output.type = mastoDict[data.type] || data.type\n output.seen = data.pleroma.is_seen\n output.status = isStatusNotification(output.type) ? parseStatus(data.status) : null\n output.action = output.status // TODO: Refactor, this is unneeded\n output.target = output.type !== 'move'\n ? null\n : parseUser(data.target)\n output.from_profile = parseUser(data.account)\n output.emoji = data.emoji\n } else {\n const parsedNotice = parseStatus(data.notice)\n output.type = data.ntype\n output.seen = Boolean(data.is_seen)\n output.status = output.type === 'like'\n ? parseStatus(data.notice.favorited_status)\n : parsedNotice\n output.action = parsedNotice\n output.from_profile = output.type === 'pleroma:chat_mention' ? parseUser(data.account) : parseUser(data.from_profile)\n }\n\n output.created_at = new Date(data.created_at)\n output.id = parseInt(data.id)\n\n return output\n}\n\nconst isNsfw = (status) => {\n const nsfwRegex = /#nsfw/i\n return (status.tags || []).includes('nsfw') || !!(status.text || '').match(nsfwRegex)\n}\n\nexport const parseLinkHeaderPagination = (linkHeader, opts = {}) => {\n const flakeId = opts.flakeId\n const parsedLinkHeader = parseLinkHeader(linkHeader)\n if (!parsedLinkHeader) return\n const maxId = parsedLinkHeader.next.max_id\n const minId = parsedLinkHeader.prev.min_id\n\n return {\n maxId: flakeId ? maxId : parseInt(maxId, 10),\n minId: flakeId ? minId : parseInt(minId, 10)\n }\n}\n\nexport const parseChat = (chat) => {\n const output = {}\n output.id = chat.id\n output.account = parseUser(chat.account)\n output.unread = chat.unread\n output.lastMessage = parseChatMessage(chat.last_message)\n output.updated_at = new Date(chat.updated_at)\n return output\n}\n\nexport const parseChatMessage = (message) => {\n if (!message) { return }\n if (message.isNormalized) { return message }\n const output = message\n output.id = message.id\n output.created_at = new Date(message.created_at)\n output.chat_id = message.chat_id\n if (message.content) {\n output.content = addEmojis(message.content, message.emojis)\n } else {\n output.content = ''\n }\n if (message.attachment) {\n output.attachments = [parseAttachment(message.attachment)]\n } else {\n output.attachments = []\n }\n output.isNormalized = true\n return output\n}\n","import { invertLightness, contrastRatio } from 'chromatism'\n\n// useful for visualizing color when debugging\nexport const consoleColor = (color) => console.log('%c##########', 'background: ' + color + '; color: ' + color)\n\n/**\n * Convert r, g, b values into hex notation. All components are [0-255]\n *\n * @param {Number|String|Object} r - Either red component, {r,g,b} object, or hex string\n * @param {Number} [g] - Green component\n * @param {Number} [b] - Blue component\n */\nexport const rgb2hex = (r, g, b) => {\n if (r === null || typeof r === 'undefined') {\n return undefined\n }\n // TODO: clean up this mess\n if (r[0] === '#' || r === 'transparent') {\n return r\n }\n if (typeof r === 'object') {\n ({ r, g, b } = r)\n }\n [r, g, b] = [r, g, b].map(val => {\n val = Math.ceil(val)\n val = val < 0 ? 0 : val\n val = val > 255 ? 255 : val\n return val\n })\n return `#${((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)}`\n}\n\n/**\n * Converts 8-bit RGB component into linear component\n * https://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n * https://www.w3.org/TR/2008/REC-WCAG20-20081211/relative-luminance.xml\n * https://en.wikipedia.org/wiki/SRGB#The_reverse_transformation\n *\n * @param {Number} bit - color component [0..255]\n * @returns {Number} linear component [0..1]\n */\nconst c2linear = (bit) => {\n // W3C gives 0.03928 while wikipedia states 0.04045\n // what those magical numbers mean - I don't know.\n // something about gamma-correction, i suppose.\n // Sticking with W3C example.\n const c = bit / 255\n if (c < 0.03928) {\n return c / 12.92\n } else {\n return Math.pow((c + 0.055) / 1.055, 2.4)\n }\n}\n\n/**\n * Converts sRGB into linear RGB\n * @param {Object} srgb - sRGB color\n * @returns {Object} linear rgb color\n */\nconst srgbToLinear = (srgb) => {\n return 'rgb'.split('').reduce((acc, c) => { acc[c] = c2linear(srgb[c]); return acc }, {})\n}\n\n/**\n * Calculates relative luminance for given color\n * https://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n * https://www.w3.org/TR/2008/REC-WCAG20-20081211/relative-luminance.xml\n *\n * @param {Object} srgb - sRGB color\n * @returns {Number} relative luminance\n */\nexport const relativeLuminance = (srgb) => {\n const { r, g, b } = srgbToLinear(srgb)\n return 0.2126 * r + 0.7152 * g + 0.0722 * b\n}\n\n/**\n * Generates color ratio between two colors. Order is unimporant\n * https://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef\n *\n * @param {Object} a - sRGB color\n * @param {Object} b - sRGB color\n * @returns {Number} color ratio\n */\nexport const getContrastRatio = (a, b) => {\n const la = relativeLuminance(a)\n const lb = relativeLuminance(b)\n const [l1, l2] = la > lb ? [la, lb] : [lb, la]\n\n return (l1 + 0.05) / (l2 + 0.05)\n}\n\n/**\n * Same as `getContrastRatio` but for multiple layers in-between\n *\n * @param {Object} text - text color (topmost layer)\n * @param {[Object, Number]} layers[] - layers between text and bedrock\n * @param {Object} bedrock - layer at the very bottom\n */\nexport const getContrastRatioLayers = (text, layers, bedrock) => {\n return getContrastRatio(alphaBlendLayers(bedrock, layers), text)\n}\n\n/**\n * This performs alpha blending between solid background and semi-transparent foreground\n *\n * @param {Object} fg - top layer color\n * @param {Number} fga - top layer's alpha\n * @param {Object} bg - bottom layer color\n * @returns {Object} sRGB of resulting color\n */\nexport const alphaBlend = (fg, fga, bg) => {\n if (fga === 1 || typeof fga === 'undefined') return fg\n return 'rgb'.split('').reduce((acc, c) => {\n // Simplified https://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending\n // for opaque bg and transparent fg\n acc[c] = (fg[c] * fga + bg[c] * (1 - fga))\n return acc\n }, {})\n}\n\n/**\n * Same as `alphaBlend` but for multiple layers in-between\n *\n * @param {Object} bedrock - layer at the very bottom\n * @param {[Object, Number]} layers[] - layers between text and bedrock\n */\nexport const alphaBlendLayers = (bedrock, layers) => layers.reduce((acc, [color, opacity]) => {\n return alphaBlend(color, opacity, acc)\n}, bedrock)\n\nexport const invert = (rgb) => {\n return 'rgb'.split('').reduce((acc, c) => {\n acc[c] = 255 - rgb[c]\n return acc\n }, {})\n}\n\n/**\n * Converts #rrggbb hex notation into an {r, g, b} object\n *\n * @param {String} hex - #rrggbb string\n * @returns {Object} rgb representation of the color, values are 0-255\n */\nexport const hex2rgb = (hex) => {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex)\n return result ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16)\n } : null\n}\n\n/**\n * Old somewhat weird function for mixing two colors together\n *\n * @param {Object} a - one color (rgb)\n * @param {Object} b - other color (rgb)\n * @returns {Object} result\n */\nexport const mixrgb = (a, b) => {\n return 'rgb'.split('').reduce((acc, k) => {\n acc[k] = (a[k] + b[k]) / 2\n return acc\n }, {})\n}\n/**\n * Converts rgb object into a CSS rgba() color\n *\n * @param {Object} color - rgb\n * @returns {String} CSS rgba() color\n */\nexport const rgba2css = function (rgba) {\n return `rgba(${Math.floor(rgba.r)}, ${Math.floor(rgba.g)}, ${Math.floor(rgba.b)}, ${rgba.a})`\n}\n\n/**\n * Get text color for given background color and intended text color\n * This checks if text and background don't have enough color and inverts\n * text color's lightness if needed. If text color is still not enough it\n * will fall back to black or white\n *\n * @param {Object} bg - background color\n * @param {Object} text - intended text color\n * @param {Boolean} preserve - try to preserve intended text color's hue/saturation (i.e. no BW)\n */\nexport const getTextColor = function (bg, text, preserve) {\n const contrast = getContrastRatio(bg, text)\n\n if (contrast < 4.5) {\n const base = typeof text.a !== 'undefined' ? { a: text.a } : {}\n const result = Object.assign(base, invertLightness(text).rgb)\n if (!preserve && getContrastRatio(bg, result) < 4.5) {\n // B&W\n return contrastRatio(bg, text).rgb\n }\n // Inverted color\n return result\n }\n return text\n}\n\n/**\n * Converts color to CSS Color value\n *\n * @param {Object|String} input - color\n * @param {Number} [a] - alpha value\n * @returns {String} a CSS Color value\n */\nexport const getCssColor = (input, a) => {\n let rgb = {}\n if (typeof input === 'object') {\n rgb = input\n } else if (typeof input === 'string') {\n if (input.startsWith('#')) {\n rgb = hex2rgb(input)\n } else {\n return input\n }\n }\n return rgba2css({ ...rgb, a })\n}\n","import { humanizeErrors } from '../../modules/errors'\n\nexport function StatusCodeError (statusCode, body, options, response) {\n this.name = 'StatusCodeError'\n this.statusCode = statusCode\n this.message = statusCode + ' - ' + (JSON && JSON.stringify ? JSON.stringify(body) : body)\n this.error = body // legacy attribute\n this.options = options\n this.response = response\n\n if (Error.captureStackTrace) { // required for non-V8 environments\n Error.captureStackTrace(this)\n }\n}\nStatusCodeError.prototype = Object.create(Error.prototype)\nStatusCodeError.prototype.constructor = StatusCodeError\n\nexport class RegistrationError extends Error {\n constructor (error) {\n super()\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this)\n }\n\n try {\n // the error is probably a JSON object with a single key, \"errors\", whose value is another JSON object containing the real errors\n if (typeof error === 'string') {\n error = JSON.parse(error)\n if (error.hasOwnProperty('error')) {\n error = JSON.parse(error.error)\n }\n }\n\n if (typeof error === 'object') {\n const errorContents = JSON.parse(error.error)\n // keys will have the property that has the error, for example 'ap_id',\n // 'email' or 'captcha', the value will be an array of its error\n // like \"ap_id\": [\"has been taken\"] or \"captcha\": [\"Invalid CAPTCHA\"]\n\n // replace ap_id with username\n if (errorContents.ap_id) {\n errorContents.username = errorContents.ap_id\n delete errorContents.ap_id\n }\n\n this.message = humanizeErrors(errorContents)\n } else {\n this.message = error\n }\n } catch (e) {\n // can't parse it, so just treat it like a string\n this.message = error\n }\n }\n}\n","import { capitalize } from 'lodash'\n\nexport function humanizeErrors (errors) {\n return Object.entries(errors).reduce((errs, [k, val]) => {\n let message = val.reduce((acc, message) => {\n let key = capitalize(k.replace(/_/g, ' '))\n return acc + [key, message].join(' ') + '. '\n }, '')\n return [...errs, message]\n }, [])\n}\n","import { each, map, concat, last, get } from 'lodash'\nimport { parseStatus, parseUser, parseNotification, parseAttachment, parseChat, parseLinkHeaderPagination } from '../entity_normalizer/entity_normalizer.service.js'\nimport { RegistrationError, StatusCodeError } from '../errors/errors'\n\n/* eslint-env browser */\nconst BLOCKS_IMPORT_URL = '/api/pleroma/blocks_import'\nconst FOLLOW_IMPORT_URL = '/api/pleroma/follow_import'\nconst DELETE_ACCOUNT_URL = '/api/pleroma/delete_account'\nconst CHANGE_EMAIL_URL = '/api/pleroma/change_email'\nconst CHANGE_PASSWORD_URL = '/api/pleroma/change_password'\nconst TAG_USER_URL = '/api/pleroma/admin/users/tag'\nconst PERMISSION_GROUP_URL = (screenName, right) => `/api/pleroma/admin/users/${screenName}/permission_group/${right}`\nconst ACTIVATE_USER_URL = '/api/pleroma/admin/users/activate'\nconst DEACTIVATE_USER_URL = '/api/pleroma/admin/users/deactivate'\nconst ADMIN_USERS_URL = '/api/pleroma/admin/users'\nconst SUGGESTIONS_URL = '/api/v1/suggestions'\nconst NOTIFICATION_SETTINGS_URL = '/api/pleroma/notification_settings'\nconst NOTIFICATION_READ_URL = '/api/v1/pleroma/notifications/read'\n\nconst MFA_SETTINGS_URL = '/api/pleroma/accounts/mfa'\nconst MFA_BACKUP_CODES_URL = '/api/pleroma/accounts/mfa/backup_codes'\n\nconst MFA_SETUP_OTP_URL = '/api/pleroma/accounts/mfa/setup/totp'\nconst MFA_CONFIRM_OTP_URL = '/api/pleroma/accounts/mfa/confirm/totp'\nconst MFA_DISABLE_OTP_URL = '/api/pleroma/accounts/mfa/totp'\n\nconst MASTODON_LOGIN_URL = '/api/v1/accounts/verify_credentials'\nconst MASTODON_REGISTRATION_URL = '/api/v1/accounts'\nconst MASTODON_USER_FAVORITES_TIMELINE_URL = '/api/v1/favourites'\nconst MASTODON_USER_NOTIFICATIONS_URL = '/api/v1/notifications'\nconst MASTODON_DISMISS_NOTIFICATION_URL = id => `/api/v1/notifications/${id}/dismiss`\nconst MASTODON_FAVORITE_URL = id => `/api/v1/statuses/${id}/favourite`\nconst MASTODON_UNFAVORITE_URL = id => `/api/v1/statuses/${id}/unfavourite`\nconst MASTODON_RETWEET_URL = id => `/api/v1/statuses/${id}/reblog`\nconst MASTODON_UNRETWEET_URL = id => `/api/v1/statuses/${id}/unreblog`\nconst MASTODON_DELETE_URL = id => `/api/v1/statuses/${id}`\nconst MASTODON_FOLLOW_URL = id => `/api/v1/accounts/${id}/follow`\nconst MASTODON_UNFOLLOW_URL = id => `/api/v1/accounts/${id}/unfollow`\nconst MASTODON_FOLLOWING_URL = id => `/api/v1/accounts/${id}/following`\nconst MASTODON_FOLLOWERS_URL = id => `/api/v1/accounts/${id}/followers`\nconst MASTODON_FOLLOW_REQUESTS_URL = '/api/v1/follow_requests'\nconst MASTODON_APPROVE_USER_URL = id => `/api/v1/follow_requests/${id}/authorize`\nconst MASTODON_DENY_USER_URL = id => `/api/v1/follow_requests/${id}/reject`\nconst MASTODON_DIRECT_MESSAGES_TIMELINE_URL = '/api/v1/timelines/direct'\nconst MASTODON_PUBLIC_TIMELINE = '/api/v1/timelines/public'\nconst MASTODON_USER_HOME_TIMELINE_URL = '/api/v1/timelines/home'\nconst MASTODON_STATUS_URL = id => `/api/v1/statuses/${id}`\nconst MASTODON_STATUS_CONTEXT_URL = id => `/api/v1/statuses/${id}/context`\nconst MASTODON_USER_URL = '/api/v1/accounts'\nconst MASTODON_USER_RELATIONSHIPS_URL = '/api/v1/accounts/relationships'\nconst MASTODON_USER_TIMELINE_URL = id => `/api/v1/accounts/${id}/statuses`\nconst MASTODON_TAG_TIMELINE_URL = tag => `/api/v1/timelines/tag/${tag}`\nconst MASTODON_BOOKMARK_TIMELINE_URL = '/api/v1/bookmarks'\nconst MASTODON_USER_BLOCKS_URL = '/api/v1/blocks/'\nconst MASTODON_USER_MUTES_URL = '/api/v1/mutes/'\nconst MASTODON_BLOCK_USER_URL = id => `/api/v1/accounts/${id}/block`\nconst MASTODON_UNBLOCK_USER_URL = id => `/api/v1/accounts/${id}/unblock`\nconst MASTODON_MUTE_USER_URL = id => `/api/v1/accounts/${id}/mute`\nconst MASTODON_UNMUTE_USER_URL = id => `/api/v1/accounts/${id}/unmute`\nconst MASTODON_SUBSCRIBE_USER = id => `/api/v1/pleroma/accounts/${id}/subscribe`\nconst MASTODON_UNSUBSCRIBE_USER = id => `/api/v1/pleroma/accounts/${id}/unsubscribe`\nconst MASTODON_BOOKMARK_STATUS_URL = id => `/api/v1/statuses/${id}/bookmark`\nconst MASTODON_UNBOOKMARK_STATUS_URL = id => `/api/v1/statuses/${id}/unbookmark`\nconst MASTODON_POST_STATUS_URL = '/api/v1/statuses'\nconst MASTODON_MEDIA_UPLOAD_URL = '/api/v1/media'\nconst MASTODON_VOTE_URL = id => `/api/v1/polls/${id}/votes`\nconst MASTODON_POLL_URL = id => `/api/v1/polls/${id}`\nconst MASTODON_STATUS_FAVORITEDBY_URL = id => `/api/v1/statuses/${id}/favourited_by`\nconst MASTODON_STATUS_REBLOGGEDBY_URL = id => `/api/v1/statuses/${id}/reblogged_by`\nconst MASTODON_PROFILE_UPDATE_URL = '/api/v1/accounts/update_credentials'\nconst MASTODON_REPORT_USER_URL = '/api/v1/reports'\nconst MASTODON_PIN_OWN_STATUS = id => `/api/v1/statuses/${id}/pin`\nconst MASTODON_UNPIN_OWN_STATUS = id => `/api/v1/statuses/${id}/unpin`\nconst MASTODON_MUTE_CONVERSATION = id => `/api/v1/statuses/${id}/mute`\nconst MASTODON_UNMUTE_CONVERSATION = id => `/api/v1/statuses/${id}/unmute`\nconst MASTODON_SEARCH_2 = `/api/v2/search`\nconst MASTODON_USER_SEARCH_URL = '/api/v1/accounts/search'\nconst MASTODON_DOMAIN_BLOCKS_URL = '/api/v1/domain_blocks'\nconst MASTODON_STREAMING = '/api/v1/streaming'\nconst MASTODON_KNOWN_DOMAIN_LIST_URL = '/api/v1/instance/peers'\nconst PLEROMA_EMOJI_REACTIONS_URL = id => `/api/v1/pleroma/statuses/${id}/reactions`\nconst PLEROMA_EMOJI_REACT_URL = (id, emoji) => `/api/v1/pleroma/statuses/${id}/reactions/${emoji}`\nconst PLEROMA_EMOJI_UNREACT_URL = (id, emoji) => `/api/v1/pleroma/statuses/${id}/reactions/${emoji}`\nconst PLEROMA_CHATS_URL = `/api/v1/pleroma/chats`\nconst PLEROMA_CHAT_URL = id => `/api/v1/pleroma/chats/by-account-id/${id}`\nconst PLEROMA_CHAT_MESSAGES_URL = id => `/api/v1/pleroma/chats/${id}/messages`\nconst PLEROMA_CHAT_READ_URL = id => `/api/v1/pleroma/chats/${id}/read`\nconst PLEROMA_DELETE_CHAT_MESSAGE_URL = (chatId, messageId) => `/api/v1/pleroma/chats/${chatId}/messages/${messageId}`\n\nconst oldfetch = window.fetch\n\nlet fetch = (url, options) => {\n options = options || {}\n const baseUrl = ''\n const fullUrl = baseUrl + url\n options.credentials = 'same-origin'\n return oldfetch(fullUrl, options)\n}\n\nconst promisedRequest = ({ method, url, params, payload, credentials, headers = {} }) => {\n const options = {\n method,\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n ...headers\n }\n }\n if (params) {\n url += '?' + Object.entries(params)\n .map(([key, value]) => encodeURIComponent(key) + '=' + encodeURIComponent(value))\n .join('&')\n }\n if (payload) {\n options.body = JSON.stringify(payload)\n }\n if (credentials) {\n options.headers = {\n ...options.headers,\n ...authHeaders(credentials)\n }\n }\n return fetch(url, options)\n .then((response) => {\n return new Promise((resolve, reject) => response.json()\n .then((json) => {\n if (!response.ok) {\n return reject(new StatusCodeError(response.status, json, { url, options }, response))\n }\n return resolve(json)\n }))\n })\n}\n\nconst updateNotificationSettings = ({ credentials, settings }) => {\n const form = new FormData()\n\n each(settings, (value, key) => {\n form.append(key, value)\n })\n\n return fetch(NOTIFICATION_SETTINGS_URL, {\n headers: authHeaders(credentials),\n method: 'PUT',\n body: form\n }).then((data) => data.json())\n}\n\nconst updateProfileImages = ({ credentials, avatar = null, banner = null, background = null }) => {\n const form = new FormData()\n if (avatar !== null) form.append('avatar', avatar)\n if (banner !== null) form.append('header', banner)\n if (background !== null) form.append('pleroma_background_image', background)\n return fetch(MASTODON_PROFILE_UPDATE_URL, {\n headers: authHeaders(credentials),\n method: 'PATCH',\n body: form\n })\n .then((data) => data.json())\n .then((data) => parseUser(data))\n}\n\nconst updateProfile = ({ credentials, params }) => {\n return promisedRequest({\n url: MASTODON_PROFILE_UPDATE_URL,\n method: 'PATCH',\n payload: params,\n credentials\n }).then((data) => parseUser(data))\n}\n\n// Params needed:\n// nickname\n// email\n// fullname\n// password\n// password_confirm\n//\n// Optional\n// bio\n// homepage\n// location\n// token\nconst register = ({ params, credentials }) => {\n const { nickname, ...rest } = params\n return fetch(MASTODON_REGISTRATION_URL, {\n method: 'POST',\n headers: {\n ...authHeaders(credentials),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n nickname,\n locale: 'en_US',\n agreement: true,\n ...rest\n })\n })\n .then((response) => {\n if (response.ok) {\n return response.json()\n } else {\n return response.json().then((error) => { throw new RegistrationError(error) })\n }\n })\n}\n\nconst getCaptcha = () => fetch('/api/pleroma/captcha').then(resp => resp.json())\n\nconst authHeaders = (accessToken) => {\n if (accessToken) {\n return { 'Authorization': `Bearer ${accessToken}` }\n } else {\n return { }\n }\n}\n\nconst followUser = ({ id, credentials, ...options }) => {\n let url = MASTODON_FOLLOW_URL(id)\n const form = {}\n if (options.reblogs !== undefined) { form['reblogs'] = options.reblogs }\n return fetch(url, {\n body: JSON.stringify(form),\n headers: {\n ...authHeaders(credentials),\n 'Content-Type': 'application/json'\n },\n method: 'POST'\n }).then((data) => data.json())\n}\n\nconst unfollowUser = ({ id, credentials }) => {\n let url = MASTODON_UNFOLLOW_URL(id)\n return fetch(url, {\n headers: authHeaders(credentials),\n method: 'POST'\n }).then((data) => data.json())\n}\n\nconst pinOwnStatus = ({ id, credentials }) => {\n return promisedRequest({ url: MASTODON_PIN_OWN_STATUS(id), credentials, method: 'POST' })\n .then((data) => parseStatus(data))\n}\n\nconst unpinOwnStatus = ({ id, credentials }) => {\n return promisedRequest({ url: MASTODON_UNPIN_OWN_STATUS(id), credentials, method: 'POST' })\n .then((data) => parseStatus(data))\n}\n\nconst muteConversation = ({ id, credentials }) => {\n return promisedRequest({ url: MASTODON_MUTE_CONVERSATION(id), credentials, method: 'POST' })\n .then((data) => parseStatus(data))\n}\n\nconst unmuteConversation = ({ id, credentials }) => {\n return promisedRequest({ url: MASTODON_UNMUTE_CONVERSATION(id), credentials, method: 'POST' })\n .then((data) => parseStatus(data))\n}\n\nconst blockUser = ({ id, credentials }) => {\n return fetch(MASTODON_BLOCK_USER_URL(id), {\n headers: authHeaders(credentials),\n method: 'POST'\n }).then((data) => data.json())\n}\n\nconst unblockUser = ({ id, credentials }) => {\n return fetch(MASTODON_UNBLOCK_USER_URL(id), {\n headers: authHeaders(credentials),\n method: 'POST'\n }).then((data) => data.json())\n}\n\nconst approveUser = ({ id, credentials }) => {\n let url = MASTODON_APPROVE_USER_URL(id)\n return fetch(url, {\n headers: authHeaders(credentials),\n method: 'POST'\n }).then((data) => data.json())\n}\n\nconst denyUser = ({ id, credentials }) => {\n let url = MASTODON_DENY_USER_URL(id)\n return fetch(url, {\n headers: authHeaders(credentials),\n method: 'POST'\n }).then((data) => data.json())\n}\n\nconst fetchUser = ({ id, credentials }) => {\n let url = `${MASTODON_USER_URL}/${id}`\n return promisedRequest({ url, credentials })\n .then((data) => parseUser(data))\n}\n\nconst fetchUserRelationship = ({ id, credentials }) => {\n let url = `${MASTODON_USER_RELATIONSHIPS_URL}/?id=${id}`\n return fetch(url, { headers: authHeaders(credentials) })\n .then((response) => {\n return new Promise((resolve, reject) => response.json()\n .then((json) => {\n if (!response.ok) {\n return reject(new StatusCodeError(response.status, json, { url }, response))\n }\n return resolve(json)\n }))\n })\n}\n\nconst fetchFriends = ({ id, maxId, sinceId, limit = 20, credentials }) => {\n let url = MASTODON_FOLLOWING_URL(id)\n const args = [\n maxId && `max_id=${maxId}`,\n sinceId && `since_id=${sinceId}`,\n limit && `limit=${limit}`,\n `with_relationships=true`\n ].filter(_ => _).join('&')\n\n url = url + (args ? '?' + args : '')\n return fetch(url, { headers: authHeaders(credentials) })\n .then((data) => data.json())\n .then((data) => data.map(parseUser))\n}\n\nconst exportFriends = ({ id, credentials }) => {\n return new Promise(async (resolve, reject) => {\n try {\n let friends = []\n let more = true\n while (more) {\n const maxId = friends.length > 0 ? last(friends).id : undefined\n const users = await fetchFriends({ id, maxId, credentials })\n friends = concat(friends, users)\n if (users.length === 0) {\n more = false\n }\n }\n resolve(friends)\n } catch (err) {\n reject(err)\n }\n })\n}\n\nconst fetchFollowers = ({ id, maxId, sinceId, limit = 20, credentials }) => {\n let url = MASTODON_FOLLOWERS_URL(id)\n const args = [\n maxId && `max_id=${maxId}`,\n sinceId && `since_id=${sinceId}`,\n limit && `limit=${limit}`,\n `with_relationships=true`\n ].filter(_ => _).join('&')\n\n url += args ? '?' + args : ''\n return fetch(url, { headers: authHeaders(credentials) })\n .then((data) => data.json())\n .then((data) => data.map(parseUser))\n}\n\nconst fetchFollowRequests = ({ credentials }) => {\n const url = MASTODON_FOLLOW_REQUESTS_URL\n return fetch(url, { headers: authHeaders(credentials) })\n .then((data) => data.json())\n .then((data) => data.map(parseUser))\n}\n\nconst fetchConversation = ({ id, credentials }) => {\n let urlContext = MASTODON_STATUS_CONTEXT_URL(id)\n return fetch(urlContext, { headers: authHeaders(credentials) })\n .then((data) => {\n if (data.ok) {\n return data\n }\n throw new Error('Error fetching timeline', data)\n })\n .then((data) => data.json())\n .then(({ ancestors, descendants }) => ({\n ancestors: ancestors.map(parseStatus),\n descendants: descendants.map(parseStatus)\n }))\n}\n\nconst fetchStatus = ({ id, credentials }) => {\n let url = MASTODON_STATUS_URL(id)\n return fetch(url, { headers: authHeaders(credentials) })\n .then((data) => {\n if (data.ok) {\n return data\n }\n throw new Error('Error fetching timeline', data)\n })\n .then((data) => data.json())\n .then((data) => parseStatus(data))\n}\n\nconst tagUser = ({ tag, credentials, user }) => {\n const screenName = user.screen_name\n const form = {\n nicknames: [screenName],\n tags: [tag]\n }\n\n const headers = authHeaders(credentials)\n headers['Content-Type'] = 'application/json'\n\n return fetch(TAG_USER_URL, {\n method: 'PUT',\n headers: headers,\n body: JSON.stringify(form)\n })\n}\n\nconst untagUser = ({ tag, credentials, user }) => {\n const screenName = user.screen_name\n const body = {\n nicknames: [screenName],\n tags: [tag]\n }\n\n const headers = authHeaders(credentials)\n headers['Content-Type'] = 'application/json'\n\n return fetch(TAG_USER_URL, {\n method: 'DELETE',\n headers: headers,\n body: JSON.stringify(body)\n })\n}\n\nconst addRight = ({ right, credentials, user }) => {\n const screenName = user.screen_name\n\n return fetch(PERMISSION_GROUP_URL(screenName, right), {\n method: 'POST',\n headers: authHeaders(credentials),\n body: {}\n })\n}\n\nconst deleteRight = ({ right, credentials, user }) => {\n const screenName = user.screen_name\n\n return fetch(PERMISSION_GROUP_URL(screenName, right), {\n method: 'DELETE',\n headers: authHeaders(credentials),\n body: {}\n })\n}\n\nconst activateUser = ({ credentials, user: { screen_name: nickname } }) => {\n return promisedRequest({\n url: ACTIVATE_USER_URL,\n method: 'PATCH',\n credentials,\n payload: {\n nicknames: [nickname]\n }\n }).then(response => get(response, 'users.0'))\n}\n\nconst deactivateUser = ({ credentials, user: { screen_name: nickname } }) => {\n return promisedRequest({\n url: DEACTIVATE_USER_URL,\n method: 'PATCH',\n credentials,\n payload: {\n nicknames: [nickname]\n }\n }).then(response => get(response, 'users.0'))\n}\n\nconst deleteUser = ({ credentials, user }) => {\n const screenName = user.screen_name\n const headers = authHeaders(credentials)\n\n return fetch(`${ADMIN_USERS_URL}?nickname=${screenName}`, {\n method: 'DELETE',\n headers: headers\n })\n}\n\nconst fetchTimeline = ({\n timeline,\n credentials,\n since = false,\n until = false,\n userId = false,\n tag = false,\n withMuted = false,\n replyVisibility = 'all'\n}) => {\n const timelineUrls = {\n public: MASTODON_PUBLIC_TIMELINE,\n friends: MASTODON_USER_HOME_TIMELINE_URL,\n dms: MASTODON_DIRECT_MESSAGES_TIMELINE_URL,\n notifications: MASTODON_USER_NOTIFICATIONS_URL,\n 'publicAndExternal': MASTODON_PUBLIC_TIMELINE,\n user: MASTODON_USER_TIMELINE_URL,\n media: MASTODON_USER_TIMELINE_URL,\n favorites: MASTODON_USER_FAVORITES_TIMELINE_URL,\n tag: MASTODON_TAG_TIMELINE_URL,\n bookmarks: MASTODON_BOOKMARK_TIMELINE_URL\n }\n const isNotifications = timeline === 'notifications'\n const params = []\n\n let url = timelineUrls[timeline]\n\n if (timeline === 'user' || timeline === 'media') {\n url = url(userId)\n }\n\n if (since) {\n params.push(['since_id', since])\n }\n if (until) {\n params.push(['max_id', until])\n }\n if (tag) {\n url = url(tag)\n }\n if (timeline === 'media') {\n params.push(['only_media', 1])\n }\n if (timeline === 'public') {\n params.push(['local', true])\n }\n if (timeline === 'public' || timeline === 'publicAndExternal') {\n params.push(['only_media', false])\n }\n if (timeline !== 'favorites' && timeline !== 'bookmarks') {\n params.push(['with_muted', withMuted])\n }\n if (replyVisibility !== 'all') {\n params.push(['reply_visibility', replyVisibility])\n }\n\n params.push(['limit', 20])\n\n const queryString = map(params, (param) => `${param[0]}=${param[1]}`).join('&')\n url += `?${queryString}`\n let status = ''\n let statusText = ''\n let pagination = {}\n return fetch(url, { headers: authHeaders(credentials) })\n .then((data) => {\n status = data.status\n statusText = data.statusText\n pagination = parseLinkHeaderPagination(data.headers.get('Link'), {\n flakeId: timeline !== 'bookmarks' && timeline !== 'notifications'\n })\n return data\n })\n .then((data) => data.json())\n .then((data) => {\n if (!data.error) {\n return { data: data.map(isNotifications ? parseNotification : parseStatus), pagination }\n } else {\n data.status = status\n data.statusText = statusText\n return data\n }\n })\n}\n\nconst fetchPinnedStatuses = ({ id, credentials }) => {\n const url = MASTODON_USER_TIMELINE_URL(id) + '?pinned=true'\n return promisedRequest({ url, credentials })\n .then((data) => data.map(parseStatus))\n}\n\nconst verifyCredentials = (user) => {\n return fetch(MASTODON_LOGIN_URL, {\n headers: authHeaders(user)\n })\n .then((response) => {\n if (response.ok) {\n return response.json()\n } else {\n return {\n error: response\n }\n }\n })\n .then((data) => data.error ? data : parseUser(data))\n}\n\nconst favorite = ({ id, credentials }) => {\n return promisedRequest({ url: MASTODON_FAVORITE_URL(id), method: 'POST', credentials })\n .then((data) => parseStatus(data))\n}\n\nconst unfavorite = ({ id, credentials }) => {\n return promisedRequest({ url: MASTODON_UNFAVORITE_URL(id), method: 'POST', credentials })\n .then((data) => parseStatus(data))\n}\n\nconst retweet = ({ id, credentials }) => {\n return promisedRequest({ url: MASTODON_RETWEET_URL(id), method: 'POST', credentials })\n .then((data) => parseStatus(data))\n}\n\nconst unretweet = ({ id, credentials }) => {\n return promisedRequest({ url: MASTODON_UNRETWEET_URL(id), method: 'POST', credentials })\n .then((data) => parseStatus(data))\n}\n\nconst bookmarkStatus = ({ id, credentials }) => {\n return promisedRequest({\n url: MASTODON_BOOKMARK_STATUS_URL(id),\n headers: authHeaders(credentials),\n method: 'POST'\n })\n}\n\nconst unbookmarkStatus = ({ id, credentials }) => {\n return promisedRequest({\n url: MASTODON_UNBOOKMARK_STATUS_URL(id),\n headers: authHeaders(credentials),\n method: 'POST'\n })\n}\n\nconst postStatus = ({\n credentials,\n status,\n spoilerText,\n visibility,\n sensitive,\n poll,\n mediaIds = [],\n inReplyToStatusId,\n contentType,\n preview,\n idempotencyKey\n}) => {\n const form = new FormData()\n const pollOptions = poll.options || []\n\n form.append('status', status)\n form.append('source', 'Pleroma FE')\n if (spoilerText) form.append('spoiler_text', spoilerText)\n if (visibility) form.append('visibility', visibility)\n if (sensitive) form.append('sensitive', sensitive)\n if (contentType) form.append('content_type', contentType)\n mediaIds.forEach(val => {\n form.append('media_ids[]', val)\n })\n if (pollOptions.some(option => option !== '')) {\n const normalizedPoll = {\n expires_in: poll.expiresIn,\n multiple: poll.multiple\n }\n Object.keys(normalizedPoll).forEach(key => {\n form.append(`poll[${key}]`, normalizedPoll[key])\n })\n\n pollOptions.forEach(option => {\n form.append('poll[options][]', option)\n })\n }\n if (inReplyToStatusId) {\n form.append('in_reply_to_id', inReplyToStatusId)\n }\n if (preview) {\n form.append('preview', 'true')\n }\n\n let postHeaders = authHeaders(credentials)\n if (idempotencyKey) {\n postHeaders['idempotency-key'] = idempotencyKey\n }\n\n return fetch(MASTODON_POST_STATUS_URL, {\n body: form,\n method: 'POST',\n headers: postHeaders\n })\n .then((response) => {\n return response.json()\n })\n .then((data) => data.error ? data : parseStatus(data))\n}\n\nconst deleteStatus = ({ id, credentials }) => {\n return fetch(MASTODON_DELETE_URL(id), {\n headers: authHeaders(credentials),\n method: 'DELETE'\n })\n}\n\nconst uploadMedia = ({ formData, credentials }) => {\n return fetch(MASTODON_MEDIA_UPLOAD_URL, {\n body: formData,\n method: 'POST',\n headers: authHeaders(credentials)\n })\n .then((data) => data.json())\n .then((data) => parseAttachment(data))\n}\n\nconst setMediaDescription = ({ id, description, credentials }) => {\n return promisedRequest({\n url: `${MASTODON_MEDIA_UPLOAD_URL}/${id}`,\n method: 'PUT',\n headers: authHeaders(credentials),\n payload: {\n description\n }\n }).then((data) => parseAttachment(data))\n}\n\nconst importBlocks = ({ file, credentials }) => {\n const formData = new FormData()\n formData.append('list', file)\n return fetch(BLOCKS_IMPORT_URL, {\n body: formData,\n method: 'POST',\n headers: authHeaders(credentials)\n })\n .then((response) => response.ok)\n}\n\nconst importFollows = ({ file, credentials }) => {\n const formData = new FormData()\n formData.append('list', file)\n return fetch(FOLLOW_IMPORT_URL, {\n body: formData,\n method: 'POST',\n headers: authHeaders(credentials)\n })\n .then((response) => response.ok)\n}\n\nconst deleteAccount = ({ credentials, password }) => {\n const form = new FormData()\n\n form.append('password', password)\n\n return fetch(DELETE_ACCOUNT_URL, {\n body: form,\n method: 'POST',\n headers: authHeaders(credentials)\n })\n .then((response) => response.json())\n}\n\nconst changeEmail = ({ credentials, email, password }) => {\n const form = new FormData()\n\n form.append('email', email)\n form.append('password', password)\n\n return fetch(CHANGE_EMAIL_URL, {\n body: form,\n method: 'POST',\n headers: authHeaders(credentials)\n })\n .then((response) => response.json())\n}\n\nconst changePassword = ({ credentials, password, newPassword, newPasswordConfirmation }) => {\n const form = new FormData()\n\n form.append('password', password)\n form.append('new_password', newPassword)\n form.append('new_password_confirmation', newPasswordConfirmation)\n\n return fetch(CHANGE_PASSWORD_URL, {\n body: form,\n method: 'POST',\n headers: authHeaders(credentials)\n })\n .then((response) => response.json())\n}\n\nconst settingsMFA = ({ credentials }) => {\n return fetch(MFA_SETTINGS_URL, {\n headers: authHeaders(credentials),\n method: 'GET'\n }).then((data) => data.json())\n}\n\nconst mfaDisableOTP = ({ credentials, password }) => {\n const form = new FormData()\n\n form.append('password', password)\n\n return fetch(MFA_DISABLE_OTP_URL, {\n body: form,\n method: 'DELETE',\n headers: authHeaders(credentials)\n })\n .then((response) => response.json())\n}\n\nconst mfaConfirmOTP = ({ credentials, password, token }) => {\n const form = new FormData()\n\n form.append('password', password)\n form.append('code', token)\n\n return fetch(MFA_CONFIRM_OTP_URL, {\n body: form,\n headers: authHeaders(credentials),\n method: 'POST'\n }).then((data) => data.json())\n}\nconst mfaSetupOTP = ({ credentials }) => {\n return fetch(MFA_SETUP_OTP_URL, {\n headers: authHeaders(credentials),\n method: 'GET'\n }).then((data) => data.json())\n}\nconst generateMfaBackupCodes = ({ credentials }) => {\n return fetch(MFA_BACKUP_CODES_URL, {\n headers: authHeaders(credentials),\n method: 'GET'\n }).then((data) => data.json())\n}\n\nconst fetchMutes = ({ credentials }) => {\n return promisedRequest({ url: MASTODON_USER_MUTES_URL, credentials })\n .then((users) => users.map(parseUser))\n}\n\nconst muteUser = ({ id, credentials }) => {\n return promisedRequest({ url: MASTODON_MUTE_USER_URL(id), credentials, method: 'POST' })\n}\n\nconst unmuteUser = ({ id, credentials }) => {\n return promisedRequest({ url: MASTODON_UNMUTE_USER_URL(id), credentials, method: 'POST' })\n}\n\nconst subscribeUser = ({ id, credentials }) => {\n return promisedRequest({ url: MASTODON_SUBSCRIBE_USER(id), credentials, method: 'POST' })\n}\n\nconst unsubscribeUser = ({ id, credentials }) => {\n return promisedRequest({ url: MASTODON_UNSUBSCRIBE_USER(id), credentials, method: 'POST' })\n}\n\nconst fetchBlocks = ({ credentials }) => {\n return promisedRequest({ url: MASTODON_USER_BLOCKS_URL, credentials })\n .then((users) => users.map(parseUser))\n}\n\nconst fetchOAuthTokens = ({ credentials }) => {\n const url = '/api/oauth_tokens.json'\n\n return fetch(url, {\n headers: authHeaders(credentials)\n }).then((data) => {\n if (data.ok) {\n return data.json()\n }\n throw new Error('Error fetching auth tokens', data)\n })\n}\n\nconst revokeOAuthToken = ({ id, credentials }) => {\n const url = `/api/oauth_tokens/${id}`\n\n return fetch(url, {\n headers: authHeaders(credentials),\n method: 'DELETE'\n })\n}\n\nconst suggestions = ({ credentials }) => {\n return fetch(SUGGESTIONS_URL, {\n headers: authHeaders(credentials)\n }).then((data) => data.json())\n}\n\nconst markNotificationsAsSeen = ({ id, credentials, single = false }) => {\n const body = new FormData()\n\n if (single) {\n body.append('id', id)\n } else {\n body.append('max_id', id)\n }\n\n return fetch(NOTIFICATION_READ_URL, {\n body,\n headers: authHeaders(credentials),\n method: 'POST'\n }).then((data) => data.json())\n}\n\nconst vote = ({ pollId, choices, credentials }) => {\n const form = new FormData()\n form.append('choices', choices)\n\n return promisedRequest({\n url: MASTODON_VOTE_URL(encodeURIComponent(pollId)),\n method: 'POST',\n credentials,\n payload: {\n choices: choices\n }\n })\n}\n\nconst fetchPoll = ({ pollId, credentials }) => {\n return promisedRequest(\n {\n url: MASTODON_POLL_URL(encodeURIComponent(pollId)),\n method: 'GET',\n credentials\n }\n )\n}\n\nconst fetchFavoritedByUsers = ({ id, credentials }) => {\n return promisedRequest({\n url: MASTODON_STATUS_FAVORITEDBY_URL(id),\n method: 'GET',\n credentials\n }).then((users) => users.map(parseUser))\n}\n\nconst fetchRebloggedByUsers = ({ id, credentials }) => {\n return promisedRequest({\n url: MASTODON_STATUS_REBLOGGEDBY_URL(id),\n method: 'GET',\n credentials\n }).then((users) => users.map(parseUser))\n}\n\nconst fetchEmojiReactions = ({ id, credentials }) => {\n return promisedRequest({ url: PLEROMA_EMOJI_REACTIONS_URL(id), credentials })\n .then((reactions) => reactions.map(r => {\n r.accounts = r.accounts.map(parseUser)\n return r\n }))\n}\n\nconst reactWithEmoji = ({ id, emoji, credentials }) => {\n return promisedRequest({\n url: PLEROMA_EMOJI_REACT_URL(id, emoji),\n method: 'PUT',\n credentials\n }).then(parseStatus)\n}\n\nconst unreactWithEmoji = ({ id, emoji, credentials }) => {\n return promisedRequest({\n url: PLEROMA_EMOJI_UNREACT_URL(id, emoji),\n method: 'DELETE',\n credentials\n }).then(parseStatus)\n}\n\nconst reportUser = ({ credentials, userId, statusIds, comment, forward }) => {\n return promisedRequest({\n url: MASTODON_REPORT_USER_URL,\n method: 'POST',\n payload: {\n 'account_id': userId,\n 'status_ids': statusIds,\n comment,\n forward\n },\n credentials\n })\n}\n\nconst searchUsers = ({ credentials, query }) => {\n return promisedRequest({\n url: MASTODON_USER_SEARCH_URL,\n params: {\n q: query,\n resolve: true\n },\n credentials\n })\n .then((data) => data.map(parseUser))\n}\n\nconst search2 = ({ credentials, q, resolve, limit, offset, following }) => {\n let url = MASTODON_SEARCH_2\n let params = []\n\n if (q) {\n params.push(['q', encodeURIComponent(q)])\n }\n\n if (resolve) {\n params.push(['resolve', resolve])\n }\n\n if (limit) {\n params.push(['limit', limit])\n }\n\n if (offset) {\n params.push(['offset', offset])\n }\n\n if (following) {\n params.push(['following', true])\n }\n\n params.push(['with_relationships', true])\n\n let queryString = map(params, (param) => `${param[0]}=${param[1]}`).join('&')\n url += `?${queryString}`\n\n return fetch(url, { headers: authHeaders(credentials) })\n .then((data) => {\n if (data.ok) {\n return data\n }\n throw new Error('Error fetching search result', data)\n })\n .then((data) => { return data.json() })\n .then((data) => {\n data.accounts = data.accounts.slice(0, limit).map(u => parseUser(u))\n data.statuses = data.statuses.slice(0, limit).map(s => parseStatus(s))\n return data\n })\n}\n\nconst fetchKnownDomains = ({ credentials }) => {\n return promisedRequest({ url: MASTODON_KNOWN_DOMAIN_LIST_URL, credentials })\n}\n\nconst fetchDomainMutes = ({ credentials }) => {\n return promisedRequest({ url: MASTODON_DOMAIN_BLOCKS_URL, credentials })\n}\n\nconst muteDomain = ({ domain, credentials }) => {\n return promisedRequest({\n url: MASTODON_DOMAIN_BLOCKS_URL,\n method: 'POST',\n payload: { domain },\n credentials\n })\n}\n\nconst unmuteDomain = ({ domain, credentials }) => {\n return promisedRequest({\n url: MASTODON_DOMAIN_BLOCKS_URL,\n method: 'DELETE',\n payload: { domain },\n credentials\n })\n}\n\nconst dismissNotification = ({ credentials, id }) => {\n return promisedRequest({\n url: MASTODON_DISMISS_NOTIFICATION_URL(id),\n method: 'POST',\n payload: { id },\n credentials\n })\n}\n\nexport const getMastodonSocketURI = ({ credentials, stream, args = {} }) => {\n return Object.entries({\n ...(credentials\n ? { access_token: credentials }\n : {}\n ),\n stream,\n ...args\n }).reduce((acc, [key, val]) => {\n return acc + `${key}=${val}&`\n }, MASTODON_STREAMING + '?')\n}\n\nconst MASTODON_STREAMING_EVENTS = new Set([\n 'update',\n 'notification',\n 'delete',\n 'filters_changed'\n])\n\nconst PLEROMA_STREAMING_EVENTS = new Set([\n 'pleroma:chat_update'\n])\n\n// A thin wrapper around WebSocket API that allows adding a pre-processor to it\n// Uses EventTarget and a CustomEvent to proxy events\nexport const ProcessedWS = ({\n url,\n preprocessor = handleMastoWS,\n id = 'Unknown'\n}) => {\n const eventTarget = new EventTarget()\n const socket = new WebSocket(url)\n if (!socket) throw new Error(`Failed to create socket ${id}`)\n const proxy = (original, eventName, processor = a => a) => {\n original.addEventListener(eventName, (eventData) => {\n eventTarget.dispatchEvent(new CustomEvent(\n eventName,\n { detail: processor(eventData) }\n ))\n })\n }\n socket.addEventListener('open', (wsEvent) => {\n console.debug(`[WS][${id}] Socket connected`, wsEvent)\n })\n socket.addEventListener('error', (wsEvent) => {\n console.debug(`[WS][${id}] Socket errored`, wsEvent)\n })\n socket.addEventListener('close', (wsEvent) => {\n console.debug(\n `[WS][${id}] Socket disconnected with code ${wsEvent.code}`,\n wsEvent\n )\n })\n // Commented code reason: very spammy, uncomment to enable message debug logging\n /*\n socket.addEventListener('message', (wsEvent) => {\n console.debug(\n `[WS][${id}] Message received`,\n wsEvent\n )\n })\n /**/\n\n proxy(socket, 'open')\n proxy(socket, 'close')\n proxy(socket, 'message', preprocessor)\n proxy(socket, 'error')\n\n // 1000 = Normal Closure\n eventTarget.close = () => { socket.close(1000, 'Shutting down socket') }\n\n return eventTarget\n}\n\nexport const handleMastoWS = (wsEvent) => {\n const { data } = wsEvent\n if (!data) return\n const parsedEvent = JSON.parse(data)\n const { event, payload } = parsedEvent\n if (MASTODON_STREAMING_EVENTS.has(event) || PLEROMA_STREAMING_EVENTS.has(event)) {\n // MastoBE and PleromaBE both send payload for delete as a PLAIN string\n if (event === 'delete') {\n return { event, id: payload }\n }\n const data = payload ? JSON.parse(payload) : null\n if (event === 'update') {\n return { event, status: parseStatus(data) }\n } else if (event === 'notification') {\n return { event, notification: parseNotification(data) }\n } else if (event === 'pleroma:chat_update') {\n return { event, chatUpdate: parseChat(data) }\n }\n } else {\n console.warn('Unknown event', wsEvent)\n return null\n }\n}\n\nexport const WSConnectionStatus = Object.freeze({\n 'JOINED': 1,\n 'CLOSED': 2,\n 'ERROR': 3\n})\n\nconst chats = ({ credentials }) => {\n return fetch(PLEROMA_CHATS_URL, { headers: authHeaders(credentials) })\n .then((data) => data.json())\n .then((data) => {\n return { chats: data.map(parseChat).filter(c => c) }\n })\n}\n\nconst getOrCreateChat = ({ accountId, credentials }) => {\n return promisedRequest({\n url: PLEROMA_CHAT_URL(accountId),\n method: 'POST',\n credentials\n })\n}\n\nconst chatMessages = ({ id, credentials, maxId, sinceId, limit = 20 }) => {\n let url = PLEROMA_CHAT_MESSAGES_URL(id)\n const args = [\n maxId && `max_id=${maxId}`,\n sinceId && `since_id=${sinceId}`,\n limit && `limit=${limit}`\n ].filter(_ => _).join('&')\n\n url = url + (args ? '?' + args : '')\n\n return promisedRequest({\n url,\n method: 'GET',\n credentials\n })\n}\n\nconst sendChatMessage = ({ id, content, mediaId = null, credentials }) => {\n const payload = {\n 'content': content\n }\n\n if (mediaId) {\n payload['media_id'] = mediaId\n }\n\n return promisedRequest({\n url: PLEROMA_CHAT_MESSAGES_URL(id),\n method: 'POST',\n payload: payload,\n credentials\n })\n}\n\nconst readChat = ({ id, lastReadId, credentials }) => {\n return promisedRequest({\n url: PLEROMA_CHAT_READ_URL(id),\n method: 'POST',\n payload: {\n 'last_read_id': lastReadId\n },\n credentials\n })\n}\n\nconst deleteChatMessage = ({ chatId, messageId, credentials }) => {\n return promisedRequest({\n url: PLEROMA_DELETE_CHAT_MESSAGE_URL(chatId, messageId),\n method: 'DELETE',\n credentials\n })\n}\n\nconst apiService = {\n verifyCredentials,\n fetchTimeline,\n fetchPinnedStatuses,\n fetchConversation,\n fetchStatus,\n fetchFriends,\n exportFriends,\n fetchFollowers,\n followUser,\n unfollowUser,\n pinOwnStatus,\n unpinOwnStatus,\n muteConversation,\n unmuteConversation,\n blockUser,\n unblockUser,\n fetchUser,\n fetchUserRelationship,\n favorite,\n unfavorite,\n retweet,\n unretweet,\n bookmarkStatus,\n unbookmarkStatus,\n postStatus,\n deleteStatus,\n uploadMedia,\n setMediaDescription,\n fetchMutes,\n muteUser,\n unmuteUser,\n subscribeUser,\n unsubscribeUser,\n fetchBlocks,\n fetchOAuthTokens,\n revokeOAuthToken,\n tagUser,\n untagUser,\n deleteUser,\n addRight,\n deleteRight,\n activateUser,\n deactivateUser,\n register,\n getCaptcha,\n updateProfileImages,\n updateProfile,\n importBlocks,\n importFollows,\n deleteAccount,\n changeEmail,\n changePassword,\n settingsMFA,\n mfaDisableOTP,\n generateMfaBackupCodes,\n mfaSetupOTP,\n mfaConfirmOTP,\n fetchFollowRequests,\n approveUser,\n denyUser,\n suggestions,\n markNotificationsAsSeen,\n dismissNotification,\n vote,\n fetchPoll,\n fetchFavoritedByUsers,\n fetchRebloggedByUsers,\n fetchEmojiReactions,\n reactWithEmoji,\n unreactWithEmoji,\n reportUser,\n updateNotificationSettings,\n search2,\n searchUsers,\n fetchKnownDomains,\n fetchDomainMutes,\n muteDomain,\n unmuteDomain,\n chats,\n getOrCreateChat,\n chatMessages,\n sendChatMessage,\n readChat,\n deleteChatMessage\n}\n\nexport default apiService\n","import { includes } from 'lodash'\n\nconst generateProfileLink = (id, screenName, restrictedNicknames) => {\n const complicated = !screenName || (isExternal(screenName) || includes(restrictedNicknames, screenName))\n return {\n name: (complicated ? 'external-user-profile' : 'user-profile'),\n params: (complicated ? { id } : { name: screenName })\n }\n}\n\nconst isExternal = screenName => screenName && screenName.includes('@')\n\nexport default generateProfileLink\n","import StillImage from '../still-image/still-image.vue'\n\nconst UserAvatar = {\n props: [\n 'user',\n 'betterShadow',\n 'compact'\n ],\n data () {\n return {\n showPlaceholder: false,\n defaultAvatar: `${this.$store.state.instance.server + this.$store.state.instance.defaultAvatar}`\n }\n },\n components: {\n StillImage\n },\n methods: {\n imgSrc (src) {\n return (!src || this.showPlaceholder) ? this.defaultAvatar : src\n },\n imageLoadError () {\n this.showPlaceholder = true\n }\n }\n}\n\nexport default UserAvatar\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./user_avatar.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./user_avatar.js\"\nimport __vue_script__ from \"!!babel-loader!./user_avatar.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-619ad024\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./user_avatar.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('StillImage',{staticClass:\"Avatar\",class:{ 'avatar-compact': _vm.compact, 'better-shadow': _vm.betterShadow },attrs:{\"alt\":_vm.user.screen_name,\"title\":_vm.user.screen_name,\"src\":_vm.imgSrc(_vm.user.profile_image_url_original),\"image-load-error\":_vm.imageLoadError}})}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import { filter, sortBy, includes } from 'lodash'\nimport { muteWordHits } from '../status_parser/status_parser.js'\nimport { showDesktopNotification } from '../desktop_notification_utils/desktop_notification_utils.js'\n\nexport const notificationsFromStore = store => store.state.statuses.notifications.data\n\nexport const visibleTypes = store => {\n const rootState = store.rootState || store.state\n\n return ([\n rootState.config.notificationVisibility.likes && 'like',\n rootState.config.notificationVisibility.mentions && 'mention',\n rootState.config.notificationVisibility.repeats && 'repeat',\n rootState.config.notificationVisibility.follows && 'follow',\n rootState.config.notificationVisibility.followRequest && 'follow_request',\n rootState.config.notificationVisibility.moves && 'move',\n rootState.config.notificationVisibility.emojiReactions && 'pleroma:emoji_reaction'\n ].filter(_ => _))\n}\n\nconst statusNotifications = ['like', 'mention', 'repeat', 'pleroma:emoji_reaction']\n\nexport const isStatusNotification = (type) => includes(statusNotifications, type)\n\nconst sortById = (a, b) => {\n const seqA = Number(a.id)\n const seqB = Number(b.id)\n const isSeqA = !Number.isNaN(seqA)\n const isSeqB = !Number.isNaN(seqB)\n if (isSeqA && isSeqB) {\n return seqA > seqB ? -1 : 1\n } else if (isSeqA && !isSeqB) {\n return 1\n } else if (!isSeqA && isSeqB) {\n return -1\n } else {\n return a.id > b.id ? -1 : 1\n }\n}\n\nconst isMutedNotification = (store, notification) => {\n if (!notification.status) return\n return notification.status.muted || muteWordHits(notification.status, store.rootGetters.mergedConfig.muteWords).length > 0\n}\n\nexport const maybeShowNotification = (store, notification) => {\n const rootState = store.rootState || store.state\n\n if (notification.seen) return\n if (!visibleTypes(store).includes(notification.type)) return\n if (notification.type === 'mention' && isMutedNotification(store, notification)) return\n\n const notificationObject = prepareNotificationObject(notification, store.rootGetters.i18n)\n showDesktopNotification(rootState, notificationObject)\n}\n\nexport const filteredNotificationsFromStore = (store, types) => {\n // map is just to clone the array since sort mutates it and it causes some issues\n let sortedNotifications = notificationsFromStore(store).map(_ => _).sort(sortById)\n sortedNotifications = sortBy(sortedNotifications, 'seen')\n return sortedNotifications.filter(\n (notification) => (types || visibleTypes(store)).includes(notification.type)\n )\n}\n\nexport const unseenNotificationsFromStore = store =>\n filter(filteredNotificationsFromStore(store), ({ seen }) => !seen)\n\nexport const prepareNotificationObject = (notification, i18n) => {\n const notifObj = {\n tag: notification.id\n }\n const status = notification.status\n const title = notification.from_profile.name\n notifObj.title = title\n notifObj.icon = notification.from_profile.profile_image_url\n let i18nString\n switch (notification.type) {\n case 'like':\n i18nString = 'favorited_you'\n break\n case 'repeat':\n i18nString = 'repeated_you'\n break\n case 'follow':\n i18nString = 'followed_you'\n break\n case 'move':\n i18nString = 'migrated_to'\n break\n case 'follow_request':\n i18nString = 'follow_request'\n break\n }\n\n if (notification.type === 'pleroma:emoji_reaction') {\n notifObj.body = i18n.t('notifications.reacted_with', [notification.emoji])\n } else if (i18nString) {\n notifObj.body = i18n.t('notifications.' + i18nString)\n } else if (isStatusNotification(notification.type)) {\n notifObj.body = notification.status.text\n }\n\n // Shows first attached non-nsfw image, if any. Should add configuration for this somehow...\n if (status && status.attachments && status.attachments.length > 0 && !status.nsfw &&\n status.attachments[0].mimetype.startsWith('image/')) {\n notifObj.image = status.attachments[0].url\n }\n\n return notifObj\n}\n","// TODO this func might as well take the entire file and use its mimetype\n// or the entire service could be just mimetype service that only operates\n// on mimetypes and not files. Currently the naming is confusing.\nconst fileType = mimetype => {\n if (mimetype.match(/text\\/html/)) {\n return 'html'\n }\n\n if (mimetype.match(/image/)) {\n return 'image'\n }\n\n if (mimetype.match(/video/)) {\n return 'video'\n }\n\n if (mimetype.match(/audio/)) {\n return 'audio'\n }\n\n return 'unknown'\n}\n\nconst fileMatchesSomeType = (types, file) =>\n types.some(type => fileType(file.mimetype) === type)\n\nconst fileTypeService = {\n fileType,\n fileMatchesSomeType\n}\n\nexport default fileTypeService\n","const Popover = {\n name: 'Popover',\n props: {\n // Action to trigger popover: either 'hover' or 'click'\n trigger: String,\n // Either 'top' or 'bottom'\n placement: String,\n // Takes object with properties 'x' and 'y', values of these can be\n // 'container' for using offsetParent as boundaries for either axis\n // or 'viewport'\n boundTo: Object,\n // Takes a selector to use as a replacement for the parent container\n // for getting boundaries for x an y axis\n boundToSelector: String,\n // Takes a top/bottom/left/right object, how much space to leave\n // between boundary and popover element\n margin: Object,\n // Takes a x/y object and tells how many pixels to offset from\n // anchor point on either axis\n offset: Object,\n // Replaces the classes you may want for the popover container.\n // Use 'popover-default' in addition to get the default popover\n // styles with your custom class.\n popoverClass: String\n },\n data () {\n return {\n hidden: true,\n styles: { opacity: 0 },\n oldSize: { width: 0, height: 0 }\n }\n },\n methods: {\n containerBoundingClientRect () {\n const container = this.boundToSelector ? this.$el.closest(this.boundToSelector) : this.$el.offsetParent\n return container.getBoundingClientRect()\n },\n updateStyles () {\n if (this.hidden) {\n this.styles = {\n opacity: 0\n }\n return\n }\n\n // Popover will be anchored around this element, trigger ref is the container, so\n // its children are what are inside the slot. Expect only one slot=\"trigger\".\n const anchorEl = (this.$refs.trigger && this.$refs.trigger.children[0]) || this.$el\n const screenBox = anchorEl.getBoundingClientRect()\n // Screen position of the origin point for popover\n const origin = { x: screenBox.left + screenBox.width * 0.5, y: screenBox.top }\n const content = this.$refs.content\n // Minor optimization, don't call a slow reflow call if we don't have to\n const parentBounds = this.boundTo &&\n (this.boundTo.x === 'container' || this.boundTo.y === 'container') &&\n this.containerBoundingClientRect()\n\n const margin = this.margin || {}\n\n // What are the screen bounds for the popover? Viewport vs container\n // when using viewport, using default margin values to dodge the navbar\n const xBounds = this.boundTo && this.boundTo.x === 'container' ? {\n min: parentBounds.left + (margin.left || 0),\n max: parentBounds.right - (margin.right || 0)\n } : {\n min: 0 + (margin.left || 10),\n max: window.innerWidth - (margin.right || 10)\n }\n\n const yBounds = this.boundTo && this.boundTo.y === 'container' ? {\n min: parentBounds.top + (margin.top || 0),\n max: parentBounds.bottom - (margin.bottom || 0)\n } : {\n min: 0 + (margin.top || 50),\n max: window.innerHeight - (margin.bottom || 5)\n }\n\n let horizOffset = 0\n\n // If overflowing from left, move it so that it doesn't\n if ((origin.x - content.offsetWidth * 0.5) < xBounds.min) {\n horizOffset += -(origin.x - content.offsetWidth * 0.5) + xBounds.min\n }\n\n // If overflowing from right, move it so that it doesn't\n if ((origin.x + horizOffset + content.offsetWidth * 0.5) > xBounds.max) {\n horizOffset -= (origin.x + horizOffset + content.offsetWidth * 0.5) - xBounds.max\n }\n\n // Default to whatever user wished with placement prop\n let usingTop = this.placement !== 'bottom'\n\n // Handle special cases, first force to displaying on top if there's not space on bottom,\n // regardless of what placement value was. Then check if there's not space on top, and\n // force to bottom, again regardless of what placement value was.\n if (origin.y + content.offsetHeight > yBounds.max) usingTop = true\n if (origin.y - content.offsetHeight < yBounds.min) usingTop = false\n\n const yOffset = (this.offset && this.offset.y) || 0\n const translateY = usingTop\n ? -anchorEl.offsetHeight - yOffset - content.offsetHeight\n : yOffset\n\n const xOffset = (this.offset && this.offset.x) || 0\n const translateX = (anchorEl.offsetWidth * 0.5) - content.offsetWidth * 0.5 + horizOffset + xOffset\n\n // Note, separate translateX and translateY avoids blurry text on chromium,\n // single translate or translate3d resulted in blurry text.\n this.styles = {\n opacity: 1,\n transform: `translateX(${Math.round(translateX)}px) translateY(${Math.round(translateY)}px)`\n }\n },\n showPopover () {\n if (this.hidden) this.$emit('show')\n this.hidden = false\n this.$nextTick(this.updateStyles)\n },\n hidePopover () {\n if (!this.hidden) this.$emit('close')\n this.hidden = true\n this.styles = { opacity: 0 }\n },\n onMouseenter (e) {\n if (this.trigger === 'hover') this.showPopover()\n },\n onMouseleave (e) {\n if (this.trigger === 'hover') this.hidePopover()\n },\n onClick (e) {\n if (this.trigger === 'click') {\n if (this.hidden) {\n this.showPopover()\n } else {\n this.hidePopover()\n }\n }\n },\n onClickOutside (e) {\n if (this.hidden) return\n if (this.$el.contains(e.target)) return\n this.hidePopover()\n }\n },\n updated () {\n // Monitor changes to content size, update styles only when content sizes have changed,\n // that should be the only time we need to move the popover box if we don't care about scroll\n // or resize\n const content = this.$refs.content\n if (!content) return\n if (this.oldSize.width !== content.offsetWidth || this.oldSize.height !== content.offsetHeight) {\n this.updateStyles()\n this.oldSize = { width: content.offsetWidth, height: content.offsetHeight }\n }\n },\n created () {\n document.addEventListener('click', this.onClickOutside)\n },\n destroyed () {\n document.removeEventListener('click', this.onClickOutside)\n this.hidePopover()\n }\n}\n\nexport default Popover\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./popover.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./popover.js\"\nimport __vue_script__ from \"!!babel-loader!./popover.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-fbc07fb6\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./popover.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{on:{\"mouseenter\":_vm.onMouseenter,\"mouseleave\":_vm.onMouseleave}},[_c('div',{ref:\"trigger\",on:{\"click\":_vm.onClick}},[_vm._t(\"trigger\")],2),_vm._v(\" \"),(!_vm.hidden)?_c('div',{ref:\"content\",staticClass:\"popover\",class:_vm.popoverClass || 'popover-default',style:(_vm.styles)},[_vm._t(\"content\",null,{\"close\":_vm.hidePopover})],2):_vm._e()])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","const DialogModal = {\n props: {\n darkOverlay: {\n default: true,\n type: Boolean\n },\n onCancel: {\n default: () => {},\n type: Function\n }\n }\n}\n\nexport default DialogModal\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./dialog_modal.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./dialog_modal.js\"\nimport __vue_script__ from \"!!babel-loader!./dialog_modal.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-70b9d662\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./dialog_modal.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{class:{ 'dark-overlay': _vm.darkOverlay },on:{\"click\":function($event){if($event.target !== $event.currentTarget){ return null; }$event.stopPropagation();return _vm.onCancel()}}},[_c('div',{staticClass:\"dialog-modal panel panel-default\",on:{\"click\":function($event){$event.stopPropagation();}}},[_c('div',{staticClass:\"panel-heading dialog-modal-heading\"},[_c('div',{staticClass:\"title\"},[_vm._t(\"header\")],2)]),_vm._v(\" \"),_c('div',{staticClass:\"dialog-modal-content\"},[_vm._t(\"default\")],2),_vm._v(\" \"),_c('div',{staticClass:\"dialog-modal-footer user-interactions panel-footer\"},[_vm._t(\"footer\")],2)])])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import DialogModal from '../dialog_modal/dialog_modal.vue'\nimport Popover from '../popover/popover.vue'\n\nconst FORCE_NSFW = 'mrf_tag:media-force-nsfw'\nconst STRIP_MEDIA = 'mrf_tag:media-strip'\nconst FORCE_UNLISTED = 'mrf_tag:force-unlisted'\nconst DISABLE_REMOTE_SUBSCRIPTION = 'mrf_tag:disable-remote-subscription'\nconst DISABLE_ANY_SUBSCRIPTION = 'mrf_tag:disable-any-subscription'\nconst SANDBOX = 'mrf_tag:sandbox'\nconst QUARANTINE = 'mrf_tag:quarantine'\n\nconst ModerationTools = {\n props: [\n 'user'\n ],\n data () {\n return {\n tags: {\n FORCE_NSFW,\n STRIP_MEDIA,\n FORCE_UNLISTED,\n DISABLE_REMOTE_SUBSCRIPTION,\n DISABLE_ANY_SUBSCRIPTION,\n SANDBOX,\n QUARANTINE\n },\n showDeleteUserDialog: false,\n toggled: false\n }\n },\n components: {\n DialogModal,\n Popover\n },\n computed: {\n tagsSet () {\n return new Set(this.user.tags)\n },\n hasTagPolicy () {\n return this.$store.state.instance.tagPolicyAvailable\n }\n },\n methods: {\n hasTag (tagName) {\n return this.tagsSet.has(tagName)\n },\n toggleTag (tag) {\n const store = this.$store\n if (this.tagsSet.has(tag)) {\n store.state.api.backendInteractor.untagUser({ user: this.user, tag }).then(response => {\n if (!response.ok) { return }\n store.commit('untagUser', { user: this.user, tag })\n })\n } else {\n store.state.api.backendInteractor.tagUser({ user: this.user, tag }).then(response => {\n if (!response.ok) { return }\n store.commit('tagUser', { user: this.user, tag })\n })\n }\n },\n toggleRight (right) {\n const store = this.$store\n if (this.user.rights[right]) {\n store.state.api.backendInteractor.deleteRight({ user: this.user, right }).then(response => {\n if (!response.ok) { return }\n store.commit('updateRight', { user: this.user, right, value: false })\n })\n } else {\n store.state.api.backendInteractor.addRight({ user: this.user, right }).then(response => {\n if (!response.ok) { return }\n store.commit('updateRight', { user: this.user, right, value: true })\n })\n }\n },\n toggleActivationStatus () {\n this.$store.dispatch('toggleActivationStatus', { user: this.user })\n },\n deleteUserDialog (show) {\n this.showDeleteUserDialog = show\n },\n deleteUser () {\n const store = this.$store\n const user = this.user\n const { id, name } = user\n store.state.api.backendInteractor.deleteUser({ user })\n .then(e => {\n this.$store.dispatch('markStatusesAsDeleted', status => user.id === status.user.id)\n const isProfile = this.$route.name === 'external-user-profile' || this.$route.name === 'user-profile'\n const isTargetUser = this.$route.params.name === name || this.$route.params.id === id\n if (isProfile && isTargetUser) {\n window.history.back()\n }\n })\n },\n setToggled (value) {\n this.toggled = value\n }\n }\n}\n\nexport default ModerationTools\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./moderation_tools.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./moderation_tools.js\"\nimport __vue_script__ from \"!!babel-loader!./moderation_tools.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-168f1ca6\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./moderation_tools.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('Popover',{staticClass:\"moderation-tools-popover\",attrs:{\"trigger\":\"click\",\"placement\":\"bottom\",\"offset\":{ y: 5 }},on:{\"show\":function($event){return _vm.setToggled(true)},\"close\":function($event){return _vm.setToggled(false)}}},[_c('div',{attrs:{\"slot\":\"content\"},slot:\"content\"},[_c('div',{staticClass:\"dropdown-menu\"},[(_vm.user.is_local)?_c('span',[_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){return _vm.toggleRight(\"admin\")}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t(!!_vm.user.rights.admin ? 'user_card.admin_menu.revoke_admin' : 'user_card.admin_menu.grant_admin'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){return _vm.toggleRight(\"moderator\")}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t(!!_vm.user.rights.moderator ? 'user_card.admin_menu.revoke_moderator' : 'user_card.admin_menu.grant_moderator'))+\"\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"dropdown-divider\",attrs:{\"role\":\"separator\"}})]):_vm._e(),_vm._v(\" \"),_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){return _vm.toggleActivationStatus()}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t(!!_vm.user.deactivated ? 'user_card.admin_menu.activate_account' : 'user_card.admin_menu.deactivate_account'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){return _vm.deleteUserDialog(true)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.delete_account'))+\"\\n \")]),_vm._v(\" \"),(_vm.hasTagPolicy)?_c('div',{staticClass:\"dropdown-divider\",attrs:{\"role\":\"separator\"}}):_vm._e(),_vm._v(\" \"),(_vm.hasTagPolicy)?_c('span',[_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){return _vm.toggleTag(_vm.tags.FORCE_NSFW)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.force_nsfw'))+\"\\n \"),_c('span',{staticClass:\"menu-checkbox\",class:{ 'menu-checkbox-checked': _vm.hasTag(_vm.tags.FORCE_NSFW) }})]),_vm._v(\" \"),_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){return _vm.toggleTag(_vm.tags.STRIP_MEDIA)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.strip_media'))+\"\\n \"),_c('span',{staticClass:\"menu-checkbox\",class:{ 'menu-checkbox-checked': _vm.hasTag(_vm.tags.STRIP_MEDIA) }})]),_vm._v(\" \"),_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){return _vm.toggleTag(_vm.tags.FORCE_UNLISTED)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.force_unlisted'))+\"\\n \"),_c('span',{staticClass:\"menu-checkbox\",class:{ 'menu-checkbox-checked': _vm.hasTag(_vm.tags.FORCE_UNLISTED) }})]),_vm._v(\" \"),_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){return _vm.toggleTag(_vm.tags.SANDBOX)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.sandbox'))+\"\\n \"),_c('span',{staticClass:\"menu-checkbox\",class:{ 'menu-checkbox-checked': _vm.hasTag(_vm.tags.SANDBOX) }})]),_vm._v(\" \"),(_vm.user.is_local)?_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){return _vm.toggleTag(_vm.tags.DISABLE_REMOTE_SUBSCRIPTION)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.disable_remote_subscription'))+\"\\n \"),_c('span',{staticClass:\"menu-checkbox\",class:{ 'menu-checkbox-checked': _vm.hasTag(_vm.tags.DISABLE_REMOTE_SUBSCRIPTION) }})]):_vm._e(),_vm._v(\" \"),(_vm.user.is_local)?_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){return _vm.toggleTag(_vm.tags.DISABLE_ANY_SUBSCRIPTION)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.disable_any_subscription'))+\"\\n \"),_c('span',{staticClass:\"menu-checkbox\",class:{ 'menu-checkbox-checked': _vm.hasTag(_vm.tags.DISABLE_ANY_SUBSCRIPTION) }})]):_vm._e(),_vm._v(\" \"),(_vm.user.is_local)?_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){return _vm.toggleTag(_vm.tags.QUARANTINE)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.quarantine'))+\"\\n \"),_c('span',{staticClass:\"menu-checkbox\",class:{ 'menu-checkbox-checked': _vm.hasTag(_vm.tags.QUARANTINE) }})]):_vm._e()]):_vm._e()])]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-default btn-block\",class:{ toggled: _vm.toggled },attrs:{\"slot\":\"trigger\"},slot:\"trigger\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.moderation'))+\"\\n \")])]),_vm._v(\" \"),_c('portal',{attrs:{\"to\":\"modal\"}},[(_vm.showDeleteUserDialog)?_c('DialogModal',{attrs:{\"on-cancel\":_vm.deleteUserDialog.bind(this, false)}},[_c('template',{slot:\"header\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.delete_user'))+\"\\n \")]),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('user_card.admin_menu.delete_user_confirmation')))]),_vm._v(\" \"),_c('template',{slot:\"footer\"},[_c('button',{staticClass:\"btn btn-default\",on:{\"click\":function($event){return _vm.deleteUserDialog(false)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('general.cancel'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-default danger\",on:{\"click\":function($event){return _vm.deleteUser()}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.delete_user'))+\"\\n \")])])],2):_vm._e()],1)],1)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import { mapState } from 'vuex'\nimport ProgressButton from '../progress_button/progress_button.vue'\nimport Popover from '../popover/popover.vue'\n\nconst AccountActions = {\n props: [\n 'user', 'relationship'\n ],\n data () {\n return { }\n },\n components: {\n ProgressButton,\n Popover\n },\n methods: {\n showRepeats () {\n this.$store.dispatch('showReblogs', this.user.id)\n },\n hideRepeats () {\n this.$store.dispatch('hideReblogs', this.user.id)\n },\n blockUser () {\n this.$store.dispatch('blockUser', this.user.id)\n },\n unblockUser () {\n this.$store.dispatch('unblockUser', this.user.id)\n },\n reportUser () {\n this.$store.dispatch('openUserReportingModal', this.user.id)\n },\n openChat () {\n this.$router.push({\n name: 'chat',\n params: { recipient_id: this.user.id }\n })\n }\n },\n computed: {\n ...mapState({\n pleromaChatMessagesAvailable: state => state.instance.pleromaChatMessagesAvailable\n })\n }\n}\n\nexport default AccountActions\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./account_actions.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./account_actions.js\"\nimport __vue_script__ from \"!!babel-loader!./account_actions.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-1883f214\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./account_actions.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"account-actions\"},[_c('Popover',{attrs:{\"trigger\":\"click\",\"placement\":\"bottom\",\"bound-to\":{ x: 'container' }}},[_c('div',{staticClass:\"account-tools-popover\",attrs:{\"slot\":\"content\"},slot:\"content\"},[_c('div',{staticClass:\"dropdown-menu\"},[(_vm.relationship.following)?[(_vm.relationship.showing_reblogs)?_c('button',{staticClass:\"btn btn-default dropdown-item\",on:{\"click\":_vm.hideRepeats}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.hide_repeats'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(!_vm.relationship.showing_reblogs)?_c('button',{staticClass:\"btn btn-default dropdown-item\",on:{\"click\":_vm.showRepeats}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.show_repeats'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"dropdown-divider\",attrs:{\"role\":\"separator\"}})]:_vm._e(),_vm._v(\" \"),(_vm.relationship.blocking)?_c('button',{staticClass:\"btn btn-default btn-block dropdown-item\",on:{\"click\":_vm.unblockUser}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.unblock'))+\"\\n \")]):_c('button',{staticClass:\"btn btn-default btn-block dropdown-item\",on:{\"click\":_vm.blockUser}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.block'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-default btn-block dropdown-item\",on:{\"click\":_vm.reportUser}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.report'))+\"\\n \")]),_vm._v(\" \"),(_vm.pleromaChatMessagesAvailable)?_c('button',{staticClass:\"btn btn-default btn-block dropdown-item\",on:{\"click\":_vm.openChat}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.message'))+\"\\n \")]):_vm._e()],2)]),_vm._v(\" \"),_c('div',{staticClass:\"btn btn-default ellipsis-button\",attrs:{\"slot\":\"trigger\"},slot:\"trigger\"},[_c('i',{staticClass:\"icon-ellipsis trigger-button\"})])])],1)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import UserAvatar from '../user_avatar/user_avatar.vue'\nimport RemoteFollow from '../remote_follow/remote_follow.vue'\nimport ProgressButton from '../progress_button/progress_button.vue'\nimport FollowButton from '../follow_button/follow_button.vue'\nimport ModerationTools from '../moderation_tools/moderation_tools.vue'\nimport AccountActions from '../account_actions/account_actions.vue'\nimport generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'\nimport { mapGetters } from 'vuex'\n\nexport default {\n props: [\n 'userId', 'switcher', 'selected', 'hideBio', 'rounded', 'bordered', 'allowZoomingAvatar'\n ],\n data () {\n return {\n followRequestInProgress: false,\n betterShadow: this.$store.state.interface.browserSupport.cssFilter\n }\n },\n created () {\n this.$store.dispatch('fetchUserRelationship', this.user.id)\n },\n computed: {\n user () {\n return this.$store.getters.findUser(this.userId)\n },\n relationship () {\n return this.$store.getters.relationship(this.userId)\n },\n classes () {\n return [{\n 'user-card-rounded-t': this.rounded === 'top', // set border-top-left-radius and border-top-right-radius\n 'user-card-rounded': this.rounded === true, // set border-radius for all sides\n 'user-card-bordered': this.bordered === true // set border for all sides\n }]\n },\n style () {\n return {\n backgroundImage: [\n `linear-gradient(to bottom, var(--profileTint), var(--profileTint))`,\n `url(${this.user.cover_photo})`\n ].join(', ')\n }\n },\n isOtherUser () {\n return this.user.id !== this.$store.state.users.currentUser.id\n },\n subscribeUrl () {\n // eslint-disable-next-line no-undef\n const serverUrl = new URL(this.user.statusnet_profile_url)\n return `${serverUrl.protocol}//${serverUrl.host}/main/ostatus`\n },\n loggedIn () {\n return this.$store.state.users.currentUser\n },\n dailyAvg () {\n const days = Math.ceil((new Date() - new Date(this.user.created_at)) / (60 * 60 * 24 * 1000))\n return Math.round(this.user.statuses_count / days)\n },\n userHighlightType: {\n get () {\n const data = this.$store.getters.mergedConfig.highlight[this.user.screen_name]\n return (data && data.type) || 'disabled'\n },\n set (type) {\n const data = this.$store.getters.mergedConfig.highlight[this.user.screen_name]\n if (type !== 'disabled') {\n this.$store.dispatch('setHighlight', { user: this.user.screen_name, color: (data && data.color) || '#FFFFFF', type })\n } else {\n this.$store.dispatch('setHighlight', { user: this.user.screen_name, color: undefined })\n }\n },\n ...mapGetters(['mergedConfig'])\n },\n userHighlightColor: {\n get () {\n const data = this.$store.getters.mergedConfig.highlight[this.user.screen_name]\n return data && data.color\n },\n set (color) {\n this.$store.dispatch('setHighlight', { user: this.user.screen_name, color })\n }\n },\n visibleRole () {\n const rights = this.user.rights\n if (!rights) { return }\n const validRole = rights.admin || rights.moderator\n const roleTitle = rights.admin ? 'admin' : 'moderator'\n return validRole && roleTitle\n },\n hideFollowsCount () {\n return this.isOtherUser && this.user.hide_follows_count\n },\n hideFollowersCount () {\n return this.isOtherUser && this.user.hide_followers_count\n },\n ...mapGetters(['mergedConfig'])\n },\n components: {\n UserAvatar,\n RemoteFollow,\n ModerationTools,\n AccountActions,\n ProgressButton,\n FollowButton\n },\n methods: {\n muteUser () {\n this.$store.dispatch('muteUser', this.user.id)\n },\n unmuteUser () {\n this.$store.dispatch('unmuteUser', this.user.id)\n },\n subscribeUser () {\n return this.$store.dispatch('subscribeUser', this.user.id)\n },\n unsubscribeUser () {\n return this.$store.dispatch('unsubscribeUser', this.user.id)\n },\n setProfileView (v) {\n if (this.switcher) {\n const store = this.$store\n store.commit('setProfileView', { v })\n }\n },\n linkClicked ({ target }) {\n if (target.tagName === 'SPAN') {\n target = target.parentNode\n }\n if (target.tagName === 'A') {\n window.open(target.href, '_blank')\n }\n },\n userProfileLink (user) {\n return generateProfileLink(\n user.id, user.screen_name,\n this.$store.state.instance.restrictedNicknames\n )\n },\n zoomAvatar () {\n const attachment = {\n url: this.user.profile_image_url_original,\n mimetype: 'image'\n }\n this.$store.dispatch('setMedia', [attachment])\n this.$store.dispatch('setCurrent', attachment)\n },\n mentionUser () {\n this.$store.dispatch('openPostStatusModal', { replyTo: true, repliedUser: this.user })\n }\n }\n}\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./user_card.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./user_card.js\"\nimport __vue_script__ from \"!!babel-loader!./user_card.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-5c57b7a6\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./user_card.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"user-card\",class:_vm.classes},[_c('div',{staticClass:\"background-image\",class:{ 'hide-bio': _vm.hideBio },style:(_vm.style)}),_vm._v(\" \"),_c('div',{staticClass:\"panel-heading\"},[_c('div',{staticClass:\"user-info\"},[_c('div',{staticClass:\"container\"},[(_vm.allowZoomingAvatar)?_c('a',{staticClass:\"user-info-avatar-link\",on:{\"click\":_vm.zoomAvatar}},[_c('UserAvatar',{attrs:{\"better-shadow\":_vm.betterShadow,\"user\":_vm.user}}),_vm._v(\" \"),_vm._m(0)],1):_c('router-link',{attrs:{\"to\":_vm.userProfileLink(_vm.user)}},[_c('UserAvatar',{attrs:{\"better-shadow\":_vm.betterShadow,\"user\":_vm.user}})],1),_vm._v(\" \"),_c('div',{staticClass:\"user-summary\"},[_c('div',{staticClass:\"top-line\"},[(_vm.user.name_html)?_c('div',{staticClass:\"user-name\",attrs:{\"title\":_vm.user.name},domProps:{\"innerHTML\":_vm._s(_vm.user.name_html)}}):_c('div',{staticClass:\"user-name\",attrs:{\"title\":_vm.user.name}},[_vm._v(\"\\n \"+_vm._s(_vm.user.name)+\"\\n \")]),_vm._v(\" \"),(_vm.isOtherUser && !_vm.user.is_local)?_c('a',{attrs:{\"href\":_vm.user.statusnet_profile_url,\"target\":\"_blank\"}},[_c('i',{staticClass:\"icon-link-ext usersettings\"})]):_vm._e(),_vm._v(\" \"),(_vm.isOtherUser && _vm.loggedIn)?_c('AccountActions',{attrs:{\"user\":_vm.user,\"relationship\":_vm.relationship}}):_vm._e()],1),_vm._v(\" \"),_c('div',{staticClass:\"bottom-line\"},[_c('router-link',{staticClass:\"user-screen-name\",attrs:{\"title\":_vm.user.screen_name,\"to\":_vm.userProfileLink(_vm.user)}},[_vm._v(\"\\n @\"+_vm._s(_vm.user.screen_name)+\"\\n \")]),_vm._v(\" \"),(!_vm.hideBio)?[(!!_vm.visibleRole)?_c('span',{staticClass:\"alert user-role\"},[_vm._v(\"\\n \"+_vm._s(_vm.visibleRole)+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.user.bot)?_c('span',{staticClass:\"alert user-role\"},[_vm._v(\"\\n bot\\n \")]):_vm._e()]:_vm._e(),_vm._v(\" \"),(_vm.user.locked)?_c('span',[_c('i',{staticClass:\"icon icon-lock\"})]):_vm._e(),_vm._v(\" \"),(!_vm.mergedConfig.hideUserStats && !_vm.hideBio)?_c('span',{staticClass:\"dailyAvg\"},[_vm._v(_vm._s(_vm.dailyAvg)+\" \"+_vm._s(_vm.$t('user_card.per_day')))]):_vm._e()],2)])],1),_vm._v(\" \"),_c('div',{staticClass:\"user-meta\"},[(_vm.relationship.followed_by && _vm.loggedIn && _vm.isOtherUser)?_c('div',{staticClass:\"following\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.follows_you'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.isOtherUser && (_vm.loggedIn || !_vm.switcher))?_c('div',{staticClass:\"highlighter\"},[(_vm.userHighlightType !== 'disabled')?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.userHighlightColor),expression:\"userHighlightColor\"}],staticClass:\"userHighlightText\",attrs:{\"id\":'userHighlightColorTx'+_vm.user.id,\"type\":\"text\"},domProps:{\"value\":(_vm.userHighlightColor)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.userHighlightColor=$event.target.value}}}):_vm._e(),_vm._v(\" \"),(_vm.userHighlightType !== 'disabled')?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.userHighlightColor),expression:\"userHighlightColor\"}],staticClass:\"userHighlightCl\",attrs:{\"id\":'userHighlightColor'+_vm.user.id,\"type\":\"color\"},domProps:{\"value\":(_vm.userHighlightColor)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.userHighlightColor=$event.target.value}}}):_vm._e(),_vm._v(\" \"),_c('label',{staticClass:\"userHighlightSel select\",attrs:{\"for\":\"theme_tab\"}},[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.userHighlightType),expression:\"userHighlightType\"}],staticClass:\"userHighlightSel\",attrs:{\"id\":'userHighlightSel'+_vm.user.id},on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.userHighlightType=$event.target.multiple ? $$selectedVal : $$selectedVal[0]}}},[_c('option',{attrs:{\"value\":\"disabled\"}},[_vm._v(\"No highlight\")]),_vm._v(\" \"),_c('option',{attrs:{\"value\":\"solid\"}},[_vm._v(\"Solid bg\")]),_vm._v(\" \"),_c('option',{attrs:{\"value\":\"striped\"}},[_vm._v(\"Striped bg\")]),_vm._v(\" \"),_c('option',{attrs:{\"value\":\"side\"}},[_vm._v(\"Side stripe\")])]),_vm._v(\" \"),_c('i',{staticClass:\"icon-down-open\"})])]):_vm._e()]),_vm._v(\" \"),(_vm.loggedIn && _vm.isOtherUser)?_c('div',{staticClass:\"user-interactions\"},[_c('div',{staticClass:\"btn-group\"},[_c('FollowButton',{attrs:{\"relationship\":_vm.relationship}}),_vm._v(\" \"),(_vm.relationship.following)?[(!_vm.relationship.subscribing)?_c('ProgressButton',{staticClass:\"btn btn-default\",attrs:{\"click\":_vm.subscribeUser,\"title\":_vm.$t('user_card.subscribe')}},[_c('i',{staticClass:\"icon-bell-alt\"})]):_c('ProgressButton',{staticClass:\"btn btn-default toggled\",attrs:{\"click\":_vm.unsubscribeUser,\"title\":_vm.$t('user_card.unsubscribe')}},[_c('i',{staticClass:\"icon-bell-ringing-o\"})])]:_vm._e()],2),_vm._v(\" \"),_c('div',[(_vm.relationship.muting)?_c('button',{staticClass:\"btn btn-default btn-block toggled\",on:{\"click\":_vm.unmuteUser}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.muted'))+\"\\n \")]):_c('button',{staticClass:\"btn btn-default btn-block\",on:{\"click\":_vm.muteUser}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.mute'))+\"\\n \")])]),_vm._v(\" \"),_c('div',[_c('button',{staticClass:\"btn btn-default btn-block\",on:{\"click\":_vm.mentionUser}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.mention'))+\"\\n \")])]),_vm._v(\" \"),(_vm.loggedIn.role === \"admin\")?_c('ModerationTools',{attrs:{\"user\":_vm.user}}):_vm._e()],1):_vm._e(),_vm._v(\" \"),(!_vm.loggedIn && _vm.user.is_local)?_c('div',{staticClass:\"user-interactions\"},[_c('RemoteFollow',{attrs:{\"user\":_vm.user}})],1):_vm._e()])]),_vm._v(\" \"),(!_vm.hideBio)?_c('div',{staticClass:\"panel-body\"},[(!_vm.mergedConfig.hideUserStats && _vm.switcher)?_c('div',{staticClass:\"user-counts\"},[_c('div',{staticClass:\"user-count\",on:{\"click\":function($event){$event.preventDefault();return _vm.setProfileView('statuses')}}},[_c('h5',[_vm._v(_vm._s(_vm.$t('user_card.statuses')))]),_vm._v(\" \"),_c('span',[_vm._v(_vm._s(_vm.user.statuses_count)+\" \"),_c('br')])]),_vm._v(\" \"),_c('div',{staticClass:\"user-count\",on:{\"click\":function($event){$event.preventDefault();return _vm.setProfileView('friends')}}},[_c('h5',[_vm._v(_vm._s(_vm.$t('user_card.followees')))]),_vm._v(\" \"),_c('span',[_vm._v(_vm._s(_vm.hideFollowsCount ? _vm.$t('user_card.hidden') : _vm.user.friends_count))])]),_vm._v(\" \"),_c('div',{staticClass:\"user-count\",on:{\"click\":function($event){$event.preventDefault();return _vm.setProfileView('followers')}}},[_c('h5',[_vm._v(_vm._s(_vm.$t('user_card.followers')))]),_vm._v(\" \"),_c('span',[_vm._v(_vm._s(_vm.hideFollowersCount ? _vm.$t('user_card.hidden') : _vm.user.followers_count))])])]):_vm._e(),_vm._v(\" \"),(!_vm.hideBio && _vm.user.description_html)?_c('p',{staticClass:\"user-card-bio\",domProps:{\"innerHTML\":_vm._s(_vm.user.description_html)},on:{\"click\":function($event){$event.preventDefault();return _vm.linkClicked($event)}}}):(!_vm.hideBio)?_c('p',{staticClass:\"user-card-bio\"},[_vm._v(\"\\n \"+_vm._s(_vm.user.description)+\"\\n \")]):_vm._e()]):_vm._e()])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"user-info-avatar-link-overlay\"},[_c('i',{staticClass:\"button-icon icon-zoom-in\"})])}]\nexport { render, staticRenderFns }","import { invertLightness, brightness } from 'chromatism'\nimport { alphaBlend, mixrgb } from '../color_convert/color_convert.js'\n/* This is a definition of all layer combinations\n * each key is a topmost layer, each value represents layer underneath\n * this is essentially a simplified tree\n */\nexport const LAYERS = {\n undelay: null, // root\n topBar: null, // no transparency support\n badge: null, // no transparency support\n profileTint: null, // doesn't matter\n fg: null,\n bg: 'underlay',\n highlight: 'bg',\n panel: 'bg',\n popover: 'bg',\n selectedMenu: 'popover',\n btn: 'bg',\n btnPanel: 'panel',\n btnTopBar: 'topBar',\n input: 'bg',\n inputPanel: 'panel',\n inputTopBar: 'topBar',\n alert: 'bg',\n alertPanel: 'panel',\n poll: 'bg',\n chatBg: 'underlay',\n chatMessage: 'chatBg'\n}\n\n/* By default opacity slots have 1 as default opacity\n * this allows redefining it to something else\n */\nexport const DEFAULT_OPACITY = {\n profileTint: 0.5,\n alert: 0.5,\n input: 0.5,\n faint: 0.5,\n underlay: 0.15,\n alertPopup: 0.95\n}\n\n/** SUBJECT TO CHANGE IN THE FUTURE, this is all beta\n * Color and opacity slots definitions. Each key represents a slot.\n *\n * Short-hands:\n * String beginning with `--` - value after dashes treated as sole\n * dependency - i.e. `--value` equivalent to { depends: ['value']}\n * String beginning with `#` - value would be treated as solid color\n * defined in hexadecimal representation (i.e. #FFFFFF) and will be\n * used as default. `#FFFFFF` is equivalent to { default: '#FFFFFF'}\n *\n * Full definition:\n * @property {String[]} depends - color slot names this color depends ones.\n * cyclic dependencies are supported to some extent but not recommended.\n * @property {String} [opacity] - opacity slot used by this color slot.\n * opacity is inherited from parents. To break inheritance graph use null\n * @property {Number} [priority] - EXPERIMENTAL. used to pre-sort slots so\n * that slots with higher priority come earlier\n * @property {Function(mod, ...colors)} [color] - function that will be\n * used to determine the color. By default it just copies first color in\n * dependency list.\n * @argument {Number} mod - `1` (light-on-dark) or `-1` (dark-on-light)\n * depending on background color (for textColor)/given color.\n * @argument {...Object} deps - each argument after mod represents each\n * color from `depends` array. All colors take user customizations into\n * account and represented by { r, g, b } objects.\n * @returns {Object} resulting color, should be in { r, g, b } form\n *\n * @property {Boolean|String} [textColor] - true to mark color slot as text\n * color. This enables automatic text color generation for the slot. Use\n * 'preserve' string if you don't want text color to fall back to\n * black/white. Use 'bw' to only ever use black or white. This also makes\n * following properties required:\n * @property {String} [layer] - which layer the text sit on top on - used\n * to account for transparency in text color calculation\n * layer is inherited from parents. To break inheritance graph use null\n * @property {String} [variant] - which color slot is background (same as\n * above, used to account for transparency)\n */\nexport const SLOT_INHERITANCE = {\n bg: {\n depends: [],\n opacity: 'bg',\n priority: 1\n },\n fg: {\n depends: [],\n priority: 1\n },\n text: {\n depends: [],\n layer: 'bg',\n opacity: null,\n priority: 1\n },\n underlay: {\n default: '#000000',\n opacity: 'underlay'\n },\n link: {\n depends: ['accent'],\n priority: 1\n },\n accent: {\n depends: ['link'],\n priority: 1\n },\n faint: {\n depends: ['text'],\n opacity: 'faint'\n },\n faintLink: {\n depends: ['link'],\n opacity: 'faint'\n },\n postFaintLink: {\n depends: ['postLink'],\n opacity: 'faint'\n },\n\n cBlue: '#0000ff',\n cRed: '#FF0000',\n cGreen: '#00FF00',\n cOrange: '#E3FF00',\n\n profileBg: {\n depends: ['bg'],\n color: (mod, bg) => ({\n r: Math.floor(bg.r * 0.53),\n g: Math.floor(bg.g * 0.56),\n b: Math.floor(bg.b * 0.59)\n })\n },\n profileTint: {\n depends: ['bg'],\n layer: 'profileTint',\n opacity: 'profileTint'\n },\n\n highlight: {\n depends: ['bg'],\n color: (mod, bg) => brightness(5 * mod, bg).rgb\n },\n highlightLightText: {\n depends: ['lightText'],\n layer: 'highlight',\n textColor: true\n },\n highlightPostLink: {\n depends: ['postLink'],\n layer: 'highlight',\n textColor: 'preserve'\n },\n highlightFaintText: {\n depends: ['faint'],\n layer: 'highlight',\n textColor: true\n },\n highlightFaintLink: {\n depends: ['faintLink'],\n layer: 'highlight',\n textColor: 'preserve'\n },\n highlightPostFaintLink: {\n depends: ['postFaintLink'],\n layer: 'highlight',\n textColor: 'preserve'\n },\n highlightText: {\n depends: ['text'],\n layer: 'highlight',\n textColor: true\n },\n highlightLink: {\n depends: ['link'],\n layer: 'highlight',\n textColor: 'preserve'\n },\n highlightIcon: {\n depends: ['highlight', 'highlightText'],\n color: (mod, bg, text) => mixrgb(bg, text)\n },\n\n popover: {\n depends: ['bg'],\n opacity: 'popover'\n },\n popoverLightText: {\n depends: ['lightText'],\n layer: 'popover',\n textColor: true\n },\n popoverPostLink: {\n depends: ['postLink'],\n layer: 'popover',\n textColor: 'preserve'\n },\n popoverFaintText: {\n depends: ['faint'],\n layer: 'popover',\n textColor: true\n },\n popoverFaintLink: {\n depends: ['faintLink'],\n layer: 'popover',\n textColor: 'preserve'\n },\n popoverPostFaintLink: {\n depends: ['postFaintLink'],\n layer: 'popover',\n textColor: 'preserve'\n },\n popoverText: {\n depends: ['text'],\n layer: 'popover',\n textColor: true\n },\n popoverLink: {\n depends: ['link'],\n layer: 'popover',\n textColor: 'preserve'\n },\n popoverIcon: {\n depends: ['popover', 'popoverText'],\n color: (mod, bg, text) => mixrgb(bg, text)\n },\n\n selectedPost: '--highlight',\n selectedPostFaintText: {\n depends: ['highlightFaintText'],\n layer: 'highlight',\n variant: 'selectedPost',\n textColor: true\n },\n selectedPostLightText: {\n depends: ['highlightLightText'],\n layer: 'highlight',\n variant: 'selectedPost',\n textColor: true\n },\n selectedPostPostLink: {\n depends: ['highlightPostLink'],\n layer: 'highlight',\n variant: 'selectedPost',\n textColor: 'preserve'\n },\n selectedPostFaintLink: {\n depends: ['highlightFaintLink'],\n layer: 'highlight',\n variant: 'selectedPost',\n textColor: 'preserve'\n },\n selectedPostText: {\n depends: ['highlightText'],\n layer: 'highlight',\n variant: 'selectedPost',\n textColor: true\n },\n selectedPostLink: {\n depends: ['highlightLink'],\n layer: 'highlight',\n variant: 'selectedPost',\n textColor: 'preserve'\n },\n selectedPostIcon: {\n depends: ['selectedPost', 'selectedPostText'],\n color: (mod, bg, text) => mixrgb(bg, text)\n },\n\n selectedMenu: {\n depends: ['bg'],\n color: (mod, bg) => brightness(5 * mod, bg).rgb\n },\n selectedMenuLightText: {\n depends: ['highlightLightText'],\n layer: 'selectedMenu',\n variant: 'selectedMenu',\n textColor: true\n },\n selectedMenuFaintText: {\n depends: ['highlightFaintText'],\n layer: 'selectedMenu',\n variant: 'selectedMenu',\n textColor: true\n },\n selectedMenuFaintLink: {\n depends: ['highlightFaintLink'],\n layer: 'selectedMenu',\n variant: 'selectedMenu',\n textColor: 'preserve'\n },\n selectedMenuText: {\n depends: ['highlightText'],\n layer: 'selectedMenu',\n variant: 'selectedMenu',\n textColor: true\n },\n selectedMenuLink: {\n depends: ['highlightLink'],\n layer: 'selectedMenu',\n variant: 'selectedMenu',\n textColor: 'preserve'\n },\n selectedMenuIcon: {\n depends: ['selectedMenu', 'selectedMenuText'],\n color: (mod, bg, text) => mixrgb(bg, text)\n },\n\n selectedMenuPopover: {\n depends: ['popover'],\n color: (mod, bg) => brightness(5 * mod, bg).rgb\n },\n selectedMenuPopoverLightText: {\n depends: ['selectedMenuLightText'],\n layer: 'selectedMenuPopover',\n variant: 'selectedMenuPopover',\n textColor: true\n },\n selectedMenuPopoverFaintText: {\n depends: ['selectedMenuFaintText'],\n layer: 'selectedMenuPopover',\n variant: 'selectedMenuPopover',\n textColor: true\n },\n selectedMenuPopoverFaintLink: {\n depends: ['selectedMenuFaintLink'],\n layer: 'selectedMenuPopover',\n variant: 'selectedMenuPopover',\n textColor: 'preserve'\n },\n selectedMenuPopoverText: {\n depends: ['selectedMenuText'],\n layer: 'selectedMenuPopover',\n variant: 'selectedMenuPopover',\n textColor: true\n },\n selectedMenuPopoverLink: {\n depends: ['selectedMenuLink'],\n layer: 'selectedMenuPopover',\n variant: 'selectedMenuPopover',\n textColor: 'preserve'\n },\n selectedMenuPopoverIcon: {\n depends: ['selectedMenuPopover', 'selectedMenuText'],\n color: (mod, bg, text) => mixrgb(bg, text)\n },\n\n lightText: {\n depends: ['text'],\n layer: 'bg',\n textColor: 'preserve',\n color: (mod, text) => brightness(20 * mod, text).rgb\n },\n\n postLink: {\n depends: ['link'],\n layer: 'bg',\n textColor: 'preserve'\n },\n\n postGreentext: {\n depends: ['cGreen'],\n layer: 'bg',\n textColor: 'preserve'\n },\n\n border: {\n depends: ['fg'],\n opacity: 'border',\n color: (mod, fg) => brightness(2 * mod, fg).rgb\n },\n\n poll: {\n depends: ['accent', 'bg'],\n copacity: 'poll',\n color: (mod, accent, bg) => alphaBlend(accent, 0.4, bg)\n },\n pollText: {\n depends: ['text'],\n layer: 'poll',\n textColor: true\n },\n\n icon: {\n depends: ['bg', 'text'],\n inheritsOpacity: false,\n color: (mod, bg, text) => mixrgb(bg, text)\n },\n\n // Foreground\n fgText: {\n depends: ['text'],\n layer: 'fg',\n textColor: true\n },\n fgLink: {\n depends: ['link'],\n layer: 'fg',\n textColor: 'preserve'\n },\n\n // Panel header\n panel: {\n depends: ['fg'],\n opacity: 'panel'\n },\n panelText: {\n depends: ['text'],\n layer: 'panel',\n textColor: true\n },\n panelFaint: {\n depends: ['fgText'],\n layer: 'panel',\n opacity: 'faint',\n textColor: true\n },\n panelLink: {\n depends: ['fgLink'],\n layer: 'panel',\n textColor: 'preserve'\n },\n\n // Top bar\n topBar: '--fg',\n topBarText: {\n depends: ['fgText'],\n layer: 'topBar',\n textColor: true\n },\n topBarLink: {\n depends: ['fgLink'],\n layer: 'topBar',\n textColor: 'preserve'\n },\n\n // Tabs\n tab: {\n depends: ['btn']\n },\n tabText: {\n depends: ['btnText'],\n layer: 'btn',\n textColor: true\n },\n tabActiveText: {\n depends: ['text'],\n layer: 'bg',\n textColor: true\n },\n\n // Buttons\n btn: {\n depends: ['fg'],\n variant: 'btn',\n opacity: 'btn'\n },\n btnText: {\n depends: ['fgText'],\n layer: 'btn',\n textColor: true\n },\n btnPanelText: {\n depends: ['btnText'],\n layer: 'btnPanel',\n variant: 'btn',\n textColor: true\n },\n btnTopBarText: {\n depends: ['btnText'],\n layer: 'btnTopBar',\n variant: 'btn',\n textColor: true\n },\n\n // Buttons: pressed\n btnPressed: {\n depends: ['btn'],\n layer: 'btn'\n },\n btnPressedText: {\n depends: ['btnText'],\n layer: 'btn',\n variant: 'btnPressed',\n textColor: true\n },\n btnPressedPanel: {\n depends: ['btnPressed'],\n layer: 'btn'\n },\n btnPressedPanelText: {\n depends: ['btnPanelText'],\n layer: 'btnPanel',\n variant: 'btnPressed',\n textColor: true\n },\n btnPressedTopBar: {\n depends: ['btnPressed'],\n layer: 'btn'\n },\n btnPressedTopBarText: {\n depends: ['btnTopBarText'],\n layer: 'btnTopBar',\n variant: 'btnPressed',\n textColor: true\n },\n\n // Buttons: toggled\n btnToggled: {\n depends: ['btn'],\n layer: 'btn',\n color: (mod, btn) => brightness(mod * 20, btn).rgb\n },\n btnToggledText: {\n depends: ['btnText'],\n layer: 'btn',\n variant: 'btnToggled',\n textColor: true\n },\n btnToggledPanelText: {\n depends: ['btnPanelText'],\n layer: 'btnPanel',\n variant: 'btnToggled',\n textColor: true\n },\n btnToggledTopBarText: {\n depends: ['btnTopBarText'],\n layer: 'btnTopBar',\n variant: 'btnToggled',\n textColor: true\n },\n\n // Buttons: disabled\n btnDisabled: {\n depends: ['btn', 'bg'],\n color: (mod, btn, bg) => alphaBlend(btn, 0.25, bg)\n },\n btnDisabledText: {\n depends: ['btnText', 'btnDisabled'],\n layer: 'btn',\n variant: 'btnDisabled',\n color: (mod, text, btn) => alphaBlend(text, 0.25, btn)\n },\n btnDisabledPanelText: {\n depends: ['btnPanelText', 'btnDisabled'],\n layer: 'btnPanel',\n variant: 'btnDisabled',\n color: (mod, text, btn) => alphaBlend(text, 0.25, btn)\n },\n btnDisabledTopBarText: {\n depends: ['btnTopBarText', 'btnDisabled'],\n layer: 'btnTopBar',\n variant: 'btnDisabled',\n color: (mod, text, btn) => alphaBlend(text, 0.25, btn)\n },\n\n // Input fields\n input: {\n depends: ['fg'],\n opacity: 'input'\n },\n inputText: {\n depends: ['text'],\n layer: 'input',\n textColor: true\n },\n inputPanelText: {\n depends: ['panelText'],\n layer: 'inputPanel',\n variant: 'input',\n textColor: true\n },\n inputTopbarText: {\n depends: ['topBarText'],\n layer: 'inputTopBar',\n variant: 'input',\n textColor: true\n },\n\n alertError: {\n depends: ['cRed'],\n opacity: 'alert'\n },\n alertErrorText: {\n depends: ['text'],\n layer: 'alert',\n variant: 'alertError',\n textColor: true\n },\n alertErrorPanelText: {\n depends: ['panelText'],\n layer: 'alertPanel',\n variant: 'alertError',\n textColor: true\n },\n\n alertWarning: {\n depends: ['cOrange'],\n opacity: 'alert'\n },\n alertWarningText: {\n depends: ['text'],\n layer: 'alert',\n variant: 'alertWarning',\n textColor: true\n },\n alertWarningPanelText: {\n depends: ['panelText'],\n layer: 'alertPanel',\n variant: 'alertWarning',\n textColor: true\n },\n\n alertNeutral: {\n depends: ['text'],\n opacity: 'alert'\n },\n alertNeutralText: {\n depends: ['text'],\n layer: 'alert',\n variant: 'alertNeutral',\n color: (mod, text) => invertLightness(text).rgb,\n textColor: true\n },\n alertNeutralPanelText: {\n depends: ['panelText'],\n layer: 'alertPanel',\n variant: 'alertNeutral',\n textColor: true\n },\n\n alertPopupError: {\n depends: ['alertError'],\n opacity: 'alertPopup'\n },\n alertPopupErrorText: {\n depends: ['alertErrorText'],\n layer: 'popover',\n variant: 'alertPopupError',\n textColor: true\n },\n\n alertPopupWarning: {\n depends: ['alertWarning'],\n opacity: 'alertPopup'\n },\n alertPopupWarningText: {\n depends: ['alertWarningText'],\n layer: 'popover',\n variant: 'alertPopupWarning',\n textColor: true\n },\n\n alertPopupNeutral: {\n depends: ['alertNeutral'],\n opacity: 'alertPopup'\n },\n alertPopupNeutralText: {\n depends: ['alertNeutralText'],\n layer: 'popover',\n variant: 'alertPopupNeutral',\n textColor: true\n },\n\n badgeNotification: '--cRed',\n badgeNotificationText: {\n depends: ['text', 'badgeNotification'],\n layer: 'badge',\n variant: 'badgeNotification',\n textColor: 'bw'\n },\n\n chatBg: {\n depends: ['bg']\n },\n\n chatMessageIncomingBg: {\n depends: ['chatBg']\n },\n\n chatMessageIncomingText: {\n depends: ['text'],\n layer: 'chatMessage',\n variant: 'chatMessageIncomingBg',\n textColor: true\n },\n\n chatMessageIncomingLink: {\n depends: ['link'],\n layer: 'chatMessage',\n variant: 'chatMessageIncomingBg',\n textColor: 'preserve'\n },\n\n chatMessageIncomingBorder: {\n depends: ['border'],\n opacity: 'border',\n color: (mod, border) => brightness(2 * mod, border).rgb\n },\n\n chatMessageOutgoingBg: {\n depends: ['chatMessageIncomingBg'],\n color: (mod, chatMessage) => brightness(5 * mod, chatMessage).rgb\n },\n\n chatMessageOutgoingText: {\n depends: ['text'],\n layer: 'chatMessage',\n variant: 'chatMessageOutgoingBg',\n textColor: true\n },\n\n chatMessageOutgoingLink: {\n depends: ['link'],\n layer: 'chatMessage',\n variant: 'chatMessageOutgoingBg',\n textColor: 'preserve'\n },\n\n chatMessageOutgoingBorder: {\n depends: ['chatMessageOutgoingBg'],\n opacity: 'border',\n color: (mod, border) => brightness(2 * mod, border).rgb\n }\n}\n","import { convert } from 'chromatism'\nimport { rgb2hex, hex2rgb, rgba2css, getCssColor, relativeLuminance } from '../color_convert/color_convert.js'\nimport { getColors, computeDynamicColor, getOpacitySlot } from '../theme_data/theme_data.service.js'\n\nexport const applyTheme = (input) => {\n const { rules } = generatePreset(input)\n const head = document.head\n const body = document.body\n body.classList.add('hidden')\n\n const styleEl = document.createElement('style')\n head.appendChild(styleEl)\n const styleSheet = styleEl.sheet\n\n styleSheet.toString()\n styleSheet.insertRule(`body { ${rules.radii} }`, 'index-max')\n styleSheet.insertRule(`body { ${rules.colors} }`, 'index-max')\n styleSheet.insertRule(`body { ${rules.shadows} }`, 'index-max')\n styleSheet.insertRule(`body { ${rules.fonts} }`, 'index-max')\n body.classList.remove('hidden')\n}\n\nexport const getCssShadow = (input, usesDropShadow) => {\n if (input.length === 0) {\n return 'none'\n }\n\n return input\n .filter(_ => usesDropShadow ? _.inset : _)\n .map((shad) => [\n shad.x,\n shad.y,\n shad.blur,\n shad.spread\n ].map(_ => _ + 'px').concat([\n getCssColor(shad.color, shad.alpha),\n shad.inset ? 'inset' : ''\n ]).join(' ')).join(', ')\n}\n\nconst getCssShadowFilter = (input) => {\n if (input.length === 0) {\n return 'none'\n }\n\n return input\n // drop-shadow doesn't support inset or spread\n .filter((shad) => !shad.inset && Number(shad.spread) === 0)\n .map((shad) => [\n shad.x,\n shad.y,\n // drop-shadow's blur is twice as strong compared to box-shadow\n shad.blur / 2\n ].map(_ => _ + 'px').concat([\n getCssColor(shad.color, shad.alpha)\n ]).join(' '))\n .map(_ => `drop-shadow(${_})`)\n .join(' ')\n}\n\nexport const generateColors = (themeData) => {\n const sourceColors = !themeData.themeEngineVersion\n ? colors2to3(themeData.colors || themeData)\n : themeData.colors || themeData\n\n const { colors, opacity } = getColors(sourceColors, themeData.opacity || {})\n\n const htmlColors = Object.entries(colors)\n .reduce((acc, [k, v]) => {\n if (!v) return acc\n acc.solid[k] = rgb2hex(v)\n acc.complete[k] = typeof v.a === 'undefined' ? rgb2hex(v) : rgba2css(v)\n return acc\n }, { complete: {}, solid: {} })\n return {\n rules: {\n colors: Object.entries(htmlColors.complete)\n .filter(([k, v]) => v)\n .map(([k, v]) => `--${k}: ${v}`)\n .join(';')\n },\n theme: {\n colors: htmlColors.solid,\n opacity\n }\n }\n}\n\nexport const generateRadii = (input) => {\n let inputRadii = input.radii || {}\n // v1 -> v2\n if (typeof input.btnRadius !== 'undefined') {\n inputRadii = Object\n .entries(input)\n .filter(([k, v]) => k.endsWith('Radius'))\n .reduce((acc, e) => { acc[e[0].split('Radius')[0]] = e[1]; return acc }, {})\n }\n const radii = Object.entries(inputRadii).filter(([k, v]) => v).reduce((acc, [k, v]) => {\n acc[k] = v\n return acc\n }, {\n btn: 4,\n input: 4,\n checkbox: 2,\n panel: 10,\n avatar: 5,\n avatarAlt: 50,\n tooltip: 2,\n attachment: 5,\n chatMessage: inputRadii.panel\n })\n\n return {\n rules: {\n radii: Object.entries(radii).filter(([k, v]) => v).map(([k, v]) => `--${k}Radius: ${v}px`).join(';')\n },\n theme: {\n radii\n }\n }\n}\n\nexport const generateFonts = (input) => {\n const fonts = Object.entries(input.fonts || {}).filter(([k, v]) => v).reduce((acc, [k, v]) => {\n acc[k] = Object.entries(v).filter(([k, v]) => v).reduce((acc, [k, v]) => {\n acc[k] = v\n return acc\n }, acc[k])\n return acc\n }, {\n interface: {\n family: 'sans-serif'\n },\n input: {\n family: 'inherit'\n },\n post: {\n family: 'inherit'\n },\n postCode: {\n family: 'monospace'\n }\n })\n\n return {\n rules: {\n fonts: Object\n .entries(fonts)\n .filter(([k, v]) => v)\n .map(([k, v]) => `--${k}Font: ${v.family}`).join(';')\n },\n theme: {\n fonts\n }\n }\n}\n\nconst border = (top, shadow) => ({\n x: 0,\n y: top ? 1 : -1,\n blur: 0,\n spread: 0,\n color: shadow ? '#000000' : '#FFFFFF',\n alpha: 0.2,\n inset: true\n})\nconst buttonInsetFakeBorders = [border(true, false), border(false, true)]\nconst inputInsetFakeBorders = [border(true, true), border(false, false)]\nconst hoverGlow = {\n x: 0,\n y: 0,\n blur: 4,\n spread: 0,\n color: '--faint',\n alpha: 1\n}\n\nexport const DEFAULT_SHADOWS = {\n panel: [{\n x: 1,\n y: 1,\n blur: 4,\n spread: 0,\n color: '#000000',\n alpha: 0.6\n }],\n topBar: [{\n x: 0,\n y: 0,\n blur: 4,\n spread: 0,\n color: '#000000',\n alpha: 0.6\n }],\n popup: [{\n x: 2,\n y: 2,\n blur: 3,\n spread: 0,\n color: '#000000',\n alpha: 0.5\n }],\n avatar: [{\n x: 0,\n y: 1,\n blur: 8,\n spread: 0,\n color: '#000000',\n alpha: 0.7\n }],\n avatarStatus: [],\n panelHeader: [],\n button: [{\n x: 0,\n y: 0,\n blur: 2,\n spread: 0,\n color: '#000000',\n alpha: 1\n }, ...buttonInsetFakeBorders],\n buttonHover: [hoverGlow, ...buttonInsetFakeBorders],\n buttonPressed: [hoverGlow, ...inputInsetFakeBorders],\n input: [...inputInsetFakeBorders, {\n x: 0,\n y: 0,\n blur: 2,\n inset: true,\n spread: 0,\n color: '#000000',\n alpha: 1\n }]\n}\nexport const generateShadows = (input, colors) => {\n // TODO this is a small hack for `mod` to work with shadows\n // this is used to get the \"context\" of shadow, i.e. for `mod` properly depend on background color of element\n const hackContextDict = {\n button: 'btn',\n panel: 'bg',\n top: 'topBar',\n popup: 'popover',\n avatar: 'bg',\n panelHeader: 'panel',\n input: 'input'\n }\n const inputShadows = input.shadows && !input.themeEngineVersion\n ? shadows2to3(input.shadows, input.opacity)\n : input.shadows || {}\n const shadows = Object.entries({\n ...DEFAULT_SHADOWS,\n ...inputShadows\n }).reduce((shadowsAcc, [slotName, shadowDefs]) => {\n const slotFirstWord = slotName.replace(/[A-Z].*$/, '')\n const colorSlotName = hackContextDict[slotFirstWord]\n const isLightOnDark = relativeLuminance(convert(colors[colorSlotName]).rgb) < 0.5\n const mod = isLightOnDark ? 1 : -1\n const newShadow = shadowDefs.reduce((shadowAcc, def) => [\n ...shadowAcc,\n {\n ...def,\n color: rgb2hex(computeDynamicColor(\n def.color,\n (variableSlot) => convert(colors[variableSlot]).rgb,\n mod\n ))\n }\n ], [])\n return { ...shadowsAcc, [slotName]: newShadow }\n }, {})\n\n return {\n rules: {\n shadows: Object\n .entries(shadows)\n // TODO for v2.2: if shadow doesn't have non-inset shadows with spread > 0 - optionally\n // convert all non-inset shadows into filter: drop-shadow() to boost performance\n .map(([k, v]) => [\n `--${k}Shadow: ${getCssShadow(v)}`,\n `--${k}ShadowFilter: ${getCssShadowFilter(v)}`,\n `--${k}ShadowInset: ${getCssShadow(v, true)}`\n ].join(';'))\n .join(';')\n },\n theme: {\n shadows\n }\n }\n}\n\nexport const composePreset = (colors, radii, shadows, fonts) => {\n return {\n rules: {\n ...shadows.rules,\n ...colors.rules,\n ...radii.rules,\n ...fonts.rules\n },\n theme: {\n ...shadows.theme,\n ...colors.theme,\n ...radii.theme,\n ...fonts.theme\n }\n }\n}\n\nexport const generatePreset = (input) => {\n const colors = generateColors(input)\n return composePreset(\n colors,\n generateRadii(input),\n generateShadows(input, colors.theme.colors, colors.mod),\n generateFonts(input)\n )\n}\n\nexport const getThemes = () => {\n const cache = 'no-store'\n\n return window.fetch('/static/styles.json', { cache })\n .then((data) => data.json())\n .then((themes) => {\n return Object.entries(themes).map(([k, v]) => {\n let promise = null\n if (typeof v === 'object') {\n promise = Promise.resolve(v)\n } else if (typeof v === 'string') {\n promise = window.fetch(v, { cache })\n .then((data) => data.json())\n .catch((e) => {\n console.error(e)\n return null\n })\n }\n return [k, promise]\n })\n })\n .then((promises) => {\n return promises\n .reduce((acc, [k, v]) => {\n acc[k] = v\n return acc\n }, {})\n })\n}\nexport const colors2to3 = (colors) => {\n return Object.entries(colors).reduce((acc, [slotName, color]) => {\n const btnPositions = ['', 'Panel', 'TopBar']\n switch (slotName) {\n case 'lightBg':\n return { ...acc, highlight: color }\n case 'btnText':\n return {\n ...acc,\n ...btnPositions\n .reduce(\n (statePositionAcc, position) =>\n ({ ...statePositionAcc, ['btn' + position + 'Text']: color })\n , {}\n )\n }\n default:\n return { ...acc, [slotName]: color }\n }\n }, {})\n}\n\n/**\n * This handles compatibility issues when importing v2 theme's shadows to current format\n *\n * Back in v2 shadows allowed you to use dynamic colors however those used pure CSS3 variables\n */\nexport const shadows2to3 = (shadows, opacity) => {\n return Object.entries(shadows).reduce((shadowsAcc, [slotName, shadowDefs]) => {\n const isDynamic = ({ color }) => color.startsWith('--')\n const getOpacity = ({ color }) => opacity[getOpacitySlot(color.substring(2).split(',')[0])]\n const newShadow = shadowDefs.reduce((shadowAcc, def) => [\n ...shadowAcc,\n {\n ...def,\n alpha: isDynamic(def) ? getOpacity(def) || 1 : def.alpha\n }\n ], [])\n return { ...shadowsAcc, [slotName]: newShadow }\n }, {})\n}\n\nexport const getPreset = (val) => {\n return getThemes()\n .then((themes) => themes[val] ? themes[val] : themes['pleroma-dark'])\n .then((theme) => {\n const isV1 = Array.isArray(theme)\n const data = isV1 ? {} : theme.theme\n\n if (isV1) {\n const bg = hex2rgb(theme[1])\n const fg = hex2rgb(theme[2])\n const text = hex2rgb(theme[3])\n const link = hex2rgb(theme[4])\n\n const cRed = hex2rgb(theme[5] || '#FF0000')\n const cGreen = hex2rgb(theme[6] || '#00FF00')\n const cBlue = hex2rgb(theme[7] || '#0000FF')\n const cOrange = hex2rgb(theme[8] || '#E3FF00')\n\n data.colors = { bg, fg, text, link, cRed, cBlue, cGreen, cOrange }\n }\n\n return { theme: data, source: theme.source }\n })\n}\n\nexport const setPreset = (val) => getPreset(val).then(data => applyTheme(data.theme))\n","import { mapGetters } from 'vuex'\n\nconst FavoriteButton = {\n props: ['status', 'loggedIn'],\n data () {\n return {\n animated: false\n }\n },\n methods: {\n favorite () {\n if (!this.status.favorited) {\n this.$store.dispatch('favorite', { id: this.status.id })\n } else {\n this.$store.dispatch('unfavorite', { id: this.status.id })\n }\n this.animated = true\n setTimeout(() => {\n this.animated = false\n }, 500)\n }\n },\n computed: {\n classes () {\n return {\n 'icon-star-empty': !this.status.favorited,\n 'icon-star': this.status.favorited,\n 'animate-spin': this.animated\n }\n },\n ...mapGetters(['mergedConfig'])\n }\n}\n\nexport default FavoriteButton\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./favorite_button.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./favorite_button.js\"\nimport __vue_script__ from \"!!babel-loader!./favorite_button.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-2ced002f\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./favorite_button.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.loggedIn)?_c('div',[_c('i',{staticClass:\"button-icon favorite-button fav-active\",class:_vm.classes,attrs:{\"title\":_vm.$t('tool_tip.favorite')},on:{\"click\":function($event){$event.preventDefault();return _vm.favorite()}}}),_vm._v(\" \"),(!_vm.mergedConfig.hidePostStats && _vm.status.fave_num > 0)?_c('span',[_vm._v(_vm._s(_vm.status.fave_num))]):_vm._e()]):_c('div',[_c('i',{staticClass:\"button-icon favorite-button\",class:_vm.classes,attrs:{\"title\":_vm.$t('tool_tip.favorite')}}),_vm._v(\" \"),(!_vm.mergedConfig.hidePostStats && _vm.status.fave_num > 0)?_c('span',[_vm._v(_vm._s(_vm.status.fave_num))]):_vm._e()])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import Popover from '../popover/popover.vue'\nimport { mapGetters } from 'vuex'\n\nconst ReactButton = {\n props: ['status'],\n data () {\n return {\n filterWord: ''\n }\n },\n components: {\n Popover\n },\n methods: {\n addReaction (event, emoji, close) {\n const existingReaction = this.status.emoji_reactions.find(r => r.name === emoji)\n if (existingReaction && existingReaction.me) {\n this.$store.dispatch('unreactWithEmoji', { id: this.status.id, emoji })\n } else {\n this.$store.dispatch('reactWithEmoji', { id: this.status.id, emoji })\n }\n close()\n }\n },\n computed: {\n commonEmojis () {\n return ['👍', '😠', '👀', '😂', '🔥']\n },\n emojis () {\n if (this.filterWord !== '') {\n const filterWordLowercase = this.filterWord.toLowerCase()\n return this.$store.state.instance.emoji.filter(emoji =>\n emoji.displayText.toLowerCase().includes(filterWordLowercase)\n )\n }\n return this.$store.state.instance.emoji || []\n },\n ...mapGetters(['mergedConfig'])\n }\n}\n\nexport default ReactButton\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./react_button.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./react_button.js\"\nimport __vue_script__ from \"!!babel-loader!./react_button.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-185f65eb\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./react_button.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Popover',{staticClass:\"react-button-popover\",attrs:{\"trigger\":\"click\",\"placement\":\"top\",\"offset\":{ y: 5 }},scopedSlots:_vm._u([{key:\"content\",fn:function(ref){\nvar close = ref.close;\nreturn _c('div',{},[_c('div',{staticClass:\"reaction-picker-filter\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.filterWord),expression:\"filterWord\"}],attrs:{\"placeholder\":_vm.$t('emoji.search_emoji')},domProps:{\"value\":(_vm.filterWord)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.filterWord=$event.target.value}}})]),_vm._v(\" \"),_c('div',{staticClass:\"reaction-picker\"},[_vm._l((_vm.commonEmojis),function(emoji){return _c('span',{key:emoji,staticClass:\"emoji-button\",on:{\"click\":function($event){return _vm.addReaction($event, emoji, close)}}},[_vm._v(\"\\n \"+_vm._s(emoji)+\"\\n \")])}),_vm._v(\" \"),_c('div',{staticClass:\"reaction-picker-divider\"}),_vm._v(\" \"),_vm._l((_vm.emojis),function(emoji,key){return _c('span',{key:key,staticClass:\"emoji-button\",on:{\"click\":function($event){return _vm.addReaction($event, emoji.replacement, close)}}},[_vm._v(\"\\n \"+_vm._s(emoji.replacement)+\"\\n \")])}),_vm._v(\" \"),_c('div',{staticClass:\"reaction-bottom-fader\"})],2)])}}])},[_vm._v(\" \"),_c('i',{staticClass:\"icon-smile button-icon add-reaction-button\",attrs:{\"slot\":\"trigger\",\"title\":_vm.$t('tool_tip.add_reaction')},slot:\"trigger\"})])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import { mapGetters } from 'vuex'\n\nconst RetweetButton = {\n props: ['status', 'loggedIn', 'visibility'],\n data () {\n return {\n animated: false\n }\n },\n methods: {\n retweet () {\n if (!this.status.repeated) {\n this.$store.dispatch('retweet', { id: this.status.id })\n } else {\n this.$store.dispatch('unretweet', { id: this.status.id })\n }\n this.animated = true\n setTimeout(() => {\n this.animated = false\n }, 500)\n }\n },\n computed: {\n classes () {\n return {\n 'retweeted': this.status.repeated,\n 'retweeted-empty': !this.status.repeated,\n 'animate-spin': this.animated\n }\n },\n ...mapGetters(['mergedConfig'])\n }\n}\n\nexport default RetweetButton\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./retweet_button.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./retweet_button.js\"\nimport __vue_script__ from \"!!babel-loader!./retweet_button.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-538410cc\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./retweet_button.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.loggedIn)?_c('div',[(_vm.visibility !== 'private' && _vm.visibility !== 'direct')?[_c('i',{staticClass:\"button-icon retweet-button icon-retweet rt-active\",class:_vm.classes,attrs:{\"title\":_vm.$t('tool_tip.repeat')},on:{\"click\":function($event){$event.preventDefault();return _vm.retweet()}}}),_vm._v(\" \"),(!_vm.mergedConfig.hidePostStats && _vm.status.repeat_num > 0)?_c('span',[_vm._v(_vm._s(_vm.status.repeat_num))]):_vm._e()]:[_c('i',{staticClass:\"button-icon icon-lock\",class:_vm.classes,attrs:{\"title\":_vm.$t('timeline.no_retweet_hint')}})]],2):(!_vm.loggedIn)?_c('div',[_c('i',{staticClass:\"button-icon icon-retweet\",class:_vm.classes,attrs:{\"title\":_vm.$t('tool_tip.repeat')}}),_vm._v(\" \"),(!_vm.mergedConfig.hidePostStats && _vm.status.repeat_num > 0)?_c('span',[_vm._v(_vm._s(_vm.status.repeat_num))]):_vm._e()]):_vm._e()}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import Popover from '../popover/popover.vue'\n\nconst ExtraButtons = {\n props: [ 'status' ],\n components: { Popover },\n methods: {\n deleteStatus () {\n const confirmed = window.confirm(this.$t('status.delete_confirm'))\n if (confirmed) {\n this.$store.dispatch('deleteStatus', { id: this.status.id })\n }\n },\n pinStatus () {\n this.$store.dispatch('pinStatus', this.status.id)\n .then(() => this.$emit('onSuccess'))\n .catch(err => this.$emit('onError', err.error.error))\n },\n unpinStatus () {\n this.$store.dispatch('unpinStatus', this.status.id)\n .then(() => this.$emit('onSuccess'))\n .catch(err => this.$emit('onError', err.error.error))\n },\n muteConversation () {\n this.$store.dispatch('muteConversation', this.status.id)\n .then(() => this.$emit('onSuccess'))\n .catch(err => this.$emit('onError', err.error.error))\n },\n unmuteConversation () {\n this.$store.dispatch('unmuteConversation', this.status.id)\n .then(() => this.$emit('onSuccess'))\n .catch(err => this.$emit('onError', err.error.error))\n },\n copyLink () {\n navigator.clipboard.writeText(this.statusLink)\n .then(() => this.$emit('onSuccess'))\n .catch(err => this.$emit('onError', err.error.error))\n },\n bookmarkStatus () {\n this.$store.dispatch('bookmark', { id: this.status.id })\n .then(() => this.$emit('onSuccess'))\n .catch(err => this.$emit('onError', err.error.error))\n },\n unbookmarkStatus () {\n this.$store.dispatch('unbookmark', { id: this.status.id })\n .then(() => this.$emit('onSuccess'))\n .catch(err => this.$emit('onError', err.error.error))\n }\n },\n computed: {\n currentUser () { return this.$store.state.users.currentUser },\n canDelete () {\n if (!this.currentUser) { return }\n const superuser = this.currentUser.rights.moderator || this.currentUser.rights.admin\n return superuser || this.status.user.id === this.currentUser.id\n },\n ownStatus () {\n return this.status.user.id === this.currentUser.id\n },\n canPin () {\n return this.ownStatus && (this.status.visibility === 'public' || this.status.visibility === 'unlisted')\n },\n canMute () {\n return !!this.currentUser\n },\n statusLink () {\n return `${this.$store.state.instance.server}${this.$router.resolve({ name: 'conversation', params: { id: this.status.id } }).href}`\n }\n }\n}\n\nexport default ExtraButtons\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./extra_buttons.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./extra_buttons.js\"\nimport __vue_script__ from \"!!babel-loader!./extra_buttons.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-2d820a60\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./extra_buttons.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Popover',{staticClass:\"extra-button-popover\",attrs:{\"trigger\":\"click\",\"placement\":\"top\",\"bound-to\":{ x: 'container' }},scopedSlots:_vm._u([{key:\"content\",fn:function(ref){\nvar close = ref.close;\nreturn _c('div',{},[_c('div',{staticClass:\"dropdown-menu\"},[(_vm.canMute && !_vm.status.thread_muted)?_c('button',{staticClass:\"dropdown-item dropdown-item-icon\",on:{\"click\":function($event){$event.preventDefault();return _vm.muteConversation($event)}}},[_c('i',{staticClass:\"icon-eye-off\"}),_c('span',[_vm._v(_vm._s(_vm.$t(\"status.mute_conversation\")))])]):_vm._e(),_vm._v(\" \"),(_vm.canMute && _vm.status.thread_muted)?_c('button',{staticClass:\"dropdown-item dropdown-item-icon\",on:{\"click\":function($event){$event.preventDefault();return _vm.unmuteConversation($event)}}},[_c('i',{staticClass:\"icon-eye-off\"}),_c('span',[_vm._v(_vm._s(_vm.$t(\"status.unmute_conversation\")))])]):_vm._e(),_vm._v(\" \"),(!_vm.status.pinned && _vm.canPin)?_c('button',{staticClass:\"dropdown-item dropdown-item-icon\",on:{\"click\":[function($event){$event.preventDefault();return _vm.pinStatus($event)},close]}},[_c('i',{staticClass:\"icon-pin\"}),_c('span',[_vm._v(_vm._s(_vm.$t(\"status.pin\")))])]):_vm._e(),_vm._v(\" \"),(_vm.status.pinned && _vm.canPin)?_c('button',{staticClass:\"dropdown-item dropdown-item-icon\",on:{\"click\":[function($event){$event.preventDefault();return _vm.unpinStatus($event)},close]}},[_c('i',{staticClass:\"icon-pin\"}),_c('span',[_vm._v(_vm._s(_vm.$t(\"status.unpin\")))])]):_vm._e(),_vm._v(\" \"),(!_vm.status.bookmarked)?_c('button',{staticClass:\"dropdown-item dropdown-item-icon\",on:{\"click\":[function($event){$event.preventDefault();return _vm.bookmarkStatus($event)},close]}},[_c('i',{staticClass:\"icon-bookmark-empty\"}),_c('span',[_vm._v(_vm._s(_vm.$t(\"status.bookmark\")))])]):_vm._e(),_vm._v(\" \"),(_vm.status.bookmarked)?_c('button',{staticClass:\"dropdown-item dropdown-item-icon\",on:{\"click\":[function($event){$event.preventDefault();return _vm.unbookmarkStatus($event)},close]}},[_c('i',{staticClass:\"icon-bookmark\"}),_c('span',[_vm._v(_vm._s(_vm.$t(\"status.unbookmark\")))])]):_vm._e(),_vm._v(\" \"),(_vm.canDelete)?_c('button',{staticClass:\"dropdown-item dropdown-item-icon\",on:{\"click\":[function($event){$event.preventDefault();return _vm.deleteStatus($event)},close]}},[_c('i',{staticClass:\"icon-cancel\"}),_c('span',[_vm._v(_vm._s(_vm.$t(\"status.delete\")))])]):_vm._e(),_vm._v(\" \"),_c('button',{staticClass:\"dropdown-item dropdown-item-icon\",on:{\"click\":[function($event){$event.preventDefault();return _vm.copyLink($event)},close]}},[_c('i',{staticClass:\"icon-share\"}),_c('span',[_vm._v(_vm._s(_vm.$t(\"status.copy_link\")))])])])])}}])},[_vm._v(\" \"),_c('i',{staticClass:\"icon-ellipsis button-icon\",attrs:{\"slot\":\"trigger\"},slot:\"trigger\"})])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import { find } from 'lodash'\n\nconst StatusPopover = {\n name: 'StatusPopover',\n props: [\n 'statusId'\n ],\n data () {\n return {\n error: false\n }\n },\n computed: {\n status () {\n return find(this.$store.state.statuses.allStatuses, { id: this.statusId })\n }\n },\n components: {\n Status: () => import('../status/status.vue'),\n Popover: () => import('../popover/popover.vue')\n },\n methods: {\n enter () {\n if (!this.status) {\n if (!this.statusId) {\n this.error = true\n return\n }\n this.$store.dispatch('fetchStatus', this.statusId)\n .then(data => (this.error = false))\n .catch(e => (this.error = true))\n }\n }\n }\n}\n\nexport default StatusPopover\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./status_popover.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./status_popover.js\"\nimport __vue_script__ from \"!!babel-loader!./status_popover.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-1ce08f47\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./status_popover.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Popover',{attrs:{\"trigger\":\"hover\",\"popover-class\":\"popover-default status-popover\",\"bound-to\":{ x: 'container' }},on:{\"show\":_vm.enter}},[_c('template',{slot:\"trigger\"},[_vm._t(\"default\")],2),_vm._v(\" \"),_c('div',{attrs:{\"slot\":\"content\"},slot:\"content\"},[(_vm.status)?_c('Status',{attrs:{\"is-preview\":true,\"statusoid\":_vm.status,\"compact\":true}}):(_vm.error)?_c('div',{staticClass:\"status-preview-no-content faint\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('status.status_unavailable'))+\"\\n \")]):_c('div',{staticClass:\"status-preview-no-content\"},[_c('i',{staticClass:\"icon-spin4 animate-spin\"})])],1)],2)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","\nconst UserListPopover = {\n name: 'UserListPopover',\n props: [\n 'users'\n ],\n components: {\n Popover: () => import('../popover/popover.vue'),\n UserAvatar: () => import('../user_avatar/user_avatar.vue')\n },\n computed: {\n usersCapped () {\n return this.users.slice(0, 16)\n }\n }\n}\n\nexport default UserListPopover\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./user_list_popover.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./user_list_popover.js\"\nimport __vue_script__ from \"!!babel-loader!./user_list_popover.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-3dc4669d\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./user_list_popover.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Popover',{attrs:{\"trigger\":\"hover\",\"placement\":\"top\",\"offset\":{ y: 5 }}},[_c('template',{slot:\"trigger\"},[_vm._t(\"default\")],2),_vm._v(\" \"),_c('div',{staticClass:\"user-list-popover\",attrs:{\"slot\":\"content\"},slot:\"content\"},[(_vm.users.length)?_c('div',_vm._l((_vm.usersCapped),function(user){return _c('div',{key:user.id,staticClass:\"user-list-row\"},[_c('UserAvatar',{staticClass:\"avatar-small\",attrs:{\"user\":user,\"compact\":true}}),_vm._v(\" \"),_c('div',{staticClass:\"user-list-names\"},[_c('span',{domProps:{\"innerHTML\":_vm._s(user.name_html)}}),_vm._v(\" \"),_c('span',{staticClass:\"user-list-screen-name\"},[_vm._v(_vm._s(user.screen_name))])])],1)}),0):_c('div',[_c('i',{staticClass:\"icon-spin4 animate-spin\"})])])],2)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import UserAvatar from '../user_avatar/user_avatar.vue'\nimport UserListPopover from '../user_list_popover/user_list_popover.vue'\n\nconst EMOJI_REACTION_COUNT_CUTOFF = 12\n\nconst EmojiReactions = {\n name: 'EmojiReactions',\n components: {\n UserAvatar,\n UserListPopover\n },\n props: ['status'],\n data: () => ({\n showAll: false\n }),\n computed: {\n tooManyReactions () {\n return this.status.emoji_reactions.length > EMOJI_REACTION_COUNT_CUTOFF\n },\n emojiReactions () {\n return this.showAll\n ? this.status.emoji_reactions\n : this.status.emoji_reactions.slice(0, EMOJI_REACTION_COUNT_CUTOFF)\n },\n showMoreString () {\n return `+${this.status.emoji_reactions.length - EMOJI_REACTION_COUNT_CUTOFF}`\n },\n accountsForEmoji () {\n return this.status.emoji_reactions.reduce((acc, reaction) => {\n acc[reaction.name] = reaction.accounts || []\n return acc\n }, {})\n },\n loggedIn () {\n return !!this.$store.state.users.currentUser\n }\n },\n methods: {\n toggleShowAll () {\n this.showAll = !this.showAll\n },\n reactedWith (emoji) {\n return this.status.emoji_reactions.find(r => r.name === emoji).me\n },\n fetchEmojiReactionsByIfMissing () {\n const hasNoAccounts = this.status.emoji_reactions.find(r => !r.accounts)\n if (hasNoAccounts) {\n this.$store.dispatch('fetchEmojiReactionsBy', this.status.id)\n }\n },\n reactWith (emoji) {\n this.$store.dispatch('reactWithEmoji', { id: this.status.id, emoji })\n },\n unreact (emoji) {\n this.$store.dispatch('unreactWithEmoji', { id: this.status.id, emoji })\n },\n emojiOnClick (emoji, event) {\n if (!this.loggedIn) return\n\n if (this.reactedWith(emoji)) {\n this.unreact(emoji)\n } else {\n this.reactWith(emoji)\n }\n }\n }\n}\n\nexport default EmojiReactions\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./emoji_reactions.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./emoji_reactions.js\"\nimport __vue_script__ from \"!!babel-loader!./emoji_reactions.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-342ef24c\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./emoji_reactions.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"emoji-reactions\"},[_vm._l((_vm.emojiReactions),function(reaction){return _c('UserListPopover',{key:reaction.name,attrs:{\"users\":_vm.accountsForEmoji[reaction.name]}},[_c('button',{staticClass:\"emoji-reaction btn btn-default\",class:{ 'picked-reaction': _vm.reactedWith(reaction.name), 'not-clickable': !_vm.loggedIn },on:{\"click\":function($event){return _vm.emojiOnClick(reaction.name, $event)},\"mouseenter\":function($event){return _vm.fetchEmojiReactionsByIfMissing()}}},[_c('span',{staticClass:\"reaction-emoji\"},[_vm._v(_vm._s(reaction.name))]),_vm._v(\" \"),_c('span',[_vm._v(_vm._s(reaction.count))])])])}),_vm._v(\" \"),(_vm.tooManyReactions)?_c('a',{staticClass:\"emoji-reaction-expand faint\",attrs:{\"href\":\"javascript:void(0)\"},on:{\"click\":_vm.toggleShowAll}},[_vm._v(\"\\n \"+_vm._s(_vm.showAll ? _vm.$t('general.show_less') : _vm.showMoreString)+\"\\n \")]):_vm._e()],2)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import FavoriteButton from '../favorite_button/favorite_button.vue'\nimport ReactButton from '../react_button/react_button.vue'\nimport RetweetButton from '../retweet_button/retweet_button.vue'\nimport ExtraButtons from '../extra_buttons/extra_buttons.vue'\nimport PostStatusForm from '../post_status_form/post_status_form.vue'\nimport UserCard from '../user_card/user_card.vue'\nimport UserAvatar from '../user_avatar/user_avatar.vue'\nimport AvatarList from '../avatar_list/avatar_list.vue'\nimport Timeago from '../timeago/timeago.vue'\nimport StatusContent from '../status_content/status_content.vue'\nimport StatusPopover from '../status_popover/status_popover.vue'\nimport UserListPopover from '../user_list_popover/user_list_popover.vue'\nimport EmojiReactions from '../emoji_reactions/emoji_reactions.vue'\nimport generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'\nimport { highlightClass, highlightStyle } from '../../services/user_highlighter/user_highlighter.js'\nimport { muteWordHits } from '../../services/status_parser/status_parser.js'\nimport { unescape, uniqBy } from 'lodash'\nimport { mapGetters, mapState } from 'vuex'\n\nconst Status = {\n name: 'Status',\n components: {\n FavoriteButton,\n ReactButton,\n RetweetButton,\n ExtraButtons,\n PostStatusForm,\n UserCard,\n UserAvatar,\n AvatarList,\n Timeago,\n StatusPopover,\n UserListPopover,\n EmojiReactions,\n StatusContent\n },\n props: [\n 'statusoid',\n 'expandable',\n 'inConversation',\n 'focused',\n 'highlight',\n 'compact',\n 'replies',\n 'isPreview',\n 'noHeading',\n 'inlineExpanded',\n 'showPinned',\n 'inProfile',\n 'profileUserId'\n ],\n data () {\n return {\n replying: false,\n unmuted: false,\n userExpanded: false,\n error: null\n }\n },\n computed: {\n muteWords () {\n return this.mergedConfig.muteWords\n },\n showReasonMutedThread () {\n return (\n this.status.thread_muted ||\n (this.status.reblog && this.status.reblog.thread_muted)\n ) && !this.inConversation\n },\n repeaterClass () {\n const user = this.statusoid.user\n return highlightClass(user)\n },\n userClass () {\n const user = this.retweet ? (this.statusoid.retweeted_status.user) : this.statusoid.user\n return highlightClass(user)\n },\n deleted () {\n return this.statusoid.deleted\n },\n repeaterStyle () {\n const user = this.statusoid.user\n const highlight = this.mergedConfig.highlight\n return highlightStyle(highlight[user.screen_name])\n },\n userStyle () {\n if (this.noHeading) return\n const user = this.retweet ? (this.statusoid.retweeted_status.user) : this.statusoid.user\n const highlight = this.mergedConfig.highlight\n return highlightStyle(highlight[user.screen_name])\n },\n userProfileLink () {\n return this.generateUserProfileLink(this.status.user.id, this.status.user.screen_name)\n },\n replyProfileLink () {\n if (this.isReply) {\n return this.generateUserProfileLink(this.status.in_reply_to_user_id, this.replyToName)\n }\n },\n retweet () { return !!this.statusoid.retweeted_status },\n retweeter () { return this.statusoid.user.name || this.statusoid.user.screen_name },\n retweeterHtml () { return this.statusoid.user.name_html },\n retweeterProfileLink () { return this.generateUserProfileLink(this.statusoid.user.id, this.statusoid.user.screen_name) },\n status () {\n if (this.retweet) {\n return this.statusoid.retweeted_status\n } else {\n return this.statusoid\n }\n },\n statusFromGlobalRepository () {\n // NOTE: Consider to replace status with statusFromGlobalRepository\n return this.$store.state.statuses.allStatusesObject[this.status.id]\n },\n loggedIn () {\n return !!this.currentUser\n },\n muteWordHits () {\n return muteWordHits(this.status, this.muteWords)\n },\n muted () {\n const { status } = this\n const { reblog } = status\n const relationship = this.$store.getters.relationship(status.user.id)\n const relationshipReblog = reblog && this.$store.getters.relationship(reblog.user.id)\n const reasonsToMute = (\n // Post is muted according to BE\n status.muted ||\n // Reprööt of a muted post according to BE\n (reblog && reblog.muted) ||\n // Muted user\n relationship.muting ||\n // Muted user of a reprööt\n (relationshipReblog && relationshipReblog.muting) ||\n // Thread is muted\n status.thread_muted ||\n // Wordfiltered\n this.muteWordHits.length > 0\n )\n const excusesNotToMute = (\n (\n this.inProfile && (\n // Don't mute user's posts on user timeline (except reblogs)\n (!reblog && status.user.id === this.profileUserId) ||\n // Same as above but also allow self-reblogs\n (reblog && reblog.user.id === this.profileUserId)\n )\n ) ||\n // Don't mute statuses in muted conversation when said conversation is opened\n (this.inConversation && status.thread_muted)\n // No excuses if post has muted words\n ) && !this.muteWordHits.length > 0\n\n return !this.unmuted && !excusesNotToMute && reasonsToMute\n },\n hideFilteredStatuses () {\n return this.mergedConfig.hideFilteredStatuses\n },\n hideStatus () {\n return this.deleted || (this.muted && this.hideFilteredStatuses)\n },\n isFocused () {\n // retweet or root of an expanded conversation\n if (this.focused) {\n return true\n } else if (!this.inConversation) {\n return false\n }\n // use conversation highlight only when in conversation\n return this.status.id === this.highlight\n },\n isReply () {\n return !!(this.status.in_reply_to_status_id && this.status.in_reply_to_user_id)\n },\n replyToName () {\n if (this.status.in_reply_to_screen_name) {\n return this.status.in_reply_to_screen_name\n } else {\n const user = this.$store.getters.findUser(this.status.in_reply_to_user_id)\n return user && user.screen_name\n }\n },\n replySubject () {\n if (!this.status.summary) return ''\n const decodedSummary = unescape(this.status.summary)\n const behavior = this.mergedConfig.subjectLineBehavior\n const startsWithRe = decodedSummary.match(/^re[: ]/i)\n if ((behavior !== 'noop' && startsWithRe) || behavior === 'masto') {\n return decodedSummary\n } else if (behavior === 'email') {\n return 're: '.concat(decodedSummary)\n } else if (behavior === 'noop') {\n return ''\n }\n },\n combinedFavsAndRepeatsUsers () {\n // Use the status from the global status repository since favs and repeats are saved in it\n const combinedUsers = [].concat(\n this.statusFromGlobalRepository.favoritedBy,\n this.statusFromGlobalRepository.rebloggedBy\n )\n return uniqBy(combinedUsers, 'id')\n },\n tags () {\n return this.status.tags.filter(tagObj => tagObj.hasOwnProperty('name')).map(tagObj => tagObj.name).join(' ')\n },\n hidePostStats () {\n return this.mergedConfig.hidePostStats\n },\n ...mapGetters(['mergedConfig']),\n ...mapState({\n betterShadow: state => state.interface.browserSupport.cssFilter,\n currentUser: state => state.users.currentUser\n })\n },\n methods: {\n visibilityIcon (visibility) {\n switch (visibility) {\n case 'private':\n return 'icon-lock'\n case 'unlisted':\n return 'icon-lock-open-alt'\n case 'direct':\n return 'icon-mail-alt'\n default:\n return 'icon-globe'\n }\n },\n showError (error) {\n this.error = error\n },\n clearError () {\n this.error = undefined\n },\n toggleReplying () {\n this.replying = !this.replying\n },\n gotoOriginal (id) {\n if (this.inConversation) {\n this.$emit('goto', id)\n }\n },\n toggleExpanded () {\n this.$emit('toggleExpanded')\n },\n toggleMute () {\n this.unmuted = !this.unmuted\n },\n toggleUserExpanded () {\n this.userExpanded = !this.userExpanded\n },\n generateUserProfileLink (id, name) {\n return generateProfileLink(id, name, this.$store.state.instance.restrictedNicknames)\n }\n },\n watch: {\n 'highlight': function (id) {\n if (this.status.id === id) {\n let rect = this.$el.getBoundingClientRect()\n if (rect.top < 100) {\n // Post is above screen, match its top to screen top\n window.scrollBy(0, rect.top - 100)\n } else if (rect.height >= (window.innerHeight - 50)) {\n // Post we want to see is taller than screen so match its top to screen top\n window.scrollBy(0, rect.top - 100)\n } else if (rect.bottom > window.innerHeight - 50) {\n // Post is below screen, match its bottom to screen bottom\n window.scrollBy(0, rect.bottom - window.innerHeight + 50)\n }\n }\n },\n 'status.repeat_num': function (num) {\n // refetch repeats when repeat_num is changed in any way\n if (this.isFocused && this.statusFromGlobalRepository.rebloggedBy && this.statusFromGlobalRepository.rebloggedBy.length !== num) {\n this.$store.dispatch('fetchRepeats', this.status.id)\n }\n },\n 'status.fave_num': function (num) {\n // refetch favs when fave_num is changed in any way\n if (this.isFocused && this.statusFromGlobalRepository.favoritedBy && this.statusFromGlobalRepository.favoritedBy.length !== num) {\n this.$store.dispatch('fetchFavs', this.status.id)\n }\n }\n },\n filters: {\n capitalize: function (str) {\n return str.charAt(0).toUpperCase() + str.slice(1)\n }\n }\n}\n\nexport default Status\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!./status.scss\")\n}\n/* script */\nexport * from \"!!babel-loader!./status.js\"\nimport __vue_script__ from \"!!babel-loader!./status.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-1b1157fc\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./status.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.hideStatus)?_c('div',{staticClass:\"Status\",class:[{ '-focused': _vm.isFocused }, { '-conversation': _vm.inlineExpanded }]},[(_vm.error)?_c('div',{staticClass:\"alert error\"},[_vm._v(\"\\n \"+_vm._s(_vm.error)+\"\\n \"),_c('i',{staticClass:\"button-icon icon-cancel\",on:{\"click\":_vm.clearError}})]):_vm._e(),_vm._v(\" \"),(_vm.muted && !_vm.isPreview)?[_c('div',{staticClass:\"status-csontainer muted\"},[_c('small',{staticClass:\"status-username\"},[(_vm.muted && _vm.retweet)?_c('i',{staticClass:\"button-icon icon-retweet\"}):_vm._e(),_vm._v(\" \"),_c('router-link',{attrs:{\"to\":_vm.userProfileLink}},[_vm._v(\"\\n \"+_vm._s(_vm.status.user.screen_name)+\"\\n \")])],1),_vm._v(\" \"),(_vm.showReasonMutedThread)?_c('small',{staticClass:\"mute-thread\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('status.thread_muted'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.showReasonMutedThread && _vm.muteWordHits.length > 0)?_c('small',{staticClass:\"mute-thread\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('status.thread_muted_and_words'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),_c('small',{staticClass:\"mute-words\",attrs:{\"title\":_vm.muteWordHits.join(', ')}},[_vm._v(\"\\n \"+_vm._s(_vm.muteWordHits.join(', '))+\"\\n \")]),_vm._v(\" \"),_c('a',{staticClass:\"unmute\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.toggleMute($event)}}},[_c('i',{staticClass:\"button-icon icon-eye-off\"})])])]:[(_vm.showPinned)?_c('div',{staticClass:\"pin\"},[_c('i',{staticClass:\"fa icon-pin faint\"}),_vm._v(\" \"),_c('span',{staticClass:\"faint\"},[_vm._v(_vm._s(_vm.$t('status.pinned')))])]):_vm._e(),_vm._v(\" \"),(_vm.retweet && !_vm.noHeading && !_vm.inConversation)?_c('div',{staticClass:\"status-container repeat-info\",class:[_vm.repeaterClass, { highlighted: _vm.repeaterStyle }],style:([_vm.repeaterStyle])},[(_vm.retweet)?_c('UserAvatar',{staticClass:\"left-side repeater-avatar\",attrs:{\"better-shadow\":_vm.betterShadow,\"user\":_vm.statusoid.user}}):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"right-side faint\"},[_c('span',{staticClass:\"status-username repeater-name\",attrs:{\"title\":_vm.retweeter}},[(_vm.retweeterHtml)?_c('router-link',{attrs:{\"to\":_vm.retweeterProfileLink},domProps:{\"innerHTML\":_vm._s(_vm.retweeterHtml)}}):_c('router-link',{attrs:{\"to\":_vm.retweeterProfileLink}},[_vm._v(_vm._s(_vm.retweeter))])],1),_vm._v(\" \"),_c('i',{staticClass:\"fa icon-retweet retweeted\",attrs:{\"title\":_vm.$t('tool_tip.repeat')}}),_vm._v(\"\\n \"+_vm._s(_vm.$t('timeline.repeated'))+\"\\n \")])],1):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"status-container\",class:[_vm.userClass, { highlighted: _vm.userStyle, '-repeat': _vm.retweet && !_vm.inConversation }],style:([ _vm.userStyle ]),attrs:{\"data-tags\":_vm.tags}},[(!_vm.noHeading)?_c('div',{staticClass:\"left-side\"},[_c('router-link',{attrs:{\"to\":_vm.userProfileLink},nativeOn:{\"!click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.toggleUserExpanded($event)}}},[_c('UserAvatar',{attrs:{\"compact\":_vm.compact,\"better-shadow\":_vm.betterShadow,\"user\":_vm.status.user}})],1)],1):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"right-side\"},[(_vm.userExpanded)?_c('UserCard',{staticClass:\"usercard\",attrs:{\"user-id\":_vm.status.user.id,\"rounded\":true,\"bordered\":true}}):_vm._e(),_vm._v(\" \"),(!_vm.noHeading)?_c('div',{staticClass:\"status-heading\"},[_c('div',{staticClass:\"heading-name-row\"},[_c('div',{staticClass:\"heading-left\"},[(_vm.status.user.name_html)?_c('h4',{staticClass:\"status-username\",attrs:{\"title\":_vm.status.user.name},domProps:{\"innerHTML\":_vm._s(_vm.status.user.name_html)}}):_c('h4',{staticClass:\"status-username\",attrs:{\"title\":_vm.status.user.name}},[_vm._v(\"\\n \"+_vm._s(_vm.status.user.name)+\"\\n \")]),_vm._v(\" \"),_c('router-link',{staticClass:\"account-name\",attrs:{\"title\":_vm.status.user.screen_name,\"to\":_vm.userProfileLink}},[_vm._v(\"\\n \"+_vm._s(_vm.status.user.screen_name)+\"\\n \")]),_vm._v(\" \"),(!!(_vm.status.user && _vm.status.user.favicon))?_c('img',{staticClass:\"status-favicon\",attrs:{\"src\":_vm.status.user.favicon}}):_vm._e()],1),_vm._v(\" \"),_c('span',{staticClass:\"heading-right\"},[_c('router-link',{staticClass:\"timeago faint-link\",attrs:{\"to\":{ name: 'conversation', params: { id: _vm.status.id } }}},[_c('Timeago',{attrs:{\"time\":_vm.status.created_at,\"auto-update\":60}})],1),_vm._v(\" \"),(_vm.status.visibility)?_c('div',{staticClass:\"button-icon visibility-icon\"},[_c('i',{class:_vm.visibilityIcon(_vm.status.visibility),attrs:{\"title\":_vm._f(\"capitalize\")(_vm.status.visibility)}})]):_vm._e(),_vm._v(\" \"),(!_vm.status.is_local && !_vm.isPreview)?_c('a',{staticClass:\"source_url\",attrs:{\"href\":_vm.status.external_url,\"target\":\"_blank\",\"title\":\"Source\"}},[_c('i',{staticClass:\"button-icon icon-link-ext-alt\"})]):_vm._e(),_vm._v(\" \"),(_vm.expandable && !_vm.isPreview)?[_c('a',{attrs:{\"href\":\"#\",\"title\":\"Expand\"},on:{\"click\":function($event){$event.preventDefault();return _vm.toggleExpanded($event)}}},[_c('i',{staticClass:\"button-icon icon-plus-squared\"})])]:_vm._e(),_vm._v(\" \"),(_vm.unmuted)?_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.toggleMute($event)}}},[_c('i',{staticClass:\"button-icon icon-eye-off\"})]):_vm._e()],2)]),_vm._v(\" \"),_c('div',{staticClass:\"heading-reply-row\"},[(_vm.isReply)?_c('div',{staticClass:\"reply-to-and-accountname\"},[(!_vm.isPreview)?_c('StatusPopover',{staticClass:\"reply-to-popover\",class:{ '-strikethrough': !_vm.status.parent_visible },staticStyle:{\"min-width\":\"0\"},attrs:{\"status-id\":_vm.status.parent_visible && _vm.status.in_reply_to_status_id}},[_c('a',{staticClass:\"reply-to\",attrs:{\"href\":\"#\",\"aria-label\":_vm.$t('tool_tip.reply')},on:{\"click\":function($event){$event.preventDefault();return _vm.gotoOriginal(_vm.status.in_reply_to_status_id)}}},[_c('i',{staticClass:\"button-icon reply-button icon-reply\"}),_vm._v(\" \"),_c('span',{staticClass:\"faint-link reply-to-text\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('status.reply_to'))+\"\\n \")])])]):_c('span',{staticClass:\"reply-to-no-popover\"},[_c('span',{staticClass:\"reply-to-text\"},[_vm._v(_vm._s(_vm.$t('status.reply_to')))])]),_vm._v(\" \"),_c('router-link',{staticClass:\"reply-to-link\",attrs:{\"title\":_vm.replyToName,\"to\":_vm.replyProfileLink}},[_vm._v(\"\\n \"+_vm._s(_vm.replyToName)+\"\\n \")]),_vm._v(\" \"),(_vm.replies && _vm.replies.length)?_c('span',{staticClass:\"faint replies-separator\"},[_vm._v(\"\\n -\\n \")]):_vm._e()],1):_vm._e(),_vm._v(\" \"),(_vm.inConversation && !_vm.isPreview && _vm.replies && _vm.replies.length)?_c('div',{staticClass:\"replies\"},[_c('span',{staticClass:\"faint\"},[_vm._v(_vm._s(_vm.$t('status.replies_list')))]),_vm._v(\" \"),_vm._l((_vm.replies),function(reply){return _c('StatusPopover',{key:reply.id,attrs:{\"status-id\":reply.id}},[_c('a',{staticClass:\"reply-link\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.gotoOriginal(reply.id)}}},[_vm._v(_vm._s(reply.name))])])})],2):_vm._e()])]):_vm._e(),_vm._v(\" \"),_c('StatusContent',{attrs:{\"status\":_vm.status,\"no-heading\":_vm.noHeading,\"highlight\":_vm.highlight,\"focused\":_vm.isFocused}}),_vm._v(\" \"),_c('transition',{attrs:{\"name\":\"fade\"}},[(!_vm.hidePostStats && _vm.isFocused && _vm.combinedFavsAndRepeatsUsers.length > 0)?_c('div',{staticClass:\"favs-repeated-users\"},[_c('div',{staticClass:\"stats\"},[(_vm.statusFromGlobalRepository.rebloggedBy && _vm.statusFromGlobalRepository.rebloggedBy.length > 0)?_c('UserListPopover',{attrs:{\"users\":_vm.statusFromGlobalRepository.rebloggedBy}},[_c('div',{staticClass:\"stat-count\"},[_c('a',{staticClass:\"stat-title\"},[_vm._v(_vm._s(_vm.$t('status.repeats')))]),_vm._v(\" \"),_c('div',{staticClass:\"stat-number\"},[_vm._v(\"\\n \"+_vm._s(_vm.statusFromGlobalRepository.rebloggedBy.length)+\"\\n \")])])]):_vm._e(),_vm._v(\" \"),(_vm.statusFromGlobalRepository.favoritedBy && _vm.statusFromGlobalRepository.favoritedBy.length > 0)?_c('UserListPopover',{attrs:{\"users\":_vm.statusFromGlobalRepository.favoritedBy}},[_c('div',{staticClass:\"stat-count\"},[_c('a',{staticClass:\"stat-title\"},[_vm._v(_vm._s(_vm.$t('status.favorites')))]),_vm._v(\" \"),_c('div',{staticClass:\"stat-number\"},[_vm._v(\"\\n \"+_vm._s(_vm.statusFromGlobalRepository.favoritedBy.length)+\"\\n \")])])]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"avatar-row\"},[_c('AvatarList',{attrs:{\"users\":_vm.combinedFavsAndRepeatsUsers}})],1)],1)]):_vm._e()]),_vm._v(\" \"),((_vm.mergedConfig.emojiReactionsOnTimeline || _vm.isFocused) && (!_vm.noHeading && !_vm.isPreview))?_c('EmojiReactions',{attrs:{\"status\":_vm.status}}):_vm._e(),_vm._v(\" \"),(!_vm.noHeading && !_vm.isPreview)?_c('div',{staticClass:\"status-actions\"},[_c('div',[(_vm.loggedIn)?_c('i',{staticClass:\"button-icon button-reply icon-reply\",class:{'-active': _vm.replying},attrs:{\"title\":_vm.$t('tool_tip.reply')},on:{\"click\":function($event){$event.preventDefault();return _vm.toggleReplying($event)}}}):_c('i',{staticClass:\"button-icon button-reply -disabled icon-reply\",attrs:{\"title\":_vm.$t('tool_tip.reply')}}),_vm._v(\" \"),(_vm.status.replies_count > 0)?_c('span',[_vm._v(_vm._s(_vm.status.replies_count))]):_vm._e()]),_vm._v(\" \"),_c('retweet-button',{attrs:{\"visibility\":_vm.status.visibility,\"logged-in\":_vm.loggedIn,\"status\":_vm.status}}),_vm._v(\" \"),_c('favorite-button',{attrs:{\"logged-in\":_vm.loggedIn,\"status\":_vm.status}}),_vm._v(\" \"),(_vm.loggedIn)?_c('ReactButton',{attrs:{\"status\":_vm.status}}):_vm._e(),_vm._v(\" \"),_c('extra-buttons',{attrs:{\"status\":_vm.status},on:{\"onError\":_vm.showError,\"onSuccess\":_vm.clearError}})],1):_vm._e()],1)]),_vm._v(\" \"),(_vm.replying)?_c('div',{staticClass:\"status-container reply-form\"},[_c('PostStatusForm',{staticClass:\"reply-body\",attrs:{\"reply-to\":_vm.status.id,\"attentions\":_vm.status.attentions,\"replied-user\":_vm.status.user,\"copy-message-scope\":_vm.status.visibility,\"subject\":_vm.replySubject},on:{\"posted\":_vm.toggleReplying}})],1):_vm._e()]],2):_vm._e()}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import Timeago from '../timeago/timeago.vue'\nimport { forEach, map } from 'lodash'\n\nexport default {\n name: 'Poll',\n props: ['basePoll'],\n components: { Timeago },\n data () {\n return {\n loading: false,\n choices: []\n }\n },\n created () {\n if (!this.$store.state.polls.pollsObject[this.pollId]) {\n this.$store.dispatch('mergeOrAddPoll', this.basePoll)\n }\n this.$store.dispatch('trackPoll', this.pollId)\n },\n destroyed () {\n this.$store.dispatch('untrackPoll', this.pollId)\n },\n computed: {\n pollId () {\n return this.basePoll.id\n },\n poll () {\n const storePoll = this.$store.state.polls.pollsObject[this.pollId]\n return storePoll || {}\n },\n options () {\n return (this.poll && this.poll.options) || []\n },\n expiresAt () {\n return (this.poll && this.poll.expires_at) || 0\n },\n expired () {\n return (this.poll && this.poll.expired) || false\n },\n loggedIn () {\n return this.$store.state.users.currentUser\n },\n showResults () {\n return this.poll.voted || this.expired || !this.loggedIn\n },\n totalVotesCount () {\n return this.poll.votes_count\n },\n containerClass () {\n return {\n loading: this.loading\n }\n },\n choiceIndices () {\n // Convert array of booleans into an array of indices of the\n // items that were 'true', so [true, false, false, true] becomes\n // [0, 3].\n return this.choices\n .map((entry, index) => entry && index)\n .filter(value => typeof value === 'number')\n },\n isDisabled () {\n const noChoice = this.choiceIndices.length === 0\n return this.loading || noChoice\n }\n },\n methods: {\n percentageForOption (count) {\n return this.totalVotesCount === 0 ? 0 : Math.round(count / this.totalVotesCount * 100)\n },\n resultTitle (option) {\n return `${option.votes_count}/${this.totalVotesCount} ${this.$t('polls.votes')}`\n },\n fetchPoll () {\n this.$store.dispatch('refreshPoll', { id: this.statusId, pollId: this.poll.id })\n },\n activateOption (index) {\n // forgive me father: doing checking the radio/checkboxes\n // in code because of customized input elements need either\n // a) an extra element for the actual graphic, or b) use a\n // pseudo element for the label. We use b) which mandates\n // using \"for\" and \"id\" matching which isn't nice when the\n // same poll appears multiple times on the site (notifs and\n // timeline for example). With code we can make sure it just\n // works without altering the pseudo element implementation.\n const allElements = this.$el.querySelectorAll('input')\n const clickedElement = this.$el.querySelector(`input[value=\"${index}\"]`)\n if (this.poll.multiple) {\n // Checkboxes, toggle only the clicked one\n clickedElement.checked = !clickedElement.checked\n } else {\n // Radio button, uncheck everything and check the clicked one\n forEach(allElements, element => { element.checked = false })\n clickedElement.checked = true\n }\n this.choices = map(allElements, e => e.checked)\n },\n optionId (index) {\n return `poll${this.poll.id}-${index}`\n },\n vote () {\n if (this.choiceIndices.length === 0) return\n this.loading = true\n this.$store.dispatch(\n 'votePoll',\n { id: this.statusId, pollId: this.poll.id, choices: this.choiceIndices }\n ).then(poll => {\n this.loading = false\n })\n }\n }\n}\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./poll.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./poll.js\"\nimport __vue_script__ from \"!!babel-loader!./poll.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-95e3808e\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./poll.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"poll\",class:_vm.containerClass},[_vm._l((_vm.options),function(option,index){return _c('div',{key:index,staticClass:\"poll-option\"},[(_vm.showResults)?_c('div',{staticClass:\"option-result\",attrs:{\"title\":_vm.resultTitle(option)}},[_c('div',{staticClass:\"option-result-label\"},[_c('span',{staticClass:\"result-percentage\"},[_vm._v(\"\\n \"+_vm._s(_vm.percentageForOption(option.votes_count))+\"%\\n \")]),_vm._v(\" \"),_c('span',{domProps:{\"innerHTML\":_vm._s(option.title_html)}})]),_vm._v(\" \"),_c('div',{staticClass:\"result-fill\",style:({ 'width': ((_vm.percentageForOption(option.votes_count)) + \"%\") })})]):_c('div',{on:{\"click\":function($event){return _vm.activateOption(index)}}},[(_vm.poll.multiple)?_c('input',{attrs:{\"type\":\"checkbox\",\"disabled\":_vm.loading},domProps:{\"value\":index}}):_c('input',{attrs:{\"type\":\"radio\",\"disabled\":_vm.loading},domProps:{\"value\":index}}),_vm._v(\" \"),_c('label',{staticClass:\"option-vote\"},[_c('div',[_vm._v(_vm._s(option.title))])])])])}),_vm._v(\" \"),_c('div',{staticClass:\"footer faint\"},[(!_vm.showResults)?_c('button',{staticClass:\"btn btn-default poll-vote-button\",attrs:{\"type\":\"button\",\"disabled\":_vm.isDisabled},on:{\"click\":_vm.vote}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('polls.vote'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"total\"},[_vm._v(\"\\n \"+_vm._s(_vm.totalVotesCount)+\" \"+_vm._s(_vm.$t(\"polls.votes\"))+\" · \\n \")]),_vm._v(\" \"),_c('i18n',{attrs:{\"path\":_vm.expired ? 'polls.expired' : 'polls.expires_in'}},[_c('Timeago',{attrs:{\"time\":_vm.expiresAt,\"auto-update\":60,\"now-threshold\":0}})],1)],1)],2)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import Attachment from '../attachment/attachment.vue'\nimport Poll from '../poll/poll.vue'\nimport Gallery from '../gallery/gallery.vue'\nimport LinkPreview from '../link-preview/link-preview.vue'\nimport generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'\nimport fileType from 'src/services/file_type/file_type.service'\nimport { processHtml } from 'src/services/tiny_post_html_processor/tiny_post_html_processor.service.js'\nimport { mentionMatchesUrl, extractTagFromUrl } from 'src/services/matcher/matcher.service.js'\nimport { mapGetters, mapState } from 'vuex'\n\nconst StatusContent = {\n name: 'StatusContent',\n props: [\n 'status',\n 'focused',\n 'noHeading',\n 'fullContent',\n 'singleLine'\n ],\n data () {\n return {\n showingTall: this.fullContent || (this.inConversation && this.focused),\n showingLongSubject: false,\n // not as computed because it sets the initial state which will be changed later\n expandingSubject: !this.$store.getters.mergedConfig.collapseMessageWithSubject\n }\n },\n computed: {\n localCollapseSubjectDefault () {\n return this.mergedConfig.collapseMessageWithSubject\n },\n hideAttachments () {\n return (this.mergedConfig.hideAttachments && !this.inConversation) ||\n (this.mergedConfig.hideAttachmentsInConv && this.inConversation)\n },\n // This is a bit hacky, but we want to approximate post height before rendering\n // so we count newlines (masto uses

for paragraphs, GS uses
between them)\n // as well as approximate line count by counting characters and approximating ~80\n // per line.\n //\n // Using max-height + overflow: auto for status components resulted in false positives\n // very often with japanese characters, and it was very annoying.\n tallStatus () {\n const lengthScore = this.status.statusnet_html.split(/ 20\n },\n longSubject () {\n return this.status.summary.length > 240\n },\n // When a status has a subject and is also tall, we should only have one show more/less button. If the default is to collapse statuses with subjects, we just treat it like a status with a subject; otherwise, we just treat it like a tall status.\n mightHideBecauseSubject () {\n return !!this.status.summary && this.localCollapseSubjectDefault\n },\n mightHideBecauseTall () {\n return this.tallStatus && !(this.status.summary && this.localCollapseSubjectDefault)\n },\n hideSubjectStatus () {\n return this.mightHideBecauseSubject && !this.expandingSubject\n },\n hideTallStatus () {\n return this.mightHideBecauseTall && !this.showingTall\n },\n showingMore () {\n return (this.mightHideBecauseTall && this.showingTall) || (this.mightHideBecauseSubject && this.expandingSubject)\n },\n nsfwClickthrough () {\n if (!this.status.nsfw) {\n return false\n }\n if (this.status.summary && this.localCollapseSubjectDefault) {\n return false\n }\n return true\n },\n attachmentSize () {\n if ((this.mergedConfig.hideAttachments && !this.inConversation) ||\n (this.mergedConfig.hideAttachmentsInConv && this.inConversation) ||\n (this.status.attachments.length > this.maxThumbnails)) {\n return 'hide'\n } else if (this.compact) {\n return 'small'\n }\n return 'normal'\n },\n galleryTypes () {\n if (this.attachmentSize === 'hide') {\n return []\n }\n return this.mergedConfig.playVideosInModal\n ? ['image', 'video']\n : ['image']\n },\n galleryAttachments () {\n return this.status.attachments.filter(\n file => fileType.fileMatchesSomeType(this.galleryTypes, file)\n )\n },\n nonGalleryAttachments () {\n return this.status.attachments.filter(\n file => !fileType.fileMatchesSomeType(this.galleryTypes, file)\n )\n },\n attachmentTypes () {\n return this.status.attachments.map(file => fileType.fileType(file.mimetype))\n },\n maxThumbnails () {\n return this.mergedConfig.maxThumbnails\n },\n postBodyHtml () {\n const html = this.status.statusnet_html\n\n if (this.mergedConfig.greentext) {\n try {\n if (html.includes('>')) {\n // This checks if post has '>' at the beginning, excluding mentions so that @mention >impying works\n return processHtml(html, (string) => {\n if (string.includes('>') &&\n string\n .replace(/<[^>]+?>/gi, '') // remove all tags\n .replace(/@\\w+/gi, '') // remove mentions (even failed ones)\n .trim()\n .startsWith('>')) {\n return `${string}`\n } else {\n return string\n }\n })\n } else {\n return html\n }\n } catch (e) {\n console.err('Failed to process status html', e)\n return html\n }\n } else {\n return html\n }\n },\n ...mapGetters(['mergedConfig']),\n ...mapState({\n betterShadow: state => state.interface.browserSupport.cssFilter,\n currentUser: state => state.users.currentUser\n })\n },\n components: {\n Attachment,\n Poll,\n Gallery,\n LinkPreview\n },\n methods: {\n linkClicked (event) {\n const target = event.target.closest('.status-content a')\n if (target) {\n if (target.className.match(/mention/)) {\n const href = target.href\n const attn = this.status.attentions.find(attn => mentionMatchesUrl(attn, href))\n if (attn) {\n event.stopPropagation()\n event.preventDefault()\n const link = this.generateUserProfileLink(attn.id, attn.screen_name)\n this.$router.push(link)\n return\n }\n }\n if (target.rel.match(/(?:^|\\s)tag(?:$|\\s)/) || target.className.match(/hashtag/)) {\n // Extract tag name from dataset or link url\n const tag = target.dataset.tag || extractTagFromUrl(target.href)\n if (tag) {\n const link = this.generateTagLink(tag)\n this.$router.push(link)\n return\n }\n }\n window.open(target.href, '_blank')\n }\n },\n toggleShowMore () {\n if (this.mightHideBecauseTall) {\n this.showingTall = !this.showingTall\n } else if (this.mightHideBecauseSubject) {\n this.expandingSubject = !this.expandingSubject\n }\n },\n generateUserProfileLink (id, name) {\n return generateProfileLink(id, name, this.$store.state.instance.restrictedNicknames)\n },\n generateTagLink (tag) {\n return `/tag/${tag}`\n },\n setMedia () {\n const attachments = this.attachmentSize === 'hide' ? this.status.attachments : this.galleryAttachments\n return () => this.$store.dispatch('setMedia', attachments)\n }\n }\n}\n\nexport default StatusContent\n","/**\n * This is a tiny purpose-built HTML parser/processor. This basically detects any type of visual newline and\n * allows it to be processed, useful for greentexting, mostly\n *\n * known issue: doesn't handle CDATA so nested CDATA might not work well\n *\n * @param {Object} input - input data\n * @param {(string) => string} processor - function that will be called on every line\n * @return {string} processed html\n */\nexport const processHtml = (html, processor) => {\n const handledTags = new Set(['p', 'br', 'div'])\n const openCloseTags = new Set(['p', 'div'])\n\n let buffer = '' // Current output buffer\n const level = [] // How deep we are in tags and which tags were there\n let textBuffer = '' // Current line content\n let tagBuffer = null // Current tag buffer, if null = we are not currently reading a tag\n\n // Extracts tag name from tag, i.e. => span\n const getTagName = (tag) => {\n const result = /(?:<\\/(\\w+)>|<(\\w+)\\s?[^/]*?\\/?>)/gi.exec(tag)\n return result && (result[1] || result[2])\n }\n\n const flush = () => { // Processes current line buffer, adds it to output buffer and clears line buffer\n if (textBuffer.trim().length > 0) {\n buffer += processor(textBuffer)\n } else {\n buffer += textBuffer\n }\n textBuffer = ''\n }\n\n const handleBr = (tag) => { // handles single newlines/linebreaks/selfclosing\n flush()\n buffer += tag\n }\n\n const handleOpen = (tag) => { // handles opening tags\n flush()\n buffer += tag\n level.push(tag)\n }\n\n const handleClose = (tag) => { // handles closing tags\n flush()\n buffer += tag\n if (level[level.length - 1] === tag) {\n level.pop()\n }\n }\n\n for (let i = 0; i < html.length; i++) {\n const char = html[i]\n if (char === '<' && tagBuffer === null) {\n tagBuffer = char\n } else if (char !== '>' && tagBuffer !== null) {\n tagBuffer += char\n } else if (char === '>' && tagBuffer !== null) {\n tagBuffer += char\n const tagFull = tagBuffer\n tagBuffer = null\n const tagName = getTagName(tagFull)\n if (handledTags.has(tagName)) {\n if (tagName === 'br') {\n handleBr(tagFull)\n } else if (openCloseTags.has(tagName)) {\n if (tagFull[1] === '/') {\n handleClose(tagFull)\n } else if (tagFull[tagFull.length - 2] === '/') {\n // self-closing\n handleBr(tagFull)\n } else {\n handleOpen(tagFull)\n }\n }\n } else {\n textBuffer += tagFull\n }\n } else if (char === '\\n') {\n handleBr(char)\n } else {\n textBuffer += char\n }\n }\n if (tagBuffer) {\n textBuffer += tagBuffer\n }\n\n flush()\n\n return buffer\n}\n","export const mentionMatchesUrl = (attention, url) => {\n if (url === attention.statusnet_profile_url) {\n return true\n }\n const [namepart, instancepart] = attention.screen_name.split('@')\n const matchstring = new RegExp('://' + instancepart + '/.*' + namepart + '$', 'g')\n\n return !!url.match(matchstring)\n}\n\n/**\n * Extract tag name from pleroma or mastodon url.\n * i.e https://bikeshed.party/tag/photo or https://quey.org/tags/sky\n * @param {string} url\n */\nexport const extractTagFromUrl = (url) => {\n const regex = /tag[s]*\\/(\\w+)$/g\n const result = regex.exec(url)\n if (!result) {\n return false\n }\n return result[1]\n}\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./status_content.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./status_content.js\"\nimport __vue_script__ from \"!!babel-loader!./status_content.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-2a51d4c2\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./status_content.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"StatusContent\"},[_vm._t(\"header\"),_vm._v(\" \"),(_vm.status.summary_html)?_c('div',{staticClass:\"summary-wrapper\",class:{ 'tall-subject': (_vm.longSubject && !_vm.showingLongSubject) }},[_c('div',{staticClass:\"media-body summary\",domProps:{\"innerHTML\":_vm._s(_vm.status.summary_html)},on:{\"click\":function($event){$event.preventDefault();return _vm.linkClicked($event)}}}),_vm._v(\" \"),(_vm.longSubject && _vm.showingLongSubject)?_c('a',{staticClass:\"tall-subject-hider\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();_vm.showingLongSubject=false}}},[_vm._v(_vm._s(_vm.$t(\"status.hide_full_subject\")))]):(_vm.longSubject)?_c('a',{staticClass:\"tall-subject-hider\",class:{ 'tall-subject-hider_focused': _vm.focused },attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();_vm.showingLongSubject=true}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t(\"status.show_full_subject\"))+\"\\n \")]):_vm._e()]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"status-content-wrapper\",class:{'tall-status': _vm.hideTallStatus}},[(_vm.hideTallStatus)?_c('a',{staticClass:\"tall-status-hider\",class:{ 'tall-status-hider_focused': _vm.focused },attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.toggleShowMore($event)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t(\"general.show_more\"))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(!_vm.hideSubjectStatus)?_c('div',{staticClass:\"status-content media-body\",class:{ 'single-line': _vm.singleLine },domProps:{\"innerHTML\":_vm._s(_vm.postBodyHtml)},on:{\"click\":function($event){$event.preventDefault();return _vm.linkClicked($event)}}}):_vm._e(),_vm._v(\" \"),(_vm.hideSubjectStatus)?_c('a',{staticClass:\"cw-status-hider\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.toggleShowMore($event)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t(\"status.show_content\"))+\"\\n \"),(_vm.attachmentTypes.includes('image'))?_c('span',{staticClass:\"icon-picture\"}):_vm._e(),_vm._v(\" \"),(_vm.attachmentTypes.includes('video'))?_c('span',{staticClass:\"icon-video\"}):_vm._e(),_vm._v(\" \"),(_vm.attachmentTypes.includes('audio'))?_c('span',{staticClass:\"icon-music\"}):_vm._e(),_vm._v(\" \"),(_vm.attachmentTypes.includes('unknown'))?_c('span',{staticClass:\"icon-doc\"}):_vm._e(),_vm._v(\" \"),(_vm.status.poll && _vm.status.poll.options)?_c('span',{staticClass:\"icon-chart-bar\"}):_vm._e(),_vm._v(\" \"),(_vm.status.card)?_c('span',{staticClass:\"icon-link\"}):_vm._e()]):_vm._e(),_vm._v(\" \"),(_vm.showingMore && !_vm.fullContent)?_c('a',{staticClass:\"status-unhider\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.toggleShowMore($event)}}},[_vm._v(\"\\n \"+_vm._s(_vm.tallStatus ? _vm.$t(\"general.show_less\") : _vm.$t(\"status.hide_content\"))+\"\\n \")]):_vm._e()]),_vm._v(\" \"),(_vm.status.poll && _vm.status.poll.options && !_vm.hideSubjectStatus)?_c('div',[_c('poll',{attrs:{\"base-poll\":_vm.status.poll}})],1):_vm._e(),_vm._v(\" \"),(_vm.status.attachments.length !== 0 && (!_vm.hideSubjectStatus || _vm.showingLongSubject))?_c('div',{staticClass:\"attachments media-body\"},[_vm._l((_vm.nonGalleryAttachments),function(attachment){return _c('attachment',{key:attachment.id,staticClass:\"non-gallery\",attrs:{\"size\":_vm.attachmentSize,\"nsfw\":_vm.nsfwClickthrough,\"attachment\":attachment,\"allow-play\":true,\"set-media\":_vm.setMedia()}})}),_vm._v(\" \"),(_vm.galleryAttachments.length > 0)?_c('gallery',{attrs:{\"nsfw\":_vm.nsfwClickthrough,\"attachments\":_vm.galleryAttachments,\"set-media\":_vm.setMedia()}}):_vm._e()],2):_vm._e(),_vm._v(\" \"),(_vm.status.card && !_vm.hideSubjectStatus && !_vm.noHeading)?_c('div',{staticClass:\"link-preview media-body\"},[_c('link-preview',{attrs:{\"card\":_vm.status.card,\"size\":_vm.attachmentSize,\"nsfw\":_vm.nsfwClickthrough}})],1):_vm._e(),_vm._v(\" \"),_vm._t(\"footer\")],2)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","export const SECOND = 1000\nexport const MINUTE = 60 * SECOND\nexport const HOUR = 60 * MINUTE\nexport const DAY = 24 * HOUR\nexport const WEEK = 7 * DAY\nexport const MONTH = 30 * DAY\nexport const YEAR = 365.25 * DAY\n\nexport const relativeTime = (date, nowThreshold = 1) => {\n if (typeof date === 'string') date = Date.parse(date)\n const round = Date.now() > date ? Math.floor : Math.ceil\n const d = Math.abs(Date.now() - date)\n let r = { num: round(d / YEAR), key: 'time.years' }\n if (d < nowThreshold * SECOND) {\n r.num = 0\n r.key = 'time.now'\n } else if (d < MINUTE) {\n r.num = round(d / SECOND)\n r.key = 'time.seconds'\n } else if (d < HOUR) {\n r.num = round(d / MINUTE)\n r.key = 'time.minutes'\n } else if (d < DAY) {\n r.num = round(d / HOUR)\n r.key = 'time.hours'\n } else if (d < WEEK) {\n r.num = round(d / DAY)\n r.key = 'time.days'\n } else if (d < MONTH) {\n r.num = round(d / WEEK)\n r.key = 'time.weeks'\n } else if (d < YEAR) {\n r.num = round(d / MONTH)\n r.key = 'time.months'\n }\n // Remove plural form when singular\n if (r.num === 1) r.key = r.key.slice(0, -1)\n return r\n}\n\nexport const relativeTimeShort = (date, nowThreshold = 1) => {\n const r = relativeTime(date, nowThreshold)\n r.key += '_short'\n return r\n}\n","import UserCard from '../user_card/user_card.vue'\nimport UserAvatar from '../user_avatar/user_avatar.vue'\nimport generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'\n\nconst BasicUserCard = {\n props: [\n 'user'\n ],\n data () {\n return {\n userExpanded: false\n }\n },\n components: {\n UserCard,\n UserAvatar\n },\n methods: {\n toggleUserExpanded () {\n this.userExpanded = !this.userExpanded\n },\n userProfileLink (user) {\n return generateProfileLink(user.id, user.screen_name, this.$store.state.instance.restrictedNicknames)\n }\n }\n}\n\nexport default BasicUserCard\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./basic_user_card.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./basic_user_card.js\"\nimport __vue_script__ from \"!!babel-loader!./basic_user_card.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-4d2bc0bb\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./basic_user_card.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"basic-user-card\"},[_c('router-link',{attrs:{\"to\":_vm.userProfileLink(_vm.user)}},[_c('UserAvatar',{staticClass:\"avatar\",attrs:{\"user\":_vm.user},nativeOn:{\"click\":function($event){$event.preventDefault();return _vm.toggleUserExpanded($event)}}})],1),_vm._v(\" \"),(_vm.userExpanded)?_c('div',{staticClass:\"basic-user-card-expanded-content\"},[_c('UserCard',{attrs:{\"user-id\":_vm.user.id,\"rounded\":true,\"bordered\":true}})],1):_c('div',{staticClass:\"basic-user-card-collapsed-content\"},[_c('div',{staticClass:\"basic-user-card-user-name\",attrs:{\"title\":_vm.user.name}},[(_vm.user.name_html)?_c('span',{staticClass:\"basic-user-card-user-name-value\",domProps:{\"innerHTML\":_vm._s(_vm.user.name_html)}}):_c('span',{staticClass:\"basic-user-card-user-name-value\"},[_vm._v(_vm._s(_vm.user.name))])]),_vm._v(\" \"),_c('div',[_c('router-link',{staticClass:\"basic-user-card-screen-name\",attrs:{\"to\":_vm.userProfileLink(_vm.user)}},[_vm._v(\"\\n @\"+_vm._s(_vm.user.screen_name)+\"\\n \")])],1),_vm._v(\" \"),_vm._t(\"default\")],2)],1)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import { convert, brightness, contrastRatio } from 'chromatism'\nimport { alphaBlendLayers, getTextColor, relativeLuminance } from '../color_convert/color_convert.js'\nimport { LAYERS, DEFAULT_OPACITY, SLOT_INHERITANCE } from './pleromafe.js'\n\n/*\n * # What's all this?\n * Here be theme engine for pleromafe. All of this supposed to ease look\n * and feel customization, making widget styles and make developer's life\n * easier when it comes to supporting themes. Like many other theme systems\n * it operates on color definitions, or \"slots\" - for example you define\n * \"button\" color slot and then in UI component Button's CSS you refer to\n * it as a CSS3 Variable.\n *\n * Some applications allow you to customize colors for certain things.\n * Some UI toolkits allow you to define colors for each type of widget.\n * Most of them are pretty barebones and have no assistance for common\n * problems and cases, and in general themes themselves are very hard to\n * maintain in all aspects. This theme engine tries to solve all of the\n * common problems with themes.\n *\n * You don't have redefine several similar colors if you just want to\n * change one color - all color slots are derived from other ones, so you\n * can have at least one or two \"basic\" colors defined and have all other\n * components inherit and modify basic ones.\n *\n * You don't have to test contrast ratio for colors or pick text color for\n * each element even if you have light-on-dark elements in dark-on-light\n * theme.\n *\n * You don't have to maintain order of code for inheriting slots from othet\n * slots - dependency graph resolving does it for you.\n */\n\n/* This indicates that this version of code outputs similar theme data and\n * should be incremented if output changes - for instance if getTextColor\n * function changes and older themes no longer render text colors as\n * author intended previously.\n */\nexport const CURRENT_VERSION = 3\n\nexport const getLayersArray = (layer, data = LAYERS) => {\n let array = [layer]\n let parent = data[layer]\n while (parent) {\n array.unshift(parent)\n parent = data[parent]\n }\n return array\n}\n\nexport const getLayers = (layer, variant = layer, opacitySlot, colors, opacity) => {\n return getLayersArray(layer).map((currentLayer) => ([\n currentLayer === layer\n ? colors[variant]\n : colors[currentLayer],\n currentLayer === layer\n ? opacity[opacitySlot] || 1\n : opacity[currentLayer]\n ]))\n}\n\nconst getDependencies = (key, inheritance) => {\n const data = inheritance[key]\n if (typeof data === 'string' && data.startsWith('--')) {\n return [data.substring(2)]\n } else {\n if (data === null) return []\n const { depends, layer, variant } = data\n const layerDeps = layer\n ? getLayersArray(layer).map(currentLayer => {\n return currentLayer === layer\n ? variant || layer\n : currentLayer\n })\n : []\n if (Array.isArray(depends)) {\n return [...depends, ...layerDeps]\n } else {\n return [...layerDeps]\n }\n }\n}\n\n/**\n * Sorts inheritance object topologically - dependant slots come after\n * dependencies\n *\n * @property {Object} inheritance - object defining the nodes\n * @property {Function} getDeps - function that returns dependencies for\n * given value and inheritance object.\n * @returns {String[]} keys of inheritance object, sorted in topological\n * order. Additionally, dependency-less nodes will always be first in line\n */\nexport const topoSort = (\n inheritance = SLOT_INHERITANCE,\n getDeps = getDependencies\n) => {\n // This is an implementation of https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm\n\n const allKeys = Object.keys(inheritance)\n const whites = new Set(allKeys)\n const grays = new Set()\n const blacks = new Set()\n const unprocessed = [...allKeys]\n const output = []\n\n const step = (node) => {\n if (whites.has(node)) {\n // Make node \"gray\"\n whites.delete(node)\n grays.add(node)\n // Do step for each node connected to it (one way)\n getDeps(node, inheritance).forEach(step)\n // Make node \"black\"\n grays.delete(node)\n blacks.add(node)\n // Put it into the output list\n output.push(node)\n } else if (grays.has(node)) {\n console.debug('Cyclic depenency in topoSort, ignoring')\n output.push(node)\n } else if (blacks.has(node)) {\n // do nothing\n } else {\n throw new Error('Unintended condition in topoSort!')\n }\n }\n while (unprocessed.length > 0) {\n step(unprocessed.pop())\n }\n\n // The index thing is to make sorting stable on browsers\n // where Array.sort() isn't stable\n return output.map((data, index) => ({ data, index })).sort(({ data: a, index: ai }, { data: b, index: bi }) => {\n const depsA = getDeps(a, inheritance).length\n const depsB = getDeps(b, inheritance).length\n\n if (depsA === depsB || (depsB !== 0 && depsA !== 0)) return ai - bi\n if (depsA === 0 && depsB !== 0) return -1\n if (depsB === 0 && depsA !== 0) return 1\n }).map(({ data }) => data)\n}\n\nconst expandSlotValue = (value) => {\n if (typeof value === 'object') return value\n return {\n depends: value.startsWith('--') ? [value.substring(2)] : [],\n default: value.startsWith('#') ? value : undefined\n }\n}\n/**\n * retrieves opacity slot for given slot. This goes up the depenency graph\n * to find which parent has opacity slot defined for it.\n * TODO refactor this\n */\nexport const getOpacitySlot = (\n k,\n inheritance = SLOT_INHERITANCE,\n getDeps = getDependencies\n) => {\n const value = expandSlotValue(inheritance[k])\n if (value.opacity === null) return\n if (value.opacity) return value.opacity\n const findInheritedOpacity = (key, visited = [k]) => {\n const depSlot = getDeps(key, inheritance)[0]\n if (depSlot === undefined) return\n const dependency = inheritance[depSlot]\n if (dependency === undefined) return\n if (dependency.opacity || dependency === null) {\n return dependency.opacity\n } else if (dependency.depends && visited.includes(depSlot)) {\n return findInheritedOpacity(depSlot, [...visited, depSlot])\n } else {\n return null\n }\n }\n if (value.depends) {\n return findInheritedOpacity(k)\n }\n}\n\n/**\n * retrieves layer slot for given slot. This goes up the depenency graph\n * to find which parent has opacity slot defined for it.\n * this is basically copypaste of getOpacitySlot except it checks if key is\n * in LAYERS\n * TODO refactor this\n */\nexport const getLayerSlot = (\n k,\n inheritance = SLOT_INHERITANCE,\n getDeps = getDependencies\n) => {\n const value = expandSlotValue(inheritance[k])\n if (LAYERS[k]) return k\n if (value.layer === null) return\n if (value.layer) return value.layer\n const findInheritedLayer = (key, visited = [k]) => {\n const depSlot = getDeps(key, inheritance)[0]\n if (depSlot === undefined) return\n const dependency = inheritance[depSlot]\n if (dependency === undefined) return\n if (dependency.layer || dependency === null) {\n return dependency.layer\n } else if (dependency.depends) {\n return findInheritedLayer(dependency, [...visited, depSlot])\n } else {\n return null\n }\n }\n if (value.depends) {\n return findInheritedLayer(k)\n }\n}\n\n/**\n * topologically sorted SLOT_INHERITANCE\n */\nexport const SLOT_ORDERED = topoSort(\n Object.entries(SLOT_INHERITANCE)\n .sort(([aK, aV], [bK, bV]) => ((aV && aV.priority) || 0) - ((bV && bV.priority) || 0))\n .reduce((acc, [k, v]) => ({ ...acc, [k]: v }), {})\n)\n\n/**\n * All opacity slots used in color slots, their default values and affected\n * color slots.\n */\nexport const OPACITIES = Object.entries(SLOT_INHERITANCE).reduce((acc, [k, v]) => {\n const opacity = getOpacitySlot(k, SLOT_INHERITANCE, getDependencies)\n if (opacity) {\n return {\n ...acc,\n [opacity]: {\n defaultValue: DEFAULT_OPACITY[opacity] || 1,\n affectedSlots: [...((acc[opacity] && acc[opacity].affectedSlots) || []), k]\n }\n }\n } else {\n return acc\n }\n}, {})\n\n/**\n * Handle dynamic color\n */\nexport const computeDynamicColor = (sourceColor, getColor, mod) => {\n if (typeof sourceColor !== 'string' || !sourceColor.startsWith('--')) return sourceColor\n let targetColor = null\n // Color references other color\n const [variable, modifier] = sourceColor.split(/,/g).map(str => str.trim())\n const variableSlot = variable.substring(2)\n targetColor = getColor(variableSlot)\n if (modifier) {\n targetColor = brightness(Number.parseFloat(modifier) * mod, targetColor).rgb\n }\n return targetColor\n}\n\n/**\n * THE function you want to use. Takes provided colors and opacities\n * value and uses inheritance data to figure out color needed for the slot.\n */\nexport const getColors = (sourceColors, sourceOpacity) => SLOT_ORDERED.reduce(({ colors, opacity }, key) => {\n const sourceColor = sourceColors[key]\n const value = expandSlotValue(SLOT_INHERITANCE[key])\n const deps = getDependencies(key, SLOT_INHERITANCE)\n const isTextColor = !!value.textColor\n const variant = value.variant || value.layer\n\n let backgroundColor = null\n\n if (isTextColor) {\n backgroundColor = alphaBlendLayers(\n { ...(colors[deps[0]] || convert(sourceColors[key] || '#FF00FF').rgb) },\n getLayers(\n getLayerSlot(key) || 'bg',\n variant || 'bg',\n getOpacitySlot(variant),\n colors,\n opacity\n )\n )\n } else if (variant && variant !== key) {\n backgroundColor = colors[variant] || convert(sourceColors[variant]).rgb\n } else {\n backgroundColor = colors.bg || convert(sourceColors.bg)\n }\n\n const isLightOnDark = relativeLuminance(backgroundColor) < 0.5\n const mod = isLightOnDark ? 1 : -1\n\n let outputColor = null\n if (sourceColor) {\n // Color is defined in source color\n let targetColor = sourceColor\n if (targetColor === 'transparent') {\n // We take only layers below current one\n const layers = getLayers(\n getLayerSlot(key),\n key,\n getOpacitySlot(key) || key,\n colors,\n opacity\n ).slice(0, -1)\n targetColor = {\n ...alphaBlendLayers(\n convert('#FF00FF').rgb,\n layers\n ),\n a: 0\n }\n } else if (typeof sourceColor === 'string' && sourceColor.startsWith('--')) {\n targetColor = computeDynamicColor(\n sourceColor,\n variableSlot => colors[variableSlot] || sourceColors[variableSlot],\n mod\n )\n } else if (typeof sourceColor === 'string' && sourceColor.startsWith('#')) {\n targetColor = convert(targetColor).rgb\n }\n outputColor = { ...targetColor }\n } else if (value.default) {\n // same as above except in object form\n outputColor = convert(value.default).rgb\n } else {\n // calculate color\n const defaultColorFunc = (mod, dep) => ({ ...dep })\n const colorFunc = value.color || defaultColorFunc\n\n if (value.textColor) {\n if (value.textColor === 'bw') {\n outputColor = contrastRatio(backgroundColor).rgb\n } else {\n let color = { ...colors[deps[0]] }\n if (value.color) {\n color = colorFunc(mod, ...deps.map((dep) => ({ ...colors[dep] })))\n }\n outputColor = getTextColor(\n backgroundColor,\n { ...color },\n value.textColor === 'preserve'\n )\n }\n } else {\n // background color case\n outputColor = colorFunc(\n mod,\n ...deps.map((dep) => ({ ...colors[dep] }))\n )\n }\n }\n if (!outputColor) {\n throw new Error('Couldn\\'t generate color for ' + key)\n }\n\n const opacitySlot = value.opacity || getOpacitySlot(key)\n const ownOpacitySlot = value.opacity\n\n if (ownOpacitySlot === null) {\n outputColor.a = 1\n } else if (sourceColor === 'transparent') {\n outputColor.a = 0\n } else {\n const opacityOverriden = ownOpacitySlot && sourceOpacity[opacitySlot] !== undefined\n\n const dependencySlot = deps[0]\n const dependencyColor = dependencySlot && colors[dependencySlot]\n\n if (!ownOpacitySlot && dependencyColor && !value.textColor && ownOpacitySlot !== null) {\n // Inheriting color from dependency (weird, i know)\n // except if it's a text color or opacity slot is set to 'null'\n outputColor.a = dependencyColor.a\n } else if (!dependencyColor && !opacitySlot) {\n // Remove any alpha channel if no dependency and no opacitySlot found\n delete outputColor.a\n } else {\n // Otherwise try to assign opacity\n if (dependencyColor && dependencyColor.a === 0) {\n // transparent dependency shall make dependents transparent too\n outputColor.a = 0\n } else {\n // Otherwise check if opacity is overriden and use that or default value instead\n outputColor.a = Number(\n opacityOverriden\n ? sourceOpacity[opacitySlot]\n : (OPACITIES[opacitySlot] || {}).defaultValue\n )\n }\n }\n }\n\n if (Number.isNaN(outputColor.a) || outputColor.a === undefined) {\n outputColor.a = 1\n }\n\n if (opacitySlot) {\n return {\n colors: { ...colors, [key]: outputColor },\n opacity: { ...opacity, [opacitySlot]: outputColor.a }\n }\n } else {\n return {\n colors: { ...colors, [key]: outputColor },\n opacity\n }\n }\n}, { colors: {}, opacity: {} })\n","/* eslint-env browser */\nimport statusPosterService from '../../services/status_poster/status_poster.service.js'\nimport fileSizeFormatService from '../../services/file_size_format/file_size_format.js'\n\nconst mediaUpload = {\n data () {\n return {\n uploadCount: 0,\n uploadReady: true\n }\n },\n computed: {\n uploading () {\n return this.uploadCount > 0\n }\n },\n methods: {\n uploadFile (file) {\n const self = this\n const store = this.$store\n if (file.size > store.state.instance.uploadlimit) {\n const filesize = fileSizeFormatService.fileSizeFormat(file.size)\n const allowedsize = fileSizeFormatService.fileSizeFormat(store.state.instance.uploadlimit)\n self.$emit('upload-failed', 'file_too_big', { filesize: filesize.num, filesizeunit: filesize.unit, allowedsize: allowedsize.num, allowedsizeunit: allowedsize.unit })\n return\n }\n const formData = new FormData()\n formData.append('file', file)\n\n self.$emit('uploading')\n self.uploadCount++\n\n statusPosterService.uploadMedia({ store, formData })\n .then((fileData) => {\n self.$emit('uploaded', fileData)\n self.decreaseUploadCount()\n }, (error) => { // eslint-disable-line handle-callback-err\n self.$emit('upload-failed', 'default')\n self.decreaseUploadCount()\n })\n },\n decreaseUploadCount () {\n this.uploadCount--\n if (this.uploadCount === 0) {\n this.$emit('all-uploaded')\n }\n },\n clearFile () {\n this.uploadReady = false\n this.$nextTick(() => {\n this.uploadReady = true\n })\n },\n multiUpload (files) {\n for (const file of files) {\n this.uploadFile(file)\n }\n },\n change ({ target }) {\n this.multiUpload(target.files)\n }\n },\n props: [\n 'dropFiles',\n 'disabled'\n ],\n watch: {\n 'dropFiles': function (fileInfos) {\n if (!this.uploading) {\n this.multiUpload(fileInfos)\n }\n }\n }\n}\n\nexport default mediaUpload\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./media_upload.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./media_upload.js\"\nimport __vue_script__ from \"!!babel-loader!./media_upload.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-6bb295a4\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./media_upload.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"media-upload\",class:{ disabled: _vm.disabled }},[_c('label',{staticClass:\"label\",attrs:{\"title\":_vm.$t('tool_tip.media_upload')}},[(_vm.uploading)?_c('i',{staticClass:\"progress-icon icon-spin4 animate-spin\"}):_vm._e(),_vm._v(\" \"),(!_vm.uploading)?_c('i',{staticClass:\"new-icon icon-upload\"}):_vm._e(),_vm._v(\" \"),(_vm.uploadReady)?_c('input',{staticStyle:{\"position\":\"fixed\",\"top\":\"-100em\"},attrs:{\"disabled\":_vm.disabled,\"type\":\"file\",\"multiple\":\"true\"},on:{\"change\":_vm.change}}):_vm._e()])])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import * as DateUtils from 'src/services/date_utils/date_utils.js'\nimport { uniq } from 'lodash'\n\nexport default {\n name: 'PollForm',\n props: ['visible'],\n data: () => ({\n pollType: 'single',\n options: ['', ''],\n expiryAmount: 10,\n expiryUnit: 'minutes'\n }),\n computed: {\n pollLimits () {\n return this.$store.state.instance.pollLimits\n },\n maxOptions () {\n return this.pollLimits.max_options\n },\n maxLength () {\n return this.pollLimits.max_option_chars\n },\n expiryUnits () {\n const allUnits = ['minutes', 'hours', 'days']\n const expiry = this.convertExpiryFromUnit\n return allUnits.filter(\n unit => this.pollLimits.max_expiration >= expiry(unit, 1)\n )\n },\n minExpirationInCurrentUnit () {\n return Math.ceil(\n this.convertExpiryToUnit(\n this.expiryUnit,\n this.pollLimits.min_expiration\n )\n )\n },\n maxExpirationInCurrentUnit () {\n return Math.floor(\n this.convertExpiryToUnit(\n this.expiryUnit,\n this.pollLimits.max_expiration\n )\n )\n }\n },\n methods: {\n clear () {\n this.pollType = 'single'\n this.options = ['', '']\n this.expiryAmount = 10\n this.expiryUnit = 'minutes'\n },\n nextOption (index) {\n const element = this.$el.querySelector(`#poll-${index + 1}`)\n if (element) {\n element.focus()\n } else {\n // Try adding an option and try focusing on it\n const addedOption = this.addOption()\n if (addedOption) {\n this.$nextTick(function () {\n this.nextOption(index)\n })\n }\n }\n },\n addOption () {\n if (this.options.length < this.maxOptions) {\n this.options.push('')\n return true\n }\n return false\n },\n deleteOption (index, event) {\n if (this.options.length > 2) {\n this.options.splice(index, 1)\n this.updatePollToParent()\n }\n },\n convertExpiryToUnit (unit, amount) {\n // Note: we want seconds and not milliseconds\n switch (unit) {\n case 'minutes': return (1000 * amount) / DateUtils.MINUTE\n case 'hours': return (1000 * amount) / DateUtils.HOUR\n case 'days': return (1000 * amount) / DateUtils.DAY\n }\n },\n convertExpiryFromUnit (unit, amount) {\n // Note: we want seconds and not milliseconds\n switch (unit) {\n case 'minutes': return 0.001 * amount * DateUtils.MINUTE\n case 'hours': return 0.001 * amount * DateUtils.HOUR\n case 'days': return 0.001 * amount * DateUtils.DAY\n }\n },\n expiryAmountChange () {\n this.expiryAmount =\n Math.max(this.minExpirationInCurrentUnit, this.expiryAmount)\n this.expiryAmount =\n Math.min(this.maxExpirationInCurrentUnit, this.expiryAmount)\n this.updatePollToParent()\n },\n updatePollToParent () {\n const expiresIn = this.convertExpiryFromUnit(\n this.expiryUnit,\n this.expiryAmount\n )\n\n const options = uniq(this.options.filter(option => option !== ''))\n if (options.length < 2) {\n this.$emit('update-poll', { error: this.$t('polls.not_enough_options') })\n return\n }\n this.$emit('update-poll', {\n options,\n multiple: this.pollType === 'multiple',\n expiresIn\n })\n }\n }\n}\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./poll_form.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./poll_form.js\"\nimport __vue_script__ from \"!!babel-loader!./poll_form.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-1f896331\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./poll_form.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.visible)?_c('div',{staticClass:\"poll-form\"},[_vm._l((_vm.options),function(option,index){return _c('div',{key:index,staticClass:\"poll-option\"},[_c('div',{staticClass:\"input-container\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.options[index]),expression:\"options[index]\"}],staticClass:\"poll-option-input\",attrs:{\"id\":(\"poll-\" + index),\"type\":\"text\",\"placeholder\":_vm.$t('polls.option'),\"maxlength\":_vm.maxLength},domProps:{\"value\":(_vm.options[index])},on:{\"change\":_vm.updatePollToParent,\"keydown\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }$event.stopPropagation();$event.preventDefault();return _vm.nextOption(index)},\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.options, index, $event.target.value)}}})]),_vm._v(\" \"),(_vm.options.length > 2)?_c('div',{staticClass:\"icon-container\"},[_c('i',{staticClass:\"icon-cancel\",on:{\"click\":function($event){return _vm.deleteOption(index)}}})]):_vm._e()])}),_vm._v(\" \"),(_vm.options.length < _vm.maxOptions)?_c('a',{staticClass:\"add-option faint\",on:{\"click\":_vm.addOption}},[_c('i',{staticClass:\"icon-plus\"}),_vm._v(\"\\n \"+_vm._s(_vm.$t(\"polls.add_option\"))+\"\\n \")]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"poll-type-expiry\"},[_c('div',{staticClass:\"poll-type\",attrs:{\"title\":_vm.$t('polls.type')}},[_c('label',{staticClass:\"select\",attrs:{\"for\":\"poll-type-selector\"}},[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.pollType),expression:\"pollType\"}],staticClass:\"select\",on:{\"change\":[function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.pollType=$event.target.multiple ? $$selectedVal : $$selectedVal[0]},_vm.updatePollToParent]}},[_c('option',{attrs:{\"value\":\"single\"}},[_vm._v(_vm._s(_vm.$t('polls.single_choice')))]),_vm._v(\" \"),_c('option',{attrs:{\"value\":\"multiple\"}},[_vm._v(_vm._s(_vm.$t('polls.multiple_choices')))])]),_vm._v(\" \"),_c('i',{staticClass:\"icon-down-open\"})])]),_vm._v(\" \"),_c('div',{staticClass:\"poll-expiry\",attrs:{\"title\":_vm.$t('polls.expiry')}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.expiryAmount),expression:\"expiryAmount\"}],staticClass:\"expiry-amount hide-number-spinner\",attrs:{\"type\":\"number\",\"min\":_vm.minExpirationInCurrentUnit,\"max\":_vm.maxExpirationInCurrentUnit},domProps:{\"value\":(_vm.expiryAmount)},on:{\"change\":_vm.expiryAmountChange,\"input\":function($event){if($event.target.composing){ return; }_vm.expiryAmount=$event.target.value}}}),_vm._v(\" \"),_c('label',{staticClass:\"expiry-unit select\"},[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.expiryUnit),expression:\"expiryUnit\"}],on:{\"change\":[function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.expiryUnit=$event.target.multiple ? $$selectedVal : $$selectedVal[0]},_vm.expiryAmountChange]}},_vm._l((_vm.expiryUnits),function(unit){return _c('option',{key:unit,domProps:{\"value\":unit}},[_vm._v(\"\\n \"+_vm._s(_vm.$t((\"time.\" + unit + \"_short\"), ['']))+\"\\n \")])}),0),_vm._v(\" \"),_c('i',{staticClass:\"icon-down-open\"})])])])],2):_vm._e()}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import statusPoster from '../../services/status_poster/status_poster.service.js'\nimport MediaUpload from '../media_upload/media_upload.vue'\nimport ScopeSelector from '../scope_selector/scope_selector.vue'\nimport EmojiInput from '../emoji_input/emoji_input.vue'\nimport PollForm from '../poll/poll_form.vue'\nimport Attachment from '../attachment/attachment.vue'\nimport StatusContent from '../status_content/status_content.vue'\nimport fileTypeService from '../../services/file_type/file_type.service.js'\nimport { findOffset } from '../../services/offset_finder/offset_finder.service.js'\nimport { reject, map, uniqBy, debounce } from 'lodash'\nimport suggestor from '../emoji_input/suggestor.js'\nimport { mapGetters, mapState } from 'vuex'\nimport Checkbox from '../checkbox/checkbox.vue'\n\nconst buildMentionsString = ({ user, attentions = [] }, currentUser) => {\n let allAttentions = [...attentions]\n\n allAttentions.unshift(user)\n\n allAttentions = uniqBy(allAttentions, 'id')\n allAttentions = reject(allAttentions, { id: currentUser.id })\n\n let mentions = map(allAttentions, (attention) => {\n return `@${attention.screen_name}`\n })\n\n return mentions.length > 0 ? mentions.join(' ') + ' ' : ''\n}\n\n// Converts a string with px to a number like '2px' -> 2\nconst pxStringToNumber = (str) => {\n return Number(str.substring(0, str.length - 2))\n}\n\nconst PostStatusForm = {\n props: [\n 'replyTo',\n 'repliedUser',\n 'attentions',\n 'copyMessageScope',\n 'subject',\n 'disableSubject',\n 'disableScopeSelector',\n 'disableNotice',\n 'disableLockWarning',\n 'disablePolls',\n 'disableSensitivityCheckbox',\n 'disableSubmit',\n 'disablePreview',\n 'placeholder',\n 'maxHeight',\n 'postHandler',\n 'preserveFocus',\n 'autoFocus',\n 'fileLimit',\n 'submitOnEnter',\n 'emojiPickerPlacement'\n ],\n components: {\n MediaUpload,\n EmojiInput,\n PollForm,\n ScopeSelector,\n Checkbox,\n Attachment,\n StatusContent\n },\n mounted () {\n this.updateIdempotencyKey()\n this.resize(this.$refs.textarea)\n\n if (this.replyTo) {\n const textLength = this.$refs.textarea.value.length\n this.$refs.textarea.setSelectionRange(textLength, textLength)\n }\n\n if (this.replyTo || this.autoFocus) {\n this.$refs.textarea.focus()\n }\n },\n data () {\n const preset = this.$route.query.message\n let statusText = preset || ''\n\n const { scopeCopy } = this.$store.getters.mergedConfig\n\n if (this.replyTo) {\n const currentUser = this.$store.state.users.currentUser\n statusText = buildMentionsString({ user: this.repliedUser, attentions: this.attentions }, currentUser)\n }\n\n const scope = ((this.copyMessageScope && scopeCopy) || this.copyMessageScope === 'direct')\n ? this.copyMessageScope\n : this.$store.state.users.currentUser.default_scope\n\n const { postContentType: contentType } = this.$store.getters.mergedConfig\n\n return {\n dropFiles: [],\n uploadingFiles: false,\n error: null,\n posting: false,\n highlighted: 0,\n newStatus: {\n spoilerText: this.subject || '',\n status: statusText,\n nsfw: false,\n files: [],\n poll: {},\n mediaDescriptions: {},\n visibility: scope,\n contentType\n },\n caret: 0,\n pollFormVisible: false,\n showDropIcon: 'hide',\n dropStopTimeout: null,\n preview: null,\n previewLoading: false,\n emojiInputShown: false,\n idempotencyKey: ''\n }\n },\n computed: {\n users () {\n return this.$store.state.users.users\n },\n userDefaultScope () {\n return this.$store.state.users.currentUser.default_scope\n },\n showAllScopes () {\n return !this.mergedConfig.minimalScopesMode\n },\n emojiUserSuggestor () {\n return suggestor({\n emoji: [\n ...this.$store.state.instance.emoji,\n ...this.$store.state.instance.customEmoji\n ],\n users: this.$store.state.users.users,\n updateUsersList: (query) => this.$store.dispatch('searchUsers', { query })\n })\n },\n emojiSuggestor () {\n return suggestor({\n emoji: [\n ...this.$store.state.instance.emoji,\n ...this.$store.state.instance.customEmoji\n ]\n })\n },\n emoji () {\n return this.$store.state.instance.emoji || []\n },\n customEmoji () {\n return this.$store.state.instance.customEmoji || []\n },\n statusLength () {\n return this.newStatus.status.length\n },\n spoilerTextLength () {\n return this.newStatus.spoilerText.length\n },\n statusLengthLimit () {\n return this.$store.state.instance.textlimit\n },\n hasStatusLengthLimit () {\n return this.statusLengthLimit > 0\n },\n charactersLeft () {\n return this.statusLengthLimit - (this.statusLength + this.spoilerTextLength)\n },\n isOverLengthLimit () {\n return this.hasStatusLengthLimit && (this.charactersLeft < 0)\n },\n minimalScopesMode () {\n return this.$store.state.instance.minimalScopesMode\n },\n alwaysShowSubject () {\n return this.mergedConfig.alwaysShowSubjectInput\n },\n postFormats () {\n return this.$store.state.instance.postFormats || []\n },\n safeDMEnabled () {\n return this.$store.state.instance.safeDM\n },\n pollsAvailable () {\n return this.$store.state.instance.pollsAvailable &&\n this.$store.state.instance.pollLimits.max_options >= 2 &&\n this.disablePolls !== true\n },\n hideScopeNotice () {\n return this.disableNotice || this.$store.getters.mergedConfig.hideScopeNotice\n },\n pollContentError () {\n return this.pollFormVisible &&\n this.newStatus.poll &&\n this.newStatus.poll.error\n },\n showPreview () {\n return !this.disablePreview && (!!this.preview || this.previewLoading)\n },\n emptyStatus () {\n return this.newStatus.status.trim() === '' && this.newStatus.files.length === 0\n },\n uploadFileLimitReached () {\n return this.newStatus.files.length >= this.fileLimit\n },\n ...mapGetters(['mergedConfig']),\n ...mapState({\n mobileLayout: state => state.interface.mobileLayout\n })\n },\n watch: {\n 'newStatus': {\n deep: true,\n handler () {\n this.statusChanged()\n }\n }\n },\n methods: {\n statusChanged () {\n this.autoPreview()\n this.updateIdempotencyKey()\n },\n clearStatus () {\n const newStatus = this.newStatus\n this.newStatus = {\n status: '',\n spoilerText: '',\n files: [],\n visibility: newStatus.visibility,\n contentType: newStatus.contentType,\n poll: {},\n mediaDescriptions: {}\n }\n this.pollFormVisible = false\n this.$refs.mediaUpload && this.$refs.mediaUpload.clearFile()\n this.clearPollForm()\n if (this.preserveFocus) {\n this.$nextTick(() => {\n this.$refs.textarea.focus()\n })\n }\n let el = this.$el.querySelector('textarea')\n el.style.height = 'auto'\n el.style.height = undefined\n this.error = null\n if (this.preview) this.previewStatus()\n },\n async postStatus (event, newStatus, opts = {}) {\n if (this.posting) { return }\n if (this.disableSubmit) { return }\n if (this.emojiInputShown) { return }\n if (this.submitOnEnter) {\n event.stopPropagation()\n event.preventDefault()\n }\n\n if (this.emptyStatus) {\n this.error = this.$t('post_status.empty_status_error')\n return\n }\n\n const poll = this.pollFormVisible ? this.newStatus.poll : {}\n if (this.pollContentError) {\n this.error = this.pollContentError\n return\n }\n\n this.posting = true\n\n try {\n await this.setAllMediaDescriptions()\n } catch (e) {\n this.error = this.$t('post_status.media_description_error')\n this.posting = false\n return\n }\n\n const postingOptions = {\n status: newStatus.status,\n spoilerText: newStatus.spoilerText || null,\n visibility: newStatus.visibility,\n sensitive: newStatus.nsfw,\n media: newStatus.files,\n store: this.$store,\n inReplyToStatusId: this.replyTo,\n contentType: newStatus.contentType,\n poll,\n idempotencyKey: this.idempotencyKey\n }\n\n const postHandler = this.postHandler ? this.postHandler : statusPoster.postStatus\n\n postHandler(postingOptions).then((data) => {\n if (!data.error) {\n this.clearStatus()\n this.$emit('posted', data)\n } else {\n this.error = data.error\n }\n this.posting = false\n })\n },\n previewStatus () {\n if (this.emptyStatus && this.newStatus.spoilerText.trim() === '') {\n this.preview = { error: this.$t('post_status.preview_empty') }\n this.previewLoading = false\n return\n }\n const newStatus = this.newStatus\n this.previewLoading = true\n statusPoster.postStatus({\n status: newStatus.status,\n spoilerText: newStatus.spoilerText || null,\n visibility: newStatus.visibility,\n sensitive: newStatus.nsfw,\n media: [],\n store: this.$store,\n inReplyToStatusId: this.replyTo,\n contentType: newStatus.contentType,\n poll: {},\n preview: true\n }).then((data) => {\n // Don't apply preview if not loading, because it means\n // user has closed the preview manually.\n if (!this.previewLoading) return\n if (!data.error) {\n this.preview = data\n } else {\n this.preview = { error: data.error }\n }\n }).catch((error) => {\n this.preview = { error }\n }).finally(() => {\n this.previewLoading = false\n })\n },\n debouncePreviewStatus: debounce(function () { this.previewStatus() }, 500),\n autoPreview () {\n if (!this.preview) return\n this.previewLoading = true\n this.debouncePreviewStatus()\n },\n closePreview () {\n this.preview = null\n this.previewLoading = false\n },\n togglePreview () {\n if (this.showPreview) {\n this.closePreview()\n } else {\n this.previewStatus()\n }\n },\n addMediaFile (fileInfo) {\n this.newStatus.files.push(fileInfo)\n this.$emit('resize', { delayed: true })\n },\n removeMediaFile (fileInfo) {\n let index = this.newStatus.files.indexOf(fileInfo)\n this.newStatus.files.splice(index, 1)\n this.$emit('resize')\n },\n uploadFailed (errString, templateArgs) {\n templateArgs = templateArgs || {}\n this.error = this.$t('upload.error.base') + ' ' + this.$t('upload.error.' + errString, templateArgs)\n },\n startedUploadingFiles () {\n this.uploadingFiles = true\n },\n finishedUploadingFiles () {\n this.$emit('resize')\n this.uploadingFiles = false\n },\n type (fileInfo) {\n return fileTypeService.fileType(fileInfo.mimetype)\n },\n paste (e) {\n this.autoPreview()\n this.resize(e)\n if (e.clipboardData.files.length > 0) {\n // prevent pasting of file as text\n e.preventDefault()\n // Strangely, files property gets emptied after event propagation\n // Trying to wrap it in array doesn't work. Plus I doubt it's possible\n // to hold more than one file in clipboard.\n this.dropFiles = [e.clipboardData.files[0]]\n }\n },\n fileDrop (e) {\n if (e.dataTransfer && e.dataTransfer.types.includes('Files')) {\n e.preventDefault() // allow dropping text like before\n this.dropFiles = e.dataTransfer.files\n clearTimeout(this.dropStopTimeout)\n this.showDropIcon = 'hide'\n }\n },\n fileDragStop (e) {\n // The false-setting is done with delay because just using leave-events\n // directly caused unwanted flickering, this is not perfect either but\n // much less noticable.\n clearTimeout(this.dropStopTimeout)\n this.showDropIcon = 'fade'\n this.dropStopTimeout = setTimeout(() => (this.showDropIcon = 'hide'), 500)\n },\n fileDrag (e) {\n e.dataTransfer.dropEffect = this.uploadFileLimitReached ? 'none' : 'copy'\n if (e.dataTransfer && e.dataTransfer.types.includes('Files')) {\n clearTimeout(this.dropStopTimeout)\n this.showDropIcon = 'show'\n }\n },\n onEmojiInputInput (e) {\n this.$nextTick(() => {\n this.resize(this.$refs['textarea'])\n })\n },\n resize (e) {\n const target = e.target || e\n if (!(target instanceof window.Element)) { return }\n\n // Reset to default height for empty form, nothing else to do here.\n if (target.value === '') {\n target.style.height = null\n this.$emit('resize')\n this.$refs['emoji-input'].resize()\n return\n }\n\n const formRef = this.$refs['form']\n const bottomRef = this.$refs['bottom']\n /* Scroller is either `window` (replies in TL), sidebar (main post form,\n * replies in notifs) or mobile post form. Note that getting and setting\n * scroll is different for `Window` and `Element`s\n */\n const bottomBottomPaddingStr = window.getComputedStyle(bottomRef)['padding-bottom']\n const bottomBottomPadding = pxStringToNumber(bottomBottomPaddingStr)\n\n const scrollerRef = this.$el.closest('.sidebar-scroller') ||\n this.$el.closest('.post-form-modal-view') ||\n window\n\n // Getting info about padding we have to account for, removing 'px' part\n const topPaddingStr = window.getComputedStyle(target)['padding-top']\n const bottomPaddingStr = window.getComputedStyle(target)['padding-bottom']\n const topPadding = pxStringToNumber(topPaddingStr)\n const bottomPadding = pxStringToNumber(bottomPaddingStr)\n const vertPadding = topPadding + bottomPadding\n\n const oldHeight = pxStringToNumber(target.style.height)\n\n /* Explanation:\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight\n * scrollHeight returns element's scrollable content height, i.e. visible\n * element + overscrolled parts of it. We use it to determine when text\n * inside the textarea exceeded its height, so we can set height to prevent\n * overscroll, i.e. make textarea grow with the text. HOWEVER, since we\n * explicitly set new height, scrollHeight won't go below that, so we can't\n * SHRINK the textarea when there's extra space. To workaround that we set\n * height to 'auto' which makes textarea tiny again, so that scrollHeight\n * will match text height again. HOWEVER, shrinking textarea can screw with\n * the scroll since there might be not enough padding around form-bottom to even\n * warrant a scroll, so it will jump to 0 and refuse to move anywhere,\n * so we check current scroll position before shrinking and then restore it\n * with needed delta.\n */\n\n // this part has to be BEFORE the content size update\n const currentScroll = scrollerRef === window\n ? scrollerRef.scrollY\n : scrollerRef.scrollTop\n const scrollerHeight = scrollerRef === window\n ? scrollerRef.innerHeight\n : scrollerRef.offsetHeight\n const scrollerBottomBorder = currentScroll + scrollerHeight\n\n // BEGIN content size update\n target.style.height = 'auto'\n const heightWithoutPadding = Math.floor(target.scrollHeight - vertPadding)\n let newHeight = this.maxHeight ? Math.min(heightWithoutPadding, this.maxHeight) : heightWithoutPadding\n // This is a bit of a hack to combat target.scrollHeight being different on every other input\n // on some browsers for whatever reason. Don't change the height if difference is 1px or less.\n if (Math.abs(newHeight - oldHeight) <= 1) {\n newHeight = oldHeight\n }\n target.style.height = `${newHeight}px`\n this.$emit('resize', newHeight)\n // END content size update\n\n // We check where the bottom border of form-bottom element is, this uses findOffset\n // to find offset relative to scrollable container (scroller)\n const bottomBottomBorder = bottomRef.offsetHeight + findOffset(bottomRef, scrollerRef).top + bottomBottomPadding\n\n const isBottomObstructed = scrollerBottomBorder < bottomBottomBorder\n const isFormBiggerThanScroller = scrollerHeight < formRef.offsetHeight\n const bottomChangeDelta = bottomBottomBorder - scrollerBottomBorder\n // The intention is basically this;\n // Keep form-bottom always visible so that submit button is in view EXCEPT\n // if form element bigger than scroller and caret isn't at the end, so that\n // if you scroll up and edit middle of text you won't get scrolled back to bottom\n const shouldScrollToBottom = isBottomObstructed &&\n !(isFormBiggerThanScroller &&\n this.$refs.textarea.selectionStart !== this.$refs.textarea.value.length)\n const totalDelta = shouldScrollToBottom ? bottomChangeDelta : 0\n const targetScroll = currentScroll + totalDelta\n\n if (scrollerRef === window) {\n scrollerRef.scroll(0, targetScroll)\n } else {\n scrollerRef.scrollTop = targetScroll\n }\n\n this.$refs['emoji-input'].resize()\n },\n showEmojiPicker () {\n this.$refs['textarea'].focus()\n this.$refs['emoji-input'].triggerShowPicker()\n },\n clearError () {\n this.error = null\n },\n changeVis (visibility) {\n this.newStatus.visibility = visibility\n },\n togglePollForm () {\n this.pollFormVisible = !this.pollFormVisible\n },\n setPoll (poll) {\n this.newStatus.poll = poll\n },\n clearPollForm () {\n if (this.$refs.pollForm) {\n this.$refs.pollForm.clear()\n }\n },\n dismissScopeNotice () {\n this.$store.dispatch('setOption', { name: 'hideScopeNotice', value: true })\n },\n setMediaDescription (id) {\n const description = this.newStatus.mediaDescriptions[id]\n if (!description || description.trim() === '') return\n return statusPoster.setMediaDescription({ store: this.$store, id, description })\n },\n setAllMediaDescriptions () {\n const ids = this.newStatus.files.map(file => file.id)\n return Promise.all(ids.map(id => this.setMediaDescription(id)))\n },\n handleEmojiInputShow (value) {\n this.emojiInputShown = value\n },\n updateIdempotencyKey () {\n this.idempotencyKey = Date.now().toString()\n },\n openProfileTab () {\n this.$store.dispatch('openSettingsModalTab', 'profile')\n }\n }\n}\n\nexport default PostStatusForm\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./post_status_form.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./post_status_form.js\"\nimport __vue_script__ from \"!!babel-loader!./post_status_form.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-c3d07a7c\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./post_status_form.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{ref:\"form\",staticClass:\"post-status-form\"},[_c('form',{attrs:{\"autocomplete\":\"off\"},on:{\"submit\":function($event){$event.preventDefault();},\"dragover\":function($event){$event.preventDefault();return _vm.fileDrag($event)}}},[_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.showDropIcon !== 'hide'),expression:\"showDropIcon !== 'hide'\"}],staticClass:\"drop-indicator\",class:[_vm.uploadFileLimitReached ? 'icon-block' : 'icon-upload'],style:({ animation: _vm.showDropIcon === 'show' ? 'fade-in 0.25s' : 'fade-out 0.5s' }),on:{\"dragleave\":_vm.fileDragStop,\"drop\":function($event){$event.stopPropagation();return _vm.fileDrop($event)}}}),_vm._v(\" \"),_c('div',{staticClass:\"form-group\"},[(!_vm.$store.state.users.currentUser.locked && _vm.newStatus.visibility == 'private' && !_vm.disableLockWarning)?_c('i18n',{staticClass:\"visibility-notice\",attrs:{\"path\":\"post_status.account_not_locked_warning\",\"tag\":\"p\"}},[_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":_vm.openProfileTab}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('post_status.account_not_locked_warning_link'))+\"\\n \")])]):_vm._e(),_vm._v(\" \"),(!_vm.hideScopeNotice && _vm.newStatus.visibility === 'public')?_c('p',{staticClass:\"visibility-notice notice-dismissible\"},[_c('span',[_vm._v(_vm._s(_vm.$t('post_status.scope_notice.public')))]),_vm._v(\" \"),_c('a',{staticClass:\"button-icon dismiss\",on:{\"click\":function($event){$event.preventDefault();return _vm.dismissScopeNotice()}}},[_c('i',{staticClass:\"icon-cancel\"})])]):(!_vm.hideScopeNotice && _vm.newStatus.visibility === 'unlisted')?_c('p',{staticClass:\"visibility-notice notice-dismissible\"},[_c('span',[_vm._v(_vm._s(_vm.$t('post_status.scope_notice.unlisted')))]),_vm._v(\" \"),_c('a',{staticClass:\"button-icon dismiss\",on:{\"click\":function($event){$event.preventDefault();return _vm.dismissScopeNotice()}}},[_c('i',{staticClass:\"icon-cancel\"})])]):(!_vm.hideScopeNotice && _vm.newStatus.visibility === 'private' && _vm.$store.state.users.currentUser.locked)?_c('p',{staticClass:\"visibility-notice notice-dismissible\"},[_c('span',[_vm._v(_vm._s(_vm.$t('post_status.scope_notice.private')))]),_vm._v(\" \"),_c('a',{staticClass:\"button-icon dismiss\",on:{\"click\":function($event){$event.preventDefault();return _vm.dismissScopeNotice()}}},[_c('i',{staticClass:\"icon-cancel\"})])]):(_vm.newStatus.visibility === 'direct')?_c('p',{staticClass:\"visibility-notice\"},[(_vm.safeDMEnabled)?_c('span',[_vm._v(_vm._s(_vm.$t('post_status.direct_warning_to_first_only')))]):_c('span',[_vm._v(_vm._s(_vm.$t('post_status.direct_warning_to_all')))])]):_vm._e(),_vm._v(\" \"),(!_vm.disablePreview)?_c('div',{staticClass:\"preview-heading faint\"},[_c('a',{staticClass:\"preview-toggle faint\",on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.togglePreview($event)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('post_status.preview'))+\"\\n \"),_c('i',{class:_vm.showPreview ? 'icon-left-open' : 'icon-right-open'})]),_vm._v(\" \"),_c('i',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.previewLoading),expression:\"previewLoading\"}],staticClass:\"icon-spin3 animate-spin\"})]):_vm._e(),_vm._v(\" \"),(_vm.showPreview)?_c('div',{staticClass:\"preview-container\"},[(!_vm.preview)?_c('div',{staticClass:\"preview-status\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('general.loading'))+\"\\n \")]):(_vm.preview.error)?_c('div',{staticClass:\"preview-status preview-error\"},[_vm._v(\"\\n \"+_vm._s(_vm.preview.error)+\"\\n \")]):_c('StatusContent',{staticClass:\"preview-status\",attrs:{\"status\":_vm.preview}})],1):_vm._e(),_vm._v(\" \"),(!_vm.disableSubject && (_vm.newStatus.spoilerText || _vm.alwaysShowSubject))?_c('EmojiInput',{staticClass:\"form-control\",attrs:{\"enable-emoji-picker\":\"\",\"suggest\":_vm.emojiSuggestor},model:{value:(_vm.newStatus.spoilerText),callback:function ($$v) {_vm.$set(_vm.newStatus, \"spoilerText\", $$v)},expression:\"newStatus.spoilerText\"}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.newStatus.spoilerText),expression:\"newStatus.spoilerText\"}],staticClass:\"form-post-subject\",attrs:{\"type\":\"text\",\"placeholder\":_vm.$t('post_status.content_warning'),\"disabled\":_vm.posting},domProps:{\"value\":(_vm.newStatus.spoilerText)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.newStatus, \"spoilerText\", $event.target.value)}}})]):_vm._e(),_vm._v(\" \"),_c('EmojiInput',{ref:\"emoji-input\",staticClass:\"form-control main-input\",attrs:{\"suggest\":_vm.emojiUserSuggestor,\"placement\":_vm.emojiPickerPlacement,\"enable-emoji-picker\":\"\",\"hide-emoji-button\":\"\",\"newline-on-ctrl-enter\":_vm.submitOnEnter,\"enable-sticker-picker\":\"\"},on:{\"input\":_vm.onEmojiInputInput,\"sticker-uploaded\":_vm.addMediaFile,\"sticker-upload-failed\":_vm.uploadFailed,\"shown\":_vm.handleEmojiInputShow},model:{value:(_vm.newStatus.status),callback:function ($$v) {_vm.$set(_vm.newStatus, \"status\", $$v)},expression:\"newStatus.status\"}},[_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.newStatus.status),expression:\"newStatus.status\"}],ref:\"textarea\",staticClass:\"form-post-body\",class:{ 'scrollable-form': !!_vm.maxHeight },attrs:{\"placeholder\":_vm.placeholder || _vm.$t('post_status.default'),\"rows\":\"1\",\"cols\":\"1\",\"disabled\":_vm.posting},domProps:{\"value\":(_vm.newStatus.status)},on:{\"keydown\":[function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }if($event.ctrlKey||$event.shiftKey||$event.altKey||$event.metaKey){ return null; }_vm.submitOnEnter && _vm.postStatus($event, _vm.newStatus)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }if(!$event.metaKey){ return null; }return _vm.postStatus($event, _vm.newStatus)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }if(!$event.ctrlKey){ return null; }!_vm.submitOnEnter && _vm.postStatus($event, _vm.newStatus)}],\"input\":[function($event){if($event.target.composing){ return; }_vm.$set(_vm.newStatus, \"status\", $event.target.value)},_vm.resize],\"compositionupdate\":_vm.resize,\"paste\":_vm.paste}}),_vm._v(\" \"),(_vm.hasStatusLengthLimit)?_c('p',{staticClass:\"character-counter faint\",class:{ error: _vm.isOverLengthLimit }},[_vm._v(\"\\n \"+_vm._s(_vm.charactersLeft)+\"\\n \")]):_vm._e()]),_vm._v(\" \"),(!_vm.disableScopeSelector)?_c('div',{staticClass:\"visibility-tray\"},[_c('scope-selector',{attrs:{\"show-all\":_vm.showAllScopes,\"user-default\":_vm.userDefaultScope,\"original-scope\":_vm.copyMessageScope,\"initial-scope\":_vm.newStatus.visibility,\"on-scope-change\":_vm.changeVis}}),_vm._v(\" \"),(_vm.postFormats.length > 1)?_c('div',{staticClass:\"text-format\"},[_c('label',{staticClass:\"select\",attrs:{\"for\":\"post-content-type\"}},[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.newStatus.contentType),expression:\"newStatus.contentType\"}],staticClass:\"form-control\",attrs:{\"id\":\"post-content-type\"},on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.$set(_vm.newStatus, \"contentType\", $event.target.multiple ? $$selectedVal : $$selectedVal[0])}}},_vm._l((_vm.postFormats),function(postFormat){return _c('option',{key:postFormat,domProps:{\"value\":postFormat}},[_vm._v(\"\\n \"+_vm._s(_vm.$t((\"post_status.content_type[\\\"\" + postFormat + \"\\\"]\")))+\"\\n \")])}),0),_vm._v(\" \"),_c('i',{staticClass:\"icon-down-open\"})])]):_vm._e(),_vm._v(\" \"),(_vm.postFormats.length === 1 && _vm.postFormats[0] !== 'text/plain')?_c('div',{staticClass:\"text-format\"},[_c('span',{staticClass:\"only-format\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t((\"post_status.content_type[\\\"\" + (_vm.postFormats[0]) + \"\\\"]\")))+\"\\n \")])]):_vm._e()],1):_vm._e()],1),_vm._v(\" \"),(_vm.pollsAvailable)?_c('poll-form',{ref:\"pollForm\",attrs:{\"visible\":_vm.pollFormVisible},on:{\"update-poll\":_vm.setPoll}}):_vm._e(),_vm._v(\" \"),_c('div',{ref:\"bottom\",staticClass:\"form-bottom\"},[_c('div',{staticClass:\"form-bottom-left\"},[_c('media-upload',{ref:\"mediaUpload\",staticClass:\"media-upload-icon\",attrs:{\"drop-files\":_vm.dropFiles,\"disabled\":_vm.uploadFileLimitReached},on:{\"uploading\":_vm.startedUploadingFiles,\"uploaded\":_vm.addMediaFile,\"upload-failed\":_vm.uploadFailed,\"all-uploaded\":_vm.finishedUploadingFiles}}),_vm._v(\" \"),_c('div',{staticClass:\"emoji-icon\"},[_c('i',{staticClass:\"icon-smile btn btn-default\",attrs:{\"title\":_vm.$t('emoji.add_emoji')},on:{\"click\":_vm.showEmojiPicker}})]),_vm._v(\" \"),(_vm.pollsAvailable)?_c('div',{staticClass:\"poll-icon\",class:{ selected: _vm.pollFormVisible }},[_c('i',{staticClass:\"icon-chart-bar btn btn-default\",attrs:{\"title\":_vm.$t('polls.add_poll')},on:{\"click\":_vm.togglePollForm}})]):_vm._e()],1),_vm._v(\" \"),(_vm.posting)?_c('button',{staticClass:\"btn btn-default\",attrs:{\"disabled\":\"\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('post_status.posting'))+\"\\n \")]):(_vm.isOverLengthLimit)?_c('button',{staticClass:\"btn btn-default\",attrs:{\"disabled\":\"\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('general.submit'))+\"\\n \")]):_c('button',{staticClass:\"btn btn-default\",attrs:{\"disabled\":_vm.uploadingFiles || _vm.disableSubmit},on:{\"touchstart\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.postStatus($event, _vm.newStatus)},\"click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.postStatus($event, _vm.newStatus)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('general.submit'))+\"\\n \")])]),_vm._v(\" \"),(_vm.error)?_c('div',{staticClass:\"alert error\"},[_vm._v(\"\\n Error: \"+_vm._s(_vm.error)+\"\\n \"),_c('i',{staticClass:\"button-icon icon-cancel\",on:{\"click\":_vm.clearError}})]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"attachments\"},_vm._l((_vm.newStatus.files),function(file){return _c('div',{key:file.url,staticClass:\"media-upload-wrapper\"},[_c('i',{staticClass:\"fa button-icon icon-cancel\",on:{\"click\":function($event){return _vm.removeMediaFile(file)}}}),_vm._v(\" \"),_c('attachment',{attrs:{\"attachment\":file,\"set-media\":function () { return _vm.$store.dispatch('setMedia', _vm.newStatus.files); },\"size\":\"small\",\"allow-play\":\"false\"}}),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.newStatus.mediaDescriptions[file.id]),expression:\"newStatus.mediaDescriptions[file.id]\"}],attrs:{\"type\":\"text\",\"placeholder\":_vm.$t('post_status.media_description')},domProps:{\"value\":(_vm.newStatus.mediaDescriptions[file.id])},on:{\"keydown\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }$event.preventDefault();},\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.newStatus.mediaDescriptions, file.id, $event.target.value)}}})],1)}),0),_vm._v(\" \"),(_vm.newStatus.files.length > 0 && !_vm.disableSensitivityCheckbox)?_c('div',{staticClass:\"upload_settings\"},[_c('Checkbox',{model:{value:(_vm.newStatus.nsfw),callback:function ($$v) {_vm.$set(_vm.newStatus, \"nsfw\", $$v)},expression:\"newStatus.nsfw\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('post_status.attachments_sensitive'))+\"\\n \")])],1):_vm._e()],1)])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import StillImage from '../still-image/still-image.vue'\nimport VideoAttachment from '../video_attachment/video_attachment.vue'\nimport nsfwImage from '../../assets/nsfw.png'\nimport fileTypeService from '../../services/file_type/file_type.service.js'\nimport { mapGetters } from 'vuex'\n\nconst Attachment = {\n props: [\n 'attachment',\n 'nsfw',\n 'size',\n 'allowPlay',\n 'setMedia',\n 'naturalSizeLoad'\n ],\n data () {\n return {\n nsfwImage: this.$store.state.instance.nsfwCensorImage || nsfwImage,\n hideNsfwLocal: this.$store.getters.mergedConfig.hideNsfw,\n preloadImage: this.$store.getters.mergedConfig.preloadImage,\n loading: false,\n img: fileTypeService.fileType(this.attachment.mimetype) === 'image' && document.createElement('img'),\n modalOpen: false,\n showHidden: false\n }\n },\n components: {\n StillImage,\n VideoAttachment\n },\n computed: {\n usePlaceholder () {\n return this.size === 'hide' || this.type === 'unknown'\n },\n placeholderName () {\n if (this.attachment.description === '' || !this.attachment.description) {\n return this.type.toUpperCase()\n }\n return this.attachment.description\n },\n placeholderIconClass () {\n if (this.type === 'image') return 'icon-picture'\n if (this.type === 'video') return 'icon-video'\n if (this.type === 'audio') return 'icon-music'\n return 'icon-doc'\n },\n referrerpolicy () {\n return this.$store.state.instance.mediaProxyAvailable ? '' : 'no-referrer'\n },\n type () {\n return fileTypeService.fileType(this.attachment.mimetype)\n },\n hidden () {\n return this.nsfw && this.hideNsfwLocal && !this.showHidden\n },\n isEmpty () {\n return (this.type === 'html' && !this.attachment.oembed) || this.type === 'unknown'\n },\n isSmall () {\n return this.size === 'small'\n },\n fullwidth () {\n if (this.size === 'hide') return false\n return this.type === 'html' || this.type === 'audio' || this.type === 'unknown'\n },\n useModal () {\n const modalTypes = this.size === 'hide' ? ['image', 'video', 'audio']\n : this.mergedConfig.playVideosInModal\n ? ['image', 'video']\n : ['image']\n return modalTypes.includes(this.type)\n },\n ...mapGetters(['mergedConfig'])\n },\n methods: {\n linkClicked ({ target }) {\n if (target.tagName === 'A') {\n window.open(target.href, '_blank')\n }\n },\n openModal (event) {\n if (this.useModal) {\n event.stopPropagation()\n event.preventDefault()\n this.setMedia()\n this.$store.dispatch('setCurrent', this.attachment)\n }\n },\n toggleHidden (event) {\n if (\n (this.mergedConfig.useOneClickNsfw && !this.showHidden) &&\n (this.type !== 'video' || this.mergedConfig.playVideosInModal)\n ) {\n this.openModal(event)\n return\n }\n if (this.img && !this.preloadImage) {\n if (this.img.onload) {\n this.img.onload()\n } else {\n this.loading = true\n this.img.src = this.attachment.url\n this.img.onload = () => {\n this.loading = false\n this.showHidden = !this.showHidden\n }\n }\n } else {\n this.showHidden = !this.showHidden\n }\n },\n onImageLoad (image) {\n const width = image.naturalWidth\n const height = image.naturalHeight\n this.naturalSizeLoad && this.naturalSizeLoad({ width, height })\n }\n }\n}\n\nexport default Attachment\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./attachment.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./attachment.js\"\nimport __vue_script__ from \"!!babel-loader!./attachment.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-6c00fc80\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./attachment.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {\nvar _obj;\nvar _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.usePlaceholder)?_c('div',{class:{ 'fullwidth': _vm.fullwidth },on:{\"click\":_vm.openModal}},[(_vm.type !== 'html')?_c('a',{staticClass:\"placeholder\",attrs:{\"target\":\"_blank\",\"href\":_vm.attachment.url,\"alt\":_vm.attachment.description,\"title\":_vm.attachment.description}},[_c('span',{class:_vm.placeholderIconClass}),_vm._v(\" \"),_c('b',[_vm._v(_vm._s(_vm.nsfw ? \"NSFW / \" : \"\"))]),_vm._v(_vm._s(_vm.placeholderName)+\"\\n \")]):_vm._e()]):_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.isEmpty),expression:\"!isEmpty\"}],staticClass:\"attachment\",class:( _obj = {}, _obj[_vm.type] = true, _obj.loading = _vm.loading, _obj['fullwidth'] = _vm.fullwidth, _obj['nsfw-placeholder'] = _vm.hidden, _obj )},[(_vm.hidden)?_c('a',{staticClass:\"image-attachment\",attrs:{\"href\":_vm.attachment.url,\"alt\":_vm.attachment.description,\"title\":_vm.attachment.description},on:{\"click\":function($event){$event.preventDefault();return _vm.toggleHidden($event)}}},[_c('img',{key:_vm.nsfwImage,staticClass:\"nsfw\",class:{'small': _vm.isSmall},attrs:{\"src\":_vm.nsfwImage}}),_vm._v(\" \"),(_vm.type === 'video')?_c('i',{staticClass:\"play-icon icon-play-circled\"}):_vm._e()]):_vm._e(),_vm._v(\" \"),(_vm.nsfw && _vm.hideNsfwLocal && !_vm.hidden)?_c('div',{staticClass:\"hider\"},[_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.toggleHidden($event)}}},[_vm._v(\"Hide\")])]):_vm._e(),_vm._v(\" \"),(_vm.type === 'image' && (!_vm.hidden || _vm.preloadImage))?_c('a',{staticClass:\"image-attachment\",class:{'hidden': _vm.hidden && _vm.preloadImage },attrs:{\"href\":_vm.attachment.url,\"target\":\"_blank\"},on:{\"click\":_vm.openModal}},[_c('StillImage',{staticClass:\"image\",attrs:{\"referrerpolicy\":_vm.referrerpolicy,\"mimetype\":_vm.attachment.mimetype,\"src\":_vm.attachment.large_thumb_url || _vm.attachment.url,\"image-load-handler\":_vm.onImageLoad,\"alt\":_vm.attachment.description}})],1):_vm._e(),_vm._v(\" \"),(_vm.type === 'video' && !_vm.hidden)?_c('a',{staticClass:\"video-container\",class:{'small': _vm.isSmall},attrs:{\"href\":_vm.allowPlay ? undefined : _vm.attachment.url},on:{\"click\":_vm.openModal}},[_c('VideoAttachment',{staticClass:\"video\",attrs:{\"attachment\":_vm.attachment,\"controls\":_vm.allowPlay}}),_vm._v(\" \"),(!_vm.allowPlay)?_c('i',{staticClass:\"play-icon icon-play-circled\"}):_vm._e()],1):_vm._e(),_vm._v(\" \"),(_vm.type === 'audio')?_c('audio',{attrs:{\"src\":_vm.attachment.url,\"alt\":_vm.attachment.description,\"title\":_vm.attachment.description,\"controls\":\"\"}}):_vm._e(),_vm._v(\" \"),(_vm.type === 'html' && _vm.attachment.oembed)?_c('div',{staticClass:\"oembed\",on:{\"click\":function($event){$event.preventDefault();return _vm.linkClicked($event)}}},[(_vm.attachment.thumb_url)?_c('div',{staticClass:\"image\"},[_c('img',{attrs:{\"src\":_vm.attachment.thumb_url}})]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"text\"},[_c('h1',[_c('a',{attrs:{\"href\":_vm.attachment.url}},[_vm._v(_vm._s(_vm.attachment.oembed.title))])]),_vm._v(\" \"),_c('div',{domProps:{\"innerHTML\":_vm._s(_vm.attachment.oembed.oembedHTML)}})])]):_vm._e()])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","\n\n\n","/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./timeago.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./timeago.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-ac499830\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./timeago.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('time',{attrs:{\"datetime\":_vm.time,\"title\":_vm.localeDateString}},[_vm._v(\"\\n \"+_vm._s(_vm.$t(_vm.relativeTime.key, [_vm.relativeTime.num]))+\"\\n\")])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import { hex2rgb } from '../color_convert/color_convert.js'\nconst highlightStyle = (prefs) => {\n if (prefs === undefined) return\n const { color, type } = prefs\n if (typeof color !== 'string') return\n const rgb = hex2rgb(color)\n if (rgb == null) return\n const solidColor = `rgb(${Math.floor(rgb.r)}, ${Math.floor(rgb.g)}, ${Math.floor(rgb.b)})`\n const tintColor = `rgba(${Math.floor(rgb.r)}, ${Math.floor(rgb.g)}, ${Math.floor(rgb.b)}, .1)`\n const tintColor2 = `rgba(${Math.floor(rgb.r)}, ${Math.floor(rgb.g)}, ${Math.floor(rgb.b)}, .2)`\n if (type === 'striped') {\n return {\n backgroundImage: [\n 'repeating-linear-gradient(135deg,',\n `${tintColor} ,`,\n `${tintColor} 20px,`,\n `${tintColor2} 20px,`,\n `${tintColor2} 40px`\n ].join(' '),\n backgroundPosition: '0 0'\n }\n } else if (type === 'solid') {\n return {\n backgroundColor: tintColor2\n }\n } else if (type === 'side') {\n return {\n backgroundImage: [\n 'linear-gradient(to right,',\n `${solidColor} ,`,\n `${solidColor} 2px,`,\n `transparent 6px`\n ].join(' '),\n backgroundPosition: '0 0'\n }\n }\n}\n\nconst highlightClass = (user) => {\n return 'USER____' + user.screen_name\n .replace(/\\./g, '_')\n .replace(/@/g, '_AT_')\n}\n\nexport {\n highlightClass,\n highlightStyle\n}\n","\n\n\n\n\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./list.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./list.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./list.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-c1790f52\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./list.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"list\"},[_vm._l((_vm.items),function(item){return _c('div',{key:_vm.getKey(item),staticClass:\"list-item\"},[_vm._t(\"item\",null,{\"item\":item})],2)}),_vm._v(\" \"),(_vm.items.length === 0 && !!_vm.$slots.empty)?_c('div',{staticClass:\"list-empty-content faint\"},[_vm._t(\"empty\")],2):_vm._e()],2)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","\n\n\n\n\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./checkbox.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./checkbox.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./checkbox.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-0631206a\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./checkbox.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('label',{staticClass:\"checkbox\",class:{ disabled: _vm.disabled, indeterminate: _vm.indeterminate }},[_c('input',{attrs:{\"type\":\"checkbox\",\"disabled\":_vm.disabled},domProps:{\"checked\":_vm.checked,\"indeterminate\":_vm.indeterminate},on:{\"change\":function($event){return _vm.$emit('change', $event.target.checked)}}}),_vm._v(\" \"),_c('i',{staticClass:\"checkbox-indicator\"}),_vm._v(\" \"),(!!_vm.$slots.default)?_c('span',{staticClass:\"label\"},[_vm._t(\"default\")],2):_vm._e()])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import { map } from 'lodash'\nimport apiService from '../api/api.service.js'\n\nconst postStatus = ({\n store,\n status,\n spoilerText,\n visibility,\n sensitive,\n poll,\n media = [],\n inReplyToStatusId = undefined,\n contentType = 'text/plain',\n preview = false,\n idempotencyKey = ''\n}) => {\n const mediaIds = map(media, 'id')\n\n return apiService.postStatus({\n credentials: store.state.users.currentUser.credentials,\n status,\n spoilerText,\n visibility,\n sensitive,\n mediaIds,\n inReplyToStatusId,\n contentType,\n poll,\n preview,\n idempotencyKey\n })\n .then((data) => {\n if (!data.error && !preview) {\n store.dispatch('addNewStatuses', {\n statuses: [data],\n timeline: 'friends',\n showImmediately: true,\n noIdUpdate: true // To prevent missing notices on next pull.\n })\n }\n return data\n })\n .catch((err) => {\n return {\n error: err.message\n }\n })\n}\n\nconst uploadMedia = ({ store, formData }) => {\n const credentials = store.state.users.currentUser.credentials\n return apiService.uploadMedia({ credentials, formData })\n}\n\nconst setMediaDescription = ({ store, id, description }) => {\n const credentials = store.state.users.currentUser.credentials\n return apiService.setMediaDescription({ credentials, id, description })\n}\n\nconst statusPosterService = {\n postStatus,\n uploadMedia,\n setMediaDescription\n}\n\nexport default statusPosterService\n","const StillImage = {\n props: [\n 'src',\n 'referrerpolicy',\n 'mimetype',\n 'imageLoadError',\n 'imageLoadHandler',\n 'alt'\n ],\n data () {\n return {\n stopGifs: this.$store.getters.mergedConfig.stopGifs\n }\n },\n computed: {\n animated () {\n return this.stopGifs && (this.mimetype === 'image/gif' || this.src.endsWith('.gif'))\n }\n },\n methods: {\n onLoad () {\n this.imageLoadHandler && this.imageLoadHandler(this.$refs.src)\n const canvas = this.$refs.canvas\n if (!canvas) return\n const width = this.$refs.src.naturalWidth\n const height = this.$refs.src.naturalHeight\n canvas.width = width\n canvas.height = height\n canvas.getContext('2d').drawImage(this.$refs.src, 0, 0, width, height)\n },\n onError () {\n this.imageLoadError && this.imageLoadError()\n }\n }\n}\n\nexport default StillImage\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./still-image.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./still-image.js\"\nimport __vue_script__ from \"!!babel-loader!./still-image.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-3a23c4ff\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./still-image.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"still-image\",class:{ animated: _vm.animated }},[(_vm.animated)?_c('canvas',{ref:\"canvas\"}):_vm._e(),_vm._v(\" \"),_c('img',{key:_vm.src,ref:\"src\",attrs:{\"alt\":_vm.alt,\"title\":_vm.alt,\"src\":_vm.src,\"referrerpolicy\":_vm.referrerpolicy},on:{\"load\":_vm.onLoad,\"error\":_vm.onError}})])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","// When contributing, please sort JSON before committing so it would be easier to see what's missing and what's being added compared to English and other languages. It's not obligatory, but just an advice.\n// To sort json use jq https://stedolan.github.io/jq and invoke it like `jq -S . xx.json > xx.sorted.json`, AFAIK, there's no inplace edit option like in sed\n// Also, when adding a new language to \"messages\" variable, please do it alphabetically by language code so that users can search or check their custom language easily.\n\n// For anyone contributing to old huge messages.js and in need to quickly convert it to JSON\n// sed command for converting currently formatted JS to JSON:\n// sed -i -e \"s/'//gm\" -e 's/\"/\\\\\"/gm' -re 's/^( +)(.+?): ((.+?))?(,?)(\\{?)$/\\1\"\\2\": \"\\4\"/gm' -e 's/\\\"\\{\\\"/{/g' -e 's/,\"$/\",/g' file.json\n// There's only problem that apostrophe character ' gets replaced by \\\\ so you have to fix it manually, sorry.\n\nconst loaders = {\n ar: () => import('./ar.json'),\n ca: () => import('./ca.json'),\n cs: () => import('./cs.json'),\n de: () => import('./de.json'),\n eo: () => import('./eo.json'),\n es: () => import('./es.json'),\n et: () => import('./et.json'),\n eu: () => import('./eu.json'),\n fi: () => import('./fi.json'),\n fr: () => import('./fr.json'),\n ga: () => import('./ga.json'),\n he: () => import('./he.json'),\n hu: () => import('./hu.json'),\n it: () => import('./it.json'),\n ja: () => import('./ja_pedantic.json'),\n ja_easy: () => import('./ja_easy.json'),\n ko: () => import('./ko.json'),\n nb: () => import('./nb.json'),\n nl: () => import('./nl.json'),\n oc: () => import('./oc.json'),\n pl: () => import('./pl.json'),\n pt: () => import('./pt.json'),\n ro: () => import('./ro.json'),\n ru: () => import('./ru.json'),\n te: () => import('./te.json'),\n zh: () => import('./zh.json')\n}\n\nconst messages = {\n languages: ['en', ...Object.keys(loaders)],\n default: {\n en: require('./en.json')\n },\n setLanguage: async (i18n, language) => {\n if (loaders[language]) {\n let messages = await loaders[language]()\n i18n.setLocaleMessage(language, messages)\n }\n i18n.locale = language\n }\n}\n\nexport default messages\n","\n\n\n","/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./progress_button.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./progress_button.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-9f751ae6\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./progress_button.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('button',{attrs:{\"disabled\":_vm.progress || _vm.disabled},on:{\"click\":_vm.onClick}},[(_vm.progress && _vm.$slots.progress)?[_vm._t(\"progress\")]:[_vm._t(\"default\")]],2)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import { set, delete as del } from 'vue'\nimport { setPreset, applyTheme } from '../services/style_setter/style_setter.js'\nimport messages from '../i18n/messages'\n\nconst browserLocale = (window.navigator.language || 'en').split('-')[0]\n\n/* TODO this is a bit messy.\n * We need to declare settings with their types and also deal with\n * instance-default settings in some way, hopefully try to avoid copy-pasta\n * in general.\n */\nexport const multiChoiceProperties = [\n 'postContentType',\n 'subjectLineBehavior'\n]\n\nexport const defaultState = {\n colors: {},\n theme: undefined,\n customTheme: undefined,\n customThemeSource: undefined,\n hideISP: false,\n // bad name: actually hides posts of muted USERS\n hideMutedPosts: undefined, // instance default\n collapseMessageWithSubject: undefined, // instance default\n padEmoji: true,\n hideAttachments: false,\n hideAttachmentsInConv: false,\n maxThumbnails: 16,\n hideNsfw: true,\n preloadImage: true,\n loopVideo: true,\n loopVideoSilentOnly: true,\n streaming: false,\n emojiReactionsOnTimeline: true,\n autohideFloatingPostButton: false,\n pauseOnUnfocused: true,\n stopGifs: false,\n replyVisibility: 'all',\n notificationVisibility: {\n follows: true,\n mentions: true,\n likes: true,\n repeats: true,\n moves: true,\n emojiReactions: false,\n followRequest: true,\n chatMention: true\n },\n webPushNotifications: false,\n muteWords: [],\n highlight: {},\n interfaceLanguage: browserLocale,\n hideScopeNotice: false,\n useStreamingApi: false,\n scopeCopy: undefined, // instance default\n subjectLineBehavior: undefined, // instance default\n alwaysShowSubjectInput: undefined, // instance default\n postContentType: undefined, // instance default\n minimalScopesMode: undefined, // instance default\n // This hides statuses filtered via a word filter\n hideFilteredStatuses: undefined, // instance default\n playVideosInModal: false,\n useOneClickNsfw: false,\n useContainFit: false,\n greentext: undefined, // instance default\n hidePostStats: undefined, // instance default\n hideUserStats: undefined // instance default\n}\n\n// caching the instance default properties\nexport const instanceDefaultProperties = Object.entries(defaultState)\n .filter(([key, value]) => value === undefined)\n .map(([key, value]) => key)\n\nconst config = {\n state: defaultState,\n getters: {\n mergedConfig (state, getters, rootState, rootGetters) {\n const { instance } = rootState\n return {\n ...state,\n ...instanceDefaultProperties\n .map(key => [key, state[key] === undefined\n ? instance[key]\n : state[key]\n ])\n .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {})\n }\n }\n },\n mutations: {\n setOption (state, { name, value }) {\n set(state, name, value)\n },\n setHighlight (state, { user, color, type }) {\n const data = this.state.config.highlight[user]\n if (color || type) {\n set(state.highlight, user, { color: color || data.color, type: type || data.type })\n } else {\n del(state.highlight, user)\n }\n }\n },\n actions: {\n setHighlight ({ commit, dispatch }, { user, color, type }) {\n commit('setHighlight', { user, color, type })\n },\n setOption ({ commit, dispatch }, { name, value }) {\n commit('setOption', { name, value })\n switch (name) {\n case 'theme':\n setPreset(value)\n break\n case 'customTheme':\n case 'customThemeSource':\n applyTheme(value)\n break\n case 'interfaceLanguage':\n messages.setLanguage(this.getters.i18n, value)\n break\n }\n }\n }\n}\n\nexport default config\n","import { filter } from 'lodash'\n\nexport const muteWordHits = (status, muteWords) => {\n const statusText = status.text.toLowerCase()\n const statusSummary = status.summary.toLowerCase()\n const hits = filter(muteWords, (muteWord) => {\n return statusText.includes(muteWord.toLowerCase()) || statusSummary.includes(muteWord.toLowerCase())\n })\n\n return hits\n}\n","export const showDesktopNotification = (rootState, desktopNotificationOpts) => {\n if (!('Notification' in window && window.Notification.permission === 'granted')) return\n if (rootState.statuses.notifications.desktopNotificationSilence) { return }\n\n const desktopNotification = new window.Notification(desktopNotificationOpts.title, desktopNotificationOpts)\n // Chrome is known for not closing notifications automatically\n // according to MDN, anyway.\n setTimeout(desktopNotification.close.bind(desktopNotification), 5000)\n}\n","export const findOffset = (child, parent, { top = 0, left = 0 } = {}, ignorePadding = true) => {\n const result = {\n top: top + child.offsetTop,\n left: left + child.offsetLeft\n }\n if (!ignorePadding && child !== window) {\n const { topPadding, leftPadding } = findPadding(child)\n result.top += ignorePadding ? 0 : topPadding\n result.left += ignorePadding ? 0 : leftPadding\n }\n\n if (child.offsetParent && (parent === window || parent.contains(child.offsetParent) || parent === child.offsetParent)) {\n return findOffset(child.offsetParent, parent, result, false)\n } else {\n if (parent !== window) {\n const { topPadding, leftPadding } = findPadding(parent)\n result.top += topPadding\n result.left += leftPadding\n }\n return result\n }\n}\n\nconst findPadding = (el) => {\n const topPaddingStr = window.getComputedStyle(el)['padding-top']\n const topPadding = Number(topPaddingStr.substring(0, topPaddingStr.length - 2))\n const leftPaddingStr = window.getComputedStyle(el)['padding-left']\n const leftPadding = Number(leftPaddingStr.substring(0, leftPaddingStr.length - 2))\n\n return { topPadding, leftPadding }\n}\n","const fetchRelationship = (attempt, userId, store) => new Promise((resolve, reject) => {\n setTimeout(() => {\n store.state.api.backendInteractor.fetchUserRelationship({ id: userId })\n .then((relationship) => {\n store.commit('updateUserRelationship', [relationship])\n return relationship\n })\n .then((relationship) => resolve([relationship.following, relationship.requested, relationship.locked, attempt]))\n .catch((e) => reject(e))\n }, 500)\n}).then(([following, sent, locked, attempt]) => {\n if (!following && !(locked && sent) && attempt <= 3) {\n // If we BE reports that we still not following that user - retry,\n // increment attempts by one\n fetchRelationship(++attempt, userId, store)\n }\n})\n\nexport const requestFollow = (userId, store) => new Promise((resolve, reject) => {\n store.state.api.backendInteractor.followUser({ id: userId })\n .then((updated) => {\n store.commit('updateUserRelationship', [updated])\n\n if (updated.following || (updated.locked && updated.requested)) {\n // If we get result immediately or the account is locked, just stop.\n resolve()\n return\n }\n\n // But usually we don't get result immediately, so we ask server\n // for updated user profile to confirm if we are following them\n // Sometimes it takes several tries. Sometimes we end up not following\n // user anyway, probably because they locked themselves and we\n // don't know that yet.\n // Recursive Promise, it will call itself up to 3 times.\n\n return fetchRelationship(1, updated, store)\n .then(() => {\n resolve()\n })\n })\n})\n\nexport const requestUnfollow = (userId, store) => new Promise((resolve, reject) => {\n store.state.api.backendInteractor.unfollowUser({ id: userId })\n .then((updated) => {\n store.commit('updateUserRelationship', [updated])\n resolve({\n updated\n })\n })\n})\n","import { requestFollow, requestUnfollow } from '../../services/follow_manipulate/follow_manipulate'\nexport default {\n props: ['relationship', 'labelFollowing', 'buttonClass'],\n data () {\n return {\n inProgress: false\n }\n },\n computed: {\n isPressed () {\n return this.inProgress || this.relationship.following\n },\n title () {\n if (this.inProgress || this.relationship.following) {\n return this.$t('user_card.follow_unfollow')\n } else if (this.relationship.requested) {\n return this.$t('user_card.follow_again')\n } else {\n return this.$t('user_card.follow')\n }\n },\n label () {\n if (this.inProgress) {\n return this.$t('user_card.follow_progress')\n } else if (this.relationship.following) {\n return this.labelFollowing || this.$t('user_card.following')\n } else if (this.relationship.requested) {\n return this.$t('user_card.follow_sent')\n } else {\n return this.$t('user_card.follow')\n }\n }\n },\n methods: {\n onClick () {\n this.relationship.following ? this.unfollow() : this.follow()\n },\n follow () {\n this.inProgress = true\n requestFollow(this.relationship.id, this.$store).then(() => {\n this.inProgress = false\n })\n },\n unfollow () {\n const store = this.$store\n this.inProgress = true\n requestUnfollow(this.relationship.id, store).then(() => {\n this.inProgress = false\n store.commit('removeStatus', { timeline: 'friends', userId: this.relationship.id })\n })\n }\n }\n}\n","/* script */\nexport * from \"!!babel-loader!./follow_button.js\"\nimport __vue_script__ from \"!!babel-loader!./follow_button.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-fae84d0a\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./follow_button.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('button',{staticClass:\"btn btn-default follow-button\",class:{ toggled: _vm.isPressed },attrs:{\"disabled\":_vm.inProgress,\"title\":_vm.title},on:{\"click\":_vm.onClick}},[_vm._v(\"\\n \"+_vm._s(_vm.label)+\"\\n\")])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","\nconst VideoAttachment = {\n props: ['attachment', 'controls'],\n data () {\n return {\n loopVideo: this.$store.getters.mergedConfig.loopVideo\n }\n },\n methods: {\n onVideoDataLoad (e) {\n const target = e.srcElement || e.target\n if (typeof target.webkitAudioDecodedByteCount !== 'undefined') {\n // non-zero if video has audio track\n if (target.webkitAudioDecodedByteCount > 0) {\n this.loopVideo = this.loopVideo && !this.$store.getters.mergedConfig.loopVideoSilentOnly\n }\n } else if (typeof target.mozHasAudio !== 'undefined') {\n // true if video has audio track\n if (target.mozHasAudio) {\n this.loopVideo = this.loopVideo && !this.$store.getters.mergedConfig.loopVideoSilentOnly\n }\n } else if (typeof target.audioTracks !== 'undefined') {\n if (target.audioTracks.length > 0) {\n this.loopVideo = this.loopVideo && !this.$store.getters.mergedConfig.loopVideoSilentOnly\n }\n }\n }\n }\n}\n\nexport default VideoAttachment\n","/* script */\nexport * from \"!!babel-loader!./video_attachment.js\"\nimport __vue_script__ from \"!!babel-loader!./video_attachment.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-45029e08\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./video_attachment.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('video',{staticClass:\"video\",attrs:{\"src\":_vm.attachment.url,\"loop\":_vm.loopVideo,\"controls\":_vm.controls,\"alt\":_vm.attachment.description,\"title\":_vm.attachment.description,\"playsinline\":\"\"},on:{\"loadeddata\":_vm.onVideoDataLoad}})}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import Attachment from '../attachment/attachment.vue'\nimport { chunk, last, dropRight, sumBy } from 'lodash'\n\nconst Gallery = {\n props: [\n 'attachments',\n 'nsfw',\n 'setMedia'\n ],\n data () {\n return {\n sizes: {}\n }\n },\n components: { Attachment },\n computed: {\n rows () {\n if (!this.attachments) {\n return []\n }\n const rows = chunk(this.attachments, 3)\n if (last(rows).length === 1 && rows.length > 1) {\n // if 1 attachment on last row -> add it to the previous row instead\n const lastAttachment = last(rows)[0]\n const allButLastRow = dropRight(rows)\n last(allButLastRow).push(lastAttachment)\n return allButLastRow\n }\n return rows\n },\n useContainFit () {\n return this.$store.getters.mergedConfig.useContainFit\n }\n },\n methods: {\n onNaturalSizeLoad (id, size) {\n this.$set(this.sizes, id, size)\n },\n rowStyle (itemsPerRow) {\n return { 'padding-bottom': `${(100 / (itemsPerRow + 0.6))}%` }\n },\n itemStyle (id, row) {\n const total = sumBy(row, item => this.getAspectRatio(item.id))\n return { flex: `${this.getAspectRatio(id) / total} 1 0%` }\n },\n getAspectRatio (id) {\n const size = this.sizes[id]\n return size ? size.width / size.height : 1\n }\n }\n}\n\nexport default Gallery\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./gallery.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./gallery.js\"\nimport __vue_script__ from \"!!babel-loader!./gallery.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-3db94942\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./gallery.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{ref:\"galleryContainer\",staticStyle:{\"width\":\"100%\"}},_vm._l((_vm.rows),function(row,index){return _c('div',{key:index,staticClass:\"gallery-row\",class:{ 'contain-fit': _vm.useContainFit, 'cover-fit': !_vm.useContainFit },style:(_vm.rowStyle(row.length))},[_c('div',{staticClass:\"gallery-row-inner\"},_vm._l((row),function(attachment){return _c('attachment',{key:attachment.id,style:(_vm.itemStyle(attachment.id, row)),attrs:{\"set-media\":_vm.setMedia,\"nsfw\":_vm.nsfw,\"attachment\":attachment,\"allow-play\":false,\"natural-size-load\":_vm.onNaturalSizeLoad.bind(null, attachment.id)}})}),1)])}),0)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","const LinkPreview = {\n name: 'LinkPreview',\n props: [\n 'card',\n 'size',\n 'nsfw'\n ],\n data () {\n return {\n imageLoaded: false\n }\n },\n computed: {\n useImage () {\n // Currently BE shoudn't give cards if tagged NSFW, this is a bit paranoid\n // as it makes sure to hide the image if somehow NSFW tagged preview can\n // exist.\n return this.card.image && !this.nsfw && this.size !== 'hide'\n },\n useDescription () {\n return this.card.description && /\\S/.test(this.card.description)\n }\n },\n created () {\n if (this.useImage) {\n const newImg = new Image()\n newImg.onload = () => {\n this.imageLoaded = true\n }\n newImg.src = this.card.image\n }\n }\n}\n\nexport default LinkPreview\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./link-preview.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./link-preview.js\"\nimport __vue_script__ from \"!!babel-loader!./link-preview.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-7c8d99ac\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./link-preview.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('a',{staticClass:\"link-preview-card\",attrs:{\"href\":_vm.card.url,\"target\":\"_blank\",\"rel\":\"noopener\"}},[(_vm.useImage && _vm.imageLoaded)?_c('div',{staticClass:\"card-image\",class:{ 'small-image': _vm.size === 'small' }},[_c('img',{attrs:{\"src\":_vm.card.image}})]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"card-content\"},[_c('span',{staticClass:\"card-host faint\"},[_vm._v(_vm._s(_vm.card.provider_name))]),_vm._v(\" \"),_c('h4',{staticClass:\"card-title\"},[_vm._v(_vm._s(_vm.card.title))]),_vm._v(\" \"),(_vm.useDescription)?_c('p',{staticClass:\"card-description\"},[_vm._v(_vm._s(_vm.card.description))]):_vm._e()])])])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","export default {\n props: [ 'user' ],\n computed: {\n subscribeUrl () {\n // eslint-disable-next-line no-undef\n const serverUrl = new URL(this.user.statusnet_profile_url)\n return `${serverUrl.protocol}//${serverUrl.host}/main/ostatus`\n }\n }\n}\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./remote_follow.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./remote_follow.js\"\nimport __vue_script__ from \"!!babel-loader!./remote_follow.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-e95e446e\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./remote_follow.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"remote-follow\"},[_c('form',{attrs:{\"method\":\"POST\",\"action\":_vm.subscribeUrl}},[_c('input',{attrs:{\"type\":\"hidden\",\"name\":\"nickname\"},domProps:{\"value\":_vm.user.screen_name}}),_vm._v(\" \"),_c('input',{attrs:{\"type\":\"hidden\",\"name\":\"profile\",\"value\":\"\"}}),_vm._v(\" \"),_c('button',{staticClass:\"remote-button\",attrs:{\"click\":\"submit\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.remote_follow'))+\"\\n \")])])])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import UserAvatar from '../user_avatar/user_avatar.vue'\nimport generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'\n\nconst AvatarList = {\n props: ['users'],\n computed: {\n slicedUsers () {\n return this.users ? this.users.slice(0, 15) : []\n }\n },\n components: {\n UserAvatar\n },\n methods: {\n userProfileLink (user) {\n return generateProfileLink(user.id, user.screen_name, this.$store.state.instance.restrictedNicknames)\n }\n }\n}\n\nexport default AvatarList\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./avatar_list.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./avatar_list.js\"\nimport __vue_script__ from \"!!babel-loader!./avatar_list.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-4cea5bcf\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./avatar_list.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"avatars\"},_vm._l((_vm.slicedUsers),function(user){return _c('router-link',{key:user.id,staticClass:\"avatars-item\",attrs:{\"to\":_vm.userProfileLink(user)}},[_c('UserAvatar',{staticClass:\"avatar-small\",attrs:{\"user\":user}})],1)}),1)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","const fileSizeFormat = (num) => {\n var exponent\n var unit\n var units = ['B', 'KiB', 'MiB', 'GiB', 'TiB']\n if (num < 1) {\n return num + ' ' + units[0]\n }\n\n exponent = Math.min(Math.floor(Math.log(num) / Math.log(1024)), units.length - 1)\n num = (num / Math.pow(1024, exponent)).toFixed(2) * 1\n unit = units[exponent]\n return { num: num, unit: unit }\n}\nconst fileSizeFormatService = {\n fileSizeFormat\n}\nexport default fileSizeFormatService\n","import { debounce } from 'lodash'\n/**\n * suggest - generates a suggestor function to be used by emoji-input\n * data: object providing source information for specific types of suggestions:\n * data.emoji - optional, an array of all emoji available i.e.\n * (state.instance.emoji + state.instance.customEmoji)\n * data.users - optional, an array of all known users\n * updateUsersList - optional, a function to search and append to users\n *\n * Depending on data present one or both (or none) can be present, so if field\n * doesn't support user linking you can just provide only emoji.\n */\n\nconst debounceUserSearch = debounce((data, input) => {\n data.updateUsersList(input)\n}, 500)\n\nexport default data => input => {\n const firstChar = input[0]\n if (firstChar === ':' && data.emoji) {\n return suggestEmoji(data.emoji)(input)\n }\n if (firstChar === '@' && data.users) {\n return suggestUsers(data)(input)\n }\n return []\n}\n\nexport const suggestEmoji = emojis => input => {\n const noPrefix = input.toLowerCase().substr(1)\n return emojis\n .filter(({ displayText }) => displayText.toLowerCase().match(noPrefix))\n .sort((a, b) => {\n let aScore = 0\n let bScore = 0\n\n // An exact match always wins\n aScore += a.displayText.toLowerCase() === noPrefix ? 200 : 0\n bScore += b.displayText.toLowerCase() === noPrefix ? 200 : 0\n\n // Prioritize custom emoji a lot\n aScore += a.imageUrl ? 100 : 0\n bScore += b.imageUrl ? 100 : 0\n\n // Prioritize prefix matches somewhat\n aScore += a.displayText.toLowerCase().startsWith(noPrefix) ? 10 : 0\n bScore += b.displayText.toLowerCase().startsWith(noPrefix) ? 10 : 0\n\n // Sort by length\n aScore -= a.displayText.length\n bScore -= b.displayText.length\n\n // Break ties alphabetically\n const alphabetically = a.displayText > b.displayText ? 0.5 : -0.5\n\n return bScore - aScore + alphabetically\n })\n}\n\nexport const suggestUsers = data => input => {\n const noPrefix = input.toLowerCase().substr(1)\n const users = data.users\n\n const newUsers = users.filter(\n user =>\n user.screen_name.toLowerCase().startsWith(noPrefix) ||\n user.name.toLowerCase().startsWith(noPrefix)\n\n /* taking only 20 results so that sorting is a bit cheaper, we display\n * only 5 anyway. could be inaccurate, but we ideally we should query\n * backend anyway\n */\n ).slice(0, 20).sort((a, b) => {\n let aScore = 0\n let bScore = 0\n\n // Matches on screen name (i.e. user@instance) makes a priority\n aScore += a.screen_name.toLowerCase().startsWith(noPrefix) ? 2 : 0\n bScore += b.screen_name.toLowerCase().startsWith(noPrefix) ? 2 : 0\n\n // Matches on name takes second priority\n aScore += a.name.toLowerCase().startsWith(noPrefix) ? 1 : 0\n bScore += b.name.toLowerCase().startsWith(noPrefix) ? 1 : 0\n\n const diff = (bScore - aScore) * 10\n\n // Then sort alphabetically\n const nameAlphabetically = a.name > b.name ? 1 : -1\n const screenNameAlphabetically = a.screen_name > b.screen_name ? 1 : -1\n\n return diff + nameAlphabetically + screenNameAlphabetically\n /* eslint-disable camelcase */\n }).map(({ screen_name, name, profile_image_url_original }) => ({\n displayText: screen_name,\n detailText: name,\n imageUrl: profile_image_url_original,\n replacement: '@' + screen_name + ' '\n }))\n\n // BE search users to get more comprehensive results\n if (data.updateUsersList) {\n debounceUserSearch(data, noPrefix)\n }\n return newUsers\n /* eslint-enable camelcase */\n}\n","import Vue from 'vue'\nimport { mapState } from 'vuex'\n\nimport './tab_switcher.scss'\n\nexport default Vue.component('tab-switcher', {\n name: 'TabSwitcher',\n props: {\n renderOnlyFocused: {\n required: false,\n type: Boolean,\n default: false\n },\n onSwitch: {\n required: false,\n type: Function,\n default: undefined\n },\n activeTab: {\n required: false,\n type: String,\n default: undefined\n },\n scrollableTabs: {\n required: false,\n type: Boolean,\n default: false\n },\n sideTabBar: {\n required: false,\n type: Boolean,\n default: false\n }\n },\n data () {\n return {\n active: this.$slots.default.findIndex(_ => _.tag)\n }\n },\n computed: {\n activeIndex () {\n // In case of controlled component\n if (this.activeTab) {\n return this.$slots.default.findIndex(slot => this.activeTab === slot.key)\n } else {\n return this.active\n }\n },\n settingsModalVisible () {\n return this.settingsModalState === 'visible'\n },\n ...mapState({\n settingsModalState: state => state.interface.settingsModalState\n })\n },\n beforeUpdate () {\n const currentSlot = this.$slots.default[this.active]\n if (!currentSlot.tag) {\n this.active = this.$slots.default.findIndex(_ => _.tag)\n }\n },\n methods: {\n clickTab (index) {\n return (e) => {\n e.preventDefault()\n this.setTab(index)\n }\n },\n setTab (index) {\n if (typeof this.onSwitch === 'function') {\n this.onSwitch.call(null, this.$slots.default[index].key)\n }\n this.active = index\n if (this.scrollableTabs) {\n this.$refs.contents.scrollTop = 0\n }\n }\n },\n render (h) {\n const tabs = this.$slots.default\n .map((slot, index) => {\n if (!slot.tag) return\n const classesTab = ['tab']\n const classesWrapper = ['tab-wrapper']\n if (this.activeIndex === index) {\n classesTab.push('active')\n classesWrapper.push('active')\n }\n if (slot.data.attrs.image) {\n return (\n

\n \n \n {slot.data.attrs.label ? '' : slot.data.attrs.label}\n \n
\n )\n }\n return (\n
\n \n {!slot.data.attrs.icon ? '' : ()}\n \n {slot.data.attrs.label}\n \n \n
\n )\n })\n\n const contents = this.$slots.default.map((slot, index) => {\n if (!slot.tag) return\n const active = this.activeIndex === index\n const classes = [ active ? 'active' : 'hidden' ]\n if (slot.data.attrs.fullHeight) {\n classes.push('full-height')\n }\n const renderSlot = (!this.renderOnlyFocused || active)\n ? slot\n : ''\n\n return (\n
\n {\n this.sideTabBar\n ?

{slot.data.attrs.label}

\n : ''\n }\n {renderSlot}\n
\n )\n })\n\n return (\n
\n
\n {tabs}\n
\n
\n {contents}\n
\n
\n )\n }\n})\n","import isFunction from 'lodash/isFunction'\n\nconst getComponentOptions = (Component) => (isFunction(Component)) ? Component.options : Component\n\nconst getComponentProps = (Component) => getComponentOptions(Component).props\n\nexport {\n getComponentOptions,\n getComponentProps\n}\n","import { reduce, find } from 'lodash'\n\nexport const replaceWord = (str, toReplace, replacement) => {\n return str.slice(0, toReplace.start) + replacement + str.slice(toReplace.end)\n}\n\nexport const wordAtPosition = (str, pos) => {\n const words = splitByWhitespaceBoundary(str)\n const wordsWithPosition = addPositionToWords(words)\n\n return find(wordsWithPosition, ({ start, end }) => start <= pos && end > pos)\n}\n\nexport const addPositionToWords = (words) => {\n return reduce(words, (result, word) => {\n const data = {\n word,\n start: 0,\n end: word.length\n }\n\n if (result.length > 0) {\n const previous = result.pop()\n\n data.start += previous.end\n data.end += previous.end\n\n result.push(previous)\n }\n\n result.push(data)\n\n return result\n }, [])\n}\n\nexport const splitByWhitespaceBoundary = (str) => {\n let result = []\n let currentWord = ''\n for (let i = 0; i < str.length; i++) {\n const currentChar = str[i]\n // Starting a new word\n if (!currentWord) {\n currentWord = currentChar\n continue\n }\n // current character is whitespace while word isn't, or vice versa:\n // add our current word to results, start over the current word.\n if (!!currentChar.trim() !== !!currentWord.trim()) {\n result.push(currentWord)\n currentWord = currentChar\n continue\n }\n currentWord += currentChar\n }\n // Add the last word we were working on\n if (currentWord) {\n result.push(currentWord)\n }\n return result\n}\n\nconst completion = {\n wordAtPosition,\n addPositionToWords,\n splitByWhitespaceBoundary,\n replaceWord\n}\n\nexport default completion\n","import Checkbox from '../checkbox/checkbox.vue'\n\n// At widest, approximately 20 emoji are visible in a row,\n// loading 3 rows, could be overkill for narrow picker\nconst LOAD_EMOJI_BY = 60\n\n// When to start loading new batch emoji, in pixels\nconst LOAD_EMOJI_MARGIN = 64\n\nconst filterByKeyword = (list, keyword = '') => {\n return list.filter(x => x.displayText.includes(keyword))\n}\n\nconst EmojiPicker = {\n props: {\n enableStickerPicker: {\n required: false,\n type: Boolean,\n default: false\n }\n },\n data () {\n return {\n keyword: '',\n activeGroup: 'custom',\n showingStickers: false,\n groupsScrolledClass: 'scrolled-top',\n keepOpen: false,\n customEmojiBufferSlice: LOAD_EMOJI_BY,\n customEmojiTimeout: null,\n customEmojiLoadAllConfirmed: false\n }\n },\n components: {\n StickerPicker: () => import('../sticker_picker/sticker_picker.vue'),\n Checkbox\n },\n methods: {\n onStickerUploaded (e) {\n this.$emit('sticker-uploaded', e)\n },\n onStickerUploadFailed (e) {\n this.$emit('sticker-upload-failed', e)\n },\n onEmoji (emoji) {\n const value = emoji.imageUrl ? `:${emoji.displayText}:` : emoji.replacement\n this.$emit('emoji', { insertion: value, keepOpen: this.keepOpen })\n },\n onScroll (e) {\n const target = (e && e.target) || this.$refs['emoji-groups']\n this.updateScrolledClass(target)\n this.scrolledGroup(target)\n this.triggerLoadMore(target)\n },\n highlight (key) {\n const ref = this.$refs['group-' + key]\n const top = ref[0].offsetTop\n this.setShowStickers(false)\n this.activeGroup = key\n this.$nextTick(() => {\n this.$refs['emoji-groups'].scrollTop = top + 1\n })\n },\n updateScrolledClass (target) {\n if (target.scrollTop <= 5) {\n this.groupsScrolledClass = 'scrolled-top'\n } else if (target.scrollTop >= target.scrollTopMax - 5) {\n this.groupsScrolledClass = 'scrolled-bottom'\n } else {\n this.groupsScrolledClass = 'scrolled-middle'\n }\n },\n triggerLoadMore (target) {\n const ref = this.$refs['group-end-custom'][0]\n if (!ref) return\n const bottom = ref.offsetTop + ref.offsetHeight\n\n const scrollerBottom = target.scrollTop + target.clientHeight\n const scrollerTop = target.scrollTop\n const scrollerMax = target.scrollHeight\n\n // Loads more emoji when they come into view\n const approachingBottom = bottom - scrollerBottom < LOAD_EMOJI_MARGIN\n // Always load when at the very top in case there's no scroll space yet\n const atTop = scrollerTop < 5\n // Don't load when looking at unicode category or at the very bottom\n const bottomAboveViewport = bottom < scrollerTop || scrollerBottom === scrollerMax\n if (!bottomAboveViewport && (approachingBottom || atTop)) {\n this.loadEmoji()\n }\n },\n scrolledGroup (target) {\n const top = target.scrollTop + 5\n this.$nextTick(() => {\n this.emojisView.forEach(group => {\n const ref = this.$refs['group-' + group.id]\n if (ref[0].offsetTop <= top) {\n this.activeGroup = group.id\n }\n })\n })\n },\n loadEmoji () {\n const allLoaded = this.customEmojiBuffer.length === this.filteredEmoji.length\n\n if (allLoaded) {\n return\n }\n\n this.customEmojiBufferSlice += LOAD_EMOJI_BY\n },\n startEmojiLoad (forceUpdate = false) {\n if (!forceUpdate) {\n this.keyword = ''\n }\n this.$nextTick(() => {\n this.$refs['emoji-groups'].scrollTop = 0\n })\n const bufferSize = this.customEmojiBuffer.length\n const bufferPrefilledAll = bufferSize === this.filteredEmoji.length\n if (bufferPrefilledAll && !forceUpdate) {\n return\n }\n this.customEmojiBufferSlice = LOAD_EMOJI_BY\n },\n toggleStickers () {\n this.showingStickers = !this.showingStickers\n },\n setShowStickers (value) {\n this.showingStickers = value\n }\n },\n watch: {\n keyword () {\n this.customEmojiLoadAllConfirmed = false\n this.onScroll()\n this.startEmojiLoad(true)\n }\n },\n computed: {\n activeGroupView () {\n return this.showingStickers ? '' : this.activeGroup\n },\n stickersAvailable () {\n if (this.$store.state.instance.stickers) {\n return this.$store.state.instance.stickers.length > 0\n }\n return 0\n },\n filteredEmoji () {\n return filterByKeyword(\n this.$store.state.instance.customEmoji || [],\n this.keyword\n )\n },\n customEmojiBuffer () {\n return this.filteredEmoji.slice(0, this.customEmojiBufferSlice)\n },\n emojis () {\n const standardEmojis = this.$store.state.instance.emoji || []\n const customEmojis = this.customEmojiBuffer\n\n return [\n {\n id: 'custom',\n text: this.$t('emoji.custom'),\n icon: 'icon-smile',\n emojis: customEmojis\n },\n {\n id: 'standard',\n text: this.$t('emoji.unicode'),\n icon: 'icon-picture',\n emojis: filterByKeyword(standardEmojis, this.keyword)\n }\n ]\n },\n emojisView () {\n return this.emojis.filter(value => value.emojis.length > 0)\n },\n stickerPickerEnabled () {\n return (this.$store.state.instance.stickers || []).length !== 0\n }\n }\n}\n\nexport default EmojiPicker\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!./emoji_picker.scss\")\n}\n/* script */\nexport * from \"!!babel-loader!./emoji_picker.js\"\nimport __vue_script__ from \"!!babel-loader!./emoji_picker.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-47d21b3b\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./emoji_picker.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"emoji-picker panel panel-default panel-body\"},[_c('div',{staticClass:\"heading\"},[_c('span',{staticClass:\"emoji-tabs\"},_vm._l((_vm.emojis),function(group){return _c('span',{key:group.id,staticClass:\"emoji-tabs-item\",class:{\n active: _vm.activeGroupView === group.id,\n disabled: group.emojis.length === 0\n },attrs:{\"title\":group.text},on:{\"click\":function($event){$event.preventDefault();return _vm.highlight(group.id)}}},[_c('i',{class:group.icon})])}),0),_vm._v(\" \"),(_vm.stickerPickerEnabled)?_c('span',{staticClass:\"additional-tabs\"},[_c('span',{staticClass:\"stickers-tab-icon additional-tabs-item\",class:{active: _vm.showingStickers},attrs:{\"title\":_vm.$t('emoji.stickers')},on:{\"click\":function($event){$event.preventDefault();return _vm.toggleStickers($event)}}},[_c('i',{staticClass:\"icon-star\"})])]):_vm._e()]),_vm._v(\" \"),_c('div',{staticClass:\"content\"},[_c('div',{staticClass:\"emoji-content\",class:{hidden: _vm.showingStickers}},[_c('div',{staticClass:\"emoji-search\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.keyword),expression:\"keyword\"}],staticClass:\"form-control\",attrs:{\"type\":\"text\",\"placeholder\":_vm.$t('emoji.search_emoji')},domProps:{\"value\":(_vm.keyword)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.keyword=$event.target.value}}})]),_vm._v(\" \"),_c('div',{ref:\"emoji-groups\",staticClass:\"emoji-groups\",class:_vm.groupsScrolledClass,on:{\"scroll\":_vm.onScroll}},_vm._l((_vm.emojisView),function(group){return _c('div',{key:group.id,staticClass:\"emoji-group\"},[_c('h6',{ref:'group-' + group.id,refInFor:true,staticClass:\"emoji-group-title\"},[_vm._v(\"\\n \"+_vm._s(group.text)+\"\\n \")]),_vm._v(\" \"),_vm._l((group.emojis),function(emoji){return _c('span',{key:group.id + emoji.displayText,staticClass:\"emoji-item\",attrs:{\"title\":emoji.displayText},on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.onEmoji(emoji)}}},[(!emoji.imageUrl)?_c('span',[_vm._v(_vm._s(emoji.replacement))]):_c('img',{attrs:{\"src\":emoji.imageUrl}})])}),_vm._v(\" \"),_c('span',{ref:'group-end-' + group.id,refInFor:true})],2)}),0),_vm._v(\" \"),_c('div',{staticClass:\"keep-open\"},[_c('Checkbox',{model:{value:(_vm.keepOpen),callback:function ($$v) {_vm.keepOpen=$$v},expression:\"keepOpen\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('emoji.keep_open'))+\"\\n \")])],1)]),_vm._v(\" \"),(_vm.showingStickers)?_c('div',{staticClass:\"stickers-content\"},[_c('sticker-picker',{on:{\"uploaded\":_vm.onStickerUploaded,\"upload-failed\":_vm.onStickerUploadFailed}})],1):_vm._e()])])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import Completion from '../../services/completion/completion.js'\nimport EmojiPicker from '../emoji_picker/emoji_picker.vue'\nimport { take } from 'lodash'\nimport { findOffset } from '../../services/offset_finder/offset_finder.service.js'\n\n/**\n * EmojiInput - augmented inputs for emoji and autocomplete support in inputs\n * without having to give up the comfort of and