main 147c3cfcbb35 cached
2374 files
7.4 MB
2.1M tokens
5947 symbols
1 requests
Download .txt
Showing preview only (8,900K chars total). Download the full file or copy to clipboard to get everything.
Repository: florence-social/mastodon-fork
Branch: main
Commit: 147c3cfcbb35
Files: 2374
Total size: 7.4 MB

Directory structure:
gitextract_pog1r_hd/

├── .buildpacks
├── .circleci/
│   └── config.yml
├── .codeclimate.yml
├── .dependabot/
│   └── config.yml
├── .dockerignore
├── .editorconfig
├── .eslintignore
├── .eslintrc.js
├── .foreman
├── .gitattributes
├── .gitignore
├── .haml-lint.yml
├── .nanoignore
├── .nvmrc
├── .profile
├── .rspec
├── .rubocop.yml
├── .ruby-version
├── .sass-lint.yml
├── .slugignore
├── .yarnclean
├── AUTHORS.md
├── Aptfile
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Capfile
├── Dockerfile
├── Gemfile
├── LICENSE
├── Procfile
├── Procfile.dev
├── README.md
├── Rakefile
├── Vagrantfile
├── app/
│   ├── chewy/
│   │   └── statuses_index.rb
│   ├── controllers/
│   │   ├── about_controller.rb
│   │   ├── account_follow_controller.rb
│   │   ├── account_unfollow_controller.rb
│   │   ├── accounts_controller.rb
│   │   ├── activitypub/
│   │   │   ├── collections_controller.rb
│   │   │   ├── inboxes_controller.rb
│   │   │   └── outboxes_controller.rb
│   │   ├── admin/
│   │   │   ├── account_actions_controller.rb
│   │   │   ├── account_moderation_notes_controller.rb
│   │   │   ├── accounts_controller.rb
│   │   │   ├── action_logs_controller.rb
│   │   │   ├── base_controller.rb
│   │   │   ├── change_emails_controller.rb
│   │   │   ├── confirmations_controller.rb
│   │   │   ├── custom_emojis_controller.rb
│   │   │   ├── dashboard_controller.rb
│   │   │   ├── domain_blocks_controller.rb
│   │   │   ├── email_domain_blocks_controller.rb
│   │   │   ├── followers_controller.rb
│   │   │   ├── instances_controller.rb
│   │   │   ├── invites_controller.rb
│   │   │   ├── pending_accounts_controller.rb
│   │   │   ├── relays_controller.rb
│   │   │   ├── report_notes_controller.rb
│   │   │   ├── reported_statuses_controller.rb
│   │   │   ├── reports_controller.rb
│   │   │   ├── resets_controller.rb
│   │   │   ├── roles_controller.rb
│   │   │   ├── settings_controller.rb
│   │   │   ├── statuses_controller.rb
│   │   │   ├── subscriptions_controller.rb
│   │   │   ├── tags_controller.rb
│   │   │   ├── two_factor_authentications_controller.rb
│   │   │   └── warning_presets_controller.rb
│   │   ├── api/
│   │   │   ├── base_controller.rb
│   │   │   ├── oembed_controller.rb
│   │   │   ├── proofs_controller.rb
│   │   │   ├── push_controller.rb
│   │   │   ├── salmon_controller.rb
│   │   │   ├── subscriptions_controller.rb
│   │   │   ├── v1/
│   │   │   │   ├── accounts/
│   │   │   │   │   ├── credentials_controller.rb
│   │   │   │   │   ├── follower_accounts_controller.rb
│   │   │   │   │   ├── following_accounts_controller.rb
│   │   │   │   │   ├── identity_proofs_controller.rb
│   │   │   │   │   ├── lists_controller.rb
│   │   │   │   │   ├── pins_controller.rb
│   │   │   │   │   ├── relationships_controller.rb
│   │   │   │   │   ├── search_controller.rb
│   │   │   │   │   └── statuses_controller.rb
│   │   │   │   ├── accounts_controller.rb
│   │   │   │   ├── apps/
│   │   │   │   │   └── credentials_controller.rb
│   │   │   │   ├── apps_controller.rb
│   │   │   │   ├── blocks_controller.rb
│   │   │   │   ├── conversations_controller.rb
│   │   │   │   ├── custom_emojis_controller.rb
│   │   │   │   ├── domain_blocks_controller.rb
│   │   │   │   ├── endorsements_controller.rb
│   │   │   │   ├── favourites_controller.rb
│   │   │   │   ├── filters_controller.rb
│   │   │   │   ├── follow_requests_controller.rb
│   │   │   │   ├── follows_controller.rb
│   │   │   │   ├── instances/
│   │   │   │   │   ├── activity_controller.rb
│   │   │   │   │   └── peers_controller.rb
│   │   │   │   ├── instances_controller.rb
│   │   │   │   ├── lists/
│   │   │   │   │   └── accounts_controller.rb
│   │   │   │   ├── lists_controller.rb
│   │   │   │   ├── media_controller.rb
│   │   │   │   ├── mutes_controller.rb
│   │   │   │   ├── notifications_controller.rb
│   │   │   │   ├── polls/
│   │   │   │   │   └── votes_controller.rb
│   │   │   │   ├── polls_controller.rb
│   │   │   │   ├── preferences_controller.rb
│   │   │   │   ├── push/
│   │   │   │   │   └── subscriptions_controller.rb
│   │   │   │   ├── reports_controller.rb
│   │   │   │   ├── scheduled_statuses_controller.rb
│   │   │   │   ├── search_controller.rb
│   │   │   │   ├── statuses/
│   │   │   │   │   ├── favourited_by_accounts_controller.rb
│   │   │   │   │   ├── favourites_controller.rb
│   │   │   │   │   ├── mutes_controller.rb
│   │   │   │   │   ├── pins_controller.rb
│   │   │   │   │   ├── reblogged_by_accounts_controller.rb
│   │   │   │   │   └── reblogs_controller.rb
│   │   │   │   ├── statuses_controller.rb
│   │   │   │   ├── streaming_controller.rb
│   │   │   │   ├── suggestions_controller.rb
│   │   │   │   └── timelines/
│   │   │   │       ├── direct_controller.rb
│   │   │   │       ├── home_controller.rb
│   │   │   │       ├── list_controller.rb
│   │   │   │       ├── public_controller.rb
│   │   │   │       └── tag_controller.rb
│   │   │   ├── v2/
│   │   │   │   └── search_controller.rb
│   │   │   └── web/
│   │   │       ├── base_controller.rb
│   │   │       ├── embeds_controller.rb
│   │   │       ├── push_subscriptions_controller.rb
│   │   │       └── settings_controller.rb
│   │   ├── application_controller.rb
│   │   ├── auth/
│   │   │   ├── confirmations_controller.rb
│   │   │   ├── omniauth_callbacks_controller.rb
│   │   │   ├── passwords_controller.rb
│   │   │   ├── registrations_controller.rb
│   │   │   └── sessions_controller.rb
│   │   ├── authorize_interactions_controller.rb
│   │   ├── concerns/
│   │   │   ├── account_controller_concern.rb
│   │   │   ├── accountable_concern.rb
│   │   │   ├── authorization.rb
│   │   │   ├── export_controller_concern.rb
│   │   │   ├── localized.rb
│   │   │   ├── obfuscate_filename.rb
│   │   │   ├── rate_limit_headers.rb
│   │   │   ├── session_tracking_concern.rb
│   │   │   ├── signature_authentication.rb
│   │   │   ├── signature_verification.rb
│   │   │   └── user_tracking_concern.rb
│   │   ├── custom_css_controller.rb
│   │   ├── directories_controller.rb
│   │   ├── emojis_controller.rb
│   │   ├── filters_controller.rb
│   │   ├── follower_accounts_controller.rb
│   │   ├── following_accounts_controller.rb
│   │   ├── home_controller.rb
│   │   ├── intents_controller.rb
│   │   ├── invites_controller.rb
│   │   ├── manifests_controller.rb
│   │   ├── media_controller.rb
│   │   ├── media_proxy_controller.rb
│   │   ├── oauth/
│   │   │   ├── authorizations_controller.rb
│   │   │   ├── authorized_applications_controller.rb
│   │   │   └── tokens_controller.rb
│   │   ├── public_timelines_controller.rb
│   │   ├── relationships_controller.rb
│   │   ├── remote_follow_controller.rb
│   │   ├── remote_interaction_controller.rb
│   │   ├── remote_unfollows_controller.rb
│   │   ├── settings/
│   │   │   ├── applications_controller.rb
│   │   │   ├── base_controller.rb
│   │   │   ├── deletes_controller.rb
│   │   │   ├── exports/
│   │   │   │   ├── blocked_accounts_controller.rb
│   │   │   │   ├── blocked_domains_controller.rb
│   │   │   │   ├── following_accounts_controller.rb
│   │   │   │   ├── lists_controller.rb
│   │   │   │   └── muted_accounts_controller.rb
│   │   │   ├── exports_controller.rb
│   │   │   ├── featured_tags_controller.rb
│   │   │   ├── identity_proofs_controller.rb
│   │   │   ├── imports_controller.rb
│   │   │   ├── migrations_controller.rb
│   │   │   ├── preferences/
│   │   │   │   ├── appearance_controller.rb
│   │   │   │   ├── notifications_controller.rb
│   │   │   │   └── other_controller.rb
│   │   │   ├── preferences_controller.rb
│   │   │   ├── profiles_controller.rb
│   │   │   ├── sessions_controller.rb
│   │   │   ├── two_factor_authentication/
│   │   │   │   ├── confirmations_controller.rb
│   │   │   │   └── recovery_codes_controller.rb
│   │   │   └── two_factor_authentications_controller.rb
│   │   ├── shares_controller.rb
│   │   ├── statuses_controller.rb
│   │   ├── stream_entries_controller.rb
│   │   ├── tags_controller.rb
│   │   └── well_known/
│   │       ├── host_meta_controller.rb
│   │       ├── keybase_proof_config_controller.rb
│   │       └── webfinger_controller.rb
│   ├── helpers/
│   │   ├── admin/
│   │   │   ├── account_moderation_notes_helper.rb
│   │   │   ├── action_logs_helper.rb
│   │   │   ├── dashboard_helper.rb
│   │   │   └── filter_helper.rb
│   │   ├── application_helper.rb
│   │   ├── flashes_helper.rb
│   │   ├── home_helper.rb
│   │   ├── instance_helper.rb
│   │   ├── jsonld_helper.rb
│   │   ├── routing_helper.rb
│   │   ├── settings_helper.rb
│   │   └── stream_entries_helper.rb
│   ├── javascript/
│   │   ├── mastodon/
│   │   │   ├── actions/
│   │   │   │   ├── accounts.js
│   │   │   │   ├── alerts.js
│   │   │   │   ├── blocks.js
│   │   │   │   ├── bundles.js
│   │   │   │   ├── columns.js
│   │   │   │   ├── compose.js
│   │   │   │   ├── conversations.js
│   │   │   │   ├── custom_emojis.js
│   │   │   │   ├── domain_blocks.js
│   │   │   │   ├── dropdown_menu.js
│   │   │   │   ├── emojis.js
│   │   │   │   ├── favourites.js
│   │   │   │   ├── filters.js
│   │   │   │   ├── height_cache.js
│   │   │   │   ├── identity_proofs.js
│   │   │   │   ├── importer/
│   │   │   │   │   ├── index.js
│   │   │   │   │   └── normalizer.js
│   │   │   │   ├── interactions.js
│   │   │   │   ├── lists.js
│   │   │   │   ├── modal.js
│   │   │   │   ├── mutes.js
│   │   │   │   ├── notifications.js
│   │   │   │   ├── onboarding.js
│   │   │   │   ├── pin_statuses.js
│   │   │   │   ├── polls.js
│   │   │   │   ├── push_notifications/
│   │   │   │   │   ├── index.js
│   │   │   │   │   ├── registerer.js
│   │   │   │   │   └── setter.js
│   │   │   │   ├── reports.js
│   │   │   │   ├── search.js
│   │   │   │   ├── settings.js
│   │   │   │   ├── statuses.js
│   │   │   │   ├── store.js
│   │   │   │   ├── streaming.js
│   │   │   │   ├── suggestions.js
│   │   │   │   └── timelines.js
│   │   │   ├── api.js
│   │   │   ├── base_polyfills.js
│   │   │   ├── common.js
│   │   │   ├── compare_id.js
│   │   │   ├── components/
│   │   │   │   ├── __tests__/
│   │   │   │   │   ├── __snapshots__/
│   │   │   │   │   │   ├── autosuggest_emoji-test.js.snap
│   │   │   │   │   │   ├── avatar-test.js.snap
│   │   │   │   │   │   ├── avatar_overlay-test.js.snap
│   │   │   │   │   │   ├── button-test.js.snap
│   │   │   │   │   │   └── display_name-test.js.snap
│   │   │   │   │   ├── autosuggest_emoji-test.js
│   │   │   │   │   ├── avatar-test.js
│   │   │   │   │   ├── avatar_overlay-test.js
│   │   │   │   │   ├── button-test.js
│   │   │   │   │   └── display_name-test.js
│   │   │   │   ├── account.js
│   │   │   │   ├── attachment_list.js
│   │   │   │   ├── autosuggest_emoji.js
│   │   │   │   ├── autosuggest_input.js
│   │   │   │   ├── autosuggest_textarea.js
│   │   │   │   ├── avatar.js
│   │   │   │   ├── avatar_composite.js
│   │   │   │   ├── avatar_overlay.js
│   │   │   │   ├── button.js
│   │   │   │   ├── column.js
│   │   │   │   ├── column_back_button.js
│   │   │   │   ├── column_back_button_slim.js
│   │   │   │   ├── column_header.js
│   │   │   │   ├── display_name.js
│   │   │   │   ├── domain.js
│   │   │   │   ├── dropdown_menu.js
│   │   │   │   ├── error_boundary.js
│   │   │   │   ├── extended_video_player.js
│   │   │   │   ├── hashtag.js
│   │   │   │   ├── icon.js
│   │   │   │   ├── icon_button.js
│   │   │   │   ├── icon_with_badge.js
│   │   │   │   ├── intersection_observer_article.js
│   │   │   │   ├── load_gap.js
│   │   │   │   ├── load_more.js
│   │   │   │   ├── loading_indicator.js
│   │   │   │   ├── media_gallery.js
│   │   │   │   ├── missing_indicator.js
│   │   │   │   ├── modal_root.js
│   │   │   │   ├── permalink.js
│   │   │   │   ├── poll.js
│   │   │   │   ├── relative_timestamp.js
│   │   │   │   ├── scrollable_list.js
│   │   │   │   ├── setting_text.js
│   │   │   │   ├── status.js
│   │   │   │   ├── status_action_bar.js
│   │   │   │   ├── status_content.js
│   │   │   │   └── status_list.js
│   │   │   ├── containers/
│   │   │   │   ├── account_container.js
│   │   │   │   ├── compose_container.js
│   │   │   │   ├── domain_container.js
│   │   │   │   ├── dropdown_menu_container.js
│   │   │   │   ├── intersection_observer_article_container.js
│   │   │   │   ├── mastodon.js
│   │   │   │   ├── media_container.js
│   │   │   │   ├── poll_container.js
│   │   │   │   ├── status_container.js
│   │   │   │   └── timeline_container.js
│   │   │   ├── extra_polyfills.js
│   │   │   ├── features/
│   │   │   │   ├── account/
│   │   │   │   │   └── components/
│   │   │   │   │       └── header.js
│   │   │   │   ├── account_gallery/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   └── media_item.js
│   │   │   │   │   └── index.js
│   │   │   │   ├── account_timeline/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   ├── header.js
│   │   │   │   │   │   └── moved_note.js
│   │   │   │   │   ├── containers/
│   │   │   │   │   │   └── header_container.js
│   │   │   │   │   └── index.js
│   │   │   │   ├── blocks/
│   │   │   │   │   └── index.js
│   │   │   │   ├── community_timeline/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   └── column_settings.js
│   │   │   │   │   ├── containers/
│   │   │   │   │   │   └── column_settings_container.js
│   │   │   │   │   └── index.js
│   │   │   │   ├── compose/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   ├── action_bar.js
│   │   │   │   │   │   ├── autosuggest_account.js
│   │   │   │   │   │   ├── character_counter.js
│   │   │   │   │   │   ├── compose_form.js
│   │   │   │   │   │   ├── emoji_picker_dropdown.js
│   │   │   │   │   │   ├── navigation_bar.js
│   │   │   │   │   │   ├── poll_button.js
│   │   │   │   │   │   ├── poll_form.js
│   │   │   │   │   │   ├── privacy_dropdown.js
│   │   │   │   │   │   ├── reply_indicator.js
│   │   │   │   │   │   ├── search.js
│   │   │   │   │   │   ├── search_results.js
│   │   │   │   │   │   ├── text_icon_button.js
│   │   │   │   │   │   ├── upload.js
│   │   │   │   │   │   ├── upload_button.js
│   │   │   │   │   │   ├── upload_form.js
│   │   │   │   │   │   ├── upload_progress.js
│   │   │   │   │   │   └── warning.js
│   │   │   │   │   ├── containers/
│   │   │   │   │   │   ├── autosuggest_account_container.js
│   │   │   │   │   │   ├── compose_form_container.js
│   │   │   │   │   │   ├── emoji_picker_dropdown_container.js
│   │   │   │   │   │   ├── navigation_container.js
│   │   │   │   │   │   ├── poll_button_container.js
│   │   │   │   │   │   ├── poll_form_container.js
│   │   │   │   │   │   ├── privacy_dropdown_container.js
│   │   │   │   │   │   ├── reply_indicator_container.js
│   │   │   │   │   │   ├── search_container.js
│   │   │   │   │   │   ├── search_results_container.js
│   │   │   │   │   │   ├── sensitive_button_container.js
│   │   │   │   │   │   ├── spoiler_button_container.js
│   │   │   │   │   │   ├── upload_button_container.js
│   │   │   │   │   │   ├── upload_container.js
│   │   │   │   │   │   ├── upload_form_container.js
│   │   │   │   │   │   ├── upload_progress_container.js
│   │   │   │   │   │   └── warning_container.js
│   │   │   │   │   ├── index.js
│   │   │   │   │   └── util/
│   │   │   │   │       ├── counter.js
│   │   │   │   │       └── url_regex.js
│   │   │   │   ├── direct_timeline/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   ├── conversation.js
│   │   │   │   │   │   └── conversations_list.js
│   │   │   │   │   ├── containers/
│   │   │   │   │   │   ├── conversation_container.js
│   │   │   │   │   │   └── conversations_list_container.js
│   │   │   │   │   └── index.js
│   │   │   │   ├── domain_blocks/
│   │   │   │   │   └── index.js
│   │   │   │   ├── emoji/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── emoji-test.js
│   │   │   │   │   │   └── emoji_index-test.js
│   │   │   │   │   ├── emoji.js
│   │   │   │   │   ├── emoji_compressed.js
│   │   │   │   │   ├── emoji_map.json
│   │   │   │   │   ├── emoji_mart_data_light.js
│   │   │   │   │   ├── emoji_mart_search_light.js
│   │   │   │   │   ├── emoji_picker.js
│   │   │   │   │   ├── emoji_unicode_mapping_light.js
│   │   │   │   │   ├── emoji_utils.js
│   │   │   │   │   ├── unicode_to_filename.js
│   │   │   │   │   └── unicode_to_unified_name.js
│   │   │   │   ├── favourited_statuses/
│   │   │   │   │   └── index.js
│   │   │   │   ├── favourites/
│   │   │   │   │   └── index.js
│   │   │   │   ├── follow_requests/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   └── account_authorize.js
│   │   │   │   │   ├── containers/
│   │   │   │   │   │   └── account_authorize_container.js
│   │   │   │   │   └── index.js
│   │   │   │   ├── followers/
│   │   │   │   │   └── index.js
│   │   │   │   ├── following/
│   │   │   │   │   └── index.js
│   │   │   │   ├── generic_not_found/
│   │   │   │   │   └── index.js
│   │   │   │   ├── getting_started/
│   │   │   │   │   └── index.js
│   │   │   │   ├── hashtag_timeline/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   └── column_settings.js
│   │   │   │   │   ├── containers/
│   │   │   │   │   │   └── column_settings_container.js
│   │   │   │   │   └── index.js
│   │   │   │   ├── home_timeline/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   └── column_settings.js
│   │   │   │   │   ├── containers/
│   │   │   │   │   │   └── column_settings_container.js
│   │   │   │   │   └── index.js
│   │   │   │   ├── introduction/
│   │   │   │   │   └── index.js
│   │   │   │   ├── keyboard_shortcuts/
│   │   │   │   │   └── index.js
│   │   │   │   ├── list_adder/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   ├── account.js
│   │   │   │   │   │   └── list.js
│   │   │   │   │   └── index.js
│   │   │   │   ├── list_editor/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   ├── account.js
│   │   │   │   │   │   ├── edit_list_form.js
│   │   │   │   │   │   └── search.js
│   │   │   │   │   └── index.js
│   │   │   │   ├── list_timeline/
│   │   │   │   │   └── index.js
│   │   │   │   ├── lists/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   └── new_list_form.js
│   │   │   │   │   └── index.js
│   │   │   │   ├── mutes/
│   │   │   │   │   └── index.js
│   │   │   │   ├── notifications/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   ├── clear_column_button.js
│   │   │   │   │   │   ├── column_settings.js
│   │   │   │   │   │   ├── filter_bar.js
│   │   │   │   │   │   ├── notification.js
│   │   │   │   │   │   └── setting_toggle.js
│   │   │   │   │   ├── containers/
│   │   │   │   │   │   ├── column_settings_container.js
│   │   │   │   │   │   ├── filter_bar_container.js
│   │   │   │   │   │   └── notification_container.js
│   │   │   │   │   └── index.js
│   │   │   │   ├── pinned_statuses/
│   │   │   │   │   └── index.js
│   │   │   │   ├── public_timeline/
│   │   │   │   │   ├── containers/
│   │   │   │   │   │   └── column_settings_container.js
│   │   │   │   │   └── index.js
│   │   │   │   ├── reblogs/
│   │   │   │   │   └── index.js
│   │   │   │   ├── report/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   └── status_check_box.js
│   │   │   │   │   └── containers/
│   │   │   │   │       └── status_check_box_container.js
│   │   │   │   ├── search/
│   │   │   │   │   └── index.js
│   │   │   │   ├── standalone/
│   │   │   │   │   ├── compose/
│   │   │   │   │   │   └── index.js
│   │   │   │   │   ├── hashtag_timeline/
│   │   │   │   │   │   └── index.js
│   │   │   │   │   └── public_timeline/
│   │   │   │   │       └── index.js
│   │   │   │   ├── status/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   ├── action_bar.js
│   │   │   │   │   │   ├── card.js
│   │   │   │   │   │   └── detailed_status.js
│   │   │   │   │   ├── containers/
│   │   │   │   │   │   └── detailed_status_container.js
│   │   │   │   │   └── index.js
│   │   │   │   ├── ui/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   └── column-test.js
│   │   │   │   │   │   ├── actions_modal.js
│   │   │   │   │   │   ├── boost_modal.js
│   │   │   │   │   │   ├── bundle.js
│   │   │   │   │   │   ├── bundle_column_error.js
│   │   │   │   │   │   ├── bundle_modal_error.js
│   │   │   │   │   │   ├── column.js
│   │   │   │   │   │   ├── column_header.js
│   │   │   │   │   │   ├── column_link.js
│   │   │   │   │   │   ├── column_loading.js
│   │   │   │   │   │   ├── column_subheading.js
│   │   │   │   │   │   ├── columns_area.js
│   │   │   │   │   │   ├── compose_panel.js
│   │   │   │   │   │   ├── confirmation_modal.js
│   │   │   │   │   │   ├── drawer_loading.js
│   │   │   │   │   │   ├── embed_modal.js
│   │   │   │   │   │   ├── focal_point_modal.js
│   │   │   │   │   │   ├── follow_requests_nav_link.js
│   │   │   │   │   │   ├── image_loader.js
│   │   │   │   │   │   ├── link_footer.js
│   │   │   │   │   │   ├── list_panel.js
│   │   │   │   │   │   ├── media_modal.js
│   │   │   │   │   │   ├── modal_loading.js
│   │   │   │   │   │   ├── modal_root.js
│   │   │   │   │   │   ├── mute_modal.js
│   │   │   │   │   │   ├── navigation_panel.js
│   │   │   │   │   │   ├── notifications_counter_icon.js
│   │   │   │   │   │   ├── report_modal.js
│   │   │   │   │   │   ├── tabs_bar.js
│   │   │   │   │   │   ├── upload_area.js
│   │   │   │   │   │   ├── video_modal.js
│   │   │   │   │   │   └── zoomable_image.js
│   │   │   │   │   ├── containers/
│   │   │   │   │   │   ├── bundle_container.js
│   │   │   │   │   │   ├── columns_area_container.js
│   │   │   │   │   │   ├── loading_bar_container.js
│   │   │   │   │   │   ├── modal_container.js
│   │   │   │   │   │   ├── notifications_container.js
│   │   │   │   │   │   └── status_list_container.js
│   │   │   │   │   ├── index.js
│   │   │   │   │   └── util/
│   │   │   │   │       ├── async-components.js
│   │   │   │   │       ├── fullscreen.js
│   │   │   │   │       ├── get_rect_from_entry.js
│   │   │   │   │       ├── intersection_observer_wrapper.js
│   │   │   │   │       ├── optional_motion.js
│   │   │   │   │       ├── react_router_helpers.js
│   │   │   │   │       ├── reduced_motion.js
│   │   │   │   │       └── schedule_idle_task.js
│   │   │   │   └── video/
│   │   │   │       └── index.js
│   │   │   ├── initial_state.js
│   │   │   ├── is_mobile.js
│   │   │   ├── load_polyfills.js
│   │   │   ├── locales/
│   │   │   │   ├── ar.json
│   │   │   │   ├── ast.json
│   │   │   │   ├── bg.json
│   │   │   │   ├── bn.json
│   │   │   │   ├── ca.json
│   │   │   │   ├── co.json
│   │   │   │   ├── cs.json
│   │   │   │   ├── cy.json
│   │   │   │   ├── da.json
│   │   │   │   ├── de.json
│   │   │   │   ├── defaultMessages.json
│   │   │   │   ├── el.json
│   │   │   │   ├── en.json
│   │   │   │   ├── eo.json
│   │   │   │   ├── es.json
│   │   │   │   ├── eu.json
│   │   │   │   ├── fa.json
│   │   │   │   ├── fi.json
│   │   │   │   ├── fr.json
│   │   │   │   ├── gl.json
│   │   │   │   ├── he.json
│   │   │   │   ├── hi.json
│   │   │   │   ├── hr.json
│   │   │   │   ├── hu.json
│   │   │   │   ├── hy.json
│   │   │   │   ├── id.json
│   │   │   │   ├── index.js
│   │   │   │   ├── io.json
│   │   │   │   ├── it.json
│   │   │   │   ├── ja.json
│   │   │   │   ├── ka.json
│   │   │   │   ├── kk.json
│   │   │   │   ├── ko.json
│   │   │   │   ├── locale-data/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── co.js
│   │   │   │   │   └── oc.js
│   │   │   │   ├── lt.json
│   │   │   │   ├── lv.json
│   │   │   │   ├── ms.json
│   │   │   │   ├── nl.json
│   │   │   │   ├── no.json
│   │   │   │   ├── oc.json
│   │   │   │   ├── pl.json
│   │   │   │   ├── pt-BR.json
│   │   │   │   ├── pt.json
│   │   │   │   ├── ro.json
│   │   │   │   ├── ru.json
│   │   │   │   ├── sk.json
│   │   │   │   ├── sl.json
│   │   │   │   ├── sq.json
│   │   │   │   ├── sr-Latn.json
│   │   │   │   ├── sr.json
│   │   │   │   ├── sv.json
│   │   │   │   ├── ta.json
│   │   │   │   ├── te.json
│   │   │   │   ├── th.json
│   │   │   │   ├── tr.json
│   │   │   │   ├── uk.json
│   │   │   │   ├── whitelist_ar.json
│   │   │   │   ├── whitelist_ast.json
│   │   │   │   ├── whitelist_bg.json
│   │   │   │   ├── whitelist_bn.json
│   │   │   │   ├── whitelist_ca.json
│   │   │   │   ├── whitelist_co.json
│   │   │   │   ├── whitelist_cs.json
│   │   │   │   ├── whitelist_cy.json
│   │   │   │   ├── whitelist_da.json
│   │   │   │   ├── whitelist_de.json
│   │   │   │   ├── whitelist_el.json
│   │   │   │   ├── whitelist_en.json
│   │   │   │   ├── whitelist_eo.json
│   │   │   │   ├── whitelist_es.json
│   │   │   │   ├── whitelist_eu.json
│   │   │   │   ├── whitelist_fa.json
│   │   │   │   ├── whitelist_fi.json
│   │   │   │   ├── whitelist_fr.json
│   │   │   │   ├── whitelist_gl.json
│   │   │   │   ├── whitelist_he.json
│   │   │   │   ├── whitelist_hi.json
│   │   │   │   ├── whitelist_hr.json
│   │   │   │   ├── whitelist_hu.json
│   │   │   │   ├── whitelist_hy.json
│   │   │   │   ├── whitelist_id.json
│   │   │   │   ├── whitelist_io.json
│   │   │   │   ├── whitelist_it.json
│   │   │   │   ├── whitelist_ja.json
│   │   │   │   ├── whitelist_ka.json
│   │   │   │   ├── whitelist_kk.json
│   │   │   │   ├── whitelist_ko.json
│   │   │   │   ├── whitelist_lt.json
│   │   │   │   ├── whitelist_lv.json
│   │   │   │   ├── whitelist_ms.json
│   │   │   │   ├── whitelist_nl.json
│   │   │   │   ├── whitelist_no.json
│   │   │   │   ├── whitelist_oc.json
│   │   │   │   ├── whitelist_pl.json
│   │   │   │   ├── whitelist_pt-BR.json
│   │   │   │   ├── whitelist_pt.json
│   │   │   │   ├── whitelist_ro.json
│   │   │   │   ├── whitelist_ru.json
│   │   │   │   ├── whitelist_sk.json
│   │   │   │   ├── whitelist_sl.json
│   │   │   │   ├── whitelist_sq.json
│   │   │   │   ├── whitelist_sr-Latn.json
│   │   │   │   ├── whitelist_sr.json
│   │   │   │   ├── whitelist_sv.json
│   │   │   │   ├── whitelist_ta.json
│   │   │   │   ├── whitelist_te.json
│   │   │   │   ├── whitelist_th.json
│   │   │   │   ├── whitelist_tr.json
│   │   │   │   ├── whitelist_uk.json
│   │   │   │   ├── whitelist_zh-CN.json
│   │   │   │   ├── whitelist_zh-HK.json
│   │   │   │   ├── whitelist_zh-TW.json
│   │   │   │   ├── zh-CN.json
│   │   │   │   ├── zh-HK.json
│   │   │   │   └── zh-TW.json
│   │   │   ├── main.js
│   │   │   ├── middleware/
│   │   │   │   ├── errors.js
│   │   │   │   ├── loading_bar.js
│   │   │   │   └── sounds.js
│   │   │   ├── performance.js
│   │   │   ├── ready.js
│   │   │   ├── reducers/
│   │   │   │   ├── accounts.js
│   │   │   │   ├── accounts_counters.js
│   │   │   │   ├── alerts.js
│   │   │   │   ├── compose.js
│   │   │   │   ├── contexts.js
│   │   │   │   ├── conversations.js
│   │   │   │   ├── custom_emojis.js
│   │   │   │   ├── domain_lists.js
│   │   │   │   ├── dropdown_menu.js
│   │   │   │   ├── filters.js
│   │   │   │   ├── height_cache.js
│   │   │   │   ├── identity_proofs.js
│   │   │   │   ├── index.js
│   │   │   │   ├── list_adder.js
│   │   │   │   ├── list_editor.js
│   │   │   │   ├── lists.js
│   │   │   │   ├── media_attachments.js
│   │   │   │   ├── meta.js
│   │   │   │   ├── modal.js
│   │   │   │   ├── mutes.js
│   │   │   │   ├── notifications.js
│   │   │   │   ├── polls.js
│   │   │   │   ├── push_notifications.js
│   │   │   │   ├── relationships.js
│   │   │   │   ├── reports.js
│   │   │   │   ├── search.js
│   │   │   │   ├── settings.js
│   │   │   │   ├── status_lists.js
│   │   │   │   ├── statuses.js
│   │   │   │   ├── suggestions.js
│   │   │   │   ├── timelines.js
│   │   │   │   └── user_lists.js
│   │   │   ├── rtl.js
│   │   │   ├── scroll.js
│   │   │   ├── selectors/
│   │   │   │   └── index.js
│   │   │   ├── service_worker/
│   │   │   │   ├── entry.js
│   │   │   │   ├── web_push_locales.js
│   │   │   │   └── web_push_notifications.js
│   │   │   ├── settings.js
│   │   │   ├── storage/
│   │   │   │   ├── db.js
│   │   │   │   └── modifier.js
│   │   │   ├── store/
│   │   │   │   └── configureStore.js
│   │   │   ├── stream.js
│   │   │   ├── test_setup.js
│   │   │   ├── utils/
│   │   │   │   ├── __tests__/
│   │   │   │   │   ├── base64-test.js
│   │   │   │   │   └── html-test.js
│   │   │   │   ├── base64.js
│   │   │   │   ├── html.js
│   │   │   │   ├── numbers.js
│   │   │   │   └── resize_image.js
│   │   │   └── uuid.js
│   │   ├── packs/
│   │   │   ├── about.js
│   │   │   ├── admin.js
│   │   │   ├── application.js
│   │   │   ├── error.js
│   │   │   ├── mailer.js
│   │   │   ├── public.js
│   │   │   └── share.js
│   │   └── styles/
│   │       ├── application.scss
│   │       ├── contrast/
│   │       │   ├── diff.scss
│   │       │   └── variables.scss
│   │       ├── contrast.scss
│   │       ├── fonts/
│   │       │   ├── montserrat.scss
│   │       │   ├── roboto-mono.scss
│   │       │   └── roboto.scss
│   │       ├── mailer.scss
│   │       ├── mastodon/
│   │       │   ├── _mixins.scss
│   │       │   ├── about.scss
│   │       │   ├── accessibility.scss
│   │       │   ├── accounts.scss
│   │       │   ├── admin.scss
│   │       │   ├── basics.scss
│   │       │   ├── boost.scss
│   │       │   ├── compact_header.scss
│   │       │   ├── components.scss
│   │       │   ├── containers.scss
│   │       │   ├── dashboard.scss
│   │       │   ├── emoji_picker.scss
│   │       │   ├── footer.scss
│   │       │   ├── forms.scss
│   │       │   ├── introduction.scss
│   │       │   ├── lists.scss
│   │       │   ├── modal.scss
│   │       │   ├── polls.scss
│   │       │   ├── reset.scss
│   │       │   ├── rtl.scss
│   │       │   ├── stream_entries.scss
│   │       │   ├── tables.scss
│   │       │   ├── variables.scss
│   │       │   └── widgets.scss
│   │       ├── mastodon-light/
│   │       │   ├── diff.scss
│   │       │   └── variables.scss
│   │       └── mastodon-light.scss
│   ├── lib/
│   │   ├── activity_tracker.rb
│   │   ├── activitypub/
│   │   │   ├── activity/
│   │   │   │   ├── accept.rb
│   │   │   │   ├── add.rb
│   │   │   │   ├── announce.rb
│   │   │   │   ├── block.rb
│   │   │   │   ├── create.rb
│   │   │   │   ├── delete.rb
│   │   │   │   ├── flag.rb
│   │   │   │   ├── follow.rb
│   │   │   │   ├── like.rb
│   │   │   │   ├── move.rb
│   │   │   │   ├── reject.rb
│   │   │   │   ├── remove.rb
│   │   │   │   ├── undo.rb
│   │   │   │   └── update.rb
│   │   │   ├── activity.rb
│   │   │   ├── adapter.rb
│   │   │   ├── case_transform.rb
│   │   │   ├── linked_data_signature.rb
│   │   │   ├── serializer.rb
│   │   │   └── tag_manager.rb
│   │   ├── application_extension.rb
│   │   ├── delivery_failure_tracker.rb
│   │   ├── entity_cache.rb
│   │   ├── exceptions.rb
│   │   ├── extractor.rb
│   │   ├── fast_geometry_parser.rb
│   │   ├── feed_manager.rb
│   │   ├── formatter.rb
│   │   ├── hash_object.rb
│   │   ├── inline_renderer.rb
│   │   ├── language_detector.rb
│   │   ├── ostatus/
│   │   │   ├── activity/
│   │   │   │   ├── base.rb
│   │   │   │   ├── creation.rb
│   │   │   │   ├── deletion.rb
│   │   │   │   ├── general.rb
│   │   │   │   ├── post.rb
│   │   │   │   ├── remote.rb
│   │   │   │   └── share.rb
│   │   │   ├── atom_serializer.rb
│   │   │   └── tag_manager.rb
│   │   ├── potential_friendship_tracker.rb
│   │   ├── proof_provider/
│   │   │   ├── keybase/
│   │   │   │   ├── badge.rb
│   │   │   │   ├── config_serializer.rb
│   │   │   │   ├── serializer.rb
│   │   │   │   ├── verifier.rb
│   │   │   │   └── worker.rb
│   │   │   └── keybase.rb
│   │   ├── proof_provider.rb
│   │   ├── request.rb
│   │   ├── rss_builder.rb
│   │   ├── sanitize_config.rb
│   │   ├── settings/
│   │   │   ├── extend.rb
│   │   │   └── scoped_settings.rb
│   │   ├── sidekiq_error_handler.rb
│   │   ├── status_filter.rb
│   │   ├── status_finder.rb
│   │   ├── tag_manager.rb
│   │   ├── themes.rb
│   │   ├── user_settings_decorator.rb
│   │   └── webfinger_resource.rb
│   ├── mailers/
│   │   ├── admin_mailer.rb
│   │   ├── application_mailer.rb
│   │   ├── notification_mailer.rb
│   │   └── user_mailer.rb
│   ├── models/
│   │   ├── account.rb
│   │   ├── account_conversation.rb
│   │   ├── account_domain_block.rb
│   │   ├── account_filter.rb
│   │   ├── account_identity_proof.rb
│   │   ├── account_moderation_note.rb
│   │   ├── account_pin.rb
│   │   ├── account_stat.rb
│   │   ├── account_tag_stat.rb
│   │   ├── account_warning.rb
│   │   ├── account_warning_preset.rb
│   │   ├── admin/
│   │   │   ├── account_action.rb
│   │   │   └── action_log.rb
│   │   ├── admin.rb
│   │   ├── application_record.rb
│   │   ├── backup.rb
│   │   ├── block.rb
│   │   ├── concerns/
│   │   │   ├── account_associations.rb
│   │   │   ├── account_avatar.rb
│   │   │   ├── account_counters.rb
│   │   │   ├── account_finder_concern.rb
│   │   │   ├── account_header.rb
│   │   │   ├── account_interactions.rb
│   │   │   ├── attachmentable.rb
│   │   │   ├── cacheable.rb
│   │   │   ├── domain_normalizable.rb
│   │   │   ├── expireable.rb
│   │   │   ├── ldap_authenticable.rb
│   │   │   ├── omniauthable.rb
│   │   │   ├── paginable.rb
│   │   │   ├── pam_authenticable.rb
│   │   │   ├── redisable.rb
│   │   │   ├── relationship_cacheable.rb
│   │   │   ├── remotable.rb
│   │   │   ├── status_threading_concern.rb
│   │   │   ├── streamable.rb
│   │   │   └── user_roles.rb
│   │   ├── context.rb
│   │   ├── conversation.rb
│   │   ├── conversation_mute.rb
│   │   ├── custom_emoji.rb
│   │   ├── custom_emoji_filter.rb
│   │   ├── custom_filter.rb
│   │   ├── domain_block.rb
│   │   ├── email_domain_block.rb
│   │   ├── export.rb
│   │   ├── favourite.rb
│   │   ├── featured_tag.rb
│   │   ├── feed.rb
│   │   ├── follow.rb
│   │   ├── follow_request.rb
│   │   ├── form/
│   │   │   ├── account_batch.rb
│   │   │   ├── admin_settings.rb
│   │   │   ├── delete_confirmation.rb
│   │   │   ├── migration.rb
│   │   │   ├── status_batch.rb
│   │   │   └── two_factor_confirmation.rb
│   │   ├── home_feed.rb
│   │   ├── identity.rb
│   │   ├── import.rb
│   │   ├── instance.rb
│   │   ├── instance_filter.rb
│   │   ├── invite.rb
│   │   ├── invite_filter.rb
│   │   ├── list.rb
│   │   ├── list_account.rb
│   │   ├── list_feed.rb
│   │   ├── media_attachment.rb
│   │   ├── mention.rb
│   │   ├── mute.rb
│   │   ├── notification.rb
│   │   ├── poll.rb
│   │   ├── poll_vote.rb
│   │   ├── preview_card.rb
│   │   ├── relay.rb
│   │   ├── remote_follow.rb
│   │   ├── remote_profile.rb
│   │   ├── report.rb
│   │   ├── report_filter.rb
│   │   ├── report_note.rb
│   │   ├── scheduled_status.rb
│   │   ├── search.rb
│   │   ├── session_activation.rb
│   │   ├── setting.rb
│   │   ├── site_upload.rb
│   │   ├── status.rb
│   │   ├── status_pin.rb
│   │   ├── status_stat.rb
│   │   ├── stream_entry.rb
│   │   ├── subscription.rb
│   │   ├── tag.rb
│   │   ├── tombstone.rb
│   │   ├── trending_tags.rb
│   │   ├── user.rb
│   │   ├── user_invite_request.rb
│   │   ├── web/
│   │   │   ├── push_subscription.rb
│   │   │   └── setting.rb
│   │   └── web.rb
│   ├── policies/
│   │   ├── account_moderation_note_policy.rb
│   │   ├── account_policy.rb
│   │   ├── account_warning_preset_policy.rb
│   │   ├── application_policy.rb
│   │   ├── backup_policy.rb
│   │   ├── custom_emoji_policy.rb
│   │   ├── domain_block_policy.rb
│   │   ├── email_domain_block_policy.rb
│   │   ├── instance_policy.rb
│   │   ├── invite_policy.rb
│   │   ├── poll_policy.rb
│   │   ├── relay_policy.rb
│   │   ├── report_note_policy.rb
│   │   ├── report_policy.rb
│   │   ├── settings_policy.rb
│   │   ├── status_policy.rb
│   │   ├── subscription_policy.rb
│   │   ├── tag_policy.rb
│   │   └── user_policy.rb
│   ├── presenters/
│   │   ├── account_relationships_presenter.rb
│   │   ├── activitypub/
│   │   │   └── collection_presenter.rb
│   │   ├── initial_state_presenter.rb
│   │   ├── instance_presenter.rb
│   │   └── status_relationships_presenter.rb
│   ├── serializers/
│   │   ├── activitypub/
│   │   │   ├── accept_follow_serializer.rb
│   │   │   ├── activity_serializer.rb
│   │   │   ├── actor_serializer.rb
│   │   │   ├── add_serializer.rb
│   │   │   ├── block_serializer.rb
│   │   │   ├── collection_serializer.rb
│   │   │   ├── delete_actor_serializer.rb
│   │   │   ├── delete_serializer.rb
│   │   │   ├── emoji_serializer.rb
│   │   │   ├── flag_serializer.rb
│   │   │   ├── follow_serializer.rb
│   │   │   ├── image_serializer.rb
│   │   │   ├── like_serializer.rb
│   │   │   ├── note_serializer.rb
│   │   │   ├── outbox_serializer.rb
│   │   │   ├── public_key_serializer.rb
│   │   │   ├── reject_follow_serializer.rb
│   │   │   ├── remove_serializer.rb
│   │   │   ├── undo_announce_serializer.rb
│   │   │   ├── undo_block_serializer.rb
│   │   │   ├── undo_follow_serializer.rb
│   │   │   ├── undo_like_serializer.rb
│   │   │   ├── update_poll_serializer.rb
│   │   │   ├── update_serializer.rb
│   │   │   └── vote_serializer.rb
│   │   ├── initial_state_serializer.rb
│   │   ├── manifest_serializer.rb
│   │   ├── oembed_serializer.rb
│   │   ├── rest/
│   │   │   ├── account_serializer.rb
│   │   │   ├── application_serializer.rb
│   │   │   ├── context_serializer.rb
│   │   │   ├── conversation_serializer.rb
│   │   │   ├── credential_account_serializer.rb
│   │   │   ├── custom_emoji_serializer.rb
│   │   │   ├── filter_serializer.rb
│   │   │   ├── identity_proof_serializer.rb
│   │   │   ├── instance_serializer.rb
│   │   │   ├── list_serializer.rb
│   │   │   ├── media_attachment_serializer.rb
│   │   │   ├── notification_serializer.rb
│   │   │   ├── poll_serializer.rb
│   │   │   ├── preferences_serializer.rb
│   │   │   ├── preview_card_serializer.rb
│   │   │   ├── relationship_serializer.rb
│   │   │   ├── report_serializer.rb
│   │   │   ├── scheduled_status_serializer.rb
│   │   │   ├── search_serializer.rb
│   │   │   ├── status_serializer.rb
│   │   │   ├── tag_serializer.rb
│   │   │   ├── v2/
│   │   │   │   └── search_serializer.rb
│   │   │   └── web_push_subscription_serializer.rb
│   │   ├── rss/
│   │   │   ├── account_serializer.rb
│   │   │   └── tag_serializer.rb
│   │   ├── web/
│   │   │   └── notification_serializer.rb
│   │   └── webfinger_serializer.rb
│   ├── services/
│   │   ├── account_search_service.rb
│   │   ├── activitypub/
│   │   │   ├── fetch_featured_collection_service.rb
│   │   │   ├── fetch_remote_account_service.rb
│   │   │   ├── fetch_remote_key_service.rb
│   │   │   ├── fetch_remote_poll_service.rb
│   │   │   ├── fetch_remote_status_service.rb
│   │   │   ├── fetch_replies_service.rb
│   │   │   ├── process_account_service.rb
│   │   │   ├── process_collection_service.rb
│   │   │   └── process_poll_service.rb
│   │   ├── after_block_domain_from_account_service.rb
│   │   ├── after_block_service.rb
│   │   ├── app_sign_up_service.rb
│   │   ├── authorize_follow_service.rb
│   │   ├── backup_service.rb
│   │   ├── base_service.rb
│   │   ├── batched_remove_status_service.rb
│   │   ├── block_domain_service.rb
│   │   ├── block_service.rb
│   │   ├── bootstrap_timeline_service.rb
│   │   ├── concerns/
│   │   │   ├── author_extractor.rb
│   │   │   ├── payloadable.rb
│   │   │   └── stream_entry_renderer.rb
│   │   ├── fan_out_on_write_service.rb
│   │   ├── favourite_service.rb
│   │   ├── fetch_atom_service.rb
│   │   ├── fetch_link_card_service.rb
│   │   ├── fetch_oembed_service.rb
│   │   ├── fetch_remote_account_service.rb
│   │   ├── fetch_remote_status_service.rb
│   │   ├── follow_service.rb
│   │   ├── hashtag_query_service.rb
│   │   ├── import_service.rb
│   │   ├── mute_service.rb
│   │   ├── notify_service.rb
│   │   ├── post_status_service.rb
│   │   ├── precompute_feed_service.rb
│   │   ├── process_feed_service.rb
│   │   ├── process_hashtags_service.rb
│   │   ├── process_interaction_service.rb
│   │   ├── process_mentions_service.rb
│   │   ├── pubsubhubbub/
│   │   │   ├── subscribe_service.rb
│   │   │   └── unsubscribe_service.rb
│   │   ├── reblog_service.rb
│   │   ├── reject_follow_service.rb
│   │   ├── remove_status_service.rb
│   │   ├── report_service.rb
│   │   ├── resolve_account_service.rb
│   │   ├── resolve_url_service.rb
│   │   ├── search_service.rb
│   │   ├── send_interaction_service.rb
│   │   ├── subscribe_service.rb
│   │   ├── suspend_account_service.rb
│   │   ├── unblock_domain_service.rb
│   │   ├── unblock_service.rb
│   │   ├── unfavourite_service.rb
│   │   ├── unfollow_service.rb
│   │   ├── unmute_service.rb
│   │   ├── unsubscribe_service.rb
│   │   ├── update_account_service.rb
│   │   ├── update_remote_profile_service.rb
│   │   ├── verify_link_service.rb
│   │   ├── verify_salmon_service.rb
│   │   └── vote_service.rb
│   ├── validators/
│   │   ├── blacklisted_email_validator.rb
│   │   ├── disallowed_hashtags_validator.rb
│   │   ├── email_mx_validator.rb
│   │   ├── existing_username_validator.rb
│   │   ├── follow_limit_validator.rb
│   │   ├── html_validator.rb
│   │   ├── note_length_validator.rb
│   │   ├── poll_validator.rb
│   │   ├── status_length_validator.rb
│   │   ├── status_pin_validator.rb
│   │   ├── unique_username_validator.rb
│   │   ├── unreserved_username_validator.rb
│   │   ├── url_validator.rb
│   │   └── vote_validator.rb
│   ├── views/
│   │   ├── about/
│   │   │   ├── _login.html.haml
│   │   │   ├── _registration.html.haml
│   │   │   ├── more.html.haml
│   │   │   ├── show.html.haml
│   │   │   └── terms.html.haml
│   │   ├── accounts/
│   │   │   ├── _bio.html.haml
│   │   │   ├── _header.html.haml
│   │   │   ├── _moved.html.haml
│   │   │   ├── _og.html.haml
│   │   │   └── show.html.haml
│   │   ├── admin/
│   │   │   ├── account_actions/
│   │   │   │   └── new.html.haml
│   │   │   ├── account_moderation_notes/
│   │   │   │   └── _account_moderation_note.html.haml
│   │   │   ├── account_warnings/
│   │   │   │   └── _account_warning.html.haml
│   │   │   ├── accounts/
│   │   │   │   ├── _account.html.haml
│   │   │   │   ├── index.html.haml
│   │   │   │   └── show.html.haml
│   │   │   ├── action_logs/
│   │   │   │   ├── _action_log.html.haml
│   │   │   │   └── index.html.haml
│   │   │   ├── change_emails/
│   │   │   │   └── show.html.haml
│   │   │   ├── custom_emojis/
│   │   │   │   ├── _custom_emoji.html.haml
│   │   │   │   ├── index.html.haml
│   │   │   │   └── new.html.haml
│   │   │   ├── dashboard/
│   │   │   │   └── index.html.haml
│   │   │   ├── domain_blocks/
│   │   │   │   ├── new.html.haml
│   │   │   │   └── show.html.haml
│   │   │   ├── email_domain_blocks/
│   │   │   │   ├── _email_domain_block.html.haml
│   │   │   │   ├── index.html.haml
│   │   │   │   └── new.html.haml
│   │   │   ├── followers/
│   │   │   │   └── index.html.haml
│   │   │   ├── instances/
│   │   │   │   ├── index.html.haml
│   │   │   │   └── show.html.haml
│   │   │   ├── invites/
│   │   │   │   ├── _invite.html.haml
│   │   │   │   └── index.html.haml
│   │   │   ├── pending_accounts/
│   │   │   │   ├── _account.html.haml
│   │   │   │   └── index.html.haml
│   │   │   ├── relays/
│   │   │   │   ├── _relay.html.haml
│   │   │   │   ├── index.html.haml
│   │   │   │   └── new.html.haml
│   │   │   ├── report_notes/
│   │   │   │   └── _report_note.html.haml
│   │   │   ├── reports/
│   │   │   │   ├── _action_log.html.haml
│   │   │   │   ├── _status.html.haml
│   │   │   │   ├── index.html.haml
│   │   │   │   └── show.html.haml
│   │   │   ├── settings/
│   │   │   │   └── edit.html.haml
│   │   │   ├── statuses/
│   │   │   │   ├── index.html.haml
│   │   │   │   └── show.html.haml
│   │   │   ├── subscriptions/
│   │   │   │   ├── _subscription.html.haml
│   │   │   │   └── index.html.haml
│   │   │   ├── tags/
│   │   │   │   ├── _tag.html.haml
│   │   │   │   └── index.html.haml
│   │   │   └── warning_presets/
│   │   │       ├── edit.html.haml
│   │   │       └── index.html.haml
│   │   ├── admin_mailer/
│   │   │   ├── new_pending_account.text.erb
│   │   │   └── new_report.text.erb
│   │   ├── application/
│   │   │   ├── _card.html.haml
│   │   │   ├── _flashes.html.haml
│   │   │   └── _sidebar.html.haml
│   │   ├── auth/
│   │   │   ├── confirmations/
│   │   │   │   ├── finish_signup.html.haml
│   │   │   │   └── new.html.haml
│   │   │   ├── passwords/
│   │   │   │   ├── edit.html.haml
│   │   │   │   └── new.html.haml
│   │   │   ├── registrations/
│   │   │   │   ├── _sessions.html.haml
│   │   │   │   ├── edit.html.haml
│   │   │   │   └── new.html.haml
│   │   │   ├── sessions/
│   │   │   │   ├── new.html.haml
│   │   │   │   └── two_factor.html.haml
│   │   │   └── shared/
│   │   │       └── _links.html.haml
│   │   ├── authorize_interactions/
│   │   │   ├── _post_follow_actions.html.haml
│   │   │   ├── error.html.haml
│   │   │   ├── show.html.haml
│   │   │   └── success.html.haml
│   │   ├── directories/
│   │   │   └── index.html.haml
│   │   ├── errors/
│   │   │   ├── 403.html.haml
│   │   │   ├── 404.html.haml
│   │   │   ├── 410.html.haml
│   │   │   ├── 422.html.haml
│   │   │   └── 500.html.haml
│   │   ├── filters/
│   │   │   ├── _fields.html.haml
│   │   │   ├── edit.html.haml
│   │   │   ├── index.html.haml
│   │   │   └── new.html.haml
│   │   ├── follower_accounts/
│   │   │   └── index.html.haml
│   │   ├── following_accounts/
│   │   │   └── index.html.haml
│   │   ├── home/
│   │   │   └── index.html.haml
│   │   ├── invites/
│   │   │   ├── _form.html.haml
│   │   │   ├── _invite.html.haml
│   │   │   └── index.html.haml
│   │   ├── kaminari/
│   │   │   ├── _next_page.html.haml
│   │   │   ├── _paginator.html.haml
│   │   │   └── _prev_page.html.haml
│   │   ├── layouts/
│   │   │   ├── admin.html.haml
│   │   │   ├── application.html.haml
│   │   │   ├── auth.html.haml
│   │   │   ├── embedded.html.haml
│   │   │   ├── error.html.haml
│   │   │   ├── mailer.html.haml
│   │   │   ├── mailer.text.erb
│   │   │   ├── modal.html.haml
│   │   │   ├── plain_mailer.html.haml
│   │   │   └── public.html.haml
│   │   ├── media/
│   │   │   └── player.html.haml
│   │   ├── notification_mailer/
│   │   │   ├── _status.html.haml
│   │   │   ├── _status.text.erb
│   │   │   ├── digest.html.haml
│   │   │   ├── digest.text.erb
│   │   │   ├── favourite.html.haml
│   │   │   ├── favourite.text.erb
│   │   │   ├── follow.html.haml
│   │   │   ├── follow.text.erb
│   │   │   ├── follow_request.html.haml
│   │   │   ├── follow_request.text.erb
│   │   │   ├── mention.html.haml
│   │   │   ├── mention.text.erb
│   │   │   ├── reblog.html.haml
│   │   │   └── reblog.text.erb
│   │   ├── oauth/
│   │   │   ├── authorizations/
│   │   │   │   ├── error.html.haml
│   │   │   │   ├── new.html.haml
│   │   │   │   └── show.html.haml
│   │   │   └── authorized_applications/
│   │   │       └── index.html.haml
│   │   ├── public_timelines/
│   │   │   └── show.html.haml
│   │   ├── relationships/
│   │   │   ├── _account.html.haml
│   │   │   └── show.html.haml
│   │   ├── remote_follow/
│   │   │   └── new.html.haml
│   │   ├── remote_interaction/
│   │   │   └── new.html.haml
│   │   ├── remote_unfollows/
│   │   │   ├── _card.html.haml
│   │   │   ├── _post_follow_actions.html.haml
│   │   │   ├── error.html.haml
│   │   │   └── success.html.haml
│   │   ├── settings/
│   │   │   ├── applications/
│   │   │   │   ├── _fields.html.haml
│   │   │   │   ├── index.html.haml
│   │   │   │   ├── new.html.haml
│   │   │   │   └── show.html.haml
│   │   │   ├── deletes/
│   │   │   │   └── show.html.haml
│   │   │   ├── exports/
│   │   │   │   └── show.html.haml
│   │   │   ├── featured_tags/
│   │   │   │   └── index.html.haml
│   │   │   ├── identity_proofs/
│   │   │   │   ├── _proof.html.haml
│   │   │   │   ├── index.html.haml
│   │   │   │   └── new.html.haml
│   │   │   ├── imports/
│   │   │   │   └── show.html.haml
│   │   │   ├── migrations/
│   │   │   │   └── show.html.haml
│   │   │   ├── preferences/
│   │   │   │   ├── appearance/
│   │   │   │   │   └── show.html.haml
│   │   │   │   ├── notifications/
│   │   │   │   │   └── show.html.haml
│   │   │   │   └── other/
│   │   │   │       └── show.html.haml
│   │   │   ├── profiles/
│   │   │   │   └── show.html.haml
│   │   │   ├── shared/
│   │   │   │   └── _links.html.haml
│   │   │   ├── two_factor_authentication/
│   │   │   │   ├── confirmations/
│   │   │   │   │   └── new.html.haml
│   │   │   │   └── recovery_codes/
│   │   │   │       └── index.html.haml
│   │   │   └── two_factor_authentications/
│   │   │       └── show.html.haml
│   │   ├── shared/
│   │   │   ├── _error_messages.html.haml
│   │   │   └── _og.html.haml
│   │   ├── shares/
│   │   │   └── show.html.haml
│   │   ├── stream_entries/
│   │   │   ├── _attachment_list.html.haml
│   │   │   ├── _detailed_status.html.haml
│   │   │   ├── _og_description.html.haml
│   │   │   ├── _og_image.html.haml
│   │   │   ├── _poll.html.haml
│   │   │   ├── _simple_status.html.haml
│   │   │   ├── _status.html.haml
│   │   │   ├── embed.html.haml
│   │   │   └── show.html.haml
│   │   ├── tags/
│   │   │   ├── _og.html.haml
│   │   │   └── show.html.haml
│   │   ├── user_mailer/
│   │   │   ├── backup_ready.html.haml
│   │   │   ├── backup_ready.text.erb
│   │   │   ├── confirmation_instructions.html.haml
│   │   │   ├── confirmation_instructions.text.erb
│   │   │   ├── email_changed.html.haml
│   │   │   ├── email_changed.text.erb
│   │   │   ├── password_change.html.haml
│   │   │   ├── password_change.text.erb
│   │   │   ├── reconfirmation_instructions.html.haml
│   │   │   ├── reconfirmation_instructions.text.erb
│   │   │   ├── reset_password_instructions.html.haml
│   │   │   ├── reset_password_instructions.text.erb
│   │   │   ├── warning.html.haml
│   │   │   ├── warning.text.erb
│   │   │   ├── welcome.html.haml
│   │   │   └── welcome.text.erb
│   │   └── well_known/
│   │       ├── host_meta/
│   │       │   └── show.xml.ruby
│   │       └── webfinger/
│   │           └── show.xml.ruby
│   └── workers/
│       ├── activitypub/
│       │   ├── delivery_worker.rb
│       │   ├── distribute_poll_update_worker.rb
│       │   ├── distribution_worker.rb
│       │   ├── fetch_replies_worker.rb
│       │   ├── low_priority_delivery_worker.rb
│       │   ├── post_upgrade_worker.rb
│       │   ├── processing_worker.rb
│       │   ├── raw_distribution_worker.rb
│       │   ├── reply_distribution_worker.rb
│       │   ├── synchronize_featured_collection_worker.rb
│       │   └── update_distribution_worker.rb
│       ├── admin/
│       │   └── suspension_worker.rb
│       ├── after_account_domain_block_worker.rb
│       ├── after_remote_follow_request_worker.rb
│       ├── after_remote_follow_worker.rb
│       ├── authorize_follow_worker.rb
│       ├── backup_worker.rb
│       ├── block_worker.rb
│       ├── bootstrap_timeline_worker.rb
│       ├── concerns/
│       │   └── exponential_backoff.rb
│       ├── digest_mailer_worker.rb
│       ├── distribution_worker.rb
│       ├── domain_block_worker.rb
│       ├── feed_insert_worker.rb
│       ├── fetch_reply_worker.rb
│       ├── import/
│       │   └── relationship_worker.rb
│       ├── import_worker.rb
│       ├── link_crawl_worker.rb
│       ├── local_notification_worker.rb
│       ├── maintenance/
│       │   ├── destroy_media_worker.rb
│       │   ├── redownload_account_media_worker.rb
│       │   └── uncache_media_worker.rb
│       ├── merge_worker.rb
│       ├── mute_worker.rb
│       ├── notification_worker.rb
│       ├── poll_expiration_notify_worker.rb
│       ├── processing_worker.rb
│       ├── publish_scheduled_status_worker.rb
│       ├── pubsubhubbub/
│       │   ├── confirmation_worker.rb
│       │   ├── delivery_worker.rb
│       │   ├── distribution_worker.rb
│       │   ├── raw_distribution_worker.rb
│       │   ├── subscribe_worker.rb
│       │   └── unsubscribe_worker.rb
│       ├── push_conversation_worker.rb
│       ├── push_update_worker.rb
│       ├── refollow_worker.rb
│       ├── regeneration_worker.rb
│       ├── remote_profile_update_worker.rb
│       ├── removal_worker.rb
│       ├── resolve_account_worker.rb
│       ├── salmon_worker.rb
│       ├── scheduler/
│       │   ├── backup_cleanup_scheduler.rb
│       │   ├── doorkeeper_cleanup_scheduler.rb
│       │   ├── email_scheduler.rb
│       │   ├── feed_cleanup_scheduler.rb
│       │   ├── ip_cleanup_scheduler.rb
│       │   ├── media_cleanup_scheduler.rb
│       │   ├── pghero_scheduler.rb
│       │   ├── scheduled_statuses_scheduler.rb
│       │   ├── subscriptions_cleanup_scheduler.rb
│       │   ├── subscriptions_scheduler.rb
│       │   └── user_cleanup_scheduler.rb
│       ├── thread_resolve_worker.rb
│       ├── unfavourite_worker.rb
│       ├── unfollow_follow_worker.rb
│       ├── unmerge_worker.rb
│       ├── verify_account_links_worker.rb
│       └── web/
│           └── push_notification_worker.rb
├── app.json
├── babel.config.js
├── bin/
│   ├── bundle
│   ├── rails
│   ├── rake
│   ├── retry
│   ├── rspec
│   ├── setup
│   ├── tootctl
│   ├── update
│   ├── webpack
│   ├── webpack-dev-server
│   └── yarn
├── boxfile.yml
├── config/
│   ├── application.rb
│   ├── boot.rb
│   ├── brakeman.ignore
│   ├── database.yml
│   ├── deploy.rb
│   ├── environment.rb
│   ├── environments/
│   │   ├── development.rb
│   │   ├── production.rb
│   │   └── test.rb
│   ├── i18n-tasks.yml
│   ├── initializers/
│   │   ├── 0_post_deployment_migrations.rb
│   │   ├── 1_hosts.rb
│   │   ├── active_model_serializers.rb
│   │   ├── application_controller_renderer.rb
│   │   ├── assets.rb
│   │   ├── backtrace_silencers.rb
│   │   ├── blacklists.rb
│   │   ├── chewy.rb
│   │   ├── content_security_policy.rb
│   │   ├── cookies_serializer.rb
│   │   ├── cors.rb
│   │   ├── delivery_job.rb
│   │   ├── devise.rb
│   │   ├── doorkeeper.rb
│   │   ├── fast_blank.rb
│   │   ├── ffmpeg.rb
│   │   ├── filter_parameter_logging.rb
│   │   ├── http_client_proxy.rb
│   │   ├── httplog.rb
│   │   ├── inflections.rb
│   │   ├── instrumentation.rb
│   │   ├── json_ld.rb
│   │   ├── kaminari_config.rb
│   │   ├── mime_types.rb
│   │   ├── oj.rb
│   │   ├── omniauth.rb
│   │   ├── open_uri_redirection.rb
│   │   ├── pagination.rb
│   │   ├── paperclip.rb
│   │   ├── premailer_rails.rb
│   │   ├── rack_attack.rb
│   │   ├── rack_attack_logging.rb
│   │   ├── redis.rb
│   │   ├── session_activations.rb
│   │   ├── session_store.rb
│   │   ├── sidekiq.rb
│   │   ├── simple_form.rb
│   │   ├── single_user_mode.rb
│   │   ├── statsd.rb
│   │   ├── stoplight.rb
│   │   ├── strong_migrations.rb
│   │   ├── suppress_csrf_warnings.rb
│   │   ├── trusted_proxies.rb
│   │   ├── twitter_regex.rb
│   │   ├── vapid.rb
│   │   └── wrap_parameters.rb
│   ├── locales/
│   │   ├── activerecord.ar.yml
│   │   ├── activerecord.ast.yml
│   │   ├── activerecord.bg.yml
│   │   ├── activerecord.bn.yml
│   │   ├── activerecord.ca.yml
│   │   ├── activerecord.co.yml
│   │   ├── activerecord.cs.yml
│   │   ├── activerecord.cy.yml
│   │   ├── activerecord.da.yml
│   │   ├── activerecord.de.yml
│   │   ├── activerecord.el.yml
│   │   ├── activerecord.en.yml
│   │   ├── activerecord.eo.yml
│   │   ├── activerecord.es.yml
│   │   ├── activerecord.eu.yml
│   │   ├── activerecord.fa.yml
│   │   ├── activerecord.fi.yml
│   │   ├── activerecord.fr.yml
│   │   ├── activerecord.gl.yml
│   │   ├── activerecord.he.yml
│   │   ├── activerecord.hr.yml
│   │   ├── activerecord.hu.yml
│   │   ├── activerecord.hy.yml
│   │   ├── activerecord.id.yml
│   │   ├── activerecord.io.yml
│   │   ├── activerecord.it.yml
│   │   ├── activerecord.ja.yml
│   │   ├── activerecord.ka.yml
│   │   ├── activerecord.kk.yml
│   │   ├── activerecord.ko.yml
│   │   ├── activerecord.lt.yml
│   │   ├── activerecord.lv.yml
│   │   ├── activerecord.ms.yml
│   │   ├── activerecord.nl.yml
│   │   ├── activerecord.no.yml
│   │   ├── activerecord.oc.yml
│   │   ├── activerecord.pl.yml
│   │   ├── activerecord.pt-BR.yml
│   │   ├── activerecord.pt.yml
│   │   ├── activerecord.ro.yml
│   │   ├── activerecord.ru.yml
│   │   ├── activerecord.sk.yml
│   │   ├── activerecord.sl.yml
│   │   ├── activerecord.sq.yml
│   │   ├── activerecord.sr-Latn.yml
│   │   ├── activerecord.sr.yml
│   │   ├── activerecord.sv.yml
│   │   ├── activerecord.ta.yml
│   │   ├── activerecord.te.yml
│   │   ├── activerecord.th.yml
│   │   ├── activerecord.tr.yml
│   │   ├── activerecord.uk.yml
│   │   ├── activerecord.zh-CN.yml
│   │   ├── activerecord.zh-HK.yml
│   │   ├── activerecord.zh-TW.yml
│   │   ├── activerecord.zh_Hant.yml
│   │   ├── ar.yml
│   │   ├── ast.yml
│   │   ├── bg.yml
│   │   ├── bn.yml
│   │   ├── ca.yml
│   │   ├── co.yml
│   │   ├── cs.yml
│   │   ├── cy.yml
│   │   ├── da.yml
│   │   ├── de.yml
│   │   ├── devise.ar.yml
│   │   ├── devise.ast.yml
│   │   ├── devise.bg.yml
│   │   ├── devise.bn.yml
│   │   ├── devise.ca.yml
│   │   ├── devise.co.yml
│   │   ├── devise.cs.yml
│   │   ├── devise.cy.yml
│   │   ├── devise.da.yml
│   │   ├── devise.de.yml
│   │   ├── devise.el.yml
│   │   ├── devise.en.yml
│   │   ├── devise.eo.yml
│   │   ├── devise.es.yml
│   │   ├── devise.eu.yml
│   │   ├── devise.fa.yml
│   │   ├── devise.fi.yml
│   │   ├── devise.fr.yml
│   │   ├── devise.gl.yml
│   │   ├── devise.he.yml
│   │   ├── devise.hr.yml
│   │   ├── devise.hu.yml
│   │   ├── devise.hy.yml
│   │   ├── devise.id.yml
│   │   ├── devise.io.yml
│   │   ├── devise.it.yml
│   │   ├── devise.ja.yml
│   │   ├── devise.ka.yml
│   │   ├── devise.kk.yml
│   │   ├── devise.ko.yml
│   │   ├── devise.lt.yml
│   │   ├── devise.lv.yml
│   │   ├── devise.ms.yml
│   │   ├── devise.nl.yml
│   │   ├── devise.no.yml
│   │   ├── devise.oc.yml
│   │   ├── devise.pl.yml
│   │   ├── devise.pt-BR.yml
│   │   ├── devise.pt.yml
│   │   ├── devise.ro.yml
│   │   ├── devise.ru.yml
│   │   ├── devise.sk.yml
│   │   ├── devise.sl.yml
│   │   ├── devise.sq.yml
│   │   ├── devise.sr-Latn.yml
│   │   ├── devise.sr.yml
│   │   ├── devise.sv.yml
│   │   ├── devise.ta.yml
│   │   ├── devise.te.yml
│   │   ├── devise.th.yml
│   │   ├── devise.tr.yml
│   │   ├── devise.uk.yml
│   │   ├── devise.zh-CN.yml
│   │   ├── devise.zh-HK.yml
│   │   ├── devise.zh-TW.yml
│   │   ├── doorkeeper.ar.yml
│   │   ├── doorkeeper.ast.yml
│   │   ├── doorkeeper.bg.yml
│   │   ├── doorkeeper.bn.yml
│   │   ├── doorkeeper.ca.yml
│   │   ├── doorkeeper.co.yml
│   │   ├── doorkeeper.cs.yml
│   │   ├── doorkeeper.cy.yml
│   │   ├── doorkeeper.da.yml
│   │   ├── doorkeeper.de.yml
│   │   ├── doorkeeper.el.yml
│   │   ├── doorkeeper.en.yml
│   │   ├── doorkeeper.eo.yml
│   │   ├── doorkeeper.es.yml
│   │   ├── doorkeeper.eu.yml
│   │   ├── doorkeeper.fa.yml
│   │   ├── doorkeeper.fi.yml
│   │   ├── doorkeeper.fr.yml
│   │   ├── doorkeeper.gl.yml
│   │   ├── doorkeeper.he.yml
│   │   ├── doorkeeper.hr.yml
│   │   ├── doorkeeper.hu.yml
│   │   ├── doorkeeper.hy.yml
│   │   ├── doorkeeper.id.yml
│   │   ├── doorkeeper.io.yml
│   │   ├── doorkeeper.it.yml
│   │   ├── doorkeeper.ja.yml
│   │   ├── doorkeeper.ka.yml
│   │   ├── doorkeeper.kk.yml
│   │   ├── doorkeeper.ko.yml
│   │   ├── doorkeeper.lt.yml
│   │   ├── doorkeeper.lv.yml
│   │   ├── doorkeeper.ms.yml
│   │   ├── doorkeeper.nl.yml
│   │   ├── doorkeeper.no.yml
│   │   ├── doorkeeper.oc.yml
│   │   ├── doorkeeper.pl.yml
│   │   ├── doorkeeper.pt-BR.yml
│   │   ├── doorkeeper.pt.yml
│   │   ├── doorkeeper.ro.yml
│   │   ├── doorkeeper.ru.yml
│   │   ├── doorkeeper.sk.yml
│   │   ├── doorkeeper.sl.yml
│   │   ├── doorkeeper.sq.yml
│   │   ├── doorkeeper.sr-Latn.yml
│   │   ├── doorkeeper.sr.yml
│   │   ├── doorkeeper.sv.yml
│   │   ├── doorkeeper.ta.yml
│   │   ├── doorkeeper.te.yml
│   │   ├── doorkeeper.th.yml
│   │   ├── doorkeeper.tr.yml
│   │   ├── doorkeeper.uk.yml
│   │   ├── doorkeeper.zh-CN.yml
│   │   ├── doorkeeper.zh-HK.yml
│   │   ├── doorkeeper.zh-TW.yml
│   │   ├── el.yml
│   │   ├── en.yml
│   │   ├── en_GB.yml
│   │   ├── eo.yml
│   │   ├── es.yml
│   │   ├── eu.yml
│   │   ├── fa.yml
│   │   ├── fi.yml
│   │   ├── fr.yml
│   │   ├── ga.yml
│   │   ├── gl.yml
│   │   ├── he.yml
│   │   ├── hi.yml
│   │   ├── hr.yml
│   │   ├── hu.yml
│   │   ├── hy.yml
│   │   ├── id.yml
│   │   ├── io.yml
│   │   ├── it.yml
│   │   ├── ja.yml
│   │   ├── ka.yml
│   │   ├── kk.yml
│   │   ├── ko.yml
│   │   ├── lt.yml
│   │   ├── lv.yml
│   │   ├── ms.yml
│   │   ├── nl.yml
│   │   ├── no.yml
│   │   ├── oc.yml
│   │   ├── pl.yml
│   │   ├── pt-BR.yml
│   │   ├── pt.yml
│   │   ├── ro.yml
│   │   ├── ru.yml
│   │   ├── simple_form.ar.yml
│   │   ├── simple_form.ast.yml
│   │   ├── simple_form.bg.yml
│   │   ├── simple_form.bn.yml
│   │   ├── simple_form.ca.yml
│   │   ├── simple_form.co.yml
│   │   ├── simple_form.cs.yml
│   │   ├── simple_form.cy.yml
│   │   ├── simple_form.da.yml
│   │   ├── simple_form.de.yml
│   │   ├── simple_form.el.yml
│   │   ├── simple_form.en.yml
│   │   ├── simple_form.en_GB.yml
│   │   ├── simple_form.eo.yml
│   │   ├── simple_form.es.yml
│   │   ├── simple_form.eu.yml
│   │   ├── simple_form.fa.yml
│   │   ├── simple_form.fi.yml
│   │   ├── simple_form.fr.yml
│   │   ├── simple_form.gl.yml
│   │   ├── simple_form.he.yml
│   │   ├── simple_form.hr.yml
│   │   ├── simple_form.hu.yml
│   │   ├── simple_form.hy.yml
│   │   ├── simple_form.id.yml
│   │   ├── simple_form.io.yml
│   │   ├── simple_form.it.yml
│   │   ├── simple_form.ja.yml
│   │   ├── simple_form.ka.yml
│   │   ├── simple_form.kk.yml
│   │   ├── simple_form.ko.yml
│   │   ├── simple_form.lt.yml
│   │   ├── simple_form.lv.yml
│   │   ├── simple_form.ms.yml
│   │   ├── simple_form.nl.yml
│   │   ├── simple_form.no.yml
│   │   ├── simple_form.oc.yml
│   │   ├── simple_form.pl.yml
│   │   ├── simple_form.pt-BR.yml
│   │   ├── simple_form.pt.yml
│   │   ├── simple_form.ro.yml
│   │   ├── simple_form.ru.yml
│   │   ├── simple_form.sk.yml
│   │   ├── simple_form.sl.yml
│   │   ├── simple_form.sq.yml
│   │   ├── simple_form.sr-Latn.yml
│   │   ├── simple_form.sr.yml
│   │   ├── simple_form.sv.yml
│   │   ├── simple_form.ta.yml
│   │   ├── simple_form.te.yml
│   │   ├── simple_form.th.yml
│   │   ├── simple_form.tr.yml
│   │   ├── simple_form.uk.yml
│   │   ├── simple_form.zh-CN.yml
│   │   ├── simple_form.zh-HK.yml
│   │   ├── simple_form.zh-TW.yml
│   │   ├── sk.yml
│   │   ├── sl.yml
│   │   ├── sq.yml
│   │   ├── sr-Latn.rb
│   │   ├── sr-Latn.yml
│   │   ├── sr.rb
│   │   ├── sr.yml
│   │   ├── sv.yml
│   │   ├── ta.yml
│   │   ├── te.yml
│   │   ├── th.yml
│   │   ├── tr.yml
│   │   ├── uk.yml
│   │   ├── zh-CN.yml
│   │   ├── zh-HK.yml
│   │   └── zh-TW.yml
│   ├── navigation.rb
│   ├── puma.rb
│   ├── routes.rb
│   ├── secrets.yml
│   ├── settings.yml
│   ├── sidekiq.yml
│   ├── themes.yml
│   ├── webpack/
│   │   ├── configuration.js
│   │   ├── development.js
│   │   ├── generateLocalePacks.js
│   │   ├── production.js
│   │   ├── rules/
│   │   │   ├── babel.js
│   │   │   ├── css.js
│   │   │   ├── file.js
│   │   │   ├── index.js
│   │   │   ├── mark.js
│   │   │   └── node_modules.js
│   │   ├── shared.js
│   │   ├── test.js
│   │   └── translationRunner.js
│   └── webpacker.yml
├── config.ru
├── db/
│   ├── migrate/
│   │   ├── 20160220174730_create_accounts.rb
│   │   ├── 20160220211917_create_statuses.rb
│   │   ├── 20160221003140_create_users.rb
│   │   ├── 20160221003621_create_follows.rb
│   │   ├── 20160222122600_create_stream_entries.rb
│   │   ├── 20160222143943_add_profile_fields_to_accounts.rb
│   │   ├── 20160223162837_add_metadata_to_statuses.rb
│   │   ├── 20160223164502_make_uris_nullable_in_statuses.rb
│   │   ├── 20160223165723_add_url_to_statuses.rb
│   │   ├── 20160223165855_add_url_to_accounts.rb
│   │   ├── 20160223171800_create_favourites.rb
│   │   ├── 20160224223247_create_mentions.rb
│   │   ├── 20160227230233_add_attachment_avatar_to_accounts.rb
│   │   ├── 20160305115639_add_devise_to_users.rb
│   │   ├── 20160306172223_create_doorkeeper_tables.rb
│   │   ├── 20160312193225_add_attachment_header_to_accounts.rb
│   │   ├── 20160314164231_add_owner_to_application.rb
│   │   ├── 20160316103650_add_missing_indices.rb
│   │   ├── 20160322193748_add_avatar_remote_url_to_accounts.rb
│   │   ├── 20160325130944_add_admin_to_users.rb
│   │   ├── 20160826155805_add_superapp_to_oauth_applications.rb
│   │   ├── 20160905150353_create_media_attachments.rb
│   │   ├── 20160919221059_add_subscription_expires_at_to_accounts.rb
│   │   ├── 20160920003904_remove_verify_token_from_accounts.rb
│   │   ├── 20160926213048_remove_owner_from_application.rb
│   │   ├── 20161003142332_add_confirmable_to_users.rb
│   │   ├── 20161003145426_create_blocks.rb
│   │   ├── 20161006213403_rails_settings_migration.rb
│   │   ├── 20161009120834_create_domain_blocks.rb
│   │   ├── 20161027172456_add_silenced_to_accounts.rb
│   │   ├── 20161104173623_create_tags.rb
│   │   ├── 20161105130633_create_statuses_tags_join_table.rb
│   │   ├── 20161116162355_add_locale_to_users.rb
│   │   ├── 20161119211120_create_notifications.rb
│   │   ├── 20161122163057_remove_unneeded_indexes.rb
│   │   ├── 20161123093447_add_sensitive_to_statuses.rb
│   │   ├── 20161128103007_create_subscriptions.rb
│   │   ├── 20161130142058_add_last_successful_delivery_at_to_subscriptions.rb
│   │   ├── 20161130185319_add_visibility_to_statuses.rb
│   │   ├── 20161202132159_add_in_reply_to_account_id_to_statuses.rb
│   │   ├── 20161203164520_add_from_account_id_to_notifications.rb
│   │   ├── 20161205214545_add_suspended_to_accounts.rb
│   │   ├── 20161221152630_add_hidden_to_stream_entries.rb
│   │   ├── 20161222201034_add_locked_to_accounts.rb
│   │   ├── 20161222204147_create_follow_requests.rb
│   │   ├── 20170105224407_add_shortcode_to_media_attachments.rb
│   │   ├── 20170109120109_create_web_settings.rb
│   │   ├── 20170112154826_migrate_settings.rb
│   │   ├── 20170114194937_add_application_to_statuses.rb
│   │   ├── 20170114203041_add_website_to_oauth_application.rb
│   │   ├── 20170119214911_create_preview_cards.rb
│   │   ├── 20170123162658_add_severity_to_domain_blocks.rb
│   │   ├── 20170123203248_add_reject_media_to_domain_blocks.rb
│   │   ├── 20170125145934_add_spoiler_text_to_statuses.rb
│   │   ├── 20170127165745_add_devise_two_factor_to_users.rb
│   │   ├── 20170129000348_create_devices.rb
│   │   ├── 20170205175257_remove_devices.rb
│   │   ├── 20170209184350_add_reply_to_statuses.rb
│   │   ├── 20170214110202_create_reports.rb
│   │   ├── 20170217012631_add_reblog_of_id_foreign_key_to_statuses.rb
│   │   ├── 20170301222600_create_mutes.rb
│   │   ├── 20170303212857_add_last_emailed_at_to_users.rb
│   │   ├── 20170304202101_add_type_to_media_attachments.rb
│   │   ├── 20170317193015_add_search_index_to_accounts.rb
│   │   ├── 20170318214217_add_header_remote_url_to_accounts.rb
│   │   ├── 20170322021028_add_lowercase_index_to_accounts.rb
│   │   ├── 20170322143850_change_primary_key_to_bigint_on_statuses.rb
│   │   ├── 20170322162804_add_search_index_to_tags.rb
│   │   ├── 20170330021336_add_counter_caches.rb
│   │   ├── 20170330163835_create_imports.rb
│   │   ├── 20170330164118_add_attachment_data_to_imports.rb
│   │   ├── 20170403172249_add_action_taken_by_account_id_to_reports.rb
│   │   ├── 20170405112956_add_index_on_mentions_status_id.rb
│   │   ├── 20170406215816_add_notifications_and_favourites_indices.rb
│   │   ├── 20170409170753_add_last_webfingered_at_to_accounts.rb
│   │   ├── 20170414080609_add_devise_two_factor_backupable_to_users.rb
│   │   ├── 20170414132105_add_language_to_statuses.rb
│   │   ├── 20170418160728_add_indexes_to_reports_for_accounts.rb
│   │   ├── 20170423005413_add_allowed_languages_to_user.rb
│   │   ├── 20170424003227_create_account_domain_blocks.rb
│   │   ├── 20170424112722_add_status_id_index_to_statuses_tags.rb
│   │   ├── 20170425131920_add_media_attachment_meta.rb
│   │   ├── 20170425202925_add_oembed_to_preview_cards.rb
│   │   ├── 20170427011934_re_add_owner_to_application.rb
│   │   ├── 20170506235850_create_conversations.rb
│   │   ├── 20170507000211_add_conversation_id_to_statuses.rb
│   │   ├── 20170507141759_optimize_index_subscriptions.rb
│   │   ├── 20170508230434_create_conversation_mutes.rb
│   │   ├── 20170516072309_add_index_accounts_on_uri.rb
│   │   ├── 20170520145338_change_language_filter_to_opt_out.rb
│   │   ├── 20170601210557_add_index_on_media_attachments_account_id.rb
│   │   ├── 20170604144747_add_foreign_keys_for_accounts.rb
│   │   ├── 20170606113804_change_tag_search_index_to_btree.rb
│   │   ├── 20170609145826_remove_default_language_from_statuses.rb
│   │   ├── 20170610000000_add_statuses_index_on_account_id_id.rb
│   │   ├── 20170623152212_create_session_activations.rb
│   │   ├── 20170624134742_add_description_to_session_activations.rb
│   │   ├── 20170625140443_add_access_token_id_to_session_activations.rb
│   │   ├── 20170711225116_fix_null_booleans.rb
│   │   ├── 20170713112503_make_tag_search_case_insensitive.rb
│   │   ├── 20170713175513_create_web_push_subscriptions.rb
│   │   ├── 20170713190709_add_web_push_subscription_to_session_activations.rb
│   │   ├── 20170714184731_add_domain_to_subscriptions.rb
│   │   ├── 20170716191202_add_hide_notifications_to_mute.rb
│   │   ├── 20170718211102_add_activitypub_to_accounts.rb
│   │   ├── 20170720000000_add_index_favourites_on_account_id_and_id.rb
│   │   ├── 20170823162448_create_status_pins.rb
│   │   ├── 20170824103029_add_timestamps_to_status_pins.rb
│   │   ├── 20170829215220_remove_status_pins_account_index.rb
│   │   ├── 20170901141119_truncate_preview_cards.rb
│   │   ├── 20170901142658_create_join_table_preview_cards_statuses.rb
│   │   ├── 20170905044538_add_index_id_account_id_activity_type_on_notifications.rb
│   │   ├── 20170905165803_add_local_to_statuses.rb
│   │   ├── 20170913000752_create_site_uploads.rb
│   │   ├── 20170917153509_create_custom_emojis.rb
│   │   ├── 20170918125918_ids_to_bigints.rb
│   │   ├── 20170920024819_status_ids_to_timestamp_ids.rb
│   │   ├── 20170920032311_fix_reblogs_in_feeds.rb
│   │   ├── 20170924022025_ids_to_bigints2.rb
│   │   ├── 20170927215609_add_description_to_media_attachments.rb
│   │   ├── 20170928082043_create_email_domain_blocks.rb
│   │   ├── 20171005102658_create_account_moderation_notes.rb
│   │   ├── 20171005171936_add_disabled_to_custom_emojis.rb
│   │   ├── 20171006142024_add_uri_to_custom_emojis.rb
│   │   ├── 20171010023049_add_foreign_key_to_account_moderation_notes.rb
│   │   ├── 20171010025614_change_accounts_nonnullable_in_account_moderation_notes.rb
│   │   ├── 20171020084748_add_visible_in_picker_to_custom_emoji.rb
│   │   ├── 20171028221157_add_reblogs_to_follows.rb
│   │   ├── 20171107143332_add_memorial_to_accounts.rb
│   │   ├── 20171107143624_add_disabled_to_users.rb
│   │   ├── 20171109012327_add_moderator_to_accounts.rb
│   │   ├── 20171114080328_add_index_domain_to_email_domain_blocks.rb
│   │   ├── 20171114231651_create_lists.rb
│   │   ├── 20171116161857_create_list_accounts.rb
│   │   ├── 20171118012443_add_moved_to_account_id_to_accounts.rb
│   │   ├── 20171119172437_create_admin_action_logs.rb
│   │   ├── 20171122120436_add_index_account_and_reblog_of_id_to_statuses.rb
│   │   ├── 20171125024930_create_invites.rb
│   │   ├── 20171125031751_add_invite_id_to_users.rb
│   │   ├── 20171125185353_add_index_reblog_of_id_and_account_to_statuses.rb
│   │   ├── 20171125190735_remove_old_reblog_index_on_statuses.rb
│   │   ├── 20171129172043_add_index_on_stream_entries.rb
│   │   ├── 20171130000000_add_embed_url_to_preview_cards.rb
│   │   ├── 20171201000000_change_account_id_nonnullable_in_lists.rb
│   │   ├── 20171212195226_remove_duplicate_indexes_in_lists.rb
│   │   ├── 20171226094803_more_faster_index_on_notifications.rb
│   │   ├── 20180106000232_add_index_on_statuses_for_api_v1_accounts_account_id_statuses.rb
│   │   ├── 20180109143959_add_remember_token_to_users.rb
│   │   ├── 20180204034416_create_identities.rb
│   │   ├── 20180206000000_change_user_id_nonnullable.rb
│   │   ├── 20180211015820_create_backups.rb
│   │   ├── 20180304013859_add_featured_collection_url_to_accounts.rb
│   │   ├── 20180310000000_change_columns_in_notifications_nonnullable.rb
│   │   ├── 20180402031200_add_assigned_account_id_to_reports.rb
│   │   ├── 20180402040909_create_report_notes.rb
│   │   ├── 20180410204633_add_fields_to_accounts.rb
│   │   ├── 20180416210259_add_uri_to_relationships.rb
│   │   ├── 20180506221944_add_actor_type_to_accounts.rb
│   │   ├── 20180510214435_add_access_token_id_to_web_push_subscriptions.rb
│   │   ├── 20180510230049_migrate_web_push_subscriptions.rb
│   │   ├── 20180514130000_improve_index_on_statuses_for_api_v1_accounts_account_id_statuses.rb
│   │   ├── 20180514140000_revert_index_change_on_statuses_for_api_v1_accounts_account_id_statuses.rb
│   │   ├── 20180528141303_fix_accounts_unique_index.rb
│   │   ├── 20180608213548_reject_following_blocked_users.rb
│   │   ├── 20180609104432_migrate_web_push_subscriptions2.rb
│   │   ├── 20180615122121_add_autofollow_to_invites.rb
│   │   ├── 20180616192031_add_chosen_languages_to_users.rb
│   │   ├── 20180617162849_remove_unused_indexes.rb
│   │   ├── 20180628181026_create_custom_filters.rb
│   │   ├── 20180707154237_add_whole_word_to_custom_filter.rb
│   │   ├── 20180711152640_create_relays.rb
│   │   ├── 20180808175627_create_account_pins.rb
│   │   ├── 20180812123222_change_relays_enabled.rb
│   │   ├── 20180812162710_create_status_stats.rb
│   │   ├── 20180812173710_copy_status_stats.rb
│   │   ├── 20180814171349_add_confidential_to_doorkeeper_application.rb
│   │   ├── 20180820232245_add_foreign_key_indices.rb
│   │   ├── 20180929222014_create_account_conversations.rb
│   │   ├── 20181007025445_create_pghero_space_stats.rb
│   │   ├── 20181010141500_add_silent_to_mentions.rb
│   │   ├── 20181017170937_add_reject_reports_to_domain_blocks.rb
│   │   ├── 20181018205649_add_unread_to_account_conversations.rb
│   │   ├── 20181024224956_migrate_account_conversations.rb
│   │   ├── 20181026034033_remove_faux_remote_account_duplicates.rb
│   │   ├── 20181116165755_create_account_stats.rb
│   │   ├── 20181116173541_copy_account_stats.rb
│   │   ├── 20181127130500_identity_id_to_bigint.rb
│   │   ├── 20181203003808_create_accounts_tags_join_table.rb
│   │   ├── 20181203021853_add_discoverable_to_accounts.rb
│   │   ├── 20181204193439_add_last_status_at_to_account_stats.rb
│   │   ├── 20181204215309_create_account_tag_stats.rb
│   │   ├── 20181207011115_downcase_custom_emoji_domains.rb
│   │   ├── 20181213184704_create_account_warnings.rb
│   │   ├── 20181213185533_create_account_warning_presets.rb
│   │   ├── 20181219235220_add_created_by_application_id_to_users.rb
│   │   ├── 20181226021420_add_also_known_as_to_accounts.rb
│   │   ├── 20190103124649_create_scheduled_statuses.rb
│   │   ├── 20190103124754_add_scheduled_status_id_to_media_attachments.rb
│   │   ├── 20190117114553_create_tombstones.rb
│   │   ├── 20190201012802_add_overwrite_to_imports.rb
│   │   ├── 20190203180359_create_featured_tags.rb
│   │   ├── 20190225031541_create_polls.rb
│   │   ├── 20190225031625_create_poll_votes.rb
│   │   ├── 20190226003449_add_poll_id_to_statuses.rb
│   │   ├── 20190304152020_add_uri_to_poll_votes.rb
│   │   ├── 20190306145741_add_lock_version_to_polls.rb
│   │   ├── 20190307234537_add_approved_to_users.rb
│   │   ├── 20190314181829_migrate_open_registrations_setting.rb
│   │   ├── 20190316190352_create_account_identity_proofs.rb
│   │   ├── 20190317135723_add_uri_to_reports.rb
│   │   ├── 20190409054914_create_user_invite_requests.rb
│   │   ├── 20190420025523_add_blurhash_to_media_attachments.rb
│   │   ├── 20190509164208_add_by_moderator_to_tombstone.rb
│   │   ├── 20190511134027_add_silenced_at_suspended_at_to_accounts.rb
│   │   └── 20190529143559_preserve_old_layout_for_existing_users.rb
│   ├── post_migrate/
│   │   ├── .gitkeep
│   │   ├── 20180813113448_copy_status_stats_cleanup.rb
│   │   ├── 20181116184611_copy_account_stats_cleanup.rb
│   │   ├── 20190511152737_remove_suspended_silenced_account_fields.rb
│   │   └── 20190519130537_remove_boosts_widening_audience.rb
│   ├── schema.rb
│   └── seeds.rb
├── dist/
│   ├── mastodon-sidekiq.service
│   ├── mastodon-streaming.service
│   ├── mastodon-web.service
│   └── nginx.conf
├── docker-compose.yml
├── lib/
│   ├── assets/
│   │   └── .keep
│   ├── cli.rb
│   ├── devise/
│   │   └── ldap_authenticatable.rb
│   ├── florence/
│   │   └── version.rb
│   ├── generators/
│   │   └── post_deployment_migration_generator.rb
│   ├── json_ld/
│   │   └── security.rb
│   ├── mastodon/
│   │   ├── accounts_cli.rb
│   │   ├── cache_cli.rb
│   │   ├── cli_helper.rb
│   │   ├── domains_cli.rb
│   │   ├── emoji_cli.rb
│   │   ├── feeds_cli.rb
│   │   ├── media_cli.rb
│   │   ├── migration_helpers.rb
│   │   ├── premailer_webpack_strategy.rb
│   │   ├── redis_config.rb
│   │   ├── search_cli.rb
│   │   ├── settings_cli.rb
│   │   ├── snowflake.rb
│   │   ├── statuses_cli.rb
│   │   └── version.rb
│   ├── paperclip/
│   │   ├── blurhash_transcoder.rb
│   │   ├── gif_transcoder.rb
│   │   ├── lazy_thumbnail.rb
│   │   └── video_transcoder.rb
│   ├── tasks/
│   │   ├── assets.rake
│   │   ├── auto_annotate_models.rake
│   │   ├── db.rake
│   │   ├── emojis.rake
│   │   ├── mastodon.rake
│   │   ├── repo.rake
│   │   └── statistics.rake
│   └── templates/
│       ├── haml/
│       │   └── scaffold/
│       │       └── _form.html.haml
│       └── rails/
│           └── post_deployment_migration/
│               └── migration.rb
├── log/
│   └── .keep
├── nanobox/
│   ├── nginx-local.conf
│   ├── nginx-stream.conf.erb
│   └── nginx-web.conf.erb
├── package.json
├── postcss.config.js
├── priv-config
├── public/
│   ├── browserconfig.xml
│   ├── embed.js
│   ├── robots.txt
│   └── sounds/
│       └── boop.ogg
├── scalingo.json
├── spec/
│   ├── controllers/
│   │   ├── about_controller_spec.rb
│   │   ├── account_follow_controller_spec.rb
│   │   ├── account_unfollow_controller_spec.rb
│   │   ├── accounts_controller_spec.rb
│   │   ├── activitypub/
│   │   │   ├── collections_controller_spec.rb
│   │   │   ├── inboxes_controller_spec.rb
│   │   │   └── outboxes_controller_spec.rb
│   │   ├── admin/
│   │   │   ├── account_moderation_notes_controller_spec.rb
│   │   │   ├── accounts_controller_spec.rb
│   │   │   ├── action_logs_controller_spec.rb
│   │   │   ├── base_controller_spec.rb
│   │   │   ├── change_email_controller_spec.rb
│   │   │   ├── confirmations_controller_spec.rb
│   │   │   ├── custom_emojis_controller_spec.rb
│   │   │   ├── dashboard_controller_spec.rb
│   │   │   ├── domain_blocks_controller_spec.rb
│   │   │   ├── email_domain_blocks_controller_spec.rb
│   │   │   ├── instances_controller_spec.rb
│   │   │   ├── invites_controller_spec.rb
│   │   │   ├── report_notes_controller_spec.rb
│   │   │   ├── reported_statuses_controller_spec.rb
│   │   │   ├── reports_controller_spec.rb
│   │   │   ├── resets_controller_spec.rb
│   │   │   ├── roles_controller_spec.rb
│   │   │   ├── settings_controller_spec.rb
│   │   │   ├── statuses_controller_spec.rb
│   │   │   ├── subscriptions_controller_spec.rb
│   │   │   ├── tags_controller_spec.rb
│   │   │   └── two_factor_authentications_controller_spec.rb
│   │   ├── api/
│   │   │   ├── base_controller_spec.rb
│   │   │   ├── oembed_controller_spec.rb
│   │   │   ├── proofs_controller_spec.rb
│   │   │   ├── push_controller_spec.rb
│   │   │   ├── salmon_controller_spec.rb
│   │   │   ├── subscriptions_controller_spec.rb
│   │   │   ├── v1/
│   │   │   │   ├── accounts/
│   │   │   │   │   ├── credentials_controller_spec.rb
│   │   │   │   │   ├── follower_accounts_controller_spec.rb
│   │   │   │   │   ├── following_accounts_controller_spec.rb
│   │   │   │   │   ├── lists_controller_spec.rb
│   │   │   │   │   ├── pins_controller_spec.rb
│   │   │   │   │   ├── relationships_controller_spec.rb
│   │   │   │   │   ├── search_controller_spec.rb
│   │   │   │   │   └── statuses_controller_spec.rb
│   │   │   │   ├── accounts_controller_spec.rb
│   │   │   │   ├── apps/
│   │   │   │   │   └── credentials_controller_spec.rb
│   │   │   │   ├── apps_controller_spec.rb
│   │   │   │   ├── blocks_controller_spec.rb
│   │   │   │   ├── conversations_controller_spec.rb
│   │   │   │   ├── custom_emojis_controller_spec.rb
│   │   │   │   ├── domain_blocks_controller_spec.rb
│   │   │   │   ├── endorsements_controller_spec.rb
│   │   │   │   ├── favourites_controller_spec.rb
│   │   │   │   ├── filters_controller_spec.rb
│   │   │   │   ├── follow_requests_controller_spec.rb
│   │   │   │   ├── follows_controller_spec.rb
│   │   │   │   ├── instances/
│   │   │   │   │   ├── activity_controller_spec.rb
│   │   │   │   │   └── peers_controller_spec.rb
│   │   │   │   ├── instances_controller_spec.rb
│   │   │   │   ├── lists/
│   │   │   │   │   └── accounts_controller_spec.rb
│   │   │   │   ├── lists_controller_spec.rb
│   │   │   │   ├── media_controller_spec.rb
│   │   │   │   ├── mutes_controller_spec.rb
│   │   │   │   ├── notifications_controller_spec.rb
│   │   │   │   ├── polls/
│   │   │   │   │   └── votes_controller_spec.rb
│   │   │   │   ├── polls_controller_spec.rb
│   │   │   │   ├── push/
│   │   │   │   │   └── subscriptions_controller_spec.rb
│   │   │   │   ├── reports_controller_spec.rb
│   │   │   │   ├── search_controller_spec.rb
│   │   │   │   ├── statuses/
│   │   │   │   │   ├── favourited_by_accounts_controller_spec.rb
│   │   │   │   │   ├── favourites_controller_spec.rb
│   │   │   │   │   ├── mutes_controller_spec.rb
│   │   │   │   │   ├── pins_controller_spec.rb
│   │   │   │   │   ├── reblogged_by_accounts_controller_spec.rb
│   │   │   │   │   └── reblogs_controller_spec.rb
│   │   │   │   ├── statuses_controller_spec.rb
│   │   │   │   ├── streaming_controller_spec.rb
│   │   │   │   ├── suggestions_controller_spec.rb
│   │   │   │   └── timelines/
│   │   │   │       ├── direct_controller_spec.rb
│   │   │   │       ├── home_controller_spec.rb
│   │   │   │       ├── list_controller_spec.rb
│   │   │   │       ├── public_controller_spec.rb
│   │   │   │       └── tag_controller_spec.rb
│   │   │   ├── v2/
│   │   │   │   └── search_controller_spec.rb
│   │   │   └── web/
│   │   │       ├── embeds_controller_spec.rb
│   │   │       ├── push_subscriptions_controller_spec.rb
│   │   │       └── settings_controller_spec.rb
│   │   ├── application_controller_spec.rb
│   │   ├── auth/
│   │   │   ├── confirmations_controller_spec.rb
│   │   │   ├── passwords_controller_spec.rb
│   │   │   ├── registrations_controller_spec.rb
│   │   │   └── sessions_controller_spec.rb
│   │   ├── authorize_interactions_controller_spec.rb
│   │   ├── concerns/
│   │   │   ├── account_controller_concern_spec.rb
│   │   │   ├── accountable_concern_spec.rb
│   │   │   ├── export_controller_concern_spec.rb
│   │   │   ├── localized_spec.rb
│   │   │   ├── obfuscate_filename_spec.rb
│   │   │   ├── rate_limit_headers_spec.rb
│   │   │   ├── signature_verification_spec.rb
│   │   │   └── user_tracking_concern_spec.rb
│   │   ├── emojis_controller_spec.rb
│   │   ├── follower_accounts_controller_spec.rb
│   │   ├── following_accounts_controller_spec.rb
│   │   ├── home_controller_spec.rb
│   │   ├── intents_controller_spec.rb
│   │   ├── invites_controller_spec.rb
│   │   ├── manifests_controller_spec.rb
│   │   ├── media_controller_spec.rb
│   │   ├── oauth/
│   │   │   ├── authorizations_controller_spec.rb
│   │   │   ├── authorized_applications_controller_spec.rb
│   │   │   └── tokens_controller_spec.rb
│   │   ├── relationships_controller_spec.rb
│   │   ├── remote_follow_controller_spec.rb
│   │   ├── remote_interaction_controller_spec.rb
│   │   ├── remote_unfollows_controller_spec.rb
│   │   ├── settings/
│   │   │   ├── applications_controller_spec.rb
│   │   │   ├── deletes_controller_spec.rb
│   │   │   ├── exports/
│   │   │   │   ├── blocked_accounts_controller_spec.rb
│   │   │   │   ├── following_accounts_controller_spec.rb
│   │   │   │   └── muted_accounts_controller_spec.rb
│   │   │   ├── exports_controller_spec.rb
│   │   │   ├── identity_proofs_controller_spec.rb
│   │   │   ├── imports_controller_spec.rb
│   │   │   ├── migrations_controller_spec.rb
│   │   │   ├── preferences/
│   │   │   │   ├── notifications_controller_spec.rb
│   │   │   │   └── other_controller_spec.rb
│   │   │   ├── profiles_controller_spec.rb
│   │   │   ├── sessions_controller_spec.rb
│   │   │   ├── two_factor_authentication/
│   │   │   │   ├── confirmations_controller_spec.rb
│   │   │   │   └── recovery_codes_controller_spec.rb
│   │   │   └── two_factor_authentications_controller_spec.rb
│   │   ├── shares_controller_spec.rb
│   │   ├── statuses_controller_spec.rb
│   │   ├── stream_entries_controller_spec.rb
│   │   ├── tags_controller_spec.rb
│   │   └── well_known/
│   │       ├── host_meta_controller_spec.rb
│   │       ├── keybase_proof_config_controller_spec.rb
│   │       └── webfinger_controller_spec.rb
│   ├── fabricators/
│   │   ├── access_token_fabricator.rb
│   │   ├── accessible_access_token_fabricator.rb
│   │   ├── account_domain_block_fabricator.rb
│   │   ├── account_fabricator.rb
│   │   ├── account_identity_proof_fabricator.rb
│   │   ├── account_moderation_note_fabricator.rb
│   │   ├── account_pin_fabricator.rb
│   │   ├── account_stat_fabricator.rb
│   │   ├── account_tag_stat_fabricator.rb
│   │   ├── account_warning_fabricator.rb
│   │   ├── account_warning_preset_fabricator.rb
│   │   ├── admin_action_log_fabricator.rb
│   │   ├── application_fabricator.rb
│   │   ├── assets/
│   │   │   └── TEAPOT
│   │   ├── backup_fabricator.rb
│   │   ├── block_fabricator.rb
│   │   ├── conversation_account_fabricator.rb
│   │   ├── conversation_fabricator.rb
│   │   ├── conversation_mute_fabricator.rb
│   │   ├── custom_emoji_fabricator.rb
│   │   ├── custom_filter_fabricator.rb
│   │   ├── domain_block_fabricator.rb
│   │   ├── email_domain_block_fabricator.rb
│   │   ├── favourite_fabricator.rb
│   │   ├── featured_tag_fabricator.rb
│   │   ├── follow_fabricator.rb
│   │   ├── follow_request_fabricator.rb
│   │   ├── identity_fabricator.rb
│   │   ├── import_fabricator.rb
│   │   ├── invite_fabricator.rb
│   │   ├── list_account_fabricator.rb
│   │   ├── list_fabricator.rb
│   │   ├── media_attachment_fabricator.rb
│   │   ├── mention_fabricator.rb
│   │   ├── mute_fabricator.rb
│   │   ├── notification_fabricator.rb
│   │   ├── poll_fabricator.rb
│   │   ├── poll_vote_fabricator.rb
│   │   ├── relay_fabricator.rb
│   │   ├── report_fabricator.rb
│   │   ├── report_note_fabricator.rb
│   │   ├── scheduled_status_fabricator.rb
│   │   ├── session_activation_fabricator.rb
│   │   ├── setting_fabricator.rb
│   │   ├── site_upload_fabricator.rb
│   │   ├── status_fabricator.rb
│   │   ├── status_pin_fabricator.rb
│   │   ├── status_stat_fabricator.rb
│   │   ├── stream_entry_fabricator.rb
│   │   ├── subscription_fabricator.rb
│   │   ├── tag_fabricator.rb
│   │   ├── user_fabricator.rb
│   │   ├── user_invite_request_fabricator.rb
│   │   ├── web_push_subscription_fabricator.rb
│   │   └── web_setting_fabricator.rb
│   ├── features/
│   │   └── log_in_spec.rb
│   ├── fixtures/
│   │   ├── files/
│   │   │   ├── attachment.webm
│   │   │   ├── imports.txt
│   │   │   ├── mute-imports.txt
│   │   │   ├── new-following-imports.txt
│   │   │   └── new-mute-imports.txt
│   │   ├── push/
│   │   │   ├── feed.atom
│   │   │   └── reblog.atom
│   │   ├── requests/
│   │   │   ├── .host-meta.txt
│   │   │   ├── activitypub-actor-individual.txt
│   │   │   ├── activitypub-actor-noinbox.txt
│   │   │   ├── activitypub-actor.txt
│   │   │   ├── activitypub-feed.txt
│   │   │   ├── activitypub-webfinger.txt
│   │   │   ├── attachment1.txt
│   │   │   ├── attachment2.txt
│   │   │   ├── avatar.txt
│   │   │   ├── feed.txt
│   │   │   ├── idn.txt
│   │   │   ├── json-ld.activitystreams.txt
│   │   │   ├── json-ld.identity.txt
│   │   │   ├── json-ld.security.txt
│   │   │   ├── koi8-r.txt
│   │   │   ├── localdomain-feed.txt
│   │   │   ├── localdomain-hostmeta.txt
│   │   │   ├── localdomain-webfinger.txt
│   │   │   ├── oembed_invalid_xml.html
│   │   │   ├── oembed_json.html
│   │   │   ├── oembed_json_empty.html
│   │   │   ├── oembed_json_xml.html
│   │   │   ├── oembed_undiscoverable.html
│   │   │   ├── oembed_xml.html
│   │   │   ├── redirected.host-meta.txt
│   │   │   ├── sjis.txt
│   │   │   ├── sjis_with_wrong_charset.txt
│   │   │   ├── webfinger-hacker1.txt
│   │   │   ├── webfinger-hacker2.txt
│   │   │   ├── webfinger-hacker3.txt
│   │   │   ├── webfinger.txt
│   │   │   └── windows-1251.txt
│   │   ├── salmon/
│   │   │   └── mention.xml
│   │   └── xml/
│   │       └── mastodon.atom
│   ├── helpers/
│   │   ├── admin/
│   │   │   ├── account_moderation_notes_helper_spec.rb
│   │   │   ├── action_log_helper_spec.rb
│   │   │   └── filter_helper_spec.rb
│   │   ├── application_helper_spec.rb
│   │   ├── flashes_helper_spec.rb
│   │   ├── home_helper_spec.rb
│   │   ├── instance_helper_spec.rb
│   │   ├── jsonld_helper_spec.rb
│   │   ├── routing_helper_spec.rb
│   │   ├── settings_helper_spec.rb
│   │   └── stream_entries_helper_spec.rb
│   ├── lib/
│   │   ├── activitypub/
│   │   │   ├── activity/
│   │   │   │   ├── accept_spec.rb
│   │   │   │   ├── add_spec.rb
│   │   │   │   ├── announce_spec.rb
│   │   │   │   ├── block_spec.rb
│   │   │   │   ├── create_spec.rb
│   │   │   │   ├── delete_spec.rb
│   │   │   │   ├── flag_spec.rb
│   │   │   │   ├── follow_spec.rb
│   │   │   │   ├── like_spec.rb
│   │   │   │   ├── move_spec.rb
│   │   │   │   ├── reject_spec.rb
│   │   │   │   ├── remove_spec.rb
│   │   │   │   ├── undo_spec.rb
│   │   │   │   └── update_spec.rb
│   │   │   ├── adapter_spec.rb
│   │   │   ├── linked_data_signature_spec.rb
│   │   │   └── tag_manager_spec.rb
│   │   ├── delivery_failure_tracker_spec.rb
│   │   ├── extractor_spec.rb
│   │   ├── feed_manager_spec.rb
│   │   ├── formatter_spec.rb
│   │   ├── hash_object_spec.rb
│   │   ├── language_detector_spec.rb
│   │   ├── ostatus/
│   │   │   ├── atom_serializer_spec.rb
│   │   │   └── tag_manager_spec.rb
│   │   ├── proof_provider/
│   │   │   └── keybase/
│   │   │       └── verifier_spec.rb
│   │   ├── request_spec.rb
│   │   ├── settings/
│   │   │   ├── extend_spec.rb
│   │   │   └── scoped_settings_spec.rb
│   │   ├── status_filter_spec.rb
│   │   ├── status_finder_spec.rb
│   │   ├── tag_manager_spec.rb
│   │   ├── user_settings_decorator_spec.rb
│   │   └── webfinger_resource_spec.rb
│   ├── mailers/
│   │   ├── admin_mailer_spec.rb
│   │   ├── notification_mailer_spec.rb
│   │   ├── previews/
│   │   │   ├── admin_mailer_preview.rb
│   │   │   ├── notification_mailer_preview.rb
│   │   │   └── user_mailer_preview.rb
│   │   └── user_mailer_spec.rb
│   ├── models/
│   │   ├── account_conversation_spec.rb
│   │   ├── account_domain_block_spec.rb
│   │   ├── account_filter_spec.rb
│   │   ├── account_moderation_note_spec.rb
│   │   ├── account_spec.rb
│   │   ├── account_stat_spec.rb
│   │   ├── account_tag_stat_spec.rb
│   │   ├── admin/
│   │   │   ├── account_action_spec.rb
│   │   │   └── action_log_spec.rb
│   │   ├── backup_spec.rb
│   │   ├── block_spec.rb
│   │   ├── concerns/
│   │   │   ├── account_finder_concern_spec.rb
│   │   │   ├── account_interactions_spec.rb
│   │   │   ├── remotable_spec.rb
│   │   │   ├── status_threading_concern_spec.rb
│   │   │   └── streamable_spec.rb
│   │   ├── conversation_mute_spec.rb
│   │   ├── conversation_spec.rb
│   │   ├── custom_emoji_filter_spec.rb
│   │   ├── custom_emoji_spec.rb
│   │   ├── custom_filter_spec.rb
│   │   ├── domain_block_spec.rb
│   │   ├── email_domain_block_spec.rb
│   │   ├── export_spec.rb
│   │   ├── favourite_spec.rb
│   │   ├── featured_tag_spec.rb
│   │   ├── follow_request_spec.rb
│   │   ├── follow_spec.rb
│   │   ├── form/
│   │   │   └── status_batch_spec.rb
│   │   ├── home_feed_spec.rb
│   │   ├── identity_spec.rb
│   │   ├── import_spec.rb
│   │   ├── invite_spec.rb
│   │   ├── list_account_spec.rb
│   │   ├── list_spec.rb
│   │   ├── media_attachment_spec.rb
│   │   ├── mention_spec.rb
│   │   ├── mute_spec.rb
│   │   ├── notification_spec.rb
│   │   ├── poll_spec.rb
│   │   ├── poll_vote_spec.rb
│   │   ├── preview_card_spec.rb
│   │   ├── relay_spec.rb
│   │   ├── remote_follow_spec.rb
│   │   ├── remote_profile_spec.rb
│   │   ├── report_filter_spec.rb
│   │   ├── report_spec.rb
│   │   ├── scheduled_status_spec.rb
│   │   ├── session_activation_spec.rb
│   │   ├── setting_spec.rb
│   │   ├── site_upload_spec.rb
│   │   ├── status_pin_spec.rb
│   │   ├── status_spec.rb
│   │   ├── status_stat_spec.rb
│   │   ├── stream_entry_spec.rb
│   │   ├── subscription_spec.rb
│   │   ├── tag_spec.rb
│   │   ├── user_invite_request_spec.rb
│   │   ├── user_spec.rb
│   │   └── web/
│   │       ├── push_subscription_spec.rb
│   │       └── setting_spec.rb
│   ├── policies/
│   │   ├── account_moderation_note_policy_spec.rb
│   │   ├── account_policy_spec.rb
│   │   ├── backup_policy_spec.rb
│   │   ├── custom_emoji_policy_spec.rb
│   │   ├── domain_block_policy_spec.rb
│   │   ├── email_domain_block_policy_spec.rb
│   │   ├── instance_policy_spec.rb
│   │   ├── invite_policy_spec.rb
│   │   ├── relay_policy_spec.rb
│   │   ├── report_note_policy_spec.rb
│   │   ├── report_policy_spec.rb
│   │   ├── settings_policy_spec.rb
│   │   ├── status_policy_spec.rb
│   │   ├── subscription_policy_spec.rb
│   │   ├── tag_policy_spec.rb
│   │   └── user_policy_spec.rb
│   ├── presenters/
│   │   ├── account_relationships_presenter_spec.rb
│   │   └── instance_presenter_spec.rb
│   ├── rails_helper.rb
│   ├── requests/
│   │   ├── account_show_page_spec.rb
│   │   ├── catch_all_route_request_spec.rb
│   │   ├── host_meta_request_spec.rb
│   │   ├── link_headers_spec.rb
│   │   ├── localization_spec.rb
│   │   └── webfinger_request_spec.rb
│   ├── routing/
│   │   ├── accounts_routing_spec.rb
│   │   ├── api_routing_spec.rb
│   │   └── well_known_routes_spec.rb
│   ├── serializers/
│   │   └── activitypub/
│   │       └── note_spec.rb
│   ├── services/
│   │   ├── account_search_service_spec.rb
│   │   ├── activitypub/
│   │   │   ├── fetch_remote_account_service_spec.rb
│   │   │   ├── fetch_remote_status_service_spec.rb
│   │   │   ├── fetch_replies_service_spec.rb
│   │   │   ├── process_account_service_spec.rb
│   │   │   └── process_collection_service_spec.rb
│   │   ├── after_block_domain_from_account_service_spec.rb
│   │   ├── after_block_service_spec.rb
│   │   ├── app_sign_up_service_spec.rb
│   │   ├── authorize_follow_service_spec.rb
│   │   ├── batched_remove_status_service_spec.rb
│   │   ├── block_domain_service_spec.rb
│   │   ├── block_service_spec.rb
│   │   ├── bootstrap_timeline_service_spec.rb
│   │   ├── fan_out_on_write_service_spec.rb
│   │   ├── favourite_service_spec.rb
│   │   ├── fetch_atom_service_spec.rb
│   │   ├── fetch_link_card_service_spec.rb
│   │   ├── fetch_oembed_service_spec.rb
│   │   ├── fetch_remote_account_service_spec.rb
│   │   ├── fetch_remote_status_service_spec.rb
│   │   ├── follow_service_spec.rb
│   │   ├── hashtag_query_service_spec.rb
│   │   ├── import_service_spec.rb
│   │   ├── mute_service_spec.rb
│   │   ├── notify_service_spec.rb
│   │   ├── post_status_service_spec.rb
│   │   ├── precompute_feed_service_spec.rb
│   │   ├── process_feed_service_spec.rb
│   │   ├── process_interaction_service_spec.rb
│   │   ├── process_mentions_service_spec.rb
│   │   ├── pubsubhubbub/
│   │   │   ├── subscribe_service_spec.rb
│   │   │   └── unsubscribe_service_spec.rb
│   │   ├── reblog_service_spec.rb
│   │   ├── reject_follow_service_spec.rb
│   │   ├── remove_status_service_spec.rb
│   │   ├── report_service_spec.rb
│   │   ├── resolve_account_service_spec.rb
│   │   ├── resolve_url_service_spec.rb
│   │   ├── search_service_spec.rb
│   │   ├── send_interaction_service_spec.rb
│   │   ├── subscribe_service_spec.rb
│   │   ├── suspend_account_service_spec.rb
│   │   ├── unblock_domain_service_spec.rb
│   │   ├── unblock_service_spec.rb
│   │   ├── unfollow_service_spec.rb
│   │   ├── unmute_service_spec.rb
│   │   ├── unsubscribe_service_spec.rb
│   │   ├── update_remote_profile_service_spec.rb
│   │   └── verify_link_service_spec.rb
│   ├── spec_helper.rb
│   ├── support/
│   │   ├── examples/
│   │   │   ├── lib/
│   │   │   │   └── settings/
│   │   │   │       ├── scoped_settings.rb
│   │   │   │       └── settings_extended.rb
│   │   │   └── models/
│   │   │       └── concerns/
│   │   │           └── account_avatar.rb
│   │   └── matchers/
│   │       └── model/
│   │           └── model_have_error_on_field.rb
│   ├── validators/
│   │   ├── blacklisted_email_validator_spec.rb
│   │   ├── disallowed_hashtags_validator_spec.rb
│   │   ├── email_mx_validator_spec.rb
│   │   ├── follow_limit_validator_spec.rb
│   │   ├── poll_validator_spec.rb
│   │   ├── status_length_validator_spec.rb
│   │   ├── status_pin_validator_spec.rb
│   │   ├── unique_username_validator_spec.rb
│   │   ├── unreserved_username_validator_spec.rb
│   │   └── url_validator_spec.rb
│   ├── views/
│   │   ├── about/
│   │   │   └── show.html.haml_spec.rb
│   │   └── stream_entries/
│   │       └── show.html.haml_spec.rb
│   └── workers/
│       ├── activitypub/
│       │   ├── delivery_worker_spec.rb
│       │   ├── distribution_worker_spec.rb
│       │   ├── fetch_replies_worker_spec.rb
│       │   ├── processing_worker_spec.rb
│       │   └── update_distribution_worker_spec.rb
│       ├── after_remote_follow_request_worker_spec.rb
│       ├── after_remote_follow_worker_spec.rb
│       ├── digest_mailer_worker_spec.rb
│       ├── domain_block_worker_spec.rb
│       ├── feed_insert_worker_spec.rb
│       ├── publish_scheduled_status_worker_spec.rb
│       ├── pubsubhubbub/
│       │   ├── confirmation_worker_spec.rb
│       │   ├── delivery_worker_spec.rb
│       │   └── distribution_worker_spec.rb
│       ├── regeneration_worker_spec.rb
│       └── scheduler/
│           ├── feed_cleanup_scheduler_spec.rb
│           ├── media_cleanup_scheduler_spec.rb
│           └── subscriptions_scheduler_spec.rb
├── streaming/
│   └── index.js
└── vendor/
    └── .keep

================================================
FILE CONTENTS
================================================

================================================
FILE: .buildpacks
================================================
https://github.com/heroku/heroku-buildpack-apt
https://github.com/Scalingo/ffmpeg-buildpack
https://github.com/Scalingo/nodejs-buildpack
https://github.com/Scalingo/ruby-buildpack


================================================
FILE: .circleci/config.yml
================================================
version: 2

aliases:
  - &defaults
    docker:
      - image: circleci/ruby:2.6.0-stretch-node
        environment: &ruby_environment
          BUNDLE_APP_CONFIG: ./.bundle/
          DB_HOST: localhost
          DB_USER: root
          RAILS_ENV: test
          PARALLEL_TEST_PROCESSORS: 4
          ALLOW_NOPAM: true
          CONTINUOUS_INTEGRATION: true
          DISABLE_SIMPLECOV: true
          PAM_ENABLED: true
          PAM_DEFAULT_SERVICE: pam_test
          PAM_CONTROLLED_SERVICE: pam_test_controlled
    working_directory: ~/projects/mastodon/

  - &attach_workspace
    attach_workspace:
      at: ~/projects/

  - &persist_to_workspace
    persist_to_workspace:
      root: ~/projects/
      paths:
        - ./mastodon/

  - &restore_ruby_dependencies
    restore_cache:
      keys:
        - v2-ruby-dependencies-{{ checksum "/tmp/.ruby-version" }}-{{ checksum "Gemfile.lock" }}
        - v2-ruby-dependencies-{{ checksum "/tmp/.ruby-version" }}-
        - v2-ruby-dependencies-

  - &install_steps
    steps:
      - checkout
      - *attach_workspace

      - restore_cache:
          keys:
            - v1-node-dependencies-{{ checksum "yarn.lock" }}
            - v1-node-dependencies-
      - run: yarn install --frozen-lockfile
      - save_cache:
          key: v1-node-dependencies-{{ checksum "yarn.lock" }}
          paths:
            - ./node_modules/

      - *persist_to_workspace

  - &install_system_dependencies
      run:
        name: Install system dependencies
        command: |
          sudo apt-get update
          sudo apt-get install -y libicu-dev libidn11-dev libprotobuf-dev protobuf-compiler

  - &install_ruby_dependencies
      steps:
        - *attach_workspace

        - *install_system_dependencies

        - run: ruby -e 'puts RUBY_VERSION' | tee /tmp/.ruby-version
        - *restore_ruby_dependencies
        - run: bundle install --clean --jobs 16 --path ./vendor/bundle/ --retry 3 --with pam_authentication --without development production && bundle clean
        - save_cache:
            key: v2-ruby-dependencies-{{ checksum "/tmp/.ruby-version" }}-{{ checksum "Gemfile.lock" }}
            paths:
              - ./.bundle/
              - ./vendor/bundle/
        - persist_to_workspace:
            root: ~/projects/
            paths:
                - ./mastodon/.bundle/
                - ./mastodon/vendor/bundle/

  - &test_steps
      steps:
        - *attach_workspace

        - *install_system_dependencies
        - run: sudo apt-get install -y ffmpeg

        - run:
            name: Prepare Tests
            command: ./bin/rails parallel:create parallel:load_schema parallel:prepare
        - run:
            name: Run Tests
            command: ./bin/retry bundle exec parallel_test ./spec/ --group-by filesize --type rspec

jobs:
  install:
    <<: *defaults
    <<: *install_steps

  install-ruby2.6:
    <<: *defaults
    <<: *install_ruby_dependencies

  install-ruby2.5:
    <<: *defaults
    docker:
      - image: circleci/ruby:2.5.3-stretch-node
        environment: *ruby_environment
    <<: *install_ruby_dependencies

  install-ruby2.4:
    <<: *defaults
    docker:
      - image: circleci/ruby:2.4.5-stretch-node
        environment: *ruby_environment
    <<: *install_ruby_dependencies

  build:
    <<: *defaults
    steps:
      - *attach_workspace
      - *install_system_dependencies
      - run: ./bin/rails assets:precompile
      - persist_to_workspace:
          root: ~/projects/
          paths:
              - ./mastodon/public/assets
              - ./mastodon/public/packs-test/

  test-ruby2.6:
    <<: *defaults
    docker:
      - image: circleci/ruby:2.6.0-stretch-node
        environment: *ruby_environment
      - image: circleci/postgres:10.6-alpine
        environment:
          POSTGRES_USER: root
      - image: circleci/redis:5.0.3-alpine3.8
    <<: *test_steps

  test-ruby2.5:
    <<: *defaults
    docker:
      - image: circleci/ruby:2.5.3-stretch-node
        environment: *ruby_environment
      - image: circleci/postgres:10.6-alpine
        environment:
          POSTGRES_USER: root
      - image: circleci/redis:4.0.12-alpine
    <<: *test_steps

  test-ruby2.4:
    <<: *defaults
    docker:
      - image: circleci/ruby:2.4.5-stretch-node
        environment: *ruby_environment
      - image: circleci/postgres:10.6-alpine
        environment:
          POSTGRES_USER: root
      - image: circleci/redis:4.0.12-alpine
    <<: *test_steps

  test-webui:
    <<: *defaults
    docker:
      - image: circleci/node:8.15.0-stretch
    steps:
      - *attach_workspace
      - run: ./bin/retry yarn test:jest

  check-i18n:
    <<: *defaults
    steps:
      - *attach_workspace
      - run: bundle exec i18n-tasks check-normalized
      - run: bundle exec i18n-tasks unused -l en
      - run: bundle exec i18n-tasks check-consistent-interpolations

workflows:
  version: 2
  build-and-test:
    jobs:
      - install
      - install-ruby2.6:
          requires:
            - install
      - install-ruby2.5:
          requires:
            - install
            - install-ruby2.6
      - install-ruby2.4:
          requires:
            - install
            - install-ruby2.6
      - build:
          requires:
            - install-ruby2.6
      - test-ruby2.6:
          requires:
            - install-ruby2.6
            - build
      - test-ruby2.5:
          requires:
            - install-ruby2.5
            - build
      - test-ruby2.4:
          requires:
            - install-ruby2.4
            - build
      - test-webui:
          requires:
            - install
      - check-i18n:
          requires:
            - install-ruby2.6


================================================
FILE: .codeclimate.yml
================================================
version: "2"
checks:
  argument-count:
    enabled: false
  complex-logic:
    enabled: false
  file-lines:
    enabled: false
  method-complexity:
    enabled: false
  method-count:
    enabled: false
  method-lines:
    enabled: false
  nested-control-flow:
    enabled: false
  return-statements:
    enabled: false
  similar-code:
    enabled: false
  identical-code:
    enabled: false
plugins:
  brakeman:
    enabled: true
  bundler-audit:
    enabled: true
  eslint:
    enabled: true
    channel: eslint-5
  rubocop:
    enabled: true
    channel: rubocop-0-71
  sass-lint:
    enabled: true
exclude_patterns:
- spec/
- vendor/asset


================================================
FILE: .dependabot/config.yml
================================================
version: 1

update_configs:
  - package_manager: "ruby:bundler"
    directory: "/"
    update_schedule: "weekly"

  - package_manager: "javascript"
    directory: "/"
    update_schedule: "weekly"


================================================
FILE: .dockerignore
================================================
.bundle
.env
.env.*
public/system
public/assets
public/packs
node_modules
neo4j
vendor/bundle
.DS_Store
*.swp
*~
postgres
redis
elasticsearch


================================================
FILE: .editorconfig
================================================
# EditorConfig is awesome: http://EditorConfig.org

# top-most EditorConfig file
root = true

# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true
charset = utf-8
indent_style = space
indent_size = 2


================================================
FILE: .eslintignore
================================================
/build/**
/coverage/**
/db/**
/lib/**
/log/**
/node_modules/**
/nonobox/**
/public/**
!/public/embed.js
/spec/**
/tmp/**
/vendor/**
!.eslintrc.js


================================================
FILE: .eslintrc.js
================================================
module.exports = {
  root: true,

  env: {
    browser: true,
    node: true,
    es6: true,
    jest: true,
  },

  globals: {
    ATTACHMENT_HOST: false,
  },

  parser: 'babel-eslint',

  plugins: [
    'react',
    'jsx-a11y',
    'import',
    'promise',
  ],

  parserOptions: {
    sourceType: 'module',
    ecmaFeatures: {
      experimentalObjectRestSpread: true,
      jsx: true,
    },
    ecmaVersion: 2018,
  },

  settings: {
    react: {
      version: 'detect',
    },
    'import/extensions': [
      '.js',
    ],
    'import/ignore': [
      'node_modules',
      '\\.(css|scss|json)$',
    ],
    'import/resolver': {
      node: {
        paths: ['app/javascript'],
      },
    },
  },

  rules: {
    'brace-style': 'warn',
    'comma-dangle': ['error', 'always-multiline'],
    'comma-spacing': [
      'warn',
      {
        before: false,
        after: true,
      },
    ],
    'comma-style': ['warn', 'last'],
    'consistent-return': 'error',
    'dot-notation': 'error',
    eqeqeq: 'error',
    indent: ['warn', 2],
    'jsx-quotes': ['error', 'prefer-single'],
    'no-catch-shadow': 'error',
    'no-cond-assign': 'error',
    'no-console': [
      'warn',
      {
        allow: [
          'error',
          'warn',
        ],
      },
    ],
    'no-fallthrough': 'error',
    'no-irregular-whitespace': 'error',
    'no-mixed-spaces-and-tabs': 'warn',
    'no-nested-ternary': 'warn',
    'no-trailing-spaces': 'warn',
    'no-undef': 'error',
    'no-unreachable': 'error',
    'no-unused-expressions': 'error',
    'no-unused-vars': [
      'error',
      {
        vars: 'all',
        args: 'after-used',
        ignoreRestSiblings: true,
      },
    ],
    'object-curly-spacing': ['error', 'always'],
    'padded-blocks': [
      'error',
      {
        classes: 'always',
      },
    ],
    quotes: ['error', 'single'],
    semi: 'error',
    strict: 'off',
    'valid-typeof': 'error',

    'react/jsx-boolean-value': 'error',
    'react/jsx-closing-bracket-location': ['error', 'line-aligned'],
    'react/jsx-curly-spacing': 'error',
    'react/jsx-equals-spacing': 'error',
    'react/jsx-first-prop-new-line': ['error', 'multiline-multiprop'],
    'react/jsx-indent': ['error', 2],
    'react/jsx-no-bind': 'error',
    'react/jsx-no-duplicate-props': 'error',
    'react/jsx-no-undef': 'error',
    'react/jsx-tag-spacing': 'error',
    'react/jsx-uses-react': 'error',
    'react/jsx-uses-vars': 'error',
    'react/jsx-wrap-multilines': 'error',
    'react/no-multi-comp': 'off',
    'react/no-string-refs': 'error',
    'react/prop-types': 'error',
    'react/self-closing-comp': 'error',

    'jsx-a11y/accessible-emoji': 'warn',
    'jsx-a11y/alt-text': 'warn',
    'jsx-a11y/anchor-has-content': 'warn',
    'jsx-a11y/anchor-is-valid': [
      'warn',
      {
        components: [
          'Link',
          'NavLink',
        ],
        specialLink: [
          'to',
        ],
        aspect: [
          'noHref',
          'invalidHref',
          'preferButton',
        ],
      },
    ],
    'jsx-a11y/aria-activedescendant-has-tabindex': 'warn',
    'jsx-a11y/aria-props': 'warn',
    'jsx-a11y/aria-proptypes': 'warn',
    'jsx-a11y/aria-role': 'warn',
    'jsx-a11y/aria-unsupported-elements': 'warn',
    'jsx-a11y/heading-has-content': 'warn',
    'jsx-a11y/html-has-lang': 'warn',
    'jsx-a11y/iframe-has-title': 'warn',
    'jsx-a11y/img-redundant-alt': 'warn',
    'jsx-a11y/interactive-supports-focus': 'warn',
    'jsx-a11y/label-has-for': 'off',
    'jsx-a11y/mouse-events-have-key-events': 'warn',
    'jsx-a11y/no-access-key': 'warn',
    'jsx-a11y/no-distracting-elements': 'warn',
    'jsx-a11y/no-noninteractive-element-interactions': [
      'warn',
      {
        handlers: [
          'onClick',
        ],
      },
    ],
    'jsx-a11y/no-onchange': 'warn',
    'jsx-a11y/no-redundant-roles': 'warn',
    'jsx-a11y/no-static-element-interactions': [
      'warn',
      {
        handlers: [
          'onClick',
        ],
      },
    ],
    'jsx-a11y/role-has-required-aria-props': 'warn',
    'jsx-a11y/role-supports-aria-props': 'off',
    'jsx-a11y/scope': 'warn',
    'jsx-a11y/tabindex-no-positive': 'warn',

    'import/extensions': [
      'error',
      'always',
      {
        js: 'never',
      },
    ],
    'import/newline-after-import': 'error',
    'import/no-extraneous-dependencies': [
      'error',
      {
        devDependencies: [
          'config/webpack/**',
          'app/javascript/mastodon/test_setup.js',
          'app/javascript/**/__tests__/**',
        ],
      },
    ],
    'import/no-unresolved': 'error',
    'import/no-webpack-loader-syntax': 'error',

    'promise/catch-or-return': 'error',
  },
};


================================================
FILE: .foreman
================================================
procfile: Procfile.dev


================================================
FILE: .gitattributes
================================================
*                             text=auto eol=lf
*.eot                         -text
*.gif                         -text
*.gz                          -text
*.ico                         -text
*.jpg                         -text
*.mp3                         -text
*.ogg                         -text
*.png                         -text
*.ttf                         -text
*.webm                        -text
*.woff                        -text
*.woff2                       -text
spec/fixtures/requests/**     -text !eol


================================================
FILE: .gitignore
================================================
# See https://help.github.com/articles/ignoring-files for more about ignoring files.
#
# If you find yourself ignoring temporary files generated by your text editor
# or operating system, you probably want to add a global ignore instead:
#   git config --global core.excludesfile '~/.gitignore_global'

# Ignore bundler config and downloaded libraries.
/.bundle
/vendor/bundle

# Ignore the default SQLite database.
/db/*.sqlite3
/db/*.sqlite3-journal

# Ignore all logfiles and tempfiles.
/log/*
!/log/.keep
/tmp
coverage
public/system
public/assets
public/packs
public/packs-test
.env
.env.production
node_modules/
build/

# Ignore Vagrant files
.vagrant/

# Ignore Capistrano customizations
config/deploy/*

# Ignore IDE files
.vscode/
.idea/

# Ignore postgres + redis + elasticsearch volume optionally created by docker-compose
postgres
redis
elasticsearch

# Ignore Apple files
.DS_Store

# Ignore vim files
*~
*.swp

# Ignore npm debug log
npm-debug.log

# Ignore yarn log files
yarn-error.log
yarn-debug.log

# Ignore Docker option files
docker-compose.override.yml



================================================
FILE: .haml-lint.yml
================================================
# Whether to ignore frontmatter at the beginning of HAML documents for
# frameworks such as Jekyll/Middleman
skip_frontmatter: false

exclude:
  - 'vendor/**/*'
  - 'spec/**/*'
  - 'lib/templates/**/*'
  - 'app/views/kaminari/**/*'

linters:
  AltText:
    enabled: false

  ClassAttributeWithStaticValue:
    enabled: true

  ClassesBeforeIds:
    enabled: true

  ConsecutiveComments:
    enabled: true

  ConsecutiveSilentScripts:
    enabled: true
    max_consecutive: 2

  EmptyObjectReference:
    enabled: true

  EmptyScript:
    enabled: true

  FinalNewline:
    enabled: true
    present: true

  HtmlAttributes:
    enabled: true

  ImplicitDiv:
    enabled: true

  LeadingCommentSpace:
    enabled: true

  LineLength:
    enabled: false
    max: 80

  MultilinePipe:
    enabled: true

  MultilineScript:
    enabled: true

  ObjectReferenceAttributes:
    enabled: true

  RuboCop:
    enabled: true
    # These cops are incredibly noisy when it comes to HAML templates, so we
    # ignore them.
    ignored_cops:
      - Lint/BlockAlignment
      - Lint/EndAlignment
      - Lint/Void
      - Metrics/BlockLength
      - Metrics/LineLength
      - Style/AlignParameters
      - Style/BlockNesting
      - Style/ElseAlignment
      - Style/EndOfLine
      - Style/FileName
      - Style/FinalNewline
      - Style/FrozenStringLiteralComment
      - Style/IfUnlessModifier
      - Style/IndentationWidth
      - Style/Next
      - Style/TrailingBlankLines
      - Style/TrailingWhitespace
      - Style/WhileUntilModifier

  RubyComments:
    enabled: true

  SpaceBeforeScript:
    enabled: true

  SpaceInsideHashAttributes:
    enabled: true
    style: space

  Indentation:
    enabled: true
    character: space # or tab

  TagName:
    enabled: true

  TrailingWhitespace:
    enabled: true

  UnnecessaryInterpolation:
    enabled: true

  UnnecessaryStringOutput:
    enabled: true


================================================
FILE: .nanoignore
================================================
.DS_Store
.git/
.gitignore

.bundle/
.cache/
config/deploy/*
coverage
docs/
.env
log/*.log
neo4j/
node_modules/
public/assets/
public/system/
spec/
tmp/
.vagrant/
vendor/bundle/


================================================
FILE: .nvmrc
================================================
8


================================================
FILE: .profile
================================================
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/app/.apt/lib/x86_64-linux-gnu:/app/.apt/usr/lib/x86_64-linux-gnu/mesa:/app/.apt/usr/lib/x86_64-linux-gnu/pulseaudio


================================================
FILE: .rspec
================================================
--color
--require spec_helper
--format Fuubar


================================================
FILE: .rubocop.yml
================================================
require:
  - rubocop-rails

AllCops:
  TargetRubyVersion: 2.3
  Exclude:
  - 'spec/**/*'
  - 'db/**/*'
  - 'app/views/**/*'
  - 'config/**/*'
  - 'bin/*'
  - 'Rakefile'
  - 'node_modules/**/*'
  - 'Vagrantfile'
  - 'vendor/**/*'
  - 'lib/json_ld/*'
  - 'lib/templates/**/*'

Bundler/OrderedGems:
  Enabled: false

Layout/AccessModifierIndentation:
  EnforcedStyle: indent

Layout/EmptyLineAfterMagicComment:
  Enabled: false

Layout/SpaceInsideHashLiteralBraces:
  EnforcedStyle: space

Metrics/AbcSize:
  Max: 100

Metrics/BlockLength:
  Max: 35
  Exclude:
    - 'lib/tasks/**/*'

Metrics/BlockNesting:
  Max: 3

Metrics/ClassLength:
  CountComments: false
  Max: 300

Metrics/CyclomaticComplexity:
  Max: 25

Metrics/LineLength:
  AllowURI: true
  Enabled: false

Metrics/MethodLength:
  CountComments: false
  Max: 55

Metrics/ModuleLength:
  CountComments: false
  Max: 200

Metrics/ParameterLists:
  Max: 5
  CountKeywordArgs: true

Metrics/PerceivedComplexity:
  Max: 20

Naming/MemoizedInstanceVariableName:
  Enabled: false

Rails:
  Enabled: true

Rails/HasAndBelongsToMany:
  Enabled: false

Rails/SkipsModelValidations:
  Enabled: false

Rails/HttpStatus:
  Enabled: false

Rails/Exit:
  Exclude:
    - 'lib/mastodon/*'
    - 'lib/cli.rb'

Rails/HelperInstanceVariable:
  Enabled: false

Style/ClassAndModuleChildren:
  Enabled: false

Style/CollectionMethods:
  Enabled: true
  PreferredMethods:
    find_all: 'select'

Style/Documentation:
  Enabled: false

Style/DoubleNegation:
  Enabled: true

Style/FrozenStringLiteralComment:
  Enabled: true

Style/GuardClause:
  Enabled: false

Style/Lambda:
  Enabled: false

Style/PercentLiteralDelimiters:
  PreferredDelimiters:
    '%i': '()'
    '%w': '()'

Style/PerlBackrefs:
  AutoCorrect: false

Style/RegexpLiteral:
  Enabled: false

Style/SymbolArray:
  Enabled: false

Style/TrailingCommaInArrayLiteral:
  EnforcedStyleForMultiline: 'comma'

Style/TrailingCommaInHashLiteral:
  EnforcedStyleForMultiline: 'comma'


================================================
FILE: .ruby-version
================================================
2.6.1


================================================
FILE: .sass-lint.yml
================================================
# Linter Documentation:
# https://github.com/sasstools/sass-lint/tree/v1.13.1/docs/options

files:
  include: app/javascript/styles/**/*.scss
  ignore:
    - app/javascript/styles/mastodon/reset.scss

rules:
  # Disallows
  no-color-literals: 0
  no-css-comments: 0
  no-duplicate-properties: 0
  no-ids: 0
  no-important: 0
  no-mergeable-selectors: 0
  no-misspelled-properties: 0
  no-qualifying-elements: 0
  no-transition-all: 0
  no-vendor-prefixes: 0

  # Nesting
  force-element-nesting: 0
  force-attribute-nesting: 0
  force-pseudo-nesting: 0

  # Name Formats
  class-name-format: 0
  leading-zero: 0

  # Style Guide
  attribute-quotes: 0
  hex-length: 0
  indentation: 0
  nesting-depth: 0
  property-sort-order: 0
  quotes: 0


================================================
FILE: .slugignore
================================================
node_modules/
.cache/
docs/
spec/


================================================
FILE: .yarnclean
================================================
# test directories
__tests__
test
tests
powered-test

# asset directories
docs
doc
website
images
# assets

# examples
example
examples

# code coverage directories
coverage
.nyc_output

# build scripts
Makefile
Gulpfile.js
Gruntfile.js

# configs
.tern-project
.gitattributes
.editorconfig
.*ignore
.eslintrc
.jshintrc
.flowconfig
.documentup.json
.yarn-metadata.json
.*.yml
*.yml

# misc
*.gz
*.md

# for specific ignore
!.svgo.yml
!sass-lint/**/*.yml


================================================
FILE: AUTHORS.md
================================================
Authors
=======

Mastodon is available on [GitHub](https://github.com/tootsuite/mastodon)
and provided thanks to the work of the following contributors:

* [Gargron](https://github.com/Gargron)
* [ykzts](https://github.com/ykzts)
* [ThibG](https://github.com/ThibG)
* [akihikodaki](https://github.com/akihikodaki)
* [mjankowski](https://github.com/mjankowski)
* [dependabot[bot]](https://github.com/apps/dependabot)
* [unarist](https://github.com/unarist)
* [m4sk1n](https://github.com/m4sk1n)
* [yiskah](https://github.com/yiskah)
* [nolanlawson](https://github.com/nolanlawson)
* [ysksn](https://github.com/ysksn)
* [sorin-davidoi](https://github.com/sorin-davidoi)
* [abcang](https://github.com/abcang)
* [lynlynlynx](https://github.com/lynlynlynx)
* [mayaeh](https://github.com/mayaeh)
* [renatolond](https://github.com/renatolond)
* [alpaca-tc](https://github.com/alpaca-tc)
* [nclm](https://github.com/nclm)
* [ineffyble](https://github.com/ineffyble)
* [jeroenpraat](https://github.com/jeroenpraat)
* [blackle](https://github.com/blackle)
* [Quent-in](https://github.com/Quent-in)
* [JantsoP](https://github.com/JantsoP)
* [Kjwon15](https://github.com/Kjwon15)
* [mabkenar](https://github.com/mabkenar)
* [nullkal](https://github.com/nullkal)
* [yookoala](https://github.com/yookoala)
* [shuheiktgw](https://github.com/shuheiktgw)
* [ashfurrow](https://github.com/ashfurrow)
* [zunda](https://github.com/zunda)
* [Quenty31](https://github.com/Quenty31)
* [eramdam](https://github.com/eramdam)
* [takayamaki](https://github.com/takayamaki)
* [masarakki](https://github.com/masarakki)
* [ticky](https://github.com/ticky)
* [danhunsaker](https://github.com/danhunsaker)
* [ThisIsMissEm](https://github.com/ThisIsMissEm)
* [hcmiya](https://github.com/hcmiya)
* [stephenburgess8](https://github.com/stephenburgess8)
* [Wonderfall](https://github.com/Wonderfall)
* [matteoaquila](https://github.com/matteoaquila)
* [yukimochi](https://github.com/yukimochi)
* [rkarabut](https://github.com/rkarabut)
* [Artoria2e5](https://github.com/Artoria2e5)
* [nightpool](https://github.com/nightpool)
* [marrus-sh](https://github.com/marrus-sh)
* [krainboltgreene](https://github.com/krainboltgreene)
* [pfigel](https://github.com/pfigel)
* [Aldarone](https://github.com/Aldarone)
* [BoFFire](https://github.com/BoFFire)
* [clworld](https://github.com/clworld)
* [dracos](https://github.com/dracos)
* [SerCom_KC](mailto:sercom-kc@users.noreply.github.com)
* [Sylvhem](https://github.com/Sylvhem)
* [MasterGroosha](https://github.com/MasterGroosha)
* [JeanGauthier](https://github.com/JeanGauthier)
* [kschaper](https://github.com/kschaper)
* [MaciekBaron](https://github.com/MaciekBaron)
* [MitarashiDango](mailto:mitarashidango@users.noreply.github.com)
* [beatrix-bitrot](https://github.com/beatrix-bitrot)
* [Aditoo17](https://github.com/Aditoo17)
* [adbelle](https://github.com/adbelle)
* [evanminto](https://github.com/evanminto)
* [MightyPork](https://github.com/MightyPork)
* [yhirano55](https://github.com/yhirano55)
* [rinsuki](https://github.com/rinsuki)
* [camponez](https://github.com/camponez)
* [hinaloe](https://github.com/hinaloe)
* [SerCom-KC](https://github.com/SerCom-KC)
* [aschmitz](https://github.com/aschmitz)
* [devkral](https://github.com/devkral)
* [fpiesche](https://github.com/fpiesche)
* [gandaro](https://github.com/gandaro)
* [johnsudaar](https://github.com/johnsudaar)
* [trebmuh](https://github.com/trebmuh)
* [Rakib Hasan](mailto:rmhasan@gmail.com)
* [ashleyhull-versent](https://github.com/ashleyhull-versent)
* [lindwurm](https://github.com/lindwurm)
* [victorhck](mailto:victorhck@geeko.site)
* [voidsatisfaction](https://github.com/voidsatisfaction)
* [hikari-no-yume](https://github.com/hikari-no-yume)
* [angristan](https://github.com/angristan)
* [seefood](https://github.com/seefood)
* [jackjennings](https://github.com/jackjennings)
* [spla](mailto:spla@mastodont.cat)
* [expenses](https://github.com/expenses)
* [walf443](https://github.com/walf443)
* [JoelQ](https://github.com/JoelQ)
* [mistydemeo](https://github.com/mistydemeo)
* [dunn](https://github.com/dunn)
* [xqus](https://github.com/xqus)
* [hugogameiro](https://github.com/hugogameiro)
* [ariasuni](https://github.com/ariasuni)
* [pfm-eyesightjp](https://github.com/pfm-eyesightjp)
* [fakenine](https://github.com/fakenine)
* [tsuwatch](https://github.com/tsuwatch)
* [victorhck](https://github.com/victorhck)
* [kedamaDQ](https://github.com/kedamaDQ)
* [puckipedia](https://github.com/puckipedia)
* [trwnh](https://github.com/trwnh)
* [fvh-P](https://github.com/fvh-P)
* [Anna e só](mailto:contraexemplos@gmail.com)
* [BenLubar](https://github.com/BenLubar)
* [kazu9su](https://github.com/kazu9su)
* [Komic](https://github.com/Komic)
* [lmorchard](https://github.com/lmorchard)
* [diomed](https://github.com/diomed)
* [Neetshin](mailto:neetshin@neetsh.in)
* [rainyday](https://github.com/rainyday)
* [ProgVal](https://github.com/ProgVal)
* [valentin2105](https://github.com/valentin2105)
* [yuntan](https://github.com/yuntan)
* [goofy-bz](mailto:goofy@babelzilla.org)
* [kadiix](https://github.com/kadiix)
* [kodacs](https://github.com/kodacs)
* [JMendyk](https://github.com/JMendyk)
* [KScl](https://github.com/KScl)
* [sterdev](https://github.com/sterdev)
* [TheKinrar](https://github.com/TheKinrar)
* [AA4ch1](https://github.com/AA4ch1)
* [alexgleason](https://github.com/alexgleason)
* [cpytel](https://github.com/cpytel)
* [northerner](https://github.com/northerner)
* [fhemberger](https://github.com/fhemberger)
* [greysteil](https://github.com/greysteil)
* [hensmith](https://github.com/hensmith)
* [d6rkaiz](https://github.com/d6rkaiz)
* [Reverite](https://github.com/Reverite)
* [JohnD28](https://github.com/JohnD28)
* [znz](https://github.com/znz)
* [marek-lach](https://github.com/marek-lach)
* [Naouak](https://github.com/Naouak)
* [pawelngei](https://github.com/pawelngei)
* [rtucker](https://github.com/rtucker)
* [reneklacan](https://github.com/reneklacan)
* [ekiru](https://github.com/ekiru)
* [noellabo](https://github.com/noellabo)
* [tcitworld](https://github.com/tcitworld)
* [geta6](https://github.com/geta6)
* [happycoloredbanana](https://github.com/happycoloredbanana)
* [leopku](https://github.com/leopku)
* [SansPseudoFix](https://github.com/SansPseudoFix)
* [tomfhowe](https://github.com/tomfhowe)
* [noraworld](https://github.com/noraworld)
* [theboss](https://github.com/theboss)
* [178inaba](https://github.com/178inaba)
* [alyssais](https://github.com/alyssais)
* [hiphref](https://github.com/hiphref)
* [stalker314314](https://github.com/stalker314314)
* [huertanix](https://github.com/huertanix)
* [genesixx](https://github.com/genesixx)
* [halkeye](https://github.com/halkeye)
* [treby](https://github.com/treby)
* [jpdevries](https://github.com/jpdevries)
* [gdpelican](https://github.com/gdpelican)
* [kmichl](https://github.com/kmichl)
* [Kurtis Rainbolt-Greene](mailto:me@kurtisrainboltgreene.name)
* [saper](https://github.com/saper)
* [nevillepark](https://github.com/nevillepark)
* [ornithocoder](https://github.com/ornithocoder)
* [pierreozoux](https://github.com/pierreozoux)
* [qguv](https://github.com/qguv)
* [Ram Lmn](mailto:ramlmn@users.noreply.github.com)
* [sascha-sl](https://github.com/sascha-sl)
* [harukasan](https://github.com/harukasan)
* [stamak](https://github.com/stamak)
* [Technowix](mailto:technowix@users.noreply.github.com)
* [Zoeille](https://github.com/Zoeille)
* [Thor Harald Johansen](mailto:thj@thj.no)
* [0x70b1a5](https://github.com/0x70b1a5)
* [gled-rs](https://github.com/gled-rs)
* [Valentin_NC](mailto:valentin.ouvrard@nautile.sarl)
* [R0ckweb](https://github.com/R0ckweb)
* [caasi](https://github.com/caasi)
* [chr-1x](https://github.com/chr-1x)
* [esetomo](https://github.com/esetomo)
* [foxiehkins](https://github.com/foxiehkins)
* [hoodie](mailto:hoodiekitten@outlook.com)
* [luzi82](https://github.com/luzi82)
* [duxovni](https://github.com/duxovni)
* [tmm576](https://github.com/tmm576)
* [unsmell](https://github.com/unsmell)
* [valerauko](https://github.com/valerauko)
* [chriswmartin](https://github.com/chriswmartin)
* [vahnj](https://github.com/vahnj)
* [ikuradon](https://github.com/ikuradon)
* [AndreLewin](https://github.com/AndreLewin)
* [0xflotus](https://github.com/0xflotus)
* [redtachyons](https://github.com/redtachyons)
* [thurloat](https://github.com/thurloat)
* [aaribaud](https://github.com/aaribaud)
* [pointlessone](https://github.com/pointlessone)
* [Andrew](mailto:andrewlchronister@gmail.com)
* [estuans](https://github.com/estuans)
* [dissolve](https://github.com/dissolve)
* [PurpleBooth](https://github.com/PurpleBooth)
* [bradurani](https://github.com/bradurani)
* [wavebeem](https://github.com/wavebeem)
* [bruwalfas](https://github.com/bruwalfas)
* [foxsan48](https://github.com/foxsan48)
* [wchristian](https://github.com/wchristian)
* [muffinista](https://github.com/muffinista)
* [cdutson](https://github.com/cdutson)
* [farlistener](https://github.com/farlistener)
* [DavidLibeau](https://github.com/DavidLibeau)
* [ddevault](https://github.com/ddevault)
* [Fjoerfoks](https://github.com/Fjoerfoks)
* [fmauNeko](https://github.com/fmauNeko)
* [gloaec](https://github.com/gloaec)
* [Gomasy](https://github.com/Gomasy)
* [unstabler](https://github.com/unstabler)
* [potato4d](https://github.com/potato4d)
* [h-izumi](https://github.com/h-izumi)
* [ErikXXon](https://github.com/ErikXXon)
* [ian-kelling](https://github.com/ian-kelling)
* [immae](https://github.com/immae)
* [J0WI](https://github.com/J0WI)
* [foozmeat](https://github.com/foozmeat)
* [jasonrhodes](https://github.com/jasonrhodes)
* [Jason Snell](mailto:jason@newrelic.com)
* [jviide](https://github.com/jviide)
* [YuleZ](https://github.com/YuleZ)
* [crakaC](https://github.com/crakaC)
* [tkbky](https://github.com/tkbky)
* [Kaylee](mailto:kaylee@codethat.sucks)
* [Kazhnuz](https://github.com/Kazhnuz)
* [connyduck](https://github.com/connyduck)
* [Lindsey Bieda](mailto:lindseyb@users.noreply.github.com)
* [Lorenz Diener](mailto:halcyon@icosahedron.website)
* [alimony](https://github.com/alimony)
* [mig5](https://github.com/mig5)
* [moritzheiber](https://github.com/moritzheiber)
* [ndarville](https://github.com/ndarville)
* [Abzol](https://github.com/Abzol)
* [pwoolcoc](https://github.com/pwoolcoc)
* [xPaw](https://github.com/xPaw)
* [petzah](https://github.com/petzah)
* [ignisf](https://github.com/ignisf)
* [raymestalez](https://github.com/raymestalez)
* [remram44](https://github.com/remram44)
* [sts10](https://github.com/sts10)
* [u1-liquid](https://github.com/u1-liquid)
* [sim6](https://github.com/sim6)
* [Sir-Boops](https://github.com/Sir-Boops)
* [stemid](https://github.com/stemid)
* [sumdog](https://github.com/sumdog)
* [ThomasLeister](https://github.com/ThomasLeister)
* [mcat-ee](https://github.com/mcat-ee)
* [tototoshi](https://github.com/tototoshi)
* [TrashMacNugget](https://github.com/TrashMacNugget)
* [VirtuBox](https://github.com/VirtuBox)
* [Vladyslav](mailto:vaden@tuta.io)
* [kaniini](https://github.com/kaniini)
* [vayan](https://github.com/vayan)
* [yannicka](https://github.com/yannicka)
* [ikasoumen](https://github.com/ikasoumen)
* [zacanger](https://github.com/zacanger)
* [amazedkoumei](https://github.com/amazedkoumei)
* [anon5r](https://github.com/anon5r)
* [aus-social](https://github.com/aus-social)
* [imbsky](https://github.com/imbsky)
* [bsky](mailto:me@imbsky.net)
* [codl](https://github.com/codl)
* [cpsdqs](https://github.com/cpsdqs)
* [barzamin](https://github.com/barzamin)
* [fhalna](https://github.com/fhalna)
* [haoyayoi](https://github.com/haoyayoi)
* [ik11235](https://github.com/ik11235)
* [kawax](https://github.com/kawax)
* [007lva](https://github.com/007lva)
* [mbajur](https://github.com/mbajur)
* [matsurai25](https://github.com/matsurai25)
* [mecab](https://github.com/mecab)
* [nicobz25](https://github.com/nicobz25)
* [oliverkeeble](https://github.com/oliverkeeble)
* [pinfort](https://github.com/pinfort)
* [rbaumert](https://github.com/rbaumert)
* [rhoio](https://github.com/rhoio)
* [usagi-f](https://github.com/usagi-f)
* [vidarlee](https://github.com/vidarlee)
* [vjackson725](https://github.com/vjackson725)
* [wxcafe](https://github.com/wxcafe)
* [新都心(Neet Shin)](mailto:nucx@dio-vox.com)
* [cygnan](https://github.com/cygnan)
* [Awea](https://github.com/Awea)
* [halcy](https://github.com/halcy)
* [naaaaaaaaaaaf](https://github.com/naaaaaaaaaaaf)
* [8398a7](https://github.com/8398a7)
* [857b](https://github.com/857b)
* [insom](https://github.com/insom)
* [tachyons](https://github.com/tachyons)
* [acid-chicken](https://github.com/acid-chicken)
* [Esteth](https://github.com/Esteth)
* [unascribed](https://github.com/unascribed)
* [Aguay-val](https://github.com/Aguay-val)
* [Akihiko Odaki](mailto:nekomanma@pixiv.co.jp)
* [knu](https://github.com/knu)
* [h3poteto](https://github.com/h3poteto)
* [unleashed](https://github.com/unleashed)
* [alxrcs](https://github.com/alxrcs)
* [console-cowboy](https://github.com/console-cowboy)
* [Alkarex](https://github.com/Alkarex)
* [a2](https://github.com/a2)
* [0xa](https://github.com/0xa)
* [palindromordnilap](https://github.com/palindromordnilap)
* [virtualpain](https://github.com/virtualpain)
* [sapphirus](https://github.com/sapphirus)
* [amandavisconti](https://github.com/amandavisconti)
* [ameliavoncat](https://github.com/ameliavoncat)
* [ilpianista](https://github.com/ilpianista)
* [Andreas Drop](mailto:andy@remline.de)
* [andi1984](https://github.com/andi1984)
* [schas002](https://github.com/schas002)
* [contraexemplo](https://github.com/contraexemplo)
* [abackstrom](https://github.com/abackstrom)
* [armandfardeau](https://github.com/armandfardeau)
* [jumbosushi](https://github.com/jumbosushi)
* [aurelien-reeves](https://github.com/aurelien-reeves)
* [ayumin](https://github.com/ayumin)
* [BaptisteGelez](https://github.com/BaptisteGelez)
* [bzg](https://github.com/bzg)
* [benediktg](https://github.com/benediktg)
* [blakebarnett](https://github.com/blakebarnett)
* [bradj](https://github.com/bradj)
* [brycied00d](https://github.com/brycied00d)
* [carlosjs23](https://github.com/carlosjs23)
* [cgxxx](https://github.com/cgxxx)
* [kibitan](https://github.com/kibitan)
* [chrisheninger](https://github.com/chrisheninger)
* [chris-martin](https://github.com/chris-martin)
* [DoubleMalt](https://github.com/DoubleMalt)
* [Moosh-be](https://github.com/Moosh-be)
* [Motoma](https://github.com/Motoma)
* [chriswk](https://github.com/chriswk)
* [csu](https://github.com/csu)
* [clarfon](https://github.com/clarfon)
* [kklleemm](https://github.com/kklleemm)
* [colindean](https://github.com/colindean)
* [dachinat](https://github.com/dachinat)
* [multiple-creatures](https://github.com/multiple-creatures)
* [watilde](https://github.com/watilde)
* [daprice](https://github.com/daprice)
* [dar5hak](https://github.com/dar5hak)
* [kant](https://github.com/kant)
* [maxolasersquad](https://github.com/maxolasersquad)
* [singingwolfboy](https://github.com/singingwolfboy)
* [davidcelis](https://github.com/davidcelis)
* [davefp](https://github.com/davefp)
* [yipdw](https://github.com/yipdw)
* [debanshuk](https://github.com/debanshuk)
* [Derek Lewis](mailto:derekcecillewis@gmail.com)
* [dblandin](https://github.com/dblandin)
* [Drew Gates](mailto:aranaur@users.noreply.github.com)
* [dtschust](https://github.com/dtschust)
* [Dryusdan](https://github.com/Dryusdan)
* [eai04191](https://github.com/eai04191)
* [d3vgru](https://github.com/d3vgru)
* [Elizafox](https://github.com/Elizafox)
* [enewhuis](https://github.com/enewhuis)
* [ericblade](https://github.com/ericblade)
* [mikoim](https://github.com/mikoim)
* [espenronnevik](https://github.com/espenronnevik)
* [Finariel](https://github.com/Finariel)
* [siuying](https://github.com/siuying)
* [zoc](https://github.com/zoc)
* [fwenzel](https://github.com/fwenzel)
* [GenbuHase](https://github.com/GenbuHase)
* [hattori6789](https://github.com/hattori6789)
* [algernon](https://github.com/algernon)
* [Fastbyte01](https://github.com/Fastbyte01)
* [myfreeweb](https://github.com/myfreeweb)
* [gfaivre](https://github.com/gfaivre)
* [Fiaxhs](https://github.com/Fiaxhs)
* [reedcourty](https://github.com/reedcourty)
* [anneau](https://github.com/anneau)
* [lanodan](https://github.com/lanodan)
* [Harmon758](https://github.com/Harmon758)
* [HellPie](https://github.com/HellPie)
* [Habu-Kagumba](https://github.com/Habu-Kagumba)
* [suzukaze](https://github.com/suzukaze)
* [Hiromi-Kai](https://github.com/Hiromi-Kai)
* [hishamhm](https://github.com/hishamhm)
* [musashino205](https://github.com/musashino205)
* [iwaim](https://github.com/iwaim)
* [valrus](https://github.com/valrus)
* [IMcD23](https://github.com/IMcD23)
* [yi0713](https://github.com/yi0713)
* [iblech](https://github.com/iblech)
* [usbsnowcrash](https://github.com/usbsnowcrash)
* [jack-michaud](https://github.com/jack-michaud)
* [Floppy](https://github.com/Floppy)
* [loomchild](https://github.com/loomchild)
* [jenkr55](https://github.com/jenkr55)
* [press5](https://github.com/press5)
* [TrollDecker](https://github.com/TrollDecker)
* [jmontane](https://github.com/jmontane)
* [jonathanklee](https://github.com/jonathanklee)
* [jguerder](https://github.com/jguerder)
* [Jehops](https://github.com/Jehops)
* [joshuap](https://github.com/joshuap)
* [Tiwy57](https://github.com/Tiwy57)
* [xuv](https://github.com/xuv)
* [June Sallou](mailto:jnsll@users.noreply.github.com)
* [j0k3r](https://github.com/j0k3r)
* [KEINOS](https://github.com/KEINOS)
* [futoase](https://github.com/futoase)
* [Pneumaticat](https://github.com/Pneumaticat)
* [Kit Redgrave](mailto:qwertyitis@gmail.com)
* [Knut Erik](mailto:abjectio@users.noreply.github.com)
* [mkody](https://github.com/mkody)
* [k0ta0uchi](https://github.com/k0ta0uchi)
* [KrzysiekJ](https://github.com/KrzysiekJ)
* [leowzukw](https://github.com/leowzukw)
* [Tak](https://github.com/Tak)
* [cacheflow](https://github.com/cacheflow)
* [ldidry](https://github.com/ldidry)
* [jemus42](https://github.com/jemus42)
* [lfuelling](https://github.com/lfuelling)
* [Grabacr07](https://github.com/Grabacr07)
* [mistermantas](https://github.com/mistermantas)
* [mareklach](https://github.com/mareklach)
* [wirehack7](https://github.com/wirehack7)
* [martymcguire](https://github.com/martymcguire)
* [marvinkopf](https://github.com/marvinkopf)
* [otsune](https://github.com/otsune)
* [mbugowski](https://github.com/mbugowski)
* [Mathias B](mailto:10813340+mathias-b@users.noreply.github.com)
* [matt-auckland](https://github.com/matt-auckland)
* [webroo](https://github.com/webroo)
* [matthiasbeyer](https://github.com/matthiasbeyer)
* [mattjmattj](https://github.com/mattjmattj)
* [mtparet](https://github.com/mtparet)
* [maximeborges](https://github.com/maximeborges)
* [minacle](https://github.com/minacle)
* [michaeljdeeb](https://github.com/michaeljdeeb)
* [Themimitoof](https://github.com/Themimitoof)
* [cyweo](https://github.com/cyweo)
* [Midgard](mailto:m1dgard@users.noreply.github.com)
* [mike-burns](https://github.com/mike-burns)
* [verymilan](https://github.com/verymilan)
* [milmazz](https://github.com/milmazz)
* [premist](https://github.com/premist)
* [Mnkai](https://github.com/Mnkai)
* [mitchhentges](https://github.com/mitchhentges)
* [mouse-reeve](https://github.com/mouse-reeve)
* [Mozinet-fr](https://github.com/Mozinet-fr)
* [lae](https://github.com/lae)
* [nosada](https://github.com/nosada)
* [Nanamachi](https://github.com/Nanamachi)
* [orinthe](https://github.com/orinthe)
* [NecroTechno](https://github.com/NecroTechno)
* [Dar13](https://github.com/Dar13)
* [ngerakines](https://github.com/ngerakines)
* [vonneudeck](https://github.com/vonneudeck)
* [Ninetailed](https://github.com/Ninetailed)
* [k24](https://github.com/k24)
* [noiob](https://github.com/noiob)
* [kwaio](https://github.com/kwaio)
* [norayr](https://github.com/norayr)
* [joyeusenoelle](https://github.com/joyeusenoelle)
* [OlivierNicole](https://github.com/OlivierNicole)
* [noppa](https://github.com/noppa)
* [Otakan951](https://github.com/Otakan951)
* [fahy](https://github.com/fahy)
* [PatrickRWells](mailto:32802366+patrickrwells@users.noreply.github.com)
* [Paul](mailto:naydex.mc+github@gmail.com)
* [Pete Keen](mailto:pete@petekeen.net)
* [Pierre-Morgan Gate](mailto:pgate@users.noreply.github.com)
* [Ratmir Karabut](mailto:rkarabut@sfmodern.ru)
* [Reto Kromer](mailto:retokromer@users.noreply.github.com)
* [Rey Tucker](mailto:git@reytucker.us)
* [Rob Watson](mailto:rfwatson@users.noreply.github.com)
* [Ryan Freebern](mailto:ryan@freebern.org)
* [Ryan Wade](mailto:ryan.wade@protonmail.com)
* [Ryo Kajiwara](mailto:kfe-fecn6.prussian@s01.info)
* [S.H](mailto:gamelinks007@gmail.com)
* [Sadiq Saif](mailto:staticsafe@users.noreply.github.com)
* [Sam Hewitt](mailto:hewittsamuel@gmail.com)
* [Satoshi KOJIMA](mailto:skoji@mac.com)
* [ScienJus](mailto:i@scienjus.com)
* [Scott Larkin](mailto:scott@codeclimate.com)
* [Sebastian Hübner](mailto:imolein@users.noreply.github.com)
* [Sebastian Morr](mailto:sebastian@morr.cc)
* [Sergei Č](mailto:noiwex1911@gmail.com)
* [Setuu](mailto:yuki764setuu@gmail.com)
* [Shaun Gillies](mailto:me@shaungillies.net)
* [Shin Adachi](mailto:shn@glucose.jp)
* [Shin Kojima](mailto:shin@kojima.org)
* [Sho Kusano](mailto:rosylilly@aduca.org)
* [Shouko Yu](mailto:imshouko@gmail.com)
* [Sina Mashek](mailto:sina@mashek.xyz)
* [Soshi Kato](mailto:mail@sossii.com)
* [Spanky](mailto:2788886+spankyworks@users.noreply.github.com)
* [Stanislas](mailto:angristan@pm.me)
* [StefOfficiel](mailto:pichard.stephane@free.fr)
* [Steven Tappert](mailto:admin@dark-it.net)
* [Svetlozar Todorov](mailto:svetlik@users.noreply.github.com)
* [Sébastien Santoro](mailto:dereckson@espace-win.org)
* [Tad Thorley](mailto:phaedryx@users.noreply.github.com)
* [Takayoshi Nishida](mailto:takayoshi.nishida@gmail.com)
* [Takayuki KUSANO](mailto:github@tkusano.jp)
* [TakesxiSximada](mailto:takesxi.sximada@gmail.com)
* [TheInventrix](mailto:theinventrix@users.noreply.github.com)
* [Thomas Alberola](mailto:thomas@needacoffee.fr)
* [Toby Deshane](mailto:fortyseven@users.noreply.github.com)
* [Toby Pinder](mailto:gigitrix@gmail.com)
* [Tomonori Murakami](mailto:crosslife777@gmail.com)
* [TomoyaShibata](mailto:wind.of.hometown@gmail.com)
* [Treyssat-Vincent Nino](mailto:treyssatvincent@users.noreply.github.com)
* [Udo Kramer](mailto:optik@fluffel.io)
* [Una](mailto:una@unascribed.com)
* [Ushitora Anqou](mailto:ushitora_anqou@yahoo.co.jp)
* [Valentin Lorentz](mailto:progval+git@progval.net)
* [Vladimir Mincev](mailto:vladimir@canicinteractive.com)
* [Waldir Pimenta](mailto:waldyrious@gmail.com)
* [Wesley Ellis](mailto:tahnok@gmail.com)
* [Wiktor](mailto:wiktor@metacode.biz)
* [Wonderfall](mailto:wonderfall@schrodinger.io)
* [YDrogen](mailto:ydrogen45@gmail.com)
* [YMHuang](mailto:ymhuang@fmbase.tw)
* [YOSHIOKA Eiichiro](mailto:yoshioka.eiichiro@gmail.com)
* [YOU](mailto:stackexchange.you@gmail.com)
* [YaQ](mailto:i_k_o_m_a_7@yahoo.co.jp)
* [Yanaken](mailto:yanakend@gmail.com)
* [Yann Klis](mailto:yann.klis@gmail.com)
* [Yeechan Lu](mailto:wz.bluesnow@gmail.com)
* [Yusuke Abe](mailto:moonset20@gmail.com)
* [Zachary Spector](mailto:logicaldash@gmail.com)
* [ZiiX](mailto:ziix@users.noreply.github.com)
* [asria-jp](mailto:is@alicematic.com)
* [ava](mailto:vladooku@users.noreply.github.com)
* [benklop](mailto:benklop@gmail.com)
* [bsky](mailto:git@imbsky.net)
* [caesarologia](mailto:lopesgemelli.1@gmail.com)
* [cbayerlein](mailto:c.bayerlein@gmail.com)
* [chrolis](mailto:chrolis@users.noreply.github.com)
* [cormo](mailto:cormorant2+github@gmail.com)
* [d0p1](mailto:dopi-sama@hush.com)
* [evilny0](mailto:evilny0@moomoocamp.net)
* [febrezo](mailto:felixbrezo@gmail.com)
* [fsubal](mailto:fsubal@users.noreply.github.com)
* [fusshi-](mailto:dikky1218@users.noreply.github.com)
* [gentaro](mailto:gentaroooo@gmail.com)
* [gol-cha](mailto:info@mevo.xyz)
* [hakoai](mailto:hk--76@qa2.so-net.ne.jp)
* [haosbvnker](mailto:github@chaosbunker.com)
* [isati](mailto:phil@juchnowi.cz)
* [jacob](mailto:jacobherringtondeveloper@gmail.com)
* [jenn kaplan](mailto:me@jkap.io)
* [jirayudech](mailto:jirayudech@gmail.com)
* [jomo](mailto:github@jomo.tv)
* [jooops](mailto:joops@autistici.org)
* [jukper](mailto:jukkaperanto@gmail.com)
* [jumoru](mailto:jumoru@mailbox.org)
* [karlyeurl](mailto:karl.yeurl@gmail.com)
* [kedama](mailto:32974885+kedamadq@users.noreply.github.com)
* [kodai](mailto:shirafuta.kodai@gmail.com)
* [koyu](mailto:me@koyu.space)
* [kuro5hin](mailto:rusty@kuro5hin.org)
* [luzpaz](mailto:luzpaz@users.noreply.github.com)
* [maxypy](mailto:maxime@mpigou.fr)
* [mhe](mailto:mail@marcus-herrmann.com)
* [mike castleman](mailto:m@mlcastle.net)
* [mimikun](mailto:dzdzble_effort_311@outlook.jp)
* [mohemohe](mailto:mohemohe@users.noreply.github.com)
* [mshrtkch](mailto:mshrtkch@users.noreply.github.com)
* [muan](mailto:muan@github.com)
* [namelessGonbai](mailto:43787036+namelessgonbai@users.noreply.github.com)
* [neetshin](mailto:neetshin@neetsh.in)
* [rch850](mailto:rich850@gmail.com)
* [roikale](mailto:roikale@users.noreply.github.com)
* [rysiekpl](mailto:rysiek@hackerspace.pl)
* [saturday06](mailto:dyob@lunaport.net)
* [scriptjunkie](mailto:scriptjunkie@scriptjunkie.us)
* [seekr](mailto:mario.drs@gmail.com)
* [sundevour](mailto:31990469+sundevour@users.noreply.github.com)
* [syui](mailto:syui@users.noreply.github.com)
* [tackeyy](mailto:mailto.takita.yusuke@gmail.com)
* [tateisu](mailto:tateisu@gmail.com)
* [tmyt](mailto:shigure@refy.net)
* [trevDev()](mailto:trev@trevdev.ca)
* [utam0k](mailto:k0ma@utam0k.jp)
* [vpzomtrrfrt](mailto:vpzomtrrfrt@gmail.com)
* [walfie](mailto:walfington@gmail.com)
* [y-temp4](mailto:y.temp4@gmail.com)
* [ymmtmdk](mailto:ymmtmdk@gmail.com)
* [yoshipc](mailto:yoooo@yoshipc.net)
* [Özcan Zafer AYAN](mailto:ozcanzaferayan@gmail.com)
* [ばん](mailto:detteiu0321@gmail.com)
* [みたらしだんご](mailto:mitarashidango@users.noreply.github.com)
* [りんすき](mailto:6533808+rinsuki@users.noreply.github.com)
* [ヨイツの賢狼ホロ | 3rd style](mailto:horo@yoitsu.moe)
* [猫吸血鬼ディフリス / 猫ロキP](mailto:deflis@gmail.com)
* [艮 鮟鱇](mailto:ushitora_anqou@yahoo.co.jp)
* [西小倉宏信](mailto:nishiko@mindia.jp)
* [雨宮美羽](mailto:k737566@gmail.com)

This document is provided for informational purposes only. Since it is only updated once per release, the version you are looking at may be currently out of date. To see the full list of contributors, consider looking at the [git history](https://github.com/tootsuite/mastodon/graphs/contributors) instead.

## Translators

Following people have contributed to translation of Mastodon:

- **Albanian**
  - Besnik Bleta
  - Aditoo
- **Arabic**
  - ButterflyOfFire
  - Aditoo
  - Amrz0
- **Asturian**
  - ButterflyOfFire
  - Enol P.
  - Aditoo
- **Basque**
  - Osoitz
  - Aditoo
  - Aitzol
  - ButterflyOfFire
  - Peru Iparragirre
  - Gorka Azkarate
- **Bengali**
  - dxwc
- **Bulgarian**
  - ButterflyOfFire
  - Aditoo
- **Catalan**
  - spla
  - Aditoo
  - ButterflyOfFire
  - Joan Montané
  - Jose Luis
- **Chinese (Hong Kong)**
  - ButterflyOfFire
  - Luzi Leung
  - Aditoo
- **Chinese (Simplified)**
  - Allen Zhong
  - ButterflyOfFire
  - SerCom_KC
  - martialarts
  - Kaitian Xie
  - Aditoo
  - pan93412
- **Chinese (Traditional)**
  - Aditoo
  - ButterflyOfFire
  - James58899
  - pan93412
  - S1ttidoe477
  - SHA265
  - Jeff Huang
- **Corsican**
  - Alix D. R.
  - Aditoo
  - ButterflyOfFire
- **Croatian**
  - ButterflyOfFire
  - Aditoo
- **Czech**
  - Aditoo
  - Marek Ľach
  - ButterflyOfFire
- **Danish**
  - Einhjeriar
  - Rasmus Sæderup
  - Aditoo
  - ButterflyOfFire
- **Dutch**
  - Albakham
  - ButterflyOfFire
  - jeroenpraat
  - rscmbbng
  - Aditoo
  - Jelv
- **English**
  - ButterflyOfFire
  - Renato "Lond" Cerqueira
- **English (United Kingdom)**
  - Albakham
- **Esperanto**
  - Aditoo
  - ButterflyOfFire
  - Becci Cat
  - Jeong Arm
  - Mélanie Chauvel
  - Vanege
  - Martin Bodin
  - tuxayo/Victor Grousset
- **Finnish**
  - ButterflyOfFire
  - Mikko Poussu
  - Taru Luojola
  - S Heija
  - Aditoo
  - Jonne Arjoranta
- **French**
  - Albakham
  - Alix D. R.
  - ButterflyOfFire
  - codl
  - Leia
  - Alda Marteau-Hardi
  - Mélanie Chauvel
  - Paul Marques Mota
  - azenet
  - Olivier Humbert
  - Aditoo
  - Jonathan Chan
  - Letiteuf55
  - Baptiste Jonglez
  - goofy-mdn
  - Jean-Baptiste Holcroft
  - Technowix
  - Martin Bodin
  - Théodore
  - Thibaut Girka
  - Franck Paul
  - Sylvhem
- **Galician**
  - ButterflyOfFire
  - Xose M.
  - Aditoo
  - manequim
- **Georgian**
  - ButterflyOfFire
  - Aditoo
- **German**
  - Aditoo
  - ButterflyOfFire
  - Daniel
  - averageunicorn
  - Koyu Berteon
  - larsreineke
  - koyu
  - Austin Jones
  - lilo
  - Benedikt Geißler
  - ePirat
  - Eugen Rochko
  - Weblate Admin
  - Patrick Figel
- **Greek**
  - Dimitris Maroulidis
  - Antonis
  - Aditoo
  - ButterflyOfFire
  - Konstantinos Grevenitis
- **Hebrew**
  - ButterflyOfFire
  - Aditoo
  - Ira
  - Yaron Shahrabani
- **Hungarian**
  - ButterflyOfFire
  - Adam Paszternak
  - Aditoo
  - Tibike Miklós
- **Ido**
  - ButterflyOfFire
  - Aditoo
- **Indonesian**
  - afachri
  - ButterflyOfFire
  - Dito Kurnia Pratama
  - Eirworks
  - Aditoo
  - Alfiana Sibuea
  - se7entime
- **Irish**
  - Albakham
  - Kevin Houlihan
- **Italian**
  - Alessandro Levati
  - Albakham
  - ButterflyOfFire
  - Marcin Mikołajczak
  - Aditoo
  - Giuseppe Pignataro
  - Stefano
- **Japanese**
  - Hinaloe
  - 小鳥遊まりあ
  - mayaeh
  - osapon
  - 森の子リスのミーコの大冒険
  - Kumasun Morino
  - Yamagishi Kazutoshi
  - Aditoo
  - ButterflyOfFire
  - Jeong Arm
  - unarist
- **Kazakh**
  - arshat
  - Aditoo
- **Korean**
  - Aditoo
  - Jeong Arm
  - ButterflyOfFire
  - Minori Hiraoka
  - Yamagishi Kazutoshi
- **Lithuanian**
  - Sarunas Medeikis
- **Malay**
  - Muhammad Nur Hidayat (MNH48)
  - Aditoo
  - ButterflyOfFire
- **Norwegian (old code)**
  - ButterflyOfFire
  - Espen Rønnevik
  - Aditoo
  - Tale
- **Occitan**
  - Aditoo
  - ButterflyOfFire
  - Quenti2
  - Quentí
  - Maxenç
- **Persian**
  - Masoud Abkenar
  - Aditoo
  - ButterflyOfFire
- **Polish**
  - Aditoo
  - Albakham
  - ButterflyOfFire
  - Stasiek Michalski
  - Marcin Mikołajczak
  - Jakub Mendyk
  - Marek Ľach
  - krkk
- **Portuguese**
  - Albakham
  - João Pinheiro
  - manequim
  - Aditoo
  - ButterflyOfFire
  - Hugo Gameiro
- **Portuguese (Brazil)**
  - Aditoo
  - Albakham
  - Anna e só
  - Renato "Lond" Cerqueira
  - André Andrade
  - ButterflyOfFire
- **Romanian**
  - adrianbblk
  - ButterflyOfFire
  - Aditoo
- **Russian**
  - Albakham
  - ButterflyOfFire
  - Evgeny Petrov
  - Aditoo
  - Павел Гастелло
  - Andrew Zyabin
  - Yaron Shahrabani
- **Serbian**
  - Branko Kokanovic
  - Burekz Finezt
  - Aditoo
  - ButterflyOfFire
- **Serbian (latin)**
  - ButterflyOfFire
  - Aditoo
- **Slovak**
  - Aditoo
  - ButterflyOfFire
  - Ivan Pleva
  - Marek Ľach
  - Peter
- **Slovenian**
  - Kristijan Tkalec
  - Aditoo
  - ButterflyOfFire
- **Spanish**
  - Albakham
  - ButterflyOfFire
  - Carlos Mondragon
  - Antón López
  - Max Winkler
  - Pablo de la Concepción Sanz
  - Sergio Soriano
  - Angeles Broullón
  - Lothar Wolf
  - Aditoo
  - David Charte
  - Emmanuel
- **Swedish**
  - ButterflyOfFire
  - Isak Holmström
  - Shellkr
  - Aditoo
  - Elias Mårtenson
  - Stefan Midjich
  - Tim Stahel
  - Jonas Hultén
- **Telugu**
  - avndp
  - Ranjith Tellakula
  - Aditoo
  - ButterflyOfFire
  - Joseph Nuthalapati
- **Thai**
  - ButterflyOfFire
  - parnikkapore
  - Thai Localization
  - Aditoo
- **Turkish**
  - Ali Demirtas
  - ButterflyOfFire
  - Aditoo
- **Ukrainian**
  - alexcleac
  - ButterflyOfFire
  - Aditoo
  - Ivan Verchenko
- **Welsh**
  - carl morris
  - Jaz-Michael King
  - Owain Rhys Lewis
  - Rhoslyn Prys
  - Aditoo
  - ButterflyOfFire
  - Renato "Lond" Cerqueira
  - Albakham
  - Kevin Beynon
- **Armenian**
  - Aditoo
  - ButterflyOfFire
- **Latvian**
  - Aditoo
  - ButterflyOfFire
  - Maigonis
- **Tamil**
  - Aditoo
  - ButterflyOfFire
  - Prasanna Venkadesh


================================================
FILE: Aptfile
================================================
ffmpeg
libicu[0-9][0-9]
libicu-dev
libidn11
libidn11-dev
libpq-dev
libprotobuf-dev
libssl-dev
libxdamage1
libxfixes3
protobuf-compiler
zlib1g-dev
libcairo2
libcroco3
libdatrie1
libgdk-pixbuf2.0-0
libgraphite2-3
libharfbuzz0b
libpango-1.0-0
libpangocairo-1.0-0
libpangoft2-1.0-0
libpixman-1-0
librsvg2-2
libthai-data
libthai0
libvpx5
libxcb-render0
libxcb-shm0
libxrender1


================================================
FILE: CHANGELOG.md
================================================
# Changelog

This changelog will only include differences from upstream Mastodon. [You can find the upstream
changelog here.](https://github.com/tootsuite/mastodon/blob/master/CHANGELOG.md)

Please note that this project doesn't follow semantic versioning— for details please have a look at
our [README file].

[README file]: ./README.md

## Pre-Release 0.1.2 [2019-08-18 / v0.0.1.2]

This release fixes a bug from 0.1.1 before the 0.2.0 release.

It doesn't add any upstream changes, and is still based off of [Mastodon 2.9.0] plus the commits
up to [65efe892cf].

### Fixed

* Toot and biography lengths are offered as integers in the API instead of strings
    * Thanks to [mthld] and [DagAgren] for finding the bug
    * Thanks to [1011X] for the fix

[mthld]: https://github.com/mthld
[DagAgren]: https://github.com/DagAgren

## Pre-Release 0.1.1 [2019-07-28 / v0.0.1.1]

This release fixes a few bugs from 0.1.0 before the 0.2.0 release.

It doesn't add any upstream changes, and is still based off of [Mastodon 2.9.0] plus the commits
up to [65efe892cf].

### Fixed

* Toot and biography lengths are now on /api/v1/instance API, for better app integration
    * Thanks to [ElliotBerriot] for testing 0.1.0 and finding the bug
    * Thanks to [1011X] for the fix
* Toot and biography lengths can actually be saved in the admin UI
    * Thanks to [ElliotBerriot] for testing 0.1.0 and finding the bug
    * Thanks to [clarfon] for the fix
* All of the code has been fixed to include the proper project URL and docker image
    * Thanks to [ElliotBerriot] for debugging 0.1.0 and finding the errors with the Docker files
    * Thanks to [clarfon] for the fix
* Broadcasted version has been reverted to the Mastodon version, so that mastodon.py and other
  libraries work until we find a better solution
    * Thanks to [Frinkel] for testing 0.1.0 and finding the bug
    * Thanks to [halcy] for providing insight into how mastodon.py works
    * Thanks to [1011X] for the fix
* Blocking entire instance domains now gives a less judgmental message in the English locale
    * Thanks to [TrechNex] for the fix
    * Thanks to [mal0ki] and [clarfon] for reviewing the wording
* Florence-specific settings have been translated into Dutch
    * Thanks to [rscmbbng] for the translations
* The [lastest typo] in the README was corrected
    * Thanks to [ciderpunx] for the fix
* A few dependencies were updated to fix various security issues
    * Prototype pollution vulnerabilities were fixed for handlebars and lodash
    * Thanks to [1011X] for future-proofing CVE-2015-9284 (OAuth vulnerability)

[lastest typo]: https://github.com/florence-social/mastodon-fork/pull/106/files

[ciderpunx]: https://github.com/ciderpunx
[ElliotBerriot]: https://github.com/ElliotBerriot
[Frinkel]: https://github.com/Frinkel
[halcy]: https://github.com/halcy
[mal0ki]: https://github.com/mal0ki
[rscmbbng]: https://github.com/rscmbbng
[TrechNex]: https://github.com/TrechNex

### Special Thanks

* Thank you to everyone who jumped on the Florence train and set up their own instances! We'll try
  and compile a list of Florence Mastodon instances some time before the next release.
* Thank you to @TrechNex for helping set up [installation instructions] on his website!

[installation instructions]: https://bobbymoss.com/index.html#install-florence-prerelease

## Pre-Release 0.1.0 [2019-06-18 / v0.0.1.0]

This release is based off of [Mastodon 2.9.0] plus the commits up to [65efe892cf].

[Mastodon 2.9.0]: https://github.com/tootsuite/mastodon/blob/v2.9.0/CHANGELOG.md
[65efe892cf]: https://github.com/tootsuite/mastodon/compare/c9eeb2e832b5b36a86028bbec7a353c32be510a7..65efe892cf56cd4f998de885bccc36e9231d8144

### Added

* Toot length can now be configured by an admin; default is 500
    * Thanks to glitch.social and many other forks for the original code
    * Thanks to [usbsnowcrash] for the Florence-specific code
    * Thanks to [m4sk1n] for the Polish translation
    * Thanks to [clarfon] and [Feufochmar] for the French translation
    * Thanks to [1011X] and [skrlet13] for the Spanish translation
* Biography length can now be configured by an admin; default is 500
    * Thanks to glitch.social and many other forks for the original code
    * Thanks to [usbsnowcrash] for the Florence-specific code
    * Thanks to [clarfon] and [Feufochmar] for the French translation
    * Thanks to [1011X] and [skrlet13] for the Spanish translation
* Users can choose whether to receive DMs on the home timeline in their settings
    * Thanks to glitch.social and many other forks for the original code
    * Thanks to [usbsnowcrash] for the Florence-specific code
    * Thanks to [clarfon] and [Feufochmar] for the French translation
    * Thanks to [1011X] and [skrlet13] for the Spanish translation
* Spanish translations were updated to be more formal
    * Thanks to [1011X] for the inital changes
    * Thanks to [skrlet13] for offering feedback and further changes

[1011X]: https://github.com/1011X
[clarfon]: https://github.com/clarfon
[Feufochmar]: https://github.com/Feufochmar
[m4sk1n]: https://github.com/m4sk1n
[skrlet13]: https://github.com/skrlet13
[usbsnowcrash]: https://github.com/usbsnowcrash

### Special Thanks

* Thank you to @1011x, @jhaye, @lightdark, @maloki, @skrlet13, @melody, @stolas, @hak, @mecaka:
  those who've been helping with governance, offering advice, and/or been working on this for the
  past few months.
* Thank you to @woozle for hosting both the Wiki and Mattermost for us on their servers.
* Thank you to all the forkers out there who are providing us both with inspiration, actual code,
  and conversation about how we can make the Fediverse a little bit better.
* Thank you to everyone that has been cheerleading us for the past year, helped us have the courage
  to "Fork Off" from Mastodon, and also understood that we are working towards different
  objectives. That is after all why you all joined us in the first place!
* Thank you to @mecaka who joined the team while @maloki was getting diagnosed, who helped push
  through that time and bring us to where we are now.
* An additional thank you to those that joined the Mattermost server to keep the conversation alive
  with us after we moved on from Discord!


================================================
FILE: CODE_OF_CONDUCT.md
================================================
### Table of Contents

- [Code of Conduct](#code-of-conduct)
  - [Positive participation and communication](#positive-participation-and-communication)
  - [Prohibited Behavior](#prohibited-behavior)
    - [Discrimination](#discrimination)
    - [Harassment and privacy violation](#harassment-and-privacy-violation)
    - [Harmful and/or adult content](#harmful-andor-adult-content)
  - [Where does this CoC apply and who does this CoC apply to?](#where-does-this-coc-apply-and-who-does-this-coc-apply-to)
  - [What if someone violates this Code of Conduct while outside of Florence instances, or in a space or medium to which the Code does not apply?](#what-if-someone-violates-this-code-of-conduct-while-outside-of-florence-instances-or-in-a-space-or-medium-to-which-the-code-does-not-apply)
  - [When Something Happens](#when-something-happens)
    - [Example](#example)
  - [How to make a Code Of Conduct Report](#how-to-make-a-code-of-conduct-report)
    - [Information to include in your report](#information-to-include-in-your-report)
  - [Code of Conduct Reporting Guide](#code-of-conduct-reporting-guide)
  - [What happens after you file a report?](#what-happens-after-you-file-a-report)
    - [Example](#example-1)
  - [What if your report concerns a possible violation by a moderator?](#what-if-your-report-concerns-a-possible-violation-by-a-moderator)
  - [How CoC Reports are handled by moderators](#how-coc-reports-are-handled-by-moderators)
  - [Accountability for board members and moderators](#accountability-for-board-members-and-moderators)
  - [Definition of Terms](#definition-of-terms)
  - [Reference Codes of Conduct](#reference-codes-of-conduct)
  
# Code of Conduct

We strive to reduce barriers to access of our organization, our software and our community, as well as to dismantle any ableist assumptions and practices in our process. We recognize that there is no one solution for universal accessibility, and strive to provide alternatives and choices whenever possible.
The stakeholders of this project pledge to institute and abide by a consistent, transparent and accountable human-centered resolution process with a low bar to entry that allows every stakeholder a voice on decisions to do with structural changes and features of both the project's organization and software protocol.
If you support an idea, we would like you to help implement it. If you reject an idea, we ask you to help find alternatives.

## Positive participation and communication

Florence wants to encourage positive participation and communication, in order to make people feel welcome. Positive communication doesn't mean tone policing or that everyone always has to be positive about everything. It means that we want people to feel safe when bringing up their concerns, and create a space where people can have the difficult conversations. To attain this together, we want to:

* Maintain respectful and effective communication.
* Use welcoming and inclusive language.
* Show kindness and respect towards others.
* Encourage and promote the ideas of others.
* Be respectful of differing viewpoints and experiences.
* Assume good faith.
* Understand the challenges in online discussion.
* Give others the chance to improve.
* Keep criticism constructive.
* Take criticism constructively.
* Respect others’ privacy.
* Avoid sexualized language without consent of all parties involved.
* Don’t resort to personal attacks or condescension.
* No hate speech or similar.
* Promote and teach respectful, effective communication.
* Welcome contributions to the project in all the forms they take.

## Prohibited Behavior

There is also going to be behaviour that will be more strictly prohibited.

### Discrimination

* Do not participate in discrimination or comments promoting or reinforcing the existing systems of oppression of any groups or people based on gender, gender expression, race, ethnicity, nationality, sexuality, religion, disability, mental illness, neurodivergence, personal appearance, physical appearance, body size, age, or class.
* Do not claim “reverse-isms,” e.g. “reverse racism”
* Do not participate in xenophobia or violent nationalism.

### Harassment and privacy violation

* Do not contribute to behaviour intended to stalk, harass, or intimidate other users.
* Do not continue to engage with a user that has specifically asked you to stop, regardless of whether they have blocked or muted you. Do not ask others to engage with them on your behalf.
* Do not participate in aggregating, posting, and/or disseminating a person’s demographic, personal, or private data without their express permission.
* Do not post or circulate disseminate a person’s posts, including screen captures or any other content, without their express permission, unless to protect others from the bad behaviour displayed.
* Do not post or circulate libel, slander, or other known disinformation.

### Harmful and/or adult content

* Do not distribute sexual or violent imagery without a Content Warning.
* Do not distribute any sexualized depictions of minors, in any way. (This includes drawings and 3D renders.)

## Where does this CoC apply and who does this CoC apply to?

This code of conduct applies to all official public discussion forums related to this project, including but not limited to public chat, forums, and comments on code.

This code applies to any member of the community participating in discussions, contributing to the project, or otherwise discussing the project publicly.

It also would apply in the future main Florence instance. Members of the instance must agree to the CoC.

## What if someone violates this Code of Conduct while outside of Florence instances, or in a space or medium to which the Code does not apply?

Use your judgement, but always feel free to let us know -- we’d rather know more than less. If the person who violates the Code of Conduct intersects with the Florence community in any way, we encourage you to make a report, even if the offending behavior itself was outside of our space.

## When Something Happens

If you see behavior that is not aligned with this Code of Conduct, here's how you can handle it.

Consider the situation and if it might be useful to screenshot messages in case the messages in question are deleted.

The person may not be completely aware of the Code of Conduct or specific items within it. **If you consider it safe** and you are comfortable in doing so you can start by letting them know that their actions weren't appropriate and point them to specific parts of the Code of Conduct. One suggestion is to send a private message first, because this can avoid potentially embarrassing someone. Politely and patiently let the person know that their behavior isn’t in line with the Code of Conduct. Share the code of conduct with them and refer to specific parts which you think their behavior is not in line with. You may ask them to adjust their behavior or possibly edit or delete a message.

**If you don’t feel safe or comfortable** telling that person, or they refuse to change their behavior or delete text which is not in line with the CoC, it may be time to report the incident. See how to report an incident in the following section. You may also directly contact admins or moderators, especially if the behavior requires immediate attention

### Example

Mary calls John an ableist slur in a discussion chat because he made a mistake. Ana tells Mary via DM that she shouldn't do that because it reinforces the oppression of disabled or neurodivergent people, but Mary calls Ana the same slur, and says that she shouldn't take this so seriously. Then, Ana proceeds to report Mary to a moderator.

## How to make a Code Of Conduct Report

If you would like to report a Code of Conduct violation contact our moderators via email at report@florencesoc.org. Regardless of outcome, they (or committee) will respond in private to  first acknowledge your report within three days and later with an explanation of the actions taken within a time frame of 14 days.

Please include any relevant details, links, screenshots, context, or other information that may be used to better understand and resolve the situation.

### Information to include in your report

* Contact information for the reporter including name, email and username.
* You may report incidents anonymously if you are uncomfortable providing your contact information. However, this may hamper the investigation.
* The names of all people directly involved in the incident, including relevant nicknames or pseudonyms.
* Include witness names if possible.
* Time and forum/location where the incident occurred. Be specific.
* Details about what happened. Note any supporting materials, such as message screencaps, IRC logs, or emails.
* Additional context for the situation, if appropriate.
* Whether or not the incident is ongoing.
* Any additional information that is relevant to investigating and resolving the incident.

## Code of Conduct Reporting Guide

Most people will feel more comfortable reporting the code of conduct violation rather than directly confronting it, and we encourage those people to email report@florencesoc.org. **All reports will be kept confidential.** In some cases we may determine that a public statement will need to be made in order to inform the broader community. If this need arises, the identities of all parties involved will remain confidential unless those individuals instruct us otherwise.

**If you believe anyone is in physical danger, please notify appropriate law enforcement first.** If you are unsure what law enforcement agency is appropriate, please include this in your report and we will attempt to notify them.

We encourage you to report incidents, even if you are unsure whether the incident is a violation, or whether the space where it happened is covered by this Code of Conduct. We would much rather have a few extra reports where we decide to take no action, than miss a report of an actual violation. We do not look negatively on you if we find the incident is not a violation. Knowing about incidents that are not violations, or happen outside our spaces, can help us to improve the Code of Conduct and the processes surrounding it.

## What happens after you file a report?

You will receive an email from the moderators acknowledging receipt. The current Working Group members are [@1011X@mastodon.social](https://mastodon.social/@1011X), [@jhaye@social.libre.fi](https://social.libre.fi/jhaye), and [@skrlet13@chile.masto.host](https://chile.masto.host/@skrlet13).

The moderators will meet to review the incident and determine:

* What happened based on the perspective of all involved.
* Whether this event constitutes a code of conduct violation.
* Who the bad actor was.
* Whether this is an ongoing situation, or if there is a threat to anyone's physical safety.

We promise to acknowledge receipt within 72 hours (and will aim for a faster response). If this is determined to be an ongoing incident or a threat to physical safety, the working groups' immediate priority will be to protect everyone involved. This means we may delay an "official" response until we believe that the situation has ended and that everyone is physically safe.

Once the moderators have a complete account of the events, they will make a decision as to how to respond. Responses may include:

* Nothing (if we determine no violation occurred).
* A private gentle reminder of the code of conduct.
* A public gentle reminder of the code of conduct.
* A private reprimand from the working group to the individual(s) involved.
* A public reprimand.
* An imposed vacation (i.e. asking someone to "take a week off" from a space).
* A temporary (for a specified time) or indefinite ban from some or all Florence Work Spaces.

We'll respond within one week to the person who filed the report with either a resolution or an explanation of why the situation is not yet resolved.

Once we've determined our final action, we'll contact the original reporter to let them know what action (if any) we'll be taking. We'll take into account feedback from the reporter on the appropriateness of our response, but we don't guarantee we'll act on it.

### Example

Ana reports Mary. She explains the situation and gives the links and screenshots as proof to the moderator. The moderator examines the case and decides to give Mary a warning. Mary is told this and she will no longer be able to participate if she does that again. Ana is notified of the actions taken by the moderator.

## What if your report concerns a possible violation by a moderator?

The entire code of conduct working group will see all incident reports sent to report@florencesoc.org. Anyone directly involved in the incident will be immediately recused and will not participate in any discussions of the incident or its resolution.

* If you are uncomfortable submitting a report that will be seen by a person involved in the incident, you can instead send the report directly to the other moderators for resolution.

## How CoC Reports are handled by moderators

When a Code of Conduct report is made, moderators should take the issue seriously. If it’s not possible to deal with the report immediately, moderators should send a response saying that the report was received and is being looked into.

Moderators will take all reports seriously and prioritize the well-being and comfort of the person making the report recipients of the violation over the comfort of the violator.

As soon as available, a moderator will join, identify themselves, and take further action.

You should offer people the kind of support they ask for. If you aren't sure what you're offering will be helpful, ask if that type of thing would be useful.

## Accountability for board members and moderators

Board members, moderators, and other community members who contributed to running this project will be held to the same code of conduct. Reports against those in positions of power will be taken seriously and handled with respect, prioritizing the safety and well-being of anyone who makes such a report.

## Definition of Terms

We acknowledge that systemic (structural) oppression works on a society-wide level, enacted by laws and policies, institutions, and culture. It is reflected in and reinforced by individuals’ discriminatory beliefs and actions.  As such, we expect people’s commitment to ending oppression to extend to their own behaviour.

* **Ableism**: Discrimination against disabled, ill, and/or neurodivergent people.
* **Disability**: A physical or mental condition that limits a person's abilities to interact with their environment.
* **Gender**: Social construct tied to the perception of social and cultural roles. The most common are male and female.
* **Gender expression**: Includes personal behavior, mannerisms, interests, and appearance associated with gender in a particular cultural context.
* **Harassment**: Behaviour towards a person that causes mental or emotional suffering, which includes repeated unwanted contacts without a reasonable purpose, insults, threats, touching, or offensive language.
* **Hate speech (includes Holocaust denial or Nazi symbolism)**: Speech that oppresses, dehumanizes, and endangers marginalized people or anyone perceived to have a particular marginalization.
* **Homophobia**: Discrimination against gay people and people who are thought to be gay, incl. the use of homophobic terms where they cause harm.
* **Inclusivity**: Attitude that recognises and considers people's differences in order to create a welcoming environment without requiring minority assimilation to the majority.
* **Marginalization**: A social phenomenon by which a minority or sub-group is excluded, and their needs or desires ignored.
* **Mental illness**: Behavioral or mental pattern that causes significant distress or impairment of personal functioning.
* **Microaggressions**: brief and commonplace daily verbal, behavioural, or environmental indignities, whether intentional or unintentional, that communicate hostile, derogatory, or negative prejudicial slights and insults toward any group, particularly culturally marginalized groups.
* **Neurodivergence**: Behavioral or mental pattern that doesn't cause distress but affects the way the person interacts with the environment.
* **Race**: Social construct tied to phenotypical and social characteristics of a group of people.
* **Racism**: Discrimination against people of color, including but not limited to microaggressions, tone policing and slurs.
* **Reverse-isms** (like “reverse racism”): Claims by people privileged  on an axis that they are somehow oppressed by people marginalized  on the same axis.
* **Sexism**: Discrimination against women and non-binary people. Including derogatory language about women or people perceived as women.
* **Sexual orientation**: The pattern of attraction to 0 or more genders.
* **Transphobia**: Discrimination against trans people. This includes arguing someone’s gender, policing their presentation, and malicious misgendering.
* **Tone Policing**: Attempts to dismiss marginalized people's perspectives by claiming their tone, rather than the content, is unappealing.

## Reference Codes of Conduct

* http://open-zfs.org/wiki/Reporting_Guide
* https://wiki.snowdrift.coop/community/conduct
* https://wealljs.org/code-of-conduct
* https://us.pycon.org/2018/about/code-of-conduct/
* https://www.coc-handbook.com/
* https://github.com/ayojs/ayo/blob/latest/CODE_OF_CONDUCT.md
* https://www.freebsd.org/internal/code-of-conduct.html
* http://geekfeminism.wikia.com/wiki/Code_of_conduct_evaluations
* https://www.rust-lang.org/en-US/conduct.html
* https://docs.google.com/document/d/1V2-YNCRW-Ya2tFzapwLMPMbqWAJZNw4qE40cIWqZti8/edit# (NOVA DSA Socialist Meetings: Participation Guide) This ones nice because it's specifically designed for meetings run with a similar format to ours, though theirs take place offline.

<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/80x15.png" /></a><br />This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">Creative Commons Attribution-ShareAlike 4.0 International License</a>.


================================================
FILE: CONTRIBUTING.md
================================================
Contributing
============

Thank you for considering contributing to Florence Mastodon

You can contribute in the following ways:

- Finding and reporting bugs
- Translating the Mastodon interface into various languages
- Contributing code to Mastodon by fixing bugs or implementing features
- Improving the documentation
- Joining the conversation on our [Chat]
- Participate in OutReach or other activities
- Proof-read
- And much more

If you want to contribute with monetary support you can do so via our [Open Collective](https://opencollective.com/florence-social) (which isn't publicly launched yet)

## Adding an Issue for Bug Report or Feature Request

Bug reports and feature suggestions can be submitted to [GitHub Issues](https://github.com/florence-social/mastodon-fork/issues). Do not worry about submitting duplicates, but please make a cursory search to see if any similar reports or request have already been resolved or rejected in the past using the search function. If you find a bug or feature request which matches yours you can join the conversation by adding your commentary to that issue.

Try to describe your issue, the use-case, and additional considerations when submitting a feature request.

## Translations

We will be using Weblate for translations in the near future, but we're waiting for a free account for Open Source Projects via Weblate themselves, in the meanwhile you can submit PRs with translations, or wait. We will update this document as soon as Weblate is available for translations, and will make public announcements elsewhere.

## Documentation

Documentation work will be added soon, and in the meanwhile you can join us in our [Chat] for documentation.

[Chat]: https://chat.florencesoc.org/signup_user_complete/?id=2a7237f68937b2c4a99ca25c156e6915


================================================
FILE: Capfile
================================================
# frozen_string_literal: true
require 'capistrano/setup'
require 'capistrano/deploy'
require 'capistrano/scm/git'

install_plugin Capistrano::SCM::Git

require 'capistrano/rbenv'
require 'capistrano/bundler'
require 'capistrano/yarn'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'

Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }


================================================
FILE: Dockerfile
================================================
FROM ubuntu:18.04 as build-dep

# Use bash for the shell
SHELL ["bash", "-c"]

# Install Node
ENV NODE_VER="8.15.0"
RUN	echo "Etc/UTC" > /etc/localtime && \
	apt update && \
	apt -y install wget make gcc g++ python && \
	cd ~ && \
	wget https://nodejs.org/download/release/v$NODE_VER/node-v$NODE_VER.tar.gz && \
	tar xf node-v$NODE_VER.tar.gz && \
	cd node-v$NODE_VER && \
	./configure --prefix=/opt/node && \
	make -j$(nproc) > /dev/null && \
	make install

# Install jemalloc
ENV JE_VER="5.1.0"
RUN apt update && \
	apt -y install autoconf && \
	cd ~ && \
	wget https://github.com/jemalloc/jemalloc/archive/$JE_VER.tar.gz && \
	tar xf $JE_VER.tar.gz && \
	cd jemalloc-$JE_VER && \
	./autogen.sh && \
	./configure --prefix=/opt/jemalloc && \
	make -j$(nproc) > /dev/null && \
	make install_bin install_include install_lib

# Install ruby
ENV RUBY_VER="2.6.1"
ENV CPPFLAGS="-I/opt/jemalloc/include"
ENV LDFLAGS="-L/opt/jemalloc/lib/"
RUN apt update && \
	apt -y install build-essential \
		bison libyaml-dev libgdbm-dev libreadline-dev \
		libncurses5-dev libffi-dev zlib1g-dev libssl-dev && \
	cd ~ && \
	wget https://cache.ruby-lang.org/pub/ruby/${RUBY_VER%.*}/ruby-$RUBY_VER.tar.gz && \
	tar xf ruby-$RUBY_VER.tar.gz && \
	cd ruby-$RUBY_VER && \
	./configure --prefix=/opt/ruby \
	  --with-jemalloc \
	  --with-shared \
	  --disable-install-doc && \
	ln -s /opt/jemalloc/lib/* /usr/lib/ && \
	make -j$(nproc) > /dev/null && \
	make install

ENV PATH="${PATH}:/opt/ruby/bin:/opt/node/bin"

RUN npm install -g yarn && \
	gem install bundler && \
	apt update && \
	apt -y install git libicu-dev libidn11-dev \
	libpq-dev libprotobuf-dev protobuf-compiler

COPY Gemfile* package.json yarn.lock /opt/mastodon/

RUN cd /opt/mastodon && \
	bundle install -j$(nproc) --deployment --without development test && \
	yarn install --pure-lockfile

FROM ubuntu:18.04

# Copy over all the langs needed for runtime
COPY --from=build-dep /opt/node /opt/node
COPY --from=build-dep /opt/ruby /opt/ruby
COPY --from=build-dep /opt/jemalloc /opt/jemalloc

# Add more PATHs to the PATH
ENV PATH="${PATH}:/opt/ruby/bin:/opt/node/bin:/opt/mastodon/bin"

# Create the mastodon user
ARG UID=991
ARG GID=991
RUN apt update && \
	echo "Etc/UTC" > /etc/localtime && \
	ln -s /opt/jemalloc/lib/* /usr/lib/ && \
	apt install -y whois wget && \
	addgroup --gid $GID mastodon && \
	useradd -m -u $UID -g $GID -d /opt/mastodon mastodon && \
	echo "mastodon:`head /dev/urandom | tr -dc A-Za-z0-9 | head -c 24 | mkpasswd -s -m sha-256`" | chpasswd

# Install mastodon runtime deps
RUN apt -y --no-install-recommends install \
	  libssl1.1 libpq5 imagemagick ffmpeg \
	  libicu60 libprotobuf10 libidn11 libyaml-0-2 \
	  file ca-certificates tzdata libreadline7 && \
	apt -y install gcc && \
	ln -s /opt/mastodon /mastodon && \
	gem install bundler && \
	rm -rf /var/cache && \
	rm -rf /var/lib/apt/lists/*

# Add tini
ENV TINI_VERSION="0.18.0"
ENV TINI_SUM="12d20136605531b09a2c2dac02ccee85e1b874eb322ef6baf7561cd93f93c855"
ADD https://github.com/krallin/tini/releases/download/v${TINI_VERSION}/tini /tini
RUN echo "$TINI_SUM tini" | sha256sum -c -
RUN chmod +x /tini

# Copy over mastodon source, and dependencies from building, and set permissions
COPY --chown=mastodon:mastodon . /opt/mastodon
COPY --from=build-dep --chown=mastodon:mastodon /opt/mastodon /opt/mastodon

# Run mastodon services in prod mode
ENV RAILS_ENV="production"
ENV NODE_ENV="production"

# Tell rails to serve static files
ENV RAILS_SERVE_STATIC_FILES="true"

# Set the run user
USER mastodon

# Precompile assets
RUN cd ~ && \
	OTP_SECRET=precompile_placeholder SECRET_KEY_BASE=precompile_placeholder rails assets:precompile && \
	yarn cache clean

# Set the work dir and the container entry point
WORKDIR /opt/mastodon
ENTRYPOINT ["/tini", "--"]


================================================
FILE: Gemfile
================================================
# frozen_string_literal: true

source 'https://rubygems.org'
ruby '>= 2.4.0', '< 2.7.0'

gem 'pkg-config', '~> 1.3'

gem 'puma', '~> 3.12'
gem 'rails', '~> 5.2.3'
gem 'thor', '~> 0.20'

gem 'hamlit-rails', '~> 0.2'
gem 'pg', '~> 1.1'
gem 'makara', '~> 0.4'
gem 'pghero', '~> 2.2'
gem 'dotenv-rails', '~> 2.7'

gem 'aws-sdk-s3', '~> 1.41', require: false
gem 'fog-core', '<= 2.1.0'
gem 'fog-openstack', '~> 0.3', require: false
gem 'paperclip', '~> 6.0'
gem 'paperclip-av-transcoder', '~> 0.6'
gem 'streamio-ffmpeg', '~> 3.0'
gem 'blurhash', '~> 0.1'

gem 'active_model_serializers', '~> 0.10'
gem 'addressable', '~> 2.6'
gem 'bootsnap', '~> 1.4', require: false
gem 'browser'
gem 'charlock_holmes', '~> 0.7.6'
gem 'iso-639'
gem 'chewy', '~> 5.0'
gem 'cld3', '~> 3.2.4'
gem 'devise', '~> 4.7'
gem 'devise-two-factor', '~> 3.0'

group :pam_authentication, optional: true do
  gem 'devise_pam_authenticatable2', '~> 9.2'
end

gem 'net-ldap', '~> 0.10'
gem 'omniauth-cas', '~> 1.1'
gem 'omniauth-rails_csrf_protection', '~> 0.1'
gem 'omniauth-saml', '~> 1.10'
gem 'omniauth', '~> 1.9'

gem 'doorkeeper', '~> 5.1'
gem 'fast_blank', '~> 1.0'
gem 'fastimage'
gem 'goldfinger', '~> 2.1'
gem 'hiredis', '~> 0.6'
gem 'redis-namespace', '~> 1.5'
gem 'htmlentities', '~> 4.3'
gem 'http', '~> 3.3'
gem 'http_accept_language', '~> 2.1'
gem 'http_parser.rb', '~> 0.6', git: 'https://github.com/tmm1/http_parser.rb', ref: '54b17ba8c7d8d20a16dfc65d1775241833219cf2'
gem 'httplog', '~> 1.3'
gem 'idn-ruby', require: 'idn'
gem 'kaminari', '~> 1.1'
gem 'link_header', '~> 0.0'
gem 'mime-types', '~> 3.2', require: 'mime/types/columnar'
gem 'nokogiri', '~> 1.10'
gem 'nsa', '~> 0.2'
gem 'oj', '~> 3.7'
gem 'ostatus2', '~> 2.0'
gem 'ox', '~> 2.10'
gem 'posix-spawn', git: 'https://github.com/rtomayko/posix-spawn', ref: '58465d2e213991f8afb13b984854a49fcdcc980c'
gem 'pundit', '~> 2.0'
gem 'premailer-rails'
gem 'rack-attack', '~> 6.0'
gem 'rack-cors', '~> 1.0', require: 'rack/cors'
gem 'rails-i18n', '~> 5.1'
gem 'rails-settings-cached', '~> 0.6'
gem 'redis', '~> 4.1', require: ['redis', 'redis/connection/hiredis']
gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock'
gem 'rqrcode', '~> 0.10'
gem 'sanitize', '~> 5.0'
gem 'sidekiq', '~> 5.2'
gem 'sidekiq-scheduler', '~> 3.0'
gem 'sidekiq-unique-jobs', '~> 6.0'
gem 'sidekiq-bulk', '~>0.2.0'
gem 'simple-navigation', '~> 4.0'
gem 'simple_form', '~> 4.1'
gem 'sprockets-rails', '~> 3.2', require: 'sprockets/railtie'
gem 'stoplight', '~> 2.1.3'
gem 'strong_migrations', '~> 0.4'
gem 'tty-command', '~> 0.8', require: false
gem 'tty-prompt', '~> 0.19', require: false
gem 'twitter-text', '~> 1.14'
gem 'tzinfo-data', '~> 1.2019'
gem 'webpacker', '~> 4.0'
gem 'webpush'

gem 'json-ld', '~> 3.0'
gem 'json-ld-preloaded', '~> 3.0'
gem 'rdf-normalize', '~> 0.3'

group :development, :test do
  gem 'fabrication', '~> 2.20'
  gem 'fuubar', '~> 2.4'
  gem 'i18n-tasks', '~> 0.9', require: false
  gem 'pry-byebug', '~> 3.7'
  gem 'pry-rails', '~> 0.3'
  gem 'rspec-rails', '~> 3.8'
end

group :production, :test do
  gem 'private_address_check', '~> 0.5'
end

group :test do
  gem 'capybara', '~> 3.22'
  gem 'climate_control', '~> 0.2'
  gem 'faker', '~> 1.9'
  gem 'microformats', '~> 4.1'
  gem 'rails-controller-testing', '~> 1.0'
  gem 'rspec-sidekiq', '~> 3.0'
  gem 'simplecov', '~> 0.16', require: false
  gem 'webmock', '~> 3.5'
  gem 'parallel_tests', '~> 2.29'
end

group :development do
  gem 'active_record_query_trace', '~> 1.6'
  gem 'annotate', '~> 2.7'
  gem 'better_errors', '~> 2.5'
  gem 'binding_of_caller', '~> 0.7'
  gem 'bullet', '~> 6.0'
  gem 'letter_opener', '~> 1.7'
  gem 'letter_opener_web', '~> 1.3'
  gem 'memory_profiler'
  gem 'rubocop', '~> 0.71', require: false
  gem 'rubocop-rails', '~> 2.0', require: false
  gem 'brakeman', '~> 4.5', require: false
  gem 'bundler-audit', '~> 0.6', require: false

  gem 'capistrano', '~> 3.11'
  gem 'capistrano-rails', '~> 1.4'
  gem 'capistrano-rbenv', '~> 2.1'
  gem 'capistrano-yarn', '~> 2.0'

  gem 'derailed_benchmarks'
  gem 'stackprof'
end

group :production do
  gem 'lograge', '~> 0.11'
  gem 'redis-rails', '~> 5.0'
end

gem 'concurrent-ruby', require: false


================================================
FILE: LICENSE
================================================
                    GNU AFFERO GENERAL PUBLIC LICENSE
                       Version 3, 19 November 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.

  A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate.  Many developers of free software are heartened and
encouraged by the resulting cooperation.  However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.

  The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community.  It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server.  Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.

  An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals.  This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU Affero General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Remote Network Interaction; Use with the GNU General Public License.

  Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software.  This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU Affero General Public License from time to time.  Such new versions
will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

  If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source.  For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code.  There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.

  You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
<http://www.gnu.org/licenses/>.


================================================
FILE: Procfile
================================================
web: bundle exec puma -C config/puma.rb
worker: bundle exec sidekiq


================================================
FILE: Procfile.dev
================================================
web: env PORT=3000 bundle exec puma -C config/puma.rb
sidekiq: env PORT=3000 bundle exec sidekiq
stream: env PORT=4000 yarn run start
webpack: ./bin/webpack-dev-server --listen-host 0.0.0.0


================================================
FILE: README.md
================================================
Florence Mastodon
=================

Mastodon is a **free, open-source social network server** based on ActivityPub. This is *not* the
official version of Mastodon; this is a separate version (i.e. a fork) maintained by Florence. For
more information on Mastodon, you can see the [official website] and the [upstream repo].

[official website]: https://joinmastodon.org
[upstream repo]: https://github.com/tootsuite/mastodon

This version of Mastodon will include much-wanted changes by the community that are not included
in the upstream version of Mastodon. Migrating from the latest stable release of Mastodon to
Florence's Mastodon will always be possible, to ensure that everyone can benefit from these
changes.

## Versioning

Florence Mastodon uses a four-numbered versioning system, loosely based upon [semantic
versioning]. The four numbers are:
* **Compatibility**: Increased when federation, app compatibility, etc. are changed in a
  non-compatibile way.
* **Feel**: Increased when user experience is changed strongly enough to feel different, i.e. more
  than just small new features.
* **Features**: Increased when new features are added. Reset to zero when **feel** version is
  bumped.
* **Hotfixes**: Increased when fixes are substantial enough to release a new version without any new
  features. Reset to zero when **feature** version is bumped.

For now, because this versioning system hasn't been strongly adopted, releases will be annotated as
**Pre-Release x.y.z**, which is equivalent to version 0.x.y.z.

[semantic versioning]: https://semver.org

## Release timeline

Pre-release 0.1.0 is mostly equivalent to Mastodon 2.9.0, with some extra changes added in.
Right now, the goal before pre-release 1.0.0 is to incorporate existing, already-developed changes
into the fork so that people have a central version to upgrade to. Once we've finally gotten the
software to the point where we like it, we will release the first official release, which will be
named something special. Stay tuned!

## License

Copyright (C) 2016-2019 Florence, Eugen Rochko, and many other Mastodon contributors; see [AUTHORS.md](AUTHORS.md).

This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.


================================================
FILE: Rakefile
================================================
# Add your own tasks in files placed in lib/tasks ending in .rake,
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.

require File.expand_path('../config/application', __FILE__)

Rails.application.load_tasks


================================================
FILE: Vagrantfile
================================================
# -*- mode: ruby -*-
# vi: set ft=ruby :

ENV["PORT"] ||= "3000"

$provision = <<SCRIPT

cd /vagrant # This is where the host folder/repo is mounted

# Add the yarn repo + yarn repo keys
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
sudo apt-add-repository 'deb https://dl.yarnpkg.com/debian/ stable main'

# Add repo for NodeJS
curl -sL https://deb.nodesource.com/setup_8.x | sudo bash -

# Add firewall rule to redirect 80 to PORT and save
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port #{ENV["PORT"]}
echo iptables-persistent iptables-persistent/autosave_v4 boolean true | sudo debconf-set-selections
echo iptables-persistent iptables-persistent/autosave_v6 boolean true | sudo debconf-set-selections
sudo apt-get install iptables-persistent -y

# Add packages to build and run Mastodon
sudo apt-get install \
  git-core \
  g++ \
  libpq-dev \
  libxml2-dev \
  libxslt1-dev \
  imagemagick \
  nodejs \
  redis-server \
  redis-tools \
  postgresql \
  postgresql-contrib \
  protobuf-compiler \
  yarn \
  libicu-dev \
  libidn11-dev \
  libprotobuf-dev \
  libreadline-dev \
  libpam0g-dev \
  -y

# Install rvm
read RUBY_VERSION < .ruby-version

gpg_command="gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB"
$($gpg_command)
if [ $? -ne 0 ];then
  echo "GPG command failed, This prevented RVM from installing."
  echo "Retrying once..." && $($gpg_command)
  if [ $? -ne 0 ];then
    echo "GPG failed for the second time, please ensure network connectivity."
    echo "Exiting..." && exit 1
  fi
fi

curl -sSL https://raw.githubusercontent.com/rvm/rvm/stable/binscripts/rvm-installer | bash -s stable --ruby=$RUBY_VERSION
source /home/vagrant/.rvm/scripts/rvm

# Install Ruby
rvm reinstall ruby-$RUBY_VERSION --disable-binary

# Configure database
sudo -u postgres createuser -U postgres vagrant -s
sudo -u postgres createdb -U postgres mastodon_development

# Install gems and node modules
gem install bundler foreman
bundle install
yarn install

# Build Mastodon
export $(cat ".env.vagrant" | xargs)
bundle exec rails db:setup

# Configure automatic loading of environment variable
echo 'export $(cat "/vagrant/.env.vagrant" | xargs)' >> ~/.bash_profile

SCRIPT

$start = <<SCRIPT

echo 'To start server'
echo '  $ vagrant ssh -c "cd /vagrant && foreman start"'

SCRIPT

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.box = "ubuntu/xenial64"

  config.vm.provider :virtualbox do |vb|
    vb.name = "mastodon"
    vb.customize ["modifyvm", :id, "--memory", "2048"]
    # Increase the number of CPUs. Uncomment and adjust to
    # increase performance
    # vb.customize ["modifyvm", :id, "--cpus", "3"]

    # Disable VirtualBox DNS proxy to skip long-delay IPv6 resolutions.
    # https://github.com/mitchellh/vagrant/issues/1172
    vb.customize ["modifyvm", :id, "--natdnsproxy1", "off"]
    vb.customize ["modifyvm", :id, "--natdnshostresolver1", "off"]

    # Use "virtio" network interfaces for better performance.
    vb.customize ["modifyvm", :id, "--nictype1", "virtio"]
    vb.customize ["modifyvm", :id, "--nictype2", "virtio"]

  end

  # This uses the vagrant-hostsupdater plugin, and lets you
  # access the development site at http://mastodon.local.
  # If you change it, also change it in .env.vagrant before provisioning
  # the vagrant server to update the development build.
  #
  # To install:
  #   $ vagrant plugin install vagrant-hostsupdater
  config.vm.hostname = "mastodon.local"

  if defined?(VagrantPlugins::HostsUpdater)
    config.vm.network :private_network, ip: "192.168.42.42", nictype: "virtio"
    config.hostsupdater.remove_on_suspend = false
  end

  if config.vm.networks.any? { |type, options| type == :private_network }
    config.vm.synced_folder ".", "/vagrant", type: "nfs", mount_options: ['rw', 'vers=3', 'tcp', 'actimeo=1']
  else
    config.vm.synced_folder ".", "/vagrant"
  end

  # Otherwise, you can access the site at http://localhost:3000 and http://localhost:4000 , http://localhost:8080
  config.vm.network :forwarded_port, guest: 3000, host: 3000
  config.vm.network :forwarded_port, guest: 4000, host: 4000
  config.vm.network :forwarded_port, guest: 8080, host: 8080

  # Full provisioning script, only runs on first 'vagrant up' or with 'vagrant provision'
  config.vm.provision :shell, inline: $provision, privileged: false

  # Start up script, runs on every 'vagrant up'
  config.vm.provision :shell, inline: $start, run: 'always', privileged: false

end


================================================
FILE: app/chewy/statuses_index.rb
================================================
# frozen_string_literal: true

class StatusesIndex < Chewy::Index
  settings index: { refresh_interval: '15m' }, analysis: {
    filter: {
      english_stop: {
        type: 'stop',
        stopwords: '_english_',
      },
      english_stemmer: {
        type: 'stemmer',
        language: 'english',
      },
      english_possessive_stemmer: {
        type: 'stemmer',
        language: 'possessive_english',
      },
    },
    analyzer: {
      content: {
        tokenizer: 'uax_url_email',
        filter: %w(
          english_possessive_stemmer
          lowercase
          asciifolding
          cjk_width
          english_stop
          english_stemmer
        ),
      },
    },
  }

  define_type ::Status.unscoped.without_reblogs.includes(:media_attachments) do
    crutch :mentions do |collection|
      data = ::Mention.where(status_id: collection.map(&:id)).pluck(:status_id, :account_id)
      data.each.with_object({}) { |(id, name), result| (result[id] ||= []).push(name) }
    end

    crutch :favourites do |collection|
      data = ::Favourite.where(status_id: collection.map(&:id)).pluck(:status_id, :account_id)
      data.each.with_object({}) { |(id, name), result| (result[id] ||= []).push(name) }
    end

    crutch :reblogs do |collection|
      data = ::Status.where(reblog_of_id: collection.map(&:id)).pluck(:reblog_of_id, :account_id)
      data.each.with_object({}) { |(id, name), result| (result[id] ||= []).push(name) }
    end

    root date_detection: false do
      field :id, type: 'long'
      field :account_id, type: 'long'

      field :text, type: 'text', value: ->(status) { [status.spoiler_text, Formatter.instance.plaintext(status)].concat(status.media_attachments.map(&:description)).join("\n\n") } do
        field :stemmed, type: 'text', analyzer: 'content'
      end

      field :searchable_by, type: 'long', value: ->(status, crutches) { status.searchable_by(crutches) }
    end
  end
end


================================================
FILE: app/controllers/about_controller.rb
================================================
# frozen_string_literal: true

class AboutController < ApplicationController
  layout 'public'

  before_action :set_instance_presenter, only: [:show, :more, :terms]

  def show
    @hide_navbar = true
  end

  def more; end

  def terms; end

  private

  def new_user
    User.new.tap do |user|
      user.build_account
      user.build_invite_request
    end
  end

  helper_method :new_user

  def set_instance_presenter
    @instance_presenter = InstancePresenter.new
  end
end


================================================
FILE: app/controllers/account_follow_controller.rb
================================================
# frozen_string_literal: true

class AccountFollowController < ApplicationController
  include AccountControllerConcern

  before_action :authenticate_user!

  def create
    FollowService.new.call(current_user.account, @account.acct)
    redirect_to account_path(@account)
  end
end


================================================
FILE: app/controllers/account_unfollow_controller.rb
================================================
# frozen_string_literal: true

class AccountUnfollowController < ApplicationController
  include AccountControllerConcern

  before_action :authenticate_user!

  def create
    UnfollowService.new.call(current_user.account, @account)
    redirect_to account_path(@account)
  end
end


================================================
FILE: app/controllers/accounts_controller.rb
================================================
# frozen_string_literal: true

class AccountsController < ApplicationController
  PAGE_SIZE = 20

  include AccountControllerConcern

  before_action :set_cache_headers

  def show
    respond_to do |format|
      format.html do
        mark_cacheable! unless user_signed_in?

        @body_classes      = 'with-modals'
        @pinned_statuses   = []
        @endorsed_accounts = @account.endorsed_accounts.to_a.sample(4)

        if current_account && @account.blocking?(current_account)
          @statuses = []
          return
        end

        @pinned_statuses = cache_collection(@account.pinned_statuses, Status) if show_pinned_statuses?
        @statuses        = filtered_status_page(params)
        @statuses        = cache_collection(@statuses, Status)

        unless @statuses.empty?
          @older_url = older_url if @statuses.last.id > filtered_statuses.last.id
          @newer_url = newer_url if @statuses.first.id < filtered_statuses.first.id
        end
      end

      format.atom do
        mark_cacheable!

        @entries = @account.stream_entries.where(hidden: false).with_includes.paginate_by_max_id(PAGE_SIZE, params[:max_id], params[:since_id])
        render xml: OStatus::AtomSerializer.render(OStatus::AtomSerializer.new.feed(@account, @entries.reject { |entry| entry.status.nil? }))
      end

      format.rss do
        mark_cacheable!

        @statuses = cache_collection(default_statuses.without_reblogs.without_replies.limit(PAGE_SIZE), Status)
        render xml: RSS::AccountSerializer.render(@account, @statuses)
      end

      format.json do
        render_cached_json(['activitypub', 'actor', @account], content_type: 'application/activity+json') do
          ActiveModelSerializers::SerializableResource.new(@account, serializer: ActivityPub::ActorSerializer, adapter: ActivityPub::Adapter)
        end
      end
    end
  end

  private

  def show_pinned_statuses?
    [replies_requested?, media_requested?, tag_requested?, params[:max_id].present?, params[:min_id].present?].none?
  end

  def filtered_statuses
    default_statuses.tap do |statuses|
      statuses.merge!(hashtag_scope)    if tag_requested?
      statuses.merge!(only_media_scope) if media_requested?
      statuses.merge!(no_replies_scope) unless replies_requested?
    end
  end

  def default_statuses
    @account.statuses.where(visibility: [:public, :unlisted])
  end

  def only_media_scope
    Status.where(id: account_media_status_ids)
  end

  def account_media_status_ids
    @account.media_attachments.attached.reorder(nil).select(:status_id).distinct
  end

  def no_replies_scope
    Status.without_replies
  end

  def hashtag_scope
    tag = Tag.find_normalized(params[:tag])

    if tag
      Status.tagged_with(tag.id)
    else
      Status.none
    end
  end

  def username_param
    params[:username]
  end

  def older_url
    pagination_url(max_id: @statuses.last.id)
  end

  def newer_url
    pagination_url(min_id: @statuses.first.id)
  end

  def pagination_url(max_id: nil, min_id: nil)
    if tag_requested?
      short_account_tag_url(@account, params[:tag], max_id: max_id, min_id: min_id)
    elsif media_requested?
      short_account_media_url(@account, max_id: max_id, min_id: min_id)
    elsif replies_requested?
      short_account_with_replies_url(@account, max_id: max_id, min_id: min_id)
    else
      short_account_url(@account, max_id: max_id, min_id: min_id)
    end
  end

  def media_requested?
    request.path.ends_with?('/media')
  end

  def replies_requested?
    request.path.ends_with?('/with_replies')
  end

  def tag_requested?
    request.path.ends_with?(Addressable::URI.parse("/tagged/#{params[:tag]}").normalize)
  end

  def filtered_status_page(params)
    if params[:min_id].present?
      filtered_statuses.paginate_by_min_id(PAGE_SIZE, params[:min_id]).reverse
    else
      filtered_statuses.paginate_by_max_id(PAGE_SIZE, params[:max_id], params[:since_id]).to_a
    end
  end
end


================================================
FILE: app/controllers/activitypub/collections_controller.rb
================================================
# frozen_string_literal: true

class ActivityPub::CollectionsController < Api::BaseController
  include SignatureVerification

  before_action :set_account
  before_action :set_size
  before_action :set_statuses
  before_action :set_cache_headers

  def show
    render_cached_json(['activitypub', 'collection', @account, params[:id]], content_type: 'application/activity+json') do
      ActiveModelSerializers::SerializableResource.new(
        collection_presenter,
        serializer: ActivityPub::CollectionSerializer,
        adapter: ActivityPub::Adapter,
        skip_activities: true
      )
    end
  end

  private

  def set_account
    @account = Account.find_local!(params[:account_username])
  end

  def set_statuses
    @statuses = scope_for_collection
    @statuses = cache_collection(@statuses, Status)
  end

  def set_size
    case params[:id]
    when 'featured'
      @account.pinned_statuses.count
    else
      raise ActiveRecord::RecordNotFound
    end
  end

  def scope_for_collection
    case params[:id]
    when 'featured'
      @account.statuses.permitted_for(@account, signed_request_account).tap do |scope|
        scope.merge!(@account.pinned_statuses)
      end
    else
      raise ActiveRecord::RecordNotFound
    end
  end

  def collection_presenter
    ActivityPub::CollectionPresenter.new(
      id: account_collection_url(@account, params[:id]),
      type: :ordered,
      size: @size,
      items: @statuses
    )
  end
end


================================================
FILE: app/controllers/activitypub/inboxes_controller.rb
================================================
# frozen_string_literal: true

class ActivityPub::InboxesController < Api::BaseController
  include SignatureVerification
  include JsonLdHelper

  before_action :set_account

  def create
    if unknown_deleted_account?
      head 202
    elsif signed_request_account
      upgrade_account
      process_payload
      head 202
    else
      render plain: signature_verification_failure_reason, status: 401
    end
  end

  private

  def unknown_deleted_account?
    json = Oj.load(body, mode: :strict)
    json['type'] == 'Delete' && json['actor'].present? && json['actor'] == value_or_id(json['object']) && !Account.where(uri: json['actor']).exists?
  rescue Oj::ParseError
    false
  end

  def set_account
    @account = Account.find_local!(params[:account_username]) if params[:account_username]
  end

  def body
    return @body if defined?(@body)
    @body = request.body.read.force_encoding('UTF-8')
    request.body.rewind if request.body.respond_to?(:rewind)
    @body
  end

  def upgrade_account
    if signed_request_account.ostatus?
      signed_request_account.update(last_webfingered_at: nil)
      ResolveAccountWorker.perform_async(signed_request_account.acct)
    end

    Pubsubhubbub::UnsubscribeWorker.perform_async(signed_request_account.id) if signed_request_account.subscribed?
    DeliveryFailureTracker.track_inverse_success!(signed_request_account)
  end

  def process_payload
    ActivityPub::ProcessingWorker.perform_async(signed_request_account.id, body, @account&.id)
  end
end


================================================
FILE: app/controllers/activitypub/outboxes_controller.rb
================================================
# frozen_string_literal: true

class ActivityPub::OutboxesController < Api::BaseController
  LIMIT = 20

  include SignatureVerification

  before_action :set_account
  before_action :set_statuses
  before_action :set_cache_headers

  def show
    expires_in 1.minute, public: true unless page_requested?

    render json: outbox_presenter, serializer: ActivityPub::OutboxSerializer, adapter: ActivityPub::Adapter, content_type: 'application/activity+json'
  end

  private

  def set_account
    @account = Account.find_local!(params[:account_username])
  end

  def outbox_presenter
    if page_requested?
      ActivityPub::CollectionPresenter.new(
        id: account_outbox_url(@account, page_params),
        type: :ordered,
        part_of: account_outbox_url(@account),
        prev: prev_page,
        next: next_page,
        items: @statuses
      )
    else
      ActivityPub::CollectionPresenter.new(
        id: account_outbox_url(@account),
        type: :ordered,
        size: @account.statuses_count,
        first: account_outbox_url(@account, page: true),
        last: account_outbox_url(@account, page: true, min_id: 0)
      )
    end
  end

  def next_page
    account_outbox_url(@account, page: true, max_id: @statuses.last.id) if @statuses.size == LIMIT
  end

  def prev_page
    account_outbox_url(@account, page: true, min_id: @statuses.first.id) unless @statuses.empty?
  end

  def set_statuses
    return unless page_requested?

    @statuses = @account.statuses.permitted_for(@account, signed_request_account)
    @statuses = params[:min_id].present? ? @statuses.paginate_by_min_id(LIMIT, params[:min_id]).reverse : @statuses.paginate_by_max_id(LIMIT, params[:max_id])
    @statuses = cache_collection(@statuses, Status)
  end

  def page_requested?
    params[:page] == 'true'
  end

  def page_params
    { page: true, max_id: params[:max_id], min_id: params[:min_id] }.compact
  end
end


================================================
FILE: app/controllers/admin/account_actions_controller.rb
================================================
# frozen_string_literal: true

module Admin
  class AccountActionsController < BaseController
    before_action :set_account

    def new
      @account_action  = Admin::AccountAction.new(type: params[:type], report_id: params[:report_id], send_email_notification: true)
      @warning_presets = AccountWarningPreset.all
    end

    def create
      account_action                 = Admin::AccountAction.new(resource_params)
      account_action.target_account  = @account
      account_action.current_account = current_account

      account_action.save!

      if account_action.with_report?
        redirect_to admin_reports_path
      else
        redirect_to admin_account_path(@account.id)
      end
    end

    private

    def set_account
      @account = Account.find(params[:account_id])
    end

    def resource_params
      params.require(:admin_account_action).permit(:type, :report_id, :warning_preset_id, :text, :send_email_notification)
    end
  end
end


================================================
FILE: app/controllers/admin/account_moderation_notes_controller.rb
================================================
# frozen_string_literal: true

module Admin
  class AccountModerationNotesController < BaseController
    before_action :set_account_moderation_note, only: [:destroy]

    def create
      authorize AccountModerationNote, :create?

      @account_moderation_note = current_account.account_moderation_notes.new(resource_params)

      if @account_moderation_note.save
        redirect_to admin_account_path(@account_moderation_note.target_account_id), notice: I18n.t('admin.account_moderation_notes.created_msg')
      else
        @account          = @account_moderation_note.target_account
        @moderation_notes = @account.targeted_moderation_notes.latest
        @warnings         = @account.targeted_account_warnings.latest.custom

        render template: 'admin/accounts/show'
      end
    end

    def destroy
      authorize @account_moderation_note, :destroy?
      @account_moderation_note.destroy!
      redirect_to admin_account_path(@account_moderation_note.target_account_id), notice: I18n.t('admin.account_moderation_notes.destroyed_msg')
    end

    private

    def resource_params
      params.require(:account_moderation_note).permit(
        :content,
        :target_account_id
      )
    end

    def set_account_moderation_note
      @account_moderation_note = AccountModerationNote.find(params[:id])
    end
  end
end


================================================
FILE: app/controllers/admin/accounts_controller.rb
================================================
# frozen_string_literal: true

module Admin
  class AccountsController < BaseController
    before_action :set_account, only: [:show, :subscribe, :unsubscribe, :redownload, :remove_avatar, :remove_header, :enable, :unsilence, :unsuspend, :memorialize, :approve, :reject]
    before_action :require_remote_account!, only: [:subscribe, :unsubscribe, :redownload]
    before_action :require_local_account!, only: [:enable, :memorialize, :approve, :reject]

    def index
      authorize :account, :index?
      @accounts = filtered_accounts.page(params[:page])
    end

    def show
      authorize @account, :show?

      @account_moderation_note = current_account.account_moderation_notes.new(target_account: @account)
      @moderation_notes        = @account.targeted_moderation_notes.latest
      @warnings                = @account.targeted_account_warnings.latest.custom
    end

    def subscribe
      authorize @account, :subscribe?
      Pubsubhubbub::SubscribeWorker.perform_async(@account.id)
      redirect_to admin_account_path(@account.id)
    end

    def unsubscribe
      authorize @account, :unsubscribe?
      Pubsubhubbub::UnsubscribeWorker.perform_async(@account.id)
      redirect_to admin_account_path(@account.id)
    end

    def memorialize
      authorize @account, :memorialize?
      @account.memorialize!
      log_action :memorialize, @account
      redirect_to admin_account_path(@account.id)
    end

    def enable
      authorize @account.user, :enable?
      @account.user.enable!
      log_action :enable, @account.user
      redirect_to admin_account_path(@account.id)
    end

    def approve
      authorize @account.user, :approve?
      @account.user.approve!
      redirect_to admin_pending_accounts_path
    end

    def reject
      authorize @account.user, :reject?
      SuspendAccountService.new.call(@account, including_user: true, destroy: true, skip_distribution: true)
      redirect_to admin_pending_accounts_path
    end

    def unsilence
      authorize @account, :unsilence?
      @account.unsilence!
      log_action :unsilence, @account
      redirect_to admin_account_path(@account.id)
    end

    def unsuspend
      authorize @account, :unsuspend?
      @account.unsuspend!
      log_action :unsuspend, @account
      redirect_to admin_account_path(@account.id)
    end

    def redownload
      authorize @account, :redownload?

      @account.update!(last_webfingered_at: nil)
      ResolveAccountService.new.call(@account)

      redirect_to admin_account_path(@account.id)
    end

    def remove_avatar
      authorize @account, :remove_avatar?

      @account.avatar = nil
      @account.save!

      log_action :remove_avatar, @account.user

      redirect_to admin_account_path(@account.id)
    end

    def remove_header
      authorize @account, :remove_header?

      @account.header = nil
      @account.save!

      log_action :remove_header, @account.user

      redirect_to admin_account_path(@account.id)
    end

    private

    def set_account
      @account = Account.find(params[:id])
    end

    def require_remote_account!
      redirect_to admin_account_path(@account.id) if @account.local?
    end

    def require_local_account!
      redirect_to admin_account_path(@account.id) unless @account.local? && @account.user.present?
    end

    def filtered_accounts
      AccountFilter.new(filter_params).results
    end

    def filter_params
      params.permit(
        :local,
        :remote,
        :by_domain,
        :active,
        :pending,
        :silenced,
        :suspended,
        :username,
        :display_name,
        :email,
        :ip,
        :staff
      )
    end
  end
end


================================================
FILE: app/controllers/admin/action_logs_controller.rb
================================================
# frozen_string_literal: true

module Admin
  class ActionLogsController < BaseController
    def index
      @action_logs = Admin::ActionLog.page(params[:page])
    end
  end
end


================================================
FILE: app/controllers/admin/base_controller.rb
================================================
# frozen_string_literal: true

module Admin
  class BaseController < ApplicationController
    include Authorization
    include AccountableConcern

    layout 'admin'

    before_action :require_staff!
    before_action :set_body_classes

    private

    def set_body_classes
      @body_classes = 'admin'
    end

    def set_user
      @user = Account.find(params[:account_id]).user || raise(ActiveRecord::RecordNotFound)
    end
  end
end


================================================
FILE: app/controllers/admin/change_emails_controller.rb
================================================
# frozen_string_literal: true

module Admin
  class ChangeEmailsController < BaseController
    before_action :set_account
    before_action :require_local_account!

    def show
      authorize @user, :change_email?
    end

    def update
      authorize @user, :change_email?

      new_email = resource_params.fetch(:unconfirmed_email)

      if new_email != @user.email
        @user.update!(
          unconfirmed_email: new_email,
          # Regenerate the confirmation token:
          confirmation_token: nil
        )

        log_action :change_email, @user

        @user.send_confirmation_instructions
      end

      redirect_to admin_account_path(@account.id), notice: I18n.t('admin.accounts.change_email.changed_msg')
    end

    private

    def set_account
      @account = Account.find(params[:account_id])
      @user = @account.user
    end

    def require_local_account!
      redirect_to admin_account_path(@account.id) unless @account.local? && @account.user.present?
    end

    def resource_params
      params.require(:user).permit(
        :unconfirmed_email
      )
    end
  end
end


================================================
FILE: app/controllers/admin/confirmations_controller.rb
================================================
# frozen_string_literal: true

module Admin
  class ConfirmationsController < BaseController
    before_action :set_user
    before_action :check_confirmation, only: [:resend]

    def create
      authorize @user, :confirm?
      @user.confirm!
      log_action :confirm, @user
      redirect_to admin_accounts_path
    end

    def resend
      authorize @user, :confirm?

      @user.resend_confirmation_instructions

      log_action :confirm, @user

      flash[:notice] = I18n.t('admin.accounts.resend_confirmation.success')
      redirect_to admin_accounts_path
    end

    private

    def check_confirmation
      if @user.confirmed?
        flash[:error] = I18n.t('admin.accounts.resend_confirmation.already_confirmed')
        redirect_to admin_accounts_path
      end
    end
  end
end


================================================
FILE: app/controllers/admin/custom_emojis_controller.rb
================================================
# frozen_string_literal: true

module Admin
  class CustomEmojisController < BaseController
    before_action :set_custom_emoji, except: [:index, :new, :create]
    before_action :set_filter_params

    include ObfuscateFilename
    obfuscate_filename [:custom_emoji, :image]

    def index
      authorize :custom_emoji, :index?
      @custom_emojis = filtered_custom_emojis.eager_load(:local_counterpart).page(params[:page])
    end

    def new
      authorize :custom_emoji, :create?
      @custom_emoji = CustomEmoji.new
    end

    def create
      authorize :custom_emoji, :create?

      @custom_emoji = CustomEmoji.new(resource_params)

      if @custom_emoji.save
        log_action :create, @custom_emoji
        redirect_to admin_custom_emojis_path, notice: I18n.t('admin.custom_emojis.created_msg')
      else
        render :new
      end
    end

    def update
      authorize @custom_emoji, :update?

      if @custom_emoji.update(resource_params)
        log_action :update, @custom_emoji
        flash[:notice] = I18n.t('admin.custom_emojis.updated_msg')
      else
        flash[:alert] =  I18n.t('admin.custom_emojis.update_failed_msg')
      end
      redirect_to admin_custom_emojis_path(page: params[:page], **@filter_params)
    end

    def destroy
      authorize @custom_emoji, :destroy?
      @custom_emoji.destroy!
      log_action :destroy, @custom_emoji
      flash[:notice] = I18n.t('admin.custom_emojis.destroyed_msg')
      redirect_to admin_custom_emojis_path(page: params[:page], **@filter_params)
    end

    def copy
      authorize @custom_emoji, :copy?

      emoji = CustomEmoji.find_or_initialize_by(domain: nil,
                                                shortcode: @custom_emoji.shortcode)
      emoji.image = @custom_emoji.image

      if emoji.save
        log_action :create, emoji
        flash[:notice] = I18n.t('admin.custom_emojis.copied_msg')
      else
        flash[:alert] = I18n.t('admin.custom_emojis.copy_failed_msg')
      end

      redirect_to admin_custom_emojis_path(page: params[:page], **@filter_params)
    end

    def enable
      authorize @custom_emoji, :enable?
      @custom_emoji.update!(disabled: false)
      log_action :enable, @custom_emoji
      flash[:notice] = I18n.t('admin.custom_emojis.enabled_msg')
      redirect_to admin_custom_emojis_path(page: params[:page], **@filter_params)
    end

    def disable
      authorize @custom_emoji, :disable?
      @custom_emoji.update!(disabled: true)
      log_action :disable, @custom_emoji
      flash[:notice] = I18n.t('admin.custom_emojis.disabled_msg')
      redirect_to admin_custom_emojis_path(page: params[:page], **@filter_params)
    end

    private

    def set_custom_emoji
      @custom_emoji = CustomEmoji.find(params[:id])
    end

    def set_filter_params
      @filter_params = filter_params.to_hash.symbolize_keys
    end

    def resource_params
      params.require(:custom_emoji).permit(:shortcode, :image, :visible_in_picker)
    end

    def filtered_custom_emojis
      CustomEmojiFilter.new(filter_params).results
    end

    def filter_params
      params.permit(
        :local,
        :remote,
        :by_domain,
        :shortcode
      )
    end
  end
end


================================================
FILE: app/controllers/admin/dashboard_controller.rb
================================================
# frozen_string_literal: true
require 'sidekiq/api'

module Admin
  class DashboardController < BaseController
    def index
      @users_count           = User.count
      @registrations_week    = Redis.current.get("activity:accounts:local:#{current_week}") || 0
      @logins_week           = Redis.current.pfcount("activity:logins:#{current_week}")
      @interactions_week     = Redis.current.get("activity:interactions:#{current_week}") || 0
      @relay_enabled         = Relay.enabled.exists?
      @single_user_mode      = Rails.configuration.x.single_user_mode
      @registrations_enabled = Setting.registrations_mode != 'none'
      @max_bio_chars         = Setting.max_bio_chars
      @max_toot_chars        = Setting.max_toot_chars
      @deletions_enabled     = Setting.open_deletion
      @invites_enabled       = Setting.min_invite_role == 'user'
      @search_enabled        = Chewy.enabled?
      @version               = Florence::Version.to_s
      @masto_version         = Mastodon::Version.to_s
      @database_version      = ActiveRecord::Base.connection.execute('SELECT VERSION()').first['version'].match(/\A(?:PostgreSQL |)([^\s]+).*\z/)[1]
      @redis_version         = redis_info['redis_version']
      @reports_count         = Report.unresolved.count
      @queue_backlog         = Sidekiq::Stats.new.enqueued
      @recent_users          = User.confirmed.recent.includes(:account).limit(4)
      @database_size         = ActiveRecord::Base.connection.execute('SELECT pg_database_size(current_database())').first['pg_database_size']
      @redis_size            = redis_info['used_memory']
      @ldap_enabled          = ENV['LDAP_ENABLED'] == 'true'
      @cas_enabled           = ENV['CAS_ENABLED'] == 'true'
      @saml_enabled          = ENV['SAML_ENABLED'] == 'true'
      @pam_enabled           = ENV['PAM_ENABLED'] == 'true'
      @hidden_service        = ENV['ALLOW_ACCESS_TO_HIDDEN_SERVICE'] == 'true'
      @trending_hashtags     = TrendingTags.get(7)
      @profile_directory     = Setting.profile_directory
      @timeline_preview      = Setting.timeline_preview
    end

    private

    def current_week
      @current_week ||= Time.now.utc.to_date.cweek
    end

    def redis_info
      @redis_info ||= Redis.current.info
    end
  end
end


================================================
FILE: app/controllers/admin/domain_blocks_controller.rb
================================================
# frozen_string_literal: true

module Admin
  class DomainBlocksController < BaseController
    before_action :set_domain_block, only: [:show, :destroy]

    def new
      authorize :domain_block, :create?
      @domain_block = DomainBlock.new(domain: params[:_domain])
    end

    def create
      authorize :domain_block, :create?

      @domain_block = DomainBlock.new(resource_params)
      existing_domain_block = resource_params[:domain].present? ? DomainBlock.find_by(domain: resource_params[:domain]) : nil

      if existing_domain_block.present? && !@domain_block.stricter_than?(existing_domain_block)
        @domain_block.save
        flash[:alert] = I18n.t('admin.domain_blocks.existing_domain_block_html', name: existing_domain_block.domain, unblock_url: admin_domain_block_path(existing_domain_block)).html_safe # rubocop:disable Rails/OutputSafety
        @domain_block.errors[:domain].clear
        render :new
      else
        if existing_domain_block.present?
          @domain_block = existing_domain_block
          @domain_block.update(resource_params)
        end
        if @domain_block.save
          DomainBlockWorker.perform_async(@domain_block.id)
          log_action :create, @domain_block
          redirect_to admin_instances_path(limited: '1'), notice: I18n.t('admin.domain_blocks.created_msg')
        else
          render :new
        end
      end
    end

    def show
      authorize @domain_block, :show?
    end

    def destroy
      authorize @domain_block, :destroy?
      UnblockDomainService.new.call(@domain_block)
      log_action :destroy, @domain_block
      redirect_to admin_instances_path(limited: '1'), notice: I18n.t('admin.domain_blocks.destroyed_msg')
    end

    private

    def set_domain_block
      @domain_block = DomainBlock.find(params[:id])
    end

    def resource_params
      params.require(:domain_block).permit(:domain, :severity, :reject_media, :reject_reports)
    end
  end
end


================================================
FILE: app/controllers/admin/email_domain_blocks_controller.rb
================================================
# frozen_string_literal: true

module Admin
  class EmailDomainBlocksController < BaseController
    before_action :set_email_domain_block, only: [:show, :destroy]

    def index
      authorize :email_domain_block, :index?
      @email_domain_blocks = EmailDomainBlock.page(params[:page])
    end

    def new
      authorize :email_domain_block, :create?
      @email_domain_block = EmailDomainBlock.new
    end

    def create
      authorize :email_domain_block, :create?

      @email_domain_block = EmailDomainBlock.new(resource_params)

      if @email_domain_block.save
        log_action :create, @email_domain_block
        redirect_to admin_email_domain_blocks_path, notice: I18n.t('admin.email_domain_blocks.created_msg')
      else
        render :new
      end
    end

    def destroy
      authorize @email_domain_block, :destroy?
      @email_domain_block.destroy!
      log_action :destroy, @email_domain_block
      redirect_to admin_email_domain_blocks_path, notice: I18n.t('admin.email_domain_blocks.destroyed_msg')
    end

    private

    def set_email_domain_block
      @email_domain_block = EmailDomainBlock.find(params[:id])
    end

    def resource_params
      params.require(:email_domain_block).permit(:domain)
    end
  end
end


================================================
FILE: app/controllers/admin/followers_controller.rb
================================================
# frozen_string_literal: true

module Admin
  class FollowersController < BaseController
    before_action :set_account

    PER_PAGE = 40

    def index
      authorize :account, :index?
      @followers = @account.followers.local.recent.page(params[:page]).per(PER_PAGE)
    end

    def set_account
      @account = Account.find(params[:account_id])
    end
  end
end


================================================
FILE: app/controllers/admin/instances_controller.rb
================================================
# frozen_string_literal: true

module Admin
  class InstancesController < BaseController
    def index
      authorize :instance, :index?

      @instances = ordered_instances
    end

    def show
      authorize :instance, :show?

      @instance        = Instance.new(Account.by_domain_accounts.find_by(domain: params[:id]) || DomainBlock.find_by!(domain: params[:id]))
      @following_count = Follow.where(account: Account.where(domain: params[:id])).count
      @followers_count = Follow.where(target_account: Account.where(domain: params[:id])).count
      @reports_count   = Report.where(target_account: Account.where(domain: params[:id])).count
      @blocks_count    = Block.where(target_account: Account.where(domain: params[:id])).count
      @available       = DeliveryFailureTracker.available?(Account.select(:shared_inbox_url).where(domain: params[:id]).first&.shared_inbox_url)
      @media_storage   = MediaAttachment.where(account: Account.where(domain: params[:id])).sum(:file_file_size)
      @domain_block    = DomainBlock.find_by(domain: params[:id])
    end

    private

    def filtered_instances
      InstanceFilter.new(filter_params).results
    end

    def paginated_instances
      filtered_instances.page(params[:page])
    end

    helper_method :paginated_instances

    def ordered_instances
      paginated_instances.map { |resource| Instance.new(resource) }
    end

    def filter_params
      params.permit(:limited, :by_domain)
    end
  end
end


================================================
FILE: app/controllers/admin/invites_controller.rb
================================================
# frozen_string_literal: true

module Admin
  class InvitesController < BaseController
    def index
      authorize :invite, :index?

      @invites = filtered_invites.includes(user: :account).page(params[:page])
      @invite  = Invite.new
    end

    def create
      authorize :invite, :create?

      @invite      = Invite.new(resource_params)
      @invite.user = current_user

      if @invite.save
        redirect_to admin_invites_path
      else
        @invites = Invite.page(params[:page])
        render :index
      end
    end

    def destroy
      @invite = Invite.find(params[:id])
      authorize @invite, :destroy?
      @invite.expire!
      redirect_to admin_invites_path
    end

    def deactivate_all
      authorize :invite, :deactivate_all?
      Invite.available.in_batches.update_all(expires_at: Time.now.utc)
      redirect_to admin_invites_path
    end

    private

    def resource_params
      params.require(:invite).permit(:max_uses, :expires_in)
    end

    def filtered_invites
      InviteFilter.new(filter_params).results
    end

    def filter_params
      params.permit(:available, :expired)
    end
  end
end


================================================
FILE: app/controllers/admin/pending_accounts_controller.rb
================================================
# frozen_string_literal: true

module Admin
  class PendingAccountsController < BaseController
    before_action :set_accounts, only: :index

    def index
      @form = Form::AccountBatch.new
    end

    def batch
      @form = Form::AccountBatch.new(form_account_batch_params.merge(current_account: current_account, action: action_from_button))
      @form.save
    rescue ActionController::ParameterMissing
      flash[:alert] = I18n.t('admin.accounts.no_account_selected')
    ensure
      redirect_to admin_pending_accounts_path(current_params)
    end

    def approve_all
      Form::AccountBatch.new(current_account: current_account, account_ids: User.pending.pluck(:account_id), action: 'approve').save
      redirect_to admin_pending_accounts_path(current_params)
    end

    def reject_all
      Form::AccountBatch.new(current_account: current_account, account_ids: User.pending.pluck(:account_id), action: 'reject').save
      redirect_to admin_pending_accounts_path(current_params)
    end

    private

    def set_accounts
      @accounts = Account.joins(:user).merge(User.pending.recent).includes(user: :invite_request).page(params[:page])
    end

    def form_account_batch_params
      params.require(:form_account_batch).permit(:action, account_ids: [])
    end

    def action_from_button
      if params[:approve]
        'approve'
      elsif params[:reject]
        'reject'
      end
    end

    def current_params
      params.slice(:page).permit(:page)
    end
  end
end


================================================
FILE: app/controllers/admin/relays_controller.rb
================================================
# frozen_string_literal: true

module Admin
  class RelaysController < BaseController
    before_action :set_relay, except: [:index, :new, :create]

    def index
      authorize :relay, :update?
      @relays = Relay.all
    end

    def new
      authorize :relay, :update?
      @relay = Relay.new(inbox_url: Relay::PRESET_RELAY)
    end

    def create
      authorize :relay, :update?

      @relay = Relay.new(resource_params)

      if @relay.save
        @relay.enable!
        redirect_to admin_relays_path
      else
        render action: :new
      end
    end

    def destroy
      authorize :relay, :update?
      @relay.destroy
      redirect_to admin_relays_path
    end

    def enable
      authorize :relay, :update?
      @relay.enable!
      redirect_to admin_relays_path
    end

    def disable
      authorize :relay, :update?
      @relay.disable!
      redirect_to admin_relays_path
    end

    private

    def set_relay
      @relay = Relay.find(params[:id])
    end

    def resource_params
      params.require(:relay).permit(:inbox_url)
    end
  end
end


================================================
FILE: app/controllers/admin/report_notes_controller.rb
================================================
# frozen_string_literal: true

module Admin
  class ReportNotesController < BaseController
    before_action :set_report_note, only: [:destroy]

    def create
      authorize ReportNote, :create?

      @report_note = current_account.report_notes.new(resource_params)
      @report = @report_note.report

      if @report_note.save
        if params[:create_and_resolve]
          @report.resolve!(current_account)
          log_action :resolve, @report

          redirect_to admin_reports_path, notice: I18n.t('admin.reports.resolved_msg')
          return
        end

        if params[:create_and_unresolve]
          @report.unresolve!
          log_action :reopen, @report
        end

        redirect_to admin_report_path(@report), notice: I18n.t('admin.report_notes.created_msg')
      else
        @report_notes = @report.notes.latest
        @report_history = @report.history
        @form = Form::StatusBatch.new

        render template: 'admin/reports/show'
      end
    end

    def destroy
      authorize @report_note, :destroy?
      @report_note.destroy!
      redirect_to admin_report_path(@report_note.report_id), notice: I18n.t('admin.report_notes.destroyed_msg')
    end

    private

    def resource_params
      params.require(:report_note).permit(
        :content,
        :report_id
      )
    end

    def set_report_note
      @report_note = ReportNote.find(params[:id])
    end
  end
end


================================================
FILE: app/controllers/admin/reported_statuses_controller.rb
================================================
# frozen_string_literal: true

module Admin
  class ReportedStatusesController < BaseController
    before_action :set_report

    def create
      authorize :status, :update?

      @form         = Form::StatusBatch.new(form_status_batch_params.merge(current_account: current_account, action: action_from_button))
      flash[:alert] = I18n.t('admin.statuses.failed_to_execute') unless @form.save

      redirect_to admin_report_path(@report)
    rescue ActionController::ParameterMissing
      flash[:alert] = I18n.t('admin.statuses.no_status_selected')

      redirect_to admin_report_path(@report)
    end

    private

    def status_params
      params.require(:status).permit(:sensitive)
    end

    def form_status_batch_params
      params.require(:form_status_batch).permit(status_ids: [])
    end

    def action_from_button
      if params[:nsfw_on]
        'nsfw_on'
      elsif params[:nsfw_off]
        'nsfw_off'
      elsif params[:delete]
        'delete'
      end
    end

    def set_report
      @report = Report.find(params[:report_id])
    end
  end
end


================================================
FILE: app/controllers/admin/reports_controller.rb
================================================
# frozen_string_literal: true

module Admin
  class ReportsController < BaseController
    before_action :set_report, except: [:index]

    def index
      authorize :report, :index?
      @reports = filtered_reports.page(params[:page])
    end

    def show
      authorize @report, :show?

      @report_note  = @report.notes.new
      @report_notes = (@report.notes.latest + @report.history + @report.target_account.targeted_account_warnings.latest.custom).sort_by(&:created_at)
      @form         = Form::StatusBatch.new
    end

    def assign_to_self
      authorize @report, :update?
      @report.update!(assigned_account_id: current_account.id)
      log_action :assigned_to_self, @report
      redirect_to admin_report_path(@report)
    end

    def unassign
      authorize @report, :update?
      @report.update!(assigned_account_id: nil)
      log_action :unassigned, @report
      redirect_to admin_report_path(@report)
    end

    def reopen
      authorize @report, :update?
      @report.unresolve!
      log_action :reopen, @report
      redirect_to admin_report_path(@report)
    end

    def resolve
      authorize @report, :update?
      @report.resolve!(current_account)
      log_action :resolve, @report
      redirect_to admin_reports_path, notice: I18n.t('admin.reports.resolved_msg')
    end

    private

    def filtered_reports
      ReportFilter.new(filter_params).results.order(id: :desc).includes(:account, :target_account)
    end

    def filter_params
      params.permit(
        :account_id,
        :resolved,
        :target_account_id
      )
    end

    def set_report
      @report = Report.find(params[:id])
    end
  end
end


================================================
FILE: app/controllers/admin/resets_controller.rb
================================================
# frozen_string_literal: true

module Admin
  class ResetsController < BaseController
    before_action :set_user

    def create
      authorize @user, :reset_password?
      @user.send_reset_password_instructions
      log_action :reset_password, @user
      redirect_to admin_accounts_path
    end
  end
end


================================================
FILE: app/controllers/admin/roles_controller.rb
================================================
# frozen_string_literal: true

module Admin
  class RolesController < BaseController
    before_action :set_user

    def promote
      authorize @user, :promote?
      @user.promote!
      log_action :promote, @user
      redirect_to admin_account_path(@user.account_id)
    end

    def demote
      authorize @user, :demote?
      @user.demote!
      log_action :demote, @user
      redirect_to admin_account_path(@user.account_id)
    end
  end
end


================================================
FILE: app/controllers/admin/settings_controller.rb
================================================
# frozen_string_literal: true

module Admin
  class SettingsController < BaseController
    ADMIN_SETTINGS = %w(
      site_contact_username
      site_contact_email
      site_title
      site_short_description
      site_description
      site_extended_description
      site_terms
      open_registrations
      max_bio_chars
      max_toot_chars
      closed_registrations_message
      open_deletion
      timeline_preview
      show_staff_badge
      bootstrap_timeline_accounts
      theme
      thumbnail
      hero
      mascot
      min_invite_role
      activity_api_enabled
      peers_api_enabled
      show_known_fediverse_at_about_page
      preview_sensitive_media
      custom_css
      profile_directory
    ).freeze

    BOOLEAN_SETTINGS = %w(
      open_registrations
      open_deletion
      timeline_preview
      show_staff_badge
      activity_api_enabled
      peers_api_enabled
      show_known_fediverse_at_about_page
      preview_sensitive_media
      profile_directory
    ).freeze
  
    INTEGER_SETTINGS = %w(
      max_bio_chars
      max_toot_chars
    ).freeze

    UPLOAD_SETTINGS = %w(
      thumbnail
      hero
      mascot
    ).freeze

    def edit
      authorize :settings, :show?

      @admin_settings = Form::AdminSettings.new
    end

    def update
      authorize :settings, :update?

      @admin_settings = Form::AdminSettings.new(settings_params)

      if @admin_settings.save
        flash[:notice] = I18n.t('generic.changes_saved_msg')
        redirect_to edit_admin_settings_path
      else
        render :edit
      end
    end

    private

    def settings_params
      params.require(:form_admin_settings).permit(*Form::AdminSettings::KEYS)
    end
  end
end


================================================
FILE: app/controllers/admin/statuses_controller.rb
================================================
# frozen_string_literal: true

module Admin
  class StatusesController < BaseController
    helper_method :current_params

    before_action :set_account

    PER_PAGE = 20

    def index
      authorize :status, :index?

      @statuses = @account.statuses.where(visibility: [:public, :unlisted])

      if params[:media]
        account_media_status_ids = @account.media_attachments.attached.reorder(nil).select(:status_id).distinct
        @statuses.merge!(Status.where(id: account_media_status_ids))
      end

      @statuses = @statuses.preload(:media_attachments, :mentions).page(params[:page]).per(PER_PAGE)
      @form     = Form::StatusBatch.new
    end

    def show
      authorize :status, :index?

      @statuses = @account.statuses.where(id: params[:id])
      authorize @statuses.first, :show?

      @form = Form::StatusBatch.new
    end

    def create
      authorize :status, :update?

      @form         = Form::StatusBatch.new(form_status_batch_params.merge(current_account: current_account, action: action_from_button))
      flash[:alert] = I18n.t('admin.statuses.failed_to_execute') unless @form.save

      redirect_to admin_account_statuses_path(@account.id, current_params)
    rescue ActionController::ParameterMissing
      flash[:alert] = I18n.t('admin.statuses.no_status_selected')

      redirect_to admin_account_statuses_path(@account.id, current_params)
    end

    private

    def form_status_batch_params
      params.require(:form_status_batch).permit(:action, status_ids: [])
    end

    def set_account
      @account = Account.find(params[:account_id])
    end

    def current_params
      page = (params[:page] || 1).to_i

      {
        media: params[:media],
        page: page > 1 && page,
      }.select { |_, value| value.present? }
    end

    def action_from_button
      if params[:nsfw_on]
        'nsfw_on'
      elsif params[:nsfw_off]
        'nsfw_off'
      elsif params[:delete]
        'delete'
      end
    end
  end
end


================================================
FILE: app/controllers/admin/subscriptions_controller.rb
================================================
# frozen_string_literal: true

module Admin
  class SubscriptionsController < BaseController
    def index
      authorize :subscription, :index?
      @subscriptions = ordered_subscriptions.page(requested_page)
    end

    private

    def ordered_subscriptions
      Subscription.order(id: :desc).includes(:account)
    end

    def requested_page
      params[:page].to_i
    end
  end
end


================================================
FILE: app/controllers/admin/tags_controller.rb
================================================
# frozen_string_literal: true

module Admin
  class TagsController < BaseController
    before_action :set_tags, only: :index
    before_action :set_tag, except: :index
    before_action :set_filter_params

    def index
      authorize :tag, :index?
    end

    def hide
      authorize @tag, :hide?
      @tag.account_tag_stat.update!(hidden: true)
      redirect_to admin_tags_path(@filter_params)
    end

    def unhide
      authorize @tag, :unhide?
      @tag.account_tag_stat.update!(hidden: false)
      redirect_to admin_tags_path(@filter_params)
    end

    private

    def set_tags
      @tags = Tag.discoverable
      @tags.merge!(Tag.hidden) if filter_params[:hidden]
    end

    def set_tag
      @tag = Tag.find(params[:id])
    end

    def set_filter_params
      @filter_params = filter_params.to_hash.symbolize_keys
    end

    def filter_params
      params.permit(:hidden)
    end
  end
end


================================================
FILE: app/controllers/admin/two_factor_authentications_controller.rb
================================================
# frozen_string_literal: true

module Admin
  class TwoFactorAuthenticationsController < BaseController
    before_action :set_target_user

    def destroy
      authorize @user, :disable_2fa?
      @user.disable_two_factor!
      log_action :disable_2fa, @user
      redirect_to admin_accounts_path
    end

    private

    def set_target_user
      @user = User.find(params[:user_id])
    end
  end
end


================================================
FILE: app/controllers/admin/warning_presets_controller.rb
================================================
# frozen_string_literal: true

module Admin
  class WarningPresetsController < BaseController
    before_action :set_warning_preset, except: [:index, :create]

    def index
      authorize :account_warning_preset, :index?

      @warning_presets = AccountWarningPreset.all
      @warning_preset  = AccountWarningPreset.new
    end

    def create
      authorize :account_warning_preset, :create?

      @warning_preset = AccountWarningPreset.new(warning_preset_params)

      if @warning_preset.save
        redirect_to admin_warning_presets_path
      else
        @warning_presets = AccountWarningPreset.all
        render :index
      end
    end

    def edit
      authorize @warning_preset, :update?
    end

    def update
      authorize @warning_preset, :update?

      if @warning_preset.update(warning_preset_params)
        redirect_to admin_warning_presets_path
      else
        render :edit
      end
    end

    def destroy
      authorize @warning_preset, :destroy?

      @warning_preset.destroy!
      redirect_to admin_warning_presets_path
    end

    private

    def set_warning_preset
      @warning_preset = AccountWarningPreset.find(params[:id])
    end

    def warning_preset_params
      params.require(:account_warning_preset).permit(:text)
    end
  end
end


================================================
FILE: app/controllers/api/base_controller.rb
================================================
# frozen_string_literal: true

class Api::BaseController < ApplicationController
  DEFAULT_STATUSES_LIMIT = 20
  DEFAULT_ACCOUNTS_LIMIT = 40

  include RateLimitHeaders

  skip_before_action :store_current_location
  skip_before_action :check_user_permissions

  before_action :set_cache_headers

  protect_from_forgery with: :null_session

  rescue_from ActiveRecord::RecordInvalid, Mastodon::ValidationError do |e|
    render json: { error: e.to_s }, status: 422
  end

  rescue_from ActiveRecord::RecordNotFound do
    render json: { error: 'Record not found' }, status: 404
  end

  rescue_from HTTP::Error, Mastodon::UnexpectedResponseError do
    render json: { error: 'Remote data could not be fetched' }, status: 503
  end

  rescue_from OpenSSL::SSL::SSLError do
    render json: { error: 'Remote SSL certificate could not be verified' }, status: 503
  end

  rescue_from Mastodon::NotPermittedError do
    render json: { error: 'This action is not allowed' }, status: 403
  end

  def doorkeeper_unauthorized_render_options(error: nil)
    { json: { error: (error.try(:description) || 'Not authorized') } }
  end

  def doorkeeper_forbidden_render_options(*)
    { json: { error: 'This action is outside the authorized scopes' } }
  end

  protected

  def set_pagination_headers(next_path = nil, prev_path = nil)
    links = []
    links << [next_path, [%w(rel next)]] if next_path
    links << [prev_path, [%w(rel prev)]] if prev_path
    response.headers['Link'] = LinkHeader.new(links) unless links.empty?
  end

  def limit_param(default_limit)
    return default_limit unless params[:limit]
    [params[:limit].to_i.abs, default_limit * 2].min
  end

  def params_slice(*keys)
    params.slice(*keys).permit(*keys)
  end

  def current_resource_owner
    @current_user ||= User.find(doorkeeper_token.resource_owner_id) if doorkeeper_token
  end

  def current_user
    current_resource_owner || super
  rescue ActiveRecord::RecordNotFound
    nil
  end

  def require_user!
    if !current_user
      render json: { error: 'This method requires an authenticated user' }, status: 422
    elsif current_user.disabled?
      render json: { error: 'Your login is currently disabled' }, status: 403
    elsif !current_user.confirmed?
      render json: { error: 'Your login is missing a confirmed e-mail address' }, status: 403
    elsif !current_user.approved?
      render json: { error: 'Your login is currently pending approval' }, status: 403
    else
      set_user_activity
    end
  end

  def render_empty
    render json: {}, status: 200
  end

  def authorize_if_got_token!(*scopes)
    doorkeeper_authorize!(*scopes) if doorkeeper_token
  end

  def set_cache_headers
    response.headers['Cache-Control'] = 'no-cache, no-store, max-age=0, must-revalidate'
  end
end


================================================
FILE: app/controllers/api/oembed_controller.rb
================================================
# frozen_string_literal: true

class Api::OEmbedController < Api::BaseController
  respond_to :json

  def show
    @status = status_finder.status
    render json: @status, serializer: OEmbedSerializer, width: maxwidth_or_default, height: maxheight_or_default
  end

  private

  def status_finder
    StatusFinder.new(params[:url])
  end

  def maxwidth_or_default
    (params[:maxwidth].presence || 400).to_i
  end

  def maxheight_or_default
    params[:maxheight].present? ? params[:maxheight].to_i : nil
  end
end


================================================
FILE: app/controllers/api/proofs_controller.rb
================================================
# frozen_string_literal: true

class Api::ProofsController < Api::BaseController
  before_action :set_account
  before_action :set_provider
  before_action :check_account_approval
  before_action :check_account_suspension

  def index
    render json: @account, serializer: @provider.serializer_class
  end

  private

  def set_provider
    @provider = ProofProvider.find(params[:provider]) || raise(ActiveRecord::RecordNotFound)
  end

  def set_account
    @account = Account.find_local!(params[:username])
  end

  def check_account_approval
    not_found if @account.user_pending?
  end

  def check_account_suspension
    gone if @account.suspended?
  end
end


================================================
FILE: app/controllers/api/push_controller.rb
================================================
# frozen_string_literal: true

class Api::PushController < Api::BaseController
  include SignatureVerification

  def update
    response, status = process_push_request
    render plain: response, status: status
  end

  private

  def process_push_request
    case hub_mode
    when 'subscribe'
      Pubsubhubbub::SubscribeService.new.call(account_from_topic, hub_callback, hub_secret, hub_lease_seconds, verified_domain)
    when 'unsubscribe'
      Pubsubhubbub::UnsubscribeService.new.call(account_from_topic, hub_callback)
    else
      ["Unknown mode: #{hub_mode}", 422]
    end
  end

  def hub_mode
    params['hub.mode']
  end

  def hub_topic
    params['hub.topic']
  end

  def hub_callback
    params['hub.callback']
  end

  def hub_lease_seconds
    params['hub.lease_seconds']
  end

  def hub_secret
    params['hub.secret']
  end

  def account_from_topic
    if hub_topic.present? && local_domain? && account_feed_path?
      Account.find_local(hub_topic_params[:username])
    end
  end

  def hub_topic_params
    @_hub_topic_params ||= Rails.application.routes.recognize_path(hub_topic_uri.path)
  end

  def hub_topic_uri
    @_hub_topic_uri ||= Addressable::URI.parse(hub_topic).normalize
  end

  def local_domain?
    TagManager.instance.web_domain?(hub_topic_domain)
  end

  def verified_domain
    return signed_request_account.domain if signed_request_account
  end

  def hub_topic_domain
    hub_topic_uri.host + (hub_topic_uri.port ? ":#{hub_topic_uri.port}" : '')
  end

  def account_feed_path?
    hub_topic_params[:controller] == 'accounts' && hub_topic_params[:action] == 'show' && hub_topic_params[:format] == 'atom'
  end
end


================================================
FILE: app/controllers/api/salmon_controller.rb
================================================
# frozen_string_literal: true

class Api::SalmonController < Api::BaseController
  include SignatureVerification

  before_action :set_account
  respond_to :txt

  def update
    if verify_payload?
      process_salmon
      head 202
    elsif payload.present?
      render plain: signature_verification_failure_reason, status: 401
    else
      head 400
    end
  end

  private

  def set_account
    @account = Account.find(params[:id])
  end

  def payload
    @_payload ||= request.body.read
  end

  def verify_payload?
    payload.present? && VerifySalmonService.new.call(payload)
  end

  def process_salmon
    SalmonWorker.perform_async(@account.id, payload.force_encoding('UTF-8'))
  end
end


================================================
FILE: app/controllers/api/subscriptions_controller.rb
================================================
# frozen_string_literal: true

class Api::SubscriptionsController < Api::BaseController
  before_action :set_account
  respond_to :txt

  def show
    if subscription.valid?(params['hub.topic'])
      @account.update(subscription_expires_at: future_expires)
      render plain: encoded_challenge, status: 200
    else
      head 404
    end
  end

  def update
    if subscription.verify(body, request.headers['HTTP_X_HUB_SIGNATURE'])
      ProcessingWorker.perform_async(@account.id, body.force_encoding('UTF-8'))
    end

    head 200
  end

  private

  def subscription
    @_subscription ||= @account.subscription(
      api_subscription_url(@account.id)
    )
  end

  def body
    @_body ||= request.body.read
  end

  def encoded_challenge
    HTMLEntities.new.encode(params['hub.challenge'])
  end

  def future_expires
    Time.now.utc + lease_seconds_or_default
  end

  def lease_seconds_or_default
    (params['hub.lease_seconds'] || 1.day).to_i.seconds
  end

  def set_account
    @account = Account.find(params[:id])
  end
end


================================================
FILE: app/controllers/api/v1/accounts/credentials_controller.rb
================================================
# frozen_string_literal: true

class Api::V1::Accounts::CredentialsController < Api::BaseController
  before_action -> { doorkeeper_authorize! :read, :'read:accounts' }, except: [:update]
  before_action -> { doorkeeper_authorize! :write, :'write:accounts' }, only: [:update]
  before_action :require_user!

  def show
    @account = current_account
    render json: @account, serializer: REST::CredentialAccountSerializer
  end

  def update
    @account = current_account
    UpdateAccountService.new.call(@account, account_params, raise_error: true)
    UserSettingsDecorator.new(current_user).update(user_settings_params) if user_settings_params
    ActivityPub::UpdateDistributionWorker.perform_async(@account.id)
    render json: @account, serializer: REST::CredentialAccountSerializer
  end

  private

  def account_params
    params.permit(:display_name, :note, :avatar, :header, :locked, :bot, :discoverable, fields_attributes: [:name, :value])
  end

  def user_settings_params
    return nil unless params.key?(:source)

    source_params = params.require(:source)

    {
      'setting_default_privacy' => source_params.fetch(:privacy, @account.user.setting_default_privacy),
      'setting_default_sensitive' => source_params.fetch(:sensitive, @account.user.setting_default_sensitive),
      'setting_default_language' => source_params.fetch(:language, @account.user.setting_default_language),
    }
  end
end


================================================
FILE: app/controllers/api/v1/accounts/follower_accounts_controller.rb
================================================
# frozen_string_literal: true

class Api::V1::Accounts::FollowerAccountsController < Api::BaseController
  before_action -> { doorkeeper_authorize! :read, :'read:accounts' }
  before_action :set_account
  after_action :insert_pagination_headers

  respond_to :json

  def index
    @accounts = load_accounts
    render json: @accounts, each_serializer: REST::AccountSerializer
  end

  private

  def set_account
    @account = Account.find(params[:account_id])
  end

  def load_accounts
    return [] if hide_results?

    default_accounts.merge(paginated_follows).to_a
  end

  def hide_results?
    (@account.user_hides_network? && current_account.id != @account.id) || (current_account && @account.blocking?(current_account))
  end

  def default_accounts
    Account.includes(:active_relationships, :account_stat).references(:active_relationships)
  end

  def paginated_follows
    Follow.where(target_account: @account).paginate_by_max_id(
      limit_param(DEFAULT_ACCOUNTS_LIMIT),
      params[:max_id],
      params[:since_id]
    )
  end

  def insert_pagination_headers
    set_pagination_headers(next_path, prev_path)
  end

  def next_path
    if records_continue?
      api_v1_account_followers_url pagination_params(max_id: pagination_max_id)
    end
  end

  def prev_path
    unless @accounts.empty?
      api_v1_account_followers_url pagination_params(since_id: pagination_since_id)
    end
  end

  def pagination_max_id
    @accounts.last.active_relationships.first.id
  end

  def pagination_since_id
    @accounts.first.active_relationships.first.id
  end

  def records_continue?
    @accounts.size == limit_param(DEFAULT_ACCOUNTS_LIMIT)
  end

  def pagination_params(core_params)
    params.slice(:limit).permit(:limit).merge(core_params)
  end
end


================================================
FILE: app/controllers/api/v1/accounts/following_accounts_controller.rb
================================================
# frozen_string_literal: true

class Api::V1::Accounts::FollowingAccountsController < Api::BaseController
  before_action -> { doorkeeper_authorize! :read, :'read:accounts' }
  before_action :set_account
  after_action :insert_pagination_headers

  respond_to :json

  def index
    @accounts = load_accounts
    render json: @accounts, each_serializer: REST::AccountSerializer
  end

  private

  def set_account
    @account = Account.find(params[:account_id])
  end

  def load_accounts
    return [] if hide_results?

    default_accounts.merge(paginated_follows).to_a
  end

  def hide_results?
    (@account.user_hides_network? && current_account.id != @account.id) || (current_account && @account.blocking?(current_account))
  end

  def default_accounts
    Account.includes(:passive_relationships, :account_stat).references(:passive_relationships)
  end

  def paginated_follows
    Follow.where(account: @account).paginate_by_max_id(
      limit_param(DEFAULT_ACCOUNTS_LIMIT),
      params[:max_id],
      params[:since_id]
    )
  end

  def insert_pagination_headers
    set_pagination_headers(next_path, prev_path)
  end

  def next_path
    if records_continue?
      api_v1_account_following_index_url pagination_params(max_id: pagination_max_id)
    end
  end

  def prev_path
    unless @accounts.empty?
      api_v1_account_following_index_url pagination_params(since_id: pagination_since_id)
    end
  end

  def pagination_max_id
    @accounts.last.passive_relationships.first.id
  end

  def pagination_since_id
    @accounts.first.passive_relationships.first.id
  end

  def records_continue?
    @accounts.size == limit_param(DEFAULT_ACCOUNTS_LIMIT)
  end

  def pagination_params(core_params)
    params.slice(:limit).permit(:limit).merge(core_params)
  end
end


================================================
FILE: app/controllers/api/v1/accounts/identity_proofs_controller.rb
================================================
# frozen_string_literal: true

class Api::V1::Accounts::IdentityProofsController < Api::BaseController
  before_action :require_user!
  before_action :set_account

  respond_to :json

  def index
    @proofs = @account.identity_proofs.active
    render json: @proofs, each_serializer: REST::IdentityProofSerializer
  end

  private

  def set_account
    @account = Account.find(params[:account_id])
  end
end


================================================
FILE: app/controllers/api/v1/accounts/lists_controller.rb
================================================
# frozen_string_literal: true

class Api::V1::Accounts::ListsController < Api::BaseController
  before_action -> { doorkeeper_authorize! :read, :'read:lists' }
  before_action :require_user!
  before_action :set_account

  respond_to :json

  def index
    @lists = @account.lists.where(account: current_account)
    render json: @lists, each_serializer: REST::ListSerializer
  end

  private

  def set_account
    @account = Account.find(params[:account_id])
  end
end


================================================
FILE: app/controllers/api/v1/accounts/pins_controller.rb
================================================
# frozen_string_literal: true

class Api::V1::Accounts::PinsController < Api::BaseController
  include Authorization

  before_action -> { doorkeeper_authorize! :write, :'write:accounts' }
  before_action :require_user!
  before_action :set_account

  respond_to :json

  def create
    AccountPin.create!(account: current_account, target_account: @account)
    render json: @account, serializer
Download .txt
gitextract_pog1r_hd/

├── .buildpacks
├── .circleci/
│   └── config.yml
├── .codeclimate.yml
├── .dependabot/
│   └── config.yml
├── .dockerignore
├── .editorconfig
├── .eslintignore
├── .eslintrc.js
├── .foreman
├── .gitattributes
├── .gitignore
├── .haml-lint.yml
├── .nanoignore
├── .nvmrc
├── .profile
├── .rspec
├── .rubocop.yml
├── .ruby-version
├── .sass-lint.yml
├── .slugignore
├── .yarnclean
├── AUTHORS.md
├── Aptfile
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Capfile
├── Dockerfile
├── Gemfile
├── LICENSE
├── Procfile
├── Procfile.dev
├── README.md
├── Rakefile
├── Vagrantfile
├── app/
│   ├── chewy/
│   │   └── statuses_index.rb
│   ├── controllers/
│   │   ├── about_controller.rb
│   │   ├── account_follow_controller.rb
│   │   ├── account_unfollow_controller.rb
│   │   ├── accounts_controller.rb
│   │   ├── activitypub/
│   │   │   ├── collections_controller.rb
│   │   │   ├── inboxes_controller.rb
│   │   │   └── outboxes_controller.rb
│   │   ├── admin/
│   │   │   ├── account_actions_controller.rb
│   │   │   ├── account_moderation_notes_controller.rb
│   │   │   ├── accounts_controller.rb
│   │   │   ├── action_logs_controller.rb
│   │   │   ├── base_controller.rb
│   │   │   ├── change_emails_controller.rb
│   │   │   ├── confirmations_controller.rb
│   │   │   ├── custom_emojis_controller.rb
│   │   │   ├── dashboard_controller.rb
│   │   │   ├── domain_blocks_controller.rb
│   │   │   ├── email_domain_blocks_controller.rb
│   │   │   ├── followers_controller.rb
│   │   │   ├── instances_controller.rb
│   │   │   ├── invites_controller.rb
│   │   │   ├── pending_accounts_controller.rb
│   │   │   ├── relays_controller.rb
│   │   │   ├── report_notes_controller.rb
│   │   │   ├── reported_statuses_controller.rb
│   │   │   ├── reports_controller.rb
│   │   │   ├── resets_controller.rb
│   │   │   ├── roles_controller.rb
│   │   │   ├── settings_controller.rb
│   │   │   ├── statuses_controller.rb
│   │   │   ├── subscriptions_controller.rb
│   │   │   ├── tags_controller.rb
│   │   │   ├── two_factor_authentications_controller.rb
│   │   │   └── warning_presets_controller.rb
│   │   ├── api/
│   │   │   ├── base_controller.rb
│   │   │   ├── oembed_controller.rb
│   │   │   ├── proofs_controller.rb
│   │   │   ├── push_controller.rb
│   │   │   ├── salmon_controller.rb
│   │   │   ├── subscriptions_controller.rb
│   │   │   ├── v1/
│   │   │   │   ├── accounts/
│   │   │   │   │   ├── credentials_controller.rb
│   │   │   │   │   ├── follower_accounts_controller.rb
│   │   │   │   │   ├── following_accounts_controller.rb
│   │   │   │   │   ├── identity_proofs_controller.rb
│   │   │   │   │   ├── lists_controller.rb
│   │   │   │   │   ├── pins_controller.rb
│   │   │   │   │   ├── relationships_controller.rb
│   │   │   │   │   ├── search_controller.rb
│   │   │   │   │   └── statuses_controller.rb
│   │   │   │   ├── accounts_controller.rb
│   │   │   │   ├── apps/
│   │   │   │   │   └── credentials_controller.rb
│   │   │   │   ├── apps_controller.rb
│   │   │   │   ├── blocks_controller.rb
│   │   │   │   ├── conversations_controller.rb
│   │   │   │   ├── custom_emojis_controller.rb
│   │   │   │   ├── domain_blocks_controller.rb
│   │   │   │   ├── endorsements_controller.rb
│   │   │   │   ├── favourites_controller.rb
│   │   │   │   ├── filters_controller.rb
│   │   │   │   ├── follow_requests_controller.rb
│   │   │   │   ├── follows_controller.rb
│   │   │   │   ├── instances/
│   │   │   │   │   ├── activity_controller.rb
│   │   │   │   │   └── peers_controller.rb
│   │   │   │   ├── instances_controller.rb
│   │   │   │   ├── lists/
│   │   │   │   │   └── accounts_controller.rb
│   │   │   │   ├── lists_controller.rb
│   │   │   │   ├── media_controller.rb
│   │   │   │   ├── mutes_controller.rb
│   │   │   │   ├── notifications_controller.rb
│   │   │   │   ├── polls/
│   │   │   │   │   └── votes_controller.rb
│   │   │   │   ├── polls_controller.rb
│   │   │   │   ├── preferences_controller.rb
│   │   │   │   ├── push/
│   │   │   │   │   └── subscriptions_controller.rb
│   │   │   │   ├── reports_controller.rb
│   │   │   │   ├── scheduled_statuses_controller.rb
│   │   │   │   ├── search_controller.rb
│   │   │   │   ├── statuses/
│   │   │   │   │   ├── favourited_by_accounts_controller.rb
│   │   │   │   │   ├── favourites_controller.rb
│   │   │   │   │   ├── mutes_controller.rb
│   │   │   │   │   ├── pins_controller.rb
│   │   │   │   │   ├── reblogged_by_accounts_controller.rb
│   │   │   │   │   └── reblogs_controller.rb
│   │   │   │   ├── statuses_controller.rb
│   │   │   │   ├── streaming_controller.rb
│   │   │   │   ├── suggestions_controller.rb
│   │   │   │   └── timelines/
│   │   │   │       ├── direct_controller.rb
│   │   │   │       ├── home_controller.rb
│   │   │   │       ├── list_controller.rb
│   │   │   │       ├── public_controller.rb
│   │   │   │       └── tag_controller.rb
│   │   │   ├── v2/
│   │   │   │   └── search_controller.rb
│   │   │   └── web/
│   │   │       ├── base_controller.rb
│   │   │       ├── embeds_controller.rb
│   │   │       ├── push_subscriptions_controller.rb
│   │   │       └── settings_controller.rb
│   │   ├── application_controller.rb
│   │   ├── auth/
│   │   │   ├── confirmations_controller.rb
│   │   │   ├── omniauth_callbacks_controller.rb
│   │   │   ├── passwords_controller.rb
│   │   │   ├── registrations_controller.rb
│   │   │   └── sessions_controller.rb
│   │   ├── authorize_interactions_controller.rb
│   │   ├── concerns/
│   │   │   ├── account_controller_concern.rb
│   │   │   ├── accountable_concern.rb
│   │   │   ├── authorization.rb
│   │   │   ├── export_controller_concern.rb
│   │   │   ├── localized.rb
│   │   │   ├── obfuscate_filename.rb
│   │   │   ├── rate_limit_headers.rb
│   │   │   ├── session_tracking_concern.rb
│   │   │   ├── signature_authentication.rb
│   │   │   ├── signature_verification.rb
│   │   │   └── user_tracking_concern.rb
│   │   ├── custom_css_controller.rb
│   │   ├── directories_controller.rb
│   │   ├── emojis_controller.rb
│   │   ├── filters_controller.rb
│   │   ├── follower_accounts_controller.rb
│   │   ├── following_accounts_controller.rb
│   │   ├── home_controller.rb
│   │   ├── intents_controller.rb
│   │   ├── invites_controller.rb
│   │   ├── manifests_controller.rb
│   │   ├── media_controller.rb
│   │   ├── media_proxy_controller.rb
│   │   ├── oauth/
│   │   │   ├── authorizations_controller.rb
│   │   │   ├── authorized_applications_controller.rb
│   │   │   └── tokens_controller.rb
│   │   ├── public_timelines_controller.rb
│   │   ├── relationships_controller.rb
│   │   ├── remote_follow_controller.rb
│   │   ├── remote_interaction_controller.rb
│   │   ├── remote_unfollows_controller.rb
│   │   ├── settings/
│   │   │   ├── applications_controller.rb
│   │   │   ├── base_controller.rb
│   │   │   ├── deletes_controller.rb
│   │   │   ├── exports/
│   │   │   │   ├── blocked_accounts_controller.rb
│   │   │   │   ├── blocked_domains_controller.rb
│   │   │   │   ├── following_accounts_controller.rb
│   │   │   │   ├── lists_controller.rb
│   │   │   │   └── muted_accounts_controller.rb
│   │   │   ├── exports_controller.rb
│   │   │   ├── featured_tags_controller.rb
│   │   │   ├── identity_proofs_controller.rb
│   │   │   ├── imports_controller.rb
│   │   │   ├── migrations_controller.rb
│   │   │   ├── preferences/
│   │   │   │   ├── appearance_controller.rb
│   │   │   │   ├── notifications_controller.rb
│   │   │   │   └── other_controller.rb
│   │   │   ├── preferences_controller.rb
│   │   │   ├── profiles_controller.rb
│   │   │   ├── sessions_controller.rb
│   │   │   ├── two_factor_authentication/
│   │   │   │   ├── confirmations_controller.rb
│   │   │   │   └── recovery_codes_controller.rb
│   │   │   └── two_factor_authentications_controller.rb
│   │   ├── shares_controller.rb
│   │   ├── statuses_controller.rb
│   │   ├── stream_entries_controller.rb
│   │   ├── tags_controller.rb
│   │   └── well_known/
│   │       ├── host_meta_controller.rb
│   │       ├── keybase_proof_config_controller.rb
│   │       └── webfinger_controller.rb
│   ├── helpers/
│   │   ├── admin/
│   │   │   ├── account_moderation_notes_helper.rb
│   │   │   ├── action_logs_helper.rb
│   │   │   ├── dashboard_helper.rb
│   │   │   └── filter_helper.rb
│   │   ├── application_helper.rb
│   │   ├── flashes_helper.rb
│   │   ├── home_helper.rb
│   │   ├── instance_helper.rb
│   │   ├── jsonld_helper.rb
│   │   ├── routing_helper.rb
│   │   ├── settings_helper.rb
│   │   └── stream_entries_helper.rb
│   ├── javascript/
│   │   ├── mastodon/
│   │   │   ├── actions/
│   │   │   │   ├── accounts.js
│   │   │   │   ├── alerts.js
│   │   │   │   ├── blocks.js
│   │   │   │   ├── bundles.js
│   │   │   │   ├── columns.js
│   │   │   │   ├── compose.js
│   │   │   │   ├── conversations.js
│   │   │   │   ├── custom_emojis.js
│   │   │   │   ├── domain_blocks.js
│   │   │   │   ├── dropdown_menu.js
│   │   │   │   ├── emojis.js
│   │   │   │   ├── favourites.js
│   │   │   │   ├── filters.js
│   │   │   │   ├── height_cache.js
│   │   │   │   ├── identity_proofs.js
│   │   │   │   ├── importer/
│   │   │   │   │   ├── index.js
│   │   │   │   │   └── normalizer.js
│   │   │   │   ├── interactions.js
│   │   │   │   ├── lists.js
│   │   │   │   ├── modal.js
│   │   │   │   ├── mutes.js
│   │   │   │   ├── notifications.js
│   │   │   │   ├── onboarding.js
│   │   │   │   ├── pin_statuses.js
│   │   │   │   ├── polls.js
│   │   │   │   ├── push_notifications/
│   │   │   │   │   ├── index.js
│   │   │   │   │   ├── registerer.js
│   │   │   │   │   └── setter.js
│   │   │   │   ├── reports.js
│   │   │   │   ├── search.js
│   │   │   │   ├── settings.js
│   │   │   │   ├── statuses.js
│   │   │   │   ├── store.js
│   │   │   │   ├── streaming.js
│   │   │   │   ├── suggestions.js
│   │   │   │   └── timelines.js
│   │   │   ├── api.js
│   │   │   ├── base_polyfills.js
│   │   │   ├── common.js
│   │   │   ├── compare_id.js
│   │   │   ├── components/
│   │   │   │   ├── __tests__/
│   │   │   │   │   ├── __snapshots__/
│   │   │   │   │   │   ├── autosuggest_emoji-test.js.snap
│   │   │   │   │   │   ├── avatar-test.js.snap
│   │   │   │   │   │   ├── avatar_overlay-test.js.snap
│   │   │   │   │   │   ├── button-test.js.snap
│   │   │   │   │   │   └── display_name-test.js.snap
│   │   │   │   │   ├── autosuggest_emoji-test.js
│   │   │   │   │   ├── avatar-test.js
│   │   │   │   │   ├── avatar_overlay-test.js
│   │   │   │   │   ├── button-test.js
│   │   │   │   │   └── display_name-test.js
│   │   │   │   ├── account.js
│   │   │   │   ├── attachment_list.js
│   │   │   │   ├── autosuggest_emoji.js
│   │   │   │   ├── autosuggest_input.js
│   │   │   │   ├── autosuggest_textarea.js
│   │   │   │   ├── avatar.js
│   │   │   │   ├── avatar_composite.js
│   │   │   │   ├── avatar_overlay.js
│   │   │   │   ├── button.js
│   │   │   │   ├── column.js
│   │   │   │   ├── column_back_button.js
│   │   │   │   ├── column_back_button_slim.js
│   │   │   │   ├── column_header.js
│   │   │   │   ├── display_name.js
│   │   │   │   ├── domain.js
│   │   │   │   ├── dropdown_menu.js
│   │   │   │   ├── error_boundary.js
│   │   │   │   ├── extended_video_player.js
│   │   │   │   ├── hashtag.js
│   │   │   │   ├── icon.js
│   │   │   │   ├── icon_button.js
│   │   │   │   ├── icon_with_badge.js
│   │   │   │   ├── intersection_observer_article.js
│   │   │   │   ├── load_gap.js
│   │   │   │   ├── load_more.js
│   │   │   │   ├── loading_indicator.js
│   │   │   │   ├── media_gallery.js
│   │   │   │   ├── missing_indicator.js
│   │   │   │   ├── modal_root.js
│   │   │   │   ├── permalink.js
│   │   │   │   ├── poll.js
│   │   │   │   ├── relative_timestamp.js
│   │   │   │   ├── scrollable_list.js
│   │   │   │   ├── setting_text.js
│   │   │   │   ├── status.js
│   │   │   │   ├── status_action_bar.js
│   │   │   │   ├── status_content.js
│   │   │   │   └── status_list.js
│   │   │   ├── containers/
│   │   │   │   ├── account_container.js
│   │   │   │   ├── compose_container.js
│   │   │   │   ├── domain_container.js
│   │   │   │   ├── dropdown_menu_container.js
│   │   │   │   ├── intersection_observer_article_container.js
│   │   │   │   ├── mastodon.js
│   │   │   │   ├── media_container.js
│   │   │   │   ├── poll_container.js
│   │   │   │   ├── status_container.js
│   │   │   │   └── timeline_container.js
│   │   │   ├── extra_polyfills.js
│   │   │   ├── features/
│   │   │   │   ├── account/
│   │   │   │   │   └── components/
│   │   │   │   │       └── header.js
│   │   │   │   ├── account_gallery/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   └── media_item.js
│   │   │   │   │   └── index.js
│   │   │   │   ├── account_timeline/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   ├── header.js
│   │   │   │   │   │   └── moved_note.js
│   │   │   │   │   ├── containers/
│   │   │   │   │   │   └── header_container.js
│   │   │   │   │   └── index.js
│   │   │   │   ├── blocks/
│   │   │   │   │   └── index.js
│   │   │   │   ├── community_timeline/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   └── column_settings.js
│   │   │   │   │   ├── containers/
│   │   │   │   │   │   └── column_settings_container.js
│   │   │   │   │   └── index.js
│   │   │   │   ├── compose/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   ├── action_bar.js
│   │   │   │   │   │   ├── autosuggest_account.js
│   │   │   │   │   │   ├── character_counter.js
│   │   │   │   │   │   ├── compose_form.js
│   │   │   │   │   │   ├── emoji_picker_dropdown.js
│   │   │   │   │   │   ├── navigation_bar.js
│   │   │   │   │   │   ├── poll_button.js
│   │   │   │   │   │   ├── poll_form.js
│   │   │   │   │   │   ├── privacy_dropdown.js
│   │   │   │   │   │   ├── reply_indicator.js
│   │   │   │   │   │   ├── search.js
│   │   │   │   │   │   ├── search_results.js
│   │   │   │   │   │   ├── text_icon_button.js
│   │   │   │   │   │   ├── upload.js
│   │   │   │   │   │   ├── upload_button.js
│   │   │   │   │   │   ├── upload_form.js
│   │   │   │   │   │   ├── upload_progress.js
│   │   │   │   │   │   └── warning.js
│   │   │   │   │   ├── containers/
│   │   │   │   │   │   ├── autosuggest_account_container.js
│   │   │   │   │   │   ├── compose_form_container.js
│   │   │   │   │   │   ├── emoji_picker_dropdown_container.js
│   │   │   │   │   │   ├── navigation_container.js
│   │   │   │   │   │   ├── poll_button_container.js
│   │   │   │   │   │   ├── poll_form_container.js
│   │   │   │   │   │   ├── privacy_dropdown_container.js
│   │   │   │   │   │   ├── reply_indicator_container.js
│   │   │   │   │   │   ├── search_container.js
│   │   │   │   │   │   ├── search_results_container.js
│   │   │   │   │   │   ├── sensitive_button_container.js
│   │   │   │   │   │   ├── spoiler_button_container.js
│   │   │   │   │   │   ├── upload_button_container.js
│   │   │   │   │   │   ├── upload_container.js
│   │   │   │   │   │   ├── upload_form_container.js
│   │   │   │   │   │   ├── upload_progress_container.js
│   │   │   │   │   │   └── warning_container.js
│   │   │   │   │   ├── index.js
│   │   │   │   │   └── util/
│   │   │   │   │       ├── counter.js
│   │   │   │   │       └── url_regex.js
│   │   │   │   ├── direct_timeline/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   ├── conversation.js
│   │   │   │   │   │   └── conversations_list.js
│   │   │   │   │   ├── containers/
│   │   │   │   │   │   ├── conversation_container.js
│   │   │   │   │   │   └── conversations_list_container.js
│   │   │   │   │   └── index.js
│   │   │   │   ├── domain_blocks/
│   │   │   │   │   └── index.js
│   │   │   │   ├── emoji/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── emoji-test.js
│   │   │   │   │   │   └── emoji_index-test.js
│   │   │   │   │   ├── emoji.js
│   │   │   │   │   ├── emoji_compressed.js
│   │   │   │   │   ├── emoji_map.json
│   │   │   │   │   ├── emoji_mart_data_light.js
│   │   │   │   │   ├── emoji_mart_search_light.js
│   │   │   │   │   ├── emoji_picker.js
│   │   │   │   │   ├── emoji_unicode_mapping_light.js
│   │   │   │   │   ├── emoji_utils.js
│   │   │   │   │   ├── unicode_to_filename.js
│   │   │   │   │   └── unicode_to_unified_name.js
│   │   │   │   ├── favourited_statuses/
│   │   │   │   │   └── index.js
│   │   │   │   ├── favourites/
│   │   │   │   │   └── index.js
│   │   │   │   ├── follow_requests/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   └── account_authorize.js
│   │   │   │   │   ├── containers/
│   │   │   │   │   │   └── account_authorize_container.js
│   │   │   │   │   └── index.js
│   │   │   │   ├── followers/
│   │   │   │   │   └── index.js
│   │   │   │   ├── following/
│   │   │   │   │   └── index.js
│   │   │   │   ├── generic_not_found/
│   │   │   │   │   └── index.js
│   │   │   │   ├── getting_started/
│   │   │   │   │   └── index.js
│   │   │   │   ├── hashtag_timeline/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   └── column_settings.js
│   │   │   │   │   ├── containers/
│   │   │   │   │   │   └── column_settings_container.js
│   │   │   │   │   └── index.js
│   │   │   │   ├── home_timeline/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   └── column_settings.js
│   │   │   │   │   ├── containers/
│   │   │   │   │   │   └── column_settings_container.js
│   │   │   │   │   └── index.js
│   │   │   │   ├── introduction/
│   │   │   │   │   └── index.js
│   │   │   │   ├── keyboard_shortcuts/
│   │   │   │   │   └── index.js
│   │   │   │   ├── list_adder/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   ├── account.js
│   │   │   │   │   │   └── list.js
│   │   │   │   │   └── index.js
│   │   │   │   ├── list_editor/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   ├── account.js
│   │   │   │   │   │   ├── edit_list_form.js
│   │   │   │   │   │   └── search.js
│   │   │   │   │   └── index.js
│   │   │   │   ├── list_timeline/
│   │   │   │   │   └── index.js
│   │   │   │   ├── lists/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   └── new_list_form.js
│   │   │   │   │   └── index.js
│   │   │   │   ├── mutes/
│   │   │   │   │   └── index.js
│   │   │   │   ├── notifications/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   ├── clear_column_button.js
│   │   │   │   │   │   ├── column_settings.js
│   │   │   │   │   │   ├── filter_bar.js
│   │   │   │   │   │   ├── notification.js
│   │   │   │   │   │   └── setting_toggle.js
│   │   │   │   │   ├── containers/
│   │   │   │   │   │   ├── column_settings_container.js
│   │   │   │   │   │   ├── filter_bar_container.js
│   │   │   │   │   │   └── notification_container.js
│   │   │   │   │   └── index.js
│   │   │   │   ├── pinned_statuses/
│   │   │   │   │   └── index.js
│   │   │   │   ├── public_timeline/
│   │   │   │   │   ├── containers/
│   │   │   │   │   │   └── column_settings_container.js
│   │   │   │   │   └── index.js
│   │   │   │   ├── reblogs/
│   │   │   │   │   └── index.js
│   │   │   │   ├── report/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   └── status_check_box.js
│   │   │   │   │   └── containers/
│   │   │   │   │       └── status_check_box_container.js
│   │   │   │   ├── search/
│   │   │   │   │   └── index.js
│   │   │   │   ├── standalone/
│   │   │   │   │   ├── compose/
│   │   │   │   │   │   └── index.js
│   │   │   │   │   ├── hashtag_timeline/
│   │   │   │   │   │   └── index.js
│   │   │   │   │   └── public_timeline/
│   │   │   │   │       └── index.js
│   │   │   │   ├── status/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   ├── action_bar.js
│   │   │   │   │   │   ├── card.js
│   │   │   │   │   │   └── detailed_status.js
│   │   │   │   │   ├── containers/
│   │   │   │   │   │   └── detailed_status_container.js
│   │   │   │   │   └── index.js
│   │   │   │   ├── ui/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   └── column-test.js
│   │   │   │   │   │   ├── actions_modal.js
│   │   │   │   │   │   ├── boost_modal.js
│   │   │   │   │   │   ├── bundle.js
│   │   │   │   │   │   ├── bundle_column_error.js
│   │   │   │   │   │   ├── bundle_modal_error.js
│   │   │   │   │   │   ├── column.js
│   │   │   │   │   │   ├── column_header.js
│   │   │   │   │   │   ├── column_link.js
│   │   │   │   │   │   ├── column_loading.js
│   │   │   │   │   │   ├── column_subheading.js
│   │   │   │   │   │   ├── columns_area.js
│   │   │   │   │   │   ├── compose_panel.js
│   │   │   │   │   │   ├── confirmation_modal.js
│   │   │   │   │   │   ├── drawer_loading.js
│   │   │   │   │   │   ├── embed_modal.js
│   │   │   │   │   │   ├── focal_point_modal.js
│   │   │   │   │   │   ├── follow_requests_nav_link.js
│   │   │   │   │   │   ├── image_loader.js
│   │   │   │   │   │   ├── link_footer.js
│   │   │   │   │   │   ├── list_panel.js
│   │   │   │   │   │   ├── media_modal.js
│   │   │   │   │   │   ├── modal_loading.js
│   │   │   │   │   │   ├── modal_root.js
│   │   │   │   │   │   ├── mute_modal.js
│   │   │   │   │   │   ├── navigation_panel.js
│   │   │   │   │   │   ├── notifications_counter_icon.js
│   │   │   │   │   │   ├── report_modal.js
│   │   │   │   │   │   ├── tabs_bar.js
│   │   │   │   │   │   ├── upload_area.js
│   │   │   │   │   │   ├── video_modal.js
│   │   │   │   │   │   └── zoomable_image.js
│   │   │   │   │   ├── containers/
│   │   │   │   │   │   ├── bundle_container.js
│   │   │   │   │   │   ├── columns_area_container.js
│   │   │   │   │   │   ├── loading_bar_container.js
│   │   │   │   │   │   ├── modal_container.js
│   │   │   │   │   │   ├── notifications_container.js
│   │   │   │   │   │   └── status_list_container.js
│   │   │   │   │   ├── index.js
│   │   │   │   │   └── util/
│   │   │   │   │       ├── async-components.js
│   │   │   │   │       ├── fullscreen.js
│   │   │   │   │       ├── get_rect_from_entry.js
│   │   │   │   │       ├── intersection_observer_wrapper.js
│   │   │   │   │       ├── optional_motion.js
│   │   │   │   │       ├── react_router_helpers.js
│   │   │   │   │       ├── reduced_motion.js
│   │   │   │   │       └── schedule_idle_task.js
│   │   │   │   └── video/
│   │   │   │       └── index.js
│   │   │   ├── initial_state.js
│   │   │   ├── is_mobile.js
│   │   │   ├── load_polyfills.js
│   │   │   ├── locales/
│   │   │   │   ├── ar.json
│   │   │   │   ├── ast.json
│   │   │   │   ├── bg.json
│   │   │   │   ├── bn.json
│   │   │   │   ├── ca.json
│   │   │   │   ├── co.json
│   │   │   │   ├── cs.json
│   │   │   │   ├── cy.json
│   │   │   │   ├── da.json
│   │   │   │   ├── de.json
│   │   │   │   ├── defaultMessages.json
│   │   │   │   ├── el.json
│   │   │   │   ├── en.json
│   │   │   │   ├── eo.json
│   │   │   │   ├── es.json
│   │   │   │   ├── eu.json
│   │   │   │   ├── fa.json
│   │   │   │   ├── fi.json
│   │   │   │   ├── fr.json
│   │   │   │   ├── gl.json
│   │   │   │   ├── he.json
│   │   │   │   ├── hi.json
│   │   │   │   ├── hr.json
│   │   │   │   ├── hu.json
│   │   │   │   ├── hy.json
│   │   │   │   ├── id.json
│   │   │   │   ├── index.js
│   │   │   │   ├── io.json
│   │   │   │   ├── it.json
│   │   │   │   ├── ja.json
│   │   │   │   ├── ka.json
│   │   │   │   ├── kk.json
│   │   │   │   ├── ko.json
│   │   │   │   ├── locale-data/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── co.js
│   │   │   │   │   └── oc.js
│   │   │   │   ├── lt.json
│   │   │   │   ├── lv.json
│   │   │   │   ├── ms.json
│   │   │   │   ├── nl.json
│   │   │   │   ├── no.json
│   │   │   │   ├── oc.json
│   │   │   │   ├── pl.json
│   │   │   │   ├── pt-BR.json
│   │   │   │   ├── pt.json
│   │   │   │   ├── ro.json
│   │   │   │   ├── ru.json
│   │   │   │   ├── sk.json
│   │   │   │   ├── sl.json
│   │   │   │   ├── sq.json
│   │   │   │   ├── sr-Latn.json
│   │   │   │   ├── sr.json
│   │   │   │   ├── sv.json
│   │   │   │   ├── ta.json
│   │   │   │   ├── te.json
│   │   │   │   ├── th.json
│   │   │   │   ├── tr.json
│   │   │   │   ├── uk.json
│   │   │   │   ├── whitelist_ar.json
│   │   │   │   ├── whitelist_ast.json
│   │   │   │   ├── whitelist_bg.json
│   │   │   │   ├── whitelist_bn.json
│   │   │   │   ├── whitelist_ca.json
│   │   │   │   ├── whitelist_co.json
│   │   │   │   ├── whitelist_cs.json
│   │   │   │   ├── whitelist_cy.json
│   │   │   │   ├── whitelist_da.json
│   │   │   │   ├── whitelist_de.json
│   │   │   │   ├── whitelist_el.json
│   │   │   │   ├── whitelist_en.json
│   │   │   │   ├── whitelist_eo.json
│   │   │   │   ├── whitelist_es.json
│   │   │   │   ├── whitelist_eu.json
│   │   │   │   ├── whitelist_fa.json
│   │   │   │   ├── whitelist_fi.json
│   │   │   │   ├── whitelist_fr.json
│   │   │   │   ├── whitelist_gl.json
│   │   │   │   ├── whitelist_he.json
│   │   │   │   ├── whitelist_hi.json
│   │   │   │   ├── whitelist_hr.json
│   │   │   │   ├── whitelist_hu.json
│   │   │   │   ├── whitelist_hy.json
│   │   │   │   ├── whitelist_id.json
│   │   │   │   ├── whitelist_io.json
│   │   │   │   ├── whitelist_it.json
│   │   │   │   ├── whitelist_ja.json
│   │   │   │   ├── whitelist_ka.json
│   │   │   │   ├── whitelist_kk.json
│   │   │   │   ├── whitelist_ko.json
│   │   │   │   ├── whitelist_lt.json
│   │   │   │   ├── whitelist_lv.json
│   │   │   │   ├── whitelist_ms.json
│   │   │   │   ├── whitelist_nl.json
│   │   │   │   ├── whitelist_no.json
│   │   │   │   ├── whitelist_oc.json
│   │   │   │   ├── whitelist_pl.json
│   │   │   │   ├── whitelist_pt-BR.json
│   │   │   │   ├── whitelist_pt.json
│   │   │   │   ├── whitelist_ro.json
│   │   │   │   ├── whitelist_ru.json
│   │   │   │   ├── whitelist_sk.json
│   │   │   │   ├── whitelist_sl.json
│   │   │   │   ├── whitelist_sq.json
│   │   │   │   ├── whitelist_sr-Latn.json
│   │   │   │   ├── whitelist_sr.json
│   │   │   │   ├── whitelist_sv.json
│   │   │   │   ├── whitelist_ta.json
│   │   │   │   ├── whitelist_te.json
│   │   │   │   ├── whitelist_th.json
│   │   │   │   ├── whitelist_tr.json
│   │   │   │   ├── whitelist_uk.json
│   │   │   │   ├── whitelist_zh-CN.json
│   │   │   │   ├── whitelist_zh-HK.json
│   │   │   │   ├── whitelist_zh-TW.json
│   │   │   │   ├── zh-CN.json
│   │   │   │   ├── zh-HK.json
│   │   │   │   └── zh-TW.json
│   │   │   ├── main.js
│   │   │   ├── middleware/
│   │   │   │   ├── errors.js
│   │   │   │   ├── loading_bar.js
│   │   │   │   └── sounds.js
│   │   │   ├── performance.js
│   │   │   ├── ready.js
│   │   │   ├── reducers/
│   │   │   │   ├── accounts.js
│   │   │   │   ├── accounts_counters.js
│   │   │   │   ├── alerts.js
│   │   │   │   ├── compose.js
│   │   │   │   ├── contexts.js
│   │   │   │   ├── conversations.js
│   │   │   │   ├── custom_emojis.js
│   │   │   │   ├── domain_lists.js
│   │   │   │   ├── dropdown_menu.js
│   │   │   │   ├── filters.js
│   │   │   │   ├── height_cache.js
│   │   │   │   ├── identity_proofs.js
│   │   │   │   ├── index.js
│   │   │   │   ├── list_adder.js
│   │   │   │   ├── list_editor.js
│   │   │   │   ├── lists.js
│   │   │   │   ├── media_attachments.js
│   │   │   │   ├── meta.js
│   │   │   │   ├── modal.js
│   │   │   │   ├── mutes.js
│   │   │   │   ├── notifications.js
│   │   │   │   ├── polls.js
│   │   │   │   ├── push_notifications.js
│   │   │   │   ├── relationships.js
│   │   │   │   ├── reports.js
│   │   │   │   ├── search.js
│   │   │   │   ├── settings.js
│   │   │   │   ├── status_lists.js
│   │   │   │   ├── statuses.js
│   │   │   │   ├── suggestions.js
│   │   │   │   ├── timelines.js
│   │   │   │   └── user_lists.js
│   │   │   ├── rtl.js
│   │   │   ├── scroll.js
│   │   │   ├── selectors/
│   │   │   │   └── index.js
│   │   │   ├── service_worker/
│   │   │   │   ├── entry.js
│   │   │   │   ├── web_push_locales.js
│   │   │   │   └── web_push_notifications.js
│   │   │   ├── settings.js
│   │   │   ├── storage/
│   │   │   │   ├── db.js
│   │   │   │   └── modifier.js
│   │   │   ├── store/
│   │   │   │   └── configureStore.js
│   │   │   ├── stream.js
│   │   │   ├── test_setup.js
│   │   │   ├── utils/
│   │   │   │   ├── __tests__/
│   │   │   │   │   ├── base64-test.js
│   │   │   │   │   └── html-test.js
│   │   │   │   ├── base64.js
│   │   │   │   ├── html.js
│   │   │   │   ├── numbers.js
│   │   │   │   └── resize_image.js
│   │   │   └── uuid.js
│   │   ├── packs/
│   │   │   ├── about.js
│   │   │   ├── admin.js
│   │   │   ├── application.js
│   │   │   ├── error.js
│   │   │   ├── mailer.js
│   │   │   ├── public.js
│   │   │   └── share.js
│   │   └── styles/
│   │       ├── application.scss
│   │       ├── contrast/
│   │       │   ├── diff.scss
│   │       │   └── variables.scss
│   │       ├── contrast.scss
│   │       ├── fonts/
│   │       │   ├── montserrat.scss
│   │       │   ├── roboto-mono.scss
│   │       │   └── roboto.scss
│   │       ├── mailer.scss
│   │       ├── mastodon/
│   │       │   ├── _mixins.scss
│   │       │   ├── about.scss
│   │       │   ├── accessibility.scss
│   │       │   ├── accounts.scss
│   │       │   ├── admin.scss
│   │       │   ├── basics.scss
│   │       │   ├── boost.scss
│   │       │   ├── compact_header.scss
│   │       │   ├── components.scss
│   │       │   ├── containers.scss
│   │       │   ├── dashboard.scss
│   │       │   ├── emoji_picker.scss
│   │       │   ├── footer.scss
│   │       │   ├── forms.scss
│   │       │   ├── introduction.scss
│   │       │   ├── lists.scss
│   │       │   ├── modal.scss
│   │       │   ├── polls.scss
│   │       │   ├── reset.scss
│   │       │   ├── rtl.scss
│   │       │   ├── stream_entries.scss
│   │       │   ├── tables.scss
│   │       │   ├── variables.scss
│   │       │   └── widgets.scss
│   │       ├── mastodon-light/
│   │       │   ├── diff.scss
│   │       │   └── variables.scss
│   │       └── mastodon-light.scss
│   ├── lib/
│   │   ├── activity_tracker.rb
│   │   ├── activitypub/
│   │   │   ├── activity/
│   │   │   │   ├── accept.rb
│   │   │   │   ├── add.rb
│   │   │   │   ├── announce.rb
│   │   │   │   ├── block.rb
│   │   │   │   ├── create.rb
│   │   │   │   ├── delete.rb
│   │   │   │   ├── flag.rb
│   │   │   │   ├── follow.rb
│   │   │   │   ├── like.rb
│   │   │   │   ├── move.rb
│   │   │   │   ├── reject.rb
│   │   │   │   ├── remove.rb
│   │   │   │   ├── undo.rb
│   │   │   │   └── update.rb
│   │   │   ├── activity.rb
│   │   │   ├── adapter.rb
│   │   │   ├── case_transform.rb
│   │   │   ├── linked_data_signature.rb
│   │   │   ├── serializer.rb
│   │   │   └── tag_manager.rb
│   │   ├── application_extension.rb
│   │   ├── delivery_failure_tracker.rb
│   │   ├── entity_cache.rb
│   │   ├── exceptions.rb
│   │   ├── extractor.rb
│   │   ├── fast_geometry_parser.rb
│   │   ├── feed_manager.rb
│   │   ├── formatter.rb
│   │   ├── hash_object.rb
│   │   ├── inline_renderer.rb
│   │   ├── language_detector.rb
│   │   ├── ostatus/
│   │   │   ├── activity/
│   │   │   │   ├── base.rb
│   │   │   │   ├── creation.rb
│   │   │   │   ├── deletion.rb
│   │   │   │   ├── general.rb
│   │   │   │   ├── post.rb
│   │   │   │   ├── remote.rb
│   │   │   │   └── share.rb
│   │   │   ├── atom_serializer.rb
│   │   │   └── tag_manager.rb
│   │   ├── potential_friendship_tracker.rb
│   │   ├── proof_provider/
│   │   │   ├── keybase/
│   │   │   │   ├── badge.rb
│   │   │   │   ├── config_serializer.rb
│   │   │   │   ├── serializer.rb
│   │   │   │   ├── verifier.rb
│   │   │   │   └── worker.rb
│   │   │   └── keybase.rb
│   │   ├── proof_provider.rb
│   │   ├── request.rb
│   │   ├── rss_builder.rb
│   │   ├── sanitize_config.rb
│   │   ├── settings/
│   │   │   ├── extend.rb
│   │   │   └── scoped_settings.rb
│   │   ├── sidekiq_error_handler.rb
│   │   ├── status_filter.rb
│   │   ├── status_finder.rb
│   │   ├── tag_manager.rb
│   │   ├── themes.rb
│   │   ├── user_settings_decorator.rb
│   │   └── webfinger_resource.rb
│   ├── mailers/
│   │   ├── admin_mailer.rb
│   │   ├── application_mailer.rb
│   │   ├── notification_mailer.rb
│   │   └── user_mailer.rb
│   ├── models/
│   │   ├── account.rb
│   │   ├── account_conversation.rb
│   │   ├── account_domain_block.rb
│   │   ├── account_filter.rb
│   │   ├── account_identity_proof.rb
│   │   ├── account_moderation_note.rb
│   │   ├── account_pin.rb
│   │   ├── account_stat.rb
│   │   ├── account_tag_stat.rb
│   │   ├── account_warning.rb
│   │   ├── account_warning_preset.rb
│   │   ├── admin/
│   │   │   ├── account_action.rb
│   │   │   └── action_log.rb
│   │   ├── admin.rb
│   │   ├── application_record.rb
│   │   ├── backup.rb
│   │   ├── block.rb
│   │   ├── concerns/
│   │   │   ├── account_associations.rb
│   │   │   ├── account_avatar.rb
│   │   │   ├── account_counters.rb
│   │   │   ├── account_finder_concern.rb
│   │   │   ├── account_header.rb
│   │   │   ├── account_interactions.rb
│   │   │   ├── attachmentable.rb
│   │   │   ├── cacheable.rb
│   │   │   ├── domain_normalizable.rb
│   │   │   ├── expireable.rb
│   │   │   ├── ldap_authenticable.rb
│   │   │   ├── omniauthable.rb
│   │   │   ├── paginable.rb
│   │   │   ├── pam_authenticable.rb
│   │   │   ├── redisable.rb
│   │   │   ├── relationship_cacheable.rb
│   │   │   ├── remotable.rb
│   │   │   ├── status_threading_concern.rb
│   │   │   ├── streamable.rb
│   │   │   └── user_roles.rb
│   │   ├── context.rb
│   │   ├── conversation.rb
│   │   ├── conversation_mute.rb
│   │   ├── custom_emoji.rb
│   │   ├── custom_emoji_filter.rb
│   │   ├── custom_filter.rb
│   │   ├── domain_block.rb
│   │   ├── email_domain_block.rb
│   │   ├── export.rb
│   │   ├── favourite.rb
│   │   ├── featured_tag.rb
│   │   ├── feed.rb
│   │   ├── follow.rb
│   │   ├── follow_request.rb
│   │   ├── form/
│   │   │   ├── account_batch.rb
│   │   │   ├── admin_settings.rb
│   │   │   ├── delete_confirmation.rb
│   │   │   ├── migration.rb
│   │   │   ├── status_batch.rb
│   │   │   └── two_factor_confirmation.rb
│   │   ├── home_feed.rb
│   │   ├── identity.rb
│   │   ├── import.rb
│   │   ├── instance.rb
│   │   ├── instance_filter.rb
│   │   ├── invite.rb
│   │   ├── invite_filter.rb
│   │   ├── list.rb
│   │   ├── list_account.rb
│   │   ├── list_feed.rb
│   │   ├── media_attachment.rb
│   │   ├── mention.rb
│   │   ├── mute.rb
│   │   ├── notification.rb
│   │   ├── poll.rb
│   │   ├── poll_vote.rb
│   │   ├── preview_card.rb
│   │   ├── relay.rb
│   │   ├── remote_follow.rb
│   │   ├── remote_profile.rb
│   │   ├── report.rb
│   │   ├── report_filter.rb
│   │   ├── report_note.rb
│   │   ├── scheduled_status.rb
│   │   ├── search.rb
│   │   ├── session_activation.rb
│   │   ├── setting.rb
│   │   ├── site_upload.rb
│   │   ├── status.rb
│   │   ├── status_pin.rb
│   │   ├── status_stat.rb
│   │   ├── stream_entry.rb
│   │   ├── subscription.rb
│   │   ├── tag.rb
│   │   ├── tombstone.rb
│   │   ├── trending_tags.rb
│   │   ├── user.rb
│   │   ├── user_invite_request.rb
│   │   ├── web/
│   │   │   ├── push_subscription.rb
│   │   │   └── setting.rb
│   │   └── web.rb
│   ├── policies/
│   │   ├── account_moderation_note_policy.rb
│   │   ├── account_policy.rb
│   │   ├── account_warning_preset_policy.rb
│   │   ├── application_policy.rb
│   │   ├── backup_policy.rb
│   │   ├── custom_emoji_policy.rb
│   │   ├── domain_block_policy.rb
│   │   ├── email_domain_block_policy.rb
│   │   ├── instance_policy.rb
│   │   ├── invite_policy.rb
│   │   ├── poll_policy.rb
│   │   ├── relay_policy.rb
│   │   ├── report_note_policy.rb
│   │   ├── report_policy.rb
│   │   ├── settings_policy.rb
│   │   ├── status_policy.rb
│   │   ├── subscription_policy.rb
│   │   ├── tag_policy.rb
│   │   └── user_policy.rb
│   ├── presenters/
│   │   ├── account_relationships_presenter.rb
│   │   ├── activitypub/
│   │   │   └── collection_presenter.rb
│   │   ├── initial_state_presenter.rb
│   │   ├── instance_presenter.rb
│   │   └── status_relationships_presenter.rb
│   ├── serializers/
│   │   ├── activitypub/
│   │   │   ├── accept_follow_serializer.rb
│   │   │   ├── activity_serializer.rb
│   │   │   ├── actor_serializer.rb
│   │   │   ├── add_serializer.rb
│   │   │   ├── block_serializer.rb
│   │   │   ├── collection_serializer.rb
│   │   │   ├── delete_actor_serializer.rb
│   │   │   ├── delete_serializer.rb
│   │   │   ├── emoji_serializer.rb
│   │   │   ├── flag_serializer.rb
│   │   │   ├── follow_serializer.rb
│   │   │   ├── image_serializer.rb
│   │   │   ├── like_serializer.rb
│   │   │   ├── note_serializer.rb
│   │   │   ├── outbox_serializer.rb
│   │   │   ├── public_key_serializer.rb
│   │   │   ├── reject_follow_serializer.rb
│   │   │   ├── remove_serializer.rb
│   │   │   ├── undo_announce_serializer.rb
│   │   │   ├── undo_block_serializer.rb
│   │   │   ├── undo_follow_serializer.rb
│   │   │   ├── undo_like_serializer.rb
│   │   │   ├── update_poll_serializer.rb
│   │   │   ├── update_serializer.rb
│   │   │   └── vote_serializer.rb
│   │   ├── initial_state_serializer.rb
│   │   ├── manifest_serializer.rb
│   │   ├── oembed_serializer.rb
│   │   ├── rest/
│   │   │   ├── account_serializer.rb
│   │   │   ├── application_serializer.rb
│   │   │   ├── context_serializer.rb
│   │   │   ├── conversation_serializer.rb
│   │   │   ├── credential_account_serializer.rb
│   │   │   ├── custom_emoji_serializer.rb
│   │   │   ├── filter_serializer.rb
│   │   │   ├── identity_proof_serializer.rb
│   │   │   ├── instance_serializer.rb
│   │   │   ├── list_serializer.rb
│   │   │   ├── media_attachment_serializer.rb
│   │   │   ├── notification_serializer.rb
│   │   │   ├── poll_serializer.rb
│   │   │   ├── preferences_serializer.rb
│   │   │   ├── preview_card_serializer.rb
│   │   │   ├── relationship_serializer.rb
│   │   │   ├── report_serializer.rb
│   │   │   ├── scheduled_status_serializer.rb
│   │   │   ├── search_serializer.rb
│   │   │   ├── status_serializer.rb
│   │   │   ├── tag_serializer.rb
│   │   │   ├── v2/
│   │   │   │   └── search_serializer.rb
│   │   │   └── web_push_subscription_serializer.rb
│   │   ├── rss/
│   │   │   ├── account_serializer.rb
│   │   │   └── tag_serializer.rb
│   │   ├── web/
│   │   │   └── notification_serializer.rb
│   │   └── webfinger_serializer.rb
│   ├── services/
│   │   ├── account_search_service.rb
│   │   ├── activitypub/
│   │   │   ├── fetch_featured_collection_service.rb
│   │   │   ├── fetch_remote_account_service.rb
│   │   │   ├── fetch_remote_key_service.rb
│   │   │   ├── fetch_remote_poll_service.rb
│   │   │   ├── fetch_remote_status_service.rb
│   │   │   ├── fetch_replies_service.rb
│   │   │   ├── process_account_service.rb
│   │   │   ├── process_collection_service.rb
│   │   │   └── process_poll_service.rb
│   │   ├── after_block_domain_from_account_service.rb
│   │   ├── after_block_service.rb
│   │   ├── app_sign_up_service.rb
│   │   ├── authorize_follow_service.rb
│   │   ├── backup_service.rb
│   │   ├── base_service.rb
│   │   ├── batched_remove_status_service.rb
│   │   ├── block_domain_service.rb
│   │   ├── block_service.rb
│   │   ├── bootstrap_timeline_service.rb
│   │   ├── concerns/
│   │   │   ├── author_extractor.rb
│   │   │   ├── payloadable.rb
│   │   │   └── stream_entry_renderer.rb
│   │   ├── fan_out_on_write_service.rb
│   │   ├── favourite_service.rb
│   │   ├── fetch_atom_service.rb
│   │   ├── fetch_link_card_service.rb
│   │   ├── fetch_oembed_service.rb
│   │   ├── fetch_remote_account_service.rb
│   │   ├── fetch_remote_status_service.rb
│   │   ├── follow_service.rb
│   │   ├── hashtag_query_service.rb
│   │   ├── import_service.rb
│   │   ├── mute_service.rb
│   │   ├── notify_service.rb
│   │   ├── post_status_service.rb
│   │   ├── precompute_feed_service.rb
│   │   ├── process_feed_service.rb
│   │   ├── process_hashtags_service.rb
│   │   ├── process_interaction_service.rb
│   │   ├── process_mentions_service.rb
│   │   ├── pubsubhubbub/
│   │   │   ├── subscribe_service.rb
│   │   │   └── unsubscribe_service.rb
│   │   ├── reblog_service.rb
│   │   ├── reject_follow_service.rb
│   │   ├── remove_status_service.rb
│   │   ├── report_service.rb
│   │   ├── resolve_account_service.rb
│   │   ├── resolve_url_service.rb
│   │   ├── search_service.rb
│   │   ├── send_interaction_service.rb
│   │   ├── subscribe_service.rb
│   │   ├── suspend_account_service.rb
│   │   ├── unblock_domain_service.rb
│   │   ├── unblock_service.rb
│   │   ├── unfavourite_service.rb
│   │   ├── unfollow_service.rb
│   │   ├── unmute_service.rb
│   │   ├── unsubscribe_service.rb
│   │   ├── update_account_service.rb
│   │   ├── update_remote_profile_service.rb
│   │   ├── verify_link_service.rb
│   │   ├── verify_salmon_service.rb
│   │   └── vote_service.rb
│   ├── validators/
│   │   ├── blacklisted_email_validator.rb
│   │   ├── disallowed_hashtags_validator.rb
│   │   ├── email_mx_validator.rb
│   │   ├── existing_username_validator.rb
│   │   ├── follow_limit_validator.rb
│   │   ├── html_validator.rb
│   │   ├── note_length_validator.rb
│   │   ├── poll_validator.rb
│   │   ├── status_length_validator.rb
│   │   ├── status_pin_validator.rb
│   │   ├── unique_username_validator.rb
│   │   ├── unreserved_username_validator.rb
│   │   ├── url_validator.rb
│   │   └── vote_validator.rb
│   ├── views/
│   │   ├── about/
│   │   │   ├── _login.html.haml
│   │   │   ├── _registration.html.haml
│   │   │   ├── more.html.haml
│   │   │   ├── show.html.haml
│   │   │   └── terms.html.haml
│   │   ├── accounts/
│   │   │   ├── _bio.html.haml
│   │   │   ├── _header.html.haml
│   │   │   ├── _moved.html.haml
│   │   │   ├── _og.html.haml
│   │   │   └── show.html.haml
│   │   ├── admin/
│   │   │   ├── account_actions/
│   │   │   │   └── new.html.haml
│   │   │   ├── account_moderation_notes/
│   │   │   │   └── _account_moderation_note.html.haml
│   │   │   ├── account_warnings/
│   │   │   │   └── _account_warning.html.haml
│   │   │   ├── accounts/
│   │   │   │   ├── _account.html.haml
│   │   │   │   ├── index.html.haml
│   │   │   │   └── show.html.haml
│   │   │   ├── action_logs/
│   │   │   │   ├── _action_log.html.haml
│   │   │   │   └── index.html.haml
│   │   │   ├── change_emails/
│   │   │   │   └── show.html.haml
│   │   │   ├── custom_emojis/
│   │   │   │   ├── _custom_emoji.html.haml
│   │   │   │   ├── index.html.haml
│   │   │   │   └── new.html.haml
│   │   │   ├── dashboard/
│   │   │   │   └── index.html.haml
│   │   │   ├── domain_blocks/
│   │   │   │   ├── new.html.haml
│   │   │   │   └── show.html.haml
│   │   │   ├── email_domain_blocks/
│   │   │   │   ├── _email_domain_block.html.haml
│   │   │   │   ├── index.html.haml
│   │   │   │   └── new.html.haml
│   │   │   ├── followers/
│   │   │   │   └── index.html.haml
│   │   │   ├── instances/
│   │   │   │   ├── index.html.haml
│   │   │   │   └── show.html.haml
│   │   │   ├── invites/
│   │   │   │   ├── _invite.html.haml
│   │   │   │   └── index.html.haml
│   │   │   ├── pending_accounts/
│   │   │   │   ├── _account.html.haml
│   │   │   │   └── index.html.haml
│   │   │   ├── relays/
│   │   │   │   ├── _relay.html.haml
│   │   │   │   ├── index.html.haml
│   │   │   │   └── new.html.haml
│   │   │   ├── report_notes/
│   │   │   │   └── _report_note.html.haml
│   │   │   ├── reports/
│   │   │   │   ├── _action_log.html.haml
│   │   │   │   ├── _status.html.haml
│   │   │   │   ├── index.html.haml
│   │   │   │   └── show.html.haml
│   │   │   ├── settings/
│   │   │   │   └── edit.html.haml
│   │   │   ├── statuses/
│   │   │   │   ├── index.html.haml
│   │   │   │   └── show.html.haml
│   │   │   ├── subscriptions/
│   │   │   │   ├── _subscription.html.haml
│   │   │   │   └── index.html.haml
│   │   │   ├── tags/
│   │   │   │   ├── _tag.html.haml
│   │   │   │   └── index.html.haml
│   │   │   └── warning_presets/
│   │   │       ├── edit.html.haml
│   │   │       └── index.html.haml
│   │   ├── admin_mailer/
│   │   │   ├── new_pending_account.text.erb
│   │   │   └── new_report.text.erb
│   │   ├── application/
│   │   │   ├── _card.html.haml
│   │   │   ├── _flashes.html.haml
│   │   │   └── _sidebar.html.haml
│   │   ├── auth/
│   │   │   ├── confirmations/
│   │   │   │   ├── finish_signup.html.haml
│   │   │   │   └── new.html.haml
│   │   │   ├── passwords/
│   │   │   │   ├── edit.html.haml
│   │   │   │   └── new.html.haml
│   │   │   ├── registrations/
│   │   │   │   ├── _sessions.html.haml
│   │   │   │   ├── edit.html.haml
│   │   │   │   └── new.html.haml
│   │   │   ├── sessions/
│   │   │   │   ├── new.html.haml
│   │   │   │   └── two_factor.html.haml
│   │   │   └── shared/
│   │   │       └── _links.html.haml
│   │   ├── authorize_interactions/
│   │   │   ├── _post_follow_actions.html.haml
│   │   │   ├── error.html.haml
│   │   │   ├── show.html.haml
│   │   │   └── success.html.haml
│   │   ├── directories/
│   │   │   └── index.html.haml
│   │   ├── errors/
│   │   │   ├── 403.html.haml
│   │   │   ├── 404.html.haml
│   │   │   ├── 410.html.haml
│   │   │   ├── 422.html.haml
│   │   │   └── 500.html.haml
│   │   ├── filters/
│   │   │   ├── _fields.html.haml
│   │   │   ├── edit.html.haml
│   │   │   ├── index.html.haml
│   │   │   └── new.html.haml
│   │   ├── follower_accounts/
│   │   │   └── index.html.haml
│   │   ├── following_accounts/
│   │   │   └── index.html.haml
│   │   ├── home/
│   │   │   └── index.html.haml
│   │   ├── invites/
│   │   │   ├── _form.html.haml
│   │   │   ├── _invite.html.haml
│   │   │   └── index.html.haml
│   │   ├── kaminari/
│   │   │   ├── _next_page.html.haml
│   │   │   ├── _paginator.html.haml
│   │   │   └── _prev_page.html.haml
│   │   ├── layouts/
│   │   │   ├── admin.html.haml
│   │   │   ├── application.html.haml
│   │   │   ├── auth.html.haml
│   │   │   ├── embedded.html.haml
│   │   │   ├── error.html.haml
│   │   │   ├── mailer.html.haml
│   │   │   ├── mailer.text.erb
│   │   │   ├── modal.html.haml
│   │   │   ├── plain_mailer.html.haml
│   │   │   └── public.html.haml
│   │   ├── media/
│   │   │   └── player.html.haml
│   │   ├── notification_mailer/
│   │   │   ├── _status.html.haml
│   │   │   ├── _status.text.erb
│   │   │   ├── digest.html.haml
│   │   │   ├── digest.text.erb
│   │   │   ├── favourite.html.haml
│   │   │   ├── favourite.text.erb
│   │   │   ├── follow.html.haml
│   │   │   ├── follow.text.erb
│   │   │   ├── follow_request.html.haml
│   │   │   ├── follow_request.text.erb
│   │   │   ├── mention.html.haml
│   │   │   ├── mention.text.erb
│   │   │   ├── reblog.html.haml
│   │   │   └── reblog.text.erb
│   │   ├── oauth/
│   │   │   ├── authorizations/
│   │   │   │   ├── error.html.haml
│   │   │   │   ├── new.html.haml
│   │   │   │   └── show.html.haml
│   │   │   └── authorized_applications/
│   │   │       └── index.html.haml
│   │   ├── public_timelines/
│   │   │   └── show.html.haml
│   │   ├── relationships/
│   │   │   ├── _account.html.haml
│   │   │   └── show.html.haml
│   │   ├── remote_follow/
│   │   │   └── new.html.haml
│   │   ├── remote_interaction/
│   │   │   └── new.html.haml
│   │   ├── remote_unfollows/
│   │   │   ├── _card.html.haml
│   │   │   ├── _post_follow_actions.html.haml
│   │   │   ├── error.html.haml
│   │   │   └── success.html.haml
│   │   ├── settings/
│   │   │   ├── applications/
│   │   │   │   ├── _fields.html.haml
│   │   │   │   ├── index.html.haml
│   │   │   │   ├── new.html.haml
│   │   │   │   └── show.html.haml
│   │   │   ├── deletes/
│   │   │   │   └── show.html.haml
│   │   │   ├── exports/
│   │   │   │   └── show.html.haml
│   │   │   ├── featured_tags/
│   │   │   │   └── index.html.haml
│   │   │   ├── identity_proofs/
│   │   │   │   ├── _proof.html.haml
│   │   │   │   ├── index.html.haml
│   │   │   │   └── new.html.haml
│   │   │   ├── imports/
│   │   │   │   └── show.html.haml
│   │   │   ├── migrations/
│   │   │   │   └── show.html.haml
│   │   │   ├── preferences/
│   │   │   │   ├── appearance/
│   │   │   │   │   └── show.html.haml
│   │   │   │   ├── notifications/
│   │   │   │   │   └── show.html.haml
│   │   │   │   └── other/
│   │   │   │       └── show.html.haml
│   │   │   ├── profiles/
│   │   │   │   └── show.html.haml
│   │   │   ├── shared/
│   │   │   │   └── _links.html.haml
│   │   │   ├── two_factor_authentication/
│   │   │   │   ├── confirmations/
│   │   │   │   │   └── new.html.haml
│   │   │   │   └── recovery_codes/
│   │   │   │       └── index.html.haml
│   │   │   └── two_factor_authentications/
│   │   │       └── show.html.haml
│   │   ├── shared/
│   │   │   ├── _error_messages.html.haml
│   │   │   └── _og.html.haml
│   │   ├── shares/
│   │   │   └── show.html.haml
│   │   ├── stream_entries/
│   │   │   ├── _attachment_list.html.haml
│   │   │   ├── _detailed_status.html.haml
│   │   │   ├── _og_description.html.haml
│   │   │   ├── _og_image.html.haml
│   │   │   ├── _poll.html.haml
│   │   │   ├── _simple_status.html.haml
│   │   │   ├── _status.html.haml
│   │   │   ├── embed.html.haml
│   │   │   └── show.html.haml
│   │   ├── tags/
│   │   │   ├── _og.html.haml
│   │   │   └── show.html.haml
│   │   ├── user_mailer/
│   │   │   ├── backup_ready.html.haml
│   │   │   ├── backup_ready.text.erb
│   │   │   ├── confirmation_instructions.html.haml
│   │   │   ├── confirmation_instructions.text.erb
│   │   │   ├── email_changed.html.haml
│   │   │   ├── email_changed.text.erb
│   │   │   ├── password_change.html.haml
│   │   │   ├── password_change.text.erb
│   │   │   ├── reconfirmation_instructions.html.haml
│   │   │   ├── reconfirmation_instructions.text.erb
│   │   │   ├── reset_password_instructions.html.haml
│   │   │   ├── reset_password_instructions.text.erb
│   │   │   ├── warning.html.haml
│   │   │   ├── warning.text.erb
│   │   │   ├── welcome.html.haml
│   │   │   └── welcome.text.erb
│   │   └── well_known/
│   │       ├── host_meta/
│   │       │   └── show.xml.ruby
│   │       └── webfinger/
│   │           └── show.xml.ruby
│   └── workers/
│       ├── activitypub/
│       │   ├── delivery_worker.rb
│       │   ├── distribute_poll_update_worker.rb
│       │   ├── distribution_worker.rb
│       │   ├── fetch_replies_worker.rb
│       │   ├── low_priority_delivery_worker.rb
│       │   ├── post_upgrade_worker.rb
│       │   ├── processing_worker.rb
│       │   ├── raw_distribution_worker.rb
│       │   ├── reply_distribution_worker.rb
│       │   ├── synchronize_featured_collection_worker.rb
│       │   └── update_distribution_worker.rb
│       ├── admin/
│       │   └── suspension_worker.rb
│       ├── after_account_domain_block_worker.rb
│       ├── after_remote_follow_request_worker.rb
│       ├── after_remote_follow_worker.rb
│       ├── authorize_follow_worker.rb
│       ├── backup_worker.rb
│       ├── block_worker.rb
│       ├── bootstrap_timeline_worker.rb
│       ├── concerns/
│       │   └── exponential_backoff.rb
│       ├── digest_mailer_worker.rb
│       ├── distribution_worker.rb
│       ├── domain_block_worker.rb
│       ├── feed_insert_worker.rb
│       ├── fetch_reply_worker.rb
│       ├── import/
│       │   └── relationship_worker.rb
│       ├── import_worker.rb
│       ├── link_crawl_worker.rb
│       ├── local_notification_worker.rb
│       ├── maintenance/
│       │   ├── destroy_media_worker.rb
│       │   ├── redownload_account_media_worker.rb
│       │   └── uncache_media_worker.rb
│       ├── merge_worker.rb
│       ├── mute_worker.rb
│       ├── notification_worker.rb
│       ├── poll_expiration_notify_worker.rb
│       ├── processing_worker.rb
│       ├── publish_scheduled_status_worker.rb
│       ├── pubsubhubbub/
│       │   ├── confirmation_worker.rb
│       │   ├── delivery_worker.rb
│       │   ├── distribution_worker.rb
│       │   ├── raw_distribution_worker.rb
│       │   ├── subscribe_worker.rb
│       │   └── unsubscribe_worker.rb
│       ├── push_conversation_worker.rb
│       ├── push_update_worker.rb
│       ├── refollow_worker.rb
│       ├── regeneration_worker.rb
│       ├── remote_profile_update_worker.rb
│       ├── removal_worker.rb
│       ├── resolve_account_worker.rb
│       ├── salmon_worker.rb
│       ├── scheduler/
│       │   ├── backup_cleanup_scheduler.rb
│       │   ├── doorkeeper_cleanup_scheduler.rb
│       │   ├── email_scheduler.rb
│       │   ├── feed_cleanup_scheduler.rb
│       │   ├── ip_cleanup_scheduler.rb
│       │   ├── media_cleanup_scheduler.rb
│       │   ├── pghero_scheduler.rb
│       │   ├── scheduled_statuses_scheduler.rb
│       │   ├── subscriptions_cleanup_scheduler.rb
│       │   ├── subscriptions_scheduler.rb
│       │   └── user_cleanup_scheduler.rb
│       ├── thread_resolve_worker.rb
│       ├── unfavourite_worker.rb
│       ├── unfollow_follow_worker.rb
│       ├── unmerge_worker.rb
│       ├── verify_account_links_worker.rb
│       └── web/
│           └── push_notification_worker.rb
├── app.json
├── babel.config.js
├── bin/
│   ├── bundle
│   ├── rails
│   ├── rake
│   ├── retry
│   ├── rspec
│   ├── setup
│   ├── tootctl
│   ├── update
│   ├── webpack
│   ├── webpack-dev-server
│   └── yarn
├── boxfile.yml
├── config/
│   ├── application.rb
│   ├── boot.rb
│   ├── brakeman.ignore
│   ├── database.yml
│   ├── deploy.rb
│   ├── environment.rb
│   ├── environments/
│   │   ├── development.rb
│   │   ├── production.rb
│   │   └── test.rb
│   ├── i18n-tasks.yml
│   ├── initializers/
│   │   ├── 0_post_deployment_migrations.rb
│   │   ├── 1_hosts.rb
│   │   ├── active_model_serializers.rb
│   │   ├── application_controller_renderer.rb
│   │   ├── assets.rb
│   │   ├── backtrace_silencers.rb
│   │   ├── blacklists.rb
│   │   ├── chewy.rb
│   │   ├── content_security_policy.rb
│   │   ├── cookies_serializer.rb
│   │   ├── cors.rb
│   │   ├── delivery_job.rb
│   │   ├── devise.rb
│   │   ├── doorkeeper.rb
│   │   ├── fast_blank.rb
│   │   ├── ffmpeg.rb
│   │   ├── filter_parameter_logging.rb
│   │   ├── http_client_proxy.rb
│   │   ├── httplog.rb
│   │   ├── inflections.rb
│   │   ├── instrumentation.rb
│   │   ├── json_ld.rb
│   │   ├── kaminari_config.rb
│   │   ├── mime_types.rb
│   │   ├── oj.rb
│   │   ├── omniauth.rb
│   │   ├── open_uri_redirection.rb
│   │   ├── pagination.rb
│   │   ├── paperclip.rb
│   │   ├── premailer_rails.rb
│   │   ├── rack_attack.rb
│   │   ├── rack_attack_logging.rb
│   │   ├── redis.rb
│   │   ├── session_activations.rb
│   │   ├── session_store.rb
│   │   ├── sidekiq.rb
│   │   ├── simple_form.rb
│   │   ├── single_user_mode.rb
│   │   ├── statsd.rb
│   │   ├── stoplight.rb
│   │   ├── strong_migrations.rb
│   │   ├── suppress_csrf_warnings.rb
│   │   ├── trusted_proxies.rb
│   │   ├── twitter_regex.rb
│   │   ├── vapid.rb
│   │   └── wrap_parameters.rb
│   ├── locales/
│   │   ├── activerecord.ar.yml
│   │   ├── activerecord.ast.yml
│   │   ├── activerecord.bg.yml
│   │   ├── activerecord.bn.yml
│   │   ├── activerecord.ca.yml
│   │   ├── activerecord.co.yml
│   │   ├── activerecord.cs.yml
│   │   ├── activerecord.cy.yml
│   │   ├── activerecord.da.yml
│   │   ├── activerecord.de.yml
│   │   ├── activerecord.el.yml
│   │   ├── activerecord.en.yml
│   │   ├── activerecord.eo.yml
│   │   ├── activerecord.es.yml
│   │   ├── activerecord.eu.yml
│   │   ├── activerecord.fa.yml
│   │   ├── activerecord.fi.yml
│   │   ├── activerecord.fr.yml
│   │   ├── activerecord.gl.yml
│   │   ├── activerecord.he.yml
│   │   ├── activerecord.hr.yml
│   │   ├── activerecord.hu.yml
│   │   ├── activerecord.hy.yml
│   │   ├── activerecord.id.yml
│   │   ├── activerecord.io.yml
│   │   ├── activerecord.it.yml
│   │   ├── activerecord.ja.yml
│   │   ├── activerecord.ka.yml
│   │   ├── activerecord.kk.yml
│   │   ├── activerecord.ko.yml
│   │   ├── activerecord.lt.yml
│   │   ├── activerecord.lv.yml
│   │   ├── activerecord.ms.yml
│   │   ├── activerecord.nl.yml
│   │   ├── activerecord.no.yml
│   │   ├── activerecord.oc.yml
│   │   ├── activerecord.pl.yml
│   │   ├── activerecord.pt-BR.yml
│   │   ├── activerecord.pt.yml
│   │   ├── activerecord.ro.yml
│   │   ├── activerecord.ru.yml
│   │   ├── activerecord.sk.yml
│   │   ├── activerecord.sl.yml
│   │   ├── activerecord.sq.yml
│   │   ├── activerecord.sr-Latn.yml
│   │   ├── activerecord.sr.yml
│   │   ├── activerecord.sv.yml
│   │   ├── activerecord.ta.yml
│   │   ├── activerecord.te.yml
│   │   ├── activerecord.th.yml
│   │   ├── activerecord.tr.yml
│   │   ├── activerecord.uk.yml
│   │   ├── activerecord.zh-CN.yml
│   │   ├── activerecord.zh-HK.yml
│   │   ├── activerecord.zh-TW.yml
│   │   ├── activerecord.zh_Hant.yml
│   │   ├── ar.yml
│   │   ├── ast.yml
│   │   ├── bg.yml
│   │   ├── bn.yml
│   │   ├── ca.yml
│   │   ├── co.yml
│   │   ├── cs.yml
│   │   ├── cy.yml
│   │   ├── da.yml
│   │   ├── de.yml
│   │   ├── devise.ar.yml
│   │   ├── devise.ast.yml
│   │   ├── devise.bg.yml
│   │   ├── devise.bn.yml
│   │   ├── devise.ca.yml
│   │   ├── devise.co.yml
│   │   ├── devise.cs.yml
│   │   ├── devise.cy.yml
│   │   ├── devise.da.yml
│   │   ├── devise.de.yml
│   │   ├── devise.el.yml
│   │   ├── devise.en.yml
│   │   ├── devise.eo.yml
│   │   ├── devise.es.yml
│   │   ├── devise.eu.yml
│   │   ├── devise.fa.yml
│   │   ├── devise.fi.yml
│   │   ├── devise.fr.yml
│   │   ├── devise.gl.yml
│   │   ├── devise.he.yml
│   │   ├── devise.hr.yml
│   │   ├── devise.hu.yml
│   │   ├── devise.hy.yml
│   │   ├── devise.id.yml
│   │   ├── devise.io.yml
│   │   ├── devise.it.yml
│   │   ├── devise.ja.yml
│   │   ├── devise.ka.yml
│   │   ├── devise.kk.yml
│   │   ├── devise.ko.yml
│   │   ├── devise.lt.yml
│   │   ├── devise.lv.yml
│   │   ├── devise.ms.yml
│   │   ├── devise.nl.yml
│   │   ├── devise.no.yml
│   │   ├── devise.oc.yml
│   │   ├── devise.pl.yml
│   │   ├── devise.pt-BR.yml
│   │   ├── devise.pt.yml
│   │   ├── devise.ro.yml
│   │   ├── devise.ru.yml
│   │   ├── devise.sk.yml
│   │   ├── devise.sl.yml
│   │   ├── devise.sq.yml
│   │   ├── devise.sr-Latn.yml
│   │   ├── devise.sr.yml
│   │   ├── devise.sv.yml
│   │   ├── devise.ta.yml
│   │   ├── devise.te.yml
│   │   ├── devise.th.yml
│   │   ├── devise.tr.yml
│   │   ├── devise.uk.yml
│   │   ├── devise.zh-CN.yml
│   │   ├── devise.zh-HK.yml
│   │   ├── devise.zh-TW.yml
│   │   ├── doorkeeper.ar.yml
│   │   ├── doorkeeper.ast.yml
│   │   ├── doorkeeper.bg.yml
│   │   ├── doorkeeper.bn.yml
│   │   ├── doorkeeper.ca.yml
│   │   ├── doorkeeper.co.yml
│   │   ├── doorkeeper.cs.yml
│   │   ├── doorkeeper.cy.yml
│   │   ├── doorkeeper.da.yml
│   │   ├── doorkeeper.de.yml
│   │   ├── doorkeeper.el.yml
│   │   ├── doorkeeper.en.yml
│   │   ├── doorkeeper.eo.yml
│   │   ├── doorkeeper.es.yml
│   │   ├── doorkeeper.eu.yml
│   │   ├── doorkeeper.fa.yml
│   │   ├── doorkeeper.fi.yml
│   │   ├── doorkeeper.fr.yml
│   │   ├── doorkeeper.gl.yml
│   │   ├── doorkeeper.he.yml
│   │   ├── doorkeeper.hr.yml
│   │   ├── doorkeeper.hu.yml
│   │   ├── doorkeeper.hy.yml
│   │   ├── doorkeeper.id.yml
│   │   ├── doorkeeper.io.yml
│   │   ├── doorkeeper.it.yml
│   │   ├── doorkeeper.ja.yml
│   │   ├── doorkeeper.ka.yml
│   │   ├── doorkeeper.kk.yml
│   │   ├── doorkeeper.ko.yml
│   │   ├── doorkeeper.lt.yml
│   │   ├── doorkeeper.lv.yml
│   │   ├── doorkeeper.ms.yml
│   │   ├── doorkeeper.nl.yml
│   │   ├── doorkeeper.no.yml
│   │   ├── doorkeeper.oc.yml
│   │   ├── doorkeeper.pl.yml
│   │   ├── doorkeeper.pt-BR.yml
│   │   ├── doorkeeper.pt.yml
│   │   ├── doorkeeper.ro.yml
│   │   ├── doorkeeper.ru.yml
│   │   ├── doorkeeper.sk.yml
│   │   ├── doorkeeper.sl.yml
│   │   ├── doorkeeper.sq.yml
│   │   ├── doorkeeper.sr-Latn.yml
│   │   ├── doorkeeper.sr.yml
│   │   ├── doorkeeper.sv.yml
│   │   ├── doorkeeper.ta.yml
│   │   ├── doorkeeper.te.yml
│   │   ├── doorkeeper.th.yml
│   │   ├── doorkeeper.tr.yml
│   │   ├── doorkeeper.uk.yml
│   │   ├── doorkeeper.zh-CN.yml
│   │   ├── doorkeeper.zh-HK.yml
│   │   ├── doorkeeper.zh-TW.yml
│   │   ├── el.yml
│   │   ├── en.yml
│   │   ├── en_GB.yml
│   │   ├── eo.yml
│   │   ├── es.yml
│   │   ├── eu.yml
│   │   ├── fa.yml
│   │   ├── fi.yml
│   │   ├── fr.yml
│   │   ├── ga.yml
│   │   ├── gl.yml
│   │   ├── he.yml
│   │   ├── hi.yml
│   │   ├── hr.yml
│   │   ├── hu.yml
│   │   ├── hy.yml
│   │   ├── id.yml
│   │   ├── io.yml
│   │   ├── it.yml
│   │   ├── ja.yml
│   │   ├── ka.yml
│   │   ├── kk.yml
│   │   ├── ko.yml
│   │   ├── lt.yml
│   │   ├── lv.yml
│   │   ├── ms.yml
│   │   ├── nl.yml
│   │   ├── no.yml
│   │   ├── oc.yml
│   │   ├── pl.yml
│   │   ├── pt-BR.yml
│   │   ├── pt.yml
│   │   ├── ro.yml
│   │   ├── ru.yml
│   │   ├── simple_form.ar.yml
│   │   ├── simple_form.ast.yml
│   │   ├── simple_form.bg.yml
│   │   ├── simple_form.bn.yml
│   │   ├── simple_form.ca.yml
│   │   ├── simple_form.co.yml
│   │   ├── simple_form.cs.yml
│   │   ├── simple_form.cy.yml
│   │   ├── simple_form.da.yml
│   │   ├── simple_form.de.yml
│   │   ├── simple_form.el.yml
│   │   ├── simple_form.en.yml
│   │   ├── simple_form.en_GB.yml
│   │   ├── simple_form.eo.yml
│   │   ├── simple_form.es.yml
│   │   ├── simple_form.eu.yml
│   │   ├── simple_form.fa.yml
│   │   ├── simple_form.fi.yml
│   │   ├── simple_form.fr.yml
│   │   ├── simple_form.gl.yml
│   │   ├── simple_form.he.yml
│   │   ├── simple_form.hr.yml
│   │   ├── simple_form.hu.yml
│   │   ├── simple_form.hy.yml
│   │   ├── simple_form.id.yml
│   │   ├── simple_form.io.yml
│   │   ├── simple_form.it.yml
│   │   ├── simple_form.ja.yml
│   │   ├── simple_form.ka.yml
│   │   ├── simple_form.kk.yml
│   │   ├── simple_form.ko.yml
│   │   ├── simple_form.lt.yml
│   │   ├── simple_form.lv.yml
│   │   ├── simple_form.ms.yml
│   │   ├── simple_form.nl.yml
│   │   ├── simple_form.no.yml
│   │   ├── simple_form.oc.yml
│   │   ├── simple_form.pl.yml
│   │   ├── simple_form.pt-BR.yml
│   │   ├── simple_form.pt.yml
│   │   ├── simple_form.ro.yml
│   │   ├── simple_form.ru.yml
│   │   ├── simple_form.sk.yml
│   │   ├── simple_form.sl.yml
│   │   ├── simple_form.sq.yml
│   │   ├── simple_form.sr-Latn.yml
│   │   ├── simple_form.sr.yml
│   │   ├── simple_form.sv.yml
│   │   ├── simple_form.ta.yml
│   │   ├── simple_form.te.yml
│   │   ├── simple_form.th.yml
│   │   ├── simple_form.tr.yml
│   │   ├── simple_form.uk.yml
│   │   ├── simple_form.zh-CN.yml
│   │   ├── simple_form.zh-HK.yml
│   │   ├── simple_form.zh-TW.yml
│   │   ├── sk.yml
│   │   ├── sl.yml
│   │   ├── sq.yml
│   │   ├── sr-Latn.rb
│   │   ├── sr-Latn.yml
│   │   ├── sr.rb
│   │   ├── sr.yml
│   │   ├── sv.yml
│   │   ├── ta.yml
│   │   ├── te.yml
│   │   ├── th.yml
│   │   ├── tr.yml
│   │   ├── uk.yml
│   │   ├── zh-CN.yml
│   │   ├── zh-HK.yml
│   │   └── zh-TW.yml
│   ├── navigation.rb
│   ├── puma.rb
│   ├── routes.rb
│   ├── secrets.yml
│   ├── settings.yml
│   ├── sidekiq.yml
│   ├── themes.yml
│   ├── webpack/
│   │   ├── configuration.js
│   │   ├── development.js
│   │   ├── generateLocalePacks.js
│   │   ├── production.js
│   │   ├── rules/
│   │   │   ├── babel.js
│   │   │   ├── css.js
│   │   │   ├── file.js
│   │   │   ├── index.js
│   │   │   ├── mark.js
│   │   │   └── node_modules.js
│   │   ├── shared.js
│   │   ├── test.js
│   │   └── translationRunner.js
│   └── webpacker.yml
├── config.ru
├── db/
│   ├── migrate/
│   │   ├── 20160220174730_create_accounts.rb
│   │   ├── 20160220211917_create_statuses.rb
│   │   ├── 20160221003140_create_users.rb
│   │   ├── 20160221003621_create_follows.rb
│   │   ├── 20160222122600_create_stream_entries.rb
│   │   ├── 20160222143943_add_profile_fields_to_accounts.rb
│   │   ├── 20160223162837_add_metadata_to_statuses.rb
│   │   ├── 20160223164502_make_uris_nullable_in_statuses.rb
│   │   ├── 20160223165723_add_url_to_statuses.rb
│   │   ├── 20160223165855_add_url_to_accounts.rb
│   │   ├── 20160223171800_create_favourites.rb
│   │   ├── 20160224223247_create_mentions.rb
│   │   ├── 20160227230233_add_attachment_avatar_to_accounts.rb
│   │   ├── 20160305115639_add_devise_to_users.rb
│   │   ├── 20160306172223_create_doorkeeper_tables.rb
│   │   ├── 20160312193225_add_attachment_header_to_accounts.rb
│   │   ├── 20160314164231_add_owner_to_application.rb
│   │   ├── 20160316103650_add_missing_indices.rb
│   │   ├── 20160322193748_add_avatar_remote_url_to_accounts.rb
│   │   ├── 20160325130944_add_admin_to_users.rb
│   │   ├── 20160826155805_add_superapp_to_oauth_applications.rb
│   │   ├── 20160905150353_create_media_attachments.rb
│   │   ├── 20160919221059_add_subscription_expires_at_to_accounts.rb
│   │   ├── 20160920003904_remove_verify_token_from_accounts.rb
│   │   ├── 20160926213048_remove_owner_from_application.rb
│   │   ├── 20161003142332_add_confirmable_to_users.rb
│   │   ├── 20161003145426_create_blocks.rb
│   │   ├── 20161006213403_rails_settings_migration.rb
│   │   ├── 20161009120834_create_domain_blocks.rb
│   │   ├── 20161027172456_add_silenced_to_accounts.rb
│   │   ├── 20161104173623_create_tags.rb
│   │   ├── 20161105130633_create_statuses_tags_join_table.rb
│   │   ├── 20161116162355_add_locale_to_users.rb
│   │   ├── 20161119211120_create_notifications.rb
│   │   ├── 20161122163057_remove_unneeded_indexes.rb
│   │   ├── 20161123093447_add_sensitive_to_statuses.rb
│   │   ├── 20161128103007_create_subscriptions.rb
│   │   ├── 20161130142058_add_last_successful_delivery_at_to_subscriptions.rb
│   │   ├── 20161130185319_add_visibility_to_statuses.rb
│   │   ├── 20161202132159_add_in_reply_to_account_id_to_statuses.rb
│   │   ├── 20161203164520_add_from_account_id_to_notifications.rb
│   │   ├── 20161205214545_add_suspended_to_accounts.rb
│   │   ├── 20161221152630_add_hidden_to_stream_entries.rb
│   │   ├── 20161222201034_add_locked_to_accounts.rb
│   │   ├── 20161222204147_create_follow_requests.rb
│   │   ├── 20170105224407_add_shortcode_to_media_attachments.rb
│   │   ├── 20170109120109_create_web_settings.rb
│   │   ├── 20170112154826_migrate_settings.rb
│   │   ├── 20170114194937_add_application_to_statuses.rb
│   │   ├── 20170114203041_add_website_to_oauth_application.rb
│   │   ├── 20170119214911_create_preview_cards.rb
│   │   ├── 20170123162658_add_severity_to_domain_blocks.rb
│   │   ├── 20170123203248_add_reject_media_to_domain_blocks.rb
│   │   ├── 20170125145934_add_spoiler_text_to_statuses.rb
│   │   ├── 20170127165745_add_devise_two_factor_to_users.rb
│   │   ├── 20170129000348_create_devices.rb
│   │   ├── 20170205175257_remove_devices.rb
│   │   ├── 20170209184350_add_reply_to_statuses.rb
│   │   ├── 20170214110202_create_reports.rb
│   │   ├── 20170217012631_add_reblog_of_id_foreign_key_to_statuses.rb
│   │   ├── 20170301222600_create_mutes.rb
│   │   ├── 20170303212857_add_last_emailed_at_to_users.rb
│   │   ├── 20170304202101_add_type_to_media_attachments.rb
│   │   ├── 20170317193015_add_search_index_to_accounts.rb
│   │   ├── 20170318214217_add_header_remote_url_to_accounts.rb
│   │   ├── 20170322021028_add_lowercase_index_to_accounts.rb
│   │   ├── 20170322143850_change_primary_key_to_bigint_on_statuses.rb
│   │   ├── 20170322162804_add_search_index_to_tags.rb
│   │   ├── 20170330021336_add_counter_caches.rb
│   │   ├── 20170330163835_create_imports.rb
│   │   ├── 20170330164118_add_attachment_data_to_imports.rb
│   │   ├── 20170403172249_add_action_taken_by_account_id_to_reports.rb
│   │   ├── 20170405112956_add_index_on_mentions_status_id.rb
│   │   ├── 20170406215816_add_notifications_and_favourites_indices.rb
│   │   ├── 20170409170753_add_last_webfingered_at_to_accounts.rb
│   │   ├── 20170414080609_add_devise_two_factor_backupable_to_users.rb
│   │   ├── 20170414132105_add_language_to_statuses.rb
│   │   ├── 20170418160728_add_indexes_to_reports_for_accounts.rb
│   │   ├── 20170423005413_add_allowed_languages_to_user.rb
│   │   ├── 20170424003227_create_account_domain_blocks.rb
│   │   ├── 20170424112722_add_status_id_index_to_statuses_tags.rb
│   │   ├── 20170425131920_add_media_attachment_meta.rb
│   │   ├── 20170425202925_add_oembed_to_preview_cards.rb
│   │   ├── 20170427011934_re_add_owner_to_application.rb
│   │   ├── 20170506235850_create_conversations.rb
│   │   ├── 20170507000211_add_conversation_id_to_statuses.rb
│   │   ├── 20170507141759_optimize_index_subscriptions.rb
│   │   ├── 20170508230434_create_conversation_mutes.rb
│   │   ├── 20170516072309_add_index_accounts_on_uri.rb
│   │   ├── 20170520145338_change_language_filter_to_opt_out.rb
│   │   ├── 20170601210557_add_index_on_media_attachments_account_id.rb
│   │   ├── 20170604144747_add_foreign_keys_for_accounts.rb
│   │   ├── 20170606113804_change_tag_search_index_to_btree.rb
│   │   ├── 20170609145826_remove_default_language_from_statuses.rb
│   │   ├── 20170610000000_add_statuses_index_on_account_id_id.rb
│   │   ├── 20170623152212_create_session_activations.rb
│   │   ├── 20170624134742_add_description_to_session_activations.rb
│   │   ├── 20170625140443_add_access_token_id_to_session_activations.rb
│   │   ├── 20170711225116_fix_null_booleans.rb
│   │   ├── 20170713112503_make_tag_search_case_insensitive.rb
│   │   ├── 20170713175513_create_web_push_subscriptions.rb
│   │   ├── 20170713190709_add_web_push_subscription_to_session_activations.rb
│   │   ├── 20170714184731_add_domain_to_subscriptions.rb
│   │   ├── 20170716191202_add_hide_notifications_to_mute.rb
│   │   ├── 20170718211102_add_activitypub_to_accounts.rb
│   │   ├── 20170720000000_add_index_favourites_on_account_id_and_id.rb
│   │   ├── 20170823162448_create_status_pins.rb
│   │   ├── 20170824103029_add_timestamps_to_status_pins.rb
│   │   ├── 20170829215220_remove_status_pins_account_index.rb
│   │   ├── 20170901141119_truncate_preview_cards.rb
│   │   ├── 20170901142658_create_join_table_preview_cards_statuses.rb
│   │   ├── 20170905044538_add_index_id_account_id_activity_type_on_notifications.rb
│   │   ├── 20170905165803_add_local_to_statuses.rb
│   │   ├── 20170913000752_create_site_uploads.rb
│   │   ├── 20170917153509_create_custom_emojis.rb
│   │   ├── 20170918125918_ids_to_bigints.rb
│   │   ├── 20170920024819_status_ids_to_timestamp_ids.rb
│   │   ├── 20170920032311_fix_reblogs_in_feeds.rb
│   │   ├── 20170924022025_ids_to_bigints2.rb
│   │   ├── 20170927215609_add_description_to_media_attachments.rb
│   │   ├── 20170928082043_create_email_domain_blocks.rb
│   │   ├── 20171005102658_create_account_moderation_notes.rb
│   │   ├── 20171005171936_add_disabled_to_custom_emojis.rb
│   │   ├── 20171006142024_add_uri_to_custom_emojis.rb
│   │   ├── 20171010023049_add_foreign_key_to_account_moderation_notes.rb
│   │   ├── 20171010025614_change_accounts_nonnullable_in_account_moderation_notes.rb
│   │   ├── 20171020084748_add_visible_in_picker_to_custom_emoji.rb
│   │   ├── 20171028221157_add_reblogs_to_follows.rb
│   │   ├── 20171107143332_add_memorial_to_accounts.rb
│   │   ├── 20171107143624_add_disabled_to_users.rb
│   │   ├── 20171109012327_add_moderator_to_accounts.rb
│   │   ├── 20171114080328_add_index_domain_to_email_domain_blocks.rb
│   │   ├── 20171114231651_create_lists.rb
│   │   ├── 20171116161857_create_list_accounts.rb
│   │   ├── 20171118012443_add_moved_to_account_id_to_accounts.rb
│   │   ├── 20171119172437_create_admin_action_logs.rb
│   │   ├── 20171122120436_add_index_account_and_reblog_of_id_to_statuses.rb
│   │   ├── 20171125024930_create_invites.rb
│   │   ├── 20171125031751_add_invite_id_to_users.rb
│   │   ├── 20171125185353_add_index_reblog_of_id_and_account_to_statuses.rb
│   │   ├── 20171125190735_remove_old_reblog_index_on_statuses.rb
│   │   ├── 20171129172043_add_index_on_stream_entries.rb
│   │   ├── 20171130000000_add_embed_url_to_preview_cards.rb
│   │   ├── 20171201000000_change_account_id_nonnullable_in_lists.rb
│   │   ├── 20171212195226_remove_duplicate_indexes_in_lists.rb
│   │   ├── 20171226094803_more_faster_index_on_notifications.rb
│   │   ├── 20180106000232_add_index_on_statuses_for_api_v1_accounts_account_id_statuses.rb
│   │   ├── 20180109143959_add_remember_token_to_users.rb
│   │   ├── 20180204034416_create_identities.rb
│   │   ├── 20180206000000_change_user_id_nonnullable.rb
│   │   ├── 20180211015820_create_backups.rb
│   │   ├── 20180304013859_add_featured_collection_url_to_accounts.rb
│   │   ├── 20180310000000_change_columns_in_notifications_nonnullable.rb
│   │   ├── 20180402031200_add_assigned_account_id_to_reports.rb
│   │   ├── 20180402040909_create_report_notes.rb
│   │   ├── 20180410204633_add_fields_to_accounts.rb
│   │   ├── 20180416210259_add_uri_to_relationships.rb
│   │   ├── 20180506221944_add_actor_type_to_accounts.rb
│   │   ├── 20180510214435_add_access_token_id_to_web_push_subscriptions.rb
│   │   ├── 20180510230049_migrate_web_push_subscriptions.rb
│   │   ├── 20180514130000_improve_index_on_statuses_for_api_v1_accounts_account_id_statuses.rb
│   │   ├── 20180514140000_revert_index_change_on_statuses_for_api_v1_accounts_account_id_statuses.rb
│   │   ├── 20180528141303_fix_accounts_unique_index.rb
│   │   ├── 20180608213548_reject_following_blocked_users.rb
│   │   ├── 20180609104432_migrate_web_push_subscriptions2.rb
│   │   ├── 20180615122121_add_autofollow_to_invites.rb
│   │   ├── 20180616192031_add_chosen_languages_to_users.rb
│   │   ├── 20180617162849_remove_unused_indexes.rb
│   │   ├── 20180628181026_create_custom_filters.rb
│   │   ├── 20180707154237_add_whole_word_to_custom_filter.rb
│   │   ├── 20180711152640_create_relays.rb
│   │   ├── 20180808175627_create_account_pins.rb
│   │   ├── 20180812123222_change_relays_enabled.rb
│   │   ├── 20180812162710_create_status_stats.rb
│   │   ├── 20180812173710_copy_status_stats.rb
│   │   ├── 20180814171349_add_confidential_to_doorkeeper_application.rb
│   │   ├── 20180820232245_add_foreign_key_indices.rb
│   │   ├── 20180929222014_create_account_conversations.rb
│   │   ├── 20181007025445_create_pghero_space_stats.rb
│   │   ├── 20181010141500_add_silent_to_mentions.rb
│   │   ├── 20181017170937_add_reject_reports_to_domain_blocks.rb
│   │   ├── 20181018205649_add_unread_to_account_conversations.rb
│   │   ├── 20181024224956_migrate_account_conversations.rb
│   │   ├── 20181026034033_remove_faux_remote_account_duplicates.rb
│   │   ├── 20181116165755_create_account_stats.rb
│   │   ├── 20181116173541_copy_account_stats.rb
│   │   ├── 20181127130500_identity_id_to_bigint.rb
│   │   ├── 20181203003808_create_accounts_tags_join_table.rb
│   │   ├── 20181203021853_add_discoverable_to_accounts.rb
│   │   ├── 20181204193439_add_last_status_at_to_account_stats.rb
│   │   ├── 20181204215309_create_account_tag_stats.rb
│   │   ├── 20181207011115_downcase_custom_emoji_domains.rb
│   │   ├── 20181213184704_create_account_warnings.rb
│   │   ├── 20181213185533_create_account_warning_presets.rb
│   │   ├── 20181219235220_add_created_by_application_id_to_users.rb
│   │   ├── 20181226021420_add_also_known_as_to_accounts.rb
│   │   ├── 20190103124649_create_scheduled_statuses.rb
│   │   ├── 20190103124754_add_scheduled_status_id_to_media_attachments.rb
│   │   ├── 20190117114553_create_tombstones.rb
│   │   ├── 20190201012802_add_overwrite_to_imports.rb
│   │   ├── 20190203180359_create_featured_tags.rb
│   │   ├── 20190225031541_create_polls.rb
│   │   ├── 20190225031625_create_poll_votes.rb
│   │   ├── 20190226003449_add_poll_id_to_statuses.rb
│   │   ├── 20190304152020_add_uri_to_poll_votes.rb
│   │   ├── 20190306145741_add_lock_version_to_polls.rb
│   │   ├── 20190307234537_add_approved_to_users.rb
│   │   ├── 20190314181829_migrate_open_registrations_setting.rb
│   │   ├── 20190316190352_create_account_identity_proofs.rb
│   │   ├── 20190317135723_add_uri_to_reports.rb
│   │   ├── 20190409054914_create_user_invite_requests.rb
│   │   ├── 20190420025523_add_blurhash_to_media_attachments.rb
│   │   ├── 20190509164208_add_by_moderator_to_tombstone.rb
│   │   ├── 20190511134027_add_silenced_at_suspended_at_to_accounts.rb
│   │   └── 20190529143559_preserve_old_layout_for_existing_users.rb
│   ├── post_migrate/
│   │   ├── .gitkeep
│   │   ├── 20180813113448_copy_status_stats_cleanup.rb
│   │   ├── 20181116184611_copy_account_stats_cleanup.rb
│   │   ├── 20190511152737_remove_suspended_silenced_account_fields.rb
│   │   └── 20190519130537_remove_boosts_widening_audience.rb
│   ├── schema.rb
│   └── seeds.rb
├── dist/
│   ├── mastodon-sidekiq.service
│   ├── mastodon-streaming.service
│   ├── mastodon-web.service
│   └── nginx.conf
├── docker-compose.yml
├── lib/
│   ├── assets/
│   │   └── .keep
│   ├── cli.rb
│   ├── devise/
│   │   └── ldap_authenticatable.rb
│   ├── florence/
│   │   └── version.rb
│   ├── generators/
│   │   └── post_deployment_migration_generator.rb
│   ├── json_ld/
│   │   └── security.rb
│   ├── mastodon/
│   │   ├── accounts_cli.rb
│   │   ├── cache_cli.rb
│   │   ├── cli_helper.rb
│   │   ├── domains_cli.rb
│   │   ├── emoji_cli.rb
│   │   ├── feeds_cli.rb
│   │   ├── media_cli.rb
│   │   ├── migration_helpers.rb
│   │   ├── premailer_webpack_strategy.rb
│   │   ├── redis_config.rb
│   │   ├── search_cli.rb
│   │   ├── settings_cli.rb
│   │   ├── snowflake.rb
│   │   ├── statuses_cli.rb
│   │   └── version.rb
│   ├── paperclip/
│   │   ├── blurhash_transcoder.rb
│   │   ├── gif_transcoder.rb
│   │   ├── lazy_thumbnail.rb
│   │   └── video_transcoder.rb
│   ├── tasks/
│   │   ├── assets.rake
│   │   ├── auto_annotate_models.rake
│   │   ├── db.rake
│   │   ├── emojis.rake
│   │   ├── mastodon.rake
│   │   ├── repo.rake
│   │   └── statistics.rake
│   └── templates/
│       ├── haml/
│       │   └── scaffold/
│       │       └── _form.html.haml
│       └── rails/
│           └── post_deployment_migration/
│               └── migration.rb
├── log/
│   └── .keep
├── nanobox/
│   ├── nginx-local.conf
│   ├── nginx-stream.conf.erb
│   └── nginx-web.conf.erb
├── package.json
├── postcss.config.js
├── priv-config
├── public/
│   ├── browserconfig.xml
│   ├── embed.js
│   ├── robots.txt
│   └── sounds/
│       └── boop.ogg
├── scalingo.json
├── spec/
│   ├── controllers/
│   │   ├── about_controller_spec.rb
│   │   ├── account_follow_controller_spec.rb
│   │   ├── account_unfollow_controller_spec.rb
│   │   ├── accounts_controller_spec.rb
│   │   ├── activitypub/
│   │   │   ├── collections_controller_spec.rb
│   │   │   ├── inboxes_controller_spec.rb
│   │   │   └── outboxes_controller_spec.rb
│   │   ├── admin/
│   │   │   ├── account_moderation_notes_controller_spec.rb
│   │   │   ├── accounts_controller_spec.rb
│   │   │   ├── action_logs_controller_spec.rb
│   │   │   ├── base_controller_spec.rb
│   │   │   ├── change_email_controller_spec.rb
│   │   │   ├── confirmations_controller_spec.rb
│   │   │   ├── custom_emojis_controller_spec.rb
│   │   │   ├── dashboard_controller_spec.rb
│   │   │   ├── domain_blocks_controller_spec.rb
│   │   │   ├── email_domain_blocks_controller_spec.rb
│   │   │   ├── instances_controller_spec.rb
│   │   │   ├── invites_controller_spec.rb
│   │   │   ├── report_notes_controller_spec.rb
│   │   │   ├── reported_statuses_controller_spec.rb
│   │   │   ├── reports_controller_spec.rb
│   │   │   ├── resets_controller_spec.rb
│   │   │   ├── roles_controller_spec.rb
│   │   │   ├── settings_controller_spec.rb
│   │   │   ├── statuses_controller_spec.rb
│   │   │   ├── subscriptions_controller_spec.rb
│   │   │   ├── tags_controller_spec.rb
│   │   │   └── two_factor_authentications_controller_spec.rb
│   │   ├── api/
│   │   │   ├── base_controller_spec.rb
│   │   │   ├── oembed_controller_spec.rb
│   │   │   ├── proofs_controller_spec.rb
│   │   │   ├── push_controller_spec.rb
│   │   │   ├── salmon_controller_spec.rb
│   │   │   ├── subscriptions_controller_spec.rb
│   │   │   ├── v1/
│   │   │   │   ├── accounts/
│   │   │   │   │   ├── credentials_controller_spec.rb
│   │   │   │   │   ├── follower_accounts_controller_spec.rb
│   │   │   │   │   ├── following_accounts_controller_spec.rb
│   │   │   │   │   ├── lists_controller_spec.rb
│   │   │   │   │   ├── pins_controller_spec.rb
│   │   │   │   │   ├── relationships_controller_spec.rb
│   │   │   │   │   ├── search_controller_spec.rb
│   │   │   │   │   └── statuses_controller_spec.rb
│   │   │   │   ├── accounts_controller_spec.rb
│   │   │   │   ├── apps/
│   │   │   │   │   └── credentials_controller_spec.rb
│   │   │   │   ├── apps_controller_spec.rb
│   │   │   │   ├── blocks_controller_spec.rb
│   │   │   │   ├── conversations_controller_spec.rb
│   │   │   │   ├── custom_emojis_controller_spec.rb
│   │   │   │   ├── domain_blocks_controller_spec.rb
│   │   │   │   ├── endorsements_controller_spec.rb
│   │   │   │   ├── favourites_controller_spec.rb
│   │   │   │   ├── filters_controller_spec.rb
│   │   │   │   ├── follow_requests_controller_spec.rb
│   │   │   │   ├── follows_controller_spec.rb
│   │   │   │   ├── instances/
│   │   │   │   │   ├── activity_controller_spec.rb
│   │   │   │   │   └── peers_controller_spec.rb
│   │   │   │   ├── instances_controller_spec.rb
│   │   │   │   ├── lists/
│   │   │   │   │   └── accounts_controller_spec.rb
│   │   │   │   ├── lists_controller_spec.rb
│   │   │   │   ├── media_controller_spec.rb
│   │   │   │   ├── mutes_controller_spec.rb
│   │   │   │   ├── notifications_controller_spec.rb
│   │   │   │   ├── polls/
│   │   │   │   │   └── votes_controller_spec.rb
│   │   │   │   ├── polls_controller_spec.rb
│   │   │   │   ├── push/
│   │   │   │   │   └── subscriptions_controller_spec.rb
│   │   │   │   ├── reports_controller_spec.rb
│   │   │   │   ├── search_controller_spec.rb
│   │   │   │   ├── statuses/
│   │   │   │   │   ├── favourited_by_accounts_controller_spec.rb
│   │   │   │   │   ├── favourites_controller_spec.rb
│   │   │   │   │   ├── mutes_controller_spec.rb
│   │   │   │   │   ├── pins_controller_spec.rb
│   │   │   │   │   ├── reblogged_by_accounts_controller_spec.rb
│   │   │   │   │   └── reblogs_controller_spec.rb
│   │   │   │   ├── statuses_controller_spec.rb
│   │   │   │   ├── streaming_controller_spec.rb
│   │   │   │   ├── suggestions_controller_spec.rb
│   │   │   │   └── timelines/
│   │   │   │       ├── direct_controller_spec.rb
│   │   │   │       ├── home_controller_spec.rb
│   │   │   │       ├── list_controller_spec.rb
│   │   │   │       ├── public_controller_spec.rb
│   │   │   │       └── tag_controller_spec.rb
│   │   │   ├── v2/
│   │   │   │   └── search_controller_spec.rb
│   │   │   └── web/
│   │   │       ├── embeds_controller_spec.rb
│   │   │       ├── push_subscriptions_controller_spec.rb
│   │   │       └── settings_controller_spec.rb
│   │   ├── application_controller_spec.rb
│   │   ├── auth/
│   │   │   ├── confirmations_controller_spec.rb
│   │   │   ├── passwords_controller_spec.rb
│   │   │   ├── registrations_controller_spec.rb
│   │   │   └── sessions_controller_spec.rb
│   │   ├── authorize_interactions_controller_spec.rb
│   │   ├── concerns/
│   │   │   ├── account_controller_concern_spec.rb
│   │   │   ├── accountable_concern_spec.rb
│   │   │   ├── export_controller_concern_spec.rb
│   │   │   ├── localized_spec.rb
│   │   │   ├── obfuscate_filename_spec.rb
│   │   │   ├── rate_limit_headers_spec.rb
│   │   │   ├── signature_verification_spec.rb
│   │   │   └── user_tracking_concern_spec.rb
│   │   ├── emojis_controller_spec.rb
│   │   ├── follower_accounts_controller_spec.rb
│   │   ├── following_accounts_controller_spec.rb
│   │   ├── home_controller_spec.rb
│   │   ├── intents_controller_spec.rb
│   │   ├── invites_controller_spec.rb
│   │   ├── manifests_controller_spec.rb
│   │   ├── media_controller_spec.rb
│   │   ├── oauth/
│   │   │   ├── authorizations_controller_spec.rb
│   │   │   ├── authorized_applications_controller_spec.rb
│   │   │   └── tokens_controller_spec.rb
│   │   ├── relationships_controller_spec.rb
│   │   ├── remote_follow_controller_spec.rb
│   │   ├── remote_interaction_controller_spec.rb
│   │   ├── remote_unfollows_controller_spec.rb
│   │   ├── settings/
│   │   │   ├── applications_controller_spec.rb
│   │   │   ├── deletes_controller_spec.rb
│   │   │   ├── exports/
│   │   │   │   ├── blocked_accounts_controller_spec.rb
│   │   │   │   ├── following_accounts_controller_spec.rb
│   │   │   │   └── muted_accounts_controller_spec.rb
│   │   │   ├── exports_controller_spec.rb
│   │   │   ├── identity_proofs_controller_spec.rb
│   │   │   ├── imports_controller_spec.rb
│   │   │   ├── migrations_controller_spec.rb
│   │   │   ├── preferences/
│   │   │   │   ├── notifications_controller_spec.rb
│   │   │   │   └── other_controller_spec.rb
│   │   │   ├── profiles_controller_spec.rb
│   │   │   ├── sessions_controller_spec.rb
│   │   │   ├── two_factor_authentication/
│   │   │   │   ├── confirmations_controller_spec.rb
│   │   │   │   └── recovery_codes_controller_spec.rb
│   │   │   └── two_factor_authentications_controller_spec.rb
│   │   ├── shares_controller_spec.rb
│   │   ├── statuses_controller_spec.rb
│   │   ├── stream_entries_controller_spec.rb
│   │   ├── tags_controller_spec.rb
│   │   └── well_known/
│   │       ├── host_meta_controller_spec.rb
│   │       ├── keybase_proof_config_controller_spec.rb
│   │       └── webfinger_controller_spec.rb
│   ├── fabricators/
│   │   ├── access_token_fabricator.rb
│   │   ├── accessible_access_token_fabricator.rb
│   │   ├── account_domain_block_fabricator.rb
│   │   ├── account_fabricator.rb
│   │   ├── account_identity_proof_fabricator.rb
│   │   ├── account_moderation_note_fabricator.rb
│   │   ├── account_pin_fabricator.rb
│   │   ├── account_stat_fabricator.rb
│   │   ├── account_tag_stat_fabricator.rb
│   │   ├── account_warning_fabricator.rb
│   │   ├── account_warning_preset_fabricator.rb
│   │   ├── admin_action_log_fabricator.rb
│   │   ├── application_fabricator.rb
│   │   ├── assets/
│   │   │   └── TEAPOT
│   │   ├── backup_fabricator.rb
│   │   ├── block_fabricator.rb
│   │   ├── conversation_account_fabricator.rb
│   │   ├── conversation_fabricator.rb
│   │   ├── conversation_mute_fabricator.rb
│   │   ├── custom_emoji_fabricator.rb
│   │   ├── custom_filter_fabricator.rb
│   │   ├── domain_block_fabricator.rb
│   │   ├── email_domain_block_fabricator.rb
│   │   ├── favourite_fabricator.rb
│   │   ├── featured_tag_fabricator.rb
│   │   ├── follow_fabricator.rb
│   │   ├── follow_request_fabricator.rb
│   │   ├── identity_fabricator.rb
│   │   ├── import_fabricator.rb
│   │   ├── invite_fabricator.rb
│   │   ├── list_account_fabricator.rb
│   │   ├── list_fabricator.rb
│   │   ├── media_attachment_fabricator.rb
│   │   ├── mention_fabricator.rb
│   │   ├── mute_fabricator.rb
│   │   ├── notification_fabricator.rb
│   │   ├── poll_fabricator.rb
│   │   ├── poll_vote_fabricator.rb
│   │   ├── relay_fabricator.rb
│   │   ├── report_fabricator.rb
│   │   ├── report_note_fabricator.rb
│   │   ├── scheduled_status_fabricator.rb
│   │   ├── session_activation_fabricator.rb
│   │   ├── setting_fabricator.rb
│   │   ├── site_upload_fabricator.rb
│   │   ├── status_fabricator.rb
│   │   ├── status_pin_fabricator.rb
│   │   ├── status_stat_fabricator.rb
│   │   ├── stream_entry_fabricator.rb
│   │   ├── subscription_fabricator.rb
│   │   ├── tag_fabricator.rb
│   │   ├── user_fabricator.rb
│   │   ├── user_invite_request_fabricator.rb
│   │   ├── web_push_subscription_fabricator.rb
│   │   └── web_setting_fabricator.rb
│   ├── features/
│   │   └── log_in_spec.rb
│   ├── fixtures/
│   │   ├── files/
│   │   │   ├── attachment.webm
│   │   │   ├── imports.txt
│   │   │   ├── mute-imports.txt
│   │   │   ├── new-following-imports.txt
│   │   │   └── new-mute-imports.txt
│   │   ├── push/
│   │   │   ├── feed.atom
│   │   │   └── reblog.atom
│   │   ├── requests/
│   │   │   ├── .host-meta.txt
│   │   │   ├── activitypub-actor-individual.txt
│   │   │   ├── activitypub-actor-noinbox.txt
│   │   │   ├── activitypub-actor.txt
│   │   │   ├── activitypub-feed.txt
│   │   │   ├── activitypub-webfinger.txt
│   │   │   ├── attachment1.txt
│   │   │   ├── attachment2.txt
│   │   │   ├── avatar.txt
│   │   │   ├── feed.txt
│   │   │   ├── idn.txt
│   │   │   ├── json-ld.activitystreams.txt
│   │   │   ├── json-ld.identity.txt
│   │   │   ├── json-ld.security.txt
│   │   │   ├── koi8-r.txt
│   │   │   ├── localdomain-feed.txt
│   │   │   ├── localdomain-hostmeta.txt
│   │   │   ├── localdomain-webfinger.txt
│   │   │   ├── oembed_invalid_xml.html
│   │   │   ├── oembed_json.html
│   │   │   ├── oembed_json_empty.html
│   │   │   ├── oembed_json_xml.html
│   │   │   ├── oembed_undiscoverable.html
│   │   │   ├── oembed_xml.html
│   │   │   ├── redirected.host-meta.txt
│   │   │   ├── sjis.txt
│   │   │   ├── sjis_with_wrong_charset.txt
│   │   │   ├── webfinger-hacker1.txt
│   │   │   ├── webfinger-hacker2.txt
│   │   │   ├── webfinger-hacker3.txt
│   │   │   ├── webfinger.txt
│   │   │   └── windows-1251.txt
│   │   ├── salmon/
│   │   │   └── mention.xml
│   │   └── xml/
│   │       └── mastodon.atom
│   ├── helpers/
│   │   ├── admin/
│   │   │   ├── account_moderation_notes_helper_spec.rb
│   │   │   ├── action_log_helper_spec.rb
│   │   │   └── filter_helper_spec.rb
│   │   ├── application_helper_spec.rb
│   │   ├── flashes_helper_spec.rb
│   │   ├── home_helper_spec.rb
│   │   ├── instance_helper_spec.rb
│   │   ├── jsonld_helper_spec.rb
│   │   ├── routing_helper_spec.rb
│   │   ├── settings_helper_spec.rb
│   │   └── stream_entries_helper_spec.rb
│   ├── lib/
│   │   ├── activitypub/
│   │   │   ├── activity/
│   │   │   │   ├── accept_spec.rb
│   │   │   │   ├── add_spec.rb
│   │   │   │   ├── announce_spec.rb
│   │   │   │   ├── block_spec.rb
│   │   │   │   ├── create_spec.rb
│   │   │   │   ├── delete_spec.rb
│   │   │   │   ├── flag_spec.rb
│   │   │   │   ├── follow_spec.rb
│   │   │   │   ├── like_spec.rb
│   │   │   │   ├── move_spec.rb
│   │   │   │   ├── reject_spec.rb
│   │   │   │   ├── remove_spec.rb
│   │   │   │   ├── undo_spec.rb
│   │   │   │   └── update_spec.rb
│   │   │   ├── adapter_spec.rb
│   │   │   ├── linked_data_signature_spec.rb
│   │   │   └── tag_manager_spec.rb
│   │   ├── delivery_failure_tracker_spec.rb
│   │   ├── extractor_spec.rb
│   │   ├── feed_manager_spec.rb
│   │   ├── formatter_spec.rb
│   │   ├── hash_object_spec.rb
│   │   ├── language_detector_spec.rb
│   │   ├── ostatus/
│   │   │   ├── atom_serializer_spec.rb
│   │   │   └── tag_manager_spec.rb
│   │   ├── proof_provider/
│   │   │   └── keybase/
│   │   │       └── verifier_spec.rb
│   │   ├── request_spec.rb
│   │   ├── settings/
│   │   │   ├── extend_spec.rb
│   │   │   └── scoped_settings_spec.rb
│   │   ├── status_filter_spec.rb
│   │   ├── status_finder_spec.rb
│   │   ├── tag_manager_spec.rb
│   │   ├── user_settings_decorator_spec.rb
│   │   └── webfinger_resource_spec.rb
│   ├── mailers/
│   │   ├── admin_mailer_spec.rb
│   │   ├── notification_mailer_spec.rb
│   │   ├── previews/
│   │   │   ├── admin_mailer_preview.rb
│   │   │   ├── notification_mailer_preview.rb
│   │   │   └── user_mailer_preview.rb
│   │   └── user_mailer_spec.rb
│   ├── models/
│   │   ├── account_conversation_spec.rb
│   │   ├── account_domain_block_spec.rb
│   │   ├── account_filter_spec.rb
│   │   ├── account_moderation_note_spec.rb
│   │   ├── account_spec.rb
│   │   ├── account_stat_spec.rb
│   │   ├── account_tag_stat_spec.rb
│   │   ├── admin/
│   │   │   ├── account_action_spec.rb
│   │   │   └── action_log_spec.rb
│   │   ├── backup_spec.rb
│   │   ├── block_spec.rb
│   │   ├── concerns/
│   │   │   ├── account_finder_concern_spec.rb
│   │   │   ├── account_interactions_spec.rb
│   │   │   ├── remotable_spec.rb
│   │   │   ├── status_threading_concern_spec.rb
│   │   │   └── streamable_spec.rb
│   │   ├── conversation_mute_spec.rb
│   │   ├── conversation_spec.rb
│   │   ├── custom_emoji_filter_spec.rb
│   │   ├── custom_emoji_spec.rb
│   │   ├── custom_filter_spec.rb
│   │   ├── domain_block_spec.rb
│   │   ├── email_domain_block_spec.rb
│   │   ├── export_spec.rb
│   │   ├── favourite_spec.rb
│   │   ├── featured_tag_spec.rb
│   │   ├── follow_request_spec.rb
│   │   ├── follow_spec.rb
│   │   ├── form/
│   │   │   └── status_batch_spec.rb
│   │   ├── home_feed_spec.rb
│   │   ├── identity_spec.rb
│   │   ├── import_spec.rb
│   │   ├── invite_spec.rb
│   │   ├── list_account_spec.rb
│   │   ├── list_spec.rb
│   │   ├── media_attachment_spec.rb
│   │   ├── mention_spec.rb
│   │   ├── mute_spec.rb
│   │   ├── notification_spec.rb
│   │   ├── poll_spec.rb
│   │   ├── poll_vote_spec.rb
│   │   ├── preview_card_spec.rb
│   │   ├── relay_spec.rb
│   │   ├── remote_follow_spec.rb
│   │   ├── remote_profile_spec.rb
│   │   ├── report_filter_spec.rb
│   │   ├── report_spec.rb
│   │   ├── scheduled_status_spec.rb
│   │   ├── session_activation_spec.rb
│   │   ├── setting_spec.rb
│   │   ├── site_upload_spec.rb
│   │   ├── status_pin_spec.rb
│   │   ├── status_spec.rb
│   │   ├── status_stat_spec.rb
│   │   ├── stream_entry_spec.rb
│   │   ├── subscription_spec.rb
│   │   ├── tag_spec.rb
│   │   ├── user_invite_request_spec.rb
│   │   ├── user_spec.rb
│   │   └── web/
│   │       ├── push_subscription_spec.rb
│   │       └── setting_spec.rb
│   ├── policies/
│   │   ├── account_moderation_note_policy_spec.rb
│   │   ├── account_policy_spec.rb
│   │   ├── backup_policy_spec.rb
│   │   ├── custom_emoji_policy_spec.rb
│   │   ├── domain_block_policy_spec.rb
│   │   ├── email_domain_block_policy_spec.rb
│   │   ├── instance_policy_spec.rb
│   │   ├── invite_policy_spec.rb
│   │   ├── relay_policy_spec.rb
│   │   ├── report_note_policy_spec.rb
│   │   ├── report_policy_spec.rb
│   │   ├── settings_policy_spec.rb
│   │   ├── status_policy_spec.rb
│   │   ├── subscription_policy_spec.rb
│   │   ├── tag_policy_spec.rb
│   │   └── user_policy_spec.rb
│   ├── presenters/
│   │   ├── account_relationships_presenter_spec.rb
│   │   └── instance_presenter_spec.rb
│   ├── rails_helper.rb
│   ├── requests/
│   │   ├── account_show_page_spec.rb
│   │   ├── catch_all_route_request_spec.rb
│   │   ├── host_meta_request_spec.rb
│   │   ├── link_headers_spec.rb
│   │   ├── localization_spec.rb
│   │   └── webfinger_request_spec.rb
│   ├── routing/
│   │   ├── accounts_routing_spec.rb
│   │   ├── api_routing_spec.rb
│   │   └── well_known_routes_spec.rb
│   ├── serializers/
│   │   └── activitypub/
│   │       └── note_spec.rb
│   ├── services/
│   │   ├── account_search_service_spec.rb
│   │   ├── activitypub/
│   │   │   ├── fetch_remote_account_service_spec.rb
│   │   │   ├── fetch_remote_status_service_spec.rb
│   │   │   ├── fetch_replies_service_spec.rb
│   │   │   ├── process_account_service_spec.rb
│   │   │   └── process_collection_service_spec.rb
│   │   ├── after_block_domain_from_account_service_spec.rb
│   │   ├── after_block_service_spec.rb
│   │   ├── app_sign_up_service_spec.rb
│   │   ├── authorize_follow_service_spec.rb
│   │   ├── batched_remove_status_service_spec.rb
│   │   ├── block_domain_service_spec.rb
│   │   ├── block_service_spec.rb
│   │   ├── bootstrap_timeline_service_spec.rb
│   │   ├── fan_out_on_write_service_spec.rb
│   │   ├── favourite_service_spec.rb
│   │   ├── fetch_atom_service_spec.rb
│   │   ├── fetch_link_card_service_spec.rb
│   │   ├── fetch_oembed_service_spec.rb
│   │   ├── fetch_remote_account_service_spec.rb
│   │   ├── fetch_remote_status_service_spec.rb
│   │   ├── follow_service_spec.rb
│   │   ├── hashtag_query_service_spec.rb
│   │   ├── import_service_spec.rb
│   │   ├── mute_service_spec.rb
│   │   ├── notify_service_spec.rb
│   │   ├── post_status_service_spec.rb
│   │   ├── precompute_feed_service_spec.rb
│   │   ├── process_feed_service_spec.rb
│   │   ├── process_interaction_service_spec.rb
│   │   ├── process_mentions_service_spec.rb
│   │   ├── pubsubhubbub/
│   │   │   ├── subscribe_service_spec.rb
│   │   │   └── unsubscribe_service_spec.rb
│   │   ├── reblog_service_spec.rb
│   │   ├── reject_follow_service_spec.rb
│   │   ├── remove_status_service_spec.rb
│   │   ├── report_service_spec.rb
│   │   ├── resolve_account_service_spec.rb
│   │   ├── resolve_url_service_spec.rb
│   │   ├── search_service_spec.rb
│   │   ├── send_interaction_service_spec.rb
│   │   ├── subscribe_service_spec.rb
│   │   ├── suspend_account_service_spec.rb
│   │   ├── unblock_domain_service_spec.rb
│   │   ├── unblock_service_spec.rb
│   │   ├── unfollow_service_spec.rb
│   │   ├── unmute_service_spec.rb
│   │   ├── unsubscribe_service_spec.rb
│   │   ├── update_remote_profile_service_spec.rb
│   │   └── verify_link_service_spec.rb
│   ├── spec_helper.rb
│   ├── support/
│   │   ├── examples/
│   │   │   ├── lib/
│   │   │   │   └── settings/
│   │   │   │       ├── scoped_settings.rb
│   │   │   │       └── settings_extended.rb
│   │   │   └── models/
│   │   │       └── concerns/
│   │   │           └── account_avatar.rb
│   │   └── matchers/
│   │       └── model/
│   │           └── model_have_error_on_field.rb
│   ├── validators/
│   │   ├── blacklisted_email_validator_spec.rb
│   │   ├── disallowed_hashtags_validator_spec.rb
│   │   ├── email_mx_validator_spec.rb
│   │   ├── follow_limit_validator_spec.rb
│   │   ├── poll_validator_spec.rb
│   │   ├── status_length_validator_spec.rb
│   │   ├── status_pin_validator_spec.rb
│   │   ├── unique_username_validator_spec.rb
│   │   ├── unreserved_username_validator_spec.rb
│   │   └── url_validator_spec.rb
│   ├── views/
│   │   ├── about/
│   │   │   └── show.html.haml_spec.rb
│   │   └── stream_entries/
│   │       └── show.html.haml_spec.rb
│   └── workers/
│       ├── activitypub/
│       │   ├── delivery_worker_spec.rb
│       │   ├── distribution_worker_spec.rb
│       │   ├── fetch_replies_worker_spec.rb
│       │   ├── processing_worker_spec.rb
│       │   └── update_distribution_worker_spec.rb
│       ├── after_remote_follow_request_worker_spec.rb
│       ├── after_remote_follow_worker_spec.rb
│       ├── digest_mailer_worker_spec.rb
│       ├── domain_block_worker_spec.rb
│       ├── feed_insert_worker_spec.rb
│       ├── publish_scheduled_status_worker_spec.rb
│       ├── pubsubhubbub/
│       │   ├── confirmation_worker_spec.rb
│       │   ├── delivery_worker_spec.rb
│       │   └── distribution_worker_spec.rb
│       ├── regeneration_worker_spec.rb
│       └── scheduler/
│           ├── feed_cleanup_scheduler_spec.rb
│           ├── media_cleanup_scheduler_spec.rb
│           └── subscriptions_scheduler_spec.rb
├── streaming/
│   └── index.js
└── vendor/
    └── .keep
Download .txt
Showing preview only (456K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (5947 symbols across 1135 files)

FILE: app/chewy/statuses_index.rb
  class StatusesIndex (line 3) | class StatusesIndex < Chewy::Index

FILE: app/controllers/about_controller.rb
  class AboutController (line 3) | class AboutController < ApplicationController
    method show (line 8) | def show
    method more (line 12) | def more; end
    method terms (line 14) | def terms; end
    method new_user (line 18) | def new_user
    method set_instance_presenter (line 27) | def set_instance_presenter

FILE: app/controllers/account_follow_controller.rb
  class AccountFollowController (line 3) | class AccountFollowController < ApplicationController
    method create (line 8) | def create

FILE: app/controllers/account_unfollow_controller.rb
  class AccountUnfollowController (line 3) | class AccountUnfollowController < ApplicationController
    method create (line 8) | def create

FILE: app/controllers/accounts_controller.rb
  class AccountsController (line 3) | class AccountsController < ApplicationController
    method show (line 10) | def show
    method show_pinned_statuses? (line 58) | def show_pinned_statuses?
    method filtered_statuses (line 62) | def filtered_statuses
    method default_statuses (line 70) | def default_statuses
    method only_media_scope (line 74) | def only_media_scope
    method account_media_status_ids (line 78) | def account_media_status_ids
    method no_replies_scope (line 82) | def no_replies_scope
    method hashtag_scope (line 86) | def hashtag_scope
    method username_param (line 96) | def username_param
    method older_url (line 100) | def older_url
    method newer_url (line 104) | def newer_url
    method pagination_url (line 108) | def pagination_url(max_id: nil, min_id: nil)
    method media_requested? (line 120) | def media_requested?
    method replies_requested? (line 124) | def replies_requested?
    method tag_requested? (line 128) | def tag_requested?
    method filtered_status_page (line 132) | def filtered_status_page(params)

FILE: app/controllers/activitypub/collections_controller.rb
  class ActivityPub::CollectionsController (line 3) | class ActivityPub::CollectionsController < Api::BaseController
    method show (line 11) | def show
    method set_account (line 24) | def set_account
    method set_statuses (line 28) | def set_statuses
    method set_size (line 33) | def set_size
    method scope_for_collection (line 42) | def scope_for_collection
    method collection_presenter (line 53) | def collection_presenter

FILE: app/controllers/activitypub/inboxes_controller.rb
  class ActivityPub::InboxesController (line 3) | class ActivityPub::InboxesController < Api::BaseController
    method create (line 9) | def create
    method unknown_deleted_account? (line 23) | def unknown_deleted_account?
    method set_account (line 30) | def set_account
    method body (line 34) | def body
    method upgrade_account (line 41) | def upgrade_account
    method process_payload (line 51) | def process_payload

FILE: app/controllers/activitypub/outboxes_controller.rb
  class ActivityPub::OutboxesController (line 3) | class ActivityPub::OutboxesController < Api::BaseController
    method show (line 12) | def show
    method set_account (line 20) | def set_account
    method outbox_presenter (line 24) | def outbox_presenter
    method next_page (line 45) | def next_page
    method prev_page (line 49) | def prev_page
    method set_statuses (line 53) | def set_statuses
    method page_requested? (line 61) | def page_requested?
    method page_params (line 65) | def page_params

FILE: app/controllers/admin/account_actions_controller.rb
  type Admin (line 3) | module Admin
    class AccountActionsController (line 4) | class AccountActionsController < BaseController
      method new (line 7) | def new
      method create (line 12) | def create
      method set_account (line 28) | def set_account
      method resource_params (line 32) | def resource_params

FILE: app/controllers/admin/account_moderation_notes_controller.rb
  type Admin (line 3) | module Admin
    class AccountModerationNotesController (line 4) | class AccountModerationNotesController < BaseController
      method create (line 7) | def create
      method destroy (line 23) | def destroy
      method resource_params (line 31) | def resource_params
      method set_account_moderation_note (line 38) | def set_account_moderation_note

FILE: app/controllers/admin/accounts_controller.rb
  type Admin (line 3) | module Admin
    class AccountsController (line 4) | class AccountsController < BaseController
      method index (line 9) | def index
      method show (line 14) | def show
      method subscribe (line 22) | def subscribe
      method unsubscribe (line 28) | def unsubscribe
      method memorialize (line 34) | def memorialize
      method enable (line 41) | def enable
      method approve (line 48) | def approve
      method reject (line 54) | def reject
      method unsilence (line 60) | def unsilence
      method unsuspend (line 67) | def unsuspend
      method redownload (line 74) | def redownload
      method remove_avatar (line 83) | def remove_avatar
      method remove_header (line 94) | def remove_header
      method set_account (line 107) | def set_account
      method require_remote_account! (line 111) | def require_remote_account!
      method require_local_account! (line 115) | def require_local_account!
      method filtered_accounts (line 119) | def filtered_accounts
      method filter_params (line 123) | def filter_params

FILE: app/controllers/admin/action_logs_controller.rb
  type Admin (line 3) | module Admin
    class ActionLogsController (line 4) | class ActionLogsController < BaseController
      method index (line 5) | def index

FILE: app/controllers/admin/base_controller.rb
  type Admin (line 3) | module Admin
    class BaseController (line 4) | class BaseController < ApplicationController
      method set_body_classes (line 15) | def set_body_classes
      method set_user (line 19) | def set_user

FILE: app/controllers/admin/change_emails_controller.rb
  type Admin (line 3) | module Admin
    class ChangeEmailsController (line 4) | class ChangeEmailsController < BaseController
      method show (line 8) | def show
      method update (line 12) | def update
      method set_account (line 34) | def set_account
      method require_local_account! (line 39) | def require_local_account!
      method resource_params (line 43) | def resource_params

FILE: app/controllers/admin/confirmations_controller.rb
  type Admin (line 3) | module Admin
    class ConfirmationsController (line 4) | class ConfirmationsController < BaseController
      method create (line 8) | def create
      method resend (line 15) | def resend
      method check_confirmation (line 28) | def check_confirmation

FILE: app/controllers/admin/custom_emojis_controller.rb
  type Admin (line 3) | module Admin
    class CustomEmojisController (line 4) | class CustomEmojisController < BaseController
      method index (line 11) | def index
      method new (line 16) | def new
      method create (line 21) | def create
      method update (line 34) | def update
      method destroy (line 46) | def destroy
      method copy (line 54) | def copy
      method enable (line 71) | def enable
      method disable (line 79) | def disable
      method set_custom_emoji (line 89) | def set_custom_emoji
      method set_filter_params (line 93) | def set_filter_params
      method resource_params (line 97) | def resource_params
      method filtered_custom_emojis (line 101) | def filtered_custom_emojis
      method filter_params (line 105) | def filter_params

FILE: app/controllers/admin/dashboard_controller.rb
  type Admin (line 4) | module Admin
    class DashboardController (line 5) | class DashboardController < BaseController
      method index (line 6) | def index
      method current_week (line 40) | def current_week
      method redis_info (line 44) | def redis_info

FILE: app/controllers/admin/domain_blocks_controller.rb
  type Admin (line 3) | module Admin
    class DomainBlocksController (line 4) | class DomainBlocksController < BaseController
      method new (line 7) | def new
      method create (line 12) | def create
      method show (line 38) | def show
      method destroy (line 42) | def destroy
      method set_domain_block (line 51) | def set_domain_block
      method resource_params (line 55) | def resource_params

FILE: app/controllers/admin/email_domain_blocks_controller.rb
  type Admin (line 3) | module Admin
    class EmailDomainBlocksController (line 4) | class EmailDomainBlocksController < BaseController
      method index (line 7) | def index
      method new (line 12) | def new
      method create (line 17) | def create
      method destroy (line 30) | def destroy
      method set_email_domain_block (line 39) | def set_email_domain_block
      method resource_params (line 43) | def resource_params

FILE: app/controllers/admin/followers_controller.rb
  type Admin (line 3) | module Admin
    class FollowersController (line 4) | class FollowersController < BaseController
      method index (line 9) | def index
      method set_account (line 14) | def set_account

FILE: app/controllers/admin/instances_controller.rb
  type Admin (line 3) | module Admin
    class InstancesController (line 4) | class InstancesController < BaseController
      method index (line 5) | def index
      method show (line 11) | def show
      method filtered_instances (line 26) | def filtered_instances
      method paginated_instances (line 30) | def paginated_instances
      method ordered_instances (line 36) | def ordered_instances
      method filter_params (line 40) | def filter_params

FILE: app/controllers/admin/invites_controller.rb
  type Admin (line 3) | module Admin
    class InvitesController (line 4) | class InvitesController < BaseController
      method index (line 5) | def index
      method create (line 12) | def create
      method destroy (line 26) | def destroy
      method deactivate_all (line 33) | def deactivate_all
      method resource_params (line 41) | def resource_params
      method filtered_invites (line 45) | def filtered_invites
      method filter_params (line 49) | def filter_params

FILE: app/controllers/admin/pending_accounts_controller.rb
  type Admin (line 3) | module Admin
    class PendingAccountsController (line 4) | class PendingAccountsController < BaseController
      method index (line 7) | def index
      method batch (line 11) | def batch
      method approve_all (line 20) | def approve_all
      method reject_all (line 25) | def reject_all
      method set_accounts (line 32) | def set_accounts
      method form_account_batch_params (line 36) | def form_account_batch_params
      method action_from_button (line 40) | def action_from_button
      method current_params (line 48) | def current_params

FILE: app/controllers/admin/relays_controller.rb
  type Admin (line 3) | module Admin
    class RelaysController (line 4) | class RelaysController < BaseController
      method index (line 7) | def index
      method new (line 12) | def new
      method create (line 17) | def create
      method destroy (line 30) | def destroy
      method enable (line 36) | def enable
      method disable (line 42) | def disable
      method set_relay (line 50) | def set_relay
      method resource_params (line 54) | def resource_params

FILE: app/controllers/admin/report_notes_controller.rb
  type Admin (line 3) | module Admin
    class ReportNotesController (line 4) | class ReportNotesController < BaseController
      method create (line 7) | def create
      method destroy (line 37) | def destroy
      method resource_params (line 45) | def resource_params
      method set_report_note (line 52) | def set_report_note

FILE: app/controllers/admin/reported_statuses_controller.rb
  type Admin (line 3) | module Admin
    class ReportedStatusesController (line 4) | class ReportedStatusesController < BaseController
      method create (line 7) | def create
      method status_params (line 22) | def status_params
      method form_status_batch_params (line 26) | def form_status_batch_params
      method action_from_button (line 30) | def action_from_button
      method set_report (line 40) | def set_report

FILE: app/controllers/admin/reports_controller.rb
  type Admin (line 3) | module Admin
    class ReportsController (line 4) | class ReportsController < BaseController
      method index (line 7) | def index
      method show (line 12) | def show
      method assign_to_self (line 20) | def assign_to_self
      method unassign (line 27) | def unassign
      method reopen (line 34) | def reopen
      method resolve (line 41) | def resolve
      method filtered_reports (line 50) | def filtered_reports
      method filter_params (line 54) | def filter_params
      method set_report (line 62) | def set_report

FILE: app/controllers/admin/resets_controller.rb
  type Admin (line 3) | module Admin
    class ResetsController (line 4) | class ResetsController < BaseController
      method create (line 7) | def create

FILE: app/controllers/admin/roles_controller.rb
  type Admin (line 3) | module Admin
    class RolesController (line 4) | class RolesController < BaseController
      method promote (line 7) | def promote
      method demote (line 14) | def demote

FILE: app/controllers/admin/settings_controller.rb
  type Admin (line 3) | module Admin
    class SettingsController (line 4) | class SettingsController < BaseController
      method edit (line 57) | def edit
      method update (line 63) | def update
      method settings_params (line 78) | def settings_params

FILE: app/controllers/admin/statuses_controller.rb
  type Admin (line 3) | module Admin
    class StatusesController (line 4) | class StatusesController < BaseController
      method index (line 11) | def index
      method show (line 25) | def show
      method create (line 34) | def create
      method form_status_batch_params (line 49) | def form_status_batch_params
      method set_account (line 53) | def set_account
      method current_params (line 57) | def current_params
      method action_from_button (line 66) | def action_from_button

FILE: app/controllers/admin/subscriptions_controller.rb
  type Admin (line 3) | module Admin
    class SubscriptionsController (line 4) | class SubscriptionsController < BaseController
      method index (line 5) | def index
      method ordered_subscriptions (line 12) | def ordered_subscriptions
      method requested_page (line 16) | def requested_page

FILE: app/controllers/admin/tags_controller.rb
  type Admin (line 3) | module Admin
    class TagsController (line 4) | class TagsController < BaseController
      method index (line 9) | def index
      method hide (line 13) | def hide
      method unhide (line 19) | def unhide
      method set_tags (line 27) | def set_tags
      method set_tag (line 32) | def set_tag
      method set_filter_params (line 36) | def set_filter_params
      method filter_params (line 40) | def filter_params

FILE: app/controllers/admin/two_factor_authentications_controller.rb
  type Admin (line 3) | module Admin
    class TwoFactorAuthenticationsController (line 4) | class TwoFactorAuthenticationsController < BaseController
      method destroy (line 7) | def destroy
      method set_target_user (line 16) | def set_target_user

FILE: app/controllers/admin/warning_presets_controller.rb
  type Admin (line 3) | module Admin
    class WarningPresetsController (line 4) | class WarningPresetsController < BaseController
      method index (line 7) | def index
      method create (line 14) | def create
      method edit (line 27) | def edit
      method update (line 31) | def update
      method destroy (line 41) | def destroy
      method set_warning_preset (line 50) | def set_warning_preset
      method warning_preset_params (line 54) | def warning_preset_params

FILE: app/controllers/api/base_controller.rb
  class Api::BaseController (line 3) | class Api::BaseController < ApplicationController
    method doorkeeper_unauthorized_render_options (line 36) | def doorkeeper_unauthorized_render_options(error: nil)
    method doorkeeper_forbidden_render_options (line 40) | def doorkeeper_forbidden_render_options(*)
    method set_pagination_headers (line 46) | def set_pagination_headers(next_path = nil, prev_path = nil)
    method limit_param (line 53) | def limit_param(default_limit)
    method params_slice (line 58) | def params_slice(*keys)
    method current_resource_owner (line 62) | def current_resource_owner
    method current_user (line 66) | def current_user
    method require_user! (line 72) | def require_user!
    method render_empty (line 86) | def render_empty
    method authorize_if_got_token! (line 90) | def authorize_if_got_token!(*scopes)
    method set_cache_headers (line 94) | def set_cache_headers

FILE: app/controllers/api/oembed_controller.rb
  class Api::OEmbedController (line 3) | class Api::OEmbedController < Api::BaseController
    method show (line 6) | def show
    method status_finder (line 13) | def status_finder
    method maxwidth_or_default (line 17) | def maxwidth_or_default
    method maxheight_or_default (line 21) | def maxheight_or_default

FILE: app/controllers/api/proofs_controller.rb
  class Api::ProofsController (line 3) | class Api::ProofsController < Api::BaseController
    method index (line 9) | def index
    method set_provider (line 15) | def set_provider
    method set_account (line 19) | def set_account
    method check_account_approval (line 23) | def check_account_approval
    method check_account_suspension (line 27) | def check_account_suspension

FILE: app/controllers/api/push_controller.rb
  class Api::PushController (line 3) | class Api::PushController < Api::BaseController
    method update (line 6) | def update
    method process_push_request (line 13) | def process_push_request
    method hub_mode (line 24) | def hub_mode
    method hub_topic (line 28) | def hub_topic
    method hub_callback (line 32) | def hub_callback
    method hub_lease_seconds (line 36) | def hub_lease_seconds
    method hub_secret (line 40) | def hub_secret
    method account_from_topic (line 44) | def account_from_topic
    method hub_topic_params (line 50) | def hub_topic_params
    method hub_topic_uri (line 54) | def hub_topic_uri
    method local_domain? (line 58) | def local_domain?
    method verified_domain (line 62) | def verified_domain
    method hub_topic_domain (line 66) | def hub_topic_domain
    method account_feed_path? (line 70) | def account_feed_path?

FILE: app/controllers/api/salmon_controller.rb
  class Api::SalmonController (line 3) | class Api::SalmonController < Api::BaseController
    method update (line 9) | def update
    method set_account (line 22) | def set_account
    method payload (line 26) | def payload
    method verify_payload? (line 30) | def verify_payload?
    method process_salmon (line 34) | def process_salmon

FILE: app/controllers/api/subscriptions_controller.rb
  class Api::SubscriptionsController (line 3) | class Api::SubscriptionsController < Api::BaseController
    method show (line 7) | def show
    method update (line 16) | def update
    method subscription (line 26) | def subscription
    method body (line 32) | def body
    method encoded_challenge (line 36) | def encoded_challenge
    method future_expires (line 40) | def future_expires
    method lease_seconds_or_default (line 44) | def lease_seconds_or_default
    method set_account (line 48) | def set_account

FILE: app/controllers/api/v1/accounts/credentials_controller.rb
  class Api::V1::Accounts::CredentialsController (line 3) | class Api::V1::Accounts::CredentialsController < Api::BaseController
    method show (line 8) | def show
    method update (line 13) | def update
    method account_params (line 23) | def account_params
    method user_settings_params (line 27) | def user_settings_params

FILE: app/controllers/api/v1/accounts/follower_accounts_controller.rb
  class Api::V1::Accounts::FollowerAccountsController (line 3) | class Api::V1::Accounts::FollowerAccountsController < Api::BaseController
    method index (line 10) | def index
    method set_account (line 17) | def set_account
    method load_accounts (line 21) | def load_accounts
    method hide_results? (line 27) | def hide_results?
    method default_accounts (line 31) | def default_accounts
    method paginated_follows (line 35) | def paginated_follows
    method insert_pagination_headers (line 43) | def insert_pagination_headers
    method next_path (line 47) | def next_path
    method prev_path (line 53) | def prev_path
    method pagination_max_id (line 59) | def pagination_max_id
    method pagination_since_id (line 63) | def pagination_since_id
    method records_continue? (line 67) | def records_continue?
    method pagination_params (line 71) | def pagination_params(core_params)

FILE: app/controllers/api/v1/accounts/following_accounts_controller.rb
  class Api::V1::Accounts::FollowingAccountsController (line 3) | class Api::V1::Accounts::FollowingAccountsController < Api::BaseController
    method index (line 10) | def index
    method set_account (line 17) | def set_account
    method load_accounts (line 21) | def load_accounts
    method hide_results? (line 27) | def hide_results?
    method default_accounts (line 31) | def default_accounts
    method paginated_follows (line 35) | def paginated_follows
    method insert_pagination_headers (line 43) | def insert_pagination_headers
    method next_path (line 47) | def next_path
    method prev_path (line 53) | def prev_path
    method pagination_max_id (line 59) | def pagination_max_id
    method pagination_since_id (line 63) | def pagination_since_id
    method records_continue? (line 67) | def records_continue?
    method pagination_params (line 71) | def pagination_params(core_params)

FILE: app/controllers/api/v1/accounts/identity_proofs_controller.rb
  class Api::V1::Accounts::IdentityProofsController (line 3) | class Api::V1::Accounts::IdentityProofsController < Api::BaseController
    method index (line 9) | def index
    method set_account (line 16) | def set_account

FILE: app/controllers/api/v1/accounts/lists_controller.rb
  class Api::V1::Accounts::ListsController (line 3) | class Api::V1::Accounts::ListsController < Api::BaseController
    method index (line 10) | def index
    method set_account (line 17) | def set_account

FILE: app/controllers/api/v1/accounts/pins_controller.rb
  class Api::V1::Accounts::PinsController (line 3) | class Api::V1::Accounts::PinsController < Api::BaseController
    method create (line 12) | def create
    method destroy (line 17) | def destroy
    method set_account (line 25) | def set_account
    method relationships_presenter (line 29) | def relationships_presenter

FILE: app/controllers/api/v1/accounts/relationships_controller.rb
  class Api::V1::Accounts::RelationshipsController (line 3) | class Api::V1::Accounts::RelationshipsController < Api::BaseController
    method index (line 9) | def index
    method relationships (line 19) | def relationships
    method account_ids (line 23) | def account_ids

FILE: app/controllers/api/v1/accounts/search_controller.rb
  class Api::V1::Accounts::SearchController (line 3) | class Api::V1::Accounts::SearchController < Api::BaseController
    method show (line 9) | def show
    method account_search (line 16) | def account_search

FILE: app/controllers/api/v1/accounts/statuses_controller.rb
  class Api::V1::Accounts::StatusesController (line 3) | class Api::V1::Accounts::StatusesController < Api::BaseController
    method index (line 10) | def index
    method set_account (line 17) | def set_account
    method load_statuses (line 21) | def load_statuses
    method cached_account_statuses (line 25) | def cached_account_statuses
    method account_statuses (line 29) | def account_statuses
    method permitted_account_statuses (line 41) | def permitted_account_statuses
    method only_media_scope (line 45) | def only_media_scope
    method account_media_status_ids (line 49) | def account_media_status_ids
    method pinned_scope (line 59) | def pinned_scope
    method no_replies_scope (line 63) | def no_replies_scope
    method no_reblogs_scope (line 67) | def no_reblogs_scope
    method hashtag_scope (line 71) | def hashtag_scope
    method pagination_params (line 81) | def pagination_params(core_params)
    method insert_pagination_headers (line 85) | def insert_pagination_headers
    method next_path (line 89) | def next_path
    method prev_path (line 95) | def prev_path
    method records_continue? (line 101) | def records_continue?
    method pagination_max_id (line 105) | def pagination_max_id
    method pagination_since_id (line 109) | def pagination_since_id

FILE: app/controllers/api/v1/accounts_controller.rb
  class Api::V1::AccountsController (line 3) | class Api::V1::AccountsController < Api::BaseController
    method show (line 17) | def show
    method create (line 21) | def create
    method follow (line 31) | def follow
    method block (line 39) | def block
    method mute (line 44) | def mute
    method unfollow (line 49) | def unfollow
    method unblock (line 54) | def unblock
    method unmute (line 59) | def unmute
    method set_account (line 66) | def set_account
    method relationships (line 70) | def relationships(**options)
    method check_account_suspension (line 74) | def check_account_suspension
    method account_params (line 78) | def account_params
    method check_enabled_registrations (line 82) | def check_enabled_registrations
    method allowed_registrations? (line 86) | def allowed_registrations?

FILE: app/controllers/api/v1/apps/credentials_controller.rb
  class Api::V1::Apps::CredentialsController (line 3) | class Api::V1::Apps::CredentialsController < Api::BaseController
    method show (line 8) | def show

FILE: app/controllers/api/v1/apps_controller.rb
  class Api::V1::AppsController (line 3) | class Api::V1::AppsController < Api::BaseController
    method create (line 4) | def create
    method application_options (line 11) | def application_options
    method app_scopes_or_default (line 20) | def app_scopes_or_default
    method app_params (line 24) | def app_params

FILE: app/controllers/api/v1/blocks_controller.rb
  class Api::V1::BlocksController (line 3) | class Api::V1::BlocksController < Api::BaseController
    method index (line 10) | def index
    method load_accounts (line 17) | def load_accounts
    method paginated_blocks (line 21) | def paginated_blocks
    method insert_pagination_headers (line 31) | def insert_pagination_headers
    method next_path (line 35) | def next_path
    method prev_path (line 41) | def prev_path
    method pagination_max_id (line 47) | def pagination_max_id
    method pagination_since_id (line 51) | def pagination_since_id
    method records_continue? (line 55) | def records_continue?
    method pagination_params (line 59) | def pagination_params(core_params)

FILE: app/controllers/api/v1/conversations_controller.rb
  class Api::V1::ConversationsController (line 3) | class Api::V1::ConversationsController < Api::BaseController
    method index (line 14) | def index
    method read (line 19) | def read
    method destroy (line 24) | def destroy
    method set_conversation (line 31) | def set_conversation
    method paginated_conversations (line 35) | def paginated_conversations
    method insert_pagination_headers (line 40) | def insert_pagination_headers
    method next_path (line 44) | def next_path
    method prev_path (line 50) | def prev_path
    method pagination_max_id (line 56) | def pagination_max_id
    method pagination_since_id (line 60) | def pagination_since_id
    method records_continue? (line 64) | def records_continue?
    method pagination_params (line 68) | def pagination_params(core_params)

FILE: app/controllers/api/v1/custom_emojis_controller.rb
  class Api::V1::CustomEmojisController (line 3) | class Api::V1::CustomEmojisController < Api::BaseController
    method index (line 8) | def index

FILE: app/controllers/api/v1/domain_blocks_controller.rb
  class Api::V1::DomainBlocksController (line 3) | class Api::V1::DomainBlocksController < Api::BaseController
    method show (line 13) | def show
    method create (line 18) | def create
    method destroy (line 24) | def destroy
    method load_domain_blocks (line 31) | def load_domain_blocks
    method account_domain_blocks (line 39) | def account_domain_blocks
    method insert_pagination_headers (line 43) | def insert_pagination_headers
    method next_path (line 47) | def next_path
    method prev_path (line 53) | def prev_path
    method pagination_max_id (line 59) | def pagination_max_id
    method pagination_since_id (line 63) | def pagination_since_id
    method records_continue? (line 67) | def records_continue?
    method pagination_params (line 71) | def pagination_params(core_params)
    method domain_block_params (line 75) | def domain_block_params

FILE: app/controllers/api/v1/endorsements_controller.rb
  class Api::V1::EndorsementsController (line 3) | class Api::V1::EndorsementsController < Api::BaseController
    method index (line 10) | def index
    method load_accounts (line 17) | def load_accounts
    method endorsed_accounts (line 29) | def endorsed_accounts
    method insert_pagination_headers (line 33) | def insert_pagination_headers
    method next_path (line 37) | def next_path
    method prev_path (line 45) | def prev_path
    method pagination_max_id (line 53) | def pagination_max_id
    method pagination_since_id (line 57) | def pagination_since_id
    method records_continue? (line 61) | def records_continue?
    method pagination_params (line 65) | def pagination_params(core_params)
    method unlimited? (line 69) | def unlimited?

FILE: app/controllers/api/v1/favourites_controller.rb
  class Api::V1::FavouritesController (line 3) | class Api::V1::FavouritesController < Api::BaseController
    method index (line 10) | def index
    method load_statuses (line 17) | def load_statuses
    method cached_favourites (line 21) | def cached_favourites
    method results (line 28) | def results
    method account_favourites (line 35) | def account_favourites
    method insert_pagination_headers (line 39) | def insert_pagination_headers
    method next_path (line 43) | def next_path
    method prev_path (line 49) | def prev_path
    method pagination_max_id (line 55) | def pagination_max_id
    method pagination_since_id (line 59) | def pagination_since_id
    method records_continue? (line 63) | def records_continue?
    method pagination_params (line 67) | def pagination_params(core_params)

FILE: app/controllers/api/v1/filters_controller.rb
  class Api::V1::FiltersController (line 3) | class Api::V1::FiltersController < Api::BaseController
    method index (line 12) | def index
    method create (line 16) | def create
    method show (line 21) | def show
    method update (line 25) | def update
    method destroy (line 30) | def destroy
    method set_filters (line 37) | def set_filters
    method set_filter (line 41) | def set_filter
    method resource_params (line 45) | def resource_params

FILE: app/controllers/api/v1/follow_requests_controller.rb
  class Api::V1::FollowRequestsController (line 3) | class Api::V1::FollowRequestsController < Api::BaseController
    method index (line 9) | def index
    method authorize (line 14) | def authorize
    method reject (line 20) | def reject
    method account (line 27) | def account
    method load_accounts (line 31) | def load_accounts
    method default_accounts (line 35) | def default_accounts
    method paginated_follow_requests (line 39) | def paginated_follow_requests
    method insert_pagination_headers (line 47) | def insert_pagination_headers
    method next_path (line 51) | def next_path
    method prev_path (line 57) | def prev_path
    method pagination_max_id (line 63) | def pagination_max_id
    method pagination_since_id (line 67) | def pagination_since_id
    method records_continue? (line 71) | def records_continue?
    method pagination_params (line 75) | def pagination_params(core_params)

FILE: app/controllers/api/v1/follows_controller.rb
  class Api::V1::FollowsController (line 3) | class Api::V1::FollowsController < Api::BaseController
    method create (line 9) | def create
    method target_uri (line 24) | def target_uri
    method follow_params (line 28) | def follow_params

FILE: app/controllers/api/v1/instances/activity_controller.rb
  class Api::V1::Instances::ActivityController (line 3) | class Api::V1::Instances::ActivityController < Api::BaseController
    method show (line 9) | def show
    method activity (line 15) | def activity
    method require_enabled_api! (line 34) | def require_enabled_api!

FILE: app/controllers/api/v1/instances/peers_controller.rb
  class Api::V1::Instances::PeersController (line 3) | class Api::V1::Instances::PeersController < Api::BaseController
    method index (line 9) | def index
    method require_enabled_api! (line 15) | def require_enabled_api!

FILE: app/controllers/api/v1/instances_controller.rb
  class Api::V1::InstancesController (line 3) | class Api::V1::InstancesController < Api::BaseController
    method show (line 7) | def show

FILE: app/controllers/api/v1/lists/accounts_controller.rb
  class Api::V1::Lists::AccountsController (line 3) | class Api::V1::Lists::AccountsController < Api::BaseController
    method show (line 12) | def show
    method create (line 17) | def create
    method destroy (line 27) | def destroy
    method set_list (line 34) | def set_list
    method load_accounts (line 38) | def load_accounts
    method list_accounts (line 46) | def list_accounts
    method account_ids (line 50) | def account_ids
    method resource_params (line 54) | def resource_params
    method insert_pagination_headers (line 58) | def insert_pagination_headers
    method next_path (line 62) | def next_path
    method prev_path (line 70) | def prev_path
    method pagination_max_id (line 78) | def pagination_max_id
    method pagination_since_id (line 82) | def pagination_since_id
    method records_continue? (line 86) | def records_continue?
    method pagination_params (line 90) | def pagination_params(core_params)
    method unlimited? (line 94) | def unlimited?

FILE: app/controllers/api/v1/lists_controller.rb
  class Api::V1::ListsController (line 3) | class Api::V1::ListsController < Api::BaseController
    method index (line 10) | def index
    method show (line 15) | def show
    method create (line 19) | def create
    method update (line 24) | def update
    method destroy (line 29) | def destroy
    method set_list (line 36) | def set_list
    method list_params (line 40) | def list_params

FILE: app/controllers/api/v1/media_controller.rb
  class Api::V1::MediaController (line 3) | class Api::V1::MediaController < Api::BaseController
    method create (line 12) | def create
    method update (line 21) | def update
    method media_params (line 29) | def media_params
    method file_type_error (line 33) | def file_type_error
    method processing_error (line 37) | def processing_error

FILE: app/controllers/api/v1/mutes_controller.rb
  class Api::V1::MutesController (line 3) | class Api::V1::MutesController < Api::BaseController
    method index (line 10) | def index
    method load_accounts (line 17) | def load_accounts
    method paginated_mutes (line 21) | def paginated_mutes
    method insert_pagination_headers (line 31) | def insert_pagination_headers
    method next_path (line 35) | def next_path
    method prev_path (line 41) | def prev_path
    method pagination_max_id (line 47) | def pagination_max_id
    method pagination_since_id (line 51) | def pagination_since_id
    method records_continue? (line 55) | def records_continue?
    method pagination_params (line 59) | def pagination_params(core_params)

FILE: app/controllers/api/v1/notifications_controller.rb
  class Api::V1::NotificationsController (line 3) | class Api::V1::NotificationsController < Api::BaseController
    method index (line 13) | def index
    method show (line 18) | def show
    method clear (line 23) | def clear
    method dismiss (line 28) | def dismiss
    method load_notifications (line 35) | def load_notifications
    method paginated_notifications (line 39) | def paginated_notifications
    method browserable_account_notifications (line 46) | def browserable_account_notifications
    method target_statuses_from_notifications (line 50) | def target_statuses_from_notifications
    method insert_pagination_headers (line 54) | def insert_pagination_headers
    method next_path (line 58) | def next_path
    method prev_path (line 64) | def prev_path
    method pagination_max_id (line 70) | def pagination_max_id
    method pagination_since_id (line 74) | def pagination_since_id
    method exclude_types (line 78) | def exclude_types
    method from_account (line 84) | def from_account
    method pagination_params (line 88) | def pagination_params(core_params)

FILE: app/controllers/api/v1/polls/votes_controller.rb
  class Api::V1::Polls::VotesController (line 3) | class Api::V1::Polls::VotesController < Api::BaseController
    method create (line 12) | def create
    method set_poll (line 19) | def set_poll
    method vote_params (line 26) | def vote_params

FILE: app/controllers/api/v1/polls_controller.rb
  class Api::V1::PollsController (line 3) | class Api::V1::PollsController < Api::BaseController
    method show (line 12) | def show
    method set_poll (line 18) | def set_poll
    method refresh_poll (line 25) | def refresh_poll

FILE: app/controllers/api/v1/preferences_controller.rb
  class Api::V1::PreferencesController (line 3) | class Api::V1::PreferencesController < Api::BaseController
    method index (line 9) | def index

FILE: app/controllers/api/v1/push/subscriptions_controller.rb
  class Api::V1::Push::SubscriptionsController (line 3) | class Api::V1::Push::SubscriptionsController < Api::BaseController
    method create (line 8) | def create
    method show (line 23) | def show
    method update (line 29) | def update
    method destroy (line 37) | def destroy
    method set_web_push_subscription (line 44) | def set_web_push_subscription
    method subscription_params (line 48) | def subscription_params
    method data_params (line 52) | def data_params

FILE: app/controllers/api/v1/reports_controller.rb
  class Api::V1::ReportsController (line 3) | class Api::V1::ReportsController < Api::BaseController
    method create (line 9) | def create
    method reported_status_ids (line 23) | def reported_status_ids
    method status_ids (line 27) | def status_ids
    method reported_account (line 31) | def reported_account
    method report_params (line 35) | def report_params

FILE: app/controllers/api/v1/scheduled_statuses_controller.rb
  class Api::V1::ScheduledStatusesController (line 3) | class Api::V1::ScheduledStatusesController < Api::BaseController
    method index (line 14) | def index
    method show (line 18) | def show
    method update (line 22) | def update
    method destroy (line 27) | def destroy
    method set_statuses (line 34) | def set_statuses
    method set_status (line 38) | def set_status
    method scheduled_status_params (line 42) | def scheduled_status_params
    method pagination_params (line 46) | def pagination_params(core_params)
    method insert_pagination_headers (line 50) | def insert_pagination_headers
    method next_path (line 54) | def next_path
    method prev_path (line 60) | def prev_path
    method records_continue? (line 66) | def records_continue?
    method pagination_max_id (line 70) | def pagination_max_id
    method pagination_since_id (line 74) | def pagination_since_id

FILE: app/controllers/api/v1/search_controller.rb
  class Api::V1::SearchController (line 3) | class Api::V1::SearchController < Api::BaseController
    method index (line 13) | def index
    method search_results (line 20) | def search_results
    method search_params (line 29) | def search_params

FILE: app/controllers/api/v1/statuses/favourited_by_accounts_controller.rb
  class Api::V1::Statuses::FavouritedByAccountsController (line 3) | class Api::V1::Statuses::FavouritedByAccountsController < Api::BaseContr...
    method index (line 12) | def index
    method load_accounts (line 19) | def load_accounts
    method default_accounts (line 23) | def default_accounts
    method paginated_favourites (line 30) | def paginated_favourites
    method insert_pagination_headers (line 38) | def insert_pagination_headers
    method next_path (line 42) | def next_path
    method prev_path (line 48) | def prev_path
    method pagination_max_id (line 54) | def pagination_max_id
    method pagination_since_id (line 58) | def pagination_since_id
    method records_continue? (line 62) | def records_continue?
    method set_status (line 66) | def set_status
    method pagination_params (line 74) | def pagination_params(core_params)

FILE: app/controllers/api/v1/statuses/favourites_controller.rb
  class Api::V1::Statuses::FavouritesController (line 3) | class Api::V1::Statuses::FavouritesController < Api::BaseController
    method create (line 11) | def create
    method destroy (line 16) | def destroy
    method favourited_status (line 27) | def favourited_status
    method service_result (line 31) | def service_result
    method requested_status (line 35) | def requested_status

FILE: app/controllers/api/v1/statuses/mutes_controller.rb
  class Api::V1::Statuses::MutesController (line 3) | class Api::V1::Statuses::MutesController < Api::BaseController
    method create (line 13) | def create
    method destroy (line 20) | def destroy
    method set_status (line 29) | def set_status
    method set_conversation (line 37) | def set_conversation

FILE: app/controllers/api/v1/statuses/pins_controller.rb
  class Api::V1::Statuses::PinsController (line 3) | class Api::V1::Statuses::PinsController < Api::BaseController
    method create (line 12) | def create
    method destroy (line 18) | def destroy
    method set_status (line 31) | def set_status
    method distribute_add_activity! (line 35) | def distribute_add_activity!
    method distribute_remove_activity! (line 45) | def distribute_remove_activity!

FILE: app/controllers/api/v1/statuses/reblogged_by_accounts_controller.rb
  class Api::V1::Statuses::RebloggedByAccountsController (line 3) | class Api::V1::Statuses::RebloggedByAccountsController < Api::BaseContro...
    method index (line 12) | def index
    method load_accounts (line 19) | def load_accounts
    method default_accounts (line 23) | def default_accounts
    method paginated_statuses (line 27) | def paginated_statuses
    method insert_pagination_headers (line 35) | def insert_pagination_headers
    method next_path (line 39) | def next_path
    method prev_path (line 45) | def prev_path
    method pagination_max_id (line 51) | def pagination_max_id
    method pagination_since_id (line 55) | def pagination_since_id
    method records_continue? (line 59) | def records_continue?
    method set_status (line 63) | def set_status
    method pagination_params (line 71) | def pagination_params(core_params)

FILE: app/controllers/api/v1/statuses/reblogs_controller.rb
  class Api::V1::Statuses::ReblogsController (line 3) | class Api::V1::Statuses::ReblogsController < Api::BaseController
    method create (line 11) | def create
    method destroy (line 16) | def destroy
    method status_for_reblog (line 28) | def status_for_reblog
    method status_for_destroy (line 32) | def status_for_destroy
    method reblog_params (line 36) | def reblog_params

FILE: app/controllers/api/v1/statuses_controller.rb
  class Api::V1::StatusesController (line 3) | class Api::V1::StatusesController < Api::BaseController
    method show (line 19) | def show
    method context (line 24) | def context
    method card (line 36) | def card
    method create (line 46) | def create
    method destroy (line 62) | def destroy
    method set_status (line 73) | def set_status
    method status_params (line 80) | def status_params
    method pagination_params (line 98) | def pagination_params(core_params)

FILE: app/controllers/api/v1/streaming_controller.rb
  class Api::V1::StreamingController (line 3) | class Api::V1::StreamingController < Api::BaseController
    method index (line 6) | def index

FILE: app/controllers/api/v1/suggestions_controller.rb
  class Api::V1::SuggestionsController (line 3) | class Api::V1::SuggestionsController < Api::BaseController
    method index (line 12) | def index
    method destroy (line 16) | def destroy
    method set_accounts (line 23) | def set_accounts

FILE: app/controllers/api/v1/timelines/direct_controller.rb
  class Api::V1::Timelines::DirectController (line 3) | class Api::V1::Timelines::DirectController < Api::BaseController
    method show (line 10) | def show
    method load_statuses (line 17) | def load_statuses
    method cached_direct_statuses (line 21) | def cached_direct_statuses
    method direct_statuses (line 25) | def direct_statuses
    method direct_timeline_statuses (line 29) | def direct_timeline_statuses
    method insert_pagination_headers (line 40) | def insert_pagination_headers
    method pagination_params (line 44) | def pagination_params(core_params)
    method next_path (line 48) | def next_path
    method prev_path (line 52) | def prev_path
    method pagination_max_id (line 56) | def pagination_max_id
    method pagination_since_id (line 60) | def pagination_since_id

FILE: app/controllers/api/v1/timelines/home_controller.rb
  class Api::V1::Timelines::HomeController (line 3) | class Api::V1::Timelines::HomeController < Api::BaseController
    method show (line 10) | def show
    method load_statuses (line 21) | def load_statuses
    method cached_home_statuses (line 25) | def cached_home_statuses
    method home_statuses (line 29) | def home_statuses
    method account_home_feed (line 38) | def account_home_feed
    method insert_pagination_headers (line 42) | def insert_pagination_headers
    method pagination_params (line 46) | def pagination_params(core_params)
    method next_path (line 50) | def next_path
    method prev_path (line 54) | def prev_path
    method pagination_max_id (line 58) | def pagination_max_id
    method pagination_since_id (line 62) | def pagination_since_id
    method regeneration_in_progress? (line 66) | def regeneration_in_progress?

FILE: app/controllers/api/v1/timelines/list_controller.rb
  class Api::V1::Timelines::ListController (line 3) | class Api::V1::Timelines::ListController < Api::BaseController
    method show (line 11) | def show
    method set_list (line 19) | def set_list
    method set_statuses (line 23) | def set_statuses
    method cached_list_statuses (line 27) | def cached_list_statuses
    method list_statuses (line 31) | def list_statuses
    method list_feed (line 40) | def list_feed
    method insert_pagination_headers (line 44) | def insert_pagination_headers
    method pagination_params (line 48) | def pagination_params(core_params)
    method next_path (line 52) | def next_path
    method prev_path (line 56) | def prev_path
    method pagination_max_id (line 60) | def pagination_max_id
    method pagination_since_id (line 64) | def pagination_since_id

FILE: app/controllers/api/v1/timelines/public_controller.rb
  class Api::V1::Timelines::PublicController (line 3) | class Api::V1::Timelines::PublicController < Api::BaseController
    method show (line 8) | def show
    method load_statuses (line 15) | def load_statuses
    method cached_public_statuses (line 19) | def cached_public_statuses
    method public_statuses (line 23) | def public_statuses
    method public_timeline_statuses (line 38) | def public_timeline_statuses
    method insert_pagination_headers (line 42) | def insert_pagination_headers
    method pagination_params (line 46) | def pagination_params(core_params)
    method next_path (line 50) | def next_path
    method prev_path (line 54) | def prev_path
    method pagination_max_id (line 58) | def pagination_max_id
    method pagination_since_id (line 62) | def pagination_since_id

FILE: app/controllers/api/v1/timelines/tag_controller.rb
  class Api::V1::Timelines::TagController (line 3) | class Api::V1::Timelines::TagController < Api::BaseController
    method show (line 9) | def show
    method load_tag (line 16) | def load_tag
    method load_statuses (line 20) | def load_statuses
    method cached_tagged_statuses (line 24) | def cached_tagged_statuses
    method tagged_statuses (line 28) | def tagged_statuses
    method tag_timeline_statuses (line 47) | def tag_timeline_statuses
    method insert_pagination_headers (line 51) | def insert_pagination_headers
    method pagination_params (line 55) | def pagination_params(core_params)
    method next_path (line 59) | def next_path
    method prev_path (line 63) | def prev_path
    method pagination_max_id (line 67) | def pagination_max_id
    method pagination_since_id (line 71) | def pagination_since_id

FILE: app/controllers/api/v2/search_controller.rb
  class Api::V2::SearchController (line 3) | class Api::V2::SearchController < Api::V1::SearchController
    method index (line 4) | def index

FILE: app/controllers/api/web/base_controller.rb
  class Api::Web::BaseController (line 3) | class Api::Web::BaseController < Api::BaseController

FILE: app/controllers/api/web/embeds_controller.rb
  class Api::Web::EmbedsController (line 3) | class Api::Web::EmbedsController < Api::Web::BaseController
    method create (line 8) | def create

FILE: app/controllers/api/web/push_subscriptions_controller.rb
  class Api::Web::PushSubscriptionsController (line 3) | class Api::Web::PushSubscriptionsController < Api::Web::BaseController
    method create (line 8) | def create
    method update (line 45) | def update
    method subscription_params (line 56) | def subscription_params
    method data_params (line 60) | def data_params

FILE: app/controllers/api/web/settings_controller.rb
  class Api::Web::SettingsController (line 3) | class Api::Web::SettingsController < Api::Web::BaseController
    method update (line 8) | def update
    method setting (line 17) | def setting

FILE: app/controllers/application_controller.rb
  class ApplicationController (line 3) | class ApplicationController < ActionController::Base
    method raise_not_found (line 29) | def raise_not_found
    method https_enabled? (line 35) | def https_enabled?
    method store_current_location (line 39) | def store_current_location
    method require_admin! (line 43) | def require_admin!
    method require_staff! (line 47) | def require_staff!
    method check_user_permissions (line 51) | def check_user_permissions
    method after_sign_out_path_for (line 55) | def after_sign_out_path_for(_resource_or_scope)
    method truthy_param? (line 61) | def truthy_param?(key)
    method forbidden (line 65) | def forbidden
    method not_found (line 69) | def not_found
    method gone (line 73) | def gone
    method unprocessable_entity (line 77) | def unprocessable_entity
    method not_acceptable (line 81) | def not_acceptable
    method single_user_mode? (line 85) | def single_user_mode?
    method use_seamless_external_login? (line 89) | def use_seamless_external_login?
    method current_account (line 93) | def current_account
    method current_session (line 97) | def current_session
    method current_theme (line 101) | def current_theme
    method cache_collection (line 106) | def cache_collection(raw, klass)
    method respond_with_error (line 126) | def respond_with_error(code)
    method render_cached_json (line 137) | def render_cached_json(cache_key, **options)
    method set_cache_headers (line 150) | def set_cache_headers
    method mark_cacheable! (line 154) | def mark_cacheable!

FILE: app/controllers/auth/confirmations_controller.rb
  class Auth::ConfirmationsController (line 3) | class Auth::ConfirmationsController < Devise::ConfirmationsController
    method finish_signup (line 9) | def finish_signup
    method set_user (line 23) | def set_user
    method set_body_classes (line 27) | def set_body_classes
    method user_params (line 31) | def user_params
    method after_confirmation_path_for (line 35) | def after_confirmation_path_for(_resource_name, user)

FILE: app/controllers/auth/omniauth_callbacks_controller.rb
  class Auth::OmniauthCallbacksController (line 3) | class Auth::OmniauthCallbacksController < Devise::OmniauthCallbacksContr...
    method provides_callback_for (line 6) | def self.provides_callback_for(provider)
    method after_sign_in_path_for (line 26) | def after_sign_in_path_for(resource)

FILE: app/controllers/auth/passwords_controller.rb
  class Auth::PasswordsController (line 3) | class Auth::PasswordsController < Devise::PasswordsController
    method check_validity_of_reset_password_token (line 11) | def check_validity_of_reset_password_token
    method set_body_classes (line 18) | def set_body_classes
    method reset_password_token_is_valid? (line 22) | def reset_password_token_is_valid?

FILE: app/controllers/auth/registrations_controller.rb
  class Auth::RegistrationsController (line 3) | class Auth::RegistrationsController < Devise::RegistrationsController
    method new (line 13) | def new
    method destroy (line 17) | def destroy
    method update_resource (line 23) | def update_resource(resource, params)
    method build_resource (line 28) | def build_resource(hash = nil)
    method configure_sign_up_params (line 39) | def configure_sign_up_params
    method after_sign_up_path_for (line 45) | def after_sign_up_path_for(_resource)
    method after_sign_in_path_for (line 49) | def after_sign_in_path_for(_resource)
    method after_inactive_sign_up_path_for (line 59) | def after_inactive_sign_up_path_for(_resource)
    method after_update_path_for (line 63) | def after_update_path_for(_resource)
    method check_enabled_registrations (line 67) | def check_enabled_registrations
    method allowed_registrations? (line 71) | def allowed_registrations?
    method invite_code (line 75) | def invite_code
    method set_instance_presenter (line 85) | def set_instance_presenter
    method set_body_classes (line 89) | def set_body_classes
    method set_invite (line 93) | def set_invite
    method determine_layout (line 98) | def determine_layout
    method set_sessions (line 102) | def set_sessions

FILE: app/controllers/auth/sessions_controller.rb
  class Auth::SessionsController (line 3) | class Auth::SessionsController < Devise::SessionsController
    method new (line 14) | def new
    method create (line 22) | def create
    method destroy (line 29) | def destroy
    method find_user (line 38) | def find_user
    method user_params (line 50) | def user_params
    method after_sign_in_path_for (line 54) | def after_sign_in_path_for(resource)
    method after_sign_out_path_for (line 64) | def after_sign_out_path_for(_resource_or_scope)
    method two_factor_enabled? (line 72) | def two_factor_enabled?
    method valid_otp_attempt? (line 76) | def valid_otp_attempt?(user)
    method authenticate_with_two_factor (line 83) | def authenticate_with_two_factor
    method authenticate_with_two_factor_via_otp (line 93) | def authenticate_with_two_factor_via_otp(user)
    method prompt_for_two_factor (line 104) | def prompt_for_two_factor(user)
    method set_instance_presenter (line 111) | def set_instance_presenter
    method set_body_classes (line 115) | def set_body_classes
    method home_paths (line 119) | def home_paths(resource)
    method continue_after? (line 127) | def continue_after?

FILE: app/controllers/authorize_interactions_controller.rb
  class AuthorizeInteractionsController (line 3) | class AuthorizeInteractionsController < ApplicationController
    method show (line 12) | def show
    method create (line 22) | def create
    method set_resource (line 34) | def set_resource
    method located_resource (line 39) | def located_resource
    method account_from_remote_follow (line 47) | def account_from_remote_follow
    method uri_param_is_url? (line 51) | def uri_param_is_url?
    method parsed_uri (line 55) | def parsed_uri
    method uri_param (line 59) | def uri_param
    method set_body_classes (line 63) | def set_body_classes

FILE: app/controllers/concerns/account_controller_concern.rb
  type AccountControllerConcern (line 3) | module AccountControllerConcern
    function set_account (line 20) | def set_account
    function set_instance_presenter (line 24) | def set_instance_presenter
    function set_link_headers (line 28) | def set_link_headers
    function username_param (line 38) | def username_param
    function webfinger_account_link (line 42) | def webfinger_account_link
    function atom_account_url_link (line 49) | def atom_account_url_link
    function actor_url_link (line 56) | def actor_url_link
    function webfinger_account_url (line 63) | def webfinger_account_url
    function check_account_approval (line 67) | def check_account_approval
    function check_account_suspension (line 71) | def check_account_suspension

FILE: app/controllers/concerns/accountable_concern.rb
  type AccountableConcern (line 3) | module AccountableConcern
    function log_action (line 6) | def log_action(action, target)

FILE: app/controllers/concerns/authorization.rb
  type Authorization (line 3) | module Authorization
    function pundit_user (line 8) | def pundit_user
    function authorize (line 12) | def authorize(*)
    function authorize_with (line 18) | def authorize_with(user, record, query)

FILE: app/controllers/concerns/export_controller_concern.rb
  type ExportControllerConcern (line 3) | module ExportControllerConcern
    function load_export (line 13) | def load_export
    function send_export_file (line 17) | def send_export_file
    function export_data (line 23) | def export_data
    function export_filename (line 27) | def export_filename

FILE: app/controllers/concerns/localized.rb
  type Localized (line 3) | module Localized
    function set_locale (line 12) | def set_locale
    function default_locale (line 19) | def default_locale
    function request_locale (line 27) | def request_locale
    function preferred_locale (line 31) | def preferred_locale
    function compatible_locale (line 35) | def compatible_locale
    function available_locales (line 39) | def available_locales

FILE: app/controllers/concerns/obfuscate_filename.rb
  type ObfuscateFilename (line 3) | module ObfuscateFilename
    function obfuscate_filename (line 7) | def obfuscate_filename(path)

FILE: app/controllers/concerns/rate_limit_headers.rb
  type RateLimitHeaders (line 3) | module RateLimitHeaders
    function set_rate_limit_headers (line 12) | def set_rate_limit_headers
    function rate_limited_request? (line 18) | def rate_limited_request?
    function apply_header_limit (line 22) | def apply_header_limit
    function rate_limit_limit (line 26) | def rate_limit_limit
    function apply_header_remaining (line 30) | def apply_header_remaining
    function rate_limit_remaining (line 34) | def rate_limit_remaining
    function apply_header_reset (line 38) | def apply_header_reset
    function rate_limit_reset (line 42) | def rate_limit_reset
    function api_throttle_data (line 46) | def api_throttle_data
    function request_time (line 51) | def request_time
    function reset_period_offset (line 55) | def reset_period_offset

FILE: app/controllers/concerns/session_tracking_concern.rb
  type SessionTrackingConcern (line 3) | module SessionTrackingConcern
    function set_session_activity (line 14) | def set_session_activity
    function session_needs_update? (line 19) | def session_needs_update?

FILE: app/controllers/concerns/signature_authentication.rb
  type SignatureAuthentication (line 3) | module SignatureAuthentication
    function current_account (line 8) | def current_account

FILE: app/controllers/concerns/signature_verification.rb
  type SignatureVerification (line 5) | module SignatureVerification
    function signed_request? (line 8) | def signed_request?
    function signature_verification_failure_reason (line 12) | def signature_verification_failure_reason
    function signed_request_account (line 16) | def signed_request_account
    function request_body (line 73) | def request_body
    function verify_signature (line 79) | def verify_signature(account, signature, compare_signed_string)
    function build_signed_string (line 88) | def build_signed_string(signed_headers)
    function matches_time_window? (line 102) | def matches_time_window?
    function body_digest (line 112) | def body_digest
    function to_header_name (line 116) | def to_header_name(name)
    function incompatible_signature? (line 120) | def incompatible_signature?(signature_params)
    function account_from_key_id (line 125) | def account_from_key_id(key_id)
    function stoplight_wrap_request (line 135) | def stoplight_wrap_request(&block)
    function account_refresh_key (line 144) | def account_refresh_key(account)

FILE: app/controllers/concerns/user_tracking_concern.rb
  type UserTrackingConcern (line 3) | module UserTrackingConcern
    function set_user_activity (line 14) | def set_user_activity
    function user_needs_sign_in_update? (line 19) | def user_needs_sign_in_update?

FILE: app/controllers/custom_css_controller.rb
  class CustomCssController (line 3) | class CustomCssController < ApplicationController
    method show (line 8) | def show

FILE: app/controllers/directories_controller.rb
  class DirectoriesController (line 3) | class DirectoriesController < ApplicationController
    method index (line 12) | def index
    method show (line 16) | def show
    method check_enabled (line 22) | def check_enabled
    method set_tag (line 26) | def set_tag
    method set_tags (line 30) | def set_tags
    method set_accounts (line 34) | def set_accounts
    method set_instance_presenter (line 40) | def set_instance_presenter

FILE: app/controllers/emojis_controller.rb
  class EmojisController (line 3) | class EmojisController < ApplicationController
    method show (line 7) | def show
    method set_emoji (line 19) | def set_emoji

FILE: app/controllers/filters_controller.rb
  class FiltersController (line 3) | class FiltersController < ApplicationController
    method index (line 12) | def index
    method new (line 16) | def new
    method create (line 20) | def create
    method edit (line 30) | def edit; end
    method update (line 32) | def update
    method destroy (line 40) | def destroy
    method set_filters (line 47) | def set_filters
    method set_filter (line 51) | def set_filter
    method resource_params (line 55) | def resource_params
    method set_body_classes (line 59) | def set_body_classes

FILE: app/controllers/follower_accounts_controller.rb
  class FollowerAccountsController (line 3) | class FollowerAccountsController < ApplicationController
    method index (line 8) | def index
    method follows (line 34) | def follows
    method page_url (line 38) | def page_url(page)
    method collection_presenter (line 42) | def collection_presenter

FILE: app/controllers/following_accounts_controller.rb
  class FollowingAccountsController (line 3) | class FollowingAccountsController < ApplicationController
    method index (line 8) | def index
    method follows (line 34) | def follows
    method page_url (line 38) | def page_url(page)
    method collection_presenter (line 42) | def collection_presenter

FILE: app/controllers/home_controller.rb
  class HomeController (line 3) | class HomeController < ApplicationController
    method index (line 8) | def index
    method authenticate_user! (line 14) | def authenticate_user!
    method set_initial_state_json (line 42) | def set_initial_state_json
    method initial_state_params (line 47) | def initial_state_params
    method default_redirect_path (line 57) | def default_redirect_path
    method set_referrer_policy_header (line 67) | def set_referrer_policy_header

FILE: app/controllers/intents_controller.rb
  class IntentsController (line 3) | class IntentsController < ApplicationController
    method show (line 7) | def show
    method check_uri (line 22) | def check_uri
    method handle_invalid_uri (line 26) | def handle_invalid_uri
    method uri (line 30) | def uri

FILE: app/controllers/invites_controller.rb
  class InvitesController (line 3) | class InvitesController < ApplicationController
    method index (line 11) | def index
    method create (line 18) | def create
    method destroy (line 32) | def destroy
    method invites (line 41) | def invites
    method resource_params (line 45) | def resource_params
    method set_body_classes (line 49) | def set_body_classes

FILE: app/controllers/manifests_controller.rb
  class ManifestsController (line 3) | class ManifestsController < ApplicationController
    method show (line 6) | def show

FILE: app/controllers/media_controller.rb
  class MediaController (line 3) | class MediaController < ApplicationController
    method show (line 15) | def show
    method player (line 19) | def player
    method set_media_attachment (line 27) | def set_media_attachment
    method verify_permitted_status! (line 31) | def verify_permitted_status!

FILE: app/controllers/media_proxy_controller.rb
  class MediaProxyController (line 3) | class MediaProxyController < ApplicationController
    method show (line 8) | def show
    method redownload! (line 23) | def redownload!
    method version (line 29) | def version
    method lock_options (line 37) | def lock_options
    method reject_media? (line 41) | def reject_media?

FILE: app/controllers/oauth/authorizations_controller.rb
  class Oauth::AuthorizationsController (line 3) | class Oauth::AuthorizationsController < Doorkeeper::AuthorizationsContro...
    method store_current_location (line 13) | def store_current_location
    method render_success (line 17) | def render_success
    method truthy_param? (line 27) | def truthy_param?(key)

FILE: app/controllers/oauth/authorized_applications_controller.rb
  class Oauth::AuthorizedApplicationsController (line 3) | class Oauth::AuthorizedApplicationsController < Doorkeeper::AuthorizedAp...
    method destroy (line 12) | def destroy
    method set_body_classes (line 19) | def set_body_classes
    method store_current_location (line 23) | def store_current_location

FILE: app/controllers/oauth/tokens_controller.rb
  class Oauth::TokensController (line 3) | class Oauth::TokensController < Doorkeeper::TokensController
    method revoke (line 4) | def revoke
    method unsubscribe_for_token (line 11) | def unsubscribe_for_token

FILE: app/controllers/public_timelines_controller.rb
  class PublicTimelinesController (line 3) | class PublicTimelinesController < ApplicationController
    method show (line 10) | def show
    method check_enabled (line 23) | def check_enabled
    method set_body_classes (line 27) | def set_body_classes
    method set_instance_presenter (line 31) | def set_instance_presenter

FILE: app/controllers/relationships_controller.rb
  class RelationshipsController (line 3) | class RelationshipsController < ApplicationController
    method show (line 12) | def show
    method update (line 16) | def update
    method set_accounts (line 27) | def set_accounts
    method relationships_scope (line 31) | def relationships_scope
    method mutual_relationship_scope (line 51) | def mutual_relationship_scope
    method moved_account_scope (line 55) | def moved_account_scope
    method primary_account_scope (line 59) | def primary_account_scope
    method dormant_account_scope (line 63) | def dormant_account_scope
    method by_domain_scope (line 67) | def by_domain_scope
    method form_account_batch_params (line 71) | def form_account_batch_params
    method following_relationship? (line 75) | def following_relationship?
    method mutual_relationship? (line 79) | def mutual_relationship?
    method followed_by_relationship? (line 83) | def followed_by_relationship?
    method current_params (line 87) | def current_params
    method action_from_button (line 91) | def action_from_button
    method set_body_classes (line 101) | def set_body_classes

FILE: app/controllers/remote_follow_controller.rb
  class RemoteFollowController (line 3) | class RemoteFollowController < ApplicationController
    method new (line 10) | def new
    method create (line 14) | def create
    method resource_params (line 27) | def resource_params
    method session_params (line 31) | def session_params
    method set_account (line 35) | def set_account
    method suspended_account? (line 39) | def suspended_account?
    method set_body_classes (line 43) | def set_body_classes

FILE: app/controllers/remote_interaction_controller.rb
  class RemoteInteractionController (line 3) | class RemoteInteractionController < ApplicationController
    method new (line 12) | def new
    method create (line 16) | def create
    method resource_params (line 29) | def resource_params
    method session_params (line 33) | def session_params
    method set_status (line 37) | def set_status
    method set_body_classes (line 45) | def set_body_classes
    method set_interaction_type (line 50) | def set_interaction_type

FILE: app/controllers/remote_unfollows_controller.rb
  class RemoteUnfollowsController (line 3) | class RemoteUnfollowsController < ApplicationController
    method create (line 9) | def create
    method unfollow_attempt (line 23) | def unfollow_attempt
    method acct_without_prefix (line 28) | def acct_without_prefix
    method acct_params (line 32) | def acct_params
    method set_body_classes (line 36) | def set_body_classes

FILE: app/controllers/settings/applications_controller.rb
  class Settings::ApplicationsController (line 3) | class Settings::ApplicationsController < Settings::BaseController
    method index (line 10) | def index
    method new (line 14) | def new
    method show (line 21) | def show; end
    method create (line 23) | def create
    method update (line 33) | def update
    method destroy (line 41) | def destroy
    method regenerate (line 46) | def regenerate
    method set_application (line 55) | def set_application
    method application_params (line 59) | def application_params
    method prepare_scopes (line 68) | def prepare_scopes

FILE: app/controllers/settings/base_controller.rb
  class Settings::BaseController (line 3) | class Settings::BaseController < ApplicationController
    method set_body_classes (line 8) | def set_body_classes

FILE: app/controllers/settings/deletes_controller.rb
  class Settings::DeletesController (line 3) | class Settings::DeletesController < Settings::BaseController
    method show (line 9) | def show
    method destroy (line 13) | def destroy
    method check_enabled_deletion (line 25) | def check_enabled_deletion
    method delete_params (line 29) | def delete_params

FILE: app/controllers/settings/exports/blocked_accounts_controller.rb
  type Settings (line 3) | module Settings
    type Exports (line 4) | module Exports
      class BlockedAccountsController (line 5) | class BlockedAccountsController < ApplicationController
        method index (line 8) | def index
        method export_data (line 14) | def export_data

FILE: app/controllers/settings/exports/blocked_domains_controller.rb
  type Settings (line 3) | module Settings
    type Exports (line 4) | module Exports
      class BlockedDomainsController (line 5) | class BlockedDomainsController < ApplicationController
        method index (line 8) | def index
        method export_data (line 14) | def export_data

FILE: app/controllers/settings/exports/following_accounts_controller.rb
  type Settings (line 3) | module Settings
    type Exports (line 4) | module Exports
      class FollowingAccountsController (line 5) | class FollowingAccountsController < ApplicationController
        method index (line 8) | def index
        method export_data (line 14) | def export_data

FILE: app/controllers/settings/exports/lists_controller.rb
  type Settings (line 3) | module Settings
    type Exports (line 4) | module Exports
      class ListsController (line 5) | class ListsController < ApplicationController
        method index (line 8) | def index
        method export_data (line 14) | def export_data

FILE: app/controllers/settings/exports/muted_accounts_controller.rb
  type Settings (line 3) | module Settings
    type Exports (line 4) | module Exports
      class MutedAccountsController (line 5) | class MutedAccountsController < ApplicationController
        method index (line 8) | def index
        method export_data (line 14) | def export_data

FILE: app/controllers/settings/exports_controller.rb
  class Settings::ExportsController (line 3) | class Settings::ExportsController < Settings::BaseController
    method show (line 10) | def show
    method create (line 15) | def create
    method lock_options (line 34) | def lock_options

FILE: app/controllers/settings/featured_tags_controller.rb
  class Settings::FeaturedTagsController (line 3) | class Settings::FeaturedTagsController < Settings::BaseController
    method index (line 11) | def index
    method create (line 15) | def create
    method destroy (line 29) | def destroy
    method set_featured_tag (line 36) | def set_featured_tag
    method set_featured_tags (line 40) | def set_featured_tags
    method set_most_used_tags (line 44) | def set_most_used_tags
    method featured_tag_params (line 48) | def featured_tag_params

FILE: app/controllers/settings/identity_proofs_controller.rb
  class Settings::IdentityProofsController (line 3) | class Settings::IdentityProofsController < Settings::BaseController
    method index (line 9) | def index
    method new (line 14) | def new
    method create (line 29) | def create
    method check_required_params (line 44) | def check_required_params
    method resource_params (line 48) | def resource_params
    method publish_proof? (line 52) | def publish_proof?
    method post_params (line 56) | def post_params
    method set_body_classes (line 60) | def set_body_classes

FILE: app/controllers/settings/imports_controller.rb
  class Settings::ImportsController (line 3) | class Settings::ImportsController < Settings::BaseController
    method show (line 9) | def show
    method create (line 13) | def create
    method set_account (line 27) | def set_account
    method import_params (line 31) | def import_params

FILE: app/controllers/settings/migrations_controller.rb
  class Settings::MigrationsController (line 3) | class Settings::MigrationsController < Settings::BaseController
    method show (line 8) | def show
    method update (line 12) | def update
    method resource_params (line 26) | def resource_params
    method migration_account_changed? (line 30) | def migration_account_changed?

FILE: app/controllers/settings/preferences/appearance_controller.rb
  class Settings::Preferences::AppearanceController (line 3) | class Settings::Preferences::AppearanceController < Settings::Preference...
    method after_update_redirect_path (line 6) | def after_update_redirect_path

FILE: app/controllers/settings/preferences/notifications_controller.rb
  class Settings::Preferences::NotificationsController (line 3) | class Settings::Preferences::NotificationsController < Settings::Prefere...
    method after_update_redirect_path (line 6) | def after_update_redirect_path

FILE: app/controllers/settings/preferences/other_controller.rb
  class Settings::Preferences::OtherController (line 3) | class Settings::Preferences::OtherController < Settings::PreferencesCont...
    method after_update_redirect_path (line 6) | def after_update_redirect_path

FILE: app/controllers/settings/preferences_controller.rb
  class Settings::PreferencesController (line 3) | class Settings::PreferencesController < Settings::BaseController
    method show (line 8) | def show; end
    method update (line 10) | def update
    method after_update_redirect_path (line 23) | def after_update_redirect_path
    method user_settings (line 27) | def user_settings
    method user_params (line 31) | def user_params
    method user_settings_params (line 38) | def user_settings_params

FILE: app/controllers/settings/profiles_controller.rb
  class Settings::ProfilesController (line 3) | class Settings::ProfilesController < Settings::BaseController
    method show (line 14) | def show
    method update (line 18) | def update
    method account_params (line 30) | def account_params
    method set_account (line 34) | def set_account

FILE: app/controllers/settings/sessions_controller.rb
  class Settings::SessionsController (line 3) | class Settings::SessionsController < Settings::BaseController
    method destroy (line 7) | def destroy
    method set_session (line 15) | def set_session

FILE: app/controllers/settings/two_factor_authentication/confirmations_controller.rb
  type Settings (line 3) | module Settings
    type TwoFactorAuthentication (line 4) | module TwoFactorAuthentication
      class ConfirmationsController (line 5) | class ConfirmationsController < BaseController
        method new (line 11) | def new
        method create (line 15) | def create
        method confirmation_params (line 33) | def confirmation_params
        method prepare_two_factor_form (line 37) | def prepare_two_factor_form
        method ensure_otp_secret (line 43) | def ensure_otp_secret

FILE: app/controllers/settings/two_factor_authentication/recovery_codes_controller.rb
  type Settings (line 3) | module Settings
    type TwoFactorAuthentication (line 4) | module TwoFactorAuthentication
      class RecoveryCodesController (line 5) | class RecoveryCodesController < BaseController
        method create (line 10) | def create

FILE: app/controllers/settings/two_factor_authentications_controller.rb
  type Settings (line 3) | module Settings
    class TwoFactorAuthenticationsController (line 4) | class TwoFactorAuthenticationsController < BaseController
      method show (line 10) | def show
      method create (line 14) | def create
      method destroy (line 20) | def destroy
      method confirmation_params (line 34) | def confirmation_params
      method verify_otp_required (line 38) | def verify_otp_required
      method acceptable_code? (line 42) | def acceptable_code?

FILE: app/controllers/shares_controller.rb
  class SharesController (line 3) | class SharesController < ApplicationController
    method show (line 9) | def show
    method initial_state_params (line 16) | def initial_state_params
    method set_body_classes (line 29) | def set_body_classes

FILE: app/controllers/statuses_controller.rb
  class StatusesController (line 3) | class StatusesController < ApplicationController
    method show (line 27) | def show
    method activity (line 48) | def activity
    method embed (line 54) | def embed
    method replies (line 64) | def replies
    method replies_collection_presenter (line 74) | def replies_collection_presenter
    method create_descendant_thread (line 93) | def create_descendant_thread(starting_depth, statuses)
    method set_account (line 103) | def set_account
    method set_ancestors (line 107) | def set_ancestors
    method set_descendants (line 112) | def set_descendants
    method set_link_headers (line 166) | def set_link_headers
    method set_status (line 175) | def set_status
    method set_instance_presenter (line 186) | def set_instance_presenter
    method check_account_suspension (line 190) | def check_account_suspension
    method redirect_to_original (line 194) | def redirect_to_original
    method set_referrer_policy_header (line 198) | def set_referrer_policy_header
    method page_requested? (line 203) | def page_requested?
    method set_replies (line 207) | def set_replies
    method next_page (line 213) | def next_page
    method page_params (line 222) | def page_params

FILE: app/controllers/stream_entries_controller.rb
  class StreamEntriesController (line 3) | class StreamEntriesController < ApplicationController
    method show (line 15) | def show
    method embed (line 31) | def embed
    method set_account (line 37) | def set_account
    method set_link_headers (line 41) | def set_link_headers
    method set_stream_entry (line 50) | def set_stream_entry
    method check_account_suspension (line 61) | def check_account_suspension

FILE: app/controllers/tags_controller.rb
  class TagsController (line 3) | class TagsController < ApplicationController
    method show (line 11) | def show
    method set_body_classes (line 43) | def set_body_classes
    method set_instance_presenter (line 47) | def set_instance_presenter
    method collection_presenter (line 51) | def collection_presenter

FILE: app/controllers/well_known/host_meta_controller.rb
  type WellKnown (line 3) | module WellKnown
    class HostMetaController (line 4) | class HostMetaController < ActionController::Base
      method show (line 9) | def show

FILE: app/controllers/well_known/keybase_proof_config_controller.rb
  type WellKnown (line 3) | module WellKnown
    class KeybaseProofConfigController (line 4) | class KeybaseProofConfigController < ActionController::Base
      method show (line 5) | def show

FILE: app/controllers/well_known/webfinger_controller.rb
  type WellKnown (line 3) | module WellKnown
    class WebfingerController (line 4) | class WebfingerController < ActionController::Base
      method show (line 9) | def show
      method username_from_resource (line 29) | def username_from_resource
      method resource_param (line 40) | def resource_param

FILE: app/helpers/admin/account_moderation_notes_helper.rb
  type Admin::AccountModerationNotesHelper (line 3) | module Admin::AccountModerationNotesHelper
    function admin_account_link_to (line 4) | def admin_account_link_to(account)
    function admin_account_inline_link_to (line 15) | def admin_account_inline_link_to(account)
    function name_tag_classes (line 25) | def name_tag_classes(account, inline = false)

FILE: app/helpers/admin/action_logs_helper.rb
  type Admin::ActionLogsHelper (line 3) | module Admin::ActionLogsHelper
    function log_target (line 4) | def log_target(log)
    function relevant_log_changes (line 12) | def relevant_log_changes(log)
    function log_extra_attributes (line 28) | def log_extra_attributes(hash)
    function log_change (line 32) | def log_change(val)
    function icon_for_log (line 37) | def icon_for_log(log)
    function class_for_log_icon (line 56) | def class_for_log_icon(log)
    function opposite_verbs? (line 75) | def opposite_verbs?(log)
    function linkable_log_target (line 79) | def linkable_log_target(record)
    function log_target_from_history (line 98) | def log_target_from_history(type, attributes)

FILE: app/helpers/admin/dashboard_helper.rb
  type Admin::DashboardHelper (line 3) | module Admin::DashboardHelper
    function feature_hint (line 4) | def feature_hint(feature, enabled)

FILE: app/helpers/admin/filter_helper.rb
  type Admin::FilterHelper (line 3) | module Admin::FilterHelper
    function filter_link_to (line 14) | def filter_link_to(text, link_to_params, link_class_params = link_to_p...
    function table_link_to (line 20) | def table_link_to(icon, text, path, **options)
    function selected? (line 24) | def selected?(more_params)
    function filter_params (line 31) | def filter_params(more_params)
    function filter_link_class (line 35) | def filter_link_class(new_url)
    function filtered_url_for (line 39) | def filtered_url_for(url_params)
    function controller_request_params (line 43) | def controller_request_params

FILE: app/helpers/application_helper.rb
  type ApplicationHelper (line 3) | module ApplicationHelper
    function active_nav_class (line 10) | def active_nav_class(*paths)
    function active_link_to (line 14) | def active_link_to(label, path, **options)
    function show_landing_strip? (line 18) | def show_landing_strip?
    function open_registrations? (line 22) | def open_registrations?
    function approved_registrations? (line 26) | def approved_registrations?
    function closed_registrations? (line 30) | def closed_registrations?
    function available_sign_up_path (line 34) | def available_sign_up_path
    function max_bio_chars (line 42) | def max_bio_chars
    function max_toot_chars (line 46) | def max_toot_chars
    function open_deletion? (line 50) | def open_deletion?
    function locale_direction (line 54) | def locale_direction
    function favicon_path (line 62) | def favicon_path
    function title (line 67) | def title
    function class_for_scope (line 71) | def class_for_scope(scope)
    function can? (line 75) | def can?(action, record)
    function fa_icon (line 80) | def fa_icon(icon, attributes = {})
    function custom_emoji_tag (line 88) | def custom_emoji_tag(custom_emoji)
    function opengraph (line 92) | def opengraph(property, content)
    function react_component (line 96) | def react_component(name, props = {}, &block)
    function body_classes (line 104) | def body_classes
    function cdn_host (line 113) | def cdn_host
    function cdn_host? (line 117) | def cdn_host?
    function storage_host (line 121) | def storage_host
    function storage_host? (line 125) | def storage_host?
    function quote_wrap (line 129) | def quote_wrap(text, line_width: 80, break_sequence: "\n")

FILE: app/helpers/flashes_helper.rb
  type FlashesHelper (line 3) | module FlashesHelper
    function user_facing_flashes (line 4) | def user_facing_flashes

FILE: app/helpers/home_helper.rb
  type HomeHelper (line 3) | module HomeHelper
    function default_props (line 4) | def default_props
    function account_link_to (line 10) | def account_link_to(account, button = '', size: 36, path: nil)
    function obscured_counter (line 42) | def obscured_counter(count)
    function custom_field_classes (line 52) | def custom_field_classes(field)
    function optional_link_to (line 60) | def optional_link_to(condition, path, options = {}, &block)
    function sign_up_message (line 68) | def sign_up_message

FILE: app/helpers/instance_helper.rb
  type InstanceHelper (line 3) | module InstanceHelper
    function site_title (line 4) | def site_title
    function site_hostname (line 8) | def site_hostname

FILE: app/helpers/jsonld_helper.rb
  type JsonLdHelper (line 3) | module JsonLdHelper
    function equals_or_includes? (line 4) | def equals_or_includes?(haystack, needle)
    function equals_or_includes_any? (line 8) | def equals_or_includes_any?(haystack, needles)
    function first_of_value (line 12) | def first_of_value(value)
    function url_to_href (line 18) | def url_to_href(value, preferred_type = nil)
    function as_array (line 34) | def as_array(value)
    function value_or_id (line 38) | def value_or_id(value)
    function supported_context? (line 42) | def supported_context?(json)
    function unsupported_uri_scheme? (line 46) | def unsupported_uri_scheme?(uri)
    function invalid_origin? (line 50) | def invalid_origin?(url)
    function canonicalize (line 59) | def canonicalize(json)
    function fetch_resource (line 64) | def fetch_resource(uri, id, on_behalf_of = nil)
    function fetch_resource_without_id_validation (line 75) | def fetch_resource_without_id_validation(uri, on_behalf_of = nil, rais...
    function body_to_json (line 92) | def body_to_json(body, compare_id: nil)
    function merge_context (line 100) | def merge_context(context, new_context)
    function response_successful? (line 110) | def response_successful?(response)
    function response_error_unsalvageable? (line 114) | def response_error_unsalvageable?(response)
    function build_request (line 118) | def build_request(uri, on_behalf_of = nil)
    function load_jsonld_context (line 125) | def load_jsonld_context(url, _options = {}, &_block)

FILE: app/helpers/routing_helper.rb
  type RoutingHelper (line 3) | module RoutingHelper
    function default_url_options (line 10) | def default_url_options
    function full_asset_url (line 15) | def full_asset_url(source, **options)
    function full_pack_url (line 21) | def full_pack_url(source, **options)
    function use_storage? (line 27) | def use_storage?

FILE: app/helpers/settings_helper.rb
  type SettingsHelper (line 3) | module SettingsHelper
    function human_locale (line 66) | def human_locale(locale)
    function filterable_languages (line 70) | def filterable_languages
    function hash_to_object (line 74) | def hash_to_object(hash)
    function session_device_icon (line 78) | def session_device_icon(session)

FILE: app/helpers/stream_entries_helper.rb
  type StreamEntriesHelper (line 3) | module StreamEntriesHelper
    function display_name (line 7) | def display_name(account, **options)
    function account_action_button (line 15) | def account_action_button(account)
    function svg_logo (line 37) | def svg_logo
    function svg_logo_full (line 41) | def svg_logo_full
    function account_badge (line 45) | def account_badge(account, all: false)
    function link_to_more (line 61) | def link_to_more(url)
    function nothing_here (line 65) | def nothing_here(extra_classes = '')
    function account_description (line 71) | def account_description(account)
    function media_summary (line 92) | def media_summary(status)
    function status_text_summary (line 110) | def status_text_summary(status)
    function poll_summary (line 115) | def poll_summary(status)
    function status_description (line 120) | def status_description(status)
    function stream_link_target (line 131) | def stream_link_target
    function acct (line 135) | def acct(account)
    function style_classes (line 143) | def style_classes(status, is_predecessor, is_successor, include_threads)
    function microformats_classes (line 152) | def microformats_classes(status, is_direct_parent, is_direct_child)
    function microformats_h_class (line 160) | def microformats_h_class(status, is_predecessor, is_successor, include...
    function rtl_status? (line 170) | def rtl_status?(status)
    function rtl? (line 174) | def rtl?(text)
    function fa_visibility_icon (line 186) | def fa_visibility_icon(status)
    function simplified_text (line 201) | def simplified_text(text)
    function rtl_size (line 213) | def rtl_size(words)
    function embedded_view? (line 217) | def embedded_view?

FILE: app/javascript/mastodon/actions/accounts.js
  constant ACCOUNT_FETCH_REQUEST (line 5) | const ACCOUNT_FETCH_REQUEST = 'ACCOUNT_FETCH_REQUEST';
  constant ACCOUNT_FETCH_SUCCESS (line 6) | const ACCOUNT_FETCH_SUCCESS = 'ACCOUNT_FETCH_SUCCESS';
  constant ACCOUNT_FETCH_FAIL (line 7) | const ACCOUNT_FETCH_FAIL    = 'ACCOUNT_FETCH_FAIL';
  constant ACCOUNT_FOLLOW_REQUEST (line 9) | const ACCOUNT_FOLLOW_REQUEST = 'ACCOUNT_FOLLOW_REQUEST';
  constant ACCOUNT_FOLLOW_SUCCESS (line 10) | const ACCOUNT_FOLLOW_SUCCESS = 'ACCOUNT_FOLLOW_SUCCESS';
  constant ACCOUNT_FOLLOW_FAIL (line 11) | const ACCOUNT_FOLLOW_FAIL    = 'ACCOUNT_FOLLOW_FAIL';
  constant ACCOUNT_UNFOLLOW_REQUEST (line 13) | const ACCOUNT_UNFOLLOW_REQUEST = 'ACCOUNT_UNFOLLOW_REQUEST';
  constant ACCOUNT_UNFOLLOW_SUCCESS (line 14) | const ACCOUNT_UNFOLLOW_SUCCESS = 'ACCOUNT_UNFOLLOW_SUCCESS';
  constant ACCOUNT_UNFOLLOW_FAIL (line 15) | const ACCOUNT_UNFOLLOW_FAIL    = 'ACCOUNT_UNFOLLOW_FAIL';
  constant ACCOUNT_BLOCK_REQUEST (line 17) | const ACCOUNT_BLOCK_REQUEST = 'ACCOUNT_BLOCK_REQUEST';
  constant ACCOUNT_BLOCK_SUCCESS (line 18) | const ACCOUNT_BLOCK_SUCCESS = 'ACCOUNT_BLOCK_SUCCESS';
  constant ACCOUNT_BLOCK_FAIL (line 19) | const ACCOUNT_BLOCK_FAIL    = 'ACCOUNT_BLOCK_FAIL';
  constant ACCOUNT_UNBLOCK_REQUEST (line 21) | const ACCOUNT_UNBLOCK_REQUEST = 'ACCOUNT_UNBLOCK_REQUEST';
  constant ACCOUNT_UNBLOCK_SUCCESS (line 22) | const ACCOUNT_UNBLOCK_SUCCESS = 'ACCOUNT_UNBLOCK_SUCCESS';
  constant ACCOUNT_UNBLOCK_FAIL (line 23) | const ACCOUNT_UNBLOCK_FAIL    = 'ACCOUNT_UNBLOCK_FAIL';
  constant ACCOUNT_MUTE_REQUEST (line 25) | const ACCOUNT_MUTE_REQUEST = 'ACCOUNT_MUTE_REQUEST';
  constant ACCOUNT_MUTE_SUCCESS (line 26) | const ACCOUNT_MUTE_SUCCESS = 'ACCOUNT_MUTE_SUCCESS';
  constant ACCOUNT_MUTE_FAIL (line 27) | const ACCOUNT_MUTE_FAIL    = 'ACCOUNT_MUTE_FAIL';
  constant ACCOUNT_UNMUTE_REQUEST (line 29) | const ACCOUNT_UNMUTE_REQUEST = 'ACCOUNT_UNMUTE_REQUEST';
  constant ACCOUNT_UNMUTE_SUCCESS (line 30) | const ACCOUNT_UNMUTE_SUCCESS = 'ACCOUNT_UNMUTE_SUCCESS';
  constant ACCOUNT_UNMUTE_FAIL (line 31) | const ACCOUNT_UNMUTE_FAIL    = 'ACCOUNT_UNMUTE_FAIL';
  constant ACCOUNT_PIN_REQUEST (line 33) | const ACCOUNT_PIN_REQUEST = 'ACCOUNT_PIN_REQUEST';
  constant ACCOUNT_PIN_SUCCESS (line 34) | const ACCOUNT_PIN_SUCCESS = 'ACCOUNT_PIN_SUCCESS';
  constant ACCOUNT_PIN_FAIL (line 35) | const ACCOUNT_PIN_FAIL    = 'ACCOUNT_PIN_FAIL';
  constant ACCOUNT_UNPIN_REQUEST (line 37) | const ACCOUNT_UNPIN_REQUEST = 'ACCOUNT_UNPIN_REQUEST';
  constant ACCOUNT_UNPIN_SUCCESS (line 38) | const ACCOUNT_UNPIN_SUCCESS = 'ACCOUNT_UNPIN_SUCCESS';
  constant ACCOUNT_UNPIN_FAIL (line 39) | const ACCOUNT_UNPIN_FAIL    = 'ACCOUNT_UNPIN_FAIL';
  constant FOLLOWERS_FETCH_REQUEST (line 41) | const FOLLOWERS_FETCH_REQUEST = 'FOLLOWERS_FETCH_REQUEST';
  constant FOLLOWERS_FETCH_SUCCESS (line 42) | const FOLLOWERS_FETCH_SUCCESS = 'FOLLOWERS_FETCH_SUCCESS';
  constant FOLLOWERS_FETCH_FAIL (line 43) | const FOLLOWERS_FETCH_FAIL    = 'FOLLOWERS_FETCH_FAIL';
  constant FOLLOWERS_EXPAND_REQUEST (line 45) | const FOLLOWERS_EXPAND_REQUEST = 'FOLLOWERS_EXPAND_REQUEST';
  constant FOLLOWERS_EXPAND_SUCCESS (line 46) | const FOLLOWERS_EXPAND_SUCCESS = 'FOLLOWERS_EXPAND_SUCCESS';
  constant FOLLOWERS_EXPAND_FAIL (line 47) | const FOLLOWERS_EXPAND_FAIL    = 'FOLLOWERS_EXPAND_FAIL';
  constant FOLLOWING_FETCH_REQUEST (line 49) | const FOLLOWING_FETCH_REQUEST = 'FOLLOWING_FETCH_REQUEST';
  constant FOLLOWING_FETCH_SUCCESS (line 50) | const FOLLOWING_FETCH_SUCCESS = 'FOLLOWING_FETCH_SUCCESS';
  constant FOLLOWING_FETCH_FAIL (line 51) | const FOLLOWING_FETCH_FAIL    = 'FOLLOWING_FETCH_FAIL';
  constant FOLLOWING_EXPAND_REQUEST (line 53) | const FOLLOWING_EXPAND_REQUEST = 'FOLLOWING_EXPAND_REQUEST';
  constant FOLLOWING_EXPAND_SUCCESS (line 54) | const FOLLOWING_EXPAND_SUCCESS = 'FOLLOWING_EXPAND_SUCCESS';
  constant FOLLOWING_EXPAND_FAIL (line 55) | const FOLLOWING_EXPAND_FAIL    = 'FOLLOWING_EXPAND_FAIL';
  constant RELATIONSHIPS_FETCH_REQUEST (line 57) | const RELATIONSHIPS_FETCH_REQUEST = 'RELATIONSHIPS_FETCH_REQUEST';
  constant RELATIONSHIPS_FETCH_SUCCESS (line 58) | const RELATIONSHIPS_FETCH_SUCCESS = 'RELATIONSHIPS_FETCH_SUCCESS';
  constant RELATIONSHIPS_FETCH_FAIL (line 59) | const RELATIONSHIPS_FETCH_FAIL    = 'RELATIONSHIPS_FETCH_FAIL';
  constant FOLLOW_REQUESTS_FETCH_REQUEST (line 61) | const FOLLOW_REQUESTS_FETCH_REQUEST = 'FOLLOW_REQUESTS_FETCH_REQUEST';
  constant FOLLOW_REQUESTS_FETCH_SUCCESS (line 62) | const FOLLOW_REQUESTS_FETCH_SUCCESS = 'FOLLOW_REQUESTS_FETCH_SUCCESS';
  constant FOLLOW_REQUESTS_FETCH_FAIL (line 63) | const FOLLOW_REQUESTS_FETCH_FAIL    = 'FOLLOW_REQUESTS_FETCH_FAIL';
  constant FOLLOW_REQUESTS_EXPAND_REQUEST (line 65) | const FOLLOW_REQUESTS_EXPAND_REQUEST = 'FOLLOW_REQUESTS_EXPAND_REQUEST';
  constant FOLLOW_REQUESTS_EXPAND_SUCCESS (line 66) | const FOLLOW_REQUESTS_EXPAND_SUCCESS = 'FOLLOW_REQUESTS_EXPAND_SUCCESS';
  constant FOLLOW_REQUESTS_EXPAND_FAIL (line 67) | const FOLLOW_REQUESTS_EXPAND_FAIL    = 'FOLLOW_REQUESTS_EXPAND_FAIL';
  constant FOLLOW_REQUEST_AUTHORIZE_REQUEST (line 69) | const FOLLOW_REQUEST_AUTHORIZE_REQUEST = 'FOLLOW_REQUEST_AUTHORIZE_REQUE...
  constant FOLLOW_REQUEST_AUTHORIZE_SUCCESS (line 70) | const FOLLOW_REQUEST_AUTHORIZE_SUCCESS = 'FOLLOW_REQUEST_AUTHORIZE_SUCCE...
  constant FOLLOW_REQUEST_AUTHORIZE_FAIL (line 71) | const FOLLOW_REQUEST_AUTHORIZE_FAIL    = 'FOLLOW_REQUEST_AUTHORIZE_FAIL';
  constant FOLLOW_REQUEST_REJECT_REQUEST (line 73) | const FOLLOW_REQUEST_REJECT_REQUEST = 'FOLLOW_REQUEST_REJECT_REQUEST';
  constant FOLLOW_REQUEST_REJECT_SUCCESS (line 74) | const FOLLOW_REQUEST_REJECT_SUCCESS = 'FOLLOW_REQUEST_REJECT_SUCCESS';
  constant FOLLOW_REQUEST_REJECT_FAIL (line 75) | const FOLLOW_REQUEST_REJECT_FAIL    = 'FOLLOW_REQUEST_REJECT_FAIL';
  function getFromDB (line 77) | function getFromDB(dispatch, getState, index, id) {
  function fetchAccount (line 95) | function fetchAccount(id) {
  function fetchAccountRequest (line 123) | function fetchAccountRequest(id) {
  function fetchAccountSuccess (line 130) | function fetchAccountSuccess() {
  function fetchAccountFail (line 136) | function fetchAccountFail(id, error) {
  function followAccount (line 145) | function followAccount(id, reblogs = true) {
  function unfollowAccount (line 160) | function unfollowAccount(id) {
  function followAccountRequest (line 172) | function followAccountRequest(id, locked) {
  function followAccountSuccess (line 181) | function followAccountSuccess(relationship, alreadyFollowing) {
  function followAccountFail (line 190) | function followAccountFail(error, locked) {
  function unfollowAccountRequest (line 199) | function unfollowAccountRequest(id) {
  function unfollowAccountSuccess (line 207) | function unfollowAccountSuccess(relationship, statuses) {
  function unfollowAccountFail (line 216) | function unfollowAccountFail(error) {
  function blockAccount (line 224) | function blockAccount(id) {
  function unblockAccount (line 237) | function unblockAccount(id) {
  function blockAccountRequest (line 249) | function blockAccountRequest(id) {
  function blockAccountSuccess (line 256) | function blockAccountSuccess(relationship, statuses) {
  function blockAccountFail (line 264) | function blockAccountFail(error) {
  function unblockAccountRequest (line 271) | function unblockAccountRequest(id) {
  function unblockAccountSuccess (line 278) | function unblockAccountSuccess(relationship) {
  function unblockAccountFail (line 285) | function unblockAccountFail(error) {
  function muteAccount (line 293) | function muteAccount(id, notifications) {
  function unmuteAccount (line 306) | function unmuteAccount(id) {
  function muteAccountRequest (line 318) | function muteAccountRequest(id) {
  function muteAccountSuccess (line 325) | function muteAccountSuccess(relationship, statuses) {
  function muteAccountFail (line 333) | function muteAccountFail(error) {
  function unmuteAccountRequest (line 340) | function unmuteAccountRequest(id) {
  function unmuteAccountSuccess (line 347) | function unmuteAccountSuccess(relationship) {
  function unmuteAccountFail (line 354) | function unmuteAccountFail(error) {
  function fetchFollowers (line 362) | function fetchFollowers(id) {
  function fetchFollowersRequest (line 378) | function fetchFollowersRequest(id) {
  function fetchFollowersSuccess (line 385) | function fetchFollowersSuccess(id, accounts, next) {
  function fetchFollowersFail (line 394) | function fetchFollowersFail(id, error) {
  function expandFollowers (line 402) | function expandFollowers(id) {
  function expandFollowersRequest (line 424) | function expandFollowersRequest(id) {
  function expandFollowersSuccess (line 431) | function expandFollowersSuccess(id, accounts, next) {
  function expandFollowersFail (line 440) | function expandFollowersFail(id, error) {
  function fetchFollowing (line 448) | function fetchFollowing(id) {
  function fetchFollowingRequest (line 464) | function fetchFollowingRequest(id) {
  function fetchFollowingSuccess (line 471) | function fetchFollowingSuccess(id, accounts, next) {
  function fetchFollowingFail (line 480) | function fetchFollowingFail(id, error) {
  function expandFollowing (line 488) | function expandFollowing(id) {
  function expandFollowingRequest (line 510) | function expandFollowingRequest(id) {
  function expandFollowingSuccess (line 517) | function expandFollowingSuccess(id, accounts, next) {
  function expandFollowingFail (line 526) | function expandFollowingFail(id, error) {
  function fetchRelationships (line 534) | function fetchRelationships(accountIds) {
  function fetchRelationshipsRequest (line 553) | function fetchRelationshipsRequest(ids) {
  function fetchRelationshipsSuccess (line 561) | function fetchRelationshipsSuccess(relationships) {
  function fetchRelationshipsFail (line 569) | function fetchRelationshipsFail(error) {
  function fetchFollowRequests (line 577) | function fetchFollowRequests() {
  function fetchFollowRequestsRequest (line 589) | function fetchFollowRequestsRequest() {
  function fetchFollowRequestsSuccess (line 595) | function fetchFollowRequestsSuccess(accounts, next) {
  function fetchFollowRequestsFail (line 603) | function fetchFollowRequestsFail(error) {
  function expandFollowRequests (line 610) | function expandFollowRequests() {
  function expandFollowRequestsRequest (line 628) | function expandFollowRequestsRequest() {
  function expandFollowRequestsSuccess (line 634) | function expandFollowRequestsSuccess(accounts, next) {
  function expandFollowRequestsFail (line 642) | function expandFollowRequestsFail(error) {
  function authorizeFollowRequest (line 649) | function authorizeFollowRequest(id) {
  function authorizeFollowRequestRequest (line 660) | function authorizeFollowRequestRequest(id) {
  function authorizeFollowRequestSuccess (line 667) | function authorizeFollowRequestSuccess(id) {
  function authorizeFollowRequestFail (line 674) | function authorizeFollowRequestFail(id, error) {
  function rejectFollowRequest (line 683) | function rejectFollowRequest(id) {
  function rejectFollowRequestRequest (line 694) | function rejectFollowRequestRequest(id) {
  function rejectFollowRequestSuccess (line 701) | function rejectFollowRequestSuccess(id) {
  function rejectFollowRequestFail (line 708) | function rejectFollowRequestFail(id, error) {
  function pinAccount (line 716) | function pinAccount(id) {
  function unpinAccount (line 728) | function unpinAccount(id) {
  function pinAccountRequest (line 740) | function pinAccountRequest(id) {
  function pinAccountSuccess (line 747) | function pinAccountSuccess(relationship) {
  function pinAccountFail (line 754) | function pinAccountFail(error) {
  function unpinAccountRequest (line 761) | function unpinAccountRequest(id) {
  function unpinAccountSuccess (line 768) | function unpinAccountSuccess(relationship) {
  function unpinAccountFail (line 775) | function unpinAccountFail(error) {

FILE: app/javascript/mastodon/actions/alerts.js
  constant ALERT_SHOW (line 8) | const ALERT_SHOW    = 'ALERT_SHOW';
  constant ALERT_DISMISS (line 9) | const ALERT_DISMISS = 'ALERT_DISMISS';
  constant ALERT_CLEAR (line 10) | const ALERT_CLEAR   = 'ALERT_CLEAR';
  constant ALERT_NOOP (line 11) | const ALERT_NOOP    = 'ALERT_NOOP';
  function dismissAlert (line 13) | function dismissAlert(alert) {
  function clearAlert (line 20) | function clearAlert() {
  function showAlert (line 26) | function showAlert(title = messages.unexpectedTitle, message = messages....
  function showAlertForError (line 34) | function showAlertForError(error) {

FILE: app/javascript/mastodon/actions/blocks.js
  constant BLOCKS_FETCH_REQUEST (line 5) | const BLOCKS_FETCH_REQUEST = 'BLOCKS_FETCH_REQUEST';
  constant BLOCKS_FETCH_SUCCESS (line 6) | const BLOCKS_FETCH_SUCCESS = 'BLOCKS_FETCH_SUCCESS';
  constant BLOCKS_FETCH_FAIL (line 7) | const BLOCKS_FETCH_FAIL    = 'BLOCKS_FETCH_FAIL';
  constant BLOCKS_EXPAND_REQUEST (line 9) | const BLOCKS_EXPAND_REQUEST = 'BLOCKS_EXPAND_REQUEST';
  constant BLOCKS_EXPAND_SUCCESS (line 10) | const BLOCKS_EXPAND_SUCCESS = 'BLOCKS_EXPAND_SUCCESS';
  constant BLOCKS_EXPAND_FAIL (line 11) | const BLOCKS_EXPAND_FAIL    = 'BLOCKS_EXPAND_FAIL';
  function fetchBlocks (line 13) | function fetchBlocks() {
  function fetchBlocksRequest (line 26) | function fetchBlocksRequest() {
  function fetchBlocksSuccess (line 32) | function fetchBlocksSuccess(accounts, next) {
  function fetchBlocksFail (line 40) | function fetchBlocksFail(error) {
  function expandBlocks (line 47) | function expandBlocks() {
  function expandBlocksRequest (line 66) | function expandBlocksRequest() {
  function expandBlocksSuccess (line 72) | function expandBlocksSuccess(accounts, next) {
  function expandBlocksFail (line 80) | function expandBlocksFail(error) {

FILE: app/javascript/mastodon/actions/bundles.js
  constant BUNDLE_FETCH_REQUEST (line 1) | const BUNDLE_FETCH_REQUEST = 'BUNDLE_FETCH_REQUEST';
  constant BUNDLE_FETCH_SUCCESS (line 2) | const BUNDLE_FETCH_SUCCESS = 'BUNDLE_FETCH_SUCCESS';
  constant BUNDLE_FETCH_FAIL (line 3) | const BUNDLE_FETCH_FAIL = 'BUNDLE_FETCH_FAIL';
  function fetchBundleRequest (line 5) | function fetchBundleRequest(skipLoading) {
  function fetchBundleSuccess (line 12) | function fetchBundleSuccess(skipLoading) {
  function fetchBundleFail (line 19) | function fetchBundleFail(error, skipLoading) {

FILE: app/javascript/mastodon/actions/columns.js
  constant COLUMN_ADD (line 3) | const COLUMN_ADD           = 'COLUMN_ADD';
  constant COLUMN_REMOVE (line 4) | const COLUMN_REMOVE        = 'COLUMN_REMOVE';
  constant COLUMN_MOVE (line 5) | const COLUMN_MOVE          = 'COLUMN_MOVE';
  constant COLUMN_PARAMS_CHANGE (line 6) | const COLUMN_PARAMS_CHANGE = 'COLUMN_PARAMS_CHANGE';
  function addColumn (line 8) | function addColumn(id, params) {
  function removeColumn (line 20) | function removeColumn(uuid) {
  function moveColumn (line 31) | function moveColumn(uuid, direction) {
  function changeColumnParams (line 43) | function changeColumnParams(uuid, path, value) {

FILE: app/javascript/mastodon/actions/compose.js
  constant COMPOSE_CHANGE (line 16) | const COMPOSE_CHANGE          = 'COMPOSE_CHANGE';
  constant COMPOSE_SUBMIT_REQUEST (line 17) | const COMPOSE_SUBMIT_REQUEST  = 'COMPOSE_SUBMIT_REQUEST';
  constant COMPOSE_SUBMIT_SUCCESS (line 18) | const COMPOSE_SUBMIT_SUCCESS  = 'COMPOSE_SUBMIT_SUCCESS';
  constant COMPOSE_SUBMIT_FAIL (line 19) | const COMPOSE_SUBMIT_FAIL     = 'COMPOSE_SUBMIT_FAIL';
  constant COMPOSE_REPLY (line 20) | const COMPOSE_REPLY           = 'COMPOSE_REPLY';
  constant COMPOSE_REPLY_CANCEL (line 21) | const COMPOSE_REPLY_CANCEL    = 'COMPOSE_REPLY_CANCEL';
  constant COMPOSE_DIRECT (line 22) | const COMPOSE_DIRECT          = 'COMPOSE_DIRECT';
  constant COMPOSE_MENTION (line 23) | const COMPOSE_MENTION         = 'COMPOSE_MENTION';
  constant COMPOSE_RESET (line 24) | const COMPOSE_RESET           = 'COMPOSE_RESET';
  constant COMPOSE_UPLOAD_REQUEST (line 25) | const COMPOSE_UPLOAD_REQUEST  = 'COMPOSE_UPLOAD_REQUEST';
  constant COMPOSE_UPLOAD_SUCCESS (line 26) | const COMPOSE_UPLOAD_SUCCESS  = 'COMPOSE_UPLOAD_SUCCESS';
  constant COMPOSE_UPLOAD_FAIL (line 27) | const COMPOSE_UPLOAD_FAIL     = 'COMPOSE_UPLOAD_FAIL';
  constant COMPOSE_UPLOAD_PROGRESS (line 28) | const COMPOSE_UPLOAD_PROGRESS = 'COMPOSE_UPLOAD_PROGRESS';
  constant COMPOSE_UPLOAD_UNDO (line 29) | const COMPOSE_UPLOAD_UNDO     = 'COMPOSE_UPLOAD_UNDO';
  constant COMPOSE_SUGGESTIONS_CLEAR (line 31) | const COMPOSE_SUGGESTIONS_CLEAR = 'COMPOSE_SUGGESTIONS_CLEAR';
  constant COMPOSE_SUGGESTIONS_READY (line 32) | const COMPOSE_SUGGESTIONS_READY = 'COMPOSE_SUGGESTIONS_READY';
  constant COMPOSE_SUGGESTION_SELECT (line 33) | const COMPOSE_SUGGESTION_SELECT = 'COMPOSE_SUGGESTION_SELECT';
  constant COMPOSE_SUGGESTION_TAGS_UPDATE (line 34) | const COMPOSE_SUGGESTION_TAGS_UPDATE = 'COMPOSE_SUGGESTION_TAGS_UPDATE';
  constant COMPOSE_TAG_HISTORY_UPDATE (line 36) | const COMPOSE_TAG_HISTORY_UPDATE = 'COMPOSE_TAG_HISTORY_UPDATE';
  constant COMPOSE_MOUNT (line 38) | const COMPOSE_MOUNT   = 'COMPOSE_MOUNT';
  constant COMPOSE_UNMOUNT (line 39) | const COMPOSE_UNMOUNT = 'COMPOSE_UNMOUNT';
  constant COMPOSE_SENSITIVITY_CHANGE (line 41) | const COMPOSE_SENSITIVITY_CHANGE = 'COMPOSE_SENSITIVITY_CHANGE';
  constant COMPOSE_SPOILERNESS_CHANGE (line 42) | const COMPOSE_SPOILERNESS_CHANGE = 'COMPOSE_SPOILERNESS_CHANGE';
  constant COMPOSE_SPOILER_TEXT_CHANGE (line 43) | const COMPOSE_SPOILER_TEXT_CHANGE = 'COMPOSE_SPOILER_TEXT_CHANGE';
  constant COMPOSE_VISIBILITY_CHANGE (line 44) | const COMPOSE_VISIBILITY_CHANGE  = 'COMPOSE_VISIBILITY_CHANGE';
  constant COMPOSE_LISTABILITY_CHANGE (line 45) | const COMPOSE_LISTABILITY_CHANGE = 'COMPOSE_LISTABILITY_CHANGE';
  constant COMPOSE_COMPOSING_CHANGE (line 46) | const COMPOSE_COMPOSING_CHANGE = 'COMPOSE_COMPOSING_CHANGE';
  constant COMPOSE_EMOJI_INSERT (line 48) | const COMPOSE_EMOJI_INSERT = 'COMPOSE_EMOJI_INSERT';
  constant COMPOSE_UPLOAD_CHANGE_REQUEST (line 50) | const COMPOSE_UPLOAD_CHANGE_REQUEST     = 'COMPOSE_UPLOAD_UPDATE_REQUEST';
  constant COMPOSE_UPLOAD_CHANGE_SUCCESS (line 51) | const COMPOSE_UPLOAD_CHANGE_SUCCESS     = 'COMPOSE_UPLOAD_UPDATE_SUCCESS';
  constant COMPOSE_UPLOAD_CHANGE_FAIL (line 52) | const COMPOSE_UPLOAD_CHANGE_FAIL        = 'COMPOSE_UPLOAD_UPDATE_FAIL';
  constant COMPOSE_POLL_ADD (line 54) | const COMPOSE_POLL_ADD             = 'COMPOSE_POLL_ADD';
  constant COMPOSE_POLL_REMOVE (line 55) | const COMPOSE_POLL_REMOVE          = 'COMPOSE_POLL_REMOVE';
  constant COMPOSE_POLL_OPTION_ADD (line 56) | const COMPOSE_POLL_OPTION_ADD      = 'COMPOSE_POLL_OPTION_ADD';
  constant COMPOSE_POLL_OPTION_CHANGE (line 57) | const COMPOSE_POLL_OPTION_CHANGE   = 'COMPOSE_POLL_OPTION_CHANGE';
  constant COMPOSE_POLL_OPTION_REMOVE (line 58) | const COMPOSE_POLL_OPTION_REMOVE   = 'COMPOSE_POLL_OPTION_REMOVE';
  constant COMPOSE_POLL_SETTINGS_CHANGE (line 59) | const COMPOSE_POLL_SETTINGS_CHANGE = 'COMPOSE_POLL_SETTINGS_CHANGE';
  constant COMPOSE_PANEL_BREAKPOINT (line 66) | const COMPOSE_PANEL_BREAKPOINT = 600 + (285 * 1) + (10 * 1);
  function changeCompose (line 74) | function changeCompose(text) {
  function replyCompose (line 81) | function replyCompose(status, routerHistory) {
  function cancelReplyCompose (line 92) | function cancelReplyCompose() {
  function resetCompose (line 98) | function resetCompose() {
  function mentionCompose (line 104) | function mentionCompose(account, routerHistory) {
  function directCompose (line 115) | function directCompose(account, routerHistory) {
  function submitCompose (line 126) | function submitCompose(routerHistory) {
  function submitComposeRequest (line 184) | function submitComposeRequest() {
  function submitComposeSuccess (line 190) | function submitComposeSuccess(status) {
  function submitComposeFail (line 197) | function submitComposeFail(error) {
  function uploadCompose (line 204) | function uploadCompose(files) {
  function changeUploadCompose (line 243) | function changeUploadCompose(id, params) {
  function changeUploadComposeRequest (line 255) | function changeUploadComposeRequest() {
  function changeUploadComposeSuccess (line 261) | function changeUploadComposeSuccess(media) {
  function changeUploadComposeFail (line 269) | function changeUploadComposeFail(error) {
  function uploadComposeRequest (line 277) | function uploadComposeRequest() {
  function uploadComposeProgress (line 284) | function uploadComposeProgress(loaded, total) {
  function uploadComposeSuccess (line 292) | function uploadComposeSuccess(media) {
  function uploadComposeFail (line 300) | function uploadComposeFail(error) {
  function undoUploadCompose (line 308) | function undoUploadCompose(media_id) {
  function clearComposeSuggestions (line 315) | function clearComposeSuggestions() {
  function fetchComposeSuggestions (line 356) | function fetchComposeSuggestions(token) {
  function readyComposeSuggestionsEmojis (line 372) | function readyComposeSuggestionsEmojis(token, emojis) {
  function readyComposeSuggestionsAccounts (line 380) | function readyComposeSuggestionsAccounts(token, accounts) {
  function selectComposeSuggestion (line 388) | function selectComposeSuggestion(position, token, suggestion, path) {
  function updateSuggestionTags (line 415) | function updateSuggestionTags(token) {
  function updateTagHistory (line 422) | function updateTagHistory(tags) {
  function hydrateCompose (line 429) | function hydrateCompose() {
  function insertIntoTagHistory (line 440) | function insertIntoTagHistory(recognizedTags, text) {
  function mountCompose (line 457) | function mountCompose() {
  function unmountCompose (line 463) | function unmountCompose() {
  function changeComposeSensitivity (line 469) | function changeComposeSensitivity() {
  function changeComposeSpoilerness (line 475) | function changeComposeSpoilerness() {
  function changeComposeSpoilerText (line 481) | function changeComposeSpoilerText(text) {
  function changeComposeVisibility (line 488) | function changeComposeVisibility(value) {
  function insertEmojiCompose (line 495) | function insertEmojiCompose(position, emoji, needsSpace) {
  function changeComposing (line 504) | function changeComposing(value) {
  function addPoll (line 511) | function addPoll() {
  function removePoll (line 517) | function removePoll() {
  function addPollOption (line 523) | function addPollOption(title) {
  function changePollOption (line 530) | function changePollOption(index, title) {
  function removePollOption (line 538) | function removePollOption(index) {
  function changePollSettings (line 545) | function changePollSettings(expiresIn, isMultiple) {

FILE: app/javascript/mastodon/actions/conversations.js
  constant CONVERSATIONS_MOUNT (line 8) | const CONVERSATIONS_MOUNT   = 'CONVERSATIONS_MOUNT';
  constant CONVERSATIONS_UNMOUNT (line 9) | const CONVERSATIONS_UNMOUNT = 'CONVERSATIONS_UNMOUNT';
  constant CONVERSATIONS_FETCH_REQUEST (line 11) | const CONVERSATIONS_FETCH_REQUEST = 'CONVERSATIONS_FETCH_REQUEST';
  constant CONVERSATIONS_FETCH_SUCCESS (line 12) | const CONVERSATIONS_FETCH_SUCCESS = 'CONVERSATIONS_FETCH_SUCCESS';
  constant CONVERSATIONS_FETCH_FAIL (line 13) | const CONVERSATIONS_FETCH_FAIL    = 'CONVERSATIONS_FETCH_FAIL';
  constant CONVERSATIONS_UPDATE (line 14) | const CONVERSATIONS_UPDATE        = 'CONVERSATIONS_UPDATE';
  constant CONVERSATIONS_READ (line 16) | const CONVERSATIONS_READ = 'CONVERSATIONS_READ';

FILE: app/javascript/mastodon/actions/custom_emojis.js
  constant CUSTOM_EMOJIS_FETCH_REQUEST (line 3) | const CUSTOM_EMOJIS_FETCH_REQUEST = 'CUSTOM_EMOJIS_FETCH_REQUEST';
  constant CUSTOM_EMOJIS_FETCH_SUCCESS (line 4) | const CUSTOM_EMOJIS_FETCH_SUCCESS = 'CUSTOM_EMOJIS_FETCH_SUCCESS';
  constant CUSTOM_EMOJIS_FETCH_FAIL (line 5) | const CUSTOM_EMOJIS_FETCH_FAIL = 'CUSTOM_EMOJIS_FETCH_FAIL';
  function fetchCustomEmojis (line 7) | function fetchCustomEmojis() {
  function fetchCustomEmojisRequest (line 19) | function fetchCustomEmojisRequest() {
  function fetchCustomEmojisSuccess (line 26) | function fetchCustomEmojisSuccess(custom_emojis) {
  function fetchCustomEmojisFail (line 34) | function fetchCustomEmojisFail(error) {

FILE: app/javascript/mastodon/actions/domain_blocks.js
  constant DOMAIN_BLOCK_REQUEST (line 3) | const DOMAIN_BLOCK_REQUEST = 'DOMAIN_BLOCK_REQUEST';
  constant DOMAIN_BLOCK_SUCCESS (line 4) | const DOMAIN_BLOCK_SUCCESS = 'DOMAIN_BLOCK_SUCCESS';
  constant DOMAIN_BLOCK_FAIL (line 5) | const DOMAIN_BLOCK_FAIL    = 'DOMAIN_BLOCK_FAIL';
  constant DOMAIN_UNBLOCK_REQUEST (line 7) | const DOMAIN_UNBLOCK_REQUEST = 'DOMAIN_UNBLOCK_REQUEST';
  constant DOMAIN_UNBLOCK_SUCCESS (line 8) | const DOMAIN_UNBLOCK_SUCCESS = 'DOMAIN_UNBLOCK_SUCCESS';
  constant DOMAIN_UNBLOCK_FAIL (line 9) | const DOMAIN_UNBLOCK_FAIL    = 'DOMAIN_UNBLOCK_FAIL';
  constant DOMAIN_BLOCKS_FETCH_REQUEST (line 11) | const DOMAIN_BLOCKS_FETCH_REQUEST = 'DOMAIN_BLOCKS_FETCH_REQUEST';
  constant DOMAIN_BLOCKS_FETCH_SUCCESS (line 12) | const DOMAIN_BLOCKS_FETCH_SUCCESS = 'DOMAIN_BLOCKS_FETCH_SUCCESS';
  constant DOMAIN_BLOCKS_FETCH_FAIL (line 13) | const DOMAIN_BLOCKS_FETCH_FAIL    = 'DOMAIN_BLOCKS_FETCH_FAIL';
  constant DOMAIN_BLOCKS_EXPAND_REQUEST (line 15) | const DOMAIN_BLOCKS_EXPAND_REQUEST = 'DOMAIN_BLOCKS_EXPAND_REQUEST';
  constant DOMAIN_BLOCKS_EXPAND_SUCCESS (line 16) | const DOMAIN_BLOCKS_EXPAND_SUCCESS = 'DOMAIN_BLOCKS_EXPAND_SUCCESS';
  constant DOMAIN_BLOCKS_EXPAND_FAIL (line 17) | const DOMAIN_BLOCKS_EXPAND_FAIL    = 'DOMAIN_BLOCKS_EXPAND_FAIL';
  function blockDomain (line 19) | function blockDomain(domain) {
  function blockDomainRequest (line 33) | function blockDomainRequest(domain) {
  function blockDomainSuccess (line 40) | function blockDomainSuccess(domain, accounts) {
  function blockDomainFail (line 48) | function blockDomainFail(domain, error) {
  function unblockDomain (line 56) | function unblockDomain(domain) {
  function unblockDomainRequest (line 70) | function unblockDomainRequest(domain) {
  function unblockDomainSuccess (line 77) | function unblockDomainSuccess(domain, accounts) {
  function unblockDomainFail (line 85) | function unblockDomainFail(domain, error) {
  function fetchDomainBlocks (line 93) | function fetchDomainBlocks() {
  function fetchDomainBlocksRequest (line 106) | function fetchDomainBlocksRequest() {
  function fetchDomainBlocksSuccess (line 112) | function fetchDomainBlocksSuccess(domains, next) {
  function fetchDomainBlocksFail (line 120) | function fetchDomainBlocksFail(error) {
  function expandDomainBlocks (line 127) | function expandDomainBlocks() {
  function expandDomainBlocksRequest (line 146) | function expandDomainBlocksRequest() {
  function expandDomainBlocksSuccess (line 152) | function expandDomainBlocksSuccess(domains, next) {
  function expandDomainBlocksFail (line 160) | function expandDomainBlocksFail(error) {

FILE: app/javascript/mastodon/actions/dropdown_menu.js
  constant DROPDOWN_MENU_OPEN (line 1) | const DROPDOWN_MENU_OPEN = 'DROPDOWN_MENU_OPEN';
  constant DROPDOWN_MENU_CLOSE (line 2) | const DROPDOWN_MENU_CLOSE = 'DROPDOWN_MENU_CLOSE';
  function openDropdownMenu (line 4) | function openDropdownMenu(id, placement, keyboard) {
  function closeDropdownMenu (line 8) | function closeDropdownMenu(id) {

FILE: app/javascript/mastodon/actions/emojis.js
  constant EMOJI_USE (line 3) | const EMOJI_USE = 'EMOJI_USE';
  function useEmoji (line 5) | function useEmoji(emoji) {

FILE: app/javascript/mastodon/actions/favourites.js
  constant FAVOURITED_STATUSES_FETCH_REQUEST (line 4) | const FAVOURITED_STATUSES_FETCH_REQUEST = 'FAVOURITED_STATUSES_FETCH_REQ...
  constant FAVOURITED_STATUSES_FETCH_SUCCESS (line 5) | const FAVOURITED_STATUSES_FETCH_SUCCESS = 'FAVOURITED_STATUSES_FETCH_SUC...
  constant FAVOURITED_STATUSES_FETCH_FAIL (line 6) | const FAVOURITED_STATUSES_FETCH_FAIL    = 'FAVOURITED_STATUSES_FETCH_FAIL';
  constant FAVOURITED_STATUSES_EXPAND_REQUEST (line 8) | const FAVOURITED_STATUSES_EXPAND_REQUEST = 'FAVOURITED_STATUSES_EXPAND_R...
  constant FAVOURITED_STATUSES_EXPAND_SUCCESS (line 9) | const FAVOURITED_STATUSES_EXPAND_SUCCESS = 'FAVOURITED_STATUSES_EXPAND_S...
  constant FAVOURITED_STATUSES_EXPAND_FAIL (line 10) | const FAVOURITED_STATUSES_EXPAND_FAIL    = 'FAVOURITED_STATUSES_EXPAND_F...
  function fetchFavouritedStatuses (line 12) | function fetchFavouritedStatuses() {
  function fetchFavouritedStatusesRequest (line 30) | function fetchFavouritedStatusesRequest() {
  function fetchFavouritedStatusesSuccess (line 37) | function fetchFavouritedStatusesSuccess(statuses, next) {
  function fetchFavouritedStatusesFail (line 46) | function fetchFavouritedStatusesFail(error) {
  function expandFavouritedStatuses (line 54) | function expandFavouritedStatuses() {
  function expandFavouritedStatusesRequest (line 74) | function expandFavouritedStatusesRequest() {
  function expandFavouritedStatusesSuccess (line 80) | function expandFavouritedStatusesSuccess(statuses, next) {
  function expandFavouritedStatusesFail (line 88) | function expandFavouritedStatusesFail(error) {

FILE: app/javascript/mastodon/actions/filters.js
  constant FILTERS_FETCH_REQUEST (line 3) | const FILTERS_FETCH_REQUEST = 'FILTERS_FETCH_REQUEST';
  constant FILTERS_FETCH_SUCCESS (line 4) | const FILTERS_FETCH_SUCCESS = 'FILTERS_FETCH_SUCCESS';
  constant FILTERS_FETCH_FAIL (line 5) | const FILTERS_FETCH_FAIL    = 'FILTERS_FETCH_FAIL';

FILE: app/javascript/mastodon/actions/height_cache.js
  constant HEIGHT_CACHE_SET (line 1) | const HEIGHT_CACHE_SET = 'HEIGHT_CACHE_SET';
  constant HEIGHT_CACHE_CLEAR (line 2) | const HEIGHT_CACHE_CLEAR = 'HEIGHT_CACHE_CLEAR';
  function setHeight (line 4) | function setHeight (key, id, height) {
  function clearHeight (line 13) | function clearHeight () {

FILE: app/javascript/mastodon/actions/identity_proofs.js
  constant IDENTITY_PROOFS_ACCOUNT_FETCH_REQUEST (line 3) | const IDENTITY_PROOFS_ACCOUNT_FETCH_REQUEST = 'IDENTITY_PROOFS_ACCOUNT_F...
  constant IDENTITY_PROOFS_ACCOUNT_FETCH_SUCCESS (line 4) | const IDENTITY_PROOFS_ACCOUNT_FETCH_SUCCESS = 'IDENTITY_PROOFS_ACCOUNT_F...
  constant IDENTITY_PROOFS_ACCOUNT_FETCH_FAIL (line 5) | const IDENTITY_PROOFS_ACCOUNT_FETCH_FAIL    = 'IDENTITY_PROOFS_ACCOUNT_F...

FILE: app/javascript/mastodon/actions/importer/index.js
  constant ACCOUNT_IMPORT (line 3) | const ACCOUNT_IMPORT  = 'ACCOUNT_IMPORT';
  constant ACCOUNTS_IMPORT (line 4) | const ACCOUNTS_IMPORT = 'ACCOUNTS_IMPORT';
  constant STATUS_IMPORT (line 5) | const STATUS_IMPORT   = 'STATUS_IMPORT';
  constant STATUSES_IMPORT (line 6) | const STATUSES_IMPORT = 'STATUSES_IMPORT';
  constant POLLS_IMPORT (line 7) | const POLLS_IMPORT    = 'POLLS_IMPORT';
  function pushUnique (line 9) | function pushUnique(array, object) {
  function importAccount (line 15) | function importAccount(account) {
  function importAccounts (line 19) | function importAccounts(accounts) {
  function importStatus (line 23) | function importStatus(status) {
  function importStatuses (line 27) | function importStatuses(statuses) {
  function importPolls (line 31) | function importPolls(polls) {
  function importFetchedAccount (line 35) | function importFetchedAccount(account) {
  function importFetchedAccounts (line 39) | function importFetchedAccounts(accounts) {
  function importFetchedStatus (line 55) | function importFetchedStatus(status) {
  function importFetchedStatuses (line 59) | function importFetchedStatuses(statuses) {
  function importFetchedPoll (line 86) | function importFetchedPoll(poll) {

FILE: app/javascript/mastodon/actions/importer/normalizer.js
  function normalizeAccount (line 13) | function normalizeAccount(account) {
  function normalizeStatus (line 38) | function normalizeStatus(status, normalOldStatus) {
  function normalizePoll (line 71) | function normalizePoll(poll) {

FILE: app/javascript/mastodon/actions/interactions.js
  constant REBLOG_REQUEST (line 4) | const REBLOG_REQUEST = 'REBLOG_REQUEST';
  constant REBLOG_SUCCESS (line 5) | const REBLOG_SUCCESS = 'REBLOG_SUCCESS';
  constant REBLOG_FAIL (line 6) | const REBLOG_FAIL    = 'REBLOG_FAIL';
  constant FAVOURITE_REQUEST (line 8) | const FAVOURITE_REQUEST = 'FAVOURITE_REQUEST';
  constant FAVOURITE_SUCCESS (line 9) | const FAVOURITE_SUCCESS = 'FAVOURITE_SUCCESS';
  constant FAVOURITE_FAIL (line 10) | const FAVOURITE_FAIL    = 'FAVOURITE_FAIL';
  constant UNREBLOG_REQUEST (line 12) | const UNREBLOG_REQUEST = 'UNREBLOG_REQUEST';
  constant UNREBLOG_SUCCESS (line 13) | const UNREBLOG_SUCCESS = 'UNREBLOG_SUCCESS';
  constant UNREBLOG_FAIL (line 14) | const UNREBLOG_FAIL    = 'UNREBLOG_FAIL';
  constant UNFAVOURITE_REQUEST (line 16) | const UNFAVOURITE_REQUEST = 'UNFAVOURITE_REQUEST';
  constant UNFAVOURITE_SUCCESS (line 17) | const UNFAVOURITE_SUCCESS = 'UNFAVOURITE_SUCCESS';
  constant UNFAVOURITE_FAIL (line 18) | const UNFAVOURITE_FAIL    = 'UNFAVOURITE_FAIL';
  constant REBLOGS_FETCH_REQUEST (line 20) | const REBLOGS_FETCH_REQUEST = 'REBLOGS_FETCH_REQUEST';
  constant REBLOGS_FETCH_SUCCESS (line 21) | const REBLOGS_FETCH_SUCCESS = 'REBLOGS_FETCH_SUCCESS';
  constant REBLOGS_FETCH_FAIL (line 22) | const REBLOGS_FETCH_FAIL    = 'REBLOGS_FETCH_FAIL';
  constant FAVOURITES_FETCH_REQUEST (line 24) | const FAVOURITES_FETCH_REQUEST = 'FAVOURITES_FETCH_REQUEST';
  constant FAVOURITES_FETCH_SUCCESS (line 25) | const FAVOURITES_FETCH_SUCCESS = 'FAVOURITES_FETCH_SUCCESS';
  constant FAVOURITES_FETCH_FAIL (line 26) | const FAVOURITES_FETCH_FAIL    = 'FAVOURITES_FETCH_FAIL';
  constant PIN_REQUEST (line 28) | const PIN_REQUEST = 'PIN_REQUEST';
  constant PIN_SUCCESS (line 29) | const PIN_SUCCESS = 'PIN_SUCCESS';
  constant PIN_FAIL (line 30) | const PIN_FAIL    = 'PIN_FAIL';
  constant UNPIN_REQUEST (line 32) | const UNPIN_REQUEST = 'UNPIN_REQUEST';
  constant UNPIN_SUCCESS (line 33) | const UNPIN_SUCCESS = 'UNPIN_SUCCESS';
  constant UNPIN_FAIL (line 34) | const UNPIN_FAIL    = 'UNPIN_FAIL';
  function reblog (line 36) | function reblog(status) {
  function unreblog (line 51) | function unreblog(status) {
  function reblogRequest (line 64) | function reblogRequest(status) {
  function reblogSuccess (line 72) | function reblogSuccess(status) {
  function reblogFail (line 80) | function reblogFail(status, error) {
  function unreblogRequest (line 89) | function unreblogRequest(status) {
  function unreblogSuccess (line 97) | function unreblogSuccess(status) {
  function unreblogFail (line 105) | function unreblogFail(status, error) {
  function favourite (line 114) | function favourite(status) {
  function unfavourite (line 127) | function unfavourite(status) {
  function favouriteRequest (line 140) | function favouriteRequest(status) {
  function favouriteSuccess (line 148) | function favouriteSuccess(status) {
  function favouriteFail (line 156) | function favouriteFail(status, error) {
  function unfavouriteRequest (line 165) | function unfavouriteRequest(status) {
  function unfavouriteSuccess (line 173) | function unfavouriteSuccess(status) {
  function unfavouriteFail (line 181) | function unfavouriteFail(status, error) {
  function fetchReblogs (line 190) | function fetchReblogs(id) {
  function fetchReblogsRequest (line 203) | function fetchReblogsRequest(id) {
  function fetchReblogsSuccess (line 210) | function fetchReblogsSuccess(id, accounts) {
  function fetchReblogsFail (line 218) | function fetchReblogsFail(id, error) {
  function fetchFavourites (line 225) | function fetchFavourites(id) {
  function fetchFavouritesRequest (line 238) | function fetchFavouritesRequest(id) {
  function fetchFavouritesSuccess (line 245) | function fetchFavouritesSuccess(id, accounts) {
  function fetchFavouritesFail (line 253) | function fetchFavouritesFail(id, error) {
  function pin (line 260) | function pin(status) {
  function pinRequest (line 273) | function pinRequest(status) {
  function pinSuccess (line 281) | function pinSuccess(status) {
  function pinFail (line 289) | function pinFail(status, error) {
  function unpin (line 298) | function unpin (status) {
  function unpinRequest (line 311) | function unpinRequest(status) {
  function unpinSuccess (line 319) | function unpinSuccess(status) {
  function unpinFail (line 327) | function unpinFail(status, error) {

FILE: app/javascript/mastodon/actions/lists.js
  constant LIST_FETCH_REQUEST (line 5) | const LIST_FETCH_REQUEST = 'LIST_FETCH_REQUEST';
  constant LIST_FETCH_SUCCESS (line 6) | const LIST_FETCH_SUCCESS = 'LIST_FETCH_SUCCESS';
  constant LIST_FETCH_FAIL (line 7) | const LIST_FETCH_FAIL    = 'LIST_FETCH_FAIL';
  constant LISTS_FETCH_REQUEST (line 9) | const LISTS_FETCH_REQUEST = 'LISTS_FETCH_REQUEST';
  constant LISTS_FETCH_SUCCESS (line 10) | const LISTS_FETCH_SUCCESS = 'LISTS_FETCH_SUCCESS';
  constant LISTS_FETCH_FAIL (line 11) | const LISTS_FETCH_FAIL    = 'LISTS_FETCH_FAIL';
  constant LIST_EDITOR_TITLE_CHANGE (line 13) | const LIST_EDITOR_TITLE_CHANGE = 'LIST_EDITOR_TITLE_CHANGE';
  constant LIST_EDITOR_RESET (line 14) | const LIST_EDITOR_RESET        = 'LIST_EDITOR_RESET';
  constant LIST_EDITOR_SETUP (line 15) | const LIST_EDITOR_SETUP        = 'LIST_EDITOR_SETUP';
  constant LIST_CREATE_REQUEST (line 17) | const LIST_CREATE_REQUEST = 'LIST_CREATE_REQUEST';
  constant LIST_CREATE_SUCCESS (line 18) | const LIST_CREATE_SUCCESS = 'LIST_CREATE_SUCCESS';
  constant LIST_CREATE_FAIL (line 19) | const LIST_CREATE_FAIL    = 'LIST_CREATE_FAIL';
  constant LIST_UPDATE_REQUEST (line 21) | const LIST_UPDATE_REQUEST = 'LIST_UPDATE_REQUEST';
  constant LIST_UPDATE_SUCCESS (line 22) | const LIST_UPDATE_SUCCESS = 'LIST_UPDATE_SUCCESS';
  constant LIST_UPDATE_FAIL (line 23) | const LIST_UPDATE_FAIL    = 'LIST_UPDATE_FAIL';
  constant LIST_DELETE_REQUEST (line 25) | const LIST_DELETE_REQUEST = 'LIST_DELETE_REQUEST';
  constant LIST_DELETE_SUCCESS (line 26) | const LIST_DELETE_SUCCESS = 'LIST_DELETE_SUCCESS';
  constant LIST_DELETE_FAIL (line 27) | const LIST_DELETE_FAIL    = 'LIST_DELETE_FAIL';
  constant LIST_ACCOUNTS_FETCH_REQUEST (line 29) | const LIST_ACCOUNTS_FETCH_REQUEST = 'LIST_ACCOUNTS_FETCH_REQUEST';
  constant LIST_ACCOUNTS_FETCH_SUCCESS (line 30) | const LIST_ACCOUNTS_FETCH_SUCCESS = 'LIST_ACCOUNTS_FETCH_SUCCESS';
  constant LIST_ACCOUNTS_FETCH_FAIL (line 31) | const LIST_ACCOUNTS_FETCH_FAIL    = 'LIST_ACCOUNTS_FETCH_FAIL';
  constant LIST_EDITOR_SUGGESTIONS_CHANGE (line 33) | const LIST_EDITOR_SUGGESTIONS_CHANGE = 'LIST_EDITOR_SUGGESTIONS_CHANGE';
  constant LIST_EDITOR_SUGGESTIONS_READY (line 34) | const LIST_EDITOR_SUGGESTIONS_READY  = 'LIST_EDITOR_SUGGESTIONS_READY';
  constant LIST_EDITOR_SUGGESTIONS_CLEAR (line 35) | const LIST_EDITOR_SUGGESTIONS_CLEAR  = 'LIST_EDITOR_SUGGESTIONS_CLEAR';
  constant LIST_EDITOR_ADD_REQUEST (line 37) | const LIST_EDITOR_ADD_REQUEST = 'LIST_EDITOR_ADD_REQUEST';
  constant LIST_EDITOR_ADD_SUCCESS (line 38) | const LIST_EDITOR_ADD_SUCCESS = 'LIST_EDITOR_ADD_SUCCESS';
  constant LIST_EDITOR_ADD_FAIL (line 39) | const LIST_EDITOR_ADD_FAIL    = 'LIST_EDITOR_ADD_FAIL';
  constant LIST_EDITOR_REMOVE_REQUEST (line 41) | const LIST_EDITOR_REMOVE_REQUEST = 'LIST_EDITOR_REMOVE_REQUEST';
  constant LIST_EDITOR_REMOVE_SUCCESS (line 42) | const LIST_EDITOR_REMOVE_SUCCESS = 'LIST_EDITOR_REMOVE_SUCCESS';
  constant LIST_EDITOR_REMOVE_FAIL (line 43) | const LIST_EDITOR_REMOVE_FAIL    = 'LIST_EDITOR_REMOVE_FAIL';
  constant LIST_ADDER_RESET (line 45) | const LIST_ADDER_RESET = 'LIST_ADDER_RESET';
  constant LIST_ADDER_SETUP (line 46) | const LIST_ADDER_SETUP = 'LIST_ADDER_SETUP';
  constant LIST_ADDER_LISTS_FETCH_REQUEST (line 48) | const LIST_ADDER_LISTS_FETCH_REQUEST = 'LIST_ADDER_LISTS_FETCH_REQUEST';
  constant LIST_ADDER_LISTS_FETCH_SUCCESS (line 49) | const LIST_ADDER_LISTS_FETCH_SUCCESS = 'LIST_ADDER_LISTS_FETCH_SUCCESS';
  constant LIST_ADDER_LISTS_FETCH_FAIL (line 50) | const LIST_ADDER_LISTS_FETCH_FAIL    = 'LIST_ADDER_LISTS_FETCH_FAIL';

FILE: app/javascript/mastodon/actions/modal.js
  constant MODAL_OPEN (line 1) | const MODAL_OPEN  = 'MODAL_OPEN';
  constant MODAL_CLOSE (line 2) | const MODAL_CLOSE = 'MODAL_CLOSE';
  function openModal (line 4) | function openModal(type, props) {
  function closeModal (line 12) | function closeModal() {

FILE: app/javascript/mastodon/actions/mutes.js
  constant MUTES_FETCH_REQUEST (line 6) | const MUTES_FETCH_REQUEST = 'MUTES_FETCH_REQUEST';
  constant MUTES_FETCH_SUCCESS (line 7) | const MUTES_FETCH_SUCCESS = 'MUTES_FETCH_SUCCESS';
  constant MUTES_FETCH_FAIL (line 8) | const MUTES_FETCH_FAIL    = 'MUTES_FETCH_FAIL';
  constant MUTES_EXPAND_REQUEST (line 10) | const MUTES_EXPAND_REQUEST = 'MUTES_EXPAND_REQUEST';
  constant MUTES_EXPAND_SUCCESS (line 11) | const MUTES_EXPAND_SUCCESS = 'MUTES_EXPAND_SUCCESS';
  constant MUTES_EXPAND_FAIL (line 12) | const MUTES_EXPAND_FAIL    = 'MUTES_EXPAND_FAIL';
  constant MUTES_INIT_MODAL (line 14) | const MUTES_INIT_MODAL = 'MUTES_INIT_MODAL';
  constant MUTES_TOGGLE_HIDE_NOTIFICATIONS (line 15) | const MUTES_TOGGLE_HIDE_NOTIFICATIONS = 'MUTES_TOGGLE_HIDE_NOTIFICATIONS';
  function fetchMutes (line 17) | function fetchMutes() {
  function fetchMutesRequest (line 30) | function fetchMutesRequest() {
  function fetchMutesSuccess (line 36) | function fetchMutesSuccess(accounts, next) {
  function fetchMutesFail (line 44) | function fetchMutesFail(error) {
  function expandMutes (line 51) | function expandMutes() {
  function expandMutesRequest (line 70) | function expandMutesRequest() {
  function expandMutesSuccess (line 76) | function expandMutesSuccess(accounts, next) {
  function expandMutesFail (line 84) | function expandMutesFail(error) {
  function initMuteModal (line 91) | function initMuteModal(account) {
  function toggleHideNotifications (line 102) | function toggleHideNotifications() {

FILE: app/javascript/mastodon/actions/notifications.js
  constant NOTIFICATIONS_UPDATE (line 16) | const NOTIFICATIONS_UPDATE      = 'NOTIFICATIONS_UPDATE';
  constant NOTIFICATIONS_UPDATE_NOOP (line 17) | const NOTIFICATIONS_UPDATE_NOOP = 'NOTIFICATIONS_UPDATE_NOOP';
  constant NOTIFICATIONS_EXPAND_REQUEST (line 19) | const NOTIFICATIONS_EXPAND_REQUEST = 'NOTIFICATIONS_EXPAND_REQUEST';
  constant NOTIFICATIONS_EXPAND_SUCCESS (line 20) | const NOTIFICATIONS_EXPAND_SUCCESS = 'NOTIFICATIONS_EXPAND_SUCCESS';
  constant NOTIFICATIONS_EXPAND_FAIL (line 21) | const NOTIFICATIONS_EXPAND_FAIL    = 'NOTIFICATIONS_EXPAND_FAIL';
  constant NOTIFICATIONS_FILTER_SET (line 23) | const NOTIFICATIONS_FILTER_SET = 'NOTIFICATIONS_FILTER_SET';
  constant NOTIFICATIONS_CLEAR (line 25) | const NOTIFICATIONS_CLEAR      = 'NOTIFICATIONS_CLEAR';
  constant NOTIFICATIONS_SCROLL_TOP (line 26) | const NOTIFICATIONS_SCROLL_TOP = 'NOTIFICATIONS_SCROLL_TOP';
  function updateNotifications (line 41) | function updateNotifications(notification, intlMessages, intlLocale) {
  function expandNotifications (line 102) | function expandNotifications({ maxId } = {}, done = noOp) {
  function expandNotificationsRequest (line 142) | function expandNotificationsRequest(isLoadingMore) {
  function expandNotificationsSuccess (line 149) | function expandNotificationsSuccess(notifications, next, isLoadingMore) {
  function expandNotificationsFail (line 158) | function expandNotificationsFail(error, isLoadingMore) {
  function clearNotifications (line 166) | function clearNotifications() {
  function scrollTopNotifications (line 176) | function scrollTopNotifications(top) {
  function setFilter (line 183) | function setFilter (filterType) {

FILE: app/javascript/mastodon/actions/onboarding.js
  constant INTRODUCTION_VERSION (line 3) | const INTRODUCTION_VERSION = 20181216044202;

FILE: app/javascript/mastodon/actions/pin_statuses.js
  constant PINNED_STATUSES_FETCH_REQUEST (line 4) | const PINNED_STATUSES_FETCH_REQUEST = 'PINNED_STATUSES_FETCH_REQUEST';
  constant PINNED_STATUSES_FETCH_SUCCESS (line 5) | const PINNED_STATUSES_FETCH_SUCCESS = 'PINNED_STATUSES_FETCH_SUCCESS';
  constant PINNED_STATUSES_FETCH_FAIL (line 6) | const PINNED_STATUSES_FETCH_FAIL = 'PINNED_STATUSES_FETCH_FAIL';
  function fetchPinnedStatuses (line 10) | function fetchPinnedStatuses() {
  function fetchPinnedStatusesRequest (line 23) | function fetchPinnedStatusesRequest() {
  function fetchPinnedStatusesSuccess (line 29) | function fetchPinnedStatusesSuccess(statuses, next) {
  function fetchPinnedStatusesFail (line 37) | function fetchPinnedStatusesFail(error) {

FILE: app/javascript/mastodon/actions/polls.js
  constant POLL_VOTE_REQUEST (line 4) | const POLL_VOTE_REQUEST = 'POLL_VOTE_REQUEST';
  constant POLL_VOTE_SUCCESS (line 5) | const POLL_VOTE_SUCCESS = 'POLL_VOTE_SUCCESS';
  constant POLL_VOTE_FAIL (line 6) | const POLL_VOTE_FAIL    = 'POLL_VOTE_FAIL';
  constant POLL_FETCH_REQUEST (line 8) | const POLL_FETCH_REQUEST = 'POLL_FETCH_REQUEST';
  constant POLL_FETCH_SUCCESS (line 9) | const POLL_FETCH_SUCCESS = 'POLL_FETCH_SUCCESS';
  constant POLL_FETCH_FAIL (line 10) | const POLL_FETCH_FAIL    = 'POLL_FETCH_FAIL';

FILE: app/javascript/mastodon/actions/push_notifications/index.js
  function changeAlerts (line 18) | function changeAlerts(path, value) {

FILE: app/javascript/mastodon/actions/push_notifications/registerer.js
  function register (line 50) | function register () {
  function saveSettings (line 118) | function saveSettings() {

FILE: app/javascript/mastodon/actions/push_notifications/setter.js
  constant SET_BROWSER_SUPPORT (line 1) | const SET_BROWSER_SUPPORT = 'PUSH_NOTIFICATIONS_SET_BROWSER_SUPPORT';
  constant SET_SUBSCRIPTION (line 2) | const SET_SUBSCRIPTION = 'PUSH_NOTIFICATIONS_SET_SUBSCRIPTION';
  constant CLEAR_SUBSCRIPTION (line 3) | const CLEAR_SUBSCRIPTION = 'PUSH_NOTIFICATIONS_CLEAR_SUBSCRIPTION';
  constant SET_ALERTS (line 4) | const SET_ALERTS = 'PUSH_NOTIFICATIONS_SET_ALERTS';
  function setBrowserSupport (line 6) | function setBrowserSupport (value) {
  function setSubscription (line 13) | function setSubscription (subscription) {
  function clearSubscription (line 20) | function clearSubscription () {
  function setAlerts (line 26) | function setAlerts (path, value) {

FILE: app/javascript/mastodon/actions/reports.js
  constant REPORT_INIT (line 4) | const REPORT_INIT   = 'REPORT_INIT';
  constant REPORT_CANCEL (line 5) | const REPORT_CANCEL = 'REPORT_CANCEL';
  constant REPORT_SUBMIT_REQUEST (line 7) | const REPORT_SUBMIT_REQUEST = 'REPORT_SUBMIT_REQUEST';
  constant REPORT_SUBMIT_SUCCESS (line 8) | const REPORT_SUBMIT_SUCCESS = 'REPORT_SUBMIT_SUCCESS';
  constant REPORT_SUBMIT_FAIL (line 9) | const REPORT_SUBMIT_FAIL    = 'REPORT_SUBMIT_FAIL';
  constant REPORT_STATUS_TOGGLE (line 11) | const REPORT_STATUS_TOGGLE  = 'REPORT_STATUS_TOGGLE';
  constant REPORT_COMMENT_CHANGE (line 12) | const REPORT_COMMENT_CHANGE = 'REPORT_COMMENT_CHANGE';
  constant REPORT_FORWARD_CHANGE (line 13) | const REPORT_FORWARD_CHANGE = 'REPORT_FORWARD_CHANGE';
  function initReport (line 15) | function initReport(account, status) {
  function cancelReport (line 27) | function cancelReport() {
  function toggleStatusReport (line 33) | function toggleStatusReport(statusId, checked) {
  function submitReport (line 41) | function submitReport() {
  function submitReportRequest (line 57) | function submitReportRequest() {
  function submitReportSuccess (line 63) | function submitReportSuccess(report) {
  function submitReportFail (line 70) | function submitReportFail(error) {
  function changeReportComment (line 77) | function changeReportComment(comment) {
  function changeReportForward (line 84) | function changeReportForward(forward) {

FILE: app/javascript/mastodon/actions/search.js
  constant SEARCH_CHANGE (line 5) | const SEARCH_CHANGE = 'SEARCH_CHANGE';
  constant SEARCH_CLEAR (line 6) | const SEARCH_CLEAR  = 'SEARCH_CLEAR';
  constant SEARCH_SHOW (line 7) | const SEARCH_SHOW   = 'SEARCH_SHOW';
  constant SEARCH_FETCH_REQUEST (line 9) | const SEARCH_FETCH_REQUEST = 'SEARCH_FETCH_REQUEST';
  constant SEARCH_FETCH_SUCCESS (line 10) | const SEARCH_FETCH_SUCCESS = 'SEARCH_FETCH_SUCCESS';
  constant SEARCH_FETCH_FAIL (line 11) | const SEARCH_FETCH_FAIL    = 'SEARCH_FETCH_FAIL';
  function changeSearch (line 13) | function changeSearch(value) {
  function clearSearch (line 20) | function clearSearch() {
  function submitSearch (line 26) | function submitSearch() {
  function fetchSearchRequest (line 59) | function fetchSearchRequest() {
  function fetchSearchSuccess (line 65) | function fetchSearchSuccess(results) {
  function fetchSearchFail (line 72) | function fetchSearchFail(error) {
  function showSearch (line 79) | function showSearch() {

FILE: app/javascript/mastodon/actions/settings.js
  constant SETTING_CHANGE (line 5) | const SETTING_CHANGE = 'SETTING_CHANGE';
  constant SETTING_SAVE (line 6) | const SETTING_SAVE   = 'SETTING_SAVE';
  function changeSetting (line 8) | function changeSetting(path, value) {
  function saveSettings (line 32) | function saveSettings() {

FILE: app/javascript/mastodon/actions/statuses.js
  constant STATUS_FETCH_REQUEST (line 9) | const STATUS_FETCH_REQUEST = 'STATUS_FETCH_REQUEST';
  constant STATUS_FETCH_SUCCESS (line 10) | const STATUS_FETCH_SUCCESS = 'STATUS_FETCH_SUCCESS';
  constant STATUS_FETCH_FAIL (line 11) | const STATUS_FETCH_FAIL    = 'STATUS_FETCH_FAIL';
  constant STATUS_DELETE_REQUEST (line 13) | const STATUS_DELETE_REQUEST = 'STATUS_DELETE_REQUEST';
  constant STATUS_DELETE_SUCCESS (line 14) | const STATUS_DELETE_SUCCESS = 'STATUS_DELETE_SUCCESS';
  constant STATUS_DELETE_FAIL (line 15) | const STATUS_DELETE_FAIL    = 'STATUS_DELETE_FAIL';
  constant CONTEXT_FETCH_REQUEST (line 17) | const CONTEXT_FETCH_REQUEST = 'CONTEXT_FETCH_REQUEST';
  constant CONTEXT_FETCH_SUCCESS (line 18) | const CONTEXT_FETCH_SUCCESS = 'CONTEXT_FETCH_SUCCESS';
  constant CONTEXT_FETCH_FAIL (line 19) | const CONTEXT_FETCH_FAIL    = 'CONTEXT_FETCH_FAIL';
  constant STATUS_MUTE_REQUEST (line 21) | const STATUS_MUTE_REQUEST = 'STATUS_MUTE_REQUEST';
  constant STATUS_MUTE_SUCCESS (line 22) | const STATUS_MUTE_SUCCESS = 'STATUS_MUTE_SUCCESS';
  constant STATUS_MUTE_FAIL (line 23) | const STATUS_MUTE_FAIL    = 'STATUS_MUTE_FAIL';
  constant STATUS_UNMUTE_REQUEST (line 25) | const STATUS_UNMUTE_REQUEST = 'STATUS_UNMUTE_REQUEST';
  constant STATUS_UNMUTE_SUCCESS (line 26) | const STATUS_UNMUTE_SUCCESS = 'STATUS_UNMUTE_SUCCESS';
  constant STATUS_UNMUTE_FAIL (line 27) | const STATUS_UNMUTE_FAIL    = 'STATUS_UNMUTE_FAIL';
  constant STATUS_REVEAL (line 29) | const STATUS_REVEAL = 'STATUS_REVEAL';
  constant STATUS_HIDE (line 30) | const STATUS_HIDE   = 'STATUS_HIDE';
  constant REDRAFT (line 32) | const REDRAFT = 'REDRAFT';
  function fetchStatusRequest (line 34) | function fetchStatusRequest(id, skipLoading) {
  function getFromDB (line 42) | function getFromDB(dispatch, getState, accountIndex, index, id) {
  function fetchStatus (line 84) | function fetchStatus(id) {
  function fetchStatusSuccess (line 118) | function fetchStatusSuccess(skipLoading) {
  function fetchStatusFail (line 125) | function fetchStatusFail(id, error, skipLoading) {
  function redraft (line 135) | function redraft(status, raw_text) {
  function deleteStatus (line 143) | function deleteStatus(id, routerHistory, withRedraft = false) {
  function deleteStatusRequest (line 168) | function deleteStatusRequest(id) {
  function deleteStatusSuccess (line 175) | function deleteStatusSuccess(id) {
  function deleteStatusFail (line 182) | function deleteStatusFail(id, error) {
  function fetchContext (line 190) | function fetchContext(id) {
  function fetchContextRequest (line 208) | function fetchContextRequest(id) {
  function fetchContextSuccess (line 215) | function fetchContextSuccess(id, ancestors, descendants) {
  function fetchContextFail (line 225) | function fetchContextFail(id, error) {
  function muteStatus (line 234) | function muteStatus(id) {
  function muteStatusRequest (line 246) | function muteStatusRequest(id) {
  function muteStatusSuccess (line 253) | function muteStatusSuccess(id) {
  function muteStatusFail (line 260) | function muteStatusFail(id, error) {
  function unmuteStatus (line 268) | function unmuteStatus(id) {
  function unmuteStatusRequest (line 280) | function unmuteStatusRequest(id) {
  function unmuteStatusSuccess (line 287) | function unmuteStatusSuccess(id) {
  function unmuteStatusFail (line 294) | function unmuteStatusFail(id, error) {
  function hideStatus (line 302) | function hideStatus(ids) {
  function revealStatus (line 313) | function revealStatus(ids) {

FILE: app/javascript/mastodon/actions/store.js
  constant STORE_HYDRATE (line 5) | const STORE_HYDRATE = 'STORE_HYDRATE';
  constant STORE_HYDRATE_LAZY (line 6) | const STORE_HYDRATE_LAZY = 'STORE_HYDRATE_LAZY';
  function hydrateStore (line 12) | function hydrateStore(rawState) {

FILE: app/javascript/mastodon/actions/streaming.js
  function connectTimelineStream (line 16) | function connectTimelineStream (timelineId, path, pollingRefresh = null,...

FILE: app/javascript/mastodon/actions/suggestions.js
  constant SUGGESTIONS_FETCH_REQUEST (line 4) | const SUGGESTIONS_FETCH_REQUEST = 'SUGGESTIONS_FETCH_REQUEST';
  constant SUGGESTIONS_FETCH_SUCCESS (line 5) | const SUGGESTIONS_FETCH_SUCCESS = 'SUGGESTIONS_FETCH_SUCCESS';
  constant SUGGESTIONS_FETCH_FAIL (line 6) | const SUGGESTIONS_FETCH_FAIL    = 'SUGGESTIONS_FETCH_FAIL';
  constant SUGGESTIONS_DISMISS (line 8) | const SUGGESTIONS_DISMISS = 'SUGGESTIONS_DISMISS';
  function fetchSuggestions (line 10) | function fetchSuggestions() {
  function fetchSuggestionsRequest (line 21) | function fetchSuggestionsRequest() {
  function fetchSuggestionsSuccess (line 28) | function fetchSuggestionsSuccess(accounts) {
  function fetchSuggestionsFail (line 36) | function fetchSuggestionsFail(error) {

FILE: app/javascript/mastodon/actions/timelines.js
  constant TIMELINE_UPDATE (line 5) | const TIMELINE_UPDATE  = 'TIMELINE_UPDATE';
  constant TIMELINE_DELETE (line 6) | const TIMELINE_DELETE  = 'TIMELINE_DELETE';
  constant TIMELINE_CLEAR (line 7) | const TIMELINE_CLEAR   = 'TIMELINE_CLEAR';
  constant TIMELINE_EXPAND_REQUEST (line 9) | const TIMELINE_EXPAND_REQUEST = 'TIMELINE_EXPAND_REQUEST';
  constant TIMELINE_EXPAND_SUCCESS (line 10) | const TIMELINE_EXPAND_SUCCESS = 'TIMELINE_EXPAND_SUCCESS';
  constant TIMELINE_EXPAND_FAIL (line 11) | const TIMELINE_EXPAND_FAIL    = 'TIMELINE_EXPAND_FAIL';
  constant TIMELINE_SCROLL_TOP (line 13) | const TIMELINE_SCROLL_TOP = 'TIMELINE_SCROLL_TOP';
  constant TIMELINE_CONNECT (line 15) | const TIMELINE_CONNECT    = 'TIMELINE_CONNECT';
  constant TIMELINE_DISCONNECT (line 16) | const TIMELINE_DISCONNECT = 'TIMELINE_DISCONNECT';
  function updateTimeline (line 18) | function updateTimeline(timeline, status, accept) {
  function deleteFromTimelines (line 34) | function deleteFromTimelines(id) {
  function clearTimeline (line 50) | function clearTimeline(timeline) {
  function expandTimeline (line 64) | function expandTimeline(timelineId, path, params = {}, done = noOp) {
  function expandTimelineRequest (line 110) | function expandTimelineRequest(timeline, isLoadingMore) {
  function expandTimelineSuccess (line 118) | function expandTimelineSuccess(timeline, statuses, next, partial, isLoad...
  function expandTimelineFail (line 130) | function expandTimelineFail(timeline, error, isLoadingMore) {
  function scrollTopTimeline (line 139) | function scrollTopTimeline(timeline, top) {
  function connectTimeline (line 147) | function connectTimeline(timeline) {
  function disconnectTimeline (line 154) | function disconnectTimeline(timeline) {

FILE: app/javascript/mastodon/api.js
  function setCSRFHeader (line 17) | function setCSRFHeader() {

FILE: app/javascript/mastodon/base_polyfills.js
  method value (line 30) | value(callback, type = 'image/png', quality) {

FILE: app/javascript/mastodon/common.js
  function start (line 3) | function start() {

FILE: app/javascript/mastodon/compare_id.js
  function compareId (line 1) | function compareId(id1, id2) {

FILE: app/javascript/mastodon/components/account.js
  class Account (line 22) | @injectIntl
    method render (line 62) | render () {

FILE: app/javascript/mastodon/components/attachment_list.js
  class AttachmentList (line 9) | class AttachmentList extends ImmutablePureComponent {
    method render (line 16) | render () {

FILE: app/javascript/mastodon/components/autosuggest_emoji.js
  class AutosuggestEmoji (line 7) | class AutosuggestEmoji extends React.PureComponent {
    method render (line 13) | render () {

FILE: app/javascript/mastodon/components/autosuggest_input.js
  class AutosuggestInput (line 36) | class AutosuggestInput extends ImmutablePureComponent {
    method componentWillReceiveProps (line 156) | componentWillReceiveProps (nextProps) {
    method render (line 188) | render () {

FILE: app/javascript/mastodon/components/autosuggest_textarea.js
  class AutosuggestTextarea (line 36) | class AutosuggestTextarea extends ImmutablePureComponent {
    method componentWillReceiveProps (line 155) | componentWillReceiveProps (nextProps) {
    method render (line 194) | render () {

FILE: app/javascript/mastodon/components/avatar.js
  class Avatar (line 6) | class Avatar extends React.PureComponent {
    method render (line 36) | render () {

FILE: app/javascript/mastodon/components/avatar_composite.js
  class AvatarComposite (line 6) | class AvatarComposite extends React.PureComponent {
    method renderItem (line 18) | renderItem (account, size, index) {
    method render (line 86) | render() {

FILE: app/javascript/mastodon/components/avatar_overlay.js
  class AvatarOverlay (line 6) | class AvatarOverlay extends React.PureComponent {
    method render (line 18) | render() {

FILE: app/javascript/mastodon/components/button.js
  class Button (line 5) | class Button extends React.PureComponent {
    method focus (line 33) | focus() {
    method render (line 37) | render () {

FILE: app/javascript/mastodon/components/column.js
  class Column (line 6) | class Column extends React.PureComponent {
    method scrollTop (line 13) | scrollTop () {
    method componentDidMount (line 35) | componentDidMount () {
    method componentWillUnmount (line 39) | componentWillUnmount () {
    method render (line 43) | render () {

FILE: app/javascript/mastodon/components/column_back_button.js
  class ColumnBackButton (line 6) | class ColumnBackButton extends React.PureComponent {
    method render (line 20) | render () {

FILE: app/javascript/mastodon/components/column_back_button_slim.js
  class ColumnBackButtonSlim (line 6) | class ColumnBackButtonSlim extends ColumnBackButton {
    method render (line 8) | render () {

FILE: app/javascript/mastodon/components/column_header.js
  class ColumnHeader (line 14) | @injectIntl
    method render (line 81) | render () {

FILE: app/javascript/mastodon/components/display_name.js
  class DisplayName (line 5) | class DisplayName extends React.PureComponent {
    method render (line 13) | render () {

FILE: app/javascript/mastodon/components/domain.js
  class Account (line 11) | @injectIntl
    method render (line 24) | render () {

FILE: app/javascript/mastodon/components/dropdown_menu.js
  class DropdownMenu (line 13) | class DropdownMenu extends React.PureComponent {
    method componentDidMount (line 44) | componentDidMount () {
    method componentWillUnmount (line 52) | componentWillUnmount () {
    method renderItem (line 120) | renderItem (option, i) {
    method render (line 136) | render () {
  class Dropdown (line 160) | class Dropdown extends React.PureComponent {
    method render (line 247) | render () {

FILE: app/javascript/mastodon/components/error_boundary.js
  class ErrorBoundary (line 5) | class ErrorBoundary extends React.PureComponent {
    method componentDidCatch (line 17) | componentDidCatch(error, info) {
    method render (line 25) | render() {

FILE: app/javascript/mastodon/components/extended_video_player.js
  class ExtendedVideoPlayer (line 4) | class ExtendedVideoPlayer extends React.PureComponent {
    method componentDidMount (line 23) | componentDidMount () {
    method componentWillUnmount (line 27) | componentWillUnmount () {
    method render (line 41) | render () {

FILE: app/javascript/mastodon/components/icon.js
  class Icon (line 5) | class Icon extends React.PureComponent {
    method render (line 13) | render () {

FILE: app/javascript/mastodon/components/icon_button.js
  class IconButton (line 8) | class IconButton extends React.PureComponent {
    method render (line 45) | render () {

FILE: app/javascript/mastodon/components/intersection_observer_article.js
  class IntersectionObserverArticle (line 12) | class IntersectionObserverArticle extends React.Component {
    method shouldComponentUpdate (line 29) | shouldComponentUpdate (nextProps, nextState) {
    method componentDidMount (line 41) | componentDidMount () {
    method componentWillUnmount (line 53) | componentWillUnmount () {
    method render (line 104) | render () {

FILE: app/javascript/mastodon/components/load_gap.js
  class LoadGap (line 10) | @injectIntl
    method render (line 24) | render () {

FILE: app/javascript/mastodon/components/load_more.js
  class LoadMore (line 5) | class LoadMore extends React.PureComponent {
    method render (line 17) | render() {

FILE: app/javascript/mastodon/components/media_gallery.js
  class Item (line 16) | class Item extends React.PureComponent {
    method hoverToPlay (line 51) | hoverToPlay () {
    method componentDidMount (line 71) | componentDidMount () {
    method componentDidUpdate (line 77) | componentDidUpdate (prevProps) {
    method _decode (line 83) | _decode () {
    method render (line 103) | render () {
  class MediaGallery (line 234) | @injectIntl
    method componentWillReceiveProps (line 260) | componentWillReceiveProps (nextProps) {
    method isStandaloneEligible (line 291) | isStandaloneEligible() {
    method render (line 296) | render () {

FILE: app/javascript/mastodon/components/modal_root.js
  class ModalRoot (line 4) | class ModalRoot extends React.PureComponent {
    method componentDidMount (line 24) | componentDidMount () {
    method componentWillReceiveProps (line 28) | componentWillReceiveProps (nextProps) {
    method componentDidUpdate (line 42) | componentDidUpdate (prevProps) {
    method componentWillUnmount (line 53) | componentWillUnmount () {
    method render (line 65) | render () {

FILE: app/javascript/mastodon/components/permalink.js
  class Permalink (line 4) | class Permalink extends React.PureComponent {
    method render (line 30) | render () {

FILE: app/javascript/mastodon/components/poll.js
  class Poll (line 23) | @injectIntl
    method renderOption (line 71) | renderOption (option, optionIndex) {
    method render (line 113) | render () {

FILE: app/javascript/mastodon/components/relative_timestamp.js
  constant SECOND (line 32) | const SECOND = 1000;
  constant MINUTE (line 33) | const MINUTE = 1000 * 60;
  constant HOUR (line 34) | const HOUR   = 1000 * 60 * 60;
  constant DAY (line 35) | const DAY    = 1000 * 60 * 60 * 24;
  constant MAX_DELAY (line 37) | const MAX_DELAY = 2147483647;
  class RelativeTimestamp (line 114) | @injectIntl
    method shouldComponentUpdate (line 132) | shouldComponentUpdate (nextProps, nextState) {
    method componentWillReceiveProps (line 140) | componentWillReceiveProps (nextProps) {
    method componentDidMount (line 146) | componentDidMount () {
    method componentWillUpdate (line 150) | componentWillUpdate (nextProps, nextState) {
    method componentWillUnmount (line 154) | componentWillUnmount () {
    method _scheduleNextUpdate (line 158) | _scheduleNextUpdate (props, state) {
    method render (line 173) | render () {

FILE: app/javascript/mastodon/components/scrollable_list.js
  constant MOUSE_IDLE_DELAY (line 13) | const MOUSE_IDLE_DELAY = 300;
  class ScrollableList (line 15) | class ScrollableList extends PureComponent {
    method componentDidMount (line 124) | componentDidMount () {
    method getSnapshotBeforeUpdate (line 148) | getSnapshotBeforeUpdate (prevProps) {
    method componentDidUpdate (line 160) | componentDidUpdate (prevProps, prevState, snapshot) {
    method componentWillUnmount (line 174) | componentWillUnmount () {
    method attachIntersectionObserver (line 185) | attachIntersectionObserver () {
    method detachIntersectionObserver (line 192) | detachIntersectionObserver () {
    method attachScrollListener (line 196) | attachScrollListener () {
    method detachScrollListener (line 201) | detachScrollListener () {
    method getFirstChildKey (line 206) | getFirstChildKey (props) {
    method render (line 228) | render () {

FILE: app/javascript/mastodon/components/setting_text.js
  class SettingText (line 5) | class SettingText extends React.PureComponent {
    method render (line 18) | render () {

FILE: app/javascript/mastodon/components/status.js
  class Status (line 54) | @injectIntl
    method componentDidMount (line 106) | componentDidMount () {
    method getSnapshotBeforeUpdate (line 110) | getSnapshotBeforeUpdate () {
    method getDerivedStateFromProps (line 118) | static getDerivedStateFromProps(nextProps, prevState) {
    method componentDidUpdate (line 130) | componentDidUpdate (prevProps, prevState, snapshot) {
    method componentWillUnmount (line 144) | componentWillUnmount() {
    method renderLoadingMediaGallery (line 201) | renderLoadingMediaGallery () {
    method renderLoadingVideoPlayer (line 205) | renderLoadingVideoPlayer () {
    method _properStatus (line 255) | _properStatus () {
    method render (line 269) | render () {

FILE: app/javascript/mastodon/components/status_action_bar.js
  class StatusActionBar (line 48) | @injectIntl
    method render (line 180) | render () {

FILE: app/javascript/mastodon/components/status_content.js
  constant MAX_HEIGHT (line 11) | const MAX_HEIGHT = 642;
  class StatusContent (line 13) | class StatusContent extends React.PureComponent {
    method _updateStatusLinks (line 32) | _updateStatusLinks () {
    method componentDidMount (line 74) | componentDidMount () {
    method componentDidUpdate (line 78) | componentDidUpdate () {
    method render (line 145) | render () {

FILE: app/javascript/mastodon/components/status_list.js
  class StatusList (line 11) | class StatusList extends ImmutablePureComponent {
    method _selectChild (line 61) | _selectChild (index, align_top) {
    method render (line 79) | render () {

FILE: app/javascript/mastodon/containers/account_container.js
  method onFollow (line 34) | onFollow (account) {
  method onBlock (line 50) | onBlock (account) {
  method onMute (line 58) | onMute (account) {
  method onMuteNotifications (line 67) | onMuteNotifications (account, notifications) {

FILE: app/javascript/mastodon/containers/compose_container.js
  class TimelineContainer (line 23) | class TimelineContainer extends React.PureComponent {
    method render (line 29) | render () {

FILE: app/javascript/mastodon/containers/domain_container.js
  method onBlockDomain (line 19) | onBlockDomain (domain) {
  method onUnblockDomain (line 27) | onUnblockDomain (domain) {

FILE: app/javascript/mastodon/containers/dropdown_menu_container.js
  method onOpen (line 15) | onOpen(id, onItemClick, dropdownPlacement, keyboard) {
  method onClose (line 22) | onClose(id) {

FILE: app/javascript/mastodon/containers/intersection_observer_article_container.js
  method onHeightChange (line 11) | onHeightChange (key, id, height) {

FILE: app/javascript/mastodon/containers/mastodon.js
  class MastodonMount (line 31) | @connect(mapStateToProps)
    method render (line 38) | render () {
  class Mastodon (line 56) | class Mastodon extends React.PureComponent {
    method componentDidMount (line 62) | componentDidMount() {
    method componentWillUnmount (line 66) | componentWillUnmount () {
    method render (line 73) | render () {

FILE: app/javascript/mastodon/containers/media_container.js
  constant MEDIA_COMPONENTS (line 17) | const MEDIA_COMPONENTS = { MediaGallery, Video, Card, Poll };
  class MediaContainer (line 19) | class MediaContainer extends PureComponent {
    method render (line 49) | render () {

FILE: app/javascript/mastodon/containers/status_container.js
  method onReply (line 56) | onReply (status, router) {
  method onModalReblog (line 71) | onModalReblog (status) {
  method onReblog (line 79) | onReblog (status, e) {
  method onFavourite (line 87) | onFavourite (status) {
  method onPin (line 95) | onPin (status) {
  method onEmbed (line 103) | onEmbed (status) {
  method onDelete (line 110) | onDelete (status, history, withRedraft = false) {
  method onDirect (line 122) | onDirect (account, router) {
  method onMention (line 126) | onMention (account, router) {
  method onOpenMedia (line 130) | onOpenMedia (media, index) {
  method onOpenVideo (line 134) | onOpenVideo (media, time) {
  method onBlock (line 138) | onBlock (status) {
  method onReport (line 152) | onReport (status) {
  method onMute (line 156) | onMute (account) {
  method onMuteConversation (line 160) | onMuteConversation (status) {
  method onToggleHidden (line 168) | onToggleHidden (status) {

FILE: app/javascript/mastodon/containers/timeline_container.js
  class TimelineContainer (line 23) | class TimelineContainer extends React.PureComponent {
    method render (line 35) | render () {

FILE: app/javascript/mastodon/features/account/components/header.js
  class Header (line 58) | @injectIntl
    method render (line 82) | render () {

FILE: app/javascript/mastodon/features/account_gallery/components/media_item.js
  class MediaItem (line 11) | class MediaItem extends ImmutablePureComponent {
    method componentDidMount (line 24) | componentDidMount () {
    method componentDidUpdate (line 30) | componentDidUpdate (prevProps) {
    method _decode (line 36) | _decode () {
    method hoverToPlay (line 69) | hoverToPlay () {
    method render (line 85) | render () {

FILE: app/javascript/mastodon/features/account_gallery/index.js
  class LoadMoreMedia (line 26) | class LoadMoreMedia extends ImmutablePureComponent {
    method render (line 38) | render () {
  class AccountGallery (line 49) | @connect(mapStateToProps)
    method componentDidMount (line 65) | componentDidMount () {
    method componentWillReceiveProps (line 70) | componentWillReceiveProps (nextProps) {
    method render (line 118) | render () {

FILE: app/javascript/mastodon/features/account_timeline/components/header.js
  class Header (line 10) | class Header extends ImmutablePureComponent {
    method render (line 86) | render () {

FILE: app/javascript/mastodon/features/account_timeline/components/moved_note.js
  class MovedNote (line 10) | class MovedNote extends ImmutablePureComponent {
    method render (line 30) | render () {

FILE: app/javascript/mastodon/features/account_timeline/containers/header_container.js
  method onFollow (line 47) | onFollow (account) {
  method onBlock (line 63) | onBlock (account) {
  method onMention (line 80) | onMention (account, router) {
  method onDirect (line 84) | onDirect (account, router) {
  method onReblogToggle (line 88) | onReblogToggle (account) {
  method onEndorseToggle (line 96) | onEndorseToggle (account) {
  method onReport (line 104) | onReport (account) {
  method onMute (line 108) | onMute (account) {
  method onBlockDomain (line 116) | onBlockDomain (domain) {
  method onUnblockDomain (line 124) | onUnblockDomain (domain) {
  method onAddToList (line 128) | onAddToList(account){

FILE: app/javascript/mastodon/features/account_timeline/index.js
  class AccountTimeline (line 33) | @connect(mapStateToProps)
    method componentWillMount (line 49) | componentWillMount () {
    method componentWillReceiveProps (line 62) | componentWillReceiveProps (nextProps) {
    method render (line 79) | render () {

FILE: app/javascript/mastodon/features/blocks/index.js
  class Blocks (line 24) | @connect(mapStateToProps)
    method componentWillMount (line 37) | componentWillMount () {
    method render (line 45) | render () {

FILE: app/javascript/mastodon/features/community_timeline/components/column_settings.js
  class ColumnSettings (line 7) | @injectIntl
    method render (line 17) | render () {

FILE: app/javascript/mastodon/features/community_timeline/containers/column_settings_container.js
  method onChange (line 18) | onChange (key, checked) {

FILE: app/javascript/mastodon/features/community_timeline/index.js
  class CommunityTimeline (line 28) | @connect(mapStateToProps)
    method componentDidMount (line 69) | componentDidMount () {
    method componentDidUpdate (line 76) | componentDidUpdate (prevProps) {
    method componentWillUnmount (line 86) | componentWillUnmount () {
    method render (line 103) | render () {

FILE: app/javascript/mastodon/features/compose/components/action_bar.js
  class ActionBar (line 20) | @injectIntl
    method render (line 28) | render () {

FILE: app/javascript/mastodon/features/compose/components/autosuggest_account.js
  class AutosuggestAccount (line 7) | class AutosuggestAccount extends ImmutablePureComponent {
    method render (line 13) | render () {

FILE: app/javascript/mastodon/features/compose/components/character_counter.js
  class CharacterCounter (line 5) | class CharacterCounter extends React.PureComponent {
    method checkRemainingText (line 12) | checkRemainingText (diff) {
    method render (line 20) | render () {

FILE: app/javascript/mastodon/features/compose/components/compose_form.js
  class ComposeForm (line 34) | @injectIntl
    method componentDidUpdate (line 125) | componentDidUpdate (prevProps) {
    method render (line 178) | render () {

FILE: app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js
  class ModifierPickerMenu (line 47) | class ModifierPickerMenu extends React.PureComponent {
    method componentWillReceiveProps (line 59) | componentWillReceiveProps (nextProps) {
    method componentWillUnmount (line 67) | componentWillUnmount () {
    method attachListeners (line 77) | attachListeners () {
    method removeListeners (line 82) | removeListeners () {
    method render (line 91) | render () {
  class ModifierPicker (line 108) | class ModifierPicker extends React.PureComponent {
    method render (line 131) | render () {
  class EmojiPickerMenu (line 144) | @injectIntl
    method componentDidMount (line 179) | componentDidMount () {
    method componentWillUnmount (line 184) | componentWillUnmount () {
    method render (line 236) | render () {
  class EmojiPickerDropdown (line 281) | @injectIntl
    method render (line 350) | render () {

FILE: app/javascript/mastodon/features/compose/components/navigation_bar.js
  class NavigationBar (line 11) | class NavigationBar extends ImmutablePureComponent {
    method render (line 18) | render () {

FILE: app/javascript/mastodon/features/compose/components/poll_button.js
  class PollButton (line 17) | @injectIntl
    method render (line 32) | render () {

FILE: app/javascript/mastodon/features/compose/components/poll_form.js
  class Option (line 21) | @injectIntl
    method render (line 65) | render () {
  class PollForm (line 101) | @injectIntl
    method render (line 131) | render () {

FILE: app/javascript/mastodon/features/compose/components/privacy_dropdown.js
  class PrivacyDropdownMenu (line 26) | class PrivacyDropdownMenu extends React.PureComponent {
    method componentDidMount (line 102) | componentDidMount () {
    method componentWillUnmount (line 109) | componentWillUnmount () {
    method render (line 122) | render () {
  class PrivacyDropdown (line 153) | @injectIntl
    method componentWillMount (line 213) | componentWillMount () {
    method render (line 224) | render () {

FILE: app/javascript/mastodon/features/compose/components/reply_indicator.js
  class ReplyIndicator (line 16) | @injectIntl
    method render (line 40) | render () {

FILE: app/javascript/mastodon/features/compose/components/search.js
  class SearchPopout (line 14) | class SearchPopout extends React.PureComponent {
    method render (line 20) | render () {
  class Search (line 47) | @injectIntl
    method render (line 104) | render () {

FILE: app/javascript/mastodon/features/compose/components/search_results.js
  class SearchResults (line 15) | @injectIntl
    method componentDidMount (line 26) | componentDidMount () {
    method render (line 30) | render () {

FILE: app/javascript/mastodon/features/compose/components/text_icon_button.js
  class TextIconButton (line 4) | class TextIconButton extends React.PureComponent {
    method render (line 19) | render () {

FILE: app/javascript/mastodon/features/compose/components/upload.js
  class Upload (line 15) | @injectIntl
    method render (line 88) | render () {

FILE: app/javascript/mastodon/features/compose/components/upload_button.js
  class UploadButton (line 26) | @connect(makeMapStateToProps)
    method render (line 54) | render () {

FILE: app/javascript/mastodon/features/compose/components/upload_form.js
  class UploadForm (line 8) | class UploadForm extends ImmutablePureComponent {
    method render (line 14) | render () {

FILE: app/javascript/mastodon/features/compose/components/upload_progress.js
  class UploadProgress (line 8) | class UploadProgress extends React.PureComponent {
    method render (line 15) | render () {

FILE: app/javascript/mastodon/features/compose/components/warning.js
  class Warning (line 6) | class Warning extends React.PureComponent {
    method render (line 12) | render () {

FILE: app/javascript/mastodon/features/compose/containers/compose_form_container.js
  method onChange (line 32) | onChange (text) {
  method onSubmit (line 36) | onSubmit (router) {
  method onClearSuggestions (line 40) | onClearSuggestions () {
  method onFetchSuggestions (line 44) | onFetchSuggestions (token) {
  method onSuggestionSelected (line 48) | onSuggestionSelected (position, token, suggestion, path) {
  method onChangeSpoilerText (line 52) | onChangeSpoilerText (checked) {
  method onPaste (line 56) | onPaste (files) {
  method onPickEmoji (line 60) | onPickEmoji (position, data, needsSpace) {

FILE: app/javascript/mastodon/features/compose/containers/emoji_picker_dropdown_container.js
  constant DEFAULTS (line 11) | const DEFAULTS = [

FILE: app/javascript/mastodon/features/compose/containers/poll_button_container.js
  method onClick (line 12) | onClick () {

FILE: app/javascript/mastodon/features/compose/containers/poll_form_container.js
  method onAddOption (line 18) | onAddOption(title) {
  method onRemoveOption (line 22) | onRemoveOption(index) {
  method onChangeOption (line 26) | onChangeOption(index, title) {
  method onChangeSettings (line 30) | onChangeSettings(expiresIn, isMultiple) {
  method onClearSuggestions (line 34) | onClearSuggestions () {
  method onFetchSuggestions (line 38) | onFetchSuggestions (token) {
  method onSuggestionSelected (line 42) | onSuggestionSelected (position, token, accountId, path) {

FILE: app/javascript/mastodon/features/compose/containers/privacy_dropdown_container.js
  method onChange (line 14) | onChange (value) {

FILE: app/javascript/mastodon/features/compose/containers/reply_indicator_container.js
  method onCancel (line 18) | onCancel () {

FILE: app/javascript/mastodon/features/compose/containers/search_container.js
  method onChange (line 17) | onChange (value) {
  method onClear (line 21) | onClear () {
  method onSubmit (line 25) | onSubmit () {
  method onShow (line 29) | onShow () {

FILE: app/javascript/mastodon/features/compose/containers/sensitive_button_container.js
  method onClick (line 20) | onClick () {
  class SensitiveButton (line 26) | class SensitiveButton extends React.PureComponent {
    method render (line 35) | render () {

FILE: app/javascript/mastodon/features/compose/containers/spoiler_button_container.js
  method onClick (line 20) | onClick () {

FILE: app/javascript/mastodon/features/compose/containers/upload_button_container.js
  method onSelectFile (line 13) | onSelectFile (files) {

FILE: app/javascript/mastodon/features/compose/containers/upload_container.js
  method onSubmit (line 25) | onSubmit (router) {

FILE: app/javascript/mastodon/features/compose/containers/warning_container.js
  constant APPROX_HASHTAG_RE (line 8) | const APPROX_HASHTAG_RE = /(?:^|[^\/\)\w])#(\w*[a-zA-Z·]\w*)/i;

FILE: app/javascript/mastodon/features/compose/index.js
  class Compose (line 35) | @connect(mapStateToProps)
    method componentDidMount (line 48) | componentDidMount () {
    method componentWillUnmount (line 56) | componentWillUnmount () {
    method render (line 72) | render () {

FILE: app/javascript/mastodon/features/compose/util/counter.js
  function countableText (line 5) | function countableText(inputText) {

FILE: app/javascript/mastodon/features/direct_timeline/components/conversation.js
  class Conversation (line 7) | class Conversation extends ImmutablePureComponent {
    method render (line 45) | render () {

FILE: app/javascript/mastodon/features/direct_timeline/components/conversations_list.js
  class ConversationsList (line 9) | class ConversationsList extends ImmutablePureComponent {
    method _selectChild (line 31) | _selectChild (index, align_top) {
    method render (line 57) | render () {

FILE: app/javascript/mastodon/features/direct_timeline/index.js
  class DirectTimeline (line 16) | @connect()
    method componentDidMount (line 48) | componentDidMount () {
    method componentWillUnmount (line 56) | componentWillUnmount () {
    method render (line 73) | render () {

FILE: app/javascript/mastodon/features/domain_blocks/index.js
  class Blocks (line 25) | @connect(mapStateToProps)
    method componentWillMount (line 38) | componentWillMount () {
    method render (line 46) | render () {

FILE: app/javascript/mastodon/features/emoji/emoji_mart_search_light.js
  function clearCustomEmojis (line 32) | function clearCustomEmojis(pool) {
  function addCustomToPool (line 41) | function addCustomToPool(custom, pool) {
  function search (line 57) | function search(value, { emojisToShowFilter, maxResults, include, exclud...

FILE: app/javascript/mastodon/features/emoji/emoji_unicode_mapping_light.js
  function processEmojiMapData (line 17) | function processEmojiMapData(emojiMapData, shortCode) {

FILE: app/javascript/mastodon/features/emoji/emoji_utils.js
  constant COLONS_REGEX (line 76) | const COLONS_REGEX = /^(?:\:([^\:]+)\:)(?:\:skin-tone-(\d)\:)?$/;
  constant SKINS (line 77) | const SKINS = [
  function unifiedToNative (line 82) | function unifiedToNative(unified) {
  function sanitize (line 89) | function sanitize(emoji) {
  function getSanitizedData (line 120) | function getSanitizedData() {
  function getData (line 124) | function getData(emoji, skin, set) {
  function uniq (line 196) | function uniq(arr) {
  function intersect (line 205) | function intersect(a, b) {
  function deepMerge (line 212) | function deepMerge(a, b) {
  function measureScrollbar (line 234) | function measureScrollbar() {

FILE: app/javascript/mastodon/features/emoji/unicode_to_unified_name.js
  function padLeft (line 1) | function padLeft(str, num) {

FILE: app/javascript/mastodon/features/favourited_statuses/index.js
  class Favourites (line 24) | @connect(mapStateToProps)
    method componentWillMount (line 39) | componentWillMount () {
    method render (line 70) | render () {

FILE: app/javascript/mastodon/features/favourites/index.js
  class Favourites (line 18) | @connect(mapStateToProps)
    method componentWillMount (line 28) | componentWillMount () {
    method componentWillReceiveProps (line 32) | componentWillReceiveProps (nextProps) {
    method render (line 38) | render () {

FILE: app/javascript/mastodon/features/follow_requests/components/account_authorize.js
  class AccountAuthorize (line 16) | @injectIntl
    method render (line 26) | render () {

FILE: app/javascript/mastodon/features/follow_requests/containers/account_authorize_container.js
  method onAuthorize (line 17) | onAuthorize () {
  method onReject (line 21) | onReject () {

FILE: app/javascript/mastodon/features/follow_requests/index.js
  class FollowRequests (line 24) | @connect(mapStateToProps)
    method componentWillMount (line 37) | componentWillMount () {
    method render (line 45) | render () {

FILE: app/javascript/mastodon/features/followers/index.js
  class Followers (line 28) | @connect(mapStateToProps)
    method componentWillMount (line 41) | componentWillMount () {
    method componentWillReceiveProps (line 46) | componentWillReceiveProps (nextProps) {
    method render (line 57) | render () {

FILE: app/javascript/mastodon/features/following/index.js
  class Following (line 28) | @connect(mapStateToProps)
    method componentWillMount (line 41) | componentWillMount () {
    method componentWillReceiveProps (line 46) | componentWillReceiveProps (nextProps) {
    method render (line 57) | render () {

FILE: app/javascript/mastodon/features/getting_started/index.js
  constant NAVIGATION_PANEL_BREAKPOINT (line 58) | const NAVIGATION_PANEL_BREAKPOINT = 600 + (285 * 2) + (10 * 2);
  class GettingStarted (line 60) | @connect(mapStateToProps, mapDispatchToProps)
    method componentDidMount (line 78) | componentDidMount () {
    method render (line 91) | render () {

FILE: app/javascript/mastodon/features/hashtag_timeline/components/column_settings.js
  class ColumnSettings (line 13) | @injectIntl
    method hasTags (line 27) | hasTags () {
    method tags (line 31) | tags (mode) {
    method modeSelect (line 53) | modeSelect (mode) {
    method modeLabel (line 76) | modeLabel (mode) {
    method render (line 89) | render () {

FILE: app/javascript/mastodon/features/hashtag_timeline/containers/column_settings_container.js
  method onChange (line 18) | onChange (key, value) {
  method onLoad (line 22) | onLoad (value) {

FILE: app/javascript/mastodon/features/hashtag_timeline/index.js
  class HashtagTimeline (line 18) | @connect(mapStateToProps)
    method _subscribe (line 79) | _subscribe (dispatch, id, tags = {}) {
    method _unsubscribe (line 94) | _unsubscribe () {
    method componentDidMount (line 99) | componentDidMount () {
    method componentWillReceiveProps (line 107) | componentWillReceiveProps (nextProps) {
    method componentWillUnmount (line 119) | componentWillUnmount () {
    method render (line 132) | render () {

FILE: app/javascript/mastodon/features/home_timeline/components/column_settings.js
  class ColumnSettings (line 7) | @injectIntl
    method render (line 16) | render () {

FILE: app/javascript/mastodon/features/home_timeline/containers/column_settings_container.js
  method onChange (line 11) | onChange (key, checked) {
  method onSave (line 15) | onSave () {

FILE: app/javascript/mastodon/features/home_timeline/index.js
  class HomeTimeline (line 22) | @connect(mapStateToProps)
    method componentDidMount (line 63) | componentDidMount () {
    method componentDidUpdate (line 67) | componentDidUpdate (prevProps) {
    method componentWillUnmount (line 71) | componentWillUnmount () {
    method _checkIfReloadNeeded (line 75) | _checkIfReloadNeeded (wasPartial, isPartial) {
    method _stopPolling (line 89) | _stopPolling () {
    method render (line 96) | render () {

FILE: app/javascript/mastodon/features/introduction/index.js
  class Introduction (line 101) | @connect(state => ({ domain: state.getIn(['meta', 'domain']) }))
    method componentWillMount (line 113) | componentWillMount () {
    method componentDidMount (line 121) | componentDidMount() {
    method componentWillUnmount (line 125) | componentWillUnmount() {
    method render (line 168) | render () {

FILE: app/javascript/mastodon/features/keyboard_shortcuts/index.js
  class KeyboardShortcuts (line 12) | @injectIntl
    method render (line 20) | render () {

FILE: app/javascript/mastodon/features/list_adder/components/account.js
  class Account (line 21) | @connect(makeMapStateToProps)
    method render (line 29) | render () {

FILE: app/javascript/mastodon/features/list_adder/components/list.js
  class List (line 26) | @connect(MapStateToProps, mapDispatchToProps)
    method render (line 42) | render () {

FILE: app/javascript/mastodon/features/list_adder/index.js
  class ListAdder (line 31) | @connect(mapStateToProps, mapDispatchToProps)
    method componentDidMount (line 44) | componentDidMount () {
    method componentWillUnmount (line 49) | componentWillUnmount () {
    method render (line 54) | render () {

FILE: app/javascript/mastodon/features/list_editor/components/account.js
  class Account (line 34) | @connect(makeMapStateToProps, mapDispatchToProps)
    method render (line 50) | render () {

FILE: app/javascript/mastodon/features/list_editor/components/edit_list_form.js
  class ListForm (line 22) | @connect(mapStateToProps, mapDispatchToProps)
    method render (line 47) | render () {

FILE: app/javascript/mastodon/features/list_editor/components/search.js
  class Search (line 23) | @connect(mapStateToProps, mapDispatchToProps)
    method render (line 49) | render () {

FILE: app/javascript/mastodon/features/list_editor/index.js
  class ListEditor (line 25) | @connect(mapStateToProps, mapDispatchToProps)
    method componentDidMount (line 40) | componentDidMount () {
    method componentWillUnmount (line 45) | componentWillUnmount () {
    method render (line 50) | render () {

FILE: app/javascript/mastodon/features/list_timeline/index.js
  class ListTimeline (line 29) | @connect(mapStateToProps)
    method componentDidMount (line 68) | componentDidMount () {
    method componentWillReceiveProps (line 78) | componentWillReceiveProps (nextProps) {
    method componentWillUnmount (line 95) | componentWillUnmount () {
    method render (line 134) | render () {

FILE: app/javascript/mastodon/features/lists/components/new_list_form.js
  class NewListForm (line 23) | @connect(mapStateToProps, mapDispatchToProps)
    method render (line 48) | render () {

FILE: app/javascript/mastodon/features/lists/index.js
  class Lists (line 34) | @connect(mapStateToProps)
    method componentWillMount (line 45) | componentWillMount () {
    method render (line 49) | render () {

FILE: app/javascript/mastodon/features/mutes/index.js
  class Mutes (line 24) | @connect(mapStateToProps)
    method componentWillMount (line 37) | componentWillMount () {
    method render (line 45) | render () {

FILE: app/javascript/mastodon/features/notifications/components/clear_column_button.js
  class ClearColumnButton (line 6) | class ClearColumnButton extends React.PureComponent {
    method render (line 12) | render () {

FILE: app/javascript/mastodon/features/notifications/components/column_settings.js
  class ColumnSettings (line 8) | class ColumnSettings extends React.PureComponent {
    method render (line 21) | render () {

FILE: app/javascript/mastodon/features/notifications/components/filter_bar.js
  class FilterBar (line 14) | @injectIntl
    method onClick (line 24) | onClick (notificationType) {
    method render (line 28) | render () {

FILE: app/javascript/mastodon/features/notifications/components/notification.js
  class Notification (line 20) | @injectIntl
    method getHandlers (line 91) | getHandlers () {
    method renderFollow (line 105) | renderFollow (notification, account, link) {
    method renderMention (line 127) | renderMention (notification) {
    method renderFavourite (line 144) | renderFavourite (notification, link) {
    method renderReblog (line 176) | renderReblog (notification, link) {
    method renderPoll (line 208) | renderPoll (notification) {
    method render (line 240) | render () {

FILE: app/javascript/mastodon/features/notifications/components/setting_toggle.js
  class SettingToggle (line 6) | class SettingToggle extends React.PureComponent {
    method render (line 20) | render () {

FILE: app/javascript/mastodon/features/notifications/containers/column_settings_container.js
  method onChange (line 22) | onChange (path, checked) {
  method onClear (line 33) | onClear () {

FILE: app/javascript/mastodon/features/notifications/containers/filter_bar_container.js
  method selectFilter (line 11) | selectFilter (newActiveFilter) {

FILE: app/javascript/mastodon/features/notifications/containers/notification_container.js
  method onModalReblog (line 38) | onModalReblog (status) {
  method onReblog (line 42) | onReblog (status, e) {
  method onFavourite (line 54) | onFavourite (status) {
  method onToggleHidden (line 62) | onToggleHidden (status) {

FILE: app/javascript/mastodon/features/notifications/index.js
  class Notifications (line 46) | @connect(mapStateToProps)
    method componentWillUnmount (line 67) | componentWillUnmount () {
    method _selectChild (line 124) | _selectChild (index, align_top) {
    method render (line 138) | render () {

FILE: app/javascript/mastodon/features/pinned_statuses/index.js
  class PinnedStatuses (line 21) | @connect(mapStateToProps)
    method componentWillMount (line 33) | componentWillMount () {
    method render (line 45) | render () {

FILE: app/javascript/mastodon/features/public_timeline/containers/column_settings_container.js
  method onChange (line 18) | onChange (key, checked) {

FILE: app/javascript/mastodon/features/public_timeline/index.js
  class PublicTimeline (line 28) | @connect(mapStateToProps)
    method componentDidMount (line 69) | componentDidMount () {
    method componentDidUpdate (line 76) | componentDidUpdate (prevProps) {
    method componentWillUnmount (line 86) | componentWillUnmount () {
    method render (line 103) | render () {

FILE: app/javascript/mastodon/features/reblogs/index.js
  class Reblogs (line 18) | @connect(mapStateToProps)
    method componentWillMount (line 28) | componentWillMount () {
    method componentWillReceiveProps (line 32) | componentWillReceiveProps(nextProps) {
    method render (line 38) | render () {

FILE: app/javascript/mastodon/features/report/components/status_check_box.js
  class StatusCheckBox (line 10) | class StatusCheckBox extends React.PureComponent {
    method render (line 19) | render () {

FILE: app/javascript/mastodon/features/report/containers/status_check_box_container.js
  method onToggle (line 13) | onToggle (e) {

FILE: app/javascript/mastodon/features/standalone/compose/index.js
  class Compose (line 7) | class Compose extends React.PureComponent {
    method render (line 9) | render () {

FILE: app/javascript/mastodon/features/standalone/hashtag_timeline/index.js
  class HashtagTimeline (line 18) | @connect(mapStateToProps)
    method componentDidMount (line 29) | componentDidMount () {
    method render (line 55) | render () {

FILE: app/javascript/mastodon/features/standalone/public_timeline/index.js
  class PublicTimeline (line 22) | @connect(mapStateToProps)
    method componentDidMount (line 33) | componentDidMount () {
    method componentDidUpdate (line 37) | componentDidUpdate (prevProps) {
    method _connect (line 43) | _connect () {
    method render (line 70) | render () {

FILE: app/javascript/mastodon/features/status/components/action_bar.js
  class ActionBar (line 34) | @injectIntl
    method render (line 136) | render () {

FILE: app/javascript/mastodon/features/status/components/card.js
  constant IDNA_PREFIX (line 9) | const IDNA_PREFIX = 'xn--';
  class Card (line 57) | class Card extends React.PureComponent {
    method componentWillReceiveProps (line 78) | componentWillReceiveProps (nextProps) {
    method renderVideo (line 122) | renderVideo () {
    method render (line 139) | render () {

FILE: app/javascript/mastodon/features/status/components/detailed_status.js
  class DetailedStatus (line 17) | class DetailedStatus extends ImmutablePureComponent {
    method _measureHeight (line 57) | _measureHeight (heightJustChanged) {
    method componentDidUpdate (line 72) | componentDidUpdate (prevProps, prevState) {
    method render (line 90) | render () {

FILE: app/javascript/mastodon/features/status/containers/detailed_status_container.js
  method onReply (line 57) | onReply (status, router) {
  method onModalReblog (line 72) | onModalReblog (status) {
  method onReblog (line 76) | onReblog (status, e) {
  method onFavourite (line 88) | onFavourite (status) {
  method onPin (line 96) | onPin (status) {
  method onEmbed (line 104) | onEmbed (status) {
  method onDelete (line 111) | onDelete (status, history, withRedraft = false) {
  method onDirect (line 123) | onDirect (account, router) {
  method onMention (line 127) | onMention (account, router) {
  method onOpenMedia (line 131) | onOpenMedia (media, index) {
  method onOpenVideo (line 135) | onOpenVideo (media, time) {
  method onBlock (line 139) | onBlock (status) {
  method onReport (line 153) | onReport (status) {
  method onMute (line 157) | onMute (account) {
  method onMuteConversation (line 161) | onMuteConversation (status) {
  method onToggleHidden (line 169) | onToggleHidden (status) {

FILE: app/javascript/mastodon/features/status/index.js
  class Status (line 113) | @injectIntl
    method componentWillMount (line 138) | componentWillMount () {
    method componentDidMount (line 142) | componentDidMount () {
    method componentWillReceiveProps (line 146) | componentWillReceiveProps (nextProps) {
    method _selectChild (line 363) | _selectChild (index, align_top) {
    method renderChildren (line 377) | renderChildren (list) {
    method componentDidUpdate (line 393) | componentDidUpdate () {
    method componentWillUnmount (line 410) | componentWillUnmount () {
    method render (line 418) | render () {

FILE: app/javascript/mastodon/features/ui/components/actions_modal.js
  class ActionsModal (line 12) | class ActionsModal extends ImmutablePureComponent {
    method render (line 40) | render () {

FILE: app/javascript/mastodon/features/ui/components/boost_modal.js
  class BoostModal (line 19) | @injectIntl
    method componentDidMount (line 33) | componentDidMount() {
    method render (line 54) | render () {

FILE: app/javascript/mastodon/features/ui/components/bundle.js
  class Bundle (line 7) | class Bundle extends React.PureComponent {
    method componentWillMount (line 36) | componentWillMount() {
    method componentWillReceiveProps (line 40) | componentWillReceiveProps(nextProps) {
    method componentWillUnmount (line 46) | componentWillUnmount () {
    method render (line 88) | render() {

FILE: app/javascript/mastodon/features/ui/components/bundle_column_error.js
  class BundleColumnError (line 16) | class BundleColumnError extends React.PureComponent {
    method render (line 27) | render () {

FILE: app/javascript/mastodon/features/ui/components/bundle_modal_error.js
  class BundleModalError (line 13) | class BundleModalError extends React.PureComponent {
    method render (line 25) | render () {

FILE: app/javascript/mastodon/features/ui/components/column.js
  class Column (line 8) | class Column extends React.PureComponent {
    method scrollTop (line 28) | scrollTop () {
    method render (line 49) | render () {

FILE: app/javascript/mastodon/features/ui/components/column_header.js
  class ColumnHeader (line 6) | class ColumnHeader extends React.PureComponent {
    method render (line 20) | render () {

FILE: app/javascript/mastodon/features/ui/components/column_loading.js
  class ColumnLoading (line 8) | class ColumnLoading extends ImmutablePureComponent {
    method render (line 20) | render() {

FILE: app/javascript/mastodon/features/ui/components/columns_area.js
  class ColumnsArea (line 42) | class ColumnsArea extends ImmutablePureComponent {
    method componentWillReceiveProps (line 60) | componentWillReceiveProps() {
    method componentDidMount (line 64) | componentDidMount() {
    method componentWillUpdate (line 75) | componentWillUpdate(nextProps) {
    method componentDidUpdate (line 81) | componentDidUpdate(prevProps) {
    method componentWillUnmount (line 89) | componentWillUnmount () {
    method handleChildrenContentChange (line 95) | handleChildrenContentChange() {
    method render (line 158) | render () {

FILE: app/javascript/mastodon/features/ui/components/confirmation_modal.js
  class ConfirmationModal (line 6) | @injectIntl
    method componentDidMount (line 19) | componentDidMount() {
    method render (line 41) | render () {

FILE: app/javascript/mastodon/features/ui/components/embed_modal.js
  class EmbedModal (line 7) | @injectIntl
    method componentDidMount (line 22) | componentDidMount () {
    method render (line 52) | render () {

FILE: app/javascript/mastodon/features/ui/components/focal_point_modal.js
  class FocalPointModal (line 22) | @connect(mapStateToProps, mapDispatchToProps)
    method componentWillMount (line 37) | componentWillMount () {
    method componentWillReceiveProps (line 41) | componentWillReceiveProps (nextProps) {
    method componentWillUnmount (line 47) | componentWillUnmount () {
    method render (line 98) | render () {

FILE: app/javascript/mastodon/features/ui/components/follow_requests_nav_link.js
  class FollowRequestsNavLink (line 16) | @withRouter
    method componentDidMount (line 26) | componentDidMount () {
    method render (line 34) | render () {

FILE: app/javascript/mastodon/features/ui/components/image_loader.js
  class ImageLoader (line 7) | class ImageLoader extends React.PureComponent {
    method canvasContext (line 33) | get canvasContext() {
    method componentDidMount (line 41) | componentDidMount () {
    method componentWillReceiveProps (line 45) | componentWillReceiveProps (nextProps) {
    method componentWillUnmount (line 51) | componentWillUnmount () {
    method loadImage (line 55) | loadImage (props) {
    method clearPreviewCanvas (line 90) | clearPreviewCanvas () {
    method removeEventListeners (line 115) | removeEventListeners () {
    method hasSize (line 120) | hasSize () {
    method render (line 130) | render () {

FILE: app/javascript/mastodon/features/ui/components/list_panel.js
  class ListPanel (line 23) | @withRouter
    method componentDidMount (line 32) | componentDidMount () {
    method render (line 37) | render () {

FILE: app/javascript/mastodon/features/ui/components/media_modal.js
  class MediaModal (line 22) | @injectIntl
    method componentDidMount (line 74) | componentDidMount () {
    method componentWillUnmount (line 88) | componentWillUnmount () {
    method getIndex (line 100) | getIndex () {
    method render (line 117) | render () {

FILE: app/javascript/mastodon/features/ui/components/modal_root.js
  constant MODAL_COMPONENTS (line 21) | const MODAL_COMPONENTS = {
  class ModalRoot (line 35) | class ModalRoot extends React.PureComponent {
    method getSnapshotBeforeUpdate (line 43) | getSnapshotBeforeUpdate () {
    method componentDidUpdate (line 47) | componentDidUpdate (prevProps, prevState, { visible }) {
    method render (line 65) | render () {

FILE: app/javascript/mastodon/features/ui/components/mute_modal.js
  method onConfirm (line 22) | onConfirm(account, notifications) {
  method onClose (line 26) | onClose() {
  method onToggleNotifications (line 30) | onToggleNotifications() {
  class MuteModal (line 36) | @connect(mapStateToProps, mapDispatchToProps)
    method componentDidMount (line 50) | componentDidMount() {
    method render (line 71) | render () {

FILE: app/javascript/mastodon/features/ui/components/report_modal.js
  class ReportModal (line 40) | @connect(makeMapStateToProps)
    method componentDidMount (line 72) | componentDidMount () {
    method componentWillReceiveProps (line 76) | componentWillReceiveProps (nextProps) {
    method render (line 82) | render () {

FILE: app/javascript/mastodon/features/ui/components/tabs_bar.js
  function getIndex (line 19) | function getIndex (path) {
  function getLink (line 23) | function getLink (index) {
  class TabsBar (line 27) | @injectIntl
    method render (line 72) | render () {

FILE: app/javascript/mastodon/features/ui/components/upload_area.js
  class UploadArea (line 7) | class UploadArea extends React.PureComponent {
    method componentDidMount (line 27) | componentDidMount () {
    method componentWillUnmount (line 31) | componentWillUnmount () {
    method render (line 35) | render () {

FILE: app/javascript/mastodon/features/ui/components/video_modal.js
  class VideoModal (line 10) | class VideoModal extends ImmutablePureComponent {
    method componentDidMount (line 23) | componentDidMount () {
    method componentWillUnmount (line 35) | componentWillUnmount () {
    method render (line 52) | render () {

FILE: app/javascript/mastodon/features/ui/components/zoomable_image.js
  constant MIN_SCALE (line 4) | const MIN_SCALE = 1;
  constant MAX_SCALE (line 5) | const MAX_SCALE = 4;
  class ZoomableImage (line 17) | class ZoomableImage extends React.PureComponent {
    method componentDidMount (line 43) | componentDidMount () {
    method componentWillUnmount (line 54) | componentWillUnmount () {
    method removeEventListeners (line 58) | removeEventListeners () {
    method zoom (line 91) | zoom(nextScale, midpoint) {
    method render (line 125) | render () {

FILE: app/javascript/mastodon/features/ui/containers/bundle_container.js
  method onFetch (line 8) | onFetch () {
  method onFetchSuccess (line 11) | onFetchSuccess () {
  method onFetchFail (line 14) | onFetchFail (error) {

FILE: app/javascript/mastodon/features/ui/containers/modal_container.js
  method onClose (line 11) | onClose () {

FILE: app/javascript/mastodon/features/ui/index.js
  class SwitchingColumnsArea (line 99) | class SwitchingColumnsArea extends React.PureComponent {
    method componentWillMount (line 111) | componentWillMount () {
    method componentDidUpdate (line 115) | componentDidUpdate (prevProps) {
    method componentWillUnmount (line 121) | componentWillUnmount () {
    method shouldUpdateScroll (line 125) | shouldUpdateScroll (_, { location }) {
    method render (line 142) | render () {
  class UI (line 192) | @connect(mapStateToProps)
    method componentWillMount (line 303) | componentWillMount () {
    method componentDidMount (line 326) | componentDidMount () {
    method componentWillUnmount (line 332) | componentWillUnmount () {
    method render (line 456) | render () {

FILE: app/javascript/mastodon/features/ui/util/async-components.js
  function EmojiPicker (line 1) | function EmojiPicker () {
  function Compose (line 5) | function Compose () {
  function Notifications (line 9) | function Notifications () {
  function HomeTimeline (line 13) | function HomeTimeline () {
  function PublicTimeline (line 17) | function PublicTimeline () {
  function CommunityTimeline (line 21) | function CommunityTimeline () {
  function HashtagTimeline (line 25) | function HashtagTimeline () {
  function DirectTimeline (line 29) | function DirectTimeline() {
  function ListTimeline (line 33) | function ListTimeline () {
  function Lists (line 37) | function Lists () {
  function Status (line 41) | function Status () {
  function GettingStarted (line 45) | function GettingStarted () {
  function KeyboardShortcuts (line 49) | function KeyboardShortcuts () {
  function PinnedStatuses (line 53) | function PinnedStatuses () {
  function AccountTimeline (line 57) | function AccountTimeline () {
  function AccountGallery (line 61) | function AccountGallery () {
  function Followers (line 65) | function Followers () {
  function Following (line 69) | function Following () {
  function Reblogs (line 73) | function Reblogs () {
  function Favourites (line 77) | function Favourites () {
  function FollowRequests (line 81) | function FollowRequests () {
  function GenericNotFound (line 85) | function GenericNotFound () {
  function FavouritedStatuses (line 89) | function FavouritedStatuses () {
  function Blocks (line 93) | function Blocks () {
  function DomainBlocks (line 97) | function DomainBlocks () {
  function Mutes (line 101) | function Mutes () {
  function MuteModal (line 105) | function MuteModal () {
  function ReportModal (line 109) | function ReportModal () {
  function MediaGallery (line 113) | function MediaGallery () {
  function Video (line 117) | function Video () {
  function EmbedModal (line 121) | function EmbedModal () {
  function ListEditor (line 125) | function ListEditor () {
  function ListAdder (line 129) | function ListAdder () {
  function Search (line 133) | function Search () {

FILE: app/javascript/mastodon/features/ui/util/get_rect_from_entry.js
  function getRectFromEntry (line 7) | function getRectFromEntry(entry) {

FILE: app/javascript/mastodon/features/ui/util/intersection_observer_wrapper.js
  class IntersectionObserverWrapper (line 8) | class IntersectionObserverWrapper {
    method connect (line 14) | connect (options) {
    method observe (line 31) | observe (id, node, callback) {
    method unobserve (line 40) | unobserve (id, node) {
    method disconnect (line 47) | disconnect () {

FILE: app/javascript/mastodon/features/ui/util/react_router_helpers.js
  class WrappedSwitch (line 10) | class WrappedSwitch extends React.PureComponent {
    method render (line 12) | render () {
  class WrappedRoute (line 32) | class WrappedRoute extends React.Component {
    method rend
Condensed preview — 2374 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (8,923K chars).
[
  {
    "path": ".buildpacks",
    "chars": 180,
    "preview": "https://github.com/heroku/heroku-buildpack-apt\nhttps://github.com/Scalingo/ffmpeg-buildpack\nhttps://github.com/Scalingo/"
  },
  {
    "path": ".circleci/config.yml",
    "chars": 5684,
    "preview": "version: 2\n\naliases:\n  - &defaults\n    docker:\n      - image: circleci/ruby:2.6.0-stretch-node\n        environment: &rub"
  },
  {
    "path": ".codeclimate.yml",
    "chars": 642,
    "preview": "version: \"2\"\nchecks:\n  argument-count:\n    enabled: false\n  complex-logic:\n    enabled: false\n  file-lines:\n    enabled:"
  },
  {
    "path": ".dependabot/config.yml",
    "chars": 197,
    "preview": "version: 1\n\nupdate_configs:\n  - package_manager: \"ruby:bundler\"\n    directory: \"/\"\n    update_schedule: \"weekly\"\n\n  - pa"
  },
  {
    "path": ".dockerignore",
    "chars": 142,
    "preview": ".bundle\n.env\n.env.*\npublic/system\npublic/assets\npublic/packs\nnode_modules\nneo4j\nvendor/bundle\n.DS_Store\n*.swp\n*~\npostgre"
  },
  {
    "path": ".editorconfig",
    "chars": 251,
    "preview": "# EditorConfig is awesome: http://EditorConfig.org\n\n# top-most EditorConfig file\nroot = true\n\n# Unix-style newlines with"
  },
  {
    "path": ".eslintignore",
    "chars": 146,
    "preview": "/build/**\n/coverage/**\n/db/**\n/lib/**\n/log/**\n/node_modules/**\n/nonobox/**\n/public/**\n!/public/embed.js\n/spec/**\n/tmp/**"
  },
  {
    "path": ".eslintrc.js",
    "chars": 4738,
    "preview": "module.exports = {\n  root: true,\n\n  env: {\n    browser: true,\n    node: true,\n    es6: true,\n    jest: true,\n  },\n\n  glo"
  },
  {
    "path": ".foreman",
    "chars": 23,
    "preview": "procfile: Procfile.dev\n"
  },
  {
    "path": ".gitattributes",
    "chars": 520,
    "preview": "*                             text=auto eol=lf\n*.eot                         -text\n*.gif                         -text\n*"
  },
  {
    "path": ".gitignore",
    "chars": 1075,
    "preview": "# See https://help.github.com/articles/ignoring-files for more about ignoring files.\n#\n# If you find yourself ignoring t"
  },
  {
    "path": ".haml-lint.yml",
    "chars": 1905,
    "preview": "# Whether to ignore frontmatter at the beginning of HAML documents for\n# frameworks such as Jekyll/Middleman\nskip_frontm"
  },
  {
    "path": ".nanoignore",
    "chars": 178,
    "preview": ".DS_Store\n.git/\n.gitignore\n\n.bundle/\n.cache/\nconfig/deploy/*\ncoverage\ndocs/\n.env\nlog/*.log\nneo4j/\nnode_modules/\npublic/a"
  },
  {
    "path": ".nvmrc",
    "chars": 2,
    "preview": "8\n"
  },
  {
    "path": ".profile",
    "chars": 150,
    "preview": "LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/app/.apt/lib/x86_64-linux-gnu:/app/.apt/usr/lib/x86_64-linux-gnu/mesa:/app/.apt/usr/li"
  },
  {
    "path": ".rspec",
    "chars": 46,
    "preview": "--color\n--require spec_helper\n--format Fuubar\n"
  },
  {
    "path": ".rubocop.yml",
    "chars": 1978,
    "preview": "require:\n  - rubocop-rails\n\nAllCops:\n  TargetRubyVersion: 2.3\n  Exclude:\n  - 'spec/**/*'\n  - 'db/**/*'\n  - 'app/views/**"
  },
  {
    "path": ".ruby-version",
    "chars": 6,
    "preview": "2.6.1\n"
  },
  {
    "path": ".sass-lint.yml",
    "chars": 740,
    "preview": "# Linter Documentation:\n# https://github.com/sasstools/sass-lint/tree/v1.13.1/docs/options\n\nfiles:\n  include: app/javasc"
  },
  {
    "path": ".slugignore",
    "chars": 34,
    "preview": "node_modules/\n.cache/\ndocs/\nspec/\n"
  },
  {
    "path": ".yarnclean",
    "chars": 454,
    "preview": "# test directories\n__tests__\ntest\ntests\npowered-test\n\n# asset directories\ndocs\ndoc\nwebsite\nimages\n# assets\n\n# examples\ne"
  },
  {
    "path": "AUTHORS.md",
    "chars": 31884,
    "preview": "Authors\n=======\n\nMastodon is available on [GitHub](https://github.com/tootsuite/mastodon)\nand provided thanks to the wor"
  },
  {
    "path": "Aptfile",
    "chars": 372,
    "preview": "ffmpeg\nlibicu[0-9][0-9]\nlibicu-dev\nlibidn11\nlibidn11-dev\nlibpq-dev\nlibprotobuf-dev\nlibssl-dev\nlibxdamage1\nlibxfixes3\npro"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 6259,
    "preview": "# Changelog\n\nThis changelog will only include differences from upstream Mastodon. [You can find the upstream\nchangelog h"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 18390,
    "preview": "### Table of Contents\n\n- [Code of Conduct](#code-of-conduct)\n  - [Positive participation and communication](#positive-pa"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 1801,
    "preview": "Contributing\n============\n\nThank you for considering contributing to Florence Mastodon\n\nYou can contribute in the follow"
  },
  {
    "path": "Capfile",
    "chars": 369,
    "preview": "# frozen_string_literal: true\nrequire 'capistrano/setup'\nrequire 'capistrano/deploy'\nrequire 'capistrano/scm/git'\n\ninsta"
  },
  {
    "path": "Dockerfile",
    "chars": 3790,
    "preview": "FROM ubuntu:18.04 as build-dep\n\n# Use bash for the shell\nSHELL [\"bash\", \"-c\"]\n\n# Install Node\nENV NODE_VER=\"8.15.0\"\nRUN\t"
  },
  {
    "path": "Gemfile",
    "chars": 4172,
    "preview": "# frozen_string_literal: true\n\nsource 'https://rubygems.org'\nruby '>= 2.4.0', '< 2.7.0'\n\ngem 'pkg-config', '~> 1.3'\n\ngem"
  },
  {
    "path": "LICENSE",
    "chars": 34520,
    "preview": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C)"
  },
  {
    "path": "Procfile",
    "chars": 68,
    "preview": "web: bundle exec puma -C config/puma.rb\nworker: bundle exec sidekiq\n"
  },
  {
    "path": "Procfile.dev",
    "chars": 190,
    "preview": "web: env PORT=3000 bundle exec puma -C config/puma.rb\nsidekiq: env PORT=3000 bundle exec sidekiq\nstream: env PORT=4000 y"
  },
  {
    "path": "README.md",
    "chars": 2779,
    "preview": "Florence Mastodon\n=================\n\nMastodon is a **free, open-source social network server** based on ActivityPub. Thi"
  },
  {
    "path": "Rakefile",
    "chars": 249,
    "preview": "# Add your own tasks in files placed in lib/tasks ending in .rake,\n# for example lib/tasks/capistrano.rake, and they wil"
  },
  {
    "path": "Vagrantfile",
    "chars": 4613,
    "preview": "# -*- mode: ruby -*-\n# vi: set ft=ruby :\n\nENV[\"PORT\"] ||= \"3000\"\n\n$provision = <<SCRIPT\n\ncd /vagrant # This is where the"
  },
  {
    "path": "app/chewy/statuses_index.rb",
    "chars": 1946,
    "preview": "# frozen_string_literal: true\n\nclass StatusesIndex < Chewy::Index\n  settings index: { refresh_interval: '15m' }, analysi"
  },
  {
    "path": "app/controllers/about_controller.rb",
    "chars": 483,
    "preview": "# frozen_string_literal: true\n\nclass AboutController < ApplicationController\n  layout 'public'\n\n  before_action :set_ins"
  },
  {
    "path": "app/controllers/account_follow_controller.rb",
    "chars": 284,
    "preview": "# frozen_string_literal: true\n\nclass AccountFollowController < ApplicationController\n  include AccountControllerConcern\n"
  },
  {
    "path": "app/controllers/account_unfollow_controller.rb",
    "chars": 283,
    "preview": "# frozen_string_literal: true\n\nclass AccountUnfollowController < ApplicationController\n  include AccountControllerConcer"
  },
  {
    "path": "app/controllers/accounts_controller.rb",
    "chars": 3970,
    "preview": "# frozen_string_literal: true\n\nclass AccountsController < ApplicationController\n  PAGE_SIZE = 20\n\n  include AccountContr"
  },
  {
    "path": "app/controllers/activitypub/collections_controller.rb",
    "chars": 1469,
    "preview": "# frozen_string_literal: true\n\nclass ActivityPub::CollectionsController < Api::BaseController\n  include SignatureVerific"
  },
  {
    "path": "app/controllers/activitypub/inboxes_controller.rb",
    "chars": 1515,
    "preview": "# frozen_string_literal: true\n\nclass ActivityPub::InboxesController < Api::BaseController\n  include SignatureVerificatio"
  },
  {
    "path": "app/controllers/activitypub/outboxes_controller.rb",
    "chars": 1923,
    "preview": "# frozen_string_literal: true\n\nclass ActivityPub::OutboxesController < Api::BaseController\n  LIMIT = 20\n\n  include Signa"
  },
  {
    "path": "app/controllers/admin/account_actions_controller.rb",
    "chars": 974,
    "preview": "# frozen_string_literal: true\n\nmodule Admin\n  class AccountActionsController < BaseController\n    before_action :set_acc"
  },
  {
    "path": "app/controllers/admin/account_moderation_notes_controller.rb",
    "chars": 1348,
    "preview": "# frozen_string_literal: true\n\nmodule Admin\n  class AccountModerationNotesController < BaseController\n    before_action "
  },
  {
    "path": "app/controllers/admin/accounts_controller.rb",
    "chars": 3690,
    "preview": "# frozen_string_literal: true\n\nmodule Admin\n  class AccountsController < BaseController\n    before_action :set_account, "
  },
  {
    "path": "app/controllers/admin/action_logs_controller.rb",
    "chars": 180,
    "preview": "# frozen_string_literal: true\n\nmodule Admin\n  class ActionLogsController < BaseController\n    def index\n      @action_lo"
  },
  {
    "path": "app/controllers/admin/base_controller.rb",
    "chars": 444,
    "preview": "# frozen_string_literal: true\n\nmodule Admin\n  class BaseController < ApplicationController\n    include Authorization\n   "
  },
  {
    "path": "app/controllers/admin/change_emails_controller.rb",
    "chars": 1118,
    "preview": "# frozen_string_literal: true\n\nmodule Admin\n  class ChangeEmailsController < BaseController\n    before_action :set_accou"
  },
  {
    "path": "app/controllers/admin/confirmations_controller.rb",
    "chars": 799,
    "preview": "# frozen_string_literal: true\n\nmodule Admin\n  class ConfirmationsController < BaseController\n    before_action :set_user"
  },
  {
    "path": "app/controllers/admin/custom_emojis_controller.rb",
    "chars": 3223,
    "preview": "# frozen_string_literal: true\n\nmodule Admin\n  class CustomEmojisController < BaseController\n    before_action :set_custo"
  },
  {
    "path": "app/controllers/admin/dashboard_controller.rb",
    "chars": 2285,
    "preview": "# frozen_string_literal: true\nrequire 'sidekiq/api'\n\nmodule Admin\n  class DashboardController < BaseController\n    def i"
  },
  {
    "path": "app/controllers/admin/domain_blocks_controller.rb",
    "chars": 1958,
    "preview": "# frozen_string_literal: true\n\nmodule Admin\n  class DomainBlocksController < BaseController\n    before_action :set_domai"
  },
  {
    "path": "app/controllers/admin/email_domain_blocks_controller.rb",
    "chars": 1262,
    "preview": "# frozen_string_literal: true\n\nmodule Admin\n  class EmailDomainBlocksController < BaseController\n    before_action :set_"
  },
  {
    "path": "app/controllers/admin/followers_controller.rb",
    "chars": 371,
    "preview": "# frozen_string_literal: true\n\nmodule Admin\n  class FollowersController < BaseController\n    before_action :set_account\n"
  },
  {
    "path": "app/controllers/admin/instances_controller.rb",
    "chars": 1486,
    "preview": "# frozen_string_literal: true\n\nmodule Admin\n  class InstancesController < BaseController\n    def index\n      authorize :"
  },
  {
    "path": "app/controllers/admin/invites_controller.rb",
    "chars": 1155,
    "preview": "# frozen_string_literal: true\n\nmodule Admin\n  class InvitesController < BaseController\n    def index\n      authorize :in"
  },
  {
    "path": "app/controllers/admin/pending_accounts_controller.rb",
    "chars": 1501,
    "preview": "# frozen_string_literal: true\n\nmodule Admin\n  class PendingAccountsController < BaseController\n    before_action :set_ac"
  },
  {
    "path": "app/controllers/admin/relays_controller.rb",
    "chars": 1088,
    "preview": "# frozen_string_literal: true\n\nmodule Admin\n  class RelaysController < BaseController\n    before_action :set_relay, exce"
  },
  {
    "path": "app/controllers/admin/report_notes_controller.rb",
    "chars": 1424,
    "preview": "# frozen_string_literal: true\n\nmodule Admin\n  class ReportNotesController < BaseController\n    before_action :set_report"
  },
  {
    "path": "app/controllers/admin/reported_statuses_controller.rb",
    "chars": 1079,
    "preview": "# frozen_string_literal: true\n\nmodule Admin\n  class ReportedStatusesController < BaseController\n    before_action :set_r"
  },
  {
    "path": "app/controllers/admin/reports_controller.rb",
    "chars": 1674,
    "preview": "# frozen_string_literal: true\n\nmodule Admin\n  class ReportsController < BaseController\n    before_action :set_report, ex"
  },
  {
    "path": "app/controllers/admin/resets_controller.rb",
    "chars": 311,
    "preview": "# frozen_string_literal: true\n\nmodule Admin\n  class ResetsController < BaseController\n    before_action :set_user\n\n    d"
  },
  {
    "path": "app/controllers/admin/roles_controller.rb",
    "chars": 453,
    "preview": "# frozen_string_literal: true\n\nmodule Admin\n  class RolesController < BaseController\n    before_action :set_user\n\n    de"
  },
  {
    "path": "app/controllers/admin/settings_controller.rb",
    "chars": 1721,
    "preview": "# frozen_string_literal: true\n\nmodule Admin\n  class SettingsController < BaseController\n    ADMIN_SETTINGS = %w(\n      s"
  },
  {
    "path": "app/controllers/admin/statuses_controller.rb",
    "chars": 1990,
    "preview": "# frozen_string_literal: true\n\nmodule Admin\n  class StatusesController < BaseController\n    helper_method :current_param"
  },
  {
    "path": "app/controllers/admin/subscriptions_controller.rb",
    "chars": 394,
    "preview": "# frozen_string_literal: true\n\nmodule Admin\n  class SubscriptionsController < BaseController\n    def index\n      authori"
  },
  {
    "path": "app/controllers/admin/tags_controller.rb",
    "chars": 918,
    "preview": "# frozen_string_literal: true\n\nmodule Admin\n  class TagsController < BaseController\n    before_action :set_tags, only: :"
  },
  {
    "path": "app/controllers/admin/two_factor_authentications_controller.rb",
    "chars": 406,
    "preview": "# frozen_string_literal: true\n\nmodule Admin\n  class TwoFactorAuthenticationsController < BaseController\n    before_actio"
  },
  {
    "path": "app/controllers/admin/warning_presets_controller.rb",
    "chars": 1293,
    "preview": "# frozen_string_literal: true\n\nmodule Admin\n  class WarningPresetsController < BaseController\n    before_action :set_war"
  },
  {
    "path": "app/controllers/api/base_controller.rb",
    "chars": 2790,
    "preview": "# frozen_string_literal: true\n\nclass Api::BaseController < ApplicationController\n  DEFAULT_STATUSES_LIMIT = 20\n  DEFAULT"
  },
  {
    "path": "app/controllers/api/oembed_controller.rb",
    "chars": 519,
    "preview": "# frozen_string_literal: true\n\nclass Api::OEmbedController < Api::BaseController\n  respond_to :json\n\n  def show\n    @sta"
  },
  {
    "path": "app/controllers/api/proofs_controller.rb",
    "chars": 666,
    "preview": "# frozen_string_literal: true\n\nclass Api::ProofsController < Api::BaseController\n  before_action :set_account\n  before_a"
  },
  {
    "path": "app/controllers/api/push_controller.rb",
    "chars": 1668,
    "preview": "# frozen_string_literal: true\n\nclass Api::PushController < Api::BaseController\n  include SignatureVerification\n\n  def up"
  },
  {
    "path": "app/controllers/api/salmon_controller.rb",
    "chars": 704,
    "preview": "# frozen_string_literal: true\n\nclass Api::SalmonController < Api::BaseController\n  include SignatureVerification\n\n  befo"
  },
  {
    "path": "app/controllers/api/subscriptions_controller.rb",
    "chars": 1043,
    "preview": "# frozen_string_literal: true\n\nclass Api::SubscriptionsController < Api::BaseController\n  before_action :set_account\n  r"
  },
  {
    "path": "app/controllers/api/v1/accounts/credentials_controller.rb",
    "chars": 1424,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::Accounts::CredentialsController < Api::BaseController\n  before_action -> {"
  },
  {
    "path": "app/controllers/api/v1/accounts/follower_accounts_controller.rb",
    "chars": 1776,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::Accounts::FollowerAccountsController < Api::BaseController\n  before_action"
  },
  {
    "path": "app/controllers/api/v1/accounts/following_accounts_controller.rb",
    "chars": 1786,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::Accounts::FollowingAccountsController < Api::BaseController\n  before_actio"
  },
  {
    "path": "app/controllers/api/v1/accounts/identity_proofs_controller.rb",
    "chars": 410,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::Accounts::IdentityProofsController < Api::BaseController\n  before_action :"
  },
  {
    "path": "app/controllers/api/v1/accounts/lists_controller.rb",
    "chars": 471,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::Accounts::ListsController < Api::BaseController\n  before_action -> { doork"
  },
  {
    "path": "app/controllers/api/v1/accounts/pins_controller.rb",
    "chars": 904,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::Accounts::PinsController < Api::BaseController\n  include Authorization\n\n  "
  },
  {
    "path": "app/controllers/api/v1/accounts/relationships_controller.rb",
    "chars": 792,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::Accounts::RelationshipsController < Api::BaseController\n  before_action ->"
  },
  {
    "path": "app/controllers/api/v1/accounts/search_controller.rb",
    "chars": 622,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::Accounts::SearchController < Api::BaseController\n  before_action -> { door"
  },
  {
    "path": "app/controllers/api/v1/accounts/statuses_controller.rb",
    "chars": 3137,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::Accounts::StatusesController < Api::BaseController\n  before_action -> { au"
  },
  {
    "path": "app/controllers/api/v1/accounts_controller.rb",
    "chars": 3087,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::AccountsController < Api::BaseController\n  before_action -> { authorize_if"
  },
  {
    "path": "app/controllers/api/v1/apps/credentials_controller.rb",
    "chars": 312,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::Apps::CredentialsController < Api::BaseController\n  before_action -> { doo"
  },
  {
    "path": "app/controllers/api/v1/apps_controller.rb",
    "chars": 642,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::AppsController < Api::BaseController\n  def create\n    @app = Doorkeeper::A"
  },
  {
    "path": "app/controllers/api/v1/blocks_controller.rb",
    "chars": 1548,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::BlocksController < Api::BaseController\n  before_action -> { doorkeeper_aut"
  },
  {
    "path": "app/controllers/api/v1/conversations_controller.rb",
    "chars": 1793,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::ConversationsController < Api::BaseController\n  LIMIT = 20\n\n  before_actio"
  },
  {
    "path": "app/controllers/api/v1/custom_emojis_controller.rb",
    "chars": 397,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::CustomEmojisController < Api::BaseController\n  respond_to :json\n\n  skip_be"
  },
  {
    "path": "app/controllers/api/v1/domain_blocks_controller.rb",
    "chars": 1726,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::DomainBlocksController < Api::BaseController\n  BLOCK_LIMIT = 100\n\n  before"
  },
  {
    "path": "app/controllers/api/v1/endorsements_controller.rb",
    "chars": 1477,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::EndorsementsController < Api::BaseController\n  before_action -> { doorkeep"
  },
  {
    "path": "app/controllers/api/v1/favourites_controller.rb",
    "chars": 1531,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::FavouritesController < Api::BaseController\n  before_action -> { doorkeeper"
  },
  {
    "path": "app/controllers/api/v1/filters_controller.rb",
    "chars": 1204,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::FiltersController < Api::BaseController\n  before_action -> { doorkeeper_au"
  },
  {
    "path": "app/controllers/api/v1/follow_requests_controller.rb",
    "chars": 1962,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::FollowRequestsController < Api::BaseController\n  before_action -> { doorke"
  },
  {
    "path": "app/controllers/api/v1/follows_controller.rb",
    "chars": 732,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::FollowsController < Api::BaseController\n  before_action -> { doorkeeper_au"
  },
  {
    "path": "app/controllers/api/v1/instances/activity_controller.rb",
    "chars": 900,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::Instances::ActivityController < Api::BaseController\n  before_action :requi"
  },
  {
    "path": "app/controllers/api/v1/instances/peers_controller.rb",
    "chars": 408,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::Instances::PeersController < Api::BaseController\n  before_action :require_"
  },
  {
    "path": "app/controllers/api/v1/instances_controller.rb",
    "chars": 343,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::InstancesController < Api::BaseController\n  respond_to :json\n  skip_before"
  },
  {
    "path": "app/controllers/api/v1/lists/accounts_controller.rb",
    "chars": 2072,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::Lists::AccountsController < Api::BaseController\n  before_action -> { doork"
  },
  {
    "path": "app/controllers/api/v1/lists_controller.rb",
    "chars": 1029,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::ListsController < Api::BaseController\n  before_action -> { doorkeeper_auth"
  },
  {
    "path": "app/controllers/api/v1/media_controller.rb",
    "chars": 1082,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::MediaController < Api::BaseController\n  before_action -> { doorkeeper_auth"
  },
  {
    "path": "app/controllers/api/v1/mutes_controller.rb",
    "chars": 1510,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::MutesController < Api::BaseController\n  before_action -> { doorkeeper_auth"
  },
  {
    "path": "app/controllers/api/v1/notifications_controller.rb",
    "chars": 2424,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::NotificationsController < Api::BaseController\n  before_action -> { doorkee"
  },
  {
    "path": "app/controllers/api/v1/polls/votes_controller.rb",
    "chars": 666,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::Polls::VotesController < Api::BaseController\n  include Authorization\n\n  be"
  },
  {
    "path": "app/controllers/api/v1/polls_controller.rb",
    "chars": 702,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::PollsController < Api::BaseController\n  include Authorization\n\n  before_ac"
  },
  {
    "path": "app/controllers/api/v1/preferences_controller.rb",
    "chars": 307,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::PreferencesController < Api::BaseController\n  before_action -> { doorkeepe"
  },
  {
    "path": "app/controllers/api/v1/push/subscriptions_controller.rb",
    "chars": 1546,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::Push::SubscriptionsController < Api::BaseController\n  before_action -> { d"
  },
  {
    "path": "app/controllers/api/v1/reports_controller.rb",
    "chars": 852,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::ReportsController < Api::BaseController\n  before_action -> { doorkeeper_au"
  },
  {
    "path": "app/controllers/api/v1/scheduled_statuses_controller.rb",
    "chars": 1857,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::ScheduledStatusesController < Api::BaseController\n  include Authorization\n"
  },
  {
    "path": "app/controllers/api/v1/search_controller.rb",
    "chars": 675,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::SearchController < Api::BaseController\n  include Authorization\n\n  RESULTS_"
  },
  {
    "path": "app/controllers/api/v1/statuses/favourited_by_accounts_controller.rb",
    "chars": 1801,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::Statuses::FavouritedByAccountsController < Api::BaseController\n  include A"
  },
  {
    "path": "app/controllers/api/v1/statuses/favourites_controller.rb",
    "chars": 957,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::Statuses::FavouritesController < Api::BaseController\n  include Authorizati"
  },
  {
    "path": "app/controllers/api/v1/statuses/mutes_controller.rb",
    "chars": 1052,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::Statuses::MutesController < Api::BaseController\n  include Authorization\n\n "
  },
  {
    "path": "app/controllers/api/v1/statuses/pins_controller.rb",
    "chars": 1359,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::Statuses::PinsController < Api::BaseController\n  include Authorization\n\n  "
  },
  {
    "path": "app/controllers/api/v1/statuses/reblogged_by_accounts_controller.rb",
    "chars": 1789,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::Statuses::RebloggedByAccountsController < Api::BaseController\n  include Au"
  },
  {
    "path": "app/controllers/api/v1/statuses/reblogs_controller.rb",
    "chars": 1049,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::Statuses::ReblogsController < Api::BaseController\n  include Authorization\n"
  },
  {
    "path": "app/controllers/api/v1/statuses_controller.rb",
    "chars": 3639,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::StatusesController < Api::BaseController\n  include Authorization\n\n  before"
  },
  {
    "path": "app/controllers/api/v1/streaming_controller.rb",
    "chars": 409,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::StreamingController < Api::BaseController\n  respond_to :json\n\n  def index\n"
  },
  {
    "path": "app/controllers/api/v1/suggestions_controller.rb",
    "chars": 596,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::SuggestionsController < Api::BaseController\n  include Authorization\n\n  bef"
  },
  {
    "path": "app/controllers/api/v1/timelines/direct_controller.rb",
    "chars": 1512,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::Timelines::DirectController < Api::BaseController\n  before_action -> { doo"
  },
  {
    "path": "app/controllers/api/v1/timelines/home_controller.rb",
    "chars": 1608,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::Timelines::HomeController < Api::BaseController\n  before_action -> { doork"
  },
  {
    "path": "app/controllers/api/v1/timelines/list_controller.rb",
    "chars": 1496,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::Timelines::ListController < Api::BaseController\n  before_action -> { doork"
  },
  {
    "path": "app/controllers/api/v1/timelines/public_controller.rb",
    "chars": 1678,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::Timelines::PublicController < Api::BaseController\n  after_action :insert_p"
  },
  {
    "path": "app/controllers/api/v1/timelines/tag_controller.rb",
    "chars": 1888,
    "preview": "# frozen_string_literal: true\n\nclass Api::V1::Timelines::TagController < Api::BaseController\n  before_action :load_tag\n "
  },
  {
    "path": "app/controllers/api/v2/search_controller.rb",
    "chars": 219,
    "preview": "# frozen_string_literal: true\n\nclass Api::V2::SearchController < Api::V1::SearchController\n  def index\n    @search = Sea"
  },
  {
    "path": "app/controllers/api/web/base_controller.rb",
    "chars": 276,
    "preview": "# frozen_string_literal: true\n\nclass Api::Web::BaseController < Api::BaseController\n  protect_from_forgery with: :except"
  },
  {
    "path": "app/controllers/api/web/embeds_controller.rb",
    "chars": 600,
    "preview": "# frozen_string_literal: true\n\nclass Api::Web::EmbedsController < Api::Web::BaseController\n  respond_to :json\n\n  before_"
  },
  {
    "path": "app/controllers/api/web/push_subscriptions_controller.rb",
    "chars": 1853,
    "preview": "# frozen_string_literal: true\n\nclass Api::Web::PushSubscriptionsController < Api::Web::BaseController\n  respond_to :json"
  },
  {
    "path": "app/controllers/api/web/settings_controller.rb",
    "chars": 368,
    "preview": "# frozen_string_literal: true\n\nclass Api::Web::SettingsController < Api::Web::BaseController\n  respond_to :json\n\n  befor"
  },
  {
    "path": "app/controllers/application_controller.rb",
    "chars": 4188,
    "preview": "# frozen_string_literal: true\n\nclass ApplicationController < ActionController::Base\n  # Prevent CSRF attacks by raising "
  },
  {
    "path": "app/controllers/auth/confirmations_controller.rb",
    "chars": 900,
    "preview": "# frozen_string_literal: true\n\nclass Auth::ConfirmationsController < Devise::ConfirmationsController\n  layout 'auth'\n\n  "
  },
  {
    "path": "app/controllers/auth/omniauth_callbacks_controller.rb",
    "chars": 932,
    "preview": "# frozen_string_literal: true\n\nclass Auth::OmniauthCallbacksController < Devise::OmniauthCallbacksController\n  skip_befo"
  },
  {
    "path": "app/controllers/auth/passwords_controller.rb",
    "chars": 636,
    "preview": "# frozen_string_literal: true\n\nclass Auth::PasswordsController < Devise::PasswordsController\n  before_action :check_vali"
  },
  {
    "path": "app/controllers/auth/registrations_controller.rb",
    "chars": 2606,
    "preview": "# frozen_string_literal: true\n\nclass Auth::RegistrationsController < Devise::RegistrationsController\n  layout :determine"
  },
  {
    "path": "app/controllers/auth/sessions_controller.rb",
    "chars": 3228,
    "preview": "# frozen_string_literal: true\n\nclass Auth::SessionsController < Devise::SessionsController\n  include Devise::Controllers"
  },
  {
    "path": "app/controllers/authorize_interactions_controller.rb",
    "chars": 1388,
    "preview": "# frozen_string_literal: true\n\nclass AuthorizeInteractionsController < ApplicationController\n  include Authorization\n\n  "
  },
  {
    "path": "app/controllers/concerns/account_controller_concern.rb",
    "chars": 1505,
    "preview": "# frozen_string_literal: true\n\nmodule AccountControllerConcern\n  extend ActiveSupport::Concern\n\n  FOLLOW_PER_PAGE = 12\n\n"
  },
  {
    "path": "app/controllers/concerns/accountable_concern.rb",
    "chars": 219,
    "preview": "# frozen_string_literal: true\n\nmodule AccountableConcern\n  extend ActiveSupport::Concern\n\n  def log_action(action, targe"
  },
  {
    "path": "app/controllers/concerns/authorization.rb",
    "chars": 426,
    "preview": "# frozen_string_literal: true\n\nmodule Authorization\n  extend ActiveSupport::Concern\n\n  include Pundit\n\n  def pundit_user"
  },
  {
    "path": "app/controllers/concerns/export_controller_concern.rb",
    "chars": 519,
    "preview": "# frozen_string_literal: true\n\nmodule ExportControllerConcern\n  extend ActiveSupport::Concern\n\n  included do\n    before_"
  },
  {
    "path": "app/controllers/concerns/localized.rb",
    "chars": 809,
    "preview": "# frozen_string_literal: true\n\nmodule Localized\n  extend ActiveSupport::Concern\n\n  included do\n    before_action :set_lo"
  },
  {
    "path": "app/controllers/concerns/obfuscate_filename.rb",
    "chars": 344,
    "preview": "# frozen_string_literal: true\n\nmodule ObfuscateFilename\n  extend ActiveSupport::Concern\n\n  class_methods do\n    def obfu"
  },
  {
    "path": "app/controllers/concerns/rate_limit_headers.rb",
    "chars": 1289,
    "preview": "# frozen_string_literal: true\n\nmodule RateLimitHeaders\n  extend ActiveSupport::Concern\n\n  included do\n    before_action "
  },
  {
    "path": "app/controllers/concerns/session_tracking_concern.rb",
    "chars": 422,
    "preview": "# frozen_string_literal: true\n\nmodule SessionTrackingConcern\n  extend ActiveSupport::Concern\n\n  UPDATE_SIGN_IN_HOURS = 2"
  },
  {
    "path": "app/controllers/concerns/signature_authentication.rb",
    "chars": 196,
    "preview": "# frozen_string_literal: true\n\nmodule SignatureAuthentication\n  extend ActiveSupport::Concern\n\n  include SignatureVerifi"
  },
  {
    "path": "app/controllers/concerns/signature_verification.rb",
    "chars": 4753,
    "preview": "# frozen_string_literal: true\n\n# Implemented according to HTTP signatures (Draft 6)\n# <https://tools.ietf.org/html/draft"
  },
  {
    "path": "app/controllers/concerns/user_tracking_concern.rb",
    "chars": 487,
    "preview": "# frozen_string_literal: true\n\nmodule UserTrackingConcern\n  extend ActiveSupport::Concern\n\n  UPDATE_SIGN_IN_HOURS = 24\n\n"
  },
  {
    "path": "app/controllers/custom_css_controller.rb",
    "chars": 253,
    "preview": "# frozen_string_literal: true\n\nclass CustomCssController < ApplicationController\n  skip_before_action :store_current_loc"
  },
  {
    "path": "app/controllers/directories_controller.rb",
    "chars": 906,
    "preview": "# frozen_string_literal: true\n\nclass DirectoriesController < ApplicationController\n  layout 'public'\n\n  before_action :c"
  },
  {
    "path": "app/controllers/emojis_controller.rb",
    "chars": 570,
    "preview": "# frozen_string_literal: true\n\nclass EmojisController < ApplicationController\n  before_action :set_emoji\n  before_action"
  },
  {
    "path": "app/controllers/filters_controller.rb",
    "chars": 1163,
    "preview": "# frozen_string_literal: true\n\nclass FiltersController < ApplicationController\n  include Authorization\n\n  layout 'admin'"
  },
  {
    "path": "app/controllers/follower_accounts_controller.rb",
    "chars": 1827,
    "preview": "# frozen_string_literal: true\n\nclass FollowerAccountsController < ApplicationController\n  include AccountControllerConce"
  },
  {
    "path": "app/controllers/following_accounts_controller.rb",
    "chars": 1866,
    "preview": "# frozen_string_literal: true\n\nclass FollowingAccountsController < ApplicationController\n  include AccountControllerConc"
  },
  {
    "path": "app/controllers/home_controller.rb",
    "chars": 2004,
    "preview": "# frozen_string_literal: true\n\nclass HomeController < ApplicationController\n  before_action :authenticate_user!\n  before"
  },
  {
    "path": "app/controllers/intents_controller.rb",
    "chars": 680,
    "preview": "# frozen_string_literal: true\n\nclass IntentsController < ApplicationController\n  before_action :check_uri\n  rescue_from "
  },
  {
    "path": "app/controllers/invites_controller.rb",
    "chars": 931,
    "preview": "# frozen_string_literal: true\n\nclass InvitesController < ApplicationController\n  include Authorization\n\n  layout 'admin'"
  },
  {
    "path": "app/controllers/manifests_controller.rb",
    "chars": 219,
    "preview": "# frozen_string_literal: true\n\nclass ManifestsController < ApplicationController\n  skip_before_action :store_current_loc"
  },
  {
    "path": "app/controllers/media_controller.rb",
    "chars": 961,
    "preview": "# frozen_string_literal: true\n\nclass MediaController < ApplicationController\n  include Authorization\n\n  skip_before_acti"
  },
  {
    "path": "app/controllers/media_proxy_controller.rb",
    "chars": 1026,
    "preview": "# frozen_string_literal: true\n\nclass MediaProxyController < ApplicationController\n  include RoutingHelper\n\n  skip_before"
  },
  {
    "path": "app/controllers/oauth/authorizations_controller.rb",
    "chars": 706,
    "preview": "# frozen_string_literal: true\n\nclass Oauth::AuthorizationsController < Doorkeeper::AuthorizationsController\n  skip_befor"
  },
  {
    "path": "app/controllers/oauth/authorized_applications_controller.rb",
    "chars": 579,
    "preview": "# frozen_string_literal: true\n\nclass Oauth::AuthorizedApplicationsController < Doorkeeper::AuthorizedApplicationsControl"
  },
  {
    "path": "app/controllers/oauth/tokens_controller.rb",
    "chars": 303,
    "preview": "# frozen_string_literal: true\n\nclass Oauth::TokensController < Doorkeeper::TokensController\n  def revoke\n    unsubscribe"
  },
  {
    "path": "app/controllers/public_timelines_controller.rb",
    "chars": 842,
    "preview": "# frozen_string_literal: true\n\nclass PublicTimelinesController < ApplicationController\n  layout 'public'\n\n  before_actio"
  },
  {
    "path": "app/controllers/relationships_controller.rb",
    "chars": 2866,
    "preview": "# frozen_string_literal: true\n\nclass RelationshipsController < ApplicationController\n  layout 'admin'\n\n  before_action :"
  },
  {
    "path": "app/controllers/remote_follow_controller.rb",
    "chars": 932,
    "preview": "# frozen_string_literal: true\n\nclass RemoteFollowController < ApplicationController\n  layout 'modal'\n\n  before_action :s"
  },
  {
    "path": "app/controllers/remote_interaction_controller.rb",
    "chars": 1147,
    "preview": "# frozen_string_literal: true\n\nclass RemoteInteractionController < ApplicationController\n  include Authorization\n\n  layo"
  },
  {
    "path": "app/controllers/remote_unfollows_controller.rb",
    "chars": 786,
    "preview": "# frozen_string_literal: true\n\nclass RemoteUnfollowsController < ApplicationController\n  layout 'modal'\n\n  before_action"
  },
  {
    "path": "app/controllers/settings/applications_controller.rb",
    "chars": 1808,
    "preview": "# frozen_string_literal: true\n\nclass Settings::ApplicationsController < Settings::BaseController\n  layout 'admin'\n\n  bef"
  },
  {
    "path": "app/controllers/settings/base_controller.rb",
    "chars": 193,
    "preview": "# frozen_string_literal: true\n\nclass Settings::BaseController < ApplicationController\n  before_action :set_body_classes\n"
  },
  {
    "path": "app/controllers/settings/deletes_controller.rb",
    "chars": 801,
    "preview": "# frozen_string_literal: true\n\nclass Settings::DeletesController < Settings::BaseController\n  layout 'admin'\n\n  before_a"
  },
  {
    "path": "app/controllers/settings/exports/blocked_accounts_controller.rb",
    "chars": 320,
    "preview": "# frozen_string_literal: true\n\nmodule Settings\n  module Exports\n    class BlockedAccountsController < ApplicationControl"
  },
  {
    "path": "app/controllers/settings/exports/blocked_domains_controller.rb",
    "chars": 318,
    "preview": "# frozen_string_literal: true\n\nmodule Settings\n  module Exports\n    class BlockedDomainsController < ApplicationControll"
  },
  {
    "path": "app/controllers/settings/exports/following_accounts_controller.rb",
    "chars": 324,
    "preview": "# frozen_string_literal: true\n\nmodule Settings\n  module Exports\n    class FollowingAccountsController < ApplicationContr"
  },
  {
    "path": "app/controllers/settings/exports/lists_controller.rb",
    "chars": 299,
    "preview": "# frozen_string_literal: true\n\nmodule Settings\n  module Exports\n    class ListsController < ApplicationController\n      "
  },
  {
    "path": "app/controllers/settings/exports/muted_accounts_controller.rb",
    "chars": 316,
    "preview": "# frozen_string_literal: true\n\nmodule Settings\n  module Exports\n    class MutedAccountsController < ApplicationControlle"
  },
  {
    "path": "app/controllers/settings/exports_controller.rb",
    "chars": 766,
    "preview": "# frozen_string_literal: true\n\nclass Settings::ExportsController < Settings::BaseController\n  include Authorization\n\n  l"
  },
  {
    "path": "app/controllers/settings/featured_tags_controller.rb",
    "chars": 1204,
    "preview": "# frozen_string_literal: true\n\nclass Settings::FeaturedTagsController < Settings::BaseController\n  layout 'admin'\n\n  bef"
  },
  {
    "path": "app/controllers/settings/identity_proofs_controller.rb",
    "chars": 1998,
    "preview": "# frozen_string_literal: true\n\nclass Settings::IdentityProofsController < Settings::BaseController\n  layout 'admin'\n\n  b"
  },
  {
    "path": "app/controllers/settings/imports_controller.rb",
    "chars": 637,
    "preview": "# frozen_string_literal: true\n\nclass Settings::ImportsController < Settings::BaseController\n  layout 'admin'\n\n  before_a"
  },
  {
    "path": "app/controllers/settings/migrations_controller.rb",
    "chars": 892,
    "preview": "# frozen_string_literal: true\n\nclass Settings::MigrationsController < Settings::BaseController\n  layout 'admin'\n\n  befor"
  },
  {
    "path": "app/controllers/settings/preferences/appearance_controller.rb",
    "chars": 210,
    "preview": "# frozen_string_literal: true\n\nclass Settings::Preferences::AppearanceController < Settings::PreferencesController\n  pri"
  },
  {
    "path": "app/controllers/settings/preferences/notifications_controller.rb",
    "chars": 216,
    "preview": "# frozen_string_literal: true\n\nclass Settings::Preferences::NotificationsController < Settings::PreferencesController\n  "
  },
  {
    "path": "app/controllers/settings/preferences/other_controller.rb",
    "chars": 200,
    "preview": "# frozen_string_literal: true\n\nclass Settings::Preferences::OtherController < Settings::PreferencesController\n  private\n"
  },
  {
    "path": "app/controllers/settings/preferences_controller.rb",
    "chars": 1511,
    "preview": "# frozen_string_literal: true\n\nclass Settings::PreferencesController < Settings::BaseController\n  layout 'admin'\n\n  befo"
  },
  {
    "path": "app/controllers/settings/profiles_controller.rb",
    "chars": 876,
    "preview": "# frozen_string_literal: true\n\nclass Settings::ProfilesController < Settings::BaseController\n  include ObfuscateFilename"
  },
  {
    "path": "app/controllers/settings/sessions_controller.rb",
    "chars": 422,
    "preview": "# frozen_string_literal: true\n\nclass Settings::SessionsController < Settings::BaseController\n  before_action :authentica"
  },
  {
    "path": "app/controllers/settings/two_factor_authentication/confirmations_controller.rb",
    "chars": 1409,
    "preview": "# frozen_string_literal: true\n\nmodule Settings\n  module TwoFactorAuthentication\n    class ConfirmationsController < Base"
  },
  {
    "path": "app/controllers/settings/two_factor_authentication/recovery_codes_controller.rb",
    "chars": 442,
    "preview": "# frozen_string_literal: true\n\nmodule Settings\n  module TwoFactorAuthentication\n    class RecoveryCodesController < Base"
  },
  {
    "path": "app/controllers/settings/two_factor_authentications_controller.rb",
    "chars": 1293,
    "preview": "# frozen_string_literal: true\n\nmodule Settings\n  class TwoFactorAuthenticationsController < BaseController\n    layout 'a"
  },
  {
    "path": "app/controllers/shares_controller.rb",
    "chars": 961,
    "preview": "# frozen_string_literal: true\n\nclass SharesController < ApplicationController\n  layout 'modal'\n\n  before_action :authent"
  },
  {
    "path": "app/controllers/statuses_controller.rb",
    "chars": 7044,
    "preview": "# frozen_string_literal: true\n\nclass StatusesController < ApplicationController\n  include SignatureAuthentication\n  incl"
  },
  {
    "path": "app/controllers/stream_entries_controller.rb",
    "chars": 1851,
    "preview": "# frozen_string_literal: true\n\nclass StreamEntriesController < ApplicationController\n  include Authorization\n  include S"
  },
  {
    "path": "app/controllers/tags_controller.rb",
    "chars": 1700,
    "preview": "# frozen_string_literal: true\n\nclass TagsController < ApplicationController\n  PAGE_SIZE = 20\n\n  layout 'public'\n\n  befor"
  },
  {
    "path": "app/controllers/well_known/host_meta_controller.rb",
    "chars": 425,
    "preview": "# frozen_string_literal: true\n\nmodule WellKnown\n  class HostMetaController < ActionController::Base\n    include RoutingH"
  },
  {
    "path": "app/controllers/well_known/keybase_proof_config_controller.rb",
    "chars": 217,
    "preview": "# frozen_string_literal: true\n\nmodule WellKnown\n  class KeybaseProofConfigController < ActionController::Base\n    def sh"
  },
  {
    "path": "app/controllers/well_known/webfinger_controller.rb",
    "chars": 1063,
    "preview": "# frozen_string_literal: true\n\nmodule WellKnown\n  class WebfingerController < ActionController::Base\n    include Routing"
  },
  {
    "path": "app/helpers/admin/account_moderation_notes_helper.rb",
    "chars": 974,
    "preview": "# frozen_string_literal: true\n\nmodule Admin::AccountModerationNotesHelper\n  def admin_account_link_to(account)\n    retur"
  },
  {
    "path": "app/helpers/admin/action_logs_helper.rb",
    "chars": 3627,
    "preview": "# frozen_string_literal: true\n\nmodule Admin::ActionLogsHelper\n  def log_target(log)\n    if log.target\n      linkable_log"
  }
]

// ... and 2174 more files (download for full content)

About this extraction

This page contains the full source code of the florence-social/mastodon-fork GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 2374 files (7.4 MB), approximately 2.1M tokens, and a symbol index with 5947 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!