summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlfredo Sumaran <alfredo@gitlab.com>2016-02-22 21:15:40 -0500
committerAlfredo Sumaran <alfredo@gitlab.com>2016-02-22 21:15:40 -0500
commit67948368aec144ff7e9997ce184cb4d111622f08 (patch)
treec94e382fb1aca074b6ce503255564828cb387e36
parent608012629cc90337aba6c5bd4b2b73b530091fb0 (diff)
parent7c8099853621cc2a244bf6e0fd37a8b503d1ec5e (diff)
downloadgitlab-ce-sidebar-sizing-higher-viewport.tar.gz
Merge branch 'master' into sidebar-sizing-higher-viewportsidebar-sizing-higher-viewport
-rw-r--r--.gitlab-ci.yml66
-rw-r--r--.ruby-version2
-rw-r--r--CHANGELOG20
-rw-r--r--GITLAB_WORKHORSE_VERSION2
-rw-r--r--Gemfile6
-rw-r--r--Gemfile.lock24
-rw-r--r--README.md2
-rw-r--r--VERSION2
-rw-r--r--app/assets/images/emoji.pngbin832902 -> 263533 bytes
-rw-r--r--app/assets/images/emoji@2x.pngbin0 -> 690504 bytes
-rw-r--r--app/assets/javascripts/dispatcher.js.coffee2
-rw-r--r--app/assets/javascripts/issuable_context.js.coffee2
-rw-r--r--app/assets/javascripts/merge_request_tabs.js.coffee8
-rw-r--r--app/assets/javascripts/milestone.js.coffee10
-rw-r--r--app/assets/stylesheets/framework/common.scss1
-rw-r--r--app/assets/stylesheets/framework/gitlab-theme.scss2
-rw-r--r--app/assets/stylesheets/framework/header.scss1
-rw-r--r--app/assets/stylesheets/framework/highlight.scss4
-rw-r--r--app/assets/stylesheets/framework/issue_box.scss9
-rw-r--r--app/assets/stylesheets/pages/detail_page.scss8
-rw-r--r--app/assets/stylesheets/pages/emojis.scss3002
-rw-r--r--app/assets/stylesheets/pages/issuable.scss51
-rw-r--r--app/assets/stylesheets/pages/labels.scss2
-rw-r--r--app/assets/stylesheets/pages/merge_requests.scss2
-rw-r--r--app/assets/stylesheets/pages/milestone.scss57
-rw-r--r--app/assets/stylesheets/pages/projects.scss19
-rw-r--r--app/assets/stylesheets/pages/todos.scss124
-rw-r--r--app/controllers/admin/labels_controller.rb2
-rw-r--r--app/controllers/application_controller.rb9
-rw-r--r--app/controllers/concerns/creates_commit.rb53
-rw-r--r--app/controllers/concerns/issues_action.rb2
-rw-r--r--app/controllers/concerns/merge_requests_action.rb2
-rw-r--r--app/controllers/dashboard/todos_controller.rb35
-rw-r--r--app/controllers/omniauth_callbacks_controller.rb54
-rw-r--r--app/controllers/projects/blob_controller.rb2
-rw-r--r--app/controllers/projects/builds_controller.rb6
-rw-r--r--app/controllers/projects/commit_controller.rb44
-rw-r--r--app/controllers/projects/forks_controller.rb2
-rw-r--r--app/controllers/projects/imports_controller.rb12
-rw-r--r--app/controllers/projects/issues_controller.rb1
-rw-r--r--app/controllers/projects/labels_controller.rb2
-rw-r--r--app/controllers/projects/merge_requests_controller.rb4
-rw-r--r--app/controllers/projects/milestones_controller.rb1
-rw-r--r--app/controllers/projects/repositories_controller.rb4
-rw-r--r--app/controllers/projects_controller.rb2
-rw-r--r--app/finders/issuable_finder.rb20
-rw-r--r--app/finders/todos_finder.rb129
-rw-r--r--app/helpers/application_helper.rb6
-rw-r--r--app/helpers/blob_helper.rb4
-rw-r--r--app/helpers/commits_helper.rb31
-rw-r--r--app/helpers/diff_helper.rb4
-rw-r--r--app/helpers/nav_helper.rb1
-rw-r--r--app/helpers/sorting_helper.rb18
-rw-r--r--app/helpers/todos_helper.rb87
-rw-r--r--app/helpers/tree_helper.rb3
-rw-r--r--app/models/blob.rb34
-rw-r--r--app/models/ci/build.rb52
-rw-r--r--app/models/ci/runner.rb6
-rw-r--r--app/models/commit.rb38
-rw-r--r--app/models/commit_status.rb16
-rw-r--r--app/models/concerns/issuable.rb25
-rw-r--r--app/models/label.rb19
-rw-r--r--app/models/merge_request.rb11
-rw-r--r--app/models/milestone.rb14
-rw-r--r--app/models/note.rb5
-rw-r--r--app/models/project.rb4
-rw-r--r--app/models/project_team.rb2
-rw-r--r--app/models/repository.rb83
-rw-r--r--app/models/todo.rb53
-rw-r--r--app/models/user.rb2
-rw-r--r--app/services/archive_repository_service.rb23
-rw-r--r--app/services/base_service.rb4
-rw-r--r--app/services/ci/create_builds_service.rb1
-rw-r--r--app/services/commits/revert_service.rb58
-rw-r--r--app/services/git_push_service.rb118
-rw-r--r--app/services/issuable_base_service.rb15
-rw-r--r--app/services/issues/close_service.rb2
-rw-r--r--app/services/issues/create_service.rb1
-rw-r--r--app/services/issues/update_service.rb12
-rw-r--r--app/services/merge_requests/build_service.rb2
-rw-r--r--app/services/merge_requests/close_service.rb1
-rw-r--r--app/services/merge_requests/create_service.rb3
-rw-r--r--app/services/merge_requests/merge_service.rb3
-rw-r--r--app/services/merge_requests/merge_when_build_succeeds_service.rb27
-rw-r--r--app/services/merge_requests/update_service.rb12
-rw-r--r--app/services/notes/create_service.rb1
-rw-r--r--app/services/notes/post_process_service.rb2
-rw-r--r--app/services/notes/update_service.rb4
-rw-r--r--app/services/projects/destroy_service.rb14
-rw-r--r--app/services/todo_service.rb170
-rw-r--r--app/views/admin/labels/_form.html.haml4
-rw-r--r--app/views/admin/labels/_label.html.haml10
-rw-r--r--app/views/dashboard/projects/_zero_authorized_projects.html.haml4
-rw-r--r--app/views/dashboard/todos/_todo.html.haml21
-rw-r--r--app/views/dashboard/todos/index.html.haml62
-rw-r--r--app/views/layouts/_head.html.haml1
-rw-r--r--app/views/layouts/header/_default.html.haml6
-rw-r--r--app/views/layouts/nav/_dashboard.html.haml18
-rw-r--r--app/views/projects/_home_panel.html.haml11
-rw-r--r--app/views/projects/blame/show.html.haml6
-rw-r--r--app/views/projects/blob/_blob.html.haml12
-rw-r--r--app/views/projects/blob/_image.html.haml9
-rw-r--r--app/views/projects/builds/show.html.haml78
-rw-r--r--app/views/projects/commit/_commit_box.html.haml2
-rw-r--r--app/views/projects/commit/_revert.html.haml31
-rw-r--r--app/views/projects/commit/show.html.haml2
-rw-r--r--app/views/projects/diffs/_image.html.haml18
-rw-r--r--app/views/projects/diffs/_text_file.html.haml4
-rw-r--r--app/views/projects/edit.html.haml4
-rw-r--r--app/views/projects/issues/_issue.html.haml11
-rw-r--r--app/views/projects/issues/show.html.haml23
-rw-r--r--app/views/projects/issues/update.js.haml2
-rw-r--r--app/views/projects/labels/_form.html.haml4
-rw-r--r--app/views/projects/labels/_label.html.haml3
-rw-r--r--app/views/projects/merge_requests/_merge_request.html.haml11
-rw-r--r--app/views/projects/merge_requests/_show.html.haml2
-rw-r--r--app/views/projects/merge_requests/show/_mr_title.html.haml2
-rw-r--r--app/views/projects/merge_requests/update.js.haml6
-rw-r--r--app/views/projects/merge_requests/widget/_merged.html.haml14
-rw-r--r--app/views/projects/merge_requests/widget/_merged_buttons.haml11
-rw-r--r--app/views/projects/milestones/_issue.html.haml13
-rw-r--r--app/views/projects/milestones/_issues.html.haml5
-rw-r--r--app/views/projects/milestones/_merge_requests.html.haml1
-rw-r--r--app/views/projects/milestones/show.html.haml87
-rw-r--r--app/views/shared/_label_row.html.haml4
-rw-r--r--app/views/shared/_project_limit.html.haml2
-rw-r--r--app/views/shared/_sort_dropdown.html.haml4
-rw-r--r--app/views/shared/issuable/_filter.html.haml4
-rw-r--r--app/views/shared/issuable/_sidebar.html.haml2
-rw-r--r--app/views/shared/projects/_project.html.haml5
-rw-r--r--app/workers/post_receive.rb2
-rw-r--r--app/workers/repository_fork_worker.rb1
-rw-r--r--app/workers/repository_import_worker.rb1
-rw-r--r--config/application.rb8
-rw-r--r--config/gitlab.yml.example11
-rw-r--r--config/initializers/1_settings.rb1
-rw-r--r--config/initializers/2_app.rb4
-rw-r--r--config/initializers/sentry.rb1
-rw-r--r--config/routes.rb8
-rw-r--r--config/sidekiq.yml.example2
-rw-r--r--db/migrate/20160129155512_add_merge_commit_sha_to_merge_requests.rb5
-rw-r--r--db/migrate/20160202091601_add_erasable_to_ci_build.rb6
-rw-r--r--db/migrate/20160212123307_create_tasks.rb14
-rw-r--r--db/migrate/20160217100506_add_description_to_label.rb5
-rw-r--r--db/migrate/20160217174422_add_note_to_tasks.rb5
-rw-r--r--db/migrate/20160220123949_rename_tasks_to_todos.rb5
-rw-r--r--db/schema.rb29
-rw-r--r--doc/api/README.md1
-rw-r--r--doc/api/builds.md88
-rw-r--r--doc/api/runners.md322
-rw-r--r--doc/ci/api/runners.md6
-rw-r--r--doc/ci/quick_start/README.md17
-rw-r--r--doc/ci/variables/README.md2
-rw-r--r--doc/ci/yaml/README.md28
-rw-r--r--doc/development/ci_setup.md2
-rw-r--r--doc/development/migration_style_guide.md2
-rw-r--r--doc/gitlab-basics/basicsimages/compare_branches.png (renamed from doc/gitlab-basics/basicsimages/compare_braches.png)bin1624 -> 1624 bytes
-rw-r--r--doc/install/installation.md35
-rw-r--r--doc/install/redis.md60
-rw-r--r--doc/install/requirements.md6
-rw-r--r--doc/project_services/builds_emails.md16
-rw-r--r--doc/project_services/img/builds_emails_service.pngbin0 -> 41222 bytes
-rw-r--r--doc/project_services/project_services.md2
-rw-r--r--doc/update/8.3-to-8.4.md21
-rw-r--r--doc/update/8.4-to-8.5.md26
-rw-r--r--doc/workflow/README.md1
-rw-r--r--doc/workflow/gitlab_flow.md2
-rw-r--r--doc/workflow/img/revert_changes_commit.pngbin0 -> 360098 bytes
-rw-r--r--doc/workflow/img/revert_changes_commit_modal.pngbin0 -> 327932 bytes
-rw-r--r--doc/workflow/img/revert_changes_mr.pngbin0 -> 367881 bytes
-rw-r--r--doc/workflow/img/revert_changes_mr_modal.pngbin0 -> 335010 bytes
-rw-r--r--doc/workflow/img/web_editor_new_branch_dropdown.pngbin0 -> 34233 bytes
-rw-r--r--doc/workflow/img/web_editor_new_branch_page.pngbin0 -> 21618 bytes
-rw-r--r--doc/workflow/img/web_editor_new_directory_dialog.pngbin0 -> 26145 bytes
-rw-r--r--doc/workflow/img/web_editor_new_directory_dropdown.pngbin0 -> 33714 bytes
-rw-r--r--doc/workflow/img/web_editor_new_file_dropdown.pngbin0 -> 34978 bytes
-rw-r--r--doc/workflow/img/web_editor_new_file_editor.pngbin0 -> 128658 bytes
-rw-r--r--doc/workflow/img/web_editor_new_push_widget.pngbin0 -> 11220 bytes
-rw-r--r--doc/workflow/img/web_editor_new_tag_dropdown.pngbin0 -> 33753 bytes
-rw-r--r--doc/workflow/img/web_editor_new_tag_page.pngbin0 -> 75536 bytes
-rw-r--r--doc/workflow/img/web_editor_start_new_merge_request.pngbin0 -> 14352 bytes
-rw-r--r--doc/workflow/img/web_editor_upload_file_dialog.pngbin0 -> 46219 bytes
-rw-r--r--doc/workflow/img/web_editor_upload_file_dropdown.pngbin0 -> 34835 bytes
-rw-r--r--doc/workflow/revert_changes.md64
-rw-r--r--doc/workflow/web_editor.md126
-rw-r--r--doc/workflow/web_editor/edit_file.pngbin89039 -> 0 bytes
-rw-r--r--doc/workflow/web_editor/empty_project.pngbin122296 -> 0 bytes
-rw-r--r--doc/workflow/web_editor/new_file.pngbin85526 -> 0 bytes
-rw-r--r--doc/workflow/web_editor/show_file.pngbin111479 -> 0 bytes
-rw-r--r--features/dashboard/todos.feature38
-rw-r--r--features/project/builds/summary.feature9
-rw-r--r--features/project/commits/revert.feature28
-rw-r--r--features/project/fork.feature7
-rw-r--r--features/project/issues/issues.feature10
-rw-r--r--features/project/merge_requests.feature11
-rw-r--r--features/project/merge_requests/revert.feature30
-rw-r--r--features/project/milestone.feature23
-rw-r--r--features/steps/dashboard/todos.rb128
-rw-r--r--features/steps/project/builds/summary.rb20
-rw-r--r--features/steps/project/commits/revert.rb40
-rw-r--r--features/steps/project/fork.rb6
-rw-r--r--features/steps/project/issues/award_emoji.rb2
-rw-r--r--features/steps/project/issues/issues.rb57
-rw-r--r--features/steps/project/merge_requests.rb50
-rw-r--r--features/steps/project/merge_requests/revert.rb56
-rw-r--r--features/steps/project/project_milestone.rb53
-rw-r--r--features/steps/shared/builds.rb4
-rw-r--r--features/steps/shared/issuable.rb16
-rw-r--r--features/steps/shared/paths.rb4
-rw-r--r--fixtures/emojis/aliases.json138
-rwxr-xr-xfixtures/emojis/generate_aliases.rb18
-rw-r--r--fixtures/emojis/index.json20099
-rw-r--r--lib/api/api.rb1
-rw-r--r--lib/api/builds.rb46
-rw-r--r--lib/api/entities.rb23
-rw-r--r--lib/api/repositories.rb7
-rw-r--r--lib/api/runners.rb175
-rw-r--r--lib/banzai/filter/emoji_filter.rb3
-rw-r--r--lib/ci/api/builds.rb6
-rw-r--r--lib/ci/status.rb4
-rw-r--r--lib/gitlab/ldap/user.rb4
-rw-r--r--lib/gitlab/o_auth/user.rb13
-rw-r--r--lib/gitlab/push_data_builder.rb2
-rw-r--r--lib/gitlab/saml/user.rb47
-rw-r--r--lib/gitlab/workhorse.rb27
-rw-r--r--lib/tasks/cache.rake18
-rw-r--r--lib/tasks/gitlab/check.rake1
-rw-r--r--spec/controllers/commit_controller_spec.rb49
-rw-r--r--spec/controllers/profiles/keys_controller_spec.rb (renamed from spec/controllers/profile_keys_controller_spec.rb)0
-rw-r--r--spec/controllers/projects/blame_controller_spec.rb (renamed from spec/controllers/blame_controller_spec.rb)0
-rw-r--r--spec/controllers/projects/branches_controller_spec.rb (renamed from spec/controllers/branches_controller_spec.rb)0
-rw-r--r--spec/controllers/projects/commits_controller_spec.rb (renamed from spec/controllers/commits_controller_spec.rb)0
-rw-r--r--spec/controllers/projects/imports_controller_spec.rb12
-rw-r--r--spec/controllers/projects/merge_requests_controller_spec.rb34
-rw-r--r--spec/controllers/projects/repositories_controller_spec.rb11
-rw-r--r--spec/controllers/sent_notifications_controller_spec.rb (renamed from spec/controllers/sent_notification_controller_spec.rb)0
-rw-r--r--spec/factories/ci/builds.rb35
-rw-r--r--spec/factories/ci/runners.rb10
-rw-r--r--spec/factories/merge_requests.rb1
-rw-r--r--spec/factories/notes.rb14
-rw-r--r--spec/factories/todos.rb34
-rw-r--r--spec/features/runners_spec.rb10
-rw-r--r--spec/helpers/gitlab_markdown_helper_spec.rb2
-rw-r--r--spec/lib/banzai/filter/emoji_filter_spec.rb4
-rw-r--r--spec/lib/ci/status_spec.rb41
-rw-r--r--spec/lib/gitlab/o_auth/user_spec.rb26
-rw-r--r--spec/lib/gitlab/push_data_builder_spec.rb21
-rw-r--r--spec/lib/gitlab/saml/user_spec.rb271
-rw-r--r--spec/lib/gitlab/workhorse_spec.rb18
-rw-r--r--spec/models/blob_spec.rb81
-rw-r--r--spec/models/build_spec.rb133
-rw-r--r--spec/models/ci/commit_spec.rb29
-rw-r--r--spec/models/ci/runner_spec.rb14
-rw-r--r--spec/models/commit_spec.rb34
-rw-r--r--spec/models/merge_request_spec.rb1
-rw-r--r--spec/models/note_spec.rb14
-rw-r--r--spec/models/project_spec.rb4
-rw-r--r--spec/models/project_team_spec.rb26
-rw-r--r--spec/models/repository_spec.rb108
-rw-r--r--spec/models/todo_spec.rb.rb89
-rw-r--r--spec/models/user_spec.rb1
-rw-r--r--spec/requests/api/builds_spec.rb162
-rw-r--r--spec/requests/api/repositories_spec.rb13
-rw-r--r--spec/requests/api/runners_spec.rb464
-rw-r--r--spec/requests/ci/api/builds_spec.rb44
-rw-r--r--spec/services/archive_repository_service_spec.rb25
-rw-r--r--spec/services/ci/create_builds_service_spec.rb28
-rw-r--r--spec/services/git_push_service_spec.rb73
-rw-r--r--spec/services/issues/close_service_spec.rb6
-rw-r--r--spec/services/issues/create_service_spec.rb23
-rw-r--r--spec/services/issues/update_service_spec.rb69
-rw-r--r--spec/services/merge_requests/close_service_spec.rb5
-rw-r--r--spec/services/merge_requests/create_service_spec.rb42
-rw-r--r--spec/services/merge_requests/merge_when_build_succeeds_service_spec.rb82
-rw-r--r--spec/services/merge_requests/update_service_spec.rb79
-rw-r--r--spec/services/notes/post_process_service_spec.rb1
-rw-r--r--spec/services/notes/update_service_spec.rb45
-rw-r--r--spec/services/todo_service_spec.rb264
-rw-r--r--spec/support/workhorse_helpers.rb16
-rw-r--r--spec/workers/repository_fork_worker_spec.rb12
-rw-r--r--spec/workers/repository_import_worker_spec.rb19
281 files changed, 26221 insertions, 3861 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 1c4d98ea3f6..8a729f957a2 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,4 +1,4 @@
-image: "ruby:2.2"
+image: "ruby:2.1"
services:
- mysql:latest
@@ -6,7 +6,7 @@ services:
- redis:latest
cache:
- key: "ruby22"
+ key: "ruby21"
paths:
- vendor
@@ -140,87 +140,87 @@ bundler:audit:
- mysql
allow_failure: true
-# Ruby 2.1 jobs
+# Ruby 2.2 jobs
-spec:feature:ruby21:
- image: ruby:2.1
+spec:feature:ruby22:
+ image: ruby:2.2
only:
- master
script:
- RAILS_ENV=test bundle exec rake assets:precompile 2>/dev/null
- RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:feature
cache:
- key: "ruby21"
+ key: "ruby22"
paths:
- vendor
tags:
- ruby
- mysql
-spec:api:ruby21:
- image: ruby:2.1
+spec:api:ruby22:
+ image: ruby:2.2
only:
- master
script:
- RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:api
cache:
- key: "ruby21"
+ key: "ruby22"
paths:
- vendor
tags:
- ruby
- mysql
-spec:models:ruby21:
- image: ruby:2.1
+spec:models:ruby22:
+ image: ruby:2.2
only:
- master
script:
- RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:models
cache:
- key: "ruby21"
+ key: "ruby22"
paths:
- vendor
tags:
- ruby
- mysql
-spec:lib:ruby21:
- image: ruby:2.1
+spec:lib:ruby22:
+ image: ruby:2.2
only:
- master
script:
- RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:lib
cache:
- key: "ruby21"
+ key: "ruby22"
paths:
- vendor
tags:
- ruby
- mysql
-spec:services:ruby21:
- image: ruby:2.1
+spec:services:ruby22:
+ image: ruby:2.2
only:
- master
script:
- RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:services
cache:
- key: "ruby21"
+ key: "ruby22"
paths:
- vendor
tags:
- ruby
- mysql
-spec:benchmark:ruby21:
- image: ruby:2.1
+spec:benchmark:ruby22:
+ image: ruby:2.2
only:
- master
script:
- RAILS_ENV=test bundle exec rake spec:benchmark
cache:
- key: "ruby21"
+ key: "ruby22"
paths:
- vendor
tags:
@@ -228,56 +228,56 @@ spec:benchmark:ruby21:
- mysql
allow_failure: true
-spec:other:ruby21:
- image: ruby:2.1
+spec:other:ruby22:
+ image: ruby:2.2
only:
- master
script:
- RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:other
cache:
- key: "ruby21"
+ key: "ruby22"
paths:
- vendor
tags:
- ruby
- mysql
-spinach:project:half:ruby21:
- image: ruby:2.1
+spinach:project:half:ruby22:
+ image: ruby:2.2
only:
- master
script:
- RAILS_ENV=test SIMPLECOV=true bundle exec rake spinach:project:half
cache:
- key: "ruby21"
+ key: "ruby22"
paths:
- vendor
tags:
- ruby
- mysql
-spinach:project:rest:ruby21:
- image: ruby:2.1
+spinach:project:rest:ruby22:
+ image: ruby:2.2
only:
- master
script:
- RAILS_ENV=test SIMPLECOV=true bundle exec rake spinach:project:rest
cache:
- key: "ruby21"
+ key: "ruby22"
paths:
- vendor
tags:
- ruby
- mysql
-spinach:other:ruby21:
- image: ruby:2.1
+spinach:other:ruby22:
+ image: ruby:2.2
only:
- master
script:
- RAILS_ENV=test SIMPLECOV=true bundle exec rake spinach:other
cache:
- key: "ruby21"
+ key: "ruby22"
paths:
- vendor
tags:
diff --git a/.ruby-version b/.ruby-version
index 530cdd91a20..ebf14b46981 100644
--- a/.ruby-version
+++ b/.ruby-version
@@ -1 +1 @@
-2.2.4
+2.1.8
diff --git a/CHANGELOG b/CHANGELOG
index 74bc366d203..7fcb4628058 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,8 @@
Please view this file on the master branch, on stable branches it's out of date.
-v 8.5.0 (unreleased)
+v 8.6.0 (unreleased)
+
+v 8.5.0
- Fix duplicate "me" in tooltip of the "thumbsup" awards Emoji (Stan Hu)
- Cache various Repository methods to improve performance (Yorick Peterse)
- Fix duplicated branch creation/deletion Web hooks/service notifications when using Web UI (Stan Hu)
@@ -46,22 +48,38 @@ v 8.5.0 (unreleased)
- Deprecate API "merge_request/:merge_request_id/comments". Use "merge_requests/:merge_request_id/notes" instead
- Deprecate API "merge_request/:merge_request_id/...". Use "merge_requests/:merge_request_id/..." instead
- Prevent parse error when name of project ends with .atom and prevent path issues
+ - Discover branches for commit statuses ref-less when doing merge when succeeded
- Mark inline difference between old and new paths when a file is renamed
- Support Akismet spam checking for creation of issues via API (Stan Hu)
- API: Allow to set or update a merge-request's milestone (Kirill Skachkov)
- Improve UI consistency between projects and groups lists
- Add sort dropdown to dashboard projects page
- Fixed logo animation on Safari (Roman Rott)
+ - Fix Merge When Succeeded when multiple stages
- Hide remove source branch button when the MR is merged but new commits are pushed (Zeger-Jan van de Weg)
- In seach autocomplete show only groups and projects you are member of
- Don't process cross-reference notes from forks
- Fix: init.d script not working on OS X
- Faster snippet search
+ - Added API to download build artifacts
- Title for milestones should be unique (Zeger-Jan van de Weg)
- Validate correctness of maximum attachment size application setting
- Replaces "Create merge request" link with one to the "Merge Request" when one exists
- Fix CI builds badge, add a new link to builds badge, deprecate the old one
- Fix broken link to project in build notification emails
+ - Ability to see and sort on vote count from Issues and MR lists
+ - Fix builds scheduler when first build in stage was allowed to fail
+ - User project limit is reached notice is hidden if the projects limit is zero
+ - Add API support for managing runners and project's runners
+ - Allow SAML users to login with no previous account without having to allow
+ all Omniauth providers to do so.
+ - Allow existing users to auto link their SAML credentials by logging in via SAML
+ - Make it possible to erase a build (trace, artifacts) using UI and API
+ - Ability to revert changes from a Merge Request or Commit
+ - Emoji comment on diffs are not award emoji
+ - Add label description (Nuttanart Pornprasitsakul)
+ - Show label row when filtering issues or merge requests by label (Nuttanart Pornprasitsakul)
+ - Add Todos
v 8.4.4
- Update omniauth-saml gem to 1.4.2
diff --git a/GITLAB_WORKHORSE_VERSION b/GITLAB_WORKHORSE_VERSION
index d2b13eb644d..ef5e4454454 100644
--- a/GITLAB_WORKHORSE_VERSION
+++ b/GITLAB_WORKHORSE_VERSION
@@ -1 +1 @@
-0.6.4
+0.6.5
diff --git a/Gemfile b/Gemfile
index a1c57af4bac..1602ef871c7 100644
--- a/Gemfile
+++ b/Gemfile
@@ -50,7 +50,7 @@ gem "browser", '~> 1.0.0'
# Extracting information from a git repository
# Provide access to Gitlab::Git library
-gem "gitlab_git", '~> 8.1'
+gem "gitlab_git", '~> 8.2'
# LDAP Auth
# GitLab fork with several improvements to original library. For full list of changes
@@ -112,7 +112,7 @@ gem 'diffy', '~> 3.0.3'
# Application server
group :unicorn do
- gem "unicorn", '~> 4.8.2'
+ gem "unicorn", '~> 4.9.0'
gem 'unicorn-worker-killer', '~> 0.4.2'
end
@@ -204,7 +204,7 @@ gem 'jquery-turbolinks', '~> 2.1.0'
gem 'addressable', '~> 2.3.8'
gem 'bootstrap-sass', '~> 3.3.0'
gem 'font-awesome-rails', '~> 4.2'
-gem 'gitlab_emoji', '~> 0.2.0'
+gem 'gitlab_emoji', '~> 0.3.0'
gem 'gon', '~> 6.0.1'
gem 'jquery-atwho-rails', '~> 1.3.2'
gem 'jquery-rails', '~> 4.0.0'
diff --git a/Gemfile.lock b/Gemfile.lock
index 718285e1665..4681adf2bd0 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -50,7 +50,7 @@ GEM
after_commit_queue (1.3.0)
activerecord (>= 3.0)
akismet (2.0.0)
- allocations (1.0.3)
+ allocations (1.0.4)
annotate (2.6.10)
activerecord (>= 3.2, <= 4.3)
rake (~> 10.4)
@@ -336,11 +336,11 @@ GEM
ruby-progressbar (~> 1.4)
gemnasium-gitlab-service (0.2.6)
rugged (~> 0.21)
- gemojione (2.1.1)
+ gemojione (2.2.1)
json
get_process_mem (0.2.0)
gherkin-ruby (0.3.2)
- github-linguist (4.7.3)
+ github-linguist (4.7.5)
charlock_holmes (~> 0.7.3)
escape_utils (~> 1.1.0)
mime-types (>= 1.19)
@@ -355,13 +355,13 @@ GEM
diff-lcs (~> 1.1)
mime-types (~> 1.15)
posix-spawn (~> 0.3)
- gitlab_emoji (0.2.0)
- gemojione (~> 2.1)
- gitlab_git (8.1.0)
+ gitlab_emoji (0.3.1)
+ gemojione (~> 2.2, >= 2.2.1)
+ gitlab_git (8.2.0)
activesupport (~> 4.0)
charlock_holmes (~> 0.7.3)
github-linguist (~> 4.7.0)
- rugged (~> 0.23.3)
+ rugged (~> 0.24.0b13)
gitlab_meta (7.0)
gitlab_omniauth-ldap (1.2.1)
net-ldap (~> 0.9)
@@ -700,7 +700,7 @@ GEM
rubyntlm (0.5.2)
rubypants (0.2.0)
rufus-scheduler (3.1.10)
- rugged (0.23.3)
+ rugged (0.24.0b13)
safe_yaml (1.0.4)
sanitize (2.1.0)
nokogiri (>= 1.4.4)
@@ -833,7 +833,7 @@ GEM
unf (0.1.4)
unf_ext
unf_ext (0.0.7.1)
- unicorn (4.8.3)
+ unicorn (4.9.0)
kgio (~> 2.6)
rack
raindrops (~> 0.7)
@@ -931,8 +931,8 @@ DEPENDENCIES
github-linguist (~> 4.7.0)
github-markup (~> 1.3.1)
gitlab-flowdock-git-hook (~> 1.0.1)
- gitlab_emoji (~> 0.2.0)
- gitlab_git (~> 8.1)
+ gitlab_emoji (~> 0.3.0)
+ gitlab_git (~> 8.2)
gitlab_meta (= 7.0)
gitlab_omniauth-ldap (~> 1.2.1)
gollum-lib (~> 4.1.0)
@@ -1034,7 +1034,7 @@ DEPENDENCIES
uglifier (~> 2.7.2)
underscore-rails (~> 1.8.0)
unf (~> 0.1.4)
- unicorn (~> 4.8.2)
+ unicorn (~> 4.9.0)
unicorn-worker-killer (~> 0.4.2)
version_sorter (~> 2.0.0)
virtus (~> 1.0.1)
diff --git a/README.md b/README.md
index 22dbf841bdc..3ec1d4a776c 100644
--- a/README.md
+++ b/README.md
@@ -67,7 +67,7 @@ Instructions on how to start GitLab and how to run the tests can be found in the
GitLab is a Ruby on Rails application that runs on the following software:
- Ubuntu/Debian/CentOS/RHEL
-- Ruby (MRI) 2.1 or 2.2
+- Ruby (MRI) 2.1
- Git 1.7.10+
- Redis 2.8+
- MySQL or PostgreSQL
diff --git a/VERSION b/VERSION
index ffec98087cb..cac7d91adda 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-8.5.0-pre
+8.6.0-pre
diff --git a/app/assets/images/emoji.png b/app/assets/images/emoji.png
index a8ad7b6eab6..1e7cf79ea45 100644
--- a/app/assets/images/emoji.png
+++ b/app/assets/images/emoji.png
Binary files differ
diff --git a/app/assets/images/emoji@2x.png b/app/assets/images/emoji@2x.png
new file mode 100644
index 00000000000..74d67f7520d
--- /dev/null
+++ b/app/assets/images/emoji@2x.png
Binary files differ
diff --git a/app/assets/javascripts/dispatcher.js.coffee b/app/assets/javascripts/dispatcher.js.coffee
index b17f8e51470..407005d8adf 100644
--- a/app/assets/javascripts/dispatcher.js.coffee
+++ b/app/assets/javascripts/dispatcher.js.coffee
@@ -91,7 +91,7 @@ class Dispatcher
new TreeView()
when 'projects:find_file:show'
shortcut_handler = true
- when 'projects:blob:show'
+ when 'projects:blob:show', 'projects:blame:show'
new LineHighlighter()
shortcut_handler = new ShortcutsNavigation()
when 'projects:labels:new', 'projects:labels:edit'
diff --git a/app/assets/javascripts/issuable_context.js.coffee b/app/assets/javascripts/issuable_context.js.coffee
index d17b1123418..e52b73f94f6 100644
--- a/app/assets/javascripts/issuable_context.js.coffee
+++ b/app/assets/javascripts/issuable_context.js.coffee
@@ -15,3 +15,5 @@ class @IssuableContext
block.find('.selectbox').show()
block.find('.value').hide()
block.find('.js-select2').select2("open")
+
+ $(".right-sidebar").niceScroll()
diff --git a/app/assets/javascripts/merge_request_tabs.js.coffee b/app/assets/javascripts/merge_request_tabs.js.coffee
index b10e1db7f3f..6f569f9e1aa 100644
--- a/app/assets/javascripts/merge_request_tabs.js.coffee
+++ b/app/assets/javascripts/merge_request_tabs.js.coffee
@@ -146,6 +146,7 @@ class @MergeRequestTabs
success: (data) =>
document.querySelector("div#diffs").innerHTML = data.html
$('div#diffs .js-syntax-highlight').syntaxHighlight()
+ @expandViewContainer() if @diffViewType() is 'parallel'
@diffsLoaded = true
@scrollToElement("#diffs")
@@ -177,3 +178,10 @@ class @MergeRequestTabs
options = $.extend({}, defaults, options)
$.ajax(options)
+
+ # Returns diff view type
+ diffViewType: ->
+ $('.inline-parallel-buttons a.active').data('view-type')
+
+ expandViewContainer: ->
+ $('.container-fluid').removeClass('container-limited')
diff --git a/app/assets/javascripts/milestone.js.coffee b/app/assets/javascripts/milestone.js.coffee
index d644d50b669..31f6c6d3d47 100644
--- a/app/assets/javascripts/milestone.js.coffee
+++ b/app/assets/javascripts/milestone.js.coffee
@@ -64,6 +64,7 @@ class @Milestone
constructor: ->
@bindIssuesSorting()
@bindMergeRequestSorting()
+ @bindTabsSwitching
bindIssuesSorting: ->
$("#issues-list-unassigned, #issues-list-ongoing, #issues-list-closed").sortable(
@@ -122,3 +123,12 @@ class @Milestone
Milestone.updateMergeRequest(ui.item, merge_request_url, data)
).disableSelection()
+
+ bindMergeRequestSorting: ->
+ $('a[data-toggle="tab"]').on 'show.bs.tab', (e) ->
+ currentTabClass = $(e.target).data('show')
+ previousTabClass = $(e.relatedTarget).data('show')
+
+ $(previousTabClass).hide()
+ $(currentTabClass).removeClass('hidden')
+ $(currentTabClass).show()
diff --git a/app/assets/stylesheets/framework/common.scss b/app/assets/stylesheets/framework/common.scss
index ea56d9e12a0..0ddbf612543 100644
--- a/app/assets/stylesheets/framework/common.scss
+++ b/app/assets/stylesheets/framework/common.scss
@@ -377,7 +377,6 @@ table {
}
.project-item-select-holder {
- display: inline-block;
position: relative;
.project-item-select {
diff --git a/app/assets/stylesheets/framework/gitlab-theme.scss b/app/assets/stylesheets/framework/gitlab-theme.scss
index 8d9a0aae568..12cef6f8ea1 100644
--- a/app/assets/stylesheets/framework/gitlab-theme.scss
+++ b/app/assets/stylesheets/framework/gitlab-theme.scss
@@ -117,4 +117,4 @@ body {
&.ui_violet {
@include gitlab-theme(#9988CC, $theme-violet, #443366, #332255);
}
-}
+} \ No newline at end of file
diff --git a/app/assets/stylesheets/framework/header.scss b/app/assets/stylesheets/framework/header.scss
index 93d74bf30f1..24e7d971768 100644
--- a/app/assets/stylesheets/framework/header.scss
+++ b/app/assets/stylesheets/framework/header.scss
@@ -77,6 +77,7 @@ header {
line-height: $header-height;
font-weight: normal;
color: #4c4e54;
+ overflow: hidden;
text-overflow: ellipsis;
vertical-align: top;
white-space: nowrap;
diff --git a/app/assets/stylesheets/framework/highlight.scss b/app/assets/stylesheets/framework/highlight.scss
index 9854df4c45c..12e2f00fe89 100644
--- a/app/assets/stylesheets/framework/highlight.scss
+++ b/app/assets/stylesheets/framework/highlight.scss
@@ -44,8 +44,10 @@
white-space: nowrap;
i {
+ float: left;
+ margin-top: 3px;
+ margin-right: 5px;
visibility: hidden;
- @extend .pull-left;
}
&:hover i {
diff --git a/app/assets/stylesheets/framework/issue_box.scss b/app/assets/stylesheets/framework/issue_box.scss
index 08dcb563dce..5d7fd36be16 100644
--- a/app/assets/stylesheets/framework/issue_box.scss
+++ b/app/assets/stylesheets/framework/issue_box.scss
@@ -6,31 +6,28 @@
.status-box {
@include border-radius(3px);
-
display: block;
float: left;
padding: 0 $gl-btn-padding;
- font-weight: normal;
+ margin-top: 5px;
margin-right: 10px;
+ color: #FFF;
font-size: $gl-font-size;
+ line-height: 25px;
&.status-box-closed {
background-color: $gl-danger;
- color: #FFF;
}
&.status-box-merged {
background-color: $gl-primary;
- color: #FFF;
}
&.status-box-open {
background-color: $green-light;
- color: #FFF;
}
&.status-box-expired {
background: #cea61b;
- color: #FFF;
}
}
diff --git a/app/assets/stylesheets/pages/detail_page.scss b/app/assets/stylesheets/pages/detail_page.scss
index 529a43548c8..d93b6ee6733 100644
--- a/app/assets/stylesheets/pages/detail_page.scss
+++ b/app/assets/stylesheets/pages/detail_page.scss
@@ -12,6 +12,14 @@
.identifier {
color: #5c5d5e;
}
+
+ .issue_created_ago, .author_link {
+ white-space: nowrap;
+ }
+
+ .issue-meta {
+ margin-left: 65px
+ }
}
.detail-page-description {
diff --git a/app/assets/stylesheets/pages/emojis.scss b/app/assets/stylesheets/pages/emojis.scss
index 89a94c5a780..6c721b514f8 100644
--- a/app/assets/stylesheets/pages/emojis.scss
+++ b/app/assets/stylesheets/pages/emojis.scss
@@ -1,1272 +1,1736 @@
-/*
-File is generated by https://github.com/jakesgordon/sprite-factory and midified manualy
-The source: gemojione gem.
-*/
+.emoji-0023-20E3 { background-position: 0px 0px; }
+.emoji-002A-20E3 { background-position: -20px 0px; }
+.emoji-0030-20E3 { background-position: 0px -20px; }
+.emoji-0031-20E3 { background-position: -20px -20px; }
+.emoji-0032-20E3 { background-position: -40px 0px; }
+.emoji-0033-20E3 { background-position: -40px -20px; }
+.emoji-0034-20E3 { background-position: 0px -40px; }
+.emoji-0035-20E3 { background-position: -20px -40px; }
+.emoji-0036-20E3 { background-position: -40px -40px; }
+.emoji-0037-20E3 { background-position: -60px 0px; }
+.emoji-0038-20E3 { background-position: -60px -20px; }
+.emoji-0039-20E3 { background-position: -60px -40px; }
+.emoji-00A9 { background-position: 0px -60px; }
+.emoji-00AE { background-position: -20px -60px; }
+.emoji-1F004 { background-position: -40px -60px; }
+.emoji-1F0CF { background-position: -60px -60px; }
+.emoji-1F170 { background-position: -80px 0px; }
+.emoji-1F171 { background-position: -80px -20px; }
+.emoji-1F17E { background-position: -80px -40px; }
+.emoji-1F17F { background-position: -80px -60px; }
+.emoji-1F18E { background-position: 0px -80px; }
+.emoji-1F191 { background-position: -20px -80px; }
+.emoji-1F192 { background-position: -40px -80px; }
+.emoji-1F193 { background-position: -60px -80px; }
+.emoji-1F194 { background-position: -80px -80px; }
+.emoji-1F195 { background-position: -100px 0px; }
+.emoji-1F196 { background-position: -100px -20px; }
+.emoji-1F197 { background-position: -100px -40px; }
+.emoji-1F198 { background-position: -100px -60px; }
+.emoji-1F199 { background-position: -100px -80px; }
+.emoji-1F19A { background-position: 0px -100px; }
+.emoji-1F1E6-1F1E8 { background-position: -20px -100px; }
+.emoji-1F1E6-1F1E9 { background-position: -40px -100px; }
+.emoji-1F1E6-1F1EA { background-position: -60px -100px; }
+.emoji-1F1E6-1F1EB { background-position: -80px -100px; }
+.emoji-1F1E6-1F1EC { background-position: -100px -100px; }
+.emoji-1F1E6-1F1EE { background-position: -120px 0px; }
+.emoji-1F1E6-1F1F1 { background-position: -120px -20px; }
+.emoji-1F1E6-1F1F2 { background-position: -120px -40px; }
+.emoji-1F1E6-1F1F4 { background-position: -120px -60px; }
+.emoji-1F1E6-1F1F6 { background-position: -120px -80px; }
+.emoji-1F1E6-1F1F7 { background-position: -120px -100px; }
+.emoji-1F1E6-1F1F8 { background-position: 0px -120px; }
+.emoji-1F1E6-1F1F9 { background-position: -20px -120px; }
+.emoji-1F1E6-1F1FA { background-position: -40px -120px; }
+.emoji-1F1E6-1F1FC { background-position: -60px -120px; }
+.emoji-1F1E6-1F1FD { background-position: -80px -120px; }
+.emoji-1F1E6-1F1FF { background-position: -100px -120px; }
+.emoji-1F1E7-1F1E6 { background-position: -120px -120px; }
+.emoji-1F1E7-1F1E7 { background-position: -140px 0px; }
+.emoji-1F1E7-1F1E9 { background-position: -140px -20px; }
+.emoji-1F1E7-1F1EA { background-position: -140px -40px; }
+.emoji-1F1E7-1F1EB { background-position: -140px -60px; }
+.emoji-1F1E7-1F1EC { background-position: -140px -80px; }
+.emoji-1F1E7-1F1ED { background-position: -140px -100px; }
+.emoji-1F1E7-1F1EE { background-position: -140px -120px; }
+.emoji-1F1E7-1F1EF { background-position: 0px -140px; }
+.emoji-1F1E7-1F1F1 { background-position: -20px -140px; }
+.emoji-1F1E7-1F1F2 { background-position: -40px -140px; }
+.emoji-1F1E7-1F1F3 { background-position: -60px -140px; }
+.emoji-1F1E7-1F1F4 { background-position: -80px -140px; }
+.emoji-1F1E7-1F1F6 { background-position: -100px -140px; }
+.emoji-1F1E7-1F1F7 { background-position: -120px -140px; }
+.emoji-1F1E7-1F1F8 { background-position: -140px -140px; }
+.emoji-1F1E7-1F1F9 { background-position: -160px 0px; }
+.emoji-1F1E7-1F1FB { background-position: -160px -20px; }
+.emoji-1F1E7-1F1FC { background-position: -160px -40px; }
+.emoji-1F1E7-1F1FE { background-position: -160px -60px; }
+.emoji-1F1E7-1F1FF { background-position: -160px -80px; }
+.emoji-1F1E8-1F1E6 { background-position: -160px -100px; }
+.emoji-1F1E8-1F1E8 { background-position: -160px -120px; }
+.emoji-1F1E8-1F1E9 { background-position: -160px -140px; }
+.emoji-1F1E8-1F1EB { background-position: 0px -160px; }
+.emoji-1F1E8-1F1EC { background-position: -20px -160px; }
+.emoji-1F1E8-1F1ED { background-position: -40px -160px; }
+.emoji-1F1E8-1F1EE { background-position: -60px -160px; }
+.emoji-1F1E8-1F1F0 { background-position: -80px -160px; }
+.emoji-1F1E8-1F1F1 { background-position: -100px -160px; }
+.emoji-1F1E8-1F1F2 { background-position: -120px -160px; }
+.emoji-1F1E8-1F1F3 { background-position: -140px -160px; }
+.emoji-1F1E8-1F1F4 { background-position: -160px -160px; }
+.emoji-1F1E8-1F1F5 { background-position: -180px 0px; }
+.emoji-1F1E8-1F1F7 { background-position: -180px -20px; }
+.emoji-1F1E8-1F1FA { background-position: -180px -40px; }
+.emoji-1F1E8-1F1FB { background-position: -180px -60px; }
+.emoji-1F1E8-1F1FC { background-position: -180px -80px; }
+.emoji-1F1E8-1F1FD { background-position: -180px -100px; }
+.emoji-1F1E8-1F1FE { background-position: -180px -120px; }
+.emoji-1F1E8-1F1FF { background-position: -180px -140px; }
+.emoji-1F1E9-1F1EA { background-position: -180px -160px; }
+.emoji-1F1E9-1F1EC { background-position: 0px -180px; }
+.emoji-1F1E9-1F1EF { background-position: -20px -180px; }
+.emoji-1F1E9-1F1F0 { background-position: -40px -180px; }
+.emoji-1F1E9-1F1F2 { background-position: -60px -180px; }
+.emoji-1F1E9-1F1F4 { background-position: -80px -180px; }
+.emoji-1F1E9-1F1FF { background-position: -100px -180px; }
+.emoji-1F1EA-1F1E6 { background-position: -120px -180px; }
+.emoji-1F1EA-1F1E8 { background-position: -140px -180px; }
+.emoji-1F1EA-1F1EA { background-position: -160px -180px; }
+.emoji-1F1EA-1F1EC { background-position: -180px -180px; }
+.emoji-1F1EA-1F1ED { background-position: -200px 0px; }
+.emoji-1F1EA-1F1F7 { background-position: -200px -20px; }
+.emoji-1F1EA-1F1F8 { background-position: -200px -40px; }
+.emoji-1F1EA-1F1F9 { background-position: -200px -60px; }
+.emoji-1F1EA-1F1FA { background-position: -200px -80px; }
+.emoji-1F1EB-1F1EE { background-position: -200px -100px; }
+.emoji-1F1EB-1F1EF { background-position: -200px -120px; }
+.emoji-1F1EB-1F1F0 { background-position: -200px -140px; }
+.emoji-1F1EB-1F1F2 { background-position: -200px -160px; }
+.emoji-1F1EB-1F1F4 { background-position: -200px -180px; }
+.emoji-1F1EB-1F1F7 { background-position: 0px -200px; }
+.emoji-1F1EC-1F1E6 { background-position: -20px -200px; }
+.emoji-1F1EC-1F1E7 { background-position: -40px -200px; }
+.emoji-1F1EC-1F1E9 { background-position: -60px -200px; }
+.emoji-1F1EC-1F1EA { background-position: -80px -200px; }
+.emoji-1F1EC-1F1EB { background-position: -100px -200px; }
+.emoji-1F1EC-1F1EC { background-position: -120px -200px; }
+.emoji-1F1EC-1F1ED { background-position: -140px -200px; }
+.emoji-1F1EC-1F1EE { background-position: -160px -200px; }
+.emoji-1F1EC-1F1F1 { background-position: -180px -200px; }
+.emoji-1F1EC-1F1F2 { background-position: -200px -200px; }
+.emoji-1F1EC-1F1F3 { background-position: -220px 0px; }
+.emoji-1F1EC-1F1F5 { background-position: -220px -20px; }
+.emoji-1F1EC-1F1F6 { background-position: -220px -40px; }
+.emoji-1F1EC-1F1F7 { background-position: -220px -60px; }
+.emoji-1F1EC-1F1F8 { background-position: -220px -80px; }
+.emoji-1F1EC-1F1F9 { background-position: -220px -100px; }
+.emoji-1F1EC-1F1FA { background-position: -220px -120px; }
+.emoji-1F1EC-1F1FC { background-position: -220px -140px; }
+.emoji-1F1EC-1F1FE { background-position: -220px -160px; }
+.emoji-1F1ED-1F1F0 { background-position: -220px -180px; }
+.emoji-1F1ED-1F1F2 { background-position: -220px -200px; }
+.emoji-1F1ED-1F1F3 { background-position: 0px -220px; }
+.emoji-1F1ED-1F1F7 { background-position: -20px -220px; }
+.emoji-1F1ED-1F1F9 { background-position: -40px -220px; }
+.emoji-1F1ED-1F1FA { background-position: -60px -220px; }
+.emoji-1F1EE-1F1E8 { background-position: -80px -220px; }
+.emoji-1F1EE-1F1E9 { background-position: -100px -220px; }
+.emoji-1F1EE-1F1EA { background-position: -120px -220px; }
+.emoji-1F1EE-1F1F1 { background-position: -140px -220px; }
+.emoji-1F1EE-1F1F2 { background-position: -160px -220px; }
+.emoji-1F1EE-1F1F3 { background-position: -180px -220px; }
+.emoji-1F1EE-1F1F4 { background-position: -200px -220px; }
+.emoji-1F1EE-1F1F6 { background-position: -220px -220px; }
+.emoji-1F1EE-1F1F7 { background-position: -240px 0px; }
+.emoji-1F1EE-1F1F8 { background-position: -240px -20px; }
+.emoji-1F1EE-1F1F9 { background-position: -240px -40px; }
+.emoji-1F1EF-1F1EA { background-position: -240px -60px; }
+.emoji-1F1EF-1F1F2 { background-position: -240px -80px; }
+.emoji-1F1EF-1F1F4 { background-position: -240px -100px; }
+.emoji-1F1EF-1F1F5 { background-position: -240px -120px; }
+.emoji-1F1F0-1F1EA { background-position: -240px -140px; }
+.emoji-1F1F0-1F1EC { background-position: -240px -160px; }
+.emoji-1F1F0-1F1ED { background-position: -240px -180px; }
+.emoji-1F1F0-1F1EE { background-position: -240px -200px; }
+.emoji-1F1F0-1F1F2 { background-position: -240px -220px; }
+.emoji-1F1F0-1F1F3 { background-position: 0px -240px; }
+.emoji-1F1F0-1F1F5 { background-position: -20px -240px; }
+.emoji-1F1F0-1F1F7 { background-position: -40px -240px; }
+.emoji-1F1F0-1F1FC { background-position: -60px -240px; }
+.emoji-1F1F0-1F1FE { background-position: -80px -240px; }
+.emoji-1F1F0-1F1FF { background-position: -100px -240px; }
+.emoji-1F1F1-1F1E6 { background-position: -120px -240px; }
+.emoji-1F1F1-1F1E7 { background-position: -140px -240px; }
+.emoji-1F1F1-1F1E8 { background-position: -160px -240px; }
+.emoji-1F1F1-1F1EE { background-position: -180px -240px; }
+.emoji-1F1F1-1F1F0 { background-position: -200px -240px; }
+.emoji-1F1F1-1F1F7 { background-position: -220px -240px; }
+.emoji-1F1F1-1F1F8 { background-position: -240px -240px; }
+.emoji-1F1F1-1F1F9 { background-position: -260px 0px; }
+.emoji-1F1F1-1F1FA { background-position: -260px -20px; }
+.emoji-1F1F1-1F1FB { background-position: -260px -40px; }
+.emoji-1F1F1-1F1FE { background-position: -260px -60px; }
+.emoji-1F1F2-1F1E6 { background-position: -260px -80px; }
+.emoji-1F1F2-1F1E8 { background-position: -260px -100px; }
+.emoji-1F1F2-1F1E9 { background-position: -260px -120px; }
+.emoji-1F1F2-1F1EA { background-position: -260px -140px; }
+.emoji-1F1F2-1F1EB { background-position: -260px -160px; }
+.emoji-1F1F2-1F1EC { background-position: -260px -180px; }
+.emoji-1F1F2-1F1ED { background-position: -260px -200px; }
+.emoji-1F1F2-1F1F0 { background-position: -260px -220px; }
+.emoji-1F1F2-1F1F1 { background-position: -260px -240px; }
+.emoji-1F1F2-1F1F2 { background-position: 0px -260px; }
+.emoji-1F1F2-1F1F3 { background-position: -20px -260px; }
+.emoji-1F1F2-1F1F4 { background-position: -40px -260px; }
+.emoji-1F1F2-1F1F5 { background-position: -60px -260px; }
+.emoji-1F1F2-1F1F6 { background-position: -80px -260px; }
+.emoji-1F1F2-1F1F7 { background-position: -100px -260px; }
+.emoji-1F1F2-1F1F8 { background-position: -120px -260px; }
+.emoji-1F1F2-1F1F9 { background-position: -140px -260px; }
+.emoji-1F1F2-1F1FA { background-position: -160px -260px; }
+.emoji-1F1F2-1F1FB { background-position: -180px -260px; }
+.emoji-1F1F2-1F1FC { background-position: -200px -260px; }
+.emoji-1F1F2-1F1FD { background-position: -220px -260px; }
+.emoji-1F1F2-1F1FE { background-position: -240px -260px; }
+.emoji-1F1F2-1F1FF { background-position: -260px -260px; }
+.emoji-1F1F3-1F1E6 { background-position: -280px 0px; }
+.emoji-1F1F3-1F1E8 { background-position: -280px -20px; }
+.emoji-1F1F3-1F1EA { background-position: -280px -40px; }
+.emoji-1F1F3-1F1EB { background-position: -280px -60px; }
+.emoji-1F1F3-1F1EC { background-position: -280px -80px; }
+.emoji-1F1F3-1F1EE { background-position: -280px -100px; }
+.emoji-1F1F3-1F1F1 { background-position: -280px -120px; }
+.emoji-1F1F3-1F1F4 { background-position: -280px -140px; }
+.emoji-1F1F3-1F1F5 { background-position: -280px -160px; }
+.emoji-1F1F3-1F1F7 { background-position: -280px -180px; }
+.emoji-1F1F3-1F1FA { background-position: -280px -200px; }
+.emoji-1F1F3-1F1FF { background-position: -280px -220px; }
+.emoji-1F1F4-1F1F2 { background-position: -280px -240px; }
+.emoji-1F1F5-1F1E6 { background-position: -280px -260px; }
+.emoji-1F1F5-1F1EA { background-position: 0px -280px; }
+.emoji-1F1F5-1F1EB { background-position: -20px -280px; }
+.emoji-1F1F5-1F1EC { background-position: -40px -280px; }
+.emoji-1F1F5-1F1ED { background-position: -60px -280px; }
+.emoji-1F1F5-1F1F0 { background-position: -80px -280px; }
+.emoji-1F1F5-1F1F1 { background-position: -100px -280px; }
+.emoji-1F1F5-1F1F2 { background-position: -120px -280px; }
+.emoji-1F1F5-1F1F3 { background-position: -140px -280px; }
+.emoji-1F1F5-1F1F7 { background-position: -160px -280px; }
+.emoji-1F1F5-1F1F8 { background-position: -180px -280px; }
+.emoji-1F1F5-1F1F9 { background-position: -200px -280px; }
+.emoji-1F1F5-1F1FC { background-position: -220px -280px; }
+.emoji-1F1F5-1F1FE { background-position: -240px -280px; }
+.emoji-1F1F6-1F1E6 { background-position: -260px -280px; }
+.emoji-1F1F7-1F1EA { background-position: -280px -280px; }
+.emoji-1F1F7-1F1F4 { background-position: -300px 0px; }
+.emoji-1F1F7-1F1F8 { background-position: -300px -20px; }
+.emoji-1F1F7-1F1FA { background-position: -300px -40px; }
+.emoji-1F1F7-1F1FC { background-position: -300px -60px; }
+.emoji-1F1F8-1F1E6 { background-position: -300px -80px; }
+.emoji-1F1F8-1F1E7 { background-position: -300px -100px; }
+.emoji-1F1F8-1F1E8 { background-position: -300px -120px; }
+.emoji-1F1F8-1F1E9 { background-position: -300px -140px; }
+.emoji-1F1F8-1F1EA { background-position: -300px -160px; }
+.emoji-1F1F8-1F1EC { background-position: -300px -180px; }
+.emoji-1F1F8-1F1ED { background-position: -300px -200px; }
+.emoji-1F1F8-1F1EE { background-position: -300px -220px; }
+.emoji-1F1F8-1F1EF { background-position: -300px -240px; }
+.emoji-1F1F8-1F1F0 { background-position: -300px -260px; }
+.emoji-1F1F8-1F1F1 { background-position: -300px -280px; }
+.emoji-1F1F8-1F1F2 { background-position: 0px -300px; }
+.emoji-1F1F8-1F1F3 { background-position: -20px -300px; }
+.emoji-1F1F8-1F1F4 { background-position: -40px -300px; }
+.emoji-1F1F8-1F1F7 { background-position: -60px -300px; }
+.emoji-1F1F8-1F1F8 { background-position: -80px -300px; }
+.emoji-1F1F8-1F1F9 { background-position: -100px -300px; }
+.emoji-1F1F8-1F1FB { background-position: -120px -300px; }
+.emoji-1F1F8-1F1FD { background-position: -140px -300px; }
+.emoji-1F1F8-1F1FE { background-position: -160px -300px; }
+.emoji-1F1F8-1F1FF { background-position: -180px -300px; }
+.emoji-1F1F9-1F1E6 { background-position: -200px -300px; }
+.emoji-1F1F9-1F1E8 { background-position: -220px -300px; }
+.emoji-1F1F9-1F1E9 { background-position: -240px -300px; }
+.emoji-1F1F9-1F1EB { background-position: -260px -300px; }
+.emoji-1F1F9-1F1EC { background-position: -280px -300px; }
+.emoji-1F1F9-1F1ED { background-position: -300px -300px; }
+.emoji-1F1F9-1F1EF { background-position: -320px 0px; }
+.emoji-1F1F9-1F1F0 { background-position: -320px -20px; }
+.emoji-1F1F9-1F1F1 { background-position: -320px -40px; }
+.emoji-1F1F9-1F1F2 { background-position: -320px -60px; }
+.emoji-1F1F9-1F1F3 { background-position: -320px -80px; }
+.emoji-1F1F9-1F1F4 { background-position: -320px -100px; }
+.emoji-1F1F9-1F1F7 { background-position: -320px -120px; }
+.emoji-1F1F9-1F1F9 { background-position: -320px -140px; }
+.emoji-1F1F9-1F1FB { background-position: -320px -160px; }
+.emoji-1F1F9-1F1FC { background-position: -320px -180px; }
+.emoji-1F1F9-1F1FF { background-position: -320px -200px; }
+.emoji-1F1FA-1F1E6 { background-position: -320px -220px; }
+.emoji-1F1FA-1F1EC { background-position: -320px -240px; }
+.emoji-1F1FA-1F1F2 { background-position: -320px -260px; }
+.emoji-1F1FA-1F1F8 { background-position: -320px -280px; }
+.emoji-1F1FA-1F1FE { background-position: -320px -300px; }
+.emoji-1F1FA-1F1FF { background-position: 0px -320px; }
+.emoji-1F1FB-1F1E6 { background-position: -20px -320px; }
+.emoji-1F1FB-1F1E8 { background-position: -40px -320px; }
+.emoji-1F1FB-1F1EA { background-position: -60px -320px; }
+.emoji-1F1FB-1F1EC { background-position: -80px -320px; }
+.emoji-1F1FB-1F1EE { background-position: -100px -320px; }
+.emoji-1F1FB-1F1F3 { background-position: -120px -320px; }
+.emoji-1F1FB-1F1FA { background-position: -140px -320px; }
+.emoji-1F1FC-1F1EB { background-position: -160px -320px; }
+.emoji-1F1FC-1F1F8 { background-position: -180px -320px; }
+.emoji-1F1FD-1F1F0 { background-position: -200px -320px; }
+.emoji-1F1FE-1F1EA { background-position: -220px -320px; }
+.emoji-1F1FE-1F1F9 { background-position: -240px -320px; }
+.emoji-1F1FF-1F1E6 { background-position: -260px -320px; }
+.emoji-1F1FF-1F1F2 { background-position: -280px -320px; }
+.emoji-1F1FF-1F1FC { background-position: -300px -320px; }
+.emoji-1F201 { background-position: -320px -320px; }
+.emoji-1F202 { background-position: -340px 0px; }
+.emoji-1F21A { background-position: -340px -20px; }
+.emoji-1F22F { background-position: -340px -40px; }
+.emoji-1F232 { background-position: -340px -60px; }
+.emoji-1F233 { background-position: -340px -80px; }
+.emoji-1F234 { background-position: -340px -100px; }
+.emoji-1F235 { background-position: -340px -120px; }
+.emoji-1F236 { background-position: -340px -140px; }
+.emoji-1F237 { background-position: -340px -160px; }
+.emoji-1F238 { background-position: -340px -180px; }
+.emoji-1F239 { background-position: -340px -200px; }
+.emoji-1F23A { background-position: -340px -220px; }
+.emoji-1F250 { background-position: -340px -240px; }
+.emoji-1F251 { background-position: -340px -260px; }
+.emoji-1F300 { background-position: -340px -280px; }
+.emoji-1F301 { background-position: -340px -300px; }
+.emoji-1F302 { background-position: -340px -320px; }
+.emoji-1F303 { background-position: 0px -340px; }
+.emoji-1F304 { background-position: -20px -340px; }
+.emoji-1F305 { background-position: -40px -340px; }
+.emoji-1F306 { background-position: -60px -340px; }
+.emoji-1F307 { background-position: -80px -340px; }
+.emoji-1F308 { background-position: -100px -340px; }
+.emoji-1F309 { background-position: -120px -340px; }
+.emoji-1F30A { background-position: -140px -340px; }
+.emoji-1F30B { background-position: -160px -340px; }
+.emoji-1F30C { background-position: -180px -340px; }
+.emoji-1F30D { background-position: -200px -340px; }
+.emoji-1F30E { background-position: -220px -340px; }
+.emoji-1F30F { background-position: -240px -340px; }
+.emoji-1F310 { background-position: -260px -340px; }
+.emoji-1F311 { background-position: -280px -340px; }
+.emoji-1F312 { background-position: -300px -340px; }
+.emoji-1F313 { background-position: -320px -340px; }
+.emoji-1F314 { background-position: -340px -340px; }
+.emoji-1F315 { background-position: -360px 0px; }
+.emoji-1F316 { background-position: -360px -20px; }
+.emoji-1F317 { background-position: -360px -40px; }
+.emoji-1F318 { background-position: -360px -60px; }
+.emoji-1F319 { background-position: -360px -80px; }
+.emoji-1F31A { background-position: -360px -100px; }
+.emoji-1F31B { background-position: -360px -120px; }
+.emoji-1F31C { background-position: -360px -140px; }
+.emoji-1F31D { background-position: -360px -160px; }
+.emoji-1F31E { background-position: -360px -180px; }
+.emoji-1F31F { background-position: -360px -200px; }
+.emoji-1F320 { background-position: -360px -220px; }
+.emoji-1F321 { background-position: -360px -240px; }
+.emoji-1F324 { background-position: -360px -260px; }
+.emoji-1F325 { background-position: -360px -280px; }
+.emoji-1F326 { background-position: -360px -300px; }
+.emoji-1F327 { background-position: -360px -320px; }
+.emoji-1F328 { background-position: -360px -340px; }
+.emoji-1F329 { background-position: 0px -360px; }
+.emoji-1F32A { background-position: -20px -360px; }
+.emoji-1F32B { background-position: -40px -360px; }
+.emoji-1F32C { background-position: -60px -360px; }
+.emoji-1F32D { background-position: -80px -360px; }
+.emoji-1F32E { background-position: -100px -360px; }
+.emoji-1F32F { background-position: -120px -360px; }
+.emoji-1F330 { background-position: -140px -360px; }
+.emoji-1F331 { background-position: -160px -360px; }
+.emoji-1F332 { background-position: -180px -360px; }
+.emoji-1F333 { background-position: -200px -360px; }
+.emoji-1F334 { background-position: -220px -360px; }
+.emoji-1F335 { background-position: -240px -360px; }
+.emoji-1F336 { background-position: -260px -360px; }
+.emoji-1F337 { background-position: -280px -360px; }
+.emoji-1F338 { background-position: -300px -360px; }
+.emoji-1F339 { background-position: -320px -360px; }
+.emoji-1F33A { background-position: -340px -360px; }
+.emoji-1F33B { background-position: -360px -360px; }
+.emoji-1F33C { background-position: -380px 0px; }
+.emoji-1F33D { background-position: -380px -20px; }
+.emoji-1F33E { background-position: -380px -40px; }
+.emoji-1F33F { background-position: -380px -60px; }
+.emoji-1F340 { background-position: -380px -80px; }
+.emoji-1F341 { background-position: -380px -100px; }
+.emoji-1F342 { background-position: -380px -120px; }
+.emoji-1F343 { background-position: -380px -140px; }
+.emoji-1F344 { background-position: -380px -160px; }
+.emoji-1F345 { background-position: -380px -180px; }
+.emoji-1F346 { background-position: -380px -200px; }
+.emoji-1F347 { background-position: -380px -220px; }
+.emoji-1F348 { background-position: -380px -240px; }
+.emoji-1F349 { background-position: -380px -260px; }
+.emoji-1F34A { background-position: -380px -280px; }
+.emoji-1F34B { background-position: -380px -300px; }
+.emoji-1F34C { background-position: -380px -320px; }
+.emoji-1F34D { background-position: -380px -340px; }
+.emoji-1F34E { background-position: -380px -360px; }
+.emoji-1F34F { background-position: 0px -380px; }
+.emoji-1F350 { background-position: -20px -380px; }
+.emoji-1F351 { background-position: -40px -380px; }
+.emoji-1F352 { background-position: -60px -380px; }
+.emoji-1F353 { background-position: -80px -380px; }
+.emoji-1F354 { background-position: -100px -380px; }
+.emoji-1F355 { background-position: -120px -380px; }
+.emoji-1F356 { background-position: -140px -380px; }
+.emoji-1F357 { background-position: -160px -380px; }
+.emoji-1F358 { background-position: -180px -380px; }
+.emoji-1F359 { background-position: -200px -380px; }
+.emoji-1F35A { background-position: -220px -380px; }
+.emoji-1F35B { background-position: -240px -380px; }
+.emoji-1F35C { background-position: -260px -380px; }
+.emoji-1F35D { background-position: -280px -380px; }
+.emoji-1F35E { background-position: -300px -380px; }
+.emoji-1F35F { background-position: -320px -380px; }
+.emoji-1F360 { background-position: -340px -380px; }
+.emoji-1F361 { background-position: -360px -380px; }
+.emoji-1F362 { background-position: -380px -380px; }
+.emoji-1F363 { background-position: -400px 0px; }
+.emoji-1F364 { background-position: -400px -20px; }
+.emoji-1F365 { background-position: -400px -40px; }
+.emoji-1F366 { background-position: -400px -60px; }
+.emoji-1F367 { background-position: -400px -80px; }
+.emoji-1F368 { background-position: -400px -100px; }
+.emoji-1F369 { background-position: -400px -120px; }
+.emoji-1F36A { background-position: -400px -140px; }
+.emoji-1F36B { background-position: -400px -160px; }
+.emoji-1F36C { background-position: -400px -180px; }
+.emoji-1F36D { background-position: -400px -200px; }
+.emoji-1F36E { background-position: -400px -220px; }
+.emoji-1F36F { background-position: -400px -240px; }
+.emoji-1F370 { background-position: -400px -260px; }
+.emoji-1F371 { background-position: -400px -280px; }
+.emoji-1F372 { background-position: -400px -300px; }
+.emoji-1F373 { background-position: -400px -320px; }
+.emoji-1F374 { background-position: -400px -340px; }
+.emoji-1F375 { background-position: -400px -360px; }
+.emoji-1F376 { background-position: -400px -380px; }
+.emoji-1F377 { background-position: 0px -400px; }
+.emoji-1F378 { background-position: -20px -400px; }
+.emoji-1F379 { background-position: -40px -400px; }
+.emoji-1F37A { background-position: -60px -400px; }
+.emoji-1F37B { background-position: -80px -400px; }
+.emoji-1F37C { background-position: -100px -400px; }
+.emoji-1F37D { background-position: -120px -400px; }
+.emoji-1F37E { background-position: -140px -400px; }
+.emoji-1F37F { background-position: -160px -400px; }
+.emoji-1F380 { background-position: -180px -400px; }
+.emoji-1F381 { background-position: -200px -400px; }
+.emoji-1F382 { background-position: -220px -400px; }
+.emoji-1F383 { background-position: -240px -400px; }
+.emoji-1F384 { background-position: -260px -400px; }
+.emoji-1F385 { background-position: -280px -400px; }
+.emoji-1F385-1F3FB { background-position: -300px -400px; }
+.emoji-1F385-1F3FC { background-position: -320px -400px; }
+.emoji-1F385-1F3FD { background-position: -340px -400px; }
+.emoji-1F385-1F3FE { background-position: -360px -400px; }
+.emoji-1F385-1F3FF { background-position: -380px -400px; }
+.emoji-1F386 { background-position: -400px -400px; }
+.emoji-1F387 { background-position: -420px 0px; }
+.emoji-1F388 { background-position: -420px -20px; }
+.emoji-1F389 { background-position: -420px -40px; }
+.emoji-1F38A { background-position: -420px -60px; }
+.emoji-1F38B { background-position: -420px -80px; }
+.emoji-1F38C { background-position: -420px -100px; }
+.emoji-1F38D { background-position: -420px -120px; }
+.emoji-1F38E { background-position: -420px -140px; }
+.emoji-1F38F { background-position: -420px -160px; }
+.emoji-1F390 { background-position: -420px -180px; }
+.emoji-1F391 { background-position: -420px -200px; }
+.emoji-1F392 { background-position: -420px -220px; }
+.emoji-1F393 { background-position: -420px -240px; }
+.emoji-1F394 { background-position: -420px -260px; }
+.emoji-1F395 { background-position: -420px -280px; }
+.emoji-1F396 { background-position: -420px -300px; }
+.emoji-1F397 { background-position: -420px -320px; }
+.emoji-1F398 { background-position: -420px -340px; }
+.emoji-1F399 { background-position: -420px -360px; }
+.emoji-1F39A { background-position: -420px -380px; }
+.emoji-1F39B { background-position: -420px -400px; }
+.emoji-1F39C { background-position: 0px -420px; }
+.emoji-1F39D { background-position: -20px -420px; }
+.emoji-1F39E { background-position: -40px -420px; }
+.emoji-1F39F { background-position: -60px -420px; }
+.emoji-1F3A0 { background-position: -80px -420px; }
+.emoji-1F3A1 { background-position: -100px -420px; }
+.emoji-1F3A2 { background-position: -120px -420px; }
+.emoji-1F3A3 { background-position: -140px -420px; }
+.emoji-1F3A4 { background-position: -160px -420px; }
+.emoji-1F3A5 { background-position: -180px -420px; }
+.emoji-1F3A6 { background-position: -200px -420px; }
+.emoji-1F3A7 { background-position: -220px -420px; }
+.emoji-1F3A8 { background-position: -240px -420px; }
+.emoji-1F3A9 { background-position: -260px -420px; }
+.emoji-1F3AA { background-position: -280px -420px; }
+.emoji-1F3AB { background-position: -300px -420px; }
+.emoji-1F3AC { background-position: -320px -420px; }
+.emoji-1F3AD { background-position: -340px -420px; }
+.emoji-1F3AE { background-position: -360px -420px; }
+.emoji-1F3AF { background-position: -380px -420px; }
+.emoji-1F3B0 { background-position: -400px -420px; }
+.emoji-1F3B1 { background-position: -420px -420px; }
+.emoji-1F3B2 { background-position: -440px 0px; }
+.emoji-1F3B3 { background-position: -440px -20px; }
+.emoji-1F3B4 { background-position: -440px -40px; }
+.emoji-1F3B5 { background-position: -440px -60px; }
+.emoji-1F3B6 { background-position: -440px -80px; }
+.emoji-1F3B7 { background-position: -440px -100px; }
+.emoji-1F3B8 { background-position: -440px -120px; }
+.emoji-1F3B9 { background-position: -440px -140px; }
+.emoji-1F3BA { background-position: -440px -160px; }
+.emoji-1F3BB { background-position: -440px -180px; }
+.emoji-1F3BC { background-position: -440px -200px; }
+.emoji-1F3BD { background-position: -440px -220px; }
+.emoji-1F3BE { background-position: -440px -240px; }
+.emoji-1F3BF { background-position: -440px -260px; }
+.emoji-1F3C0 { background-position: -440px -280px; }
+.emoji-1F3C1 { background-position: -440px -300px; }
+.emoji-1F3C2 { background-position: -440px -320px; }
+.emoji-1F3C3 { background-position: -440px -340px; }
+.emoji-1F3C3-1F3FB { background-position: -440px -360px; }
+.emoji-1F3C3-1F3FC { background-position: -440px -380px; }
+.emoji-1F3C3-1F3FD { background-position: -440px -400px; }
+.emoji-1F3C3-1F3FE { background-position: -440px -420px; }
+.emoji-1F3C3-1F3FF { background-position: 0px -440px; }
+.emoji-1F3C4 { background-position: -20px -440px; }
+.emoji-1F3C4-1F3FB { background-position: -40px -440px; }
+.emoji-1F3C4-1F3FC { background-position: -60px -440px; }
+.emoji-1F3C4-1F3FD { background-position: -80px -440px; }
+.emoji-1F3C4-1F3FE { background-position: -100px -440px; }
+.emoji-1F3C4-1F3FF { background-position: -120px -440px; }
+.emoji-1F3C5 { background-position: -140px -440px; }
+.emoji-1F3C6 { background-position: -160px -440px; }
+.emoji-1F3C7 { background-position: -180px -440px; }
+.emoji-1F3C7-1F3FB { background-position: -200px -440px; }
+.emoji-1F3C7-1F3FC { background-position: -220px -440px; }
+.emoji-1F3C7-1F3FD { background-position: -240px -440px; }
+.emoji-1F3C7-1F3FE { background-position: -260px -440px; }
+.emoji-1F3C7-1F3FF { background-position: -280px -440px; }
+.emoji-1F3C8 { background-position: -300px -440px; }
+.emoji-1F3C9 { background-position: -320px -440px; }
+.emoji-1F3CA { background-position: -340px -440px; }
+.emoji-1F3CA-1F3FB { background-position: -360px -440px; }
+.emoji-1F3CA-1F3FC { background-position: -380px -440px; }
+.emoji-1F3CA-1F3FD { background-position: -400px -440px; }
+.emoji-1F3CA-1F3FE { background-position: -420px -440px; }
+.emoji-1F3CA-1F3FF { background-position: -440px -440px; }
+.emoji-1F3CB { background-position: -460px 0px; }
+.emoji-1F3CB-1F3FB { background-position: -460px -20px; }
+.emoji-1F3CB-1F3FC { background-position: -460px -40px; }
+.emoji-1F3CB-1F3FD { background-position: -460px -60px; }
+.emoji-1F3CB-1F3FE { background-position: -460px -80px; }
+.emoji-1F3CB-1F3FF { background-position: -460px -100px; }
+.emoji-1F3CC { background-position: -460px -120px; }
+.emoji-1F3CD { background-position: -460px -140px; }
+.emoji-1F3CE { background-position: -460px -160px; }
+.emoji-1F3CF { background-position: -460px -180px; }
+.emoji-1F3D0 { background-position: -460px -200px; }
+.emoji-1F3D1 { background-position: -460px -220px; }
+.emoji-1F3D2 { background-position: -460px -240px; }
+.emoji-1F3D3 { background-position: -460px -260px; }
+.emoji-1F3D4 { background-position: -460px -280px; }
+.emoji-1F3D5 { background-position: -460px -300px; }
+.emoji-1F3D6 { background-position: -460px -320px; }
+.emoji-1F3D7 { background-position: -460px -340px; }
+.emoji-1F3D8 { background-position: -460px -360px; }
+.emoji-1F3D9 { background-position: -460px -380px; }
+.emoji-1F3DA { background-position: -460px -400px; }
+.emoji-1F3DB { background-position: -460px -420px; }
+.emoji-1F3DC { background-position: -460px -440px; }
+.emoji-1F3DD { background-position: 0px -460px; }
+.emoji-1F3DE { background-position: -20px -460px; }
+.emoji-1F3DF { background-position: -40px -460px; }
+.emoji-1F3E0 { background-position: -60px -460px; }
+.emoji-1F3E1 { background-position: -80px -460px; }
+.emoji-1F3E2 { background-position: -100px -460px; }
+.emoji-1F3E3 { background-position: -120px -460px; }
+.emoji-1F3E4 { background-position: -140px -460px; }
+.emoji-1F3E5 { background-position: -160px -460px; }
+.emoji-1F3E6 { background-position: -180px -460px; }
+.emoji-1F3E7 { background-position: -200px -460px; }
+.emoji-1F3E8 { background-position: -220px -460px; }
+.emoji-1F3E9 { background-position: -240px -460px; }
+.emoji-1F3EA { background-position: -260px -460px; }
+.emoji-1F3EB { background-position: -280px -460px; }
+.emoji-1F3EC { background-position: -300px -460px; }
+.emoji-1F3ED { background-position: -320px -460px; }
+.emoji-1F3EE { background-position: -340px -460px; }
+.emoji-1F3EF { background-position: -360px -460px; }
+.emoji-1F3F0 { background-position: -380px -460px; }
+.emoji-1F3F1 { background-position: -400px -460px; }
+.emoji-1F3F2 { background-position: -420px -460px; }
+.emoji-1F3F3 { background-position: -440px -460px; }
+.emoji-1F3F4 { background-position: -460px -460px; }
+.emoji-1F3F5 { background-position: -480px 0px; }
+.emoji-1F3F6 { background-position: -480px -20px; }
+.emoji-1F3F7 { background-position: -480px -40px; }
+.emoji-1F3F8 { background-position: -480px -60px; }
+.emoji-1F3F9 { background-position: -480px -80px; }
+.emoji-1F3FA { background-position: -480px -100px; }
+.emoji-1F3FB { background-position: -480px -120px; }
+.emoji-1F3FC { background-position: -480px -140px; }
+.emoji-1F3FD { background-position: -480px -160px; }
+.emoji-1F3FE { background-position: -480px -180px; }
+.emoji-1F3FF { background-position: -480px -200px; }
+.emoji-1F400 { background-position: -480px -220px; }
+.emoji-1F401 { background-position: -480px -240px; }
+.emoji-1F402 { background-position: -480px -260px; }
+.emoji-1F403 { background-position: -480px -280px; }
+.emoji-1F404 { background-position: -480px -300px; }
+.emoji-1F405 { background-position: -480px -320px; }
+.emoji-1F406 { background-position: -480px -340px; }
+.emoji-1F407 { background-position: -480px -360px; }
+.emoji-1F408 { background-position: -480px -380px; }
+.emoji-1F409 { background-position: -480px -400px; }
+.emoji-1F40A { background-position: -480px -420px; }
+.emoji-1F40B { background-position: -480px -440px; }
+.emoji-1F40C { background-position: -480px -460px; }
+.emoji-1F40D { background-position: 0px -480px; }
+.emoji-1F40E { background-position: -20px -480px; }
+.emoji-1F40F { background-position: -40px -480px; }
+.emoji-1F410 { background-position: -60px -480px; }
+.emoji-1F411 { background-position: -80px -480px; }
+.emoji-1F412 { background-position: -100px -480px; }
+.emoji-1F413 { background-position: -120px -480px; }
+.emoji-1F414 { background-position: -140px -480px; }
+.emoji-1F415 { background-position: -160px -480px; }
+.emoji-1F416 { background-position: -180px -480px; }
+.emoji-1F417 { background-position: -200px -480px; }
+.emoji-1F418 { background-position: -220px -480px; }
+.emoji-1F419 { background-position: -240px -480px; }
+.emoji-1F41A { background-position: -260px -480px; }
+.emoji-1F41B { background-position: -280px -480px; }
+.emoji-1F41C { background-position: -300px -480px; }
+.emoji-1F41D { background-position: -320px -480px; }
+.emoji-1F41E { background-position: -340px -480px; }
+.emoji-1F41F { background-position: -360px -480px; }
+.emoji-1F420 { background-position: -380px -480px; }
+.emoji-1F421 { background-position: -400px -480px; }
+.emoji-1F422 { background-position: -420px -480px; }
+.emoji-1F423 { background-position: -440px -480px; }
+.emoji-1F424 { background-position: -460px -480px; }
+.emoji-1F425 { background-position: -480px -480px; }
+.emoji-1F426 { background-position: -500px 0px; }
+.emoji-1F427 { background-position: -500px -20px; }
+.emoji-1F428 { background-position: -500px -40px; }
+.emoji-1F429 { background-position: -500px -60px; }
+.emoji-1F42A { background-position: -500px -80px; }
+.emoji-1F42B { background-position: -500px -100px; }
+.emoji-1F42C { background-position: -500px -120px; }
+.emoji-1F42D { background-position: -500px -140px; }
+.emoji-1F42E { background-position: -500px -160px; }
+.emoji-1F42F { background-position: -500px -180px; }
+.emoji-1F430 { background-position: -500px -200px; }
+.emoji-1F431 { background-position: -500px -220px; }
+.emoji-1F432 { background-position: -500px -240px; }
+.emoji-1F433 { background-position: -500px -260px; }
+.emoji-1F434 { background-position: -500px -280px; }
+.emoji-1F435 { background-position: -500px -300px; }
+.emoji-1F436 { background-position: -500px -320px; }
+.emoji-1F437 { background-position: -500px -340px; }
+.emoji-1F438 { background-position: -500px -360px; }
+.emoji-1F439 { background-position: -500px -380px; }
+.emoji-1F43A { background-position: -500px -400px; }
+.emoji-1F43B { background-position: -500px -420px; }
+.emoji-1F43C { background-position: -500px -440px; }
+.emoji-1F43D { background-position: -500px -460px; }
+.emoji-1F43E { background-position: -500px -480px; }
+.emoji-1F43F { background-position: 0px -500px; }
+.emoji-1F440 { background-position: -20px -500px; }
+.emoji-1F441 { background-position: -40px -500px; }
+.emoji-1F441-1F5E8 { background-position: -60px -500px; }
+.emoji-1F442 { background-position: -80px -500px; }
+.emoji-1F442-1F3FB { background-position: -100px -500px; }
+.emoji-1F442-1F3FC { background-position: -120px -500px; }
+.emoji-1F442-1F3FD { background-position: -140px -500px; }
+.emoji-1F442-1F3FE { background-position: -160px -500px; }
+.emoji-1F442-1F3FF { background-position: -180px -500px; }
+.emoji-1F443 { background-position: -200px -500px; }
+.emoji-1F443-1F3FB { background-position: -220px -500px; }
+.emoji-1F443-1F3FC { background-position: -240px -500px; }
+.emoji-1F443-1F3FD { background-position: -260px -500px; }
+.emoji-1F443-1F3FE { background-position: -280px -500px; }
+.emoji-1F443-1F3FF { background-position: -300px -500px; }
+.emoji-1F444 { background-position: -320px -500px; }
+.emoji-1F445 { background-position: -340px -500px; }
+.emoji-1F446 { background-position: -360px -500px; }
+.emoji-1F446-1F3FB { background-position: -380px -500px; }
+.emoji-1F446-1F3FC { background-position: -400px -500px; }
+.emoji-1F446-1F3FD { background-position: -420px -500px; }
+.emoji-1F446-1F3FE { background-position: -440px -500px; }
+.emoji-1F446-1F3FF { background-position: -460px -500px; }
+.emoji-1F447 { background-position: -480px -500px; }
+.emoji-1F447-1F3FB { background-position: -500px -500px; }
+.emoji-1F447-1F3FC { background-position: -520px 0px; }
+.emoji-1F447-1F3FD { background-position: -520px -20px; }
+.emoji-1F447-1F3FE { background-position: -520px -40px; }
+.emoji-1F447-1F3FF { background-position: -520px -60px; }
+.emoji-1F448 { background-position: -520px -80px; }
+.emoji-1F448-1F3FB { background-position: -520px -100px; }
+.emoji-1F448-1F3FC { background-position: -520px -120px; }
+.emoji-1F448-1F3FD { background-position: -520px -140px; }
+.emoji-1F448-1F3FE { background-position: -520px -160px; }
+.emoji-1F448-1F3FF { background-position: -520px -180px; }
+.emoji-1F449 { background-position: -520px -200px; }
+.emoji-1F449-1F3FB { background-position: -520px -220px; }
+.emoji-1F449-1F3FC { background-position: -520px -240px; }
+.emoji-1F449-1F3FD { background-position: -520px -260px; }
+.emoji-1F449-1F3FE { background-position: -520px -280px; }
+.emoji-1F449-1F3FF { background-position: -520px -300px; }
+.emoji-1F44A { background-position: -520px -320px; }
+.emoji-1F44A-1F3FB { background-position: -520px -340px; }
+.emoji-1F44A-1F3FC { background-position: -520px -360px; }
+.emoji-1F44A-1F3FD { background-position: -520px -380px; }
+.emoji-1F44A-1F3FE { background-position: -520px -400px; }
+.emoji-1F44A-1F3FF { background-position: -520px -420px; }
+.emoji-1F44B { background-position: -520px -440px; }
+.emoji-1F44B-1F3FB { background-position: -520px -460px; }
+.emoji-1F44B-1F3FC { background-position: -520px -480px; }
+.emoji-1F44B-1F3FD { background-position: -520px -500px; }
+.emoji-1F44B-1F3FE { background-position: 0px -520px; }
+.emoji-1F44B-1F3FF { background-position: -20px -520px; }
+.emoji-1F44C { background-position: -40px -520px; }
+.emoji-1F44C-1F3FB { background-position: -60px -520px; }
+.emoji-1F44C-1F3FC { background-position: -80px -520px; }
+.emoji-1F44C-1F3FD { background-position: -100px -520px; }
+.emoji-1F44C-1F3FE { background-position: -120px -520px; }
+.emoji-1F44C-1F3FF { background-position: -140px -520px; }
+.emoji-1F44D { background-position: -160px -520px; }
+.emoji-1F44D-1F3FB { background-position: -180px -520px; }
+.emoji-1F44D-1F3FC { background-position: -200px -520px; }
+.emoji-1F44D-1F3FD { background-position: -220px -520px; }
+.emoji-1F44D-1F3FE { background-position: -240px -520px; }
+.emoji-1F44D-1F3FF { background-position: -260px -520px; }
+.emoji-1F44E { background-position: -280px -520px; }
+.emoji-1F44E-1F3FB { background-position: -300px -520px; }
+.emoji-1F44E-1F3FC { background-position: -320px -520px; }
+.emoji-1F44E-1F3FD { background-position: -340px -520px; }
+.emoji-1F44E-1F3FE { background-position: -360px -520px; }
+.emoji-1F44E-1F3FF { background-position: -380px -520px; }
+.emoji-1F44F { background-position: -400px -520px; }
+.emoji-1F44F-1F3FB { background-position: -420px -520px; }
+.emoji-1F44F-1F3FC { background-position: -440px -520px; }
+.emoji-1F44F-1F3FD { background-position: -460px -520px; }
+.emoji-1F44F-1F3FE { background-position: -480px -520px; }
+.emoji-1F44F-1F3FF { background-position: -500px -520px; }
+.emoji-1F450 { background-position: -520px -520px; }
+.emoji-1F450-1F3FB { background-position: -540px 0px; }
+.emoji-1F450-1F3FC { background-position: -540px -20px; }
+.emoji-1F450-1F3FD { background-position: -540px -40px; }
+.emoji-1F450-1F3FE { background-position: -540px -60px; }
+.emoji-1F450-1F3FF { background-position: -540px -80px; }
+.emoji-1F451 { background-position: -540px -100px; }
+.emoji-1F452 { background-position: -540px -120px; }
+.emoji-1F453 { background-position: -540px -140px; }
+.emoji-1F454 { background-position: -540px -160px; }
+.emoji-1F455 { background-position: -540px -180px; }
+.emoji-1F456 { background-position: -540px -200px; }
+.emoji-1F457 { background-position: -540px -220px; }
+.emoji-1F458 { background-position: -540px -240px; }
+.emoji-1F459 { background-position: -540px -260px; }
+.emoji-1F45A { background-position: -540px -280px; }
+.emoji-1F45B { background-position: -540px -300px; }
+.emoji-1F45C { background-position: -540px -320px; }
+.emoji-1F45D { background-position: -540px -340px; }
+.emoji-1F45E { background-position: -540px -360px; }
+.emoji-1F45F { background-position: -540px -380px; }
+.emoji-1F460 { background-position: -540px -400px; }
+.emoji-1F461 { background-position: -540px -420px; }
+.emoji-1F462 { background-position: -540px -440px; }
+.emoji-1F463 { background-position: -540px -460px; }
+.emoji-1F464 { background-position: -540px -480px; }
+.emoji-1F465 { background-position: -540px -500px; }
+.emoji-1F466 { background-position: -540px -520px; }
+.emoji-1F466-1F3FB { background-position: 0px -540px; }
+.emoji-1F466-1F3FC { background-position: -20px -540px; }
+.emoji-1F466-1F3FD { background-position: -40px -540px; }
+.emoji-1F466-1F3FE { background-position: -60px -540px; }
+.emoji-1F466-1F3FF { background-position: -80px -540px; }
+.emoji-1F467 { background-position: -100px -540px; }
+.emoji-1F467-1F3FB { background-position: -120px -540px; }
+.emoji-1F467-1F3FC { background-position: -140px -540px; }
+.emoji-1F467-1F3FD { background-position: -160px -540px; }
+.emoji-1F467-1F3FE { background-position: -180px -540px; }
+.emoji-1F467-1F3FF { background-position: -200px -540px; }
+.emoji-1F468 { background-position: -220px -540px; }
+.emoji-1F468-1F3FB { background-position: -240px -540px; }
+.emoji-1F468-1F3FC { background-position: -260px -540px; }
+.emoji-1F468-1F3FD { background-position: -280px -540px; }
+.emoji-1F468-1F3FE { background-position: -300px -540px; }
+.emoji-1F468-1F3FF { background-position: -320px -540px; }
+.emoji-1F468-1F468-1F466 { background-position: -340px -540px; }
+.emoji-1F468-1F468-1F466-1F466 { background-position: -360px -540px; }
+.emoji-1F468-1F468-1F467 { background-position: -380px -540px; }
+.emoji-1F468-1F468-1F467-1F466 { background-position: -400px -540px; }
+.emoji-1F468-1F468-1F467-1F467 { background-position: -420px -540px; }
+.emoji-1F468-1F469-1F466-1F466 { background-position: -440px -540px; }
+.emoji-1F468-1F469-1F467 { background-position: -460px -540px; }
+.emoji-1F468-1F469-1F467-1F466 { background-position: -480px -540px; }
+.emoji-1F468-1F469-1F467-1F467 { background-position: -500px -540px; }
+.emoji-1F468-2764-1F468 { background-position: -520px -540px; }
+.emoji-1F468-2764-1F48B-1F468 { background-position: -540px -540px; }
+.emoji-1F469 { background-position: -560px 0px; }
+.emoji-1F469-1F3FB { background-position: -560px -20px; }
+.emoji-1F469-1F3FC { background-position: -560px -40px; }
+.emoji-1F469-1F3FD { background-position: -560px -60px; }
+.emoji-1F469-1F3FE { background-position: -560px -80px; }
+.emoji-1F469-1F3FF { background-position: -560px -100px; }
+.emoji-1F469-1F469-1F466 { background-position: -560px -120px; }
+.emoji-1F469-1F469-1F466-1F466 { background-position: -560px -140px; }
+.emoji-1F469-1F469-1F467 { background-position: -560px -160px; }
+.emoji-1F469-1F469-1F467-1F466 { background-position: -560px -180px; }
+.emoji-1F469-1F469-1F467-1F467 { background-position: -560px -200px; }
+.emoji-1F469-2764-1F469 { background-position: -560px -220px; }
+.emoji-1F469-2764-1F48B-1F469 { background-position: -560px -240px; }
+.emoji-1F46A { background-position: -560px -260px; }
+.emoji-1F46B { background-position: -560px -280px; }
+.emoji-1F46C { background-position: -560px -300px; }
+.emoji-1F46D { background-position: -560px -320px; }
+.emoji-1F46E { background-position: -560px -340px; }
+.emoji-1F46E-1F3FB { background-position: -560px -360px; }
+.emoji-1F46E-1F3FC { background-position: -560px -380px; }
+.emoji-1F46E-1F3FD { background-position: -560px -400px; }
+.emoji-1F46E-1F3FE { background-position: -560px -420px; }
+.emoji-1F46E-1F3FF { background-position: -560px -440px; }
+.emoji-1F46F { background-position: -560px -460px; }
+.emoji-1F470 { background-position: -560px -480px; }
+.emoji-1F470-1F3FB { background-position: -560px -500px; }
+.emoji-1F470-1F3FC { background-position: -560px -520px; }
+.emoji-1F470-1F3FD { background-position: -560px -540px; }
+.emoji-1F470-1F3FE { background-position: 0px -560px; }
+.emoji-1F470-1F3FF { background-position: -20px -560px; }
+.emoji-1F471 { background-position: -40px -560px; }
+.emoji-1F471-1F3FB { background-position: -60px -560px; }
+.emoji-1F471-1F3FC { background-position: -80px -560px; }
+.emoji-1F471-1F3FD { background-position: -100px -560px; }
+.emoji-1F471-1F3FE { background-position: -120px -560px; }
+.emoji-1F471-1F3FF { background-position: -140px -560px; }
+.emoji-1F472 { background-position: -160px -560px; }
+.emoji-1F472-1F3FB { background-position: -180px -560px; }
+.emoji-1F472-1F3FC { background-position: -200px -560px; }
+.emoji-1F472-1F3FD { background-position: -220px -560px; }
+.emoji-1F472-1F3FE { background-position: -240px -560px; }
+.emoji-1F472-1F3FF { background-position: -260px -560px; }
+.emoji-1F473 { background-position: -280px -560px; }
+.emoji-1F473-1F3FB { background-position: -300px -560px; }
+.emoji-1F473-1F3FC { background-position: -320px -560px; }
+.emoji-1F473-1F3FD { background-position: -340px -560px; }
+.emoji-1F473-1F3FE { background-position: -360px -560px; }
+.emoji-1F473-1F3FF { background-position: -380px -560px; }
+.emoji-1F474 { background-position: -400px -560px; }
+.emoji-1F474-1F3FB { background-position: -420px -560px; }
+.emoji-1F474-1F3FC { background-position: -440px -560px; }
+.emoji-1F474-1F3FD { background-position: -460px -560px; }
+.emoji-1F474-1F3FE { background-position: -480px -560px; }
+.emoji-1F474-1F3FF { background-position: -500px -560px; }
+.emoji-1F475 { background-position: -520px -560px; }
+.emoji-1F475-1F3FB { background-position: -540px -560px; }
+.emoji-1F475-1F3FC { background-position: -560px -560px; }
+.emoji-1F475-1F3FD { background-position: -580px 0px; }
+.emoji-1F475-1F3FE { background-position: -580px -20px; }
+.emoji-1F475-1F3FF { background-position: -580px -40px; }
+.emoji-1F476 { background-position: -580px -60px; }
+.emoji-1F476-1F3FB { background-position: -580px -80px; }
+.emoji-1F476-1F3FC { background-position: -580px -100px; }
+.emoji-1F476-1F3FD { background-position: -580px -120px; }
+.emoji-1F476-1F3FE { background-position: -580px -140px; }
+.emoji-1F476-1F3FF { background-position: -580px -160px; }
+.emoji-1F477 { background-position: -580px -180px; }
+.emoji-1F477-1F3FB { background-position: -580px -200px; }
+.emoji-1F477-1F3FC { background-position: -580px -220px; }
+.emoji-1F477-1F3FD { background-position: -580px -240px; }
+.emoji-1F477-1F3FE { background-position: -580px -260px; }
+.emoji-1F477-1F3FF { background-position: -580px -280px; }
+.emoji-1F478 { background-position: -580px -300px; }
+.emoji-1F478-1F3FB { background-position: -580px -320px; }
+.emoji-1F478-1F3FC { background-position: -580px -340px; }
+.emoji-1F478-1F3FD { background-position: -580px -360px; }
+.emoji-1F478-1F3FE { background-position: -580px -380px; }
+.emoji-1F478-1F3FF { background-position: -580px -400px; }
+.emoji-1F479 { background-position: -580px -420px; }
+.emoji-1F47A { background-position: -580px -440px; }
+.emoji-1F47B { background-position: -580px -460px; }
+.emoji-1F47C { background-position: -580px -480px; }
+.emoji-1F47C-1F3FB { background-position: -580px -500px; }
+.emoji-1F47C-1F3FC { background-position: -580px -520px; }
+.emoji-1F47C-1F3FD { background-position: -580px -540px; }
+.emoji-1F47C-1F3FE { background-position: -580px -560px; }
+.emoji-1F47C-1F3FF { background-position: 0px -580px; }
+.emoji-1F47D { background-position: -20px -580px; }
+.emoji-1F47E { background-position: -40px -580px; }
+.emoji-1F47F { background-position: -60px -580px; }
+.emoji-1F480 { background-position: -80px -580px; }
+.emoji-1F481 { background-position: -100px -580px; }
+.emoji-1F481-1F3FB { background-position: -120px -580px; }
+.emoji-1F481-1F3FC { background-position: -140px -580px; }
+.emoji-1F481-1F3FD { background-position: -160px -580px; }
+.emoji-1F481-1F3FE { background-position: -180px -580px; }
+.emoji-1F481-1F3FF { background-position: -200px -580px; }
+.emoji-1F482 { background-position: -220px -580px; }
+.emoji-1F482-1F3FB { background-position: -240px -580px; }
+.emoji-1F482-1F3FC { background-position: -260px -580px; }
+.emoji-1F482-1F3FD { background-position: -280px -580px; }
+.emoji-1F482-1F3FE { background-position: -300px -580px; }
+.emoji-1F482-1F3FF { background-position: -320px -580px; }
+.emoji-1F483 { background-position: -340px -580px; }
+.emoji-1F483-1F3FB { background-position: -360px -580px; }
+.emoji-1F483-1F3FC { background-position: -380px -580px; }
+.emoji-1F483-1F3FD { background-position: -400px -580px; }
+.emoji-1F483-1F3FE { background-position: -420px -580px; }
+.emoji-1F483-1F3FF { background-position: -440px -580px; }
+.emoji-1F484 { background-position: -460px -580px; }
+.emoji-1F485 { background-position: -480px -580px; }
+.emoji-1F485-1F3FB { background-position: -500px -580px; }
+.emoji-1F485-1F3FC { background-position: -520px -580px; }
+.emoji-1F485-1F3FD { background-position: -540px -580px; }
+.emoji-1F485-1F3FE { background-position: -560px -580px; }
+.emoji-1F485-1F3FF { background-position: -580px -580px; }
+.emoji-1F486 { background-position: -600px 0px; }
+.emoji-1F486-1F3FB { background-position: -600px -20px; }
+.emoji-1F486-1F3FC { background-position: -600px -40px; }
+.emoji-1F486-1F3FD { background-position: -600px -60px; }
+.emoji-1F486-1F3FE { background-position: -600px -80px; }
+.emoji-1F486-1F3FF { background-position: -600px -100px; }
+.emoji-1F487 { background-position: -600px -120px; }
+.emoji-1F487-1F3FB { background-position: -600px -140px; }
+.emoji-1F487-1F3FC { background-position: -600px -160px; }
+.emoji-1F487-1F3FD { background-position: -600px -180px; }
+.emoji-1F487-1F3FE { background-position: -600px -200px; }
+.emoji-1F487-1F3FF { background-position: -600px -220px; }
+.emoji-1F488 { background-position: -600px -240px; }
+.emoji-1F489 { background-position: -600px -260px; }
+.emoji-1F48A { background-position: -600px -280px; }
+.emoji-1F48B { background-position: -600px -300px; }
+.emoji-1F48C { background-position: -600px -320px; }
+.emoji-1F48D { background-position: -600px -340px; }
+.emoji-1F48E { background-position: -600px -360px; }
+.emoji-1F48F { background-position: -600px -380px; }
+.emoji-1F490 { background-position: -600px -400px; }
+.emoji-1F491 { background-position: -600px -420px; }
+.emoji-1F492 { background-position: -600px -440px; }
+.emoji-1F493 { background-position: -600px -460px; }
+.emoji-1F494 { background-position: -600px -480px; }
+.emoji-1F495 { background-position: -600px -500px; }
+.emoji-1F496 { background-position: -600px -520px; }
+.emoji-1F497 { background-position: -600px -540px; }
+.emoji-1F498 { background-position: -600px -560px; }
+.emoji-1F499 { background-position: -600px -580px; }
+.emoji-1F49A { background-position: 0px -600px; }
+.emoji-1F49B { background-position: -20px -600px; }
+.emoji-1F49C { background-position: -40px -600px; }
+.emoji-1F49D { background-position: -60px -600px; }
+.emoji-1F49E { background-position: -80px -600px; }
+.emoji-1F49F { background-position: -100px -600px; }
+.emoji-1F4A0 { background-position: -120px -600px; }
+.emoji-1F4A1 { background-position: -140px -600px; }
+.emoji-1F4A2 { background-position: -160px -600px; }
+.emoji-1F4A3 { background-position: -180px -600px; }
+.emoji-1F4A4 { background-position: -200px -600px; }
+.emoji-1F4A5 { background-position: -220px -600px; }
+.emoji-1F4A6 { background-position: -240px -600px; }
+.emoji-1F4A7 { background-position: -260px -600px; }
+.emoji-1F4A8 { background-position: -280px -600px; }
+.emoji-1F4A9 { background-position: -300px -600px; }
+.emoji-1F4AA { background-position: -320px -600px; }
+.emoji-1F4AA-1F3FB { background-position: -340px -600px; }
+.emoji-1F4AA-1F3FC { background-position: -360px -600px; }
+.emoji-1F4AA-1F3FD { background-position: -380px -600px; }
+.emoji-1F4AA-1F3FE { background-position: -400px -600px; }
+.emoji-1F4AA-1F3FF { background-position: -420px -600px; }
+.emoji-1F4AB { background-position: -440px -600px; }
+.emoji-1F4AC { background-position: -460px -600px; }
+.emoji-1F4AD { background-position: -480px -600px; }
+.emoji-1F4AE { background-position: -500px -600px; }
+.emoji-1F4AF { background-position: -520px -600px; }
+.emoji-1F4B0 { background-position: -540px -600px; }
+.emoji-1F4B1 { background-position: -560px -600px; }
+.emoji-1F4B2 { background-position: -580px -600px; }
+.emoji-1F4B3 { background-position: -600px -600px; }
+.emoji-1F4B4 { background-position: -620px 0px; }
+.emoji-1F4B5 { background-position: -620px -20px; }
+.emoji-1F4B6 { background-position: -620px -40px; }
+.emoji-1F4B7 { background-position: -620px -60px; }
+.emoji-1F4B8 { background-position: -620px -80px; }
+.emoji-1F4B9 { background-position: -620px -100px; }
+.emoji-1F4BA { background-position: -620px -120px; }
+.emoji-1F4BB { background-position: -620px -140px; }
+.emoji-1F4BC { background-position: -620px -160px; }
+.emoji-1F4BD { background-position: -620px -180px; }
+.emoji-1F4BE { background-position: -620px -200px; }
+.emoji-1F4BF { background-position: -620px -220px; }
+.emoji-1F4C0 { background-position: -620px -240px; }
+.emoji-1F4C1 { background-position: -620px -260px; }
+.emoji-1F4C2 { background-position: -620px -280px; }
+.emoji-1F4C3 { background-position: -620px -300px; }
+.emoji-1F4C4 { background-position: -620px -320px; }
+.emoji-1F4C5 { background-position: -620px -340px; }
+.emoji-1F4C6 { background-position: -620px -360px; }
+.emoji-1F4C7 { background-position: -620px -380px; }
+.emoji-1F4C8 { background-position: -620px -400px; }
+.emoji-1F4C9 { background-position: -620px -420px; }
+.emoji-1F4CA { background-position: -620px -440px; }
+.emoji-1F4CB { background-position: -620px -460px; }
+.emoji-1F4CC { background-position: -620px -480px; }
+.emoji-1F4CD { background-position: -620px -500px; }
+.emoji-1F4CE { background-position: -620px -520px; }
+.emoji-1F4CF { background-position: -620px -540px; }
+.emoji-1F4D0 { background-position: -620px -560px; }
+.emoji-1F4D1 { background-position: -620px -580px; }
+.emoji-1F4D2 { background-position: -620px -600px; }
+.emoji-1F4D3 { background-position: 0px -620px; }
+.emoji-1F4D4 { background-position: -20px -620px; }
+.emoji-1F4D5 { background-position: -40px -620px; }
+.emoji-1F4D6 { background-position: -60px -620px; }
+.emoji-1F4D7 { background-position: -80px -620px; }
+.emoji-1F4D8 { background-position: -100px -620px; }
+.emoji-1F4D9 { background-position: -120px -620px; }
+.emoji-1F4DA { background-position: -140px -620px; }
+.emoji-1F4DB { background-position: -160px -620px; }
+.emoji-1F4DC { background-position: -180px -620px; }
+.emoji-1F4DD { background-position: -200px -620px; }
+.emoji-1F4DE { background-position: -220px -620px; }
+.emoji-1F4DF { background-position: -240px -620px; }
+.emoji-1F4E0 { background-position: -260px -620px; }
+.emoji-1F4E1 { background-position: -280px -620px; }
+.emoji-1F4E2 { background-position: -300px -620px; }
+.emoji-1F4E3 { background-position: -320px -620px; }
+.emoji-1F4E4 { background-position: -340px -620px; }
+.emoji-1F4E5 { background-position: -360px -620px; }
+.emoji-1F4E6 { background-position: -380px -620px; }
+.emoji-1F4E7 { background-position: -400px -620px; }
+.emoji-1F4E8 { background-position: -420px -620px; }
+.emoji-1F4E9 { background-position: -440px -620px; }
+.emoji-1F4EA { background-position: -460px -620px; }
+.emoji-1F4EB { background-position: -480px -620px; }
+.emoji-1F4EC { background-position: -500px -620px; }
+.emoji-1F4ED { background-position: -520px -620px; }
+.emoji-1F4EE { background-position: -540px -620px; }
+.emoji-1F4EF { background-position: -560px -620px; }
+.emoji-1F4F0 { background-position: -580px -620px; }
+.emoji-1F4F1 { background-position: -600px -620px; }
+.emoji-1F4F2 { background-position: -620px -620px; }
+.emoji-1F4F3 { background-position: -640px 0px; }
+.emoji-1F4F4 { background-position: -640px -20px; }
+.emoji-1F4F5 { background-position: -640px -40px; }
+.emoji-1F4F6 { background-position: -640px -60px; }
+.emoji-1F4F7 { background-position: -640px -80px; }
+.emoji-1F4F8 { background-position: -640px -100px; }
+.emoji-1F4F9 { background-position: -640px -120px; }
+.emoji-1F4FA { background-position: -640px -140px; }
+.emoji-1F4FB { background-position: -640px -160px; }
+.emoji-1F4FC { background-position: -640px -180px; }
+.emoji-1F4FD { background-position: -640px -200px; }
+.emoji-1F4FE { background-position: -640px -220px; }
+.emoji-1F4FF { background-position: -640px -240px; }
+.emoji-1F500 { background-position: -640px -260px; }
+.emoji-1F501 { background-position: -640px -280px; }
+.emoji-1F502 { background-position: -640px -300px; }
+.emoji-1F503 { background-position: -640px -320px; }
+.emoji-1F504 { background-position: -640px -340px; }
+.emoji-1F505 { background-position: -640px -360px; }
+.emoji-1F506 { background-position: -640px -380px; }
+.emoji-1F507 { background-position: -640px -400px; }
+.emoji-1F508 { background-position: -640px -420px; }
+.emoji-1F509 { background-position: -640px -440px; }
+.emoji-1F50A { background-position: -640px -460px; }
+.emoji-1F50B { background-position: -640px -480px; }
+.emoji-1F50C { background-position: -640px -500px; }
+.emoji-1F50D { background-position: -640px -520px; }
+.emoji-1F50E { background-position: -640px -540px; }
+.emoji-1F50F { background-position: -640px -560px; }
+.emoji-1F510 { background-position: -640px -580px; }
+.emoji-1F511 { background-position: -640px -600px; }
+.emoji-1F512 { background-position: -640px -620px; }
+.emoji-1F513 { background-position: 0px -640px; }
+.emoji-1F514 { background-position: -20px -640px; }
+.emoji-1F515 { background-position: -40px -640px; }
+.emoji-1F516 { background-position: -60px -640px; }
+.emoji-1F517 { background-position: -80px -640px; }
+.emoji-1F518 { background-position: -100px -640px; }
+.emoji-1F519 { background-position: -120px -640px; }
+.emoji-1F51A { background-position: -140px -640px; }
+.emoji-1F51B { background-position: -160px -640px; }
+.emoji-1F51C { background-position: -180px -640px; }
+.emoji-1F51D { background-position: -200px -640px; }
+.emoji-1F51E { background-position: -220px -640px; }
+.emoji-1F51F { background-position: -240px -640px; }
+.emoji-1F520 { background-position: -260px -640px; }
+.emoji-1F521 { background-position: -280px -640px; }
+.emoji-1F522 { background-position: -300px -640px; }
+.emoji-1F523 { background-position: -320px -640px; }
+.emoji-1F524 { background-position: -340px -640px; }
+.emoji-1F525 { background-position: -360px -640px; }
+.emoji-1F526 { background-position: -380px -640px; }
+.emoji-1F527 { background-position: -400px -640px; }
+.emoji-1F528 { background-position: -420px -640px; }
+.emoji-1F529 { background-position: -440px -640px; }
+.emoji-1F52A { background-position: -460px -640px; }
+.emoji-1F52B { background-position: -480px -640px; }
+.emoji-1F52C { background-position: -500px -640px; }
+.emoji-1F52D { background-position: -520px -640px; }
+.emoji-1F52E { background-position: -540px -640px; }
+.emoji-1F52F { background-position: -560px -640px; }
+.emoji-1F530 { background-position: -580px -640px; }
+.emoji-1F531 { background-position: -600px -640px; }
+.emoji-1F532 { background-position: -620px -640px; }
+.emoji-1F533 { background-position: -640px -640px; }
+.emoji-1F534 { background-position: -660px 0px; }
+.emoji-1F535 { background-position: -660px -20px; }
+.emoji-1F536 { background-position: -660px -40px; }
+.emoji-1F537 { background-position: -660px -60px; }
+.emoji-1F538 { background-position: -660px -80px; }
+.emoji-1F539 { background-position: -660px -100px; }
+.emoji-1F53A { background-position: -660px -120px; }
+.emoji-1F53B { background-position: -660px -140px; }
+.emoji-1F53C { background-position: -660px -160px; }
+.emoji-1F53D { background-position: -660px -180px; }
+.emoji-1F546 { background-position: -660px -200px; }
+.emoji-1F547 { background-position: -660px -220px; }
+.emoji-1F548 { background-position: -660px -240px; }
+.emoji-1F549 { background-position: -660px -260px; }
+.emoji-1F54A { background-position: -660px -280px; }
+.emoji-1F54B { background-position: -660px -300px; }
+.emoji-1F54C { background-position: -660px -320px; }
+.emoji-1F54D { background-position: -660px -340px; }
+.emoji-1F54E { background-position: -660px -360px; }
+.emoji-1F550 { background-position: -660px -380px; }
+.emoji-1F551 { background-position: -660px -400px; }
+.emoji-1F552 { background-position: -660px -420px; }
+.emoji-1F553 { background-position: -660px -440px; }
+.emoji-1F554 { background-position: -660px -460px; }
+.emoji-1F555 { background-position: -660px -480px; }
+.emoji-1F556 { background-position: -660px -500px; }
+.emoji-1F557 { background-position: -660px -520px; }
+.emoji-1F558 { background-position: -660px -540px; }
+.emoji-1F559 { background-position: -660px -560px; }
+.emoji-1F55A { background-position: -660px -580px; }
+.emoji-1F55B { background-position: -660px -600px; }
+.emoji-1F55C { background-position: -660px -620px; }
+.emoji-1F55D { background-position: -660px -640px; }
+.emoji-1F55E { background-position: 0px -660px; }
+.emoji-1F55F { background-position: -20px -660px; }
+.emoji-1F560 { background-position: -40px -660px; }
+.emoji-1F561 { background-position: -60px -660px; }
+.emoji-1F562 { background-position: -80px -660px; }
+.emoji-1F563 { background-position: -100px -660px; }
+.emoji-1F564 { background-position: -120px -660px; }
+.emoji-1F565 { background-position: -140px -660px; }
+.emoji-1F566 { background-position: -160px -660px; }
+.emoji-1F567 { background-position: -180px -660px; }
+.emoji-1F568 { background-position: -200px -660px; }
+.emoji-1F569 { background-position: -220px -660px; }
+.emoji-1F56A { background-position: -240px -660px; }
+.emoji-1F56B { background-position: -260px -660px; }
+.emoji-1F56C { background-position: -280px -660px; }
+.emoji-1F56D { background-position: -300px -660px; }
+.emoji-1F56E { background-position: -320px -660px; }
+.emoji-1F56F { background-position: -340px -660px; }
+.emoji-1F570 { background-position: -360px -660px; }
+.emoji-1F571 { background-position: -380px -660px; }
+.emoji-1F572 { background-position: -400px -660px; }
+.emoji-1F573 { background-position: -420px -660px; }
+.emoji-1F574 { background-position: -440px -660px; }
+.emoji-1F575 { background-position: -460px -660px; }
+.emoji-1F575-1F3FB { background-position: -480px -660px; }
+.emoji-1F575-1F3FC { background-position: -500px -660px; }
+.emoji-1F575-1F3FD { background-position: -520px -660px; }
+.emoji-1F575-1F3FE { background-position: -540px -660px; }
+.emoji-1F575-1F3FF { background-position: -560px -660px; }
+.emoji-1F576 { background-position: -580px -660px; }
+.emoji-1F577 { background-position: -600px -660px; }
+.emoji-1F578 { background-position: -620px -660px; }
+.emoji-1F579 { background-position: -640px -660px; }
+.emoji-1F57B { background-position: -660px -660px; }
+.emoji-1F57E { background-position: -680px 0px; }
+.emoji-1F57F { background-position: -680px -20px; }
+.emoji-1F581 { background-position: -680px -40px; }
+.emoji-1F582 { background-position: -680px -60px; }
+.emoji-1F583 { background-position: -680px -80px; }
+.emoji-1F585 { background-position: -680px -100px; }
+.emoji-1F586 { background-position: -680px -120px; }
+.emoji-1F587 { background-position: -680px -140px; }
+.emoji-1F588 { background-position: -680px -160px; }
+.emoji-1F589 { background-position: -680px -180px; }
+.emoji-1F58A { background-position: -680px -200px; }
+.emoji-1F58B { background-position: -680px -220px; }
+.emoji-1F58C { background-position: -680px -240px; }
+.emoji-1F58D { background-position: -680px -260px; }
+.emoji-1F58E { background-position: -680px -280px; }
+.emoji-1F58F { background-position: -680px -300px; }
+.emoji-1F590 { background-position: -680px -320px; }
+.emoji-1F590-1F3FB { background-position: -680px -340px; }
+.emoji-1F590-1F3FC { background-position: -680px -360px; }
+.emoji-1F590-1F3FD { background-position: -680px -380px; }
+.emoji-1F590-1F3FE { background-position: -680px -400px; }
+.emoji-1F590-1F3FF { background-position: -680px -420px; }
+.emoji-1F591 { background-position: -680px -440px; }
+.emoji-1F592 { background-position: -680px -460px; }
+.emoji-1F593 { background-position: -680px -480px; }
+.emoji-1F594 { background-position: -680px -500px; }
+.emoji-1F595 { background-position: -680px -520px; }
+.emoji-1F595-1F3FB { background-position: -680px -540px; }
+.emoji-1F595-1F3FC { background-position: -680px -560px; }
+.emoji-1F595-1F3FD { background-position: -680px -580px; }
+.emoji-1F595-1F3FE { background-position: -680px -600px; }
+.emoji-1F595-1F3FF { background-position: -680px -620px; }
+.emoji-1F596 { background-position: -680px -640px; }
+.emoji-1F596-1F3FB { background-position: -680px -660px; }
+.emoji-1F596-1F3FC { background-position: 0px -680px; }
+.emoji-1F596-1F3FD { background-position: -20px -680px; }
+.emoji-1F596-1F3FE { background-position: -40px -680px; }
+.emoji-1F596-1F3FF { background-position: -60px -680px; }
+.emoji-1F597 { background-position: -80px -680px; }
+.emoji-1F598 { background-position: -100px -680px; }
+.emoji-1F599 { background-position: -120px -680px; }
+.emoji-1F59E { background-position: -140px -680px; }
+.emoji-1F59F { background-position: -160px -680px; }
+.emoji-1F5A5 { background-position: -180px -680px; }
+.emoji-1F5A6 { background-position: -200px -680px; }
+.emoji-1F5A7 { background-position: -220px -680px; }
+.emoji-1F5A8 { background-position: -240px -680px; }
+.emoji-1F5A9 { background-position: -260px -680px; }
+.emoji-1F5AA { background-position: -280px -680px; }
+.emoji-1F5AB { background-position: -300px -680px; }
+.emoji-1F5AD { background-position: -320px -680px; }
+.emoji-1F5AE { background-position: -340px -680px; }
+.emoji-1F5AF { background-position: -360px -680px; }
+.emoji-1F5B1 { background-position: -380px -680px; }
+.emoji-1F5B2 { background-position: -400px -680px; }
+.emoji-1F5B3 { background-position: -420px -680px; }
+.emoji-1F5B4 { background-position: -440px -680px; }
+.emoji-1F5B8 { background-position: -460px -680px; }
+.emoji-1F5B9 { background-position: -480px -680px; }
+.emoji-1F5BC { background-position: -500px -680px; }
+.emoji-1F5BD { background-position: -520px -680px; }
+.emoji-1F5BE { background-position: -540px -680px; }
+.emoji-1F5C0 { background-position: -560px -680px; }
+.emoji-1F5C1 { background-position: -580px -680px; }
+.emoji-1F5C2 { background-position: -600px -680px; }
+.emoji-1F5C3 { background-position: -620px -680px; }
+.emoji-1F5C4 { background-position: -640px -680px; }
+.emoji-1F5C6 { background-position: -660px -680px; }
+.emoji-1F5C7 { background-position: -680px -680px; }
+.emoji-1F5C9 { background-position: -700px 0px; }
+.emoji-1F5CA { background-position: -700px -20px; }
+.emoji-1F5CE { background-position: -700px -40px; }
+.emoji-1F5CF { background-position: -700px -60px; }
+.emoji-1F5D0 { background-position: -700px -80px; }
+.emoji-1F5D1 { background-position: -700px -100px; }
+.emoji-1F5D2 { background-position: -700px -120px; }
+.emoji-1F5D3 { background-position: -700px -140px; }
+.emoji-1F5D4 { background-position: -700px -160px; }
+.emoji-1F5D8 { background-position: -700px -180px; }
+.emoji-1F5D9 { background-position: -700px -200px; }
+.emoji-1F5DC { background-position: -700px -220px; }
+.emoji-1F5DD { background-position: -700px -240px; }
+.emoji-1F5DE { background-position: -700px -260px; }
+.emoji-1F5E0 { background-position: -700px -280px; }
+.emoji-1F5E1 { background-position: -700px -300px; }
+.emoji-1F5E2 { background-position: -700px -320px; }
+.emoji-1F5E3 { background-position: -700px -340px; }
+.emoji-1F5E8 { background-position: -700px -360px; }
+.emoji-1F5E9 { background-position: -700px -380px; }
+.emoji-1F5EA { background-position: -700px -400px; }
+.emoji-1F5EB { background-position: -700px -420px; }
+.emoji-1F5EC { background-position: -700px -440px; }
+.emoji-1F5ED { background-position: -700px -460px; }
+.emoji-1F5EE { background-position: -700px -480px; }
+.emoji-1F5EF { background-position: -700px -500px; }
+.emoji-1F5F0 { background-position: -700px -520px; }
+.emoji-1F5F1 { background-position: -700px -540px; }
+.emoji-1F5F2 { background-position: -700px -560px; }
+.emoji-1F5F3 { background-position: -700px -580px; }
+.emoji-1F5F4 { background-position: -700px -600px; }
+.emoji-1F5F5 { background-position: -700px -620px; }
+.emoji-1F5F8 { background-position: -700px -640px; }
+.emoji-1F5F9 { background-position: -700px -660px; }
+.emoji-1F5FA { background-position: -700px -680px; }
+.emoji-1F5FB { background-position: 0px -700px; }
+.emoji-1F5FC { background-position: -20px -700px; }
+.emoji-1F5FD { background-position: -40px -700px; }
+.emoji-1F5FE { background-position: -60px -700px; }
+.emoji-1F5FF { background-position: -80px -700px; }
+.emoji-1F600 { background-position: -100px -700px; }
+.emoji-1F601 { background-position: -120px -700px; }
+.emoji-1F602 { background-position: -140px -700px; }
+.emoji-1F603 { background-position: -160px -700px; }
+.emoji-1F604 { background-position: -180px -700px; }
+.emoji-1F605 { background-position: -200px -700px; }
+.emoji-1F606 { background-position: -220px -700px; }
+.emoji-1F607 { background-position: -240px -700px; }
+.emoji-1F608 { background-position: -260px -700px; }
+.emoji-1F609 { background-position: -280px -700px; }
+.emoji-1F60A { background-position: -300px -700px; }
+.emoji-1F60B { background-position: -320px -700px; }
+.emoji-1F60C { background-position: -340px -700px; }
+.emoji-1F60D { background-position: -360px -700px; }
+.emoji-1F60E { background-position: -380px -700px; }
+.emoji-1F60F { background-position: -400px -700px; }
+.emoji-1F610 { background-position: -420px -700px; }
+.emoji-1F611 { background-position: -440px -700px; }
+.emoji-1F612 { background-position: -460px -700px; }
+.emoji-1F613 { background-position: -480px -700px; }
+.emoji-1F614 { background-position: -500px -700px; }
+.emoji-1F615 { background-position: -520px -700px; }
+.emoji-1F616 { background-position: -540px -700px; }
+.emoji-1F617 { background-position: -560px -700px; }
+.emoji-1F618 { background-position: -580px -700px; }
+.emoji-1F619 { background-position: -600px -700px; }
+.emoji-1F61A { background-position: -620px -700px; }
+.emoji-1F61B { background-position: -640px -700px; }
+.emoji-1F61C { background-position: -660px -700px; }
+.emoji-1F61D { background-position: -680px -700px; }
+.emoji-1F61E { background-position: -700px -700px; }
+.emoji-1F61F { background-position: -720px 0px; }
+.emoji-1F620 { background-position: -720px -20px; }
+.emoji-1F621 { background-position: -720px -40px; }
+.emoji-1F622 { background-position: -720px -60px; }
+.emoji-1F623 { background-position: -720px -80px; }
+.emoji-1F624 { background-position: -720px -100px; }
+.emoji-1F625 { background-position: -720px -120px; }
+.emoji-1F626 { background-position: -720px -140px; }
+.emoji-1F627 { background-position: -720px -160px; }
+.emoji-1F628 { background-position: -720px -180px; }
+.emoji-1F629 { background-position: -720px -200px; }
+.emoji-1F62A { background-position: -720px -220px; }
+.emoji-1F62B { background-position: -720px -240px; }
+.emoji-1F62C { background-position: -720px -260px; }
+.emoji-1F62D { background-position: -720px -280px; }
+.emoji-1F62E { background-position: -720px -300px; }
+.emoji-1F62F { background-position: -720px -320px; }
+.emoji-1F630 { background-position: -720px -340px; }
+.emoji-1F631 { background-position: -720px -360px; }
+.emoji-1F632 { background-position: -720px -380px; }
+.emoji-1F633 { background-position: -720px -400px; }
+.emoji-1F634 { background-position: -720px -420px; }
+.emoji-1F635 { background-position: -720px -440px; }
+.emoji-1F636 { background-position: -720px -460px; }
+.emoji-1F637 { background-position: -720px -480px; }
+.emoji-1F638 { background-position: -720px -500px; }
+.emoji-1F639 { background-position: -720px -520px; }
+.emoji-1F63A { background-position: -720px -540px; }
+.emoji-1F63B { background-position: -720px -560px; }
+.emoji-1F63C { background-position: -720px -580px; }
+.emoji-1F63D { background-position: -720px -600px; }
+.emoji-1F63E { background-position: -720px -620px; }
+.emoji-1F63F { background-position: -720px -640px; }
+.emoji-1F640 { background-position: -720px -660px; }
+.emoji-1F641 { background-position: -720px -680px; }
+.emoji-1F642 { background-position: -720px -700px; }
+.emoji-1F643 { background-position: 0px -720px; }
+.emoji-1F644 { background-position: -20px -720px; }
+.emoji-1F645 { background-position: -40px -720px; }
+.emoji-1F645-1F3FB { background-position: -60px -720px; }
+.emoji-1F645-1F3FC { background-position: -80px -720px; }
+.emoji-1F645-1F3FD { background-position: -100px -720px; }
+.emoji-1F645-1F3FE { background-position: -120px -720px; }
+.emoji-1F645-1F3FF { background-position: -140px -720px; }
+.emoji-1F646 { background-position: -160px -720px; }
+.emoji-1F646-1F3FB { background-position: -180px -720px; }
+.emoji-1F646-1F3FC { background-position: -200px -720px; }
+.emoji-1F646-1F3FD { background-position: -220px -720px; }
+.emoji-1F646-1F3FE { background-position: -240px -720px; }
+.emoji-1F646-1F3FF { background-position: -260px -720px; }
+.emoji-1F647 { background-position: -280px -720px; }
+.emoji-1F647-1F3FB { background-position: -300px -720px; }
+.emoji-1F647-1F3FC { background-position: -320px -720px; }
+.emoji-1F647-1F3FD { background-position: -340px -720px; }
+.emoji-1F647-1F3FE { background-position: -360px -720px; }
+.emoji-1F647-1F3FF { background-position: -380px -720px; }
+.emoji-1F648 { background-position: -400px -720px; }
+.emoji-1F649 { background-position: -420px -720px; }
+.emoji-1F64A { background-position: -440px -720px; }
+.emoji-1F64B { background-position: -460px -720px; }
+.emoji-1F64B-1F3FB { background-position: -480px -720px; }
+.emoji-1F64B-1F3FC { background-position: -500px -720px; }
+.emoji-1F64B-1F3FD { background-position: -520px -720px; }
+.emoji-1F64B-1F3FE { background-position: -540px -720px; }
+.emoji-1F64B-1F3FF { background-position: -560px -720px; }
+.emoji-1F64C { background-position: -580px -720px; }
+.emoji-1F64C-1F3FB { background-position: -600px -720px; }
+.emoji-1F64C-1F3FC { background-position: -620px -720px; }
+.emoji-1F64C-1F3FD { background-position: -640px -720px; }
+.emoji-1F64C-1F3FE { background-position: -660px -720px; }
+.emoji-1F64C-1F3FF { background-position: -680px -720px; }
+.emoji-1F64D { background-position: -700px -720px; }
+.emoji-1F64D-1F3FB { background-position: -720px -720px; }
+.emoji-1F64D-1F3FC { background-position: -740px 0px; }
+.emoji-1F64D-1F3FD { background-position: -740px -20px; }
+.emoji-1F64D-1F3FE { background-position: -740px -40px; }
+.emoji-1F64D-1F3FF { background-position: -740px -60px; }
+.emoji-1F64E { background-position: -740px -80px; }
+.emoji-1F64E-1F3FB { background-position: -740px -100px; }
+.emoji-1F64E-1F3FC { background-position: -740px -120px; }
+.emoji-1F64E-1F3FD { background-position: -740px -140px; }
+.emoji-1F64E-1F3FE { background-position: -740px -160px; }
+.emoji-1F64E-1F3FF { background-position: -740px -180px; }
+.emoji-1F64F { background-position: -740px -200px; }
+.emoji-1F64F-1F3FB { background-position: -740px -220px; }
+.emoji-1F64F-1F3FC { background-position: -740px -240px; }
+.emoji-1F64F-1F3FD { background-position: -740px -260px; }
+.emoji-1F64F-1F3FE { background-position: -740px -280px; }
+.emoji-1F64F-1F3FF { background-position: -740px -300px; }
+.emoji-1F680 { background-position: -740px -320px; }
+.emoji-1F681 { background-position: -740px -340px; }
+.emoji-1F682 { background-position: -740px -360px; }
+.emoji-1F683 { background-position: -740px -380px; }
+.emoji-1F684 { background-position: -740px -400px; }
+.emoji-1F685 { background-position: -740px -420px; }
+.emoji-1F686 { background-position: -740px -440px; }
+.emoji-1F687 { background-position: -740px -460px; }
+.emoji-1F688 { background-position: -740px -480px; }
+.emoji-1F689 { background-position: -740px -500px; }
+.emoji-1F68A { background-position: -740px -520px; }
+.emoji-1F68B { background-position: -740px -540px; }
+.emoji-1F68C { background-position: -740px -560px; }
+.emoji-1F68D { background-position: -740px -580px; }
+.emoji-1F68E { background-position: -740px -600px; }
+.emoji-1F68F { background-position: -740px -620px; }
+.emoji-1F690 { background-position: -740px -640px; }
+.emoji-1F691 { background-position: -740px -660px; }
+.emoji-1F692 { background-position: -740px -680px; }
+.emoji-1F693 { background-position: -740px -700px; }
+.emoji-1F694 { background-position: -740px -720px; }
+.emoji-1F695 { background-position: 0px -740px; }
+.emoji-1F696 { background-position: -20px -740px; }
+.emoji-1F697 { background-position: -40px -740px; }
+.emoji-1F698 { background-position: -60px -740px; }
+.emoji-1F699 { background-position: -80px -740px; }
+.emoji-1F69A { background-position: -100px -740px; }
+.emoji-1F69B { background-position: -120px -740px; }
+.emoji-1F69C { background-position: -140px -740px; }
+.emoji-1F69D { background-position: -160px -740px; }
+.emoji-1F69E { background-position: -180px -740px; }
+.emoji-1F69F { background-position: -200px -740px; }
+.emoji-1F6A0 { background-position: -220px -740px; }
+.emoji-1F6A1 { background-position: -240px -740px; }
+.emoji-1F6A2 { background-position: -260px -740px; }
+.emoji-1F6A3 { background-position: -280px -740px; }
+.emoji-1F6A3-1F3FB { background-position: -300px -740px; }
+.emoji-1F6A3-1F3FC { background-position: -320px -740px; }
+.emoji-1F6A3-1F3FD { background-position: -340px -740px; }
+.emoji-1F6A3-1F3FE { background-position: -360px -740px; }
+.emoji-1F6A3-1F3FF { background-position: -380px -740px; }
+.emoji-1F6A4 { background-position: -400px -740px; }
+.emoji-1F6A5 { background-position: -420px -740px; }
+.emoji-1F6A6 { background-position: -440px -740px; }
+.emoji-1F6A7 { background-position: -460px -740px; }
+.emoji-1F6A8 { background-position: -480px -740px; }
+.emoji-1F6A9 { background-position: -500px -740px; }
+.emoji-1F6AA { background-position: -520px -740px; }
+.emoji-1F6AB { background-position: -540px -740px; }
+.emoji-1F6AC { background-position: -560px -740px; }
+.emoji-1F6AD { background-position: -580px -740px; }
+.emoji-1F6AE { background-position: -600px -740px; }
+.emoji-1F6AF { background-position: -620px -740px; }
+.emoji-1F6B0 { background-position: -640px -740px; }
+.emoji-1F6B1 { background-position: -660px -740px; }
+.emoji-1F6B2 { background-position: -680px -740px; }
+.emoji-1F6B3 { background-position: -700px -740px; }
+.emoji-1F6B4 { background-position: -720px -740px; }
+.emoji-1F6B4-1F3FB { background-position: -740px -740px; }
+.emoji-1F6B4-1F3FC { background-position: -760px 0px; }
+.emoji-1F6B4-1F3FD { background-position: -760px -20px; }
+.emoji-1F6B4-1F3FE { background-position: -760px -40px; }
+.emoji-1F6B4-1F3FF { background-position: -760px -60px; }
+.emoji-1F6B5 { background-position: -760px -80px; }
+.emoji-1F6B5-1F3FB { background-position: -760px -100px; }
+.emoji-1F6B5-1F3FC { background-position: -760px -120px; }
+.emoji-1F6B5-1F3FD { background-position: -760px -140px; }
+.emoji-1F6B5-1F3FE { background-position: -760px -160px; }
+.emoji-1F6B5-1F3FF { background-position: -760px -180px; }
+.emoji-1F6B6 { background-position: -760px -200px; }
+.emoji-1F6B6-1F3FB { background-position: -760px -220px; }
+.emoji-1F6B6-1F3FC { background-position: -760px -240px; }
+.emoji-1F6B6-1F3FD { background-position: -760px -260px; }
+.emoji-1F6B6-1F3FE { background-position: -760px -280px; }
+.emoji-1F6B6-1F3FF { background-position: -760px -300px; }
+.emoji-1F6B7 { background-position: -760px -320px; }
+.emoji-1F6B8 { background-position: -760px -340px; }
+.emoji-1F6B9 { background-position: -760px -360px; }
+.emoji-1F6BA { background-position: -760px -380px; }
+.emoji-1F6BB { background-position: -760px -400px; }
+.emoji-1F6BC { background-position: -760px -420px; }
+.emoji-1F6BD { background-position: -760px -440px; }
+.emoji-1F6BE { background-position: -760px -460px; }
+.emoji-1F6BF { background-position: -760px -480px; }
+.emoji-1F6C0 { background-position: -760px -500px; }
+.emoji-1F6C0-1F3FB { background-position: -760px -520px; }
+.emoji-1F6C0-1F3FC { background-position: -760px -540px; }
+.emoji-1F6C0-1F3FD { background-position: -760px -560px; }
+.emoji-1F6C0-1F3FE { background-position: -760px -580px; }
+.emoji-1F6C0-1F3FF { background-position: -760px -600px; }
+.emoji-1F6C1 { background-position: -760px -620px; }
+.emoji-1F6C2 { background-position: -760px -640px; }
+.emoji-1F6C3 { background-position: -760px -660px; }
+.emoji-1F6C4 { background-position: -760px -680px; }
+.emoji-1F6C5 { background-position: -760px -700px; }
+.emoji-1F6C6 { background-position: -760px -720px; }
+.emoji-1F6C7 { background-position: -760px -740px; }
+.emoji-1F6C8 { background-position: 0px -760px; }
+.emoji-1F6C9 { background-position: -20px -760px; }
+.emoji-1F6CA { background-position: -40px -760px; }
+.emoji-1F6CB { background-position: -60px -760px; }
+.emoji-1F6CC { background-position: -80px -760px; }
+.emoji-1F6CD { background-position: -100px -760px; }
+.emoji-1F6CE { background-position: -120px -760px; }
+.emoji-1F6CF { background-position: -140px -760px; }
+.emoji-1F6D0 { background-position: -160px -760px; }
+.emoji-1F6E0 { background-position: -180px -760px; }
+.emoji-1F6E1 { background-position: -200px -760px; }
+.emoji-1F6E2 { background-position: -220px -760px; }
+.emoji-1F6E3 { background-position: -240px -760px; }
+.emoji-1F6E4 { background-position: -260px -760px; }
+.emoji-1F6E5 { background-position: -280px -760px; }
+.emoji-1F6E6 { background-position: -300px -760px; }
+.emoji-1F6E7 { background-position: -320px -760px; }
+.emoji-1F6E8 { background-position: -340px -760px; }
+.emoji-1F6E9 { background-position: -360px -760px; }
+.emoji-1F6EA { background-position: -380px -760px; }
+.emoji-1F6EB { background-position: -400px -760px; }
+.emoji-1F6EC { background-position: -420px -760px; }
+.emoji-1F6F0 { background-position: -440px -760px; }
+.emoji-1F6F1 { background-position: -460px -760px; }
+.emoji-1F6F2 { background-position: -480px -760px; }
+.emoji-1F6F3 { background-position: -500px -760px; }
+.emoji-1F910 { background-position: -520px -760px; }
+.emoji-1F911 { background-position: -540px -760px; }
+.emoji-1F912 { background-position: -560px -760px; }
+.emoji-1F913 { background-position: -580px -760px; }
+.emoji-1F914 { background-position: -600px -760px; }
+.emoji-1F915 { background-position: -620px -760px; }
+.emoji-1F916 { background-position: -640px -760px; }
+.emoji-1F917 { background-position: -660px -760px; }
+.emoji-1F918 { background-position: -680px -760px; }
+.emoji-1F918-1F3FB { background-position: -700px -760px; }
+.emoji-1F918-1F3FC { background-position: -720px -760px; }
+.emoji-1F918-1F3FD { background-position: -740px -760px; }
+.emoji-1F918-1F3FE { background-position: -760px -760px; }
+.emoji-1F918-1F3FF { background-position: -780px 0px; }
+.emoji-1F980 { background-position: -780px -20px; }
+.emoji-1F981 { background-position: -780px -40px; }
+.emoji-1F982 { background-position: -780px -60px; }
+.emoji-1F983 { background-position: -780px -80px; }
+.emoji-1F984 { background-position: -780px -100px; }
+.emoji-1F9C0 { background-position: -780px -120px; }
+.emoji-203C { background-position: -780px -140px; }
+.emoji-2049 { background-position: -780px -160px; }
+.emoji-2122 { background-position: -780px -180px; }
+.emoji-2139 { background-position: -780px -200px; }
+.emoji-2194 { background-position: -780px -220px; }
+.emoji-2195 { background-position: -780px -240px; }
+.emoji-2196 { background-position: -780px -260px; }
+.emoji-2197 { background-position: -780px -280px; }
+.emoji-2198 { background-position: -780px -300px; }
+.emoji-2199 { background-position: -780px -320px; }
+.emoji-21A9 { background-position: -780px -340px; }
+.emoji-21AA { background-position: -780px -360px; }
+.emoji-231A { background-position: -780px -380px; }
+.emoji-231B { background-position: -780px -400px; }
+.emoji-2328 { background-position: -780px -420px; }
+.emoji-23E9 { background-position: -780px -440px; }
+.emoji-23EA { background-position: -780px -460px; }
+.emoji-23EB { background-position: -780px -480px; }
+.emoji-23EC { background-position: -780px -500px; }
+.emoji-23ED { background-position: -780px -520px; }
+.emoji-23EE { background-position: -780px -540px; }
+.emoji-23EF { background-position: -780px -560px; }
+.emoji-23F0 { background-position: -780px -580px; }
+.emoji-23F1 { background-position: -780px -600px; }
+.emoji-23F2 { background-position: -780px -620px; }
+.emoji-23F3 { background-position: -780px -640px; }
+.emoji-23F8 { background-position: -780px -660px; }
+.emoji-23F9 { background-position: -780px -680px; }
+.emoji-23FA { background-position: -780px -700px; }
+.emoji-24C2 { background-position: -780px -720px; }
+.emoji-25AA { background-position: -780px -740px; }
+.emoji-25AB { background-position: -780px -760px; }
+.emoji-25B6 { background-position: 0px -780px; }
+.emoji-25C0 { background-position: -20px -780px; }
+.emoji-25FB { background-position: -40px -780px; }
+.emoji-25FC { background-position: -60px -780px; }
+.emoji-25FD { background-position: -80px -780px; }
+.emoji-25FE { background-position: -100px -780px; }
+.emoji-2600 { background-position: -120px -780px; }
+.emoji-2601 { background-position: -140px -780px; }
+.emoji-2602 { background-position: -160px -780px; }
+.emoji-2603 { background-position: -180px -780px; }
+.emoji-2604 { background-position: -200px -780px; }
+.emoji-260E { background-position: -220px -780px; }
+.emoji-2611 { background-position: -240px -780px; }
+.emoji-2614 { background-position: -260px -780px; }
+.emoji-2615 { background-position: -280px -780px; }
+.emoji-2618 { background-position: -300px -780px; }
+.emoji-261D { background-position: -320px -780px; }
+.emoji-261D-1F3FB { background-position: -340px -780px; }
+.emoji-261D-1F3FC { background-position: -360px -780px; }
+.emoji-261D-1F3FD { background-position: -380px -780px; }
+.emoji-261D-1F3FE { background-position: -400px -780px; }
+.emoji-261D-1F3FF { background-position: -420px -780px; }
+.emoji-2620 { background-position: -440px -780px; }
+.emoji-2622 { background-position: -460px -780px; }
+.emoji-2623 { background-position: -480px -780px; }
+.emoji-2626 { background-position: -500px -780px; }
+.emoji-262A { background-position: -520px -780px; }
+.emoji-262E { background-position: -540px -780px; }
+.emoji-262F { background-position: -560px -780px; }
+.emoji-2638 { background-position: -580px -780px; }
+.emoji-2639 { background-position: -600px -780px; }
+.emoji-263A { background-position: -620px -780px; }
+.emoji-2648 { background-position: -640px -780px; }
+.emoji-2649 { background-position: -660px -780px; }
+.emoji-264A { background-position: -680px -780px; }
+.emoji-264B { background-position: -700px -780px; }
+.emoji-264C { background-position: -720px -780px; }
+.emoji-264D { background-position: -740px -780px; }
+.emoji-264E { background-position: -760px -780px; }
+.emoji-264F { background-position: -780px -780px; }
+.emoji-2650 { background-position: -800px 0px; }
+.emoji-2651 { background-position: -800px -20px; }
+.emoji-2652 { background-position: -800px -40px; }
+.emoji-2653 { background-position: -800px -60px; }
+.emoji-2660 { background-position: -800px -80px; }
+.emoji-2663 { background-position: -800px -100px; }
+.emoji-2665 { background-position: -800px -120px; }
+.emoji-2666 { background-position: -800px -140px; }
+.emoji-2668 { background-position: -800px -160px; }
+.emoji-267B { background-position: -800px -180px; }
+.emoji-267F { background-position: -800px -200px; }
+.emoji-2692 { background-position: -800px -220px; }
+.emoji-2693 { background-position: -800px -240px; }
+.emoji-2694 { background-position: -800px -260px; }
+.emoji-2696 { background-position: -800px -280px; }
+.emoji-2697 { background-position: -800px -300px; }
+.emoji-2699 { background-position: -800px -320px; }
+.emoji-269B { background-position: -800px -340px; }
+.emoji-269C { background-position: -800px -360px; }
+.emoji-26A0 { background-position: -800px -380px; }
+.emoji-26A1 { background-position: -800px -400px; }
+.emoji-26AA { background-position: -800px -420px; }
+.emoji-26AB { background-position: -800px -440px; }
+.emoji-26B0 { background-position: -800px -460px; }
+.emoji-26B1 { background-position: -800px -480px; }
+.emoji-26BD { background-position: -800px -500px; }
+.emoji-26BE { background-position: -800px -520px; }
+.emoji-26C4 { background-position: -800px -540px; }
+.emoji-26C5 { background-position: -800px -560px; }
+.emoji-26C8 { background-position: -800px -580px; }
+.emoji-26CE { background-position: -800px -600px; }
+.emoji-26CF { background-position: -800px -620px; }
+.emoji-26D1 { background-position: -800px -640px; }
+.emoji-26D3 { background-position: -800px -660px; }
+.emoji-26D4 { background-position: -800px -680px; }
+.emoji-26E9 { background-position: -800px -700px; }
+.emoji-26EA { background-position: -800px -720px; }
+.emoji-26F0 { background-position: -800px -740px; }
+.emoji-26F1 { background-position: -800px -760px; }
+.emoji-26F2 { background-position: -800px -780px; }
+.emoji-26F3 { background-position: 0px -800px; }
+.emoji-26F4 { background-position: -20px -800px; }
+.emoji-26F5 { background-position: -40px -800px; }
+.emoji-26F7 { background-position: -60px -800px; }
+.emoji-26F8 { background-position: -80px -800px; }
+.emoji-26F9 { background-position: -100px -800px; }
+.emoji-26F9-1F3FB { background-position: -120px -800px; }
+.emoji-26F9-1F3FC { background-position: -140px -800px; }
+.emoji-26F9-1F3FD { background-position: -160px -800px; }
+.emoji-26F9-1F3FE { background-position: -180px -800px; }
+.emoji-26F9-1F3FF { background-position: -200px -800px; }
+.emoji-26FA { background-position: -220px -800px; }
+.emoji-26FD { background-position: -240px -800px; }
+.emoji-2702 { background-position: -260px -800px; }
+.emoji-2705 { background-position: -280px -800px; }
+.emoji-2708 { background-position: -300px -800px; }
+.emoji-2709 { background-position: -320px -800px; }
+.emoji-270A { background-position: -340px -800px; }
+.emoji-270A-1F3FB { background-position: -360px -800px; }
+.emoji-270A-1F3FC { background-position: -380px -800px; }
+.emoji-270A-1F3FD { background-position: -400px -800px; }
+.emoji-270A-1F3FE { background-position: -420px -800px; }
+.emoji-270A-1F3FF { background-position: -440px -800px; }
+.emoji-270B { background-position: -460px -800px; }
+.emoji-270B-1F3FB { background-position: -480px -800px; }
+.emoji-270B-1F3FC { background-position: -500px -800px; }
+.emoji-270B-1F3FD { background-position: -520px -800px; }
+.emoji-270B-1F3FE { background-position: -540px -800px; }
+.emoji-270B-1F3FF { background-position: -560px -800px; }
+.emoji-270C { background-position: -580px -800px; }
+.emoji-270C-1F3FB { background-position: -600px -800px; }
+.emoji-270C-1F3FC { background-position: -620px -800px; }
+.emoji-270C-1F3FD { background-position: -640px -800px; }
+.emoji-270C-1F3FE { background-position: -660px -800px; }
+.emoji-270C-1F3FF { background-position: -680px -800px; }
+.emoji-270D { background-position: -700px -800px; }
+.emoji-270D-1F3FB { background-position: -720px -800px; }
+.emoji-270D-1F3FC { background-position: -740px -800px; }
+.emoji-270D-1F3FD { background-position: -760px -800px; }
+.emoji-270D-1F3FE { background-position: -780px -800px; }
+.emoji-270D-1F3FF { background-position: -800px -800px; }
+.emoji-270F { background-position: -820px 0px; }
+.emoji-2712 { background-position: -820px -20px; }
+.emoji-2714 { background-position: -820px -40px; }
+.emoji-2716 { background-position: -820px -60px; }
+.emoji-271D { background-position: -820px -80px; }
+.emoji-2721 { background-position: -820px -100px; }
+.emoji-2728 { background-position: -820px -120px; }
+.emoji-2733 { background-position: -820px -140px; }
+.emoji-2734 { background-position: -820px -160px; }
+.emoji-2744 { background-position: -820px -180px; }
+.emoji-2747 { background-position: -820px -200px; }
+.emoji-274C { background-position: -820px -220px; }
+.emoji-274E { background-position: -820px -240px; }
+.emoji-2753 { background-position: -820px -260px; }
+.emoji-2754 { background-position: -820px -280px; }
+.emoji-2755 { background-position: -820px -300px; }
+.emoji-2757 { background-position: -820px -320px; }
+.emoji-2763 { background-position: -820px -340px; }
+.emoji-2764 { background-position: -820px -360px; }
+.emoji-2795 { background-position: -820px -380px; }
+.emoji-2796 { background-position: -820px -400px; }
+.emoji-2797 { background-position: -820px -420px; }
+.emoji-27A1 { background-position: -820px -440px; }
+.emoji-27B0 { background-position: -820px -460px; }
+.emoji-27BF { background-position: -820px -480px; }
+.emoji-2934 { background-position: -820px -500px; }
+.emoji-2935 { background-position: -820px -520px; }
+.emoji-2B05 { background-position: -820px -540px; }
+.emoji-2B06 { background-position: -820px -560px; }
+.emoji-2B07 { background-position: -820px -580px; }
+.emoji-2B1B { background-position: -820px -600px; }
+.emoji-2B1C { background-position: -820px -620px; }
+.emoji-2B50 { background-position: -820px -640px; }
+.emoji-2B55 { background-position: -820px -660px; }
+.emoji-3030 { background-position: -820px -680px; }
+.emoji-303D { background-position: -820px -700px; }
+.emoji-3297 { background-position: -820px -720px; }
+.emoji-3299 { background-position: -820px -740px; }
-.emoji-icon{
- background-image: image-url("emoji.png");
+.emoji-icon {
+ background-image: image-url('emoji.png');
background-repeat: no-repeat;
-}
+ height: 20px;
+ width: 20px;
-.emoji-0023-20E3 { background-position: 0px 0px; }
-.emoji-0030-20E3 { background-position: -20px 0px; }
-.emoji-0031-20E3 { background-position: -40px 0px; }
-.emoji-0032-20E3 { background-position: -60px 0px; }
-.emoji-0033-20E3 { background-position: -80px 0px; }
-.emoji-0034-20E3 { background-position: -100px 0px; }
-.emoji-0035-20E3 { background-position: -120px 0px; }
-.emoji-0036-20E3 { background-position: -140px 0px; }
-.emoji-0037-20E3 { background-position: -160px 0px; }
-.emoji-0038-20E3 { background-position: -180px 0px; }
-.emoji-0039-20E3 { background-position: -200px 0px; }
-.emoji-00A9 { background-position: -220px 0px; }
-.emoji-00AE { background-position: -240px 0px; }
-.emoji-1F004 { background-position: -260px 0px; }
-.emoji-1F0CF { background-position: -280px 0px; }
-.emoji-1F170 { background-position: -300px 0px; }
-.emoji-1F171 { background-position: -320px 0px; }
-.emoji-1F17E { background-position: -340px 0px; }
-.emoji-1F17F { background-position: -360px 0px; }
-.emoji-1F18E { background-position: -380px 0px; }
-.emoji-1F191 { background-position: -400px 0px; }
-.emoji-1F192 { background-position: -420px 0px; }
-.emoji-1F193 { background-position: -440px 0px; }
-.emoji-1F194 { background-position: -460px 0px; }
-.emoji-1F195 { background-position: -480px 0px; }
-.emoji-1F196 { background-position: -500px 0px; }
-.emoji-1F197 { background-position: -520px 0px; }
-.emoji-1F198 { background-position: -540px 0px; }
-.emoji-1F199 { background-position: -560px 0px; }
-.emoji-1F19A { background-position: -580px 0px; }
-.emoji-1F1E6-1F1E8 { background-position: -600px 0px; }
-.emoji-1F1E6-1F1E9 { background-position: -620px 0px; }
-.emoji-1F1E6-1F1EA { background-position: -640px 0px; }
-.emoji-1F1E6-1F1EB { background-position: -660px 0px; }
-.emoji-1F1E6-1F1EC { background-position: -680px 0px; }
-.emoji-1F1E6-1F1EE { background-position: -700px 0px; }
-.emoji-1F1E6-1F1F1 { background-position: -720px 0px; }
-.emoji-1F1E6-1F1F2 { background-position: -740px 0px; }
-.emoji-1F1E6-1F1F4 { background-position: -760px 0px; }
-.emoji-1F1E6-1F1F7 { background-position: -780px 0px; }
-.emoji-1F1E6-1F1F9 { background-position: -800px 0px; }
-.emoji-1F1E6-1F1FA { background-position: -820px 0px; }
-.emoji-1F1E6-1F1FC { background-position: -840px 0px; }
-.emoji-1F1E6-1F1FF { background-position: -860px 0px; }
-.emoji-1F1E7-1F1E6 { background-position: -880px 0px; }
-.emoji-1F1E7-1F1E7 { background-position: -900px 0px; }
-.emoji-1F1E7-1F1E9 { background-position: -920px 0px; }
-.emoji-1F1E7-1F1EA { background-position: -940px 0px; }
-.emoji-1F1E7-1F1EB { background-position: -960px 0px; }
-.emoji-1F1E7-1F1EC { background-position: -980px 0px; }
-.emoji-1F1E7-1F1ED { background-position: -1000px 0px; }
-.emoji-1F1E7-1F1EE { background-position: -1020px 0px; }
-.emoji-1F1E7-1F1EF { background-position: -1040px 0px; }
-.emoji-1F1E7-1F1F2 { background-position: -1060px 0px; }
-.emoji-1F1E7-1F1F3 { background-position: -1080px 0px; }
-.emoji-1F1E7-1F1F4 { background-position: -1100px 0px; }
-.emoji-1F1E7-1F1F7 { background-position: -1120px 0px; }
-.emoji-1F1E7-1F1F8 { background-position: -1140px 0px; }
-.emoji-1F1E7-1F1F9 { background-position: -1160px 0px; }
-.emoji-1F1E7-1F1FC { background-position: -1180px 0px; }
-.emoji-1F1E7-1F1FE { background-position: -1200px 0px; }
-.emoji-1F1E7-1F1FF { background-position: -1220px 0px; }
-.emoji-1F1E8-1F1E6 { background-position: -1240px 0px; }
-.emoji-1F1E8-1F1E9 { background-position: -1260px 0px; }
-.emoji-1F1E8-1F1EB { background-position: -1280px 0px; }
-.emoji-1F1E8-1F1EC { background-position: -1300px 0px; }
-.emoji-1F1E8-1F1ED { background-position: -1320px 0px; }
-.emoji-1F1E8-1F1EE { background-position: -1340px 0px; }
-.emoji-1F1E8-1F1F1 { background-position: -1360px 0px; }
-.emoji-1F1E8-1F1F2 { background-position: -1380px 0px; }
-.emoji-1F1E8-1F1F3 { background-position: -1400px 0px; }
-.emoji-1F1E8-1F1F4 { background-position: -1420px 0px; }
-.emoji-1F1E8-1F1F7 { background-position: -1440px 0px; }
-.emoji-1F1E8-1F1FA { background-position: -1460px 0px; }
-.emoji-1F1E8-1F1FB { background-position: -1480px 0px; }
-.emoji-1F1E8-1F1FE { background-position: -1500px 0px; }
-.emoji-1F1E8-1F1FF { background-position: -1520px 0px; }
-.emoji-1F1E9-1F1EA { background-position: -1540px 0px; }
-.emoji-1F1E9-1F1EF { background-position: -1560px 0px; }
-.emoji-1F1E9-1F1F0 { background-position: -1580px 0px; }
-.emoji-1F1E9-1F1F2 { background-position: -1600px 0px; }
-.emoji-1F1E9-1F1F4 { background-position: -1620px 0px; }
-.emoji-1F1E9-1F1FF { background-position: -1640px 0px; }
-.emoji-1F1EA-1F1E8 { background-position: -1660px 0px; }
-.emoji-1F1EA-1F1EA { background-position: -1680px 0px; }
-.emoji-1F1EA-1F1EC { background-position: -1700px 0px; }
-.emoji-1F1EA-1F1ED { background-position: -1720px 0px; }
-.emoji-1F1EA-1F1F7 { background-position: -1740px 0px; }
-.emoji-1F1EA-1F1F8 { background-position: -1760px 0px; }
-.emoji-1F1EA-1F1F9 { background-position: -1780px 0px; }
-.emoji-1F1EB-1F1EE { background-position: -1800px 0px; }
-.emoji-1F1EB-1F1EF { background-position: -1820px 0px; }
-.emoji-1F1EB-1F1F0 { background-position: -1840px 0px; }
-.emoji-1F1EB-1F1F2 { background-position: -1860px 0px; }
-.emoji-1F1EB-1F1F4 { background-position: -1880px 0px; }
-.emoji-1F1EB-1F1F7 { background-position: -1900px 0px; }
-.emoji-1F1EC-1F1E6 { background-position: -1920px 0px; }
-.emoji-1F1EC-1F1E7 { background-position: -1940px 0px; }
-.emoji-1F1EC-1F1E9 { background-position: -1960px 0px; }
-.emoji-1F1EC-1F1EA { background-position: -1980px 0px; }
-.emoji-1F1EC-1F1ED { background-position: -2000px 0px; }
-.emoji-1F1EC-1F1EE { background-position: -2020px 0px; }
-.emoji-1F1EC-1F1F1 { background-position: -2040px 0px; }
-.emoji-1F1EC-1F1F2 { background-position: -2060px 0px; }
-.emoji-1F1EC-1F1F3 { background-position: -2080px 0px; }
-.emoji-1F1EC-1F1F6 { background-position: -2100px 0px; }
-.emoji-1F1EC-1F1F7 { background-position: -2120px 0px; }
-.emoji-1F1EC-1F1F9 { background-position: -2140px 0px; }
-.emoji-1F1EC-1F1FA { background-position: -2160px 0px; }
-.emoji-1F1EC-1F1FC { background-position: -2180px 0px; }
-.emoji-1F1EC-1F1FE { background-position: -2200px 0px; }
-.emoji-1F1ED-1F1F0 { background-position: -2220px 0px; }
-.emoji-1F1ED-1F1F3 { background-position: -2240px 0px; }
-.emoji-1F1ED-1F1F7 { background-position: -2260px 0px; }
-.emoji-1F1ED-1F1F9 { background-position: -2280px 0px; }
-.emoji-1F1ED-1F1FA { background-position: -2300px 0px; }
-.emoji-1F1EE-1F1E9 { background-position: -2320px 0px; }
-.emoji-1F1EE-1F1EA { background-position: -2340px 0px; }
-.emoji-1F1EE-1F1F1 { background-position: -2360px 0px; }
-.emoji-1F1EE-1F1F3 { background-position: -2380px 0px; }
-.emoji-1F1EE-1F1F6 { background-position: -2400px 0px; }
-.emoji-1F1EE-1F1F7 { background-position: -2420px 0px; }
-.emoji-1F1EE-1F1F8 { background-position: -2440px 0px; }
-.emoji-1F1EE-1F1F9 { background-position: -2460px 0px; }
-.emoji-1F1EF-1F1EA { background-position: -2480px 0px; }
-.emoji-1F1EF-1F1F2 { background-position: -2500px 0px; }
-.emoji-1F1EF-1F1F4 { background-position: -2520px 0px; }
-.emoji-1F1EF-1F1F5 { background-position: -2540px 0px; }
-.emoji-1F1F0-1F1EA { background-position: -2560px 0px; }
-.emoji-1F1F0-1F1EC { background-position: -2580px 0px; }
-.emoji-1F1F0-1F1ED { background-position: -2600px 0px; }
-.emoji-1F1F0-1F1EE { background-position: -2620px 0px; }
-.emoji-1F1F0-1F1F2 { background-position: -2640px 0px; }
-.emoji-1F1F0-1F1F3 { background-position: -2660px 0px; }
-.emoji-1F1F0-1F1F5 { background-position: -2680px 0px; }
-.emoji-1F1F0-1F1F7 { background-position: -2700px 0px; }
-.emoji-1F1F0-1F1FC { background-position: -2720px 0px; }
-.emoji-1F1F0-1F1FE { background-position: -2740px 0px; }
-.emoji-1F1F0-1F1FF { background-position: -2760px 0px; }
-.emoji-1F1F1-1F1E6 { background-position: -2780px 0px; }
-.emoji-1F1F1-1F1E7 { background-position: -2800px 0px; }
-.emoji-1F1F1-1F1E8 { background-position: -2820px 0px; }
-.emoji-1F1F1-1F1EE { background-position: -2840px 0px; }
-.emoji-1F1F1-1F1F0 { background-position: -2860px 0px; }
-.emoji-1F1F1-1F1F7 { background-position: -2880px 0px; }
-.emoji-1F1F1-1F1F8 { background-position: -2900px 0px; }
-.emoji-1F1F1-1F1F9 { background-position: -2920px 0px; }
-.emoji-1F1F1-1F1FA { background-position: -2940px 0px; }
-.emoji-1F1F1-1F1FB { background-position: -2960px 0px; }
-.emoji-1F1F1-1F1FE { background-position: -2980px 0px; }
-.emoji-1F1F2-1F1E6 { background-position: -3000px 0px; }
-.emoji-1F1F2-1F1E8 { background-position: -3020px 0px; }
-.emoji-1F1F2-1F1E9 { background-position: -3040px 0px; }
-.emoji-1F1F2-1F1EA { background-position: -3060px 0px; }
-.emoji-1F1F2-1F1EC { background-position: -3080px 0px; }
-.emoji-1F1F2-1F1ED { background-position: -3100px 0px; }
-.emoji-1F1F2-1F1F0 { background-position: -3120px 0px; }
-.emoji-1F1F2-1F1F1 { background-position: -3140px 0px; }
-.emoji-1F1F2-1F1F2 { background-position: -3160px 0px; }
-.emoji-1F1F2-1F1F3 { background-position: -3180px 0px; }
-.emoji-1F1F2-1F1F4 { background-position: -3200px 0px; }
-.emoji-1F1F2-1F1F7 { background-position: -3220px 0px; }
-.emoji-1F1F2-1F1F8 { background-position: -3240px 0px; }
-.emoji-1F1F2-1F1F9 { background-position: -3260px 0px; }
-.emoji-1F1F2-1F1FA { background-position: -3280px 0px; }
-.emoji-1F1F2-1F1FB { background-position: -3300px 0px; }
-.emoji-1F1F2-1F1FC { background-position: -3320px 0px; }
-.emoji-1F1F2-1F1FD { background-position: -3340px 0px; }
-.emoji-1F1F2-1F1FE { background-position: -3360px 0px; }
-.emoji-1F1F2-1F1FF { background-position: -3380px 0px; }
-.emoji-1F1F3-1F1E6 { background-position: -3400px 0px; }
-.emoji-1F1F3-1F1E8 { background-position: -3420px 0px; }
-.emoji-1F1F3-1F1EA { background-position: -3440px 0px; }
-.emoji-1F1F3-1F1EC { background-position: -3460px 0px; }
-.emoji-1F1F3-1F1EE { background-position: -3480px 0px; }
-.emoji-1F1F3-1F1F1 { background-position: -3500px 0px; }
-.emoji-1F1F3-1F1F4 { background-position: -3520px 0px; }
-.emoji-1F1F3-1F1F5 { background-position: -3540px 0px; }
-.emoji-1F1F3-1F1F7 { background-position: -3560px 0px; }
-.emoji-1F1F3-1F1FA { background-position: -3580px 0px; }
-.emoji-1F1F3-1F1FF { background-position: -3600px 0px; }
-.emoji-1F1F4-1F1F2 { background-position: -3620px 0px; }
-.emoji-1F1F5-1F1E6 { background-position: -3640px 0px; }
-.emoji-1F1F5-1F1EA { background-position: -3660px 0px; }
-.emoji-1F1F5-1F1EB { background-position: -3680px 0px; }
-.emoji-1F1F5-1F1EC { background-position: -3700px 0px; }
-.emoji-1F1F5-1F1ED { background-position: -3720px 0px; }
-.emoji-1F1F5-1F1F0 { background-position: -3740px 0px; }
-.emoji-1F1F5-1F1F1 { background-position: -3760px 0px; }
-.emoji-1F1F5-1F1F7 { background-position: -3780px 0px; }
-.emoji-1F1F5-1F1F8 { background-position: -3800px 0px; }
-.emoji-1F1F5-1F1F9 { background-position: -3820px 0px; }
-.emoji-1F1F5-1F1FC { background-position: -3840px 0px; }
-.emoji-1F1F5-1F1FE { background-position: -3860px 0px; }
-.emoji-1F1F6-1F1E6 { background-position: -3880px 0px; }
-.emoji-1F1F7-1F1F4 { background-position: -3900px 0px; }
-.emoji-1F1F7-1F1F8 { background-position: -3920px 0px; }
-.emoji-1F1F7-1F1FA { background-position: -3940px 0px; }
-.emoji-1F1F7-1F1FC { background-position: -3960px 0px; }
-.emoji-1F1F8-1F1E6 { background-position: -3980px 0px; }
-.emoji-1F1F8-1F1E7 { background-position: -4000px 0px; }
-.emoji-1F1F8-1F1E8 { background-position: -4020px 0px; }
-.emoji-1F1F8-1F1E9 { background-position: -4040px 0px; }
-.emoji-1F1F8-1F1EA { background-position: -4060px 0px; }
-.emoji-1F1F8-1F1EC { background-position: -4080px 0px; }
-.emoji-1F1F8-1F1ED { background-position: -4100px 0px; }
-.emoji-1F1F8-1F1EE { background-position: -4120px 0px; }
-.emoji-1F1F8-1F1F0 { background-position: -4140px 0px; }
-.emoji-1F1F8-1F1F1 { background-position: -4160px 0px; }
-.emoji-1F1F8-1F1F2 { background-position: -4180px 0px; }
-.emoji-1F1F8-1F1F3 { background-position: -4200px 0px; }
-.emoji-1F1F8-1F1F4 { background-position: -4220px 0px; }
-.emoji-1F1F8-1F1F7 { background-position: -4240px 0px; }
-.emoji-1F1F8-1F1F9 { background-position: -4260px 0px; }
-.emoji-1F1F8-1F1FB { background-position: -4280px 0px; }
-.emoji-1F1F8-1F1FE { background-position: -4300px 0px; }
-.emoji-1F1F8-1F1FF { background-position: -4320px 0px; }
-.emoji-1F1F9-1F1E9 { background-position: -4340px 0px; }
-.emoji-1F1F9-1F1EC { background-position: -4360px 0px; }
-.emoji-1F1F9-1F1ED { background-position: -4380px 0px; }
-.emoji-1F1F9-1F1EF { background-position: -4400px 0px; }
-.emoji-1F1F9-1F1F1 { background-position: -4420px 0px; }
-.emoji-1F1F9-1F1F2 { background-position: -4440px 0px; }
-.emoji-1F1F9-1F1F3 { background-position: -4460px 0px; }
-.emoji-1F1F9-1F1F4 { background-position: -4480px 0px; }
-.emoji-1F1F9-1F1F7 { background-position: -4500px 0px; }
-.emoji-1F1F9-1F1F9 { background-position: -4520px 0px; }
-.emoji-1F1F9-1F1FB { background-position: -4540px 0px; }
-.emoji-1F1F9-1F1FC { background-position: -4560px 0px; }
-.emoji-1F1F9-1F1FF { background-position: -4580px 0px; }
-.emoji-1F1FA-1F1E6 { background-position: -4600px 0px; }
-.emoji-1F1FA-1F1EC { background-position: -4620px 0px; }
-.emoji-1F1FA-1F1F8 { background-position: -4640px 0px; }
-.emoji-1F1FA-1F1FE { background-position: -4660px 0px; }
-.emoji-1F1FA-1F1FF { background-position: -4680px 0px; }
-.emoji-1F1FB-1F1E6 { background-position: -4700px 0px; }
-.emoji-1F1FB-1F1E8 { background-position: -4720px 0px; }
-.emoji-1F1FB-1F1EA { background-position: -4740px 0px; }
-.emoji-1F1FB-1F1EE { background-position: -4760px 0px; }
-.emoji-1F1FB-1F1F3 { background-position: -4780px 0px; }
-.emoji-1F1FB-1F1FA { background-position: -4800px 0px; }
-.emoji-1F1FC-1F1EB { background-position: -4820px 0px; }
-.emoji-1F1FC-1F1F8 { background-position: -4840px 0px; }
-.emoji-1F1FD-1F1F0 { background-position: -4860px 0px; }
-.emoji-1F1FE-1F1EA { background-position: -4880px 0px; }
-.emoji-1F1FF-1F1E6 { background-position: -4900px 0px; }
-.emoji-1F1FF-1F1F2 { background-position: -4920px 0px; }
-.emoji-1F1FF-1F1FC { background-position: -4940px 0px; }
-.emoji-1F201 { background-position: -4960px 0px; }
-.emoji-1F202 { background-position: -4980px 0px; }
-.emoji-1F21A { background-position: -5000px 0px; }
-.emoji-1F22F { background-position: -5020px 0px; }
-.emoji-1F232 { background-position: -5040px 0px; }
-.emoji-1F233 { background-position: -5060px 0px; }
-.emoji-1F234 { background-position: -5080px 0px; }
-.emoji-1F235 { background-position: -5100px 0px; }
-.emoji-1F236 { background-position: -5120px 0px; }
-.emoji-1F237 { background-position: -5140px 0px; }
-.emoji-1F238 { background-position: -5160px 0px; }
-.emoji-1F239 { background-position: -5180px 0px; }
-.emoji-1F23A { background-position: -5200px 0px; }
-.emoji-1F250 { background-position: -5220px 0px; }
-.emoji-1F251 { background-position: -5240px 0px; }
-.emoji-1F300 { background-position: -5260px 0px; }
-.emoji-1F301 { background-position: -5280px 0px; }
-.emoji-1F302 { background-position: -5300px 0px; }
-.emoji-1F303 { background-position: -5320px 0px; }
-.emoji-1F304 { background-position: -5340px 0px; }
-.emoji-1F305 { background-position: -5360px 0px; }
-.emoji-1F306 { background-position: -5380px 0px; }
-.emoji-1F307 { background-position: -5400px 0px; }
-.emoji-1F308 { background-position: -5420px 0px; }
-.emoji-1F309 { background-position: -5440px 0px; }
-.emoji-1F30A { background-position: -5460px 0px; }
-.emoji-1F30B { background-position: -5480px 0px; }
-.emoji-1F30C { background-position: -5500px 0px; }
-.emoji-1F30D { background-position: -5520px 0px; }
-.emoji-1F30E { background-position: -5540px 0px; }
-.emoji-1F30F { background-position: -5560px 0px; }
-.emoji-1F310 { background-position: -5580px 0px; }
-.emoji-1F311 { background-position: -5600px 0px; }
-.emoji-1F312 { background-position: -5620px 0px; }
-.emoji-1F313 { background-position: -5640px 0px; }
-.emoji-1F314 { background-position: -5660px 0px; }
-.emoji-1F315 { background-position: -5680px 0px; }
-.emoji-1F316 { background-position: -5700px 0px; }
-.emoji-1F317 { background-position: -5720px 0px; }
-.emoji-1F318 { background-position: -5740px 0px; }
-.emoji-1F319 { background-position: -5760px 0px; }
-.emoji-1F31A { background-position: -5780px 0px; }
-.emoji-1F31B { background-position: -5800px 0px; }
-.emoji-1F31C { background-position: -5820px 0px; }
-.emoji-1F31D { background-position: -5840px 0px; }
-.emoji-1F31E { background-position: -5860px 0px; }
-.emoji-1F31F { background-position: -5880px 0px; }
-.emoji-1F320 { background-position: -5900px 0px; }
-.emoji-1F321 { background-position: -5920px 0px; }
-.emoji-1F327 { background-position: -5940px 0px; }
-.emoji-1F328 { background-position: -5960px 0px; }
-.emoji-1F329 { background-position: -5980px 0px; }
-.emoji-1F32A { background-position: -6000px 0px; }
-.emoji-1F32B { background-position: -6020px 0px; }
-.emoji-1F32C { background-position: -6040px 0px; }
-.emoji-1F330 { background-position: -6060px 0px; }
-.emoji-1F331 { background-position: -6080px 0px; }
-.emoji-1F332 { background-position: -6100px 0px; }
-.emoji-1F333 { background-position: -6120px 0px; }
-.emoji-1F334 { background-position: -6140px 0px; }
-.emoji-1F335 { background-position: -6160px 0px; }
-.emoji-1F336 { background-position: -6180px 0px; }
-.emoji-1F337 { background-position: -6200px 0px; }
-.emoji-1F338 { background-position: -6220px 0px; }
-.emoji-1F339 { background-position: -6240px 0px; }
-.emoji-1F33A { background-position: -6260px 0px; }
-.emoji-1F33B { background-position: -6280px 0px; }
-.emoji-1F33C { background-position: -6300px 0px; }
-.emoji-1F33D { background-position: -6320px 0px; }
-.emoji-1F33E { background-position: -6340px 0px; }
-.emoji-1F33F { background-position: -6360px 0px; }
-.emoji-1F340 { background-position: -6380px 0px; }
-.emoji-1F341 { background-position: -6400px 0px; }
-.emoji-1F342 { background-position: -6420px 0px; }
-.emoji-1F343 { background-position: -6440px 0px; }
-.emoji-1F344 { background-position: -6460px 0px; }
-.emoji-1F345 { background-position: -6480px 0px; }
-.emoji-1F346 { background-position: -6500px 0px; }
-.emoji-1F347 { background-position: -6520px 0px; }
-.emoji-1F348 { background-position: -6540px 0px; }
-.emoji-1F349 { background-position: -6560px 0px; }
-.emoji-1F34A { background-position: -6580px 0px; }
-.emoji-1F34B { background-position: -6600px 0px; }
-.emoji-1F34C { background-position: -6620px 0px; }
-.emoji-1F34D { background-position: -6640px 0px; }
-.emoji-1F34E { background-position: -6660px 0px; }
-.emoji-1F34F { background-position: -6680px 0px; }
-.emoji-1F350 { background-position: -6700px 0px; }
-.emoji-1F351 { background-position: -6720px 0px; }
-.emoji-1F352 { background-position: -6740px 0px; }
-.emoji-1F353 { background-position: -6760px 0px; }
-.emoji-1F354 { background-position: -6780px 0px; }
-.emoji-1F355 { background-position: -6800px 0px; }
-.emoji-1F356 { background-position: -6820px 0px; }
-.emoji-1F357 { background-position: -6840px 0px; }
-.emoji-1F358 { background-position: -6860px 0px; }
-.emoji-1F359 { background-position: -6880px 0px; }
-.emoji-1F35A { background-position: -6900px 0px; }
-.emoji-1F35B { background-position: -6920px 0px; }
-.emoji-1F35C { background-position: -6940px 0px; }
-.emoji-1F35D { background-position: -6960px 0px; }
-.emoji-1F35E { background-position: -6980px 0px; }
-.emoji-1F35F { background-position: -7000px 0px; }
-.emoji-1F360 { background-position: -7020px 0px; }
-.emoji-1F361 { background-position: -7040px 0px; }
-.emoji-1F362 { background-position: -7060px 0px; }
-.emoji-1F363 { background-position: -7080px 0px; }
-.emoji-1F364 { background-position: -7100px 0px; }
-.emoji-1F365 { background-position: -7120px 0px; }
-.emoji-1F366 { background-position: -7140px 0px; }
-.emoji-1F367 { background-position: -7160px 0px; }
-.emoji-1F368 { background-position: -7180px 0px; }
-.emoji-1F369 { background-position: -7200px 0px; }
-.emoji-1F36A { background-position: -7220px 0px; }
-.emoji-1F36B { background-position: -7240px 0px; }
-.emoji-1F36C { background-position: -7260px 0px; }
-.emoji-1F36D { background-position: -7280px 0px; }
-.emoji-1F36E { background-position: -7300px 0px; }
-.emoji-1F36F { background-position: -7320px 0px; }
-.emoji-1F370 { background-position: -7340px 0px; }
-.emoji-1F371 { background-position: -7360px 0px; }
-.emoji-1F372 { background-position: -7380px 0px; }
-.emoji-1F373 { background-position: -7400px 0px; }
-.emoji-1F374 { background-position: -7420px 0px; }
-.emoji-1F375 { background-position: -7440px 0px; }
-.emoji-1F376 { background-position: -7460px 0px; }
-.emoji-1F377 { background-position: -7480px 0px; }
-.emoji-1F378 { background-position: -7500px 0px; }
-.emoji-1F379 { background-position: -7520px 0px; }
-.emoji-1F37A { background-position: -7540px 0px; }
-.emoji-1F37B { background-position: -7560px 0px; }
-.emoji-1F37C { background-position: -7580px 0px; }
-.emoji-1F37D { background-position: -7600px 0px; }
-.emoji-1F380 { background-position: -7620px 0px; }
-.emoji-1F381 { background-position: -7640px 0px; }
-.emoji-1F382 { background-position: -7660px 0px; }
-.emoji-1F383 { background-position: -7680px 0px; }
-.emoji-1F384 { background-position: -7700px 0px; }
-.emoji-1F385 { background-position: -7720px 0px; }
-.emoji-1F386 { background-position: -7740px 0px; }
-.emoji-1F387 { background-position: -7760px 0px; }
-.emoji-1F388 { background-position: -7780px 0px; }
-.emoji-1F389 { background-position: -7800px 0px; }
-.emoji-1F38A { background-position: -7820px 0px; }
-.emoji-1F38B { background-position: -7840px 0px; }
-.emoji-1F38C { background-position: -7860px 0px; }
-.emoji-1F38D { background-position: -7880px 0px; }
-.emoji-1F38E { background-position: -7900px 0px; }
-.emoji-1F38F { background-position: -7920px 0px; }
-.emoji-1F390 { background-position: -7940px 0px; }
-.emoji-1F391 { background-position: -7960px 0px; }
-.emoji-1F392 { background-position: -7980px 0px; }
-.emoji-1F393 { background-position: -8000px 0px; }
-.emoji-1F394 { background-position: -8020px 0px; }
-.emoji-1F395 { background-position: -8040px 0px; }
-.emoji-1F396 { background-position: -8060px 0px; }
-.emoji-1F397 { background-position: -8080px 0px; }
-.emoji-1F398 { background-position: -8100px 0px; }
-.emoji-1F399 { background-position: -8120px 0px; }
-.emoji-1F39A { background-position: -8140px 0px; }
-.emoji-1F39B { background-position: -8160px 0px; }
-.emoji-1F39C { background-position: -8180px 0px; }
-.emoji-1F39D { background-position: -8200px 0px; }
-.emoji-1F39E { background-position: -8220px 0px; }
-.emoji-1F39F { background-position: -8240px 0px; }
-.emoji-1F3A0 { background-position: -8260px 0px; }
-.emoji-1F3A1 { background-position: -8280px 0px; }
-.emoji-1F3A2 { background-position: -8300px 0px; }
-.emoji-1F3A3 { background-position: -8320px 0px; }
-.emoji-1F3A4 { background-position: -8340px 0px; }
-.emoji-1F3A5 { background-position: -8360px 0px; }
-.emoji-1F3A6 { background-position: -8380px 0px; }
-.emoji-1F3A7 { background-position: -8400px 0px; }
-.emoji-1F3A8 { background-position: -8420px 0px; }
-.emoji-1F3A9 { background-position: -8440px 0px; }
-.emoji-1F3AA { background-position: -8460px 0px; }
-.emoji-1F3AB { background-position: -8480px 0px; }
-.emoji-1F3AC { background-position: -8500px 0px; }
-.emoji-1F3AD { background-position: -8520px 0px; }
-.emoji-1F3AE { background-position: -8540px 0px; }
-.emoji-1F3AF { background-position: -8560px 0px; }
-.emoji-1F3B0 { background-position: -8580px 0px; }
-.emoji-1F3B1 { background-position: -8600px 0px; }
-.emoji-1F3B2 { background-position: -8620px 0px; }
-.emoji-1F3B3 { background-position: -8640px 0px; }
-.emoji-1F3B4 { background-position: -8660px 0px; }
-.emoji-1F3B5 { background-position: -8680px 0px; }
-.emoji-1F3B6 { background-position: -8700px 0px; }
-.emoji-1F3B7 { background-position: -8720px 0px; }
-.emoji-1F3B8 { background-position: -8740px 0px; }
-.emoji-1F3B9 { background-position: -8760px 0px; }
-.emoji-1F3BA { background-position: -8780px 0px; }
-.emoji-1F3BB { background-position: -8800px 0px; }
-.emoji-1F3BC { background-position: -8820px 0px; }
-.emoji-1F3BD { background-position: -8840px 0px; }
-.emoji-1F3BE { background-position: -8860px 0px; }
-.emoji-1F3BF { background-position: -8880px 0px; }
-.emoji-1F3C0 { background-position: -8900px 0px; }
-.emoji-1F3C1 { background-position: -8920px 0px; }
-.emoji-1F3C2 { background-position: -8940px 0px; }
-.emoji-1F3C3 { background-position: -8960px 0px; }
-.emoji-1F3C4 { background-position: -8980px 0px; }
-.emoji-1F3C5 { background-position: -9000px 0px; }
-.emoji-1F3C6 { background-position: -9020px 0px; }
-.emoji-1F3C7 { background-position: -9040px 0px; }
-.emoji-1F3C8 { background-position: -9060px 0px; }
-.emoji-1F3C9 { background-position: -9080px 0px; }
-.emoji-1F3CA { background-position: -9100px 0px; }
-.emoji-1F3CB { background-position: -9120px 0px; }
-.emoji-1F3CC { background-position: -9140px 0px; }
-.emoji-1F3CD { background-position: -9160px 0px; }
-.emoji-1F3CE { background-position: -9180px 0px; }
-.emoji-1F3D4 { background-position: -9200px 0px; }
-.emoji-1F3D5 { background-position: -9220px 0px; }
-.emoji-1F3D6 { background-position: -9240px 0px; }
-.emoji-1F3D7 { background-position: -9260px 0px; }
-.emoji-1F3D8 { background-position: -9280px 0px; }
-.emoji-1F3D9 { background-position: -9300px 0px; }
-.emoji-1F3DA { background-position: -9320px 0px; }
-.emoji-1F3DB { background-position: -9340px 0px; }
-.emoji-1F3DC { background-position: -9360px 0px; }
-.emoji-1F3DD { background-position: -9380px 0px; }
-.emoji-1F3DE { background-position: -9400px 0px; }
-.emoji-1F3DF { background-position: -9420px 0px; }
-.emoji-1F3E0 { background-position: -9440px 0px; }
-.emoji-1F3E1 { background-position: -9460px 0px; }
-.emoji-1F3E2 { background-position: -9480px 0px; }
-.emoji-1F3E3 { background-position: -9500px 0px; }
-.emoji-1F3E4 { background-position: -9520px 0px; }
-.emoji-1F3E5 { background-position: -9540px 0px; }
-.emoji-1F3E6 { background-position: -9560px 0px; }
-.emoji-1F3E7 { background-position: -9580px 0px; }
-.emoji-1F3E8 { background-position: -9600px 0px; }
-.emoji-1F3E9 { background-position: -9620px 0px; }
-.emoji-1F3EA { background-position: -9640px 0px; }
-.emoji-1F3EB { background-position: -9660px 0px; }
-.emoji-1F3EC { background-position: -9680px 0px; }
-.emoji-1F3ED { background-position: -9700px 0px; }
-.emoji-1F3EE { background-position: -9720px 0px; }
-.emoji-1F3EF { background-position: -9740px 0px; }
-.emoji-1F3F0 { background-position: -9760px 0px; }
-.emoji-1F3F1 { background-position: -9780px 0px; }
-.emoji-1F3F2 { background-position: -9800px 0px; }
-.emoji-1F3F3 { background-position: -9820px 0px; }
-.emoji-1F3F4 { background-position: -9840px 0px; }
-.emoji-1F3F5 { background-position: -9860px 0px; }
-.emoji-1F3F6 { background-position: -9880px 0px; }
-.emoji-1F3F7 { background-position: -9900px 0px; }
-.emoji-1F400 { background-position: -9920px 0px; }
-.emoji-1F401 { background-position: -9940px 0px; }
-.emoji-1F402 { background-position: -9960px 0px; }
-.emoji-1F403 { background-position: -9980px 0px; }
-.emoji-1F404 { background-position: -10000px 0px; }
-.emoji-1F405 { background-position: -10020px 0px; }
-.emoji-1F406 { background-position: -10040px 0px; }
-.emoji-1F407 { background-position: -10060px 0px; }
-.emoji-1F408 { background-position: -10080px 0px; }
-.emoji-1F409 { background-position: -10100px 0px; }
-.emoji-1F40A { background-position: -10120px 0px; }
-.emoji-1F40B { background-position: -10140px 0px; }
-.emoji-1F40C { background-position: -10160px 0px; }
-.emoji-1F40D { background-position: -10180px 0px; }
-.emoji-1F40E { background-position: -10200px 0px; }
-.emoji-1F40F { background-position: -10220px 0px; }
-.emoji-1F410 { background-position: -10240px 0px; }
-.emoji-1F411 { background-position: -10260px 0px; }
-.emoji-1F412 { background-position: -10280px 0px; }
-.emoji-1F413 { background-position: -10300px 0px; }
-.emoji-1F414 { background-position: -10320px 0px; }
-.emoji-1F415 { background-position: -10340px 0px; }
-.emoji-1F416 { background-position: -10360px 0px; }
-.emoji-1F417 { background-position: -10380px 0px; }
-.emoji-1F418 { background-position: -10400px 0px; }
-.emoji-1F419 { background-position: -10420px 0px; }
-.emoji-1F41A { background-position: -10440px 0px; }
-.emoji-1F41B { background-position: -10460px 0px; }
-.emoji-1F41C { background-position: -10480px 0px; }
-.emoji-1F41D { background-position: -10500px 0px; }
-.emoji-1F41E { background-position: -10520px 0px; }
-.emoji-1F41F { background-position: -10540px 0px; }
-.emoji-1F420 { background-position: -10560px 0px; }
-.emoji-1F421 { background-position: -10580px 0px; }
-.emoji-1F422 { background-position: -10600px 0px; }
-.emoji-1F423 { background-position: -10620px 0px; }
-.emoji-1F424 { background-position: -10640px 0px; }
-.emoji-1F425 { background-position: -10660px 0px; }
-.emoji-1F426 { background-position: -10680px 0px; }
-.emoji-1F427 { background-position: -10700px 0px; }
-.emoji-1F428 { background-position: -10720px 0px; }
-.emoji-1F429 { background-position: -10740px 0px; }
-.emoji-1F42A { background-position: -10760px 0px; }
-.emoji-1F42B { background-position: -10780px 0px; }
-.emoji-1F42C { background-position: -10800px 0px; }
-.emoji-1F42D { background-position: -10820px 0px; }
-.emoji-1F42E { background-position: -10840px 0px; }
-.emoji-1F42F { background-position: -10860px 0px; }
-.emoji-1F430 { background-position: -10880px 0px; }
-.emoji-1F431 { background-position: -10900px 0px; }
-.emoji-1F432 { background-position: -10920px 0px; }
-.emoji-1F433 { background-position: -10940px 0px; }
-.emoji-1F434 { background-position: -10960px 0px; }
-.emoji-1F435 { background-position: -10980px 0px; }
-.emoji-1F436 { background-position: -11000px 0px; }
-.emoji-1F437 { background-position: -11020px 0px; }
-.emoji-1F438 { background-position: -11040px 0px; }
-.emoji-1F439 { background-position: -11060px 0px; }
-.emoji-1F43A { background-position: -11080px 0px; }
-.emoji-1F43B { background-position: -11100px 0px; }
-.emoji-1F43C { background-position: -11120px 0px; }
-.emoji-1F43D { background-position: -11140px 0px; }
-.emoji-1F43E { background-position: -11160px 0px; }
-.emoji-1F43F { background-position: -11180px 0px; }
-.emoji-1F440 { background-position: -11200px 0px; }
-.emoji-1F441 { background-position: -11220px 0px; }
-.emoji-1F442 { background-position: -11240px 0px; }
-.emoji-1F443 { background-position: -11260px 0px; }
-.emoji-1F444 { background-position: -11280px 0px; }
-.emoji-1F445 { background-position: -11300px 0px; }
-.emoji-1F446 { background-position: -11320px 0px; }
-.emoji-1F447 { background-position: -11340px 0px; }
-.emoji-1F448 { background-position: -11360px 0px; }
-.emoji-1F449 { background-position: -11380px 0px; }
-.emoji-1F44A { background-position: -11400px 0px; }
-.emoji-1F44B { background-position: -11420px 0px; }
-.emoji-1F44C { background-position: -11440px 0px; }
-.emoji-1F44D { background-position: -11460px 0px; }
-.emoji-1F44E { background-position: -11480px 0px; }
-.emoji-1F44F { background-position: -11500px 0px; }
-.emoji-1F450 { background-position: -11520px 0px; }
-.emoji-1F451 { background-position: -11540px 0px; }
-.emoji-1F452 { background-position: -11560px 0px; }
-.emoji-1F453 { background-position: -11580px 0px; }
-.emoji-1F454 { background-position: -11600px 0px; }
-.emoji-1F455 { background-position: -11620px 0px; }
-.emoji-1F456 { background-position: -11640px 0px; }
-.emoji-1F457 { background-position: -11660px 0px; }
-.emoji-1F458 { background-position: -11680px 0px; }
-.emoji-1F459 { background-position: -11700px 0px; }
-.emoji-1F45A { background-position: -11720px 0px; }
-.emoji-1F45B { background-position: -11740px 0px; }
-.emoji-1F45C { background-position: -11760px 0px; }
-.emoji-1F45D { background-position: -11780px 0px; }
-.emoji-1F45E { background-position: -11800px 0px; }
-.emoji-1F45F { background-position: -11820px 0px; }
-.emoji-1F460 { background-position: -11840px 0px; }
-.emoji-1F461 { background-position: -11860px 0px; }
-.emoji-1F462 { background-position: -11880px 0px; }
-.emoji-1F463 { background-position: -11900px 0px; }
-.emoji-1F464 { background-position: -11920px 0px; }
-.emoji-1F465 { background-position: -11940px 0px; }
-.emoji-1F466 { background-position: -11960px 0px; }
-.emoji-1F467 { background-position: -11980px 0px; }
-.emoji-1F468 { background-position: -12000px 0px; }
-.emoji-1F468-1F468-1F466 { background-position: -12020px 0px; }
-.emoji-1F468-1F468-1F466-1F466 { background-position: -12040px 0px; }
-.emoji-1F468-1F468-1F467 { background-position: -12060px 0px; }
-.emoji-1F468-1F468-1F467-1F466 { background-position: -12080px 0px; }
-.emoji-1F468-1F468-1F467-1F467 { background-position: -12100px 0px; }
-.emoji-1F468-1F469-1F466-1F466 { background-position: -12120px 0px; }
-.emoji-1F468-1F469-1F467 { background-position: -12140px 0px; }
-.emoji-1F468-1F469-1F467-1F466 { background-position: -12160px 0px; }
-.emoji-1F468-1F469-1F467-1F467 { background-position: -12180px 0px; }
-.emoji-1F468-2764-1F468 { background-position: -12200px 0px; }
-.emoji-1F468-2764-1F48B-1F468 { background-position: -12220px 0px; }
-.emoji-1F469 { background-position: -12240px 0px; }
-.emoji-1F469-1F469-1F466 { background-position: -12260px 0px; }
-.emoji-1F469-1F469-1F466-1F466 { background-position: -12280px 0px; }
-.emoji-1F469-1F469-1F467 { background-position: -12300px 0px; }
-.emoji-1F469-1F469-1F467-1F466 { background-position: -12320px 0px; }
-.emoji-1F469-1F469-1F467-1F467 { background-position: -12340px 0px; }
-.emoji-1F469-2764-1F469 { background-position: -12360px 0px; }
-.emoji-1F469-2764-1F48B-1F469 { background-position: -12380px 0px; }
-.emoji-1F46A { background-position: -12400px 0px; }
-.emoji-1F46B { background-position: -12420px 0px; }
-.emoji-1F46C { background-position: -12440px 0px; }
-.emoji-1F46D { background-position: -12460px 0px; }
-.emoji-1F46E { background-position: -12480px 0px; }
-.emoji-1F46F { background-position: -12500px 0px; }
-.emoji-1F470 { background-position: -12520px 0px; }
-.emoji-1F471 { background-position: -12540px 0px; }
-.emoji-1F472 { background-position: -12560px 0px; }
-.emoji-1F473 { background-position: -12580px 0px; }
-.emoji-1F474 { background-position: -12600px 0px; }
-.emoji-1F475 { background-position: -12620px 0px; }
-.emoji-1F476 { background-position: -12640px 0px; }
-.emoji-1F477 { background-position: -12660px 0px; }
-.emoji-1F478 { background-position: -12680px 0px; }
-.emoji-1F479 { background-position: -12700px 0px; }
-.emoji-1F47A { background-position: -12720px 0px; }
-.emoji-1F47B { background-position: -12740px 0px; }
-.emoji-1F47C { background-position: -12760px 0px; }
-.emoji-1F47D { background-position: -12780px 0px; }
-.emoji-1F47E { background-position: -12800px 0px; }
-.emoji-1F47F { background-position: -12820px 0px; }
-.emoji-1F480 { background-position: -12840px 0px; }
-.emoji-1F481 { background-position: -12860px 0px; }
-.emoji-1F482 { background-position: -12880px 0px; }
-.emoji-1F483 { background-position: -12900px 0px; }
-.emoji-1F484 { background-position: -12920px 0px; }
-.emoji-1F485 { background-position: -12940px 0px; }
-.emoji-1F486 { background-position: -12960px 0px; }
-.emoji-1F487 { background-position: -12980px 0px; }
-.emoji-1F488 { background-position: -13000px 0px; }
-.emoji-1F489 { background-position: -13020px 0px; }
-.emoji-1F48A { background-position: -13040px 0px; }
-.emoji-1F48B { background-position: -13060px 0px; }
-.emoji-1F48C { background-position: -13080px 0px; }
-.emoji-1F48D { background-position: -13100px 0px; }
-.emoji-1F48E { background-position: -13120px 0px; }
-.emoji-1F48F { background-position: -13140px 0px; }
-.emoji-1F490 { background-position: -13160px 0px; }
-.emoji-1F491 { background-position: -13180px 0px; }
-.emoji-1F492 { background-position: -13200px 0px; }
-.emoji-1F493 { background-position: -13220px 0px; }
-.emoji-1F494 { background-position: -13240px 0px; }
-.emoji-1F495 { background-position: -13260px 0px; }
-.emoji-1F496 { background-position: -13280px 0px; }
-.emoji-1F497 { background-position: -13300px 0px; }
-.emoji-1F498 { background-position: -13320px 0px; }
-.emoji-1F499 { background-position: -13340px 0px; }
-.emoji-1F49A { background-position: -13360px 0px; }
-.emoji-1F49B { background-position: -13380px 0px; }
-.emoji-1F49C { background-position: -13400px 0px; }
-.emoji-1F49D { background-position: -13420px 0px; }
-.emoji-1F49E { background-position: -13440px 0px; }
-.emoji-1F49F { background-position: -13460px 0px; }
-.emoji-1F4A0 { background-position: -13480px 0px; }
-.emoji-1F4A1 { background-position: -13500px 0px; }
-.emoji-1F4A2 { background-position: -13520px 0px; }
-.emoji-1F4A3 { background-position: -13540px 0px; }
-.emoji-1F4A4 { background-position: -13560px 0px; }
-.emoji-1F4A5 { background-position: -13580px 0px; }
-.emoji-1F4A6 { background-position: -13600px 0px; }
-.emoji-1F4A7 { background-position: -13620px 0px; }
-.emoji-1F4A8 { background-position: -13640px 0px; }
-.emoji-1F4A9 { background-position: -13660px 0px; }
-.emoji-1F4AA { background-position: -13680px 0px; }
-.emoji-1F4AB { background-position: -13700px 0px; }
-.emoji-1F4AC { background-position: -13720px 0px; }
-.emoji-1F4AD { background-position: -13740px 0px; }
-.emoji-1F4AE { background-position: -13760px 0px; }
-.emoji-1F4AF { background-position: -13780px 0px; }
-.emoji-1F4B0 { background-position: -13800px 0px; }
-.emoji-1F4B1 { background-position: -13820px 0px; }
-.emoji-1F4B2 { background-position: -13840px 0px; }
-.emoji-1F4B3 { background-position: -13860px 0px; }
-.emoji-1F4B4 { background-position: -13880px 0px; }
-.emoji-1F4B5 { background-position: -13900px 0px; }
-.emoji-1F4B6 { background-position: -13920px 0px; }
-.emoji-1F4B7 { background-position: -13940px 0px; }
-.emoji-1F4B8 { background-position: -13960px 0px; }
-.emoji-1F4B9 { background-position: -13980px 0px; }
-.emoji-1F4BA { background-position: -14000px 0px; }
-.emoji-1F4BB { background-position: -14020px 0px; }
-.emoji-1F4BC { background-position: -14040px 0px; }
-.emoji-1F4BD { background-position: -14060px 0px; }
-.emoji-1F4BE { background-position: -14080px 0px; }
-.emoji-1F4BF { background-position: -14100px 0px; }
-.emoji-1F4C0 { background-position: -14120px 0px; }
-.emoji-1F4C1 { background-position: -14140px 0px; }
-.emoji-1F4C2 { background-position: -14160px 0px; }
-.emoji-1F4C3 { background-position: -14180px 0px; }
-.emoji-1F4C4 { background-position: -14200px 0px; }
-.emoji-1F4C5 { background-position: -14220px 0px; }
-.emoji-1F4C6 { background-position: -14240px 0px; }
-.emoji-1F4C7 { background-position: -14260px 0px; }
-.emoji-1F4C8 { background-position: -14280px 0px; }
-.emoji-1F4C9 { background-position: -14300px 0px; }
-.emoji-1F4CA { background-position: -14320px 0px; }
-.emoji-1F4CB { background-position: -14340px 0px; }
-.emoji-1F4CC { background-position: -14360px 0px; }
-.emoji-1F4CD { background-position: -14380px 0px; }
-.emoji-1F4CE { background-position: -14400px 0px; }
-.emoji-1F4CF { background-position: -14420px 0px; }
-.emoji-1F4D0 { background-position: -14440px 0px; }
-.emoji-1F4D1 { background-position: -14460px 0px; }
-.emoji-1F4D2 { background-position: -14480px 0px; }
-.emoji-1F4D3 { background-position: -14500px 0px; }
-.emoji-1F4D4 { background-position: -14520px 0px; }
-.emoji-1F4D5 { background-position: -14540px 0px; }
-.emoji-1F4D6 { background-position: -14560px 0px; }
-.emoji-1F4D7 { background-position: -14580px 0px; }
-.emoji-1F4D8 { background-position: -14600px 0px; }
-.emoji-1F4D9 { background-position: -14620px 0px; }
-.emoji-1F4DA { background-position: -14640px 0px; }
-.emoji-1F4DB { background-position: -14660px 0px; }
-.emoji-1F4DC { background-position: -14680px 0px; }
-.emoji-1F4DD { background-position: -14700px 0px; }
-.emoji-1F4DE { background-position: -14720px 0px; }
-.emoji-1F4DF { background-position: -14740px 0px; }
-.emoji-1F4E0 { background-position: -14760px 0px; }
-.emoji-1F4E1 { background-position: -14780px 0px; }
-.emoji-1F4E2 { background-position: -14800px 0px; }
-.emoji-1F4E3 { background-position: -14820px 0px; }
-.emoji-1F4E4 { background-position: -14840px 0px; }
-.emoji-1F4E5 { background-position: -14860px 0px; }
-.emoji-1F4E6 { background-position: -14880px 0px; }
-.emoji-1F4E7 { background-position: -14900px 0px; }
-.emoji-1F4E8 { background-position: -14920px 0px; }
-.emoji-1F4E9 { background-position: -14940px 0px; }
-.emoji-1F4EA { background-position: -14960px 0px; }
-.emoji-1F4EB { background-position: -14980px 0px; }
-.emoji-1F4EC { background-position: -15000px 0px; }
-.emoji-1F4ED { background-position: -15020px 0px; }
-.emoji-1F4EE { background-position: -15040px 0px; }
-.emoji-1F4EF { background-position: -15060px 0px; }
-.emoji-1F4F0 { background-position: -15080px 0px; }
-.emoji-1F4F1 { background-position: -15100px 0px; }
-.emoji-1F4F2 { background-position: -15120px 0px; }
-.emoji-1F4F3 { background-position: -15140px 0px; }
-.emoji-1F4F4 { background-position: -15160px 0px; }
-.emoji-1F4F5 { background-position: -15180px 0px; }
-.emoji-1F4F6 { background-position: -15200px 0px; }
-.emoji-1F4F7 { background-position: -15220px 0px; }
-.emoji-1F4F8 { background-position: -15240px 0px; }
-.emoji-1F4F9 { background-position: -15260px 0px; }
-.emoji-1F4FA { background-position: -15280px 0px; }
-.emoji-1F4FB { background-position: -15300px 0px; }
-.emoji-1F4FC { background-position: -15320px 0px; }
-.emoji-1F4FD { background-position: -15340px 0px; }
-.emoji-1F4FE { background-position: -15360px 0px; }
-.emoji-1F500 { background-position: -15380px 0px; }
-.emoji-1F501 { background-position: -15400px 0px; }
-.emoji-1F502 { background-position: -15420px 0px; }
-.emoji-1F503 { background-position: -15440px 0px; }
-.emoji-1F504 { background-position: -15460px 0px; }
-.emoji-1F505 { background-position: -15480px 0px; }
-.emoji-1F506 { background-position: -15500px 0px; }
-.emoji-1F507 { background-position: -15520px 0px; }
-.emoji-1F508 { background-position: -15540px 0px; }
-.emoji-1F509 { background-position: -15560px 0px; }
-.emoji-1F50A { background-position: -15580px 0px; }
-.emoji-1F50B { background-position: -15600px 0px; }
-.emoji-1F50C { background-position: -15620px 0px; }
-.emoji-1F50D { background-position: -15640px 0px; }
-.emoji-1F50E { background-position: -15660px 0px; }
-.emoji-1F50F { background-position: -15680px 0px; }
-.emoji-1F510 { background-position: -15700px 0px; }
-.emoji-1F511 { background-position: -15720px 0px; }
-.emoji-1F512 { background-position: -15740px 0px; }
-.emoji-1F513 { background-position: -15760px 0px; }
-.emoji-1F514 { background-position: -15780px 0px; }
-.emoji-1F515 { background-position: -15800px 0px; }
-.emoji-1F516 { background-position: -15820px 0px; }
-.emoji-1F517 { background-position: -15840px 0px; }
-.emoji-1F518 { background-position: -15860px 0px; }
-.emoji-1F519 { background-position: -15880px 0px; }
-.emoji-1F51A { background-position: -15900px 0px; }
-.emoji-1F51B { background-position: -15920px 0px; }
-.emoji-1F51C { background-position: -15940px 0px; }
-.emoji-1F51D { background-position: -15960px 0px; }
-.emoji-1F51E { background-position: -15980px 0px; }
-.emoji-1F51F { background-position: -16000px 0px; }
-.emoji-1F520 { background-position: -16020px 0px; }
-.emoji-1F521 { background-position: -16040px 0px; }
-.emoji-1F522 { background-position: -16060px 0px; }
-.emoji-1F523 { background-position: -16080px 0px; }
-.emoji-1F524 { background-position: -16100px 0px; }
-.emoji-1F525 { background-position: -16120px 0px; }
-.emoji-1F526 { background-position: -16140px 0px; }
-.emoji-1F527 { background-position: -16160px 0px; }
-.emoji-1F528 { background-position: -16180px 0px; }
-.emoji-1F529 { background-position: -16200px 0px; }
-.emoji-1F52A { background-position: -16220px 0px; }
-.emoji-1F52B { background-position: -16240px 0px; }
-.emoji-1F52C { background-position: -16260px 0px; }
-.emoji-1F52D { background-position: -16280px 0px; }
-.emoji-1F52E { background-position: -16300px 0px; }
-.emoji-1F52F { background-position: -16320px 0px; }
-.emoji-1F530 { background-position: -16340px 0px; }
-.emoji-1F531 { background-position: -16360px 0px; }
-.emoji-1F532 { background-position: -16380px 0px; }
-.emoji-1F533 { background-position: -16400px 0px; }
-.emoji-1F534 { background-position: -16420px 0px; }
-.emoji-1F535 { background-position: -16440px 0px; }
-.emoji-1F536 { background-position: -16460px 0px; }
-.emoji-1F537 { background-position: -16480px 0px; }
-.emoji-1F538 { background-position: -16500px 0px; }
-.emoji-1F539 { background-position: -16520px 0px; }
-.emoji-1F53A { background-position: -16540px 0px; }
-.emoji-1F53B { background-position: -16560px 0px; }
-.emoji-1F53C { background-position: -16580px 0px; }
-.emoji-1F53D { background-position: -16600px 0px; }
-.emoji-1F546 { background-position: -16620px 0px; }
-.emoji-1F547 { background-position: -16640px 0px; }
-.emoji-1F548 { background-position: -16660px 0px; }
-.emoji-1F549 { background-position: -16680px 0px; }
-.emoji-1F54A { background-position: -16700px 0px; }
-.emoji-1F550 { background-position: -16720px 0px; }
-.emoji-1F551 { background-position: -16740px 0px; }
-.emoji-1F552 { background-position: -16760px 0px; }
-.emoji-1F553 { background-position: -16780px 0px; }
-.emoji-1F554 { background-position: -16800px 0px; }
-.emoji-1F555 { background-position: -16820px 0px; }
-.emoji-1F556 { background-position: -16840px 0px; }
-.emoji-1F557 { background-position: -16860px 0px; }
-.emoji-1F558 { background-position: -16880px 0px; }
-.emoji-1F559 { background-position: -16900px 0px; }
-.emoji-1F55A { background-position: -16920px 0px; }
-.emoji-1F55B { background-position: -16940px 0px; }
-.emoji-1F55C { background-position: -16960px 0px; }
-.emoji-1F55D { background-position: -16980px 0px; }
-.emoji-1F55E { background-position: -17000px 0px; }
-.emoji-1F55F { background-position: -17020px 0px; }
-.emoji-1F560 { background-position: -17040px 0px; }
-.emoji-1F561 { background-position: -17060px 0px; }
-.emoji-1F562 { background-position: -17080px 0px; }
-.emoji-1F563 { background-position: -17100px 0px; }
-.emoji-1F564 { background-position: -17120px 0px; }
-.emoji-1F565 { background-position: -17140px 0px; }
-.emoji-1F566 { background-position: -17160px 0px; }
-.emoji-1F567 { background-position: -17180px 0px; }
-.emoji-1F568 { background-position: -17200px 0px; }
-.emoji-1F569 { background-position: -17220px 0px; }
-.emoji-1F56A { background-position: -17240px 0px; }
-.emoji-1F56B { background-position: -17260px 0px; }
-.emoji-1F56C { background-position: -17280px 0px; }
-.emoji-1F56D { background-position: -17300px 0px; }
-.emoji-1F56E { background-position: -17320px 0px; }
-.emoji-1F56F { background-position: -17340px 0px; }
-.emoji-1F570 { background-position: -17360px 0px; }
-.emoji-1F571 { background-position: -17380px 0px; }
-.emoji-1F572 { background-position: -17400px 0px; }
-.emoji-1F573 { background-position: -17420px 0px; }
-.emoji-1F574 { background-position: -17440px 0px; }
-.emoji-1F575 { background-position: -17460px 0px; }
-.emoji-1F576 { background-position: -17480px 0px; }
-.emoji-1F577 { background-position: -17500px 0px; }
-.emoji-1F578 { background-position: -17520px 0px; }
-.emoji-1F579 { background-position: -17540px 0px; }
-.emoji-1F57B { background-position: -17560px 0px; }
-.emoji-1F57E { background-position: -17580px 0px; }
-.emoji-1F57F { background-position: -17600px 0px; }
-.emoji-1F581 { background-position: -17620px 0px; }
-.emoji-1F582 { background-position: -17640px 0px; }
-.emoji-1F583 { background-position: -17660px 0px; }
-.emoji-1F585 { background-position: -17680px 0px; }
-.emoji-1F586 { background-position: -17700px 0px; }
-.emoji-1F587 { background-position: -17720px 0px; }
-.emoji-1F588 { background-position: -17740px 0px; }
-.emoji-1F589 { background-position: -17760px 0px; }
-.emoji-1F58A { background-position: -17780px 0px; }
-.emoji-1F58B { background-position: -17800px 0px; }
-.emoji-1F58C { background-position: -17820px 0px; }
-.emoji-1F58D { background-position: -17840px 0px; }
-.emoji-1F58E { background-position: -17860px 0px; }
-.emoji-1F58F { background-position: -17880px 0px; }
-.emoji-1F590 { background-position: -17900px 0px; }
-.emoji-1F591 { background-position: -17920px 0px; }
-.emoji-1F592 { background-position: -17940px 0px; }
-.emoji-1F593 { background-position: -17960px 0px; }
-.emoji-1F594 { background-position: -17980px 0px; }
-.emoji-1F595 { background-position: -18000px 0px; }
-.emoji-1F596 { background-position: -18020px 0px; }
-.emoji-1F597 { background-position: -18040px 0px; }
-.emoji-1F598 { background-position: -18060px 0px; }
-.emoji-1F599 { background-position: -18080px 0px; }
-.emoji-1F59E { background-position: -18100px 0px; }
-.emoji-1F59F { background-position: -18120px 0px; }
-.emoji-1F5A5 { background-position: -18140px 0px; }
-.emoji-1F5A6 { background-position: -18160px 0px; }
-.emoji-1F5A7 { background-position: -18180px 0px; }
-.emoji-1F5A8 { background-position: -18200px 0px; }
-.emoji-1F5A9 { background-position: -18220px 0px; }
-.emoji-1F5AA { background-position: -18240px 0px; }
-.emoji-1F5AB { background-position: -18260px 0px; }
-.emoji-1F5AD { background-position: -18280px 0px; }
-.emoji-1F5AE { background-position: -18300px 0px; }
-.emoji-1F5AF { background-position: -18320px 0px; }
-.emoji-1F5B2 { background-position: -18340px 0px; }
-.emoji-1F5B3 { background-position: -18360px 0px; }
-.emoji-1F5B4 { background-position: -18380px 0px; }
-.emoji-1F5B8 { background-position: -18400px 0px; }
-.emoji-1F5B9 { background-position: -18420px 0px; }
-.emoji-1F5BC { background-position: -18440px 0px; }
-.emoji-1F5BD { background-position: -18460px 0px; }
-.emoji-1F5BE { background-position: -18480px 0px; }
-.emoji-1F5C0 { background-position: -18500px 0px; }
-.emoji-1F5C1 { background-position: -18520px 0px; }
-.emoji-1F5C2 { background-position: -18540px 0px; }
-.emoji-1F5C3 { background-position: -18560px 0px; }
-.emoji-1F5C4 { background-position: -18580px 0px; }
-.emoji-1F5C6 { background-position: -18600px 0px; }
-.emoji-1F5C7 { background-position: -18620px 0px; }
-.emoji-1F5C9 { background-position: -18640px 0px; }
-.emoji-1F5CA { background-position: -18660px 0px; }
-.emoji-1F5CE { background-position: -18680px 0px; }
-.emoji-1F5CF { background-position: -18700px 0px; }
-.emoji-1F5D0 { background-position: -18720px 0px; }
-.emoji-1F5D1 { background-position: -18740px 0px; }
-.emoji-1F5D2 { background-position: -18760px 0px; }
-.emoji-1F5D3 { background-position: -18780px 0px; }
-.emoji-1F5D4 { background-position: -18800px 0px; }
-.emoji-1F5D8 { background-position: -18820px 0px; }
-.emoji-1F5D9 { background-position: -18840px 0px; }
-.emoji-1F5DC { background-position: -18860px 0px; }
-.emoji-1F5DD { background-position: -18880px 0px; }
-.emoji-1F5DE { background-position: -18900px 0px; }
-.emoji-1F5E0 { background-position: -18920px 0px; }
-.emoji-1F5E1 { background-position: -18940px 0px; }
-.emoji-1F5E2 { background-position: -18960px 0px; }
-.emoji-1F5E3 { background-position: -18980px 0px; }
-.emoji-1F5E8 { background-position: -19000px 0px; }
-.emoji-1F5E9 { background-position: -19020px 0px; }
-.emoji-1F5EA { background-position: -19040px 0px; }
-.emoji-1F5EB { background-position: -19060px 0px; }
-.emoji-1F5EC { background-position: -19080px 0px; }
-.emoji-1F5ED { background-position: -19100px 0px; }
-.emoji-1F5EE { background-position: -19120px 0px; }
-.emoji-1F5EF { background-position: -19140px 0px; }
-.emoji-1F5F0 { background-position: -19160px 0px; }
-.emoji-1F5F1 { background-position: -19180px 0px; }
-.emoji-1F5F2 { background-position: -19200px 0px; }
-.emoji-1F5F3 { background-position: -19220px 0px; }
-.emoji-1F5F4 { background-position: -19240px 0px; }
-.emoji-1F5F5 { background-position: -19260px 0px; }
-.emoji-1F5F8 { background-position: -19280px 0px; }
-.emoji-1F5F9 { background-position: -19300px 0px; }
-.emoji-1F5FA { background-position: -19320px 0px; }
-.emoji-1F5FB { background-position: -19340px 0px; }
-.emoji-1F5FC { background-position: -19360px 0px; }
-.emoji-1F5FD { background-position: -19380px 0px; }
-.emoji-1F5FE { background-position: -19400px 0px; }
-.emoji-1F5FF { background-position: -19420px 0px; }
-.emoji-1F600 { background-position: -19440px 0px; }
-.emoji-1F601 { background-position: -19460px 0px; }
-.emoji-1F602 { background-position: -19480px 0px; }
-.emoji-1F603 { background-position: -19500px 0px; }
-.emoji-1F604 { background-position: -19520px 0px; }
-.emoji-1F605 { background-position: -19540px 0px; }
-.emoji-1F606 { background-position: -19560px 0px; }
-.emoji-1F607 { background-position: -19580px 0px; }
-.emoji-1F608 { background-position: -19600px 0px; }
-.emoji-1F609 { background-position: -19620px 0px; }
-.emoji-1F60A { background-position: -19640px 0px; }
-.emoji-1F60B { background-position: -19660px 0px; }
-.emoji-1F60C { background-position: -19680px 0px; }
-.emoji-1F60D { background-position: -19700px 0px; }
-.emoji-1F60E { background-position: -19720px 0px; }
-.emoji-1F60F { background-position: -19740px 0px; }
-.emoji-1F610 { background-position: -19760px 0px; }
-.emoji-1F611 { background-position: -19780px 0px; }
-.emoji-1F612 { background-position: -19800px 0px; }
-.emoji-1F613 { background-position: -19820px 0px; }
-.emoji-1F614 { background-position: -19840px 0px; }
-.emoji-1F615 { background-position: -19860px 0px; }
-.emoji-1F616 { background-position: -19880px 0px; }
-.emoji-1F617 { background-position: -19900px 0px; }
-.emoji-1F618 { background-position: -19920px 0px; }
-.emoji-1F619 { background-position: -19940px 0px; }
-.emoji-1F61A { background-position: -19960px 0px; }
-.emoji-1F61B { background-position: -19980px 0px; }
-.emoji-1F61C { background-position: -20000px 0px; }
-.emoji-1F61D { background-position: -20020px 0px; }
-.emoji-1F61E { background-position: -20040px 0px; }
-.emoji-1F61F { background-position: -20060px 0px; }
-.emoji-1F620 { background-position: -20080px 0px; }
-.emoji-1F621 { background-position: -20100px 0px; }
-.emoji-1F622 { background-position: -20120px 0px; }
-.emoji-1F623 { background-position: -20140px 0px; }
-.emoji-1F624 { background-position: -20160px 0px; }
-.emoji-1F625 { background-position: -20180px 0px; }
-.emoji-1F626 { background-position: -20200px 0px; }
-.emoji-1F627 { background-position: -20220px 0px; }
-.emoji-1F628 { background-position: -20240px 0px; }
-.emoji-1F629 { background-position: -20260px 0px; }
-.emoji-1F62A { background-position: -20280px 0px; }
-.emoji-1F62B { background-position: -20300px 0px; }
-.emoji-1F62C { background-position: -20320px 0px; }
-.emoji-1F62D { background-position: -20340px 0px; }
-.emoji-1F62E { background-position: -20360px 0px; }
-.emoji-1F62F { background-position: -20380px 0px; }
-.emoji-1F630 { background-position: -20400px 0px; }
-.emoji-1F631 { background-position: -20420px 0px; }
-.emoji-1F632 { background-position: -20440px 0px; }
-.emoji-1F633 { background-position: -20460px 0px; }
-.emoji-1F634 { background-position: -20480px 0px; }
-.emoji-1F635 { background-position: -20500px 0px; }
-.emoji-1F636 { background-position: -20520px 0px; }
-.emoji-1F637 { background-position: -20540px 0px; }
-.emoji-1F638 { background-position: -20560px 0px; }
-.emoji-1F639 { background-position: -20580px 0px; }
-.emoji-1F63A { background-position: -20600px 0px; }
-.emoji-1F63B { background-position: -20620px 0px; }
-.emoji-1F63C { background-position: -20640px 0px; }
-.emoji-1F63D { background-position: -20660px 0px; }
-.emoji-1F63E { background-position: -20680px 0px; }
-.emoji-1F63F { background-position: -20700px 0px; }
-.emoji-1F640 { background-position: -20720px 0px; }
-.emoji-1F641 { background-position: -20740px 0px; }
-.emoji-1F642 { background-position: -20760px 0px; }
-.emoji-1F645 { background-position: -20780px 0px; }
-.emoji-1F646 { background-position: -20800px 0px; }
-.emoji-1F647 { background-position: -20820px 0px; }
-.emoji-1F648 { background-position: -20840px 0px; }
-.emoji-1F649 { background-position: -20860px 0px; }
-.emoji-1F64A { background-position: -20880px 0px; }
-.emoji-1F64B { background-position: -20900px 0px; }
-.emoji-1F64C { background-position: -20920px 0px; }
-.emoji-1F64D { background-position: -20940px 0px; }
-.emoji-1F64E { background-position: -20960px 0px; }
-.emoji-1F64F { background-position: -20980px 0px; }
-.emoji-1F680 { background-position: -21000px 0px; }
-.emoji-1F681 { background-position: -21020px 0px; }
-.emoji-1F682 { background-position: -21040px 0px; }
-.emoji-1F683 { background-position: -21060px 0px; }
-.emoji-1F684 { background-position: -21080px 0px; }
-.emoji-1F685 { background-position: -21100px 0px; }
-.emoji-1F686 { background-position: -21120px 0px; }
-.emoji-1F687 { background-position: -21140px 0px; }
-.emoji-1F688 { background-position: -21160px 0px; }
-.emoji-1F689 { background-position: -21180px 0px; }
-.emoji-1F68A { background-position: -21200px 0px; }
-.emoji-1F68B { background-position: -21220px 0px; }
-.emoji-1F68C { background-position: -21240px 0px; }
-.emoji-1F68D { background-position: -21260px 0px; }
-.emoji-1F68E { background-position: -21280px 0px; }
-.emoji-1F68F { background-position: -21300px 0px; }
-.emoji-1F690 { background-position: -21320px 0px; }
-.emoji-1F691 { background-position: -21340px 0px; }
-.emoji-1F692 { background-position: -21360px 0px; }
-.emoji-1F693 { background-position: -21380px 0px; }
-.emoji-1F694 { background-position: -21400px 0px; }
-.emoji-1F695 { background-position: -21420px 0px; }
-.emoji-1F696 { background-position: -21440px 0px; }
-.emoji-1F697 { background-position: -21460px 0px; }
-.emoji-1F698 { background-position: -21480px 0px; }
-.emoji-1F699 { background-position: -21500px 0px; }
-.emoji-1F69A { background-position: -21520px 0px; }
-.emoji-1F69B { background-position: -21540px 0px; }
-.emoji-1F69C { background-position: -21560px 0px; }
-.emoji-1F69D { background-position: -21580px 0px; }
-.emoji-1F69E { background-position: -21600px 0px; }
-.emoji-1F69F { background-position: -21620px 0px; }
-.emoji-1F6A0 { background-position: -21640px 0px; }
-.emoji-1F6A1 { background-position: -21660px 0px; }
-.emoji-1F6A2 { background-position: -21680px 0px; }
-.emoji-1F6A3 { background-position: -21700px 0px; }
-.emoji-1F6A4 { background-position: -21720px 0px; }
-.emoji-1F6A5 { background-position: -21740px 0px; }
-.emoji-1F6A6 { background-position: -21760px 0px; }
-.emoji-1F6A7 { background-position: -21780px 0px; }
-.emoji-1F6A8 { background-position: -21800px 0px; }
-.emoji-1F6A9 { background-position: -21820px 0px; }
-.emoji-1F6AA { background-position: -21840px 0px; }
-.emoji-1F6AB { background-position: -21860px 0px; }
-.emoji-1F6AC { background-position: -21880px 0px; }
-.emoji-1F6AD { background-position: -21900px 0px; }
-.emoji-1F6AE { background-position: -21920px 0px; }
-.emoji-1F6AF { background-position: -21940px 0px; }
-.emoji-1F6B0 { background-position: -21960px 0px; }
-.emoji-1F6B1 { background-position: -21980px 0px; }
-.emoji-1F6B2 { background-position: -22000px 0px; }
-.emoji-1F6B3 { background-position: -22020px 0px; }
-.emoji-1F6B4 { background-position: -22040px 0px; }
-.emoji-1F6B5 { background-position: -22060px 0px; }
-.emoji-1F6B6 { background-position: -22080px 0px; }
-.emoji-1F6B7 { background-position: -22100px 0px; }
-.emoji-1F6B8 { background-position: -22120px 0px; }
-.emoji-1F6B9 { background-position: -22140px 0px; }
-.emoji-1F6BA { background-position: -22160px 0px; }
-.emoji-1F6BB { background-position: -22180px 0px; }
-.emoji-1F6BC { background-position: -22200px 0px; }
-.emoji-1F6BD { background-position: -22220px 0px; }
-.emoji-1F6BE { background-position: -22240px 0px; }
-.emoji-1F6BF { background-position: -22260px 0px; }
-.emoji-1F6C0 { background-position: -22280px 0px; }
-.emoji-1F6C1 { background-position: -22300px 0px; }
-.emoji-1F6C2 { background-position: -22320px 0px; }
-.emoji-1F6C3 { background-position: -22340px 0px; }
-.emoji-1F6C4 { background-position: -22360px 0px; }
-.emoji-1F6C5 { background-position: -22380px 0px; }
-.emoji-1F6C6 { background-position: -22400px 0px; }
-.emoji-1F6C7 { background-position: -22420px 0px; }
-.emoji-1F6C8 { background-position: -22440px 0px; }
-.emoji-1F6C9 { background-position: -22460px 0px; }
-.emoji-1F6CA { background-position: -22480px 0px; }
-.emoji-1F6CB { background-position: -22500px 0px; }
-.emoji-1F6CC { background-position: -22520px 0px; }
-.emoji-1F6CD { background-position: -22540px 0px; }
-.emoji-1F6CE { background-position: -22560px 0px; }
-.emoji-1F6CF { background-position: -22580px 0px; }
-.emoji-1F6E0 { background-position: -22600px 0px; }
-.emoji-1F6E1 { background-position: -22620px 0px; }
-.emoji-1F6E2 { background-position: -22640px 0px; }
-.emoji-1F6E3 { background-position: -22660px 0px; }
-.emoji-1F6E4 { background-position: -22680px 0px; }
-.emoji-1F6E5 { background-position: -22700px 0px; }
-.emoji-1F6E6 { background-position: -22720px 0px; }
-.emoji-1F6E7 { background-position: -22740px 0px; }
-.emoji-1F6E8 { background-position: -22760px 0px; }
-.emoji-1F6E9 { background-position: -22780px 0px; }
-.emoji-1F6EA { background-position: -22800px 0px; }
-.emoji-1F6EB { background-position: -22820px 0px; }
-.emoji-1F6EC { background-position: -22840px 0px; }
-.emoji-1F6F0 { background-position: -22860px 0px; }
-.emoji-1F6F1 { background-position: -22880px 0px; }
-.emoji-1F6F2 { background-position: -22900px 0px; }
-.emoji-1F6F3 { background-position: -22920px 0px; }
-.emoji-203C { background-position: -22940px 0px; }
-.emoji-2049 { background-position: -22960px 0px; }
-.emoji-2122 { background-position: -22980px 0px; }
-.emoji-2139 { background-position: -23000px 0px; }
-.emoji-2194 { background-position: -23020px 0px; }
-.emoji-2195 { background-position: -23040px 0px; }
-.emoji-2196 { background-position: -23060px 0px; }
-.emoji-2197 { background-position: -23080px 0px; }
-.emoji-2198 { background-position: -23100px 0px; }
-.emoji-2199 { background-position: -23120px 0px; }
-.emoji-21A9 { background-position: -23140px 0px; }
-.emoji-21AA { background-position: -23160px 0px; }
-.emoji-231A { background-position: -23180px 0px; }
-.emoji-231B { background-position: -23200px 0px; }
-.emoji-23E9 { background-position: -23220px 0px; }
-.emoji-23EA { background-position: -23240px 0px; }
-.emoji-23EB { background-position: -23260px 0px; }
-.emoji-23EC { background-position: -23280px 0px; }
-.emoji-23F0 { background-position: -23300px 0px; }
-.emoji-23F3 { background-position: -23320px 0px; }
-.emoji-24C2 { background-position: -23340px 0px; }
-.emoji-25AA { background-position: -23360px 0px; }
-.emoji-25AB { background-position: -23380px 0px; }
-.emoji-25B6 { background-position: -23400px 0px; }
-.emoji-25C0 { background-position: -23420px 0px; }
-.emoji-25FB { background-position: -23440px 0px; }
-.emoji-25FC { background-position: -23460px 0px; }
-.emoji-25FD { background-position: -23480px 0px; }
-.emoji-25FE { background-position: -23500px 0px; }
-.emoji-2600 { background-position: -23520px 0px; }
-.emoji-2601 { background-position: -23540px 0px; }
-.emoji-260E { background-position: -23560px 0px; }
-.emoji-2611 { background-position: -23580px 0px; }
-.emoji-2614 { background-position: -23600px 0px; }
-.emoji-2615 { background-position: -23620px 0px; }
-.emoji-261D { background-position: -23640px 0px; }
-.emoji-263A { background-position: -23660px 0px; }
-.emoji-2648 { background-position: -23680px 0px; }
-.emoji-2649 { background-position: -23700px 0px; }
-.emoji-264A { background-position: -23720px 0px; }
-.emoji-264B { background-position: -23740px 0px; }
-.emoji-264C { background-position: -23760px 0px; }
-.emoji-264D { background-position: -23780px 0px; }
-.emoji-264E { background-position: -23800px 0px; }
-.emoji-264F { background-position: -23820px 0px; }
-.emoji-2650 { background-position: -23840px 0px; }
-.emoji-2651 { background-position: -23860px 0px; }
-.emoji-2652 { background-position: -23880px 0px; }
-.emoji-2653 { background-position: -23900px 0px; }
-.emoji-2660 { background-position: -23920px 0px; }
-.emoji-2663 { background-position: -23940px 0px; }
-.emoji-2665 { background-position: -23960px 0px; }
-.emoji-2666 { background-position: -23980px 0px; }
-.emoji-2668 { background-position: -24000px 0px; }
-.emoji-267B { background-position: -24020px 0px; }
-.emoji-267F { background-position: -24040px 0px; }
-.emoji-2693 { background-position: -24060px 0px; }
-.emoji-26A0 { background-position: -24080px 0px; }
-.emoji-26A1 { background-position: -24100px 0px; }
-.emoji-26AA { background-position: -24120px 0px; }
-.emoji-26AB { background-position: -24140px 0px; }
-.emoji-26BD { background-position: -24160px 0px; }
-.emoji-26BE { background-position: -24180px 0px; }
-.emoji-26C4 { background-position: -24200px 0px; }
-.emoji-26C5 { background-position: -24220px 0px; }
-.emoji-26CE { background-position: -24240px 0px; }
-.emoji-26D4 { background-position: -24260px 0px; }
-.emoji-26EA { background-position: -24280px 0px; }
-.emoji-26F2 { background-position: -24300px 0px; }
-.emoji-26F3 { background-position: -24320px 0px; }
-.emoji-26F5 { background-position: -24340px 0px; }
-.emoji-26FA { background-position: -24360px 0px; }
-.emoji-26FD { background-position: -24380px 0px; }
-.emoji-2702 { background-position: -24400px 0px; }
-.emoji-2705 { background-position: -24420px 0px; }
-.emoji-2708 { background-position: -24440px 0px; }
-.emoji-2709 { background-position: -24460px 0px; }
-.emoji-270A { background-position: -24480px 0px; }
-.emoji-270B { background-position: -24500px 0px; }
-.emoji-270C { background-position: -24520px 0px; }
-.emoji-270F { background-position: -24540px 0px; }
-.emoji-2712 { background-position: -24560px 0px; }
-.emoji-2714 { background-position: -24580px 0px; }
-.emoji-2716 { background-position: -24600px 0px; }
-.emoji-2728 { background-position: -24620px 0px; }
-.emoji-2733 { background-position: -24640px 0px; }
-.emoji-2734 { background-position: -24660px 0px; }
-.emoji-2744 { background-position: -24680px 0px; }
-.emoji-2747 { background-position: -24700px 0px; }
-.emoji-274C { background-position: -24720px 0px; }
-.emoji-274E { background-position: -24740px 0px; }
-.emoji-2753 { background-position: -24760px 0px; }
-.emoji-2754 { background-position: -24780px 0px; }
-.emoji-2755 { background-position: -24800px 0px; }
-.emoji-2757 { background-position: -24820px 0px; }
-.emoji-2764 { background-position: -24840px 0px; }
-.emoji-2795 { background-position: -24860px 0px; }
-.emoji-2796 { background-position: -24880px 0px; }
-.emoji-2797 { background-position: -24900px 0px; }
-.emoji-27A1 { background-position: -24920px 0px; }
-.emoji-27B0 { background-position: -24940px 0px; }
-.emoji-27BF { background-position: -24960px 0px; }
-.emoji-2934 { background-position: -24980px 0px; }
-.emoji-2935 { background-position: -25000px 0px; }
-.emoji-2B05 { background-position: -25020px 0px; }
-.emoji-2B06 { background-position: -25040px 0px; }
-.emoji-2B07 { background-position: -25060px 0px; }
-.emoji-2B1B { background-position: -25080px 0px; }
-.emoji-2B1C { background-position: -25100px 0px; }
-.emoji-2B50 { background-position: -25120px 0px; }
-.emoji-2B55 { background-position: -25140px 0px; }
-.emoji-3030 { background-position: -25160px 0px; }
-.emoji-303D { background-position: -25180px 0px; }
-.emoji-3297 { background-position: -25200px 0px; }
-.emoji-3299 { background-position: -25220px 0px; } \ No newline at end of file
+ @media only screen and (-webkit-min-device-pixel-ratio: 2),
+ only screen and (min--moz-device-pixel-ratio: 2),
+ only screen and (-o-min-device-pixel-ratio: 2/1),
+ only screen and (min-device-pixel-ratio: 2),
+ only screen and (min-resolution: 192dpi),
+ only screen and (min-resolution: 2dppx) {
+ background-image: image-url('emoji@2x.png');
+ background-size: 840px 820px;
+ }
+}
diff --git a/app/assets/stylesheets/pages/issuable.scss b/app/assets/stylesheets/pages/issuable.scss
index ef62f069dc2..374c66ef5af 100644
--- a/app/assets/stylesheets/pages/issuable.scss
+++ b/app/assets/stylesheets/pages/issuable.scss
@@ -64,7 +64,6 @@
// This prevents the mess when resizing the sidebar
// of elements repositioning themselves..
width: $gutter_inner_width;
- overflow-x: hidden;
// --
&:first-child {
@@ -90,7 +89,6 @@
.gutter-toggle {
margin-left: 20px;
- border-left: 1px solid $border-gray-light;
padding-left: 10px;
&:hover {
@@ -157,11 +155,10 @@
.right-sidebar {
position: fixed;
top: 58px;
+ bottom: 0;
right: 0;
- height: 100%;
- transition-duration: .3s;
+ transition: width .3s;
background: $gray-light;
- overflow: scroll;
padding: 10px 20px;
&.right-sidebar-expanded {
@@ -170,6 +167,14 @@
hr {
display: none;
}
+
+ .sidebar-collapsed-icon {
+ display: none;
+ }
+
+ .gutter-toggle {
+ border-left: 1px solid $border-gray-light;
+ }
}
.subscribe-button {
@@ -181,7 +186,6 @@
&.right-sidebar-collapsed {
width: $sidebar_collapsed_width;
padding-top: 0;
- overflow-x: hidden;
hr {
margin: 0;
@@ -192,21 +196,13 @@
}
.block {
- border-bottom: none;
+ width: $sidebar_collapsed_width - 1px;
+ margin-left: -19px;
padding: 15px 0 0 0;
+ border-bottom: none;
+ overflow: hidden;
}
- }
-
- .btn {
- background: $gray-normal;
- border: 1px solid $border-gray-normal;
- &:hover {
- background: $gray-dark;
- border: 1px solid $border-gray-dark;
- }
- }
- &.right-sidebar-collapsed {
.issuable-count,
.issuable-nav,
.assignee > *,
@@ -219,15 +215,13 @@
}
.gutter-toggle {
- margin-left: -$gutter_inner_width + 4;
+ margin-left: -36px;
}
.sidebar-collapsed-icon {
display: block;
- float: left;
- width: 62px;
+ width: 100%;
text-align: center;
- margin-left: -19px;
padding-bottom: 10px;
color: #999999;
@@ -247,14 +241,15 @@
color: #999999;
}
}
-
}
-
}
- &.right-sidebar-expanded {
- .sidebar-collapsed-icon {
- display: none;
+ .btn {
+ background: $gray-normal;
+ border: 1px solid $border-gray-normal;
+ &:hover {
+ background: $gray-dark;
+ border: 1px solid $border-gray-dark;
}
}
}
@@ -263,4 +258,4 @@
small {
color: $gray-darkest;
}
-} \ No newline at end of file
+}
diff --git a/app/assets/stylesheets/pages/labels.scss b/app/assets/stylesheets/pages/labels.scss
index d1590e42fcb..1c78aafdb87 100644
--- a/app/assets/stylesheets/pages/labels.scss
+++ b/app/assets/stylesheets/pages/labels.scss
@@ -9,7 +9,7 @@
}
}
-.manage-labels-list {
+.label-row {
.label {
padding: 9px;
font-size: 14px;
diff --git a/app/assets/stylesheets/pages/merge_requests.scss b/app/assets/stylesheets/pages/merge_requests.scss
index f033ff15f88..9a2c4b83ffb 100644
--- a/app/assets/stylesheets/pages/merge_requests.scss
+++ b/app/assets/stylesheets/pages/merge_requests.scss
@@ -236,4 +236,4 @@
}
}
}
-} \ No newline at end of file
+}
diff --git a/app/assets/stylesheets/pages/milestone.scss b/app/assets/stylesheets/pages/milestone.scss
index e80dc9e84a1..9144a83647d 100644
--- a/app/assets/stylesheets/pages/milestone.scss
+++ b/app/assets/stylesheets/pages/milestone.scss
@@ -11,3 +11,60 @@ li.milestone {
height: 6px;
}
}
+
+.milestone-content {
+ .issues-count {
+ margin-right: 17px;
+ float: right;
+ width: 105px;
+ }
+
+ .issue-row {
+ .color-label {
+ border-radius: 2px;
+ padding: 3px !important;
+ }
+
+ // Issue title
+ span a {
+ color: rgba(0,0,0,0.64);
+ }
+ }
+}
+
+.milestone-summary {
+ margin-bottom: 25px;
+
+ .milestone-stat {
+ margin-right: 10px;
+ }
+
+ .time-elapsed {
+ color: $orange-light;
+ }
+}
+
+.issues-sortable-list {
+ .issue-detail {
+ display: block;
+
+ .issue-number{
+ color: rgba(0,0,0,0.44);
+ margin-right: 5px;
+ }
+ .color-label {
+ padding: 6px 10px;
+ margin-right: 7px;
+ margin-top: 10px;
+ }
+
+ .avatar {
+ float: none;
+ }
+ }
+}
+
+.milestone-detail {
+ border-bottom: 1px solid $border-color;
+ padding: 20px 0;
+}
diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss
index 046bae672fc..542ac896f6b 100644
--- a/app/assets/stylesheets/pages/projects.scss
+++ b/app/assets/stylesheets/pages/projects.scss
@@ -73,24 +73,19 @@
font-weight: normal;
}
+ .visibility-icon {
+ display: inline-block;
+ margin-left: 5px;
+ font-size: 18px;
+ color: $gray;
+ }
+
p {
padding: 0 $gl-padding;
color: #5c5d5e;
}
}
- .visibility-level-label {
- @extend .btn;
- @extend .btn-gray;
-
- color: $gray;
- cursor: default;
-
- i {
- color: inherit;
- }
- }
-
.project-repo-buttons {
margin-top: 20px;
margin-bottom: 0px;
diff --git a/app/assets/stylesheets/pages/todos.scss b/app/assets/stylesheets/pages/todos.scss
new file mode 100644
index 00000000000..2f57f21963d
--- /dev/null
+++ b/app/assets/stylesheets/pages/todos.scss
@@ -0,0 +1,124 @@
+/**
+ * Dashboard Todos
+ *
+ */
+
+.navbar-nav {
+ li {
+ .badge.todos-pending-count {
+ background-color: #7f8fa4;
+ margin-top: -5px;
+ }
+ }
+}
+
+.todos {
+ .panel {
+ border-top: none;
+ margin-bottom: 0;
+ }
+}
+
+.todo-item {
+ font-size: $gl-font-size;
+ padding: $gl-padding-top 0 $gl-padding-top ($gl-avatar-size + $gl-padding-top);
+ border-bottom: 1px solid $table-border-color;
+ color: #7f8fa4;
+
+ &.todo-inline {
+ .avatar {
+ position: relative;
+ top: -2px;
+ }
+
+ .todo-title {
+ line-height: 40px;
+ }
+ }
+
+ a {
+ color: #4c4e54;
+ }
+
+ .avatar {
+ margin-left: -($gl-avatar-size + $gl-padding-top);
+ }
+
+ .todo-title {
+ @include str-truncated(calc(100% - 174px));
+ font-weight: 600;
+
+ .author_name {
+ color: #333;
+ }
+ }
+
+ .todo-body {
+ margin-right: 174px;
+
+ .todo-note {
+ word-wrap: break-word;
+
+ .md {
+ color: #7f8fa4;
+ font-size: $gl-font-size;
+
+ p {
+ color: #5c5d5e;
+ }
+ }
+
+ pre {
+ border: none;
+ background: #f9f9f9;
+ border-radius: 0;
+ color: #777;
+ margin: 0 20px;
+ overflow: hidden;
+ }
+
+ .note-image-attach {
+ margin-top: 4px;
+ margin-left: 0px;
+ max-width: 200px;
+ float: none;
+ }
+
+ p:last-child {
+ margin-bottom: 0;
+ }
+ }
+
+ .todo-note-icon {
+ color: #777;
+ float: left;
+ font-size: $gl-font-size;
+ line-height: 16px;
+ margin-right: 5px;
+ }
+ }
+
+ &:last-child { border:none }
+}
+
+@media (max-width: $screen-xs-max) {
+ .todo-item {
+ padding-left: $gl-padding;
+
+ .todo-title {
+ white-space: normal;
+ overflow: visible;
+ max-width: 100%;
+ }
+
+ .avatar {
+ display: none;
+ }
+
+ .todo-body {
+ margin: 0;
+ border-left: 2px solid #DDD;
+ padding-left: 10px;
+ }
+ }
+}
diff --git a/app/controllers/admin/labels_controller.rb b/app/controllers/admin/labels_controller.rb
index 3b070e65d0d..d79ce2b10fe 100644
--- a/app/controllers/admin/labels_controller.rb
+++ b/app/controllers/admin/labels_controller.rb
@@ -53,6 +53,6 @@ class Admin::LabelsController < Admin::ApplicationController
end
def label_params
- params[:label].permit(:title, :color)
+ params[:label].permit(:title, :description, :color)
end
end
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 2c329b60a19..fb74919ea23 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -25,7 +25,7 @@ class ApplicationController < ActionController::Base
helper_method :abilities, :can?, :current_application_settings
helper_method :import_sources_enabled?, :github_import_enabled?, :github_import_configured?, :gitlab_import_enabled?, :gitlab_import_configured?, :bitbucket_import_enabled?, :bitbucket_import_configured?, :gitorious_import_enabled?, :google_code_import_enabled?, :fogbugz_import_enabled?, :git_import_enabled?
- helper_method :repository
+ helper_method :repository, :can_collaborate_with_project?
rescue_from Encoding::CompatibilityError do |exception|
log_exception(exception)
@@ -410,6 +410,13 @@ class ApplicationController < ActionController::Base
current_user.nil? && root_path == request.path
end
+ def can_collaborate_with_project?(project = nil)
+ project ||= @project
+
+ can?(current_user, :push_code, project) ||
+ (current_user && current_user.already_forked?(project))
+ end
+
private
def set_default_sort
diff --git a/app/controllers/concerns/creates_commit.rb b/app/controllers/concerns/creates_commit.rb
index b9eb0a22f88..787416c17ab 100644
--- a/app/controllers/concerns/creates_commit.rb
+++ b/app/controllers/concerns/creates_commit.rb
@@ -13,17 +13,11 @@ module CreatesCommit
result = service.new(@tree_edit_project, current_user, commit_params).execute
if result[:status] == :success
- flash[:notice] = success_notice || "Your changes have been successfully committed."
-
- if create_merge_request?
- success_path = new_merge_request_path
- target = different_project? ? "project" : "branch"
- flash[:notice] << " You can now submit a merge request to get this change into the original #{target}."
- end
+ update_flash_notice(success_notice)
respond_to do |format|
- format.html { redirect_to success_path }
- format.json { render json: { message: "success", filePath: success_path } }
+ format.html { redirect_to final_success_path(success_path) }
+ format.json { render json: { message: "success", filePath: final_success_path(success_path) } }
end
else
flash[:alert] = result[:message]
@@ -41,14 +35,32 @@ module CreatesCommit
end
def authorize_edit_tree!
- return if can?(current_user, :push_code, project)
- return if current_user && current_user.already_forked?(project)
+ return if can_collaborate_with_project?
access_denied!
end
private
+ def update_flash_notice(success_notice)
+ flash[:notice] = success_notice || "Your changes have been successfully committed."
+
+ if create_merge_request?
+ if merge_request_exists?
+ flash[:notice] = nil
+ else
+ target = different_project? ? "project" : "branch"
+ flash[:notice] << " You can now submit a merge request to get this change into the original #{target}."
+ end
+ end
+ end
+
+ def final_success_path(success_path)
+ return success_path unless create_merge_request?
+
+ merge_request_exists? ? existing_merge_request_path : new_merge_request_path
+ end
+
def new_merge_request_path
new_namespace_project_merge_request_path(
@mr_source_project.namespace,
@@ -62,6 +74,19 @@ module CreatesCommit
)
end
+ def existing_merge_request_path
+ namespace_project_merge_request_path(@mr_target_project.namespace, @mr_target_project, @merge_request)
+ end
+
+ def merge_request_exists?
+ return @merge_request if defined?(@merge_request)
+
+ @merge_request = @mr_target_project.merge_requests.opened.find_by(
+ source_branch: @mr_source_branch,
+ target_branch: @mr_target_branch
+ )
+ end
+
def different_project?
@mr_source_project != @mr_target_project
end
@@ -75,7 +100,7 @@ module CreatesCommit
end
def set_commit_variables
- @mr_source_branch = @target_branch
+ @mr_source_branch ||= @target_branch
if can?(current_user, :push_code, @project)
# Edit file in this project
@@ -89,7 +114,7 @@ module CreatesCommit
else
# Merge request to this project
@mr_target_project = @project
- @mr_target_branch = @ref
+ @mr_target_branch ||= @ref
end
else
# Edit file in fork
@@ -97,7 +122,7 @@ module CreatesCommit
# Merge request from fork to this project
@mr_source_project = @tree_edit_project
@mr_target_project = @project
- @mr_target_branch = @ref
+ @mr_target_branch ||= @ref
end
end
end
diff --git a/app/controllers/concerns/issues_action.rb b/app/controllers/concerns/issues_action.rb
index effd4721949..5b098628557 100644
--- a/app/controllers/concerns/issues_action.rb
+++ b/app/controllers/concerns/issues_action.rb
@@ -6,6 +6,8 @@ module IssuesAction
@issues = @issues.page(params[:page]).per(ApplicationController::PER_PAGE)
@issues = @issues.preload(:author, :project)
+ @label = @issuable_finder.labels.first
+
respond_to do |format|
format.html
format.atom { render layout: false }
diff --git a/app/controllers/concerns/merge_requests_action.rb b/app/controllers/concerns/merge_requests_action.rb
index f7a25111db9..f6de696e84d 100644
--- a/app/controllers/concerns/merge_requests_action.rb
+++ b/app/controllers/concerns/merge_requests_action.rb
@@ -5,5 +5,7 @@ module MergeRequestsAction
@merge_requests = get_merge_requests_collection
@merge_requests = @merge_requests.page(params[:page]).per(ApplicationController::PER_PAGE)
@merge_requests = @merge_requests.preload(:author, :target_project)
+
+ @label = @issuable_finder.labels.first
end
end
diff --git a/app/controllers/dashboard/todos_controller.rb b/app/controllers/dashboard/todos_controller.rb
new file mode 100644
index 00000000000..9ee9039f004
--- /dev/null
+++ b/app/controllers/dashboard/todos_controller.rb
@@ -0,0 +1,35 @@
+class Dashboard::TodosController < Dashboard::ApplicationController
+ before_action :find_todos, only: [:index, :destroy_all]
+
+ def index
+ @todos = @todos.page(params[:page]).per(PER_PAGE)
+ end
+
+ def destroy
+ todo.done!
+
+ respond_to do |format|
+ format.html { redirect_to dashboard_todos_path, notice: 'Todo was successfully marked as done.' }
+ format.js { render nothing: true }
+ end
+ end
+
+ def destroy_all
+ @todos.each(&:done)
+
+ respond_to do |format|
+ format.html { redirect_to dashboard_todos_path, notice: 'All todos were marked as done.' }
+ format.js { render nothing: true }
+ end
+ end
+
+ private
+
+ def todo
+ @todo ||= current_user.todos.find(params[:id])
+ end
+
+ def find_todos
+ @todos = TodosFinder.new(current_user, params).execute
+ end
+end
diff --git a/app/controllers/omniauth_callbacks_controller.rb b/app/controllers/omniauth_callbacks_controller.rb
index 9cf76521a0d..21135f7d607 100644
--- a/app/controllers/omniauth_callbacks_controller.rb
+++ b/app/controllers/omniauth_callbacks_controller.rb
@@ -42,6 +42,26 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController
end
end
+ def saml
+ if current_user
+ log_audit_event(current_user, with: :saml)
+ # Update SAML identity if data has changed.
+ identity = current_user.identities.find_by(extern_uid: oauth['uid'], provider: :saml)
+ if identity.nil?
+ current_user.identities.create(extern_uid: oauth['uid'], provider: :saml)
+ redirect_to profile_account_path, notice: 'Authentication method updated'
+ else
+ redirect_to after_sign_in_path_for(current_user)
+ end
+ else
+ saml_user = Gitlab::Saml::User.new(oauth)
+ saml_user.save
+ @user = saml_user.gl_user
+
+ continue_login_process
+ end
+ end
+
def omniauth_error
@provider = params[:provider]
@error = params[:error]
@@ -65,25 +85,11 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController
log_audit_event(current_user, with: oauth['provider'])
redirect_to profile_account_path, notice: 'Authentication method updated'
else
- @user = Gitlab::OAuth::User.new(oauth)
- @user.save
+ oauth_user = Gitlab::OAuth::User.new(oauth)
+ oauth_user.save
+ @user = oauth_user.gl_user
- # Only allow properly saved users to login.
- if @user.persisted? && @user.valid?
- log_audit_event(@user.gl_user, with: oauth['provider'])
- sign_in_and_redirect(@user.gl_user)
- else
- error_message =
- if @user.gl_user.errors.any?
- @user.gl_user.errors.map do |attribute, message|
- "#{attribute} #{message}"
- end.join(", ")
- else
- ''
- end
-
- redirect_to omniauth_error_path(oauth['provider'], error: error_message) and return
- end
+ continue_login_process
end
rescue Gitlab::OAuth::SignupDisabledError
label = Gitlab::OAuth::Provider.label_for(oauth['provider'])
@@ -104,6 +110,18 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController
session[:service_tickets][provider] = ticket
end
+ def continue_login_process
+ # Only allow properly saved users to login.
+ if @user.persisted? && @user.valid?
+ log_audit_event(@user, with: oauth['provider'])
+ sign_in_and_redirect(@user)
+ else
+ error_message = @user.errors.full_messages.to_sentence
+
+ redirect_to omniauth_error_path(oauth['provider'], error: error_message) and return
+ end
+ end
+
def oauth
@oauth ||= request.env['omniauth.auth']
end
diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb
index 495a432347e..cd8b2911674 100644
--- a/app/controllers/projects/blob_controller.rb
+++ b/app/controllers/projects/blob_controller.rb
@@ -87,7 +87,7 @@ class Projects::BlobController < Projects::ApplicationController
private
def blob
- @blob ||= @repository.blob_at(@commit.id, @path)
+ @blob ||= Blob.decorate(@repository.blob_at(@commit.id, @path))
if @blob
@blob
diff --git a/app/controllers/projects/builds_controller.rb b/app/controllers/projects/builds_controller.rb
index ec379c53b8f..f159e169f6d 100644
--- a/app/controllers/projects/builds_controller.rb
+++ b/app/controllers/projects/builds_controller.rb
@@ -56,6 +56,12 @@ class Projects::BuildsController < Projects::ApplicationController
render json: @build.to_json(only: [:status, :id, :sha, :coverage], methods: :sha)
end
+ def erase
+ @build.erase(erased_by: current_user)
+ redirect_to namespace_project_build_path(project.namespace, project, @build),
+ notice: "Build has been sucessfully erased!"
+ end
+
private
def build
diff --git a/app/controllers/projects/commit_controller.rb b/app/controllers/projects/commit_controller.rb
index 36951b91372..97d31a4229a 100644
--- a/app/controllers/projects/commit_controller.rb
+++ b/app/controllers/projects/commit_controller.rb
@@ -2,6 +2,8 @@
#
# Not to be confused with CommitsController, plural.
class Projects::CommitController < Projects::ApplicationController
+ include CreatesCommit
+
# Authorize
before_action :require_non_empty_project
before_action :authorize_download_code!, except: [:cancel_builds, :retry_builds]
@@ -9,6 +11,7 @@ class Projects::CommitController < Projects::ApplicationController
before_action :authorize_read_commit_status!, only: [:builds]
before_action :commit
before_action :define_show_vars, only: [:show, :builds]
+ before_action :authorize_edit_tree!, only: [:revert]
def show
apply_diff_view_cookie!
@@ -55,8 +58,37 @@ class Projects::CommitController < Projects::ApplicationController
render layout: false
end
+ def revert
+ assign_revert_commit_vars
+
+ return render_404 if @target_branch.blank?
+
+ create_commit(Commits::RevertService, success_notice: "The #{revert_type_title} has been successfully reverted.",
+ success_path: successful_revert_path, failure_path: failed_revert_path)
+ end
+
private
+ def revert_type_title
+ @commit.merged_merge_request ? 'merge request' : 'commit'
+ end
+
+ def successful_revert_path
+ return referenced_merge_request_url if @commit.merged_merge_request
+
+ namespace_project_commits_url(@project.namespace, @project, @target_branch)
+ end
+
+ def failed_revert_path
+ return referenced_merge_request_url if @commit.merged_merge_request
+
+ namespace_project_commit_url(@project.namespace, @project, params[:id])
+ end
+
+ def referenced_merge_request_url
+ namespace_project_merge_request_url(@project.namespace, @project, @commit.merged_merge_request)
+ end
+
def commit
@commit ||= @project.commit(params[:id])
end
@@ -79,4 +111,16 @@ class Projects::CommitController < Projects::ApplicationController
@statuses = ci_commit.statuses if ci_commit
end
+
+ def assign_revert_commit_vars
+ @commit = project.commit(params[:id])
+ @target_branch = params[:target_branch]
+ @mr_source_branch = @commit.revert_branch_name
+ @mr_target_branch = @target_branch
+ @commit_params = {
+ commit: @commit,
+ revert_type_title: revert_type_title,
+ create_merge_request: params[:create_merge_request].present? || different_project?
+ }
+ end
end
diff --git a/app/controllers/projects/forks_controller.rb b/app/controllers/projects/forks_controller.rb
index e61e01c4a59..0c551501ca4 100644
--- a/app/controllers/projects/forks_controller.rb
+++ b/app/controllers/projects/forks_controller.rb
@@ -32,7 +32,7 @@ class Projects::ForksController < Projects::ApplicationController
if continue_params
redirect_to continue_params[:to], notice: continue_params[:notice]
else
- redirect_to namespace_project_path(@forked_project.namespace, @forked_project), notice: "The project was successfully forked."
+ redirect_to namespace_project_path(@forked_project.namespace, @forked_project), notice: "The project '#{@forked_project.name}' was successfully forked."
end
end
else
diff --git a/app/controllers/projects/imports_controller.rb b/app/controllers/projects/imports_controller.rb
index 07f355c35b1..196996f1752 100644
--- a/app/controllers/projects/imports_controller.rb
+++ b/app/controllers/projects/imports_controller.rb
@@ -3,6 +3,7 @@ class Projects::ImportsController < Projects::ApplicationController
before_action :authorize_admin_project!
before_action :require_no_repo, only: [:new, :create]
before_action :redirect_if_progress, only: [:new, :create]
+ before_action :redirect_if_no_import, only: :show
def new
end
@@ -63,14 +64,19 @@ class Projects::ImportsController < Projects::ApplicationController
def require_no_repo
if @project.repository_exists?
- redirect_to(namespace_project_path(@project.namespace, @project))
+ redirect_to namespace_project_path(@project.namespace, @project)
end
end
def redirect_if_progress
if @project.import_in_progress?
- redirect_to namespace_project_import_path(@project.namespace, @project) &&
- return
+ redirect_to namespace_project_import_path(@project.namespace, @project)
+ end
+ end
+
+ def redirect_if_no_import
+ if @project.repository_exists? && @project.no_import?
+ redirect_to namespace_project_path(@project.namespace, @project)
end
end
end
diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb
index 68244883803..67faa1e4437 100644
--- a/app/controllers/projects/issues_controller.rb
+++ b/app/controllers/projects/issues_controller.rb
@@ -32,6 +32,7 @@ class Projects::IssuesController < Projects::ApplicationController
end
@issues = @issues.page(params[:page]).per(PER_PAGE)
+ @label = @project.labels.find_by(title: params[:label_name])
respond_to do |format|
format.html
diff --git a/app/controllers/projects/labels_controller.rb b/app/controllers/projects/labels_controller.rb
index 86d6e3e0f6b..ecac3c395ec 100644
--- a/app/controllers/projects/labels_controller.rb
+++ b/app/controllers/projects/labels_controller.rb
@@ -69,7 +69,7 @@ class Projects::LabelsController < Projects::ApplicationController
end
def label_params
- params.require(:label).permit(:title, :color)
+ params.require(:label).permit(:title, :description, :color)
end
def label
diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index 9d588c370aa..5fe21694605 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -34,6 +34,8 @@ class Projects::MergeRequestsController < Projects::ApplicationController
@merge_requests = @merge_requests.page(params[:page]).per(PER_PAGE)
@merge_requests = @merge_requests.preload(:target_project)
+ @label = @project.labels.find_by(title: params[:label_name])
+
respond_to do |format|
format.html
format.json do
@@ -179,6 +181,8 @@ class Projects::MergeRequestsController < Projects::ApplicationController
return
end
+ TodoService.new.merge_merge_request(merge_request, current_user)
+
@merge_request.update(merge_error: nil)
if params[:merge_when_build_succeeds].present? && @merge_request.ci_commit && @merge_request.ci_commit.active?
diff --git a/app/controllers/projects/milestones_controller.rb b/app/controllers/projects/milestones_controller.rb
index a5c4ef1c7c7..21f30f278c8 100644
--- a/app/controllers/projects/milestones_controller.rb
+++ b/app/controllers/projects/milestones_controller.rb
@@ -35,6 +35,7 @@ class Projects::MilestonesController < Projects::ApplicationController
@issues = @milestone.issues
@users = @milestone.participants.uniq
@merge_requests = @milestone.merge_requests
+ @labels = @milestone.labels
end
def create
diff --git a/app/controllers/projects/repositories_controller.rb b/app/controllers/projects/repositories_controller.rb
index ba9aea1c165..5c7614cfbaf 100644
--- a/app/controllers/projects/repositories_controller.rb
+++ b/app/controllers/projects/repositories_controller.rb
@@ -11,7 +11,9 @@ class Projects::RepositoriesController < Projects::ApplicationController
end
def archive
- render json: ArchiveRepositoryService.new(@project, params[:ref], params[:format]).execute
+ RepositoryArchiveCacheWorker.perform_async
+ headers.store(*Gitlab::Workhorse.send_git_archive(@project, params[:ref], params[:format]))
+ head :ok
rescue => ex
logger.error("#{self.class.name}: #{ex}")
return git_not_found!
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index 14ca7426c2f..aea08ecce3e 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -236,7 +236,7 @@ class ProjectsController < ApplicationController
Emoji.emojis.map do |name, emoji|
{
name: name,
- path: view_context.image_url("emoji/#{emoji["unicode"]}.png")
+ path: view_context.image_url("#{emoji["unicode"]}.png")
}
end
end
diff --git a/app/finders/issuable_finder.rb b/app/finders/issuable_finder.rb
index 0a4192e6bac..f7240edd618 100644
--- a/app/finders/issuable_finder.rb
+++ b/app/finders/issuable_finder.rb
@@ -119,6 +119,20 @@ class IssuableFinder
labels? && params[:label_name] == Label::None.title
end
+ def labels
+ return @labels if defined?(@labels)
+
+ if labels? && !filter_by_no_label?
+ @labels = Label.where(title: label_names)
+
+ if projects
+ @labels = @labels.where(project: projects)
+ end
+ else
+ @labels = Label.none
+ end
+ end
+
def assignee?
params[:assignee_id].present?
end
@@ -253,8 +267,6 @@ class IssuableFinder
joins("LEFT OUTER JOIN label_links ON label_links.target_type = '#{klass.name}' AND label_links.target_id = #{klass.table_name}.id").
where(label_links: { id: nil })
else
- label_names = params[:label_name].split(",")
-
items = items.joins(:labels).where(labels: { title: label_names })
if projects
@@ -266,6 +278,10 @@ class IssuableFinder
items
end
+ def label_names
+ params[:label_name].split(',')
+ end
+
def current_user_related?
params[:scope] == 'created-by-me' || params[:scope] == 'authored' || params[:scope] == 'assigned-to-me'
end
diff --git a/app/finders/todos_finder.rb b/app/finders/todos_finder.rb
new file mode 100644
index 00000000000..3ba27c40504
--- /dev/null
+++ b/app/finders/todos_finder.rb
@@ -0,0 +1,129 @@
+# TodosFinder
+#
+# Used to filter Todos by set of params
+#
+# Arguments:
+# current_user - which user use
+# params:
+# action_id: integer
+# author_id: integer
+# project_id; integer
+# state: 'pending' or 'done'
+# type: 'Issue' or 'MergeRequest'
+#
+
+class TodosFinder
+ NONE = '0'
+
+ attr_accessor :current_user, :params
+
+ def initialize(current_user, params)
+ @current_user = current_user
+ @params = params
+ end
+
+ def execute
+ items = current_user.todos
+ items = by_action_id(items)
+ items = by_author(items)
+ items = by_project(items)
+ items = by_state(items)
+ items = by_type(items)
+
+ items
+ end
+
+ private
+
+ def action_id?
+ action_id.present? && [Todo::ASSIGNED, Todo::MENTIONED].include?(action_id.to_i)
+ end
+
+ def action_id
+ params[:action_id]
+ end
+
+ def author?
+ params[:author_id].present?
+ end
+
+ def author
+ return @author if defined?(@author)
+
+ @author =
+ if author? && params[:author_id] != NONE
+ User.find(params[:author_id])
+ else
+ nil
+ end
+ end
+
+ def project?
+ params[:project_id].present?
+ end
+
+ def project
+ return @project if defined?(@project)
+
+ if project?
+ @project = Project.find(params[:project_id])
+
+ unless Ability.abilities.allowed?(current_user, :read_project, @project)
+ @project = nil
+ end
+ else
+ @project = nil
+ end
+
+ @project
+ end
+
+ def type?
+ type.present? && ['Issue', 'MergeRequest'].include?(type)
+ end
+
+ def type
+ params[:type]
+ end
+
+ def by_action_id(items)
+ if action_id?
+ items = items.where(action: action_id)
+ end
+
+ items
+ end
+
+ def by_author(items)
+ if author?
+ items = items.where(author_id: author.try(:id))
+ end
+
+ items
+ end
+
+ def by_project(items)
+ if project?
+ items = items.where(project: project)
+ end
+
+ items
+ end
+
+ def by_state(items)
+ case params[:state]
+ when 'done'
+ items.done
+ else
+ items.pending
+ end
+ end
+
+ def by_type(items)
+ if type?
+ items = items.where(target_type: type)
+ end
+
+ items
+ end
+end
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index ecefa9b006d..f0aa2b57121 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -118,12 +118,6 @@ module ApplicationHelper
grouped_options_for_select(options, @ref || @project.default_branch)
end
- def emoji_autocomplete_source
- # should be an array of strings
- # so to_s can be called, because it is sufficient and to_json is too slow
- Emoji.names.to_s
- end
-
# Define whenever show last push event
# with suggestion to create MR
def show_last_push_widget?(event)
diff --git a/app/helpers/blob_helper.rb b/app/helpers/blob_helper.rb
index 16967927922..7143a744869 100644
--- a/app/helpers/blob_helper.rb
+++ b/app/helpers/blob_helper.rb
@@ -127,10 +127,6 @@ module BlobHelper
end
end
- def blob_svg?(blob)
- blob.language && blob.language.name == 'SVG'
- end
-
# SVGs can contain malicious JavaScript; only include whitelisted
# elements and attributes. Note that this whitelist is by no means complete
# and may omit some elements.
diff --git a/app/helpers/commits_helper.rb b/app/helpers/commits_helper.rb
index 1d14ee52cfc..a09e91578b6 100644
--- a/app/helpers/commits_helper.rb
+++ b/app/helpers/commits_helper.rb
@@ -123,6 +123,37 @@ module CommitsHelper
)
end
+ def revert_commit_link(commit, continue_to_path, btn_class: nil)
+ return unless current_user
+
+ tooltip = "Revert this #{revert_commit_type(commit)} in a new merge request"
+
+ if can_collaborate_with_project?
+ content_tag :span, 'data-toggle' => 'modal', 'data-target' => '#modal-revert-commit' do
+ link_to 'Revert', '#modal-revert-commit', 'data-toggle' => 'tooltip', 'data-container' => 'body', title: tooltip, class: "btn btn-default btn-grouped btn-#{btn_class}"
+ end
+ elsif can?(current_user, :fork_project, @project)
+ continue_params = {
+ to: continue_to_path,
+ notice: edit_in_new_fork_notice + ' Try to revert this commit again.',
+ notice_now: edit_in_new_fork_notice_now
+ }
+ fork_path = namespace_project_forks_path(@project.namespace, @project,
+ namespace_key: current_user.namespace.id,
+ continue: continue_params)
+
+ link_to 'Revert', fork_path, class: 'btn btn-grouped btn-close', method: :post, 'data-toggle' => 'tooltip', 'data-container' => 'body', title: tooltip
+ end
+ end
+
+ def revert_commit_type(commit)
+ if commit.merged_merge_request
+ 'merge request'
+ else
+ 'commit'
+ end
+ end
+
protected
# Private: Returns a link to a person. If the person has a matching user and
diff --git a/app/helpers/diff_helper.rb b/app/helpers/diff_helper.rb
index f9bacc8ba45..d76db867c5a 100644
--- a/app/helpers/diff_helper.rb
+++ b/app/helpers/diff_helper.rb
@@ -69,7 +69,7 @@ module DiffHelper
end
def line_comments
- @line_comments ||= @line_notes.select(&:active?).group_by(&:line_code)
+ @line_comments ||= @line_notes.select(&:active?).sort_by(&:created_at).group_by(&:line_code)
end
def organize_comments(type_left, type_right, line_code_left, line_code_right)
@@ -137,7 +137,7 @@ module DiffHelper
# Always use HTML to handle case where JSON diff rendered this button
params_copy.delete(:format)
- link_to url_for(params_copy), id: "#{name}-diff-btn", class: (selected ? 'btn active' : 'btn') do
+ link_to url_for(params_copy), id: "#{name}-diff-btn", class: (selected ? 'btn active' : 'btn'), data: { view_type: name } do
title
end
end
diff --git a/app/helpers/nav_helper.rb b/app/helpers/nav_helper.rb
index 29cb753e62c..5d86bd490a8 100644
--- a/app/helpers/nav_helper.rb
+++ b/app/helpers/nav_helper.rb
@@ -23,6 +23,7 @@ module NavHelper
if current_path?('merge_requests#show') ||
current_path?('merge_requests#diffs') ||
current_path?('merge_requests#commits') ||
+ current_path?('merge_requests#builds') ||
current_path?('issues#show')
if cookies[:collapsed_gutter] == 'true'
"page-gutter right-sidebar-collapsed"
diff --git a/app/helpers/sorting_helper.rb b/app/helpers/sorting_helper.rb
index 241179b0212..f9026b887da 100644
--- a/app/helpers/sorting_helper.rb
+++ b/app/helpers/sorting_helper.rb
@@ -11,6 +11,8 @@ module SortingHelper
sort_value_largest_repo => sort_title_largest_repo,
sort_value_recently_signin => sort_title_recently_signin,
sort_value_oldest_signin => sort_title_oldest_signin,
+ sort_value_downvotes => sort_title_downvotes,
+ sort_value_upvotes => sort_title_upvotes
}
end
@@ -54,6 +56,14 @@ module SortingHelper
'Oldest sign in'
end
+ def sort_title_downvotes
+ 'Least popular'
+ end
+
+ def sort_title_upvotes
+ 'Most popular'
+ end
+
def sort_value_oldest_updated
'updated_asc'
end
@@ -93,4 +103,12 @@ module SortingHelper
def sort_value_oldest_signin
'oldest_sign_in'
end
+
+ def sort_value_downvotes
+ 'downvotes_desc'
+ end
+
+ def sort_value_upvotes
+ 'upvotes_desc'
+ end
end
diff --git a/app/helpers/todos_helper.rb b/app/helpers/todos_helper.rb
new file mode 100644
index 00000000000..4b745a5b969
--- /dev/null
+++ b/app/helpers/todos_helper.rb
@@ -0,0 +1,87 @@
+module TodosHelper
+ def todos_pending_count
+ current_user.todos.pending.count
+ end
+
+ def todos_done_count
+ current_user.todos.done.count
+ end
+
+ def todo_action_name(todo)
+ case todo.action
+ when Todo::ASSIGNED then 'assigned you'
+ when Todo::MENTIONED then 'mentioned you on'
+ end
+ end
+
+ def todo_target_link(todo)
+ target = todo.target_type.titleize.downcase
+ link_to "#{target} #{todo.target.to_reference}", todo_target_path(todo)
+ end
+
+ def todo_target_path(todo)
+ anchor = dom_id(todo.note) if todo.note.present?
+
+ polymorphic_path([todo.project.namespace.becomes(Namespace),
+ todo.project, todo.target], anchor: anchor)
+ end
+
+ def todos_filter_params
+ {
+ state: params[:state],
+ project_id: params[:project_id],
+ author_id: params[:author_id],
+ type: params[:type],
+ action_id: params[:action_id],
+ }
+ end
+
+ def todos_filter_path(options = {})
+ without = options.delete(:without)
+
+ options = todos_filter_params.merge(options)
+
+ if without.present?
+ without.each do |key|
+ options.delete(key)
+ end
+ end
+
+ path = request.path
+ path << "?#{options.to_param}"
+ path
+ end
+
+ def todo_actions_options
+ actions = [
+ OpenStruct.new(id: '', title: 'Any Action'),
+ OpenStruct.new(id: Todo::ASSIGNED, title: 'Assigned'),
+ OpenStruct.new(id: Todo::MENTIONED, title: 'Mentioned')
+ ]
+
+ options_from_collection_for_select(actions, 'id', 'title', params[:action_id])
+ end
+
+ def todo_projects_options
+ projects = current_user.authorized_projects.sorted_by_activity.non_archived
+ projects = projects.includes(:namespace)
+
+ projects = projects.map do |project|
+ OpenStruct.new(id: project.id, title: project.name_with_namespace)
+ end
+
+ projects.unshift(OpenStruct.new(id: '', title: 'Any Project'))
+
+ options_from_collection_for_select(projects, 'id', 'title', params[:project_id])
+ end
+
+ def todo_types_options
+ types = [
+ OpenStruct.new(title: 'Any Type', name: ''),
+ OpenStruct.new(title: 'Issue', name: 'Issue'),
+ OpenStruct.new(title: 'Merge Request', name: 'MergeRequest')
+ ]
+
+ options_from_collection_for_select(types, 'name', 'title', params[:type])
+ end
+end
diff --git a/app/helpers/tree_helper.rb b/app/helpers/tree_helper.rb
index 2ad7c80dae0..4920ca5af6e 100644
--- a/app/helpers/tree_helper.rb
+++ b/app/helpers/tree_helper.rb
@@ -56,8 +56,7 @@ module TreeHelper
return false unless on_top_of_branch?(project, ref)
- can?(current_user, :push_code, project) ||
- (current_user && current_user.already_forked?(project))
+ can_collaborate_with_project?(project)
end
def tree_edit_branch(project = @project, ref = @ref)
diff --git a/app/models/blob.rb b/app/models/blob.rb
new file mode 100644
index 00000000000..8ee9f3006b2
--- /dev/null
+++ b/app/models/blob.rb
@@ -0,0 +1,34 @@
+# Blob is a Rails-specific wrapper around Gitlab::Git::Blob objects
+class Blob < SimpleDelegator
+ # Wrap a Gitlab::Git::Blob object, or return nil when given nil
+ #
+ # This method prevents the decorated object from evaluating to "truthy" when
+ # given a nil value. For example:
+ #
+ # blob = Blob.new(nil)
+ # puts "truthy" if blob # => "truthy"
+ #
+ # blob = Blob.decorate(nil)
+ # puts "truthy" if blob # No output
+ def self.decorate(blob)
+ return if blob.nil?
+
+ new(blob)
+ end
+
+ def svg?
+ text? && language && language.name == 'SVG'
+ end
+
+ def to_partial_path
+ if lfs_pointer?
+ 'download'
+ elsif image? || svg?
+ 'image'
+ elsif text?
+ 'text'
+ else
+ 'download'
+ end
+ end
+end
diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb
index 623edd8bc57..1227458e525 100644
--- a/app/models/ci/build.rb
+++ b/app/models/ci/build.rb
@@ -31,15 +31,19 @@
# artifacts_file :text
# gl_project_id :integer
# artifacts_metadata :text
+# erased_by_id :integer
+# erased_at :datetime
#
module Ci
class Build < CommitStatus
include Gitlab::Application.routes.url_helpers
+
LAZY_ATTRIBUTES = ['trace']
belongs_to :runner, class_name: 'Ci::Runner'
belongs_to :trigger_request, class_name: 'Ci::TriggerRequest'
+ belongs_to :erased_by, class_name: 'User'
serialize :options
@@ -103,23 +107,22 @@ module Ci
end
state_machine :status, initial: :pending do
- after_transition pending: :running do |build, transition|
+ after_transition pending: :running do |build|
build.execute_hooks
end
- after_transition any => [:success, :failed, :canceled] do |build, transition|
- return unless build.project
+ # We use around_transition to create builds for next stage as soon as possible, before the `after_*` is executed
+ around_transition any => [:success, :failed, :canceled] do |build, block|
+ block.call
+ build.commit.create_next_builds(build) if build.commit
+ end
+ after_transition any => [:success, :failed, :canceled] do |build|
build.update_coverage
- build.commit.create_next_builds(build)
build.execute_hooks
end
end
- def ignored?
- failed? && allow_failure?
- end
-
def retryable?
project.builds_enabled? && commands.present?
end
@@ -179,6 +182,7 @@ module Ci
end
def update_coverage
+ return unless project
coverage_regex = project.build_coverage_regex
return unless coverage_regex
coverage = extract_coverage(trace, coverage_regex)
@@ -203,6 +207,10 @@ module Ci
end
end
+ def has_trace?
+ raw_trace.present?
+ end
+
def raw_trace
if File.file?(path_to_trace)
File.read(path_to_trace)
@@ -330,6 +338,7 @@ module Ci
end
def execute_hooks
+ return unless project
build_data = Gitlab::BuildDataBuilder.build(self)
project.execute_hooks(build_data.dup, :build_hooks)
project.execute_services(build_data.dup, :build_hooks)
@@ -359,6 +368,33 @@ module Ci
Gitlab::Ci::Build::Artifacts::Metadata.new(artifacts_metadata.path, path, **options).to_entry
end
+ def erase(opts = {})
+ return false unless erasable?
+
+ remove_artifacts_file!
+ remove_artifacts_metadata!
+ erase_trace!
+ update_erased!(opts[:erased_by])
+ end
+
+ def erasable?
+ complete? && (artifacts? || has_trace?)
+ end
+
+ def erased?
+ !self.erased_at.nil?
+ end
+
+ private
+
+ def erase_trace!
+ self.trace = nil
+ end
+
+ def update_erased!(user = nil)
+ self.update(erased_by: user, erased_at: Time.now)
+ end
+
private
def yaml_variables
diff --git a/app/models/ci/runner.rb b/app/models/ci/runner.rb
index 38b20cd7faa..e725a6d468c 100644
--- a/app/models/ci/runner.rb
+++ b/app/models/ci/runner.rb
@@ -22,6 +22,7 @@ module Ci
extend Ci::Model
LAST_CONTACT_TIME = 5.minutes.ago
+ AVAILABLE_SCOPES = ['specific', 'shared', 'active', 'paused', 'online']
has_many :builds, class_name: 'Ci::Build'
has_many :runner_projects, dependent: :destroy, class_name: 'Ci::RunnerProject'
@@ -38,6 +39,11 @@ module Ci
scope :online, ->() { where('contacted_at > ?', LAST_CONTACT_TIME) }
scope :ordered, ->() { order(id: :desc) }
+ scope :owned_or_shared, ->(project_id) do
+ joins('LEFT JOIN ci_runner_projects ON ci_runner_projects.runner_id = ci_runners.id')
+ .where("ci_runner_projects.gl_project_id = :project_id OR ci_runners.is_shared = true", project_id: project_id)
+ end
+
acts_as_taggable
def self.search(query)
diff --git a/app/models/commit.rb b/app/models/commit.rb
index 23b771aebb7..3224f5457f0 100644
--- a/app/models/commit.rb
+++ b/app/models/commit.rb
@@ -215,6 +215,44 @@ class Commit
ci_commit.try(:status) || :not_found
end
+ def revert_branch_name
+ "revert-#{short_id}"
+ end
+
+ def revert_description
+ if merged_merge_request
+ "This reverts merge request #{merged_merge_request.to_reference}"
+ else
+ "This reverts commit #{sha}"
+ end
+ end
+
+ def revert_message
+ %Q{Revert "#{title}"\n\n#{revert_description}}
+ end
+
+ def reverts_commit?(commit)
+ description? && description.include?(commit.revert_description)
+ end
+
+ def merge_commit?
+ parents.size > 1
+ end
+
+ def merged_merge_request
+ return @merged_merge_request if defined?(@merged_merge_request)
+
+ @merged_merge_request = project.merge_requests.find_by(merge_commit_sha: id) if merge_commit?
+ end
+
+ def has_been_reverted?(current_user = nil, noteable = self)
+ Gitlab::ReferenceExtractor.lazily do
+ noteable.notes.system.flat_map do |note|
+ note.all_references(current_user).commits
+ end
+ end.any? { |commit_ref| commit_ref.reverts_commit?(self) }
+ end
+
private
def repo_changes
diff --git a/app/models/commit_status.rb b/app/models/commit_status.rb
index 66e0502fc0c..7ef50836322 100644
--- a/app/models/commit_status.rb
+++ b/app/models/commit_status.rb
@@ -75,16 +75,16 @@ class CommitStatus < ActiveRecord::Base
transition [:pending, :running] => :canceled
end
- after_transition pending: :running do |build, transition|
- build.update_attributes started_at: Time.now
+ after_transition pending: :running do |commit_status|
+ commit_status.update_attributes started_at: Time.now
end
- after_transition any => [:success, :failed, :canceled] do |build, transition|
- build.update_attributes finished_at: Time.now
+ after_transition any => [:success, :failed, :canceled] do |commit_status|
+ commit_status.update_attributes finished_at: Time.now
end
- after_transition [:pending, :running] => :success do |build, transition|
- MergeRequests::MergeWhenBuildSucceedsService.new(build.commit.project, nil).trigger(build)
+ after_transition [:pending, :running] => :success do |commit_status|
+ MergeRequests::MergeWhenBuildSucceedsService.new(commit_status.commit.project, nil).trigger(commit_status)
end
state :pending, value: 'pending'
@@ -113,6 +113,10 @@ class CommitStatus < ActiveRecord::Base
canceled? || success? || failed?
end
+ def ignored?
+ failed? && allow_failure?
+ end
+
def duration
if started_at && finished_at
finished_at - started_at
diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb
index 5136d0196a5..e5f089fb8a0 100644
--- a/app/models/concerns/issuable.rb
+++ b/app/models/concerns/issuable.rb
@@ -69,10 +69,35 @@ module Issuable
case method.to_s
when 'milestone_due_asc' then order_milestone_due_asc
when 'milestone_due_desc' then order_milestone_due_desc
+ when 'downvotes_desc' then order_downvotes_desc
+ when 'upvotes_desc' then order_upvotes_desc
else
order_by(method)
end
end
+
+ def order_downvotes_desc
+ order_votes_desc('thumbsdown')
+ end
+
+ def order_upvotes_desc
+ order_votes_desc('thumbsup')
+ end
+
+ def order_votes_desc(award_emoji_name)
+ issuable_table = self.arel_table
+ note_table = Note.arel_table
+
+ join_clause = issuable_table.join(note_table, Arel::Nodes::OuterJoin).on(
+ note_table[:noteable_id].eq(issuable_table[:id]).and(
+ note_table[:noteable_type].eq(self.name).and(
+ note_table[:is_award].eq(true).and(note_table[:note].eq(award_emoji_name))
+ )
+ )
+ ).join_sources
+
+ joins(join_clause).group(issuable_table[:id]).reorder("COUNT(notes.id) DESC")
+ end
end
def today?
diff --git a/app/models/label.rb b/app/models/label.rb
index 220da10a6ab..07a1db4abe5 100644
--- a/app/models/label.rb
+++ b/app/models/label.rb
@@ -2,13 +2,14 @@
#
# Table name: labels
#
-# id :integer not null, primary key
-# title :string(255)
-# color :string(255)
-# project_id :integer
-# created_at :datetime
-# updated_at :datetime
-# template :boolean default(FALSE)
+# id :integer not null, primary key
+# title :string(255)
+# color :string(255)
+# project_id :integer
+# created_at :datetime
+# updated_at :datetime
+# template :boolean default(FALSE)
+# description :string(255)
#
class Label < ActiveRecord::Base
@@ -85,6 +86,10 @@ class Label < ActiveRecord::Base
issues.opened.count
end
+ def closed_issues_count
+ issues.closed.count
+ end
+
def template?
template
end
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index 1be8061e53d..1543ef311d7 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -24,6 +24,7 @@
# merge_params :text
# merge_when_build_succeeds :boolean default(FALSE), not null
# merge_user_id :integer
+# merge_commit_sha :string
#
require Rails.root.join("app/models/commit")
@@ -137,7 +138,7 @@ class MergeRequest < ActiveRecord::Base
scope :by_milestone, ->(milestone) { where(milestone_id: milestone) }
scope :in_projects, ->(project_ids) { where("source_project_id in (:project_ids) OR target_project_id in (:project_ids)", project_ids: project_ids) }
scope :of_projects, ->(ids) { where(target_project_id: ids) }
- scope :opened, -> { with_state(:opened) }
+ scope :opened, -> { with_states(:opened, :reopened) }
scope :merged, -> { with_state(:merged) }
scope :closed, -> { with_state(:closed) }
scope :closed_and_merged, -> { with_states(:closed, :merged) }
@@ -532,4 +533,12 @@ class MergeRequest < ActiveRecord::Base
[diff_base_commit, last_commit]
end
+
+ def merge_commit
+ @merge_commit ||= project.commit(merge_commit_sha) if merge_commit_sha
+ end
+
+ def can_be_reverted?(current_user = nil)
+ merge_commit && !merge_commit.has_been_reverted?(current_user, self)
+ end
end
diff --git a/app/models/milestone.rb b/app/models/milestone.rb
index 9c4476c768e..cbe65d70997 100644
--- a/app/models/milestone.rb
+++ b/app/models/milestone.rb
@@ -27,6 +27,7 @@ class Milestone < ActiveRecord::Base
belongs_to :project
has_many :issues
+ has_many :labels, through: :issues
has_many :merge_requests
has_many :participants, through: :issues, source: :assignee
@@ -109,6 +110,19 @@ class Milestone < ActiveRecord::Base
0
end
+ # Returns the elapsed time (in percent) since the Milestone creation date until today.
+ # If the Milestone doesn't have a due_date then returns 0 since we can't calculate the elapsed time.
+ # If the Milestone is overdue then it returns 100%.
+ def percent_time_used
+ return 0 unless due_date
+ return 100 if expired?
+
+ duration = ((created_at - due_date.to_datetime) / 1.day)
+ days_elapsed = ((created_at - Time.now) / 1.day)
+
+ ((days_elapsed.to_f / duration) * 100).floor
+ end
+
def expires_at
if due_date
if due_date.past?
diff --git a/app/models/note.rb b/app/models/note.rb
index 55255d22c2f..d287e0f3c6d 100644
--- a/app/models/note.rb
+++ b/app/models/note.rb
@@ -37,6 +37,8 @@ class Note < ActiveRecord::Base
belongs_to :author, class_name: "User"
belongs_to :updated_by, class_name: "User"
+ has_many :todos, dependent: :destroy
+
delegate :name, to: :project, prefix: true
delegate :name, :email, to: :author, prefix: true
@@ -375,6 +377,7 @@ class Note < ActiveRecord::Base
#
def set_award!
return unless awards_supported? && contains_emoji_only?
+
self.is_award = true
self.note = award_emoji_name
end
@@ -382,7 +385,7 @@ class Note < ActiveRecord::Base
private
def awards_supported?
- noteable.kind_of?(Issue) || noteable.is_a?(MergeRequest)
+ (noteable.kind_of?(Issue) || noteable.is_a?(MergeRequest)) && !for_diff_line?
end
def contains_emoji_only?
diff --git a/app/models/project.rb b/app/models/project.rb
index a43878ebcad..95ad88c76ae 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -382,6 +382,10 @@ class Project < ActiveRecord::Base
external_import? || forked?
end
+ def no_import?
+ import_status == 'none'
+ end
+
def external_import?
import_url.present?
end
diff --git a/app/models/project_team.rb b/app/models/project_team.rb
index 9f380a382cb..9629c7e1bb9 100644
--- a/app/models/project_team.rb
+++ b/app/models/project_team.rb
@@ -136,7 +136,7 @@ class ProjectTeam
end
def human_max_access(user_id)
- Gitlab::Access.options.key max_member_access(user_id)
+ Gitlab::Access.options_with_owner.key(max_member_access(user_id))
end
# This method assumes project and group members are eager loaded for optimal
diff --git a/app/models/repository.rb b/app/models/repository.rb
index ba275fd9803..e050bd45254 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -23,13 +23,11 @@ class Repository
def raw_repository
return nil unless path_with_namespace
- @raw_repository ||= begin
- repo = Gitlab::Git::Repository.new(path_to_repo)
- repo.autocrlf = :input
- repo
- rescue Gitlab::Git::Repository::NoRepository
- nil
- end
+ @raw_repository ||= Gitlab::Git::Repository.new(path_to_repo)
+ end
+
+ def update_autocrlf_option
+ raw_repository.autocrlf = :input if raw_repository.autocrlf != :input
end
# Return absolute path to repository
@@ -40,7 +38,12 @@ class Repository
end
def exists?
- raw_repository
+ return false unless raw_repository
+
+ raw_repository.rugged
+ true
+ rescue Gitlab::Git::Repository::NoRepository
+ false
end
def empty?
@@ -67,7 +70,7 @@ class Repository
end
def commit(id = 'HEAD')
- return nil unless raw_repository
+ return nil unless exists?
commit = Gitlab::Git::Commit.find(raw_repository, id)
commit = Commit.new(commit, @project) if commit
commit
@@ -236,6 +239,19 @@ class Repository
end
expire_branch_cache(branch_name)
+
+ # This ensures this particular cache is flushed after the first commit to a
+ # new repository.
+ expire_emptiness_caches if empty?
+ end
+
+ # Expires _all_ caches, including those that would normally only be expired
+ # under specific conditions.
+ def expire_all_caches!
+ expire_cache
+ expire_root_ref_cache
+ expire_emptiness_caches
+ expire_has_visible_content_cache
end
def expire_branch_cache(branch_name = nil)
@@ -258,6 +274,14 @@ class Repository
@root_ref = nil
end
+ # Expires the cache(s) used to determine if a repository is empty or not.
+ def expire_emptiness_caches
+ cache.expire(:empty?)
+ @empty = nil
+
+ expire_has_visible_content_cache
+ end
+
def expire_has_visible_content_cache
cache.expire(:has_visible_content?)
@has_visible_content = nil
@@ -599,6 +623,34 @@ class Repository
end
end
+ def revert(user, commit, base_branch, target_branch = nil)
+ source_sha = find_branch(base_branch).target
+ target_branch ||= base_branch
+ args = [commit.id, source_sha]
+ args << { mainline: 1 } if commit.merge_commit?
+
+ revert_index = rugged.revert_commit(*args)
+ return false if revert_index.conflicts?
+
+ tree_id = revert_index.write_tree(rugged)
+ return false unless diff_exists?(source_sha, tree_id)
+
+ commit_with_hooks(user, target_branch) do |ref|
+ committer = user_to_committer(user)
+ source_sha = Rugged::Commit.create(rugged,
+ message: commit.revert_message,
+ author: committer,
+ committer: committer,
+ tree: tree_id,
+ parents: [rugged.lookup(source_sha)],
+ update_ref: ref)
+ end
+ end
+
+ def diff_exists?(sha1, sha2)
+ rugged.diff(sha1, sha2).size > 0
+ end
+
def merged_to_root_ref?(branch_name)
branch_commit = commit(branch_name)
root_ref_commit = commit(root_ref)
@@ -611,6 +663,8 @@ class Repository
end
def merge_base(first_commit_id, second_commit_id)
+ first_commit_id = commit(first_commit_id).try(:id) || first_commit_id
+ second_commit_id = commit(second_commit_id).try(:id) || second_commit_id
rugged.merge_base(first_commit_id, second_commit_id)
rescue Rugged::ReferenceError
nil
@@ -674,12 +728,15 @@ class Repository
end
def commit_with_hooks(current_user, branch)
+ update_autocrlf_option
+
oldrev = Gitlab::Git::BLANK_SHA
ref = Gitlab::Git::BRANCH_REF_PREFIX + branch
+ target_branch = find_branch(branch)
was_empty = empty?
- unless was_empty
- oldrev = find_branch(branch).target
+ if !was_empty && target_branch
+ oldrev = target_branch.target
end
with_tmp_ref(oldrev) do |tmp_ref|
@@ -691,7 +748,7 @@ class Repository
end
GitHooksService.new.execute(current_user, path_to_repo, oldrev, newrev, ref) do
- if was_empty
+ if was_empty || !target_branch
# Create branch
rugged.references.create(ref, newrev)
else
@@ -706,6 +763,8 @@ class Repository
end
end
end
+
+ newrev
end
end
diff --git a/app/models/todo.rb b/app/models/todo.rb
new file mode 100644
index 00000000000..34d71c1b0d3
--- /dev/null
+++ b/app/models/todo.rb
@@ -0,0 +1,53 @@
+# == Schema Information
+#
+# Table name: todos
+#
+# id :integer not null, primary key
+# user_id :integer not null
+# project_id :integer not null
+# target_id :integer not null
+# target_type :string not null
+# author_id :integer
+# note_id :integer
+# action :integer not null
+# state :string not null
+# created_at :datetime
+# updated_at :datetime
+#
+
+class Todo < ActiveRecord::Base
+ ASSIGNED = 1
+ MENTIONED = 2
+
+ belongs_to :author, class_name: "User"
+ belongs_to :note
+ belongs_to :project
+ belongs_to :target, polymorphic: true, touch: true
+ belongs_to :user
+
+ delegate :name, :email, to: :author, prefix: true, allow_nil: true
+
+ validates :action, :project, :target, :user, presence: true
+
+ default_scope { reorder(id: :desc) }
+
+ scope :pending, -> { with_state(:pending) }
+ scope :done, -> { with_state(:done) }
+
+ state_machine :state, initial: :pending do
+ event :done do
+ transition pending: :done
+ end
+
+ state :pending
+ state :done
+ end
+
+ def body
+ if note.present?
+ note.note
+ else
+ target.title
+ end
+ end
+end
diff --git a/app/models/user.rb b/app/models/user.rb
index 9fe94b13e52..02ff2456f2b 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -140,7 +140,7 @@ class User < ActiveRecord::Base
has_one :abuse_report, dependent: :destroy
has_many :spam_logs, dependent: :destroy
has_many :builds, dependent: :nullify, class_name: 'Ci::Build'
-
+ has_many :todos, dependent: :destroy
#
# Validations
diff --git a/app/services/archive_repository_service.rb b/app/services/archive_repository_service.rb
deleted file mode 100644
index 2160bf13e6d..00000000000
--- a/app/services/archive_repository_service.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-class ArchiveRepositoryService
- attr_reader :project, :ref, :format
-
- def initialize(project, ref, format)
- format ||= 'tar.gz'
- @project, @ref, @format = project, ref, format.downcase
- end
-
- def execute(options = {})
- RepositoryArchiveCacheWorker.perform_async
-
- metadata = project.repository.archive_metadata(ref, storage_path, format)
- raise "Repository or ref not found" if metadata.empty?
-
- metadata
- end
-
- private
-
- def storage_path
- Gitlab.config.gitlab.repository_downloads_path
- end
-end
diff --git a/app/services/base_service.rb b/app/services/base_service.rb
index b48ca67d4d2..8563633816c 100644
--- a/app/services/base_service.rb
+++ b/app/services/base_service.rb
@@ -23,6 +23,10 @@ class BaseService
EventCreateService.new
end
+ def todo_service
+ TodoService.new
+ end
+
def log_info(message)
Gitlab::AppLogger.info message
end
diff --git a/app/services/ci/create_builds_service.rb b/app/services/ci/create_builds_service.rb
index ad901f2da5d..002f7ba1278 100644
--- a/app/services/ci/create_builds_service.rb
+++ b/app/services/ci/create_builds_service.rb
@@ -34,6 +34,7 @@ module Ci
build = commit.builds.create!(build_attrs)
build.execute_hooks
+ build
end
end
end
diff --git a/app/services/commits/revert_service.rb b/app/services/commits/revert_service.rb
new file mode 100644
index 00000000000..43d1c766e35
--- /dev/null
+++ b/app/services/commits/revert_service.rb
@@ -0,0 +1,58 @@
+module Commits
+ class RevertService < ::BaseService
+ class ValidationError < StandardError; end
+ class ReversionError < StandardError; end
+
+ def execute
+ @source_project = params[:source_project] || @project
+ @target_branch = params[:target_branch]
+ @commit = params[:commit]
+ @create_merge_request = params[:create_merge_request].present?
+
+ validate and commit
+ rescue Repository::CommitError, Gitlab::Git::Repository::InvalidBlobName, GitHooksService::PreReceiveError,
+ ValidationError, ReversionError => ex
+ error(ex.message)
+ end
+
+ def commit
+ revert_into = @create_merge_request ? @commit.revert_branch_name : @target_branch
+
+ if @create_merge_request
+ # Temporary branch exists and contains the revert commit
+ return success if repository.find_branch(revert_into)
+
+ create_target_branch
+ end
+
+ unless repository.revert(current_user, @commit, revert_into)
+ error_msg = "Sorry, we cannot revert this #{params[:revert_type_title]} automatically.
+ It may have already been reverted, or a more recent commit may have updated some of its content."
+ raise ReversionError, error_msg
+ end
+
+ success
+ end
+
+ private
+
+ def create_target_branch
+ result = CreateBranchService.new(@project, current_user)
+ .execute(@commit.revert_branch_name, @target_branch, source_project: @source_project)
+
+ if result[:status] == :error
+ raise ReversionError, "There was an error creating the source branch: #{result[:message]}"
+ end
+ end
+
+ def validate
+ allowed = ::Gitlab::GitAccess.new(current_user, project).can_push_to_branch?(@target_branch)
+
+ unless allowed
+ raise_error('You are not allowed to push into this branch')
+ end
+
+ true
+ end
+ end
+end
diff --git a/app/services/git_push_service.rb b/app/services/git_push_service.rb
index e3bf14966c8..a1711d234ff 100644
--- a/app/services/git_push_service.rb
+++ b/app/services/git_push_service.rb
@@ -1,10 +1,10 @@
-class GitPushService
- attr_accessor :project, :user, :push_data, :push_commits
+class GitPushService < BaseService
+ attr_accessor :push_data, :push_commits
include Gitlab::CurrentSettings
include Gitlab::Access
# This method will be called after each git update
- # and only if the provided user and project is present in GitLab.
+ # and only if the provided user and project are present in GitLab.
#
# All callbacks for post receive action should be placed here.
#
@@ -15,67 +15,67 @@ class GitPushService
# 4. Executes the project's web hooks
# 5. Executes the project's services
#
- def execute(project, user, oldrev, newrev, ref)
- @project, @user = project, user
-
- branch_name = Gitlab::Git.ref_name(ref)
-
- project.repository.expire_cache(branch_name)
-
- if push_remove_branch?(ref, newrev)
- project.repository.expire_has_visible_content_cache
+ def execute
+ @project.repository.expire_cache(branch_name)
+ if push_remove_branch?
+ @project.repository.expire_has_visible_content_cache
@push_commits = []
- elsif push_to_new_branch?(ref, oldrev)
- project.repository.expire_has_visible_content_cache
+ elsif push_to_new_branch?
+ @project.repository.expire_has_visible_content_cache
# Re-find the pushed commits.
- if is_default_branch?(ref)
+ if is_default_branch?
# Initial push to the default branch. Take the full history of that branch as "newly pushed".
- @push_commits = project.repository.commits(newrev)
-
- # Ensure HEAD points to the default branch in case it is not master
- project.change_head(branch_name)
-
- # Set protection on the default branch if configured
- if (current_application_settings.default_branch_protection != PROTECTION_NONE)
- developers_can_push = current_application_settings.default_branch_protection == PROTECTION_DEV_CAN_PUSH ? true : false
- project.protected_branches.create({ name: project.default_branch, developers_can_push: developers_can_push })
- end
+ process_default_branch
else
# Use the pushed commits that aren't reachable by the default branch
# as a heuristic. This may include more commits than are actually pushed, but
# that shouldn't matter because we check for existing cross-references later.
- @push_commits = project.repository.commits_between(project.default_branch, newrev)
+ @push_commits = @project.repository.commits_between(@project.default_branch, params[:newrev])
# don't process commits for the initial push to the default branch
- process_commit_messages(ref)
+ process_commit_messages
end
- elsif push_to_existing_branch?(ref, oldrev)
+ elsif push_to_existing_branch?
# Collect data for this git push
- @push_commits = project.repository.commits_between(oldrev, newrev)
- process_commit_messages(ref)
+ @push_commits = @project.repository.commits_between(params[:oldrev], params[:newrev])
+ process_commit_messages
end
-
# Update merge requests that may be affected by this push. A new branch
# could cause the last commit of a merge request to change.
- project.update_merge_requests(oldrev, newrev, ref, @user)
+ update_merge_requests
+ end
- @push_data = build_push_data(oldrev, newrev, ref)
+ protected
- EventCreateService.new.push(project, user, @push_data)
- project.execute_hooks(@push_data.dup, :push_hooks)
- project.execute_services(@push_data.dup, :push_hooks)
- CreateCommitBuildsService.new.execute(project, @user, @push_data)
- ProjectCacheWorker.perform_async(project.id)
+ def update_merge_requests
+ @project.update_merge_requests(params[:oldrev], params[:newrev], params[:ref], current_user)
+
+ EventCreateService.new.push(@project, current_user, build_push_data)
+ @project.execute_hooks(build_push_data.dup, :push_hooks)
+ @project.execute_services(build_push_data.dup, :push_hooks)
+ CreateCommitBuildsService.new.execute(@project, current_user, build_push_data)
+ ProjectCacheWorker.perform_async(@project.id)
end
- protected
+ def process_default_branch
+ @push_commits = project.repository.commits(params[:newrev])
+
+ # Ensure HEAD points to the default branch in case it is not master
+ project.change_head(branch_name)
+
+ # Set protection on the default branch if configured
+ if (current_application_settings.default_branch_protection != PROTECTION_NONE)
+ developers_can_push = current_application_settings.default_branch_protection == PROTECTION_DEV_CAN_PUSH ? true : false
+ @project.protected_branches.create({ name: @project.default_branch, developers_can_push: developers_can_push })
+ end
+ end
# Extract any GFM references from the pushed commit messages. If the configured issue-closing regex is matched,
# close the referenced Issue. Create cross-reference Notes corresponding to any other referenced Mentionables.
- def process_commit_messages(ref)
- is_default_branch = is_default_branch?(ref)
+ def process_commit_messages
+ is_default_branch = is_default_branch?
authors = Hash.new do |hash, commit|
email = commit.author_email
@@ -94,7 +94,7 @@ class GitPushService
# Close issues if these commits were pushed to the project's default branch and the commit message matches the
# closing regex. Exclude any mentioned Issues from cross-referencing even if the commits are being pushed to
# a different branch.
- closed_issues = commit.closes_issues(user)
+ closed_issues = commit.closes_issues(current_user)
closed_issues.each do |issue|
Issues::CloseService.new(project, authors[commit], {}).execute(issue, commit)
end
@@ -104,34 +104,38 @@ class GitPushService
end
end
- def build_push_data(oldrev, newrev, ref)
- Gitlab::PushDataBuilder.
- build(project, user, oldrev, newrev, ref, push_commits)
+ def build_push_data
+ @push_data ||= Gitlab::PushDataBuilder.
+ build(@project, current_user, params[:oldrev], params[:newrev], params[:ref], push_commits)
end
- def push_to_existing_branch?(ref, oldrev)
+ def push_to_existing_branch?
# Return if this is not a push to a branch (e.g. new commits)
- Gitlab::Git.branch_ref?(ref) && !Gitlab::Git.blank_ref?(oldrev)
+ Gitlab::Git.branch_ref?(params[:ref]) && !Gitlab::Git.blank_ref?(params[:oldrev])
end
- def push_to_new_branch?(ref, oldrev)
- Gitlab::Git.branch_ref?(ref) && Gitlab::Git.blank_ref?(oldrev)
+ def push_to_new_branch?
+ Gitlab::Git.branch_ref?(params[:ref]) && Gitlab::Git.blank_ref?(params[:oldrev])
end
- def push_remove_branch?(ref, newrev)
- Gitlab::Git.branch_ref?(ref) && Gitlab::Git.blank_ref?(newrev)
+ def push_remove_branch?
+ Gitlab::Git.branch_ref?(params[:ref]) && Gitlab::Git.blank_ref?(params[:newrev])
end
- def push_to_branch?(ref)
- Gitlab::Git.branch_ref?(ref)
+ def push_to_branch?
+ Gitlab::Git.branch_ref?(params[:ref])
end
- def is_default_branch?(ref)
- Gitlab::Git.branch_ref?(ref) &&
- (Gitlab::Git.ref_name(ref) == project.default_branch || project.default_branch.nil?)
+ def is_default_branch?
+ Gitlab::Git.branch_ref?(params[:ref]) &&
+ (Gitlab::Git.ref_name(params[:ref]) == project.default_branch || project.default_branch.nil?)
end
def commit_user(commit)
- commit.author || user
+ commit.author || current_user
+ end
+
+ def branch_name
+ @branch_name ||= Gitlab::Git.ref_name(params[:ref])
end
end
diff --git a/app/services/issuable_base_service.rb b/app/services/issuable_base_service.rb
index 2556f06e2d3..ca87dca4a70 100644
--- a/app/services/issuable_base_service.rb
+++ b/app/services/issuable_base_service.rb
@@ -54,7 +54,7 @@ class IssuableBaseService < BaseService
if params.present? && issuable.update_attributes(params.merge(updated_by: current_user))
issuable.reset_events_cache
handle_common_system_notes(issuable, old_labels: old_labels)
- handle_changes(issuable)
+ handle_changes(issuable, old_labels: old_labels)
issuable.create_new_cross_references!(current_user)
execute_hooks(issuable, 'update')
end
@@ -71,6 +71,19 @@ class IssuableBaseService < BaseService
end
end
+ def has_changes?(issuable, options = {})
+ valid_attrs = [:title, :description, :assignee_id, :milestone_id, :target_branch]
+
+ attrs_changed = valid_attrs.any? do |attr|
+ issuable.previous_changes.include?(attr.to_s)
+ end
+
+ old_labels = options[:old_labels]
+ labels_changed = old_labels && issuable.labels != old_labels
+
+ attrs_changed || labels_changed
+ end
+
def handle_common_system_notes(issuable, options = {})
if issuable.previous_changes.include?('title')
create_title_change_note(issuable, issuable.previous_changes['title'].first)
diff --git a/app/services/issues/close_service.rb b/app/services/issues/close_service.rb
index a1a20e47681..78254b49af3 100644
--- a/app/services/issues/close_service.rb
+++ b/app/services/issues/close_service.rb
@@ -3,6 +3,7 @@ module Issues
def execute(issue, commit = nil)
if project.jira_tracker? && project.jira_service.active
project.jira_service.execute(commit, issue)
+ todo_service.close_issue(issue, current_user)
return issue
end
@@ -10,6 +11,7 @@ module Issues
event_service.close_issue(issue, current_user)
create_note(issue, commit)
notification_service.close_issue(issue, current_user)
+ todo_service.close_issue(issue, current_user)
execute_hooks(issue, 'close')
end
diff --git a/app/services/issues/create_service.rb b/app/services/issues/create_service.rb
index bcb380d3215..10787e8873c 100644
--- a/app/services/issues/create_service.rb
+++ b/app/services/issues/create_service.rb
@@ -9,6 +9,7 @@ module Issues
if issue.save
issue.update_attributes(label_ids: label_params)
notification_service.new_issue(issue, current_user)
+ todo_service.new_issue(issue, current_user)
event_service.open_issue(issue, current_user)
issue.create_cross_references!(current_user)
execute_hooks(issue, 'open')
diff --git a/app/services/issues/update_service.rb b/app/services/issues/update_service.rb
index a55a04dd5e0..51ef9dfe610 100644
--- a/app/services/issues/update_service.rb
+++ b/app/services/issues/update_service.rb
@@ -4,7 +4,16 @@ module Issues
update(issue)
end
- def handle_changes(issue)
+ def handle_changes(issue, options = {})
+ if has_changes?(issue, options)
+ todo_service.mark_pending_todos_as_done(issue, current_user)
+ end
+
+ if issue.previous_changes.include?('title') ||
+ issue.previous_changes.include?('description')
+ todo_service.update_issue(issue, current_user)
+ end
+
if issue.previous_changes.include?('milestone_id')
create_milestone_note(issue)
end
@@ -12,6 +21,7 @@ module Issues
if issue.previous_changes.include?('assignee_id')
create_assignee_note(issue)
notification_service.reassigned_issue(issue, current_user)
+ todo_service.reassigned_issue(issue, current_user)
end
end
diff --git a/app/services/merge_requests/build_service.rb b/app/services/merge_requests/build_service.rb
index a9b29f9654d..c0700d953dd 100644
--- a/app/services/merge_requests/build_service.rb
+++ b/app/services/merge_requests/build_service.rb
@@ -56,7 +56,7 @@ module MergeRequests
if commits && commits.count == 1
commit = commits.first
merge_request.title = commit.title
- merge_request.description = commit.description.try(:strip)
+ merge_request.description ||= commit.description.try(:strip)
else
merge_request.title = merge_request.source_branch.titleize.humanize
end
diff --git a/app/services/merge_requests/close_service.rb b/app/services/merge_requests/close_service.rb
index 47454f9f0c2..27ee81fe3e7 100644
--- a/app/services/merge_requests/close_service.rb
+++ b/app/services/merge_requests/close_service.rb
@@ -9,6 +9,7 @@ module MergeRequests
event_service.close_mr(merge_request, current_user)
create_note(merge_request)
notification_service.close_mr(merge_request, current_user)
+ todo_service.close_merge_request(merge_request, current_user)
execute_hooks(merge_request, 'close')
end
diff --git a/app/services/merge_requests/create_service.rb b/app/services/merge_requests/create_service.rb
index 009d5a6867e..33609d01f20 100644
--- a/app/services/merge_requests/create_service.rb
+++ b/app/services/merge_requests/create_service.rb
@@ -2,7 +2,7 @@ module MergeRequests
class CreateService < MergeRequests::BaseService
def execute
# @project is used to determine whether the user can set the merge request's
- # assignee, milestone and labels. Whether they can depends on their
+ # assignee, milestone and labels. Whether they can depends on their
# permissions on the target project.
source_project = @project
@project = Project.find(params[:target_project_id]) if params[:target_project_id]
@@ -18,6 +18,7 @@ module MergeRequests
merge_request.update_attributes(label_ids: label_params)
event_service.open_mr(merge_request, current_user)
notification_service.new_merge_request(merge_request, current_user)
+ todo_service.new_merge_request(merge_request, current_user)
merge_request.create_cross_references!(current_user)
execute_hooks(merge_request)
end
diff --git a/app/services/merge_requests/merge_service.rb b/app/services/merge_requests/merge_service.rb
index e8bef250d8b..9a58383b398 100644
--- a/app/services/merge_requests/merge_service.rb
+++ b/app/services/merge_requests/merge_service.rb
@@ -34,7 +34,8 @@ module MergeRequests
committer: committer
}
- repository.merge(current_user, merge_request.source_sha, merge_request.target_branch, options)
+ commit_id = repository.merge(current_user, merge_request.source_sha, merge_request.target_branch, options)
+ merge_request.update(merge_commit_sha: commit_id)
rescue StandardError => e
merge_request.update(merge_error: "Something went wrong during merge")
Rails.logger.error(e.message)
diff --git a/app/services/merge_requests/merge_when_build_succeeds_service.rb b/app/services/merge_requests/merge_when_build_succeeds_service.rb
index 5cf7404a493..d6af12f9739 100644
--- a/app/services/merge_requests/merge_when_build_succeeds_service.rb
+++ b/app/services/merge_requests/merge_when_build_succeeds_service.rb
@@ -19,15 +19,19 @@ module MergeRequests
end
# Triggers the automatic merge of merge_request once the build succeeds
- def trigger(build)
- merge_requests = merge_request_from(build)
+ def trigger(commit_status)
+ merge_requests = merge_request_from(commit_status)
merge_requests.each do |merge_request|
next unless merge_request.merge_when_build_succeeds?
+ next unless merge_request.mergeable?
- if merge_request.ci_commit && merge_request.ci_commit.success? && merge_request.mergeable?
- MergeWorker.perform_async(merge_request.id, merge_request.merge_user_id, merge_request.merge_params)
- end
+ ci_commit = merge_request.ci_commit
+ next unless ci_commit
+ next unless ci_commit.sha == commit_status.sha
+ next unless ci_commit.success?
+
+ MergeWorker.perform_async(merge_request.id, merge_request.merge_user_id, merge_request.merge_params)
end
end
@@ -45,9 +49,16 @@ module MergeRequests
private
- def merge_request_from(build)
- merge_requests = @project.origin_merge_requests.opened.where(source_branch: build.ref).to_a
- merge_requests += @project.fork_merge_requests.opened.where(source_branch: build.ref).to_a
+ def merge_request_from(commit_status)
+ branches = commit_status.ref
+
+ # This is for ref-less builds
+ branches ||= @project.repository.branch_names_contains(commit_status.sha)
+
+ return [] if branches.blank?
+
+ merge_requests = @project.origin_merge_requests.opened.where(source_branch: branches).to_a
+ merge_requests += @project.fork_merge_requests.opened.where(source_branch: branches).to_a
merge_requests.uniq.select(&:source_project)
end
diff --git a/app/services/merge_requests/update_service.rb b/app/services/merge_requests/update_service.rb
index 5ff2cc03dda..6319ad805b6 100644
--- a/app/services/merge_requests/update_service.rb
+++ b/app/services/merge_requests/update_service.rb
@@ -14,7 +14,16 @@ module MergeRequests
update(merge_request)
end
- def handle_changes(merge_request)
+ def handle_changes(merge_request, options = {})
+ if has_changes?(merge_request, options)
+ todo_service.mark_pending_todos_as_done(merge_request, current_user)
+ end
+
+ if merge_request.previous_changes.include?('title') ||
+ merge_request.previous_changes.include?('description')
+ todo_service.update_merge_request(merge_request, current_user)
+ end
+
if merge_request.previous_changes.include?('target_branch')
create_branch_change_note(merge_request, 'target',
merge_request.previous_changes['target_branch'].first,
@@ -28,6 +37,7 @@ module MergeRequests
if merge_request.previous_changes.include?('assignee_id')
create_assignee_note(merge_request)
notification_service.reassigned_merge_request(merge_request, current_user)
+ todo_service.reassigned_merge_request(merge_request, current_user)
end
if merge_request.previous_changes.include?('target_branch') ||
diff --git a/app/services/notes/create_service.rb b/app/services/notes/create_service.rb
index 8d9661167b5..b970439b921 100644
--- a/app/services/notes/create_service.rb
+++ b/app/services/notes/create_service.rb
@@ -8,6 +8,7 @@ module Notes
if note.save
# Finish the harder work in the background
NewNoteWorker.perform_in(2.seconds, note.id, params)
+ TodoService.new.new_note(note, current_user)
end
note
diff --git a/app/services/notes/post_process_service.rb b/app/services/notes/post_process_service.rb
index f37d3c50cdd..e818f58d13c 100644
--- a/app/services/notes/post_process_service.rb
+++ b/app/services/notes/post_process_service.rb
@@ -1,6 +1,5 @@
module Notes
class PostProcessService
-
attr_accessor :note
def initialize(note)
@@ -25,6 +24,5 @@ module Notes
@note.project.execute_hooks(note_data, :note_hooks)
@note.project.execute_services(note_data, :note_hooks)
end
-
end
end
diff --git a/app/services/notes/update_service.rb b/app/services/notes/update_service.rb
index 72e2f78008d..1361b1e0300 100644
--- a/app/services/notes/update_service.rb
+++ b/app/services/notes/update_service.rb
@@ -7,6 +7,10 @@ module Notes
note.create_new_cross_references!(current_user)
note.reset_events_cache
+ if note.previous_changes.include?('note')
+ TodoService.new.update_note(note, current_user)
+ end
+
note
end
end
diff --git a/app/services/projects/destroy_service.rb b/app/services/projects/destroy_service.rb
index 294157b4f0e..f4dcb142850 100644
--- a/app/services/projects/destroy_service.rb
+++ b/app/services/projects/destroy_service.rb
@@ -16,11 +16,15 @@ module Projects
return false unless can?(current_user, :remove_project, project)
project.team.truncate
- project.repository.expire_cache unless project.empty_repo?
repo_path = project.path_with_namespace
wiki_path = repo_path + '.wiki'
+ # Flush the cache for both repositories. This has to be done _before_
+ # removing the physical repositories as some expiration code depends on
+ # Git data (e.g. a list of branch names).
+ flush_caches(project, wiki_path)
+
Project.transaction do
project.destroy!
@@ -70,5 +74,13 @@ module Projects
def removal_path(path)
"#{path}+#{project.id}#{DELETED_FLAG}"
end
+
+ def flush_caches(project, wiki_path)
+ project.repository.expire_all_caches! if project.repository.exists?
+
+ wiki_repo = Repository.new(wiki_path, project)
+
+ wiki_repo.expire_all_caches! if wiki_repo.exists?
+ end
end
end
diff --git a/app/services/todo_service.rb b/app/services/todo_service.rb
new file mode 100644
index 00000000000..dc270602ebc
--- /dev/null
+++ b/app/services/todo_service.rb
@@ -0,0 +1,170 @@
+# TodoService class
+#
+# Used for creating todos after certain user actions
+#
+# Ex.
+# TodoService.new.new_issue(issue, current_user)
+#
+class TodoService
+ # When create an issue we should:
+ #
+ # * create a todo for assignee if issue is assigned
+ # * create a todo for each mentioned user on issue
+ #
+ def new_issue(issue, current_user)
+ new_issuable(issue, current_user)
+ end
+
+ # When update an issue we should:
+ #
+ # * mark all pending todos related to the issue for the current user as done
+ #
+ def update_issue(issue, current_user)
+ create_mention_todos(issue.project, issue, current_user)
+ end
+
+ # When close an issue we should:
+ #
+ # * mark all pending todos related to the target for the current user as done
+ #
+ def close_issue(issue, current_user)
+ mark_pending_todos_as_done(issue, current_user)
+ end
+
+ # When we reassign an issue we should:
+ #
+ # * create a pending todo for new assignee if issue is assigned
+ #
+ def reassigned_issue(issue, current_user)
+ create_assignment_todo(issue, current_user)
+ end
+
+ # When create a merge request we should:
+ #
+ # * creates a pending todo for assignee if merge request is assigned
+ # * create a todo for each mentioned user on merge request
+ #
+ def new_merge_request(merge_request, current_user)
+ new_issuable(merge_request, current_user)
+ end
+
+ # When update a merge request we should:
+ #
+ # * create a todo for each mentioned user on merge request
+ #
+ def update_merge_request(merge_request, current_user)
+ create_mention_todos(merge_request.project, merge_request, current_user)
+ end
+
+ # When close a merge request we should:
+ #
+ # * mark all pending todos related to the target for the current user as done
+ #
+ def close_merge_request(merge_request, current_user)
+ mark_pending_todos_as_done(merge_request, current_user)
+ end
+
+ # When we reassign a merge request we should:
+ #
+ # * creates a pending todo for new assignee if merge request is assigned
+ #
+ def reassigned_merge_request(merge_request, current_user)
+ create_assignment_todo(merge_request, current_user)
+ end
+
+ # When merge a merge request we should:
+ #
+ # * mark all pending todos related to the target for the current user as done
+ #
+ def merge_merge_request(merge_request, current_user)
+ mark_pending_todos_as_done(merge_request, current_user)
+ end
+
+ # When create a note we should:
+ #
+ # * mark all pending todos related to the noteable for the note author as done
+ # * create a todo for each mentioned user on note
+ #
+ def new_note(note, current_user)
+ handle_note(note, current_user)
+ end
+
+ # When update a note we should:
+ #
+ # * mark all pending todos related to the noteable for the current user as done
+ # * create a todo for each new user mentioned on note
+ #
+ def update_note(note, current_user)
+ handle_note(note, current_user)
+ end
+
+ # When marking pending todos as done we should:
+ #
+ # * mark all pending todos related to the target for the current user as done
+ #
+ def mark_pending_todos_as_done(target, user)
+ pending_todos(user, target.project, target).update_all(state: :done)
+ end
+
+ private
+
+ def create_todos(project, target, author, users, action, note = nil)
+ Array(users).each do |user|
+ next if pending_todos(user, project, target).exists?
+
+ Todo.create(
+ project: project,
+ user_id: user.id,
+ author_id: author.id,
+ target_id: target.id,
+ target_type: target.class.name,
+ action: action,
+ note: note
+ )
+ end
+ end
+
+ def new_issuable(issuable, author)
+ create_assignment_todo(issuable, author)
+ create_mention_todos(issuable.project, issuable, author)
+ end
+
+ def handle_note(note, author)
+ # Skip system notes, like status changes and cross-references
+ return if note.system
+
+ project = note.project
+ target = note.noteable
+
+ mark_pending_todos_as_done(target, author)
+ create_mention_todos(project, target, author, note)
+ end
+
+ def create_assignment_todo(issuable, author)
+ if issuable.assignee && issuable.assignee != author
+ create_todos(issuable.project, issuable, author, issuable.assignee, Todo::ASSIGNED)
+ end
+ end
+
+ def create_mention_todos(project, issuable, author, note = nil)
+ mentioned_users = filter_mentioned_users(project, note || issuable, author)
+ create_todos(project, issuable, author, mentioned_users, Todo::MENTIONED, note)
+ end
+
+ def filter_mentioned_users(project, target, author)
+ mentioned_users = target.mentioned_users.select do |user|
+ user.can?(:read_project, project)
+ end
+
+ mentioned_users.delete(author)
+ mentioned_users.uniq
+ end
+
+ def pending_todos(user, project, target)
+ user.todos.pending.where(
+ project_id: project.id,
+ target_id: target.id,
+ target_type: target.class.name
+ )
+ end
+end
diff --git a/app/views/admin/labels/_form.html.haml b/app/views/admin/labels/_form.html.haml
index eaa94ed9e36..8c6b389bf15 100644
--- a/app/views/admin/labels/_form.html.haml
+++ b/app/views/admin/labels/_form.html.haml
@@ -12,6 +12,10 @@
.col-sm-10
= f.text_field :title, class: "form-control", required: true
.form-group
+ = f.label :description, class: 'control-label'
+ .col-sm-10
+ = f.text_field :description, class: "form-control js-quick-submit"
+ .form-group
= f.label :color, "Background color", class: 'control-label'
.col-sm-10
.input-group
diff --git a/app/views/admin/labels/_label.html.haml b/app/views/admin/labels/_label.html.haml
index e3ccbf6c3a8..5736a301910 100644
--- a/app/views/admin/labels/_label.html.haml
+++ b/app/views/admin/labels/_label.html.haml
@@ -1,5 +1,7 @@
%li{id: dom_id(label)}
- = render_colored_label(label)
- .pull-right
- = link_to 'Edit', edit_admin_label_path(label), class: 'btn btn-sm'
- = link_to 'Delete', admin_label_path(label), class: 'btn btn-sm btn-remove remove-row', method: :delete, remote: true, data: {confirm: "Delete this label? Are you sure?"}
+ .label-row
+ = render_colored_label(label)
+ = markdown(label.description, pipeline: :single_line)
+ .pull-right
+ = link_to 'Edit', edit_admin_label_path(label), class: 'btn btn-sm'
+ = link_to 'Delete', admin_label_path(label), class: 'btn btn-sm btn-remove remove-row', method: :delete, remote: true, data: {confirm: "Delete this label? Are you sure?"}
diff --git a/app/views/dashboard/projects/_zero_authorized_projects.html.haml b/app/views/dashboard/projects/_zero_authorized_projects.html.haml
index 4e7d6639727..c3efa7727b1 100644
--- a/app/views/dashboard/projects/_zero_authorized_projects.html.haml
+++ b/app/views/dashboard/projects/_zero_authorized_projects.html.haml
@@ -11,7 +11,7 @@
%br
- if current_user.can_create_project?
You can create up to
- %strong= pluralize(current_user.projects_limit, "project") + "."
+ %strong= pluralize(number_with_delimiter(current_user.projects_limit), "project") + "."
- else
If you are added to a project, it will be displayed here.
@@ -44,7 +44,7 @@
.dashboard-intro-text
%p.slead
There are
- %strong= publicish_project_count
+ %strong= number_with_delimiter(publicish_project_count)
public projects on this server.
%br
Public projects are an easy way to allow everyone to have read-only access.
diff --git a/app/views/dashboard/todos/_todo.html.haml b/app/views/dashboard/todos/_todo.html.haml
new file mode 100644
index 00000000000..6975f6ed0db
--- /dev/null
+++ b/app/views/dashboard/todos/_todo.html.haml
@@ -0,0 +1,21 @@
+%li{class: "todo todo-#{todo.done? ? 'done' : 'pending'}", id: dom_id(todo) }
+ .todo-item{class: 'todo-block'}
+ = image_tag avatar_icon(todo.author_email, 40), class: 'avatar s40', alt:''
+
+ .todo-title
+ %span.author_name
+ = link_to_author todo
+ %span.todo_label
+ = todo_action_name(todo)
+ = todo_target_link(todo)
+
+ &middot; #{time_ago_with_tooltip(todo.created_at)}
+
+ - if todo.pending?
+ .todo-actions.pull-right
+ = link_to 'Done', [:dashboard, todo], method: :delete, class: 'btn'
+
+ .todo-body
+ .todo-note
+ .md
+ = event_note(todo.body, project: todo.project)
diff --git a/app/views/dashboard/todos/index.html.haml b/app/views/dashboard/todos/index.html.haml
new file mode 100644
index 00000000000..946d7df3933
--- /dev/null
+++ b/app/views/dashboard/todos/index.html.haml
@@ -0,0 +1,62 @@
+- page_title "Todos"
+- header_title "Todos", dashboard_todos_path
+
+.top-area
+ %ul.nav-links
+ %li{class: ('active' if params[:state].blank? || params[:state] == 'pending')}
+ = link_to todos_filter_path(state: 'pending') do
+ %span
+ To do
+ %span{class: 'badge'}
+ = todos_pending_count
+ %li{class: ('active' if params[:state] == 'done')}
+ = link_to todos_filter_path(state: 'done') do
+ %span
+ Done
+ %span{class: 'badge'}
+ = todos_done_count
+
+ .nav-controls
+ - if @todos.any?(&:pending?)
+ = link_to 'Mark all as done', destroy_all_dashboard_todos_path(todos_filter_params), class: 'btn', method: :delete
+
+.todos-filters
+ .gray-content-block.second-block
+ = form_tag todos_filter_path(without: [:project_id, :author_id, :type, :action_id]), method: :get, class: 'filter-form' do
+ .filter-item.inline
+ = select_tag('project_id', todo_projects_options,
+ class: 'select2 trigger-submit', include_blank: true,
+ data: {placeholder: 'Project'})
+ .filter-item.inline
+ = users_select_tag(:author_id, selected: params[:author_id],
+ placeholder: 'Author', class: 'trigger-submit', any_user: "Any Author", first_user: true, current_user: true)
+ .filter-item.inline
+ = select_tag('type', todo_types_options,
+ class: 'select2 trigger-submit', include_blank: true,
+ data: {placeholder: 'Type'})
+ .filter-item.inline.actions-filter
+ = select_tag('action_id', todo_actions_options,
+ class: 'select2 trigger-submit', include_blank: true,
+ data: {placeholder: 'Action'})
+
+.prepend-top-default
+ - if @todos.any?
+ - @todos.group_by(&:project).each do |group|
+ .panel.panel-default.panel-small
+ - project = group[0]
+ .panel-heading
+ = link_to project.name_with_namespace, namespace_project_path(project.namespace, project)
+
+ %ul.well-list.todos-list
+ = render group[1]
+ = paginate @todos, theme: "gitlab"
+ - else
+ .nothing-here-block You're all done!
+
+:javascript
+ new UsersSelect();
+
+ $('form.filter-form').on('submit', function (event) {
+ event.preventDefault();
+ Turbolinks.visit(this.action + '&' + $(this).serialize());
+ });
diff --git a/app/views/layouts/_head.html.haml b/app/views/layouts/_head.html.haml
index 38ca4f91c4d..79cdbac1f37 100644
--- a/app/views/layouts/_head.html.haml
+++ b/app/views/layouts/_head.html.haml
@@ -44,6 +44,7 @@
= favicon_link_tag 'touch-icon-ipad.png', rel: 'apple-touch-icon', sizes: '76x76'
= favicon_link_tag 'touch-icon-iphone-retina.png', rel: 'apple-touch-icon', sizes: '120x120'
= favicon_link_tag 'touch-icon-ipad-retina.png', rel: 'apple-touch-icon', sizes: '152x152'
+ %link{rel: 'mask-icon', href: image_path('logo.svg'), color: 'rgb(226, 67, 41)'}
-# Windows 8 pinned site tile
%meta{name: 'msapplication-TileImage', content: image_path('msapplication-tile.png')}
diff --git a/app/views/layouts/header/_default.html.haml b/app/views/layouts/header/_default.html.haml
index fcb6b835a7e..4781ff23507 100644
--- a/app/views/layouts/header/_default.html.haml
+++ b/app/views/layouts/header/_default.html.haml
@@ -21,6 +21,10 @@
%li
= link_to admin_root_path, title: 'Admin Area', data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do
= icon('wrench fw')
+ %li
+ = link_to dashboard_todos_path, title: 'Todos', data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do
+ %span.badge.todos-pending-count
+ = todos_pending_count
- if current_user.can_create_project?
%li
= link_to new_project_path, title: 'New project', data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do
@@ -39,4 +43,4 @@
= render 'shared/outdated_browser'
- if @project && !@project.empty_repo?
:javascript
- var findFileURL = "#{namespace_project_find_file_path(@project.namespace, @project, @ref || @project.repository.root_ref)}"; \ No newline at end of file
+ var findFileURL = "#{namespace_project_find_file_path(@project.namespace, @project, @ref || @project.repository.root_ref)}";
diff --git a/app/views/layouts/nav/_dashboard.html.haml b/app/views/layouts/nav/_dashboard.html.haml
index 106abd24a56..db0cf393922 100644
--- a/app/views/layouts/nav/_dashboard.html.haml
+++ b/app/views/layouts/nav/_dashboard.html.haml
@@ -4,6 +4,12 @@
= icon('home fw')
%span
Projects
+ = nav_link(controller: :todos) do
+ = link_to dashboard_todos_path, title: 'Todos' do
+ = icon('bell fw')
+ %span
+ Todos
+ %span.count= number_with_delimiter(todos_pending_count)
= nav_link(path: 'dashboard#activity') do
= link_to activity_dashboard_path, class: 'shortcuts-activity', title: 'Activity' do
= icon('dashboard fw')
@@ -25,12 +31,12 @@
%span
Issues
%span.count= number_with_delimiter(current_user.assigned_issues.opened.count)
- = nav_link(path: 'dashboard#merge_requests') do
- = link_to assigned_mrs_dashboard_path, title: 'Merge Requests', class: 'shortcuts-merge_requests' do
- = icon('tasks fw')
- %span
- Merge Requests
- %span.count= number_with_delimiter(current_user.assigned_merge_requests.opened.count)
+ = nav_link(path: 'dashboard#merge_requests') do
+ = link_to assigned_mrs_dashboard_path, title: 'Merge Requests', class: 'shortcuts-merge_requests' do
+ = icon('tasks fw')
+ %span
+ Merge Requests
+ %span.count= number_with_delimiter(current_user.assigned_merge_requests.opened.count)
= nav_link(controller: :snippets) do
= link_to dashboard_snippets_path, title: 'Snippets' do
= icon('clipboard fw')
diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml
index 298c6664997..b45df44f270 100644
--- a/app/views/projects/_home_panel.html.haml
+++ b/app/views/projects/_home_panel.html.haml
@@ -3,7 +3,12 @@
.project-identicon-holder
= project_icon(@project, alt: '', class: 'project-avatar avatar s90')
.project-home-desc
- %h1= @project.name
+ %h1
+ = @project.name
+ %span.visibility-icon.has_tooltip{data: { container: 'body' },
+ title: "#{visibility_level_label(@project.visibility_level)} - #{project_visibility_level_description(@project.visibility_level)}"}
+ = visibility_level_icon(@project.visibility_level, fw: false)
+
- if @project.description.present?
= markdown(@project.description, pipeline: :description)
@@ -12,10 +17,6 @@
Forked from
= link_to project_path(forked_from_project) do
= forked_from_project.namespace.try(:name)
- .cover-controls.left
- .visibility-level-label.has_tooltip{title: project_visibility_level_description(@project.visibility_level), data: { container: 'body' } }
- = visibility_level_icon(@project.visibility_level, fw: false)
- = visibility_level_label(@project.visibility_level)
.cover-controls
- if current_user
diff --git a/app/views/projects/blame/show.html.haml b/app/views/projects/blame/show.html.haml
index eb6fbfaffa0..5f9a92ff93f 100644
--- a/app/views/projects/blame/show.html.haml
+++ b/app/views/projects/blame/show.html.haml
@@ -3,7 +3,7 @@
%h3.page-title Blame view
-#tree-holder.tree-holder
+#blob-content-holder.tree-holder
.file-holder
.file-title
= blob_icon @blob.mode, @blob.name
@@ -33,7 +33,9 @@
%td.line-numbers
- line_count = blame_group[:lines].count
- (current_line...(current_line + line_count)).each do |i|
- %a.diff-line-num= i
+ %a.diff-line-num{href: "#L#{i}", id: "L#{i}", 'data-line-number' => i}
+ = icon("link")
+ = i
\
- current_line += line_count
%td.lines
diff --git a/app/views/projects/blob/_blob.html.haml b/app/views/projects/blob/_blob.html.haml
index 2c5b8dc4356..3ffc3fcb7ac 100644
--- a/app/views/projects/blob/_blob.html.haml
+++ b/app/views/projects/blob/_blob.html.haml
@@ -32,14 +32,4 @@
= number_to_human_size(blob_size(blob))
.file-actions.hidden-xs
= render "actions"
- - if blob.lfs_pointer?
- = render "download", blob: blob
- - elsif blob.text?
- - if blob_svg?(blob)
- = render "image", blob: sanitize_svg(blob)
- - else
- = render "text", blob: blob
- - elsif blob.image?
- = render "image", blob: blob
- - else
- = render "download", blob: blob
+ = render blob, blob: blob
diff --git a/app/views/projects/blob/_image.html.haml b/app/views/projects/blob/_image.html.haml
index 51fa91b08e4..3c11b97921f 100644
--- a/app/views/projects/blob/_image.html.haml
+++ b/app/views/projects/blob/_image.html.haml
@@ -1,2 +1,9 @@
.file-content.image_file
- %img{ src: namespace_project_raw_path(@project.namespace, @project, @id)}
+ - if blob.svg?
+ - # We need to scrub SVG but we cannot do so in the RawController: it would
+ - # be wrong/strange if RawController modified the data.
+ - blob.load_all_data!(@repository)
+ - blob = sanitize_svg(blob)
+ %img{src: "data:#{blob.mime_type};base64,#{Base64.encode64(blob.data)}"}
+ - else
+ %img{src: namespace_project_raw_path(@project.namespace, @project, @id)}
diff --git a/app/views/projects/builds/show.html.haml b/app/views/projects/builds/show.html.haml
index ca1441a20d8..8eec78a557c 100644
--- a/app/views/projects/builds/show.html.haml
+++ b/app/views/projects/builds/show.html.haml
@@ -76,10 +76,16 @@
= link_to '#down-build-trace', class: 'btn' do
%i.fa.fa-angle-down
- %pre.trace#build-trace
- %code.bash
- = preserve do
- = raw @build.trace_html
+ - if @build.erased?
+ .erased.alert.alert-warning
+ - erased_by = "by #{link_to @build.erased_by.name, user_path(@build.erased_by)}" if @build.erased_by
+ Build has been erased #{erased_by.html_safe} #{time_ago_with_tooltip(@build.erased_at)}
+ - else
+ %pre.trace#build-trace
+ %code.bash
+ = preserve do
+ = raw @build.trace_html
+
%div#down-build-trace
.col-md-3
@@ -94,37 +100,55 @@
%h4.title Build artifacts
.center
.btn-group{ role: :group }
- = link_to "Download", @build.artifacts_download_url, class: 'btn btn-sm btn-primary'
+ = link_to @build.artifacts_download_url, class: 'btn btn-sm btn-primary' do
+ = icon('download')
+ Download
+
- if @build.artifacts_metadata?
- = link_to "Browse", @build.artifacts_browse_url, class: 'btn btn-sm btn-primary'
+ = link_to @build.artifacts_browse_url, class: 'btn btn-sm btn-primary' do
+ = icon('folder-open')
+ Browse
.build-widget
%h4.title
Build ##{@build.id}
- if can?(current_user, :update_build, @project)
- .pull-right
- - if @build.cancel_url
- = link_to "Cancel", @build.cancel_url, class: 'btn btn-sm btn-danger', method: :post
- - elsif @build.retry_url
- = link_to "Retry", @build.retry_url, class: 'btn btn-sm btn-primary', method: :post
-
- - if @build.duration
+ .center
+ .btn-group{ role: :group }
+ - if @build.cancel_url
+ = link_to "Cancel", @build.cancel_url, class: 'btn btn-sm btn-danger', method: :post
+ - elsif @build.retry_url
+ = link_to "Retry", @build.retry_url, class: 'btn btn-sm btn-primary', method: :post
+
+ - if @build.erasable?
+ = link_to erase_namespace_project_build_path(@project.namespace, @project, @build),
+ class: 'btn btn-sm btn-warning', method: :post,
+ data: { confirm: 'Are you sure you want to erase this build?' } do
+ = icon('eraser')
+ Erase
+
+ .clearfix
+ - if @build.duration
+ %p
+ %span.attr-name Duration:
+ #{duration_in_words(@build.finished_at, @build.started_at)}
%p
- %span.attr-name Duration:
- #{duration_in_words(@build.finished_at, @build.started_at)}
- %p
- %span.attr-name Created:
- #{time_ago_with_tooltip(@build.created_at)}
- - if @build.finished_at
+ %span.attr-name Created:
+ #{time_ago_with_tooltip(@build.created_at)}
+ - if @build.finished_at
+ %p
+ %span.attr-name Finished:
+ #{time_ago_with_tooltip(@build.finished_at)}
+ - if @build.erased_at
+ %p
+ %span.attr-name Erased:
+ #{time_ago_with_tooltip(@build.erased_at)}
%p
- %span.attr-name Finished:
- #{time_ago_with_tooltip(@build.finished_at)}
- %p
- %span.attr-name Runner:
- - if @build.runner && current_user && current_user.admin
- = link_to "##{@build.runner.id}", admin_runner_path(@build.runner.id)
- - elsif @build.runner
- \##{@build.runner.id}
+ %span.attr-name Runner:
+ - if @build.runner && current_user && current_user.admin
+ = link_to "##{@build.runner.id}", admin_runner_path(@build.runner.id)
+ - elsif @build.runner
+ \##{@build.runner.id}
- if @build.trigger_request
.build-widget
diff --git a/app/views/projects/commit/_commit_box.html.haml b/app/views/projects/commit/_commit_box.html.haml
index bbe820b8842..71995fcc487 100644
--- a/app/views/projects/commit/_commit_box.html.haml
+++ b/app/views/projects/commit/_commit_box.html.haml
@@ -16,6 +16,8 @@
= link_to namespace_project_tree_path(@project.namespace, @project, @commit), class: "btn btn-grouped" do
= icon('files-o')
Browse Files
+ - unless @commit.has_been_reverted?(current_user)
+ = revert_commit_link(@commit, namespace_project_commit_path(@project.namespace, @project, @commit.id))
%div
%p
diff --git a/app/views/projects/commit/_revert.html.haml b/app/views/projects/commit/_revert.html.haml
new file mode 100644
index 00000000000..52ca3ed5b14
--- /dev/null
+++ b/app/views/projects/commit/_revert.html.haml
@@ -0,0 +1,31 @@
+#modal-revert-commit.modal
+ .modal-dialog
+ .modal-content
+ .modal-header
+ %a.close{href: "#", "data-dismiss" => "modal"} ×
+ %h3.page-title== Revert this #{revert_commit_type(commit)}
+ .modal-body
+ = form_tag revert_namespace_project_commit_path(@project.namespace, @project, commit.id), method: :post, remote: false, class: 'form-horizontal js-create-dir-form js-requires-input' do
+ .form-group.branch
+ = label_tag 'target_branch', 'Revert in branch', class: 'control-label'
+ .col-sm-10
+ = select_tag "target_branch", grouped_options_refs, class: "select2 select2-sm js-target-branch"
+ - if can?(current_user, :push_code, @project)
+ .js-create-merge-request-container
+ .checkbox
+ - nonce = SecureRandom.hex
+ = label_tag "create_merge_request-#{nonce}" do
+ = check_box_tag 'create_merge_request', 1, true, class: 'js-create-merge-request', id: "create_merge_request-#{nonce}"
+ Start a <strong>new merge request</strong> with these changes
+ - else
+ = hidden_field_tag 'create_merge_request', 1
+ .form-actions
+ = submit_tag "Revert", class: 'btn btn-create'
+ = link_to "Cancel", '#', class: "btn btn-cancel", "data-dismiss" => "modal"
+
+ - unless can?(current_user, :push_code, @project)
+ .inline.prepend-left-10
+ = commit_in_fork_help
+
+:javascript
+ new NewCommitForm($('.js-create-dir-form'))
diff --git a/app/views/projects/commit/show.html.haml b/app/views/projects/commit/show.html.haml
index 05dbe5ebea4..21e186120c3 100644
--- a/app/views/projects/commit/show.html.haml
+++ b/app/views/projects/commit/show.html.haml
@@ -12,3 +12,5 @@
= render "projects/diffs/diffs", diffs: @diffs, project: @project,
diff_refs: @diff_refs
= render "projects/notes/notes_with_form"
+- if can_collaborate_with_project?
+ = render "projects/commit/revert", commit: @commit, title: @commit.title
diff --git a/app/views/projects/diffs/_image.html.haml b/app/views/projects/diffs/_image.html.haml
index 4fcf7ea0b26..752e92e2e6b 100644
--- a/app/views/projects/diffs/_image.html.haml
+++ b/app/views/projects/diffs/_image.html.haml
@@ -1,19 +1,19 @@
- diff = diff_file.diff
-- file.load_all_data!(@project.repository)
+- file_raw_path = namespace_project_raw_path(@project.namespace, @project, tree_join(@commit.id, diff.new_path))
+- old_file_raw_path = namespace_project_raw_path(@project.namespace, @project, tree_join(@commit.parent_id, diff.old_path))
- if diff.renamed_file || diff.new_file || diff.deleted_file
.image
%span.wrap
.frame{class: image_diff_class(diff)}
- %img{src: "data:#{file.mime_type};base64,#{Base64.encode64(file.data)}"}
+ %img{src: diff.deleted_file ? old_file_raw_path : file_raw_path}
%p.image-info= "#{number_to_human_size file.size}"
- else
- - old_file.load_all_data!(@project.repository)
.image
%div.two-up.view
%span.wrap
.frame.deleted
%a{href: namespace_project_blob_path(@project.namespace, @project, tree_join(@commit.parent_id, diff.old_path))}
- %img{src: "data:#{old_file.mime_type};base64,#{Base64.encode64(old_file.data)}"}
+ %img{src: old_file_raw_path}
%p.image-info.hide
%span.meta-filesize= "#{number_to_human_size old_file.size}"
|
@@ -25,7 +25,7 @@
%span.wrap
.frame.added
%a{href: namespace_project_blob_path(@project.namespace, @project, tree_join(@commit.id, diff.new_path))}
- %img{src: "data:#{file.mime_type};base64,#{Base64.encode64(file.data)}"}
+ %img{src: file_raw_path}
%p.image-info.hide
%span.meta-filesize= "#{number_to_human_size file.size}"
|
@@ -38,10 +38,10 @@
%div.swipe.view.hide
.swipe-frame
.frame.deleted
- %img{src: "data:#{old_file.mime_type};base64,#{Base64.encode64(old_file.data)}"}
+ %img{src: old_file_raw_path}
.swipe-wrap
.frame.added
- %img{src: "data:#{file.mime_type};base64,#{Base64.encode64(file.data)}"}
+ %img{src: file_raw_path}
%span.swipe-bar
%span.top-handle
%span.bottom-handle
@@ -49,9 +49,9 @@
%div.onion-skin.view.hide
.onion-skin-frame
.frame.deleted
- %img{src: "data:#{old_file.mime_type};base64,#{Base64.encode64(old_file.data)}"}
+ %img{src: old_file_raw_path}
.frame.added
- %img{src: "data:#{file.mime_type};base64,#{Base64.encode64(file.data)}"}
+ %img{src: file_raw_path}
.controls
.transparent
.drag-track
diff --git a/app/views/projects/diffs/_text_file.html.haml b/app/views/projects/diffs/_text_file.html.haml
index 5e835b10e1f..d75e9ef2a49 100644
--- a/app/views/projects/diffs/_text_file.html.haml
+++ b/app/views/projects/diffs/_text_file.html.haml
@@ -35,8 +35,8 @@
= render "projects/notes/diff_notes_with_reply", notes: comments, line: raw_diff_lines[index].text
- if last_line > 0
- = render "projects/diffs/match_line", {line: "",
- line_old: last_line, line_new: last_line, bottom: true, new_file: diff_file.new_file}
+ = render "projects/diffs/match_line", { line: "",
+ line_old: last_line, line_new: last_line, bottom: true, new_file: diff_file.new_file }
- if diff_file.diff.blank? && diff_file.mode_changed?
.file-mode-changed
diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml
index fdcb6987471..042f660077e 100644
--- a/app/views/projects/edit.html.haml
+++ b/app/views/projects/edit.html.haml
@@ -119,13 +119,13 @@
.col-sm-offset-2.col-sm-10
%p Get recent application code using the following command:
.radio
- = f.label :build_allow_git_fetch do
+ = f.label :build_allow_git_fetch_false do
= f.radio_button :build_allow_git_fetch, 'false'
%strong git clone
%br
%span.descr Slower but makes sure you have a clean dir before every build
.radio
- = f.label :build_allow_git_fetch do
+ = f.label :build_allow_git_fetch_true do
= f.radio_button :build_allow_git_fetch, 'true'
%strong git fetch
%br
diff --git a/app/views/projects/issues/_issue.html.haml b/app/views/projects/issues/_issue.html.haml
index f9cf4910df3..654d8cd5ed0 100644
--- a/app/views/projects/issues/_issue.html.haml
+++ b/app/views/projects/issues/_issue.html.haml
@@ -15,6 +15,17 @@
%li
= link_to_member(@project, issue.assignee, name: false, title: "Assigned to :name")
+ - upvotes, downvotes = issue.upvotes, issue.downvotes
+ - if upvotes > 0
+ %li
+ = icon('thumbs-up')
+ = upvotes
+
+ - if downvotes > 0
+ %li
+ = icon('thumbs-down')
+ = downvotes
+
- note_count = issue.notes.user.count
- if note_count > 0
%li
diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml
index fe977fd700c..69a0e2a0c4d 100644
--- a/app/views/projects/issues/show.html.haml
+++ b/app/views/projects/issues/show.html.haml
@@ -6,16 +6,6 @@
.issue
.detail-page-header
- .status-box{ class: "status-box-closed #{issue_button_visibility(@issue, false)}"} Closed
- .status-box{ class: "status-box-open #{issue_button_visibility(@issue, true)}"} Open
- %span.identifier
- Issue ##{@issue.iid}
- %span.creator
- &middot;
- opened by #{link_to_member(@project, @issue.author, size: 24)}
- &middot;
- = time_ago_with_tooltip(@issue.created_at, placement: 'bottom', html_class: 'issue_created_ago')
-
.pull-right
- if can?(current_user, :create_issue, @project)
= link_to new_namespace_project_issue_path(@project.namespace, @project), class: 'btn btn-nr btn-grouped new-issue-link btn-success', title: 'New Issue', id: 'new_issue_link' do
@@ -29,6 +19,19 @@
= icon('pencil-square-o')
Edit
+ .pull-left
+ .status-box{ class: "status-box-closed #{issue_button_visibility(@issue, false)}"} Closed
+ .status-box{ class: "status-box-open #{issue_button_visibility(@issue, true)}"} Open
+
+ .issue-meta
+ %span.identifier
+ Issue ##{@issue.iid}
+ %span.creator
+ &middot;
+ by #{link_to_member(@project, @issue.author, size: 24)}
+ &middot;
+ = time_ago_with_tooltip(@issue.created_at, placement: 'bottom', html_class: 'issue_created_ago')
+
.issue-details.issuable-details
.detail-page-description.content-block
%h2.title
diff --git a/app/views/projects/issues/update.js.haml b/app/views/projects/issues/update.js.haml
index a54733883b4..986d8c220db 100644
--- a/app/views/projects/issues/update.js.haml
+++ b/app/views/projects/issues/update.js.haml
@@ -1,3 +1,3 @@
$('aside.right-sidebar')[0].outerHTML = "#{escape_javascript(render 'shared/issuable/sidebar', issuable: @issue)}";
$('aside.right-sidebar').effect('highlight');
-new Issue(); \ No newline at end of file
+new IssuableContext();
diff --git a/app/views/projects/labels/_form.html.haml b/app/views/projects/labels/_form.html.haml
index 5ce2a7b985d..d63d3a3ec20 100644
--- a/app/views/projects/labels/_form.html.haml
+++ b/app/views/projects/labels/_form.html.haml
@@ -12,6 +12,10 @@
.col-sm-10
= f.text_field :title, class: "form-control js-quick-submit", required: true, autofocus: true
.form-group
+ = f.label :description, class: 'control-label'
+ .col-sm-10
+ = f.text_field :description, class: "form-control js-quick-submit"
+ .form-group
= f.label :color, "Background color", class: 'control-label'
.col-sm-10
.input-group
diff --git a/app/views/projects/labels/_label.html.haml b/app/views/projects/labels/_label.html.haml
index b70a9fc9fe5..5b35acc66c0 100644
--- a/app/views/projects/labels/_label.html.haml
+++ b/app/views/projects/labels/_label.html.haml
@@ -1,5 +1,6 @@
%li{id: dom_id(label)}
- = link_to_label(label)
+ = render "shared/label_row", label: label
+
.pull-right
%strong.append-right-20
= link_to_label(label) do
diff --git a/app/views/projects/merge_requests/_merge_request.html.haml b/app/views/projects/merge_requests/_merge_request.html.haml
index e25bf917b43..b55f6a2d32a 100644
--- a/app/views/projects/merge_requests/_merge_request.html.haml
+++ b/app/views/projects/merge_requests/_merge_request.html.haml
@@ -24,6 +24,17 @@
%li
= link_to_member(merge_request.source_project, merge_request.assignee, name: false, title: "Assigned to :name")
+ - upvotes, downvotes = merge_request.upvotes, merge_request.downvotes
+ - if upvotes > 0
+ %li
+ = icon('thumbs-up')
+ = upvotes
+
+ - if downvotes > 0
+ %li
+ = icon('thumbs-down')
+ = downvotes
+
- note_count = merge_request.mr_and_commit_notes.user.count
- if note_count > 0
%li
diff --git a/app/views/projects/merge_requests/_show.html.haml b/app/views/projects/merge_requests/_show.html.haml
index da67645bc2b..648512e5379 100644
--- a/app/views/projects/merge_requests/_show.html.haml
+++ b/app/views/projects/merge_requests/_show.html.haml
@@ -85,6 +85,8 @@
= spinner
= render 'shared/issuable/sidebar', issuable: @merge_request
+- if @merge_request.can_be_reverted?
+ = render "projects/commit/revert", commit: @merge_request.merge_commit, title: @merge_request.title
:javascript
var merge_request;
diff --git a/app/views/projects/merge_requests/show/_mr_title.html.haml b/app/views/projects/merge_requests/show/_mr_title.html.haml
index 473fbff721b..14ea7b17786 100644
--- a/app/views/projects/merge_requests/show/_mr_title.html.haml
+++ b/app/views/projects/merge_requests/show/_mr_title.html.haml
@@ -5,7 +5,7 @@
Merge Request ##{@merge_request.iid}
%span.creator
&middot;
- opened by #{link_to_member(@project, @merge_request.author, size: 24)}
+ by #{link_to_member(@project, @merge_request.author, size: 24)}
&middot;
= time_ago_with_tooltip(@merge_request.created_at)
diff --git a/app/views/projects/merge_requests/update.js.haml b/app/views/projects/merge_requests/update.js.haml
index ce5157d69a2..9cce5660e1c 100644
--- a/app/views/projects/merge_requests/update.js.haml
+++ b/app/views/projects/merge_requests/update.js.haml
@@ -1,3 +1,3 @@
-$('aside.right-sidebar')[0].outerHTML= "#{escape_javascript(render 'shared/issuable/sidebar', issuable: @merge_request)}";
-$('aside.right-sidebar').effect('highlight')
-merge_request = new MergeRequest();
+$('aside.right-sidebar')[0].outerHTML = "#{escape_javascript(render 'shared/issuable/sidebar', issuable: @merge_request)}";
+$('aside.right-sidebar').effect('highlight');
+new IssuableContext();
diff --git a/app/views/projects/merge_requests/widget/_merged.html.haml b/app/views/projects/merge_requests/widget/_merged.html.haml
index d1d602eecdc..3abae9f0bf6 100644
--- a/app/views/projects/merge_requests/widget/_merged.html.haml
+++ b/app/views/projects/merge_requests/widget/_merged.html.haml
@@ -8,20 +8,18 @@
#{time_ago_with_tooltip(@merge_request.merge_event.created_at)}
%div
- if !@merge_request.source_branch_exists? || (params[:delete_source] == 'true')
- The changes were merged into
- #{link_to @merge_request.target_branch, namespace_project_commits_path(@project.namespace, @project, @merge_request.target_branch), class: "label-branch"}.
- The source branch has been removed.
-
+ %p
+ The changes were merged into
+ #{link_to @merge_request.target_branch, namespace_project_commits_path(@project.namespace, @project, @merge_request.target_branch), class: "label-branch"}.
+ The source branch has been removed.
+ = render 'projects/merge_requests/widget/merged_buttons'
- elsif @merge_request.can_remove_source_branch?(current_user)
.remove_source_branch_widget
%p
The changes were merged into
#{link_to @merge_request.target_branch, namespace_project_commits_path(@project.namespace, @project, @merge_request.target_branch), class: "label-branch"}.
You can remove the source branch now.
- = link_to namespace_project_branch_path(@merge_request.source_project.namespace, @merge_request.source_project, @merge_request.source_branch), remote: true, method: :delete, class: "btn btn-primary btn-sm remove_source_branch" do
- %i.fa.fa-times
- Remove Source Branch
-
+ = render 'projects/merge_requests/widget/merged_buttons', source_branch_exists: true
.remove_source_branch_widget.failed.hide
%p
Failed to remove source branch '#{@merge_request.source_branch}'.
diff --git a/app/views/projects/merge_requests/widget/_merged_buttons.haml b/app/views/projects/merge_requests/widget/_merged_buttons.haml
new file mode 100644
index 00000000000..85a3a6ba9e2
--- /dev/null
+++ b/app/views/projects/merge_requests/widget/_merged_buttons.haml
@@ -0,0 +1,11 @@
+- source_branch_exists = local_assigns.fetch(:source_branch_exists, false)
+- mr_can_be_reverted = @merge_request.can_be_reverted?
+
+- if source_branch_exists || mr_can_be_reverted
+ .btn-group
+ - if source_branch_exists
+ = link_to namespace_project_branch_path(@merge_request.source_project.namespace, @merge_request.source_project, @merge_request.source_branch), remote: true, method: :delete, class: "btn btn-default btn-grouped btn-sm remove_source_branch" do
+ = icon('trash-o')
+ Remove Source Branch
+ - if mr_can_be_reverted
+ = revert_commit_link(@merge_request.merge_commit, namespace_project_merge_request_path(@project.namespace, @project, @merge_request), btn_class: 'sm')
diff --git a/app/views/projects/milestones/_issue.html.haml b/app/views/projects/milestones/_issue.html.haml
index 133d802aaca..ca51b8c745d 100644
--- a/app/views/projects/milestones/_issue.html.haml
+++ b/app/views/projects/milestones/_issue.html.haml
@@ -1,9 +1,10 @@
%li{ id: dom_id(issue, 'sortable'), class: 'issue-row', 'data-iid' => issue.iid, 'data-url' => issue_path(issue) }
- .pull-right.assignee-icon
- - if issue.assignee
- = image_tag avatar_icon(issue.assignee, 16), class: "avatar s16", alt: ''
%span
- = link_to [@project.namespace.becomes(Namespace), @project, issue] do
- %span.cgray ##{issue.iid}
= link_to_gfm issue.title, [@project.namespace.becomes(Namespace), @project, issue], title: issue.title
-
+ .issue-detail
+ = link_to [@project.namespace.becomes(Namespace), @project, issue] do
+ %span.issue-number ##{issue.iid}
+ - issue.labels.each do |label|
+ = render_colored_label(label)
+ - if issue.assignee
+ = image_tag avatar_icon(issue.assignee, 16), class: "avatar s24", alt: ''
diff --git a/app/views/projects/milestones/_issues.html.haml b/app/views/projects/milestones/_issues.html.haml
index 6e4df75a3df..6f8a341e478 100644
--- a/app/views/projects/milestones/_issues.html.haml
+++ b/app/views/projects/milestones/_issues.html.haml
@@ -1,6 +1,7 @@
.panel.panel-default
- .panel-heading= title
+ .panel-heading
+ = title
+ .pull-right= issues.size
%ul{ class: "well-list issues-sortable-list", id: "issues-list-#{id}", "data-state" => id }
- issues.sort_by(&:position).each do |issue|
= render 'issue', issue: issue
- %li.light.ui-sort-disabled Drag and drop available
diff --git a/app/views/projects/milestones/_merge_requests.html.haml b/app/views/projects/milestones/_merge_requests.html.haml
index 00889a5eb24..9a5a02af215 100644
--- a/app/views/projects/milestones/_merge_requests.html.haml
+++ b/app/views/projects/milestones/_merge_requests.html.haml
@@ -3,4 +3,3 @@
%ul{ class: "well-list merge_requests-sortable-list", id: "merge_requests-list-#{id}", "data-state" => id }
- merge_requests.sort_by(&:position).each do |merge_request|
= render 'merge_request', merge_request: merge_request
- %li.light.ui-sort-disabled Drag and drop available
diff --git a/app/views/projects/milestones/show.html.haml b/app/views/projects/milestones/show.html.haml
index 528a4f9552f..631bc8c3e9d 100644
--- a/app/views/projects/milestones/show.html.haml
+++ b/app/views/projects/milestones/show.html.haml
@@ -24,7 +24,7 @@
- else
= link_to 'Reopen Milestone', namespace_project_milestone_path(@project.namespace, @project, @milestone, milestone: {state_event: :activate }), method: :put, class: "btn btn-reopen btn-nr btn-grouped"
- = link_to namespace_project_milestone_path(@project.namespace, @project, @milestone), data: { confirm: 'Are you sure?' }, method: :delete, class: "btn btn-grouped btn-nr btn-remove" do
+ = link_to namespace_project_milestone_path(@project.namespace, @project, @milestone), data: { confirm: 'Are you sure?' }, method: :delete, class: "btn btn-grouped btn-nr" do
= icon('trash-o')
Delete
@@ -32,7 +32,7 @@
= icon('pencil-square-o')
Edit
-.detail-page-description.content-block
+.detail-page-description.milestone-detail.second-block
%h2.title
= markdown escape_once(@milestone.title), pipeline: :single_line
%div
@@ -47,44 +47,55 @@
%span All issues for this milestone are closed. You may close milestone now.
.context.prepend-top-default
- %p.lead
- Progress:
- #{@milestone.closed_items_count} closed
- &ndash;
- #{@milestone.open_items_count} open
- &nbsp;
- %span.light #{@milestone.percent_complete}% complete
- %span.pull-right= @milestone.expires_at
+ .milestone-summary
+ %h4 Progress
+ %strong= @milestone.issues.count
+ issues:
+ %span.milestone-stat
+ %strong= @milestone.open_items_count
+ open and
+ %strong= @milestone.closed_items_count
+ closed
+ %span.milestone-stat
+ %strong== #{@milestone.percent_complete}%
+ complete
+ %span.milestone-stat
+ %span.time-elapsed
+ %strong== #{@milestone.percent_time_used}%
+ time elapsed
+ %span.pull-right.tab-issues-buttons
+ - if can?(current_user, :create_issue, @project)
+ = link_to new_namespace_project_issue_path(@project.namespace, @project, issue: { milestone_id: @milestone.id }), class: "btn btn-grouped", title: "New Issue" do
+ %i.fa.fa-plus
+ New Issue
+ - if can?(current_user, :read_issue, @project)
+ = link_to 'Browse Issues', namespace_project_issues_path(@milestone.project.namespace, @milestone.project, milestone_title: @milestone.title), class: "btn btn-grouped"
+ %span.pull-right.tab-merge-requests-buttons.hidden
+ - if can?(current_user, :read_merge_request, @project)
+ = link_to 'Browse Merge Requests', namespace_project_merge_requests_path(@milestone.project.namespace, @milestone.project, milestone_title: @milestone.title), class: "btn btn-grouped"
+
= milestone_progress_bar(@milestone)
%ul.nav-links.no-top.no-bottom
%li.active
- = link_to '#tab-issues', 'data-toggle' => 'tab' do
+ = link_to '#tab-issues', 'data-toggle' => 'tab', 'data-show' => '.tab-issues-buttons' do
Issues
%span.badge= @issues.count
%li
- = link_to '#tab-merge-requests', 'data-toggle' => 'tab' do
+ = link_to '#tab-merge-requests', 'data-toggle' => 'tab', 'data-show' => '.tab-merge-requests-buttons' do
Merge Requests
%span.badge= @merge_requests.count
%li
= link_to '#tab-participants', 'data-toggle' => 'tab' do
Participants
%span.badge= @users.count
+ %li
+ = link_to '#tab-labels', 'data-toggle' => 'tab', 'data-show' => '.tab-issues-buttons' do
+ Labels
+ %span.badge= @labels.count
-.tab-content
+.tab-content.milestone-content
.tab-pane.active#tab-issues
- .content-block.oneline-block
- .controls
- - if can?(current_user, :create_issue, @project)
- = link_to new_namespace_project_issue_path(@project.namespace, @project, issue: { milestone_id: @milestone.id }), class: "btn btn-grouped", title: "New Issue" do
- %i.fa.fa-plus
- New Issue
- - if can?(current_user, :read_issue, @project)
- = link_to 'Browse Issues', namespace_project_issues_path(@milestone.project.namespace, @milestone.project, milestone_title: @milestone.title), class: "btn btn-grouped"
-
- .oneline
- All issues in this milestone
-
.row.prepend-top-default
.col-md-4
= render('issues', title: 'Unstarted Issues (open and unassigned)', issues: @issues.opened.unassigned, id: 'unassigned')
@@ -94,14 +105,6 @@
= render('issues', title: 'Completed Issues (closed)', issues: @issues.closed, id: 'closed')
.tab-pane#tab-merge-requests
- .content-block.oneline-block
- .controls
- - if can?(current_user, :read_merge_request, @project)
- = link_to 'Browse Merge Requests', namespace_project_merge_requests_path(@milestone.project.namespace, @milestone.project, milestone_title: @milestone.title), class: "btn btn-grouped"
-
- .oneline
- All merge requests in this milestone
-
.row.prepend-top-default
.col-md-3
= render('merge_requests', title: 'Work in progress (open and unassigned)', merge_requests: @merge_requests.opened.unassigned, id: 'unassigned')
@@ -117,9 +120,6 @@
= render 'merge_request', merge_request: merge_request
.tab-pane#tab-participants
- .content-block.oneline-block
- All participants to this milestone
-
%ul.bordered-list
- @users.each do |user|
%li
@@ -128,3 +128,18 @@
%strong= truncate(user.name, lenght: 40)
%br
%small.cgray= user.username
+
+ .tab-pane#tab-labels
+ %ul.bordered-list.manage-labels-list
+ - @labels.each do |label|
+ %li
+ = render_colored_label(label)
+ - args = [@milestone.project.namespace, @milestone.project, milestone_title: @milestone.title, label_name: label.title]
+ - options = args.extract_options!
+
+ %span.issues-count
+ = link_to namespace_project_issues_path(*args, options.merge(state: 'opened')) do
+ = pluralize label.open_issues_count, 'open issue'
+ %span.issues-count
+ = link_to namespace_project_issues_path(*args, options.merge(state: 'closed')) do
+ = pluralize label.closed_issues_count, 'closed issue'
diff --git a/app/views/shared/_label_row.html.haml b/app/views/shared/_label_row.html.haml
new file mode 100644
index 00000000000..8134b15d245
--- /dev/null
+++ b/app/views/shared/_label_row.html.haml
@@ -0,0 +1,4 @@
+%span.label-row
+ = link_to_label(label)
+ %span.prepend-left-10
+ = markdown(label.description, pipeline: :single_line)
diff --git a/app/views/shared/_project_limit.html.haml b/app/views/shared/_project_limit.html.haml
index 960ff00b49d..f4eb8e491b9 100644
--- a/app/views/shared/_project_limit.html.haml
+++ b/app/views/shared/_project_limit.html.haml
@@ -1,4 +1,4 @@
-- if cookies[:hide_project_limit_message].blank? && !current_user.hide_project_limit && !current_user.can_create_project?
+- if cookies[:hide_project_limit_message].blank? && !current_user.hide_project_limit && !current_user.can_create_project? && current_user.projects_limit > 0
.project-limit-message.alert.alert-warning.hidden-xs
You won't be able to create new projects because you have reached your project limit.
diff --git a/app/views/shared/_sort_dropdown.html.haml b/app/views/shared/_sort_dropdown.html.haml
index f09ab25276d..e3a6a5a68b6 100644
--- a/app/views/shared/_sort_dropdown.html.haml
+++ b/app/views/shared/_sort_dropdown.html.haml
@@ -20,3 +20,7 @@
= sort_title_milestone_soon
= link_to page_filter_path(sort: sort_value_milestone_later) do
= sort_title_milestone_later
+ = link_to page_filter_path(sort: sort_value_upvotes) do
+ = sort_title_upvotes
+ = link_to page_filter_path(sort: sort_value_downvotes) do
+ = sort_title_downvotes
diff --git a/app/views/shared/issuable/_filter.html.haml b/app/views/shared/issuable/_filter.html.haml
index b7e350d27af..e55159d996b 100644
--- a/app/views/shared/issuable/_filter.html.haml
+++ b/app/views/shared/issuable/_filter.html.haml
@@ -41,6 +41,10 @@
.filter-item.inline
= button_tag "Update issues", class: "btn update_selected_issues btn-save"
+- if @label
+ .gray-content-block.second-block
+ = render "shared/label_row", label: @label
+
:javascript
new UsersSelect();
$('form.filter-form').on('submit', function (event) {
diff --git a/app/views/shared/issuable/_sidebar.html.haml b/app/views/shared/issuable/_sidebar.html.haml
index 2aada5c9952..a45775f36b5 100644
--- a/app/views/shared/issuable/_sidebar.html.haml
+++ b/app/views/shared/issuable/_sidebar.html.haml
@@ -47,7 +47,7 @@
.block.milestone
.sidebar-collapsed-icon
- = icon('balance-scale')
+ = icon('clock-o')
%span
- if issuable.milestone
= issuable.milestone.title
diff --git a/app/views/shared/projects/_project.html.haml b/app/views/shared/projects/_project.html.haml
index 00bf9dcd2d5..72061e272f1 100644
--- a/app/views/shared/projects/_project.html.haml
+++ b/app/views/shared/projects/_project.html.haml
@@ -4,7 +4,7 @@
- ci = false unless local_assigns[:ci] == true
- skip_namespace = false unless local_assigns[:skip_namespace] == true
- css_class = '' unless local_assigns[:css_class]
-- show_last_commit_as_description = false unless local_assigns[:show_last_commit_as_description] == true
+- show_last_commit_as_description = false unless local_assigns[:show_last_commit_as_description] == true && project.commit
- css_class += " no-description" if project.description.blank? && !show_last_commit_as_description
- ci_commit = project.ci_commit(project.commit.sha) if ci && !project.empty_repo? && project.commit
- cache_key = [project.namespace, project, controller.controller_name, controller.action_name, current_application_settings, 'v2.2']
@@ -39,6 +39,9 @@
%span
= icon('star')
= project.star_count
+ %span.visibility-icon.has_tooltip{data: { container: 'body', placement: 'left' },
+ title: "#{visibility_level_label(project.visibility_level)} - #{project_visibility_level_description(project.visibility_level)}"}
+ = visibility_level_icon(project.visibility_level, fw: false)
- if show_last_commit_as_description
.project-description
= link_to_gfm project.commit.title, namespace_project_commit_path(project.namespace, project, project.commit),
diff --git a/app/workers/post_receive.rb b/app/workers/post_receive.rb
index 994b8e8ed38..14d7813412e 100644
--- a/app/workers/post_receive.rb
+++ b/app/workers/post_receive.rb
@@ -38,7 +38,7 @@ class PostReceive
if Gitlab::Git.tag_ref?(ref)
GitTagPushService.new.execute(project, @user, oldrev, newrev, ref)
else
- GitPushService.new.execute(project, @user, oldrev, newrev, ref)
+ GitPushService.new(project, @user, oldrev: oldrev, newrev: newrev, ref: ref).execute
end
end
end
diff --git a/app/workers/repository_fork_worker.rb b/app/workers/repository_fork_worker.rb
index 2f991c52339..2572b9d6d98 100644
--- a/app/workers/repository_fork_worker.rb
+++ b/app/workers/repository_fork_worker.rb
@@ -27,6 +27,7 @@ class RepositoryForkWorker
return
end
+ project.repository.expire_emptiness_caches
project.import_finish
end
end
diff --git a/app/workers/repository_import_worker.rb b/app/workers/repository_import_worker.rb
index e295a9ddd14..0b6f746e118 100644
--- a/app/workers/repository_import_worker.rb
+++ b/app/workers/repository_import_worker.rb
@@ -18,6 +18,7 @@ class RepositoryImportWorker
return
end
+ project.repository.expire_emptiness_caches
project.import_finish
end
end
diff --git a/config/application.rb b/config/application.rb
index 1e9ec74cdbf..b905f1a3e90 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -6,6 +6,8 @@ I18n.config.enforce_available_locales = false
Bundler.require(:default, Rails.env)
module Gitlab
+ REDIS_CACHE_NAMESPACE = 'cache:gitlab'
+
class Application < Rails::Application
# Settings in config/environments/* take precedence over those specified here.
# Application configuration should go into files in config/initializers
@@ -43,8 +45,8 @@ module Gitlab
# Enable the asset pipeline
config.assets.enabled = true
- config.assets.paths << Emoji.images_path
- config.assets.precompile << "emoji/*.png"
+ config.assets.paths << Gemojione.index.images_path
+ config.assets.precompile << "*.png"
config.assets.precompile << "print.css"
# Version of your assets, change this if you want to expire all your assets
@@ -89,7 +91,7 @@ module Gitlab
redis_config_hash[:path] = redis_uri.path
end
- redis_config_hash[:namespace] = 'cache:gitlab'
+ redis_config_hash[:namespace] = REDIS_CACHE_NAMESPACE
redis_config_hash[:expires_in] = 2.weeks # Cache should not grow forever
config.cache_store = :redis_store, redis_config_hash
diff --git a/config/gitlab.yml.example b/config/gitlab.yml.example
index faf05ecd466..05f127d622a 100644
--- a/config/gitlab.yml.example
+++ b/config/gitlab.yml.example
@@ -288,15 +288,22 @@ production: &base
# auto_sign_in_with_provider: saml
# CAUTION!
- # This allows users to login without having a user account first (default: false).
+ # This allows users to login without having a user account first. Define the allowed providers
+ # using an array, e.g. ["saml", "twitter"], or as true/false to allow all providers or none.
# User accounts will be created automatically when authentication was successful.
- allow_single_sign_on: false
+ allow_single_sign_on: ["saml"]
+
# Locks down those users until they have been cleared by the admin (default: true).
block_auto_created_users: true
# Look up new users in LDAP servers. If a match is found (same uid), automatically
# link the omniauth identity with the LDAP account. (default: false)
auto_link_ldap_user: false
+ # Allow users with existing accounts to login and auto link their account via SAML
+ # login, without having to do a manual login first and manually add SAML
+ # (default: false)
+ auto_link_saml_user: false
+
## Auth providers
# Uncomment the following lines and fill in the data of the auth provider you want to use
# If your favorite auth provider is not listed you can use others:
diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb
index d8170557f7e..713204b1c51 100644
--- a/config/initializers/1_settings.rb
+++ b/config/initializers/1_settings.rb
@@ -131,6 +131,7 @@ Settings.omniauth['auto_sign_in_with_provider'] = false if Settings.omniauth['au
Settings.omniauth['allow_single_sign_on'] = false if Settings.omniauth['allow_single_sign_on'].nil?
Settings.omniauth['block_auto_created_users'] = true if Settings.omniauth['block_auto_created_users'].nil?
Settings.omniauth['auto_link_ldap_user'] = false if Settings.omniauth['auto_link_ldap_user'].nil?
+Settings.omniauth['auto_link_saml_user'] = false if Settings.omniauth['auto_link_saml_user'].nil?
Settings.omniauth['providers'] ||= []
Settings.omniauth['cas3'] ||= Settingslogic.new({})
diff --git a/config/initializers/2_app.rb b/config/initializers/2_app.rb
index 35b150c9929..bd74f90e7d2 100644
--- a/config/initializers/2_app.rb
+++ b/config/initializers/2_app.rb
@@ -3,6 +3,6 @@ module Gitlab
Settings
end
- VERSION = File.read(Rails.root.join("VERSION")).strip
- REVISION = Gitlab::Popen.popen(%W(#{config.git.bin_path} log --pretty=format:%h -n 1)).first.chomp
+ VERSION = File.read(Rails.root.join("VERSION")).strip.freeze
+ REVISION = Gitlab::Popen.popen(%W(#{config.git.bin_path} log --pretty=format:%h -n 1)).first.chomp.freeze
end
diff --git a/config/initializers/sentry.rb b/config/initializers/sentry.rb
index d0630b9fa07..e87899b2d5c 100644
--- a/config/initializers/sentry.rb
+++ b/config/initializers/sentry.rb
@@ -14,6 +14,7 @@ if Rails.env.production?
if sentry_enabled
Raven.configure do |config|
config.dsn = current_application_settings.sentry_dsn
+ config.release = Gitlab::REVISION
end
end
end
diff --git a/config/routes.rb b/config/routes.rb
index 507bcbc53d7..30681356c5f 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -334,6 +334,12 @@ Rails.application.routes.draw do
resources :groups, only: [:index]
resources :snippets, only: [:index]
+ resources :todos, only: [:index, :destroy] do
+ collection do
+ delete :destroy_all
+ end
+ end
+
resources :projects, only: [:index] do
collection do
get :starred
@@ -502,6 +508,7 @@ Rails.application.routes.draw do
get :builds
post :cancel_builds
post :retry_builds
+ post :revert
end
end
@@ -617,6 +624,7 @@ Rails.application.routes.draw do
get :status
post :cancel
post :retry
+ post :erase
end
resource :artifacts, only: [] do
diff --git a/config/sidekiq.yml.example b/config/sidekiq.yml.example
index c691db67c6c..714bc06cb24 100644
--- a/config/sidekiq.yml.example
+++ b/config/sidekiq.yml.example
@@ -1,2 +1,2 @@
---
+---
:concurrency: 5 \ No newline at end of file
diff --git a/db/migrate/20160129155512_add_merge_commit_sha_to_merge_requests.rb b/db/migrate/20160129155512_add_merge_commit_sha_to_merge_requests.rb
new file mode 100644
index 00000000000..f0d94226514
--- /dev/null
+++ b/db/migrate/20160129155512_add_merge_commit_sha_to_merge_requests.rb
@@ -0,0 +1,5 @@
+class AddMergeCommitShaToMergeRequests < ActiveRecord::Migration
+ def change
+ add_column :merge_requests, :merge_commit_sha, :string
+ end
+end
diff --git a/db/migrate/20160202091601_add_erasable_to_ci_build.rb b/db/migrate/20160202091601_add_erasable_to_ci_build.rb
new file mode 100644
index 00000000000..f9912f2274e
--- /dev/null
+++ b/db/migrate/20160202091601_add_erasable_to_ci_build.rb
@@ -0,0 +1,6 @@
+class AddErasableToCiBuild < ActiveRecord::Migration
+ def change
+ add_reference :ci_builds, :erased_by, references: :users, index: true
+ add_column :ci_builds, :erased_at, :datetime
+ end
+end
diff --git a/db/migrate/20160212123307_create_tasks.rb b/db/migrate/20160212123307_create_tasks.rb
new file mode 100644
index 00000000000..c3f6f3abc26
--- /dev/null
+++ b/db/migrate/20160212123307_create_tasks.rb
@@ -0,0 +1,14 @@
+class CreateTasks < ActiveRecord::Migration
+ def change
+ create_table :tasks do |t|
+ t.references :user, null: false, index: true
+ t.references :project, null: false, index: true
+ t.references :target, polymorphic: true, null: false, index: true
+ t.integer :author_id, index: true
+ t.integer :action, null: false
+ t.string :state, null: false, index: true
+
+ t.timestamps
+ end
+ end
+end
diff --git a/db/migrate/20160217100506_add_description_to_label.rb b/db/migrate/20160217100506_add_description_to_label.rb
new file mode 100644
index 00000000000..eed6d1f236a
--- /dev/null
+++ b/db/migrate/20160217100506_add_description_to_label.rb
@@ -0,0 +1,5 @@
+class AddDescriptionToLabel < ActiveRecord::Migration
+ def change
+ add_column :labels, :description, :string
+ end
+end
diff --git a/db/migrate/20160217174422_add_note_to_tasks.rb b/db/migrate/20160217174422_add_note_to_tasks.rb
new file mode 100644
index 00000000000..da5cb2e05db
--- /dev/null
+++ b/db/migrate/20160217174422_add_note_to_tasks.rb
@@ -0,0 +1,5 @@
+class AddNoteToTasks < ActiveRecord::Migration
+ def change
+ add_reference :tasks, :note, index: true
+ end
+end
diff --git a/db/migrate/20160220123949_rename_tasks_to_todos.rb b/db/migrate/20160220123949_rename_tasks_to_todos.rb
new file mode 100644
index 00000000000..30c10d27146
--- /dev/null
+++ b/db/migrate/20160220123949_rename_tasks_to_todos.rb
@@ -0,0 +1,5 @@
+class RenameTasksToTodos < ActiveRecord::Migration
+ def change
+ rename_table :tasks, :todos
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 689a8c3ecc5..4708c29d9ae 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -11,7 +11,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema.define(version: 20160209130428) do
+ActiveRecord::Schema.define(version: 20160220123949) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@@ -129,6 +129,8 @@ ActiveRecord::Schema.define(version: 20160209130428) do
t.text "artifacts_file"
t.integer "gl_project_id"
t.text "artifacts_metadata"
+ t.integer "erased_by_id"
+ t.datetime "erased_at"
end
add_index "ci_builds", ["commit_id", "stage_idx", "created_at"], name: "index_ci_builds_on_commit_id_and_stage_idx_and_created_at", using: :btree
@@ -136,6 +138,7 @@ ActiveRecord::Schema.define(version: 20160209130428) do
add_index "ci_builds", ["commit_id", "type", "name", "ref"], name: "index_ci_builds_on_commit_id_and_type_and_name_and_ref", using: :btree
add_index "ci_builds", ["commit_id", "type", "ref"], name: "index_ci_builds_on_commit_id_and_type_and_ref", using: :btree
add_index "ci_builds", ["commit_id"], name: "index_ci_builds_on_commit_id", using: :btree
+ add_index "ci_builds", ["erased_by_id"], name: "index_ci_builds_on_erased_by_id", using: :btree
add_index "ci_builds", ["gl_project_id"], name: "index_ci_builds_on_gl_project_id", using: :btree
add_index "ci_builds", ["project_id", "commit_id"], name: "index_ci_builds_on_project_id_and_commit_id", using: :btree
add_index "ci_builds", ["project_id"], name: "index_ci_builds_on_project_id", using: :btree
@@ -442,7 +445,8 @@ ActiveRecord::Schema.define(version: 20160209130428) do
t.integer "project_id"
t.datetime "created_at"
t.datetime "updated_at"
- t.boolean "template", default: false
+ t.boolean "template", default: false
+ t.string "description"
end
add_index "labels", ["project_id"], name: "index_labels_on_project_id", using: :btree
@@ -522,6 +526,7 @@ ActiveRecord::Schema.define(version: 20160209130428) do
t.text "merge_params"
t.boolean "merge_when_build_succeeds", default: false, null: false
t.integer "merge_user_id"
+ t.string "merge_commit_sha"
end
add_index "merge_requests", ["assignee_id"], name: "index_merge_requests_on_assignee_id", using: :btree
@@ -819,6 +824,26 @@ ActiveRecord::Schema.define(version: 20160209130428) do
add_index "tags", ["name"], name: "index_tags_on_name", unique: true, using: :btree
+ create_table "todos", force: :cascade do |t|
+ t.integer "user_id", null: false
+ t.integer "project_id", null: false
+ t.integer "target_id", null: false
+ t.string "target_type", null: false
+ t.integer "author_id"
+ t.integer "action", null: false
+ t.string "state", null: false
+ t.datetime "created_at"
+ t.datetime "updated_at"
+ t.integer "note_id"
+ end
+
+ add_index "todos", ["author_id"], name: "index_todos_on_author_id", using: :btree
+ add_index "todos", ["note_id"], name: "index_todos_on_note_id", using: :btree
+ add_index "todos", ["project_id"], name: "index_todos_on_project_id", using: :btree
+ add_index "todos", ["state"], name: "index_todos_on_state", using: :btree
+ add_index "todos", ["target_type", "target_id"], name: "index_todos_on_target_type_and_target_id", using: :btree
+ add_index "todos", ["user_id"], name: "index_todos_on_user_id", using: :btree
+
create_table "users", force: :cascade do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
diff --git a/doc/api/README.md b/doc/api/README.md
index 9f3ad126320..7629ef294ac 100644
--- a/doc/api/README.md
+++ b/doc/api/README.md
@@ -32,6 +32,7 @@ following locations:
- [Builds](builds.md)
- [Build triggers](build_triggers.md)
- [Build Variables](build_variables.md)
+- [Runners](runners.md)
## Authentication
diff --git a/doc/api/builds.md b/doc/api/builds.md
index 43edb40e911..d3ce72e59fc 100644
--- a/doc/api/builds.md
+++ b/doc/api/builds.md
@@ -34,6 +34,10 @@ Example of response
"coverage": null,
"created_at": "2015-12-24T15:51:21.802Z",
"download_url": null,
+ "artifacts_file": {
+ "filename": "artifacts.zip",
+ "size": 1000
+ },
"finished_at": "2015-12-24T17:54:27.895Z",
"id": 7,
"name": "teaspoon",
@@ -72,6 +76,7 @@ Example of response
"coverage": null,
"created_at": "2015-12-24T15:51:21.727Z",
"download_url": null,
+ "artifacts_file": null,
"finished_at": "2015-12-24T17:54:24.921Z",
"id": 6,
"name": "spinach:other",
@@ -135,6 +140,7 @@ Example of response
"coverage": null,
"created_at": "2016-01-11T10:13:33.506Z",
"download_url": null,
+ "artifacts_file": null,
"finished_at": "2016-01-11T10:14:09.526Z",
"id": 69,
"name": "rubocop",
@@ -159,6 +165,7 @@ Example of response
"coverage": null,
"created_at": "2015-12-24T15:51:21.957Z",
"download_url": null,
+ "artifacts_file": null,
"finished_at": "2015-12-24T17:54:33.913Z",
"id": 9,
"name": "brakeman",
@@ -220,6 +227,7 @@ Example of response
"coverage": null,
"created_at": "2015-12-24T15:51:21.880Z",
"download_url": null,
+ "artifacts_file": null,
"finished_at": "2015-12-24T17:54:31.198Z",
"id": 8,
"name": "rubocop",
@@ -247,6 +255,34 @@ Example of response
}
```
+## Get build artifacts
+
+> [Introduced][ce-2893] in GitLab 8.5
+
+Get build artifacts of a project
+
+```
+GET /projects/:id/builds/:build_id/artifacts
+```
+
+| Attribute | Type | Required | Description |
+|------------|---------|----------|---------------------|
+| `id` | integer | yes | The ID of a project |
+| `build_id` | integer | yes | The ID of a build |
+
+```
+curl -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" "https://gitlab.example.com/api/v3/projects/1/builds/8/artifacts"
+```
+
+Response:
+
+| Status | Description |
+|-----------|---------------------------------|
+| 200 | Serves the artifacts file |
+| 404 | Build not found or no artifacts |
+
+[ce-2893]: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/2893
+
## Cancel a build
Cancel a single build of a project
@@ -280,6 +316,7 @@ Example of response
"coverage": null,
"created_at": "2016-01-11T10:13:33.506Z",
"download_url": null,
+ "artifacts_file": null,
"finished_at": "2016-01-11T10:14:09.526Z",
"id": 69,
"name": "rubocop",
@@ -326,6 +363,7 @@ Example of response
"coverage": null,
"created_at": "2016-01-11T10:13:33.506Z",
"download_url": null,
+ "artifacts_file": null,
"finished_at": null,
"id": 69,
"name": "rubocop",
@@ -338,3 +376,53 @@ Example of response
"user": null
}
```
+
+## Erase a build
+
+Erase a single build of a project (remove build artifacts and a build trace)
+
+```
+POST /projects/:id/builds/:build_id/erase
+```
+
+Parameters
+
+| Attribute | Type | required | Description |
+|-------------|---------|----------|---------------------|
+| `id` | integer | yes | The ID of a project |
+| `build_id` | integer | yes | The ID of a build |
+
+Example of request
+
+```
+curl -X POST -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" "https://gitlab.example.com/api/v3/projects/1/builds/1/erase"
+```
+
+Example of response
+
+```json
+{
+ "commit": {
+ "author_email": "admin@example.com",
+ "author_name": "Administrator",
+ "created_at": "2015-12-24T16:51:14.000+01:00",
+ "id": "0ff3ae198f8601a285adcf5c0fff204ee6fba5fd",
+ "message": "Test the CI integration.",
+ "short_id": "0ff3ae19",
+ "title": "Test the CI integration."
+ },
+ "coverage": null,
+ "download_url": null,
+ "id": 69,
+ "name": "rubocop",
+ "ref": "master",
+ "runner": null,
+ "stage": "test",
+ "created_at": "2016-01-11T10:13:33.506Z",
+ "started_at": "2016-01-11T10:13:33.506Z",
+ "finished_at": "2016-01-11T10:15:10.506Z",
+ "status": "failed",
+ "tag": false,
+ "user": null
+}
+```
diff --git a/doc/api/runners.md b/doc/api/runners.md
new file mode 100644
index 00000000000..cc6c6b7cb2f
--- /dev/null
+++ b/doc/api/runners.md
@@ -0,0 +1,322 @@
+# Runners API
+
+> [Introduced][ce-2640] in GitLab 8.5
+
+[ce-2640]: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/2640
+
+## List owned runners
+
+Get a list of specific runners available to the user.
+
+```
+GET /runners
+GET /runners?scope=active
+```
+
+| Attribute | Type | Required | Description |
+|-----------|---------|----------|---------------------|
+| `scope` | string | no | The scope of specific runners to show, one of: `active`, `paused`, `online`; showing all runners if none provided |
+
+```
+curl -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" "https://gitlab.example.com/api/v3/runners"
+```
+
+Example response:
+
+```json
+[
+ {
+ "active": true,
+ "description": "test-1-20150125",
+ "id": 6,
+ "is_shared": false,
+ "name": null
+ },
+ {
+ "active": true,
+ "description": "test-2-20150125",
+ "id": 8,
+ "is_shared": false,
+ "name": null
+ }
+]
+```
+
+## List all runners
+
+Get a list of all runners in the GitLab instance (specific and shared). Access
+is restricted to users with `admin` privileges.
+
+```
+GET /runners/all
+GET /runners/all?scope=online
+```
+
+| Attribute | Type | Required | Description |
+|-----------|---------|----------|---------------------|
+| `scope` | string | no | The scope of runners to show, one of: `specific`, `shared`, `active`, `paused`, `online`; showing all runners if none provided |
+
+```
+curl -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" "https://gitlab.example.com/api/v3/runners/all"
+```
+
+Example response:
+
+```json
+[
+ {
+ "active": true,
+ "description": "shared-runner-1",
+ "id": 1,
+ "is_shared": true,
+ "name": null
+ },
+ {
+ "active": true,
+ "description": "shared-runner-2",
+ "id": 3,
+ "is_shared": true,
+ "name": null
+ },
+ {
+ "active": true,
+ "description": "test-1-20150125",
+ "id": 6,
+ "is_shared": false,
+ "name": null
+ },
+ {
+ "active": true,
+ "description": "test-2-20150125",
+ "id": 8,
+ "is_shared": false,
+ "name": null
+ }
+]
+```
+
+## Get runner's details
+
+Get details of a runner.
+
+```
+GET /runners/:id
+```
+
+| Attribute | Type | Required | Description |
+|-----------|---------|----------|---------------------|
+| `id` | integer | yes | The ID of a runner |
+
+```
+curl -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" "https://gitlab.example.com/api/v3/runners/6"
+```
+
+Example response:
+
+```json
+{
+ "active": true,
+ "architecture": null,
+ "description": "test-1-20150125",
+ "id": 6,
+ "is_shared": false,
+ "contacted_at": "2016-01-25T16:39:48.066Z",
+ "name": null,
+ "platform": null,
+ "projects": [
+ {
+ "id": 1,
+ "name": "GitLab Community Edition",
+ "name_with_namespace": "GitLab.org / GitLab Community Edition",
+ "path": "gitlab-ce",
+ "path_with_namespace": "gitlab-org/gitlab-ce"
+ }
+ ],
+ "token": "205086a8e3b9a2b818ffac9b89d102",
+ "revision": null,
+ "tag_list": [
+ "ruby",
+ "mysql"
+ ],
+ "version": null
+}
+```
+
+## Update runner's details
+
+Update details of a runner.
+
+```
+PUT /runners/:id
+```
+
+| Attribute | Type | Required | Description |
+|---------------|---------|----------|---------------------|
+| `id` | integer | yes | The ID of a runner |
+| `description` | string | no | The description of a runner |
+| `active` | boolean | no | The state of a runner; can be set to `true` or `false` |
+| `tag_list` | array | no | The list of tags for a runner; put array of tags, that should be finally assigned to a runner |
+
+```
+curl -X PUT -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" "https://gitlab.example.com/api/v3/runners/6" -F "description=test-1-20150125-test" -F "tag_list=ruby,mysql,tag1,tag2"
+```
+
+Example response:
+
+```json
+{
+ "active": true,
+ "architecture": null,
+ "description": "test-1-20150125-test",
+ "id": 6,
+ "is_shared": false,
+ "contacted_at": "2016-01-25T16:39:48.066Z",
+ "name": null,
+ "platform": null,
+ "projects": [
+ {
+ "id": 1,
+ "name": "GitLab Community Edition",
+ "name_with_namespace": "GitLab.org / GitLab Community Edition",
+ "path": "gitlab-ce",
+ "path_with_namespace": "gitlab-org/gitlab-ce"
+ }
+ ],
+ "token": "205086a8e3b9a2b818ffac9b89d102",
+ "revision": null,
+ "tag_list": [
+ "ruby",
+ "mysql",
+ "tag1",
+ "tag2"
+ ],
+ "version": null
+}
+```
+
+## Remove a runner
+
+Remove a runner.
+
+```
+DELETE /runners/:id
+```
+
+| Attribute | Type | Required | Description |
+|-----------|---------|----------|---------------------|
+| `id` | integer | yes | The ID of a runner |
+
+```
+curl -X DELETE -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" "https://gitlab.example.com/api/v3/runners/6"
+```
+
+Example response:
+
+```json
+{
+ "active": true,
+ "description": "test-1-20150125-test",
+ "id": 6,
+ "is_shared": false,
+ "name": null,
+}
+```
+
+## List project's runners
+
+List all runners (specific and shared) available in the project. Shared runners
+are listed if at least one shared runner is defined **and** shared runners
+usage is enabled in the project's settings.
+
+```
+GET /projects/:id/runners
+```
+
+| Attribute | Type | Required | Description |
+|-----------|---------|----------|---------------------|
+| `id` | integer | yes | The ID of a project |
+
+```
+curl -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" "https://gitlab.example.com/api/v3/projects/9/runners"
+```
+
+Example response:
+
+```json
+[
+ {
+ "active": true,
+ "description": "test-2-20150125",
+ "id": 8,
+ "is_shared": false,
+ "name": null
+ },
+ {
+ "active": true,
+ "description": "development_runner",
+ "id": 5,
+ "is_shared": true,
+ "name": null
+ }
+]
+```
+
+## Enable a runner in project
+
+Enable an available specific runner in the project.
+
+```
+POST /projects/:id/runners
+```
+
+| Attribute | Type | Required | Description |
+|-------------|---------|----------|---------------------|
+| `id` | integer | yes | The ID of a project |
+| `runner_id` | integer | yes | The ID of a runner |
+
+```
+curl -X POST -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" "https://gitlab.example.com/api/v3/project/9/runners" -F "runner_id=9"
+```
+
+Example response:
+
+```json
+{
+ "active": true,
+ "description": "test-2016-02-01",
+ "id": 9,
+ "is_shared": false,
+ "name": null
+}
+```
+
+## Disable a runner from project
+
+Disable a specific runner from the project. It works only if the project isn't
+the only project associated with the specified runner. If so, an error is
+returned. Use the [Remove a runner](#remove-a-runner) call instead.
+
+```
+DELETE /projects/:id/runners/:runner_id
+```
+
+| Attribute | Type | Required | Description |
+|-------------|---------|----------|---------------------|
+| `id` | integer | yes | The ID of a project |
+| `runner_id` | integer | yes | The ID of a runner |
+
+```
+curl -X DELETE -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" "https://gitlab.example.com/api/v3/project/9/runners/9"
+```
+
+Example response:
+
+```json
+{
+ "active": true,
+ "description": "test-2016-02-01",
+ "id": 9,
+ "is_shared": false,
+ "name": null
+}
+```
diff --git a/doc/ci/api/runners.md b/doc/ci/api/runners.md
index c383dc4bcc9..e9033aeacd5 100644
--- a/doc/ci/api/runners.md
+++ b/doc/ci/api/runners.md
@@ -1,5 +1,9 @@
# Runners API
+_**Note:** This API is intended to be used only by Runners as their own
+communication channel. For the consumer API see the
+[new Runners API](../../api/runners.md)._
+
## Runners
### Retrieve all runners
@@ -74,4 +78,4 @@ Returns:
"updated_at" : "2015-02-26T11:39:39.232Z",
"description" : "awesome runner"
}
-``` \ No newline at end of file
+```
diff --git a/doc/ci/quick_start/README.md b/doc/ci/quick_start/README.md
index ae7b760fa67..327c83bef72 100644
--- a/doc/ci/quick_start/README.md
+++ b/doc/ci/quick_start/README.md
@@ -36,13 +36,13 @@ file and start builds on _Runners_ according to the contents of the file,
for that commit.
Because `.gitlab-ci.yml` is in the repository, it is version controlled,
-old versions still build succesfully, forks can easily make use of CI,
+old versions still build successfully, forks can easily make use of CI,
branches can have separate builds and you have a single source of truth for CI.
You can read more about the reasons why we are using `.gitlab-ci.yml`
[in our blog about it][blog-ci].
**Note:** `.gitlab-ci.yml` is a [YAML](https://en.wikipedia.org/wiki/YAML) file
-so you have to pay extra attention to the identation. Always use spaces, not
+so you have to pay extra attention to the indentation. Always use spaces, not
tabs.
### Creating a simple `.gitlab-ci.yml` file
@@ -124,7 +124,7 @@ In GitLab, Runners run the builds that you define in `.gitlab-ci.yml`.
A Runner can be a virtual machine, a VPS, a bare-metal machine, a docker
container or even a cluster of containers. GitLab and the Runners communicate
through an API, so the only needed requirement is that the machine on which the
-Runner is configured to has Internet access.
+Runner is configured to have Internet access.
A Runner can be specific to a certain project or serve multiple projects in
GitLab. If it serves all projects it's called a _Shared Runner_.
@@ -168,7 +168,7 @@ To enable **Shared Runners** you have to go to your project's
## Seeing the status of your build
-After configuring the Runner succesfully, you should see the status of your
+After configuring the Runner successfully, you should see the status of your
last commit change from _pending_ to either _running_, _success_ or _failed_.
You can view all builds, by going to the **Builds** page in your project.
@@ -184,6 +184,15 @@ you expected.
You are also able to view the status of any commit in the various pages in
GitLab, such as **Commits** and **Merge Requests**.
+## Enabling build emails
+
+If you want to receive e-mail notifications about the result status of the
+builds, you should explicitly enable the **Builds Emails** service under your
+project's settings.
+
+For more information read the [Builds emails service documentation]
+(../../project_services/builds_emails.md).
+
## Builds badge
You can access a builds badge image using following link:
diff --git a/doc/ci/variables/README.md b/doc/ci/variables/README.md
index 018d1898594..9e89e6e395e 100644
--- a/doc/ci/variables/README.md
+++ b/doc/ci/variables/README.md
@@ -16,7 +16,7 @@ The API_TOKEN will take the Secure Variable value: `SECURE`.
### Predefined variables (Environment Variables)
| Variable | Runner | Description |
-|-------------------------|-------------|
+|-------------------------|-----|--------|
| **CI** | 0.4 | Mark that build is executed in CI environment |
| **GITLAB_CI** | all | Mark that build is executed in GitLab CI environment |
| **CI_SERVER** | all | Mark that build is executed in CI environment |
diff --git a/doc/ci/yaml/README.md b/doc/ci/yaml/README.md
index 194c8171bb9..0edb56dc20e 100644
--- a/doc/ci/yaml/README.md
+++ b/doc/ci/yaml/README.md
@@ -33,7 +33,7 @@ The YAML syntax allows for using more complex job specifications than in the
above example:
```yaml
-image: ruby:2.2
+image: ruby:2.1
services:
- postgres
@@ -428,8 +428,30 @@ artifacts:
- binaries/
```
-The artifacts will be send after a successful build success to GitLab, and will
-be accessible in the GitLab UI to download.
+You may want to create artifacts only for tagged releases to avoid filling the
+build server storage with temporary build artifacts.
+
+Create artifacts only for tags (`default-job` will not create artifacts):
+
+```yaml
+default-job:
+ script:
+ - mvn test -U
+ except:
+ - tags
+
+release-job:
+ script:
+ - mvn package -U
+ artifacts:
+ paths:
+ - target/*.war
+ only:
+ - tags
+```
+
+The artifacts will be sent to GitLab after a successful build and will
+be available for download in the GitLab UI.
### cache
diff --git a/doc/development/ci_setup.md b/doc/development/ci_setup.md
index 05db30b4a7e..6776d9b083f 100644
--- a/doc/development/ci_setup.md
+++ b/doc/development/ci_setup.md
@@ -26,7 +26,7 @@ We use [these build scripts](https://gitlab.com/gitlab-org/gitlab-ci/blob/master
# Build configuration on [Semaphore](https://semaphoreapp.com/gitlabhq/gitlabhq/) for testing the [GitHub.com repo](https://github.com/gitlabhq/gitlabhq)
- Language: Ruby
-- Ruby version: 2.2.4
+- Ruby version: 2.1.8
- database.yml: pg
Build commands
diff --git a/doc/development/migration_style_guide.md b/doc/development/migration_style_guide.md
index 4e108c17871..28dedf3978c 100644
--- a/doc/development/migration_style_guide.md
+++ b/doc/development/migration_style_guide.md
@@ -15,7 +15,7 @@ or inconsistencies and guard for that. Try to make as little assumptions as poss
about the state of the database.
Please don't depend on GitLab specific code since it can change in future versions.
-If needed copy-paste GitLab code into the migration to make make it forward compatible.
+If needed copy-paste GitLab code into the migration to make it forward compatible.
## Comments in the migration
diff --git a/doc/gitlab-basics/basicsimages/compare_braches.png b/doc/gitlab-basics/basicsimages/compare_branches.png
index 7eebaed9075..7eebaed9075 100644
--- a/doc/gitlab-basics/basicsimages/compare_braches.png
+++ b/doc/gitlab-basics/basicsimages/compare_branches.png
Binary files differ
diff --git a/doc/install/installation.md b/doc/install/installation.md
index 7d3f9d0a2ed..2a5b99609e4 100644
--- a/doc/install/installation.md
+++ b/doc/install/installation.md
@@ -107,7 +107,7 @@ Then select 'Internet Site' and press enter to confirm the hostname.
## 2. Ruby
-_**Note:** The current supported Ruby versions are 2.1.x and 2.2.x. Ruby 2.3 is
+_**Note:** The current supported Ruby version is 2.1.x. Ruby 2.2 and 2.3 are
currently not supported._
The use of Ruby version managers such as [RVM], [rbenv] or [chruby] with GitLab
@@ -123,9 +123,9 @@ Remove the old Ruby 1.8 if present:
Download Ruby and compile it:
mkdir /tmp/ruby && cd /tmp/ruby
- curl -O --progress https://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.4.tar.gz
- echo 'b6eff568b48e0fda76e5a36333175df049b204e91217aa32a65153cc0cdcb761 ruby-2.2.4.tar.gz' | sha256sum -c - && tar xzf ruby-2.2.4.tar.gz
- cd ruby-2.2.4
+ curl -O --progress https://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.8.tar.gz
+ echo 'c7e50159357afd87b13dc5eaf4ac486a70011149 ruby-2.1.8.tar.gz' | shasum -c - && tar xzf ruby-2.1.8.tar.gz
+ cd ruby-2.1.8
./configure --disable-install-rdoc
make
sudo make install
@@ -182,25 +182,20 @@ We recommend using a PostgreSQL database. For MySQL check [MySQL setup guide](da
## 6. Redis
-As of this writing, most Debian/Ubuntu distributions ship with Redis 2.2 or
-2.4. GitLab requires at least Redis 2.8.
+GitLab requires at least Redis 2.8.
-Ubuntu users [can use a PPA](https://launchpad.net/~chris-lea/+archive/ubuntu/redis-server)
-to install a recent version of Redis.
-
-The following instructions cover building and installing Redis from scratch:
+If you are using Debian 8 or Ubuntu 14.04 and up, then you can simply install
+Redis 2.8 with:
```sh
-# Build Redis
-wget http://download.redis.io/releases/redis-2.8.23.tar.gz
-tar xzf redis-2.8.23.tar.gz
-cd redis-2.8.23
-make
+sudo apt-get install redis-server
+```
-# Install Redis
-cd utils
-sudo ./install_server.sh
+If you are using Debian 7 or Ubuntu 12.04, follow the special documentation
+on [an alternate Redis installation](redis.md). Once done, follow the rest of
+the guide here.
+```
# Configure redis to use sockets
sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.orig
@@ -224,7 +219,7 @@ if [ -d /etc/tmpfiles.d ]; then
fi
# Activate the changes to redis.conf
-sudo service redis_6379 start
+sudo service redis-server restart
# Add git to the redis group
sudo usermod -aG redis git
@@ -358,7 +353,7 @@ GitLab Shell is an SSH access and repository management software developed speci
cd /home/git
sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-workhorse.git
cd gitlab-workhorse
- sudo -u git -H git checkout 0.6.4
+ sudo -u git -H git checkout 0.6.5
sudo -u git -H make
### Initialize Database and Activate Advanced Features
diff --git a/doc/install/redis.md b/doc/install/redis.md
new file mode 100644
index 00000000000..4075e6283d0
--- /dev/null
+++ b/doc/install/redis.md
@@ -0,0 +1,60 @@
+# Install Redis on old distributions
+
+GitLab requires at least Redis 2.8. The following guide is for Debian 7 and
+Ubuntu 12.04. If you are using Debian 8 or Ubuntu 14.04 and up, follow the
+[installation guide](installation.md).
+
+## Install Redis 2.8 in Debian 7
+
+Redis 2.8 is included in the Debian Wheezy [backports] repository.
+
+1. Edit `/etc/apt/sources.list` and add the following line:
+
+ ```
+ deb http://http.debian.net/debian wheezy-backports main
+ ```
+
+1. Update the repositories:
+
+ ```
+ sudo apt-get update
+ ```
+
+1. Install `redis-server`:
+
+ ```
+ sudo apt-get -t wheezy-backports install redis-server
+ ```
+
+1. Follow the rest of the [installation guide](installation.md).
+
+## Install Redis 2.8 in Ubuntu 12.04
+
+We will [use a PPA](https://launchpad.net/~chris-lea/+archive/ubuntu/redis-server)
+to install a recent version of Redis.
+
+1. Install the PPA repository:
+
+ ```
+ sudo add-apt-repository ppa:chris-lea/redis-server
+ ```
+
+ Your system will now fetch the PPA's key. This enables your Ubuntu system to
+ verify that the packages in the PPA have not been interfered with since they
+ were built.
+
+1. Update the repositories:
+
+ ```
+ sudo apt-get update
+ ```
+
+1. Install `redis-server`:
+
+ ```
+ sudo apt-get install redis-server
+ ```
+
+1. Follow the rest of the [installation guide](installation.md).
+
+[backports]: http://backports.debian.org/Instructions/ "Debian backports website"
diff --git a/doc/install/requirements.md b/doc/install/requirements.md
index c6a1c20d02f..8df142c531b 100644
--- a/doc/install/requirements.md
+++ b/doc/install/requirements.md
@@ -32,7 +32,7 @@ Please consider using a virtual machine to run GitLab.
## Ruby versions
-GitLab requires Ruby (MRI) 2.1.x or 2.2.x and currently does not work with version 2.3.
+GitLab requires Ruby (MRI) 2.1.x and currently does not work with versions 2.2 or 2.3.
You will have to use the standard MRI implementation of Ruby.
We love [JRuby](http://jruby.org/) and [Rubinius](http://rubini.us/) but GitLab
@@ -67,8 +67,8 @@ You need at least 2GB of addressable memory (RAM + swap) to install and use GitL
With less memory GitLab will give strange errors during the reconfigure run and 500 errors during usage.
- 512MB RAM + 1.5GB of swap is the absolute minimum but we strongly **advise against** this amount of memory. See the unicorn worker section below for more advice.
-- 1GB RAM + 1GB swap supports up to 100 users but it will be slow
-- **2GB RAM** is the **recommended** memory size and supports up to 100 users
+- 1GB RAM + 1GB swap supports up to 100 users but it will be very slow
+- **2GB RAM** is the **recommended** memory size for all installations and supports up to 100 users
- 4GB RAM supports up to 1,000 users
- 8GB RAM supports up to 2,000 users
- 16GB RAM supports up to 4,000 users
diff --git a/doc/project_services/builds_emails.md b/doc/project_services/builds_emails.md
new file mode 100644
index 00000000000..af0b1a287c7
--- /dev/null
+++ b/doc/project_services/builds_emails.md
@@ -0,0 +1,16 @@
+## Enabling build emails
+
+To receive e-mail notifications about the result status of your builds, visit
+your project's **Settings > Services > Builds emails** and activate the service.
+
+In the _Recipients_ area, provide a list of e-mails separated by comma.
+
+Check the _Add pusher_ checkbox if you want the committer to also receive
+e-mail notifications about each build's status.
+
+If you enable the _Notify only broken builds_ option, e-mail notifications will
+be sent only for failed builds.
+
+---
+
+![Builds emails service settings](img/builds_emails_service.png)
diff --git a/doc/project_services/img/builds_emails_service.png b/doc/project_services/img/builds_emails_service.png
new file mode 100644
index 00000000000..e604dd73ffa
--- /dev/null
+++ b/doc/project_services/img/builds_emails_service.png
Binary files differ
diff --git a/doc/project_services/project_services.md b/doc/project_services/project_services.md
index 55db3e4f2f3..3fea2cff0b9 100644
--- a/doc/project_services/project_services.md
+++ b/doc/project_services/project_services.md
@@ -12,7 +12,7 @@ further configuration instructions and details. Contributions are welcome.
| Assembla | Project Management Software (Source Commits Endpoint) |
| [Atlassian Bamboo CI](bamboo.md) | A continuous integration and build server |
| Buildkite | Continuous integration and deployments |
-| Builds emails | Email the builds status to a list of recipients |
+| [Builds emails](builds_emails.md) | Email the builds status to a list of recipients |
| Campfire | Simple web-based real-time group chat |
| Custom Issue Tracker | Custom issue tracker |
| Drone CI | Continuous Integration platform built on Docker, written in Go |
diff --git a/doc/update/8.3-to-8.4.md b/doc/update/8.3-to-8.4.md
index 616b1f58b65..269deec7a9c 100644
--- a/doc/update/8.3-to-8.4.md
+++ b/doc/update/8.3-to-8.4.md
@@ -81,27 +81,6 @@ There are new configuration options available for [`gitlab.yml`](config/gitlab.y
git diff origin/8-3-stable:config/gitlab.yml.example origin/8-4-stable:config/gitlab.yml.example
```
-#### Nginx configuration
-
-GitLab 8.3 introduced major changes in the NGINX configuration. Ensure you're
-still up-to-date with the latest changes:
-
-```sh
-# For HTTPS configurations
-git diff origin/8-3-stable:lib/support/nginx/gitlab-ssl origin/8-4-stable:lib/support/nginx/gitlab-ssl
-
-# For HTTP configurations
-git diff origin/8-3-stable:lib/support/nginx/gitlab origin/8-4-stable:lib/support/nginx/gitlab
-```
-
-If you are using Apache instead of NGINX please see the updated [Apache templates].
-Also note that because Apache does not support upstreams behind Unix sockets you
-will need to let gitlab-workhorse listen on a TCP port. You can do this
-via [/etc/default/gitlab].
-
-[Apache templates]: https://gitlab.com/gitlab-org/gitlab-recipes/tree/master/web-server/apache
-[/etc/default/gitlab]: https://gitlab.com/gitlab-org/gitlab-ce/blob/8-4-stable/lib/support/init.d/gitlab.default.example#L34
-
#### Init script
We updated the init script for GitLab in order to set a specific PATH for gitlab-workhorse.
diff --git a/doc/update/8.4-to-8.5.md b/doc/update/8.4-to-8.5.md
index 42b26439848..408a17ac348 100644
--- a/doc/update/8.4-to-8.5.md
+++ b/doc/update/8.4-to-8.5.md
@@ -82,6 +82,32 @@ There are new configuration options available for [`gitlab.yml`](config/gitlab.y
git diff origin/8-4-stable:config/gitlab.yml.example origin/8-5-stable:config/gitlab.yml.example
```
+#### Nginx configuration
+
+Ensure you're still up-to-date with the latest NGINX configuration changes:
+
+```sh
+# For HTTPS configurations
+git diff origin/8-4-stable:lib/support/nginx/gitlab-ssl origin/8-5-stable:lib/support/nginx/gitlab-ssl
+
+# For HTTP configurations
+git diff origin/8-4-stable:lib/support/nginx/gitlab origin/8-5-stable:lib/support/nginx/gitlab
+```
+
+If you are using Apache instead of NGINX please see the updated [Apache templates].
+Also note that because Apache does not support upstreams behind Unix sockets you
+will need to let gitlab-workhorse listen on a TCP port. You can do this
+via [/etc/default/gitlab].
+
+[Apache templates]: https://gitlab.com/gitlab-org/gitlab-recipes/tree/master/web-server/apache
+[/etc/default/gitlab]: https://gitlab.com/gitlab-org/gitlab-ce/blob/8-5-stable/lib/support/init.d/gitlab.default.example#L37
+
+#### Init script
+
+Ensure you're still up-to-date with the latest init script changes:
+
+ sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab
+
### 8. Start application
sudo service gitlab start
diff --git a/doc/workflow/README.md b/doc/workflow/README.md
index bf62ab41053..5199ff9390a 100644
--- a/doc/workflow/README.md
+++ b/doc/workflow/README.md
@@ -17,6 +17,7 @@
- [Releases](releases.md)
- [Milestones](milestones.md)
- [Merge Requests](merge_requests.md)
+- [Revert changes](revert_changes.md)
- ["Work In Progress" Merge Requests](wip_merge_requests.md)
- [Merge When Build Succeeds](merge_when_build_succeeds.md)
- [Manage large binaries with Git LFS](lfs/manage_large_binaries_with_git_lfs.md)
diff --git a/doc/workflow/gitlab_flow.md b/doc/workflow/gitlab_flow.md
index 0b205ea6de7..1b354bcc0f1 100644
--- a/doc/workflow/gitlab_flow.md
+++ b/doc/workflow/gitlab_flow.md
@@ -16,7 +16,7 @@ It offers a simple, transparent and effective way to work with git.
![Four stages (working copy, index, local repo, remote repo) and three steps between them](four_stages.png)
When converting to git you have to get used to the fact that there are three steps before a commit is shared with colleagues.
-Most version control systems have only step, committing from the working copy to a shared server.
+Most version control systems have only one step, committing from the working copy to a shared server.
In git you add files from the working copy to the staging area. After that you commit them to the local repo.
The third step is pushing to a shared remote repository.
After getting used to these three steps the branching model becomes the challenge.
diff --git a/doc/workflow/img/revert_changes_commit.png b/doc/workflow/img/revert_changes_commit.png
new file mode 100644
index 00000000000..d84211e20db
--- /dev/null
+++ b/doc/workflow/img/revert_changes_commit.png
Binary files differ
diff --git a/doc/workflow/img/revert_changes_commit_modal.png b/doc/workflow/img/revert_changes_commit_modal.png
new file mode 100644
index 00000000000..e94d151a2af
--- /dev/null
+++ b/doc/workflow/img/revert_changes_commit_modal.png
Binary files differ
diff --git a/doc/workflow/img/revert_changes_mr.png b/doc/workflow/img/revert_changes_mr.png
new file mode 100644
index 00000000000..7adad88463b
--- /dev/null
+++ b/doc/workflow/img/revert_changes_mr.png
Binary files differ
diff --git a/doc/workflow/img/revert_changes_mr_modal.png b/doc/workflow/img/revert_changes_mr_modal.png
new file mode 100644
index 00000000000..9da78f84828
--- /dev/null
+++ b/doc/workflow/img/revert_changes_mr_modal.png
Binary files differ
diff --git a/doc/workflow/img/web_editor_new_branch_dropdown.png b/doc/workflow/img/web_editor_new_branch_dropdown.png
new file mode 100644
index 00000000000..009e4b05adf
--- /dev/null
+++ b/doc/workflow/img/web_editor_new_branch_dropdown.png
Binary files differ
diff --git a/doc/workflow/img/web_editor_new_branch_page.png b/doc/workflow/img/web_editor_new_branch_page.png
new file mode 100644
index 00000000000..dd6cfc6e7bb
--- /dev/null
+++ b/doc/workflow/img/web_editor_new_branch_page.png
Binary files differ
diff --git a/doc/workflow/img/web_editor_new_directory_dialog.png b/doc/workflow/img/web_editor_new_directory_dialog.png
new file mode 100644
index 00000000000..2c76f84f395
--- /dev/null
+++ b/doc/workflow/img/web_editor_new_directory_dialog.png
Binary files differ
diff --git a/doc/workflow/img/web_editor_new_directory_dropdown.png b/doc/workflow/img/web_editor_new_directory_dropdown.png
new file mode 100644
index 00000000000..cedf46aedfd
--- /dev/null
+++ b/doc/workflow/img/web_editor_new_directory_dropdown.png
Binary files differ
diff --git a/doc/workflow/img/web_editor_new_file_dropdown.png b/doc/workflow/img/web_editor_new_file_dropdown.png
new file mode 100644
index 00000000000..6e884f6504d
--- /dev/null
+++ b/doc/workflow/img/web_editor_new_file_dropdown.png
Binary files differ
diff --git a/doc/workflow/img/web_editor_new_file_editor.png b/doc/workflow/img/web_editor_new_file_editor.png
new file mode 100644
index 00000000000..c76473bcfa7
--- /dev/null
+++ b/doc/workflow/img/web_editor_new_file_editor.png
Binary files differ
diff --git a/doc/workflow/img/web_editor_new_push_widget.png b/doc/workflow/img/web_editor_new_push_widget.png
new file mode 100644
index 00000000000..a2108735741
--- /dev/null
+++ b/doc/workflow/img/web_editor_new_push_widget.png
Binary files differ
diff --git a/doc/workflow/img/web_editor_new_tag_dropdown.png b/doc/workflow/img/web_editor_new_tag_dropdown.png
new file mode 100644
index 00000000000..263dd635b95
--- /dev/null
+++ b/doc/workflow/img/web_editor_new_tag_dropdown.png
Binary files differ
diff --git a/doc/workflow/img/web_editor_new_tag_page.png b/doc/workflow/img/web_editor_new_tag_page.png
new file mode 100644
index 00000000000..64d7cd11ed1
--- /dev/null
+++ b/doc/workflow/img/web_editor_new_tag_page.png
Binary files differ
diff --git a/doc/workflow/img/web_editor_start_new_merge_request.png b/doc/workflow/img/web_editor_start_new_merge_request.png
new file mode 100644
index 00000000000..be12a151cac
--- /dev/null
+++ b/doc/workflow/img/web_editor_start_new_merge_request.png
Binary files differ
diff --git a/doc/workflow/img/web_editor_upload_file_dialog.png b/doc/workflow/img/web_editor_upload_file_dialog.png
new file mode 100644
index 00000000000..6dd2207bca0
--- /dev/null
+++ b/doc/workflow/img/web_editor_upload_file_dialog.png
Binary files differ
diff --git a/doc/workflow/img/web_editor_upload_file_dropdown.png b/doc/workflow/img/web_editor_upload_file_dropdown.png
new file mode 100644
index 00000000000..bf6528701b0
--- /dev/null
+++ b/doc/workflow/img/web_editor_upload_file_dropdown.png
Binary files differ
diff --git a/doc/workflow/revert_changes.md b/doc/workflow/revert_changes.md
new file mode 100644
index 00000000000..399366b0cdc
--- /dev/null
+++ b/doc/workflow/revert_changes.md
@@ -0,0 +1,64 @@
+# Reverting changes
+
+_**Note:** This feature was [introduced][ce-1990] in GitLab 8.5._
+
+---
+
+GitLab implements Git's powerful feature to [revert any commit][git-revert]
+with introducing a **Revert** button in Merge Requests and commit details.
+
+## Reverting a Merge Request
+
+_**Note:** The **Revert** button will only be available for Merge Requests
+created since GitLab 8.5. However, you can still revert a Merge Request
+by reverting the merge commit from the list of Commits page._
+
+After the Merge Request has been merged, a **Revert** button will be available
+to revert the changes introduced by that Merge Request:
+
+![Revert Merge Request](img/revert_changes_mr.png)
+
+---
+
+You can revert the changes directly into the selected branch or you can opt to
+create a new Merge Request with the revert changes:
+
+![Revert Merge Request modal](img/revert_changes_mr_modal.png)
+
+---
+
+After the Merge Request has been reverted, the **Revert** button will not be
+available anymore.
+
+## Reverting a Commit
+
+You can revert a Commit from the Commit details page:
+
+![Revert commit](img/revert_changes_commit.png)
+
+---
+
+Similar to reverting a Merge Request, you can opt to revert the changes
+directly into the target branch or create a new Merge Request to revert the
+changes:
+
+![Revert commit modal](img/revert_changes_commit_modal.png)
+
+---
+
+After the Commit has been reverted, the **Revert** button will not be available
+anymore.
+
+Please note that when reverting merge commits, the mainline will always be the
+first parent. If you want to use a different mainline then you need to do that
+from the command line.
+
+Here is a quick example to revert a merge commit using the second parent as the
+mainline:
+
+```bash
+git revert -m 2 7a39eb0
+```
+
+[ce-1990]: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/1990 "Revert button Merge Request"
+[git-revert]: https://git-scm.com/docs/git-revert "Git revert documentation"
diff --git a/doc/workflow/web_editor.md b/doc/workflow/web_editor.md
index 7fc8f96b9ec..4a451d98953 100644
--- a/doc/workflow/web_editor.md
+++ b/doc/workflow/web_editor.md
@@ -1,26 +1,120 @@
# GitLab Web Editor
-In GitLab you can create new files and edit existing files using our web editor.
-This is especially useful if you don't have access to a command line or you just want to do a quick fix.
-You can easily access the web editor, depending on the context.
-Let's start from newly created project.
+Sometimes it's easier to make quick changes directly from the GitLab interface
+than to clone the project and use the Git command line tool. In this feature
+highlight we look at how you can create a new file, directory, branch or
+tag from the file browser. All of these actions are available from a single
+dropdown menu.
-Click on `Add a file`
-to create the first file and open it in the web editor.
+## Create a file
-![web editor 1](web_editor/empty_project.png)
+From a project's files page, click the '+' button to the right of the branch selector.
+Choose **New file** from the dropdown.
-Fill in a file name, some content, a commit message, branch name and press the commit button.
-The file will be saved to the repository.
+![New file dropdown menu](img/web_editor_new_file_dropdown.png)
-![web editor 2](web_editor/new_file.png)
+---
-You can edit any text file in a repository by pressing the edit button, when
-viewing the file.
+Enter a file name in the **File name** box. Then, add file content in the editor
+area. Add a descriptive commit message and choose a branch. The branch field
+will default to the branch you were viewing in the file browser. If you enter
+a new branch name, a checkbox will appear allowing you to start a new merge
+request after you commit the changes.
-![web editor 3](web_editor/show_file.png)
+When you are satisfied with your new file, click **Commit Changes** at the bottom.
-Editing a file is almost the same as creating a new file,
-with as addition the ability to preview your changes in a separate tab. Also you can save your change to another branch by filling out field `branch`
+![Create file editor](img/web_editor_new_file_editor.png)
-![web editor 3](web_editor/edit_file.png)
+## Upload a file
+
+The ability to create a file is great when the content is text. However, this
+doesn't work well for binary data such as images, PDFs or other file types. In
+this case you need to upload a file.
+
+From a project's files page, click the '+' button to the right of the branch
+selector. Choose **Upload file** from the dropdown.
+
+![Upload file dropdown menu](img/web_editor_upload_file_dropdown.png)
+
+---
+
+Once the upload dialog pops up there are two ways to upload your file. Either
+drag and drop a file on the pop up or use the **click to upload** link. A file
+preview will appear once you have selected a file to upload.
+
+Enter a commit message, choose a branch, and click **Upload file** when you are
+ready.
+
+![Upload file dialog](img/web_editor_upload_file_dialog.png)
+
+## Create a directory
+
+To keep files in the repository organized it is often helpful to create a new
+directory.
+
+From a project's files page, click the '+' button to the right of the branch selector.
+Choose **New directory** from the dropdown.
+
+![New directory dropdown](img/web_editor_new_directory_dropdown.png)
+
+---
+
+In the new directory dialog enter a directory name, a commit message and choose
+the target branch. Click **Create directory** to finish.
+
+![New directory dialog](img/web_editor_new_directory_dialog.png)
+
+## Create a new branch
+
+If you want to make changes to several files before creating a new merge
+request, you can create a new branch up front. From a project's files page,
+choose **New branch** from the dropdown.
+
+![New branch dropdown](img/web_editor_new_branch_dropdown.png)
+
+---
+
+Enter a new **Branch name**. Optionally, change the **Create from** field
+to choose which branch, tag or commit SHA this new branch will originate from.
+This field will autocomplete if you start typing an existing branch or tag.
+Click **Create branch** and you will be returned to the file browser on this new
+branch.
+
+![New branch page](img/web_editor_new_branch_page.png)
+
+---
+
+You can now make changes to any files, as needed. When you're ready to merge
+the changes back to master you can use the widget at the top of the screen.
+This widget only appears for a period of time after you create the branch or
+modify files.
+
+![New push widget](img/web_editor_new_push_widget.png)
+
+## Create a new tag
+
+Tags are useful for marking major milestones such as production releases,
+release candidates, and more. You can create a tag from a branch or a commit
+SHA. From a project's files page, choose **New tag** from the dropdown.
+
+![New tag dropdown](img/web_editor_new_tag_dropdown.png)
+
+---
+
+Give the tag a name such as `v1.0.0`. Choose the branch or SHA from which you
+would like to create this new tag. You can optionally add a message and
+release notes. The release notes section supports markdown format and you can
+also upload an attachment. Click **Create tag** and you will be taken to the tag
+list page.
+
+![New tag page](img/web_editor_new_tag_page.png)
+
+## Tips
+
+When creating or uploading a new file, or creating a new directory, you can
+trigger a new merge request rather than committing directly to master. Enter
+a new branch name in the **Target branch** field. You will notice a checkbox
+appear that is labeled **Start a new merge request with these changes**. After
+you commit the changes you will be taken to a new merge request form.
+
+![Start a new merge request with these changes](img/web_editor_start_new_merge_request.png)
diff --git a/doc/workflow/web_editor/edit_file.png b/doc/workflow/web_editor/edit_file.png
deleted file mode 100644
index f480c69ac3e..00000000000
--- a/doc/workflow/web_editor/edit_file.png
+++ /dev/null
Binary files differ
diff --git a/doc/workflow/web_editor/empty_project.png b/doc/workflow/web_editor/empty_project.png
deleted file mode 100644
index 6a049f6beaf..00000000000
--- a/doc/workflow/web_editor/empty_project.png
+++ /dev/null
Binary files differ
diff --git a/doc/workflow/web_editor/new_file.png b/doc/workflow/web_editor/new_file.png
deleted file mode 100644
index 55ebd9e0257..00000000000
--- a/doc/workflow/web_editor/new_file.png
+++ /dev/null
Binary files differ
diff --git a/doc/workflow/web_editor/show_file.png b/doc/workflow/web_editor/show_file.png
deleted file mode 100644
index 9cafcb55109..00000000000
--- a/doc/workflow/web_editor/show_file.png
+++ /dev/null
Binary files differ
diff --git a/features/dashboard/todos.feature b/features/dashboard/todos.feature
new file mode 100644
index 00000000000..1e7b1b50d64
--- /dev/null
+++ b/features/dashboard/todos.feature
@@ -0,0 +1,38 @@
+@dashboard
+Feature: Dashboard Todos
+ Background:
+ Given I sign in as a user
+ And I own project "Shop"
+ And "John Doe" is a developer of project "Shop"
+ And "Mary Jane" is a developer of project "Shop"
+ And "Mary Jane" owns private project "Enterprise"
+ And I am a developer of project "Enterprise"
+ And I have todos
+ And I visit dashboard todos page
+
+ @javascript
+ Scenario: I mark todos as done
+ Then I should see todos assigned to me
+ And I mark the todo as done
+ And I click on the "Done" tab
+ Then I should see all todos marked as done
+
+ @javascript
+ Scenario: I filter by project
+ Given I filter by "Enterprise"
+ Then I should not see todos
+
+ @javascript
+ Scenario: I filter by author
+ Given I filter by "John Doe"
+ Then I should not see todos related to "Mary Jane" in the list
+
+ @javascript
+ Scenario: I filter by type
+ Given I filter by "Issue"
+ Then I should not see todos related to "Merge Requests" in the list
+
+ @javascript
+ Scenario: I filter by action
+ Given I filter by "Mentioned"
+ Then I should not see todos related to "Assignments" in the list
diff --git a/features/project/builds/summary.feature b/features/project/builds/summary.feature
index b69d279517b..4f3fd194d00 100644
--- a/features/project/builds/summary.feature
+++ b/features/project/builds/summary.feature
@@ -13,3 +13,12 @@ Feature: Project Builds Summary
Scenario: I browse project builds page
When I visit project builds page
Then I see button to CI Lint
+
+ Scenario: I erase a build
+ Given recent build is successful
+ And recent build has a build trace
+ When I visit recent build details page
+ And I click erase build button
+ Then recent build has been erased
+ And recent build summary does not have artifacts widget
+ And recent build summary contains information saying that build has been erased
diff --git a/features/project/commits/revert.feature b/features/project/commits/revert.feature
new file mode 100644
index 00000000000..7a2effafe03
--- /dev/null
+++ b/features/project/commits/revert.feature
@@ -0,0 +1,28 @@
+@project_commits
+Feature: Revert Commits
+ Background:
+ Given I sign in as a user
+ And I own a project
+ And I visit my project's commits page
+
+ Scenario: I revert a commit
+ Given I click on commit link
+ And I click on the revert button
+ And I revert the changes directly
+ Then I should see the revert commit notice
+
+ Scenario: I revert a commit that was previously reverted
+ Given I click on commit link
+ And I click on the revert button
+ And I revert the changes directly
+ And I visit my project's commits page
+ And I click on commit link
+ And I click on the revert button
+ And I revert the changes directly
+ Then I should see a revert error
+
+ Scenario: I revert a commit in a new merge request
+ Given I click on commit link
+ And I click on the revert button
+ And I revert the changes in a new merge request
+ Then I should see the new merge request notice
diff --git a/features/project/fork.feature b/features/project/fork.feature
index 12695204e47..ca3f2771aa5 100644
--- a/features/project/fork.feature
+++ b/features/project/fork.feature
@@ -32,6 +32,13 @@ Feature: Project Fork
And I visit the forks page of the "Shop" project
Then I should see my fork on the list
+ Scenario: Viewing forks of a Project that has no repo
+ Given I click link "Fork"
+ When I fork to my namespace
+ And I make forked repo invalid
+ And I visit the forks page of the "Shop" project
+ Then I should see my fork on the list
+
Scenario: Viewing private forks of a Project
Given There is an existent fork of the "Shop" project
And I click link "Fork"
diff --git a/features/project/issues/issues.feature b/features/project/issues/issues.feature
index ca2399d85a9..89af58dcef3 100644
--- a/features/project/issues/issues.feature
+++ b/features/project/issues/issues.feature
@@ -89,6 +89,16 @@ Feature: Project Issues
Then The list should be sorted by "Oldest updated"
@javascript
+ Scenario: Sort issues by upvotes/downvotes
+ Given project "Shop" have "Bugfix" open issue
+ And issue "Release 0.4" have 2 upvotes and 1 downvote
+ And issue "Tweet control" have 1 upvote and 2 downvotes
+ And I sort the list by "Most popular"
+ Then The list should be sorted by "Most popular"
+ And I sort the list by "Least popular"
+ Then The list should be sorted by "Least popular"
+
+ @javascript
Scenario: I search issue
Given I fill in issue search with "Re"
Then I should see "Release 0.4" in issues
diff --git a/features/project/merge_requests.feature b/features/project/merge_requests.feature
index 5995e787961..495f25f28e7 100644
--- a/features/project/merge_requests.feature
+++ b/features/project/merge_requests.feature
@@ -108,6 +108,17 @@ Feature: Project Merge Requests
Then The list should be sorted by "Oldest updated"
@javascript
+ Scenario: Sort merge requests by upvotes/downvotes
+ Given project "Shop" have "Bug NS-05" open merge request with diffs inside
+ And project "Shop" have "Bug NS-06" open merge request
+ And merge request "Bug NS-04" have 2 upvotes and 1 downvote
+ And merge request "Bug NS-06" have 1 upvote and 2 downvotes
+ And I sort the list by "Most popular"
+ Then The list should be sorted by "Most popular"
+ And I sort the list by "Least popular"
+ Then The list should be sorted by "Least popular"
+
+ @javascript
Scenario: Visiting Merge Requests after commenting on diffs
Given project "Shop" have "Bug NS-05" open merge request with diffs inside
And I visit merge request page "Bug NS-05"
diff --git a/features/project/merge_requests/revert.feature b/features/project/merge_requests/revert.feature
new file mode 100644
index 00000000000..d767b088883
--- /dev/null
+++ b/features/project/merge_requests/revert.feature
@@ -0,0 +1,30 @@
+@project_merge_requests
+Feature: Revert Merge Requests
+ Background:
+ Given There is an open Merge Request
+ And I am signed in as a developer of the project
+ And I am on the Merge Request detail page
+ And I click on Accept Merge Request
+
+ @javascript
+ Scenario: I revert a merge request
+ Given I click on the revert button
+ And I revert the changes directly
+ Then I should see the revert merge request notice
+
+ @javascript
+ Scenario: I revert a merge request that was previously reverted
+ Given I click on the revert button
+ And I revert the changes directly
+ And I am on the Merge Request detail page
+ And I click on the revert button
+ And I revert the changes directly
+ Then I should see a revert error
+
+ @javascript
+ Scenario: I revert a merge request in a new merge request
+ Given I click on the revert button
+ And I am on the Merge Request detail page
+ And I click on the revert button
+ And I revert the changes in a new merge request
+ Then I should see the new merge request notice
diff --git a/features/project/milestone.feature b/features/project/milestone.feature
new file mode 100644
index 00000000000..e0f4c0e9d7c
--- /dev/null
+++ b/features/project/milestone.feature
@@ -0,0 +1,23 @@
+Feature: Project Milestone
+ Background:
+ Given I sign in as a user
+ And I own project "Shop"
+ And project "Shop" has labels: "bug", "feature", "enhancement"
+ And project "Shop" has milestone "v2.2"
+ And milestone has issue "Bugfix1" with labels: "bug", "feature"
+ And milestone has issue "Bugfix2" with labels: "bug", "enhancement"
+
+
+ @javascript
+ Scenario: Listing issues from issues tab
+ Given I visit project "Shop" milestones page
+ And I click link "v2.2"
+ Then I should see the labels "bug", "enhancement" and "feature"
+
+ @javascript
+ Scenario: Listing labels from labels tab
+ Given I visit project "Shop" milestones page
+ And I click link "v2.2"
+ And I click link "Labels"
+ Then I should see the list of labels
+ And I should see the labels "bug", "enhancement" and "feature"
diff --git a/features/steps/dashboard/todos.rb b/features/steps/dashboard/todos.rb
new file mode 100644
index 00000000000..9722a5a848c
--- /dev/null
+++ b/features/steps/dashboard/todos.rb
@@ -0,0 +1,128 @@
+class Spinach::Features::DashboardTodos < Spinach::FeatureSteps
+ include SharedAuthentication
+ include SharedPaths
+ include SharedProject
+ include SharedUser
+ include Select2Helper
+
+ step '"John Doe" is a developer of project "Shop"' do
+ project.team << [john_doe, :developer]
+ end
+
+ step 'I am a developer of project "Enterprise"' do
+ enterprise.team << [current_user, :developer]
+ end
+
+ step '"Mary Jane" is a developer of project "Shop"' do
+ project.team << [john_doe, :developer]
+ end
+
+ step 'I have todos' do
+ create(:todo, user: current_user, project: project, author: mary_jane, target: issue, action: Todo::MENTIONED)
+ create(:todo, user: current_user, project: project, author: john_doe, target: issue, action: Todo::ASSIGNED)
+ note = create(:note, author: john_doe, noteable: issue, note: "#{current_user.to_reference} Wdyt?")
+ create(:todo, user: current_user, project: project, author: john_doe, target: issue, action: Todo::MENTIONED, note: note)
+ create(:todo, user: current_user, project: project, author: john_doe, target: merge_request, action: Todo::ASSIGNED)
+ end
+
+ step 'I should see todos assigned to me' do
+ expect(page).to have_content 'To do 4'
+ expect(page).to have_content 'Done 0'
+
+ expect(page).to have_link project.name_with_namespace
+ should_see_todo(1, "John Doe assigned you merge request !#{merge_request.iid}", merge_request.title)
+ should_see_todo(2, "John Doe mentioned you on issue ##{issue.iid}", "#{current_user.to_reference} Wdyt?")
+ should_see_todo(3, "John Doe assigned you issue ##{issue.iid}", issue.title)
+ should_see_todo(4, "Mary Jane mentioned you on issue ##{issue.iid}", issue.title)
+ end
+
+ step 'I mark the todo as done' do
+ page.within('.todo:nth-child(1)') do
+ click_link 'Done'
+ end
+
+ expect(page).to have_content 'Todo was successfully marked as done.'
+ expect(page).to have_content 'To do 3'
+ expect(page).to have_content 'Done 1'
+ should_not_see_todo "John Doe assigned you merge request !#{merge_request.iid}"
+ end
+
+ step 'I click on the "Done" tab' do
+ click_link 'Done 1'
+ end
+
+ step 'I should see all todos marked as done' do
+ expect(page).to have_link project.name_with_namespace
+ should_see_todo(1, "John Doe assigned you merge request !#{merge_request.iid}", merge_request.title, false)
+ end
+
+ step 'I filter by "Enterprise"' do
+ select2(enterprise.id, from: "#project_id")
+ end
+
+ step 'I filter by "John Doe"' do
+ select2(john_doe.id, from: "#author_id")
+ end
+
+ step 'I filter by "Issue"' do
+ select2('Issue', from: "#type")
+ end
+
+ step 'I filter by "Mentioned"' do
+ select2("#{Todo::MENTIONED}", from: '#action_id')
+ end
+
+ step 'I should not see todos' do
+ expect(page).to have_content "You're all done!"
+ end
+
+ step 'I should not see todos related to "Mary Jane" in the list' do
+ should_not_see_todo "Mary Jane mentioned you on issue ##{issue.iid}"
+ end
+
+ step 'I should not see todos related to "Merge Requests" in the list' do
+ should_not_see_todo "John Doe assigned you merge request !#{merge_request.iid}"
+ end
+
+ step 'I should not see todos related to "Assignments" in the list' do
+ should_not_see_todo "John Doe assigned you merge request !#{merge_request.iid}"
+ should_not_see_todo "John Doe assigned you issue ##{issue.iid}"
+ end
+
+ def should_see_todo(position, title, body, pending = true)
+ page.within(".todo:nth-child(#{position})") do
+ expect(page).to have_content title
+ expect(page).to have_content body
+
+ if pending
+ expect(page).to have_link 'Done'
+ else
+ expect(page).to_not have_link 'Done'
+ end
+ end
+ end
+
+ def should_not_see_todo(title)
+ expect(page).not_to have_content title
+ end
+
+ def john_doe
+ @john_doe ||= user_exists("John Doe", { username: "john_doe" })
+ end
+
+ def mary_jane
+ @mary_jane ||= user_exists("Mary Jane", { username: "mary_jane" })
+ end
+
+ def enterprise
+ @enterprise ||= Project.find_by(name: 'Enterprise')
+ end
+
+ def issue
+ @issue ||= create(:issue, assignee: current_user, project: project)
+ end
+
+ def merge_request
+ @merge_request ||= create(:merge_request, assignee: current_user, source_project: project)
+ end
+end
diff --git a/features/steps/project/builds/summary.rb b/features/steps/project/builds/summary.rb
index 4f94fc96354..4688a0e2096 100644
--- a/features/steps/project/builds/summary.rb
+++ b/features/steps/project/builds/summary.rb
@@ -10,4 +10,24 @@ class Spinach::Features::ProjectBuildsSummary < Spinach::FeatureSteps
expect(ci_lint_tool_link[:href]).to eq ci_lint_path
end
end
+
+ step 'I click erase build button' do
+ click_link 'Erase'
+ end
+
+ step 'recent build has been erased' do
+ expect(@build.artifacts_file.exists?).to be_falsy
+ expect(@build.artifacts_metadata.exists?).to be_falsy
+ expect(@build.trace).to be_empty
+ end
+
+ step 'recent build summary does not have artifacts widget' do
+ expect(page).to have_no_css('.artifacts')
+ end
+
+ step 'recent build summary contains information saying that build has been erased' do
+ page.within('.erased') do
+ expect(page).to have_content 'Build has been erased'
+ end
+ end
end
diff --git a/features/steps/project/commits/revert.rb b/features/steps/project/commits/revert.rb
new file mode 100644
index 00000000000..94a5d4e2e4d
--- /dev/null
+++ b/features/steps/project/commits/revert.rb
@@ -0,0 +1,40 @@
+class Spinach::Features::RevertCommits < Spinach::FeatureSteps
+ include SharedAuthentication
+ include SharedProject
+ include SharedPaths
+ include SharedDiffNote
+ include RepoHelpers
+
+ step 'I click on commit link' do
+ visit namespace_project_commit_path(@project.namespace, @project, sample_commit.id)
+ end
+
+ step 'I click on the revert button' do
+ find("a[href='#modal-revert-commit']").click
+ end
+
+ step 'I revert the changes directly' do
+ page.within('#modal-revert-commit') do
+ uncheck 'create_merge_request'
+ click_button 'Revert'
+ end
+ end
+
+ step 'I should see the revert commit notice' do
+ page.should have_content('The commit has been successfully reverted.')
+ end
+
+ step 'I should see a revert error' do
+ page.should have_content('Sorry, we cannot revert this commit automatically.')
+ end
+
+ step 'I revert the changes in a new merge request' do
+ page.within('#modal-revert-commit') do
+ click_button 'Revert'
+ end
+ end
+
+ step 'I should see the new merge request notice' do
+ page.should have_content('The commit has been successfully reverted. You can now submit a merge request to get this change into the original branch.')
+ end
+end
diff --git a/features/steps/project/fork.rb b/features/steps/project/fork.rb
index 5810276ced3..527f7853da9 100644
--- a/features/steps/project/fork.rb
+++ b/features/steps/project/fork.rb
@@ -62,6 +62,12 @@ class Spinach::Features::ProjectFork < Spinach::FeatureSteps
end
end
+ step 'I make forked repo invalid' do
+ project = @user.fork_of(@project)
+ project.path = 'test-crappy-path'
+ project.save!
+ end
+
step 'There is an existent fork of the "Shop" project' do
user = create(:user, name: 'Mike')
@forked_project = Projects::ForkService.new(@project, user).execute
diff --git a/features/steps/project/issues/award_emoji.rb b/features/steps/project/issues/award_emoji.rb
index 8b9aa6aabfa..93cf608cc62 100644
--- a/features/steps/project/issues/award_emoji.rb
+++ b/features/steps/project/issues/award_emoji.rb
@@ -46,6 +46,8 @@ class Spinach::Features::AwardEmoji < Spinach::FeatureSteps
end
step 'I have award added' do
+ sleep 0.2
+
page.within '.awards' do
expect(page).to have_selector '.award'
expect(page.find('.award.active .counter')).to have_content '1'
diff --git a/features/steps/project/issues/issues.rb b/features/steps/project/issues/issues.rb
index 09a89e99831..565bf088b41 100644
--- a/features/steps/project/issues/issues.rb
+++ b/features/steps/project/issues/issues.rb
@@ -174,6 +174,13 @@ class Spinach::Features::ProjectIssues < Spinach::FeatureSteps
author: project.users.first)
end
+ step 'project "Shop" have "Bugfix" open issue' do
+ create(:issue,
+ title: "Bugfix",
+ project: project,
+ author: project.users.first)
+ end
+
step 'project "Shop" have "Release 0.3" closed issue' do
create(:closed_issue,
title: "Release 0.3",
@@ -181,6 +188,56 @@ class Spinach::Features::ProjectIssues < Spinach::FeatureSteps
author: project.users.first)
end
+ step 'issue "Release 0.4" have 2 upvotes and 1 downvote' do
+ issue = Issue.find_by(title: 'Release 0.4')
+ create_list(:upvote_note, 2, project: project, noteable: issue)
+ create(:downvote_note, project: project, noteable: issue)
+ end
+
+ step 'issue "Tweet control" have 1 upvote and 2 downvotes' do
+ issue = Issue.find_by(title: 'Tweet control')
+ create(:upvote_note, project: project, noteable: issue)
+ create_list(:downvote_note, 2, project: project, noteable: issue)
+ end
+
+ step 'The list should be sorted by "Least popular"' do
+ page.within '.issues-list' do
+ page.within 'li.issue:nth-child(1)' do
+ expect(page).to have_content 'Tweet control'
+ expect(page).to have_content '1 2'
+ end
+
+ page.within 'li.issue:nth-child(2)' do
+ expect(page).to have_content 'Release 0.4'
+ expect(page).to have_content '2 1'
+ end
+
+ page.within 'li.issue:nth-child(3)' do
+ expect(page).to have_content 'Bugfix'
+ expect(page).to_not have_content '0 0'
+ end
+ end
+ end
+
+ step 'The list should be sorted by "Most popular"' do
+ page.within '.issues-list' do
+ page.within 'li.issue:nth-child(1)' do
+ expect(page).to have_content 'Release 0.4'
+ expect(page).to have_content '2 1'
+ end
+
+ page.within 'li.issue:nth-child(2)' do
+ expect(page).to have_content 'Tweet control'
+ expect(page).to have_content '1 2'
+ end
+
+ page.within 'li.issue:nth-child(3)' do
+ expect(page).to have_content 'Bugfix'
+ expect(page).to_not have_content '0 0'
+ end
+ end
+ end
+
step 'empty project "Empty Project"' do
create :empty_project, name: 'Empty Project', namespace: @user.namespace
end
diff --git a/features/steps/project/merge_requests.rb b/features/steps/project/merge_requests.rb
index 337893e6209..dde864f5180 100644
--- a/features/steps/project/merge_requests.rb
+++ b/features/steps/project/merge_requests.rb
@@ -138,6 +138,56 @@ class Spinach::Features::ProjectMergeRequests < Spinach::FeatureSteps
author: project.users.first)
end
+ step 'merge request "Bug NS-04" have 2 upvotes and 1 downvote' do
+ merge_request = MergeRequest.find_by(title: 'Bug NS-04')
+ create_list(:upvote_note, 2, project: project, noteable: merge_request)
+ create(:downvote_note, project: project, noteable: merge_request)
+ end
+
+ step 'merge request "Bug NS-06" have 1 upvote and 2 downvotes' do
+ merge_request = MergeRequest.find_by(title: 'Bug NS-06')
+ create(:upvote_note, project: project, noteable: merge_request)
+ create_list(:downvote_note, 2, project: project, noteable: merge_request)
+ end
+
+ step 'The list should be sorted by "Least popular"' do
+ page.within '.mr-list' do
+ page.within 'li.merge-request:nth-child(1)' do
+ expect(page).to have_content 'Bug NS-06'
+ expect(page).to have_content '1 2'
+ end
+
+ page.within 'li.merge-request:nth-child(2)' do
+ expect(page).to have_content 'Bug NS-04'
+ expect(page).to have_content '2 1'
+ end
+
+ page.within 'li.merge-request:nth-child(3)' do
+ expect(page).to have_content 'Bug NS-05'
+ expect(page).to_not have_content '0 0'
+ end
+ end
+ end
+
+ step 'The list should be sorted by "Most popular"' do
+ page.within '.mr-list' do
+ page.within 'li.merge-request:nth-child(1)' do
+ expect(page).to have_content 'Bug NS-04'
+ expect(page).to have_content '2 1'
+ end
+
+ page.within 'li.merge-request:nth-child(2)' do
+ expect(page).to have_content 'Bug NS-06'
+ expect(page).to have_content '1 2'
+ end
+
+ page.within 'li.merge-request:nth-child(3)' do
+ expect(page).to have_content 'Bug NS-05'
+ expect(page).to_not have_content '0 0'
+ end
+ end
+ end
+
step 'I click on the Changes tab' do
page.within '.merge-request-tabs' do
click_link 'Changes'
diff --git a/features/steps/project/merge_requests/revert.rb b/features/steps/project/merge_requests/revert.rb
new file mode 100644
index 00000000000..c5a4cfce6f0
--- /dev/null
+++ b/features/steps/project/merge_requests/revert.rb
@@ -0,0 +1,56 @@
+class Spinach::Features::RevertMergeRequests < Spinach::FeatureSteps
+ include LoginHelpers
+ include GitlabRoutingHelper
+
+ step 'I click on the revert button' do
+ find("a[href='#modal-revert-commit']").click
+ end
+
+ step 'I revert the changes directly' do
+ page.within('#modal-revert-commit') do
+ uncheck 'create_merge_request'
+ click_button 'Revert'
+ end
+ end
+
+ step 'I should see the revert merge request notice' do
+ page.should have_content('The merge request has been successfully reverted.')
+ end
+
+ step 'I should not see the revert button' do
+ expect(page).not_to have_selector(:xpath, "a[href='#modal-revert-commit']")
+ end
+
+ step 'I am on the Merge Request detail page' do
+ visit merge_request_path(@merge_request)
+ end
+
+ step 'I click on Accept Merge Request' do
+ click_button('Accept Merge Request')
+ end
+
+ step 'I am signed in as a developer of the project' do
+ login_as(@user)
+ end
+
+ step 'There is an open Merge Request' do
+ @user = create(:user)
+ @project = create(:project, :public)
+ @project_member = create(:project_member, user: @user, project: @project, access_level: ProjectMember::DEVELOPER)
+ @merge_request = create(:merge_request, :with_diffs, :simple, source_project: @project)
+ end
+
+ step 'I should see a revert error' do
+ page.should have_content('Sorry, we cannot revert this merge request automatically.')
+ end
+
+ step 'I revert the changes in a new merge request' do
+ page.within('#modal-revert-commit') do
+ click_button 'Revert'
+ end
+ end
+
+ step 'I should see the new merge request notice' do
+ page.should have_content('The merge request has been successfully reverted. You can now submit a merge request to get this change into the original branch.')
+ end
+end
diff --git a/features/steps/project/project_milestone.rb b/features/steps/project/project_milestone.rb
new file mode 100644
index 00000000000..ec881c0d8fc
--- /dev/null
+++ b/features/steps/project/project_milestone.rb
@@ -0,0 +1,53 @@
+class Spinach::Features::ProjectMilestone < Spinach::FeatureSteps
+ include SharedAuthentication
+ include SharedProject
+ include SharedPaths
+
+ step 'milestone has issue "Bugfix1" with labels: "bug", "feature"' do
+ project = Project.find_by(name: "Shop")
+ milestone = project.milestones.find_by(title: 'v2.2')
+ issue = create(:issue, title: "Bugfix1", project: project, milestone: milestone)
+ issue.labels << project.labels.find_by(title: 'bug')
+ issue.labels << project.labels.find_by(title: 'feature')
+ end
+
+ step 'milestone has issue "Bugfix2" with labels: "bug", "enhancement"' do
+ project = Project.find_by(name: "Shop")
+ milestone = project.milestones.find_by(title: 'v2.2')
+ issue = create(:issue, title: "Bugfix2", project: project, milestone: milestone)
+ issue.labels << project.labels.find_by(title: 'bug')
+ issue.labels << project.labels.find_by(title: 'enhancement')
+ end
+
+ step 'project "Shop" has milestone "v2.2"' do
+ project = Project.find_by(name: "Shop")
+ milestone = create(:milestone,
+ title: "v2.2",
+ project: project,
+ description: "# Description header"
+ )
+ 3.times { create(:issue, project: project, milestone: milestone) }
+ end
+
+ step 'I should see the list of labels' do
+ expect(page).to have_selector('ul.manage-labels-list')
+ end
+
+ step 'I should see the labels "bug", "enhancement" and "feature"' do
+ page.within('#tab-issues') do
+ expect(page).to have_content 'bug'
+ expect(page).to have_content 'enhancement'
+ expect(page).to have_content 'feature'
+ end
+ end
+
+ step 'I click link "v2.2"' do
+ click_link "v2.2"
+ end
+
+ step 'I click link "Labels"' do
+ page.within('.nav-links') do
+ page.find(:xpath, "//a[@href='#tab-labels']").click
+ end
+ end
+end
diff --git a/features/steps/shared/builds.rb b/features/steps/shared/builds.rb
index fa54c93df0f..0bd5d93b997 100644
--- a/features/steps/shared/builds.rb
+++ b/features/steps/shared/builds.rb
@@ -42,6 +42,10 @@ module SharedBuilds
@build.update_attributes(artifacts_metadata: gzip)
end
+ step 'recent build has a build trace' do
+ @build.trace = 'build trace'
+ end
+
step 'download of build artifacts archive starts' do
expect(page.response_headers['Content-Type']).to eq 'application/zip'
expect(page.response_headers['Content-Transfer-Encoding']).to eq 'binary'
diff --git a/features/steps/shared/issuable.rb b/features/steps/shared/issuable.rb
index 2117feaedb8..ae10c6069a9 100644
--- a/features/steps/shared/issuable.rb
+++ b/features/steps/shared/issuable.rb
@@ -113,6 +113,22 @@ module SharedIssuable
end
end
+ step 'I sort the list by "Least popular"' do
+ find('button.dropdown-toggle.btn').click
+
+ page.within('ul.dropdown-menu.dropdown-menu-align-right li') do
+ click_link 'Least popular'
+ end
+ end
+
+ step 'I sort the list by "Most popular"' do
+ find('button.dropdown-toggle.btn').click
+
+ page.within('ul.dropdown-menu.dropdown-menu-align-right li') do
+ click_link 'Most popular'
+ end
+ end
+
step 'The list should be sorted by "Oldest updated"' do
page.within('div.dropdown.inline.prepend-left-10') do
expect(page.find('button.dropdown-toggle.btn')).to have_content('Oldest updated')
diff --git a/features/steps/shared/paths.rb b/features/steps/shared/paths.rb
index 2c854ac7bf9..f4df4874d2f 100644
--- a/features/steps/shared/paths.rb
+++ b/features/steps/shared/paths.rb
@@ -103,6 +103,10 @@ module SharedPaths
visit dashboard_groups_path
end
+ step 'I visit dashboard todos page' do
+ visit dashboard_todos_path
+ end
+
step 'I should be redirected to the dashboard groups page' do
expect(current_path).to eq dashboard_groups_path
end
diff --git a/fixtures/emojis/aliases.json b/fixtures/emojis/aliases.json
index 547ce7978b3..d3831d8045b 100644
--- a/fixtures/emojis/aliases.json
+++ b/fixtures/emojis/aliases.json
@@ -1,22 +1,35 @@
-{
+{
"northeast_pointing_airplane":"airplane_northeast",
"small_airplane":"airplane_small",
"up_pointing_small_airplane":"airplane_small_up",
"up_pointing_airplane":"airplane_up",
"left_anger_bubble":"anger_left",
"right_anger_bubble":"anger_right",
+ "keycap_asterisk":"asterisk",
+ "atom_symbol":"atom",
"ballot_box_with_ballot":"ballot_box",
"ballot_box_with_bold_check":"ballot_box_check",
"ballot_box_with_script_x":"ballot_box_x",
"ballot_script_x":"ballot_x",
+ "person_with_ball":"basketball_player",
+ "person_with_ball_tone1":"basketball_player_tone1",
+ "person_with_ball_tone2":"basketball_player_tone2",
+ "person_with_ball_tone3":"basketball_player_tone3",
+ "person_with_ball_tone4":"basketball_player_tone4",
+ "person_with_ball_tone5":"basketball_player_tone5",
"beach_with_umbrella":"beach",
+ "umbrella_on_ground":"beach_umbrella",
"bellhop_bell":"bellhop",
+ "biohazard_sign":"biohazard",
"bouquet_of_flowers":"bouquet2",
+ "archery":"bow_and_arrow",
"bullhorn_with_sound_waves":"bullhorn_waves",
"pocket calculator":"calculator",
"spiral_calendar_pad":"calendar_spiral",
"card_file_box":"card_box",
"tape_cartridge":"cartridge",
+ "bottle_with_popping_cork":"champagne",
+ "cheese_wedge":"cheese",
"city_sunrise":"city_sunset",
"mantlepiece_clock":"clock",
"clockwise_right_and_left_semicircle_arrows":"clockwise_arrows",
@@ -30,6 +43,8 @@
"couple_with_heart_mm":"couple_mm",
"couple_with_heart_ww":"couple_ww",
"lower_left_crayon":"crayon",
+ "cricket_bat_ball":"cricket",
+ "latin_cross":"cross",
"heavy_latin_cross":"cross_heavy",
"white_latin_cross":"cross_white",
"black_skull_and_crossbones":"crossbones",
@@ -60,10 +75,13 @@
"al":"flag_al",
"am":"flag_am",
"ao":"flag_ao",
+ "aq":"flag_aq",
"ar":"flag_ar",
+ "as":"flag_as",
"at":"flag_at",
"au":"flag_au",
"aw":"flag_aw",
+ "ax":"flag_ax",
"az":"flag_az",
"ba":"flag_ba",
"bb":"flag_bb",
@@ -74,37 +92,47 @@
"bh":"flag_bh",
"bi":"flag_bi",
"bj":"flag_bj",
+ "bl":"flag_bl",
"waving_black_flag":"flag_black",
"bm":"flag_bm",
"bn":"flag_bn",
"bo":"flag_bo",
+ "bq":"flag_bq",
"br":"flag_br",
"bs":"flag_bs",
"bt":"flag_bt",
+ "bv":"flag_bv",
"bw":"flag_bw",
"by":"flag_by",
"bz":"flag_bz",
"ca":"flag_ca",
+ "cc":"flag_cc",
"congo":"flag_cd",
"cf":"flag_cf",
"cg":"flag_cg",
"ch":"flag_ch",
"ci":"flag_ci",
+ "ck":"flag_ck",
"chile":"flag_cl",
"cm":"flag_cm",
"cn":"flag_cn",
"co":"flag_co",
+ "cp":"flag_cp",
"cr":"flag_cr",
"cu":"flag_cu",
"cv":"flag_cv",
+ "cw":"flag_cw",
+ "cx":"flag_cx",
"cy":"flag_cy",
"cz":"flag_cz",
"de":"flag_de",
+ "dg":"flag_dg",
"dj":"flag_dj",
"dk":"flag_dk",
"dm":"flag_dm",
"do":"flag_do",
"dz":"flag_dz",
+ "ea":"flag_ea",
"ec":"flag_ec",
"ee":"flag_ee",
"eg":"flag_eg",
@@ -112,6 +140,7 @@
"er":"flag_er",
"es":"flag_es",
"et":"flag_et",
+ "eu":"flag_eu",
"fi":"flag_fi",
"fj":"flag_fj",
"fk":"flag_fk",
@@ -122,26 +151,34 @@
"gb":"flag_gb",
"gd":"flag_gd",
"ge":"flag_ge",
+ "gf":"flag_gf",
+ "gg":"flag_gg",
"gh":"flag_gh",
"gi":"flag_gi",
"gl":"flag_gl",
"gm":"flag_gm",
"gn":"flag_gn",
+ "gp":"flag_gp",
"gq":"flag_gq",
"gr":"flag_gr",
+ "gs":"flag_gs",
"gt":"flag_gt",
"gu":"flag_gu",
"gw":"flag_gw",
"gy":"flag_gy",
"hk":"flag_hk",
+ "hm":"flag_hm",
"hn":"flag_hn",
"hr":"flag_hr",
"ht":"flag_ht",
"hu":"flag_hu",
+ "ic":"flag_ic",
"indonesia":"flag_id",
"ie":"flag_ie",
"il":"flag_il",
+ "im":"flag_im",
"in":"flag_in",
+ "io":"flag_io",
"iq":"flag_iq",
"ir":"flag_ir",
"is":"flag_is",
@@ -176,6 +213,7 @@
"mc":"flag_mc",
"md":"flag_md",
"me":"flag_me",
+ "mf":"flag_mf",
"mg":"flag_mg",
"mh":"flag_mh",
"mk":"flag_mk",
@@ -183,6 +221,8 @@
"mm":"flag_mm",
"mn":"flag_mn",
"mo":"flag_mo",
+ "mp":"flag_mp",
+ "mq":"flag_mq",
"mr":"flag_mr",
"ms":"flag_ms",
"mt":"flag_mt",
@@ -195,6 +235,7 @@
"na":"flag_na",
"nc":"flag_nc",
"ne":"flag_ne",
+ "nf":"flag_nf",
"nigeria":"flag_ng",
"ni":"flag_ni",
"nl":"flag_nl",
@@ -211,12 +252,15 @@
"ph":"flag_ph",
"pk":"flag_pk",
"pl":"flag_pl",
+ "pm":"flag_pm",
+ "pn":"flag_pn",
"pr":"flag_pr",
"ps":"flag_ps",
"pt":"flag_pt",
"pw":"flag_pw",
"py":"flag_py",
"qa":"flag_qa",
+ "re":"flag_re",
"ro":"flag_ro",
"rs":"flag_rs",
"ru":"flag_ru",
@@ -230,20 +274,27 @@
"sg":"flag_sg",
"sh":"flag_sh",
"si":"flag_si",
+ "sj":"flag_sj",
"sk":"flag_sk",
"sl":"flag_sl",
"sm":"flag_sm",
"sn":"flag_sn",
"so":"flag_so",
"sr":"flag_sr",
+ "ss":"flag_ss",
"st":"flag_st",
"sv":"flag_sv",
+ "sx":"flag_sx",
"sy":"flag_sy",
"sz":"flag_sz",
+ "ta":"flag_ta",
+ "tc":"flag_tc",
"td":"flag_td",
+ "tf":"flag_tf",
"tg":"flag_tg",
"th":"flag_th",
"tj":"flag_tj",
+ "tk":"flag_tk",
"tl":"flag_tl",
"turkmenistan":"flag_tm",
"tn":"flag_tn",
@@ -255,12 +306,14 @@
"tz":"flag_tz",
"ua":"flag_ua",
"ug":"flag_ug",
+ "um":"flag_um",
"us":"flag_us",
"uy":"flag_uy",
"uz":"flag_uz",
"va":"flag_va",
"vc":"flag_vc",
"ve":"flag_ve",
+ "vg":"flag_vg",
"vi":"flag_vi",
"vn":"flag_vn",
"vu":"flag_vu",
@@ -269,6 +322,7 @@
"ws":"flag_ws",
"xk":"flag_xk",
"ye":"flag_ye",
+ "yt":"flag_yt",
"za":"flag_za",
"zm":"flag_zm",
"zw":"flag_zw",
@@ -281,12 +335,24 @@
"frame_with_tiles":"frame_tiles",
"frame_with_an_x":"frame_x",
"anguished":"frowning",
+ "white_frowning_face":"frowning2",
+ "hammer_and_pick":"hammer_pick",
"raised_hand_with_fingers_splayed":"hand_splayed",
"reversed_raised_hand_with_fingers_splayed":"hand_splayed_reverse",
+ "raised_hand_with_fingers_splayed_tone1":"hand_splayed_tone1",
+ "raised_hand_with_fingers_splayed_tone2":"hand_splayed_tone2",
+ "raised_hand_with_fingers_splayed_tone3":"hand_splayed_tone3",
+ "raised_hand_with_fingers_splayed_tone4":"hand_splayed_tone4",
+ "raised_hand_with_fingers_splayed_tone5":"hand_splayed_tone5",
"reversed_victory_hand":"hand_victory",
+ "face_with_head_bandage":"head_bandage",
+ "heavy_heart_exclamation_mark_ornament":"heart_exclamation",
"heart_with_tip_on_the_left":"heart_tip",
+ "helmet_with_white_cross":"helmet_with_cross",
"house_buildings":"homes",
+ "hot_dog":"hotdog",
"derelict_house_building":"house_abandoned",
+ "hugging_face":"hugging",
"circled_information_source":"info",
"desert_island":"island",
"up_pointing_military_airplane":"jet_up",
@@ -300,16 +366,36 @@
"left_hand_telephone_receiver":"left_receiver",
"man_in_business_suit_levitating":"levitate",
"weight_lifter":"lifter",
+ "weight_lifter_tone1":"lifter_tone1",
+ "weight_lifter_tone2":"lifter_tone2",
+ "weight_lifter_tone3":"lifter_tone3",
+ "weight_lifter_tone4":"lifter_tone4",
+ "weight_lifter_tone5":"lifter_tone5",
"light_mark":"light_check_mark",
+ "lion":"lion_face",
"world_map":"map",
"sports_medal":"medal",
+ "sign_of_the_horns":"metal",
+ "sign_of_the_horns_tone1":"metal_tone1",
+ "sign_of_the_horns_tone2":"metal_tone2",
+ "sign_of_the_horns_tone3":"metal_tone3",
+ "sign_of_the_horns_tone4":"metal_tone4",
+ "sign_of_the_horns_tone5":"metal_tone5",
"studio_microphone":"microphone2",
"reversed_hand_with_middle_finger_extended":"middle_finger",
+ "reversed_hand_with_middle_finger_extended_tone1":"middle_finger_tone1",
+ "reversed_hand_with_middle_finger_extended_tone2":"middle_finger_tone2",
+ "reversed_hand_with_middle_finger_extended_tone3":"middle_finger_tone3",
+ "reversed_hand_with_middle_finger_extended_tone4":"middle_finger_tone4",
+ "reversed_hand_with_middle_finger_extended_tone5":"middle_finger_tone5",
+ "money_mouth_face":"money_mouth",
"lightning_mood_bubble":"mood_bubble_lightning",
"lightning_mood":"mood_lightning",
"racing_motorcycle":"motorcycle",
"snow_capped_mountain":"mountain_snow",
"one_button_mouse":"mouse_one",
+ "three_button_mouse":"mouse_three_button",
+ "nerd_face":"nerd",
"three_networked_computers":"network",
"rolled_up_newspaper":"newspaper2",
"note_page":"note",
@@ -319,27 +405,40 @@
"spiral_note_pad":"notepad_spiral",
"oil_drum":"oil",
"grandma":"older_woman",
+ "grandma_tone1":"older_woman_tone1",
+ "grandma_tone2":"older_woman_tone2",
+ "grandma_tone3":"older_woman_tone3",
+ "grandma_tone4":"older_woman_tone4",
+ "grandma_tone5":"older_woman_tone5",
"optical_disc_icon":"optical_disk",
"lower_left_paintbrush":"paintbrush",
"linked_paperclips":"paperclips",
"national_park":"park",
+ "double_vertical_bar":"pause_button",
+ "peace_symbol":"peace",
"lower_left_ballpoint_pen":"pen_ballpoint",
"lower_left_fountain_pen":"pen_fountain",
"memo":"pencil",
"lower_left_pencil":"pencil3",
"black_pennant":"pennant_black",
"white_pennant":"pennant_white",
+ "table_tennis":"ping_pong",
"no_piracy":"piracy",
+ "worship_symbol":"place_of_worship",
"shit":"poop",
"hankey":"poop",
"poo":"poop",
"prohibited_sign":"prohibited",
"film_projector":"projector",
"racing_car":"race_car",
+ "radioactive_sign":"radioactive",
"railroad_track":"railway_track",
"right_speaker_with_one_sound_wave":"right_speaker_one",
"right_speaker_with_three_sound_waves":"right_speaker_three",
+ "robot_face":"robot",
+ "face_with_rolling_eyes":"rolling_eyes",
"skeleton":"skull",
+ "skull_and_crossbones":"skull_crossbones",
"slightly_frowning_face":"slight_frown",
"slightly_smiling_face":"slight_smile",
"speaking_head_in_silhouette":"speaking_head",
@@ -348,20 +447,53 @@
"three_speech_bubbles":"speech_three",
"two_speech_bubbles":"speech_two",
"sleuth_or_spy":"spy",
+ "sleuth_or_spy_tone1":"spy_tone1",
+ "sleuth_or_spy_tone2":"spy_tone2",
+ "sleuth_or_spy_tone3":"spy_tone3",
+ "sleuth_or_spy_tone4":"spy_tone4",
+ "sleuth_or_spy_tone5":"spy_tone5",
"portable_stereo":"stereo",
"black_touchtone_telephone":"telephone_black",
"white_touchtone_telephone":"telephone_white",
+ "face_with_thermometer":"thermometer_face",
+ "thinking_face":"thinking",
"left_thought_bubble":"thought_left",
"right_thought_bubble":"thought_right",
"reversed_thumbs_down_sign":"thumbs_down_reverse",
"reversed_thumbs_up_sign":"thumbs_up_reverse",
"-1":"thumbsdown",
+ "-1_tone1":"thumbsdown_tone1",
+ "-1_tone2":"thumbsdown_tone2",
+ "-1_tone3":"thumbsdown_tone3",
+ "-1_tone4":"thumbsdown_tone4",
+ "-1_tone5":"thumbsdown_tone5",
"+1":"thumbsup",
+ "+1_tone1":"thumbsup_tone1",
+ "+1_tone2":"thumbsup_tone2",
+ "+1_tone3":"thumbsup_tone3",
+ "+1_tone4":"thumbsup_tone4",
+ "+1_tone5":"thumbsup_tone5",
+ "thunder_cloud_and_rain":"thunder_cloud_rain",
"admission_tickets":"tickets",
+ "timer_clock":"timer",
"hammer_and_wrench":"tools",
+ "next_track":"track_next",
+ "previous_track":"track_previous",
"diesel_locomotive":"train_diesel",
"triangle_with_rounded_corners":"triangle_round",
"turned_ok_hand_sign":"turned_ok_hand",
+ "unicorn_face":"unicorn",
+ "upside_down_face":"upside_down",
+ "funeral_urn":"urn",
"raised_hand_with_part_between_middle_and_ring_fingers":"vulcan",
- "left_writing_hand":"writing_hand"
-} \ No newline at end of file
+ "raised_hand_with_part_between_middle_and_ring_fingers_tone1":"vulcan_tone1",
+ "raised_hand_with_part_between_middle_and_ring_fingers_tone2":"vulcan_tone2",
+ "raised_hand_with_part_between_middle_and_ring_fingers_tone3":"vulcan_tone3",
+ "raised_hand_with_part_between_middle_and_ring_fingers_tone4":"vulcan_tone4",
+ "raised_hand_with_part_between_middle_and_ring_fingers_tone5":"vulcan_tone5",
+ "white_sun_behind_cloud":"white_sun_cloud",
+ "white_sun_behind_cloud_with_rain":"white_sun_rain_cloud",
+ "white_sun_with_small_cloud":"white_sun_small_cloud",
+ "left_writing_hand":"writing_hand",
+ "zipper_mouth_face":"zipper_mouth"
+}
diff --git a/fixtures/emojis/generate_aliases.rb b/fixtures/emojis/generate_aliases.rb
new file mode 100755
index 00000000000..8838fb9a3af
--- /dev/null
+++ b/fixtures/emojis/generate_aliases.rb
@@ -0,0 +1,18 @@
+#!/usr/bin/env ruby
+
+require 'json'
+
+aliases = {}
+
+index_file = File.expand_path("./index.json")
+index = JSON.parse(File.read(index_file))
+
+index.each_pair do |key, data|
+ data['aliases'].each do |a|
+ a.tr!(':', '')
+
+ aliases[a] = key
+ end
+end
+
+puts JSON.pretty_generate(aliases, indent: ' ', space: '', space_before: '')
diff --git a/fixtures/emojis/index.json b/fixtures/emojis/index.json
index 60ef2399e14..7f204c1a8e0 100644
--- a/fixtures/emojis/index.json
+++ b/fixtures/emojis/index.json
@@ -7,7 +7,21 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["numbers", "perfect", "score", "100", "percent", "a", "plus", "perfect", "school", "quiz", "score", "test", "exam"],
+ "keywords": [
+ "numbers",
+ "perfect",
+ "score",
+ "100",
+ "percent",
+ "a",
+ "plus",
+ "perfect",
+ "school",
+ "quiz",
+ "score",
+ "test",
+ "exam"
+ ],
"moji": "💯"
},
"1234": {
@@ -18,7 +32,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue-square", "numbers"],
+ "keywords": [
+ "blue-square",
+ "numbers"
+ ],
"moji": "🔢"
},
"8ball": {
@@ -29,7 +46,14 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["pool", "billiards", "eight ball", "pool", "pocket ball", "cue"],
+ "keywords": [
+ "pool",
+ "billiards",
+ "eight ball",
+ "pool",
+ "pocket ball",
+ "cue"
+ ],
"moji": "🎱"
},
"a": {
@@ -40,7 +64,11 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["alphabet", "letter", "red-square"],
+ "keywords": [
+ "alphabet",
+ "letter",
+ "red-square"
+ ],
"moji": "🅰"
},
"ab": {
@@ -51,7 +79,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["alphabet", "red-square"],
+ "keywords": [
+ "alphabet",
+ "red-square"
+ ],
"moji": "🆎"
},
"abc": {
@@ -62,7 +93,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["alphabet", "blue-square"],
+ "keywords": [
+ "alphabet",
+ "blue-square"
+ ],
"moji": "🔤"
},
"abcd": {
@@ -73,7 +107,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["alphabet", "blue-square"],
+ "keywords": [
+ "alphabet",
+ "blue-square"
+ ],
"moji": "🔡"
},
"accept": {
@@ -84,7 +121,14 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["agree", "chinese", "good", "kanji", "ok", "yes"],
+ "keywords": [
+ "agree",
+ "chinese",
+ "good",
+ "kanji",
+ "ok",
+ "yes"
+ ],
"moji": "🉑"
},
"aerial_tramway": {
@@ -95,18 +139,42 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["transportation", "vehicle", "aerial", "tram", "tramway", "cable", "transport"],
+ "keywords": [
+ "transportation",
+ "vehicle",
+ "aerial",
+ "tram",
+ "tramway",
+ "cable",
+ "transport"
+ ],
"moji": "🚡"
},
"airplane": {
"unicode": "2708",
- "unicode_alternates": ["2708-FE0F"],
+ "unicode_alternates": [
+ "2708-FE0F"
+ ],
"name": "airplane",
"shortname": ":airplane:",
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["flight", "transportation", "vehicle", "airplane", "plane", "airport", "travel", "airlines", "fly", "jet", "jumbo", "boeing", "airbus"],
+ "keywords": [
+ "flight",
+ "transportation",
+ "vehicle",
+ "airplane",
+ "plane",
+ "airport",
+ "travel",
+ "airlines",
+ "fly",
+ "jet",
+ "jumbo",
+ "boeing",
+ "airbus"
+ ],
"moji": "✈"
},
"airplane_arriving": {
@@ -117,7 +185,20 @@
"category": "travel_places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["flight", "transportation", "vehicle", "plane", "airport", "travel", "airlines", "fly", "jet", "jumbo", "boeing", "airbus"]
+ "keywords": [
+ "flight",
+ "transportation",
+ "vehicle",
+ "plane",
+ "airport",
+ "travel",
+ "airlines",
+ "fly",
+ "jet",
+ "jumbo",
+ "boeing",
+ "airbus"
+ ]
},
"airplane_departure": {
"unicode": "1F6EB",
@@ -127,7 +208,21 @@
"category": "travel_places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["flight", "transportation", "vehicle", "plane", "airport", "travel", "airlines", "fly", "jet", "jumbo", "boeing", "airbus", "leaving"]
+ "keywords": [
+ "flight",
+ "transportation",
+ "vehicle",
+ "plane",
+ "airport",
+ "travel",
+ "airlines",
+ "fly",
+ "jet",
+ "jumbo",
+ "boeing",
+ "airbus",
+ "leaving"
+ ]
},
"airplane_northeast": {
"unicode": "1F6EA",
@@ -135,9 +230,14 @@
"name": "northeast-pointing airplane",
"shortname": ":airplane_northeast:",
"category": "travel_places",
- "aliases": [":northeast_pointing_airplane:"],
+ "aliases": [
+ ":northeast_pointing_airplane:"
+ ],
"aliases_ascii": [],
- "keywords": ["plane", "travel"]
+ "keywords": [
+ "plane",
+ "travel"
+ ]
},
"airplane_small": {
"unicode": "1F6E9",
@@ -145,9 +245,24 @@
"name": "small airplane",
"shortname": ":airplane_small:",
"category": "travel_places",
- "aliases": [":small_airplane:"],
- "aliases_ascii": [],
- "keywords": ["flight", "transportation", "vehicle", "plane", "airport", "travel", "airlines", "fly", "jet", "jumbo", "boeing", "airbus"]
+ "aliases": [
+ ":small_airplane:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "flight",
+ "transportation",
+ "vehicle",
+ "plane",
+ "airport",
+ "travel",
+ "airlines",
+ "fly",
+ "jet",
+ "jumbo",
+ "boeing",
+ "airbus"
+ ]
},
"airplane_small_up": {
"unicode": "1F6E8",
@@ -155,9 +270,14 @@
"name": "up-pointing small airplane",
"shortname": ":airplane_small_up:",
"category": "travel_places",
- "aliases": [":up_pointing_small_airplane:"],
+ "aliases": [
+ ":up_pointing_small_airplane:"
+ ],
"aliases_ascii": [],
- "keywords": ["plane", "travel"]
+ "keywords": [
+ "plane",
+ "travel"
+ ]
},
"airplane_up": {
"unicode": "1F6E7",
@@ -165,9 +285,14 @@
"name": "up-pointing airplane",
"shortname": ":airplane_up:",
"category": "travel_places",
- "aliases": [":up_pointing_airplane:"],
+ "aliases": [
+ ":up_pointing_airplane:"
+ ],
"aliases_ascii": [],
- "keywords": ["plane", "travel"]
+ "keywords": [
+ "plane",
+ "travel"
+ ]
},
"alarm_clock": {
"unicode": "23F0",
@@ -177,9 +302,26 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["time", "wake"],
+ "keywords": [
+ "time",
+ "wake"
+ ],
"moji": "⏰"
},
+ "alembic": {
+ "unicode": "2697",
+ "unicode_alternates": "",
+ "name": "alembic",
+ "shortname": ":alembic:",
+ "category": "objects",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "chemistry",
+ "object",
+ "tool"
+ ]
+ },
"alien": {
"unicode": "1F47D",
"unicode_alternates": [],
@@ -188,7 +330,12 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["UFO", "paul", "alien", "ufo"],
+ "keywords": [
+ "UFO",
+ "paul",
+ "alien",
+ "ufo"
+ ],
"moji": "👽"
},
"ambulance": {
@@ -199,18 +346,50 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["911", "health", "ambulance", "emergency", "medical", "help", "assistance"],
+ "keywords": [
+ "911",
+ "health",
+ "ambulance",
+ "emergency",
+ "medical",
+ "help",
+ "assistance"
+ ],
"moji": "🚑"
},
+ "amphora": {
+ "unicode": "1F3FA",
+ "unicode_alternates": "",
+ "name": "amphora",
+ "shortname": ":amphora:",
+ "category": "objects",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": []
+ },
"anchor": {
"unicode": "2693",
- "unicode_alternates": ["2693-FE0F"],
+ "unicode_alternates": [
+ "2693-FE0F"
+ ],
"name": "anchor",
"shortname": ":anchor:",
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["ferry", "ship", "anchor", "ship", "boat", "ocean", "harbor", "marina", "shipyard", "sailor", "tattoo"],
+ "keywords": [
+ "ferry",
+ "ship",
+ "anchor",
+ "ship",
+ "boat",
+ "ocean",
+ "harbor",
+ "marina",
+ "shipyard",
+ "sailor",
+ "tattoo"
+ ],
"moji": "⚓"
},
"angel": {
@@ -221,9 +400,99 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["baby", "angel", "halo", "cupid", "wings", "halo", "heaven", "wings", "jesus"],
+ "keywords": [
+ "baby",
+ "angel",
+ "halo",
+ "cupid",
+ "wings",
+ "halo",
+ "heaven",
+ "wings",
+ "jesus"
+ ],
"moji": "👼"
},
+ "angel_tone1": {
+ "unicode": "1F47C-1F3FB",
+ "unicode_alternates": "",
+ "name": "baby angel tone 1",
+ "shortname": ":angel_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "halo",
+ "cupid",
+ "heaven",
+ "wings",
+ "jesus"
+ ]
+ },
+ "angel_tone2": {
+ "unicode": "1F47C-1F3FC",
+ "unicode_alternates": "",
+ "name": "baby angel tone 2",
+ "shortname": ":angel_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "halo",
+ "cupid",
+ "heaven",
+ "wings",
+ "jesus"
+ ]
+ },
+ "angel_tone3": {
+ "unicode": "1F47C-1F3FD",
+ "unicode_alternates": "",
+ "name": "baby angel tone 3",
+ "shortname": ":angel_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "halo",
+ "cupid",
+ "heaven",
+ "wings",
+ "jesus"
+ ]
+ },
+ "angel_tone4": {
+ "unicode": "1F47C-1F3FE",
+ "unicode_alternates": "",
+ "name": "baby angel tone 4",
+ "shortname": ":angel_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "halo",
+ "cupid",
+ "heaven",
+ "wings",
+ "jesus"
+ ]
+ },
+ "angel_tone5": {
+ "unicode": "1F47C-1F3FF",
+ "unicode_alternates": "",
+ "name": "baby angel tone 5",
+ "shortname": ":angel_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "halo",
+ "cupid",
+ "heaven",
+ "wings",
+ "jesus"
+ ]
+ },
"anger": {
"unicode": "1F4A2",
"unicode_alternates": [],
@@ -232,7 +501,11 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["anger", "angry", "mad"],
+ "keywords": [
+ "anger",
+ "angry",
+ "mad"
+ ],
"moji": "💢"
},
"anger_left": {
@@ -241,9 +514,20 @@
"name": "left anger bubble",
"shortname": ":anger_left:",
"category": "objects_symbols",
- "aliases": [":left_anger_bubble:"],
- "aliases_ascii": [],
- "keywords": ["speech", "balloon", "talk", "mood", "conversation", "communication", "comic", "angry"]
+ "aliases": [
+ ":left_anger_bubble:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "speech",
+ "balloon",
+ "talk",
+ "mood",
+ "conversation",
+ "communication",
+ "comic",
+ "angry"
+ ]
},
"anger_right": {
"unicode": "1F5EF",
@@ -251,9 +535,20 @@
"name": "right anger bubble",
"shortname": ":anger_right:",
"category": "objects_symbols",
- "aliases": [":right_anger_bubble:"],
- "aliases_ascii": [],
- "keywords": ["speech", "balloon", "talk", "mood", "conversation", "communication", "comic", "angry"]
+ "aliases": [
+ ":right_anger_bubble:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "speech",
+ "balloon",
+ "talk",
+ "mood",
+ "conversation",
+ "communication",
+ "comic",
+ "angry"
+ ]
},
"angry": {
"unicode": "1F620",
@@ -262,8 +557,22 @@
"shortname": ":angry:",
"category": "emoticons",
"aliases": [],
- "aliases_ascii": [">:(", ">:-(", ":@"],
- "keywords": ["angry", "livid", "mad", "vexed", "irritated", "annoyed", "face", "frustrated", "mad"],
+ "aliases_ascii": [
+ ">:(",
+ ">:-(",
+ ":@"
+ ],
+ "keywords": [
+ "angry",
+ "livid",
+ "mad",
+ "vexed",
+ "irritated",
+ "annoyed",
+ "face",
+ "frustrated",
+ "mad"
+ ],
"moji": "😠"
},
"anguished": {
@@ -274,7 +583,17 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["face", "nervous", "stunned", "pain", "anguish", "ouch", "misery", "distress", "grief"],
+ "keywords": [
+ "face",
+ "nervous",
+ "stunned",
+ "pain",
+ "anguish",
+ "ouch",
+ "misery",
+ "distress",
+ "grief"
+ ],
"moji": "😧"
},
"ant": {
@@ -285,7 +604,14 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "insect", "ant", "queen", "insect", "team"],
+ "keywords": [
+ "animal",
+ "insect",
+ "ant",
+ "queen",
+ "insect",
+ "team"
+ ],
"moji": "🐜"
},
"apple": {
@@ -296,40 +622,87 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["fruit", "mac", "apple", "fruit", "electronics", "red", "doctor", "teacher", "school", "core"],
+ "keywords": [
+ "fruit",
+ "mac",
+ "apple",
+ "fruit",
+ "electronics",
+ "red",
+ "doctor",
+ "teacher",
+ "school",
+ "core"
+ ],
"moji": "🍎"
},
"aquarius": {
"unicode": "2652",
- "unicode_alternates": ["2652-FE0F"],
+ "unicode_alternates": [
+ "2652-FE0F"
+ ],
"name": "aquarius",
"shortname": ":aquarius:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["aquarius", "water", "bearer", "astrology", "greek", "constellation", "stars", "zodiac", "sign", "purple-square", "sign", "zodiac", "horoscope"],
+ "keywords": [
+ "aquarius",
+ "water",
+ "bearer",
+ "astrology",
+ "greek",
+ "constellation",
+ "stars",
+ "zodiac",
+ "sign",
+ "purple-square",
+ "sign",
+ "zodiac",
+ "horoscope"
+ ],
"moji": "♒"
},
"aries": {
"unicode": "2648",
- "unicode_alternates": ["2648-FE0F"],
+ "unicode_alternates": [
+ "2648-FE0F"
+ ],
"name": "aries",
"shortname": ":aries:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["aries", "ram", "astrology", "greek", "constellation", "stars", "zodiac", "sign", "purple-square", "sign", "zodiac", "horoscope"],
+ "keywords": [
+ "aries",
+ "ram",
+ "astrology",
+ "greek",
+ "constellation",
+ "stars",
+ "zodiac",
+ "sign",
+ "purple-square",
+ "sign",
+ "zodiac",
+ "horoscope"
+ ],
"moji": "♈"
},
"arrow_backward": {
"unicode": "25C0",
- "unicode_alternates": ["25C0-FE0F"],
+ "unicode_alternates": [
+ "25C0-FE0F"
+ ],
"name": "black left-pointing triangle",
"shortname": ":arrow_backward:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["arrow", "blue-square"],
+ "keywords": [
+ "arrow",
+ "blue-square"
+ ],
"moji": "◀"
},
"arrow_double_down": {
@@ -340,7 +713,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["arrow", "blue-square"],
+ "keywords": [
+ "arrow",
+ "blue-square"
+ ],
"moji": "⏬"
},
"arrow_double_up": {
@@ -351,18 +727,26 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["arrow", "blue-square"],
+ "keywords": [
+ "arrow",
+ "blue-square"
+ ],
"moji": "⏫"
},
"arrow_down": {
"unicode": "2B07",
- "unicode_alternates": ["2B07-FE0F"],
+ "unicode_alternates": [
+ "2B07-FE0F"
+ ],
"name": "downwards black arrow",
"shortname": ":arrow_down:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["arrow", "blue-square"],
+ "keywords": [
+ "arrow",
+ "blue-square"
+ ],
"moji": "⬇"
},
"arrow_down_small": {
@@ -373,117 +757,168 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["arrow", "blue-square"],
+ "keywords": [
+ "arrow",
+ "blue-square"
+ ],
"moji": "🔽"
},
"arrow_forward": {
"unicode": "25B6",
- "unicode_alternates": ["25B6-FE0F"],
+ "unicode_alternates": [
+ "25B6-FE0F"
+ ],
"name": "black right-pointing triangle",
"shortname": ":arrow_forward:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["arrow", "blue-square"],
+ "keywords": [
+ "arrow",
+ "blue-square"
+ ],
"moji": "▶"
},
"arrow_heading_down": {
"unicode": "2935",
- "unicode_alternates": ["2935-FE0F"],
+ "unicode_alternates": [
+ "2935-FE0F"
+ ],
"name": "arrow pointing rightwards then curving downwards",
"shortname": ":arrow_heading_down:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["arrow", "blue-square"],
+ "keywords": [
+ "arrow",
+ "blue-square"
+ ],
"moji": "⤵"
},
"arrow_heading_up": {
"unicode": "2934",
- "unicode_alternates": ["2934-FE0F"],
+ "unicode_alternates": [
+ "2934-FE0F"
+ ],
"name": "arrow pointing rightwards then curving upwards",
"shortname": ":arrow_heading_up:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["arrow", "blue-square"],
+ "keywords": [
+ "arrow",
+ "blue-square"
+ ],
"moji": "⤴"
},
"arrow_left": {
"unicode": "2B05",
- "unicode_alternates": ["2B05-FE0F"],
+ "unicode_alternates": [
+ "2B05-FE0F"
+ ],
"name": "leftwards black arrow",
"shortname": ":arrow_left:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["arrow", "blue-square", "previous"],
+ "keywords": [
+ "arrow",
+ "blue-square",
+ "previous"
+ ],
"moji": "⬅"
},
"arrow_lower_left": {
"unicode": "2199",
- "unicode_alternates": ["2199-FE0F"],
+ "unicode_alternates": [
+ "2199-FE0F"
+ ],
"name": "south west arrow",
"shortname": ":arrow_lower_left:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["arrow", "blue-square"],
+ "keywords": [
+ "arrow",
+ "blue-square"
+ ],
"moji": "↙"
},
"arrow_lower_right": {
"unicode": "2198",
- "unicode_alternates": ["2198-FE0F"],
+ "unicode_alternates": [
+ "2198-FE0F"
+ ],
"name": "south east arrow",
"shortname": ":arrow_lower_right:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["arrow", "blue-square"],
+ "keywords": [
+ "arrow",
+ "blue-square"
+ ],
"moji": "↘"
},
"arrow_right": {
"unicode": "27A1",
- "unicode_alternates": ["27A1-FE0F"],
+ "unicode_alternates": [
+ "27A1-FE0F"
+ ],
"name": "black rightwards arrow",
"shortname": ":arrow_right:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue-square", "next"],
+ "keywords": [
+ "blue-square",
+ "next"
+ ],
"moji": "➡"
},
"arrow_right_hook": {
"unicode": "21AA",
- "unicode_alternates": ["21AA-FE0F"],
+ "unicode_alternates": [
+ "21AA-FE0F"
+ ],
"name": "rightwards arrow with hook",
"shortname": ":arrow_right_hook:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue-square"],
+ "keywords": [
+ "blue-square"
+ ],
"moji": "↪"
},
"arrow_up": {
"unicode": "2B06",
- "unicode_alternates": ["2B06-FE0F"],
+ "unicode_alternates": [
+ "2B06-FE0F"
+ ],
"name": "upwards black arrow",
"shortname": ":arrow_up:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue-square"],
+ "keywords": [
+ "blue-square"
+ ],
"moji": "⬆"
},
"arrow_up_down": {
"unicode": "2195",
- "unicode_alternates": ["2195-FE0F"],
+ "unicode_alternates": [
+ "2195-FE0F"
+ ],
"name": "up down arrow",
"shortname": ":arrow_up_down:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue-square"],
+ "keywords": [
+ "blue-square"
+ ],
"moji": "↕"
},
"arrow_up_small": {
@@ -494,29 +929,39 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue-square"],
+ "keywords": [
+ "blue-square"
+ ],
"moji": "🔼"
},
"arrow_upper_left": {
"unicode": "2196",
- "unicode_alternates": ["2196-FE0F"],
+ "unicode_alternates": [
+ "2196-FE0F"
+ ],
"name": "north west arrow",
"shortname": ":arrow_upper_left:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue-square"],
+ "keywords": [
+ "blue-square"
+ ],
"moji": "↖"
},
"arrow_upper_right": {
"unicode": "2197",
- "unicode_alternates": ["2197-FE0F"],
+ "unicode_alternates": [
+ "2197-FE0F"
+ ],
"name": "north east arrow",
"shortname": ":arrow_upper_right:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue-square"],
+ "keywords": [
+ "blue-square"
+ ],
"moji": "↗"
},
"arrows_clockwise": {
@@ -527,7 +972,9 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["sync"],
+ "keywords": [
+ "sync"
+ ],
"moji": "🔃"
},
"arrows_counterclockwise": {
@@ -538,7 +985,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue-square", "sync"],
+ "keywords": [
+ "blue-square",
+ "sync"
+ ],
"moji": "🔄"
},
"art": {
@@ -549,7 +999,20 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["design", "draw", "paint", "artist", "palette", "art", "colors", "paint", "draw", "brush", "pastels", "oils"],
+ "keywords": [
+ "design",
+ "draw",
+ "paint",
+ "artist",
+ "palette",
+ "art",
+ "colors",
+ "paint",
+ "draw",
+ "brush",
+ "pastels",
+ "oils"
+ ],
"moji": "🎨"
},
"articulated_lorry": {
@@ -560,7 +1023,16 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["cars", "transportation", "vehicle", "truck", "delivery", "semi", "lorry", "articulated"],
+ "keywords": [
+ "cars",
+ "transportation",
+ "vehicle",
+ "truck",
+ "delivery",
+ "semi",
+ "lorry",
+ "articulated"
+ ],
"moji": "🚛"
},
"ascending_notes": {
@@ -571,7 +1043,28 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["score", "music", "sound", "tone"]
+ "keywords": [
+ "score",
+ "music",
+ "sound",
+ "tone"
+ ]
+ },
+ "asterisk": {
+ "unicode": "002A-20E3",
+ "unicode_alternates": "002a-fe0f-20e3",
+ "name": "keycap asterisk",
+ "shortname": ":asterisk:",
+ "category": "symbols",
+ "aliases": [
+ ":keycap_asterisk:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "*",
+ "star",
+ "symbol"
+ ]
},
"astonished": {
"unicode": "1F632",
@@ -581,7 +1074,13 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["face", "xox", "shocked", "surprise", "astonished"],
+ "keywords": [
+ "face",
+ "xox",
+ "shocked",
+ "surprise",
+ "astonished"
+ ],
"moji": "😲"
},
"athletic_shoe": {
@@ -592,7 +1091,10 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["shoes", "sports"],
+ "keywords": [
+ "shoes",
+ "sports"
+ ],
"moji": "👟"
},
"atm": {
@@ -603,9 +1105,38 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["atm", "cash", "withdrawal", "money", "deposit", "financial", "bank", "adam", "payday", "bank", "blue-square", "cash", "money", "payment"],
+ "keywords": [
+ "atm",
+ "cash",
+ "withdrawal",
+ "money",
+ "deposit",
+ "financial",
+ "bank",
+ "adam",
+ "payday",
+ "bank",
+ "blue-square",
+ "cash",
+ "money",
+ "payment"
+ ],
"moji": "🏧"
},
+ "atom": {
+ "unicode": "269B",
+ "unicode_alternates": "",
+ "name": "atom symbol",
+ "shortname": ":atom:",
+ "category": "symbols",
+ "aliases": [
+ ":atom_symbol:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "atheist"
+ ]
+ },
"b": {
"unicode": "1F171",
"unicode_alternates": [],
@@ -614,7 +1145,11 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["alphabet", "letter", "red-square"],
+ "keywords": [
+ "alphabet",
+ "letter",
+ "red-square"
+ ],
"moji": "🅱"
},
"baby": {
@@ -625,7 +1160,11 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["boy", "child", "infant"],
+ "keywords": [
+ "boy",
+ "child",
+ "infant"
+ ],
"moji": "👶"
},
"baby_bottle": {
@@ -636,7 +1175,17 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["container", "food", "baby", "bottle", "milk", "mother", "nipple", "newborn", "formula"],
+ "keywords": [
+ "container",
+ "food",
+ "baby",
+ "bottle",
+ "milk",
+ "mother",
+ "nipple",
+ "newborn",
+ "formula"
+ ],
"moji": "🍼"
},
"baby_chick": {
@@ -647,7 +1196,17 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "chicken", "chick", "baby", "bird", "chicken", "young", "woman", "cute"],
+ "keywords": [
+ "animal",
+ "chicken",
+ "chick",
+ "baby",
+ "bird",
+ "chicken",
+ "young",
+ "woman",
+ "cute"
+ ],
"moji": "🐤"
},
"baby_symbol": {
@@ -658,9 +1217,89 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["child", "orange-square", "baby", "crawl", "newborn", "human", "diaper", "small", "babe"],
+ "keywords": [
+ "child",
+ "orange-square",
+ "baby",
+ "crawl",
+ "newborn",
+ "human",
+ "diaper",
+ "small",
+ "babe"
+ ],
"moji": "🚼"
},
+ "baby_tone1": {
+ "unicode": "1F476-1F3FB",
+ "unicode_alternates": "",
+ "name": "baby tone 1",
+ "shortname": ":baby_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "child",
+ "infant",
+ "toddler"
+ ]
+ },
+ "baby_tone2": {
+ "unicode": "1F476-1F3FC",
+ "unicode_alternates": "",
+ "name": "baby tone 2",
+ "shortname": ":baby_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "child",
+ "infant",
+ "toddler"
+ ]
+ },
+ "baby_tone3": {
+ "unicode": "1F476-1F3FD",
+ "unicode_alternates": "",
+ "name": "baby tone 3",
+ "shortname": ":baby_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "child",
+ "infant",
+ "toddler"
+ ]
+ },
+ "baby_tone4": {
+ "unicode": "1F476-1F3FE",
+ "unicode_alternates": "",
+ "name": "baby tone 4",
+ "shortname": ":baby_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "child",
+ "infant",
+ "toddler"
+ ]
+ },
+ "baby_tone5": {
+ "unicode": "1F476-1F3FF",
+ "unicode_alternates": "",
+ "name": "baby tone 5",
+ "shortname": ":baby_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "child",
+ "infant",
+ "toddler"
+ ]
+ },
"back": {
"unicode": "1F519",
"unicode_alternates": [],
@@ -669,9 +1308,21 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["arrow"],
+ "keywords": [
+ "arrow"
+ ],
"moji": "🔙"
},
+ "badminton": {
+ "unicode": "1F3F8",
+ "unicode_alternates": "",
+ "name": "badminton racquet",
+ "shortname": ":badminton:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": []
+ },
"baggage_claim": {
"unicode": "1F6C4",
"unicode_alternates": [],
@@ -680,7 +1331,15 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["airport", "blue-square", "transport", "bag", "baggage", "luggage", "travel"],
+ "keywords": [
+ "airport",
+ "blue-square",
+ "transport",
+ "bag",
+ "baggage",
+ "luggage",
+ "travel"
+ ],
"moji": "🛄"
},
"balloon": {
@@ -691,7 +1350,17 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["celebration", "party", "balloon", "birthday", "celebration", "helium", "gas", "children", "float"],
+ "keywords": [
+ "celebration",
+ "party",
+ "balloon",
+ "birthday",
+ "celebration",
+ "helium",
+ "gas",
+ "children",
+ "float"
+ ],
"moji": "🎈"
},
"ballot_box": {
@@ -700,9 +1369,13 @@
"name": "ballot box with ballot",
"shortname": ":ballot_box:",
"category": "objects_symbols",
- "aliases": [":ballot_box_with_ballot:"],
+ "aliases": [
+ ":ballot_box_with_ballot:"
+ ],
"aliases_ascii": [],
- "keywords": ["vote"]
+ "keywords": [
+ "vote"
+ ]
},
"ballot_box_check": {
"unicode": "1F5F9",
@@ -710,19 +1383,29 @@
"name": "ballot box with bold check",
"shortname": ":ballot_box_check:",
"category": "objects_symbols",
- "aliases": [":ballot_box_with_bold_check:"],
+ "aliases": [
+ ":ballot_box_with_bold_check:"
+ ],
"aliases_ascii": [],
- "keywords": ["mark", "vote"]
+ "keywords": [
+ "mark",
+ "vote"
+ ]
},
"ballot_box_with_check": {
"unicode": "2611",
- "unicode_alternates": ["2611-FE0F"],
+ "unicode_alternates": [
+ "2611-FE0F"
+ ],
"name": "ballot box with check",
"shortname": ":ballot_box_with_check:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["agree", "ok"],
+ "keywords": [
+ "agree",
+ "ok"
+ ],
"moji": "☑"
},
"ballot_box_x": {
@@ -731,9 +1414,14 @@
"name": "ballot box with script x",
"shortname": ":ballot_box_x:",
"category": "objects_symbols",
- "aliases": [":ballot_box_with_script_x:"],
+ "aliases": [
+ ":ballot_box_with_script_x:"
+ ],
"aliases_ascii": [],
- "keywords": ["mark", "vote"]
+ "keywords": [
+ "mark",
+ "vote"
+ ]
},
"ballot_x": {
"unicode": "1F5F4",
@@ -741,9 +1429,14 @@
"name": "ballot script x",
"shortname": ":ballot_x:",
"category": "objects_symbols",
- "aliases": [":ballot_script_x:"],
+ "aliases": [
+ ":ballot_script_x:"
+ ],
"aliases_ascii": [],
- "keywords": ["mark", "vote"]
+ "keywords": [
+ "mark",
+ "vote"
+ ]
},
"bamboo": {
"unicode": "1F38D",
@@ -753,7 +1446,25 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["nature", "plant", "vegetable", "pine", "bamboo", "decoration", "new", "years", "spirits", "harvest", "prosperity", "longevity", "fortune", "luck", "welcome", "farming", "agriculture"],
+ "keywords": [
+ "nature",
+ "plant",
+ "vegetable",
+ "pine",
+ "bamboo",
+ "decoration",
+ "new",
+ "years",
+ "spirits",
+ "harvest",
+ "prosperity",
+ "longevity",
+ "fortune",
+ "luck",
+ "welcome",
+ "farming",
+ "agriculture"
+ ],
"moji": "🎍"
},
"banana": {
@@ -764,18 +1475,29 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["food", "fruit", "banana", "peel", "bunch"],
+ "keywords": [
+ "food",
+ "fruit",
+ "banana",
+ "peel",
+ "bunch"
+ ],
"moji": "🍌"
},
"bangbang": {
"unicode": "203C",
- "unicode_alternates": ["203C-FE0F"],
+ "unicode_alternates": [
+ "203C-FE0F"
+ ],
"name": "double exclamation mark",
"shortname": ":bangbang:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["exclamation", "surprise"],
+ "keywords": [
+ "exclamation",
+ "surprise"
+ ],
"moji": "‼"
},
"bank": {
@@ -786,7 +1508,9 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["building"],
+ "keywords": [
+ "building"
+ ],
"moji": "🏦"
},
"bar_chart": {
@@ -797,7 +1521,11 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["graph", "presentation", "stats"],
+ "keywords": [
+ "graph",
+ "presentation",
+ "stats"
+ ],
"moji": "📊"
},
"barber": {
@@ -808,18 +1536,28 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["hair", "salon", "style"],
+ "keywords": [
+ "hair",
+ "salon",
+ "style"
+ ],
"moji": "💈"
},
"baseball": {
"unicode": "26BE",
- "unicode_alternates": ["26BE-FE0F"],
+ "unicode_alternates": [
+ "26BE-FE0F"
+ ],
"name": "baseball",
"shortname": ":baseball:",
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["MLB", "balls", "sports"],
+ "keywords": [
+ "MLB",
+ "balls",
+ "sports"
+ ],
"moji": "⚾"
},
"basketball": {
@@ -830,9 +1568,95 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["NBA", "balls", "sports", "basketball", "bball", "dribble", "hoop", "net", "swish", "rip city"],
+ "keywords": [
+ "NBA",
+ "balls",
+ "sports",
+ "basketball",
+ "bball",
+ "dribble",
+ "hoop",
+ "net",
+ "swish",
+ "rip city"
+ ],
"moji": "🏀"
},
+ "basketball_player": {
+ "unicode": "26F9",
+ "unicode_alternates": "",
+ "name": "person with ball",
+ "shortname": ":basketball_player:",
+ "category": "activity",
+ "aliases": [
+ ":person_with_ball:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "sport",
+ "travel"
+ ]
+ },
+ "basketball_player_tone1": {
+ "unicode": "26F9-1F3FB",
+ "unicode_alternates": "",
+ "name": "person with ball tone 1",
+ "shortname": ":basketball_player_tone1:",
+ "category": "activity",
+ "aliases": [
+ ":person_with_ball_tone1:"
+ ],
+ "aliases_ascii": [],
+ "keywords": []
+ },
+ "basketball_player_tone2": {
+ "unicode": "26F9-1F3FC",
+ "unicode_alternates": "",
+ "name": "person with ball tone 2",
+ "shortname": ":basketball_player_tone2:",
+ "category": "activity",
+ "aliases": [
+ ":person_with_ball_tone2:"
+ ],
+ "aliases_ascii": [],
+ "keywords": []
+ },
+ "basketball_player_tone3": {
+ "unicode": "26F9-1F3FD",
+ "unicode_alternates": "",
+ "name": "person with ball tone 3",
+ "shortname": ":basketball_player_tone3:",
+ "category": "activity",
+ "aliases": [
+ ":person_with_ball_tone3:"
+ ],
+ "aliases_ascii": [],
+ "keywords": []
+ },
+ "basketball_player_tone4": {
+ "unicode": "26F9-1F3FE",
+ "unicode_alternates": "",
+ "name": "person with ball tone 4",
+ "shortname": ":basketball_player_tone4:",
+ "category": "activity",
+ "aliases": [
+ ":person_with_ball_tone4:"
+ ],
+ "aliases_ascii": [],
+ "keywords": []
+ },
+ "basketball_player_tone5": {
+ "unicode": "26F9-1F3FF",
+ "unicode_alternates": "",
+ "name": "person with ball tone 5",
+ "shortname": ":basketball_player_tone5:",
+ "category": "activity",
+ "aliases": [
+ ":person_with_ball_tone5:"
+ ],
+ "aliases_ascii": [],
+ "keywords": []
+ },
"bath": {
"unicode": "1F6C0",
"unicode_alternates": [],
@@ -841,9 +1665,140 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["clean", "shower", "bath", "tub", "basin", "wash", "bubble", "soak", "bathroom", "soap", "water", "clean", "shampoo", "lather", "water"],
+ "keywords": [
+ "clean",
+ "shower",
+ "bath",
+ "tub",
+ "basin",
+ "wash",
+ "bubble",
+ "soak",
+ "bathroom",
+ "soap",
+ "water",
+ "clean",
+ "shampoo",
+ "lather",
+ "water"
+ ],
"moji": "🛀"
},
+ "bath_tone1": {
+ "unicode": "1F6C0-1F3FB",
+ "unicode_alternates": "",
+ "name": "bath tone 1",
+ "shortname": ":bath_tone1:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "shower",
+ "tub",
+ "basin",
+ "wash",
+ "bubble",
+ "soak",
+ "bathroom",
+ "soap",
+ "water",
+ "clean",
+ "shampoo",
+ "lather"
+ ]
+ },
+ "bath_tone2": {
+ "unicode": "1F6C0-1F3FC",
+ "unicode_alternates": "",
+ "name": "bath tone 2",
+ "shortname": ":bath_tone2:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "shower",
+ "tub",
+ "basin",
+ "wash",
+ "bubble",
+ "soak",
+ "bathroom",
+ "soap",
+ "water",
+ "clean",
+ "shampoo",
+ "lather"
+ ]
+ },
+ "bath_tone3": {
+ "unicode": "1F6C0-1F3FD",
+ "unicode_alternates": "",
+ "name": "bath tone 3",
+ "shortname": ":bath_tone3:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "shower",
+ "tub",
+ "basin",
+ "wash",
+ "bubble",
+ "soak",
+ "bathroom",
+ "soap",
+ "water",
+ "clean",
+ "shampoo",
+ "lather"
+ ]
+ },
+ "bath_tone4": {
+ "unicode": "1F6C0-1F3FE",
+ "unicode_alternates": "",
+ "name": "bath tone 4",
+ "shortname": ":bath_tone4:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "shower",
+ "tub",
+ "basin",
+ "wash",
+ "bubble",
+ "soak",
+ "bathroom",
+ "soap",
+ "water",
+ "clean",
+ "shampoo",
+ "lather"
+ ]
+ },
+ "bath_tone5": {
+ "unicode": "1F6C0-1F3FF",
+ "unicode_alternates": "",
+ "name": "bath tone 5",
+ "shortname": ":bath_tone5:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "shower",
+ "tub",
+ "basin",
+ "wash",
+ "bubble",
+ "soak",
+ "bathroom",
+ "soap",
+ "water",
+ "clean",
+ "shampoo",
+ "lather"
+ ]
+ },
"bathtub": {
"unicode": "1F6C1",
"unicode_alternates": [],
@@ -852,7 +1807,23 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["clean", "shower", "bath", "tub", "basin", "wash", "bubble", "soak", "bathroom", "soap", "water", "clean", "shampoo", "lather", "water"],
+ "keywords": [
+ "clean",
+ "shower",
+ "bath",
+ "tub",
+ "basin",
+ "wash",
+ "bubble",
+ "soak",
+ "bathroom",
+ "soap",
+ "water",
+ "clean",
+ "shampoo",
+ "lather",
+ "water"
+ ],
"moji": "🛁"
},
"battery": {
@@ -863,7 +1834,11 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["energy", "power", "sustain"],
+ "keywords": [
+ "energy",
+ "power",
+ "sustain"
+ ],
"moji": "🔋"
},
"beach": {
@@ -872,9 +1847,38 @@
"name": "beach with umbrella",
"shortname": ":beach:",
"category": "travel_places",
- "aliases": [":beach_with_umbrella:"],
- "aliases_ascii": [],
- "keywords": ["sand", "sun", "surf", "vacation", "relaxation", "tanning", "tan", "swimming"]
+ "aliases": [
+ ":beach_with_umbrella:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "sand",
+ "sun",
+ "surf",
+ "vacation",
+ "relaxation",
+ "tanning",
+ "tan",
+ "swimming"
+ ]
+ },
+ "beach_umbrella": {
+ "unicode": "26F1",
+ "unicode_alternates": "",
+ "name": "umbrella on ground",
+ "shortname": ":beach_umbrella:",
+ "category": "objects",
+ "aliases": [
+ ":umbrella_on_ground:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "nature",
+ "rain",
+ "sun",
+ "travel",
+ "weather"
+ ]
},
"bear": {
"unicode": "1F43B",
@@ -884,7 +1888,10 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "nature"],
+ "keywords": [
+ "animal",
+ "nature"
+ ],
"moji": "🐻"
},
"bed": {
@@ -895,7 +1902,15 @@
"category": "travel_places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["sleep", "sex", "queen", "full", "twin", "king", "mattress"]
+ "keywords": [
+ "sleep",
+ "sex",
+ "queen",
+ "full",
+ "twin",
+ "king",
+ "mattress"
+ ]
},
"bee": {
"unicode": "1F41D",
@@ -905,7 +1920,20 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "insect", "bee", "queen", "buzz", "flower", "pollen", "sting", "honey", "hive", "bumble", "pollination"],
+ "keywords": [
+ "animal",
+ "insect",
+ "bee",
+ "queen",
+ "buzz",
+ "flower",
+ "pollen",
+ "sting",
+ "honey",
+ "hive",
+ "bumble",
+ "pollination"
+ ],
"moji": "🐝"
},
"beer": {
@@ -916,7 +1944,26 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["beverage", "drink", "drunk", "party", "pub", "relax", "beer", "hops", "mug", "barley", "malt", "yeast", "portland", "oregon", "brewery", "micro", "pint", "boot"],
+ "keywords": [
+ "beverage",
+ "drink",
+ "drunk",
+ "party",
+ "pub",
+ "relax",
+ "beer",
+ "hops",
+ "mug",
+ "barley",
+ "malt",
+ "yeast",
+ "portland",
+ "oregon",
+ "brewery",
+ "micro",
+ "pint",
+ "boot"
+ ],
"moji": "🍺"
},
"beers": {
@@ -927,7 +1974,25 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["beverage", "drink", "drunk", "party", "pub", "relax", "beer", "beers", "cheers", "mug", "toast", "celebrate", "pub", "bar", "jolly", "hops", "clink"],
+ "keywords": [
+ "beverage",
+ "drink",
+ "drunk",
+ "party",
+ "pub",
+ "relax",
+ "beer",
+ "beers",
+ "cheers",
+ "mug",
+ "toast",
+ "celebrate",
+ "pub",
+ "bar",
+ "jolly",
+ "hops",
+ "clink"
+ ],
"moji": "🍻"
},
"beetle": {
@@ -938,7 +2003,19 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["insect", "nature", "lady", "bug", "ladybug", "ladybird", "beetle", "cow", "lady cow", "insect", "endearment"],
+ "keywords": [
+ "insect",
+ "nature",
+ "lady",
+ "bug",
+ "ladybug",
+ "ladybird",
+ "beetle",
+ "cow",
+ "lady cow",
+ "insect",
+ "endearment"
+ ],
"moji": "🐞"
},
"beginner": {
@@ -949,7 +2026,10 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["badge", "shield"],
+ "keywords": [
+ "badge",
+ "shield"
+ ],
"moji": "🔰"
},
"bell": {
@@ -960,7 +2040,13 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["chime", "christmas", "notification", "sound", "xmas"],
+ "keywords": [
+ "chime",
+ "christmas",
+ "notification",
+ "sound",
+ "xmas"
+ ],
"moji": "🔔"
},
"bellhop": {
@@ -969,9 +2055,15 @@
"name": "bellhop bell",
"shortname": ":bellhop:",
"category": "travel_places",
- "aliases": [":bellhop_bell:"],
+ "aliases": [
+ ":bellhop_bell:"
+ ],
"aliases_ascii": [],
- "keywords": ["hotel", "porter", "ding"]
+ "keywords": [
+ "hotel",
+ "porter",
+ "ding"
+ ]
},
"bento": {
"unicode": "1F371",
@@ -981,7 +2073,19 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["box", "food", "japanese", "bento", "japanese", "rice", "meal", "box", "obento", "convenient", "lunchbox"],
+ "keywords": [
+ "box",
+ "food",
+ "japanese",
+ "bento",
+ "japanese",
+ "rice",
+ "meal",
+ "box",
+ "obento",
+ "convenient",
+ "lunchbox"
+ ],
"moji": "🍱"
},
"bicyclist": {
@@ -992,9 +2096,115 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["bike", "exercise", "hipster", "sports", "bicyclist", "road", "bike", "pedal", "bicycle", "transportation"],
+ "keywords": [
+ "bike",
+ "exercise",
+ "hipster",
+ "sports",
+ "bicyclist",
+ "road",
+ "bike",
+ "pedal",
+ "bicycle",
+ "transportation"
+ ],
"moji": "🚴"
},
+ "bicyclist_tone1": {
+ "unicode": "1F6B4-1F3FB",
+ "unicode_alternates": "",
+ "name": "bicyclist tone 1",
+ "shortname": ":bicyclist_tone1:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "bike",
+ "exercise",
+ "hipster",
+ "sport",
+ "road",
+ "pedal",
+ "bicycle",
+ "transportation"
+ ]
+ },
+ "bicyclist_tone2": {
+ "unicode": "1F6B4-1F3FC",
+ "unicode_alternates": "",
+ "name": "bicyclist tone 2",
+ "shortname": ":bicyclist_tone2:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "bike",
+ "exercise",
+ "hipster",
+ "sport",
+ "road",
+ "pedal",
+ "bicycle",
+ "transportation"
+ ]
+ },
+ "bicyclist_tone3": {
+ "unicode": "1F6B4-1F3FD",
+ "unicode_alternates": "",
+ "name": "bicyclist tone 3",
+ "shortname": ":bicyclist_tone3:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "bike",
+ "exercise",
+ "hipster",
+ "sport",
+ "road",
+ "pedal",
+ "bicycle",
+ "transportation"
+ ]
+ },
+ "bicyclist_tone4": {
+ "unicode": "1F6B4-1F3FE",
+ "unicode_alternates": "",
+ "name": "bicyclist tone 4",
+ "shortname": ":bicyclist_tone4:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "bike",
+ "exercise",
+ "hipster",
+ "sport",
+ "road",
+ "pedal",
+ "bicycle",
+ "transportation"
+ ]
+ },
+ "bicyclist_tone5": {
+ "unicode": "1F6B4-1F3FF",
+ "unicode_alternates": "",
+ "name": "bicyclist tone 5",
+ "shortname": ":bicyclist_tone5:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "bike",
+ "exercise",
+ "hipster",
+ "sport",
+ "road",
+ "pedal",
+ "bicycle",
+ "transportation"
+ ]
+ },
"bike": {
"unicode": "1F6B2",
"unicode_alternates": [],
@@ -1003,7 +2213,16 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["bicycle", "exercise", "hipster", "sports", "bike", "pedal", "bicycle", "transportation"],
+ "keywords": [
+ "bicycle",
+ "exercise",
+ "hipster",
+ "sports",
+ "bike",
+ "pedal",
+ "bicycle",
+ "transportation"
+ ],
"moji": "🚲"
},
"bikini": {
@@ -1014,9 +2233,30 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["beach", "fashion", "female", "girl", "swimming", "woman"],
+ "keywords": [
+ "beach",
+ "fashion",
+ "female",
+ "girl",
+ "swimming",
+ "woman"
+ ],
"moji": "👙"
},
+ "biohazard": {
+ "unicode": "2623",
+ "unicode_alternates": "",
+ "name": "biohazard sign",
+ "shortname": ":biohazard:",
+ "category": "symbols",
+ "aliases": [
+ ":biohazard_sign:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "symbol"
+ ]
+ },
"bird": {
"unicode": "1F426",
"unicode_alternates": [],
@@ -1025,7 +2265,12 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "fly", "nature", "tweet"],
+ "keywords": [
+ "animal",
+ "fly",
+ "nature",
+ "tweet"
+ ],
"moji": "🐦"
},
"birthday": {
@@ -1036,18 +2281,31 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["cake", "party", "birthday", "birth", "cake", "dessert", "wish", "celebrate"],
+ "keywords": [
+ "cake",
+ "party",
+ "birthday",
+ "birth",
+ "cake",
+ "dessert",
+ "wish",
+ "celebrate"
+ ],
"moji": "🎂"
},
"black_circle": {
"unicode": "26AB",
- "unicode_alternates": ["26AB-FE0F"],
+ "unicode_alternates": [
+ "26AB-FE0F"
+ ],
"name": "medium black circle",
"shortname": ":black_circle:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["shape"],
+ "keywords": [
+ "shape"
+ ],
"moji": "⚫"
},
"black_joker": {
@@ -1058,23 +2316,33 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["cards", "game", "poker"],
+ "keywords": [
+ "cards",
+ "game",
+ "poker"
+ ],
"moji": "🃏"
},
"black_large_square": {
"unicode": "2B1B",
- "unicode_alternates": ["2B1B-FE0F"],
+ "unicode_alternates": [
+ "2B1B-FE0F"
+ ],
"name": "black large square",
"shortname": ":black_large_square:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["shape"],
+ "keywords": [
+ "shape"
+ ],
"moji": "⬛"
},
"black_medium_small_square": {
"unicode": "25FE",
- "unicode_alternates": ["25FE-FE0F"],
+ "unicode_alternates": [
+ "25FE-FE0F"
+ ],
"name": "black medium small square",
"shortname": ":black_medium_small_square:",
"category": "other",
@@ -1085,29 +2353,40 @@
},
"black_medium_square": {
"unicode": "25FC",
- "unicode_alternates": ["25FC-FE0F"],
+ "unicode_alternates": [
+ "25FC-FE0F"
+ ],
"name": "black medium square",
"shortname": ":black_medium_square:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["shape"],
+ "keywords": [
+ "shape"
+ ],
"moji": "◼"
},
"black_nib": {
"unicode": "2712",
- "unicode_alternates": ["2712-FE0F"],
+ "unicode_alternates": [
+ "2712-FE0F"
+ ],
"name": "black nib",
"shortname": ":black_nib:",
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["pen", "stationery"],
+ "keywords": [
+ "pen",
+ "stationery"
+ ],
"moji": "✒"
},
"black_small_square": {
"unicode": "25AA",
- "unicode_alternates": ["25AA-FE0F"],
+ "unicode_alternates": [
+ "25AA-FE0F"
+ ],
"name": "black small square",
"shortname": ":black_small_square:",
"category": "other",
@@ -1124,7 +2403,9 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["frame"],
+ "keywords": [
+ "frame"
+ ],
"moji": "🔲"
},
"blossom": {
@@ -1135,7 +2416,14 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["flowers", "nature", "yellow", "blossom", "daisy", "flower"],
+ "keywords": [
+ "flowers",
+ "nature",
+ "yellow",
+ "blossom",
+ "daisy",
+ "flower"
+ ],
"moji": "🌼"
},
"blowfish": {
@@ -1146,7 +2434,19 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["food", "nature", "ocean", "sea", "blowfish", "pufferfish", "puffer", "ballonfish", "toadfish", "fugu fish", "sushi"],
+ "keywords": [
+ "food",
+ "nature",
+ "ocean",
+ "sea",
+ "blowfish",
+ "pufferfish",
+ "puffer",
+ "ballonfish",
+ "toadfish",
+ "fugu fish",
+ "sushi"
+ ],
"moji": "🐡"
},
"blue_book": {
@@ -1157,7 +2457,11 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["knowledge", "library", "read"],
+ "keywords": [
+ "knowledge",
+ "library",
+ "read"
+ ],
"moji": "📘"
},
"blue_car": {
@@ -1168,7 +2472,13 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["car", "suv", "car", "wagon", "automobile"],
+ "keywords": [
+ "car",
+ "suv",
+ "car",
+ "wagon",
+ "automobile"
+ ],
"moji": "🚙"
},
"blue_heart": {
@@ -1179,7 +2489,19 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["affection", "like", "love", "valentines", "blue", "heart", "love", "stability", "truth", "loyalty", "trust"],
+ "keywords": [
+ "affection",
+ "like",
+ "love",
+ "valentines",
+ "blue",
+ "heart",
+ "love",
+ "stability",
+ "truth",
+ "loyalty",
+ "trust"
+ ],
"moji": "💙"
},
"blush": {
@@ -1190,7 +2512,18 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["crush", "embarrassed", "face", "flushed", "happy", "shy", "smile", "smiling", "smile", "smiley"],
+ "keywords": [
+ "crush",
+ "embarrassed",
+ "face",
+ "flushed",
+ "happy",
+ "shy",
+ "smile",
+ "smiling",
+ "smile",
+ "smiley"
+ ],
"moji": "😊"
},
"boar": {
@@ -1201,7 +2534,10 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "nature"],
+ "keywords": [
+ "animal",
+ "nature"
+ ],
"moji": "🐗"
},
"bomb": {
@@ -1212,7 +2548,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["boom", "explode"],
+ "keywords": [
+ "boom",
+ "explode"
+ ],
"moji": "💣"
},
"book": {
@@ -1223,7 +2562,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["library", "literature"],
+ "keywords": [
+ "library",
+ "literature"
+ ],
"moji": "📖"
},
"book2": {
@@ -1234,7 +2576,13 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["library", "literature", "novel", "reading", "story"]
+ "keywords": [
+ "library",
+ "literature",
+ "novel",
+ "reading",
+ "story"
+ ]
},
"bookmark": {
"unicode": "1F516",
@@ -1244,7 +2592,9 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["favorite"],
+ "keywords": [
+ "favorite"
+ ],
"moji": "🔖"
},
"bookmark_tabs": {
@@ -1255,7 +2605,9 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["favorite"],
+ "keywords": [
+ "favorite"
+ ],
"moji": "📑"
},
"books": {
@@ -1266,7 +2618,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["library", "literature"],
+ "keywords": [
+ "library",
+ "literature"
+ ],
"moji": "📚"
},
"boom": {
@@ -1277,7 +2632,18 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["bomb", "explode", "explosion", "boom", "bang", "collision", "fire", "emphasis", "wow", "bam"],
+ "keywords": [
+ "bomb",
+ "explode",
+ "explosion",
+ "boom",
+ "bang",
+ "collision",
+ "fire",
+ "emphasis",
+ "wow",
+ "bam"
+ ],
"moji": "💥"
},
"boot": {
@@ -1288,7 +2654,10 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["fashion", "shoes"],
+ "keywords": [
+ "fashion",
+ "shoes"
+ ],
"moji": "👢"
},
"bouquet": {
@@ -1299,7 +2668,10 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["flowers", "nature"],
+ "keywords": [
+ "flowers",
+ "nature"
+ ],
"moji": "💐"
},
"bouquet2": {
@@ -1308,9 +2680,16 @@
"name": "bouquet of flowers",
"shortname": ":bouquet2:",
"category": "celebration",
- "aliases": [":bouquet_of_flowers:"],
+ "aliases": [
+ ":bouquet_of_flowers:"
+ ],
"aliases_ascii": [],
- "keywords": ["nature", "marriage", "wedding", "bride"]
+ "keywords": [
+ "nature",
+ "marriage",
+ "wedding",
+ "bride"
+ ]
},
"bow": {
"unicode": "1F647",
@@ -1320,9 +2699,120 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["boy", "male", "man", "sorry", "bow", "respect", "curtsy", "bend"],
+ "keywords": [
+ "boy",
+ "male",
+ "man",
+ "sorry",
+ "bow",
+ "respect",
+ "curtsy",
+ "bend"
+ ],
"moji": "🙇"
},
+ "bow_and_arrow": {
+ "unicode": "1F3F9",
+ "unicode_alternates": "",
+ "name": "bow and arrow",
+ "shortname": ":bow_and_arrow:",
+ "category": "activity",
+ "aliases": [
+ ":archery:"
+ ],
+ "aliases_ascii": [],
+ "keywords": []
+ },
+ "bow_tone1": {
+ "unicode": "1F647-1F3FB",
+ "unicode_alternates": "",
+ "name": "person bowing deeply tone 1",
+ "shortname": ":bow_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "boy",
+ "male",
+ "man",
+ "sorry",
+ "bow",
+ "respect",
+ "bend"
+ ]
+ },
+ "bow_tone2": {
+ "unicode": "1F647-1F3FC",
+ "unicode_alternates": "",
+ "name": "person bowing deeply tone 2",
+ "shortname": ":bow_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "boy",
+ "male",
+ "man",
+ "sorry",
+ "bow",
+ "respect",
+ "bend"
+ ]
+ },
+ "bow_tone3": {
+ "unicode": "1F647-1F3FD",
+ "unicode_alternates": "",
+ "name": "person bowing deeply tone 3",
+ "shortname": ":bow_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "boy",
+ "male",
+ "man",
+ "sorry",
+ "bow",
+ "respect",
+ "bend"
+ ]
+ },
+ "bow_tone4": {
+ "unicode": "1F647-1F3FE",
+ "unicode_alternates": "",
+ "name": "person bowing deeply tone 4",
+ "shortname": ":bow_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "boy",
+ "male",
+ "man",
+ "sorry",
+ "bow",
+ "respect",
+ "bend"
+ ]
+ },
+ "bow_tone5": {
+ "unicode": "1F647-1F3FF",
+ "unicode_alternates": "",
+ "name": "person bowing deeply tone 5",
+ "shortname": ":bow_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "boy",
+ "male",
+ "man",
+ "sorry",
+ "bow",
+ "respect",
+ "bend"
+ ]
+ },
"bowling": {
"unicode": "1F3B3",
"unicode_alternates": [],
@@ -1331,7 +2821,18 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["fun", "play", "sports", "bowl", "bowling", "ball", "pin", "strike", "spare", "game"],
+ "keywords": [
+ "fun",
+ "play",
+ "sports",
+ "bowl",
+ "bowling",
+ "ball",
+ "pin",
+ "strike",
+ "spare",
+ "game"
+ ],
"moji": "🎳"
},
"boy": {
@@ -1342,9 +2843,83 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["guy", "male", "man"],
+ "keywords": [
+ "guy",
+ "male",
+ "man"
+ ],
"moji": "👦"
},
+ "boy_tone1": {
+ "unicode": "1F466-1F3FB",
+ "unicode_alternates": "",
+ "name": "boy tone 1",
+ "shortname": ":boy_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "male",
+ "kid",
+ "child"
+ ]
+ },
+ "boy_tone2": {
+ "unicode": "1F466-1F3FC",
+ "unicode_alternates": "",
+ "name": "boy tone 2",
+ "shortname": ":boy_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "male",
+ "kid",
+ "child"
+ ]
+ },
+ "boy_tone3": {
+ "unicode": "1F466-1F3FD",
+ "unicode_alternates": "",
+ "name": "boy tone 3",
+ "shortname": ":boy_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "male",
+ "kid",
+ "child"
+ ]
+ },
+ "boy_tone4": {
+ "unicode": "1F466-1F3FE",
+ "unicode_alternates": "",
+ "name": "boy tone 4",
+ "shortname": ":boy_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "male",
+ "kid",
+ "child"
+ ]
+ },
+ "boy_tone5": {
+ "unicode": "1F466-1F3FF",
+ "unicode_alternates": "",
+ "name": "boy tone 5",
+ "shortname": ":boy_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "male",
+ "kid",
+ "child"
+ ]
+ },
"boys_symbol": {
"unicode": "1F6C9",
"unicode_alternates": [],
@@ -1353,7 +2928,10 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["male", "child"]
+ "keywords": [
+ "male",
+ "child"
+ ]
},
"bread": {
"unicode": "1F35E",
@@ -1363,7 +2941,15 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["breakfast", "food", "toast", "wheat", "bread", "loaf", "yeast"],
+ "keywords": [
+ "breakfast",
+ "food",
+ "toast",
+ "wheat",
+ "bread",
+ "loaf",
+ "yeast"
+ ],
"moji": "🍞"
},
"bride_with_veil": {
@@ -1374,9 +2960,121 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["couple", "marriage", "wedding", "bride", "wedding", "planning", "veil", "gown", "dress", "engagement", "white"],
+ "keywords": [
+ "couple",
+ "marriage",
+ "wedding",
+ "bride",
+ "wedding",
+ "planning",
+ "veil",
+ "gown",
+ "dress",
+ "engagement",
+ "white"
+ ],
"moji": "👰"
},
+ "bride_with_veil_tone1": {
+ "unicode": "1F470-1F3FB",
+ "unicode_alternates": "",
+ "name": "bride with veil tone 1",
+ "shortname": ":bride_with_veil_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "couple",
+ "marriage",
+ "wedding",
+ "wedding",
+ "planning",
+ "gown",
+ "dress",
+ "engagement",
+ "white"
+ ]
+ },
+ "bride_with_veil_tone2": {
+ "unicode": "1F470-1F3FC",
+ "unicode_alternates": "",
+ "name": "bride with veil tone 2",
+ "shortname": ":bride_with_veil_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "couple",
+ "marriage",
+ "wedding",
+ "wedding",
+ "planning",
+ "gown",
+ "dress",
+ "engagement",
+ "white"
+ ]
+ },
+ "bride_with_veil_tone3": {
+ "unicode": "1F470-1F3FD",
+ "unicode_alternates": "",
+ "name": "bride with veil tone 3",
+ "shortname": ":bride_with_veil_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "couple",
+ "marriage",
+ "wedding",
+ "wedding",
+ "planning",
+ "gown",
+ "dress",
+ "engagement",
+ "white"
+ ]
+ },
+ "bride_with_veil_tone4": {
+ "unicode": "1F470-1F3FE",
+ "unicode_alternates": "",
+ "name": "bride with veil tone 4",
+ "shortname": ":bride_with_veil_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "couple",
+ "marriage",
+ "wedding",
+ "wedding",
+ "planning",
+ "gown",
+ "dress",
+ "engagement",
+ "white"
+ ]
+ },
+ "bride_with_veil_tone5": {
+ "unicode": "1F470-1F3FF",
+ "unicode_alternates": "",
+ "name": "bride with veil tone 5",
+ "shortname": ":bride_with_veil_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "couple",
+ "marriage",
+ "wedding",
+ "wedding",
+ "planning",
+ "gown",
+ "dress",
+ "engagement",
+ "white"
+ ]
+ },
"bridge_at_night": {
"unicode": "1F309",
"unicode_alternates": [],
@@ -1385,7 +3083,18 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["photo", "sanfrancisco", "bridge", "night", "water", "road", "evening", "suspension", "golden", "gate"],
+ "keywords": [
+ "photo",
+ "sanfrancisco",
+ "bridge",
+ "night",
+ "water",
+ "road",
+ "evening",
+ "suspension",
+ "golden",
+ "gate"
+ ],
"moji": "🌉"
},
"briefcase": {
@@ -1396,7 +3105,11 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["business", "documents", "work"],
+ "keywords": [
+ "business",
+ "documents",
+ "work"
+ ],
"moji": "💼"
},
"broken_heart": {
@@ -1406,8 +3119,13 @@
"shortname": ":broken_heart:",
"category": "emoticons",
"aliases": [],
- "aliases_ascii": ["</3"],
- "keywords": ["sad", "sorry"],
+ "aliases_ascii": [
+ "</3"
+ ],
+ "keywords": [
+ "sad",
+ "sorry"
+ ],
"moji": "💔"
},
"bug": {
@@ -1418,7 +3136,14 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["insect", "nature", "bug", "insect", "virus", "error"],
+ "keywords": [
+ "insect",
+ "nature",
+ "bug",
+ "insect",
+ "virus",
+ "error"
+ ],
"moji": "🐛"
},
"bulb": {
@@ -1429,7 +3154,13 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["electricity", "light", "idea", "bulb", "light"],
+ "keywords": [
+ "electricity",
+ "light",
+ "idea",
+ "bulb",
+ "light"
+ ],
"moji": "💡"
},
"bullettrain_front": {
@@ -1440,7 +3171,12 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["transportation", "train", "bullet", "rail"],
+ "keywords": [
+ "transportation",
+ "train",
+ "bullet",
+ "rail"
+ ],
"moji": "🚅"
},
"bullettrain_side": {
@@ -1451,7 +3187,13 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["transportation", "vehicle", "train", "bullet", "rail"],
+ "keywords": [
+ "transportation",
+ "vehicle",
+ "train",
+ "bullet",
+ "rail"
+ ],
"moji": "🚄"
},
"bullhorn": {
@@ -1462,7 +3204,12 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["sound", "noise", "announcement", "megaphone"]
+ "keywords": [
+ "sound",
+ "noise",
+ "announcement",
+ "megaphone"
+ ]
},
"bullhorn_waves": {
"unicode": "1F56C",
@@ -1470,9 +3217,26 @@
"name": "bullhorn with sound waves",
"shortname": ":bullhorn_waves:",
"category": "objects_symbols",
- "aliases": [":bullhorn_with_sound_waves:"],
+ "aliases": [
+ ":bullhorn_with_sound_waves:"
+ ],
"aliases_ascii": [],
- "keywords": ["sound", "noise", "announcement", "megaphone"]
+ "keywords": [
+ "sound",
+ "noise",
+ "announcement",
+ "megaphone"
+ ]
+ },
+ "burrito": {
+ "unicode": "1F32F",
+ "unicode_alternates": "",
+ "name": "burrito",
+ "shortname": ":burrito:",
+ "category": "foods",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": []
},
"bus": {
"unicode": "1F68C",
@@ -1482,7 +3246,16 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["car", "transportation", "vehicle", "bus", "school", "city", "transportation", "public"],
+ "keywords": [
+ "car",
+ "transportation",
+ "vehicle",
+ "bus",
+ "school",
+ "city",
+ "transportation",
+ "public"
+ ],
"moji": "🚌"
},
"busstop": {
@@ -1493,7 +3266,14 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["transportation", "bus", "stop", "city", "transport", "transportation"],
+ "keywords": [
+ "transportation",
+ "bus",
+ "stop",
+ "city",
+ "transport",
+ "transportation"
+ ],
"moji": "🚏"
},
"bust_in_silhouette": {
@@ -1504,7 +3284,24 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["human", "man", "person", "user", "silhouette", "person", "user", "member", "account", "guest", "icon", "avatar", "profile", "me", "myself", "i"],
+ "keywords": [
+ "human",
+ "man",
+ "person",
+ "user",
+ "silhouette",
+ "person",
+ "user",
+ "member",
+ "account",
+ "guest",
+ "icon",
+ "avatar",
+ "profile",
+ "me",
+ "myself",
+ "i"
+ ],
"moji": "👤"
},
"busts_in_silhouette": {
@@ -1515,7 +3312,22 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["group", "human", "man", "person", "team", "user", "silhouette", "silhouettes", "people", "user", "members", "accounts", "relationship", "shadow"],
+ "keywords": [
+ "group",
+ "human",
+ "man",
+ "person",
+ "team",
+ "user",
+ "silhouette",
+ "silhouettes",
+ "people",
+ "user",
+ "members",
+ "accounts",
+ "relationship",
+ "shadow"
+ ],
"moji": "👥"
},
"cactus": {
@@ -1526,7 +3338,16 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["nature", "plant", "vegetable", "cactus", "desert", "drought", "spike", "poke"],
+ "keywords": [
+ "nature",
+ "plant",
+ "vegetable",
+ "cactus",
+ "desert",
+ "drought",
+ "spike",
+ "poke"
+ ],
"moji": "🌵"
},
"cake": {
@@ -1537,7 +3358,14 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["desert", "food", "cake", "short", "dessert", "strawberry"],
+ "keywords": [
+ "desert",
+ "food",
+ "cake",
+ "short",
+ "dessert",
+ "strawberry"
+ ],
"moji": "🍰"
},
"calculator": {
@@ -1546,9 +3374,17 @@
"name": "pocket calculator",
"shortname": ":calculator:",
"category": "objects_symbols",
- "aliases": [":pocket calculator:"],
- "aliases_ascii": [],
- "keywords": ["add", "subtract", "multiple", "divide", "scientific"]
+ "aliases": [
+ ":pocket calculator:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "add",
+ "subtract",
+ "multiple",
+ "divide",
+ "scientific"
+ ]
},
"calendar": {
"unicode": "1F4C6",
@@ -1558,7 +3394,9 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["schedule"],
+ "keywords": [
+ "schedule"
+ ],
"moji": "📆"
},
"calendar_spiral": {
@@ -1567,9 +3405,15 @@
"name": "spiral calendar pad",
"shortname": ":calendar_spiral:",
"category": "objects_symbols",
- "aliases": [":spiral_calendar_pad:"],
+ "aliases": [
+ ":spiral_calendar_pad:"
+ ],
"aliases_ascii": [],
- "keywords": ["schedule", "date", "day"]
+ "keywords": [
+ "schedule",
+ "date",
+ "day"
+ ]
},
"calling": {
"unicode": "1F4F2",
@@ -1579,7 +3423,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["incoming", "iphone"],
+ "keywords": [
+ "incoming",
+ "iphone"
+ ],
"moji": "📲"
},
"camel": {
@@ -1590,7 +3437,22 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "hot", "nature", "bactrian", "camel", "hump", "desert", "central asia", "heat", "hot", "water", "hump day", "wednesday", "sex"],
+ "keywords": [
+ "animal",
+ "hot",
+ "nature",
+ "bactrian",
+ "camel",
+ "hump",
+ "desert",
+ "central asia",
+ "heat",
+ "hot",
+ "water",
+ "hump day",
+ "wednesday",
+ "sex"
+ ],
"moji": "🐫"
},
"camera": {
@@ -1601,7 +3463,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["gadgets", "photo"],
+ "keywords": [
+ "gadgets",
+ "photo"
+ ],
"moji": "📷"
},
"camera_with_flash": {
@@ -1612,7 +3477,10 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["photo", "picture"]
+ "keywords": [
+ "photo",
+ "picture"
+ ]
},
"camping": {
"unicode": "1F3D5",
@@ -1622,7 +3490,13 @@
"category": "travel_places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["outdoors", "nature", "wilderness", "roughing", "activity"]
+ "keywords": [
+ "outdoors",
+ "nature",
+ "wilderness",
+ "roughing",
+ "activity"
+ ]
},
"cancellation_x": {
"unicode": "1F5D9",
@@ -1632,17 +3506,35 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["cancel", "stop", "delete"]
+ "keywords": [
+ "cancel",
+ "stop",
+ "delete"
+ ]
},
"cancer": {
"unicode": "264B",
- "unicode_alternates": ["264B-FE0F"],
+ "unicode_alternates": [
+ "264B-FE0F"
+ ],
"name": "cancer",
"shortname": ":cancer:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["cancer", "crab", "astrology", "greek", "constellation", "stars", "zodiac", "sign", "sign", "zodiac", "horoscope"],
+ "keywords": [
+ "cancer",
+ "crab",
+ "astrology",
+ "greek",
+ "constellation",
+ "stars",
+ "zodiac",
+ "sign",
+ "sign",
+ "zodiac",
+ "horoscope"
+ ],
"moji": "♋"
},
"candle": {
@@ -1653,7 +3545,10 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["light", "wax"]
+ "keywords": [
+ "light",
+ "wax"
+ ]
},
"candy": {
"unicode": "1F36C",
@@ -1663,7 +3558,14 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["desert", "snack", "candy", "sugar", "sweet", "hard"],
+ "keywords": [
+ "desert",
+ "snack",
+ "candy",
+ "sugar",
+ "sweet",
+ "hard"
+ ],
"moji": "🍬"
},
"capital_abcd": {
@@ -1674,18 +3576,37 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["alphabet", "blue-square", "words"],
+ "keywords": [
+ "alphabet",
+ "blue-square",
+ "words"
+ ],
"moji": "🔠"
},
"capricorn": {
"unicode": "2651",
- "unicode_alternates": ["2651-FE0F"],
+ "unicode_alternates": [
+ "2651-FE0F"
+ ],
"name": "capricorn",
"shortname": ":capricorn:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["capricorn", "sea-goat", "goat-horned", "astrology", "greek", "constellation", "stars", "zodiac", "sign", "sign", "zodiac", "horoscope"],
+ "keywords": [
+ "capricorn",
+ "sea-goat",
+ "goat-horned",
+ "astrology",
+ "greek",
+ "constellation",
+ "stars",
+ "zodiac",
+ "sign",
+ "sign",
+ "zodiac",
+ "horoscope"
+ ],
"moji": "♑"
},
"card_box": {
@@ -1694,9 +3615,14 @@
"name": "card file box",
"shortname": ":card_box:",
"category": "objects_symbols",
- "aliases": [":card_file_box:"],
+ "aliases": [
+ ":card_file_box:"
+ ],
"aliases_ascii": [],
- "keywords": ["index", "organization"]
+ "keywords": [
+ "index",
+ "organization"
+ ]
},
"card_index": {
"unicode": "1F4C7",
@@ -1706,7 +3632,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["business", "stationery"],
+ "keywords": [
+ "business",
+ "stationery"
+ ],
"moji": "📇"
},
"carousel_horse": {
@@ -1717,7 +3646,19 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["carnival", "horse", "photo", "carousel", "horse", "amusement", "park", "ride", "entertainment", "park", "fair"],
+ "keywords": [
+ "carnival",
+ "horse",
+ "photo",
+ "carousel",
+ "horse",
+ "amusement",
+ "park",
+ "ride",
+ "entertainment",
+ "park",
+ "fair"
+ ],
"moji": "🎠"
},
"cartridge": {
@@ -1726,9 +3667,21 @@
"name": "tape cartridge",
"shortname": ":cartridge:",
"category": "objects_symbols",
- "aliases": [":tape_cartridge:"],
- "aliases_ascii": [],
- "keywords": ["oldschool", "save", "technology", "disk", "storage", "information", "computer", "drive", "megabyte"]
+ "aliases": [
+ ":tape_cartridge:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "oldschool",
+ "save",
+ "technology",
+ "disk",
+ "storage",
+ "information",
+ "computer",
+ "drive",
+ "megabyte"
+ ]
},
"cat": {
"unicode": "1F431",
@@ -1738,7 +3691,10 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "meow"],
+ "keywords": [
+ "animal",
+ "meow"
+ ],
"moji": "🐱"
},
"cat2": {
@@ -1749,9 +3705,36 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "meow", "pet", "cat", "kitten", "meow"],
+ "keywords": [
+ "animal",
+ "meow",
+ "pet",
+ "cat",
+ "kitten",
+ "meow"
+ ],
"moji": "🐈"
},
+ "cd": {
+ "unicode": "1F4BF",
+ "unicode_alternates": "",
+ "name": "optical disc",
+ "shortname": ":cd:",
+ "category": "objects",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "disc",
+ "disk",
+ "dvd",
+ "technology",
+ "blu-ray",
+ "cd",
+ "computer",
+ "object",
+ "office"
+ ]
+ },
"celtic_cross": {
"unicode": "1F548",
"unicode_alternates": [],
@@ -1760,7 +3743,35 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["religion", "symbol"]
+ "keywords": [
+ "religion",
+ "symbol"
+ ]
+ },
+ "chains": {
+ "unicode": "26D3",
+ "unicode_alternates": "",
+ "name": "chains",
+ "shortname": ":chains:",
+ "category": "objects",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "chain",
+ "object"
+ ]
+ },
+ "champagne": {
+ "unicode": "1F37E",
+ "unicode_alternates": "",
+ "name": "bottle with popping cork",
+ "shortname": ":champagne:",
+ "category": "foods",
+ "aliases": [
+ ":bottle_with_popping_cork:"
+ ],
+ "aliases_ascii": [],
+ "keywords": []
},
"chart": {
"unicode": "1F4B9",
@@ -1770,7 +3781,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["graph", "green-square"],
+ "keywords": [
+ "graph",
+ "green-square"
+ ],
"moji": "💹"
},
"chart_with_downwards_trend": {
@@ -1781,7 +3795,9 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["graph"],
+ "keywords": [
+ "graph"
+ ],
"moji": "📉"
},
"chart_with_upwards_trend": {
@@ -1792,7 +3808,9 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["graph"],
+ "keywords": [
+ "graph"
+ ],
"moji": "📈"
},
"checkered_flag": {
@@ -1803,9 +3821,33 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["contest", "finishline", "gokart", "rase", "checkered", "chequred", "race", "flag", "finish", "complete", "end"],
+ "keywords": [
+ "contest",
+ "finishline",
+ "gokart",
+ "rase",
+ "checkered",
+ "chequred",
+ "race",
+ "flag",
+ "finish",
+ "complete",
+ "end"
+ ],
"moji": "🏁"
},
+ "cheese": {
+ "unicode": "1F9C0",
+ "unicode_alternates": "",
+ "name": "cheese wedge",
+ "shortname": ":cheese:",
+ "category": "foods",
+ "aliases": [
+ ":cheese_wedge:"
+ ],
+ "aliases_ascii": [],
+ "keywords": []
+ },
"cherries": {
"unicode": "1F352",
"unicode_alternates": [],
@@ -1814,7 +3856,15 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["food", "fruit", "cherry", "cherries", "tree", "fruit", "pit"],
+ "keywords": [
+ "food",
+ "fruit",
+ "cherry",
+ "cherries",
+ "tree",
+ "fruit",
+ "pit"
+ ],
"moji": "🍒"
},
"cherry_blossom": {
@@ -1825,7 +3875,15 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["flower", "nature", "plant", "cherry", "blossom", "tree", "flower"],
+ "keywords": [
+ "flower",
+ "nature",
+ "plant",
+ "cherry",
+ "blossom",
+ "tree",
+ "flower"
+ ],
"moji": "🌸"
},
"chestnut": {
@@ -1836,7 +3894,14 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["food", "squirrel", "chestnut", "roasted", "food", "tree"],
+ "keywords": [
+ "food",
+ "squirrel",
+ "chestnut",
+ "roasted",
+ "food",
+ "tree"
+ ],
"moji": "🌰"
},
"chicken": {
@@ -1847,7 +3912,14 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "cluck", "chicken", "hen", "poultry", "livestock"],
+ "keywords": [
+ "animal",
+ "cluck",
+ "chicken",
+ "hen",
+ "poultry",
+ "livestock"
+ ],
"moji": "🐔"
},
"children_crossing": {
@@ -1858,7 +3930,16 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["school", "children", "kids", "caution", "crossing", "street", "crosswalk", "slow"],
+ "keywords": [
+ "school",
+ "children",
+ "kids",
+ "caution",
+ "crossing",
+ "street",
+ "crosswalk",
+ "slow"
+ ],
"moji": "🚸"
},
"chipmunk": {
@@ -1869,7 +3950,10 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "nature"]
+ "keywords": [
+ "animal",
+ "nature"
+ ]
},
"chocolate_bar": {
"unicode": "1F36B",
@@ -1879,7 +3963,16 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["desert", "food", "snack", "chocolate", "bar", "candy", "coca", "hershey&#039;s"],
+ "keywords": [
+ "desert",
+ "food",
+ "snack",
+ "chocolate",
+ "bar",
+ "candy",
+ "coca",
+ "hershey&#039;s"
+ ],
"moji": "🍫"
},
"christmas_tree": {
@@ -1890,18 +3983,42 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["celebration", "december", "festival", "vacation", "xmas", "christmas", "xmas", "santa", "holiday", "winter", "december", "santa", "evergreen", "ornaments", "jesus", "gifts", "presents"],
+ "keywords": [
+ "celebration",
+ "december",
+ "festival",
+ "vacation",
+ "xmas",
+ "christmas",
+ "xmas",
+ "santa",
+ "holiday",
+ "winter",
+ "december",
+ "santa",
+ "evergreen",
+ "ornaments",
+ "jesus",
+ "gifts",
+ "presents"
+ ],
"moji": "🎄"
},
"church": {
"unicode": "26EA",
- "unicode_alternates": ["26EA-FE0F"],
+ "unicode_alternates": [
+ "26EA-FE0F"
+ ],
"name": "church",
"shortname": ":church:",
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["building", "christ", "religion"],
+ "keywords": [
+ "building",
+ "christ",
+ "religion"
+ ],
"moji": "⛪"
},
"cinema": {
@@ -1912,7 +4029,17 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue-square", "film", "movie", "record", "cinema", "movie", "theater", "motion", "picture"],
+ "keywords": [
+ "blue-square",
+ "film",
+ "movie",
+ "record",
+ "cinema",
+ "movie",
+ "theater",
+ "motion",
+ "picture"
+ ],
"moji": "🎦"
},
"circus_tent": {
@@ -1923,7 +4050,18 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["carnival", "festival", "party", "circus", "tent", "event", "carnival", "big", "top", "canvas"],
+ "keywords": [
+ "carnival",
+ "festival",
+ "party",
+ "circus",
+ "tent",
+ "event",
+ "carnival",
+ "big",
+ "top",
+ "canvas"
+ ],
"moji": "🎪"
},
"city_dusk": {
@@ -1934,7 +4072,18 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["photo", "city", "scape", "sunset", "dusk", "lights", "evening", "metropolitan", "night", "dark"],
+ "keywords": [
+ "photo",
+ "city",
+ "scape",
+ "sunset",
+ "dusk",
+ "lights",
+ "evening",
+ "metropolitan",
+ "night",
+ "dark"
+ ],
"moji": "🌆"
},
"city_sunset": {
@@ -1943,9 +4092,22 @@
"name": "sunset over buildings",
"shortname": ":city_sunset:",
"category": "places",
- "aliases": [":city_sunrise:"],
- "aliases_ascii": [],
- "keywords": ["photo", "city", "scape", "sunrise", "dawn", "light", "morning", "metropolitan", "rise", "sun"],
+ "aliases": [
+ ":city_sunrise:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "photo",
+ "city",
+ "scape",
+ "sunrise",
+ "dawn",
+ "light",
+ "morning",
+ "metropolitan",
+ "rise",
+ "sun"
+ ],
"moji": "🌇"
},
"cityscape": {
@@ -1956,7 +4118,32 @@
"category": "travel_places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["skyscraper", "city", "view", "lights", "buiildings", "metropolis"]
+ "keywords": [
+ "skyscraper",
+ "city",
+ "view",
+ "lights",
+ "buiildings",
+ "metropolis"
+ ]
+ },
+ "cl": {
+ "unicode": "1F191",
+ "unicode_alternates": "",
+ "name": "squared cl",
+ "shortname": ":cl:",
+ "category": "symbols",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "alphabet",
+ "red-square",
+ "words",
+ "cl",
+ "clear",
+ "symbol",
+ "word"
+ ]
},
"clap": {
"unicode": "1F44F",
@@ -1966,9 +4153,120 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["applause", "congrats", "hands", "praise", "clapping", "appreciation", "approval", "sound", "encouragement", "enthusiasm"],
+ "keywords": [
+ "applause",
+ "congrats",
+ "hands",
+ "praise",
+ "clapping",
+ "appreciation",
+ "approval",
+ "sound",
+ "encouragement",
+ "enthusiasm"
+ ],
"moji": "👏"
},
+ "clap_tone1": {
+ "unicode": "1F44F-1F3FB",
+ "unicode_alternates": "",
+ "name": "clapping hands sign tone 1",
+ "shortname": ":clap_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "applause",
+ "congrats",
+ "praise",
+ "clap",
+ "appreciation",
+ "approval",
+ "sound",
+ "encouragement",
+ "enthusiasm"
+ ]
+ },
+ "clap_tone2": {
+ "unicode": "1F44F-1F3FC",
+ "unicode_alternates": "",
+ "name": "clapping hands sign tone 2",
+ "shortname": ":clap_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "applause",
+ "congrats",
+ "praise",
+ "clap",
+ "appreciation",
+ "approval",
+ "sound",
+ "encouragement",
+ "enthusiasm"
+ ]
+ },
+ "clap_tone3": {
+ "unicode": "1F44F-1F3FD",
+ "unicode_alternates": "",
+ "name": "clapping hands sign tone 3",
+ "shortname": ":clap_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "applause",
+ "congrats",
+ "praise",
+ "clap",
+ "appreciation",
+ "approval",
+ "sound",
+ "encouragement",
+ "enthusiasm"
+ ]
+ },
+ "clap_tone4": {
+ "unicode": "1F44F-1F3FE",
+ "unicode_alternates": "",
+ "name": "clapping hands sign tone 4",
+ "shortname": ":clap_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "applause",
+ "congrats",
+ "praise",
+ "clap",
+ "appreciation",
+ "approval",
+ "sound",
+ "encouragement",
+ "enthusiasm"
+ ]
+ },
+ "clap_tone5": {
+ "unicode": "1F44F-1F3FF",
+ "unicode_alternates": "",
+ "name": "clapping hands sign tone 5",
+ "shortname": ":clap_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "applause",
+ "congrats",
+ "praise",
+ "clap",
+ "appreciation",
+ "approval",
+ "sound",
+ "encouragement",
+ "enthusiasm"
+ ]
+ },
"clapper": {
"unicode": "1F3AC",
"unicode_alternates": [],
@@ -1977,7 +4275,17 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["film", "movie", "record", "clapper", "board", "clapboard", "movie", "film", "take"],
+ "keywords": [
+ "film",
+ "movie",
+ "record",
+ "clapper",
+ "board",
+ "clapboard",
+ "movie",
+ "film",
+ "take"
+ ],
"moji": "🎬"
},
"classical_building": {
@@ -1988,7 +4296,13 @@
"category": "travel_places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["government", "architecture", "history", "iconic", "genre"]
+ "keywords": [
+ "government",
+ "architecture",
+ "history",
+ "iconic",
+ "genre"
+ ]
},
"clipboard": {
"unicode": "1F4CB",
@@ -1998,7 +4312,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["documents", "stationery"],
+ "keywords": [
+ "documents",
+ "stationery"
+ ],
"moji": "📋"
},
"clock": {
@@ -2007,9 +4324,13 @@
"name": "mantlepiece clock",
"shortname": ":clock:",
"category": "objects_symbols",
- "aliases": [":mantlepiece_clock:"],
+ "aliases": [
+ ":mantlepiece_clock:"
+ ],
"aliases_ascii": [],
- "keywords": ["time"]
+ "keywords": [
+ "time"
+ ]
},
"clock1": {
"unicode": "1F550",
@@ -2019,7 +4340,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["clock", "time"],
+ "keywords": [
+ "clock",
+ "time"
+ ],
"moji": "🕐"
},
"clock10": {
@@ -2030,7 +4354,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["clock", "time"],
+ "keywords": [
+ "clock",
+ "time"
+ ],
"moji": "🕙"
},
"clock1030": {
@@ -2041,7 +4368,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["clock", "time"],
+ "keywords": [
+ "clock",
+ "time"
+ ],
"moji": "🕥"
},
"clock11": {
@@ -2052,7 +4382,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["clock", "time"],
+ "keywords": [
+ "clock",
+ "time"
+ ],
"moji": "🕚"
},
"clock1130": {
@@ -2063,7 +4396,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["clock", "time"],
+ "keywords": [
+ "clock",
+ "time"
+ ],
"moji": "🕦"
},
"clock12": {
@@ -2074,7 +4410,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["clock", "time"],
+ "keywords": [
+ "clock",
+ "time"
+ ],
"moji": "🕛"
},
"clock1230": {
@@ -2085,7 +4424,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["clock", "time"]
+ "keywords": [
+ "clock",
+ "time"
+ ]
},
"clock130": {
"unicode": "1F55C",
@@ -2095,7 +4437,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["clock", "time"],
+ "keywords": [
+ "clock",
+ "time"
+ ],
"moji": "🕜"
},
"clock2": {
@@ -2106,7 +4451,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["clock", "time"],
+ "keywords": [
+ "clock",
+ "time"
+ ],
"moji": "🕑"
},
"clock230": {
@@ -2117,7 +4465,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["clock", "time"],
+ "keywords": [
+ "clock",
+ "time"
+ ],
"moji": "🕝"
},
"clock3": {
@@ -2128,7 +4479,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["clock", "time"],
+ "keywords": [
+ "clock",
+ "time"
+ ],
"moji": "🕒"
},
"clock330": {
@@ -2139,7 +4493,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["clock", "time"],
+ "keywords": [
+ "clock",
+ "time"
+ ],
"moji": "🕞"
},
"clock4": {
@@ -2150,7 +4507,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["clock", "time"],
+ "keywords": [
+ "clock",
+ "time"
+ ],
"moji": "🕓"
},
"clock430": {
@@ -2161,7 +4521,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["clock", "time"],
+ "keywords": [
+ "clock",
+ "time"
+ ],
"moji": "🕟"
},
"clock5": {
@@ -2172,7 +4535,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["clock", "time"],
+ "keywords": [
+ "clock",
+ "time"
+ ],
"moji": "🕔"
},
"clock530": {
@@ -2183,7 +4549,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["clock", "time"],
+ "keywords": [
+ "clock",
+ "time"
+ ],
"moji": "🕠"
},
"clock6": {
@@ -2194,7 +4563,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["clock", "time"],
+ "keywords": [
+ "clock",
+ "time"
+ ],
"moji": "🕕"
},
"clock630": {
@@ -2205,7 +4577,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["clock", "time"],
+ "keywords": [
+ "clock",
+ "time"
+ ],
"moji": "🕡"
},
"clock7": {
@@ -2216,7 +4591,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["clock", "time"],
+ "keywords": [
+ "clock",
+ "time"
+ ],
"moji": "🕖"
},
"clock730": {
@@ -2227,7 +4605,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["clock", "time"],
+ "keywords": [
+ "clock",
+ "time"
+ ],
"moji": "🕢"
},
"clock8": {
@@ -2238,7 +4619,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["clock", "time"],
+ "keywords": [
+ "clock",
+ "time"
+ ],
"moji": "🕗"
},
"clock830": {
@@ -2249,7 +4633,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["clock", "time"],
+ "keywords": [
+ "clock",
+ "time"
+ ],
"moji": "🕣"
},
"clock9": {
@@ -2260,7 +4647,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["clock", "time"],
+ "keywords": [
+ "clock",
+ "time"
+ ],
"moji": "🕘"
},
"clock930": {
@@ -2271,7 +4661,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["clock", "time"],
+ "keywords": [
+ "clock",
+ "time"
+ ],
"moji": "🕤"
},
"clockwise_arrows": {
@@ -2280,9 +4673,13 @@
"name": "clockwise right and left semicircle arrows",
"shortname": ":clockwise_arrows:",
"category": "objects_symbols",
- "aliases": [":clockwise_right_and_left_semicircle_arrows:"],
+ "aliases": [
+ ":clockwise_right_and_left_semicircle_arrows:"
+ ],
"aliases_ascii": [],
- "keywords": ["sync"]
+ "keywords": [
+ "sync"
+ ]
},
"closed_book": {
"unicode": "1F4D5",
@@ -2292,7 +4689,11 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["knowledge", "library", "read"],
+ "keywords": [
+ "knowledge",
+ "library",
+ "read"
+ ],
"moji": "📕"
},
"closed_lock_with_key": {
@@ -2303,7 +4704,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["privacy", "security"],
+ "keywords": [
+ "privacy",
+ "security"
+ ],
"moji": "🔐"
},
"closed_umbrella": {
@@ -2314,18 +4718,35 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["drizzle", "rain", "weather", "umbrella", "closed", "rain", "moisture", "protection", "sun", "ultraviolet", "uv"],
+ "keywords": [
+ "drizzle",
+ "rain",
+ "weather",
+ "umbrella",
+ "closed",
+ "rain",
+ "moisture",
+ "protection",
+ "sun",
+ "ultraviolet",
+ "uv"
+ ],
"moji": "🌂"
},
"cloud": {
"unicode": "2601",
- "unicode_alternates": ["2601-FE0F"],
+ "unicode_alternates": [
+ "2601-FE0F"
+ ],
"name": "cloud",
"shortname": ":cloud:",
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["sky", "weather"],
+ "keywords": [
+ "sky",
+ "weather"
+ ],
"moji": "☁"
},
"cloud_lightning": {
@@ -2334,9 +4755,14 @@
"name": "cloud with lightning",
"shortname": ":cloud_lightning:",
"category": "nature",
- "aliases": [":cloud_with_lightning:"],
+ "aliases": [
+ ":cloud_with_lightning:"
+ ],
"aliases_ascii": [],
- "keywords": ["weather", "thunder"]
+ "keywords": [
+ "weather",
+ "thunder"
+ ]
},
"cloud_rain": {
"unicode": "1F327",
@@ -2344,9 +4770,14 @@
"name": "cloud with rain",
"shortname": ":cloud_rain:",
"category": "nature",
- "aliases": [":cloud_with_rain:"],
+ "aliases": [
+ ":cloud_with_rain:"
+ ],
"aliases_ascii": [],
- "keywords": ["weather", "wet"]
+ "keywords": [
+ "weather",
+ "wet"
+ ]
},
"cloud_snow": {
"unicode": "1F328",
@@ -2354,9 +4785,14 @@
"name": "cloud with snow",
"shortname": ":cloud_snow:",
"category": "nature",
- "aliases": [":cloud_with_snow:"],
+ "aliases": [
+ ":cloud_with_snow:"
+ ],
"aliases_ascii": [],
- "keywords": ["weather", "cold"]
+ "keywords": [
+ "weather",
+ "cold"
+ ]
},
"cloud_tornado": {
"unicode": "1F32A",
@@ -2364,19 +4800,30 @@
"name": "cloud with tornado",
"shortname": ":cloud_tornado:",
"category": "nature",
- "aliases": [":cloud_with_tornado:"],
+ "aliases": [
+ ":cloud_with_tornado:"
+ ],
"aliases_ascii": [],
- "keywords": ["weather", "destruction", "funnel"]
+ "keywords": [
+ "weather",
+ "destruction",
+ "funnel"
+ ]
},
"clubs": {
"unicode": "2663",
- "unicode_alternates": ["2663-FE0F"],
+ "unicode_alternates": [
+ "2663-FE0F"
+ ],
"name": "black club suit",
"shortname": ":clubs:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["cards", "poker"],
+ "keywords": [
+ "cards",
+ "poker"
+ ],
"moji": "♣"
},
"cocktail": {
@@ -2387,20 +4834,52 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["alcohol", "beverage", "drink", "drunk", "cocktail", "mixed", "drink", "alcohol", "glass", "martini", "bar"],
+ "keywords": [
+ "alcohol",
+ "beverage",
+ "drink",
+ "drunk",
+ "cocktail",
+ "mixed",
+ "drink",
+ "alcohol",
+ "glass",
+ "martini",
+ "bar"
+ ],
"moji": "🍸"
},
"coffee": {
"unicode": "2615",
- "unicode_alternates": ["2615-FE0F"],
+ "unicode_alternates": [
+ "2615-FE0F"
+ ],
"name": "hot beverage",
"shortname": ":coffee:",
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["beverage", "cafe", "drink", "espresso"],
+ "keywords": [
+ "beverage",
+ "cafe",
+ "drink",
+ "espresso"
+ ],
"moji": "☕"
},
+ "coffin": {
+ "unicode": "26B0",
+ "unicode_alternates": "",
+ "name": "coffin",
+ "shortname": ":coffin:",
+ "category": "objects",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "death",
+ "object"
+ ]
+ },
"cold_sweat": {
"unicode": "1F630",
"unicode_alternates": [],
@@ -2409,9 +4888,28 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["face", "nervous", "sweat", "exasperated", "frustrated"],
+ "keywords": [
+ "face",
+ "nervous",
+ "sweat",
+ "exasperated",
+ "frustrated"
+ ],
"moji": "😰"
},
+ "comet": {
+ "unicode": "2604",
+ "unicode_alternates": "",
+ "name": "comet",
+ "shortname": ":comet:",
+ "category": "nature",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "object",
+ "space"
+ ]
+ },
"compression": {
"unicode": "1F5DC",
"unicode_alternates": [],
@@ -2420,7 +4918,9 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["reduce"]
+ "keywords": [
+ "reduce"
+ ]
},
"computer": {
"unicode": "1F4BB",
@@ -2430,7 +4930,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["laptop", "tech"],
+ "keywords": [
+ "laptop",
+ "tech"
+ ],
"moji": "💻"
},
"computer_old": {
@@ -2439,9 +4942,14 @@
"name": "old personal computer",
"shortname": ":computer_old:",
"category": "objects_symbols",
- "aliases": [":old_personal_computer:"],
+ "aliases": [
+ ":old_personal_computer:"
+ ],
"aliases_ascii": [],
- "keywords": ["cpu", "terminal"]
+ "keywords": [
+ "cpu",
+ "terminal"
+ ]
},
"confetti_ball": {
"unicode": "1F38A",
@@ -2451,7 +4959,19 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["festival", "party", "party", "congratulations", "confetti", "ball", "celebrate", "win", "birthday", "new years", "wedding"],
+ "keywords": [
+ "festival",
+ "party",
+ "party",
+ "congratulations",
+ "confetti",
+ "ball",
+ "celebrate",
+ "win",
+ "birthday",
+ "new years",
+ "wedding"
+ ],
"moji": "🎊"
},
"confounded": {
@@ -2462,7 +4982,17 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["confused", "face", "sick", "unwell", "confound", "amaze", "perplex", "puzzle", "mystify"],
+ "keywords": [
+ "confused",
+ "face",
+ "sick",
+ "unwell",
+ "confound",
+ "amaze",
+ "perplex",
+ "puzzle",
+ "mystify"
+ ],
"moji": "😖"
},
"confused": {
@@ -2472,19 +5002,47 @@
"shortname": ":confused:",
"category": "emoticons",
"aliases": [],
- "aliases_ascii": [">:\\", ">:/", ":-/", ":-.", ":/", ":\\", "=/", "=\\", ":L", "=L"],
- "keywords": ["confused", "confuse", "daze", "perplex", "puzzle", "indifference", "skeptical", "undecided", "uneasy", "hesitant"],
+ "aliases_ascii": [
+ ">:\\",
+ ">:/",
+ ":-/",
+ ":-.",
+ ":/",
+ ":\\",
+ "=/",
+ "=\\",
+ ":L",
+ "=L"
+ ],
+ "keywords": [
+ "confused",
+ "confuse",
+ "daze",
+ "perplex",
+ "puzzle",
+ "indifference",
+ "skeptical",
+ "undecided",
+ "uneasy",
+ "hesitant"
+ ],
"moji": "😕"
},
"congratulations": {
"unicode": "3297",
- "unicode_alternates": ["3297-FE0F"],
+ "unicode_alternates": [
+ "3297-FE0F"
+ ],
"name": "circled ideograph congratulation",
"shortname": ":congratulations:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["chinese", "japanese", "kanji"],
+ "keywords": [
+ "chinese",
+ "japanese",
+ "kanji"
+ ],
"moji": "㊗"
},
"construction": {
@@ -2495,9 +5053,29 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["caution", "progress", "wip"],
+ "keywords": [
+ "caution",
+ "progress",
+ "wip"
+ ],
"moji": "🚧"
},
+ "construction_site": {
+ "unicode": "1F3D7",
+ "unicode_alternates": "",
+ "name": "building construction",
+ "shortname": ":construction_site:",
+ "category": "travel",
+ "aliases": [
+ ":building_construction:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "site",
+ "work",
+ "place"
+ ]
+ },
"construction_worker": {
"unicode": "1F477",
"unicode_alternates": [],
@@ -2506,9 +5084,89 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["human", "male", "man", "wip"],
+ "keywords": [
+ "human",
+ "male",
+ "man",
+ "wip"
+ ],
"moji": "👷"
},
+ "construction_worker_tone1": {
+ "unicode": "1F477-1F3FB",
+ "unicode_alternates": "",
+ "name": "construction worker tone 1",
+ "shortname": ":construction_worker_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "human",
+ "male",
+ "man",
+ "wip"
+ ]
+ },
+ "construction_worker_tone2": {
+ "unicode": "1F477-1F3FC",
+ "unicode_alternates": "",
+ "name": "construction worker tone 2",
+ "shortname": ":construction_worker_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "human",
+ "male",
+ "man",
+ "wip"
+ ]
+ },
+ "construction_worker_tone3": {
+ "unicode": "1F477-1F3FD",
+ "unicode_alternates": "",
+ "name": "construction worker tone 3",
+ "shortname": ":construction_worker_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "human",
+ "male",
+ "man",
+ "wip"
+ ]
+ },
+ "construction_worker_tone4": {
+ "unicode": "1F477-1F3FE",
+ "unicode_alternates": "",
+ "name": "construction worker tone 4",
+ "shortname": ":construction_worker_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "human",
+ "male",
+ "man",
+ "wip"
+ ]
+ },
+ "construction_worker_tone5": {
+ "unicode": "1F477-1F3FF",
+ "unicode_alternates": "",
+ "name": "construction worker tone 5",
+ "shortname": ":construction_worker_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "human",
+ "male",
+ "man",
+ "wip"
+ ]
+ },
"control_knobs": {
"unicode": "1F39B",
"unicode_alternates": [],
@@ -2517,7 +5175,9 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["dial"]
+ "keywords": [
+ "dial"
+ ]
},
"contruction_site": {
"unicode": "1F3D7",
@@ -2525,9 +5185,14 @@
"name": "building construction",
"shortname": ":contruction_site:",
"category": "travel_places",
- "aliases": [":building_construction:"],
+ "aliases": [
+ ":building_construction:"
+ ],
"aliases_ascii": [],
- "keywords": ["site", "work"]
+ "keywords": [
+ "site",
+ "work"
+ ]
},
"convenience_store": {
"unicode": "1F3EA",
@@ -2537,7 +5202,9 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["building"],
+ "keywords": [
+ "building"
+ ],
"moji": "🏪"
},
"cookie": {
@@ -2548,7 +5215,17 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["chocolate", "food", "oreo", "snack", "cookie", "dessert", "biscuit", "sweet", "chocolate"],
+ "keywords": [
+ "chocolate",
+ "food",
+ "oreo",
+ "snack",
+ "cookie",
+ "dessert",
+ "biscuit",
+ "sweet",
+ "chocolate"
+ ],
"moji": "🍪"
},
"cool": {
@@ -2559,7 +5236,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue-square", "words"],
+ "keywords": [
+ "blue-square",
+ "words"
+ ],
"moji": "🆒"
},
"cop": {
@@ -2570,9 +5250,95 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["arrest", "enforcement", "law", "man", "police"],
+ "keywords": [
+ "arrest",
+ "enforcement",
+ "law",
+ "man",
+ "police"
+ ],
"moji": "👮"
},
+ "cop_tone1": {
+ "unicode": "1F46E-1F3FB",
+ "unicode_alternates": "",
+ "name": "police officer tone 1",
+ "shortname": ":cop_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "arrest",
+ "enforcement",
+ "law",
+ "man",
+ "cop"
+ ]
+ },
+ "cop_tone2": {
+ "unicode": "1F46E-1F3FC",
+ "unicode_alternates": "",
+ "name": "police officer tone 2",
+ "shortname": ":cop_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "arrest",
+ "enforcement",
+ "law",
+ "man",
+ "cop"
+ ]
+ },
+ "cop_tone3": {
+ "unicode": "1F46E-1F3FD",
+ "unicode_alternates": "",
+ "name": "police officer tone 3",
+ "shortname": ":cop_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "arrest",
+ "enforcement",
+ "law",
+ "man",
+ "cop"
+ ]
+ },
+ "cop_tone4": {
+ "unicode": "1F46E-1F3FE",
+ "unicode_alternates": "",
+ "name": "police officer tone 4",
+ "shortname": ":cop_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "arrest",
+ "enforcement",
+ "law",
+ "man",
+ "cop"
+ ]
+ },
+ "cop_tone5": {
+ "unicode": "1F46E-1F3FF",
+ "unicode_alternates": "",
+ "name": "police officer tone 5",
+ "shortname": ":cop_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "arrest",
+ "enforcement",
+ "law",
+ "man",
+ "cop"
+ ]
+ },
"copyright": {
"moji": "©",
"unicode": "00A9",
@@ -2582,7 +5348,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["ip", "license"]
+ "keywords": [
+ "ip",
+ "license"
+ ]
},
"corn": {
"unicode": "1F33D",
@@ -2592,7 +5361,22 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["food", "plant", "vegetable", "corn", "maize", "food", "iowa", "kernel", "popcorn", "husk", "yellow", "stalk", "cob", "ear"],
+ "keywords": [
+ "food",
+ "plant",
+ "vegetable",
+ "corn",
+ "maize",
+ "food",
+ "iowa",
+ "kernel",
+ "popcorn",
+ "husk",
+ "yellow",
+ "stalk",
+ "cob",
+ "ear"
+ ],
"moji": "🌽"
},
"couch": {
@@ -2601,9 +5385,20 @@
"name": "couch and lamp",
"shortname": ":couch:",
"category": "travel_places",
- "aliases": [":couch_and_lamp:"],
- "aliases_ascii": [],
- "keywords": ["lounge", "sectional", "sofa", "loveseat", "leather", "microfiber", "sit", "relax"]
+ "aliases": [
+ ":couch_and_lamp:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "lounge",
+ "sectional",
+ "sofa",
+ "loveseat",
+ "leather",
+ "microfiber",
+ "sit",
+ "relax"
+ ]
},
"couple": {
"unicode": "1F46B",
@@ -2613,18 +5408,40 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["affection", "date", "dating", "human", "like", "love", "marriage", "people", "valentines"],
+ "keywords": [
+ "affection",
+ "date",
+ "dating",
+ "human",
+ "like",
+ "love",
+ "marriage",
+ "people",
+ "valentines"
+ ],
"moji": "👫"
},
"couple_mm": {
"unicode": "1F468-2764-1F468",
- "unicode_alternates": ["1F468-200D-2764-FE0F-200D-1F468"],
+ "unicode_alternates": [
+ "1F468-200D-2764-FE0F-200D-1F468"
+ ],
"name": "couple (man,man)",
"shortname": ":couple_mm:",
"category": "people",
- "aliases": [":couple_with_heart_mm:"],
- "aliases_ascii": [],
- "keywords": ["affection", "dating", "human", "like", "love", "marriage", "valentines"]
+ "aliases": [
+ ":couple_with_heart_mm:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "affection",
+ "dating",
+ "human",
+ "like",
+ "love",
+ "marriage",
+ "valentines"
+ ]
},
"couple_with_heart": {
"unicode": "1F491",
@@ -2634,18 +5451,38 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["affection", "dating", "human", "like", "love", "marriage", "valentines"],
+ "keywords": [
+ "affection",
+ "dating",
+ "human",
+ "like",
+ "love",
+ "marriage",
+ "valentines"
+ ],
"moji": "💑"
},
"couple_ww": {
"unicode": "1F469-2764-1F469",
- "unicode_alternates": ["1F469-200D-2764-FE0F-200D-1F469"],
+ "unicode_alternates": [
+ "1F469-200D-2764-FE0F-200D-1F469"
+ ],
"name": "couple (woman,woman)",
"shortname": ":couple_ww:",
"category": "people",
- "aliases": [":couple_with_heart_ww:"],
- "aliases_ascii": [],
- "keywords": ["affection", "dating", "human", "like", "love", "marriage", "valentines"]
+ "aliases": [
+ ":couple_with_heart_ww:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "affection",
+ "dating",
+ "human",
+ "like",
+ "love",
+ "marriage",
+ "valentines"
+ ]
},
"couplekiss": {
"unicode": "1F48F",
@@ -2655,7 +5492,13 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["dating", "like", "love", "marriage", "valentines"],
+ "keywords": [
+ "dating",
+ "like",
+ "love",
+ "marriage",
+ "valentines"
+ ],
"moji": "💏"
},
"cow": {
@@ -2666,7 +5509,11 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "beef", "ox"],
+ "keywords": [
+ "animal",
+ "beef",
+ "ox"
+ ],
"moji": "🐮"
},
"cow2": {
@@ -2677,18 +5524,46 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "beef", "nature", "ox", "cow", "milk", "dairy", "beef", "bessie", "moo"],
+ "keywords": [
+ "animal",
+ "beef",
+ "nature",
+ "ox",
+ "cow",
+ "milk",
+ "dairy",
+ "beef",
+ "bessie",
+ "moo"
+ ],
"moji": "🐄"
},
+ "crab": {
+ "unicode": "1F980",
+ "unicode_alternates": "",
+ "name": "crab",
+ "shortname": ":crab:",
+ "category": "nature",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": []
+ },
"crayon": {
"unicode": "1F58D",
"unicode_alternates": [],
"name": "lower left crayon",
"shortname": ":crayon:",
"category": "objects_symbols",
- "aliases": [":lower_left_crayon:"],
+ "aliases": [
+ ":lower_left_crayon:"
+ ],
"aliases_ascii": [],
- "keywords": ["write", "draw", "color", "wax"]
+ "keywords": [
+ "write",
+ "draw",
+ "color",
+ "wax"
+ ]
},
"credit_card": {
"unicode": "1F4B3",
@@ -2698,7 +5573,23 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["bill", "dollar", "money", "pay", "payment", "credit", "card", "loan", "purchase", "shopping", "mastercard", "visa", "american express", "wallet", "signature"],
+ "keywords": [
+ "bill",
+ "dollar",
+ "money",
+ "pay",
+ "payment",
+ "credit",
+ "card",
+ "loan",
+ "purchase",
+ "shopping",
+ "mastercard",
+ "visa",
+ "american express",
+ "wallet",
+ "signature"
+ ],
"moji": "💳"
},
"crescent_moon": {
@@ -2709,9 +5600,30 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["night", "moon", "crescent", "waxing", "sky", "night", "cheese", "phase"],
+ "keywords": [
+ "night",
+ "moon",
+ "crescent",
+ "waxing",
+ "sky",
+ "night",
+ "cheese",
+ "phase"
+ ],
"moji": "🌙"
},
+ "cricket": {
+ "unicode": "1F3CF",
+ "unicode_alternates": "",
+ "name": "cricket bat and ball",
+ "shortname": ":cricket:",
+ "category": "activity",
+ "aliases": [
+ ":cricket_bat_ball:"
+ ],
+ "aliases_ascii": [],
+ "keywords": []
+ },
"crocodile": {
"unicode": "1F40A",
"unicode_alternates": [],
@@ -2720,18 +5632,47 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "nature", "crocodile", "croc", "alligator", "gator", "cranky"],
+ "keywords": [
+ "animal",
+ "nature",
+ "crocodile",
+ "croc",
+ "alligator",
+ "gator",
+ "cranky"
+ ],
"moji": "🐊"
},
+ "cross": {
+ "unicode": "271D",
+ "unicode_alternates": "",
+ "name": "latin cross",
+ "shortname": ":cross:",
+ "category": "symbols",
+ "aliases": [
+ ":latin_cross:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "religion",
+ "symbol",
+ "christian"
+ ]
+ },
"cross_heavy": {
"unicode": "1F547",
"unicode_alternates": [],
"name": "heavy latin cross",
"shortname": ":cross_heavy:",
"category": "objects_symbols",
- "aliases": [":heavy_latin_cross:"],
+ "aliases": [
+ ":heavy_latin_cross:"
+ ],
"aliases_ascii": [],
- "keywords": ["religion", "symbol"]
+ "keywords": [
+ "religion",
+ "symbol"
+ ]
},
"cross_white": {
"unicode": "1F546",
@@ -2739,9 +5680,14 @@
"name": "white latin cross",
"shortname": ":cross_white:",
"category": "objects_symbols",
- "aliases": [":white_latin_cross:"],
+ "aliases": [
+ ":white_latin_cross:"
+ ],
"aliases_ascii": [],
- "keywords": ["religion", "symbol"]
+ "keywords": [
+ "religion",
+ "symbol"
+ ]
},
"crossbones": {
"unicode": "1F571",
@@ -2749,9 +5695,15 @@
"name": "black skull and crossbones",
"shortname": ":crossbones:",
"category": "objects_symbols",
- "aliases": [":black_skull_and_crossbones:"],
+ "aliases": [
+ ":black_skull_and_crossbones:"
+ ],
"aliases_ascii": [],
- "keywords": ["poison", "danger", "death"]
+ "keywords": [
+ "poison",
+ "danger",
+ "death"
+ ]
},
"crossed_flags": {
"unicode": "1F38C",
@@ -2761,9 +5713,24 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["japan"],
+ "keywords": [
+ "japan"
+ ],
"moji": "🎌"
},
+ "crossed_swords": {
+ "unicode": "2694",
+ "unicode_alternates": "",
+ "name": "crossed swords",
+ "shortname": ":crossed_swords:",
+ "category": "objects",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "object",
+ "weapon"
+ ]
+ },
"crown": {
"unicode": "1F451",
"unicode_alternates": [],
@@ -2772,7 +5739,12 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["king", "kod", "leader", "royalty"],
+ "keywords": [
+ "king",
+ "kod",
+ "leader",
+ "royalty"
+ ],
"moji": "👑"
},
"cruise_ship": {
@@ -2781,9 +5753,15 @@
"name": "passenger ship",
"shortname": ":cruise_ship:",
"category": "travel_places",
- "aliases": [":passenger_ship:"],
+ "aliases": [
+ ":passenger_ship:"
+ ],
"aliases_ascii": [],
- "keywords": ["titanic", "transportation", "boat"]
+ "keywords": [
+ "titanic",
+ "transportation",
+ "boat"
+ ]
},
"cry": {
"unicode": "1F622",
@@ -2792,8 +5770,21 @@
"shortname": ":cry:",
"category": "emoticons",
"aliases": [],
- "aliases_ascii": [":'(", ":'-(", ";(", ";-("],
- "keywords": ["face", "sad", "sad", "cry", "tear", "weep", "tears"],
+ "aliases_ascii": [
+ ":'(",
+ ":'-(",
+ ";(",
+ ";-("
+ ],
+ "keywords": [
+ "face",
+ "sad",
+ "sad",
+ "cry",
+ "tear",
+ "weep",
+ "tears"
+ ],
"moji": "😢"
},
"crying_cat_face": {
@@ -2804,7 +5795,22 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "cats", "sad", "tears", "weep", "cry", "cat", "sob", "tears", "sad", "melancholy", "morn", "somber", "hurt"],
+ "keywords": [
+ "animal",
+ "cats",
+ "sad",
+ "tears",
+ "weep",
+ "cry",
+ "cat",
+ "sob",
+ "tears",
+ "sad",
+ "melancholy",
+ "morn",
+ "somber",
+ "hurt"
+ ],
"moji": "😿"
},
"crystal_ball": {
@@ -2815,7 +5821,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["disco", "party"],
+ "keywords": [
+ "disco",
+ "party"
+ ],
"moji": "🔮"
},
"cupid": {
@@ -2826,7 +5835,13 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["affection", "heart", "like", "love", "valentines"],
+ "keywords": [
+ "affection",
+ "heart",
+ "like",
+ "love",
+ "valentines"
+ ],
"moji": "💘"
},
"curly_loop": {
@@ -2837,7 +5852,9 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["scribble"],
+ "keywords": [
+ "scribble"
+ ],
"moji": "➰"
},
"currency_exchange": {
@@ -2848,7 +5865,11 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["dollar", "money", "travel"],
+ "keywords": [
+ "dollar",
+ "money",
+ "travel"
+ ],
"moji": "💱"
},
"curry": {
@@ -2859,7 +5880,17 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["food", "hot", "indian", "spicy", "curry", "spice", "flavor", "food", "meal"],
+ "keywords": [
+ "food",
+ "hot",
+ "indian",
+ "spicy",
+ "curry",
+ "spice",
+ "flavor",
+ "food",
+ "meal"
+ ],
"moji": "🍛"
},
"custard": {
@@ -2870,7 +5901,18 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["desert", "food", "custard", "cream", "rich", "butter", "dessert", "crème", "brûlée", "french"],
+ "keywords": [
+ "desert",
+ "food",
+ "custard",
+ "cream",
+ "rich",
+ "butter",
+ "dessert",
+ "crème",
+ "brûlée",
+ "french"
+ ],
"moji": "🍮"
},
"customs": {
@@ -2881,7 +5923,17 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["border", "passport", "customs", "travel", "foreign", "goods", "check", "authority", "government"],
+ "keywords": [
+ "border",
+ "passport",
+ "customs",
+ "travel",
+ "foreign",
+ "goods",
+ "check",
+ "authority",
+ "government"
+ ],
"moji": "🛃"
},
"cyclone": {
@@ -2893,7 +5945,17 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue", "cloud", "swirl", "weather", "cyclone", "hurricane", "typhoon", "storm", "ocean"]
+ "keywords": [
+ "blue",
+ "cloud",
+ "swirl",
+ "weather",
+ "cyclone",
+ "hurricane",
+ "typhoon",
+ "storm",
+ "ocean"
+ ]
},
"dagger": {
"unicode": "1F5E1",
@@ -2901,9 +5963,14 @@
"name": "dagger knife",
"shortname": ":dagger:",
"category": "objects_symbols",
- "aliases": [":dagger_knife:"],
+ "aliases": [
+ ":dagger_knife:"
+ ],
"aliases_ascii": [],
- "keywords": ["blade", "knife"]
+ "keywords": [
+ "blade",
+ "knife"
+ ]
},
"dancer": {
"unicode": "1F483",
@@ -2913,9 +5980,145 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["female", "fun", "girl", "woman", "dance", "dancer", "dress", "fancy", "boogy", "party", "celebrate", "ballet", "tango", "cha cha", "music"],
+ "keywords": [
+ "female",
+ "fun",
+ "girl",
+ "woman",
+ "dance",
+ "dancer",
+ "dress",
+ "fancy",
+ "boogy",
+ "party",
+ "celebrate",
+ "ballet",
+ "tango",
+ "cha cha",
+ "music"
+ ],
"moji": "💃"
},
+ "dancer_tone1": {
+ "unicode": "1F483-1F3FB",
+ "unicode_alternates": "",
+ "name": "dancer tone 1",
+ "shortname": ":dancer_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "fun",
+ "girl",
+ "woman",
+ "dress",
+ "fancy",
+ "boogy",
+ "party",
+ "celebrate",
+ "ballet",
+ "tango",
+ "cha cha",
+ "music"
+ ]
+ },
+ "dancer_tone2": {
+ "unicode": "1F483-1F3FC",
+ "unicode_alternates": "",
+ "name": "dancer tone 2",
+ "shortname": ":dancer_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "fun",
+ "girl",
+ "woman",
+ "dress",
+ "fancy",
+ "boogy",
+ "party",
+ "celebrate",
+ "ballet",
+ "tango",
+ "cha cha",
+ "music"
+ ]
+ },
+ "dancer_tone3": {
+ "unicode": "1F483-1F3FD",
+ "unicode_alternates": "",
+ "name": "dancer tone 3",
+ "shortname": ":dancer_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "fun",
+ "girl",
+ "woman",
+ "dress",
+ "fancy",
+ "boogy",
+ "party",
+ "celebrate",
+ "ballet",
+ "tango",
+ "cha cha",
+ "music"
+ ]
+ },
+ "dancer_tone4": {
+ "unicode": "1F483-1F3FE",
+ "unicode_alternates": "",
+ "name": "dancer tone 4",
+ "shortname": ":dancer_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "fun",
+ "girl",
+ "woman",
+ "dress",
+ "fancy",
+ "boogy",
+ "party",
+ "celebrate",
+ "ballet",
+ "tango",
+ "cha cha",
+ "music"
+ ]
+ },
+ "dancer_tone5": {
+ "unicode": "1F483-1F3FF",
+ "unicode_alternates": "",
+ "name": "dancer tone 5",
+ "shortname": ":dancer_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "fun",
+ "girl",
+ "woman",
+ "dress",
+ "fancy",
+ "boogy",
+ "party",
+ "celebrate",
+ "ballet",
+ "tango",
+ "cha cha",
+ "music"
+ ]
+ },
"dancers": {
"unicode": "1F46F",
"unicode_alternates": [],
@@ -2924,7 +6127,19 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["bunny", "female", "girls", "women", "dancing", "dancers", "showgirl", "playboy", "costume", "bunny", "cancan"],
+ "keywords": [
+ "bunny",
+ "female",
+ "girls",
+ "women",
+ "dancing",
+ "dancers",
+ "showgirl",
+ "playboy",
+ "costume",
+ "bunny",
+ "cancan"
+ ],
"moji": "👯"
},
"dango": {
@@ -2935,7 +6150,15 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["food", "dango", "japanese", "dumpling", "mochi", "balls", "skewer"],
+ "keywords": [
+ "food",
+ "dango",
+ "japanese",
+ "dumpling",
+ "mochi",
+ "balls",
+ "skewer"
+ ],
"moji": "🍡"
},
"dark_sunglasses": {
@@ -2946,7 +6169,10 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["shades", "eyes"]
+ "keywords": [
+ "shades",
+ "eyes"
+ ]
},
"dart": {
"unicode": "1F3AF",
@@ -2956,7 +6182,19 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["bar", "game", "direct", "hit", "bullseye", "dart", "archery", "game", "fletching", "arrow", "sport"],
+ "keywords": [
+ "bar",
+ "game",
+ "direct",
+ "hit",
+ "bullseye",
+ "dart",
+ "archery",
+ "game",
+ "fletching",
+ "arrow",
+ "sport"
+ ],
"moji": "🎯"
},
"dash": {
@@ -2967,7 +6205,12 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["air", "fast", "shoo", "wind"],
+ "keywords": [
+ "air",
+ "fast",
+ "shoo",
+ "wind"
+ ],
"moji": "💨"
},
"date": {
@@ -2978,7 +6221,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["calendar", "schedule"],
+ "keywords": [
+ "calendar",
+ "schedule"
+ ],
"moji": "📅"
},
"deciduous_tree": {
@@ -2989,7 +6235,15 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["nature", "plant", "deciduous", "tree", "leaves", "fall", "color"],
+ "keywords": [
+ "nature",
+ "plant",
+ "deciduous",
+ "tree",
+ "leaves",
+ "fall",
+ "color"
+ ],
"moji": "🌳"
},
"department_store": {
@@ -3000,7 +6254,16 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["building", "mall", "shopping", "department", "store", "retail", "sale", "merchandise"],
+ "keywords": [
+ "building",
+ "mall",
+ "shopping",
+ "department",
+ "store",
+ "retail",
+ "sale",
+ "merchandise"
+ ],
"moji": "🏬"
},
"descending_notes": {
@@ -3011,7 +6274,12 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["score", "music", "sound", "tone"]
+ "keywords": [
+ "score",
+ "music",
+ "sound",
+ "tone"
+ ]
},
"desert": {
"unicode": "1F3DC",
@@ -3021,7 +6289,14 @@
"category": "travel_places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["hot", "dry", "sandy", "cactus", "sunny", "barren"]
+ "keywords": [
+ "hot",
+ "dry",
+ "sandy",
+ "cactus",
+ "sunny",
+ "barren"
+ ]
},
"desktop": {
"unicode": "1F5A5",
@@ -3029,9 +6304,13 @@
"name": "desktop computer",
"shortname": ":desktop:",
"category": "objects_symbols",
- "aliases": [":desktop_computer:"],
+ "aliases": [
+ ":desktop_computer:"
+ ],
"aliases_ascii": [],
- "keywords": ["cpu"]
+ "keywords": [
+ "cpu"
+ ]
},
"desktop_window": {
"unicode": "1F5D4",
@@ -3041,7 +6320,9 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["computer"]
+ "keywords": [
+ "computer"
+ ]
},
"diamond_shape_with_a_dot_inside": {
"unicode": "1F4A0",
@@ -3051,18 +6332,31 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["diamond", "cute", "cuteness", "kawaii", "japanese", "glyph", "adorable"],
+ "keywords": [
+ "diamond",
+ "cute",
+ "cuteness",
+ "kawaii",
+ "japanese",
+ "glyph",
+ "adorable"
+ ],
"moji": "💠"
},
"diamonds": {
"unicode": "2666",
- "unicode_alternates": ["2666-FE0F"],
+ "unicode_alternates": [
+ "2666-FE0F"
+ ],
"name": "black diamond suit",
"shortname": ":diamonds:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["cards", "poker"],
+ "keywords": [
+ "cards",
+ "poker"
+ ],
"moji": "♦"
},
"disappointed": {
@@ -3072,8 +6366,24 @@
"shortname": ":disappointed:",
"category": "emoticons",
"aliases": [],
- "aliases_ascii": [">:[", ":-(", ":(", ":-[", ":[", "=("],
- "keywords": ["disappointed", "disappoint", "frown", "depressed", "discouraged", "face", "sad", "upset"],
+ "aliases_ascii": [
+ ">:[",
+ ":-(",
+ ":(",
+ ":-[",
+ ":[",
+ "=("
+ ],
+ "keywords": [
+ "disappointed",
+ "disappoint",
+ "frown",
+ "depressed",
+ "discouraged",
+ "face",
+ "sad",
+ "upset"
+ ],
"moji": "😞"
},
"disappointed_relieved": {
@@ -3084,7 +6394,14 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["face", "nervous", "phew", "sweat", "disappoint", "relief"],
+ "keywords": [
+ "face",
+ "nervous",
+ "phew",
+ "sweat",
+ "disappoint",
+ "relief"
+ ],
"moji": "😥"
},
"dividers": {
@@ -3093,9 +6410,14 @@
"name": "card index dividers",
"shortname": ":dividers:",
"category": "objects_symbols",
- "aliases": [":card_index_dividers:"],
+ "aliases": [
+ ":card_index_dividers:"
+ ],
"aliases_ascii": [],
- "keywords": ["stationery", "rolodex"]
+ "keywords": [
+ "stationery",
+ "rolodex"
+ ]
},
"dizzy": {
"unicode": "1F4AB",
@@ -3105,7 +6427,18 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["shoot", "sparkle", "star", "dizzy", "drunk", "sick", "intoxicated", "squeans", "starburst", "star"],
+ "keywords": [
+ "shoot",
+ "sparkle",
+ "star",
+ "dizzy",
+ "drunk",
+ "sick",
+ "intoxicated",
+ "squeans",
+ "starburst",
+ "star"
+ ],
"moji": "💫"
},
"dizzy_face": {
@@ -3115,8 +6448,23 @@
"shortname": ":dizzy_face:",
"category": "emoticons",
"aliases": [],
- "aliases_ascii": ["#-)", "#)", "%-)", "%)", "X)", "X-)"],
- "keywords": ["dizzy", "drunk", "inebriated", "face", "spent", "unconscious", "xox"],
+ "aliases_ascii": [
+ "#-)",
+ "#)",
+ "%-)",
+ "%)",
+ "X)",
+ "X-)"
+ ],
+ "keywords": [
+ "dizzy",
+ "drunk",
+ "inebriated",
+ "face",
+ "spent",
+ "unconscious",
+ "xox"
+ ],
"moji": "😵"
},
"do_not_litter": {
@@ -3127,7 +6475,17 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["bin", "garbage", "trash", "litter", "garbage", "waste", "no", "can", "trash"],
+ "keywords": [
+ "bin",
+ "garbage",
+ "trash",
+ "litter",
+ "garbage",
+ "waste",
+ "no",
+ "can",
+ "trash"
+ ],
"moji": "🚯"
},
"document": {
@@ -3138,7 +6496,9 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["page"]
+ "keywords": [
+ "page"
+ ]
},
"document_text": {
"unicode": "1F5B9",
@@ -3146,9 +6506,13 @@
"name": "document with text",
"shortname": ":document_text:",
"category": "objects_symbols",
- "aliases": [":document_with_text:"],
+ "aliases": [
+ ":document_with_text:"
+ ],
"aliases_ascii": [],
- "keywords": ["page"]
+ "keywords": [
+ "page"
+ ]
},
"dog": {
"unicode": "1F436",
@@ -3158,7 +6522,12 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "friend", "nature", "woof"],
+ "keywords": [
+ "animal",
+ "friend",
+ "nature",
+ "woof"
+ ],
"moji": "🐶"
},
"dog2": {
@@ -3169,7 +6538,20 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "doge", "friend", "nature", "pet", "dog", "puppy", "pet", "friend", "woof", "bark", "fido"],
+ "keywords": [
+ "animal",
+ "doge",
+ "friend",
+ "nature",
+ "pet",
+ "dog",
+ "puppy",
+ "pet",
+ "friend",
+ "woof",
+ "bark",
+ "fido"
+ ],
"moji": "🐕"
},
"dollar": {
@@ -3180,7 +6562,21 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["bill", "currency", "money", "dollar", "united states", "canada", "australia", "banknote", "money", "currency", "paper", "cash", "bills"],
+ "keywords": [
+ "bill",
+ "currency",
+ "money",
+ "dollar",
+ "united states",
+ "canada",
+ "australia",
+ "banknote",
+ "money",
+ "currency",
+ "paper",
+ "cash",
+ "bills"
+ ],
"moji": "💵"
},
"dolls": {
@@ -3191,7 +6587,23 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["japanese", "kimono", "toy", "dolls", "japan", "japanese", "day", "girls", "emperor", "empress", "pray", "blessing", "imperial", "family", "royal"],
+ "keywords": [
+ "japanese",
+ "kimono",
+ "toy",
+ "dolls",
+ "japan",
+ "japanese",
+ "day",
+ "girls",
+ "emperor",
+ "empress",
+ "pray",
+ "blessing",
+ "imperial",
+ "family",
+ "royal"
+ ],
"moji": "🎎"
},
"dolphin": {
@@ -3202,7 +6614,15 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "fins", "fish", "flipper", "nature", "ocean", "sea"],
+ "keywords": [
+ "animal",
+ "fins",
+ "fish",
+ "flipper",
+ "nature",
+ "ocean",
+ "sea"
+ ],
"moji": "🐬"
},
"door": {
@@ -3213,7 +6633,17 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["entry", "exit", "house", "door", "doorway", "entrance", "enter", "exit", "entry"],
+ "keywords": [
+ "entry",
+ "exit",
+ "house",
+ "door",
+ "doorway",
+ "entrance",
+ "enter",
+ "exit",
+ "entry"
+ ],
"moji": "🚪"
},
"doughnut": {
@@ -3224,7 +6654,21 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["desert", "food", "snack", "sweet", "doughnut", "donut", "pastry", "fried", "dessert", "breakfast", "police", "homer", "sweet"],
+ "keywords": [
+ "desert",
+ "food",
+ "snack",
+ "sweet",
+ "doughnut",
+ "donut",
+ "pastry",
+ "fried",
+ "dessert",
+ "breakfast",
+ "police",
+ "homer",
+ "sweet"
+ ],
"moji": "🍩"
},
"dove": {
@@ -3233,9 +6677,14 @@
"name": "dove of peace",
"shortname": ":dove:",
"category": "objects_symbols",
- "aliases": [":dove_of_peace:"],
+ "aliases": [
+ ":dove_of_peace:"
+ ],
"aliases_ascii": [],
- "keywords": ["symbol", "bird"]
+ "keywords": [
+ "symbol",
+ "bird"
+ ]
},
"dragon": {
"unicode": "1F409",
@@ -3245,7 +6694,17 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "chinese", "green", "myth", "nature", "dragon", "fire", "legendary", "myth"],
+ "keywords": [
+ "animal",
+ "chinese",
+ "green",
+ "myth",
+ "nature",
+ "dragon",
+ "fire",
+ "legendary",
+ "myth"
+ ],
"moji": "🐉"
},
"dragon_face": {
@@ -3256,7 +6715,18 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "chinese", "green", "myth", "nature", "dragon", "head", "fire", "legendary", "myth"],
+ "keywords": [
+ "animal",
+ "chinese",
+ "green",
+ "myth",
+ "nature",
+ "dragon",
+ "head",
+ "fire",
+ "legendary",
+ "myth"
+ ],
"moji": "🐲"
},
"dress": {
@@ -3267,7 +6737,10 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["clothes", "fashion"],
+ "keywords": [
+ "clothes",
+ "fashion"
+ ],
"moji": "👗"
},
"dromedary_camel": {
@@ -3278,7 +6751,22 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "desert", "hot", "dromedary", "camel", "hump", "desert", "middle east", "heat", "hot", "water", "hump day", "wednesday", "sex"],
+ "keywords": [
+ "animal",
+ "desert",
+ "hot",
+ "dromedary",
+ "camel",
+ "hump",
+ "desert",
+ "middle east",
+ "heat",
+ "hot",
+ "water",
+ "hump day",
+ "wednesday",
+ "sex"
+ ],
"moji": "🐪"
},
"droplet": {
@@ -3289,7 +6777,23 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["drip", "faucet", "water", "drop", "droplet", "h20", "water", "aqua", "tear", "sweat", "rain", "moisture", "wet", "moist", "spit"],
+ "keywords": [
+ "drip",
+ "faucet",
+ "water",
+ "drop",
+ "droplet",
+ "h20",
+ "water",
+ "aqua",
+ "tear",
+ "sweat",
+ "rain",
+ "moisture",
+ "wet",
+ "moist",
+ "spit"
+ ],
"moji": "💧"
},
"dvd": {
@@ -3300,7 +6804,11 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["cd", "disc", "disk"],
+ "keywords": [
+ "cd",
+ "disc",
+ "disk"
+ ],
"moji": "📀"
},
"e-mail": {
@@ -3309,9 +6817,14 @@
"name": "e-mail symbol",
"shortname": ":e-mail:",
"category": "objects",
- "aliases": [":email:"],
- "aliases_ascii": [],
- "keywords": ["communication", "inbox"],
+ "aliases": [
+ ":email:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "communication",
+ "inbox"
+ ],
"moji": "📧"
},
"ear": {
@@ -3322,7 +6835,12 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["face", "hear", "listen", "sound"],
+ "keywords": [
+ "face",
+ "hear",
+ "listen",
+ "sound"
+ ],
"moji": "👂"
},
"ear_of_rice": {
@@ -3333,9 +6851,87 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["nature", "plant", "ear", "rice", "food", "plant", "seed"],
+ "keywords": [
+ "nature",
+ "plant",
+ "ear",
+ "rice",
+ "food",
+ "plant",
+ "seed"
+ ],
"moji": "🌾"
},
+ "ear_tone1": {
+ "unicode": "1F442-1F3FB",
+ "unicode_alternates": "",
+ "name": "ear tone 1",
+ "shortname": ":ear_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "hear",
+ "listen",
+ "sound"
+ ]
+ },
+ "ear_tone2": {
+ "unicode": "1F442-1F3FC",
+ "unicode_alternates": "",
+ "name": "ear tone 2",
+ "shortname": ":ear_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "hear",
+ "listen",
+ "sound"
+ ]
+ },
+ "ear_tone3": {
+ "unicode": "1F442-1F3FD",
+ "unicode_alternates": "",
+ "name": "ear tone 3",
+ "shortname": ":ear_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "hear",
+ "listen",
+ "sound"
+ ]
+ },
+ "ear_tone4": {
+ "unicode": "1F442-1F3FE",
+ "unicode_alternates": "",
+ "name": "ear tone 4",
+ "shortname": ":ear_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "hear",
+ "listen",
+ "sound"
+ ]
+ },
+ "ear_tone5": {
+ "unicode": "1F442-1F3FF",
+ "unicode_alternates": "",
+ "name": "ear tone 5",
+ "shortname": ":ear_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "hear",
+ "listen",
+ "sound"
+ ]
+ },
"earth_africa": {
"unicode": "1F30D",
"unicode_alternates": [],
@@ -3344,7 +6940,18 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["globe", "international", "world", "earth", "globe", "space", "planet", "africa", "europe", "home"],
+ "keywords": [
+ "globe",
+ "international",
+ "world",
+ "earth",
+ "globe",
+ "space",
+ "planet",
+ "africa",
+ "europe",
+ "home"
+ ],
"moji": "🌍"
},
"earth_americas": {
@@ -3355,7 +6962,21 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["USA", "globe", "international", "world", "earth", "globe", "space", "planet", "north", "south", "america", "americas", "home"],
+ "keywords": [
+ "USA",
+ "globe",
+ "international",
+ "world",
+ "earth",
+ "globe",
+ "space",
+ "planet",
+ "north",
+ "south",
+ "america",
+ "americas",
+ "home"
+ ],
"moji": "🌎"
},
"earth_asia": {
@@ -3366,7 +6987,19 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["east", "globe", "international", "world", "earth", "globe", "space", "planet", "asia", "australia", "home"],
+ "keywords": [
+ "east",
+ "globe",
+ "international",
+ "world",
+ "earth",
+ "globe",
+ "space",
+ "planet",
+ "asia",
+ "australia",
+ "home"
+ ],
"moji": "🌏"
},
"egg": {
@@ -3377,7 +7010,18 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["breakfast", "food", "egg", "fry", "pan", "flat", "cook", "frying", "cooking", "utensil"],
+ "keywords": [
+ "breakfast",
+ "food",
+ "egg",
+ "fry",
+ "pan",
+ "flat",
+ "cook",
+ "frying",
+ "cooking",
+ "utensil"
+ ],
"moji": "🍳"
},
"eggplant": {
@@ -3388,23 +7032,41 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["aubergine", "food", "nature", "vegetable", "eggplant", "aubergine", "fruit", "purple", "penis"],
+ "keywords": [
+ "aubergine",
+ "food",
+ "nature",
+ "vegetable",
+ "eggplant",
+ "aubergine",
+ "fruit",
+ "purple",
+ "penis"
+ ],
"moji": "🍆"
},
"eight": {
"moji": "8️⃣",
"unicode": "0038-20E3",
- "unicode_alternates": ["0038-FE0F-20E3"],
+ "unicode_alternates": [
+ "0038-FE0F-20E3"
+ ],
"name": "digit eight",
"shortname": ":eight:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["8", "blue-square", "numbers"]
+ "keywords": [
+ "8",
+ "blue-square",
+ "numbers"
+ ]
},
"eight_pointed_black_star": {
"unicode": "2734",
- "unicode_alternates": ["2734-FE0F"],
+ "unicode_alternates": [
+ "2734-FE0F"
+ ],
"name": "eight pointed black star",
"shortname": ":eight_pointed_black_star:",
"category": "other",
@@ -3415,13 +7077,19 @@
},
"eight_spoked_asterisk": {
"unicode": "2733",
- "unicode_alternates": ["2733-FE0F"],
+ "unicode_alternates": [
+ "2733-FE0F"
+ ],
"name": "eight spoked asterisk",
"shortname": ":eight_spoked_asterisk:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["green-square", "sparkle", "star"],
+ "keywords": [
+ "green-square",
+ "sparkle",
+ "star"
+ ],
"moji": "✳"
},
"electric_plug": {
@@ -3432,7 +7100,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["charger", "power"],
+ "keywords": [
+ "charger",
+ "power"
+ ],
"moji": "🔌"
},
"elephant": {
@@ -3443,7 +7114,12 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "nature", "nose", "thailand"],
+ "keywords": [
+ "animal",
+ "nature",
+ "nose",
+ "thailand"
+ ],
"moji": "🐘"
},
"end": {
@@ -3454,18 +7130,28 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["arrow", "words"],
+ "keywords": [
+ "arrow",
+ "words"
+ ],
"moji": "🔚"
},
"envelope": {
"unicode": "2709",
- "unicode_alternates": ["2709-FE0F"],
+ "unicode_alternates": [
+ "2709-FE0F"
+ ],
"name": "envelope",
"shortname": ":envelope:",
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["communication", "letter", "mail", "postal"],
+ "keywords": [
+ "communication",
+ "letter",
+ "mail",
+ "postal"
+ ],
"moji": "✉"
},
"envelope_back": {
@@ -3474,9 +7160,16 @@
"name": "back of envelope",
"shortname": ":envelope_back:",
"category": "objects_symbols",
- "aliases": [":back_of_envelope:"],
+ "aliases": [
+ ":back_of_envelope:"
+ ],
"aliases_ascii": [],
- "keywords": ["communication", "letter", "mail", "postal"]
+ "keywords": [
+ "communication",
+ "letter",
+ "mail",
+ "postal"
+ ]
},
"envelope_flying": {
"unicode": "1F585",
@@ -3484,9 +7177,16 @@
"name": "flying envelope",
"shortname": ":envelope_flying:",
"category": "objects_symbols",
- "aliases": [":flying_envelope:"],
+ "aliases": [
+ ":flying_envelope:"
+ ],
"aliases_ascii": [],
- "keywords": ["communication", "letter", "mail", "postal"]
+ "keywords": [
+ "communication",
+ "letter",
+ "mail",
+ "postal"
+ ]
},
"envelope_stamped": {
"unicode": "1F583",
@@ -3494,9 +7194,16 @@
"name": "stamped envelope",
"shortname": ":envelope_stamped:",
"category": "objects_symbols",
- "aliases": [":stamped_envelope:"],
+ "aliases": [
+ ":stamped_envelope:"
+ ],
"aliases_ascii": [],
- "keywords": ["communication", "letter", "mail", "postal"]
+ "keywords": [
+ "communication",
+ "letter",
+ "mail",
+ "postal"
+ ]
},
"envelope_stamped_pen": {
"unicode": "1F586",
@@ -3504,9 +7211,16 @@
"name": "pen over stamped envelope",
"shortname": ":envelope_stamped_pen:",
"category": "objects_symbols",
- "aliases": [":pen_over_stamped_envelope:"],
+ "aliases": [
+ ":pen_over_stamped_envelope:"
+ ],
"aliases_ascii": [],
- "keywords": ["communication", "letter", "mail", "postal"]
+ "keywords": [
+ "communication",
+ "letter",
+ "mail",
+ "postal"
+ ]
},
"envelope_with_arrow": {
"unicode": "1F4E9",
@@ -3516,7 +7230,9 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["email"],
+ "keywords": [
+ "email"
+ ],
"moji": "📩"
},
"euro": {
@@ -3527,7 +7243,19 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["currency", "dollar", "money", "euro", "europe", "banknote", "money", "currency", "paper", "cash", "bills"],
+ "keywords": [
+ "currency",
+ "dollar",
+ "money",
+ "euro",
+ "europe",
+ "banknote",
+ "money",
+ "currency",
+ "paper",
+ "cash",
+ "bills"
+ ],
"moji": "💶"
},
"european_castle": {
@@ -3538,7 +7266,29 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["building", "history", "royalty", "castle", "european", "residence", "royalty", "disneyland", "disney", "fort", "fortified", "moat", "tower", "princess", "prince", "lord", "king", "queen", "fortress", "nobel", "stronghold"],
+ "keywords": [
+ "building",
+ "history",
+ "royalty",
+ "castle",
+ "european",
+ "residence",
+ "royalty",
+ "disneyland",
+ "disney",
+ "fort",
+ "fortified",
+ "moat",
+ "tower",
+ "princess",
+ "prince",
+ "lord",
+ "king",
+ "queen",
+ "fortress",
+ "nobel",
+ "stronghold"
+ ],
"moji": "🏰"
},
"european_post_office": {
@@ -3549,7 +7299,9 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["building"],
+ "keywords": [
+ "building"
+ ],
"moji": "🏤"
},
"evergreen_tree": {
@@ -3560,18 +7312,29 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["nature", "plant", "evergreen", "tree", "needles", "christmas"],
+ "keywords": [
+ "nature",
+ "plant",
+ "evergreen",
+ "tree",
+ "needles",
+ "christmas"
+ ],
"moji": "🌲"
},
"exclamation": {
"unicode": "2757",
- "unicode_alternates": ["2757-FE0F"],
+ "unicode_alternates": [
+ "2757-FE0F"
+ ],
"name": "heavy exclamation mark symbol",
"shortname": ":exclamation:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["surprise"],
+ "keywords": [
+ "surprise"
+ ],
"moji": "❗"
},
"expressionless": {
@@ -3581,8 +7344,20 @@
"shortname": ":expressionless:",
"category": "emoticons",
"aliases": [],
- "aliases_ascii": ["-_-", "-__-", "-___-"],
- "keywords": ["expressionless", "blank", "void", "vapid", "without expression", "face", "indifferent"],
+ "aliases_ascii": [
+ "-_-",
+ "-__-",
+ "-___-"
+ ],
+ "keywords": [
+ "expressionless",
+ "blank",
+ "void",
+ "vapid",
+ "without expression",
+ "face",
+ "indifferent"
+ ],
"moji": "😑"
},
"eye": {
@@ -3593,7 +7368,21 @@
"category": "people",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["look", "peek", "watch"]
+ "keywords": [
+ "look",
+ "peek",
+ "watch"
+ ]
+ },
+ "eye_in_speech_bubble": {
+ "unicode": "1F441-1F5E8",
+ "unicode_alternates": "1f441-200d-1f5e8",
+ "name": "eye in speech bubble",
+ "shortname": ":eye_in_speech_bubble:",
+ "category": "symbols",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": []
},
"eyeglasses": {
"unicode": "1F453",
@@ -3603,7 +7392,24 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["accessories", "eyesight", "fashion", "eyeglasses", "spectacles", "eye", "sight", "nearsightedness", "myopia", "farsightedness", "hyperopia", "frames", "vision", "see", "blurry", "contacts"],
+ "keywords": [
+ "accessories",
+ "eyesight",
+ "fashion",
+ "eyeglasses",
+ "spectacles",
+ "eye",
+ "sight",
+ "nearsightedness",
+ "myopia",
+ "farsightedness",
+ "hyperopia",
+ "frames",
+ "vision",
+ "see",
+ "blurry",
+ "contacts"
+ ],
"moji": "👓"
},
"eyes": {
@@ -3614,7 +7420,12 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["look", "peek", "stalk", "watch"],
+ "keywords": [
+ "look",
+ "peek",
+ "stalk",
+ "watch"
+ ],
"moji": "👀"
},
"factory": {
@@ -3625,7 +7436,9 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["building"],
+ "keywords": [
+ "building"
+ ],
"moji": "🏭"
},
"fallen_leaf": {
@@ -3636,7 +7449,17 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["leaves", "nature", "plant", "vegetable", "leaf", "fall", "color", "deciduous", "autumn"],
+ "keywords": [
+ "leaves",
+ "nature",
+ "plant",
+ "vegetable",
+ "leaf",
+ "fall",
+ "color",
+ "deciduous",
+ "autumn"
+ ],
"moji": "🍂"
},
"family": {
@@ -3647,148 +7470,359 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["child", "dad", "father", "home", "mom", "mother", "parents", "family", "mother", "father", "child", "girl", "boy", "group", "unit"],
+ "keywords": [
+ "child",
+ "dad",
+ "father",
+ "home",
+ "mom",
+ "mother",
+ "parents",
+ "family",
+ "mother",
+ "father",
+ "child",
+ "girl",
+ "boy",
+ "group",
+ "unit"
+ ],
"moji": "👪"
},
"family_mmb": {
"unicode": "1F468-1F468-1F466",
- "unicode_alternates": ["1F468-200D-1F468-200D-1F466"],
+ "unicode_alternates": [
+ "1F468-200D-1F468-200D-1F466"
+ ],
"name": "family (man,man,boy)",
"shortname": ":family_mmb:",
"category": "people",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["child", "dad", "father", "parents", "group", "unit", "gay", "homosexual", "man", "boy"]
+ "keywords": [
+ "child",
+ "dad",
+ "father",
+ "parents",
+ "group",
+ "unit",
+ "gay",
+ "homosexual",
+ "man",
+ "boy"
+ ]
},
"family_mmbb": {
"unicode": "1F468-1F468-1F466-1F466",
- "unicode_alternates": ["1F468-200D-1F468-200D-1F466-200D-1F466"],
+ "unicode_alternates": [
+ "1F468-200D-1F468-200D-1F466-200D-1F466"
+ ],
"name": "family (man,man,boy,boy)",
"shortname": ":family_mmbb:",
"category": "people",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["children", "dad", "father", "parents", "group", "unit", "gay", "homosexual", "man", "boy"]
+ "keywords": [
+ "children",
+ "dad",
+ "father",
+ "parents",
+ "group",
+ "unit",
+ "gay",
+ "homosexual",
+ "man",
+ "boy"
+ ]
},
"family_mmg": {
"unicode": "1F468-1F468-1F467",
- "unicode_alternates": ["1F468-200D-1F468-200D-1F467"],
+ "unicode_alternates": [
+ "1F468-200D-1F468-200D-1F467"
+ ],
"name": "family (man,man,girl)",
"shortname": ":family_mmg:",
"category": "people",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["child", "dad", "father", "parents", "group", "unit", "gay", "homosexual", "man", "girl"]
+ "keywords": [
+ "child",
+ "dad",
+ "father",
+ "parents",
+ "group",
+ "unit",
+ "gay",
+ "homosexual",
+ "man",
+ "girl"
+ ]
},
"family_mmgb": {
"unicode": "1F468-1F468-1F467-1F466",
- "unicode_alternates": ["1F468-200D-1F468-200D-1F467-200D-1F466"],
+ "unicode_alternates": [
+ "1F468-200D-1F468-200D-1F467-200D-1F466"
+ ],
"name": "family (man,man,girl,boy)",
"shortname": ":family_mmgb:",
"category": "people",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["children", "dad", "father", "parents", "group", "unit", "gay", "homosexual", "man", "girl", "boy"]
+ "keywords": [
+ "children",
+ "dad",
+ "father",
+ "parents",
+ "group",
+ "unit",
+ "gay",
+ "homosexual",
+ "man",
+ "girl",
+ "boy"
+ ]
},
"family_mmgg": {
"unicode": "1F468-1F468-1F467-1F467",
- "unicode_alternates": ["1F468-200D-1F468-200D-1F467-200D-1F467"],
+ "unicode_alternates": [
+ "1F468-200D-1F468-200D-1F467-200D-1F467"
+ ],
"name": "family (man,man,girl,girl)",
"shortname": ":family_mmgg:",
"category": "people",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["children", "dad", "father", "parents", "group", "unit", "gay", "homosexual", "man", "girl"]
+ "keywords": [
+ "children",
+ "dad",
+ "father",
+ "parents",
+ "group",
+ "unit",
+ "gay",
+ "homosexual",
+ "man",
+ "girl"
+ ]
},
"family_mwbb": {
"unicode": "1F468-1F469-1F466-1F466",
- "unicode_alternates": ["1F468-200D-1F469-200D-1F466-200D-1F466"],
+ "unicode_alternates": [
+ "1F468-200D-1F469-200D-1F466-200D-1F466"
+ ],
"name": "family (man,woman,boy,boy)",
"shortname": ":family_mwbb:",
"category": "people",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["dad", "father", "mom", "mother", "parents", "children", "boy", "group", "unit", "man", "woman"]
+ "keywords": [
+ "dad",
+ "father",
+ "mom",
+ "mother",
+ "parents",
+ "children",
+ "boy",
+ "group",
+ "unit",
+ "man",
+ "woman"
+ ]
},
"family_mwg": {
"unicode": "1F468-1F469-1F467",
- "unicode_alternates": ["1F468-200D-1F469-200D-1F467"],
+ "unicode_alternates": [
+ "1F468-200D-1F469-200D-1F467"
+ ],
"name": "family (man,woman,girl)",
"shortname": ":family_mwg:",
"category": "people",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["child", "dad", "father", "mom", "mother", "parents", "girl", "boy", "group", "unit", "man", "woman"]
+ "keywords": [
+ "child",
+ "dad",
+ "father",
+ "mom",
+ "mother",
+ "parents",
+ "girl",
+ "boy",
+ "group",
+ "unit",
+ "man",
+ "woman"
+ ]
},
"family_mwgb": {
"unicode": "1F468-1F469-1F467-1F466",
- "unicode_alternates": ["1F468-200D-1F469-200D-1F467-200D-1F466"],
+ "unicode_alternates": [
+ "1F468-200D-1F469-200D-1F467-200D-1F466"
+ ],
"name": "family (man,woman,girl,boy)",
"shortname": ":family_mwgb:",
"category": "people",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["dad", "father", "mom", "mother", "parents", "children", "girl", "boy", "group", "unit", "man", "woman"]
+ "keywords": [
+ "dad",
+ "father",
+ "mom",
+ "mother",
+ "parents",
+ "children",
+ "girl",
+ "boy",
+ "group",
+ "unit",
+ "man",
+ "woman"
+ ]
},
"family_mwgg": {
"unicode": "1F468-1F469-1F467-1F467",
- "unicode_alternates": ["1F468-200D-1F469-200D-1F467-200D-1F467"],
+ "unicode_alternates": [
+ "1F468-200D-1F469-200D-1F467-200D-1F467"
+ ],
"name": "family (man,woman,girl,girl)",
"shortname": ":family_mwgg:",
"category": "people",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["dad", "father", "mom", "mother", "parents", "children", "girl", "group", "unit", "man", "woman"]
+ "keywords": [
+ "dad",
+ "father",
+ "mom",
+ "mother",
+ "parents",
+ "children",
+ "girl",
+ "group",
+ "unit",
+ "man",
+ "woman"
+ ]
},
"family_wwb": {
"unicode": "1F469-1F469-1F466",
- "unicode_alternates": ["1F469-200D-1F469-200D-1F466"],
+ "unicode_alternates": [
+ "1F469-200D-1F469-200D-1F466"
+ ],
"name": "family (woman,woman,boy)",
"shortname": ":family_wwb:",
"category": "people",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["mom", "mother", "parents", "child", "boy", "group", "unit", "gay", "lesbian", "homosexual", "woman"]
+ "keywords": [
+ "mom",
+ "mother",
+ "parents",
+ "child",
+ "boy",
+ "group",
+ "unit",
+ "gay",
+ "lesbian",
+ "homosexual",
+ "woman"
+ ]
},
"family_wwbb": {
"unicode": "1F469-1F469-1F466-1F466",
- "unicode_alternates": ["1F469-200D-1F469-200D-1F466-200D-1F466"],
+ "unicode_alternates": [
+ "1F469-200D-1F469-200D-1F466-200D-1F466"
+ ],
"name": "family (woman,woman,boy,boy)",
"shortname": ":family_wwbb:",
"category": "people",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["mom", "mother", "parents", "children", "group", "unit", "gay", "lesbian", "homosexual", "woman", "boy"]
+ "keywords": [
+ "mom",
+ "mother",
+ "parents",
+ "children",
+ "group",
+ "unit",
+ "gay",
+ "lesbian",
+ "homosexual",
+ "woman",
+ "boy"
+ ]
},
"family_wwg": {
"unicode": "1F469-1F469-1F467",
- "unicode_alternates": ["1F469-200D-1F469-200D-1F467"],
+ "unicode_alternates": [
+ "1F469-200D-1F469-200D-1F467"
+ ],
"name": "family (woman,woman,girl)",
"shortname": ":family_wwg:",
"category": "people",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["mom", "mother", "parents", "child", "woman", "girl", "group", "unit", "gay", "lesbian", "homosexual"]
+ "keywords": [
+ "mom",
+ "mother",
+ "parents",
+ "child",
+ "woman",
+ "girl",
+ "group",
+ "unit",
+ "gay",
+ "lesbian",
+ "homosexual"
+ ]
},
"family_wwgb": {
"unicode": "1F469-1F469-1F467-1F466",
- "unicode_alternates": ["1F469-200D-1F469-200D-1F467-200D-1F466"],
+ "unicode_alternates": [
+ "1F469-200D-1F469-200D-1F467-200D-1F466"
+ ],
"name": "family (woman,woman,girl,boy)",
"shortname": ":family_wwgb:",
"category": "people",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["mom", "mother", "parents", "children", "group", "unit", "gay", "lesbian", "homosexual", "woman", "girl", "boy"]
+ "keywords": [
+ "mom",
+ "mother",
+ "parents",
+ "children",
+ "group",
+ "unit",
+ "gay",
+ "lesbian",
+ "homosexual",
+ "woman",
+ "girl",
+ "boy"
+ ]
},
"family_wwgg": {
"unicode": "1F469-1F469-1F467-1F467",
- "unicode_alternates": ["1F469-200D-1F469-200D-1F467-200D-1F467"],
+ "unicode_alternates": [
+ "1F469-200D-1F469-200D-1F467-200D-1F467"
+ ],
"name": "family (woman,woman,girl,girl)",
"shortname": ":family_wwgg:",
"category": "people",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["mom", "mother", "parents", "children", "group", "unit", "gay", "lesbian", "homosexual", "woman", "girl"]
+ "keywords": [
+ "mom",
+ "mother",
+ "parents",
+ "children",
+ "group",
+ "unit",
+ "gay",
+ "lesbian",
+ "homosexual",
+ "woman",
+ "girl"
+ ]
},
"fast_forward": {
"unicode": "23E9",
@@ -3798,7 +7832,9 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue-square"],
+ "keywords": [
+ "blue-square"
+ ],
"moji": "⏩"
},
"fax": {
@@ -3809,7 +7845,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["communication", "technology"],
+ "keywords": [
+ "communication",
+ "technology"
+ ],
"moji": "📠"
},
"fearful": {
@@ -3820,7 +7859,17 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["face", "nervous", "oops", "scared", "terrified", "fear", "fearful", "scared", "frightened"],
+ "keywords": [
+ "face",
+ "nervous",
+ "oops",
+ "scared",
+ "terrified",
+ "fear",
+ "fearful",
+ "scared",
+ "frightened"
+ ],
"moji": "😨"
},
"feet": {
@@ -3831,7 +7880,29 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "cat", "dog", "footprints", "paw", "pet", "tracking", "paw", "prints", "mark", "imprints", "footsteps", "animal", "lion", "bear", "dog", "cat", "raccoon", "critter", "feet", "pawsteps"],
+ "keywords": [
+ "animal",
+ "cat",
+ "dog",
+ "footprints",
+ "paw",
+ "pet",
+ "tracking",
+ "paw",
+ "prints",
+ "mark",
+ "imprints",
+ "footsteps",
+ "animal",
+ "lion",
+ "bear",
+ "dog",
+ "cat",
+ "raccoon",
+ "critter",
+ "feet",
+ "pawsteps"
+ ],
"moji": "🐾"
},
"ferris_wheel": {
@@ -3842,9 +7913,44 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["carnival", "londoneye", "photo", "farris", "wheel", "amusement", "park", "fair", "ride", "entertainment"],
+ "keywords": [
+ "carnival",
+ "londoneye",
+ "photo",
+ "farris",
+ "wheel",
+ "amusement",
+ "park",
+ "fair",
+ "ride",
+ "entertainment"
+ ],
"moji": "🎡"
},
+ "ferry": {
+ "unicode": "26F4",
+ "unicode_alternates": "",
+ "name": "ferry",
+ "shortname": ":ferry:",
+ "category": "travel",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "boat",
+ "place",
+ "travel"
+ ]
+ },
+ "field_hockey": {
+ "unicode": "1F3D1",
+ "unicode_alternates": "",
+ "name": "field hockey stick and ball",
+ "shortname": ":field_hockey:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": []
+ },
"file_cabinet": {
"unicode": "1F5C4",
"unicode_alternates": [],
@@ -3853,7 +7959,12 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["folders", "office", "documents", "storage"]
+ "keywords": [
+ "folders",
+ "office",
+ "documents",
+ "storage"
+ ]
},
"file_folder": {
"unicode": "1F4C1",
@@ -3863,7 +7974,9 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["documents"],
+ "keywords": [
+ "documents"
+ ],
"moji": "📁"
},
"film_frames": {
@@ -3874,7 +7987,14 @@
"category": "activity",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["movie", "record", "8mm", "16mm", "reel", "celluloid"]
+ "keywords": [
+ "movie",
+ "record",
+ "8mm",
+ "16mm",
+ "reel",
+ "celluloid"
+ ]
},
"finger_pointing_down": {
"unicode": "1F597",
@@ -3882,9 +8002,15 @@
"name": "white down pointing left hand index",
"shortname": ":finger_pointing_down:",
"category": "people",
- "aliases": [":white_down_pointing_left_hand_index:"],
+ "aliases": [
+ ":white_down_pointing_left_hand_index:"
+ ],
"aliases_ascii": [],
- "keywords": ["direction", "finger", "hand"]
+ "keywords": [
+ "direction",
+ "finger",
+ "hand"
+ ]
},
"finger_pointing_down2": {
"unicode": "1F59F",
@@ -3892,9 +8018,15 @@
"name": "sideways white down pointing index",
"shortname": ":finger_pointing_down2:",
"category": "people",
- "aliases": [":sideways_white_down_pointing_index:"],
+ "aliases": [
+ ":sideways_white_down_pointing_index:"
+ ],
"aliases_ascii": [],
- "keywords": ["direction", "finger", "hand"]
+ "keywords": [
+ "direction",
+ "finger",
+ "hand"
+ ]
},
"finger_pointing_left": {
"unicode": "1F598",
@@ -3902,9 +8034,15 @@
"name": "sideways white left pointing index",
"shortname": ":finger_pointing_left:",
"category": "people",
- "aliases": [":sideways_white_left_pointing_index:"],
+ "aliases": [
+ ":sideways_white_left_pointing_index:"
+ ],
"aliases_ascii": [],
- "keywords": ["direction", "finger", "hand"]
+ "keywords": [
+ "direction",
+ "finger",
+ "hand"
+ ]
},
"finger_pointing_right": {
"unicode": "1F599",
@@ -3912,9 +8050,15 @@
"name": "sideways white right pointing index",
"shortname": ":finger_pointing_right:",
"category": "people",
- "aliases": [":sideways_white_right_pointing_index:"],
+ "aliases": [
+ ":sideways_white_right_pointing_index:"
+ ],
"aliases_ascii": [],
- "keywords": ["direction", "finger", "hand"]
+ "keywords": [
+ "direction",
+ "finger",
+ "hand"
+ ]
},
"finger_pointing_up": {
"unicode": "1F59E",
@@ -3922,9 +8066,15 @@
"name": "sideways white up pointing index",
"shortname": ":finger_pointing_up:",
"category": "people",
- "aliases": [":sideways_white_up_pointing_index:"],
+ "aliases": [
+ ":sideways_white_up_pointing_index:"
+ ],
"aliases_ascii": [],
- "keywords": ["direction", "finger", "hand"]
+ "keywords": [
+ "direction",
+ "finger",
+ "hand"
+ ]
},
"fire": {
"unicode": "1F525",
@@ -3932,9 +8082,15 @@
"name": "fire",
"shortname": ":fire:",
"category": "emoticons",
- "aliases": [":flame:"],
- "aliases_ascii": [],
- "keywords": ["cook", "hot", "flame"],
+ "aliases": [
+ ":flame:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "cook",
+ "hot",
+ "flame"
+ ],
"moji": "🔥"
},
"fire_engine": {
@@ -3945,7 +8101,17 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["cars", "transportation", "vehicle", "fire", "fighter", "engine", "truck", "emergency", "medical"],
+ "keywords": [
+ "cars",
+ "transportation",
+ "vehicle",
+ "fire",
+ "fighter",
+ "engine",
+ "truck",
+ "emergency",
+ "medical"
+ ],
"moji": "🚒"
},
"fire_engine_oncoming": {
@@ -3954,9 +8120,17 @@
"name": "oncoming fire engine",
"shortname": ":fire_engine_oncoming:",
"category": "travel_places",
- "aliases": [":oncoming_fire_engine:"],
- "aliases_ascii": [],
- "keywords": ["transportation", "vehicle", "fighter", "truck", "emergency"]
+ "aliases": [
+ ":oncoming_fire_engine:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "transportation",
+ "vehicle",
+ "fighter",
+ "truck",
+ "emergency"
+ ]
},
"fireworks": {
"unicode": "1F386",
@@ -3966,7 +8140,22 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["carnival", "congratulations", "festival", "photo", "fireworks", "independence", "celebration", "explosion", "july", "4th", "rocket", "sky", "idea", "excitement"],
+ "keywords": [
+ "carnival",
+ "congratulations",
+ "festival",
+ "photo",
+ "fireworks",
+ "independence",
+ "celebration",
+ "explosion",
+ "july",
+ "4th",
+ "rocket",
+ "sky",
+ "idea",
+ "excitement"
+ ],
"moji": "🎆"
},
"first_quarter_moon": {
@@ -3977,7 +8166,16 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["nature", "moon", "quarter", "first", "sky", "night", "cheese", "phase"],
+ "keywords": [
+ "nature",
+ "moon",
+ "quarter",
+ "first",
+ "sky",
+ "night",
+ "cheese",
+ "phase"
+ ],
"moji": "🌓"
},
"first_quarter_moon_with_face": {
@@ -3988,7 +8186,18 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["nature", "moon", "first", "quarter", "anthropomorphic", "face", "sky", "night", "cheese", "phase"],
+ "keywords": [
+ "nature",
+ "moon",
+ "first",
+ "quarter",
+ "anthropomorphic",
+ "face",
+ "sky",
+ "night",
+ "cheese",
+ "phase"
+ ],
"moji": "🌛"
},
"fish": {
@@ -3999,7 +8208,11 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "food", "nature"],
+ "keywords": [
+ "animal",
+ "food",
+ "nature"
+ ],
"moji": "🐟"
},
"fish_cake": {
@@ -4010,7 +8223,16 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["food", "fish", "cake", "kamboko", "swirl", "ramen", "noodles", "naruto"],
+ "keywords": [
+ "food",
+ "fish",
+ "cake",
+ "kamboko",
+ "swirl",
+ "ramen",
+ "noodles",
+ "naruto"
+ ],
"moji": "🍥"
},
"fishing_pole_and_fish": {
@@ -4021,7 +8243,13 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["food", "hobby", "fish", "fishing", "pole"],
+ "keywords": [
+ "food",
+ "hobby",
+ "fish",
+ "fishing",
+ "pole"
+ ],
"moji": "🎣"
},
"fist": {
@@ -4032,19 +8260,99 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["fingers", "grasp", "hand"],
+ "keywords": [
+ "fingers",
+ "grasp",
+ "hand"
+ ],
"moji": "✊"
},
+ "fist_tone1": {
+ "unicode": "270A-1F3FB",
+ "unicode_alternates": "",
+ "name": "raised fist tone 1",
+ "shortname": ":fist_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "fingers",
+ "grasp",
+ "hand"
+ ]
+ },
+ "fist_tone2": {
+ "unicode": "270A-1F3FC",
+ "unicode_alternates": "",
+ "name": "raised fist tone 2",
+ "shortname": ":fist_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "fingers",
+ "grasp",
+ "hand"
+ ]
+ },
+ "fist_tone3": {
+ "unicode": "270A-1F3FD",
+ "unicode_alternates": "",
+ "name": "raised fist tone 3",
+ "shortname": ":fist_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "fingers",
+ "grasp",
+ "hand"
+ ]
+ },
+ "fist_tone4": {
+ "unicode": "270A-1F3FE",
+ "unicode_alternates": "",
+ "name": "raised fist tone 4",
+ "shortname": ":fist_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "fingers",
+ "grasp",
+ "hand"
+ ]
+ },
+ "fist_tone5": {
+ "unicode": "270A-1F3FF",
+ "unicode_alternates": "",
+ "name": "raised fist tone 5",
+ "shortname": ":fist_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "fingers",
+ "grasp",
+ "hand"
+ ]
+ },
"five": {
"moji": "5️⃣",
"unicode": "0035-20E3",
- "unicode_alternates": ["0035-FE0F-20E3"],
+ "unicode_alternates": [
+ "0035-FE0F-20E3"
+ ],
"name": "digit five",
"shortname": ":five:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue-square", "numbers", "prime"]
+ "keywords": [
+ "blue-square",
+ "numbers",
+ "prime"
+ ]
},
"flag_ac": {
"unicode": "1F1E6-1F1E8",
@@ -4052,9 +8360,15 @@
"name": "ascension",
"shortname": ":flag_ac:",
"category": "flags",
- "aliases": [":ac:"],
+ "aliases": [
+ ":ac:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "ac"]
+ "keywords": [
+ "country",
+ "nation",
+ "ac"
+ ]
},
"flag_ad": {
"unicode": "1F1E6-1F1E9",
@@ -4062,9 +8376,15 @@
"name": "andorra",
"shortname": ":flag_ad:",
"category": "flags",
- "aliases": [":ad:"],
+ "aliases": [
+ ":ad:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "ad"]
+ "keywords": [
+ "country",
+ "nation",
+ "ad"
+ ]
},
"flag_ae": {
"unicode": "1F1E6-1F1EA",
@@ -4072,9 +8392,15 @@
"name": "the united arab emirates",
"shortname": ":flag_ae:",
"category": "flags",
- "aliases": [":ae:"],
+ "aliases": [
+ ":ae:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "ae"]
+ "keywords": [
+ "country",
+ "nation",
+ "ae"
+ ]
},
"flag_af": {
"unicode": "1F1E6-1F1EB",
@@ -4082,9 +8408,16 @@
"name": "afghanistan",
"shortname": ":flag_af:",
"category": "flags",
- "aliases": [":af:"],
+ "aliases": [
+ ":af:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "afghanestan", "af"]
+ "keywords": [
+ "country",
+ "nation",
+ "afghanestan",
+ "af"
+ ]
},
"flag_ag": {
"unicode": "1F1E6-1F1EC",
@@ -4092,9 +8425,15 @@
"name": "antigua and barbuda",
"shortname": ":flag_ag:",
"category": "flags",
- "aliases": [":ag:"],
+ "aliases": [
+ ":ag:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "ag"]
+ "keywords": [
+ "country",
+ "nation",
+ "ag"
+ ]
},
"flag_ai": {
"unicode": "1F1E6-1F1EE",
@@ -4102,9 +8441,15 @@
"name": "anguilla",
"shortname": ":flag_ai:",
"category": "flags",
- "aliases": [":ai:"],
+ "aliases": [
+ ":ai:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "ai"]
+ "keywords": [
+ "country",
+ "nation",
+ "ai"
+ ]
},
"flag_al": {
"unicode": "1F1E6-1F1F1",
@@ -4112,9 +8457,16 @@
"name": "albania",
"shortname": ":flag_al:",
"category": "flags",
- "aliases": [":al:"],
+ "aliases": [
+ ":al:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "shqiperia", "al"]
+ "keywords": [
+ "country",
+ "nation",
+ "shqiperia",
+ "al"
+ ]
},
"flag_am": {
"unicode": "1F1E6-1F1F2",
@@ -4122,9 +8474,16 @@
"name": "armenia",
"shortname": ":flag_am:",
"category": "flags",
- "aliases": [":am:"],
+ "aliases": [
+ ":am:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "hayastan", "am"]
+ "keywords": [
+ "country",
+ "nation",
+ "hayastan",
+ "am"
+ ]
},
"flag_ao": {
"unicode": "1F1E6-1F1F4",
@@ -4132,9 +8491,27 @@
"name": "angola",
"shortname": ":flag_ao:",
"category": "flags",
- "aliases": [":ao:"],
+ "aliases": [
+ ":ao:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "ao"
+ ]
+ },
+ "flag_aq": {
+ "unicode": "1F1E6-1F1F6",
+ "unicode_alternates": "",
+ "name": "antarctica",
+ "shortname": ":flag_aq:",
+ "category": "flags",
+ "aliases": [
+ ":aq:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "ao"]
+ "keywords": []
},
"flag_ar": {
"unicode": "1F1E6-1F1F7",
@@ -4142,9 +8519,27 @@
"name": "argentina",
"shortname": ":flag_ar:",
"category": "flags",
- "aliases": [":ar:"],
+ "aliases": [
+ ":ar:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "ar"
+ ]
+ },
+ "flag_as": {
+ "unicode": "1F1E6-1F1F8",
+ "unicode_alternates": "",
+ "name": "american samoa",
+ "shortname": ":flag_as:",
+ "category": "flags",
+ "aliases": [
+ ":as:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "ar"]
+ "keywords": []
},
"flag_at": {
"unicode": "1F1E6-1F1F9",
@@ -4152,9 +8547,17 @@
"name": "austria",
"shortname": ":flag_at:",
"category": "flags",
- "aliases": [":at:"],
- "aliases_ascii": [],
- "keywords": ["country", "nation", "&ouml;sterreich", "osterreich", "at"]
+ "aliases": [
+ ":at:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "&ouml;sterreich",
+ "osterreich",
+ "at"
+ ]
},
"flag_au": {
"unicode": "1F1E6-1F1FA",
@@ -4162,9 +8565,15 @@
"name": "australia",
"shortname": ":flag_au:",
"category": "flags",
- "aliases": [":au:"],
+ "aliases": [
+ ":au:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "au"]
+ "keywords": [
+ "country",
+ "nation",
+ "au"
+ ]
},
"flag_aw": {
"unicode": "1F1E6-1F1FC",
@@ -4172,9 +8581,27 @@
"name": "aruba",
"shortname": ":flag_aw:",
"category": "flags",
- "aliases": [":aw:"],
+ "aliases": [
+ ":aw:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "aw"
+ ]
+ },
+ "flag_ax": {
+ "unicode": "1F1E6-1F1FD",
+ "unicode_alternates": "",
+ "name": "åland islands",
+ "shortname": ":flag_ax:",
+ "category": "flags",
+ "aliases": [
+ ":ax:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "aw"]
+ "keywords": []
},
"flag_az": {
"unicode": "1F1E6-1F1FF",
@@ -4182,9 +8609,16 @@
"name": "azerbaijan",
"shortname": ":flag_az:",
"category": "flags",
- "aliases": [":az:"],
+ "aliases": [
+ ":az:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "azarbaycan", "az"]
+ "keywords": [
+ "country",
+ "nation",
+ "azarbaycan",
+ "az"
+ ]
},
"flag_ba": {
"unicode": "1F1E7-1F1E6",
@@ -4192,9 +8626,16 @@
"name": "bosnia and herzegovina",
"shortname": ":flag_ba:",
"category": "flags",
- "aliases": [":ba:"],
+ "aliases": [
+ ":ba:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "bosna i hercegovina", "ba"]
+ "keywords": [
+ "country",
+ "nation",
+ "bosna i hercegovina",
+ "ba"
+ ]
},
"flag_bb": {
"unicode": "1F1E7-1F1E7",
@@ -4202,9 +8643,15 @@
"name": "barbados",
"shortname": ":flag_bb:",
"category": "flags",
- "aliases": [":bb:"],
+ "aliases": [
+ ":bb:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "bb"]
+ "keywords": [
+ "country",
+ "nation",
+ "bb"
+ ]
},
"flag_bd": {
"unicode": "1F1E7-1F1E9",
@@ -4212,9 +8659,15 @@
"name": "bangladesh",
"shortname": ":flag_bd:",
"category": "flags",
- "aliases": [":bd:"],
+ "aliases": [
+ ":bd:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "bd"]
+ "keywords": [
+ "country",
+ "nation",
+ "bd"
+ ]
},
"flag_be": {
"unicode": "1F1E7-1F1EA",
@@ -4222,9 +8675,17 @@
"name": "belgium",
"shortname": ":flag_be:",
"category": "flags",
- "aliases": [":be:"],
- "aliases_ascii": [],
- "keywords": ["country", "nation", "belgique", "belgie", "be"]
+ "aliases": [
+ ":be:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "belgique",
+ "belgie",
+ "be"
+ ]
},
"flag_bf": {
"unicode": "1F1E7-1F1EB",
@@ -4232,9 +8693,15 @@
"name": "burkina faso",
"shortname": ":flag_bf:",
"category": "flags",
- "aliases": [":bf:"],
+ "aliases": [
+ ":bf:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "bf"]
+ "keywords": [
+ "country",
+ "nation",
+ "bf"
+ ]
},
"flag_bg": {
"unicode": "1F1E7-1F1EC",
@@ -4242,9 +8709,15 @@
"name": "bulgaria",
"shortname": ":flag_bg:",
"category": "flags",
- "aliases": [":bg:"],
+ "aliases": [
+ ":bg:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "bg"]
+ "keywords": [
+ "country",
+ "nation",
+ "bg"
+ ]
},
"flag_bh": {
"unicode": "1F1E7-1F1ED",
@@ -4252,9 +8725,16 @@
"name": "bahrain",
"shortname": ":flag_bh:",
"category": "flags",
- "aliases": [":bh:"],
+ "aliases": [
+ ":bh:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "al bahrayn", "bh"]
+ "keywords": [
+ "country",
+ "nation",
+ "al bahrayn",
+ "bh"
+ ]
},
"flag_bi": {
"unicode": "1F1E7-1F1EE",
@@ -4262,9 +8742,15 @@
"name": "burundi",
"shortname": ":flag_bi:",
"category": "flags",
- "aliases": [":bi:"],
+ "aliases": [
+ ":bi:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "bi"]
+ "keywords": [
+ "country",
+ "nation",
+ "bi"
+ ]
},
"flag_bj": {
"unicode": "1F1E7-1F1EF",
@@ -4272,9 +8758,27 @@
"name": "benin",
"shortname": ":flag_bj:",
"category": "flags",
- "aliases": [":bj:"],
+ "aliases": [
+ ":bj:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "bj"
+ ]
+ },
+ "flag_bl": {
+ "unicode": "1F1E7-1F1F1",
+ "unicode_alternates": "",
+ "name": "saint barthélemy",
+ "shortname": ":flag_bl:",
+ "category": "flags",
+ "aliases": [
+ ":bl:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "bj"]
+ "keywords": []
},
"flag_black": {
"unicode": "1F3F4",
@@ -4282,9 +8786,14 @@
"name": "waving black flag",
"shortname": ":flag_black:",
"category": "objects_symbols",
- "aliases": [":waving_black_flag:"],
+ "aliases": [
+ ":waving_black_flag:"
+ ],
"aliases_ascii": [],
- "keywords": ["symbol", "signal"]
+ "keywords": [
+ "symbol",
+ "signal"
+ ]
},
"flag_bm": {
"unicode": "1F1E7-1F1F2",
@@ -4292,9 +8801,15 @@
"name": "bermuda",
"shortname": ":flag_bm:",
"category": "flags",
- "aliases": [":bm:"],
+ "aliases": [
+ ":bm:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "bm"]
+ "keywords": [
+ "country",
+ "nation",
+ "bm"
+ ]
},
"flag_bn": {
"unicode": "1F1E7-1F1F3",
@@ -4302,9 +8817,15 @@
"name": "brunei",
"shortname": ":flag_bn:",
"category": "flags",
- "aliases": [":bn:"],
+ "aliases": [
+ ":bn:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "bn"]
+ "keywords": [
+ "country",
+ "nation",
+ "bn"
+ ]
},
"flag_bo": {
"unicode": "1F1E7-1F1F4",
@@ -4312,9 +8833,27 @@
"name": "bolivia",
"shortname": ":flag_bo:",
"category": "flags",
- "aliases": [":bo:"],
+ "aliases": [
+ ":bo:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "bo"
+ ]
+ },
+ "flag_bq": {
+ "unicode": "1F1E7-1F1F6",
+ "unicode_alternates": "",
+ "name": "caribbean netherlands",
+ "shortname": ":flag_bq:",
+ "category": "flags",
+ "aliases": [
+ ":bq:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "bo"]
+ "keywords": []
},
"flag_br": {
"unicode": "1F1E7-1F1F7",
@@ -4322,9 +8861,16 @@
"name": "brazil",
"shortname": ":flag_br:",
"category": "flags",
- "aliases": [":br:"],
+ "aliases": [
+ ":br:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "brasil", "br"]
+ "keywords": [
+ "country",
+ "nation",
+ "brasil",
+ "br"
+ ]
},
"flag_bs": {
"unicode": "1F1E7-1F1F8",
@@ -4332,9 +8878,15 @@
"name": "the bahamas",
"shortname": ":flag_bs:",
"category": "flags",
- "aliases": [":bs:"],
+ "aliases": [
+ ":bs:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "bs"]
+ "keywords": [
+ "country",
+ "nation",
+ "bs"
+ ]
},
"flag_bt": {
"unicode": "1F1E7-1F1F9",
@@ -4342,9 +8894,27 @@
"name": "bhutan",
"shortname": ":flag_bt:",
"category": "flags",
- "aliases": [":bt:"],
+ "aliases": [
+ ":bt:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "bt"
+ ]
+ },
+ "flag_bv": {
+ "unicode": "1F1E7-1F1FB",
+ "unicode_alternates": "",
+ "name": "bouvet island",
+ "shortname": ":flag_bv:",
+ "category": "flags",
+ "aliases": [
+ ":bv:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "bt"]
+ "keywords": []
},
"flag_bw": {
"unicode": "1F1E7-1F1FC",
@@ -4352,9 +8922,15 @@
"name": "botswana",
"shortname": ":flag_bw:",
"category": "flags",
- "aliases": [":bw:"],
+ "aliases": [
+ ":bw:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "bw"]
+ "keywords": [
+ "country",
+ "nation",
+ "bw"
+ ]
},
"flag_by": {
"unicode": "1F1E7-1F1FE",
@@ -4362,9 +8938,16 @@
"name": "belarus",
"shortname": ":flag_by:",
"category": "flags",
- "aliases": [":by:"],
+ "aliases": [
+ ":by:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "byelarus", "by"]
+ "keywords": [
+ "country",
+ "nation",
+ "byelarus",
+ "by"
+ ]
},
"flag_bz": {
"unicode": "1F1E7-1F1FF",
@@ -4372,9 +8955,15 @@
"name": "belize",
"shortname": ":flag_bz:",
"category": "flags",
- "aliases": [":bz:"],
+ "aliases": [
+ ":bz:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "bz"]
+ "keywords": [
+ "country",
+ "nation",
+ "bz"
+ ]
},
"flag_ca": {
"unicode": "1F1E8-1F1E6",
@@ -4382,9 +8971,27 @@
"name": "canada",
"shortname": ":flag_ca:",
"category": "flags",
- "aliases": [":ca:"],
+ "aliases": [
+ ":ca:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "ca"
+ ]
+ },
+ "flag_cc": {
+ "unicode": "1F1E8-1F1E8",
+ "unicode_alternates": "",
+ "name": "cocos (keeling) islands",
+ "shortname": ":flag_cc:",
+ "category": "flags",
+ "aliases": [
+ ":cc:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "ca"]
+ "keywords": []
},
"flag_cd": {
"unicode": "1F1E8-1F1E9",
@@ -4392,9 +8999,17 @@
"name": "the democratic republic of the congo",
"shortname": ":flag_cd:",
"category": "flags",
- "aliases": [":congo:"],
- "aliases_ascii": [],
- "keywords": ["country", "nation", "r&eacute;publique d&eacute;mocratique du congo", "republique democratique du congo", "cd"]
+ "aliases": [
+ ":congo:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "r&eacute;publique d&eacute;mocratique du congo",
+ "republique democratique du congo",
+ "cd"
+ ]
},
"flag_cf": {
"unicode": "1F1E8-1F1EB",
@@ -4402,9 +9017,15 @@
"name": "central african republic",
"shortname": ":flag_cf:",
"category": "flags",
- "aliases": [":cf:"],
+ "aliases": [
+ ":cf:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "cf"]
+ "keywords": [
+ "country",
+ "nation",
+ "cf"
+ ]
},
"flag_cg": {
"unicode": "1F1E8-1F1EC",
@@ -4412,9 +9033,15 @@
"name": "the republic of the congo",
"shortname": ":flag_cg:",
"category": "flags",
- "aliases": [":cg:"],
+ "aliases": [
+ ":cg:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "cg"]
+ "keywords": [
+ "country",
+ "nation",
+ "cg"
+ ]
},
"flag_ch": {
"unicode": "1F1E8-1F1ED",
@@ -4422,9 +9049,15 @@
"name": "switzerland",
"shortname": ":flag_ch:",
"category": "flags",
- "aliases": [":ch:"],
+ "aliases": [
+ ":ch:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "swiss"]
+ "keywords": [
+ "country",
+ "nation",
+ "swiss"
+ ]
},
"flag_ci": {
"unicode": "1F1E8-1F1EE",
@@ -4432,9 +9065,27 @@
"name": "cote d'ivoire",
"shortname": ":flag_ci:",
"category": "flags",
- "aliases": [":ci:"],
+ "aliases": [
+ ":ci:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "ci"
+ ]
+ },
+ "flag_ck": {
+ "unicode": "1F1E8-1F1F0",
+ "unicode_alternates": "",
+ "name": "cook islands",
+ "shortname": ":flag_ck:",
+ "category": "flags",
+ "aliases": [
+ ":ck:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "ci"]
+ "keywords": []
},
"flag_cl": {
"unicode": "1F1E8-1F1F1",
@@ -4442,9 +9093,15 @@
"name": "chile",
"shortname": ":flag_cl:",
"category": "flags",
- "aliases": [":chile:"],
+ "aliases": [
+ ":chile:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "cl"]
+ "keywords": [
+ "country",
+ "nation",
+ "cl"
+ ]
},
"flag_cm": {
"unicode": "1F1E8-1F1F2",
@@ -4452,9 +9109,15 @@
"name": "cameroon",
"shortname": ":flag_cm:",
"category": "flags",
- "aliases": [":cm:"],
+ "aliases": [
+ ":cm:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "cm"]
+ "keywords": [
+ "country",
+ "nation",
+ "cm"
+ ]
},
"flag_cn": {
"unicode": "1F1E8-1F1F3",
@@ -4462,9 +9125,18 @@
"name": "china",
"shortname": ":flag_cn:",
"category": "flags",
- "aliases": [":cn:"],
- "aliases_ascii": [],
- "keywords": ["chinese", "prc", "zhong guo", "country", "nation", "cn"]
+ "aliases": [
+ ":cn:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "chinese",
+ "prc",
+ "zhong guo",
+ "country",
+ "nation",
+ "cn"
+ ]
},
"flag_co": {
"unicode": "1F1E8-1F1F4",
@@ -4472,9 +9144,27 @@
"name": "colombia",
"shortname": ":flag_co:",
"category": "flags",
- "aliases": [":co:"],
+ "aliases": [
+ ":co:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "co"
+ ]
+ },
+ "flag_cp": {
+ "unicode": "1F1E8-1F1F5",
+ "unicode_alternates": "",
+ "name": "clipperton island",
+ "shortname": ":flag_cp:",
+ "category": "flags",
+ "aliases": [
+ ":cp:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "co"]
+ "keywords": []
},
"flag_cr": {
"unicode": "1F1E8-1F1F7",
@@ -4482,9 +9172,15 @@
"name": "costa rica",
"shortname": ":flag_cr:",
"category": "flags",
- "aliases": [":cr:"],
+ "aliases": [
+ ":cr:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "cr"]
+ "keywords": [
+ "country",
+ "nation",
+ "cr"
+ ]
},
"flag_cu": {
"unicode": "1F1E8-1F1FA",
@@ -4492,9 +9188,15 @@
"name": "cuba",
"shortname": ":flag_cu:",
"category": "flags",
- "aliases": [":cu:"],
+ "aliases": [
+ ":cu:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "cu"]
+ "keywords": [
+ "country",
+ "nation",
+ "cu"
+ ]
},
"flag_cv": {
"unicode": "1F1E8-1F1FB",
@@ -4502,9 +9204,40 @@
"name": "cape verde",
"shortname": ":flag_cv:",
"category": "flags",
- "aliases": [":cv:"],
+ "aliases": [
+ ":cv:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "cabo verde",
+ "cv"
+ ]
+ },
+ "flag_cw": {
+ "unicode": "1F1E8-1F1FC",
+ "unicode_alternates": "",
+ "name": "curaçao",
+ "shortname": ":flag_cw:",
+ "category": "flags",
+ "aliases": [
+ ":cw:"
+ ],
+ "aliases_ascii": [],
+ "keywords": []
+ },
+ "flag_cx": {
+ "unicode": "1F1E8-1F1FD",
+ "unicode_alternates": "",
+ "name": "christmas island",
+ "shortname": ":flag_cx:",
+ "category": "flags",
+ "aliases": [
+ ":cx:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "cabo verde", "cv"]
+ "keywords": []
},
"flag_cy": {
"unicode": "1F1E8-1F1FE",
@@ -4512,9 +9245,17 @@
"name": "cyprus",
"shortname": ":flag_cy:",
"category": "flags",
- "aliases": [":cy:"],
- "aliases_ascii": [],
- "keywords": ["country", "nation", "kibris", "kypros", "cy"]
+ "aliases": [
+ ":cy:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "kibris",
+ "kypros",
+ "cy"
+ ]
},
"flag_cz": {
"unicode": "1F1E8-1F1FF",
@@ -4522,9 +9263,16 @@
"name": "the czech republic",
"shortname": ":flag_cz:",
"category": "flags",
- "aliases": [":cz:"],
+ "aliases": [
+ ":cz:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "ceska republika", "cz"]
+ "keywords": [
+ "country",
+ "nation",
+ "ceska republika",
+ "cz"
+ ]
},
"flag_de": {
"unicode": "1F1E9-1F1EA",
@@ -4532,9 +9280,29 @@
"name": "germany",
"shortname": ":flag_de:",
"category": "flags",
- "aliases": [":de:"],
+ "aliases": [
+ ":de:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "german",
+ "nation",
+ "deutschland",
+ "country",
+ "de"
+ ]
+ },
+ "flag_dg": {
+ "unicode": "1F1E9-1F1EC",
+ "unicode_alternates": "",
+ "name": "diego garcia",
+ "shortname": ":flag_dg:",
+ "category": "flags",
+ "aliases": [
+ ":dg:"
+ ],
"aliases_ascii": [],
- "keywords": ["german", "nation", "deutschland", "country", "de"]
+ "keywords": []
},
"flag_dj": {
"unicode": "1F1E9-1F1EF",
@@ -4542,9 +9310,15 @@
"name": "djibouti",
"shortname": ":flag_dj:",
"category": "flags",
- "aliases": [":dj:"],
+ "aliases": [
+ ":dj:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "dj"]
+ "keywords": [
+ "country",
+ "nation",
+ "dj"
+ ]
},
"flag_dk": {
"unicode": "1F1E9-1F1F0",
@@ -4552,9 +9326,16 @@
"name": "denmark",
"shortname": ":flag_dk:",
"category": "flags",
- "aliases": [":dk:"],
+ "aliases": [
+ ":dk:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "danmark", "dk"]
+ "keywords": [
+ "country",
+ "nation",
+ "danmark",
+ "dk"
+ ]
},
"flag_dm": {
"unicode": "1F1E9-1F1F2",
@@ -4562,9 +9343,15 @@
"name": "dominica",
"shortname": ":flag_dm:",
"category": "flags",
- "aliases": [":dm:"],
+ "aliases": [
+ ":dm:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "dm"]
+ "keywords": [
+ "country",
+ "nation",
+ "dm"
+ ]
},
"flag_do": {
"unicode": "1F1E9-1F1F4",
@@ -4572,9 +9359,15 @@
"name": "the dominican republic",
"shortname": ":flag_do:",
"category": "flags",
- "aliases": [":do:"],
+ "aliases": [
+ ":do:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "do"]
+ "keywords": [
+ "country",
+ "nation",
+ "do"
+ ]
},
"flag_dz": {
"unicode": "1F1E9-1F1FF",
@@ -4582,9 +9375,29 @@
"name": "algeria",
"shortname": ":flag_dz:",
"category": "flags",
- "aliases": [":dz:"],
+ "aliases": [
+ ":dz:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "al jaza'ir",
+ "al jazair",
+ "dz"
+ ]
+ },
+ "flag_ea": {
+ "unicode": "1F1EA-1F1E6",
+ "unicode_alternates": "",
+ "name": "ceuta, melilla",
+ "shortname": ":flag_ea:",
+ "category": "flags",
+ "aliases": [
+ ":ea:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "al jaza'ir", "al jazair", "dz"]
+ "keywords": []
},
"flag_ec": {
"unicode": "1F1EA-1F1E8",
@@ -4592,9 +9405,15 @@
"name": "ecuador",
"shortname": ":flag_ec:",
"category": "flags",
- "aliases": [":ec:"],
+ "aliases": [
+ ":ec:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "ec"]
+ "keywords": [
+ "country",
+ "nation",
+ "ec"
+ ]
},
"flag_ee": {
"unicode": "1F1EA-1F1EA",
@@ -4602,9 +9421,16 @@
"name": "estonia",
"shortname": ":flag_ee:",
"category": "flags",
- "aliases": [":ee:"],
+ "aliases": [
+ ":ee:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "eesti vabariik", "ee"]
+ "keywords": [
+ "country",
+ "nation",
+ "eesti vabariik",
+ "ee"
+ ]
},
"flag_eg": {
"unicode": "1F1EA-1F1EC",
@@ -4612,9 +9438,16 @@
"name": "egypt",
"shortname": ":flag_eg:",
"category": "flags",
- "aliases": [":eg:"],
+ "aliases": [
+ ":eg:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "misr", "eg"]
+ "keywords": [
+ "country",
+ "nation",
+ "misr",
+ "eg"
+ ]
},
"flag_eh": {
"unicode": "1F1EA-1F1ED",
@@ -4622,9 +9455,18 @@
"name": "western sahara",
"shortname": ":flag_eh:",
"category": "flags",
- "aliases": [":eh:"],
- "aliases_ascii": [],
- "keywords": ["country", "nation", "aṣ-Ṣaḥrā’ al-gharbīyah", "sahra", "gharbiyah", "eh"]
+ "aliases": [
+ ":eh:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "aṣ-Ṣaḥrā’ al-gharbīyah",
+ "sahra",
+ "gharbiyah",
+ "eh"
+ ]
},
"flag_er": {
"unicode": "1F1EA-1F1F7",
@@ -4632,9 +9474,16 @@
"name": "eritrea",
"shortname": ":flag_er:",
"category": "flags",
- "aliases": [":er:"],
+ "aliases": [
+ ":er:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "hagere ertra", "er"]
+ "keywords": [
+ "country",
+ "nation",
+ "hagere ertra",
+ "er"
+ ]
},
"flag_es": {
"unicode": "1F1EA-1F1F8",
@@ -4642,9 +9491,17 @@
"name": "spain",
"shortname": ":flag_es:",
"category": "flags",
- "aliases": [":es:"],
- "aliases_ascii": [],
- "keywords": ["nation", "espa&ntilde;a", "country", "espana", "es"]
+ "aliases": [
+ ":es:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "nation",
+ "espa&ntilde;a",
+ "country",
+ "espana",
+ "es"
+ ]
},
"flag_et": {
"unicode": "1F1EA-1F1F9",
@@ -4652,9 +9509,29 @@
"name": "ethiopia",
"shortname": ":flag_et:",
"category": "flags",
- "aliases": [":et:"],
+ "aliases": [
+ ":et:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "ityop'iya",
+ "ityopiya",
+ "et"
+ ]
+ },
+ "flag_eu": {
+ "unicode": "1F1EA-1F1FA",
+ "unicode_alternates": "",
+ "name": "european union",
+ "shortname": ":flag_eu:",
+ "category": "flags",
+ "aliases": [
+ ":eu:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "ityop'iya", "ityopiya", "et"]
+ "keywords": []
},
"flag_fi": {
"unicode": "1F1EB-1F1EE",
@@ -4662,9 +9539,16 @@
"name": "finland",
"shortname": ":flag_fi:",
"category": "flags",
- "aliases": [":fi:"],
+ "aliases": [
+ ":fi:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "suomen tasavalta", "fi"]
+ "keywords": [
+ "country",
+ "nation",
+ "suomen tasavalta",
+ "fi"
+ ]
},
"flag_fj": {
"unicode": "1F1EB-1F1EF",
@@ -4672,9 +9556,15 @@
"name": "fiji",
"shortname": ":flag_fj:",
"category": "flags",
- "aliases": [":fj:"],
+ "aliases": [
+ ":fj:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "fj"]
+ "keywords": [
+ "country",
+ "nation",
+ "fj"
+ ]
},
"flag_fk": {
"unicode": "1F1EB-1F1F0",
@@ -4682,9 +9572,16 @@
"name": "falkland islands",
"shortname": ":flag_fk:",
"category": "flags",
- "aliases": [":fk:"],
+ "aliases": [
+ ":fk:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "islas malvinas", "fk"]
+ "keywords": [
+ "country",
+ "nation",
+ "islas malvinas",
+ "fk"
+ ]
},
"flag_fm": {
"unicode": "1F1EB-1F1F2",
@@ -4692,9 +9589,15 @@
"name": "micronesia",
"shortname": ":flag_fm:",
"category": "flags",
- "aliases": [":fm:"],
+ "aliases": [
+ ":fm:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "fm"]
+ "keywords": [
+ "country",
+ "nation",
+ "fm"
+ ]
},
"flag_fo": {
"unicode": "1F1EB-1F1F4",
@@ -4702,9 +9605,16 @@
"name": "faroe islands",
"shortname": ":flag_fo:",
"category": "flags",
- "aliases": [":fo:"],
+ "aliases": [
+ ":fo:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "foroyar", "fo"]
+ "keywords": [
+ "country",
+ "nation",
+ "foroyar",
+ "fo"
+ ]
},
"flag_fr": {
"unicode": "1F1EB-1F1F7",
@@ -4712,9 +9622,16 @@
"name": "france",
"shortname": ":flag_fr:",
"category": "flags",
- "aliases": [":fr:"],
+ "aliases": [
+ ":fr:"
+ ],
"aliases_ascii": [],
- "keywords": ["french", "nation", "country", "fr"]
+ "keywords": [
+ "french",
+ "nation",
+ "country",
+ "fr"
+ ]
},
"flag_ga": {
"unicode": "1F1EC-1F1E6",
@@ -4722,9 +9639,15 @@
"name": "gabon",
"shortname": ":flag_ga:",
"category": "flags",
- "aliases": [":ga:"],
+ "aliases": [
+ ":ga:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "ga"]
+ "keywords": [
+ "country",
+ "nation",
+ "ga"
+ ]
},
"flag_gb": {
"unicode": "1F1EC-1F1E7",
@@ -4732,9 +9655,19 @@
"name": "great britain",
"shortname": ":flag_gb:",
"category": "flags",
- "aliases": [":gb:"],
- "aliases_ascii": [],
- "keywords": ["UK", "gb", "britsh", "nation", "united kingdom", "england", "country"]
+ "aliases": [
+ ":gb:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "UK",
+ "gb",
+ "britsh",
+ "nation",
+ "united kingdom",
+ "england",
+ "country"
+ ]
},
"flag_gd": {
"unicode": "1F1EC-1F1E9",
@@ -4742,9 +9675,15 @@
"name": "grenada",
"shortname": ":flag_gd:",
"category": "flags",
- "aliases": [":gd:"],
+ "aliases": [
+ ":gd:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "gd"]
+ "keywords": [
+ "country",
+ "nation",
+ "gd"
+ ]
},
"flag_ge": {
"unicode": "1F1EC-1F1EA",
@@ -4752,9 +9691,41 @@
"name": "georgia",
"shortname": ":flag_ge:",
"category": "flags",
- "aliases": [":ge:"],
+ "aliases": [
+ ":ge:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "sak'art'velo",
+ "sakartvelo",
+ "ge"
+ ]
+ },
+ "flag_gf": {
+ "unicode": "1F1EC-1F1EB",
+ "unicode_alternates": "",
+ "name": "french guiana",
+ "shortname": ":flag_gf:",
+ "category": "flags",
+ "aliases": [
+ ":gf:"
+ ],
+ "aliases_ascii": [],
+ "keywords": []
+ },
+ "flag_gg": {
+ "unicode": "1F1EC-1F1EC",
+ "unicode_alternates": "",
+ "name": "guernsey",
+ "shortname": ":flag_gg:",
+ "category": "flags",
+ "aliases": [
+ ":gg:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "sak'art'velo", "sakartvelo", "ge"]
+ "keywords": []
},
"flag_gh": {
"unicode": "1F1EC-1F1ED",
@@ -4762,9 +9733,15 @@
"name": "ghana",
"shortname": ":flag_gh:",
"category": "flags",
- "aliases": [":gh:"],
+ "aliases": [
+ ":gh:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "gh"]
+ "keywords": [
+ "country",
+ "nation",
+ "gh"
+ ]
},
"flag_gi": {
"unicode": "1F1EC-1F1EE",
@@ -4772,9 +9749,15 @@
"name": "gibraltar",
"shortname": ":flag_gi:",
"category": "flags",
- "aliases": [":gi:"],
+ "aliases": [
+ ":gi:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "gi"]
+ "keywords": [
+ "country",
+ "nation",
+ "gi"
+ ]
},
"flag_gl": {
"unicode": "1F1EC-1F1F1",
@@ -4782,9 +9765,16 @@
"name": "greenland",
"shortname": ":flag_gl:",
"category": "flags",
- "aliases": [":gl:"],
+ "aliases": [
+ ":gl:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "kalaallit nunaat", "gl"]
+ "keywords": [
+ "country",
+ "nation",
+ "kalaallit nunaat",
+ "gl"
+ ]
},
"flag_gm": {
"unicode": "1F1EC-1F1F2",
@@ -4792,9 +9782,15 @@
"name": "the gambia",
"shortname": ":flag_gm:",
"category": "flags",
- "aliases": [":gm:"],
+ "aliases": [
+ ":gm:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "gm"]
+ "keywords": [
+ "country",
+ "nation",
+ "gm"
+ ]
},
"flag_gn": {
"unicode": "1F1EC-1F1F3",
@@ -4802,9 +9798,28 @@
"name": "guinea",
"shortname": ":flag_gn:",
"category": "flags",
- "aliases": [":gn:"],
+ "aliases": [
+ ":gn:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "guinee",
+ "gn"
+ ]
+ },
+ "flag_gp": {
+ "unicode": "1F1EC-1F1F5",
+ "unicode_alternates": "",
+ "name": "guadeloupe",
+ "shortname": ":flag_gp:",
+ "category": "flags",
+ "aliases": [
+ ":gp:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "guinee", "gn"]
+ "keywords": []
},
"flag_gq": {
"unicode": "1F1EC-1F1F6",
@@ -4812,9 +9827,16 @@
"name": "equatorial guinea",
"shortname": ":flag_gq:",
"category": "flags",
- "aliases": [":gq:"],
+ "aliases": [
+ ":gq:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "guinea ecuatorial", "gq"]
+ "keywords": [
+ "country",
+ "nation",
+ "guinea ecuatorial",
+ "gq"
+ ]
},
"flag_gr": {
"unicode": "1F1EC-1F1F7",
@@ -4822,9 +9844,29 @@
"name": "greece",
"shortname": ":flag_gr:",
"category": "flags",
- "aliases": [":gr:"],
+ "aliases": [
+ ":gr:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "ellas",
+ "ellada",
+ "gr"
+ ]
+ },
+ "flag_gs": {
+ "unicode": "1F1EC-1F1F8",
+ "unicode_alternates": "",
+ "name": "south georgia",
+ "shortname": ":flag_gs:",
+ "category": "flags",
+ "aliases": [
+ ":gs:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "ellas", "ellada", "gr"]
+ "keywords": []
},
"flag_gt": {
"unicode": "1F1EC-1F1F9",
@@ -4832,9 +9874,15 @@
"name": "guatemala",
"shortname": ":flag_gt:",
"category": "flags",
- "aliases": [":gt:"],
+ "aliases": [
+ ":gt:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "gt"]
+ "keywords": [
+ "country",
+ "nation",
+ "gt"
+ ]
},
"flag_gu": {
"unicode": "1F1EC-1F1FA",
@@ -4842,9 +9890,15 @@
"name": "guam",
"shortname": ":flag_gu:",
"category": "flags",
- "aliases": [":gu:"],
+ "aliases": [
+ ":gu:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "gu"]
+ "keywords": [
+ "country",
+ "nation",
+ "gu"
+ ]
},
"flag_gw": {
"unicode": "1F1EC-1F1FC",
@@ -4852,9 +9906,17 @@
"name": "guinea-bissau",
"shortname": ":flag_gw:",
"category": "flags",
- "aliases": [":gw:"],
- "aliases_ascii": [],
- "keywords": ["country", "nation", "guine-bissau", "guine bissau", "gw"]
+ "aliases": [
+ ":gw:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "guine-bissau",
+ "guine bissau",
+ "gw"
+ ]
},
"flag_gy": {
"unicode": "1F1EC-1F1FE",
@@ -4862,9 +9924,15 @@
"name": "guyana",
"shortname": ":flag_gy:",
"category": "flags",
- "aliases": [":gy:"],
+ "aliases": [
+ ":gy:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "gy"]
+ "keywords": [
+ "country",
+ "nation",
+ "gy"
+ ]
},
"flag_hk": {
"unicode": "1F1ED-1F1F0",
@@ -4872,9 +9940,28 @@
"name": "hong kong",
"shortname": ":flag_hk:",
"category": "flags",
- "aliases": [":hk:"],
+ "aliases": [
+ ":hk:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "xianggang",
+ "hk"
+ ]
+ },
+ "flag_hm": {
+ "unicode": "1F1ED-1F1F2",
+ "unicode_alternates": "",
+ "name": "heard island and mcdonald islands",
+ "shortname": ":flag_hm:",
+ "category": "flags",
+ "aliases": [
+ ":hm:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "xianggang", "hk"]
+ "keywords": []
},
"flag_hn": {
"unicode": "1F1ED-1F1F3",
@@ -4882,9 +9969,15 @@
"name": "honduras",
"shortname": ":flag_hn:",
"category": "flags",
- "aliases": [":hn:"],
+ "aliases": [
+ ":hn:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "hn"]
+ "keywords": [
+ "country",
+ "nation",
+ "hn"
+ ]
},
"flag_hr": {
"unicode": "1F1ED-1F1F7",
@@ -4892,9 +9985,16 @@
"name": "croatia",
"shortname": ":flag_hr:",
"category": "flags",
- "aliases": [":hr:"],
+ "aliases": [
+ ":hr:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "hrvatska", "hr"]
+ "keywords": [
+ "country",
+ "nation",
+ "hrvatska",
+ "hr"
+ ]
},
"flag_ht": {
"unicode": "1F1ED-1F1F9",
@@ -4902,9 +10002,15 @@
"name": "haiti",
"shortname": ":flag_ht:",
"category": "flags",
- "aliases": [":ht:"],
+ "aliases": [
+ ":ht:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "ht"]
+ "keywords": [
+ "country",
+ "nation",
+ "ht"
+ ]
},
"flag_hu": {
"unicode": "1F1ED-1F1FA",
@@ -4912,9 +10018,28 @@
"name": "hungary",
"shortname": ":flag_hu:",
"category": "flags",
- "aliases": [":hu:"],
+ "aliases": [
+ ":hu:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "magyarorszag",
+ "hu"
+ ]
+ },
+ "flag_ic": {
+ "unicode": "1F1EE-1F1E8",
+ "unicode_alternates": "",
+ "name": "canary islands",
+ "shortname": ":flag_ic:",
+ "category": "flags",
+ "aliases": [
+ ":ic:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "magyarorszag", "hu"]
+ "keywords": []
},
"flag_id": {
"unicode": "1F1EE-1F1E9",
@@ -4922,9 +10047,15 @@
"name": "indonesia",
"shortname": ":flag_id:",
"category": "flags",
- "aliases": [":indonesia:"],
+ "aliases": [
+ ":indonesia:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "id"]
+ "keywords": [
+ "country",
+ "nation",
+ "id"
+ ]
},
"flag_ie": {
"unicode": "1F1EE-1F1EA",
@@ -4932,9 +10063,17 @@
"name": "ireland",
"shortname": ":flag_ie:",
"category": "flags",
- "aliases": [":ie:"],
- "aliases_ascii": [],
- "keywords": ["country", "nation", "&eacute;ire", "eire", "ie"]
+ "aliases": [
+ ":ie:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "&eacute;ire",
+ "eire",
+ "ie"
+ ]
},
"flag_il": {
"unicode": "1F1EE-1F1F1",
@@ -4942,9 +10081,29 @@
"name": "israel",
"shortname": ":flag_il:",
"category": "flags",
- "aliases": [":il:"],
+ "aliases": [
+ ":il:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "yisra'el",
+ "yisrael",
+ "il"
+ ]
+ },
+ "flag_im": {
+ "unicode": "1F1EE-1F1F2",
+ "unicode_alternates": "",
+ "name": "isle of man",
+ "shortname": ":flag_im:",
+ "category": "flags",
+ "aliases": [
+ ":im:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "yisra'el", "yisrael", "il"]
+ "keywords": []
},
"flag_in": {
"unicode": "1F1EE-1F1F3",
@@ -4952,9 +10111,28 @@
"name": "india",
"shortname": ":flag_in:",
"category": "flags",
- "aliases": [":in:"],
+ "aliases": [
+ ":in:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "bharat",
+ "in"
+ ]
+ },
+ "flag_io": {
+ "unicode": "1F1EE-1F1F4",
+ "unicode_alternates": "",
+ "name": "british indian ocean territory",
+ "shortname": ":flag_io:",
+ "category": "flags",
+ "aliases": [
+ ":io:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "bharat", "in"]
+ "keywords": []
},
"flag_iq": {
"unicode": "1F1EE-1F1F6",
@@ -4962,9 +10140,15 @@
"name": "iraq",
"shortname": ":flag_iq:",
"category": "flags",
- "aliases": [":iq:"],
+ "aliases": [
+ ":iq:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "iq"]
+ "keywords": [
+ "country",
+ "nation",
+ "iq"
+ ]
},
"flag_ir": {
"unicode": "1F1EE-1F1F7",
@@ -4972,9 +10156,15 @@
"name": "iran",
"shortname": ":flag_ir:",
"category": "flags",
- "aliases": [":ir:"],
+ "aliases": [
+ ":ir:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "ir"]
+ "keywords": [
+ "country",
+ "nation",
+ "ir"
+ ]
},
"flag_is": {
"unicode": "1F1EE-1F1F8",
@@ -4982,9 +10172,16 @@
"name": "iceland",
"shortname": ":flag_is:",
"category": "flags",
- "aliases": [":is:"],
+ "aliases": [
+ ":is:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "lyoveldio island", "is"]
+ "keywords": [
+ "country",
+ "nation",
+ "lyoveldio island",
+ "is"
+ ]
},
"flag_it": {
"unicode": "1F1EE-1F1F9",
@@ -4992,9 +10189,16 @@
"name": "italy",
"shortname": ":flag_it:",
"category": "flags",
- "aliases": [":it:"],
+ "aliases": [
+ ":it:"
+ ],
"aliases_ascii": [],
- "keywords": ["italia", "country", "nation", "it"]
+ "keywords": [
+ "italia",
+ "country",
+ "nation",
+ "it"
+ ]
},
"flag_je": {
"unicode": "1F1EF-1F1EA",
@@ -5002,9 +10206,15 @@
"name": "jersey",
"shortname": ":flag_je:",
"category": "flags",
- "aliases": [":je:"],
+ "aliases": [
+ ":je:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "je"]
+ "keywords": [
+ "country",
+ "nation",
+ "je"
+ ]
},
"flag_jm": {
"unicode": "1F1EF-1F1F2",
@@ -5012,9 +10222,15 @@
"name": "jamaica",
"shortname": ":flag_jm:",
"category": "flags",
- "aliases": [":jm:"],
+ "aliases": [
+ ":jm:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "jm"]
+ "keywords": [
+ "country",
+ "nation",
+ "jm"
+ ]
},
"flag_jo": {
"unicode": "1F1EF-1F1F4",
@@ -5022,9 +10238,16 @@
"name": "jordan",
"shortname": ":flag_jo:",
"category": "flags",
- "aliases": [":jo:"],
+ "aliases": [
+ ":jo:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "al urdun", "jo"]
+ "keywords": [
+ "country",
+ "nation",
+ "al urdun",
+ "jo"
+ ]
},
"flag_jp": {
"unicode": "1F1EF-1F1F5",
@@ -5032,9 +10255,16 @@
"name": "japan",
"shortname": ":flag_jp:",
"category": "flags",
- "aliases": [":jp:"],
+ "aliases": [
+ ":jp:"
+ ],
"aliases_ascii": [],
- "keywords": ["nation", "nippon", "country", "jp"]
+ "keywords": [
+ "nation",
+ "nippon",
+ "country",
+ "jp"
+ ]
},
"flag_ke": {
"unicode": "1F1F0-1F1EA",
@@ -5042,9 +10272,15 @@
"name": "kenya",
"shortname": ":flag_ke:",
"category": "flags",
- "aliases": [":ke:"],
+ "aliases": [
+ ":ke:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "ke"]
+ "keywords": [
+ "country",
+ "nation",
+ "ke"
+ ]
},
"flag_kg": {
"unicode": "1F1F0-1F1EC",
@@ -5052,9 +10288,16 @@
"name": "kyrgyzstan",
"shortname": ":flag_kg:",
"category": "flags",
- "aliases": [":kg:"],
+ "aliases": [
+ ":kg:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "kyrgyz respublikasy", "kg"]
+ "keywords": [
+ "country",
+ "nation",
+ "kyrgyz respublikasy",
+ "kg"
+ ]
},
"flag_kh": {
"unicode": "1F1F0-1F1ED",
@@ -5062,9 +10305,16 @@
"name": "cambodia",
"shortname": ":flag_kh:",
"category": "flags",
- "aliases": [":kh:"],
+ "aliases": [
+ ":kh:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "kampuchea", "kh"]
+ "keywords": [
+ "country",
+ "nation",
+ "kampuchea",
+ "kh"
+ ]
},
"flag_ki": {
"unicode": "1F1F0-1F1EE",
@@ -5072,9 +10322,17 @@
"name": "kiribati",
"shortname": ":flag_ki:",
"category": "flags",
- "aliases": [":ki:"],
- "aliases_ascii": [],
- "keywords": ["country", "nation", "kiribati", "kiribas", "ki"]
+ "aliases": [
+ ":ki:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "kiribati",
+ "kiribas",
+ "ki"
+ ]
},
"flag_km": {
"unicode": "1F1F0-1F1F2",
@@ -5082,9 +10340,15 @@
"name": "the comoros",
"shortname": ":flag_km:",
"category": "flags",
- "aliases": [":km:"],
+ "aliases": [
+ ":km:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "km"]
+ "keywords": [
+ "country",
+ "nation",
+ "km"
+ ]
},
"flag_kn": {
"unicode": "1F1F0-1F1F3",
@@ -5092,9 +10356,15 @@
"name": "saint kitts and nevis",
"shortname": ":flag_kn:",
"category": "flags",
- "aliases": [":kn:"],
+ "aliases": [
+ ":kn:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "kn"]
+ "keywords": [
+ "country",
+ "nation",
+ "kn"
+ ]
},
"flag_kp": {
"unicode": "1F1F0-1F1F5",
@@ -5102,9 +10372,15 @@
"name": "north korea",
"shortname": ":flag_kp:",
"category": "flags",
- "aliases": [":kp:"],
+ "aliases": [
+ ":kp:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "kp"]
+ "keywords": [
+ "country",
+ "nation",
+ "kp"
+ ]
},
"flag_kr": {
"unicode": "1F1F0-1F1F7",
@@ -5112,9 +10388,16 @@
"name": "korea",
"shortname": ":flag_kr:",
"category": "flags",
- "aliases": [":kr:"],
+ "aliases": [
+ ":kr:"
+ ],
"aliases_ascii": [],
- "keywords": ["nation", "country", "south korea", "kr"]
+ "keywords": [
+ "nation",
+ "country",
+ "south korea",
+ "kr"
+ ]
},
"flag_kw": {
"unicode": "1F1F0-1F1FC",
@@ -5122,9 +10405,16 @@
"name": "kuwait",
"shortname": ":flag_kw:",
"category": "flags",
- "aliases": [":kw:"],
+ "aliases": [
+ ":kw:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "al kuwayt", "kw"]
+ "keywords": [
+ "country",
+ "nation",
+ "al kuwayt",
+ "kw"
+ ]
},
"flag_ky": {
"unicode": "1F1F0-1F1FE",
@@ -5132,9 +10422,15 @@
"name": "cayman islands",
"shortname": ":flag_ky:",
"category": "flags",
- "aliases": [":ky:"],
+ "aliases": [
+ ":ky:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "ky"]
+ "keywords": [
+ "country",
+ "nation",
+ "ky"
+ ]
},
"flag_kz": {
"unicode": "1F1F0-1F1FF",
@@ -5142,9 +10438,16 @@
"name": "kazakhstan",
"shortname": ":flag_kz:",
"category": "flags",
- "aliases": [":kz:"],
+ "aliases": [
+ ":kz:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "qazaqstan", "kz"]
+ "keywords": [
+ "country",
+ "nation",
+ "qazaqstan",
+ "kz"
+ ]
},
"flag_la": {
"unicode": "1F1F1-1F1E6",
@@ -5152,9 +10455,15 @@
"name": "laos",
"shortname": ":flag_la:",
"category": "flags",
- "aliases": [":la:"],
+ "aliases": [
+ ":la:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "la"]
+ "keywords": [
+ "country",
+ "nation",
+ "la"
+ ]
},
"flag_lb": {
"unicode": "1F1F1-1F1E7",
@@ -5162,9 +10471,16 @@
"name": "lebanon",
"shortname": ":flag_lb:",
"category": "flags",
- "aliases": [":lb:"],
+ "aliases": [
+ ":lb:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "lubnan", "lb"]
+ "keywords": [
+ "country",
+ "nation",
+ "lubnan",
+ "lb"
+ ]
},
"flag_lc": {
"unicode": "1F1F1-1F1E8",
@@ -5172,9 +10488,15 @@
"name": "saint lucia",
"shortname": ":flag_lc:",
"category": "flags",
- "aliases": [":lc:"],
+ "aliases": [
+ ":lc:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "lc"]
+ "keywords": [
+ "country",
+ "nation",
+ "lc"
+ ]
},
"flag_li": {
"unicode": "1F1F1-1F1EE",
@@ -5182,9 +10504,15 @@
"name": "liechtenstein",
"shortname": ":flag_li:",
"category": "flags",
- "aliases": [":li:"],
+ "aliases": [
+ ":li:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "li"]
+ "keywords": [
+ "country",
+ "nation",
+ "li"
+ ]
},
"flag_lk": {
"unicode": "1F1F1-1F1F0",
@@ -5192,9 +10520,15 @@
"name": "sri lanka",
"shortname": ":flag_lk:",
"category": "flags",
- "aliases": [":lk:"],
+ "aliases": [
+ ":lk:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "lk"]
+ "keywords": [
+ "country",
+ "nation",
+ "lk"
+ ]
},
"flag_lr": {
"unicode": "1F1F1-1F1F7",
@@ -5202,9 +10536,15 @@
"name": "liberia",
"shortname": ":flag_lr:",
"category": "flags",
- "aliases": [":lr:"],
+ "aliases": [
+ ":lr:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "lr"]
+ "keywords": [
+ "country",
+ "nation",
+ "lr"
+ ]
},
"flag_ls": {
"unicode": "1F1F1-1F1F8",
@@ -5212,9 +10552,15 @@
"name": "lesotho",
"shortname": ":flag_ls:",
"category": "flags",
- "aliases": [":ls:"],
+ "aliases": [
+ ":ls:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "ls"]
+ "keywords": [
+ "country",
+ "nation",
+ "ls"
+ ]
},
"flag_lt": {
"unicode": "1F1F1-1F1F9",
@@ -5222,9 +10568,16 @@
"name": "lithuania",
"shortname": ":flag_lt:",
"category": "flags",
- "aliases": [":lt:"],
+ "aliases": [
+ ":lt:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "lietuva", "lt"]
+ "keywords": [
+ "country",
+ "nation",
+ "lietuva",
+ "lt"
+ ]
},
"flag_lu": {
"unicode": "1F1F1-1F1FA",
@@ -5232,9 +10585,17 @@
"name": "luxembourg",
"shortname": ":flag_lu:",
"category": "flags",
- "aliases": [":lu:"],
- "aliases_ascii": [],
- "keywords": ["country", "nation", "luxembourg", "letzebuerg", "lu"]
+ "aliases": [
+ ":lu:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "luxembourg",
+ "letzebuerg",
+ "lu"
+ ]
},
"flag_lv": {
"unicode": "1F1F1-1F1FB",
@@ -5242,9 +10603,16 @@
"name": "latvia",
"shortname": ":flag_lv:",
"category": "flags",
- "aliases": [":lv:"],
+ "aliases": [
+ ":lv:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "latvija", "lv"]
+ "keywords": [
+ "country",
+ "nation",
+ "latvija",
+ "lv"
+ ]
},
"flag_ly": {
"unicode": "1F1F1-1F1FE",
@@ -5252,9 +10620,16 @@
"name": "libya",
"shortname": ":flag_ly:",
"category": "flags",
- "aliases": [":ly:"],
+ "aliases": [
+ ":ly:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "libiyah", "ly"]
+ "keywords": [
+ "country",
+ "nation",
+ "libiyah",
+ "ly"
+ ]
},
"flag_ma": {
"unicode": "1F1F2-1F1E6",
@@ -5262,9 +10637,16 @@
"name": "morocco",
"shortname": ":flag_ma:",
"category": "flags",
- "aliases": [":ma:"],
+ "aliases": [
+ ":ma:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "al maghrib", "ma"]
+ "keywords": [
+ "country",
+ "nation",
+ "al maghrib",
+ "ma"
+ ]
},
"flag_mc": {
"unicode": "1F1F2-1F1E8",
@@ -5272,9 +10654,15 @@
"name": "monaco",
"shortname": ":flag_mc:",
"category": "flags",
- "aliases": [":mc:"],
+ "aliases": [
+ ":mc:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "mc"]
+ "keywords": [
+ "country",
+ "nation",
+ "mc"
+ ]
},
"flag_md": {
"unicode": "1F1F2-1F1E9",
@@ -5282,9 +10670,15 @@
"name": "moldova",
"shortname": ":flag_md:",
"category": "flags",
- "aliases": [":md:"],
+ "aliases": [
+ ":md:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "md"]
+ "keywords": [
+ "country",
+ "nation",
+ "md"
+ ]
},
"flag_me": {
"unicode": "1F1F2-1F1EA",
@@ -5292,9 +10686,28 @@
"name": "montenegro",
"shortname": ":flag_me:",
"category": "flags",
- "aliases": [":me:"],
+ "aliases": [
+ ":me:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "crna gora",
+ "me"
+ ]
+ },
+ "flag_mf": {
+ "unicode": "1F1F2-1F1EB",
+ "unicode_alternates": "",
+ "name": "saint martin",
+ "shortname": ":flag_mf:",
+ "category": "flags",
+ "aliases": [
+ ":mf:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "crna gora", "me"]
+ "keywords": []
},
"flag_mg": {
"unicode": "1F1F2-1F1EC",
@@ -5302,9 +10715,15 @@
"name": "madagascar",
"shortname": ":flag_mg:",
"category": "flags",
- "aliases": [":mg:"],
+ "aliases": [
+ ":mg:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "mg"]
+ "keywords": [
+ "country",
+ "nation",
+ "mg"
+ ]
},
"flag_mh": {
"unicode": "1F1F2-1F1ED",
@@ -5312,9 +10731,15 @@
"name": "the marshall islands",
"shortname": ":flag_mh:",
"category": "flags",
- "aliases": [":mh:"],
+ "aliases": [
+ ":mh:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "mh"]
+ "keywords": [
+ "country",
+ "nation",
+ "mh"
+ ]
},
"flag_mk": {
"unicode": "1F1F2-1F1F0",
@@ -5322,9 +10747,15 @@
"name": "macedonia",
"shortname": ":flag_mk:",
"category": "flags",
- "aliases": [":mk:"],
+ "aliases": [
+ ":mk:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "mk"]
+ "keywords": [
+ "country",
+ "nation",
+ "mk"
+ ]
},
"flag_ml": {
"unicode": "1F1F2-1F1F1",
@@ -5332,9 +10763,15 @@
"name": "mali",
"shortname": ":flag_ml:",
"category": "flags",
- "aliases": [":ml:"],
+ "aliases": [
+ ":ml:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "ml"]
+ "keywords": [
+ "country",
+ "nation",
+ "ml"
+ ]
},
"flag_mm": {
"unicode": "1F1F2-1F1F2",
@@ -5342,9 +10779,16 @@
"name": "myanmar",
"shortname": ":flag_mm:",
"category": "flags",
- "aliases": [":mm:"],
+ "aliases": [
+ ":mm:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "myanma naingngandaw", "mm"]
+ "keywords": [
+ "country",
+ "nation",
+ "myanma naingngandaw",
+ "mm"
+ ]
},
"flag_mn": {
"unicode": "1F1F2-1F1F3",
@@ -5352,9 +10796,16 @@
"name": "mongolia",
"shortname": ":flag_mn:",
"category": "flags",
- "aliases": [":mn:"],
+ "aliases": [
+ ":mn:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "mongol uls", "mn"]
+ "keywords": [
+ "country",
+ "nation",
+ "mongol uls",
+ "mn"
+ ]
},
"flag_mo": {
"unicode": "1F1F2-1F1F4",
@@ -5362,9 +10813,40 @@
"name": "macau",
"shortname": ":flag_mo:",
"category": "flags",
- "aliases": [":mo:"],
+ "aliases": [
+ ":mo:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "aomen",
+ "mo"
+ ]
+ },
+ "flag_mp": {
+ "unicode": "1F1F2-1F1F5",
+ "unicode_alternates": "",
+ "name": "northern mariana islands",
+ "shortname": ":flag_mp:",
+ "category": "flags",
+ "aliases": [
+ ":mp:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "aomen", "mo"]
+ "keywords": []
+ },
+ "flag_mq": {
+ "unicode": "1F1F2-1F1F6",
+ "unicode_alternates": "",
+ "name": "martinique",
+ "shortname": ":flag_mq:",
+ "category": "flags",
+ "aliases": [
+ ":mq:"
+ ],
+ "aliases_ascii": [],
+ "keywords": []
},
"flag_mr": {
"unicode": "1F1F2-1F1F7",
@@ -5372,9 +10854,16 @@
"name": "mauritania",
"shortname": ":flag_mr:",
"category": "flags",
- "aliases": [":mr:"],
+ "aliases": [
+ ":mr:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "muritaniyah", "mr"]
+ "keywords": [
+ "country",
+ "nation",
+ "muritaniyah",
+ "mr"
+ ]
},
"flag_ms": {
"unicode": "1F1F2-1F1F8",
@@ -5382,9 +10871,15 @@
"name": "montserrat",
"shortname": ":flag_ms:",
"category": "flags",
- "aliases": [":ms:"],
+ "aliases": [
+ ":ms:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "ms"]
+ "keywords": [
+ "country",
+ "nation",
+ "ms"
+ ]
},
"flag_mt": {
"unicode": "1F1F2-1F1F9",
@@ -5392,9 +10887,15 @@
"name": "malta",
"shortname": ":flag_mt:",
"category": "flags",
- "aliases": [":mt:"],
+ "aliases": [
+ ":mt:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "mt"]
+ "keywords": [
+ "country",
+ "nation",
+ "mt"
+ ]
},
"flag_mu": {
"unicode": "1F1F2-1F1FA",
@@ -5402,9 +10903,15 @@
"name": "mauritius",
"shortname": ":flag_mu:",
"category": "flags",
- "aliases": [":mu:"],
+ "aliases": [
+ ":mu:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "mu"]
+ "keywords": [
+ "country",
+ "nation",
+ "mu"
+ ]
},
"flag_mv": {
"unicode": "1F1F2-1F1FB",
@@ -5412,9 +10919,16 @@
"name": "maldives",
"shortname": ":flag_mv:",
"category": "flags",
- "aliases": [":mv:"],
+ "aliases": [
+ ":mv:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "dhivehi raajje", "mv"]
+ "keywords": [
+ "country",
+ "nation",
+ "dhivehi raajje",
+ "mv"
+ ]
},
"flag_mw": {
"unicode": "1F1F2-1F1FC",
@@ -5422,9 +10936,15 @@
"name": "malawi",
"shortname": ":flag_mw:",
"category": "flags",
- "aliases": [":mw:"],
+ "aliases": [
+ ":mw:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "mw"]
+ "keywords": [
+ "country",
+ "nation",
+ "mw"
+ ]
},
"flag_mx": {
"unicode": "1F1F2-1F1FD",
@@ -5432,9 +10952,15 @@
"name": "mexico",
"shortname": ":flag_mx:",
"category": "flags",
- "aliases": [":mx:"],
+ "aliases": [
+ ":mx:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "mx"]
+ "keywords": [
+ "country",
+ "nation",
+ "mx"
+ ]
},
"flag_my": {
"unicode": "1F1F2-1F1FE",
@@ -5442,9 +10968,15 @@
"name": "malaysia",
"shortname": ":flag_my:",
"category": "flags",
- "aliases": [":my:"],
+ "aliases": [
+ ":my:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "my"]
+ "keywords": [
+ "country",
+ "nation",
+ "my"
+ ]
},
"flag_mz": {
"unicode": "1F1F2-1F1FF",
@@ -5452,9 +10984,16 @@
"name": "mozambique",
"shortname": ":flag_mz:",
"category": "flags",
- "aliases": [":mz:"],
+ "aliases": [
+ ":mz:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "mocambique", "mz"]
+ "keywords": [
+ "country",
+ "nation",
+ "mocambique",
+ "mz"
+ ]
},
"flag_na": {
"unicode": "1F1F3-1F1E6",
@@ -5462,9 +11001,15 @@
"name": "namibia",
"shortname": ":flag_na:",
"category": "flags",
- "aliases": [":na:"],
+ "aliases": [
+ ":na:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "na"]
+ "keywords": [
+ "country",
+ "nation",
+ "na"
+ ]
},
"flag_nc": {
"unicode": "1F1F3-1F1E8",
@@ -5472,9 +11017,18 @@
"name": "new caledonia",
"shortname": ":flag_nc:",
"category": "flags",
- "aliases": [":nc:"],
- "aliases_ascii": [],
- "keywords": ["country", "nation", "nouvelle", "cal&eacute;donie", "caledonie", "nc"]
+ "aliases": [
+ ":nc:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "nouvelle",
+ "cal&eacute;donie",
+ "caledonie",
+ "nc"
+ ]
},
"flag_ne": {
"unicode": "1F1F3-1F1EA",
@@ -5482,9 +11036,27 @@
"name": "niger",
"shortname": ":flag_ne:",
"category": "flags",
- "aliases": [":ne:"],
+ "aliases": [
+ ":ne:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "ne"
+ ]
+ },
+ "flag_nf": {
+ "unicode": "1F1F3-1F1EB",
+ "unicode_alternates": "",
+ "name": "norfolk island",
+ "shortname": ":flag_nf:",
+ "category": "flags",
+ "aliases": [
+ ":nf:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "ne"]
+ "keywords": []
},
"flag_ng": {
"unicode": "1F1F3-1F1EC",
@@ -5492,9 +11064,15 @@
"name": "nigeria",
"shortname": ":flag_ng:",
"category": "flags",
- "aliases": [":nigeria:"],
+ "aliases": [
+ ":nigeria:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "ng"]
+ "keywords": [
+ "country",
+ "nation",
+ "ng"
+ ]
},
"flag_ni": {
"unicode": "1F1F3-1F1EE",
@@ -5502,9 +11080,15 @@
"name": "nicaragua",
"shortname": ":flag_ni:",
"category": "flags",
- "aliases": [":ni:"],
+ "aliases": [
+ ":ni:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "ni"]
+ "keywords": [
+ "country",
+ "nation",
+ "ni"
+ ]
},
"flag_nl": {
"unicode": "1F1F3-1F1F1",
@@ -5512,9 +11096,17 @@
"name": "the netherlands",
"shortname": ":flag_nl:",
"category": "flags",
- "aliases": [":nl:"],
- "aliases_ascii": [],
- "keywords": ["country", "nation", "nederland", "holland", "nl"]
+ "aliases": [
+ ":nl:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "nederland",
+ "holland",
+ "nl"
+ ]
},
"flag_no": {
"unicode": "1F1F3-1F1F4",
@@ -5522,9 +11114,16 @@
"name": "norway",
"shortname": ":flag_no:",
"category": "flags",
- "aliases": [":no:"],
+ "aliases": [
+ ":no:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "norge", "no"]
+ "keywords": [
+ "country",
+ "nation",
+ "norge",
+ "no"
+ ]
},
"flag_np": {
"unicode": "1F1F3-1F1F5",
@@ -5532,9 +11131,15 @@
"name": "nepal",
"shortname": ":flag_np:",
"category": "flags",
- "aliases": [":np:"],
+ "aliases": [
+ ":np:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "np"]
+ "keywords": [
+ "country",
+ "nation",
+ "np"
+ ]
},
"flag_nr": {
"unicode": "1F1F3-1F1F7",
@@ -5542,9 +11147,15 @@
"name": "nauru",
"shortname": ":flag_nr:",
"category": "flags",
- "aliases": [":nr:"],
+ "aliases": [
+ ":nr:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "nr"]
+ "keywords": [
+ "country",
+ "nation",
+ "nr"
+ ]
},
"flag_nu": {
"unicode": "1F1F3-1F1FA",
@@ -5552,9 +11163,15 @@
"name": "niue",
"shortname": ":flag_nu:",
"category": "flags",
- "aliases": [":nu:"],
+ "aliases": [
+ ":nu:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "nu"]
+ "keywords": [
+ "country",
+ "nation",
+ "nu"
+ ]
},
"flag_nz": {
"unicode": "1F1F3-1F1FF",
@@ -5562,9 +11179,16 @@
"name": "new zealand",
"shortname": ":flag_nz:",
"category": "flags",
- "aliases": [":nz:"],
+ "aliases": [
+ ":nz:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "aotearoa", "nz"]
+ "keywords": [
+ "country",
+ "nation",
+ "aotearoa",
+ "nz"
+ ]
},
"flag_om": {
"unicode": "1F1F4-1F1F2",
@@ -5572,9 +11196,16 @@
"name": "oman",
"shortname": ":flag_om:",
"category": "flags",
- "aliases": [":om:"],
+ "aliases": [
+ ":om:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "saltanat uman", "om"]
+ "keywords": [
+ "country",
+ "nation",
+ "saltanat uman",
+ "om"
+ ]
},
"flag_pa": {
"unicode": "1F1F5-1F1E6",
@@ -5582,9 +11213,15 @@
"name": "panama",
"shortname": ":flag_pa:",
"category": "flags",
- "aliases": [":pa:"],
+ "aliases": [
+ ":pa:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "pa"]
+ "keywords": [
+ "country",
+ "nation",
+ "pa"
+ ]
},
"flag_pe": {
"unicode": "1F1F5-1F1EA",
@@ -5592,9 +11229,15 @@
"name": "peru",
"shortname": ":flag_pe:",
"category": "flags",
- "aliases": [":pe:"],
+ "aliases": [
+ ":pe:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "pe"]
+ "keywords": [
+ "country",
+ "nation",
+ "pe"
+ ]
},
"flag_pf": {
"unicode": "1F1F5-1F1EB",
@@ -5602,9 +11245,17 @@
"name": "french polynesia",
"shortname": ":flag_pf:",
"category": "flags",
- "aliases": [":pf:"],
- "aliases_ascii": [],
- "keywords": ["country", "nation", "polyn&eacute;sie fran&ccedil;aise", "polynesie francaise", "pf"]
+ "aliases": [
+ ":pf:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "polyn&eacute;sie fran&ccedil;aise",
+ "polynesie francaise",
+ "pf"
+ ]
},
"flag_pg": {
"unicode": "1F1F5-1F1EC",
@@ -5612,9 +11263,16 @@
"name": "papua new guinea",
"shortname": ":flag_pg:",
"category": "flags",
- "aliases": [":pg:"],
+ "aliases": [
+ ":pg:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "papua niu gini", "pg"]
+ "keywords": [
+ "country",
+ "nation",
+ "papua niu gini",
+ "pg"
+ ]
},
"flag_ph": {
"unicode": "1F1F5-1F1ED",
@@ -5622,9 +11280,16 @@
"name": "the philippines",
"shortname": ":flag_ph:",
"category": "flags",
- "aliases": [":ph:"],
+ "aliases": [
+ ":ph:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "pilipinas", "ph"]
+ "keywords": [
+ "country",
+ "nation",
+ "pilipinas",
+ "ph"
+ ]
},
"flag_pk": {
"unicode": "1F1F5-1F1F0",
@@ -5632,9 +11297,15 @@
"name": "pakistan",
"shortname": ":flag_pk:",
"category": "flags",
- "aliases": [":pk:"],
+ "aliases": [
+ ":pk:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "pk"]
+ "keywords": [
+ "country",
+ "nation",
+ "pk"
+ ]
},
"flag_pl": {
"unicode": "1F1F5-1F1F1",
@@ -5642,9 +11313,40 @@
"name": "poland",
"shortname": ":flag_pl:",
"category": "flags",
- "aliases": [":pl:"],
+ "aliases": [
+ ":pl:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "polska",
+ "pl"
+ ]
+ },
+ "flag_pm": {
+ "unicode": "1F1F5-1F1F2",
+ "unicode_alternates": "",
+ "name": "saint pierre and miquelon",
+ "shortname": ":flag_pm:",
+ "category": "flags",
+ "aliases": [
+ ":pm:"
+ ],
+ "aliases_ascii": [],
+ "keywords": []
+ },
+ "flag_pn": {
+ "unicode": "1F1F5-1F1F3",
+ "unicode_alternates": "",
+ "name": "pitcairn",
+ "shortname": ":flag_pn:",
+ "category": "flags",
+ "aliases": [
+ ":pn:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "polska", "pl"]
+ "keywords": []
},
"flag_pr": {
"unicode": "1F1F5-1F1F7",
@@ -5652,9 +11354,15 @@
"name": "puerto rico",
"shortname": ":flag_pr:",
"category": "flags",
- "aliases": [":pr:"],
+ "aliases": [
+ ":pr:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "pr"]
+ "keywords": [
+ "country",
+ "nation",
+ "pr"
+ ]
},
"flag_ps": {
"unicode": "1F1F5-1F1F8",
@@ -5662,9 +11370,15 @@
"name": "palestinian authority",
"shortname": ":flag_ps:",
"category": "flags",
- "aliases": [":ps:"],
+ "aliases": [
+ ":ps:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "ps"]
+ "keywords": [
+ "country",
+ "nation",
+ "ps"
+ ]
},
"flag_pt": {
"unicode": "1F1F5-1F1F9",
@@ -5672,9 +11386,15 @@
"name": "portugal",
"shortname": ":flag_pt:",
"category": "flags",
- "aliases": [":pt:"],
+ "aliases": [
+ ":pt:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "pt"]
+ "keywords": [
+ "country",
+ "nation",
+ "pt"
+ ]
},
"flag_pw": {
"unicode": "1F1F5-1F1FC",
@@ -5682,9 +11402,16 @@
"name": "palau",
"shortname": ":flag_pw:",
"category": "flags",
- "aliases": [":pw:"],
+ "aliases": [
+ ":pw:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "belau", "pw"]
+ "keywords": [
+ "country",
+ "nation",
+ "belau",
+ "pw"
+ ]
},
"flag_py": {
"unicode": "1F1F5-1F1FE",
@@ -5692,9 +11419,15 @@
"name": "paraguay",
"shortname": ":flag_py:",
"category": "flags",
- "aliases": [":py:"],
+ "aliases": [
+ ":py:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "py"]
+ "keywords": [
+ "country",
+ "nation",
+ "py"
+ ]
},
"flag_qa": {
"unicode": "1F1F6-1F1E6",
@@ -5702,9 +11435,28 @@
"name": "qatar",
"shortname": ":flag_qa:",
"category": "flags",
- "aliases": [":qa:"],
+ "aliases": [
+ ":qa:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "dawlat qatar",
+ "qa"
+ ]
+ },
+ "flag_re": {
+ "unicode": "1F1F7-1F1EA",
+ "unicode_alternates": "",
+ "name": "réunion",
+ "shortname": ":flag_re:",
+ "category": "flags",
+ "aliases": [
+ ":re:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "dawlat qatar", "qa"]
+ "keywords": []
},
"flag_ro": {
"unicode": "1F1F7-1F1F4",
@@ -5712,9 +11464,15 @@
"name": "romania",
"shortname": ":flag_ro:",
"category": "flags",
- "aliases": [":ro:"],
+ "aliases": [
+ ":ro:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "ro"]
+ "keywords": [
+ "country",
+ "nation",
+ "ro"
+ ]
},
"flag_rs": {
"unicode": "1F1F7-1F1F8",
@@ -5722,9 +11480,16 @@
"name": "serbia",
"shortname": ":flag_rs:",
"category": "flags",
- "aliases": [":rs:"],
+ "aliases": [
+ ":rs:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "srbija", "rs"]
+ "keywords": [
+ "country",
+ "nation",
+ "srbija",
+ "rs"
+ ]
},
"flag_ru": {
"unicode": "1F1F7-1F1FA",
@@ -5732,9 +11497,16 @@
"name": "russia",
"shortname": ":flag_ru:",
"category": "flags",
- "aliases": [":ru:"],
+ "aliases": [
+ ":ru:"
+ ],
"aliases_ascii": [],
- "keywords": ["nation", "russian", "country", "ru"]
+ "keywords": [
+ "nation",
+ "russian",
+ "country",
+ "ru"
+ ]
},
"flag_rw": {
"unicode": "1F1F7-1F1FC",
@@ -5742,9 +11514,15 @@
"name": "rwanda",
"shortname": ":flag_rw:",
"category": "flags",
- "aliases": [":rw:"],
+ "aliases": [
+ ":rw:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "rw"]
+ "keywords": [
+ "country",
+ "nation",
+ "rw"
+ ]
},
"flag_sa": {
"unicode": "1F1F8-1F1E6",
@@ -5752,9 +11530,17 @@
"name": "saudi arabia",
"shortname": ":flag_sa:",
"category": "flags",
- "aliases": [":saudiarabia:", ":saudi:"],
- "aliases_ascii": [],
- "keywords": ["country", "nation", "al arabiyah as suudiyah", "sa"]
+ "aliases": [
+ ":saudiarabia:",
+ ":saudi:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "al arabiyah as suudiyah",
+ "sa"
+ ]
},
"flag_sb": {
"unicode": "1F1F8-1F1E7",
@@ -5762,9 +11548,15 @@
"name": "the solomon islands",
"shortname": ":flag_sb:",
"category": "flags",
- "aliases": [":sb:"],
+ "aliases": [
+ ":sb:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "sb"]
+ "keywords": [
+ "country",
+ "nation",
+ "sb"
+ ]
},
"flag_sc": {
"unicode": "1F1F8-1F1E8",
@@ -5772,9 +11564,16 @@
"name": "the seychelles",
"shortname": ":flag_sc:",
"category": "flags",
- "aliases": [":sc:"],
+ "aliases": [
+ ":sc:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "seychelles", "sc"]
+ "keywords": [
+ "country",
+ "nation",
+ "seychelles",
+ "sc"
+ ]
},
"flag_sd": {
"unicode": "1F1F8-1F1E9",
@@ -5782,9 +11581,16 @@
"name": "sudan",
"shortname": ":flag_sd:",
"category": "flags",
- "aliases": [":sd:"],
+ "aliases": [
+ ":sd:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "as-sudan", "sd"]
+ "keywords": [
+ "country",
+ "nation",
+ "as-sudan",
+ "sd"
+ ]
},
"flag_se": {
"unicode": "1F1F8-1F1EA",
@@ -5792,9 +11598,16 @@
"name": "sweden",
"shortname": ":flag_se:",
"category": "flags",
- "aliases": [":se:"],
+ "aliases": [
+ ":se:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "sverige", "se"]
+ "keywords": [
+ "country",
+ "nation",
+ "sverige",
+ "se"
+ ]
},
"flag_sg": {
"unicode": "1F1F8-1F1EC",
@@ -5802,9 +11615,15 @@
"name": "singapore",
"shortname": ":flag_sg:",
"category": "flags",
- "aliases": [":sg:"],
+ "aliases": [
+ ":sg:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "sg"]
+ "keywords": [
+ "country",
+ "nation",
+ "sg"
+ ]
},
"flag_sh": {
"unicode": "1F1F8-1F1ED",
@@ -5812,9 +11631,15 @@
"name": "saint helena",
"shortname": ":flag_sh:",
"category": "flags",
- "aliases": [":sh:"],
+ "aliases": [
+ ":sh:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "sh"]
+ "keywords": [
+ "country",
+ "nation",
+ "sh"
+ ]
},
"flag_si": {
"unicode": "1F1F8-1F1EE",
@@ -5822,9 +11647,28 @@
"name": "slovenia",
"shortname": ":flag_si:",
"category": "flags",
- "aliases": [":si:"],
+ "aliases": [
+ ":si:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "slovenija",
+ "si"
+ ]
+ },
+ "flag_sj": {
+ "unicode": "1F1F8-1F1EF",
+ "unicode_alternates": "",
+ "name": "svalbard and jan mayen",
+ "shortname": ":flag_sj:",
+ "category": "flags",
+ "aliases": [
+ ":sj:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "slovenija", "si"]
+ "keywords": []
},
"flag_sk": {
"unicode": "1F1F8-1F1F0",
@@ -5832,9 +11676,15 @@
"name": "slovakia",
"shortname": ":flag_sk:",
"category": "flags",
- "aliases": [":sk:"],
+ "aliases": [
+ ":sk:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "sk"]
+ "keywords": [
+ "country",
+ "nation",
+ "sk"
+ ]
},
"flag_sl": {
"unicode": "1F1F8-1F1F1",
@@ -5842,9 +11692,15 @@
"name": "sierra leone",
"shortname": ":flag_sl:",
"category": "flags",
- "aliases": [":sl:"],
+ "aliases": [
+ ":sl:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "sl"]
+ "keywords": [
+ "country",
+ "nation",
+ "sl"
+ ]
},
"flag_sm": {
"unicode": "1F1F8-1F1F2",
@@ -5852,9 +11708,15 @@
"name": "san marino",
"shortname": ":flag_sm:",
"category": "flags",
- "aliases": [":sm:"],
+ "aliases": [
+ ":sm:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "sm"]
+ "keywords": [
+ "country",
+ "nation",
+ "sm"
+ ]
},
"flag_sn": {
"unicode": "1F1F8-1F1F3",
@@ -5862,9 +11724,15 @@
"name": "senegal",
"shortname": ":flag_sn:",
"category": "flags",
- "aliases": [":sn:"],
+ "aliases": [
+ ":sn:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "sn"]
+ "keywords": [
+ "country",
+ "nation",
+ "sn"
+ ]
},
"flag_so": {
"unicode": "1F1F8-1F1F4",
@@ -5872,9 +11740,15 @@
"name": "somalia",
"shortname": ":flag_so:",
"category": "flags",
- "aliases": [":so:"],
+ "aliases": [
+ ":so:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "so"]
+ "keywords": [
+ "country",
+ "nation",
+ "so"
+ ]
},
"flag_sr": {
"unicode": "1F1F8-1F1F7",
@@ -5882,9 +11756,27 @@
"name": "suriname",
"shortname": ":flag_sr:",
"category": "flags",
- "aliases": [":sr:"],
+ "aliases": [
+ ":sr:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "sr"
+ ]
+ },
+ "flag_ss": {
+ "unicode": "1F1F8-1F1F8",
+ "unicode_alternates": "",
+ "name": "south sudan",
+ "shortname": ":flag_ss:",
+ "category": "flags",
+ "aliases": [
+ ":ss:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "sr"]
+ "keywords": []
},
"flag_st": {
"unicode": "1F1F8-1F1F9",
@@ -5892,9 +11784,16 @@
"name": "sao tome and principe",
"shortname": ":flag_st:",
"category": "flags",
- "aliases": [":st:"],
+ "aliases": [
+ ":st:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "sao tome e principe", "st"]
+ "keywords": [
+ "country",
+ "nation",
+ "sao tome e principe",
+ "st"
+ ]
},
"flag_sv": {
"unicode": "1F1F8-1F1FB",
@@ -5902,9 +11801,27 @@
"name": "el salvador",
"shortname": ":flag_sv:",
"category": "flags",
- "aliases": [":sv:"],
+ "aliases": [
+ ":sv:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "sv"
+ ]
+ },
+ "flag_sx": {
+ "unicode": "1F1F8-1F1FD",
+ "unicode_alternates": "",
+ "name": "sint maarten",
+ "shortname": ":flag_sx:",
+ "category": "flags",
+ "aliases": [
+ ":sx:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "sv"]
+ "keywords": []
},
"flag_sy": {
"unicode": "1F1F8-1F1FE",
@@ -5912,9 +11829,15 @@
"name": "syria",
"shortname": ":flag_sy:",
"category": "flags",
- "aliases": [":sy:"],
+ "aliases": [
+ ":sy:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "sy"]
+ "keywords": [
+ "country",
+ "nation",
+ "sy"
+ ]
},
"flag_sz": {
"unicode": "1F1F8-1F1FF",
@@ -5922,9 +11845,39 @@
"name": "swaziland",
"shortname": ":flag_sz:",
"category": "flags",
- "aliases": [":sz:"],
+ "aliases": [
+ ":sz:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "sz"
+ ]
+ },
+ "flag_ta": {
+ "unicode": "1F1F9-1F1E6",
+ "unicode_alternates": "",
+ "name": "tristan da cunha",
+ "shortname": ":flag_ta:",
+ "category": "flags",
+ "aliases": [
+ ":ta:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "sz"]
+ "keywords": []
+ },
+ "flag_tc": {
+ "unicode": "1F1F9-1F1E8",
+ "unicode_alternates": "",
+ "name": "turks and caicos islands",
+ "shortname": ":flag_tc:",
+ "category": "flags",
+ "aliases": [
+ ":tc:"
+ ],
+ "aliases_ascii": [],
+ "keywords": []
},
"flag_td": {
"unicode": "1F1F9-1F1E9",
@@ -5932,9 +11885,28 @@
"name": "chad",
"shortname": ":flag_td:",
"category": "flags",
- "aliases": [":td:"],
+ "aliases": [
+ ":td:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "tchad",
+ "td"
+ ]
+ },
+ "flag_tf": {
+ "unicode": "1F1F9-1F1EB",
+ "unicode_alternates": "",
+ "name": "french southern territories",
+ "shortname": ":flag_tf:",
+ "category": "flags",
+ "aliases": [
+ ":tf:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "tchad", "td"]
+ "keywords": []
},
"flag_tg": {
"unicode": "1F1F9-1F1EC",
@@ -5942,9 +11914,16 @@
"name": "togo",
"shortname": ":flag_tg:",
"category": "flags",
- "aliases": [":tg:"],
+ "aliases": [
+ ":tg:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "republique togolaise", "tg"]
+ "keywords": [
+ "country",
+ "nation",
+ "republique togolaise",
+ "tg"
+ ]
},
"flag_th": {
"unicode": "1F1F9-1F1ED",
@@ -5952,9 +11931,16 @@
"name": "thailand",
"shortname": ":flag_th:",
"category": "flags",
- "aliases": [":th:"],
+ "aliases": [
+ ":th:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "prathet thai", "th"]
+ "keywords": [
+ "country",
+ "nation",
+ "prathet thai",
+ "th"
+ ]
},
"flag_tj": {
"unicode": "1F1F9-1F1EF",
@@ -5962,9 +11948,28 @@
"name": "tajikistan",
"shortname": ":flag_tj:",
"category": "flags",
- "aliases": [":tj:"],
+ "aliases": [
+ ":tj:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "jumhurii tojikiston",
+ "tj"
+ ]
+ },
+ "flag_tk": {
+ "unicode": "1F1F9-1F1F0",
+ "unicode_alternates": "",
+ "name": "tokelau",
+ "shortname": ":flag_tk:",
+ "category": "flags",
+ "aliases": [
+ ":tk:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "jumhurii tojikiston", "tj"]
+ "keywords": []
},
"flag_tl": {
"unicode": "1F1F9-1F1F1",
@@ -5972,9 +11977,15 @@
"name": "east timor",
"shortname": ":flag_tl:",
"category": "flags",
- "aliases": [":tl:"],
+ "aliases": [
+ ":tl:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "tl"]
+ "keywords": [
+ "country",
+ "nation",
+ "tl"
+ ]
},
"flag_tm": {
"unicode": "1F1F9-1F1F2",
@@ -5982,9 +11993,15 @@
"name": "turkmenistan",
"shortname": ":flag_tm:",
"category": "flags",
- "aliases": [":turkmenistan:"],
+ "aliases": [
+ ":turkmenistan:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "tm"]
+ "keywords": [
+ "country",
+ "nation",
+ "tm"
+ ]
},
"flag_tn": {
"unicode": "1F1F9-1F1F3",
@@ -5992,9 +12009,16 @@
"name": "tunisia",
"shortname": ":flag_tn:",
"category": "flags",
- "aliases": [":tn:"],
+ "aliases": [
+ ":tn:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "tunis", "tn"]
+ "keywords": [
+ "country",
+ "nation",
+ "tunis",
+ "tn"
+ ]
},
"flag_to": {
"unicode": "1F1F9-1F1F4",
@@ -6002,9 +12026,15 @@
"name": "tonga",
"shortname": ":flag_to:",
"category": "flags",
- "aliases": [":to:"],
+ "aliases": [
+ ":to:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "to"]
+ "keywords": [
+ "country",
+ "nation",
+ "to"
+ ]
},
"flag_tr": {
"unicode": "1F1F9-1F1F7",
@@ -6012,9 +12042,15 @@
"name": "turkey",
"shortname": ":flag_tr:",
"category": "flags",
- "aliases": [":tr:"],
+ "aliases": [
+ ":tr:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "turkiye"]
+ "keywords": [
+ "country",
+ "nation",
+ "turkiye"
+ ]
},
"flag_tt": {
"unicode": "1F1F9-1F1F9",
@@ -6022,9 +12058,15 @@
"name": "trinidad and tobago",
"shortname": ":flag_tt:",
"category": "flags",
- "aliases": [":tt:"],
+ "aliases": [
+ ":tt:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "tt"]
+ "keywords": [
+ "country",
+ "nation",
+ "tt"
+ ]
},
"flag_tv": {
"unicode": "1F1F9-1F1FB",
@@ -6032,9 +12074,15 @@
"name": "tuvalu",
"shortname": ":flag_tv:",
"category": "flags",
- "aliases": [":tuvalu:"],
+ "aliases": [
+ ":tuvalu:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "tv"]
+ "keywords": [
+ "country",
+ "nation",
+ "tv"
+ ]
},
"flag_tw": {
"unicode": "1F1F9-1F1FC",
@@ -6042,9 +12090,16 @@
"name": "the republic of china",
"shortname": ":flag_tw:",
"category": "flags",
- "aliases": [":tw:"],
+ "aliases": [
+ ":tw:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "taiwan", "tw"]
+ "keywords": [
+ "country",
+ "nation",
+ "taiwan",
+ "tw"
+ ]
},
"flag_tz": {
"unicode": "1F1F9-1F1FF",
@@ -6052,9 +12107,15 @@
"name": "tanzania",
"shortname": ":flag_tz:",
"category": "flags",
- "aliases": [":tz:"],
+ "aliases": [
+ ":tz:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "tz"]
+ "keywords": [
+ "country",
+ "nation",
+ "tz"
+ ]
},
"flag_ua": {
"unicode": "1F1FA-1F1E6",
@@ -6062,9 +12123,16 @@
"name": "ukraine",
"shortname": ":flag_ua:",
"category": "flags",
- "aliases": [":ua:"],
+ "aliases": [
+ ":ua:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "ukrayina", "ua"]
+ "keywords": [
+ "country",
+ "nation",
+ "ukrayina",
+ "ua"
+ ]
},
"flag_ug": {
"unicode": "1F1FA-1F1EC",
@@ -6072,9 +12140,27 @@
"name": "uganda",
"shortname": ":flag_ug:",
"category": "flags",
- "aliases": [":ug:"],
+ "aliases": [
+ ":ug:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "ug"
+ ]
+ },
+ "flag_um": {
+ "unicode": "1F1FA-1F1F2",
+ "unicode_alternates": "",
+ "name": "united states minor outlying islands",
+ "shortname": ":flag_um:",
+ "category": "flags",
+ "aliases": [
+ ":um:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "ug"]
+ "keywords": []
},
"flag_us": {
"unicode": "1F1FA-1F1F8",
@@ -6082,9 +12168,20 @@
"name": "united states",
"shortname": ":flag_us:",
"category": "flags",
- "aliases": [":us:"],
- "aliases_ascii": [],
- "keywords": ["american", "country", "nation", "usa", "united states of america", "america", "old glory", "us"]
+ "aliases": [
+ ":us:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "american",
+ "country",
+ "nation",
+ "usa",
+ "united states of america",
+ "america",
+ "old glory",
+ "us"
+ ]
},
"flag_uy": {
"unicode": "1F1FA-1F1FE",
@@ -6092,9 +12189,15 @@
"name": "uruguay",
"shortname": ":flag_uy:",
"category": "flags",
- "aliases": [":uy:"],
+ "aliases": [
+ ":uy:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "uy"]
+ "keywords": [
+ "country",
+ "nation",
+ "uy"
+ ]
},
"flag_uz": {
"unicode": "1F1FA-1F1FF",
@@ -6102,9 +12205,16 @@
"name": "uzbekistan",
"shortname": ":flag_uz:",
"category": "flags",
- "aliases": [":uz:"],
+ "aliases": [
+ ":uz:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "uzbekiston respublikasi", "uz"]
+ "keywords": [
+ "country",
+ "nation",
+ "uzbekiston respublikasi",
+ "uz"
+ ]
},
"flag_va": {
"unicode": "1F1FB-1F1E6",
@@ -6112,9 +12222,15 @@
"name": "the vatican city",
"shortname": ":flag_va:",
"category": "flags",
- "aliases": [":va:"],
+ "aliases": [
+ ":va:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "va"]
+ "keywords": [
+ "country",
+ "nation",
+ "va"
+ ]
},
"flag_vc": {
"unicode": "1F1FB-1F1E8",
@@ -6122,9 +12238,15 @@
"name": "saint vincent and the grenadines",
"shortname": ":flag_vc:",
"category": "flags",
- "aliases": [":vc:"],
+ "aliases": [
+ ":vc:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "vc"]
+ "keywords": [
+ "country",
+ "nation",
+ "vc"
+ ]
},
"flag_ve": {
"unicode": "1F1FB-1F1EA",
@@ -6132,9 +12254,27 @@
"name": "venezuela",
"shortname": ":flag_ve:",
"category": "flags",
- "aliases": [":ve:"],
+ "aliases": [
+ ":ve:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "ve"
+ ]
+ },
+ "flag_vg": {
+ "unicode": "1F1FB-1F1EC",
+ "unicode_alternates": "",
+ "name": "british virgin islands",
+ "shortname": ":flag_vg:",
+ "category": "flags",
+ "aliases": [
+ ":vg:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "ve"]
+ "keywords": []
},
"flag_vi": {
"unicode": "1F1FB-1F1EE",
@@ -6142,9 +12282,15 @@
"name": "u.s. virgin islands",
"shortname": ":flag_vi:",
"category": "flags",
- "aliases": [":vi:"],
+ "aliases": [
+ ":vi:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "vi"]
+ "keywords": [
+ "country",
+ "nation",
+ "vi"
+ ]
},
"flag_vn": {
"unicode": "1F1FB-1F1F3",
@@ -6152,9 +12298,16 @@
"name": "vietnam",
"shortname": ":flag_vn:",
"category": "flags",
- "aliases": [":vn:"],
+ "aliases": [
+ ":vn:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "viet nam", "vn"]
+ "keywords": [
+ "country",
+ "nation",
+ "viet nam",
+ "vn"
+ ]
},
"flag_vu": {
"unicode": "1F1FB-1F1FA",
@@ -6162,9 +12315,15 @@
"name": "vanuatu",
"shortname": ":flag_vu:",
"category": "flags",
- "aliases": [":vu:"],
+ "aliases": [
+ ":vu:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "vu"]
+ "keywords": [
+ "country",
+ "nation",
+ "vu"
+ ]
},
"flag_wf": {
"unicode": "1F1FC-1F1EB",
@@ -6172,9 +12331,15 @@
"name": "wallis and futuna",
"shortname": ":flag_wf:",
"category": "flags",
- "aliases": [":wf:"],
+ "aliases": [
+ ":wf:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "wf"]
+ "keywords": [
+ "country",
+ "nation",
+ "wf"
+ ]
},
"flag_white": {
"unicode": "1F3F3",
@@ -6182,9 +12347,14 @@
"name": "waving white flag",
"shortname": ":flag_white:",
"category": "objects_symbols",
- "aliases": [":waving_white_flag:"],
+ "aliases": [
+ ":waving_white_flag:"
+ ],
"aliases_ascii": [],
- "keywords": ["symbol", "signal"]
+ "keywords": [
+ "symbol",
+ "signal"
+ ]
},
"flag_ws": {
"unicode": "1F1FC-1F1F8",
@@ -6192,9 +12362,16 @@
"name": "samoa",
"shortname": ":flag_ws:",
"category": "flags",
- "aliases": [":ws:"],
+ "aliases": [
+ ":ws:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "american samoa", "ws"]
+ "keywords": [
+ "country",
+ "nation",
+ "american samoa",
+ "ws"
+ ]
},
"flag_xk": {
"unicode": "1F1FD-1F1F0",
@@ -6202,9 +12379,15 @@
"name": "kosovo",
"shortname": ":flag_xk:",
"category": "flags",
- "aliases": [":xk:"],
+ "aliases": [
+ ":xk:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "xk"]
+ "keywords": [
+ "country",
+ "nation",
+ "xk"
+ ]
},
"flag_ye": {
"unicode": "1F1FE-1F1EA",
@@ -6212,9 +12395,28 @@
"name": "yemen",
"shortname": ":flag_ye:",
"category": "flags",
- "aliases": [":ye:"],
+ "aliases": [
+ ":ye:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "country",
+ "nation",
+ "al yaman",
+ "ye"
+ ]
+ },
+ "flag_yt": {
+ "unicode": "1F1FE-1F1F9",
+ "unicode_alternates": "",
+ "name": "mayotte",
+ "shortname": ":flag_yt:",
+ "category": "flags",
+ "aliases": [
+ ":yt:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "al yaman", "ye"]
+ "keywords": []
},
"flag_za": {
"unicode": "1F1FF-1F1E6",
@@ -6222,9 +12424,14 @@
"name": "south africa",
"shortname": ":flag_za:",
"category": "flags",
- "aliases": [":za:"],
+ "aliases": [
+ ":za:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation"]
+ "keywords": [
+ "country",
+ "nation"
+ ]
},
"flag_zm": {
"unicode": "1F1FF-1F1F2",
@@ -6232,9 +12439,15 @@
"name": "zambia",
"shortname": ":flag_zm:",
"category": "flags",
- "aliases": [":zm:"],
+ "aliases": [
+ ":zm:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "zm"]
+ "keywords": [
+ "country",
+ "nation",
+ "zm"
+ ]
},
"flag_zw": {
"unicode": "1F1FF-1F1FC",
@@ -6242,9 +12455,15 @@
"name": "zimbabwe",
"shortname": ":flag_zw:",
"category": "flags",
- "aliases": [":zw:"],
+ "aliases": [
+ ":zw:"
+ ],
"aliases_ascii": [],
- "keywords": ["country", "nation", "zw"]
+ "keywords": [
+ "country",
+ "nation",
+ "zw"
+ ]
},
"flags": {
"unicode": "1F38F",
@@ -6254,7 +12473,23 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["banner", "carp", "fish", "japanese", "koinobori", "children", "kids", "boys", "celebration", "happiness", "carp", "streamers", "japanese", "holiday", "flags"],
+ "keywords": [
+ "banner",
+ "carp",
+ "fish",
+ "japanese",
+ "koinobori",
+ "children",
+ "kids",
+ "boys",
+ "celebration",
+ "happiness",
+ "carp",
+ "streamers",
+ "japanese",
+ "holiday",
+ "flags"
+ ],
"moji": "🎏"
},
"flashlight": {
@@ -6265,18 +12500,36 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["dark"],
+ "keywords": [
+ "dark"
+ ],
"moji": "🔦"
},
+ "fleur-de-lis": {
+ "unicode": "269C",
+ "unicode_alternates": "",
+ "name": "fleur-de-lis",
+ "shortname": ":fleur-de-lis:",
+ "category": "symbols",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "symbol"
+ ]
+ },
"flip_phone": {
"unicode": "1F581",
"unicode_alternates": [],
"name": "clamshell mobile phone",
"shortname": ":flip_phone:",
"category": "objects_symbols",
- "aliases": [":clamshell_mobile_phone:"],
+ "aliases": [
+ ":clamshell_mobile_phone:"
+ ],
"aliases_ascii": [],
- "keywords": ["cellphone"]
+ "keywords": [
+ "cellphone"
+ ]
},
"floppy_black": {
"unicode": "1F5AA",
@@ -6284,9 +12537,20 @@
"name": "black hard shell floppy disk",
"shortname": ":floppy_black:",
"category": "objects_symbols",
- "aliases": [":black_hard_shell_floppy_disk:"],
- "aliases_ascii": [],
- "keywords": ["oldschool", "save", "technology", "storage", "information", "computer", "drive", "megabyte"]
+ "aliases": [
+ ":black_hard_shell_floppy_disk:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "oldschool",
+ "save",
+ "technology",
+ "storage",
+ "information",
+ "computer",
+ "drive",
+ "megabyte"
+ ]
},
"floppy_disk": {
"unicode": "1F4BE",
@@ -6296,7 +12560,18 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["oldschool", "save", "technology", "floppy", "disk", "storage", "information", "computer", "drive", "megabyte"],
+ "keywords": [
+ "oldschool",
+ "save",
+ "technology",
+ "floppy",
+ "disk",
+ "storage",
+ "information",
+ "computer",
+ "drive",
+ "megabyte"
+ ],
"moji": "💾"
},
"floppy_white": {
@@ -6305,9 +12580,20 @@
"name": "white hard shell floppy disk",
"shortname": ":floppy_white:",
"category": "objects_symbols",
- "aliases": [":white_hard_shell_floppy_disk:"],
- "aliases_ascii": [],
- "keywords": ["oldschool", "save", "technology", "storage", "information", "computer", "drive", "megabyte"]
+ "aliases": [
+ ":white_hard_shell_floppy_disk:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "oldschool",
+ "save",
+ "technology",
+ "storage",
+ "information",
+ "computer",
+ "drive",
+ "megabyte"
+ ]
},
"flower_playing_cards": {
"unicode": "1F3B4",
@@ -6317,7 +12603,15 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["playing", "card", "flower", "game", "august", "moon", "special"],
+ "keywords": [
+ "playing",
+ "card",
+ "flower",
+ "game",
+ "august",
+ "moon",
+ "special"
+ ],
"moji": "🎴"
},
"flushed": {
@@ -6327,8 +12621,21 @@
"shortname": ":flushed:",
"category": "emoticons",
"aliases": [],
- "aliases_ascii": [":$", "=$"],
- "keywords": ["blush", "face", "flattered", "flush", "blush", "red", "pink", "cheeks", "shy"],
+ "aliases_ascii": [
+ ":$",
+ "=$"
+ ],
+ "keywords": [
+ "blush",
+ "face",
+ "flattered",
+ "flush",
+ "blush",
+ "red",
+ "pink",
+ "cheeks",
+ "shy"
+ ],
"moji": "😳"
},
"fog": {
@@ -6339,7 +12646,12 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["weather", "damp", "cloud", "hazy"]
+ "keywords": [
+ "weather",
+ "damp",
+ "cloud",
+ "hazy"
+ ]
},
"foggy": {
"unicode": "1F301",
@@ -6349,7 +12661,14 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["mountain", "photo", "bridge", "weather", "fog", "foggy"],
+ "keywords": [
+ "mountain",
+ "photo",
+ "bridge",
+ "weather",
+ "fog",
+ "foggy"
+ ],
"moji": "🌁"
},
"folder": {
@@ -6360,7 +12679,9 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["documents"]
+ "keywords": [
+ "documents"
+ ]
},
"folder_open": {
"unicode": "1F5C1",
@@ -6368,9 +12689,14 @@
"name": "open folder",
"shortname": ":folder_open:",
"category": "objects_symbols",
- "aliases": [":open_folder:"],
+ "aliases": [
+ ":open_folder:"
+ ],
"aliases_ascii": [],
- "keywords": ["documents", "load"]
+ "keywords": [
+ "documents",
+ "load"
+ ]
},
"football": {
"unicode": "1F3C8",
@@ -6380,7 +12706,16 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["NFL", "balls", "sports", "football", "ball", "sport", "america", "american"],
+ "keywords": [
+ "NFL",
+ "balls",
+ "sports",
+ "football",
+ "ball",
+ "sport",
+ "america",
+ "american"
+ ],
"moji": "🏈"
},
"footprints": {
@@ -6391,7 +12726,9 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["feet"],
+ "keywords": [
+ "feet"
+ ],
"moji": "👣"
},
"fork_and_knife": {
@@ -6402,7 +12739,16 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["cutlery", "kitchen", "fork", "knife", "restaurant", "meal", "food", "eat"],
+ "keywords": [
+ "cutlery",
+ "kitchen",
+ "fork",
+ "knife",
+ "restaurant",
+ "meal",
+ "food",
+ "eat"
+ ],
"moji": "🍴"
},
"fork_knife_plate": {
@@ -6411,31 +12757,51 @@
"name": "fork and knife with plate",
"shortname": ":fork_knife_plate:",
"category": "travel_places",
- "aliases": [":fork_and_knife_with_plate:"],
- "aliases_ascii": [],
- "keywords": ["meal", "food", "breakfast", "lunch", "dinner", "utensils", "setting"]
+ "aliases": [
+ ":fork_and_knife_with_plate:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "meal",
+ "food",
+ "breakfast",
+ "lunch",
+ "dinner",
+ "utensils",
+ "setting"
+ ]
},
"fountain": {
"unicode": "26F2",
- "unicode_alternates": ["26F2-FE0F"],
+ "unicode_alternates": [
+ "26F2-FE0F"
+ ],
"name": "fountain",
"shortname": ":fountain:",
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["photo"],
+ "keywords": [
+ "photo"
+ ],
"moji": "⛲"
},
"four": {
"moji": "4️⃣",
"unicode": "0034-20E3",
- "unicode_alternates": ["0034-FE0F-20E3"],
+ "unicode_alternates": [
+ "0034-FE0F-20E3"
+ ],
"name": "digit four",
"shortname": ":four:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["4", "blue-square", "numbers"]
+ "keywords": [
+ "4",
+ "blue-square",
+ "numbers"
+ ]
},
"four_leaf_clover": {
"unicode": "1F340",
@@ -6445,7 +12811,20 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["lucky", "nature", "plant", "vegetable", "clover", "four", "leaf", "luck", "irish", "saint", "patrick", "green"],
+ "keywords": [
+ "lucky",
+ "nature",
+ "plant",
+ "vegetable",
+ "clover",
+ "four",
+ "leaf",
+ "luck",
+ "irish",
+ "saint",
+ "patrick",
+ "green"
+ ],
"moji": "🍀"
},
"frame_photo": {
@@ -6454,9 +12833,13 @@
"name": "frame with picture",
"shortname": ":frame_photo:",
"category": "objects_symbols",
- "aliases": [":frame_with_picture:"],
+ "aliases": [
+ ":frame_with_picture:"
+ ],
"aliases_ascii": [],
- "keywords": ["photo"]
+ "keywords": [
+ "photo"
+ ]
},
"frame_tiles": {
"unicode": "1F5BD",
@@ -6464,9 +12847,14 @@
"name": "frame with tiles",
"shortname": ":frame_tiles:",
"category": "objects_symbols",
- "aliases": [":frame_with_tiles:"],
+ "aliases": [
+ ":frame_with_tiles:"
+ ],
"aliases_ascii": [],
- "keywords": ["photo", "painting"]
+ "keywords": [
+ "photo",
+ "painting"
+ ]
},
"frame_x": {
"unicode": "1F5BE",
@@ -6474,9 +12862,14 @@
"name": "frame with an x",
"shortname": ":frame_x:",
"category": "objects_symbols",
- "aliases": [":frame_with_an_x:"],
+ "aliases": [
+ ":frame_with_an_x:"
+ ],
"aliases_ascii": [],
- "keywords": ["photo", "painting"]
+ "keywords": [
+ "photo",
+ "painting"
+ ]
},
"free": {
"unicode": "1F193",
@@ -6486,7 +12879,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue-square", "words"],
+ "keywords": [
+ "blue-square",
+ "words"
+ ],
"moji": "🆓"
},
"fried_shrimp": {
@@ -6497,7 +12893,15 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "food", "shrimp", "fried", "seafood", "small", "fish"],
+ "keywords": [
+ "animal",
+ "food",
+ "shrimp",
+ "fried",
+ "seafood",
+ "small",
+ "fish"
+ ],
"moji": "🍤"
},
"fries": {
@@ -6508,7 +12912,16 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["chips", "food", "fries", "french", "potato", "fry", "russet", "idaho"],
+ "keywords": [
+ "chips",
+ "food",
+ "fries",
+ "french",
+ "potato",
+ "fry",
+ "russet",
+ "idaho"
+ ],
"moji": "🍟"
},
"frog": {
@@ -6519,7 +12932,10 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "nature"],
+ "keywords": [
+ "animal",
+ "nature"
+ ],
"moji": "🐸"
},
"frowning": {
@@ -6528,20 +12944,50 @@
"name": "frowning face with open mouth",
"shortname": ":frowning:",
"category": "emoticons",
- "aliases": [":anguished:"],
- "aliases_ascii": [],
- "keywords": ["aw", "face", "frown", "sad", "pout", "sulk", "glower"],
+ "aliases": [
+ ":anguished:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "aw",
+ "face",
+ "frown",
+ "sad",
+ "pout",
+ "sulk",
+ "glower"
+ ],
"moji": "😦"
},
+ "frowning2": {
+ "unicode": "2639",
+ "unicode_alternates": "",
+ "name": "white frowning face",
+ "shortname": ":frowning2:",
+ "category": "people",
+ "aliases": [
+ ":white_frowning_face:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "frown",
+ "person"
+ ]
+ },
"fuelpump": {
"unicode": "26FD",
- "unicode_alternates": ["26FD-FE0F"],
+ "unicode_alternates": [
+ "26FD-FE0F"
+ ],
"name": "fuel pump",
"shortname": ":fuelpump:",
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["gas station", "petroleum"],
+ "keywords": [
+ "gas station",
+ "petroleum"
+ ],
"moji": "⛽"
},
"full_moon": {
@@ -6552,7 +12998,20 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["nature", "yellow", "moon", "full", "sky", "night", "cheese", "phase", "monster", "spooky", "werewolves", "twilight"],
+ "keywords": [
+ "nature",
+ "yellow",
+ "moon",
+ "full",
+ "sky",
+ "night",
+ "cheese",
+ "phase",
+ "monster",
+ "spooky",
+ "werewolves",
+ "twilight"
+ ],
"moji": "🌕"
},
"full_moon_with_face": {
@@ -6563,7 +13022,20 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["night", "moon", "full", "anthropomorphic", "face", "sky", "night", "cheese", "phase", "spooky", "werewolves", "monsters"],
+ "keywords": [
+ "night",
+ "moon",
+ "full",
+ "anthropomorphic",
+ "face",
+ "sky",
+ "night",
+ "cheese",
+ "phase",
+ "spooky",
+ "werewolves",
+ "monsters"
+ ],
"moji": "🌝"
},
"game_die": {
@@ -6574,9 +13046,30 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["dice", "game", "die", "dice", "craps", "gamble", "play"],
+ "keywords": [
+ "dice",
+ "game",
+ "die",
+ "dice",
+ "craps",
+ "gamble",
+ "play"
+ ],
"moji": "🎲"
},
+ "gear": {
+ "unicode": "2699",
+ "unicode_alternates": "",
+ "name": "gear",
+ "shortname": ":gear:",
+ "category": "objects",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "object",
+ "tool"
+ ]
+ },
"gem": {
"unicode": "1F48E",
"unicode_alternates": [],
@@ -6585,18 +13078,35 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue", "ruby"],
+ "keywords": [
+ "blue",
+ "ruby"
+ ],
"moji": "💎"
},
"gemini": {
"unicode": "264A",
- "unicode_alternates": ["264A-FE0F"],
+ "unicode_alternates": [
+ "264A-FE0F"
+ ],
"name": "gemini",
"shortname": ":gemini:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["gemini", "twins", "astrology", "greek", "constellation", "stars", "zodiac", "sign", "sign", "zodiac", "horoscope"],
+ "keywords": [
+ "gemini",
+ "twins",
+ "astrology",
+ "greek",
+ "constellation",
+ "stars",
+ "zodiac",
+ "sign",
+ "sign",
+ "zodiac",
+ "horoscope"
+ ],
"moji": "♊"
},
"ghost": {
@@ -6607,7 +13117,9 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["halloween"],
+ "keywords": [
+ "halloween"
+ ],
"moji": "👻"
},
"gift": {
@@ -6618,7 +13130,18 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["birthday", "christmas", "present", "xmas", "gift", "present", "wrap", "package", "birthday", "wedding"],
+ "keywords": [
+ "birthday",
+ "christmas",
+ "present",
+ "xmas",
+ "gift",
+ "present",
+ "wrap",
+ "package",
+ "birthday",
+ "wedding"
+ ],
"moji": "🎁"
},
"gift_heart": {
@@ -6629,7 +13152,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["love", "valentines"],
+ "keywords": [
+ "love",
+ "valentines"
+ ],
"moji": "💝"
},
"girl": {
@@ -6640,9 +13166,82 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["female", "woman"],
+ "keywords": [
+ "female",
+ "woman"
+ ],
"moji": "👧"
},
+ "girl_tone1": {
+ "unicode": "1F467-1F3FB",
+ "unicode_alternates": "",
+ "name": "girl tone 1",
+ "shortname": ":girl_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "kid",
+ "child"
+ ]
+ },
+ "girl_tone2": {
+ "unicode": "1F467-1F3FC",
+ "unicode_alternates": "",
+ "name": "girl tone 2",
+ "shortname": ":girl_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "kid",
+ "child"
+ ]
+ },
+ "girl_tone3": {
+ "unicode": "1F467-1F3FD",
+ "unicode_alternates": "",
+ "name": "girl tone 3",
+ "shortname": ":girl_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "kid",
+ "child"
+ ]
+ },
+ "girl_tone4": {
+ "unicode": "1F467-1F3FE",
+ "unicode_alternates": "",
+ "name": "girl tone 4",
+ "shortname": ":girl_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "kid",
+ "child"
+ ]
+ },
+ "girl_tone5": {
+ "unicode": "1F467-1F3FF",
+ "unicode_alternates": "",
+ "name": "girl tone 5",
+ "shortname": ":girl_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "kid",
+ "child"
+ ]
+ },
"girls_symbol": {
"unicode": "1F6CA",
"unicode_alternates": [],
@@ -6651,7 +13250,10 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["female", "child"]
+ "keywords": [
+ "female",
+ "child"
+ ]
},
"globe_with_meridians": {
"unicode": "1F310",
@@ -6661,7 +13263,17 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["earth", "international", "world", "earth", "meridian", "globe", "space", "planet", "home"],
+ "keywords": [
+ "earth",
+ "international",
+ "world",
+ "earth",
+ "meridian",
+ "globe",
+ "space",
+ "planet",
+ "home"
+ ],
"moji": "🌐"
},
"goat": {
@@ -6672,18 +13284,31 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "nature", "goat", "sheep", "kid", "billy", "livestock"],
+ "keywords": [
+ "animal",
+ "nature",
+ "goat",
+ "sheep",
+ "kid",
+ "billy",
+ "livestock"
+ ],
"moji": "🐐"
},
"golf": {
"unicode": "26F3",
- "unicode_alternates": ["26F3-FE0F"],
+ "unicode_alternates": [
+ "26F3-FE0F"
+ ],
"name": "flag in hole",
"shortname": ":golf:",
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["business", "sports"],
+ "keywords": [
+ "business",
+ "sports"
+ ],
"moji": "⛳"
},
"golfer": {
@@ -6694,7 +13319,13 @@
"category": "activity",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["sport", "par", "birdie", "eagle", "mulligan"]
+ "keywords": [
+ "sport",
+ "par",
+ "birdie",
+ "eagle",
+ "mulligan"
+ ]
},
"grapes": {
"unicode": "1F347",
@@ -6704,7 +13335,16 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["food", "fruit", "grapes", "wine", "vinegar", "fruit", "cluster", "vine"],
+ "keywords": [
+ "food",
+ "fruit",
+ "grapes",
+ "wine",
+ "vinegar",
+ "fruit",
+ "cluster",
+ "vine"
+ ],
"moji": "🍇"
},
"green_apple": {
@@ -6715,7 +13355,17 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["fruit", "nature", "apple", "fruit", "green", "pie", "granny", "smith", "core"],
+ "keywords": [
+ "fruit",
+ "nature",
+ "apple",
+ "fruit",
+ "green",
+ "pie",
+ "granny",
+ "smith",
+ "core"
+ ],
"moji": "🍏"
},
"green_book": {
@@ -6726,7 +13376,11 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["knowledge", "library", "read"],
+ "keywords": [
+ "knowledge",
+ "library",
+ "read"
+ ],
"moji": "📗"
},
"green_heart": {
@@ -6737,7 +13391,22 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["affection", "like", "love", "valentines", "green", "heart", "love", "nature", "rebirth", "reborn", "jealous", "clingy", "envious", "possessive"],
+ "keywords": [
+ "affection",
+ "like",
+ "love",
+ "valentines",
+ "green",
+ "heart",
+ "love",
+ "nature",
+ "rebirth",
+ "reborn",
+ "jealous",
+ "clingy",
+ "envious",
+ "possessive"
+ ],
"moji": "💚"
},
"grey_exclamation": {
@@ -6748,7 +13417,9 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["surprise"],
+ "keywords": [
+ "surprise"
+ ],
"moji": "❕"
},
"grey_question": {
@@ -6759,7 +13430,9 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["doubts"],
+ "keywords": [
+ "doubts"
+ ],
"moji": "❔"
},
"grimacing": {
@@ -6770,7 +13443,14 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["face", "grimace", "teeth", "grimace", "disapprove", "pain"],
+ "keywords": [
+ "face",
+ "grimace",
+ "teeth",
+ "grimace",
+ "disapprove",
+ "pain"
+ ],
"moji": "😬"
},
"grin": {
@@ -6781,7 +13461,17 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["face", "happy", "joy", "smile", "grin", "grinning", "smiling", "smile", "smiley"],
+ "keywords": [
+ "face",
+ "happy",
+ "joy",
+ "smile",
+ "grin",
+ "grinning",
+ "smiling",
+ "smile",
+ "smiley"
+ ],
"moji": "😁"
},
"grinning": {
@@ -6792,7 +13482,17 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["face", "happy", "joy", "smile", "grin", "grinning", "smiling", "smile", "smiley"],
+ "keywords": [
+ "face",
+ "happy",
+ "joy",
+ "smile",
+ "grin",
+ "grinning",
+ "smiling",
+ "smile",
+ "smiley"
+ ],
"moji": "🕧"
},
"guardsman": {
@@ -6803,9 +13503,138 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["british", "gb", "male", "man", "uk", "guardsman", "guard", "bearskin", "hat", "british", "queen", "ceremonial", "military"],
+ "keywords": [
+ "british",
+ "gb",
+ "male",
+ "man",
+ "uk",
+ "guardsman",
+ "guard",
+ "bearskin",
+ "hat",
+ "british",
+ "queen",
+ "ceremonial",
+ "military"
+ ],
"moji": "💂"
},
+ "guardsman_tone1": {
+ "unicode": "1F482-1F3FB",
+ "unicode_alternates": "",
+ "name": "guardsman tone 1",
+ "shortname": ":guardsman_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "british",
+ "gb",
+ "male",
+ "man",
+ "uk",
+ "guard",
+ "bearskin",
+ "hat",
+ "british",
+ "queen",
+ "ceremonial",
+ "military"
+ ]
+ },
+ "guardsman_tone2": {
+ "unicode": "1F482-1F3FC",
+ "unicode_alternates": "",
+ "name": "guardsman tone 2",
+ "shortname": ":guardsman_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "british",
+ "gb",
+ "male",
+ "man",
+ "uk",
+ "guard",
+ "bearskin",
+ "hat",
+ "british",
+ "queen",
+ "ceremonial",
+ "military"
+ ]
+ },
+ "guardsman_tone3": {
+ "unicode": "1F482-1F3FD",
+ "unicode_alternates": "",
+ "name": "guardsman tone 3",
+ "shortname": ":guardsman_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "british",
+ "gb",
+ "male",
+ "man",
+ "uk",
+ "guard",
+ "bearskin",
+ "hat",
+ "british",
+ "queen",
+ "ceremonial",
+ "military"
+ ]
+ },
+ "guardsman_tone4": {
+ "unicode": "1F482-1F3FE",
+ "unicode_alternates": "",
+ "name": "guardsman tone 4",
+ "shortname": ":guardsman_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "british",
+ "gb",
+ "male",
+ "man",
+ "uk",
+ "guard",
+ "bearskin",
+ "hat",
+ "british",
+ "queen",
+ "ceremonial",
+ "military"
+ ]
+ },
+ "guardsman_tone5": {
+ "unicode": "1F482-1F3FF",
+ "unicode_alternates": "",
+ "name": "guardsman tone 5",
+ "shortname": ":guardsman_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "british",
+ "gb",
+ "male",
+ "man",
+ "uk",
+ "guard",
+ "bearskin",
+ "hat",
+ "british",
+ "queen",
+ "ceremonial",
+ "military"
+ ]
+ },
"guitar": {
"unicode": "1F3B8",
"unicode_alternates": [],
@@ -6814,7 +13643,18 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["instrument", "music", "guitar", "string", "music", "instrument", "jam", "rock", "acoustic", "electric"],
+ "keywords": [
+ "instrument",
+ "music",
+ "guitar",
+ "string",
+ "music",
+ "instrument",
+ "jam",
+ "rock",
+ "acoustic",
+ "electric"
+ ],
"moji": "🎸"
},
"gun": {
@@ -6825,7 +13665,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["violence", "weapon"],
+ "keywords": [
+ "violence",
+ "weapon"
+ ],
"moji": "🔫"
},
"haircut": {
@@ -6836,9 +13679,83 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["female", "girl", "woman"],
+ "keywords": [
+ "female",
+ "girl",
+ "woman"
+ ],
"moji": "💇"
},
+ "haircut_tone1": {
+ "unicode": "1F487-1F3FB",
+ "unicode_alternates": "",
+ "name": "haircut tone 1",
+ "shortname": ":haircut_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman"
+ ]
+ },
+ "haircut_tone2": {
+ "unicode": "1F487-1F3FC",
+ "unicode_alternates": "",
+ "name": "haircut tone 2",
+ "shortname": ":haircut_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman"
+ ]
+ },
+ "haircut_tone3": {
+ "unicode": "1F487-1F3FD",
+ "unicode_alternates": "",
+ "name": "haircut tone 3",
+ "shortname": ":haircut_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman"
+ ]
+ },
+ "haircut_tone4": {
+ "unicode": "1F487-1F3FE",
+ "unicode_alternates": "",
+ "name": "haircut tone 4",
+ "shortname": ":haircut_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman"
+ ]
+ },
+ "haircut_tone5": {
+ "unicode": "1F487-1F3FF",
+ "unicode_alternates": "",
+ "name": "haircut tone 5",
+ "shortname": ":haircut_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman"
+ ]
+ },
"hamburger": {
"unicode": "1F354",
"unicode_alternates": [],
@@ -6847,7 +13764,15 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["food", "meat", "hamburger", "burger", "meat", "cow", "beef"],
+ "keywords": [
+ "food",
+ "meat",
+ "hamburger",
+ "burger",
+ "meat",
+ "cow",
+ "beef"
+ ],
"moji": "🍔"
},
"hammer": {
@@ -6858,9 +13783,31 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["done", "judge", "law", "ruling", "tools", "verdict"],
+ "keywords": [
+ "done",
+ "judge",
+ "law",
+ "ruling",
+ "tools",
+ "verdict"
+ ],
"moji": "🔨"
},
+ "hammer_pick": {
+ "unicode": "2692",
+ "unicode_alternates": "",
+ "name": "hammer and pick",
+ "shortname": ":hammer_pick:",
+ "category": "objects",
+ "aliases": [
+ ":hammer_and_pick:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "object",
+ "tool"
+ ]
+ },
"hamster": {
"unicode": "1F439",
"unicode_alternates": [],
@@ -6869,7 +13816,10 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "nature"],
+ "keywords": [
+ "animal",
+ "nature"
+ ],
"moji": "🐹"
},
"hand_splayed": {
@@ -6878,9 +13828,16 @@
"name": "raised hand with fingers splayed",
"shortname": ":hand_splayed:",
"category": "people",
- "aliases": [":raised_hand_with_fingers_splayed:"],
+ "aliases": [
+ ":raised_hand_with_fingers_splayed:"
+ ],
"aliases_ascii": [],
- "keywords": ["hi", "five", "stop", "halt"]
+ "keywords": [
+ "hi",
+ "five",
+ "stop",
+ "halt"
+ ]
},
"hand_splayed_reverse": {
"unicode": "1F591",
@@ -6888,9 +13845,101 @@
"name": "reversed raised hand with fingers splayed",
"shortname": ":hand_splayed_reverse:",
"category": "people",
- "aliases": [":reversed_raised_hand_with_fingers_splayed:"],
+ "aliases": [
+ ":reversed_raised_hand_with_fingers_splayed:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "hi",
+ "five",
+ "stop",
+ "halt"
+ ]
+ },
+ "hand_splayed_tone1": {
+ "unicode": "1F590-1F3FB",
+ "unicode_alternates": "",
+ "name": "raised hand with fingers splayed tone 1",
+ "shortname": ":hand_splayed_tone1:",
+ "category": "people",
+ "aliases": [
+ ":raised_hand_with_fingers_splayed_tone1:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "hi",
+ "five",
+ "stop",
+ "halt"
+ ]
+ },
+ "hand_splayed_tone2": {
+ "unicode": "1F590-1F3FC",
+ "unicode_alternates": "",
+ "name": "raised hand with fingers splayed tone 2",
+ "shortname": ":hand_splayed_tone2:",
+ "category": "people",
+ "aliases": [
+ ":raised_hand_with_fingers_splayed_tone2:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "hi",
+ "five",
+ "stop",
+ "halt"
+ ]
+ },
+ "hand_splayed_tone3": {
+ "unicode": "1F590-1F3FD",
+ "unicode_alternates": "",
+ "name": "raised hand with fingers splayed tone 3",
+ "shortname": ":hand_splayed_tone3:",
+ "category": "people",
+ "aliases": [
+ ":raised_hand_with_fingers_splayed_tone3:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "hi",
+ "five",
+ "stop",
+ "halt"
+ ]
+ },
+ "hand_splayed_tone4": {
+ "unicode": "1F590-1F3FE",
+ "unicode_alternates": "",
+ "name": "raised hand with fingers splayed tone 4",
+ "shortname": ":hand_splayed_tone4:",
+ "category": "people",
+ "aliases": [
+ ":raised_hand_with_fingers_splayed_tone4:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "hi",
+ "five",
+ "stop",
+ "halt"
+ ]
+ },
+ "hand_splayed_tone5": {
+ "unicode": "1F590-1F3FF",
+ "unicode_alternates": "",
+ "name": "raised hand with fingers splayed tone 5",
+ "shortname": ":hand_splayed_tone5:",
+ "category": "people",
+ "aliases": [
+ ":raised_hand_with_fingers_splayed_tone5:"
+ ],
"aliases_ascii": [],
- "keywords": ["hi", "five", "stop", "halt"]
+ "keywords": [
+ "hi",
+ "five",
+ "stop",
+ "halt"
+ ]
},
"hand_victory": {
"unicode": "1F594",
@@ -6898,9 +13947,13 @@
"name": "reversed victory hand",
"shortname": ":hand_victory:",
"category": "people",
- "aliases": [":reversed_victory_hand:"],
+ "aliases": [
+ ":reversed_victory_hand:"
+ ],
"aliases_ascii": [],
- "keywords": ["fu"]
+ "keywords": [
+ "fu"
+ ]
},
"handbag": {
"unicode": "1F45C",
@@ -6910,7 +13963,12 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["accessories", "accessory", "bag", "fashion"],
+ "keywords": [
+ "accessories",
+ "accessory",
+ "bag",
+ "fashion"
+ ],
"moji": "👜"
},
"hard_disk": {
@@ -6921,18 +13979,32 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["save", "technology", "storage", "information", "computer", "drive", "megabyte", "gigabyte", "hd"]
+ "keywords": [
+ "save",
+ "technology",
+ "storage",
+ "information",
+ "computer",
+ "drive",
+ "megabyte",
+ "gigabyte",
+ "hd"
+ ]
},
"hash": {
"moji": "#⃣",
"unicode": "0023-20E3",
- "unicode_alternates": ["0023-FE0F-20E3"],
+ "unicode_alternates": [
+ "0023-FE0F-20E3"
+ ],
"name": "number sign",
"shortname": ":hash:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["symbol"]
+ "keywords": [
+ "symbol"
+ ]
},
"hatched_chick": {
"unicode": "1F425",
@@ -6942,7 +14014,17 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["baby", "chicken", "chick", "baby", "bird", "chicken", "young", "woman", "cute"],
+ "keywords": [
+ "baby",
+ "chicken",
+ "chick",
+ "baby",
+ "bird",
+ "chicken",
+ "young",
+ "woman",
+ "cute"
+ ],
"moji": "🐥"
},
"hatching_chick": {
@@ -6953,9 +14035,33 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["born", "chicken", "egg", "chick", "egg", "baby", "bird", "chicken", "young", "woman", "cute"],
+ "keywords": [
+ "born",
+ "chicken",
+ "egg",
+ "chick",
+ "egg",
+ "baby",
+ "bird",
+ "chicken",
+ "young",
+ "woman",
+ "cute"
+ ],
"moji": "🐣"
},
+ "head_bandage": {
+ "unicode": "1F915",
+ "unicode_alternates": "",
+ "name": "face with head-bandage",
+ "shortname": ":head_bandage:",
+ "category": "people",
+ "aliases": [
+ ":face_with_head_bandage:"
+ ],
+ "aliases_ascii": [],
+ "keywords": []
+ },
"headphones": {
"unicode": "1F3A7",
"unicode_alternates": [],
@@ -6964,7 +14070,19 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["gadgets", "music", "score", "headphone", "sound", "music", "ears", "beats", "buds", "audio", "listen"],
+ "keywords": [
+ "gadgets",
+ "music",
+ "score",
+ "headphone",
+ "sound",
+ "music",
+ "ears",
+ "beats",
+ "buds",
+ "audio",
+ "listen"
+ ],
"moji": "🎧"
},
"hear_no_evil": {
@@ -6975,19 +14093,47 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "monkey", "monkey", "ears", "hear", "sound", "kikazaru"],
+ "keywords": [
+ "animal",
+ "monkey",
+ "monkey",
+ "ears",
+ "hear",
+ "sound",
+ "kikazaru"
+ ],
"moji": "🙉"
},
"heart": {
"moji": "❤",
"unicode": "2764",
- "unicode_alternates": ["2764-FE0F"],
+ "unicode_alternates": [
+ "2764-FE0F"
+ ],
"name": "heavy black heart",
"shortname": ":heart:",
"category": "emoticons",
"aliases": [],
- "aliases_ascii": ["<3"],
- "keywords": ["like", "love", "red", "pink", "black", "heart", "love", "passion", "romance", "intense", "desire", "death", "evil", "cold", "valentines"]
+ "aliases_ascii": [
+ "<3"
+ ],
+ "keywords": [
+ "like",
+ "love",
+ "red",
+ "pink",
+ "black",
+ "heart",
+ "love",
+ "passion",
+ "romance",
+ "intense",
+ "desire",
+ "death",
+ "evil",
+ "cold",
+ "valentines"
+ ]
},
"heart_decoration": {
"unicode": "1F49F",
@@ -6997,9 +14143,29 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["like", "love", "purple-square"],
+ "keywords": [
+ "like",
+ "love",
+ "purple-square"
+ ],
"moji": "💟"
},
+ "heart_exclamation": {
+ "unicode": "2763",
+ "unicode_alternates": "",
+ "name": "heavy heart exclamation mark ornament",
+ "shortname": ":heart_exclamation:",
+ "category": "symbols",
+ "aliases": [
+ ":heavy_heart_exclamation_mark_ornament:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "emotion",
+ "punctuation",
+ "symbol"
+ ]
+ },
"heart_eyes": {
"unicode": "1F60D",
"unicode_alternates": [],
@@ -7008,7 +14174,22 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["affection", "crush", "face", "infatuation", "like", "love", "valentines", "smiling", "heart", "lovestruck", "love", "flirt", "smile", "heart-shaped"],
+ "keywords": [
+ "affection",
+ "crush",
+ "face",
+ "infatuation",
+ "like",
+ "love",
+ "valentines",
+ "smiling",
+ "heart",
+ "lovestruck",
+ "love",
+ "flirt",
+ "smile",
+ "heart-shaped"
+ ],
"moji": "😍"
},
"heart_eyes_cat": {
@@ -7019,7 +14200,17 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["affection", "animal", "cats", "like", "love", "valentines", "lovestruck", "love", "heart"],
+ "keywords": [
+ "affection",
+ "animal",
+ "cats",
+ "like",
+ "love",
+ "valentines",
+ "lovestruck",
+ "love",
+ "heart"
+ ],
"moji": "😻"
},
"heart_tip": {
@@ -7028,9 +14219,16 @@
"name": "heart with tip on the left",
"shortname": ":heart_tip:",
"category": "celebration",
- "aliases": [":heart_with_tip_on_the_left:"],
+ "aliases": [
+ ":heart_with_tip_on_the_left:"
+ ],
"aliases_ascii": [],
- "keywords": ["affection", "like", "love", "valentines"]
+ "keywords": [
+ "affection",
+ "like",
+ "love",
+ "valentines"
+ ]
},
"heartbeat": {
"unicode": "1F493",
@@ -7040,7 +14238,12 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["affection", "like", "love", "valentines"],
+ "keywords": [
+ "affection",
+ "like",
+ "love",
+ "valentines"
+ ],
"moji": "💓"
},
"heartpulse": {
@@ -7051,29 +14254,44 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["affection", "like", "love", "valentines"],
+ "keywords": [
+ "affection",
+ "like",
+ "love",
+ "valentines"
+ ],
"moji": "💗"
},
"hearts": {
"unicode": "2665",
- "unicode_alternates": ["2665-FE0F"],
+ "unicode_alternates": [
+ "2665-FE0F"
+ ],
"name": "black heart suit",
"shortname": ":hearts:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["cards", "poker"],
+ "keywords": [
+ "cards",
+ "poker"
+ ],
"moji": "♥"
},
"heavy_check_mark": {
"unicode": "2714",
- "unicode_alternates": ["2714-FE0F"],
+ "unicode_alternates": [
+ "2714-FE0F"
+ ],
"name": "heavy check mark",
"shortname": ":heavy_check_mark:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["nike", "ok"],
+ "keywords": [
+ "nike",
+ "ok"
+ ],
"moji": "✔"
},
"heavy_division_sign": {
@@ -7084,7 +14302,11 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["calculation", "divide", "math"],
+ "keywords": [
+ "calculation",
+ "divide",
+ "math"
+ ],
"moji": "➗"
},
"heavy_dollar_sign": {
@@ -7095,7 +14317,18 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["currency", "money", "payment", "dollar", "currency", "money", "cash", "sale", "purchase", "value"],
+ "keywords": [
+ "currency",
+ "money",
+ "payment",
+ "dollar",
+ "currency",
+ "money",
+ "cash",
+ "sale",
+ "purchase",
+ "value"
+ ],
"moji": "💲"
},
"heavy_minus_sign": {
@@ -7106,18 +14339,26 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["calculation", "math"],
+ "keywords": [
+ "calculation",
+ "math"
+ ],
"moji": "➖"
},
"heavy_multiplication_x": {
"unicode": "2716",
- "unicode_alternates": ["2716-FE0F"],
+ "unicode_alternates": [
+ "2716-FE0F"
+ ],
"name": "heavy multiplication x",
"shortname": ":heavy_multiplication_x:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["calculation", "math"],
+ "keywords": [
+ "calculation",
+ "math"
+ ],
"moji": "✖"
},
"heavy_plus_sign": {
@@ -7128,7 +14369,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["calculation", "math"],
+ "keywords": [
+ "calculation",
+ "math"
+ ],
"moji": "➕"
},
"helicopter": {
@@ -7139,9 +14383,33 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["transportation", "vehicle", "helicopter", "helo", "gyro", "gyrocopter"],
+ "keywords": [
+ "transportation",
+ "vehicle",
+ "helicopter",
+ "helo",
+ "gyro",
+ "gyrocopter"
+ ],
"moji": "🚁"
},
+ "helmet_with_cross": {
+ "unicode": "26D1",
+ "unicode_alternates": "",
+ "name": "helmet with white cross",
+ "shortname": ":helmet_with_cross:",
+ "category": "people",
+ "aliases": [
+ ":helmet_with_white_cross:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "aid",
+ "face",
+ "hat",
+ "person"
+ ]
+ },
"herb": {
"unicode": "1F33F",
"unicode_alternates": [],
@@ -7150,7 +14418,19 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["grass", "lawn", "medicine", "plant", "vegetable", "weed", "herb", "spice", "plant", "cook", "cooking"],
+ "keywords": [
+ "grass",
+ "lawn",
+ "medicine",
+ "plant",
+ "vegetable",
+ "weed",
+ "herb",
+ "spice",
+ "plant",
+ "cook",
+ "cooking"
+ ],
"moji": "🌿"
},
"hibiscus": {
@@ -7161,7 +14441,14 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["flowers", "plant", "vegetable", "hibiscus", "flower", "warm"],
+ "keywords": [
+ "flowers",
+ "plant",
+ "vegetable",
+ "hibiscus",
+ "flower",
+ "warm"
+ ],
"moji": "🌺"
},
"high_brightness": {
@@ -7172,7 +14459,11 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["light", "summer", "sun"],
+ "keywords": [
+ "light",
+ "summer",
+ "sun"
+ ],
"moji": "🔆"
},
"high_heel": {
@@ -7183,9 +14474,23 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["fashion", "female", "shoes"],
+ "keywords": [
+ "fashion",
+ "female",
+ "shoes"
+ ],
"moji": "👠"
},
+ "hockey": {
+ "unicode": "1F3D2",
+ "unicode_alternates": "",
+ "name": "ice hockey stick and puck",
+ "shortname": ":hockey:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": []
+ },
"hole": {
"unicode": "1F573",
"unicode_alternates": [],
@@ -7194,7 +14499,10 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["pit", "well"]
+ "keywords": [
+ "pit",
+ "well"
+ ]
},
"homes": {
"unicode": "1F3D8",
@@ -7202,9 +14510,19 @@
"name": "house buildings",
"shortname": ":homes:",
"category": "travel_places",
- "aliases": [":house_buildings:"],
- "aliases_ascii": [],
- "keywords": ["home", "residence", "dwelling", "mansion", "bungalow", "ranch", "craftsman"]
+ "aliases": [
+ ":house_buildings:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "home",
+ "residence",
+ "dwelling",
+ "mansion",
+ "bungalow",
+ "ranch",
+ "craftsman"
+ ]
},
"honey_pot": {
"unicode": "1F36F",
@@ -7214,7 +14532,15 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["bees", "sweet", "honey", "pot", "bees", "pooh", "bear"],
+ "keywords": [
+ "bees",
+ "sweet",
+ "honey",
+ "pot",
+ "bees",
+ "pooh",
+ "bear"
+ ],
"moji": "🍯"
},
"horse": {
@@ -7225,7 +14551,10 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "brown"],
+ "keywords": [
+ "animal",
+ "brown"
+ ],
"moji": "🐴"
},
"horse_racing": {
@@ -7236,9 +14565,103 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "betting", "competition", "horse", "race", "racing", "jockey", "triple crown"],
+ "keywords": [
+ "animal",
+ "betting",
+ "competition",
+ "horse",
+ "race",
+ "racing",
+ "jockey",
+ "triple crown"
+ ],
"moji": "🏇"
},
+ "horse_racing_tone1": {
+ "unicode": "1F3C7-1F3FB",
+ "unicode_alternates": "",
+ "name": "horse racing tone 1",
+ "shortname": ":horse_racing_tone1:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "animal",
+ "betting",
+ "competition",
+ "race",
+ "jockey",
+ "triple crown"
+ ]
+ },
+ "horse_racing_tone2": {
+ "unicode": "1F3C7-1F3FC",
+ "unicode_alternates": "",
+ "name": "horse racing tone 2",
+ "shortname": ":horse_racing_tone2:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "animal",
+ "betting",
+ "competition",
+ "race",
+ "jockey",
+ "triple crown"
+ ]
+ },
+ "horse_racing_tone3": {
+ "unicode": "1F3C7-1F3FD",
+ "unicode_alternates": "",
+ "name": "horse racing tone 3",
+ "shortname": ":horse_racing_tone3:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "animal",
+ "betting",
+ "competition",
+ "race",
+ "jockey",
+ "triple crown"
+ ]
+ },
+ "horse_racing_tone4": {
+ "unicode": "1F3C7-1F3FE",
+ "unicode_alternates": "",
+ "name": "horse racing tone 4",
+ "shortname": ":horse_racing_tone4:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "animal",
+ "betting",
+ "competition",
+ "race",
+ "jockey",
+ "triple crown"
+ ]
+ },
+ "horse_racing_tone5": {
+ "unicode": "1F3C7-1F3FF",
+ "unicode_alternates": "",
+ "name": "horse racing tone 5",
+ "shortname": ":horse_racing_tone5:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "animal",
+ "betting",
+ "competition",
+ "race",
+ "jockey",
+ "triple crown"
+ ]
+ },
"hospital": {
"unicode": "1F3E5",
"unicode_alternates": [],
@@ -7247,7 +14670,12 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["building", "doctor", "health", "surgery"],
+ "keywords": [
+ "building",
+ "doctor",
+ "health",
+ "surgery"
+ ],
"moji": "🏥"
},
"hot_pepper": {
@@ -7258,7 +14686,27 @@
"category": "food_drink",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["food", "nature", "spicy", "chili", "cayenne", "habanero", "jalapeno"]
+ "keywords": [
+ "food",
+ "nature",
+ "spicy",
+ "chili",
+ "cayenne",
+ "habanero",
+ "jalapeno"
+ ]
+ },
+ "hotdog": {
+ "unicode": "1F32D",
+ "unicode_alternates": "",
+ "name": "hot dog",
+ "shortname": ":hotdog:",
+ "category": "foods",
+ "aliases": [
+ ":hot_dog:"
+ ],
+ "aliases_ascii": [],
+ "keywords": []
},
"hotel": {
"unicode": "1F3E8",
@@ -7268,29 +14716,50 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["accomodation", "building", "checkin", "whotel", "hotel", "motel", "holiday inn", "hospital"],
+ "keywords": [
+ "accomodation",
+ "building",
+ "checkin",
+ "whotel",
+ "hotel",
+ "motel",
+ "holiday inn",
+ "hospital"
+ ],
"moji": "🏨"
},
"hotsprings": {
"unicode": "2668",
- "unicode_alternates": ["2668-FE0F"],
+ "unicode_alternates": [
+ "2668-FE0F"
+ ],
"name": "hot springs",
"shortname": ":hotsprings:",
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["bath", "relax", "warm"],
+ "keywords": [
+ "bath",
+ "relax",
+ "warm"
+ ],
"moji": "♨"
},
"hourglass": {
"unicode": "231B",
- "unicode_alternates": ["231B-FE0F"],
+ "unicode_alternates": [
+ "231B-FE0F"
+ ],
"name": "hourglass",
"shortname": ":hourglass:",
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["clock", "oldschool", "time"],
+ "keywords": [
+ "clock",
+ "oldschool",
+ "time"
+ ],
"moji": "⌛"
},
"hourglass_flowing_sand": {
@@ -7301,7 +14770,11 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["countdown", "oldschool", "time"],
+ "keywords": [
+ "countdown",
+ "oldschool",
+ "time"
+ ],
"moji": "⏳"
},
"house": {
@@ -7312,7 +14785,18 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["building", "home", "house", "home", "residence", "dwelling", "mansion", "bungalow", "ranch", "craftsman"],
+ "keywords": [
+ "building",
+ "home",
+ "house",
+ "home",
+ "residence",
+ "dwelling",
+ "mansion",
+ "bungalow",
+ "ranch",
+ "craftsman"
+ ],
"moji": "🏠"
},
"house_abandoned": {
@@ -7321,9 +14805,24 @@
"name": "derelict house building",
"shortname": ":house_abandoned:",
"category": "travel_places",
- "aliases": [":derelict_house_building:"],
- "aliases_ascii": [],
- "keywords": ["home", "residence", "dwelling", "mansion", "bungalow", "ranch", "craftsman", "boarded", "abandoned", "vacant", "run down", "shoddy"]
+ "aliases": [
+ ":derelict_house_building:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "home",
+ "residence",
+ "dwelling",
+ "mansion",
+ "bungalow",
+ "ranch",
+ "craftsman",
+ "boarded",
+ "abandoned",
+ "vacant",
+ "run down",
+ "shoddy"
+ ]
},
"house_with_garden": {
"unicode": "1F3E1",
@@ -7333,9 +14832,25 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["home", "nature", "plant"],
+ "keywords": [
+ "home",
+ "nature",
+ "plant"
+ ],
"moji": "🏡"
},
+ "hugging": {
+ "unicode": "1F917",
+ "unicode_alternates": "",
+ "name": "hugging face",
+ "shortname": ":hugging:",
+ "category": "people",
+ "aliases": [
+ ":hugging_face:"
+ ],
+ "aliases_ascii": [],
+ "keywords": []
+ },
"hushed": {
"unicode": "1F62F",
"unicode_alternates": [],
@@ -7344,7 +14859,14 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["face", "woo", "quiet", "hush", "whisper", "silent"],
+ "keywords": [
+ "face",
+ "woo",
+ "quiet",
+ "hush",
+ "whisper",
+ "silent"
+ ],
"moji": "😯"
},
"ice_cream": {
@@ -7355,9 +14877,37 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["desert", "food", "hot", "icecream", "ice", "cream", "dairy", "dessert", "cold", "soft", "serve", "cone", "waffle"],
+ "keywords": [
+ "desert",
+ "food",
+ "hot",
+ "icecream",
+ "ice",
+ "cream",
+ "dairy",
+ "dessert",
+ "cold",
+ "soft",
+ "serve",
+ "cone",
+ "waffle"
+ ],
"moji": "🍨"
},
+ "ice_skate": {
+ "unicode": "26F8",
+ "unicode_alternates": "",
+ "name": "ice skate",
+ "shortname": ":ice_skate:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "place",
+ "sport",
+ "travel"
+ ]
+ },
"icecream": {
"unicode": "1F366",
"unicode_alternates": [],
@@ -7366,9 +14916,39 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["desert", "food", "hot", "icecream", "ice", "cream", "dairy", "dessert", "cold", "soft", "serve", "cone", "yogurt"],
+ "keywords": [
+ "desert",
+ "food",
+ "hot",
+ "icecream",
+ "ice",
+ "cream",
+ "dairy",
+ "dessert",
+ "cold",
+ "soft",
+ "serve",
+ "cone",
+ "yogurt"
+ ],
"moji": "🍦"
},
+ "id": {
+ "unicode": "1F194",
+ "unicode_alternates": "",
+ "name": "squared id",
+ "shortname": ":id:",
+ "category": "symbols",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "purple-square",
+ "identification",
+ "identity",
+ "symbol",
+ "word"
+ ]
+ },
"ideograph_advantage": {
"unicode": "1F250",
"unicode_alternates": [],
@@ -7377,7 +14957,12 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["chinese", "get", "kanji", "obtain"],
+ "keywords": [
+ "chinese",
+ "get",
+ "kanji",
+ "obtain"
+ ],
"moji": "🉐"
},
"imp": {
@@ -7388,7 +14973,14 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["angry", "devil", "evil", "horns", "cute", "devil"],
+ "keywords": [
+ "angry",
+ "devil",
+ "evil",
+ "horns",
+ "cute",
+ "devil"
+ ],
"moji": "👿"
},
"inbox_tray": {
@@ -7399,7 +14991,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["documents", "email"],
+ "keywords": [
+ "documents",
+ "email"
+ ],
"moji": "📥"
},
"incoming_envelope": {
@@ -7410,7 +15005,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["email", "inbox"],
+ "keywords": [
+ "email",
+ "inbox"
+ ],
"moji": "📨"
},
"info": {
@@ -7419,9 +15017,13 @@
"name": "circled information source",
"shortname": ":info:",
"category": "objects_symbols",
- "aliases": [":circled_information_source:"],
+ "aliases": [
+ ":circled_information_source:"
+ ],
"aliases_ascii": [],
- "keywords": ["icon"]
+ "keywords": [
+ "icon"
+ ]
},
"information_desk_person": {
"unicode": "1F481",
@@ -7431,18 +15033,147 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["female", "girl", "human", "woman", "information", "help", "question", "answer", "sassy", "unimpressed", "attitude", "snarky"],
+ "keywords": [
+ "female",
+ "girl",
+ "human",
+ "woman",
+ "information",
+ "help",
+ "question",
+ "answer",
+ "sassy",
+ "unimpressed",
+ "attitude",
+ "snarky"
+ ],
"moji": "💁"
},
+ "information_desk_person_tone1": {
+ "unicode": "1F481-1F3FB",
+ "unicode_alternates": "",
+ "name": "information desk person tone 1",
+ "shortname": ":information_desk_person_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "human",
+ "woman",
+ "help",
+ "question",
+ "answer",
+ "sassy",
+ "unimpressed",
+ "attitude",
+ "snarky"
+ ]
+ },
+ "information_desk_person_tone2": {
+ "unicode": "1F481-1F3FC",
+ "unicode_alternates": "",
+ "name": "information desk person tone 2",
+ "shortname": ":information_desk_person_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "human",
+ "woman",
+ "help",
+ "question",
+ "answer",
+ "sassy",
+ "unimpressed",
+ "attitude",
+ "snarky"
+ ]
+ },
+ "information_desk_person_tone3": {
+ "unicode": "1F481-1F3FD",
+ "unicode_alternates": "",
+ "name": "information desk person tone 3",
+ "shortname": ":information_desk_person_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "human",
+ "woman",
+ "help",
+ "question",
+ "answer",
+ "sassy",
+ "unimpressed",
+ "attitude",
+ "snarky"
+ ]
+ },
+ "information_desk_person_tone4": {
+ "unicode": "1F481-1F3FE",
+ "unicode_alternates": "",
+ "name": "information desk person tone 4",
+ "shortname": ":information_desk_person_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "human",
+ "woman",
+ "help",
+ "question",
+ "answer",
+ "sassy",
+ "unimpressed",
+ "attitude",
+ "snarky"
+ ]
+ },
+ "information_desk_person_tone5": {
+ "unicode": "1F481-1F3FF",
+ "unicode_alternates": "",
+ "name": "information desk person tone 5",
+ "shortname": ":information_desk_person_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "human",
+ "woman",
+ "help",
+ "question",
+ "answer",
+ "sassy",
+ "unimpressed",
+ "attitude",
+ "snarky"
+ ]
+ },
"information_source": {
"unicode": "2139",
- "unicode_alternates": ["2139-FE0F"],
+ "unicode_alternates": [
+ "2139-FE0F"
+ ],
"name": "information source",
"shortname": ":information_source:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["alphabet", "blue-square", "letter"],
+ "keywords": [
+ "alphabet",
+ "blue-square",
+ "letter"
+ ],
"moji": "ℹ"
},
"innocent": {
@@ -7452,19 +15183,49 @@
"shortname": ":innocent:",
"category": "emoticons",
"aliases": [],
- "aliases_ascii": ["O:-)", "0:-3", "0:3", "0:-)", "0:)", "0;^)", "O:-)", "O:)", "O;-)", "O=)", "0;-)", "O:-3", "O:3"],
- "keywords": ["angel", "face", "halo", "halo", "angel", "innocent", "ring", "circle", "heaven"],
+ "aliases_ascii": [
+ "O:-)",
+ "0:-3",
+ "0:3",
+ "0:-)",
+ "0:)",
+ "0;^)",
+ "O:-)",
+ "O:)",
+ "O;-)",
+ "O=)",
+ "0;-)",
+ "O:-3",
+ "O:3"
+ ],
+ "keywords": [
+ "angel",
+ "face",
+ "halo",
+ "halo",
+ "angel",
+ "innocent",
+ "ring",
+ "circle",
+ "heaven"
+ ],
"moji": "😇"
},
"interrobang": {
"unicode": "2049",
- "unicode_alternates": ["2049-FE0F"],
+ "unicode_alternates": [
+ "2049-FE0F"
+ ],
"name": "exclamation question mark",
"shortname": ":interrobang:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["punctuation", "surprise", "wat"],
+ "keywords": [
+ "punctuation",
+ "surprise",
+ "wat"
+ ],
"moji": "⁉"
},
"iphone": {
@@ -7475,7 +15236,12 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["apple", "dial", "gadgets", "technology"],
+ "keywords": [
+ "apple",
+ "dial",
+ "gadgets",
+ "technology"
+ ],
"moji": "📱"
},
"island": {
@@ -7484,9 +15250,15 @@
"name": "desert island",
"shortname": ":island:",
"category": "travel_places",
- "aliases": [":desert_island:"],
+ "aliases": [
+ ":desert_island:"
+ ],
"aliases_ascii": [],
- "keywords": ["land", "solitude", "alone"]
+ "keywords": [
+ "land",
+ "solitude",
+ "alone"
+ ]
},
"izakaya_lantern": {
"unicode": "1F3EE",
@@ -7496,7 +15268,17 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["light", "izakaya", "lantern", "stay", "drink", "alcohol", "bar", "sake", "restaurant"],
+ "keywords": [
+ "light",
+ "izakaya",
+ "lantern",
+ "stay",
+ "drink",
+ "alcohol",
+ "bar",
+ "sake",
+ "restaurant"
+ ],
"moji": "🏮"
},
"jack_o_lantern": {
@@ -7507,7 +15289,24 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["halloween", "jack-o-lantern", "pumpkin", "halloween", "holiday", "carve", "autumn", "fall", "october", "saints", "costume", "spooky", "horror", "scary", "scared", "dead"],
+ "keywords": [
+ "halloween",
+ "jack-o-lantern",
+ "pumpkin",
+ "halloween",
+ "holiday",
+ "carve",
+ "autumn",
+ "fall",
+ "october",
+ "saints",
+ "costume",
+ "spooky",
+ "horror",
+ "scary",
+ "scared",
+ "dead"
+ ],
"moji": "🎃"
},
"japan": {
@@ -7518,7 +15317,9 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["nation"],
+ "keywords": [
+ "nation"
+ ],
"moji": "🗾"
},
"japanese_castle": {
@@ -7529,7 +15330,17 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["building", "photo", "castle", "japanese", "residence", "royalty", "fort", "fortified", "fortress"],
+ "keywords": [
+ "building",
+ "photo",
+ "castle",
+ "japanese",
+ "residence",
+ "royalty",
+ "fort",
+ "fortified",
+ "fortress"
+ ],
"moji": "🏯"
},
"japanese_goblin": {
@@ -7540,7 +15351,24 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["evil", "mask", "red", "japanese", "tengu", "supernatural", "avian", "demon", "goblin", "mask", "theater", "nose", "frown", "mustache", "anger", "frustration"],
+ "keywords": [
+ "evil",
+ "mask",
+ "red",
+ "japanese",
+ "tengu",
+ "supernatural",
+ "avian",
+ "demon",
+ "goblin",
+ "mask",
+ "theater",
+ "nose",
+ "frown",
+ "mustache",
+ "anger",
+ "frustration"
+ ],
"moji": "👺"
},
"japanese_ogre": {
@@ -7551,7 +15379,21 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["monster", "japanese", "oni", "demon", "troll", "ogre", "folklore", "monster", "devil", "mask", "theater", "horns", "teeth"],
+ "keywords": [
+ "monster",
+ "japanese",
+ "oni",
+ "demon",
+ "troll",
+ "ogre",
+ "folklore",
+ "monster",
+ "devil",
+ "mask",
+ "theater",
+ "horns",
+ "teeth"
+ ],
"moji": "👹"
},
"jeans": {
@@ -7562,7 +15404,19 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["fashion", "shopping", "jeans", "pants", "blue", "denim", "levi&#039;s", "levi", "designer", "work", "skinny"],
+ "keywords": [
+ "fashion",
+ "shopping",
+ "jeans",
+ "pants",
+ "blue",
+ "denim",
+ "levi&#039;s",
+ "levi",
+ "designer",
+ "work",
+ "skinny"
+ ],
"moji": "👖"
},
"jet_up": {
@@ -7571,9 +15425,13 @@
"name": "up-pointing military airplane",
"shortname": ":jet_up:",
"category": "travel_places",
- "aliases": [":up_pointing_military_airplane:"],
+ "aliases": [
+ ":up_pointing_military_airplane:"
+ ],
"aliases_ascii": [],
- "keywords": ["jet"]
+ "keywords": [
+ "jet"
+ ]
},
"joy": {
"unicode": "1F602",
@@ -7582,8 +15440,22 @@
"shortname": ":joy:",
"category": "emoticons",
"aliases": [],
- "aliases_ascii": [":')", ":'-)"],
- "keywords": ["cry", "face", "haha", "happy", "tears", "tears", "cry", "joy", "happy", "weep"],
+ "aliases_ascii": [
+ ":')",
+ ":'-)"
+ ],
+ "keywords": [
+ "cry",
+ "face",
+ "haha",
+ "happy",
+ "tears",
+ "tears",
+ "cry",
+ "joy",
+ "happy",
+ "weep"
+ ],
"moji": "😂"
},
"joy_cat": {
@@ -7594,7 +15466,17 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "cats", "haha", "happy", "tears", "happy", "tears", "cry", "joy"],
+ "keywords": [
+ "animal",
+ "cats",
+ "haha",
+ "happy",
+ "tears",
+ "happy",
+ "tears",
+ "cry",
+ "joy"
+ ],
"moji": "😹"
},
"joystick": {
@@ -7605,7 +15487,21 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["games", "atari", "controller"]
+ "keywords": [
+ "games",
+ "atari",
+ "controller"
+ ]
+ },
+ "kaaba": {
+ "unicode": "1F54B",
+ "unicode_alternates": "",
+ "name": "kaaba",
+ "shortname": ":kaaba:",
+ "category": "travel",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": []
},
"key": {
"unicode": "1F511",
@@ -7615,7 +15511,11 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["door", "lock", "password"],
+ "keywords": [
+ "door",
+ "lock",
+ "password"
+ ],
"moji": "🔑"
},
"key2": {
@@ -7624,9 +15524,16 @@
"name": "old key",
"shortname": ":key2:",
"category": "objects_symbols",
- "aliases": [":old_key:"],
+ "aliases": [
+ ":old_key:"
+ ],
"aliases_ascii": [],
- "keywords": ["door", "lock", "password", "skeleton"]
+ "keywords": [
+ "door",
+ "lock",
+ "password",
+ "skeleton"
+ ]
},
"keyboard": {
"unicode": "1F5AE",
@@ -7634,9 +15541,16 @@
"name": "wired keyboard",
"shortname": ":keyboard:",
"category": "objects_symbols",
- "aliases": [":wired_keyboard:"],
+ "aliases": [
+ ":wired_keyboard:"
+ ],
"aliases_ascii": [],
- "keywords": ["typing", "keys", "input", "device"]
+ "keywords": [
+ "typing",
+ "keys",
+ "input",
+ "device"
+ ]
},
"keyboard_mouse": {
"unicode": "1F5A6",
@@ -7644,9 +15558,15 @@
"name": "keyboard and mouse",
"shortname": ":keyboard_mouse:",
"category": "objects_symbols",
- "aliases": [":keyboard_and_mouse:"],
+ "aliases": [
+ ":keyboard_and_mouse:"
+ ],
"aliases_ascii": [],
- "keywords": ["computer", "input", "desktop"]
+ "keywords": [
+ "computer",
+ "input",
+ "desktop"
+ ]
},
"keyboard_with_jacks": {
"unicode": "1F398",
@@ -7654,9 +15574,15 @@
"name": "musical keyboard with jacks",
"shortname": ":keyboard_with_jacks:",
"category": "objects_symbols",
- "aliases": [":musical_keyboard_with_jacks:"],
+ "aliases": [
+ ":musical_keyboard_with_jacks:"
+ ],
"aliases_ascii": [],
- "keywords": ["music", "instrument", "midi"]
+ "keywords": [
+ "music",
+ "instrument",
+ "midi"
+ ]
},
"keycap_ten": {
"unicode": "1F51F",
@@ -7666,7 +15592,11 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["10", "blue-square", "numbers"],
+ "keywords": [
+ "10",
+ "blue-square",
+ "numbers"
+ ],
"moji": "🔟"
},
"kimono": {
@@ -7677,7 +15607,13 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["dress", "fashion", "female", "japanese", "women"],
+ "keywords": [
+ "dress",
+ "fashion",
+ "female",
+ "japanese",
+ "women"
+ ],
"moji": "👘"
},
"kiss": {
@@ -7688,28 +15624,57 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["affection", "face", "like", "lips", "love", "valentines"],
+ "keywords": [
+ "affection",
+ "face",
+ "like",
+ "lips",
+ "love",
+ "valentines"
+ ],
"moji": "💋"
},
"kiss_mm": {
"unicode": "1F468-2764-1F48B-1F468",
- "unicode_alternates": ["1F468-200D-2764-FE0F-200D-1F48B-200D-1F468"],
+ "unicode_alternates": [
+ "1F468-200D-2764-FE0F-200D-1F48B-200D-1F468"
+ ],
"name": "kiss (man,man)",
"shortname": ":kiss_mm:",
"category": "people",
- "aliases": [":couplekiss_mm:"],
- "aliases_ascii": [],
- "keywords": ["dating", "like", "love", "marriage", "valentines", "couple"]
+ "aliases": [
+ ":couplekiss_mm:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "dating",
+ "like",
+ "love",
+ "marriage",
+ "valentines",
+ "couple"
+ ]
},
"kiss_ww": {
"unicode": "1F469-2764-1F48B-1F469",
- "unicode_alternates": ["1F469-200D-2764-FE0F-200D-1F48B-200D-1F469"],
+ "unicode_alternates": [
+ "1F469-200D-2764-FE0F-200D-1F48B-200D-1F469"
+ ],
"name": "kiss (woman,woman)",
"shortname": ":kiss_ww:",
"category": "people",
- "aliases": [":couplekiss_ww:"],
- "aliases_ascii": [],
- "keywords": ["dating", "like", "love", "marriage", "valentines", "couple"]
+ "aliases": [
+ ":couplekiss_ww:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "dating",
+ "like",
+ "love",
+ "marriage",
+ "valentines",
+ "couple"
+ ]
},
"kissing": {
"unicode": "1F617",
@@ -7719,7 +15684,19 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["3", "face", "infatuation", "like", "love", "valentines", "kissing", "kiss", "pucker", "lips", "smooch"],
+ "keywords": [
+ "3",
+ "face",
+ "infatuation",
+ "like",
+ "love",
+ "valentines",
+ "kissing",
+ "kiss",
+ "pucker",
+ "lips",
+ "smooch"
+ ],
"moji": "😗"
},
"kissing_cat": {
@@ -7730,7 +15707,15 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "cats", "passion", "kiss", "puckered", "heart", "love"],
+ "keywords": [
+ "animal",
+ "cats",
+ "passion",
+ "kiss",
+ "puckered",
+ "heart",
+ "love"
+ ],
"moji": "😽"
},
"kissing_closed_eyes": {
@@ -7741,7 +15726,21 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["affection", "face", "infatuation", "like", "love", "valentines", "kissing", "kiss", "passion", "puckered", "heart", "love", "smooch"],
+ "keywords": [
+ "affection",
+ "face",
+ "infatuation",
+ "like",
+ "love",
+ "valentines",
+ "kissing",
+ "kiss",
+ "passion",
+ "puckered",
+ "heart",
+ "love",
+ "smooch"
+ ],
"moji": "😚"
},
"kissing_heart": {
@@ -7751,8 +15750,25 @@
"shortname": ":kissing_heart:",
"category": "emoticons",
"aliases": [],
- "aliases_ascii": [":*", ":-*", "=*", ":^*"],
- "keywords": ["affection", "face", "infatuation", "kiss", "blowing kiss", "heart", "love", "lips", "like", "love", "valentines"],
+ "aliases_ascii": [
+ ":*",
+ ":-*",
+ "=*",
+ ":^*"
+ ],
+ "keywords": [
+ "affection",
+ "face",
+ "infatuation",
+ "kiss",
+ "blowing kiss",
+ "heart",
+ "love",
+ "lips",
+ "like",
+ "love",
+ "valentines"
+ ],
"moji": "😘"
},
"kissing_smiling_eyes": {
@@ -7763,7 +15779,18 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["affection", "face", "infatuation", "valentines", "kissing", "kiss", "smile", "pucker", "lips", "smooch"],
+ "keywords": [
+ "affection",
+ "face",
+ "infatuation",
+ "valentines",
+ "kissing",
+ "kiss",
+ "smile",
+ "pucker",
+ "lips",
+ "smooch"
+ ],
"moji": "😙"
},
"knife": {
@@ -7785,7 +15812,10 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "nature"],
+ "keywords": [
+ "animal",
+ "nature"
+ ],
"moji": "🐨"
},
"koko": {
@@ -7796,7 +15826,13 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue-square", "destination", "here", "japanese", "katakana"],
+ "keywords": [
+ "blue-square",
+ "destination",
+ "here",
+ "japanese",
+ "katakana"
+ ],
"moji": "🈁"
},
"label": {
@@ -7807,7 +15843,9 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["tag"]
+ "keywords": [
+ "tag"
+ ]
},
"large_blue_circle": {
"unicode": "1F535",
@@ -7828,7 +15866,9 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["shape"],
+ "keywords": [
+ "shape"
+ ],
"moji": "🔷"
},
"large_orange_diamond": {
@@ -7839,7 +15879,9 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["shape"],
+ "keywords": [
+ "shape"
+ ],
"moji": "🔶"
},
"last_quarter_moon": {
@@ -7850,7 +15892,16 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["nature", "moon", "last", "quarter", "sky", "night", "cheese", "phase"],
+ "keywords": [
+ "nature",
+ "moon",
+ "last",
+ "quarter",
+ "sky",
+ "night",
+ "cheese",
+ "phase"
+ ],
"moji": "🌗"
},
"last_quarter_moon_with_face": {
@@ -7861,7 +15912,18 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["nature", "moon", "last", "quarter", "anthropomorphic", "face", "sky", "night", "cheese", "phase"],
+ "keywords": [
+ "nature",
+ "moon",
+ "last",
+ "quarter",
+ "anthropomorphic",
+ "face",
+ "sky",
+ "night",
+ "cheese",
+ "phase"
+ ],
"moji": "🌜"
},
"laughing": {
@@ -7870,9 +15932,23 @@
"name": "smiling face with open mouth and tightly-closed ey",
"shortname": ":laughing:",
"category": "emoticons",
- "aliases": [":satisfied:"],
- "aliases_ascii": [">:)", ">;)", ">:-)", ">=)"],
- "keywords": ["happy", "joy", "lol", "smiling", "laughing", "laugh"],
+ "aliases": [
+ ":satisfied:"
+ ],
+ "aliases_ascii": [
+ ">:)",
+ ">;)",
+ ">:-)",
+ ">=)"
+ ],
+ "keywords": [
+ "happy",
+ "joy",
+ "lol",
+ "smiling",
+ "laughing",
+ "laugh"
+ ],
"moji": "😆"
},
"leaves": {
@@ -7883,7 +15959,19 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["grass", "lawn", "nature", "plant", "tree", "vegetable", "leaves", "leaf", "wind", "float", "fluttering"],
+ "keywords": [
+ "grass",
+ "lawn",
+ "nature",
+ "plant",
+ "tree",
+ "vegetable",
+ "leaves",
+ "leaf",
+ "wind",
+ "float",
+ "fluttering"
+ ],
"moji": "🍃"
},
"ledger": {
@@ -7894,7 +15982,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["notes", "paper"],
+ "keywords": [
+ "notes",
+ "paper"
+ ],
"moji": "📒"
},
"left_luggage": {
@@ -7905,7 +15996,14 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue-square", "travel", "bag", "baggage", "luggage", "travel"],
+ "keywords": [
+ "blue-square",
+ "travel",
+ "bag",
+ "baggage",
+ "luggage",
+ "travel"
+ ],
"moji": "🛅"
},
"left_receiver": {
@@ -7914,24 +16012,36 @@
"name": "left hand telephone receiver",
"shortname": ":left_receiver:",
"category": "objects_symbols",
- "aliases": [":left_hand_telephone_receiver:"],
+ "aliases": [
+ ":left_hand_telephone_receiver:"
+ ],
"aliases_ascii": [],
- "keywords": ["communication", "dial", "technology"]
+ "keywords": [
+ "communication",
+ "dial",
+ "technology"
+ ]
},
"left_right_arrow": {
"unicode": "2194",
- "unicode_alternates": ["2194-FE0F"],
+ "unicode_alternates": [
+ "2194-FE0F"
+ ],
"name": "left right arrow",
"shortname": ":left_right_arrow:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["shape"],
+ "keywords": [
+ "shape"
+ ],
"moji": "↔"
},
"leftwards_arrow_with_hook": {
"unicode": "21A9",
- "unicode_alternates": ["21A9-FE0F"],
+ "unicode_alternates": [
+ "21A9-FE0F"
+ ],
"name": "leftwards arrow with hook",
"shortname": ":leftwards_arrow_with_hook:",
"category": "other",
@@ -7948,18 +16058,39 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["fruit", "nature", "lemon", "yellow", "citrus"],
+ "keywords": [
+ "fruit",
+ "nature",
+ "lemon",
+ "yellow",
+ "citrus"
+ ],
"moji": "🍋"
},
"leo": {
"unicode": "264C",
- "unicode_alternates": ["264C-FE0F"],
+ "unicode_alternates": [
+ "264C-FE0F"
+ ],
"name": "leo",
"shortname": ":leo:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["leo", "lion", "astrology", "greek", "constellation", "stars", "zodiac", "sign", "purple-square", "sign", "zodiac", "horoscope"],
+ "keywords": [
+ "leo",
+ "lion",
+ "astrology",
+ "greek",
+ "constellation",
+ "stars",
+ "zodiac",
+ "sign",
+ "purple-square",
+ "sign",
+ "zodiac",
+ "horoscope"
+ ],
"moji": "♌"
},
"leopard": {
@@ -7970,7 +16101,15 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "nature", "leopard", "cat", "spot", "spotted", "sexy"],
+ "keywords": [
+ "animal",
+ "nature",
+ "leopard",
+ "cat",
+ "spot",
+ "spotted",
+ "sexy"
+ ],
"moji": "🐆"
},
"level_slider": {
@@ -7981,7 +16120,9 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["controls"]
+ "keywords": [
+ "controls"
+ ]
},
"levitate": {
"unicode": "1F574",
@@ -7989,19 +16130,39 @@
"name": "man in business suit levitating",
"shortname": ":levitate:",
"category": "people",
- "aliases": [":man_in_business_suit_levitating:"],
+ "aliases": [
+ ":man_in_business_suit_levitating:"
+ ],
"aliases_ascii": [],
- "keywords": ["hover", "exclamation"]
+ "keywords": [
+ "hover",
+ "exclamation"
+ ]
},
"libra": {
"unicode": "264E",
- "unicode_alternates": ["264E-FE0F"],
+ "unicode_alternates": [
+ "264E-FE0F"
+ ],
"name": "libra",
"shortname": ":libra:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["libra", "scales", "astrology", "greek", "constellation", "stars", "zodiac", "sign", "purple-square", "sign", "zodiac", "horoscope"],
+ "keywords": [
+ "libra",
+ "scales",
+ "astrology",
+ "greek",
+ "constellation",
+ "stars",
+ "zodiac",
+ "sign",
+ "purple-square",
+ "sign",
+ "zodiac",
+ "horoscope"
+ ],
"moji": "♎"
},
"lifter": {
@@ -8010,9 +16171,101 @@
"name": "weight lifter",
"shortname": ":lifter:",
"category": "activity",
- "aliases": [":weight_lifter:"],
+ "aliases": [
+ ":weight_lifter:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "bench",
+ "press",
+ "squats",
+ "deadlift"
+ ]
+ },
+ "lifter_tone1": {
+ "unicode": "1F3CB-1F3FB",
+ "unicode_alternates": "",
+ "name": "weight lifter tone 1",
+ "shortname": ":lifter_tone1:",
+ "category": "activity",
+ "aliases": [
+ ":weight_lifter_tone1:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "bench",
+ "press",
+ "squats",
+ "deadlift"
+ ]
+ },
+ "lifter_tone2": {
+ "unicode": "1F3CB-1F3FC",
+ "unicode_alternates": "",
+ "name": "weight lifter tone 2",
+ "shortname": ":lifter_tone2:",
+ "category": "activity",
+ "aliases": [
+ ":weight_lifter_tone2:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "bench",
+ "press",
+ "squats",
+ "deadlift"
+ ]
+ },
+ "lifter_tone3": {
+ "unicode": "1F3CB-1F3FD",
+ "unicode_alternates": "",
+ "name": "weight lifter tone 3",
+ "shortname": ":lifter_tone3:",
+ "category": "activity",
+ "aliases": [
+ ":weight_lifter_tone3:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "bench",
+ "press",
+ "squats",
+ "deadlift"
+ ]
+ },
+ "lifter_tone4": {
+ "unicode": "1F3CB-1F3FE",
+ "unicode_alternates": "",
+ "name": "weight lifter tone 4",
+ "shortname": ":lifter_tone4:",
+ "category": "activity",
+ "aliases": [
+ ":weight_lifter_tone4:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "bench",
+ "press",
+ "squats",
+ "deadlift"
+ ]
+ },
+ "lifter_tone5": {
+ "unicode": "1F3CB-1F3FF",
+ "unicode_alternates": "",
+ "name": "weight lifter tone 5",
+ "shortname": ":lifter_tone5:",
+ "category": "activity",
+ "aliases": [
+ ":weight_lifter_tone5:"
+ ],
"aliases_ascii": [],
- "keywords": ["bench", "press", "squats", "deadlift"]
+ "keywords": [
+ "bench",
+ "press",
+ "squats",
+ "deadlift"
+ ]
},
"light_check_mark": {
"unicode": "1F5F8",
@@ -8020,9 +16273,13 @@
"name": "light check mark",
"shortname": ":light_check_mark:",
"category": "objects_symbols",
- "aliases": [":light_mark:"],
+ "aliases": [
+ ":light_mark:"
+ ],
"aliases_ascii": [],
- "keywords": ["vote"]
+ "keywords": [
+ "vote"
+ ]
},
"light_rail": {
"unicode": "1F688",
@@ -8032,7 +16289,13 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["transportation", "vehicle", "train", "rail", "light"],
+ "keywords": [
+ "transportation",
+ "vehicle",
+ "train",
+ "rail",
+ "light"
+ ],
"moji": "🚈"
},
"link": {
@@ -8043,9 +16306,24 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["rings", "url"],
+ "keywords": [
+ "rings",
+ "url"
+ ],
"moji": "🔗"
},
+ "lion_face": {
+ "unicode": "1F981",
+ "unicode_alternates": "",
+ "name": "lion face",
+ "shortname": ":lion_face:",
+ "category": "nature",
+ "aliases": [
+ ":lion:"
+ ],
+ "aliases_ascii": [],
+ "keywords": []
+ },
"lips": {
"unicode": "1F444",
"unicode_alternates": [],
@@ -8054,7 +16332,10 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["kiss", "mouth"],
+ "keywords": [
+ "kiss",
+ "mouth"
+ ],
"moji": "👄"
},
"lips2": {
@@ -8065,7 +16346,10 @@
"category": "people",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["kiss", "mouth"]
+ "keywords": [
+ "kiss",
+ "mouth"
+ ]
},
"lipstick": {
"unicode": "1F484",
@@ -8075,7 +16359,11 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["fashion", "female", "girl"],
+ "keywords": [
+ "fashion",
+ "female",
+ "girl"
+ ],
"moji": "💄"
},
"lock": {
@@ -8086,7 +16374,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["password", "security"],
+ "keywords": [
+ "password",
+ "security"
+ ],
"moji": "🔒"
},
"lock_with_ink_pen": {
@@ -8097,7 +16388,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["secret", "security"],
+ "keywords": [
+ "secret",
+ "security"
+ ],
"moji": "🔏"
},
"lollipop": {
@@ -8108,7 +16402,18 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["candy", "food", "snack", "sweet", "lollipop", "stick", "lick", "sweet", "sugar", "candy"],
+ "keywords": [
+ "candy",
+ "food",
+ "snack",
+ "sweet",
+ "lollipop",
+ "stick",
+ "lick",
+ "sweet",
+ "sugar",
+ "candy"
+ ],
"moji": "🍭"
},
"loop": {
@@ -8119,7 +16424,9 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["curly"],
+ "keywords": [
+ "curly"
+ ],
"moji": "➿"
},
"loud_sound": {
@@ -8141,7 +16448,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["sound", "volume"],
+ "keywords": [
+ "sound",
+ "volume"
+ ],
"moji": "📢"
},
"love_hotel": {
@@ -8152,7 +16462,22 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["affection", "dating", "like", "love", "hotel", "love", "sex", "romance", "leisure", "adultery", "prostitution", "hospital", "birth", "happy"],
+ "keywords": [
+ "affection",
+ "dating",
+ "like",
+ "love",
+ "hotel",
+ "love",
+ "sex",
+ "romance",
+ "leisure",
+ "adultery",
+ "prostitution",
+ "hospital",
+ "birth",
+ "happy"
+ ],
"moji": "🏩"
},
"love_letter": {
@@ -8163,7 +16488,17 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["affection", "email", "envelope", "like", "valentines", "love", "letter", "kiss", "heart"],
+ "keywords": [
+ "affection",
+ "email",
+ "envelope",
+ "like",
+ "valentines",
+ "love",
+ "letter",
+ "kiss",
+ "heart"
+ ],
"moji": "💌"
},
"low_brightness": {
@@ -8174,18 +16509,27 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["summer", "sun"],
+ "keywords": [
+ "summer",
+ "sun"
+ ],
"moji": "🔅"
},
"m": {
"unicode": "24C2",
- "unicode_alternates": ["24C2-FE0F"],
+ "unicode_alternates": [
+ "24C2-FE0F"
+ ],
"name": "circled latin capital letter m",
"shortname": ":m:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["alphabet", "blue-circle", "letter"],
+ "keywords": [
+ "alphabet",
+ "blue-circle",
+ "letter"
+ ],
"moji": "Ⓜ"
},
"mag": {
@@ -8196,7 +16540,14 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["search", "zoom", "detective", "investigator", "detail", "details"],
+ "keywords": [
+ "search",
+ "zoom",
+ "detective",
+ "investigator",
+ "detail",
+ "details"
+ ],
"moji": "🔍"
},
"mag_right": {
@@ -8207,18 +16558,31 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["search", "zoom", "detective", "investigator", "detail", "details"],
+ "keywords": [
+ "search",
+ "zoom",
+ "detective",
+ "investigator",
+ "detail",
+ "details"
+ ],
"moji": "🔎"
},
"mahjong": {
"unicode": "1F004",
- "unicode_alternates": ["1F004-FE0F"],
+ "unicode_alternates": [
+ "1F004-FE0F"
+ ],
"name": "mahjong tile red dragon",
"shortname": ":mahjong:",
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["chinese", "game", "kanji"],
+ "keywords": [
+ "chinese",
+ "game",
+ "kanji"
+ ],
"moji": "🀄"
},
"mailbox": {
@@ -8229,7 +16593,11 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["communication", "email", "inbox"],
+ "keywords": [
+ "communication",
+ "email",
+ "inbox"
+ ],
"moji": "📫"
},
"mailbox_closed": {
@@ -8240,7 +16608,11 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["communication", "email", "inbox"],
+ "keywords": [
+ "communication",
+ "email",
+ "inbox"
+ ],
"moji": "📪"
},
"mailbox_with_mail": {
@@ -8251,7 +16623,11 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["communication", "email", "inbox"],
+ "keywords": [
+ "communication",
+ "email",
+ "inbox"
+ ],
"moji": "📬"
},
"mailbox_with_no_mail": {
@@ -8262,7 +16638,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["email", "inbox"],
+ "keywords": [
+ "email",
+ "inbox"
+ ],
"moji": "📭"
},
"man": {
@@ -8273,9 +16652,95 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["classy", "dad", "father", "guy", "mustashe"],
+ "keywords": [
+ "classy",
+ "dad",
+ "father",
+ "guy",
+ "mustashe"
+ ],
"moji": "👨"
},
+ "man_tone1": {
+ "unicode": "1F468-1F3FB",
+ "unicode_alternates": "",
+ "name": "man tone 1",
+ "shortname": ":man_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "classy",
+ "dad",
+ "father",
+ "guy",
+ "mustache"
+ ]
+ },
+ "man_tone2": {
+ "unicode": "1F468-1F3FC",
+ "unicode_alternates": "",
+ "name": "man tone 2",
+ "shortname": ":man_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "classy",
+ "dad",
+ "father",
+ "guy",
+ "mustache"
+ ]
+ },
+ "man_tone3": {
+ "unicode": "1F468-1F3FD",
+ "unicode_alternates": "",
+ "name": "man tone 3",
+ "shortname": ":man_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "classy",
+ "dad",
+ "father",
+ "guy",
+ "mustache"
+ ]
+ },
+ "man_tone4": {
+ "unicode": "1F468-1F3FE",
+ "unicode_alternates": "",
+ "name": "man tone 4",
+ "shortname": ":man_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "classy",
+ "dad",
+ "father",
+ "guy",
+ "mustache"
+ ]
+ },
+ "man_tone5": {
+ "unicode": "1F468-1F3FF",
+ "unicode_alternates": "",
+ "name": "man tone 5",
+ "shortname": ":man_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "classy",
+ "dad",
+ "father",
+ "guy",
+ "mustache"
+ ]
+ },
"man_with_gua_pi_mao": {
"unicode": "1F472",
"unicode_alternates": [],
@@ -8284,9 +16749,101 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["boy", "male", "skullcap", "chinese", "asian", "qing"],
+ "keywords": [
+ "boy",
+ "male",
+ "skullcap",
+ "chinese",
+ "asian",
+ "qing"
+ ],
"moji": "👲"
},
+ "man_with_gua_pi_mao_tone1": {
+ "unicode": "1F472-1F3FB",
+ "unicode_alternates": "",
+ "name": "man with gua pi mao tone 1",
+ "shortname": ":man_with_gua_pi_mao_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "boy",
+ "male",
+ "skullcap",
+ "chinese",
+ "asian",
+ "qing"
+ ]
+ },
+ "man_with_gua_pi_mao_tone2": {
+ "unicode": "1F472-1F3FC",
+ "unicode_alternates": "",
+ "name": "man with gua pi mao tone 2",
+ "shortname": ":man_with_gua_pi_mao_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "boy",
+ "male",
+ "skullcap",
+ "chinese",
+ "asian",
+ "qing"
+ ]
+ },
+ "man_with_gua_pi_mao_tone3": {
+ "unicode": "1F472-1F3FD",
+ "unicode_alternates": "",
+ "name": "man with gua pi mao tone 3",
+ "shortname": ":man_with_gua_pi_mao_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "boy",
+ "male",
+ "skullcap",
+ "chinese",
+ "asian",
+ "qing"
+ ]
+ },
+ "man_with_gua_pi_mao_tone4": {
+ "unicode": "1F472-1F3FE",
+ "unicode_alternates": "",
+ "name": "man with gua pi mao tone 4",
+ "shortname": ":man_with_gua_pi_mao_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "boy",
+ "male",
+ "skullcap",
+ "chinese",
+ "asian",
+ "qing"
+ ]
+ },
+ "man_with_gua_pi_mao_tone5": {
+ "unicode": "1F472-1F3FF",
+ "unicode_alternates": "",
+ "name": "man with gua pi mao tone 5",
+ "shortname": ":man_with_gua_pi_mao_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "boy",
+ "male",
+ "skullcap",
+ "chinese",
+ "asian",
+ "qing"
+ ]
+ },
"man_with_turban": {
"unicode": "1F473",
"unicode_alternates": [],
@@ -8295,9 +16852,120 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["male", "turban", "headdress", "headwear", "pagri", "india", "indian", "mummy", "wisdom", "peace"],
+ "keywords": [
+ "male",
+ "turban",
+ "headdress",
+ "headwear",
+ "pagri",
+ "india",
+ "indian",
+ "mummy",
+ "wisdom",
+ "peace"
+ ],
"moji": "👳"
},
+ "man_with_turban_tone1": {
+ "unicode": "1F473-1F3FB",
+ "unicode_alternates": "",
+ "name": "man with turban tone 1",
+ "shortname": ":man_with_turban_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "male",
+ "headdress",
+ "headwear",
+ "pagri",
+ "india",
+ "indian",
+ "mummy",
+ "wisdom",
+ "peace"
+ ]
+ },
+ "man_with_turban_tone2": {
+ "unicode": "1F473-1F3FC",
+ "unicode_alternates": "",
+ "name": "man with turban tone 2",
+ "shortname": ":man_with_turban_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "male",
+ "headdress",
+ "headwear",
+ "pagri",
+ "india",
+ "indian",
+ "mummy",
+ "wisdom",
+ "peace"
+ ]
+ },
+ "man_with_turban_tone3": {
+ "unicode": "1F473-1F3FD",
+ "unicode_alternates": "",
+ "name": "man with turban tone 3",
+ "shortname": ":man_with_turban_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "male",
+ "headdress",
+ "headwear",
+ "pagri",
+ "india",
+ "indian",
+ "mummy",
+ "wisdom",
+ "peace"
+ ]
+ },
+ "man_with_turban_tone4": {
+ "unicode": "1F473-1F3FE",
+ "unicode_alternates": "",
+ "name": "man with turban tone 4",
+ "shortname": ":man_with_turban_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "male",
+ "headdress",
+ "headwear",
+ "pagri",
+ "india",
+ "indian",
+ "mummy",
+ "wisdom",
+ "peace"
+ ]
+ },
+ "man_with_turban_tone5": {
+ "unicode": "1F473-1F3FF",
+ "unicode_alternates": "",
+ "name": "man with turban tone 5",
+ "shortname": ":man_with_turban_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "male",
+ "headdress",
+ "headwear",
+ "pagri",
+ "india",
+ "indian",
+ "mummy",
+ "wisdom",
+ "peace"
+ ]
+ },
"mans_shoe": {
"unicode": "1F45E",
"unicode_alternates": [],
@@ -8306,7 +16974,10 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["fashion", "male"],
+ "keywords": [
+ "fashion",
+ "male"
+ ],
"moji": "👞"
},
"map": {
@@ -8315,9 +16986,15 @@
"name": "world map",
"shortname": ":map:",
"category": "travel_places",
- "aliases": [":world_map:"],
+ "aliases": [
+ ":world_map:"
+ ],
"aliases_ascii": [],
- "keywords": ["atlas", "earth", "cartography"]
+ "keywords": [
+ "atlas",
+ "earth",
+ "cartography"
+ ]
},
"maple_leaf": {
"unicode": "1F341",
@@ -8327,7 +17004,17 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["canada", "nature", "plant", "vegetable", "maple", "leaf", "syrup", "canada", "tree"],
+ "keywords": [
+ "canada",
+ "nature",
+ "plant",
+ "vegetable",
+ "maple",
+ "leaf",
+ "syrup",
+ "canada",
+ "tree"
+ ],
"moji": "🍁"
},
"mask": {
@@ -8338,7 +17025,16 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["face", "ill", "sick", "sick", "virus", "flu", "medical", "mask"],
+ "keywords": [
+ "face",
+ "ill",
+ "sick",
+ "sick",
+ "virus",
+ "flu",
+ "medical",
+ "mask"
+ ],
"moji": "😷"
},
"massage": {
@@ -8349,9 +17045,83 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["female", "girl", "woman"],
+ "keywords": [
+ "female",
+ "girl",
+ "woman"
+ ],
"moji": "💆"
},
+ "massage_tone1": {
+ "unicode": "1F486-1F3FB",
+ "unicode_alternates": "",
+ "name": "face massage tone 1",
+ "shortname": ":massage_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman"
+ ]
+ },
+ "massage_tone2": {
+ "unicode": "1F486-1F3FC",
+ "unicode_alternates": "",
+ "name": "face massage tone 2",
+ "shortname": ":massage_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman"
+ ]
+ },
+ "massage_tone3": {
+ "unicode": "1F486-1F3FD",
+ "unicode_alternates": "",
+ "name": "face massage tone 3",
+ "shortname": ":massage_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman"
+ ]
+ },
+ "massage_tone4": {
+ "unicode": "1F486-1F3FE",
+ "unicode_alternates": "",
+ "name": "face massage tone 4",
+ "shortname": ":massage_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman"
+ ]
+ },
+ "massage_tone5": {
+ "unicode": "1F486-1F3FF",
+ "unicode_alternates": "",
+ "name": "face massage tone 5",
+ "shortname": ":massage_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman"
+ ]
+ },
"meat_on_bone": {
"unicode": "1F356",
"unicode_alternates": [],
@@ -8360,7 +17130,14 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["food", "good", "meat", "bone", "animal", "cooked"],
+ "keywords": [
+ "food",
+ "good",
+ "meat",
+ "bone",
+ "animal",
+ "cooked"
+ ],
"moji": "🍖"
},
"medal": {
@@ -8369,9 +17146,22 @@
"name": "sports medal",
"shortname": ":medal:",
"category": "activity",
- "aliases": [":sports_medal:"],
- "aliases_ascii": [],
- "keywords": ["award", "ceremony", "contest", "ftw", "place", "win", "first", "show", "reward", "achievement"]
+ "aliases": [
+ ":sports_medal:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "award",
+ "ceremony",
+ "contest",
+ "ftw",
+ "place",
+ "win",
+ "first",
+ "show",
+ "reward",
+ "achievement"
+ ]
},
"mega": {
"unicode": "1F4E3",
@@ -8381,7 +17171,11 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["sound", "speaker", "volume"],
+ "keywords": [
+ "sound",
+ "speaker",
+ "volume"
+ ],
"moji": "📣"
},
"melon": {
@@ -8392,9 +17186,26 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["food", "fruit", "nature", "melon", "cantaloupe", "honeydew"],
+ "keywords": [
+ "food",
+ "fruit",
+ "nature",
+ "melon",
+ "cantaloupe",
+ "honeydew"
+ ],
"moji": "🍈"
},
+ "menorah": {
+ "unicode": "1F54E",
+ "unicode_alternates": "",
+ "name": "menorah with nine branches",
+ "shortname": ":menorah:",
+ "category": "symbols",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": []
+ },
"mens": {
"unicode": "1F6B9",
"unicode_alternates": [],
@@ -8403,9 +17214,122 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["restroom", "toilet", "wc", "men", "bathroom", "restroom", "sign", "boy", "male", "avatar"],
+ "keywords": [
+ "restroom",
+ "toilet",
+ "wc",
+ "men",
+ "bathroom",
+ "restroom",
+ "sign",
+ "boy",
+ "male",
+ "avatar"
+ ],
"moji": "🚹"
},
+ "metal": {
+ "unicode": "1F918",
+ "unicode_alternates": "",
+ "name": "sign of the horns",
+ "shortname": ":metal:",
+ "category": "people",
+ "aliases": [
+ ":sign_of_the_horns:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "band",
+ "concert",
+ "fingers",
+ "rocknroll"
+ ]
+ },
+ "metal_tone1": {
+ "unicode": "1F918-1F3FB",
+ "unicode_alternates": "",
+ "name": "sign of the horns tone 1",
+ "shortname": ":metal_tone1:",
+ "category": "people",
+ "aliases": [
+ ":sign_of_the_horns_tone1:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "band",
+ "concert",
+ "fingers",
+ "rocknroll"
+ ]
+ },
+ "metal_tone2": {
+ "unicode": "1F918-1F3FC",
+ "unicode_alternates": "",
+ "name": "sign of the horns tone 2",
+ "shortname": ":metal_tone2:",
+ "category": "people",
+ "aliases": [
+ ":sign_of_the_horns_tone2:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "band",
+ "concert",
+ "fingers",
+ "rocknroll"
+ ]
+ },
+ "metal_tone3": {
+ "unicode": "1F918-1F3FD",
+ "unicode_alternates": "",
+ "name": "sign of the horns tone 3",
+ "shortname": ":metal_tone3:",
+ "category": "people",
+ "aliases": [
+ ":sign_of_the_horns_tone3:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "band",
+ "concert",
+ "fingers",
+ "rocknroll"
+ ]
+ },
+ "metal_tone4": {
+ "unicode": "1F918-1F3FE",
+ "unicode_alternates": "",
+ "name": "sign of the horns tone 4",
+ "shortname": ":metal_tone4:",
+ "category": "people",
+ "aliases": [
+ ":sign_of_the_horns_tone4:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "band",
+ "concert",
+ "fingers",
+ "rocknroll"
+ ]
+ },
+ "metal_tone5": {
+ "unicode": "1F918-1F3FF",
+ "unicode_alternates": "",
+ "name": "sign of the horns tone 5",
+ "shortname": ":metal_tone5:",
+ "category": "people",
+ "aliases": [
+ ":sign_of_the_horns_tone5:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "band",
+ "concert",
+ "fingers",
+ "rocknroll"
+ ]
+ },
"metro": {
"unicode": "1F687",
"unicode_alternates": [],
@@ -8414,7 +17338,17 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue-square", "mrt", "transportation", "tube", "underground", "metro", "subway", "underground", "train"],
+ "keywords": [
+ "blue-square",
+ "mrt",
+ "transportation",
+ "tube",
+ "underground",
+ "metro",
+ "subway",
+ "underground",
+ "train"
+ ],
"moji": "🚇"
},
"microphone": {
@@ -8425,7 +17359,17 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["PA", "music", "sound", "microphone", "mic", "audio", "sound", "voice", "karaoke"],
+ "keywords": [
+ "PA",
+ "music",
+ "sound",
+ "microphone",
+ "mic",
+ "audio",
+ "sound",
+ "voice",
+ "karaoke"
+ ],
"moji": "🎤"
},
"microphone2": {
@@ -8434,9 +17378,15 @@
"name": "studio microphone",
"shortname": ":microphone2:",
"category": "objects_symbols",
- "aliases": [":studio_microphone:"],
+ "aliases": [
+ ":studio_microphone:"
+ ],
"aliases_ascii": [],
- "keywords": ["mic", "audio", "recording"]
+ "keywords": [
+ "mic",
+ "audio",
+ "recording"
+ ]
},
"microscope": {
"unicode": "1F52C",
@@ -8446,7 +17396,11 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["experiment", "laboratory", "zoomin"],
+ "keywords": [
+ "experiment",
+ "laboratory",
+ "zoomin"
+ ],
"moji": "🔬"
},
"middle_finger": {
@@ -8455,9 +17409,83 @@
"name": "reversed hand with middle finger extended",
"shortname": ":middle_finger:",
"category": "people",
- "aliases": [":reversed_hand_with_middle_finger_extended:"],
+ "aliases": [
+ ":reversed_hand_with_middle_finger_extended:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "fu"
+ ]
+ },
+ "middle_finger_tone1": {
+ "unicode": "1F595-1F3FB",
+ "unicode_alternates": "",
+ "name": "reversed hand with middle finger extended tone 1",
+ "shortname": ":middle_finger_tone1:",
+ "category": "people",
+ "aliases": [
+ ":reversed_hand_with_middle_finger_extended_tone1:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "fu"
+ ]
+ },
+ "middle_finger_tone2": {
+ "unicode": "1F595-1F3FC",
+ "unicode_alternates": "",
+ "name": "reversed hand with middle finger extended tone 2",
+ "shortname": ":middle_finger_tone2:",
+ "category": "people",
+ "aliases": [
+ ":reversed_hand_with_middle_finger_extended_tone2:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "fu"
+ ]
+ },
+ "middle_finger_tone3": {
+ "unicode": "1F595-1F3FD",
+ "unicode_alternates": "",
+ "name": "reversed hand with middle finger extended tone 3",
+ "shortname": ":middle_finger_tone3:",
+ "category": "people",
+ "aliases": [
+ ":reversed_hand_with_middle_finger_extended_tone3:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "fu"
+ ]
+ },
+ "middle_finger_tone4": {
+ "unicode": "1F595-1F3FE",
+ "unicode_alternates": "",
+ "name": "reversed hand with middle finger extended tone 4",
+ "shortname": ":middle_finger_tone4:",
+ "category": "people",
+ "aliases": [
+ ":reversed_hand_with_middle_finger_extended_tone4:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "fu"
+ ]
+ },
+ "middle_finger_tone5": {
+ "unicode": "1F595-1F3FF",
+ "unicode_alternates": "",
+ "name": "reversed hand with middle finger extended tone 5",
+ "shortname": ":middle_finger_tone5:",
+ "category": "people",
+ "aliases": [
+ ":reversed_hand_with_middle_finger_extended_tone5:"
+ ],
"aliases_ascii": [],
- "keywords": ["fu"]
+ "keywords": [
+ "fu"
+ ]
},
"military_medal": {
"unicode": "1F396",
@@ -8467,7 +17495,13 @@
"category": "celebration",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["honor", "acknowledgment", "purple heart", "heroism", "veteran"]
+ "keywords": [
+ "honor",
+ "acknowledgment",
+ "purple heart",
+ "heroism",
+ "veteran"
+ ]
},
"milky_way": {
"unicode": "1F30C",
@@ -8477,7 +17511,17 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["photo", "space", "milky", "galaxy", "star", "stars", "planets", "space", "sky"],
+ "keywords": [
+ "photo",
+ "space",
+ "milky",
+ "galaxy",
+ "star",
+ "stars",
+ "planets",
+ "space",
+ "sky"
+ ],
"moji": "🌌"
},
"minibus": {
@@ -8488,7 +17532,15 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["car", "transportation", "vehicle", "bus", "city", "transport", "transportation"],
+ "keywords": [
+ "car",
+ "transportation",
+ "vehicle",
+ "bus",
+ "city",
+ "transport",
+ "transportation"
+ ],
"moji": "🚐"
},
"minidisc": {
@@ -8499,7 +17551,13 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["data", "disc", "disk", "record", "technology"],
+ "keywords": [
+ "data",
+ "disc",
+ "disk",
+ "record",
+ "technology"
+ ],
"moji": "💽"
},
"mobile_phone_off": {
@@ -8510,9 +17568,23 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["mute"],
+ "keywords": [
+ "mute"
+ ],
"moji": "📴"
},
+ "money_mouth": {
+ "unicode": "1F911",
+ "unicode_alternates": "",
+ "name": "money-mouth face",
+ "shortname": ":money_mouth:",
+ "category": "people",
+ "aliases": [
+ ":money_mouth_face:"
+ ],
+ "aliases_ascii": [],
+ "keywords": []
+ },
"money_with_wings": {
"unicode": "1F4B8",
"unicode_alternates": [],
@@ -8521,7 +17593,22 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["bills", "dollar", "payment", "money", "wings", "easy", "spend", "work", "lost", "blown", "burned", "gift", "cash", "dollar"],
+ "keywords": [
+ "bills",
+ "dollar",
+ "payment",
+ "money",
+ "wings",
+ "easy",
+ "spend",
+ "work",
+ "lost",
+ "blown",
+ "burned",
+ "gift",
+ "cash",
+ "dollar"
+ ],
"moji": "💸"
},
"moneybag": {
@@ -8532,7 +17619,11 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["coins", "dollar", "payment"],
+ "keywords": [
+ "coins",
+ "dollar",
+ "payment"
+ ],
"moji": "💰"
},
"monkey": {
@@ -8543,7 +17634,14 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "nature", "monkey", "primate", "banana", "silly"],
+ "keywords": [
+ "animal",
+ "nature",
+ "monkey",
+ "primate",
+ "banana",
+ "silly"
+ ],
"moji": "🐒"
},
"monkey_face": {
@@ -8554,7 +17652,10 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "nature"],
+ "keywords": [
+ "animal",
+ "nature"
+ ],
"moji": "🐵"
},
"monorail": {
@@ -8565,7 +17666,14 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["transportation", "vehicle", "train", "mono", "rail", "transport"],
+ "keywords": [
+ "transportation",
+ "vehicle",
+ "train",
+ "mono",
+ "rail",
+ "transport"
+ ],
"moji": "🚝"
},
"mood_bubble": {
@@ -8576,7 +17684,13 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["balloon", "conversation", "communication", "comic", "feeling"]
+ "keywords": [
+ "balloon",
+ "conversation",
+ "communication",
+ "comic",
+ "feeling"
+ ]
},
"mood_bubble_lightning": {
"unicode": "1F5F1",
@@ -8584,9 +17698,17 @@
"name": "lightning mood bubble",
"shortname": ":mood_bubble_lightning:",
"category": "objects_symbols",
- "aliases": [":lightning_mood_bubble:"],
- "aliases_ascii": [],
- "keywords": ["balloon", "conversation", "communication", "comic", "feeling"]
+ "aliases": [
+ ":lightning_mood_bubble:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "balloon",
+ "conversation",
+ "communication",
+ "comic",
+ "feeling"
+ ]
},
"mood_lightning": {
"unicode": "1F5F2",
@@ -8594,9 +17716,15 @@
"name": "lightning mood",
"shortname": ":mood_lightning:",
"category": "objects_symbols",
- "aliases": [":lightning_mood:"],
+ "aliases": [
+ ":lightning_mood:"
+ ],
"aliases_ascii": [],
- "keywords": ["zap", "electric", "current"]
+ "keywords": [
+ "zap",
+ "electric",
+ "current"
+ ]
},
"mortar_board": {
"unicode": "1F393",
@@ -8606,9 +17734,35 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["cap", "college", "degree", "graduation", "hat", "school", "university", "graduation", "cap", "mortarboard", "academic", "education", "ceremony", "square", "tassel"],
+ "keywords": [
+ "cap",
+ "college",
+ "degree",
+ "graduation",
+ "hat",
+ "school",
+ "university",
+ "graduation",
+ "cap",
+ "mortarboard",
+ "academic",
+ "education",
+ "ceremony",
+ "square",
+ "tassel"
+ ],
"moji": "🎓"
},
+ "mosque": {
+ "unicode": "1F54C",
+ "unicode_alternates": "",
+ "name": "mosque",
+ "shortname": ":mosque:",
+ "category": "travel",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": []
+ },
"motorboat": {
"unicode": "1F6E5",
"unicode_alternates": [],
@@ -8617,7 +17771,13 @@
"category": "travel_places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["transportation", "vehicle", "boat", "speedboat", "powerboat"]
+ "keywords": [
+ "transportation",
+ "vehicle",
+ "boat",
+ "speedboat",
+ "powerboat"
+ ]
},
"motorcycle": {
"unicode": "1F3CD",
@@ -8625,9 +17785,14 @@
"name": "racing motorcycle",
"shortname": ":motorcycle:",
"category": "activity",
- "aliases": [":racing_motorcycle:"],
+ "aliases": [
+ ":racing_motorcycle:"
+ ],
"aliases_ascii": [],
- "keywords": ["bike", "speed"]
+ "keywords": [
+ "bike",
+ "speed"
+ ]
},
"motorway": {
"unicode": "1F6E3",
@@ -8637,7 +17802,13 @@
"category": "travel_places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["road", "highway", "freeway", "traffic", "travel"]
+ "keywords": [
+ "road",
+ "highway",
+ "freeway",
+ "traffic",
+ "travel"
+ ]
},
"mount_fuji": {
"unicode": "1F5FB",
@@ -8647,9 +17818,26 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["japan", "mountain", "nature", "photo"],
+ "keywords": [
+ "japan",
+ "mountain",
+ "nature",
+ "photo"
+ ],
"moji": "🗻"
},
+ "mountain": {
+ "unicode": "26F0",
+ "unicode_alternates": "",
+ "name": "mountain",
+ "shortname": ":mountain:",
+ "category": "travel",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "place"
+ ]
+ },
"mountain_bicyclist": {
"unicode": "1F6B5",
"unicode_alternates": [],
@@ -8658,9 +17846,104 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["human", "sports", "transportation", "bicyclist", "mountain", "bike", "pedal", "bicycle", "transportation"],
+ "keywords": [
+ "human",
+ "sports",
+ "transportation",
+ "bicyclist",
+ "mountain",
+ "bike",
+ "pedal",
+ "bicycle",
+ "transportation"
+ ],
"moji": "🚵"
},
+ "mountain_bicyclist_tone1": {
+ "unicode": "1F6B5-1F3FB",
+ "unicode_alternates": "",
+ "name": "mountain bicyclist tone 1",
+ "shortname": ":mountain_bicyclist_tone1:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "sport",
+ "transportation",
+ "bike",
+ "pedal",
+ "bicycle",
+ "transportation"
+ ]
+ },
+ "mountain_bicyclist_tone2": {
+ "unicode": "1F6B5-1F3FC",
+ "unicode_alternates": "",
+ "name": "mountain bicyclist tone 2",
+ "shortname": ":mountain_bicyclist_tone2:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "sport",
+ "transportation",
+ "bike",
+ "pedal",
+ "bicycle",
+ "transportation"
+ ]
+ },
+ "mountain_bicyclist_tone3": {
+ "unicode": "1F6B5-1F3FD",
+ "unicode_alternates": "",
+ "name": "mountain bicyclist tone 3",
+ "shortname": ":mountain_bicyclist_tone3:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "sport",
+ "transportation",
+ "bike",
+ "pedal",
+ "bicycle",
+ "transportation"
+ ]
+ },
+ "mountain_bicyclist_tone4": {
+ "unicode": "1F6B5-1F3FE",
+ "unicode_alternates": "",
+ "name": "mountain bicyclist tone 4",
+ "shortname": ":mountain_bicyclist_tone4:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "sport",
+ "transportation",
+ "bike",
+ "pedal",
+ "bicycle",
+ "transportation"
+ ]
+ },
+ "mountain_bicyclist_tone5": {
+ "unicode": "1F6B5-1F3FF",
+ "unicode_alternates": "",
+ "name": "mountain bicyclist tone 5",
+ "shortname": ":mountain_bicyclist_tone5:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "sport",
+ "transportation",
+ "bike",
+ "pedal",
+ "bicycle",
+ "transportation"
+ ]
+ },
"mountain_cableway": {
"unicode": "1F6A0",
"unicode_alternates": [],
@@ -8669,7 +17952,15 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["transportation", "vehicle", "mountain", "cable", "rail", "train", "railway"],
+ "keywords": [
+ "transportation",
+ "vehicle",
+ "mountain",
+ "cable",
+ "rail",
+ "train",
+ "railway"
+ ],
"moji": "🚠"
},
"mountain_railway": {
@@ -8680,7 +17971,14 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["transportation", "mountain", "railway", "rail", "train", "transport"],
+ "keywords": [
+ "transportation",
+ "mountain",
+ "railway",
+ "rail",
+ "train",
+ "transport"
+ ],
"moji": "🚞"
},
"mountain_snow": {
@@ -8689,9 +17987,16 @@
"name": "snow capped mountain",
"shortname": ":mountain_snow:",
"category": "travel_places",
- "aliases": [":snow_capped_mountain:"],
+ "aliases": [
+ ":snow_capped_mountain:"
+ ],
"aliases_ascii": [],
- "keywords": ["cold", "elevation", "hiking", "peak"]
+ "keywords": [
+ "cold",
+ "elevation",
+ "hiking",
+ "peak"
+ ]
},
"mouse": {
"unicode": "1F42D",
@@ -8701,7 +18006,10 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "nature"],
+ "keywords": [
+ "animal",
+ "nature"
+ ],
"moji": "🐭"
},
"mouse2": {
@@ -8712,7 +18020,13 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "nature", "mouse", "mice", "rodent"],
+ "keywords": [
+ "animal",
+ "nature",
+ "mouse",
+ "mice",
+ "rodent"
+ ],
"moji": "🐁"
},
"mouse_one": {
@@ -8721,9 +18035,32 @@
"name": "one button mouse",
"shortname": ":mouse_one:",
"category": "objects_symbols",
- "aliases": [":one_button_mouse:"],
+ "aliases": [
+ ":one_button_mouse:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "computer",
+ "input",
+ "device"
+ ]
+ },
+ "mouse_three_button": {
+ "unicode": "1F5B1",
+ "unicode_alternates": "",
+ "name": "three button mouse",
+ "shortname": ":mouse_three_button:",
+ "category": "objects",
+ "aliases": [
+ ":three_button_mouse:"
+ ],
"aliases_ascii": [],
- "keywords": ["computer", "input", "device"]
+ "keywords": [
+ "3",
+ "computer",
+ "object",
+ "office"
+ ]
},
"movie_camera": {
"unicode": "1F3A5",
@@ -8733,7 +18070,16 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["film", "record", "movie", "camera", "camcorder", "video", "motion", "picture"],
+ "keywords": [
+ "film",
+ "record",
+ "movie",
+ "camera",
+ "camcorder",
+ "video",
+ "motion",
+ "picture"
+ ],
"moji": "🎥"
},
"moyai": {
@@ -8744,7 +18090,10 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["island", "stone"],
+ "keywords": [
+ "island",
+ "stone"
+ ],
"moji": "🗿"
},
"muscle": {
@@ -8755,9 +18104,101 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["arm", "flex", "hand", "strong", "muscle", "bicep"],
+ "keywords": [
+ "arm",
+ "flex",
+ "hand",
+ "strong",
+ "muscle",
+ "bicep"
+ ],
"moji": "💪"
},
+ "muscle_tone1": {
+ "unicode": "1F4AA-1F3FB",
+ "unicode_alternates": "",
+ "name": "flexed biceps tone 1",
+ "shortname": ":muscle_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "arm",
+ "flex",
+ "hand",
+ "strong",
+ "muscle",
+ "bicep"
+ ]
+ },
+ "muscle_tone2": {
+ "unicode": "1F4AA-1F3FC",
+ "unicode_alternates": "",
+ "name": "flexed biceps tone 2",
+ "shortname": ":muscle_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "arm",
+ "flex",
+ "hand",
+ "strong",
+ "muscle",
+ "bicep"
+ ]
+ },
+ "muscle_tone3": {
+ "unicode": "1F4AA-1F3FD",
+ "unicode_alternates": "",
+ "name": "flexed biceps tone 3",
+ "shortname": ":muscle_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "arm",
+ "flex",
+ "hand",
+ "strong",
+ "muscle",
+ "bicep"
+ ]
+ },
+ "muscle_tone4": {
+ "unicode": "1F4AA-1F3FE",
+ "unicode_alternates": "",
+ "name": "flexed biceps tone 4",
+ "shortname": ":muscle_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "arm",
+ "flex",
+ "hand",
+ "strong",
+ "muscle",
+ "bicep"
+ ]
+ },
+ "muscle_tone5": {
+ "unicode": "1F4AA-1F3FF",
+ "unicode_alternates": "",
+ "name": "flexed biceps tone 5",
+ "shortname": ":muscle_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "arm",
+ "flex",
+ "hand",
+ "strong",
+ "muscle",
+ "bicep"
+ ]
+ },
"mushroom": {
"unicode": "1F344",
"unicode_alternates": [],
@@ -8766,7 +18207,14 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["plant", "vegetable", "mushroom", "fungi", "food", "fungus"],
+ "keywords": [
+ "plant",
+ "vegetable",
+ "mushroom",
+ "fungi",
+ "food",
+ "fungus"
+ ],
"moji": "🍄"
},
"musical_keyboard": {
@@ -8777,7 +18225,16 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["instrument", "piano", "music", "keyboard", "piano", "organ", "instrument", "electric"],
+ "keywords": [
+ "instrument",
+ "piano",
+ "music",
+ "keyboard",
+ "piano",
+ "organ",
+ "instrument",
+ "electric"
+ ],
"moji": "🎹"
},
"musical_note": {
@@ -8788,7 +18245,14 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["score", "musical", "music", "note", "music", "sound"],
+ "keywords": [
+ "score",
+ "musical",
+ "music",
+ "note",
+ "music",
+ "sound"
+ ],
"moji": "🎵"
},
"musical_score": {
@@ -8799,7 +18263,17 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["clef", "treble", "music", "musical", "score", "clef", "g-clef", "stave", "staff"],
+ "keywords": [
+ "clef",
+ "treble",
+ "music",
+ "musical",
+ "score",
+ "clef",
+ "g-clef",
+ "stave",
+ "staff"
+ ],
"moji": "🎼"
},
"mute": {
@@ -8810,7 +18284,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["sound", "volume"],
+ "keywords": [
+ "sound",
+ "volume"
+ ],
"moji": "🔇"
},
"nail_care": {
@@ -8821,9 +18298,77 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["beauty", "manicure"],
+ "keywords": [
+ "beauty",
+ "manicure"
+ ],
"moji": "💅"
},
+ "nail_care_tone1": {
+ "unicode": "1F485-1F3FB",
+ "unicode_alternates": "",
+ "name": "nail polish tone 1",
+ "shortname": ":nail_care_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "beauty",
+ "manicure"
+ ]
+ },
+ "nail_care_tone2": {
+ "unicode": "1F485-1F3FC",
+ "unicode_alternates": "",
+ "name": "nail polish tone 2",
+ "shortname": ":nail_care_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "beauty",
+ "manicure"
+ ]
+ },
+ "nail_care_tone3": {
+ "unicode": "1F485-1F3FD",
+ "unicode_alternates": "",
+ "name": "nail polish tone 3",
+ "shortname": ":nail_care_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "beauty",
+ "manicure"
+ ]
+ },
+ "nail_care_tone4": {
+ "unicode": "1F485-1F3FE",
+ "unicode_alternates": "",
+ "name": "nail polish tone 4",
+ "shortname": ":nail_care_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "beauty",
+ "manicure"
+ ]
+ },
+ "nail_care_tone5": {
+ "unicode": "1F485-1F3FF",
+ "unicode_alternates": "",
+ "name": "nail polish tone 5",
+ "shortname": ":nail_care_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "beauty",
+ "manicure"
+ ]
+ },
"name_badge": {
"unicode": "1F4DB",
"unicode_alternates": [],
@@ -8832,7 +18377,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["fire", "forbid"],
+ "keywords": [
+ "fire",
+ "forbid"
+ ],
"moji": "📛"
},
"necktie": {
@@ -8843,7 +18391,13 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["cloth", "fashion", "formal", "shirt", "suitup"],
+ "keywords": [
+ "cloth",
+ "fashion",
+ "formal",
+ "shirt",
+ "suitup"
+ ],
"moji": "👔"
},
"negative_squared_cross_mark": {
@@ -8854,18 +18408,42 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["deny", "green-square", "no", "x"],
+ "keywords": [
+ "deny",
+ "green-square",
+ "no",
+ "x"
+ ],
"moji": "❎"
},
+ "nerd": {
+ "unicode": "1F913",
+ "unicode_alternates": "",
+ "name": "nerd face",
+ "shortname": ":nerd:",
+ "category": "people",
+ "aliases": [
+ ":nerd_face:"
+ ],
+ "aliases_ascii": [],
+ "keywords": []
+ },
"network": {
"unicode": "1F5A7",
"unicode_alternates": [],
"name": "three networked computers",
"shortname": ":network:",
"category": "objects_symbols",
- "aliases": [":three_networked_computers:"],
+ "aliases": [
+ ":three_networked_computers:"
+ ],
"aliases_ascii": [],
- "keywords": ["lan", "wan", "network", "technology"]
+ "keywords": [
+ "lan",
+ "wan",
+ "network",
+ "technology"
+ ]
},
"neutral_face": {
"unicode": "1F610",
@@ -8875,7 +18453,14 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["face", "indifference", "neutral", "objective", "impartial", "blank"],
+ "keywords": [
+ "face",
+ "indifference",
+ "neutral",
+ "objective",
+ "impartial",
+ "blank"
+ ],
"moji": "😐"
},
"new": {
@@ -8886,7 +18471,9 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue-square"],
+ "keywords": [
+ "blue-square"
+ ],
"moji": "🆕"
},
"new_moon": {
@@ -8897,7 +18484,15 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["nature", "moon", "new", "sky", "night", "cheese", "phase"],
+ "keywords": [
+ "nature",
+ "moon",
+ "new",
+ "sky",
+ "night",
+ "cheese",
+ "phase"
+ ],
"moji": "🌑"
},
"new_moon_with_face": {
@@ -8908,7 +18503,17 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["nature", "moon", "new", "anthropomorphic", "face", "sky", "night", "cheese", "phase"],
+ "keywords": [
+ "nature",
+ "moon",
+ "new",
+ "anthropomorphic",
+ "face",
+ "sky",
+ "night",
+ "cheese",
+ "phase"
+ ],
"moji": "🌚"
},
"newspaper": {
@@ -8919,7 +18524,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["headline", "press"],
+ "keywords": [
+ "headline",
+ "press"
+ ],
"moji": "📰"
},
"newspaper2": {
@@ -8928,9 +18536,29 @@
"name": "rolled-up newspaper",
"shortname": ":newspaper2:",
"category": "objects_symbols",
- "aliases": [":rolled_up_newspaper:"],
- "aliases_ascii": [],
- "keywords": ["headline", "press"]
+ "aliases": [
+ ":rolled_up_newspaper:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "headline",
+ "press"
+ ]
+ },
+ "ng": {
+ "unicode": "1F196",
+ "unicode_alternates": "",
+ "name": "squared ng",
+ "shortname": ":ng:",
+ "category": "symbols",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "blue-square",
+ "no good",
+ "symbol",
+ "word"
+ ]
},
"night_with_stars": {
"unicode": "1F303",
@@ -8940,19 +18568,33 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["night", "star", "cloudless", "evening", "planets", "space", "sky"],
+ "keywords": [
+ "night",
+ "star",
+ "cloudless",
+ "evening",
+ "planets",
+ "space",
+ "sky"
+ ],
"moji": "🌃"
},
"nine": {
"moji": "9️⃣",
"unicode": "0039-20E3",
- "unicode_alternates": ["0039-FE0F-20E3"],
+ "unicode_alternates": [
+ "0039-FE0F-20E3"
+ ],
"name": "digit nine",
"shortname": ":nine:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["9", "blue-square", "numbers"]
+ "keywords": [
+ "9",
+ "blue-square",
+ "numbers"
+ ]
},
"no_bell": {
"unicode": "1F515",
@@ -8962,7 +18604,11 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["mute", "sound", "volume"],
+ "keywords": [
+ "mute",
+ "sound",
+ "volume"
+ ],
"moji": "🔕"
},
"no_bicycles": {
@@ -8973,18 +18619,33 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["cyclist", "prohibited", "bicycle", "bike pedal", "no"],
+ "keywords": [
+ "cyclist",
+ "prohibited",
+ "bicycle",
+ "bike pedal",
+ "no"
+ ],
"moji": "🚳"
},
"no_entry": {
"unicode": "26D4",
- "unicode_alternates": ["26D4-FE0F"],
+ "unicode_alternates": [
+ "26D4-FE0F"
+ ],
"name": "no entry",
"shortname": ":no_entry:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["bad", "denied", "limit", "privacy", "security", "stop"],
+ "keywords": [
+ "bad",
+ "denied",
+ "limit",
+ "privacy",
+ "security",
+ "stop"
+ ],
"moji": "⛔"
},
"no_entry_sign": {
@@ -8995,7 +18656,16 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["denied", "disallow", "forbid", "limit", "stop", "no", "stop", "entry"],
+ "keywords": [
+ "denied",
+ "disallow",
+ "forbid",
+ "limit",
+ "stop",
+ "no",
+ "stop",
+ "entry"
+ ],
"moji": "🚫"
},
"no_good": {
@@ -9006,9 +18676,128 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["female", "girl", "woman", "no", "stop", "nope", "don&#039;t", "not"],
+ "keywords": [
+ "female",
+ "girl",
+ "woman",
+ "no",
+ "stop",
+ "nope",
+ "don&#039;t",
+ "not"
+ ],
"moji": "🙅"
},
+ "no_good_tone1": {
+ "unicode": "1F645-1F3FB",
+ "unicode_alternates": "",
+ "name": "face with no good gesture tone 1",
+ "shortname": ":no_good_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman",
+ "stop",
+ "nope",
+ "don't",
+ "not",
+ "forbidden",
+ "hand",
+ "person",
+ "prohibited"
+ ]
+ },
+ "no_good_tone2": {
+ "unicode": "1F645-1F3FC",
+ "unicode_alternates": "",
+ "name": "face with no good gesture tone 2",
+ "shortname": ":no_good_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman",
+ "stop",
+ "nope",
+ "don't",
+ "not",
+ "forbidden",
+ "hand",
+ "person",
+ "prohibited"
+ ]
+ },
+ "no_good_tone3": {
+ "unicode": "1F645-1F3FD",
+ "unicode_alternates": "",
+ "name": "face with no good gesture tone 3",
+ "shortname": ":no_good_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman",
+ "stop",
+ "nope",
+ "don't",
+ "not",
+ "forbidden",
+ "hand",
+ "person",
+ "prohibited"
+ ]
+ },
+ "no_good_tone4": {
+ "unicode": "1F645-1F3FE",
+ "unicode_alternates": "",
+ "name": "face with no good gesture tone 4",
+ "shortname": ":no_good_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman",
+ "stop",
+ "nope",
+ "don't",
+ "not",
+ "forbidden",
+ "hand",
+ "person",
+ "prohibited"
+ ]
+ },
+ "no_good_tone5": {
+ "unicode": "1F645-1F3FF",
+ "unicode_alternates": "",
+ "name": "face with no good gesture tone 5",
+ "shortname": ":no_good_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman",
+ "stop",
+ "nope",
+ "don't",
+ "not",
+ "forbidden",
+ "hand",
+ "person",
+ "prohibited"
+ ]
+ },
"no_mobile_phones": {
"unicode": "1F4F5",
"unicode_alternates": [],
@@ -9017,7 +18806,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["iphone", "mute"],
+ "keywords": [
+ "iphone",
+ "mute"
+ ],
"moji": "📵"
},
"no_mouth": {
@@ -9027,8 +18819,24 @@
"shortname": ":no_mouth:",
"category": "emoticons",
"aliases": [],
- "aliases_ascii": [":-X", ":X", ":-#", ":#", "=X", "=x", ":x", ":-x", "=#"],
- "keywords": ["face", "hellokitty", "mouth", "silent", "vapid"],
+ "aliases_ascii": [
+ ":-X",
+ ":X",
+ ":-#",
+ ":#",
+ "=X",
+ "=x",
+ ":x",
+ ":-x",
+ "=#"
+ ],
+ "keywords": [
+ "face",
+ "hellokitty",
+ "mouth",
+ "silent",
+ "vapid"
+ ],
"moji": "😶"
},
"no_pedestrians": {
@@ -9039,7 +18847,18 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["crossing", "rules", "walking", "no", "walk", "pedestrian", "stroll", "stride", "foot", "feet"],
+ "keywords": [
+ "crossing",
+ "rules",
+ "walking",
+ "no",
+ "walk",
+ "pedestrian",
+ "stroll",
+ "stride",
+ "foot",
+ "feet"
+ ],
"moji": "🚷"
},
"no_smoking": {
@@ -9050,7 +18869,18 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["cigarette", "no", "smoking", "cigarette", "smoke", "cancer", "lungs", "inhale", "tar", "nicotine"],
+ "keywords": [
+ "cigarette",
+ "no",
+ "smoking",
+ "cigarette",
+ "smoke",
+ "cancer",
+ "lungs",
+ "inhale",
+ "tar",
+ "nicotine"
+ ],
"moji": "🚭"
},
"non-potable_water": {
@@ -9061,7 +18891,18 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["drink", "faucet", "tap", "non-potable", "water", "not drinkable", "dirty", "gross", "aqua", "h20"],
+ "keywords": [
+ "drink",
+ "faucet",
+ "tap",
+ "non-potable",
+ "water",
+ "not drinkable",
+ "dirty",
+ "gross",
+ "aqua",
+ "h20"
+ ],
"moji": "🚱"
},
"nose": {
@@ -9072,18 +18913,91 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["smell", "sniff"],
+ "keywords": [
+ "smell",
+ "sniff"
+ ],
"moji": "👃"
},
+ "nose_tone1": {
+ "unicode": "1F443-1F3FB",
+ "unicode_alternates": "",
+ "name": "nose tone 1",
+ "shortname": ":nose_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "smell",
+ "sniff"
+ ]
+ },
+ "nose_tone2": {
+ "unicode": "1F443-1F3FC",
+ "unicode_alternates": "",
+ "name": "nose tone 2",
+ "shortname": ":nose_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "smell",
+ "sniff"
+ ]
+ },
+ "nose_tone3": {
+ "unicode": "1F443-1F3FD",
+ "unicode_alternates": "",
+ "name": "nose tone 3",
+ "shortname": ":nose_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "smell",
+ "sniff"
+ ]
+ },
+ "nose_tone4": {
+ "unicode": "1F443-1F3FE",
+ "unicode_alternates": "",
+ "name": "nose tone 4",
+ "shortname": ":nose_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "smell",
+ "sniff"
+ ]
+ },
+ "nose_tone5": {
+ "unicode": "1F443-1F3FF",
+ "unicode_alternates": "",
+ "name": "nose tone 5",
+ "shortname": ":nose_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "smell",
+ "sniff"
+ ]
+ },
"note": {
"unicode": "1F5C9",
"unicode_alternates": [],
"name": "note page",
"shortname": ":note:",
"category": "objects_symbols",
- "aliases": [":note_page:"],
+ "aliases": [
+ ":note_page:"
+ ],
"aliases_ascii": [],
- "keywords": ["stationery", "post-it"]
+ "keywords": [
+ "stationery",
+ "post-it"
+ ]
},
"note_empty": {
"unicode": "1F5C6",
@@ -9091,9 +19005,14 @@
"name": "empty note page",
"shortname": ":note_empty:",
"category": "objects_symbols",
- "aliases": [":empty_note_page:"],
+ "aliases": [
+ ":empty_note_page:"
+ ],
"aliases_ascii": [],
- "keywords": ["stationery", "post-it"]
+ "keywords": [
+ "stationery",
+ "post-it"
+ ]
},
"notebook": {
"unicode": "1F4D3",
@@ -9103,7 +19022,12 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["notes", "paper", "record", "stationery"],
+ "keywords": [
+ "notes",
+ "paper",
+ "record",
+ "stationery"
+ ],
"moji": "📓"
},
"notebook_with_decorative_cover": {
@@ -9114,7 +19038,12 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["classroom", "notes", "paper", "record"],
+ "keywords": [
+ "classroom",
+ "notes",
+ "paper",
+ "record"
+ ],
"moji": "📔"
},
"notepad": {
@@ -9123,9 +19052,14 @@
"name": "note pad",
"shortname": ":notepad:",
"category": "objects_symbols",
- "aliases": [":note_pad:"],
+ "aliases": [
+ ":note_pad:"
+ ],
"aliases_ascii": [],
- "keywords": ["stationery", "post-it"]
+ "keywords": [
+ "stationery",
+ "post-it"
+ ]
},
"notepad_empty": {
"unicode": "1F5C7",
@@ -9133,9 +19067,14 @@
"name": "empty note pad",
"shortname": ":notepad_empty:",
"category": "objects_symbols",
- "aliases": [":empty_note_pad:"],
+ "aliases": [
+ ":empty_note_pad:"
+ ],
"aliases_ascii": [],
- "keywords": ["stationery", "post-it"]
+ "keywords": [
+ "stationery",
+ "post-it"
+ ]
},
"notepad_spiral": {
"unicode": "1F5D2",
@@ -9143,9 +19082,13 @@
"name": "spiral note pad",
"shortname": ":notepad_spiral:",
"category": "objects_symbols",
- "aliases": [":spiral_note_pad:"],
+ "aliases": [
+ ":spiral_note_pad:"
+ ],
"aliases_ascii": [],
- "keywords": ["stationery"]
+ "keywords": [
+ "stationery"
+ ]
},
"notes": {
"unicode": "1F3B6",
@@ -9155,7 +19098,16 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["music", "score", "musical", "music", "notes", "music", "sound", "melody"],
+ "keywords": [
+ "music",
+ "score",
+ "musical",
+ "music",
+ "notes",
+ "music",
+ "sound",
+ "melody"
+ ],
"moji": "🎶"
},
"nut_and_bolt": {
@@ -9166,18 +19118,26 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["handy", "tools"],
+ "keywords": [
+ "handy",
+ "tools"
+ ],
"moji": "🔩"
},
"o": {
"unicode": "2B55",
- "unicode_alternates": ["2B55-FE0F"],
+ "unicode_alternates": [
+ "2B55-FE0F"
+ ],
"name": "heavy large circle",
"shortname": ":o:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["circle", "round"],
+ "keywords": [
+ "circle",
+ "round"
+ ],
"moji": "⭕"
},
"o2": {
@@ -9188,7 +19148,11 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["alphabet", "letter", "red-square"],
+ "keywords": [
+ "alphabet",
+ "letter",
+ "red-square"
+ ],
"moji": "🅾"
},
"ocean": {
@@ -9199,7 +19163,16 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["sea", "water", "wave", "ocean", "wave", "surf", "beach", "tide"],
+ "keywords": [
+ "sea",
+ "water",
+ "wave",
+ "ocean",
+ "wave",
+ "surf",
+ "beach",
+ "tide"
+ ],
"moji": "🌊"
},
"octopus": {
@@ -9210,7 +19183,12 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "creature", "ocean", "sea"],
+ "keywords": [
+ "animal",
+ "creature",
+ "ocean",
+ "sea"
+ ],
"moji": "🐙"
},
"oden": {
@@ -9221,7 +19199,14 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["food", "japanese", "oden", "seafood", "casserole", "stew"],
+ "keywords": [
+ "food",
+ "japanese",
+ "oden",
+ "seafood",
+ "casserole",
+ "stew"
+ ],
"moji": "🍢"
},
"office": {
@@ -9232,7 +19217,11 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["building", "bureau", "work"],
+ "keywords": [
+ "building",
+ "bureau",
+ "work"
+ ],
"moji": "🏢"
},
"oil": {
@@ -9241,9 +19230,13 @@
"name": "oil drum",
"shortname": ":oil:",
"category": "objects_symbols",
- "aliases": [":oil_drum:"],
+ "aliases": [
+ ":oil_drum:"
+ ],
"aliases_ascii": [],
- "keywords": ["petroleum"]
+ "keywords": [
+ "petroleum"
+ ]
},
"ok": {
"unicode": "1F197",
@@ -9253,7 +19246,12 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["agree", "blue-square", "good", "yes"],
+ "keywords": [
+ "agree",
+ "blue-square",
+ "good",
+ "yes"
+ ],
"moji": "🆗"
},
"ok_hand": {
@@ -9264,9 +19262,126 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["fingers", "limbs", "perfect", "okay", "ok", "smoke", "smoking", "marijuana", "joint", "pot", "420"],
+ "keywords": [
+ "fingers",
+ "limbs",
+ "perfect",
+ "okay",
+ "ok",
+ "smoke",
+ "smoking",
+ "marijuana",
+ "joint",
+ "pot",
+ "420"
+ ],
"moji": "👌"
},
+ "ok_hand_tone1": {
+ "unicode": "1F44C-1F3FB",
+ "unicode_alternates": "",
+ "name": "ok hand sign tone 1",
+ "shortname": ":ok_hand_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "fingers",
+ "limbs",
+ "perfect",
+ "okay",
+ "smoke",
+ "smoking",
+ "marijuana",
+ "joint",
+ "pot",
+ "420"
+ ]
+ },
+ "ok_hand_tone2": {
+ "unicode": "1F44C-1F3FC",
+ "unicode_alternates": "",
+ "name": "ok hand sign tone 2",
+ "shortname": ":ok_hand_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "fingers",
+ "limbs",
+ "perfect",
+ "okay",
+ "smoke",
+ "smoking",
+ "marijuana",
+ "joint",
+ "pot",
+ "420"
+ ]
+ },
+ "ok_hand_tone3": {
+ "unicode": "1F44C-1F3FD",
+ "unicode_alternates": "",
+ "name": "ok hand sign tone 3",
+ "shortname": ":ok_hand_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "fingers",
+ "limbs",
+ "perfect",
+ "okay",
+ "smoke",
+ "smoking",
+ "marijuana",
+ "joint",
+ "pot",
+ "420"
+ ]
+ },
+ "ok_hand_tone4": {
+ "unicode": "1F44C-1F3FE",
+ "unicode_alternates": "",
+ "name": "ok hand sign tone 4",
+ "shortname": ":ok_hand_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "fingers",
+ "limbs",
+ "perfect",
+ "okay",
+ "smoke",
+ "smoking",
+ "marijuana",
+ "joint",
+ "pot",
+ "420"
+ ]
+ },
+ "ok_hand_tone5": {
+ "unicode": "1F44C-1F3FF",
+ "unicode_alternates": "",
+ "name": "ok hand sign tone 5",
+ "shortname": ":ok_hand_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "fingers",
+ "limbs",
+ "perfect",
+ "okay",
+ "smoke",
+ "smoking",
+ "marijuana",
+ "joint",
+ "pot",
+ "420"
+ ]
+ },
"ok_woman": {
"unicode": "1F646",
"unicode_alternates": [],
@@ -9274,10 +19389,120 @@
"shortname": ":ok_woman:",
"category": "emoticons",
"aliases": [],
- "aliases_ascii": ["*\\0/*", "\\0/", "*\\O/*", "\\O/"],
- "keywords": ["female", "girl", "human", "pink", "women", "yes", "ok", "okay", "accept"],
+ "aliases_ascii": [
+ "*\\0/*",
+ "\\0/",
+ "*\\O/*",
+ "\\O/"
+ ],
+ "keywords": [
+ "female",
+ "girl",
+ "human",
+ "pink",
+ "women",
+ "yes",
+ "ok",
+ "okay",
+ "accept"
+ ],
"moji": "🙆"
},
+ "ok_woman_tone1": {
+ "unicode": "1F646-1F3FB",
+ "unicode_alternates": "",
+ "name": "face with ok gesture tone1",
+ "shortname": ":ok_woman_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "human",
+ "pink",
+ "women",
+ "yes",
+ "okay",
+ "accept"
+ ]
+ },
+ "ok_woman_tone2": {
+ "unicode": "1F646-1F3FC",
+ "unicode_alternates": "",
+ "name": "face with ok gesture tone2",
+ "shortname": ":ok_woman_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "human",
+ "pink",
+ "women",
+ "yes",
+ "okay",
+ "accept"
+ ]
+ },
+ "ok_woman_tone3": {
+ "unicode": "1F646-1F3FD",
+ "unicode_alternates": "",
+ "name": "face with ok gesture tone3",
+ "shortname": ":ok_woman_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "human",
+ "pink",
+ "women",
+ "yes",
+ "okay",
+ "accept"
+ ]
+ },
+ "ok_woman_tone4": {
+ "unicode": "1F646-1F3FE",
+ "unicode_alternates": "",
+ "name": "face with ok gesture tone4",
+ "shortname": ":ok_woman_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "human",
+ "pink",
+ "women",
+ "yes",
+ "okay",
+ "accept"
+ ]
+ },
+ "ok_woman_tone5": {
+ "unicode": "1F646-1F3FF",
+ "unicode_alternates": "",
+ "name": "face with ok gesture tone5",
+ "shortname": ":ok_woman_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "human",
+ "pink",
+ "women",
+ "yes",
+ "okay",
+ "accept"
+ ]
+ },
"older_man": {
"unicode": "1F474",
"unicode_alternates": [],
@@ -9286,20 +19511,197 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["human", "male", "men"],
+ "keywords": [
+ "human",
+ "male",
+ "men"
+ ],
"moji": "👴"
},
+ "older_man_tone1": {
+ "unicode": "1F474-1F3FB",
+ "unicode_alternates": "",
+ "name": "older man tone 1",
+ "shortname": ":older_man_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "male",
+ "men",
+ "grandpa",
+ "grandfather"
+ ]
+ },
+ "older_man_tone2": {
+ "unicode": "1F474-1F3FC",
+ "unicode_alternates": "",
+ "name": "older man tone 2",
+ "shortname": ":older_man_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "male",
+ "men",
+ "grandpa",
+ "grandfather"
+ ]
+ },
+ "older_man_tone3": {
+ "unicode": "1F474-1F3FD",
+ "unicode_alternates": "",
+ "name": "older man tone 3",
+ "shortname": ":older_man_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "male",
+ "men",
+ "grandpa",
+ "grandfather"
+ ]
+ },
+ "older_man_tone4": {
+ "unicode": "1F474-1F3FE",
+ "unicode_alternates": "",
+ "name": "older man tone 4",
+ "shortname": ":older_man_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "male",
+ "men",
+ "grandpa",
+ "grandfather"
+ ]
+ },
+ "older_man_tone5": {
+ "unicode": "1F474-1F3FF",
+ "unicode_alternates": "",
+ "name": "older man tone 5",
+ "shortname": ":older_man_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "male",
+ "men",
+ "grandpa",
+ "grandfather"
+ ]
+ },
"older_woman": {
"unicode": "1F475",
"unicode_alternates": [],
"name": "older woman",
"shortname": ":older_woman:",
"category": "emoticons",
- "aliases": [":grandma:"],
- "aliases_ascii": [],
- "keywords": ["female", "girl", "women", "grandma", "grandmother"],
+ "aliases": [
+ ":grandma:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "women",
+ "grandma",
+ "grandmother"
+ ],
"moji": "👵"
},
+ "older_woman_tone1": {
+ "unicode": "1F475-1F3FB",
+ "unicode_alternates": "",
+ "name": "older woman tone 1",
+ "shortname": ":older_woman_tone1:",
+ "category": "people",
+ "aliases": [
+ ":grandma_tone1:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "women",
+ "lady",
+ "grandma",
+ "grandmother"
+ ]
+ },
+ "older_woman_tone2": {
+ "unicode": "1F475-1F3FC",
+ "unicode_alternates": "",
+ "name": "older woman tone 2",
+ "shortname": ":older_woman_tone2:",
+ "category": "people",
+ "aliases": [
+ ":grandma_tone2:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "women",
+ "lady",
+ "grandma",
+ "grandmother"
+ ]
+ },
+ "older_woman_tone3": {
+ "unicode": "1F475-1F3FD",
+ "unicode_alternates": "",
+ "name": "older woman tone 3",
+ "shortname": ":older_woman_tone3:",
+ "category": "people",
+ "aliases": [
+ ":grandma_tone3:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "women",
+ "lady",
+ "grandma",
+ "grandmother"
+ ]
+ },
+ "older_woman_tone4": {
+ "unicode": "1F475-1F3FE",
+ "unicode_alternates": "",
+ "name": "older woman tone 4",
+ "shortname": ":older_woman_tone4:",
+ "category": "people",
+ "aliases": [
+ ":grandma_tone4:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "women",
+ "lady",
+ "grandma",
+ "grandmother"
+ ]
+ },
+ "older_woman_tone5": {
+ "unicode": "1F475-1F3FF",
+ "unicode_alternates": "",
+ "name": "older woman tone 5",
+ "shortname": ":older_woman_tone5:",
+ "category": "people",
+ "aliases": [
+ ":grandma_tone5:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "women",
+ "lady",
+ "grandma",
+ "grandmother"
+ ]
+ },
"om_symbol": {
"unicode": "1F549",
"unicode_alternates": [],
@@ -9308,7 +19710,16 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["hinduism", "sound", "spiritual", "icon", "dharmic", "buddhism", "jainism", "meditate"]
+ "keywords": [
+ "hinduism",
+ "sound",
+ "spiritual",
+ "icon",
+ "dharmic",
+ "buddhism",
+ "jainism",
+ "meditate"
+ ]
},
"on": {
"unicode": "1F51B",
@@ -9318,7 +19729,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["arrow", "words"],
+ "keywords": [
+ "arrow",
+ "words"
+ ],
"moji": "🔛"
},
"oncoming_automobile": {
@@ -9329,7 +19743,14 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["car", "transportation", "vehicle", "sedan", "car", "automobile"],
+ "keywords": [
+ "car",
+ "transportation",
+ "vehicle",
+ "sedan",
+ "car",
+ "automobile"
+ ],
"moji": "🚘"
},
"oncoming_bus": {
@@ -9340,7 +19761,15 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["transportation", "vehicle", "bus", "school", "city", "transportation", "public"],
+ "keywords": [
+ "transportation",
+ "vehicle",
+ "bus",
+ "school",
+ "city",
+ "transportation",
+ "public"
+ ],
"moji": "🚍"
},
"oncoming_police_car": {
@@ -9351,7 +19780,19 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["enforcement", "law", "vehicle", "police", "car", "emergency", "ticket", "citation", "crime", "help", "officer"],
+ "keywords": [
+ "enforcement",
+ "law",
+ "vehicle",
+ "police",
+ "car",
+ "emergency",
+ "ticket",
+ "citation",
+ "crime",
+ "help",
+ "officer"
+ ],
"moji": "🚔"
},
"oncoming_taxi": {
@@ -9362,19 +19803,35 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["cars", "uber", "vehicle", "taxi", "car", "automobile", "city", "transport", "service"],
+ "keywords": [
+ "cars",
+ "uber",
+ "vehicle",
+ "taxi",
+ "car",
+ "automobile",
+ "city",
+ "transport",
+ "service"
+ ],
"moji": "🚖"
},
"one": {
"moji": "1️⃣",
"unicode": "0031-20E3",
- "unicode_alternates": ["0031-FE0F-20E3"],
+ "unicode_alternates": [
+ "0031-FE0F-20E3"
+ ],
"name": "digit one",
"shortname": ":one:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["1", "blue-square", "numbers"]
+ "keywords": [
+ "1",
+ "blue-square",
+ "numbers"
+ ]
},
"open_file_folder": {
"unicode": "1F4C2",
@@ -9384,7 +19841,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["documents", "load"],
+ "keywords": [
+ "documents",
+ "load"
+ ],
"moji": "📂"
},
"open_hands": {
@@ -9395,9 +19855,77 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["butterfly", "fingers"],
+ "keywords": [
+ "butterfly",
+ "fingers"
+ ],
"moji": "👐"
},
+ "open_hands_tone1": {
+ "unicode": "1F450-1F3FB",
+ "unicode_alternates": "",
+ "name": "open hands sign tone 1",
+ "shortname": ":open_hands_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "butterfly",
+ "fingers"
+ ]
+ },
+ "open_hands_tone2": {
+ "unicode": "1F450-1F3FC",
+ "unicode_alternates": "",
+ "name": "open hands sign tone 2",
+ "shortname": ":open_hands_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "butterfly",
+ "fingers"
+ ]
+ },
+ "open_hands_tone3": {
+ "unicode": "1F450-1F3FD",
+ "unicode_alternates": "",
+ "name": "open hands sign tone 3",
+ "shortname": ":open_hands_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "butterfly",
+ "fingers"
+ ]
+ },
+ "open_hands_tone4": {
+ "unicode": "1F450-1F3FE",
+ "unicode_alternates": "",
+ "name": "open hands sign tone 4",
+ "shortname": ":open_hands_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "butterfly",
+ "fingers"
+ ]
+ },
+ "open_hands_tone5": {
+ "unicode": "1F450-1F3FF",
+ "unicode_alternates": "",
+ "name": "open hands sign tone 5",
+ "shortname": ":open_hands_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "butterfly",
+ "fingers"
+ ]
+ },
"open_mouth": {
"unicode": "1F62E",
"unicode_alternates": [],
@@ -9405,8 +19933,24 @@
"shortname": ":open_mouth:",
"category": "emoticons",
"aliases": [],
- "aliases_ascii": [":-O", ":O", ":-o", ":o", "O_O", ">:O"],
- "keywords": ["face", "impressed", "mouth", "open", "jaw", "gapping", "surprise", "wow"],
+ "aliases_ascii": [
+ ":-O",
+ ":O",
+ ":-o",
+ ":o",
+ "O_O",
+ ">:O"
+ ],
+ "keywords": [
+ "face",
+ "impressed",
+ "mouth",
+ "open",
+ "jaw",
+ "gapping",
+ "surprise",
+ "wow"
+ ],
"moji": "😮"
},
"ophiuchus": {
@@ -9417,7 +19961,19 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["ophiuchus", "serpent", "snake", "astrology", "greek", "constellation", "stars", "zodiac", "purple-square", "sign", "horoscope"],
+ "keywords": [
+ "ophiuchus",
+ "serpent",
+ "snake",
+ "astrology",
+ "greek",
+ "constellation",
+ "stars",
+ "zodiac",
+ "purple-square",
+ "sign",
+ "horoscope"
+ ],
"moji": "⛎"
},
"optical_disk": {
@@ -9426,9 +19982,17 @@
"name": "optical disc icon",
"shortname": ":optical_disk:",
"category": "objects_symbols",
- "aliases": [":optical_disc_icon:"],
- "aliases_ascii": [],
- "keywords": ["cd", "dvd", "disc", "disk", "technology"]
+ "aliases": [
+ ":optical_disc_icon:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "cd",
+ "dvd",
+ "disc",
+ "disk",
+ "technology"
+ ]
},
"orange_book": {
"unicode": "1F4D9",
@@ -9438,9 +20002,27 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["knowledge", "library", "read"],
+ "keywords": [
+ "knowledge",
+ "library",
+ "read"
+ ],
"moji": "📙"
},
+ "orthodox_cross": {
+ "unicode": "2626",
+ "unicode_alternates": "",
+ "name": "orthodox cross",
+ "shortname": ":orthodox_cross:",
+ "category": "symbols",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "christian",
+ "religion",
+ "symbol"
+ ]
+ },
"outbox_tray": {
"unicode": "1F4E4",
"unicode_alternates": [],
@@ -9449,7 +20031,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["email", "inbox"],
+ "keywords": [
+ "email",
+ "inbox"
+ ],
"moji": "📤"
},
"ox": {
@@ -9460,7 +20045,11 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "beef", "cow"],
+ "keywords": [
+ "animal",
+ "beef",
+ "cow"
+ ],
"moji": "🐂"
},
"package": {
@@ -9471,7 +20060,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["gift", "mail"],
+ "keywords": [
+ "gift",
+ "mail"
+ ],
"moji": "📦"
},
"page": {
@@ -9482,7 +20074,9 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["document"]
+ "keywords": [
+ "document"
+ ]
},
"page_facing_up": {
"unicode": "1F4C4",
@@ -9492,7 +20086,9 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["documents"],
+ "keywords": [
+ "documents"
+ ],
"moji": "📄"
},
"page_with_curl": {
@@ -9503,7 +20099,9 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["documents"],
+ "keywords": [
+ "documents"
+ ],
"moji": "📃"
},
"pager": {
@@ -9514,7 +20112,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["bbcall", "oldschool"],
+ "keywords": [
+ "bbcall",
+ "oldschool"
+ ],
"moji": "📟"
},
"pages": {
@@ -9525,7 +20126,9 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["documents"]
+ "keywords": [
+ "documents"
+ ]
},
"paintbrush": {
"unicode": "1F58C",
@@ -9533,9 +20136,15 @@
"name": "lower left paintbrush",
"shortname": ":paintbrush:",
"category": "objects_symbols",
- "aliases": [":lower_left_paintbrush:"],
+ "aliases": [
+ ":lower_left_paintbrush:"
+ ],
"aliases_ascii": [],
- "keywords": ["brush", "art", "painting"]
+ "keywords": [
+ "brush",
+ "art",
+ "painting"
+ ]
},
"palm_tree": {
"unicode": "1F334",
@@ -9545,7 +20154,17 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["nature", "plant", "vegetable", "palm", "tree", "coconuts", "fronds", "warm", "tropical"],
+ "keywords": [
+ "nature",
+ "plant",
+ "vegetable",
+ "palm",
+ "tree",
+ "coconuts",
+ "fronds",
+ "warm",
+ "tropical"
+ ],
"moji": "🌴"
},
"panda_face": {
@@ -9556,7 +20175,22 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "nature", "panda", "bear", "face", "cub", "cute", "endearment", "friendship", "love", "bamboo", "china", "black", "white"],
+ "keywords": [
+ "animal",
+ "nature",
+ "panda",
+ "bear",
+ "face",
+ "cub",
+ "cute",
+ "endearment",
+ "friendship",
+ "love",
+ "bamboo",
+ "china",
+ "black",
+ "white"
+ ],
"moji": "🐼"
},
"paperclip": {
@@ -9567,7 +20201,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["documents", "stationery"],
+ "keywords": [
+ "documents",
+ "stationery"
+ ],
"moji": "📎"
},
"paperclips": {
@@ -9576,9 +20213,14 @@
"name": "linked paperclips",
"shortname": ":paperclips:",
"category": "objects_symbols",
- "aliases": [":linked_paperclips:"],
+ "aliases": [
+ ":linked_paperclips:"
+ ],
"aliases_ascii": [],
- "keywords": ["documents", "stationery"]
+ "keywords": [
+ "documents",
+ "stationery"
+ ]
},
"park": {
"unicode": "1F3DE",
@@ -9586,41 +20228,77 @@
"name": "national park",
"shortname": ":park:",
"category": "travel_places",
- "aliases": [":national_park:"],
- "aliases_ascii": [],
- "keywords": ["woods", "nature", "wildlife", "forest", "wilderness", "national"]
+ "aliases": [
+ ":national_park:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "woods",
+ "nature",
+ "wildlife",
+ "forest",
+ "wilderness",
+ "national"
+ ]
},
"parking": {
"unicode": "1F17F",
- "unicode_alternates": ["1F17F-FE0F"],
+ "unicode_alternates": [
+ "1F17F-FE0F"
+ ],
"name": "negative squared latin capital letter p",
"shortname": ":parking:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["alphabet", "blue-square", "cars", "letter"],
+ "keywords": [
+ "alphabet",
+ "blue-square",
+ "cars",
+ "letter"
+ ],
"moji": "🅿"
},
"part_alternation_mark": {
"unicode": "303D",
- "unicode_alternates": ["303D-FE0F"],
+ "unicode_alternates": [
+ "303D-FE0F"
+ ],
"name": "part alternation mark",
"shortname": ":part_alternation_mark:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["graph", "sing", "song", "vocal", "music", "karaoke", "cue", "letter", "m", "japanese"],
+ "keywords": [
+ "graph",
+ "sing",
+ "song",
+ "vocal",
+ "music",
+ "karaoke",
+ "cue",
+ "letter",
+ "m",
+ "japanese"
+ ],
"moji": "〽"
},
"partly_sunny": {
"unicode": "26C5",
- "unicode_alternates": ["26C5-FE0F"],
+ "unicode_alternates": [
+ "26C5-FE0F"
+ ],
"name": "sun behind cloud",
"shortname": ":partly_sunny:",
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["cloud", "morning", "nature", "weather"],
+ "keywords": [
+ "cloud",
+ "morning",
+ "nature",
+ "weather"
+ ],
"moji": "⛅"
},
"passport_control": {
@@ -9631,9 +20309,48 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue-square", "custom", "passport", "official", "travel", "control", "foreign", "identification"],
+ "keywords": [
+ "blue-square",
+ "custom",
+ "passport",
+ "official",
+ "travel",
+ "control",
+ "foreign",
+ "identification"
+ ],
"moji": "🛂"
},
+ "pause_button": {
+ "unicode": "23F8",
+ "unicode_alternates": "",
+ "name": "double vertical bar",
+ "shortname": ":pause_button:",
+ "category": "symbols",
+ "aliases": [
+ ":double_vertical_bar:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "pause",
+ "sound",
+ "symbol"
+ ]
+ },
+ "peace": {
+ "unicode": "262E",
+ "unicode_alternates": "",
+ "name": "peace symbol",
+ "shortname": ":peace:",
+ "category": "symbols",
+ "aliases": [
+ ":peace_symbol:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "sign"
+ ]
+ },
"peach": {
"unicode": "1F351",
"unicode_alternates": [],
@@ -9642,7 +20359,15 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["food", "fruit", "nature", "peach", "fruit", "juicy", "pit"],
+ "keywords": [
+ "food",
+ "fruit",
+ "nature",
+ "peach",
+ "fruit",
+ "juicy",
+ "pit"
+ ],
"moji": "🍑"
},
"pear": {
@@ -9653,7 +20378,13 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["fruit", "nature", "pear", "fruit", "shape"],
+ "keywords": [
+ "fruit",
+ "nature",
+ "pear",
+ "fruit",
+ "shape"
+ ],
"moji": "🍐"
},
"pen_ballpoint": {
@@ -9662,9 +20393,15 @@
"name": "lower left ballpoint pen",
"shortname": ":pen_ballpoint:",
"category": "objects_symbols",
- "aliases": [":lower_left_ballpoint_pen:"],
+ "aliases": [
+ ":lower_left_ballpoint_pen:"
+ ],
"aliases_ascii": [],
- "keywords": ["write", "bic", "ink"]
+ "keywords": [
+ "write",
+ "bic",
+ "ink"
+ ]
},
"pen_fountain": {
"unicode": "1F58B",
@@ -9672,9 +20409,15 @@
"name": "lower left fountain pen",
"shortname": ":pen_fountain:",
"category": "objects_symbols",
- "aliases": [":lower_left_fountain_pen:"],
+ "aliases": [
+ ":lower_left_fountain_pen:"
+ ],
"aliases_ascii": [],
- "keywords": ["write", "calligraphy", "ink"]
+ "keywords": [
+ "write",
+ "calligraphy",
+ "ink"
+ ]
},
"pencil": {
"unicode": "1F4DD",
@@ -9682,20 +20425,33 @@
"name": "memo",
"shortname": ":pencil:",
"category": "objects",
- "aliases": [":memo:"],
- "aliases_ascii": [],
- "keywords": ["documents", "paper", "station", "write"],
+ "aliases": [
+ ":memo:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "documents",
+ "paper",
+ "station",
+ "write"
+ ],
"moji": "📝"
},
"pencil2": {
"unicode": "270F",
- "unicode_alternates": ["270F-FE0F"],
+ "unicode_alternates": [
+ "270F-FE0F"
+ ],
"name": "pencil",
"shortname": ":pencil2:",
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["paper", "stationery", "write"],
+ "keywords": [
+ "paper",
+ "stationery",
+ "write"
+ ],
"moji": "✏"
},
"pencil3": {
@@ -9704,9 +20460,15 @@
"name": "lower left pencil",
"shortname": ":pencil3:",
"category": "objects_symbols",
- "aliases": [":lower_left_pencil:"],
+ "aliases": [
+ ":lower_left_pencil:"
+ ],
"aliases_ascii": [],
- "keywords": ["paper", "stationery", "write"]
+ "keywords": [
+ "paper",
+ "stationery",
+ "write"
+ ]
},
"penguin": {
"unicode": "1F427",
@@ -9716,7 +20478,10 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "nature"],
+ "keywords": [
+ "animal",
+ "nature"
+ ],
"moji": "🐧"
},
"pennant_black": {
@@ -9725,9 +20490,14 @@
"name": "black pennant",
"shortname": ":pennant_black:",
"category": "objects_symbols",
- "aliases": [":black_pennant:"],
+ "aliases": [
+ ":black_pennant:"
+ ],
"aliases_ascii": [],
- "keywords": ["flag", "athletics"]
+ "keywords": [
+ "flag",
+ "athletics"
+ ]
},
"pennant_white": {
"unicode": "1F3F1",
@@ -9735,9 +20505,14 @@
"name": "white pennant",
"shortname": ":pennant_white:",
"category": "objects_symbols",
- "aliases": [":white_pennant:"],
+ "aliases": [
+ ":white_pennant:"
+ ],
"aliases_ascii": [],
- "keywords": ["flag", "athletics"]
+ "keywords": [
+ "flag",
+ "athletics"
+ ]
},
"pensive": {
"unicode": "1F614",
@@ -9747,7 +20522,18 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["face", "okay", "sad", "pensive", "thoughtful", "think", "reflective", "wistful", "meditate", "serious"],
+ "keywords": [
+ "face",
+ "okay",
+ "sad",
+ "pensive",
+ "thoughtful",
+ "think",
+ "reflective",
+ "wistful",
+ "meditate",
+ "serious"
+ ],
"moji": "😔"
},
"performing_arts": {
@@ -9758,7 +20544,19 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["acting", "drama", "theater", "performing", "arts", "performance", "entertainment", "acting", "story", "mask", "masks"],
+ "keywords": [
+ "acting",
+ "drama",
+ "theater",
+ "performing",
+ "arts",
+ "performance",
+ "entertainment",
+ "acting",
+ "story",
+ "mask",
+ "masks"
+ ],
"moji": "🎭"
},
"persevere": {
@@ -9768,8 +20566,17 @@
"shortname": ":persevere:",
"category": "emoticons",
"aliases": [],
- "aliases_ascii": [">.<"],
- "keywords": ["endure", "persevere", "face", "no", "sick", "upset"],
+ "aliases_ascii": [
+ ">.<"
+ ],
+ "keywords": [
+ "endure",
+ "persevere",
+ "face",
+ "no",
+ "sick",
+ "upset"
+ ],
"moji": "😣"
},
"person_frowning": {
@@ -9780,9 +20587,107 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["female", "girl", "woman", "dejected", "rejected", "sad", "frown"],
+ "keywords": [
+ "female",
+ "girl",
+ "woman",
+ "dejected",
+ "rejected",
+ "sad",
+ "frown"
+ ],
"moji": "🙍"
},
+ "person_frowning_tone1": {
+ "unicode": "1F64D-1F3FB",
+ "unicode_alternates": "",
+ "name": "person frowning tone 1",
+ "shortname": ":person_frowning_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman",
+ "dejected",
+ "rejected",
+ "sad",
+ "frown"
+ ]
+ },
+ "person_frowning_tone2": {
+ "unicode": "1F64D-1F3FC",
+ "unicode_alternates": "",
+ "name": "person frowning tone 2",
+ "shortname": ":person_frowning_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman",
+ "dejected",
+ "rejected",
+ "sad",
+ "frown"
+ ]
+ },
+ "person_frowning_tone3": {
+ "unicode": "1F64D-1F3FD",
+ "unicode_alternates": "",
+ "name": "person frowning tone 3",
+ "shortname": ":person_frowning_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman",
+ "dejected",
+ "rejected",
+ "sad",
+ "frown"
+ ]
+ },
+ "person_frowning_tone4": {
+ "unicode": "1F64D-1F3FE",
+ "unicode_alternates": "",
+ "name": "person frowning tone 4",
+ "shortname": ":person_frowning_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman",
+ "dejected",
+ "rejected",
+ "sad",
+ "frown"
+ ]
+ },
+ "person_frowning_tone5": {
+ "unicode": "1F64D-1F3FF",
+ "unicode_alternates": "",
+ "name": "person frowning tone 5",
+ "shortname": ":person_frowning_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman",
+ "dejected",
+ "rejected",
+ "sad",
+ "frown"
+ ]
+ },
"person_with_blond_hair": {
"unicode": "1F471",
"unicode_alternates": [],
@@ -9791,9 +20696,107 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["male", "man", "blonde", "young", "western", "westerner", "occidental"],
+ "keywords": [
+ "male",
+ "man",
+ "blonde",
+ "young",
+ "western",
+ "westerner",
+ "occidental"
+ ],
"moji": "👱"
},
+ "person_with_blond_hair_tone1": {
+ "unicode": "1F471-1F3FB",
+ "unicode_alternates": "",
+ "name": "person with blond hair tone 1",
+ "shortname": ":person_with_blond_hair_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "male",
+ "man",
+ "blonde",
+ "young",
+ "western",
+ "westerner",
+ "occidental"
+ ]
+ },
+ "person_with_blond_hair_tone2": {
+ "unicode": "1F471-1F3FC",
+ "unicode_alternates": "",
+ "name": "person with blond hair tone 2",
+ "shortname": ":person_with_blond_hair_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "male",
+ "man",
+ "blonde",
+ "young",
+ "western",
+ "westerner",
+ "occidental"
+ ]
+ },
+ "person_with_blond_hair_tone3": {
+ "unicode": "1F471-1F3FD",
+ "unicode_alternates": "",
+ "name": "person with blond hair tone 3",
+ "shortname": ":person_with_blond_hair_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "male",
+ "man",
+ "blonde",
+ "young",
+ "western",
+ "westerner",
+ "occidental"
+ ]
+ },
+ "person_with_blond_hair_tone4": {
+ "unicode": "1F471-1F3FE",
+ "unicode_alternates": "",
+ "name": "person with blond hair tone 4",
+ "shortname": ":person_with_blond_hair_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "male",
+ "man",
+ "blonde",
+ "young",
+ "western",
+ "westerner",
+ "occidental"
+ ]
+ },
+ "person_with_blond_hair_tone5": {
+ "unicode": "1F471-1F3FF",
+ "unicode_alternates": "",
+ "name": "person with blond hair tone 5",
+ "shortname": ":person_with_blond_hair_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "male",
+ "man",
+ "blonde",
+ "young",
+ "western",
+ "westerner",
+ "occidental"
+ ]
+ },
"person_with_pouting_face": {
"unicode": "1F64E",
"unicode_alternates": [],
@@ -9802,9 +20805,121 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["female", "girl", "woman", "pout", "sexy", "cute", "annoyed"],
+ "keywords": [
+ "female",
+ "girl",
+ "woman",
+ "pout",
+ "sexy",
+ "cute",
+ "annoyed"
+ ],
"moji": "🙎"
},
+ "person_with_pouting_face_tone1": {
+ "unicode": "1F64E-1F3FB",
+ "unicode_alternates": "",
+ "name": "person with pouting face tone1",
+ "shortname": ":person_with_pouting_face_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman",
+ "pout",
+ "sexy",
+ "cute",
+ "annoyed"
+ ]
+ },
+ "person_with_pouting_face_tone2": {
+ "unicode": "1F64E-1F3FC",
+ "unicode_alternates": "",
+ "name": "person with pouting face tone2",
+ "shortname": ":person_with_pouting_face_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman",
+ "pout",
+ "sexy",
+ "cute",
+ "annoyed"
+ ]
+ },
+ "person_with_pouting_face_tone3": {
+ "unicode": "1F64E-1F3FD",
+ "unicode_alternates": "",
+ "name": "person with pouting face tone3",
+ "shortname": ":person_with_pouting_face_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman",
+ "pout",
+ "sexy",
+ "cute",
+ "annoyed"
+ ]
+ },
+ "person_with_pouting_face_tone4": {
+ "unicode": "1F64E-1F3FE",
+ "unicode_alternates": "",
+ "name": "person with pouting face tone4",
+ "shortname": ":person_with_pouting_face_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman",
+ "pout",
+ "sexy",
+ "cute",
+ "annoyed"
+ ]
+ },
+ "person_with_pouting_face_tone5": {
+ "unicode": "1F64E-1F3FF",
+ "unicode_alternates": "",
+ "name": "person with pouting face tone5",
+ "shortname": ":person_with_pouting_face_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman",
+ "pout",
+ "sexy",
+ "cute",
+ "annoyed"
+ ]
+ },
+ "pick": {
+ "unicode": "26CF",
+ "unicode_alternates": "",
+ "name": "pick",
+ "shortname": ":pick:",
+ "category": "objects",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "mining",
+ "object",
+ "tool"
+ ]
+ },
"pig": {
"unicode": "1F437",
"unicode_alternates": [],
@@ -9813,7 +20928,10 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "oink"],
+ "keywords": [
+ "animal",
+ "oink"
+ ],
"moji": "🐷"
},
"pig2": {
@@ -9824,7 +20942,21 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "nature", "pig", "piggy", "pork", "ham", "hog", "bacon", "oink", "slop", "livestock", "greed", "greedy"],
+ "keywords": [
+ "animal",
+ "nature",
+ "pig",
+ "piggy",
+ "pork",
+ "ham",
+ "hog",
+ "bacon",
+ "oink",
+ "slop",
+ "livestock",
+ "greed",
+ "greedy"
+ ],
"moji": "🐖"
},
"pig_nose": {
@@ -9835,7 +20967,20 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "oink", "pig", "nose", "snout", "food", "eat", "cute", "oink", "pink", "smell", "truffle"],
+ "keywords": [
+ "animal",
+ "oink",
+ "pig",
+ "nose",
+ "snout",
+ "food",
+ "eat",
+ "cute",
+ "oink",
+ "pink",
+ "smell",
+ "truffle"
+ ],
"moji": "🐽"
},
"pill": {
@@ -9846,7 +20991,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["health", "medicine"],
+ "keywords": [
+ "health",
+ "medicine"
+ ],
"moji": "💊"
},
"pineapple": {
@@ -9857,28 +21005,68 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["food", "fruit", "nature", "pineapple", "pina", "tropical", "flower"],
+ "keywords": [
+ "food",
+ "fruit",
+ "nature",
+ "pineapple",
+ "pina",
+ "tropical",
+ "flower"
+ ],
"moji": "🍍"
},
+ "ping_pong": {
+ "unicode": "1F3D3",
+ "unicode_alternates": "",
+ "name": "table tennis paddle and ball",
+ "shortname": ":ping_pong:",
+ "category": "activity",
+ "aliases": [
+ ":table_tennis:"
+ ],
+ "aliases_ascii": [],
+ "keywords": []
+ },
"piracy": {
"unicode": "1F572",
"unicode_alternates": [],
"name": "no piracy",
"shortname": ":piracy:",
"category": "objects_symbols",
- "aliases": [":no_piracy:"],
+ "aliases": [
+ ":no_piracy:"
+ ],
"aliases_ascii": [],
- "keywords": ["theft", "rule"]
+ "keywords": [
+ "theft",
+ "rule"
+ ]
},
"pisces": {
"unicode": "2653",
- "unicode_alternates": ["2653-FE0F"],
+ "unicode_alternates": [
+ "2653-FE0F"
+ ],
"name": "pisces",
"shortname": ":pisces:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["pisces", "fish", "astrology", "greek", "constellation", "stars", "zodiac", "sign", "purple-square", "sign", "zodiac", "horoscope"],
+ "keywords": [
+ "pisces",
+ "fish",
+ "astrology",
+ "greek",
+ "constellation",
+ "stars",
+ "zodiac",
+ "sign",
+ "purple-square",
+ "sign",
+ "zodiac",
+ "horoscope"
+ ],
"moji": "♓"
},
"pizza": {
@@ -9889,9 +21077,48 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["food", "party", "pizza", "pie", "new york", "italian", "italy", "slice", "peperoni"],
+ "keywords": [
+ "food",
+ "party",
+ "pizza",
+ "pie",
+ "new york",
+ "italian",
+ "italy",
+ "slice",
+ "peperoni"
+ ],
"moji": "🍕"
},
+ "place_of_worship": {
+ "unicode": "1F6D0",
+ "unicode_alternates": "",
+ "name": "place of worship",
+ "shortname": ":place_of_worship:",
+ "category": "symbols",
+ "aliases": [
+ ":worship_symbol:"
+ ],
+ "aliases_ascii": [],
+ "keywords": []
+ },
+ "play_pause": {
+ "unicode": "23EF",
+ "unicode_alternates": "",
+ "name": "black right-pointing double triangle with double vertical bar",
+ "shortname": ":play_pause:",
+ "category": "symbols",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "arrow",
+ "pause",
+ "play",
+ "right",
+ "sound",
+ "symbol"
+ ]
+ },
"point_down": {
"unicode": "1F447",
"unicode_alternates": [],
@@ -9900,9 +21127,83 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["direction", "fingers", "hand"],
+ "keywords": [
+ "direction",
+ "fingers",
+ "hand"
+ ],
"moji": "👇"
},
+ "point_down_tone1": {
+ "unicode": "1F447-1F3FB",
+ "unicode_alternates": "",
+ "name": "white down pointing backhand index tone 1",
+ "shortname": ":point_down_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "direction",
+ "finger",
+ "hand"
+ ]
+ },
+ "point_down_tone2": {
+ "unicode": "1F447-1F3FC",
+ "unicode_alternates": "",
+ "name": "white down pointing backhand index tone 2",
+ "shortname": ":point_down_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "direction",
+ "finger",
+ "hand"
+ ]
+ },
+ "point_down_tone3": {
+ "unicode": "1F447-1F3FD",
+ "unicode_alternates": "",
+ "name": "white down pointing backhand index tone 3",
+ "shortname": ":point_down_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "direction",
+ "finger",
+ "hand"
+ ]
+ },
+ "point_down_tone4": {
+ "unicode": "1F447-1F3FE",
+ "unicode_alternates": "",
+ "name": "white down pointing backhand index tone 4",
+ "shortname": ":point_down_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "direction",
+ "finger",
+ "hand"
+ ]
+ },
+ "point_down_tone5": {
+ "unicode": "1F447-1F3FF",
+ "unicode_alternates": "",
+ "name": "white down pointing backhand index tone 5",
+ "shortname": ":point_down_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "direction",
+ "finger",
+ "hand"
+ ]
+ },
"point_left": {
"unicode": "1F448",
"unicode_alternates": [],
@@ -9911,9 +21212,83 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["direction", "fingers", "hand"],
+ "keywords": [
+ "direction",
+ "fingers",
+ "hand"
+ ],
"moji": "👈"
},
+ "point_left_tone1": {
+ "unicode": "1F448-1F3FB",
+ "unicode_alternates": "",
+ "name": "white left pointing backhand index tone 1",
+ "shortname": ":point_left_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "direction",
+ "finger",
+ "hand"
+ ]
+ },
+ "point_left_tone2": {
+ "unicode": "1F448-1F3FC",
+ "unicode_alternates": "",
+ "name": "white left pointing backhand index tone 2",
+ "shortname": ":point_left_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "direction",
+ "finger",
+ "hand"
+ ]
+ },
+ "point_left_tone3": {
+ "unicode": "1F448-1F3FD",
+ "unicode_alternates": "",
+ "name": "white left pointing backhand index tone 3",
+ "shortname": ":point_left_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "direction",
+ "finger",
+ "hand"
+ ]
+ },
+ "point_left_tone4": {
+ "unicode": "1F448-1F3FE",
+ "unicode_alternates": "",
+ "name": "white left pointing backhand index tone 4",
+ "shortname": ":point_left_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "direction",
+ "finger",
+ "hand"
+ ]
+ },
+ "point_left_tone5": {
+ "unicode": "1F448-1F3FF",
+ "unicode_alternates": "",
+ "name": "white left pointing backhand index tone 5",
+ "shortname": ":point_left_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "direction",
+ "finger",
+ "hand"
+ ]
+ },
"point_right": {
"unicode": "1F449",
"unicode_alternates": [],
@@ -9922,18 +21297,98 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["direction", "fingers", "hand"],
+ "keywords": [
+ "direction",
+ "fingers",
+ "hand"
+ ],
"moji": "👉"
},
+ "point_right_tone1": {
+ "unicode": "1F449-1F3FB",
+ "unicode_alternates": "",
+ "name": "white right pointing backhand index tone 1",
+ "shortname": ":point_right_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "direction",
+ "finger",
+ "hand"
+ ]
+ },
+ "point_right_tone2": {
+ "unicode": "1F449-1F3FC",
+ "unicode_alternates": "",
+ "name": "white right pointing backhand index tone 2",
+ "shortname": ":point_right_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "direction",
+ "finger",
+ "hand"
+ ]
+ },
+ "point_right_tone3": {
+ "unicode": "1F449-1F3FD",
+ "unicode_alternates": "",
+ "name": "white right pointing backhand index tone 3",
+ "shortname": ":point_right_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "direction",
+ "finger",
+ "hand"
+ ]
+ },
+ "point_right_tone4": {
+ "unicode": "1F449-1F3FE",
+ "unicode_alternates": "",
+ "name": "white right pointing backhand index tone 4",
+ "shortname": ":point_right_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "direction",
+ "finger",
+ "hand"
+ ]
+ },
+ "point_right_tone5": {
+ "unicode": "1F449-1F3FF",
+ "unicode_alternates": "",
+ "name": "white right pointing backhand index tone 5",
+ "shortname": ":point_right_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "direction",
+ "finger",
+ "hand"
+ ]
+ },
"point_up": {
"unicode": "261D",
- "unicode_alternates": ["261D-FE0F"],
+ "unicode_alternates": [
+ "261D-FE0F"
+ ],
"name": "white up pointing index",
"shortname": ":point_up:",
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["direction", "fingers", "hand"],
+ "keywords": [
+ "direction",
+ "fingers",
+ "hand"
+ ],
"moji": "☝"
},
"point_up_2": {
@@ -9944,9 +21399,163 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["direction", "fingers", "hand"],
+ "keywords": [
+ "direction",
+ "fingers",
+ "hand"
+ ],
"moji": "👆"
},
+ "point_up_2_tone1": {
+ "unicode": "1F446-1F3FB",
+ "unicode_alternates": "",
+ "name": "white up pointing backhand index tone 1",
+ "shortname": ":point_up_2_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "direction",
+ "finger",
+ "hand",
+ "one"
+ ]
+ },
+ "point_up_2_tone2": {
+ "unicode": "1F446-1F3FC",
+ "unicode_alternates": "",
+ "name": "white up pointing backhand index tone 2",
+ "shortname": ":point_up_2_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "direction",
+ "finger",
+ "hand",
+ "one"
+ ]
+ },
+ "point_up_2_tone3": {
+ "unicode": "1F446-1F3FD",
+ "unicode_alternates": "",
+ "name": "white up pointing backhand index tone 3",
+ "shortname": ":point_up_2_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "direction",
+ "finger",
+ "hand",
+ "one"
+ ]
+ },
+ "point_up_2_tone4": {
+ "unicode": "1F446-1F3FE",
+ "unicode_alternates": "",
+ "name": "white up pointing backhand index tone 4",
+ "shortname": ":point_up_2_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "direction",
+ "finger",
+ "hand",
+ "one"
+ ]
+ },
+ "point_up_2_tone5": {
+ "unicode": "1F446-1F3FF",
+ "unicode_alternates": "",
+ "name": "white up pointing backhand index tone 5",
+ "shortname": ":point_up_2_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "direction",
+ "finger",
+ "hand",
+ "one"
+ ]
+ },
+ "point_up_tone1": {
+ "unicode": "261D-1F3FB",
+ "unicode_alternates": "",
+ "name": "white up pointing index tone 1",
+ "shortname": ":point_up_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "direction",
+ "finger",
+ "hand",
+ "one"
+ ]
+ },
+ "point_up_tone2": {
+ "unicode": "261D-1F3FC",
+ "unicode_alternates": "",
+ "name": "white up pointing index tone 2",
+ "shortname": ":point_up_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "direction",
+ "finger",
+ "hand",
+ "one"
+ ]
+ },
+ "point_up_tone3": {
+ "unicode": "261D-1F3FD",
+ "unicode_alternates": "",
+ "name": "white up pointing index tone 3",
+ "shortname": ":point_up_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "direction",
+ "finger",
+ "hand",
+ "one"
+ ]
+ },
+ "point_up_tone4": {
+ "unicode": "261D-1F3FE",
+ "unicode_alternates": "",
+ "name": "white up pointing index tone 4",
+ "shortname": ":point_up_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "direction",
+ "finger",
+ "hand",
+ "one"
+ ]
+ },
+ "point_up_tone5": {
+ "unicode": "261D-1F3FF",
+ "unicode_alternates": "",
+ "name": "white up pointing index tone 5",
+ "shortname": ":point_up_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "direction",
+ "finger",
+ "hand",
+ "one"
+ ]
+ },
"police_car": {
"unicode": "1F693",
"unicode_alternates": [],
@@ -9955,7 +21564,21 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["cars", "enforcement", "law", "transportation", "vehicle", "police", "car", "emergency", "ticket", "citation", "crime", "help", "officer"],
+ "keywords": [
+ "cars",
+ "enforcement",
+ "law",
+ "transportation",
+ "vehicle",
+ "police",
+ "car",
+ "emergency",
+ "ticket",
+ "citation",
+ "crime",
+ "help",
+ "officer"
+ ],
"moji": "🚓"
},
"poodle": {
@@ -9966,7 +21589,18 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["101", "animal", "dog", "nature", "poodle", "dog", "clip", "showy", "sophisticated", "vain"],
+ "keywords": [
+ "101",
+ "animal",
+ "dog",
+ "nature",
+ "poodle",
+ "dog",
+ "clip",
+ "showy",
+ "sophisticated",
+ "vain"
+ ],
"moji": "🐩"
},
"poop": {
@@ -9975,11 +21609,31 @@
"name": "pile of poo",
"shortname": ":poop:",
"category": "emoticons",
- "aliases": [":shit:", ":hankey:", ":poo:"],
- "aliases_ascii": [],
- "keywords": ["poop", "shit", "shitface", "turd", "poo"],
+ "aliases": [
+ ":shit:",
+ ":hankey:",
+ ":poo:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "poop",
+ "shit",
+ "shitface",
+ "turd",
+ "poo"
+ ],
"moji": "💩"
},
+ "popcorn": {
+ "unicode": "1F37F",
+ "unicode_alternates": "",
+ "name": "popcorn",
+ "shortname": ":popcorn:",
+ "category": "foods",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": []
+ },
"post_office": {
"unicode": "1F3E3",
"unicode_alternates": [],
@@ -9988,7 +21642,11 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["building", "communication", "email"],
+ "keywords": [
+ "building",
+ "communication",
+ "email"
+ ],
"moji": "🏣"
},
"postal_horn": {
@@ -9999,7 +21657,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["instrument", "music"],
+ "keywords": [
+ "instrument",
+ "music"
+ ],
"moji": "📯"
},
"postbox": {
@@ -10010,7 +21671,11 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["email", "envelope", "letter"],
+ "keywords": [
+ "email",
+ "envelope",
+ "letter"
+ ],
"moji": "📮"
},
"potable_water": {
@@ -10021,7 +21686,21 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue-square", "cleaning", "faucet", "liquid", "restroom", "potable", "water", "drinkable", "pure", "clear", "clean", "aqua", "h20"],
+ "keywords": [
+ "blue-square",
+ "cleaning",
+ "faucet",
+ "liquid",
+ "restroom",
+ "potable",
+ "water",
+ "drinkable",
+ "pure",
+ "clear",
+ "clean",
+ "aqua",
+ "h20"
+ ],
"moji": "🚰"
},
"pouch": {
@@ -10032,7 +21711,16 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["accessories", "bag", "pouch", "bag", "cosmetic", "packing", "grandma", "makeup"],
+ "keywords": [
+ "accessories",
+ "bag",
+ "pouch",
+ "bag",
+ "cosmetic",
+ "packing",
+ "grandma",
+ "makeup"
+ ],
"moji": "👝"
},
"poultry_leg": {
@@ -10043,7 +21731,14 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["food", "meat", "poultry", "leg", "chicken", "fried"],
+ "keywords": [
+ "food",
+ "meat",
+ "poultry",
+ "leg",
+ "chicken",
+ "fried"
+ ],
"moji": "🍗"
},
"pound": {
@@ -10054,7 +21749,24 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["bills", "british", "currency", "england", "money", "sterling", "uk", "pound", "britain", "british", "banknote", "money", "currency", "paper", "cash", "bills"],
+ "keywords": [
+ "bills",
+ "british",
+ "currency",
+ "england",
+ "money",
+ "sterling",
+ "uk",
+ "pound",
+ "britain",
+ "british",
+ "banknote",
+ "money",
+ "currency",
+ "paper",
+ "cash",
+ "bills"
+ ],
"moji": "💷"
},
"pouting_cat": {
@@ -10065,7 +21777,15 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "cats", "pout", "annoyed", "miffed", "glower", "frown"],
+ "keywords": [
+ "animal",
+ "cats",
+ "pout",
+ "annoyed",
+ "miffed",
+ "glower",
+ "frown"
+ ],
"moji": "😾"
},
"pray": {
@@ -10076,9 +21796,136 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["highfive", "hope", "namaste", "please", "wish", "pray", "high five", "hands", "sorrow", "regret", "sorry"],
+ "keywords": [
+ "highfive",
+ "hope",
+ "namaste",
+ "please",
+ "wish",
+ "pray",
+ "high five",
+ "hands",
+ "sorrow",
+ "regret",
+ "sorry"
+ ],
"moji": "🙏"
},
+ "pray_tone1": {
+ "unicode": "1F64F-1F3FB",
+ "unicode_alternates": "",
+ "name": "person with folded hands tone 1",
+ "shortname": ":pray_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "highfive",
+ "hope",
+ "namaste",
+ "please",
+ "wish",
+ "pray",
+ "high five",
+ "sorrow",
+ "regret",
+ "sorry"
+ ]
+ },
+ "pray_tone2": {
+ "unicode": "1F64F-1F3FC",
+ "unicode_alternates": "",
+ "name": "person with folded hands tone 2",
+ "shortname": ":pray_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "highfive",
+ "hope",
+ "namaste",
+ "please",
+ "wish",
+ "pray",
+ "high five",
+ "sorrow",
+ "regret",
+ "sorry"
+ ]
+ },
+ "pray_tone3": {
+ "unicode": "1F64F-1F3FD",
+ "unicode_alternates": "",
+ "name": "person with folded hands tone 3",
+ "shortname": ":pray_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "highfive",
+ "hope",
+ "namaste",
+ "please",
+ "wish",
+ "pray",
+ "high five",
+ "sorrow",
+ "regret",
+ "sorry"
+ ]
+ },
+ "pray_tone4": {
+ "unicode": "1F64F-1F3FE",
+ "unicode_alternates": "",
+ "name": "person with folded hands tone 4",
+ "shortname": ":pray_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "highfive",
+ "hope",
+ "namaste",
+ "please",
+ "wish",
+ "pray",
+ "high five",
+ "sorrow",
+ "regret",
+ "sorry"
+ ]
+ },
+ "pray_tone5": {
+ "unicode": "1F64F-1F3FF",
+ "unicode_alternates": "",
+ "name": "person with folded hands tone 5",
+ "shortname": ":pray_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "highfive",
+ "hope",
+ "namaste",
+ "please",
+ "wish",
+ "pray",
+ "high five",
+ "sorrow",
+ "regret",
+ "sorry"
+ ]
+ },
+ "prayer_beads": {
+ "unicode": "1F4FF",
+ "unicode_alternates": "",
+ "name": "prayer beads",
+ "shortname": ":prayer_beads:",
+ "category": "objects",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": []
+ },
"princess": {
"unicode": "1F478",
"unicode_alternates": [],
@@ -10087,9 +21934,138 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blond", "crown", "female", "girl", "woman", "princess", "royal", "royalty", "king", "queen", "daughter", "disney", "high-maintenance"],
+ "keywords": [
+ "blond",
+ "crown",
+ "female",
+ "girl",
+ "woman",
+ "princess",
+ "royal",
+ "royalty",
+ "king",
+ "queen",
+ "daughter",
+ "disney",
+ "high-maintenance"
+ ],
"moji": "👸"
},
+ "princess_tone1": {
+ "unicode": "1F478-1F3FB",
+ "unicode_alternates": "",
+ "name": "princess tone 1",
+ "shortname": ":princess_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "blond",
+ "crown",
+ "female",
+ "girl",
+ "woman",
+ "royal",
+ "royalty",
+ "king",
+ "queen",
+ "daughter",
+ "disney",
+ "high-maintenance"
+ ]
+ },
+ "princess_tone2": {
+ "unicode": "1F478-1F3FC",
+ "unicode_alternates": "",
+ "name": "princess tone 2",
+ "shortname": ":princess_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "blond",
+ "crown",
+ "female",
+ "girl",
+ "woman",
+ "royal",
+ "royalty",
+ "king",
+ "queen",
+ "daughter",
+ "disney",
+ "high-maintenance"
+ ]
+ },
+ "princess_tone3": {
+ "unicode": "1F478-1F3FD",
+ "unicode_alternates": "",
+ "name": "princess tone 3",
+ "shortname": ":princess_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "blond",
+ "crown",
+ "female",
+ "girl",
+ "woman",
+ "royal",
+ "royalty",
+ "king",
+ "queen",
+ "daughter",
+ "disney",
+ "high-maintenance"
+ ]
+ },
+ "princess_tone4": {
+ "unicode": "1F478-1F3FE",
+ "unicode_alternates": "",
+ "name": "princess tone 4",
+ "shortname": ":princess_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "blond",
+ "crown",
+ "female",
+ "girl",
+ "woman",
+ "royal",
+ "royalty",
+ "king",
+ "queen",
+ "daughter",
+ "disney",
+ "high-maintenance"
+ ]
+ },
+ "princess_tone5": {
+ "unicode": "1F478-1F3FF",
+ "unicode_alternates": "",
+ "name": "princess tone 5",
+ "shortname": ":princess_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "blond",
+ "crown",
+ "female",
+ "girl",
+ "woman",
+ "royal",
+ "royalty",
+ "king",
+ "queen",
+ "daughter",
+ "disney",
+ "high-maintenance"
+ ]
+ },
"printer": {
"unicode": "1F5A8",
"unicode_alternates": [],
@@ -10098,7 +22074,12 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["hardcopy", "paper", "inkjet", "laser"]
+ "keywords": [
+ "hardcopy",
+ "paper",
+ "inkjet",
+ "laser"
+ ]
},
"prohibited": {
"unicode": "1F6C7",
@@ -10106,9 +22087,19 @@
"name": "prohibited sign",
"shortname": ":prohibited:",
"category": "objects_symbols",
- "aliases": [":prohibited_sign:"],
- "aliases_ascii": [],
- "keywords": ["no", "not", "denied", "disallow", "forbid", "limit", "stop"]
+ "aliases": [
+ ":prohibited_sign:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "no",
+ "not",
+ "denied",
+ "disallow",
+ "forbid",
+ "limit",
+ "stop"
+ ]
},
"projector": {
"unicode": "1F4FD",
@@ -10116,9 +22107,18 @@
"name": "film projector",
"shortname": ":projector:",
"category": "objects_symbols",
- "aliases": [":film_projector:"],
- "aliases_ascii": [],
- "keywords": ["movie", "video", "motion", "picture", "8mm", "16mm"]
+ "aliases": [
+ ":film_projector:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "movie",
+ "video",
+ "motion",
+ "picture",
+ "8mm",
+ "16mm"
+ ]
},
"punch": {
"unicode": "1F44A",
@@ -10128,9 +22128,77 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["fist", "hand"],
+ "keywords": [
+ "fist",
+ "hand"
+ ],
"moji": "👊"
},
+ "punch_tone1": {
+ "unicode": "1F44A-1F3FB",
+ "unicode_alternates": "",
+ "name": "fisted hand sign tone 1",
+ "shortname": ":punch_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "fist",
+ "punch"
+ ]
+ },
+ "punch_tone2": {
+ "unicode": "1F44A-1F3FC",
+ "unicode_alternates": "",
+ "name": "fisted hand sign tone 2",
+ "shortname": ":punch_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "fist",
+ "punch"
+ ]
+ },
+ "punch_tone3": {
+ "unicode": "1F44A-1F3FD",
+ "unicode_alternates": "",
+ "name": "fisted hand sign tone 3",
+ "shortname": ":punch_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "fist",
+ "punch"
+ ]
+ },
+ "punch_tone4": {
+ "unicode": "1F44A-1F3FE",
+ "unicode_alternates": "",
+ "name": "fisted hand sign tone 4",
+ "shortname": ":punch_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "fist",
+ "punch"
+ ]
+ },
+ "punch_tone5": {
+ "unicode": "1F44A-1F3FF",
+ "unicode_alternates": "",
+ "name": "fisted hand sign tone 5",
+ "shortname": ":punch_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "fist",
+ "punch"
+ ]
+ },
"purple_heart": {
"unicode": "1F49C",
"unicode_alternates": [],
@@ -10139,7 +22207,25 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["affection", "like", "love", "valentines", "purple", "violet", "heart", "love", "sensitive", "understanding", "compassionate", "compassion", "duty", "honor", "royalty", "veteran", "sacrifice"],
+ "keywords": [
+ "affection",
+ "like",
+ "love",
+ "valentines",
+ "purple",
+ "violet",
+ "heart",
+ "love",
+ "sensitive",
+ "understanding",
+ "compassionate",
+ "compassion",
+ "duty",
+ "honor",
+ "royalty",
+ "veteran",
+ "sacrifice"
+ ],
"moji": "💜"
},
"purse": {
@@ -10150,7 +22236,20 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["accessories", "fashion", "money", "purse", "clutch", "bag", "handbag", "coin bag", "accessory", "money", "ladies", "shopping"],
+ "keywords": [
+ "accessories",
+ "fashion",
+ "money",
+ "purse",
+ "clutch",
+ "bag",
+ "handbag",
+ "coin bag",
+ "accessory",
+ "money",
+ "ladies",
+ "shopping"
+ ],
"moji": "👛"
},
"pushpin": {
@@ -10161,7 +22260,9 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["stationery"],
+ "keywords": [
+ "stationery"
+ ],
"moji": "📌"
},
"pushpin_black": {
@@ -10172,7 +22273,9 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["stationery"]
+ "keywords": [
+ "stationery"
+ ]
},
"put_litter_in_its_place": {
"unicode": "1F6AE",
@@ -10182,7 +22285,15 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue-square", "litter", "waste", "trash", "garbage", "receptacle", "can"],
+ "keywords": [
+ "blue-square",
+ "litter",
+ "waste",
+ "trash",
+ "garbage",
+ "receptacle",
+ "can"
+ ],
"moji": "🚮"
},
"question": {
@@ -10193,7 +22304,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["confused", "doubt"],
+ "keywords": [
+ "confused",
+ "doubt"
+ ],
"moji": "❓"
},
"rabbit": {
@@ -10204,7 +22318,10 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "nature"],
+ "keywords": [
+ "animal",
+ "nature"
+ ],
"moji": "🐰"
},
"rabbit2": {
@@ -10215,7 +22332,15 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "nature", "rabbit", "bunny", "easter", "reproduction", "prolific"],
+ "keywords": [
+ "animal",
+ "nature",
+ "rabbit",
+ "bunny",
+ "easter",
+ "reproduction",
+ "prolific"
+ ],
"moji": "🐇"
},
"race_car": {
@@ -10224,9 +22349,18 @@
"name": "racing car",
"shortname": ":race_car:",
"category": "activity",
- "aliases": [":racing_car:"],
- "aliases_ascii": [],
- "keywords": ["formula 1", "race", "stock", "nascar", "speed", "drive"]
+ "aliases": [
+ ":racing_car:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "formula 1",
+ "race",
+ "stock",
+ "nascar",
+ "speed",
+ "drive"
+ ]
},
"racehorse": {
"unicode": "1F40E",
@@ -10236,7 +22370,29 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "gamble", "horse", "powerful", "draft", "calvary", "cowboy", "cowgirl", "mounted", "race", "ride", "gallop", "trot", "colt", "filly", "mare", "stallion", "gelding", "yearling", "thoroughbred", "pony"],
+ "keywords": [
+ "animal",
+ "gamble",
+ "horse",
+ "powerful",
+ "draft",
+ "calvary",
+ "cowboy",
+ "cowgirl",
+ "mounted",
+ "race",
+ "ride",
+ "gallop",
+ "trot",
+ "colt",
+ "filly",
+ "mare",
+ "stallion",
+ "gelding",
+ "yearling",
+ "thoroughbred",
+ "pony"
+ ],
"moji": "🐎"
},
"radio": {
@@ -10247,7 +22403,12 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["communication", "music", "podcast", "program"],
+ "keywords": [
+ "communication",
+ "music",
+ "podcast",
+ "program"
+ ],
"moji": "📻"
},
"radio_button": {
@@ -10258,9 +22419,25 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["input"],
+ "keywords": [
+ "input"
+ ],
"moji": "🔘"
},
+ "radioactive": {
+ "unicode": "2622",
+ "unicode_alternates": "",
+ "name": "radioactive sign",
+ "shortname": ":radioactive:",
+ "category": "symbols",
+ "aliases": [
+ ":radioactive_sign:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "symbol"
+ ]
+ },
"rage": {
"unicode": "1F621",
"unicode_alternates": [],
@@ -10269,7 +22446,16 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["angry", "despise", "hate", "mad", "pout", "anger", "rage", "irate"],
+ "keywords": [
+ "angry",
+ "despise",
+ "hate",
+ "mad",
+ "pout",
+ "anger",
+ "rage",
+ "irate"
+ ],
"moji": "😡"
},
"railway_car": {
@@ -10280,7 +22466,15 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["transportation", "vehicle", "railway", "rail", "car", "coach", "train"],
+ "keywords": [
+ "transportation",
+ "vehicle",
+ "railway",
+ "rail",
+ "car",
+ "coach",
+ "train"
+ ],
"moji": "🚃"
},
"railway_track": {
@@ -10289,9 +22483,17 @@
"name": "railway track",
"shortname": ":railway_track:",
"category": "travel_places",
- "aliases": [":railroad_track:"],
- "aliases_ascii": [],
- "keywords": ["train", "trolley", "subway", "locomotive", "transit"]
+ "aliases": [
+ ":railroad_track:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "train",
+ "trolley",
+ "subway",
+ "locomotive",
+ "transit"
+ ]
},
"rainbow": {
"unicode": "1F308",
@@ -10301,7 +22503,21 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["happy", "nature", "photo", "sky", "unicorn", "rainbow", "color", "pride", "diversity", "spectrum", "refract", "leprechaun", "gold"],
+ "keywords": [
+ "happy",
+ "nature",
+ "photo",
+ "sky",
+ "unicorn",
+ "rainbow",
+ "color",
+ "pride",
+ "diversity",
+ "spectrum",
+ "refract",
+ "leprechaun",
+ "gold"
+ ],
"moji": "🌈"
},
"raised_hand": {
@@ -10312,9 +22528,83 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["female", "girl", "woman"],
+ "keywords": [
+ "female",
+ "girl",
+ "woman"
+ ],
"moji": "✋"
},
+ "raised_hand_tone1": {
+ "unicode": "270B-1F3FB",
+ "unicode_alternates": "",
+ "name": "raised hand tone 1",
+ "shortname": ":raised_hand_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman"
+ ]
+ },
+ "raised_hand_tone2": {
+ "unicode": "270B-1F3FC",
+ "unicode_alternates": "",
+ "name": "raised hand tone 2",
+ "shortname": ":raised_hand_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman"
+ ]
+ },
+ "raised_hand_tone3": {
+ "unicode": "270B-1F3FD",
+ "unicode_alternates": "",
+ "name": "raised hand tone 3",
+ "shortname": ":raised_hand_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman"
+ ]
+ },
+ "raised_hand_tone4": {
+ "unicode": "270B-1F3FE",
+ "unicode_alternates": "",
+ "name": "raised hand tone 4",
+ "shortname": ":raised_hand_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman"
+ ]
+ },
+ "raised_hand_tone5": {
+ "unicode": "270B-1F3FF",
+ "unicode_alternates": "",
+ "name": "raised hand tone 5",
+ "shortname": ":raised_hand_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman"
+ ]
+ },
"raised_hands": {
"unicode": "1F64C",
"unicode_alternates": [],
@@ -10323,9 +22613,106 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["gesture", "hooray", "winning", "woot", "yay", "banzai"],
+ "keywords": [
+ "gesture",
+ "hooray",
+ "winning",
+ "woot",
+ "yay",
+ "banzai"
+ ],
"moji": "🙌"
},
+ "raised_hands_tone1": {
+ "unicode": "1F64C-1F3FB",
+ "unicode_alternates": "",
+ "name": "person raising both hands in celebration tone 1",
+ "shortname": ":raised_hands_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "gesture",
+ "hooray",
+ "winning",
+ "woot",
+ "yay",
+ "banzai",
+ "raised"
+ ]
+ },
+ "raised_hands_tone2": {
+ "unicode": "1F64C-1F3FC",
+ "unicode_alternates": "",
+ "name": "person raising both hands in celebration tone 2",
+ "shortname": ":raised_hands_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "gesture",
+ "hooray",
+ "winning",
+ "woot",
+ "yay",
+ "banzai",
+ "raised"
+ ]
+ },
+ "raised_hands_tone3": {
+ "unicode": "1F64C-1F3FD",
+ "unicode_alternates": "",
+ "name": "person raising both hands in celebration tone 3",
+ "shortname": ":raised_hands_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "gesture",
+ "hooray",
+ "winning",
+ "woot",
+ "yay",
+ "banzai",
+ "raised"
+ ]
+ },
+ "raised_hands_tone4": {
+ "unicode": "1F64C-1F3FE",
+ "unicode_alternates": "",
+ "name": "person raising both hands in celebration tone 4",
+ "shortname": ":raised_hands_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "gesture",
+ "hooray",
+ "winning",
+ "woot",
+ "yay",
+ "banzai",
+ "raised"
+ ]
+ },
+ "raised_hands_tone5": {
+ "unicode": "1F64C-1F3FF",
+ "unicode_alternates": "",
+ "name": "person raising both hands in celebration tone 5",
+ "shortname": ":raised_hands_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "gesture",
+ "hooray",
+ "winning",
+ "woot",
+ "yay",
+ "banzai",
+ "raised"
+ ]
+ },
"raising_hand": {
"unicode": "1F64B",
"unicode_alternates": [],
@@ -10334,9 +22721,108 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["female", "girl", "woman", "hand", "raise", "notice", "attention", "answer"],
+ "keywords": [
+ "female",
+ "girl",
+ "woman",
+ "hand",
+ "raise",
+ "notice",
+ "attention",
+ "answer"
+ ],
"moji": "🙋"
},
+ "raising_hand_tone1": {
+ "unicode": "1F64B-1F3FB",
+ "unicode_alternates": "",
+ "name": "happy person raising one hand tone1",
+ "shortname": ":raising_hand_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman",
+ "raise",
+ "notice",
+ "attention",
+ "answer"
+ ]
+ },
+ "raising_hand_tone2": {
+ "unicode": "1F64B-1F3FC",
+ "unicode_alternates": "",
+ "name": "happy person raising one hand tone2",
+ "shortname": ":raising_hand_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman",
+ "raise",
+ "notice",
+ "attention",
+ "answer"
+ ]
+ },
+ "raising_hand_tone3": {
+ "unicode": "1F64B-1F3FD",
+ "unicode_alternates": "",
+ "name": "happy person raising one hand tone3",
+ "shortname": ":raising_hand_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman",
+ "raise",
+ "notice",
+ "attention",
+ "answer"
+ ]
+ },
+ "raising_hand_tone4": {
+ "unicode": "1F64B-1F3FE",
+ "unicode_alternates": "",
+ "name": "happy person raising one hand tone4",
+ "shortname": ":raising_hand_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman",
+ "raise",
+ "notice",
+ "attention",
+ "answer"
+ ]
+ },
+ "raising_hand_tone5": {
+ "unicode": "1F64B-1F3FF",
+ "unicode_alternates": "",
+ "name": "happy person raising one hand tone5",
+ "shortname": ":raising_hand_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "woman",
+ "raise",
+ "notice",
+ "attention",
+ "answer"
+ ]
+ },
"ram": {
"unicode": "1F40F",
"unicode_alternates": [],
@@ -10345,7 +22831,16 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "nature", "sheep", "ram", "sheep", "male", "horn", "horns"],
+ "keywords": [
+ "animal",
+ "nature",
+ "sheep",
+ "ram",
+ "sheep",
+ "male",
+ "horn",
+ "horns"
+ ],
"moji": "🐏"
},
"ramen": {
@@ -10356,7 +22851,17 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["chipsticks", "food", "japanese", "noodle", "ramen", "noodles", "bowl", "steaming", "soup"],
+ "keywords": [
+ "chipsticks",
+ "food",
+ "japanese",
+ "noodle",
+ "ramen",
+ "noodles",
+ "bowl",
+ "steaming",
+ "soup"
+ ],
"moji": "🍜"
},
"rat": {
@@ -10367,18 +22872,45 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "mouse", "rat", "rodent", "crooked", "snitch"],
+ "keywords": [
+ "animal",
+ "mouse",
+ "rat",
+ "rodent",
+ "crooked",
+ "snitch"
+ ],
"moji": "🐀"
},
+ "record_button": {
+ "unicode": "23FA",
+ "unicode_alternates": "",
+ "name": "black circle for record",
+ "shortname": ":record_button:",
+ "category": "symbols",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "sound",
+ "symbol"
+ ]
+ },
"recycle": {
"unicode": "267B",
- "unicode_alternates": ["267B-FE0F"],
+ "unicode_alternates": [
+ "267B-FE0F"
+ ],
"name": "black universal recycling symbol",
"shortname": ":recycle:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["arrow", "environment", "garbage", "trash"],
+ "keywords": [
+ "arrow",
+ "environment",
+ "garbage",
+ "trash"
+ ],
"moji": "♻"
},
"red_car": {
@@ -10389,7 +22921,10 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["transportation", "vehicle"],
+ "keywords": [
+ "transportation",
+ "vehicle"
+ ],
"moji": "🚗"
},
"red_circle": {
@@ -10400,7 +22935,9 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["shape"],
+ "keywords": [
+ "shape"
+ ],
"moji": "🔴"
},
"registered": {
@@ -10412,17 +22949,28 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["alphabet", "circle"]
+ "keywords": [
+ "alphabet",
+ "circle"
+ ]
},
"relaxed": {
"unicode": "263A",
- "unicode_alternates": ["263A-FE0F"],
+ "unicode_alternates": [
+ "263A-FE0F"
+ ],
"name": "white smiling face",
"shortname": ":relaxed:",
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blush", "face", "happiness", "massage", "smile"],
+ "keywords": [
+ "blush",
+ "face",
+ "happiness",
+ "massage",
+ "smile"
+ ],
"moji": "☺"
},
"relieved": {
@@ -10433,7 +22981,17 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["face", "happiness", "massage", "phew", "relaxed", "relieved", "satisfied", "phew", "relief"],
+ "keywords": [
+ "face",
+ "happiness",
+ "massage",
+ "phew",
+ "relaxed",
+ "relieved",
+ "satisfied",
+ "phew",
+ "relief"
+ ],
"moji": "😌"
},
"reminder_ribbon": {
@@ -10444,7 +23002,9 @@
"category": "celebration",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["awareness"]
+ "keywords": [
+ "awareness"
+ ]
},
"repeat": {
"unicode": "1F501",
@@ -10454,7 +23014,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["loop", "record"],
+ "keywords": [
+ "loop",
+ "record"
+ ],
"moji": "🔁"
},
"repeat_one": {
@@ -10465,7 +23028,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue-square", "loop"],
+ "keywords": [
+ "blue-square",
+ "loop"
+ ],
"moji": "🔂"
},
"restroom": {
@@ -10476,7 +23042,17 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue-square", "woman", "man", "unisex", "bathroom", "restroom", "sign", "shared", "toilet"],
+ "keywords": [
+ "blue-square",
+ "woman",
+ "man",
+ "unisex",
+ "bathroom",
+ "restroom",
+ "sign",
+ "shared",
+ "toilet"
+ ],
"moji": "🚻"
},
"revolving_hearts": {
@@ -10487,7 +23063,19 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["affection", "like", "love", "valentines", "heart", "hearts", "revolving", "moving", "circle", "multiple", "lovers"],
+ "keywords": [
+ "affection",
+ "like",
+ "love",
+ "valentines",
+ "heart",
+ "hearts",
+ "revolving",
+ "moving",
+ "circle",
+ "multiple",
+ "lovers"
+ ],
"moji": "💞"
},
"rewind": {
@@ -10498,7 +23086,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue-square", "play"],
+ "keywords": [
+ "blue-square",
+ "play"
+ ],
"moji": "⏪"
},
"ribbon": {
@@ -10509,7 +23100,16 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["bowtie", "decoration", "girl", "pink", "ribbon", "lace", "wrap", "decorate"],
+ "keywords": [
+ "bowtie",
+ "decoration",
+ "girl",
+ "pink",
+ "ribbon",
+ "lace",
+ "wrap",
+ "decorate"
+ ],
"moji": "🎀"
},
"rice": {
@@ -10520,7 +23120,14 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["food", "rice", "white", "grain", "food", "bowl"],
+ "keywords": [
+ "food",
+ "rice",
+ "white",
+ "grain",
+ "food",
+ "bowl"
+ ],
"moji": "🍚"
},
"rice_ball": {
@@ -10531,7 +23138,16 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["food", "japanese", "rice", "ball", "white", "nori", "seaweed", "japanese"],
+ "keywords": [
+ "food",
+ "japanese",
+ "rice",
+ "ball",
+ "white",
+ "nori",
+ "seaweed",
+ "japanese"
+ ],
"moji": "🍙"
},
"rice_cracker": {
@@ -10542,7 +23158,15 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["food", "japanese", "rice", "cracker", "seaweed", "food", "japanese"],
+ "keywords": [
+ "food",
+ "japanese",
+ "rice",
+ "cracker",
+ "seaweed",
+ "food",
+ "japanese"
+ ],
"moji": "🍘"
},
"rice_scene": {
@@ -10553,7 +23177,18 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["photo", "moon", "viewing", "observing", "otsukimi", "tsukimi", "rice", "scene", "festival", "autumn"],
+ "keywords": [
+ "photo",
+ "moon",
+ "viewing",
+ "observing",
+ "otsukimi",
+ "tsukimi",
+ "rice",
+ "scene",
+ "festival",
+ "autumn"
+ ],
"moji": "🎑"
},
"right_speaker": {
@@ -10564,7 +23199,13 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["sound", "listen", "hear", "noise", "volume"]
+ "keywords": [
+ "sound",
+ "listen",
+ "hear",
+ "noise",
+ "volume"
+ ]
},
"right_speaker_one": {
"unicode": "1F569",
@@ -10572,9 +23213,14 @@
"name": "right speaker with one sound wave",
"shortname": ":right_speaker_one:",
"category": "objects_symbols",
- "aliases": [":right_speaker_with_one_sound_wave:"],
+ "aliases": [
+ ":right_speaker_with_one_sound_wave:"
+ ],
"aliases_ascii": [],
- "keywords": ["low", "volume"]
+ "keywords": [
+ "low",
+ "volume"
+ ]
},
"right_speaker_three": {
"unicode": "1F56A",
@@ -10582,9 +23228,15 @@
"name": "right speaker with three sound waves",
"shortname": ":right_speaker_three:",
"category": "objects_symbols",
- "aliases": [":right_speaker_with_three_sound_waves:"],
+ "aliases": [
+ ":right_speaker_with_three_sound_waves:"
+ ],
"aliases_ascii": [],
- "keywords": ["loud", "high", "volume"]
+ "keywords": [
+ "loud",
+ "high",
+ "volume"
+ ]
},
"ring": {
"unicode": "1F48D",
@@ -10594,7 +23246,12 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["marriage", "propose", "valentines", "wedding"],
+ "keywords": [
+ "marriage",
+ "propose",
+ "valentines",
+ "wedding"
+ ],
"moji": "💍"
},
"ringing_bell": {
@@ -10605,7 +23262,25 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["alert", "ding", "volume", "sound", "chime"]
+ "keywords": [
+ "alert",
+ "ding",
+ "volume",
+ "sound",
+ "chime"
+ ]
+ },
+ "robot": {
+ "unicode": "1F916",
+ "unicode_alternates": "",
+ "name": "robot face",
+ "shortname": ":robot:",
+ "category": "people",
+ "aliases": [
+ ":robot_face:"
+ ],
+ "aliases_ascii": [],
+ "keywords": []
},
"rocket": {
"unicode": "1F680",
@@ -10615,7 +23290,16 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["launch", "ship", "staffmode", "rocket", "space", "spacecraft", "astronaut", "cosmonaut"],
+ "keywords": [
+ "launch",
+ "ship",
+ "staffmode",
+ "rocket",
+ "space",
+ "spacecraft",
+ "astronaut",
+ "cosmonaut"
+ ],
"moji": "🚀"
},
"roller_coaster": {
@@ -10626,9 +23310,34 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["carnival", "fun", "photo", "play", "playground", "roller", "coaster", "amusement", "park", "fair", "ride", "entertainment"],
+ "keywords": [
+ "carnival",
+ "fun",
+ "photo",
+ "play",
+ "playground",
+ "roller",
+ "coaster",
+ "amusement",
+ "park",
+ "fair",
+ "ride",
+ "entertainment"
+ ],
"moji": "🎢"
},
+ "rolling_eyes": {
+ "unicode": "1F644",
+ "unicode_alternates": "",
+ "name": "face with rolling eyes",
+ "shortname": ":rolling_eyes:",
+ "category": "people",
+ "aliases": [
+ ":face_with_rolling_eyes:"
+ ],
+ "aliases_ascii": [],
+ "keywords": []
+ },
"rooster": {
"unicode": "1F413",
"unicode_alternates": [],
@@ -10637,7 +23346,17 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "chicken", "nature", "rooster", "cockerel", "cock", "male", "cock-a-doodle-doo", "crowing"],
+ "keywords": [
+ "animal",
+ "chicken",
+ "nature",
+ "rooster",
+ "cockerel",
+ "cock",
+ "male",
+ "cock-a-doodle-doo",
+ "crowing"
+ ],
"moji": "🐓"
},
"rose": {
@@ -10648,7 +23367,18 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["flowers", "love", "valentines", "rose", "fragrant", "flower", "thorns", "love", "petals", "romance"],
+ "keywords": [
+ "flowers",
+ "love",
+ "valentines",
+ "rose",
+ "fragrant",
+ "flower",
+ "thorns",
+ "love",
+ "petals",
+ "romance"
+ ],
"moji": "🌹"
},
"rosette": {
@@ -10659,7 +23389,9 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["flower"]
+ "keywords": [
+ "flower"
+ ]
},
"rosette_black": {
"unicode": "1F3F6",
@@ -10669,7 +23401,9 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["flower"]
+ "keywords": [
+ "flower"
+ ]
},
"rotating_light": {
"unicode": "1F6A8",
@@ -10679,7 +23413,15 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["911", "ambulance", "emergency", "police", "light", "police", "emergency"],
+ "keywords": [
+ "911",
+ "ambulance",
+ "emergency",
+ "police",
+ "light",
+ "police",
+ "emergency"
+ ],
"moji": "🚨"
},
"round_pushpin": {
@@ -10690,7 +23432,9 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["stationery"],
+ "keywords": [
+ "stationery"
+ ],
"moji": "📍"
},
"rowboat": {
@@ -10701,9 +23445,108 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["hobby", "ship", "sports", "water", "boat", "row", "oar", "paddle"],
+ "keywords": [
+ "hobby",
+ "ship",
+ "sports",
+ "water",
+ "boat",
+ "row",
+ "oar",
+ "paddle"
+ ],
"moji": "🚣"
},
+ "rowboat_tone1": {
+ "unicode": "1F6A3-1F3FB",
+ "unicode_alternates": "",
+ "name": "rowboat tone 1",
+ "shortname": ":rowboat_tone1:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "hobby",
+ "ship",
+ "water",
+ "boat",
+ "row",
+ "oar",
+ "paddle"
+ ]
+ },
+ "rowboat_tone2": {
+ "unicode": "1F6A3-1F3FC",
+ "unicode_alternates": "",
+ "name": "rowboat tone 2",
+ "shortname": ":rowboat_tone2:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "hobby",
+ "ship",
+ "water",
+ "boat",
+ "row",
+ "oar",
+ "paddle"
+ ]
+ },
+ "rowboat_tone3": {
+ "unicode": "1F6A3-1F3FD",
+ "unicode_alternates": "",
+ "name": "rowboat tone 3",
+ "shortname": ":rowboat_tone3:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "hobby",
+ "ship",
+ "water",
+ "boat",
+ "row",
+ "oar",
+ "paddle"
+ ]
+ },
+ "rowboat_tone4": {
+ "unicode": "1F6A3-1F3FE",
+ "unicode_alternates": "",
+ "name": "rowboat tone 4",
+ "shortname": ":rowboat_tone4:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "hobby",
+ "ship",
+ "water",
+ "boat",
+ "row",
+ "oar",
+ "paddle"
+ ]
+ },
+ "rowboat_tone5": {
+ "unicode": "1F6A3-1F3FF",
+ "unicode_alternates": "",
+ "name": "rowboat tone 5",
+ "shortname": ":rowboat_tone5:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "hobby",
+ "ship",
+ "water",
+ "boat",
+ "row",
+ "oar",
+ "paddle"
+ ]
+ },
"rugby_football": {
"unicode": "1F3C9",
"unicode_alternates": [],
@@ -10712,7 +23555,15 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["sports", "rugby", "football", "ball", "sport", "team", "england"],
+ "keywords": [
+ "sports",
+ "rugby",
+ "football",
+ "ball",
+ "sport",
+ "team",
+ "england"
+ ],
"moji": "🏉"
},
"runner": {
@@ -10723,9 +23574,115 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["exercise", "man", "walking", "run", "runner", "jog", "exercise", "sprint", "race", "dash"],
+ "keywords": [
+ "exercise",
+ "man",
+ "walking",
+ "run",
+ "runner",
+ "jog",
+ "exercise",
+ "sprint",
+ "race",
+ "dash"
+ ],
"moji": "🏃"
},
+ "runner_tone1": {
+ "unicode": "1F3C3-1F3FB",
+ "unicode_alternates": "",
+ "name": "runner tone 1",
+ "shortname": ":runner_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "exercise",
+ "man",
+ "run",
+ "jog",
+ "sprint",
+ "race",
+ "dash",
+ "marathon"
+ ]
+ },
+ "runner_tone2": {
+ "unicode": "1F3C3-1F3FC",
+ "unicode_alternates": "",
+ "name": "runner tone 2",
+ "shortname": ":runner_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "exercise",
+ "man",
+ "run",
+ "jog",
+ "sprint",
+ "race",
+ "dash",
+ "marathon"
+ ]
+ },
+ "runner_tone3": {
+ "unicode": "1F3C3-1F3FD",
+ "unicode_alternates": "",
+ "name": "runner tone 3",
+ "shortname": ":runner_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "exercise",
+ "man",
+ "run",
+ "jog",
+ "sprint",
+ "race",
+ "dash",
+ "marathon"
+ ]
+ },
+ "runner_tone4": {
+ "unicode": "1F3C3-1F3FE",
+ "unicode_alternates": "",
+ "name": "runner tone 4",
+ "shortname": ":runner_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "exercise",
+ "man",
+ "run",
+ "jog",
+ "sprint",
+ "race",
+ "dash",
+ "marathon"
+ ]
+ },
+ "runner_tone5": {
+ "unicode": "1F3C3-1F3FF",
+ "unicode_alternates": "",
+ "name": "runner tone 5",
+ "shortname": ":runner_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "exercise",
+ "man",
+ "run",
+ "jog",
+ "sprint",
+ "race",
+ "dash",
+ "marathon"
+ ]
+ },
"running_shirt_with_sash": {
"unicode": "1F3BD",
"unicode_alternates": [],
@@ -10734,29 +23691,73 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["pageant", "play", "running", "run", "shirt", "cloths", "compete", "sports"],
+ "keywords": [
+ "pageant",
+ "play",
+ "running",
+ "run",
+ "shirt",
+ "cloths",
+ "compete",
+ "sports"
+ ],
"moji": "🎽"
},
+ "sa": {
+ "unicode": "1F202",
+ "unicode_alternates": "",
+ "name": "squared katakana sa",
+ "shortname": ":sa:",
+ "category": "symbols",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "blue-square",
+ "japanese",
+ "symbol",
+ "word"
+ ]
+ },
"sagittarius": {
"unicode": "2650",
- "unicode_alternates": ["2650-FE0F"],
+ "unicode_alternates": [
+ "2650-FE0F"
+ ],
"name": "sagittarius",
"shortname": ":sagittarius:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["sagittarius", "centaur", "archer", "astrology", "greek", "constellation", "stars", "zodiac", "sign", "sign", "zodiac", "horoscope"],
+ "keywords": [
+ "sagittarius",
+ "centaur",
+ "archer",
+ "astrology",
+ "greek",
+ "constellation",
+ "stars",
+ "zodiac",
+ "sign",
+ "sign",
+ "zodiac",
+ "horoscope"
+ ],
"moji": "♐"
},
"sailboat": {
"unicode": "26F5",
- "unicode_alternates": ["26F5-FE0F"],
+ "unicode_alternates": [
+ "26F5-FE0F"
+ ],
"name": "sailboat",
"shortname": ":sailboat:",
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["ship", "transportation"],
+ "keywords": [
+ "ship",
+ "transportation"
+ ],
"moji": "⛵"
},
"sake": {
@@ -10767,7 +23768,19 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["beverage", "drink", "drunk", "wine", "sake", "wine", "rice", "ferment", "alcohol", "japanese", "drink"],
+ "keywords": [
+ "beverage",
+ "drink",
+ "drunk",
+ "wine",
+ "sake",
+ "wine",
+ "rice",
+ "ferment",
+ "alcohol",
+ "japanese",
+ "drink"
+ ],
"moji": "🍶"
},
"sandal": {
@@ -10778,7 +23791,10 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["fashion", "shoes"],
+ "keywords": [
+ "fashion",
+ "shoes"
+ ],
"moji": "👡"
},
"santa": {
@@ -10789,9 +23805,159 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["christmas", "father christmas", "festival", "male", "man", "xmas", "santa", "saint nick", "jolly", "ho ho ho", "north pole", "presents", "gifts", "naughty", "nice", "sleigh", "father", "christmas", "holiday"],
+ "keywords": [
+ "christmas",
+ "father christmas",
+ "festival",
+ "male",
+ "man",
+ "xmas",
+ "santa",
+ "saint nick",
+ "jolly",
+ "ho ho ho",
+ "north pole",
+ "presents",
+ "gifts",
+ "naughty",
+ "nice",
+ "sleigh",
+ "father",
+ "christmas",
+ "holiday"
+ ],
"moji": "🎅"
},
+ "santa_tone1": {
+ "unicode": "1F385-1F3FB",
+ "unicode_alternates": "",
+ "name": "father christmas tone 1",
+ "shortname": ":santa_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "festival",
+ "male",
+ "man",
+ "xmas",
+ "santa",
+ "saint nick",
+ "jolly",
+ "ho ho ho",
+ "north pole",
+ "presents",
+ "gifts",
+ "naughty",
+ "nice",
+ "sleigh",
+ "holiday"
+ ]
+ },
+ "santa_tone2": {
+ "unicode": "1F385-1F3FC",
+ "unicode_alternates": "",
+ "name": "father christmas tone 2",
+ "shortname": ":santa_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "festival",
+ "male",
+ "man",
+ "xmas",
+ "santa",
+ "saint nick",
+ "jolly",
+ "ho ho ho",
+ "north pole",
+ "presents",
+ "gifts",
+ "naughty",
+ "nice",
+ "sleigh",
+ "holiday"
+ ]
+ },
+ "santa_tone3": {
+ "unicode": "1F385-1F3FD",
+ "unicode_alternates": "",
+ "name": "father christmas tone 3",
+ "shortname": ":santa_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "festival",
+ "male",
+ "man",
+ "xmas",
+ "santa",
+ "saint nick",
+ "jolly",
+ "ho ho ho",
+ "north pole",
+ "presents",
+ "gifts",
+ "naughty",
+ "nice",
+ "sleigh",
+ "holiday"
+ ]
+ },
+ "santa_tone4": {
+ "unicode": "1F385-1F3FE",
+ "unicode_alternates": "",
+ "name": "father christmas tone 4",
+ "shortname": ":santa_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "festival",
+ "male",
+ "man",
+ "xmas",
+ "santa",
+ "saint nick",
+ "jolly",
+ "ho ho ho",
+ "north pole",
+ "presents",
+ "gifts",
+ "naughty",
+ "nice",
+ "sleigh",
+ "holiday"
+ ]
+ },
+ "santa_tone5": {
+ "unicode": "1F385-1F3FF",
+ "unicode_alternates": "",
+ "name": "father christmas tone 5",
+ "shortname": ":santa_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "festival",
+ "male",
+ "man",
+ "xmas",
+ "santa",
+ "saint nick",
+ "jolly",
+ "ho ho ho",
+ "north pole",
+ "presents",
+ "gifts",
+ "naughty",
+ "nice",
+ "sleigh",
+ "holiday"
+ ]
+ },
"satellite": {
"unicode": "1F4E1",
"unicode_alternates": [],
@@ -10800,7 +23966,9 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["communication"],
+ "keywords": [
+ "communication"
+ ],
"moji": "📡"
},
"satellite_orbital": {
@@ -10811,7 +23979,11 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["communication", "orbital", "space"]
+ "keywords": [
+ "communication",
+ "orbital",
+ "space"
+ ]
},
"saxophone": {
"unicode": "1F3B7",
@@ -10821,9 +23993,35 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["instrument", "music", "saxophone", "sax", "music", "instrument", "woodwind"],
+ "keywords": [
+ "instrument",
+ "music",
+ "saxophone",
+ "sax",
+ "music",
+ "instrument",
+ "woodwind"
+ ],
"moji": "🎷"
},
+ "scales": {
+ "unicode": "2696",
+ "unicode_alternates": "",
+ "name": "scales",
+ "shortname": ":scales:",
+ "category": "objects",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "balance",
+ "justice",
+ "libra",
+ "object",
+ "tool",
+ "weight",
+ "zodiac"
+ ]
+ },
"school": {
"unicode": "1F3EB",
"unicode_alternates": [],
@@ -10832,7 +24030,17 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["building", "school", "university", "elementary", "middle", "high", "college", "teach", "education"],
+ "keywords": [
+ "building",
+ "school",
+ "university",
+ "elementary",
+ "middle",
+ "high",
+ "college",
+ "teach",
+ "education"
+ ],
"moji": "🏫"
},
"school_satchel": {
@@ -10843,29 +24051,74 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["bag", "education", "student", "school", "satchel", "backpack", "bag", "packing", "pack", "hike", "education", "adventure", "travel", "sightsee"],
+ "keywords": [
+ "bag",
+ "education",
+ "student",
+ "school",
+ "satchel",
+ "backpack",
+ "bag",
+ "packing",
+ "pack",
+ "hike",
+ "education",
+ "adventure",
+ "travel",
+ "sightsee"
+ ],
"moji": "🎒"
},
"scissors": {
"unicode": "2702",
- "unicode_alternates": ["2702-FE0F"],
+ "unicode_alternates": [
+ "2702-FE0F"
+ ],
"name": "black scissors",
"shortname": ":scissors:",
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["cut", "stationery"],
+ "keywords": [
+ "cut",
+ "stationery"
+ ],
"moji": "✂"
},
+ "scorpion": {
+ "unicode": "1F982",
+ "unicode_alternates": "",
+ "name": "scorpion",
+ "shortname": ":scorpion:",
+ "category": "nature",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": []
+ },
"scorpius": {
"unicode": "264F",
- "unicode_alternates": ["264F-FE0F"],
+ "unicode_alternates": [
+ "264F-FE0F"
+ ],
"name": "scorpius",
"shortname": ":scorpius:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["scorpius", "scorpion", "scorpio", "astrology", "greek", "constellation", "stars", "zodiac", "sign", "sign", "zodiac", "horoscope"],
+ "keywords": [
+ "scorpius",
+ "scorpion",
+ "scorpio",
+ "astrology",
+ "greek",
+ "constellation",
+ "stars",
+ "zodiac",
+ "sign",
+ "sign",
+ "zodiac",
+ "horoscope"
+ ],
"moji": "♏"
},
"scream": {
@@ -10876,7 +24129,14 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["face", "munch", "scream", "painting", "artist", "alien"],
+ "keywords": [
+ "face",
+ "munch",
+ "scream",
+ "painting",
+ "artist",
+ "alien"
+ ],
"moji": "😱"
},
"scream_cat": {
@@ -10887,7 +24147,22 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "cats", "munch", "weary", "sleepy", "tired", "tiredness", "study", "finals", "school", "exhausted", "scream", "painting", "artist"],
+ "keywords": [
+ "animal",
+ "cats",
+ "munch",
+ "weary",
+ "sleepy",
+ "tired",
+ "tiredness",
+ "study",
+ "finals",
+ "school",
+ "exhausted",
+ "scream",
+ "painting",
+ "artist"
+ ],
"moji": "🙀"
},
"scroll": {
@@ -10898,7 +24173,9 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["documents"],
+ "keywords": [
+ "documents"
+ ],
"moji": "📜"
},
"seat": {
@@ -10909,18 +24186,24 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["sit"],
+ "keywords": [
+ "sit"
+ ],
"moji": "💺"
},
"secret": {
"unicode": "3299",
- "unicode_alternates": ["3299-FE0F"],
+ "unicode_alternates": [
+ "3299-FE0F"
+ ],
"name": "circled ideograph secret",
"shortname": ":secret:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["privacy"],
+ "keywords": [
+ "privacy"
+ ],
"moji": "㊙"
},
"see_no_evil": {
@@ -10931,7 +24214,17 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "monkey", "nature", "monkey", "see", "eyes", "vision", "sight", "mizaru"],
+ "keywords": [
+ "animal",
+ "monkey",
+ "nature",
+ "monkey",
+ "see",
+ "eyes",
+ "vision",
+ "sight",
+ "mizaru"
+ ],
"moji": "🙈"
},
"seedling": {
@@ -10942,19 +24235,49 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["grass", "lawn", "nature", "plant", "seedling", "plant", "new", "start", "grow"],
+ "keywords": [
+ "grass",
+ "lawn",
+ "nature",
+ "plant",
+ "seedling",
+ "plant",
+ "new",
+ "start",
+ "grow"
+ ],
"moji": "🌱"
},
"seven": {
"moji": "7️⃣",
"unicode": "0037-20E3",
- "unicode_alternates": ["0037-FE0F-20E3"],
+ "unicode_alternates": [
+ "0037-FE0F-20E3"
+ ],
"name": "digit seven",
"shortname": ":seven:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["7", "blue-square", "numbers", "prime"]
+ "keywords": [
+ "7",
+ "blue-square",
+ "numbers",
+ "prime"
+ ]
+ },
+ "shamrock": {
+ "unicode": "2618",
+ "unicode_alternates": "",
+ "name": "shamrock",
+ "shortname": ":shamrock:",
+ "category": "nature",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "nature",
+ "plant"
+ ]
},
"shaved_ice": {
"unicode": "1F367",
@@ -10964,7 +24287,16 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["desert", "hot", "shaved", "ice", "dessert", "treat", "syrup", "flavoring"],
+ "keywords": [
+ "desert",
+ "hot",
+ "shaved",
+ "ice",
+ "dessert",
+ "treat",
+ "syrup",
+ "flavoring"
+ ],
"moji": "🍧"
},
"sheep": {
@@ -10975,7 +24307,17 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "nature", "sheep", "wool", "flock", "follower", "ewe", "female", "lamb"],
+ "keywords": [
+ "animal",
+ "nature",
+ "sheep",
+ "wool",
+ "flock",
+ "follower",
+ "ewe",
+ "female",
+ "lamb"
+ ],
"moji": "🐑"
},
"shell": {
@@ -10986,7 +24328,17 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["beach", "nature", "sea", "shell", "spiral", "beach", "sand", "crab", "nautilus"],
+ "keywords": [
+ "beach",
+ "nature",
+ "sea",
+ "shell",
+ "spiral",
+ "beach",
+ "sand",
+ "crab",
+ "nautilus"
+ ],
"moji": "🐚"
},
"shield": {
@@ -10997,7 +24349,26 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["interstate", "route", "sign", "highway", "interstate"]
+ "keywords": [
+ "interstate",
+ "route",
+ "sign",
+ "highway",
+ "interstate"
+ ]
+ },
+ "shinto_shrine": {
+ "unicode": "26E9",
+ "unicode_alternates": "",
+ "name": "shinto shrine",
+ "shortname": ":shinto_shrine:",
+ "category": "travel",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "religion",
+ "symbol"
+ ]
},
"ship": {
"unicode": "1F6A2",
@@ -11007,7 +24378,13 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["titanic", "transportation", "ferry", "ship", "boat"],
+ "keywords": [
+ "titanic",
+ "transportation",
+ "ferry",
+ "ship",
+ "boat"
+ ],
"moji": "🚢"
},
"shirt": {
@@ -11018,7 +24395,10 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["cloth", "fashion"],
+ "keywords": [
+ "cloth",
+ "fashion"
+ ],
"moji": "👕"
},
"shopping_bags": {
@@ -11029,7 +24409,13 @@
"category": "travel_places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["purchase", "mall", "buy", "store", "shop"]
+ "keywords": [
+ "purchase",
+ "mall",
+ "buy",
+ "store",
+ "shop"
+ ]
},
"shower": {
"unicode": "1F6BF",
@@ -11039,7 +24425,18 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["bath", "clean", "wash", "bathroom", "shower", "soap", "water", "clean", "shampoo", "lather"],
+ "keywords": [
+ "bath",
+ "clean",
+ "wash",
+ "bathroom",
+ "shower",
+ "soap",
+ "water",
+ "clean",
+ "shampoo",
+ "lather"
+ ],
"moji": "🚿"
},
"signal_strength": {
@@ -11050,19 +24447,27 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue-square"],
+ "keywords": [
+ "blue-square"
+ ],
"moji": "📶"
},
"six": {
"moji": "6️⃣",
"unicode": "0036-20E3",
- "unicode_alternates": ["0036-FE0F-20E3"],
+ "unicode_alternates": [
+ "0036-FE0F-20E3"
+ ],
"name": "digit six",
"shortname": ":six:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["6", "blue-square", "numbers"]
+ "keywords": [
+ "6",
+ "blue-square",
+ "numbers"
+ ]
},
"six_pointed_star": {
"unicode": "1F52F",
@@ -11072,7 +24477,9 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["purple-square"],
+ "keywords": [
+ "purple-square"
+ ],
"moji": "🔯"
},
"ski": {
@@ -11083,20 +24490,75 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["cold", "sports", "winter", "ski", "downhill", "cross-country", "poles", "snow", "winter", "mountain", "alpine", "powder", "slalom", "freestyle"],
+ "keywords": [
+ "cold",
+ "sports",
+ "winter",
+ "ski",
+ "downhill",
+ "cross-country",
+ "poles",
+ "snow",
+ "winter",
+ "mountain",
+ "alpine",
+ "powder",
+ "slalom",
+ "freestyle"
+ ],
"moji": "🎿"
},
+ "skier": {
+ "unicode": "26F7",
+ "unicode_alternates": "",
+ "name": "skier",
+ "shortname": ":skier:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "person",
+ "ski",
+ "snow",
+ "sport",
+ "travel"
+ ]
+ },
"skull": {
"unicode": "1F480",
"unicode_alternates": [],
"name": "skull",
"shortname": ":skull:",
"category": "emoticons",
- "aliases": [":skeleton:"],
- "aliases_ascii": [],
- "keywords": ["dead", "skeleton", "dying"],
+ "aliases": [
+ ":skeleton:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "dead",
+ "skeleton",
+ "dying"
+ ],
"moji": "💀"
},
+ "skull_crossbones": {
+ "unicode": "2620",
+ "unicode_alternates": "",
+ "name": "skull and crossbones",
+ "shortname": ":skull_crossbones:",
+ "category": "objects",
+ "aliases": [
+ ":skull_and_crossbones:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "body",
+ "death",
+ "face",
+ "monster",
+ "person"
+ ]
+ },
"sleeping": {
"unicode": "1F634",
"unicode_alternates": [],
@@ -11105,7 +24567,15 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["face", "sleepy", "tired", "sleep", "sleepy", "sleeping", "snore"],
+ "keywords": [
+ "face",
+ "sleepy",
+ "tired",
+ "sleep",
+ "sleepy",
+ "sleeping",
+ "snore"
+ ],
"moji": "😴"
},
"sleeping_accommodation": {
@@ -11116,7 +24586,11 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["hotel", "motel", "rest"]
+ "keywords": [
+ "hotel",
+ "motel",
+ "rest"
+ ]
},
"sleepy": {
"unicode": "1F62A",
@@ -11126,7 +24600,14 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["face", "rest", "tired", "sleepy", "tired", "exhausted"],
+ "keywords": [
+ "face",
+ "rest",
+ "tired",
+ "sleepy",
+ "tired",
+ "exhausted"
+ ],
"moji": "😪"
},
"slight_frown": {
@@ -11135,9 +24616,16 @@
"name": "slightly frowning face",
"shortname": ":slight_frown:",
"category": "people",
- "aliases": [":slightly_frowning_face:"],
+ "aliases": [
+ ":slightly_frowning_face:"
+ ],
"aliases_ascii": [],
- "keywords": ["slight", "frown", "unhappy", "disappointed"]
+ "keywords": [
+ "slight",
+ "frown",
+ "unhappy",
+ "disappointed"
+ ]
},
"slight_smile": {
"unicode": "1F642",
@@ -11145,9 +24633,15 @@
"name": "slightly smiling face",
"shortname": ":slight_smile:",
"category": "people",
- "aliases": [":slightly_smiling_face:"],
+ "aliases": [
+ ":slightly_smiling_face:"
+ ],
"aliases_ascii": [],
- "keywords": ["slight", "smile", "happy"]
+ "keywords": [
+ "slight",
+ "smile",
+ "happy"
+ ]
},
"slot_machine": {
"unicode": "1F3B0",
@@ -11157,7 +24651,17 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["bet", "gamble", "vegas", "slot", "machine", "gamble", "one-armed bandit", "slots", "luck"],
+ "keywords": [
+ "bet",
+ "gamble",
+ "vegas",
+ "slot",
+ "machine",
+ "gamble",
+ "one-armed bandit",
+ "slots",
+ "luck"
+ ],
"moji": "🎰"
},
"small_blue_diamond": {
@@ -11168,7 +24672,9 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["shape"],
+ "keywords": [
+ "shape"
+ ],
"moji": "🔹"
},
"small_orange_diamond": {
@@ -11179,7 +24685,9 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["shape"],
+ "keywords": [
+ "shape"
+ ],
"moji": "🔸"
},
"small_red_triangle": {
@@ -11190,7 +24698,9 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["shape"],
+ "keywords": [
+ "shape"
+ ],
"moji": "🔺"
},
"small_red_triangle_down": {
@@ -11201,7 +24711,9 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["shape"],
+ "keywords": [
+ "shape"
+ ],
"moji": "🔻"
},
"smile": {
@@ -11211,8 +24723,24 @@
"shortname": ":smile:",
"category": "emoticons",
"aliases": [],
- "aliases_ascii": [":)", ":-)", "=]", "=)", ":]"],
- "keywords": ["face", "funny", "haha", "happy", "joy", "laugh", "smile", "smiley", "smiling"],
+ "aliases_ascii": [
+ ":)",
+ ":-)",
+ "=]",
+ "=)",
+ ":]"
+ ],
+ "keywords": [
+ "face",
+ "funny",
+ "haha",
+ "happy",
+ "joy",
+ "laugh",
+ "smile",
+ "smiley",
+ "smiling"
+ ],
"moji": "😄"
},
"smile_cat": {
@@ -11223,7 +24751,14 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "cats", "cat", "smile", "grin", "grinning"],
+ "keywords": [
+ "animal",
+ "cats",
+ "cat",
+ "smile",
+ "grin",
+ "grinning"
+ ],
"moji": "😸"
},
"smiley": {
@@ -11233,8 +24768,20 @@
"shortname": ":smiley:",
"category": "emoticons",
"aliases": [],
- "aliases_ascii": [":D", ":-D", "=D"],
- "keywords": ["face", "haha", "happy", "joy", "smiling", "smile", "smiley"],
+ "aliases_ascii": [
+ ":D",
+ ":-D",
+ "=D"
+ ],
+ "keywords": [
+ "face",
+ "haha",
+ "happy",
+ "joy",
+ "smiling",
+ "smile",
+ "smiley"
+ ],
"moji": "😃"
},
"smiley_cat": {
@@ -11245,7 +24792,15 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "cats", "happy", "smile", "smiley", "cat", "happy"],
+ "keywords": [
+ "animal",
+ "cats",
+ "happy",
+ "smile",
+ "smiley",
+ "cat",
+ "happy"
+ ],
"moji": "😺"
},
"smiling_imp": {
@@ -11256,7 +24811,14 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["devil", "horns", "horns", "devil", "impish", "trouble"],
+ "keywords": [
+ "devil",
+ "horns",
+ "horns",
+ "devil",
+ "impish",
+ "trouble"
+ ],
"moji": "😈"
},
"smirk": {
@@ -11267,7 +24829,18 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["mean", "prank", "smile", "smug", "smirking", "smirk", "smug", "smile", "half-smile", "conceited"],
+ "keywords": [
+ "mean",
+ "prank",
+ "smile",
+ "smug",
+ "smirking",
+ "smirk",
+ "smug",
+ "smile",
+ "half-smile",
+ "conceited"
+ ],
"moji": "😏"
},
"smirk_cat": {
@@ -11278,7 +24851,15 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "cats", "smirk", "smirking", "wry", "confident", "confidence"],
+ "keywords": [
+ "animal",
+ "cats",
+ "smirk",
+ "smirking",
+ "wry",
+ "confident",
+ "confidence"
+ ],
"moji": "😼"
},
"smoking": {
@@ -11289,7 +24870,19 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["cigarette", "kills", "tobacco", "smoking", "cigarette", "smoke", "cancer", "lungs", "inhale", "tar", "nicotine"],
+ "keywords": [
+ "cigarette",
+ "kills",
+ "tobacco",
+ "smoking",
+ "cigarette",
+ "smoke",
+ "cancer",
+ "lungs",
+ "inhale",
+ "tar",
+ "nicotine"
+ ],
"moji": "🚬"
},
"snail": {
@@ -11300,7 +24893,16 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "shell", "slow", "snail", "slow", "escargot", "french", "appetizer"],
+ "keywords": [
+ "animal",
+ "shell",
+ "slow",
+ "snail",
+ "slow",
+ "escargot",
+ "french",
+ "appetizer"
+ ],
"moji": "🐌"
},
"snake": {
@@ -11311,7 +24913,10 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "evil"],
+ "keywords": [
+ "animal",
+ "evil"
+ ],
"moji": "🐍"
},
"snowboarder": {
@@ -11322,31 +24927,89 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["sports", "winter", "snow", "boarding", "sports", "freestyle", "halfpipe", "board", "mountain", "alpine", "winter"],
+ "keywords": [
+ "sports",
+ "winter",
+ "snow",
+ "boarding",
+ "sports",
+ "freestyle",
+ "halfpipe",
+ "board",
+ "mountain",
+ "alpine",
+ "winter"
+ ],
"moji": "🏂"
},
"snowflake": {
"unicode": "2744",
- "unicode_alternates": ["2744-FE0F"],
+ "unicode_alternates": [
+ "2744-FE0F"
+ ],
"name": "snowflake",
"shortname": ":snowflake:",
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["christmas", "cold", "season", "weather", "winter", "xmas", "snowflake", "snow", "frozen", "droplet", "ice", "crystal", "cold", "chilly", "winter", "unique", "special", "below zero", "elsa"],
+ "keywords": [
+ "christmas",
+ "cold",
+ "season",
+ "weather",
+ "winter",
+ "xmas",
+ "snowflake",
+ "snow",
+ "frozen",
+ "droplet",
+ "ice",
+ "crystal",
+ "cold",
+ "chilly",
+ "winter",
+ "unique",
+ "special",
+ "below zero",
+ "elsa"
+ ],
"moji": "❄"
},
"snowman": {
"unicode": "26C4",
- "unicode_alternates": ["26C4-FE0F"],
+ "unicode_alternates": [
+ "26C4-FE0F"
+ ],
"name": "snowman without snow",
"shortname": ":snowman:",
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["christmas", "cold", "season", "weather", "winter", "xmas"],
+ "keywords": [
+ "christmas",
+ "cold",
+ "season",
+ "weather",
+ "winter",
+ "xmas"
+ ],
"moji": "⛄"
},
+ "snowman2": {
+ "unicode": "2603",
+ "unicode_alternates": "",
+ "name": "snowman",
+ "shortname": ":snowman2:",
+ "category": "nature",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "cold",
+ "nature",
+ "snow",
+ "weather"
+ ]
+ },
"sob": {
"unicode": "1F62D",
"unicode_alternates": [],
@@ -11355,18 +25018,41 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["cry", "face", "sad", "tears", "upset", "cry", "sob", "tears", "sad", "melancholy", "morn", "somber", "hurt"],
+ "keywords": [
+ "cry",
+ "face",
+ "sad",
+ "tears",
+ "upset",
+ "cry",
+ "sob",
+ "tears",
+ "sad",
+ "melancholy",
+ "morn",
+ "somber",
+ "hurt"
+ ],
"moji": "😭"
},
"soccer": {
"unicode": "26BD",
- "unicode_alternates": ["26BD-FE0F"],
+ "unicode_alternates": [
+ "26BD-FE0F"
+ ],
"name": "soccer ball",
"shortname": ":soccer:",
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["balls", "fifa", "football", "sports", "european", "football"],
+ "keywords": [
+ "balls",
+ "fifa",
+ "football",
+ "sports",
+ "european",
+ "football"
+ ],
"moji": "⚽"
},
"soon": {
@@ -11377,7 +25063,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["arrow", "words"],
+ "keywords": [
+ "arrow",
+ "words"
+ ],
"moji": "🔜"
},
"sos": {
@@ -11388,7 +25077,12 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["emergency", "help", "red-square", "words"],
+ "keywords": [
+ "emergency",
+ "help",
+ "red-square",
+ "words"
+ ],
"moji": "🆘"
},
"sound": {
@@ -11399,7 +25093,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["speaker", "volume"],
+ "keywords": [
+ "speaker",
+ "volume"
+ ],
"moji": "🔉"
},
"space_invader": {
@@ -11410,18 +25107,26 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["arcade", "game"],
+ "keywords": [
+ "arcade",
+ "game"
+ ],
"moji": "👾"
},
"spades": {
"unicode": "2660",
- "unicode_alternates": ["2660-FE0F"],
+ "unicode_alternates": [
+ "2660-FE0F"
+ ],
"name": "black spade suit",
"shortname": ":spades:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["cards", "poker"],
+ "keywords": [
+ "cards",
+ "poker"
+ ],
"moji": "♠"
},
"spaghetti": {
@@ -11432,18 +25137,32 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["food", "italian", "noodle", "spaghetti", "noodles", "tomato", "sauce", "italian"],
+ "keywords": [
+ "food",
+ "italian",
+ "noodle",
+ "spaghetti",
+ "noodles",
+ "tomato",
+ "sauce",
+ "italian"
+ ],
"moji": "🍝"
},
"sparkle": {
"unicode": "2747",
- "unicode_alternates": ["2747-FE0F"],
+ "unicode_alternates": [
+ "2747-FE0F"
+ ],
"name": "sparkle",
"shortname": ":sparkle:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["green-square", "stars"],
+ "keywords": [
+ "green-square",
+ "stars"
+ ],
"moji": "❇"
},
"sparkler": {
@@ -11454,7 +25173,11 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["night", "shine", "stars"],
+ "keywords": [
+ "night",
+ "shine",
+ "stars"
+ ],
"moji": "🎇"
},
"sparkles": {
@@ -11465,7 +25188,12 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["cool", "shine", "shiny", "stars"],
+ "keywords": [
+ "cool",
+ "shine",
+ "shiny",
+ "stars"
+ ],
"moji": "✨"
},
"sparkling_heart": {
@@ -11476,7 +25204,12 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["affection", "like", "love", "valentines"],
+ "keywords": [
+ "affection",
+ "like",
+ "love",
+ "valentines"
+ ],
"moji": "💖"
},
"speak_no_evil": {
@@ -11487,7 +25220,19 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "monkey", "monkey", "mouth", "talk", "say", "words", "verbal", "verbalize", "oral", "iwazaru"],
+ "keywords": [
+ "animal",
+ "monkey",
+ "monkey",
+ "mouth",
+ "talk",
+ "say",
+ "words",
+ "verbal",
+ "verbalize",
+ "oral",
+ "iwazaru"
+ ],
"moji": "🙊"
},
"speaker": {
@@ -11498,7 +25243,12 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["sound", "listen", "hear", "noise"]
+ "keywords": [
+ "sound",
+ "listen",
+ "hear",
+ "noise"
+ ]
},
"speaking_head": {
"unicode": "1F5E3",
@@ -11506,9 +25256,13 @@
"name": "speaking head in silhouette",
"shortname": ":speaking_head:",
"category": "objects_symbols",
- "aliases": [":speaking_head_in_silhouette:"],
+ "aliases": [
+ ":speaking_head_in_silhouette:"
+ ],
"aliases_ascii": [],
- "keywords": ["talk"]
+ "keywords": [
+ "talk"
+ ]
},
"speech_balloon": {
"unicode": "1F4AC",
@@ -11518,7 +25272,17 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["bubble", "words", "speech", "balloon", "talk", "conversation", "communication", "comic", "dialogue"],
+ "keywords": [
+ "bubble",
+ "words",
+ "speech",
+ "balloon",
+ "talk",
+ "conversation",
+ "communication",
+ "comic",
+ "dialogue"
+ ],
"moji": "💬"
},
"speech_left": {
@@ -11527,9 +25291,19 @@
"name": "left speech bubble",
"shortname": ":speech_left:",
"category": "objects_symbols",
- "aliases": [":left_speech_bubble:"],
- "aliases_ascii": [],
- "keywords": ["balloon", "words", "talk", "conversation", "communication", "comic", "dialogue"]
+ "aliases": [
+ ":left_speech_bubble:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "balloon",
+ "words",
+ "talk",
+ "conversation",
+ "communication",
+ "comic",
+ "dialogue"
+ ]
},
"speech_right": {
"unicode": "1F5E9",
@@ -11537,9 +25311,19 @@
"name": "right speech bubble",
"shortname": ":speech_right:",
"category": "objects_symbols",
- "aliases": [":right_speech_bubble:"],
- "aliases_ascii": [],
- "keywords": ["balloon", "words", "talk", "conversation", "communication", "comic", "dialogue"]
+ "aliases": [
+ ":right_speech_bubble:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "balloon",
+ "words",
+ "talk",
+ "conversation",
+ "communication",
+ "comic",
+ "dialogue"
+ ]
},
"speech_three": {
"unicode": "1F5EB",
@@ -11547,9 +25331,19 @@
"name": "three speech bubbles",
"shortname": ":speech_three:",
"category": "objects_symbols",
- "aliases": [":three_speech_bubbles:"],
- "aliases_ascii": [],
- "keywords": ["balloon", "words", "talk", "conversation", "communication", "comic", "dialogue"]
+ "aliases": [
+ ":three_speech_bubbles:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "balloon",
+ "words",
+ "talk",
+ "conversation",
+ "communication",
+ "comic",
+ "dialogue"
+ ]
},
"speech_two": {
"unicode": "1F5EA",
@@ -11557,9 +25351,19 @@
"name": "two speech bubbles",
"shortname": ":speech_two:",
"category": "objects_symbols",
- "aliases": [":two_speech_bubbles:"],
- "aliases_ascii": [],
- "keywords": ["balloon", "words", "talk", "conversation", "communication", "comic", "dialogue"]
+ "aliases": [
+ ":two_speech_bubbles:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "balloon",
+ "words",
+ "talk",
+ "conversation",
+ "communication",
+ "comic",
+ "dialogue"
+ ]
},
"speedboat": {
"unicode": "1F6A4",
@@ -11569,7 +25373,16 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["ship", "transportation", "vehicle", "motor", "speed", "ski", "power", "boat"],
+ "keywords": [
+ "ship",
+ "transportation",
+ "vehicle",
+ "motor",
+ "speed",
+ "ski",
+ "power",
+ "boat"
+ ],
"moji": "🚤"
},
"spider": {
@@ -11580,7 +25393,10 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["arachnid", "eight-legged"]
+ "keywords": [
+ "arachnid",
+ "eight-legged"
+ ]
},
"spider_web": {
"unicode": "1F578",
@@ -11590,7 +25406,9 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["cobweb"]
+ "keywords": [
+ "cobweb"
+ ]
},
"spy": {
"unicode": "1F575",
@@ -11598,9 +25416,100 @@
"name": "sleuth or spy",
"shortname": ":spy:",
"category": "people",
- "aliases": [":sleuth_or_spy:"],
+ "aliases": [
+ ":sleuth_or_spy:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "pi",
+ "undercover",
+ "investigator"
+ ]
+ },
+ "spy_tone1": {
+ "unicode": "1F575-1F3FB",
+ "unicode_alternates": "",
+ "name": "sleuth or spy tone 1",
+ "shortname": ":spy_tone1:",
+ "category": "people",
+ "aliases": [
+ ":sleuth_or_spy_tone1:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "pi",
+ "undercover",
+ "investigator",
+ "person"
+ ]
+ },
+ "spy_tone2": {
+ "unicode": "1F575-1F3FC",
+ "unicode_alternates": "",
+ "name": "sleuth or spy tone 2",
+ "shortname": ":spy_tone2:",
+ "category": "people",
+ "aliases": [
+ ":sleuth_or_spy_tone2:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "pi",
+ "undercover",
+ "investigator",
+ "person"
+ ]
+ },
+ "spy_tone3": {
+ "unicode": "1F575-1F3FD",
+ "unicode_alternates": "",
+ "name": "sleuth or spy tone 3",
+ "shortname": ":spy_tone3:",
+ "category": "people",
+ "aliases": [
+ ":sleuth_or_spy_tone3:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "pi",
+ "undercover",
+ "investigator",
+ "person"
+ ]
+ },
+ "spy_tone4": {
+ "unicode": "1F575-1F3FE",
+ "unicode_alternates": "",
+ "name": "sleuth or spy tone 4",
+ "shortname": ":spy_tone4:",
+ "category": "people",
+ "aliases": [
+ ":sleuth_or_spy_tone4:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "pi",
+ "undercover",
+ "investigator",
+ "person"
+ ]
+ },
+ "spy_tone5": {
+ "unicode": "1F575-1F3FF",
+ "unicode_alternates": "",
+ "name": "sleuth or spy tone 5",
+ "shortname": ":spy_tone5:",
+ "category": "people",
+ "aliases": [
+ ":sleuth_or_spy_tone5:"
+ ],
"aliases_ascii": [],
- "keywords": ["pi", "undercover", "investigator"]
+ "keywords": [
+ "pi",
+ "undercover",
+ "investigator",
+ "person"
+ ]
},
"stadium": {
"unicode": "1F3DF",
@@ -11610,17 +25519,28 @@
"category": "travel_places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["sport", "event", "concert", "convention", "game"]
+ "keywords": [
+ "sport",
+ "event",
+ "concert",
+ "convention",
+ "game"
+ ]
},
"star": {
"unicode": "2B50",
- "unicode_alternates": ["2B50-FE0F"],
+ "unicode_alternates": [
+ "2B50-FE0F"
+ ],
"name": "white medium star",
"shortname": ":star:",
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["night", "yellow"],
+ "keywords": [
+ "night",
+ "yellow"
+ ],
"moji": "⭐"
},
"star2": {
@@ -11631,9 +25551,48 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["night", "sparkle", "glow", "glowing", "star", "five", "points", "classic"],
+ "keywords": [
+ "night",
+ "sparkle",
+ "glow",
+ "glowing",
+ "star",
+ "five",
+ "points",
+ "classic"
+ ],
"moji": "🌟"
},
+ "star_and_crescent": {
+ "unicode": "262A",
+ "unicode_alternates": "",
+ "name": "star and crescent",
+ "shortname": ":star_and_crescent:",
+ "category": "symbols",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "islam",
+ "muslim",
+ "religion",
+ "symbol"
+ ]
+ },
+ "star_of_david": {
+ "unicode": "2721",
+ "unicode_alternates": "",
+ "name": "star of david",
+ "shortname": ":star_of_david:",
+ "category": "symbols",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "jew",
+ "jewish",
+ "religion",
+ "symbol"
+ ]
+ },
"stars": {
"unicode": "1F320",
"unicode_alternates": [],
@@ -11642,7 +25601,17 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["night", "photo", "shooting", "shoot", "star", "sky", "night", "comet", "meteoroid"],
+ "keywords": [
+ "night",
+ "photo",
+ "shooting",
+ "shoot",
+ "star",
+ "sky",
+ "night",
+ "comet",
+ "meteoroid"
+ ],
"moji": "🌠"
},
"station": {
@@ -11653,7 +25622,14 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["public", "transportation", "vehicle", "station", "train", "subway"],
+ "keywords": [
+ "public",
+ "transportation",
+ "vehicle",
+ "station",
+ "train",
+ "subway"
+ ],
"moji": "🚉"
},
"statue_of_liberty": {
@@ -11664,7 +25640,10 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["american", "newyork"],
+ "keywords": [
+ "american",
+ "newyork"
+ ],
"moji": "🗽"
},
"steam_locomotive": {
@@ -11675,7 +25654,15 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["train", "transportation", "vehicle", "locomotive", "steam", "train", "engine"],
+ "keywords": [
+ "train",
+ "transportation",
+ "vehicle",
+ "locomotive",
+ "steam",
+ "train",
+ "engine"
+ ],
"moji": "🚂"
},
"stereo": {
@@ -11684,9 +25671,17 @@
"name": "portable stereo",
"shortname": ":stereo:",
"category": "objects_symbols",
- "aliases": [":portable_stereo:"],
- "aliases_ascii": [],
- "keywords": ["communication", "music", "program", "boom", "box"]
+ "aliases": [
+ ":portable_stereo:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "communication",
+ "music",
+ "program",
+ "boom",
+ "box"
+ ]
},
"stew": {
"unicode": "1F372",
@@ -11696,7 +25691,16 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["food", "meat", "stew", "hearty", "soup", "thick", "hot", "pot"],
+ "keywords": [
+ "food",
+ "meat",
+ "stew",
+ "hearty",
+ "soup",
+ "thick",
+ "hot",
+ "pot"
+ ],
"moji": "🍲"
},
"stock_chart": {
@@ -11707,7 +25711,39 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["graph", "presentation", "stats", "business"]
+ "keywords": [
+ "graph",
+ "presentation",
+ "stats",
+ "business"
+ ]
+ },
+ "stop_button": {
+ "unicode": "23F9",
+ "unicode_alternates": "",
+ "name": "black square for stop",
+ "shortname": ":stop_button:",
+ "category": "symbols",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "sound",
+ "symbol"
+ ]
+ },
+ "stopwatch": {
+ "unicode": "23F1",
+ "unicode_alternates": "",
+ "name": "stopwatch",
+ "shortname": ":stopwatch:",
+ "category": "objects",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "clock",
+ "object",
+ "time"
+ ]
},
"straight_ruler": {
"unicode": "1F4CF",
@@ -11717,7 +25753,9 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["stationery"],
+ "keywords": [
+ "stationery"
+ ],
"moji": "📏"
},
"strawberry": {
@@ -11728,7 +25766,15 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["food", "fruit", "nature", "strawberry", "short", "cake", "berry"],
+ "keywords": [
+ "food",
+ "fruit",
+ "nature",
+ "strawberry",
+ "short",
+ "cake",
+ "berry"
+ ],
"moji": "🍓"
},
"stuck_out_tongue": {
@@ -11738,8 +25784,32 @@
"shortname": ":stuck_out_tongue:",
"category": "emoticons",
"aliases": [],
- "aliases_ascii": [":P", ":-P", "=P", ":-p", ":p", "=p", ":-Þ", ":Þ", ":þ", ":-þ", ":-b", ":b", "d:"],
- "keywords": ["childish", "face", "mischievous", "playful", "prank", "tongue", "silly", "playful", "cheeky"],
+ "aliases_ascii": [
+ ":P",
+ ":-P",
+ "=P",
+ ":-p",
+ ":p",
+ "=p",
+ ":-Þ",
+ ":Þ",
+ ":þ",
+ ":-þ",
+ ":-b",
+ ":b",
+ "d:"
+ ],
+ "keywords": [
+ "childish",
+ "face",
+ "mischievous",
+ "playful",
+ "prank",
+ "tongue",
+ "silly",
+ "playful",
+ "cheeky"
+ ],
"moji": "😛"
},
"stuck_out_tongue_closed_eyes": {
@@ -11750,7 +25820,17 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["face", "mischievous", "playful", "prank", "tongue", "kidding", "silly", "playful", "ecstatic"],
+ "keywords": [
+ "face",
+ "mischievous",
+ "playful",
+ "prank",
+ "tongue",
+ "kidding",
+ "silly",
+ "playful",
+ "ecstatic"
+ ],
"moji": "😝"
},
"stuck_out_tongue_winking_eye": {
@@ -11760,8 +25840,25 @@
"shortname": ":stuck_out_tongue_winking_eye:",
"category": "emoticons",
"aliases": [],
- "aliases_ascii": [">:P", "X-P", "x-p"],
- "keywords": ["childish", "face", "mischievous", "playful", "prank", "tongue", "wink", "winking", "kidding", "silly", "playful", "crazy"],
+ "aliases_ascii": [
+ ">:P",
+ "X-P",
+ "x-p"
+ ],
+ "keywords": [
+ "childish",
+ "face",
+ "mischievous",
+ "playful",
+ "prank",
+ "tongue",
+ "wink",
+ "winking",
+ "kidding",
+ "silly",
+ "playful",
+ "crazy"
+ ],
"moji": "😜"
},
"sun_with_face": {
@@ -11772,7 +25869,13 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["morning", "sun", "anthropomorphic", "face", "sky"],
+ "keywords": [
+ "morning",
+ "sun",
+ "anthropomorphic",
+ "face",
+ "sky"
+ ],
"moji": "🌞"
},
"sunflower": {
@@ -11783,7 +25886,15 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["nature", "plant", "sunflower", "sun", "flower", "seeds", "yellow"],
+ "keywords": [
+ "nature",
+ "plant",
+ "sunflower",
+ "sun",
+ "flower",
+ "seeds",
+ "yellow"
+ ],
"moji": "🌻"
},
"sunglasses": {
@@ -11793,19 +25904,41 @@
"shortname": ":sunglasses:",
"category": "emoticons",
"aliases": [],
- "aliases_ascii": ["B-)", "B)", "8)", "8-)", "B-D", "8-D"],
- "keywords": ["cool", "face", "smiling", "sunglasses", "sun", "glasses", "sunny", "cool", "smooth"],
+ "aliases_ascii": [
+ "B-)",
+ "B)",
+ "8)",
+ "8-)",
+ "B-D",
+ "8-D"
+ ],
+ "keywords": [
+ "cool",
+ "face",
+ "smiling",
+ "sunglasses",
+ "sun",
+ "glasses",
+ "sunny",
+ "cool",
+ "smooth"
+ ],
"moji": "😎"
},
"sunny": {
"unicode": "2600",
- "unicode_alternates": ["2600-FE0F"],
+ "unicode_alternates": [
+ "2600-FE0F"
+ ],
"name": "black sun with rays",
"shortname": ":sunny:",
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["brightness", "weather"]
+ "keywords": [
+ "brightness",
+ "weather"
+ ]
},
"sunrise": {
"unicode": "1F305",
@@ -11815,7 +25948,17 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["morning", "photo", "vacation", "view", "sunrise", "sun", "morning", "color", "sky"],
+ "keywords": [
+ "morning",
+ "photo",
+ "vacation",
+ "view",
+ "sunrise",
+ "sun",
+ "morning",
+ "color",
+ "sky"
+ ],
"moji": "🌅"
},
"sunrise_over_mountains": {
@@ -11826,7 +25969,18 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["photo", "vacation", "view", "sunrise", "sun", "morning", "mountain", "rural", "color", "sky"],
+ "keywords": [
+ "photo",
+ "vacation",
+ "view",
+ "sunrise",
+ "sun",
+ "morning",
+ "mountain",
+ "rural",
+ "color",
+ "sky"
+ ],
"moji": "🌄"
},
"surfer": {
@@ -11837,9 +25991,114 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["ocean", "sea", "sports", "surfer", "surf", "wave", "ocean", "ride", "swell"],
+ "keywords": [
+ "ocean",
+ "sea",
+ "sports",
+ "surfer",
+ "surf",
+ "wave",
+ "ocean",
+ "ride",
+ "swell"
+ ],
"moji": "🏄"
},
+ "surfer_tone1": {
+ "unicode": "1F3C4-1F3FB",
+ "unicode_alternates": "",
+ "name": "surfer tone 1",
+ "shortname": ":surfer_tone1:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "ocean",
+ "sea",
+ "sport",
+ "surf",
+ "wave",
+ "ocean",
+ "ride",
+ "swell"
+ ]
+ },
+ "surfer_tone2": {
+ "unicode": "1F3C4-1F3FC",
+ "unicode_alternates": "",
+ "name": "surfer tone 2",
+ "shortname": ":surfer_tone2:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "ocean",
+ "sea",
+ "sport",
+ "surf",
+ "wave",
+ "ocean",
+ "ride",
+ "swell"
+ ]
+ },
+ "surfer_tone3": {
+ "unicode": "1F3C4-1F3FD",
+ "unicode_alternates": "",
+ "name": "surfer tone 3",
+ "shortname": ":surfer_tone3:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "ocean",
+ "sea",
+ "sport",
+ "surf",
+ "wave",
+ "ocean",
+ "ride",
+ "swell"
+ ]
+ },
+ "surfer_tone4": {
+ "unicode": "1F3C4-1F3FE",
+ "unicode_alternates": "",
+ "name": "surfer tone 4",
+ "shortname": ":surfer_tone4:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "ocean",
+ "sea",
+ "sport",
+ "surf",
+ "wave",
+ "ocean",
+ "ride",
+ "swell"
+ ]
+ },
+ "surfer_tone5": {
+ "unicode": "1F3C4-1F3FF",
+ "unicode_alternates": "",
+ "name": "surfer tone 5",
+ "shortname": ":surfer_tone5:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "ocean",
+ "sea",
+ "sport",
+ "surf",
+ "wave",
+ "ocean",
+ "ride",
+ "swell"
+ ]
+ },
"sushi": {
"unicode": "1F363",
"unicode_alternates": [],
@@ -11848,7 +26107,15 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["food", "japanese", "sushi", "fish", "raw", "nigiri", "japanese"],
+ "keywords": [
+ "food",
+ "japanese",
+ "sushi",
+ "fish",
+ "raw",
+ "nigiri",
+ "japanese"
+ ],
"moji": "🍣"
},
"suspension_railway": {
@@ -11859,7 +26126,15 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["transportation", "vehicle", "suspension", "railway", "rail", "train", "transportation"],
+ "keywords": [
+ "transportation",
+ "vehicle",
+ "suspension",
+ "railway",
+ "rail",
+ "train",
+ "transportation"
+ ],
"moji": "🚟"
},
"sweat": {
@@ -11869,8 +26144,22 @@
"shortname": ":sweat:",
"category": "emoticons",
"aliases": [],
- "aliases_ascii": ["':(", "':-(", "'=("],
- "keywords": ["cold", "sweat", "sick", "anxious", "worried", "clammy", "diaphoresis", "face", "hot"],
+ "aliases_ascii": [
+ "':(",
+ "':-(",
+ "'=("
+ ],
+ "keywords": [
+ "cold",
+ "sweat",
+ "sick",
+ "anxious",
+ "worried",
+ "clammy",
+ "diaphoresis",
+ "face",
+ "hot"
+ ],
"moji": "😓"
},
"sweat_drops": {
@@ -11881,7 +26170,9 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["water"],
+ "keywords": [
+ "water"
+ ],
"moji": "💦"
},
"sweat_smile": {
@@ -11891,8 +26182,23 @@
"shortname": ":sweat_smile:",
"category": "emoticons",
"aliases": [],
- "aliases_ascii": ["':)", "':-)", "'=)", "':D", "':-D", "'=D"],
- "keywords": ["face", "happy", "hot", "smiling", "cold", "sweat", "perspiration"],
+ "aliases_ascii": [
+ "':)",
+ "':-)",
+ "'=)",
+ "':D",
+ "':-D",
+ "'=D"
+ ],
+ "keywords": [
+ "face",
+ "happy",
+ "hot",
+ "smiling",
+ "cold",
+ "sweat",
+ "perspiration"
+ ],
"moji": "😅"
},
"sweet_potato": {
@@ -11903,7 +26209,15 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["food", "nature", "sweet", "potato", "potassium", "roasted", "roast"],
+ "keywords": [
+ "food",
+ "nature",
+ "sweet",
+ "potato",
+ "potassium",
+ "roasted",
+ "roast"
+ ],
"moji": "🍠"
},
"swimmer": {
@@ -11914,9 +26228,120 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["sports", "swimmer", "swim", "water", "pool", "laps", "freestyle", "butterfly", "breaststroke", "backstroke"],
+ "keywords": [
+ "sports",
+ "swimmer",
+ "swim",
+ "water",
+ "pool",
+ "laps",
+ "freestyle",
+ "butterfly",
+ "breaststroke",
+ "backstroke"
+ ],
"moji": "🏊"
},
+ "swimmer_tone1": {
+ "unicode": "1F3CA-1F3FB",
+ "unicode_alternates": "",
+ "name": "swimmer tone 1",
+ "shortname": ":swimmer_tone1:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "sport",
+ "swim",
+ "water",
+ "pool",
+ "laps",
+ "freestyle",
+ "butterfly",
+ "breaststroke",
+ "backstroke"
+ ]
+ },
+ "swimmer_tone2": {
+ "unicode": "1F3CA-1F3FC",
+ "unicode_alternates": "",
+ "name": "swimmer tone 2",
+ "shortname": ":swimmer_tone2:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "sport",
+ "swim",
+ "water",
+ "pool",
+ "laps",
+ "freestyle",
+ "butterfly",
+ "breaststroke",
+ "backstroke"
+ ]
+ },
+ "swimmer_tone3": {
+ "unicode": "1F3CA-1F3FD",
+ "unicode_alternates": "",
+ "name": "swimmer tone 3",
+ "shortname": ":swimmer_tone3:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "sport",
+ "swim",
+ "water",
+ "pool",
+ "laps",
+ "freestyle",
+ "butterfly",
+ "breaststroke",
+ "backstroke"
+ ]
+ },
+ "swimmer_tone4": {
+ "unicode": "1F3CA-1F3FE",
+ "unicode_alternates": "",
+ "name": "swimmer tone 4",
+ "shortname": ":swimmer_tone4:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "sport",
+ "swim",
+ "water",
+ "pool",
+ "laps",
+ "freestyle",
+ "butterfly",
+ "breaststroke",
+ "backstroke"
+ ]
+ },
+ "swimmer_tone5": {
+ "unicode": "1F3CA-1F3FF",
+ "unicode_alternates": "",
+ "name": "swimmer tone 5",
+ "shortname": ":swimmer_tone5:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "sport",
+ "swim",
+ "water",
+ "pool",
+ "laps",
+ "freestyle",
+ "butterfly",
+ "breaststroke",
+ "backstroke"
+ ]
+ },
"symbols": {
"unicode": "1F523",
"unicode_alternates": [],
@@ -11925,9 +26350,21 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue-square"],
+ "keywords": [
+ "blue-square"
+ ],
"moji": "🔣"
},
+ "synagogue": {
+ "unicode": "1F54D",
+ "unicode_alternates": "",
+ "name": "synagogue",
+ "shortname": ":synagogue:",
+ "category": "travel",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": []
+ },
"syringe": {
"unicode": "1F489",
"unicode_alternates": [],
@@ -11936,9 +26373,26 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blood", "drugs", "health", "hospital", "medicine", "needle"],
+ "keywords": [
+ "blood",
+ "drugs",
+ "health",
+ "hospital",
+ "medicine",
+ "needle"
+ ],
"moji": "💉"
},
+ "taco": {
+ "unicode": "1F32E",
+ "unicode_alternates": "",
+ "name": "taco",
+ "shortname": ":taco:",
+ "category": "foods",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": []
+ },
"tada": {
"unicode": "1F389",
"unicode_alternates": [],
@@ -11947,7 +26401,18 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["contulations", "party", "party", "popper", "tada", "celebration", "victory", "announcement", "climax", "congratulations"],
+ "keywords": [
+ "contulations",
+ "party",
+ "party",
+ "popper",
+ "tada",
+ "celebration",
+ "victory",
+ "announcement",
+ "climax",
+ "congratulations"
+ ],
"moji": "🎉"
},
"tanabata_tree": {
@@ -11958,7 +26423,16 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["nature", "plant", "tanabata", "tree", "festival", "star", "wish", "holiday"],
+ "keywords": [
+ "nature",
+ "plant",
+ "tanabata",
+ "tree",
+ "festival",
+ "star",
+ "wish",
+ "holiday"
+ ],
"moji": "🎋"
},
"tangerine": {
@@ -11969,18 +26443,40 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["food", "fruit", "nature", "tangerine", "citrus", "orange"],
+ "keywords": [
+ "food",
+ "fruit",
+ "nature",
+ "tangerine",
+ "citrus",
+ "orange"
+ ],
"moji": "🍊"
},
"taurus": {
"unicode": "2649",
- "unicode_alternates": ["2649-FE0F"],
+ "unicode_alternates": [
+ "2649-FE0F"
+ ],
"name": "taurus",
"shortname": ":taurus:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["purple-square", "sign", "taurus", "bull", "astrology", "greek", "constellation", "stars", "zodiac", "sign", "zodiac", "horoscope"],
+ "keywords": [
+ "purple-square",
+ "sign",
+ "taurus",
+ "bull",
+ "astrology",
+ "greek",
+ "constellation",
+ "stars",
+ "zodiac",
+ "sign",
+ "zodiac",
+ "horoscope"
+ ],
"moji": "♉"
},
"taxi": {
@@ -11991,7 +26487,18 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["cars", "transportation", "uber", "vehicle", "taxi", "car", "automobile", "city", "transport", "service"],
+ "keywords": [
+ "cars",
+ "transportation",
+ "uber",
+ "vehicle",
+ "taxi",
+ "car",
+ "automobile",
+ "city",
+ "transport",
+ "service"
+ ],
"moji": "🚕"
},
"tea": {
@@ -12002,18 +26509,36 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["bowl", "breakfast", "british", "drink", "green", "tea", "leaf", "drink", "teacup", "hot", "beverage"],
+ "keywords": [
+ "bowl",
+ "breakfast",
+ "british",
+ "drink",
+ "green",
+ "tea",
+ "leaf",
+ "drink",
+ "teacup",
+ "hot",
+ "beverage"
+ ],
"moji": "🍵"
},
"telephone": {
"unicode": "260E",
- "unicode_alternates": ["260E-FE0F"],
+ "unicode_alternates": [
+ "260E-FE0F"
+ ],
"name": "black telephone",
"shortname": ":telephone:",
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["communication", "dial", "technology"],
+ "keywords": [
+ "communication",
+ "dial",
+ "technology"
+ ],
"moji": "☎"
},
"telephone_black": {
@@ -12022,9 +26547,15 @@
"name": "black touchtone telephone",
"shortname": ":telephone_black:",
"category": "objects_symbols",
- "aliases": [":black_touchtone_telephone:"],
+ "aliases": [
+ ":black_touchtone_telephone:"
+ ],
"aliases_ascii": [],
- "keywords": ["communication", "dial", "technology"]
+ "keywords": [
+ "communication",
+ "dial",
+ "technology"
+ ]
},
"telephone_receiver": {
"unicode": "1F4DE",
@@ -12034,7 +26565,11 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["communication", "dial", "technology"],
+ "keywords": [
+ "communication",
+ "dial",
+ "technology"
+ ],
"moji": "📞"
},
"telephone_white": {
@@ -12043,9 +26578,15 @@
"name": "white touchtone telephone",
"shortname": ":telephone_white:",
"category": "objects_symbols",
- "aliases": [":white_touchtone_telephone:"],
+ "aliases": [
+ ":white_touchtone_telephone:"
+ ],
"aliases_ascii": [],
- "keywords": ["communication", "dial", "technology"]
+ "keywords": [
+ "communication",
+ "dial",
+ "technology"
+ ]
},
"telescope": {
"unicode": "1F52D",
@@ -12055,9 +26596,28 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["space", "stars"],
+ "keywords": [
+ "space",
+ "stars"
+ ],
"moji": "🔭"
},
+ "ten": {
+ "unicode": "1F51F",
+ "unicode_alternates": "",
+ "name": "keycap ten",
+ "shortname": ":ten:",
+ "category": "symbols",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "10",
+ "blue-square",
+ "numbers",
+ "symbol",
+ "word"
+ ]
+ },
"tennis": {
"unicode": "1F3BE",
"unicode_alternates": [],
@@ -12066,18 +26626,36 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["balls", "green", "sports", "tennis", "racket", "racquet", "ball", "game", "net", "court", "love"],
+ "keywords": [
+ "balls",
+ "green",
+ "sports",
+ "tennis",
+ "racket",
+ "racquet",
+ "ball",
+ "game",
+ "net",
+ "court",
+ "love"
+ ],
"moji": "🎾"
},
"tent": {
"unicode": "26FA",
- "unicode_alternates": ["26FA-FE0F"],
+ "unicode_alternates": [
+ "26FA-FE0F"
+ ],
"name": "tent",
"shortname": ":tent:",
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["camp", "outdoors", "photo"],
+ "keywords": [
+ "camp",
+ "outdoors",
+ "photo"
+ ],
"moji": "⛺"
},
"thermometer": {
@@ -12088,7 +26666,33 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["temperature"]
+ "keywords": [
+ "temperature"
+ ]
+ },
+ "thermometer_face": {
+ "unicode": "1F912",
+ "unicode_alternates": "",
+ "name": "face with thermometer",
+ "shortname": ":thermometer_face:",
+ "category": "people",
+ "aliases": [
+ ":face_with_thermometer:"
+ ],
+ "aliases_ascii": [],
+ "keywords": []
+ },
+ "thinking": {
+ "unicode": "1F914",
+ "unicode_alternates": "",
+ "name": "thinking face",
+ "shortname": ":thinking:",
+ "category": "people",
+ "aliases": [
+ ":thinking_face:"
+ ],
+ "aliases_ascii": [],
+ "keywords": []
},
"thought_balloon": {
"unicode": "1F4AD",
@@ -12098,7 +26702,17 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["bubble", "cloud", "speech", "thought", "balloon", "comic", "think", "day dream", "wonder"],
+ "keywords": [
+ "bubble",
+ "cloud",
+ "speech",
+ "thought",
+ "balloon",
+ "comic",
+ "think",
+ "day dream",
+ "wonder"
+ ],
"moji": "💭"
},
"thought_left": {
@@ -12107,9 +26721,18 @@
"name": "left thought bubble",
"shortname": ":thought_left:",
"category": "objects_symbols",
- "aliases": [":left_thought_bubble:"],
- "aliases_ascii": [],
- "keywords": ["balloon", "cloud", "comic", "think", "day dream", "wonder"]
+ "aliases": [
+ ":left_thought_bubble:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "balloon",
+ "cloud",
+ "comic",
+ "think",
+ "day dream",
+ "wonder"
+ ]
},
"thought_right": {
"unicode": "1F5ED",
@@ -12117,20 +26740,36 @@
"name": "right thought bubble",
"shortname": ":thought_right:",
"category": "objects_symbols",
- "aliases": [":right_thought_bubble:"],
- "aliases_ascii": [],
- "keywords": ["balloon", "cloud", "comic", "think", "day dream", "wonder"]
+ "aliases": [
+ ":right_thought_bubble:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "balloon",
+ "cloud",
+ "comic",
+ "think",
+ "day dream",
+ "wonder"
+ ]
},
"three": {
"moji": "3️⃣",
"unicode": "0033-20E3",
- "unicode_alternates": ["0033-FE0F-20E3"],
+ "unicode_alternates": [
+ "0033-FE0F-20E3"
+ ],
"name": "digit three",
"shortname": ":three:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["3", "blue-square", "numbers", "prime"]
+ "keywords": [
+ "3",
+ "blue-square",
+ "numbers",
+ "prime"
+ ]
},
"thumbs_down_reverse": {
"unicode": "1F593",
@@ -12138,9 +26777,15 @@
"name": "reversed thumbs down sign",
"shortname": ":thumbs_down_reverse:",
"category": "people",
- "aliases": [":reversed_thumbs_down_sign:"],
+ "aliases": [
+ ":reversed_thumbs_down_sign:"
+ ],
"aliases_ascii": [],
- "keywords": ["hand", "no", "-1"]
+ "keywords": [
+ "hand",
+ "no",
+ "-1"
+ ]
},
"thumbs_up_reverse": {
"unicode": "1F592",
@@ -12148,9 +26793,17 @@
"name": "reversed thumbs up sign",
"shortname": ":thumbs_up_reverse:",
"category": "people",
- "aliases": [":reversed_thumbs_up_sign:"],
- "aliases_ascii": [],
- "keywords": ["cool", "hand", "like", "yes", "+1"]
+ "aliases": [
+ ":reversed_thumbs_up_sign:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "cool",
+ "hand",
+ "like",
+ "yes",
+ "+1"
+ ]
},
"thumbsdown": {
"unicode": "1F44E",
@@ -12158,22 +26811,219 @@
"name": "thumbs down sign",
"shortname": ":thumbsdown:",
"category": "emoticons",
- "aliases": [":-1:"],
- "aliases_ascii": [],
- "keywords": ["hand", "no"],
+ "aliases": [
+ ":-1:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "hand",
+ "no"
+ ],
"moji": "👎"
},
+ "thumbsdown_tone1": {
+ "unicode": "1F44E-1F3FB",
+ "unicode_alternates": "",
+ "name": "thumbs down sign tone 1",
+ "shortname": ":thumbsdown_tone1:",
+ "category": "people",
+ "aliases": [
+ ":-1_tone1:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "hand",
+ "no",
+ "-1"
+ ]
+ },
+ "thumbsdown_tone2": {
+ "unicode": "1F44E-1F3FC",
+ "unicode_alternates": "",
+ "name": "thumbs down sign tone 2",
+ "shortname": ":thumbsdown_tone2:",
+ "category": "people",
+ "aliases": [
+ ":-1_tone2:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "hand",
+ "no",
+ "-1"
+ ]
+ },
+ "thumbsdown_tone3": {
+ "unicode": "1F44E-1F3FD",
+ "unicode_alternates": "",
+ "name": "thumbs down sign tone 3",
+ "shortname": ":thumbsdown_tone3:",
+ "category": "people",
+ "aliases": [
+ ":-1_tone3:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "hand",
+ "no",
+ "-1"
+ ]
+ },
+ "thumbsdown_tone4": {
+ "unicode": "1F44E-1F3FE",
+ "unicode_alternates": "",
+ "name": "thumbs down sign tone 4",
+ "shortname": ":thumbsdown_tone4:",
+ "category": "people",
+ "aliases": [
+ ":-1_tone4:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "hand",
+ "no",
+ "-1"
+ ]
+ },
+ "thumbsdown_tone5": {
+ "unicode": "1F44E-1F3FF",
+ "unicode_alternates": "",
+ "name": "thumbs down sign tone 5",
+ "shortname": ":thumbsdown_tone5:",
+ "category": "people",
+ "aliases": [
+ ":-1_tone5:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "hand",
+ "no",
+ "-1"
+ ]
+ },
"thumbsup": {
"unicode": "1F44D",
"unicode_alternates": [],
"name": "thumbs up sign",
"shortname": ":thumbsup:",
"category": "emoticons",
- "aliases": [":+1:"],
- "aliases_ascii": [],
- "keywords": ["cool", "hand", "like", "yes"],
+ "aliases": [
+ ":+1:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "cool",
+ "hand",
+ "like",
+ "yes"
+ ],
"moji": "👍"
},
+ "thumbsup_tone1": {
+ "unicode": "1F44D-1F3FB",
+ "unicode_alternates": "",
+ "name": "thumbs up sign tone 1",
+ "shortname": ":thumbsup_tone1:",
+ "category": "people",
+ "aliases": [
+ ":+1_tone1:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "cool",
+ "hand",
+ "like",
+ "yes",
+ "+1"
+ ]
+ },
+ "thumbsup_tone2": {
+ "unicode": "1F44D-1F3FC",
+ "unicode_alternates": "",
+ "name": "thumbs up sign tone 2",
+ "shortname": ":thumbsup_tone2:",
+ "category": "people",
+ "aliases": [
+ ":+1_tone2:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "cool",
+ "hand",
+ "like",
+ "yes",
+ "+1"
+ ]
+ },
+ "thumbsup_tone3": {
+ "unicode": "1F44D-1F3FD",
+ "unicode_alternates": "",
+ "name": "thumbs up sign tone 3",
+ "shortname": ":thumbsup_tone3:",
+ "category": "people",
+ "aliases": [
+ ":+1_tone3:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "cool",
+ "hand",
+ "like",
+ "yes",
+ "+1"
+ ]
+ },
+ "thumbsup_tone4": {
+ "unicode": "1F44D-1F3FE",
+ "unicode_alternates": "",
+ "name": "thumbs up sign tone 4",
+ "shortname": ":thumbsup_tone4:",
+ "category": "people",
+ "aliases": [
+ ":+1_tone4:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "cool",
+ "hand",
+ "like",
+ "yes",
+ "+1"
+ ]
+ },
+ "thumbsup_tone5": {
+ "unicode": "1F44D-1F3FF",
+ "unicode_alternates": "",
+ "name": "thumbs up sign tone 5",
+ "shortname": ":thumbsup_tone5:",
+ "category": "people",
+ "aliases": [
+ ":+1_tone5:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "cool",
+ "hand",
+ "like",
+ "yes",
+ "+1"
+ ]
+ },
+ "thunder_cloud_rain": {
+ "unicode": "26C8",
+ "unicode_alternates": "",
+ "name": "thunder cloud and rain",
+ "shortname": ":thunder_cloud_rain:",
+ "category": "nature",
+ "aliases": [
+ ":thunder_cloud_and_rain:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "nature",
+ "weather"
+ ]
+ },
"ticket": {
"unicode": "1F3AB",
"unicode_alternates": [],
@@ -12182,7 +27032,18 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["concert", "event", "pass", "ticket", "show", "entertainment", "stub", "admission", "proof", "purchase"],
+ "keywords": [
+ "concert",
+ "event",
+ "pass",
+ "ticket",
+ "show",
+ "entertainment",
+ "stub",
+ "admission",
+ "proof",
+ "purchase"
+ ],
"moji": "🎫"
},
"tickets": {
@@ -12191,9 +27052,20 @@
"name": "admission tickets",
"shortname": ":tickets:",
"category": "activity",
- "aliases": [":admission_tickets:"],
- "aliases_ascii": [],
- "keywords": ["concert", "event", "pass", "show", "entertainment", "stub", "proof", "purchase"]
+ "aliases": [
+ ":admission_tickets:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "concert",
+ "event",
+ "pass",
+ "show",
+ "entertainment",
+ "stub",
+ "proof",
+ "purchase"
+ ]
},
"tiger": {
"unicode": "1F42F",
@@ -12203,7 +27075,9 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal"],
+ "keywords": [
+ "animal"
+ ],
"moji": "🐯"
},
"tiger2": {
@@ -12214,9 +27088,33 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "nature", "tiger", "cat", "striped", "tony", "tigger", "hobs"],
+ "keywords": [
+ "animal",
+ "nature",
+ "tiger",
+ "cat",
+ "striped",
+ "tony",
+ "tigger",
+ "hobs"
+ ],
"moji": "🐅"
},
+ "timer": {
+ "unicode": "23F2",
+ "unicode_alternates": "",
+ "name": "timer clock",
+ "shortname": ":timer:",
+ "category": "objects",
+ "aliases": [
+ ":timer_clock:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "object",
+ "time"
+ ]
+ },
"tired_face": {
"unicode": "1F62B",
"unicode_alternates": [],
@@ -12225,9 +27123,34 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["face", "frustrated", "sick", "upset", "whine", "exhausted", "sleepy", "tired"],
+ "keywords": [
+ "face",
+ "frustrated",
+ "sick",
+ "upset",
+ "whine",
+ "exhausted",
+ "sleepy",
+ "tired"
+ ],
"moji": "😫"
},
+ "tm": {
+ "unicode": "2122",
+ "unicode_alternates": "2122-fe0f",
+ "name": "trade mark sign",
+ "shortname": ":tm:",
+ "category": "symbols",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "brand",
+ "trademark",
+ "symbol",
+ "tm",
+ "word"
+ ]
+ },
"toilet": {
"unicode": "1F6BD",
"unicode_alternates": [],
@@ -12236,7 +27159,17 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["restroom", "wc", "toilet", "bathroom", "throne", "porcelain", "waste", "flush", "plumbing"],
+ "keywords": [
+ "restroom",
+ "wc",
+ "toilet",
+ "bathroom",
+ "throne",
+ "porcelain",
+ "waste",
+ "flush",
+ "plumbing"
+ ],
"moji": "🚽"
},
"tokyo_tower": {
@@ -12247,7 +27180,10 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["japan", "photo"],
+ "keywords": [
+ "japan",
+ "photo"
+ ],
"moji": "🗼"
},
"tomato": {
@@ -12258,9 +27194,68 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["food", "fruit", "nature", "vegetable", "tomato", "fruit", "sauce", "italian"],
+ "keywords": [
+ "food",
+ "fruit",
+ "nature",
+ "vegetable",
+ "tomato",
+ "fruit",
+ "sauce",
+ "italian"
+ ],
"moji": "🍅"
},
+ "tone1": {
+ "unicode": "1F3FB",
+ "unicode_alternates": "",
+ "name": "emoji modifier Fitzpatrick type-1-2",
+ "shortname": ":tone1:",
+ "category": "modifier",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": []
+ },
+ "tone2": {
+ "unicode": "1F3FC",
+ "unicode_alternates": "",
+ "name": "emoji modifier Fitzpatrick type-3",
+ "shortname": ":tone2:",
+ "category": "modifier",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": []
+ },
+ "tone3": {
+ "unicode": "1F3FD",
+ "unicode_alternates": "",
+ "name": "emoji modifier Fitzpatrick type-4",
+ "shortname": ":tone3:",
+ "category": "modifier",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": []
+ },
+ "tone4": {
+ "unicode": "1F3FE",
+ "unicode_alternates": "",
+ "name": "emoji modifier Fitzpatrick type-5",
+ "shortname": ":tone4:",
+ "category": "modifier",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": []
+ },
+ "tone5": {
+ "unicode": "1F3FF",
+ "unicode_alternates": "",
+ "name": "emoji modifier Fitzpatrick type-6",
+ "shortname": ":tone5:",
+ "category": "modifier",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": []
+ },
"tongue": {
"unicode": "1F445",
"unicode_alternates": [],
@@ -12269,7 +27264,25 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["mouth", "playful", "tongue", "mouth", "taste", "buds", "food", "silly", "playful", "tease", "kiss", "french kiss", "lick", "tasty", "playfulness", "silliness", "intimacy"],
+ "keywords": [
+ "mouth",
+ "playful",
+ "tongue",
+ "mouth",
+ "taste",
+ "buds",
+ "food",
+ "silly",
+ "playful",
+ "tease",
+ "kiss",
+ "french kiss",
+ "lick",
+ "tasty",
+ "playfulness",
+ "silliness",
+ "intimacy"
+ ],
"moji": "👅"
},
"tools": {
@@ -12278,9 +27291,13 @@
"name": "hammer and wrench",
"shortname": ":tools:",
"category": "objects_symbols",
- "aliases": [":hammer_and_wrench:"],
+ "aliases": [
+ ":hammer_and_wrench:"
+ ],
"aliases_ascii": [],
- "keywords": ["tools"]
+ "keywords": [
+ "tools"
+ ]
},
"top": {
"unicode": "1F51D",
@@ -12290,7 +27307,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue-square", "words"],
+ "keywords": [
+ "blue-square",
+ "words"
+ ],
"moji": "🔝"
},
"tophat": {
@@ -12301,9 +27321,63 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["classy", "gentleman", "magic", "top", "hat", "cap", "beaver", "high", "tall", "stove", "pipe", "chimney", "topper", "london", "period piece", "magic", "magician"],
+ "keywords": [
+ "classy",
+ "gentleman",
+ "magic",
+ "top",
+ "hat",
+ "cap",
+ "beaver",
+ "high",
+ "tall",
+ "stove",
+ "pipe",
+ "chimney",
+ "topper",
+ "london",
+ "period piece",
+ "magic",
+ "magician"
+ ],
"moji": "🎩"
},
+ "track_next": {
+ "unicode": "23ED",
+ "unicode_alternates": "",
+ "name": "black right-pointing double triangle with vertical bar",
+ "shortname": ":track_next:",
+ "category": "symbols",
+ "aliases": [
+ ":next_track:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "arrow",
+ "next scene",
+ "next track",
+ "sound",
+ "symbol"
+ ]
+ },
+ "track_previous": {
+ "unicode": "23EE",
+ "unicode_alternates": "",
+ "name": "black left-pointing double triangle with vertical bar",
+ "shortname": ":track_previous:",
+ "category": "symbols",
+ "aliases": [
+ ":previous_track:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "arrow",
+ "previous scene",
+ "previous track",
+ "sound",
+ "symbol"
+ ]
+ },
"trackball": {
"unicode": "1F5B2",
"unicode_alternates": [],
@@ -12312,7 +27386,11 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["input", "device", "gadget"]
+ "keywords": [
+ "input",
+ "device",
+ "gadget"
+ ]
},
"tractor": {
"unicode": "1F69C",
@@ -12322,7 +27400,17 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["agriculture", "car", "farming", "vehicle", "tractor", "farm", "construction", "machine", "digger"],
+ "keywords": [
+ "agriculture",
+ "car",
+ "farming",
+ "vehicle",
+ "tractor",
+ "farm",
+ "construction",
+ "machine",
+ "digger"
+ ],
"moji": "🚜"
},
"traffic_light": {
@@ -12333,7 +27421,16 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["traffic", "transportation", "traffic", "light", "stop", "go", "yield", "horizontal"],
+ "keywords": [
+ "traffic",
+ "transportation",
+ "traffic",
+ "light",
+ "stop",
+ "go",
+ "yield",
+ "horizontal"
+ ],
"moji": "🚥"
},
"train": {
@@ -12344,7 +27441,10 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["tram", "rail"]
+ "keywords": [
+ "tram",
+ "rail"
+ ]
},
"train2": {
"unicode": "1F686",
@@ -12354,7 +27454,13 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["transportation", "vehicle", "train", "locomotive", "rail"],
+ "keywords": [
+ "transportation",
+ "vehicle",
+ "train",
+ "locomotive",
+ "rail"
+ ],
"moji": "🚆"
},
"train_diesel": {
@@ -12363,9 +27469,16 @@
"name": "diesel locomotive",
"shortname": ":train_diesel:",
"category": "travel_places",
- "aliases": [":diesel_locomotive:"],
+ "aliases": [
+ ":diesel_locomotive:"
+ ],
"aliases_ascii": [],
- "keywords": ["train", "transportation", "engine", "rail"]
+ "keywords": [
+ "train",
+ "transportation",
+ "engine",
+ "rail"
+ ]
},
"tram": {
"unicode": "1F68A",
@@ -12375,7 +27488,13 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["transportation", "vehicle", "tram", "transportation", "transport"],
+ "keywords": [
+ "transportation",
+ "vehicle",
+ "tram",
+ "transportation",
+ "transport"
+ ],
"moji": "🚊"
},
"triangle_round": {
@@ -12384,9 +27503,15 @@
"name": "triangle with rounded corners",
"shortname": ":triangle_round:",
"category": "objects_symbols",
- "aliases": [":triangle_with_rounded_corners:"],
+ "aliases": [
+ ":triangle_with_rounded_corners:"
+ ],
"aliases_ascii": [],
- "keywords": ["caution", "warning", "alert"]
+ "keywords": [
+ "caution",
+ "warning",
+ "alert"
+ ]
},
"triangular_flag_on_post": {
"unicode": "1F6A9",
@@ -12396,7 +27521,14 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["triangle", "triangular", "flag", "golf", "post", "flagpole"],
+ "keywords": [
+ "triangle",
+ "triangular",
+ "flag",
+ "golf",
+ "post",
+ "flagpole"
+ ],
"moji": "🚩"
},
"triangular_ruler": {
@@ -12407,7 +27539,12 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["architect", "math", "sketch", "stationery"],
+ "keywords": [
+ "architect",
+ "math",
+ "sketch",
+ "stationery"
+ ],
"moji": "📐"
},
"trident": {
@@ -12418,7 +27555,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["spear", "weapon"],
+ "keywords": [
+ "spear",
+ "weapon"
+ ],
"moji": "🔱"
},
"triumph": {
@@ -12429,7 +27569,14 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["face", "gas", "phew", "triumph", "steam", "breath"],
+ "keywords": [
+ "face",
+ "gas",
+ "phew",
+ "triumph",
+ "steam",
+ "breath"
+ ],
"moji": "😤"
},
"trolleybus": {
@@ -12440,7 +27587,16 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["bart", "transportation", "vehicle", "trolley", "bus", "city", "transport", "transportation"],
+ "keywords": [
+ "bart",
+ "transportation",
+ "vehicle",
+ "trolley",
+ "bus",
+ "city",
+ "transport",
+ "transportation"
+ ],
"moji": "🚎"
},
"trophy": {
@@ -12451,7 +27607,22 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["award", "ceremony", "contest", "ftw", "place", "win", "trophy", "first", "show", "place", "win", "reward", "achievement", "medal"],
+ "keywords": [
+ "award",
+ "ceremony",
+ "contest",
+ "ftw",
+ "place",
+ "win",
+ "trophy",
+ "first",
+ "show",
+ "place",
+ "win",
+ "reward",
+ "achievement",
+ "medal"
+ ],
"moji": "🏆"
},
"tropical_drink": {
@@ -12462,7 +27633,17 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["beverage", "tropical", "drink", "mixed", "pineapple", "coconut", "pina", "fruit", "umbrella"],
+ "keywords": [
+ "beverage",
+ "tropical",
+ "drink",
+ "mixed",
+ "pineapple",
+ "coconut",
+ "pina",
+ "fruit",
+ "umbrella"
+ ],
"moji": "🍹"
},
"tropical_fish": {
@@ -12473,7 +27654,10 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "swim"],
+ "keywords": [
+ "animal",
+ "swim"
+ ],
"moji": "🐠"
},
"truck": {
@@ -12484,7 +27668,13 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["cars", "transportation", "truck", "delivery", "package"],
+ "keywords": [
+ "cars",
+ "transportation",
+ "truck",
+ "delivery",
+ "package"
+ ],
"moji": "🚚"
},
"trumpet": {
@@ -12495,7 +27685,14 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["brass", "music", "trumpet", "brass", "music", "instrument"],
+ "keywords": [
+ "brass",
+ "music",
+ "trumpet",
+ "brass",
+ "music",
+ "instrument"
+ ],
"moji": "🎺"
},
"tulip": {
@@ -12506,18 +27703,42 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["flowers", "nature", "plant", "tulip", "flower", "bulb", "spring", "easter"],
+ "keywords": [
+ "flowers",
+ "nature",
+ "plant",
+ "tulip",
+ "flower",
+ "bulb",
+ "spring",
+ "easter"
+ ],
"moji": "🌷"
},
+ "turkey": {
+ "unicode": "1F983",
+ "unicode_alternates": "",
+ "name": "turkey",
+ "shortname": ":turkey:",
+ "category": "nature",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": []
+ },
"turned_ok_hand": {
"unicode": "1F58F",
"unicode_alternates": [],
"name": "turned ok hand sign",
"shortname": ":turned_ok_hand:",
"category": "people",
- "aliases": [":turned_ok_hand_sign:"],
+ "aliases": [
+ ":turned_ok_hand_sign:"
+ ],
"aliases_ascii": [],
- "keywords": ["perfect", "okay"]
+ "keywords": [
+ "perfect",
+ "okay"
+ ]
},
"turtle": {
"unicode": "1F422",
@@ -12527,9 +27748,39 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "slow", "turtle", "shell", "tortoise", "chelonian", "reptile", "slow", "snap", "steady"],
+ "keywords": [
+ "animal",
+ "slow",
+ "turtle",
+ "shell",
+ "tortoise",
+ "chelonian",
+ "reptile",
+ "slow",
+ "snap",
+ "steady"
+ ],
"moji": "🐢"
},
+ "tv": {
+ "unicode": "1F4FA",
+ "unicode_alternates": "",
+ "name": "television",
+ "shortname": ":tv:",
+ "category": "objects",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "oldschool",
+ "program",
+ "show",
+ "technology",
+ "tv",
+ "entertainment",
+ "object",
+ "video"
+ ]
+ },
"twisted_rightwards_arrows": {
"unicode": "1F500",
"unicode_alternates": [],
@@ -12538,19 +27789,28 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue-square"],
+ "keywords": [
+ "blue-square"
+ ],
"moji": "🔀"
},
"two": {
"moji": "2️⃣",
"unicode": "0032-20E3",
- "unicode_alternates": ["0032-FE0F-20E3"],
+ "unicode_alternates": [
+ "0032-FE0F-20E3"
+ ],
"name": "digit two",
"shortname": ":two:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["2", "blue-square", "numbers", "prime"]
+ "keywords": [
+ "2",
+ "blue-square",
+ "numbers",
+ "prime"
+ ]
},
"two_hearts": {
"unicode": "1F495",
@@ -12560,7 +27820,17 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["affection", "like", "love", "valentines", "heart", "hearts", "two", "love", "emotion"],
+ "keywords": [
+ "affection",
+ "like",
+ "love",
+ "valentines",
+ "heart",
+ "hearts",
+ "two",
+ "love",
+ "emotion"
+ ],
"moji": "💕"
},
"two_men_holding_hands": {
@@ -12571,7 +27841,21 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["bromance", "couple", "friends", "like", "love", "men", "gay", "homosexual", "friends", "hands", "holding", "team", "unity"],
+ "keywords": [
+ "bromance",
+ "couple",
+ "friends",
+ "like",
+ "love",
+ "men",
+ "gay",
+ "homosexual",
+ "friends",
+ "hands",
+ "holding",
+ "team",
+ "unity"
+ ],
"moji": "👬"
},
"two_women_holding_hands": {
@@ -12582,7 +27866,24 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["couple", "female", "friends", "like", "love", "women", "hands", "girlfriends", "friends", "sisters", "mother", "daughter", "gay", "homosexual", "couple", "unity"],
+ "keywords": [
+ "couple",
+ "female",
+ "friends",
+ "like",
+ "love",
+ "women",
+ "hands",
+ "girlfriends",
+ "friends",
+ "sisters",
+ "mother",
+ "daughter",
+ "gay",
+ "homosexual",
+ "couple",
+ "unity"
+ ],
"moji": "👭"
},
"u5272": {
@@ -12593,7 +27894,13 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["chinese", "cut", "divide", "kanji", "pink"],
+ "keywords": [
+ "chinese",
+ "cut",
+ "divide",
+ "kanji",
+ "pink"
+ ],
"moji": "🈹"
},
"u5408": {
@@ -12604,7 +27911,12 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["chinese", "japanese", "join", "kanji"],
+ "keywords": [
+ "chinese",
+ "japanese",
+ "join",
+ "kanji"
+ ],
"moji": "🈴"
},
"u55b6": {
@@ -12615,18 +27927,28 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["japanese", "opening hours"],
+ "keywords": [
+ "japanese",
+ "opening hours"
+ ],
"moji": "🈺"
},
"u6307": {
"unicode": "1F22F",
- "unicode_alternates": ["1F22F-FE0F"],
+ "unicode_alternates": [
+ "1F22F-FE0F"
+ ],
"name": "squared cjk unified ideograph-6307",
"shortname": ":u6307:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["chinese", "green-square", "kanji", "point"],
+ "keywords": [
+ "chinese",
+ "green-square",
+ "kanji",
+ "point"
+ ],
"moji": "🈯"
},
"u6708": {
@@ -12637,7 +27959,13 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["chinese", "japanese", "kanji", "moon", "orange-square"],
+ "keywords": [
+ "chinese",
+ "japanese",
+ "kanji",
+ "moon",
+ "orange-square"
+ ],
"moji": "🈷"
},
"u6709": {
@@ -12648,7 +27976,12 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["chinese", "have", "kanji", "orange-square"],
+ "keywords": [
+ "chinese",
+ "have",
+ "kanji",
+ "orange-square"
+ ],
"moji": "🈶"
},
"u6e80": {
@@ -12659,18 +27992,33 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["chinese", "full", "japanese", "kanji", "red-square"],
+ "keywords": [
+ "chinese",
+ "full",
+ "japanese",
+ "kanji",
+ "red-square"
+ ],
"moji": "🈵"
},
"u7121": {
"unicode": "1F21A",
- "unicode_alternates": ["1F21A-FE0F"],
+ "unicode_alternates": [
+ "1F21A-FE0F"
+ ],
"name": "squared cjk unified ideograph-7121",
"shortname": ":u7121:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["chinese", "japanese", "kanji", "no", "nothing", "orange-square"],
+ "keywords": [
+ "chinese",
+ "japanese",
+ "kanji",
+ "no",
+ "nothing",
+ "orange-square"
+ ],
"moji": "🈚"
},
"u7533": {
@@ -12681,7 +28029,11 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["chinese", "japanese", "kanji"],
+ "keywords": [
+ "chinese",
+ "japanese",
+ "kanji"
+ ],
"moji": "🈸"
},
"u7981": {
@@ -12692,7 +28044,14 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["chinese", "forbidden", "japanese", "kanji", "limit", "restricted"],
+ "keywords": [
+ "chinese",
+ "forbidden",
+ "japanese",
+ "kanji",
+ "limit",
+ "restricted"
+ ],
"moji": "🈲"
},
"u7a7a": {
@@ -12703,20 +28062,45 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["chinese", "empty", "japanese", "kanji"],
+ "keywords": [
+ "chinese",
+ "empty",
+ "japanese",
+ "kanji"
+ ],
"moji": "🈳"
},
"umbrella": {
"unicode": "2614",
- "unicode_alternates": ["2614-FE0F"],
+ "unicode_alternates": [
+ "2614-FE0F"
+ ],
"name": "umbrella with rain drops",
"shortname": ":umbrella:",
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["rain", "weather"],
+ "keywords": [
+ "rain",
+ "weather"
+ ],
"moji": "☔"
},
+ "umbrella2": {
+ "unicode": "2602",
+ "unicode_alternates": "",
+ "name": "umbrella",
+ "shortname": ":umbrella2:",
+ "category": "nature",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "clothing",
+ "nature",
+ "rain",
+ "weather"
+ ]
+ },
"unamused": {
"unicode": "1F612",
"unicode_alternates": [],
@@ -12725,7 +28109,19 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["bored", "face", "indifference", "serious", "straight face", "unamused", "not amused", "depressed", "unhappy", "disapprove", "lame"],
+ "keywords": [
+ "bored",
+ "face",
+ "indifference",
+ "serious",
+ "straight face",
+ "unamused",
+ "not amused",
+ "depressed",
+ "unhappy",
+ "disapprove",
+ "lame"
+ ],
"moji": "😒"
},
"underage": {
@@ -12736,9 +28132,26 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["18", "drink", "night", "pub"],
+ "keywords": [
+ "18",
+ "drink",
+ "night",
+ "pub"
+ ],
"moji": "🔞"
},
+ "unicorn": {
+ "unicode": "1F984",
+ "unicode_alternates": "",
+ "name": "unicorn face",
+ "shortname": ":unicorn:",
+ "category": "nature",
+ "aliases": [
+ ":unicorn_face:"
+ ],
+ "aliases_ascii": [],
+ "keywords": []
+ },
"unlock": {
"unicode": "1F513",
"unicode_alternates": [],
@@ -12747,7 +28160,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["privacy", "security"],
+ "keywords": [
+ "privacy",
+ "security"
+ ],
"moji": "🔓"
},
"up": {
@@ -12758,20 +28174,138 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue-square"],
+ "keywords": [
+ "blue-square"
+ ],
"moji": "🆙"
},
+ "upside_down": {
+ "unicode": "1F643",
+ "unicode_alternates": "",
+ "name": "upside-down face",
+ "shortname": ":upside_down:",
+ "category": "people",
+ "aliases": [
+ ":upside_down_face:"
+ ],
+ "aliases_ascii": [],
+ "keywords": []
+ },
+ "urn": {
+ "unicode": "26B1",
+ "unicode_alternates": "",
+ "name": "funeral urn",
+ "shortname": ":urn:",
+ "category": "objects",
+ "aliases": [
+ ":funeral_urn:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "death",
+ "object"
+ ]
+ },
"v": {
"unicode": "270C",
- "unicode_alternates": ["270C-FE0F"],
+ "unicode_alternates": [
+ "270C-FE0F"
+ ],
"name": "victory hand",
"shortname": ":v:",
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["fingers", "hand", "ohyeah", "peace", "two", "victory"],
+ "keywords": [
+ "fingers",
+ "hand",
+ "ohyeah",
+ "peace",
+ "two",
+ "victory"
+ ],
"moji": "✌"
},
+ "v_tone1": {
+ "unicode": "270C-1F3FB",
+ "unicode_alternates": "",
+ "name": "victory hand tone 1",
+ "shortname": ":v_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "fingers",
+ "ohyeah",
+ "peace",
+ "two",
+ "v"
+ ]
+ },
+ "v_tone2": {
+ "unicode": "270C-1F3FC",
+ "unicode_alternates": "",
+ "name": "victory hand tone 2",
+ "shortname": ":v_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "fingers",
+ "ohyeah",
+ "peace",
+ "two",
+ "v"
+ ]
+ },
+ "v_tone3": {
+ "unicode": "270C-1F3FD",
+ "unicode_alternates": "",
+ "name": "victory hand tone 3",
+ "shortname": ":v_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "fingers",
+ "ohyeah",
+ "peace",
+ "two",
+ "v"
+ ]
+ },
+ "v_tone4": {
+ "unicode": "270C-1F3FE",
+ "unicode_alternates": "",
+ "name": "victory hand tone 4",
+ "shortname": ":v_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "fingers",
+ "ohyeah",
+ "peace",
+ "two",
+ "v"
+ ]
+ },
+ "v_tone5": {
+ "unicode": "270C-1F3FF",
+ "unicode_alternates": "",
+ "name": "victory hand tone 5",
+ "shortname": ":v_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "fingers",
+ "ohyeah",
+ "peace",
+ "two",
+ "v"
+ ]
+ },
"vertical_traffic_light": {
"unicode": "1F6A6",
"unicode_alternates": [],
@@ -12780,7 +28314,15 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["transportation", "traffic", "light", "stop", "go", "yield", "vertical"],
+ "keywords": [
+ "transportation",
+ "traffic",
+ "light",
+ "stop",
+ "go",
+ "yield",
+ "vertical"
+ ],
"moji": "🚦"
},
"vhs": {
@@ -12791,7 +28333,11 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["oldschool", "record", "video"],
+ "keywords": [
+ "oldschool",
+ "record",
+ "video"
+ ],
"moji": "📼"
},
"vibration_mode": {
@@ -12802,7 +28348,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["orange-square", "phone"],
+ "keywords": [
+ "orange-square",
+ "phone"
+ ],
"moji": "📳"
},
"video_camera": {
@@ -12813,7 +28362,10 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["film", "record"],
+ "keywords": [
+ "film",
+ "record"
+ ],
"moji": "📹"
},
"video_game": {
@@ -12824,7 +28376,19 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["PS4", "console", "controller", "play", "video", "game", "console", "controller", "nintendo", "xbox", "playstation"],
+ "keywords": [
+ "PS4",
+ "console",
+ "controller",
+ "play",
+ "video",
+ "game",
+ "console",
+ "controller",
+ "nintendo",
+ "xbox",
+ "playstation"
+ ],
"moji": "🎮"
},
"violin": {
@@ -12835,18 +28399,39 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["instrument", "music", "violin", "fiddle", "music", "instrument"],
+ "keywords": [
+ "instrument",
+ "music",
+ "violin",
+ "fiddle",
+ "music",
+ "instrument"
+ ],
"moji": "🎻"
},
"virgo": {
"unicode": "264D",
- "unicode_alternates": ["264D-FE0F"],
+ "unicode_alternates": [
+ "264D-FE0F"
+ ],
"name": "virgo",
"shortname": ":virgo:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["sign", "virgo", "maiden", "astrology", "greek", "constellation", "stars", "zodiac", "sign", "zodiac", "horoscope"],
+ "keywords": [
+ "sign",
+ "virgo",
+ "maiden",
+ "astrology",
+ "greek",
+ "constellation",
+ "stars",
+ "zodiac",
+ "sign",
+ "zodiac",
+ "horoscope"
+ ],
"moji": "♍"
},
"volcano": {
@@ -12857,9 +28442,27 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["nature", "photo", "volcano", "lava", "magma", "hot", "explode"],
+ "keywords": [
+ "nature",
+ "photo",
+ "volcano",
+ "lava",
+ "magma",
+ "hot",
+ "explode"
+ ],
"moji": "🌋"
},
+ "volleyball": {
+ "unicode": "1F3D0",
+ "unicode_alternates": "",
+ "name": "volleyball",
+ "shortname": ":volleyball:",
+ "category": "activity",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": []
+ },
"vs": {
"unicode": "1F19A",
"unicode_alternates": [],
@@ -12868,7 +28471,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["orange-square", "words"],
+ "keywords": [
+ "orange-square",
+ "words"
+ ],
"moji": "🆚"
},
"vulcan": {
@@ -12877,9 +28483,113 @@
"name": "raised hand with part between middle and ring fingers",
"shortname": ":vulcan:",
"category": "people",
- "aliases": [":raised_hand_with_part_between_middle_and_ring_fingers:"],
- "aliases_ascii": [],
- "keywords": ["vulcan", "spock", "leonard", "nimoy", "star trek", "live long"]
+ "aliases": [
+ ":raised_hand_with_part_between_middle_and_ring_fingers:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "vulcan",
+ "spock",
+ "leonard",
+ "nimoy",
+ "star trek",
+ "live long"
+ ]
+ },
+ "vulcan_tone1": {
+ "unicode": "1F596-1F3FB",
+ "unicode_alternates": "",
+ "name": "raised hand with part between middle and ring fingers tone 1",
+ "shortname": ":vulcan_tone1:",
+ "category": "people",
+ "aliases": [
+ ":raised_hand_with_part_between_middle_and_ring_fingers_tone1:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "vulcan",
+ "spock",
+ "leonard",
+ "nimoy",
+ "star trek",
+ "live long"
+ ]
+ },
+ "vulcan_tone2": {
+ "unicode": "1F596-1F3FC",
+ "unicode_alternates": "",
+ "name": "raised hand with part between middle and ring fingers tone 2",
+ "shortname": ":vulcan_tone2:",
+ "category": "people",
+ "aliases": [
+ ":raised_hand_with_part_between_middle_and_ring_fingers_tone2:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "vulcan",
+ "spock",
+ "leonard",
+ "nimoy",
+ "star trek",
+ "live long"
+ ]
+ },
+ "vulcan_tone3": {
+ "unicode": "1F596-1F3FD",
+ "unicode_alternates": "",
+ "name": "raised hand with part between middle and ring fingers tone 3",
+ "shortname": ":vulcan_tone3:",
+ "category": "people",
+ "aliases": [
+ ":raised_hand_with_part_between_middle_and_ring_fingers_tone3:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "vulcan",
+ "spock",
+ "leonard",
+ "nimoy",
+ "star trek",
+ "live long"
+ ]
+ },
+ "vulcan_tone4": {
+ "unicode": "1F596-1F3FE",
+ "unicode_alternates": "",
+ "name": "raised hand with part between middle and ring fingers tone 4",
+ "shortname": ":vulcan_tone4:",
+ "category": "people",
+ "aliases": [
+ ":raised_hand_with_part_between_middle_and_ring_fingers_tone4:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "vulcan",
+ "spock",
+ "leonard",
+ "nimoy",
+ "star trek",
+ "live long"
+ ]
+ },
+ "vulcan_tone5": {
+ "unicode": "1F596-1F3FF",
+ "unicode_alternates": "",
+ "name": "raised hand with part between middle and ring fingers tone 5",
+ "shortname": ":vulcan_tone5:",
+ "category": "people",
+ "aliases": [
+ ":raised_hand_with_part_between_middle_and_ring_fingers_tone5:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "vulcan",
+ "spock",
+ "leonard",
+ "nimoy",
+ "star trek",
+ "live long"
+ ]
},
"walking": {
"unicode": "1F6B6",
@@ -12889,9 +28599,103 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["human", "man", "walk", "pedestrian", "stroll", "stride", "foot", "feet"],
+ "keywords": [
+ "human",
+ "man",
+ "walk",
+ "pedestrian",
+ "stroll",
+ "stride",
+ "foot",
+ "feet"
+ ],
"moji": "🚶"
},
+ "walking_tone1": {
+ "unicode": "1F6B6-1F3FB",
+ "unicode_alternates": "",
+ "name": "pedestrian tone 1",
+ "shortname": ":walking_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "man",
+ "walk",
+ "stroll",
+ "stride",
+ "hiking",
+ "hike"
+ ]
+ },
+ "walking_tone2": {
+ "unicode": "1F6B6-1F3FC",
+ "unicode_alternates": "",
+ "name": "pedestrian tone 2",
+ "shortname": ":walking_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "man",
+ "walk",
+ "stroll",
+ "stride",
+ "hiking",
+ "hike"
+ ]
+ },
+ "walking_tone3": {
+ "unicode": "1F6B6-1F3FD",
+ "unicode_alternates": "",
+ "name": "pedestrian tone 3",
+ "shortname": ":walking_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "man",
+ "walk",
+ "stroll",
+ "stride",
+ "hiking",
+ "hike"
+ ]
+ },
+ "walking_tone4": {
+ "unicode": "1F6B6-1F3FE",
+ "unicode_alternates": "",
+ "name": "pedestrian tone 4",
+ "shortname": ":walking_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "man",
+ "walk",
+ "stroll",
+ "stride",
+ "hiking",
+ "hike"
+ ]
+ },
+ "walking_tone5": {
+ "unicode": "1F6B6-1F3FF",
+ "unicode_alternates": "",
+ "name": "pedestrian tone 5",
+ "shortname": ":walking_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "man",
+ "walk",
+ "stroll",
+ "stride",
+ "hiking",
+ "hike"
+ ]
+ },
"waning_crescent_moon": {
"unicode": "1F318",
"unicode_alternates": [],
@@ -12900,7 +28704,16 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["nature", "moon", "crescent", "waning", "sky", "night", "cheese", "phase"],
+ "keywords": [
+ "nature",
+ "moon",
+ "crescent",
+ "waning",
+ "sky",
+ "night",
+ "cheese",
+ "phase"
+ ],
"moji": "🌘"
},
"waning_gibbous_moon": {
@@ -12911,18 +28724,32 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["nature", "moon", "waning", "gibbous", "sky", "night", "cheese", "phase"],
+ "keywords": [
+ "nature",
+ "moon",
+ "waning",
+ "gibbous",
+ "sky",
+ "night",
+ "cheese",
+ "phase"
+ ],
"moji": "🌖"
},
"warning": {
"unicode": "26A0",
- "unicode_alternates": ["26A0-FE0F"],
+ "unicode_alternates": [
+ "26A0-FE0F"
+ ],
"name": "warning sign",
"shortname": ":warning:",
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["exclamation", "wip"],
+ "keywords": [
+ "exclamation",
+ "wip"
+ ],
"moji": "⚠"
},
"wastebasket": {
@@ -12933,17 +28760,26 @@
"category": "objects_symbols",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["trash", "garbage", "dispose"]
+ "keywords": [
+ "trash",
+ "garbage",
+ "dispose"
+ ]
},
"watch": {
"unicode": "231A",
- "unicode_alternates": ["231A-FE0F"],
+ "unicode_alternates": [
+ "231A-FE0F"
+ ],
"name": "watch",
"shortname": ":watch:",
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["accessories", "time"],
+ "keywords": [
+ "accessories",
+ "time"
+ ],
"moji": "⌚"
},
"water_buffalo": {
@@ -12954,7 +28790,18 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "cow", "nature", "ox", "water", "buffalo", "asia", "bovine", "milk", "dairy"],
+ "keywords": [
+ "animal",
+ "cow",
+ "nature",
+ "ox",
+ "water",
+ "buffalo",
+ "asia",
+ "bovine",
+ "milk",
+ "dairy"
+ ],
"moji": "🐃"
},
"watermelon": {
@@ -12965,7 +28812,15 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["food", "fruit", "melon", "watermelon", "summer", "fruit", "large"],
+ "keywords": [
+ "food",
+ "fruit",
+ "melon",
+ "watermelon",
+ "summer",
+ "fruit",
+ "large"
+ ],
"moji": "🍉"
},
"wave": {
@@ -12976,9 +28831,100 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["farewell", "gesture", "goodbye", "hands", "solong"],
+ "keywords": [
+ "farewell",
+ "gesture",
+ "goodbye",
+ "hands",
+ "solong"
+ ],
"moji": "👋"
},
+ "wave_tone1": {
+ "unicode": "1F44B-1F3FB",
+ "unicode_alternates": "",
+ "name": "waving hand sign tone 1",
+ "shortname": ":wave_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "farewell",
+ "gesture",
+ "goodbye",
+ "solong",
+ "hi",
+ "wave"
+ ]
+ },
+ "wave_tone2": {
+ "unicode": "1F44B-1F3FC",
+ "unicode_alternates": "",
+ "name": "waving hand sign tone 2",
+ "shortname": ":wave_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "farewell",
+ "gesture",
+ "goodbye",
+ "solong",
+ "hi",
+ "wave"
+ ]
+ },
+ "wave_tone3": {
+ "unicode": "1F44B-1F3FD",
+ "unicode_alternates": "",
+ "name": "waving hand sign tone 3",
+ "shortname": ":wave_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "farewell",
+ "gesture",
+ "goodbye",
+ "solong",
+ "hi",
+ "wave"
+ ]
+ },
+ "wave_tone4": {
+ "unicode": "1F44B-1F3FE",
+ "unicode_alternates": "",
+ "name": "waving hand sign tone 4",
+ "shortname": ":wave_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "farewell",
+ "gesture",
+ "goodbye",
+ "solong",
+ "hi",
+ "wave"
+ ]
+ },
+ "wave_tone5": {
+ "unicode": "1F44B-1F3FF",
+ "unicode_alternates": "",
+ "name": "waving hand sign tone 5",
+ "shortname": ":wave_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "farewell",
+ "gesture",
+ "goodbye",
+ "solong",
+ "hi",
+ "wave"
+ ]
+ },
"wavy_dash": {
"unicode": "3030",
"unicode_alternates": [],
@@ -12987,7 +28933,10 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["draw", "line"],
+ "keywords": [
+ "draw",
+ "line"
+ ],
"moji": "〰"
},
"waxing_crescent_moon": {
@@ -12998,7 +28947,15 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["nature", "moon", "waxing", "sky", "night", "cheese", "phase"],
+ "keywords": [
+ "nature",
+ "moon",
+ "waxing",
+ "sky",
+ "night",
+ "cheese",
+ "phase"
+ ],
"moji": "🌒"
},
"waxing_gibbous_moon": {
@@ -13009,7 +28966,9 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["nature"],
+ "keywords": [
+ "nature"
+ ],
"moji": "🌔"
},
"wc": {
@@ -13020,7 +28979,20 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue-square", "restroom", "toilet", "water", "closet", "toilet", "bathroom", "throne", "porcelain", "waste", "flush", "plumbing"],
+ "keywords": [
+ "blue-square",
+ "restroom",
+ "toilet",
+ "water",
+ "closet",
+ "toilet",
+ "bathroom",
+ "throne",
+ "porcelain",
+ "waste",
+ "flush",
+ "plumbing"
+ ],
"moji": "🚾"
},
"weary": {
@@ -13031,7 +29003,21 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["face", "frustrated", "sad", "sleepy", "tired", "weary", "sleepy", "tired", "tiredness", "study", "finals", "school", "exhausted"],
+ "keywords": [
+ "face",
+ "frustrated",
+ "sad",
+ "sleepy",
+ "tired",
+ "weary",
+ "sleepy",
+ "tired",
+ "tiredness",
+ "study",
+ "finals",
+ "school",
+ "exhausted"
+ ],
"moji": "😩"
},
"wedding": {
@@ -13042,7 +29028,15 @@
"category": "places",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["affection", "bride", "couple", "groom", "like", "love", "marriage"],
+ "keywords": [
+ "affection",
+ "bride",
+ "couple",
+ "groom",
+ "like",
+ "love",
+ "marriage"
+ ],
"moji": "💒"
},
"whale": {
@@ -13053,7 +29047,12 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "nature", "ocean", "sea"],
+ "keywords": [
+ "animal",
+ "nature",
+ "ocean",
+ "sea"
+ ],
"moji": "🐳"
},
"whale2": {
@@ -13064,18 +29063,48 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "nature", "ocean", "sea", "whale", "blubber", "bloated", "fat", "large", "massive"],
+ "keywords": [
+ "animal",
+ "nature",
+ "ocean",
+ "sea",
+ "whale",
+ "blubber",
+ "bloated",
+ "fat",
+ "large",
+ "massive"
+ ],
"moji": "🐋"
},
+ "wheel_of_dharma": {
+ "unicode": "2638",
+ "unicode_alternates": "",
+ "name": "wheel of dharma",
+ "shortname": ":wheel_of_dharma:",
+ "category": "symbols",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "buddhist",
+ "religion",
+ "symbol"
+ ]
+ },
"wheelchair": {
"unicode": "267F",
- "unicode_alternates": ["267F-FE0F"],
+ "unicode_alternates": [
+ "267F-FE0F"
+ ],
"name": "wheelchair symbol",
"shortname": ":wheelchair:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue-square", "disabled"],
+ "keywords": [
+ "blue-square",
+ "disabled"
+ ],
"moji": "♿"
},
"white_check_mark": {
@@ -13086,18 +29115,26 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["agree", "green-square", "ok"],
+ "keywords": [
+ "agree",
+ "green-square",
+ "ok"
+ ],
"moji": "✅"
},
"white_circle": {
"unicode": "26AA",
- "unicode_alternates": ["26AA-FE0F"],
+ "unicode_alternates": [
+ "26AA-FE0F"
+ ],
"name": "medium white circle",
"shortname": ":white_circle:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["shape"],
+ "keywords": [
+ "shape"
+ ],
"moji": "⚪"
},
"white_flower": {
@@ -13108,51 +29145,81 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["japanese", "white", "flower", "teacher", "school", "grade", "score", "brilliance", "intelligence", "homework", "student", "assignment", "praise"],
+ "keywords": [
+ "japanese",
+ "white",
+ "flower",
+ "teacher",
+ "school",
+ "grade",
+ "score",
+ "brilliance",
+ "intelligence",
+ "homework",
+ "student",
+ "assignment",
+ "praise"
+ ],
"moji": "💮"
},
"white_large_square": {
"unicode": "2B1C",
- "unicode_alternates": ["2B1C-FE0F"],
+ "unicode_alternates": [
+ "2B1C-FE0F"
+ ],
"name": "white large square",
"shortname": ":white_large_square:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["shape"],
+ "keywords": [
+ "shape"
+ ],
"moji": "⬜"
},
"white_medium_small_square": {
"unicode": "25FD",
- "unicode_alternates": ["25FD-FE0F"],
+ "unicode_alternates": [
+ "25FD-FE0F"
+ ],
"name": "white medium small square",
"shortname": ":white_medium_small_square:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["shape"],
+ "keywords": [
+ "shape"
+ ],
"moji": "◽"
},
"white_medium_square": {
"unicode": "25FB",
- "unicode_alternates": ["25FB-FE0F"],
+ "unicode_alternates": [
+ "25FB-FE0F"
+ ],
"name": "white medium square",
"shortname": ":white_medium_square:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["shape"],
+ "keywords": [
+ "shape"
+ ],
"moji": "◻"
},
"white_small_square": {
"unicode": "25AB",
- "unicode_alternates": ["25AB-FE0F"],
+ "unicode_alternates": [
+ "25AB-FE0F"
+ ],
"name": "white small square",
"shortname": ":white_small_square:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["shape"],
+ "keywords": [
+ "shape"
+ ],
"moji": "▫"
},
"white_square_button": {
@@ -13163,9 +29230,56 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["shape"],
+ "keywords": [
+ "shape"
+ ],
"moji": "🔳"
},
+ "white_sun_cloud": {
+ "unicode": "1F325",
+ "unicode_alternates": "",
+ "name": "white sun behind cloud",
+ "shortname": ":white_sun_cloud:",
+ "category": "nature",
+ "aliases": [
+ ":white_sun_behind_cloud:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "nature",
+ "weather"
+ ]
+ },
+ "white_sun_rain_cloud": {
+ "unicode": "1F326",
+ "unicode_alternates": "",
+ "name": "white sun behind cloud with rain",
+ "shortname": ":white_sun_rain_cloud:",
+ "category": "nature",
+ "aliases": [
+ ":white_sun_behind_cloud_with_rain:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "nature",
+ "weather"
+ ]
+ },
+ "white_sun_small_cloud": {
+ "unicode": "1F324",
+ "unicode_alternates": "",
+ "name": "white sun with small cloud",
+ "shortname": ":white_sun_small_cloud:",
+ "category": "nature",
+ "aliases": [
+ ":white_sun_with_small_cloud:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "nature",
+ "weather"
+ ]
+ },
"wind_blowing_face": {
"unicode": "1F32C",
"unicode_alternates": [],
@@ -13174,7 +29288,10 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["mother", "nature"]
+ "keywords": [
+ "mother",
+ "nature"
+ ]
},
"wind_chime": {
"unicode": "1F390",
@@ -13184,7 +29301,21 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["ding", "nature", "wind", "chime", "bell", "fūrin", "instrument", "music", "spirits", "soothing", "protective", "spiritual", "sound"],
+ "keywords": [
+ "ding",
+ "nature",
+ "wind",
+ "chime",
+ "bell",
+ "fūrin",
+ "instrument",
+ "music",
+ "spirits",
+ "soothing",
+ "protective",
+ "spiritual",
+ "sound"
+ ],
"moji": "🎐"
},
"wine_glass": {
@@ -13195,7 +29326,20 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["alcohol", "beverage", "booze", "bottle", "drink", "drunk", "fermented", "glass", "grapes", "tasting", "wine", "winery"],
+ "keywords": [
+ "alcohol",
+ "beverage",
+ "booze",
+ "bottle",
+ "drink",
+ "drunk",
+ "fermented",
+ "glass",
+ "grapes",
+ "tasting",
+ "wine",
+ "winery"
+ ],
"moji": "🍷"
},
"wink": {
@@ -13205,8 +29349,26 @@
"shortname": ":wink:",
"category": "emoticons",
"aliases": [],
- "aliases_ascii": [";)", ";-)", "*-)", "*)", ";-]", ";]", ";D", ";^)"],
- "keywords": ["face", "happy", "mischievous", "secret", "wink", "winking", "friendly", "joke"],
+ "aliases_ascii": [
+ ";)",
+ ";-)",
+ "*-)",
+ "*)",
+ ";-]",
+ ";]",
+ ";D",
+ ";^)"
+ ],
+ "keywords": [
+ "face",
+ "happy",
+ "mischievous",
+ "secret",
+ "wink",
+ "winking",
+ "friendly",
+ "joke"
+ ],
"moji": "😉"
},
"wolf": {
@@ -13217,7 +29379,10 @@
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["animal", "nature"],
+ "keywords": [
+ "animal",
+ "nature"
+ ],
"moji": "🐺"
},
"woman": {
@@ -13228,9 +29393,82 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["female", "girls"],
+ "keywords": [
+ "female",
+ "girls"
+ ],
"moji": "👩"
},
+ "woman_tone1": {
+ "unicode": "1F469-1F3FB",
+ "unicode_alternates": "",
+ "name": "woman tone 1",
+ "shortname": ":woman_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "lady"
+ ]
+ },
+ "woman_tone2": {
+ "unicode": "1F469-1F3FC",
+ "unicode_alternates": "",
+ "name": "woman tone 2",
+ "shortname": ":woman_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "lady"
+ ]
+ },
+ "woman_tone3": {
+ "unicode": "1F469-1F3FD",
+ "unicode_alternates": "",
+ "name": "woman tone 3",
+ "shortname": ":woman_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "lady"
+ ]
+ },
+ "woman_tone4": {
+ "unicode": "1F469-1F3FE",
+ "unicode_alternates": "",
+ "name": "woman tone 4",
+ "shortname": ":woman_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "lady"
+ ]
+ },
+ "woman_tone5": {
+ "unicode": "1F469-1F3FF",
+ "unicode_alternates": "",
+ "name": "woman tone 5",
+ "shortname": ":woman_tone5:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "female",
+ "girl",
+ "lady"
+ ]
+ },
"womans_clothes": {
"unicode": "1F45A",
"unicode_alternates": [],
@@ -13239,7 +29477,21 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["fashion", "woman", "clothing", "clothes", "blouse", "shirt", "wardrobe", "breasts", "cleavage", "shopping", "shop", "dressing", "dressed"],
+ "keywords": [
+ "fashion",
+ "woman",
+ "clothing",
+ "clothes",
+ "blouse",
+ "shirt",
+ "wardrobe",
+ "breasts",
+ "cleavage",
+ "shopping",
+ "shop",
+ "dressing",
+ "dressed"
+ ],
"moji": "👚"
},
"womans_hat": {
@@ -13250,7 +29502,11 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["accessories", "fashion", "female"],
+ "keywords": [
+ "accessories",
+ "fashion",
+ "female"
+ ],
"moji": "👒"
},
"womens": {
@@ -13261,7 +29517,16 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["purple-square", "woman", "bathroom", "restroom", "sign", "girl", "female", "avatar"],
+ "keywords": [
+ "purple-square",
+ "woman",
+ "bathroom",
+ "restroom",
+ "sign",
+ "girl",
+ "female",
+ "avatar"
+ ],
"moji": "🚺"
},
"worried": {
@@ -13272,7 +29537,16 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["concern", "face", "nervous", "worried", "anxious", "distressed", "nervous", "tense"],
+ "keywords": [
+ "concern",
+ "face",
+ "nervous",
+ "worried",
+ "anxious",
+ "distressed",
+ "nervous",
+ "tense"
+ ],
"moji": "😟"
},
"wrench": {
@@ -13283,7 +29557,11 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["diy", "ikea", "tools"],
+ "keywords": [
+ "diy",
+ "ikea",
+ "tools"
+ ],
"moji": "🔧"
},
"writing_hand": {
@@ -13292,9 +29570,91 @@
"name": "left writing hand",
"shortname": ":writing_hand:",
"category": "people",
- "aliases": [":left_writing_hand:"],
+ "aliases": [
+ ":left_writing_hand:"
+ ],
+ "aliases_ascii": [],
+ "keywords": [
+ "write",
+ "sign",
+ "signature",
+ "draw"
+ ]
+ },
+ "writing_hand_tone1": {
+ "unicode": "270D-1F3FB",
+ "unicode_alternates": "",
+ "name": "writing hand tone 1",
+ "shortname": ":writing_hand_tone1:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "write",
+ "sign",
+ "signature",
+ "draw"
+ ]
+ },
+ "writing_hand_tone2": {
+ "unicode": "270D-1F3FC",
+ "unicode_alternates": "",
+ "name": "writing hand tone 2",
+ "shortname": ":writing_hand_tone2:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "write",
+ "sign",
+ "signature",
+ "draw"
+ ]
+ },
+ "writing_hand_tone3": {
+ "unicode": "270D-1F3FD",
+ "unicode_alternates": "",
+ "name": "writing hand tone 3",
+ "shortname": ":writing_hand_tone3:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "write",
+ "sign",
+ "signature",
+ "draw"
+ ]
+ },
+ "writing_hand_tone4": {
+ "unicode": "270D-1F3FE",
+ "unicode_alternates": "",
+ "name": "writing hand tone 4",
+ "shortname": ":writing_hand_tone4:",
+ "category": "people",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "write",
+ "sign",
+ "signature",
+ "draw"
+ ]
+ },
+ "writing_hand_tone5": {
+ "unicode": "270D-1F3FF",
+ "unicode_alternates": "",
+ "name": "writing hand tone 5",
+ "shortname": ":writing_hand_tone5:",
+ "category": "people",
+ "aliases": [],
"aliases_ascii": [],
- "keywords": ["write", "sign", "signature", "draw"]
+ "keywords": [
+ "write",
+ "sign",
+ "signature",
+ "draw"
+ ]
},
"x": {
"unicode": "274C",
@@ -13304,7 +29664,11 @@
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["delete", "no", "remove"],
+ "keywords": [
+ "delete",
+ "no",
+ "remove"
+ ],
"moji": "❌"
},
"yellow_heart": {
@@ -13315,7 +29679,25 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["affection", "like", "love", "valentines", "yellow", "gold", "heart", "love", "friendship", "happy", "happiness", "trust", "compassionate", "respectful", "honest", "caring", "selfless"],
+ "keywords": [
+ "affection",
+ "like",
+ "love",
+ "valentines",
+ "yellow",
+ "gold",
+ "heart",
+ "love",
+ "friendship",
+ "happy",
+ "happiness",
+ "trust",
+ "compassionate",
+ "respectful",
+ "honest",
+ "caring",
+ "selfless"
+ ],
"moji": "💛"
},
"yen": {
@@ -13326,9 +29708,39 @@
"category": "objects",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["currency", "dollar", "japanese", "money", "yen", "japan", "japanese", "banknote", "money", "currency", "paper", "cash", "bill"],
+ "keywords": [
+ "currency",
+ "dollar",
+ "japanese",
+ "money",
+ "yen",
+ "japan",
+ "japanese",
+ "banknote",
+ "money",
+ "currency",
+ "paper",
+ "cash",
+ "bill"
+ ],
"moji": "💴"
},
+ "yin_yang": {
+ "unicode": "262F",
+ "unicode_alternates": "",
+ "name": "yin yang",
+ "shortname": ":yin_yang:",
+ "category": "symbols",
+ "aliases": [],
+ "aliases_ascii": [],
+ "keywords": [
+ "religion",
+ "sign",
+ "symbol",
+ "tao",
+ "taoist"
+ ]
+ },
"yum": {
"unicode": "1F60B",
"unicode_alternates": [],
@@ -13337,30 +29749,68 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["face", "happy", "joy", "smile", "tongue", "delicious", "savoring", "food", "eat", "yummy", "yum", "tasty", "savory"],
+ "keywords": [
+ "face",
+ "happy",
+ "joy",
+ "smile",
+ "tongue",
+ "delicious",
+ "savoring",
+ "food",
+ "eat",
+ "yummy",
+ "yum",
+ "tasty",
+ "savory"
+ ],
"moji": "😋"
},
"zap": {
"unicode": "26A1",
- "unicode_alternates": ["26A1-FE0F"],
+ "unicode_alternates": [
+ "26A1-FE0F"
+ ],
"name": "high voltage sign",
"shortname": ":zap:",
"category": "nature",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["lightning bolt", "thunder", "weather"],
+ "keywords": [
+ "lightning bolt",
+ "thunder",
+ "weather"
+ ],
"moji": "⚡"
},
"zero": {
"moji": "0️⃣",
"unicode": "0030-20E3",
- "unicode_alternates": ["0030-FE0F-20E3"],
+ "unicode_alternates": [
+ "0030-FE0F-20E3"
+ ],
"name": "digit zero",
"shortname": ":zero:",
"category": "other",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["blue-square", "null", "numbers"]
+ "keywords": [
+ "blue-square",
+ "null",
+ "numbers"
+ ]
+ },
+ "zipper_mouth": {
+ "unicode": "1F910",
+ "unicode_alternates": "",
+ "name": "zipper-mouth face",
+ "shortname": ":zipper_mouth:",
+ "category": "people",
+ "aliases": [
+ ":zipper_mouth_face:"
+ ],
+ "aliases_ascii": [],
+ "keywords": []
},
"zzz": {
"unicode": "1F4A4",
@@ -13370,7 +29820,10 @@
"category": "emoticons",
"aliases": [],
"aliases_ascii": [],
- "keywords": ["sleepy", "tired"],
+ "keywords": [
+ "sleepy",
+ "tired"
+ ],
"moji": "💤"
}
}
diff --git a/lib/api/api.rb b/lib/api/api.rb
index 7efe0a0262f..7d65145176b 100644
--- a/lib/api/api.rb
+++ b/lib/api/api.rb
@@ -56,5 +56,6 @@ module API
mount Triggers
mount Builds
mount Variables
+ mount Runners
end
end
diff --git a/lib/api/builds.rb b/lib/api/builds.rb
index a8bd3842ce4..2b104f90aa7 100644
--- a/lib/api/builds.rb
+++ b/lib/api/builds.rb
@@ -60,6 +60,30 @@ module API
user_can_download_artifacts: can?(current_user, :read_build, user_project)
end
+ # Download the artifacts file from build
+ #
+ # Parameters:
+ # id (required) - The ID of a build
+ # token (required) - The build authorization token
+ # Example Request:
+ # GET /projects/:id/builds/:build_id/artifacts
+ get ':id/builds/:build_id/artifacts' do
+ authorize_read_builds!
+
+ build = get_build(params[:build_id])
+ return not_found!(build) unless build
+
+ artifacts_file = build.artifacts_file
+
+ unless artifacts_file.file_storage?
+ return redirect_to build.artifacts_file.url
+ end
+
+ return not_found! unless artifacts_file.exists?
+
+ present_file!(artifacts_file.path, artifacts_file.filename)
+ end
+
# Get a trace of a specific build of a project
#
# Parameters:
@@ -115,13 +139,33 @@ module API
authorize_update_builds!
build = get_build(params[:build_id])
- return forbidden!('Build is not retryable') unless build && build.retryable?
+ return not_found!(build) unless build
+ return forbidden!('Build is not retryable') unless build.retryable?
build = Ci::Build.retry(build)
present build, with: Entities::Build,
user_can_download_artifacts: can?(current_user, :read_build, user_project)
end
+
+ # Erase build (remove artifacts and build trace)
+ #
+ # Parameters:
+ # id (required) - the id of a project
+ # build_id (required) - the id of a build
+ # example Request:
+ # post /projects/:id/build/:build_id/erase
+ post ':id/builds/:build_id/erase' do
+ authorize_update_builds!
+
+ build = get_build(params[:build_id])
+ return not_found!(build) unless build
+ return forbidden!('Build is not erasable!') unless build.erasable?
+
+ build.erase(erased_by: current_user)
+ present build, with: Entities::Build,
+ user_can_download_artifacts: can?(current_user, :download_build_artifacts, user_project)
+ end
end
helpers do
diff --git a/lib/api/entities.rb b/lib/api/entities.rb
index a9c09ffdb31..a3b5f1eb8d3 100644
--- a/lib/api/entities.rb
+++ b/lib/api/entities.rb
@@ -49,7 +49,7 @@ module API
expose :enable_ssl_verification
end
- class ForkedFromProject < Grape::Entity
+ class BasicProjectDetails < Grape::Entity
expose :id
expose :name, :name_with_namespace
expose :path, :path_with_namespace
@@ -67,7 +67,7 @@ module API
expose :shared_runners_enabled
expose :creator_id
expose :namespace
- expose :forked_from_project, using: Entities::ForkedFromProject, if: lambda{ |project, options| project.forked? }
+ expose :forked_from_project, using: Entities::BasicProjectDetails, if: lambda{ |project, options| project.forked? }
expose :avatar_url
expose :star_count, :forks_count
expose :open_issues_count, if: lambda { |project, options| project.issues_enabled? && project.default_issues_tracker? }
@@ -377,6 +377,24 @@ module API
expose :name
end
+ class RunnerDetails < Runner
+ expose :tag_list
+ expose :version, :revision, :platform, :architecture
+ expose :contacted_at
+ expose :token, if: lambda { |runner, options| options[:current_user].is_admin? || !runner.is_shared? }
+ expose :projects, with: Entities::BasicProjectDetails do |runner, options|
+ if options[:current_user].is_admin?
+ runner.projects
+ else
+ options[:current_user].authorized_projects.where(id: runner.projects)
+ end
+ end
+ end
+
+ class BuildArtifactFile < Grape::Entity
+ expose :filename, :size
+ end
+
class Build < Grape::Entity
expose :id, :status, :stage, :name, :ref, :tag, :coverage
expose :created_at, :started_at, :finished_at
@@ -388,6 +406,7 @@ module API
repo_obj.artifacts_download_url
end
end
+ expose :artifacts_file, using: BuildArtifactFile, if: -> (build, opts) { build.artifacts? }
expose :commit, with: RepoCommit do |repo_obj, _options|
if repo_obj.respond_to?(:commit)
repo_obj.commit.commit_data
diff --git a/lib/api/repositories.rb b/lib/api/repositories.rb
index c95d2d2001d..0d0f0d4616d 100644
--- a/lib/api/repositories.rb
+++ b/lib/api/repositories.rb
@@ -98,11 +98,8 @@ module API
authorize! :download_code, user_project
begin
- ArchiveRepositoryService.new(
- user_project,
- params[:sha],
- params[:format]
- ).execute
+ RepositoryArchiveCacheWorker.perform_async
+ header *Gitlab::Workhorse.send_git_archive(user_project, params[:sha], params[:format])
rescue
not_found!('File')
end
diff --git a/lib/api/runners.rb b/lib/api/runners.rb
new file mode 100644
index 00000000000..8ec91485b26
--- /dev/null
+++ b/lib/api/runners.rb
@@ -0,0 +1,175 @@
+module API
+ # Runners API
+ class Runners < Grape::API
+ before { authenticate! }
+
+ resource :runners do
+ # Get runners available for user
+ #
+ # Example Request:
+ # GET /runners
+ get do
+ runners = filter_runners(current_user.ci_authorized_runners, params[:scope], without: ['specific', 'shared'])
+ present paginate(runners), with: Entities::Runner
+ end
+
+ # Get all runners - shared and specific
+ #
+ # Example Request:
+ # GET /runners/all
+ get 'all' do
+ authenticated_as_admin!
+ runners = filter_runners(Ci::Runner.all, params[:scope])
+ present paginate(runners), with: Entities::Runner
+ end
+
+ # Get runner's details
+ #
+ # Parameters:
+ # id (required) - The ID of ther runner
+ # Example Request:
+ # GET /runners/:id
+ get ':id' do
+ runner = get_runner(params[:id])
+ authenticate_show_runner!(runner)
+
+ present runner, with: Entities::RunnerDetails, current_user: current_user
+ end
+
+ # Update runner's details
+ #
+ # Parameters:
+ # id (required) - The ID of ther runner
+ # description (optional) - Runner's description
+ # active (optional) - Runner's status
+ # tag_list (optional) - Array of tags for runner
+ # Example Request:
+ # PUT /runners/:id
+ put ':id' do
+ runner = get_runner(params[:id])
+ authenticate_update_runner!(runner)
+
+ attrs = attributes_for_keys [:description, :active, :tag_list]
+ if runner.update(attrs)
+ present runner, with: Entities::RunnerDetails, current_user: current_user
+ else
+ render_validation_error!(runner)
+ end
+ end
+
+ # Remove runner
+ #
+ # Parameters:
+ # id (required) - The ID of ther runner
+ # Example Request:
+ # DELETE /runners/:id
+ delete ':id' do
+ runner = get_runner(params[:id])
+ authenticate_delete_runner!(runner)
+ runner.destroy!
+
+ present runner, with: Entities::Runner
+ end
+ end
+
+ resource :projects do
+ before { authorize_admin_project }
+
+ # Get runners available for project
+ #
+ # Example Request:
+ # GET /projects/:id/runners
+ get ':id/runners' do
+ runners = filter_runners(Ci::Runner.owned_or_shared(user_project.id), params[:scope])
+ present paginate(runners), with: Entities::Runner
+ end
+
+ # Enable runner for project
+ #
+ # Parameters:
+ # id (required) - The ID of the project
+ # runner_id (required) - The ID of the runner
+ # Example Request:
+ # POST /projects/:id/runners/:runner_id
+ post ':id/runners' do
+ required_attributes! [:runner_id]
+
+ runner = get_runner(params[:runner_id])
+ authenticate_enable_runner!(runner)
+ Ci::RunnerProject.create(runner: runner, project: user_project)
+
+ present runner, with: Entities::Runner
+ end
+
+ # Disable project's runner
+ #
+ # Parameters:
+ # id (required) - The ID of the project
+ # runner_id (required) - The ID of the runner
+ # Example Request:
+ # DELETE /projects/:id/runners/:runner_id
+ delete ':id/runners/:runner_id' do
+ runner_project = user_project.runner_projects.find_by(runner_id: params[:runner_id])
+ not_found!('Runner') unless runner_project
+
+ runner = runner_project.runner
+ forbidden!("Only one project associated with the runner. Please remove the runner instead") if runner.projects.count == 1
+
+ runner_project.destroy
+
+ present runner, with: Entities::Runner
+ end
+ end
+
+ helpers do
+ def filter_runners(runners, scope, options = {})
+ return runners unless scope.present?
+
+ available_scopes = ::Ci::Runner::AVAILABLE_SCOPES
+ if options[:without]
+ available_scopes = available_scopes - options[:without]
+ end
+
+ if (available_scopes & [scope]).empty?
+ render_api_error!('Scope contains invalid value', 400)
+ end
+
+ runners.send(scope)
+ end
+
+ def get_runner(id)
+ runner = Ci::Runner.find(id)
+ not_found!('Runner') unless runner
+ runner
+ end
+
+ def authenticate_show_runner!(runner)
+ return if runner.is_shared || current_user.is_admin?
+ forbidden!("No access granted") unless user_can_access_runner?(runner)
+ end
+
+ def authenticate_update_runner!(runner)
+ return if current_user.is_admin?
+ forbidden!("Runner is shared") if runner.is_shared?
+ forbidden!("No access granted") unless user_can_access_runner?(runner)
+ end
+
+ def authenticate_delete_runner!(runner)
+ return if current_user.is_admin?
+ forbidden!("Runner is shared") if runner.is_shared?
+ forbidden!("Runner associated with more than one project") if runner.projects.count > 1
+ forbidden!("No access granted") unless user_can_access_runner?(runner)
+ end
+
+ def authenticate_enable_runner!(runner)
+ forbidden!("Runner is shared") if runner.is_shared?
+ return if current_user.is_admin?
+ forbidden!("No access granted") unless user_can_access_runner?(runner)
+ end
+
+ def user_can_access_runner?(runner)
+ current_user.ci_authorized_runners.exists?(runner.id)
+ end
+ end
+ end
+end
diff --git a/lib/banzai/filter/emoji_filter.rb b/lib/banzai/filter/emoji_filter.rb
index 5952a031626..207437ba7cf 100644
--- a/lib/banzai/filter/emoji_filter.rb
+++ b/lib/banzai/filter/emoji_filter.rb
@@ -45,7 +45,8 @@ module Banzai
private
def emoji_url(name)
- emoji_path = "emoji/#{emoji_filename(name)}"
+ emoji_path = emoji_filename(name)
+
if context[:asset_host]
# Asset host is specified.
url_to_image(emoji_path)
diff --git a/lib/ci/api/builds.rb b/lib/ci/api/builds.rb
index 416b0b5f0b4..2e9a5d311f9 100644
--- a/lib/ci/api/builds.rb
+++ b/lib/ci/api/builds.rb
@@ -38,6 +38,8 @@ module Ci
authenticate_runner!
update_runner_last_contact
build = Ci::Build.where(runner_id: current_runner.id).running.find(params[:id])
+ forbidden!('Build has been erased!') if build.erased?
+
build.update_attributes(trace: params[:trace]) if params[:trace]
case params[:state].to_s
@@ -99,6 +101,7 @@ module Ci
not_found! unless build
authenticate_build_token!(build)
forbidden!('Build is not running!') unless build.running?
+ forbidden!('Build has been erased!') if build.erased?
artifacts_upload_path = ArtifactUploader.artifacts_upload_path
artifacts = uploaded_file(:file, artifacts_upload_path)
@@ -143,7 +146,7 @@ module Ci
present_file!(artifacts_file.path, artifacts_file.filename)
end
- # Remove the artifacts file from build
+ # Remove the artifacts file from build - Runners only
#
# Parameters:
# id (required) - The ID of a build
@@ -156,6 +159,7 @@ module Ci
build = Ci::Build.find_by_id(params[:id])
not_found! unless build
authenticate_build_token!(build)
+
build.remove_artifacts_file!
build.remove_artifacts_metadata!
end
diff --git a/lib/ci/status.rb b/lib/ci/status.rb
index c02b3b8f3e4..3fb1fe29494 100644
--- a/lib/ci/status.rb
+++ b/lib/ci/status.rb
@@ -1,11 +1,9 @@
module Ci
class Status
def self.get_status(statuses)
- statuses.reject! { |status| status.try(&:allow_failure?) }
-
if statuses.none?
'skipped'
- elsif statuses.all?(&:success?)
+ elsif statuses.all? { |status| status.success? || status.ignored? }
'success'
elsif statuses.all?(&:pending?)
'pending'
diff --git a/lib/gitlab/ldap/user.rb b/lib/gitlab/ldap/user.rb
index e044f0ecc6d..b84c81f1a6c 100644
--- a/lib/gitlab/ldap/user.rb
+++ b/lib/gitlab/ldap/user.rb
@@ -24,6 +24,10 @@ module Gitlab
update_user_attributes
end
+ def save
+ super('LDAP')
+ end
+
# instance methods
def gl_user
@gl_user ||= find_by_uid_and_provider || find_by_email || build_new_user
diff --git a/lib/gitlab/o_auth/user.rb b/lib/gitlab/o_auth/user.rb
index d87a72f7ba3..832fb08a526 100644
--- a/lib/gitlab/o_auth/user.rb
+++ b/lib/gitlab/o_auth/user.rb
@@ -26,7 +26,7 @@ module Gitlab
gl_user.try(:valid?)
end
- def save
+ def save(provider = 'OAuth')
unauthorized_to_create unless gl_user
if needs_blocking?
@@ -36,10 +36,10 @@ module Gitlab
gl_user.save!
end
- log.info "(OAuth) saving user #{auth_hash.email} from login with extern_uid => #{auth_hash.uid}"
+ log.info "(#{provider}) saving user #{auth_hash.email} from login with extern_uid => #{auth_hash.uid}"
gl_user
rescue ActiveRecord::RecordInvalid => e
- log.info "(OAuth) Error saving user: #{gl_user.errors.full_messages}"
+ log.info "(#{provider}) Error saving user: #{gl_user.errors.full_messages}"
return self, e.record.errors
end
@@ -105,7 +105,12 @@ module Gitlab
end
def signup_enabled?
- Gitlab.config.omniauth.allow_single_sign_on
+ providers = Gitlab.config.omniauth.allow_single_sign_on
+ if providers.is_a?(Array)
+ providers.include?(auth_hash.provider)
+ else
+ providers
+ end
end
def block_after_signup?
diff --git a/lib/gitlab/push_data_builder.rb b/lib/gitlab/push_data_builder.rb
index 1dad621aa00..da1c15fef61 100644
--- a/lib/gitlab/push_data_builder.rb
+++ b/lib/gitlab/push_data_builder.rb
@@ -22,6 +22,8 @@ module Gitlab
# }
#
def build(project, user, oldrev, newrev, ref, commits = [], message = nil)
+ commits = Array(commits)
+
# Total commits count
commits_count = commits.size
diff --git a/lib/gitlab/saml/user.rb b/lib/gitlab/saml/user.rb
new file mode 100644
index 00000000000..b1e30110ef5
--- /dev/null
+++ b/lib/gitlab/saml/user.rb
@@ -0,0 +1,47 @@
+# SAML extension for User model
+#
+# * Find GitLab user based on SAML uid and provider
+# * Create new user from SAML data
+#
+module Gitlab
+ module Saml
+ class User < Gitlab::OAuth::User
+
+ def save
+ super('SAML')
+ end
+
+ def gl_user
+ @user ||= find_by_uid_and_provider
+
+ if auto_link_ldap_user?
+ @user ||= find_or_create_ldap_user
+ end
+
+ if auto_link_saml_enabled?
+ @user ||= find_by_email
+ end
+
+ if signup_enabled?
+ @user ||= build_new_user
+ end
+
+ @user
+ end
+
+ def find_by_email
+ if auth_hash.has_email?
+ user = ::User.find_by(email: auth_hash.email.downcase)
+ user.identities.new(extern_uid: auth_hash.uid, provider: auth_hash.provider) if user
+ user
+ end
+ end
+
+ protected
+
+ def auto_link_saml_enabled?
+ Gitlab.config.omniauth.auto_link_saml_user
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/workhorse.rb b/lib/gitlab/workhorse.rb
index a23120a4176..c3ddd4c2680 100644
--- a/lib/gitlab/workhorse.rb
+++ b/lib/gitlab/workhorse.rb
@@ -3,19 +3,38 @@ require 'json'
module Gitlab
class Workhorse
+ SEND_DATA_HEADER = 'Gitlab-Workhorse-Send-Data'
+
class << self
def send_git_blob(repository, blob)
- params_hash = {
+ params = {
'RepoPath' => repository.path_to_repo,
'BlobId' => blob.id,
}
- params = Base64.urlsafe_encode64(JSON.dump(params_hash))
[
- 'Gitlab-Workhorse-Send-Data',
- "git-blob:#{params}",
+ SEND_DATA_HEADER,
+ "git-blob:#{encode(params)}",
]
end
+
+ def send_git_archive(project, ref, format)
+ format ||= 'tar.gz'
+ format.downcase!
+ params = project.repository.archive_metadata(ref, Gitlab.config.gitlab.repository_downloads_path, format)
+ raise "Repository or ref not found" if params.empty?
+
+ [
+ SEND_DATA_HEADER,
+ "git-archive:#{encode(params)}",
+ ]
+ end
+
+ protected
+
+ def encode(hash)
+ Base64.urlsafe_encode64(JSON.dump(hash))
+ end
end
end
end
diff --git a/lib/tasks/cache.rake b/lib/tasks/cache.rake
index 1728dda72cf..9e2fb429d57 100644
--- a/lib/tasks/cache.rake
+++ b/lib/tasks/cache.rake
@@ -1,11 +1,21 @@
namespace :cache do
+ CLEAR_BATCH_SIZE = 1000 # The more the faster, but having too many can crash Ruby
+ REDIS_SCAN_START_STOP = '0' # Magic value, see http://redis.io/commands/scan
+
desc "GitLab | Clear redis cache"
task :clear => :environment do
- # Hack into Rails.cache until https://github.com/redis-store/redis-store/pull/225
- # is accepted (I hope) and we can update the redis-store gem.
redis_store = Rails.cache.instance_variable_get(:@data)
- redis_store.keys.each_slice(1000) do |key_slice|
- redis_store.del(*key_slice)
+ cursor = REDIS_SCAN_START_STOP
+ loop do
+ cursor, keys = redis_store.scan(
+ cursor,
+ match: "#{Gitlab::REDIS_CACHE_NAMESPACE}*",
+ count: CLEAR_BATCH_SIZE
+ )
+
+ redis_store.del(*keys) if keys.any?
+
+ break if cursor == REDIS_SCAN_START_STOP
end
end
end
diff --git a/lib/tasks/gitlab/check.rake b/lib/tasks/gitlab/check.rake
index 54d95cd62a5..81099cb8ba9 100644
--- a/lib/tasks/gitlab/check.rake
+++ b/lib/tasks/gitlab/check.rake
@@ -16,7 +16,6 @@ namespace :gitlab do
check_git_config
check_database_config_exists
- check_database_is_not_sqlite
check_migrations_are_up
check_orphaned_group_members
check_gitlab_config_exists
diff --git a/spec/controllers/commit_controller_spec.rb b/spec/controllers/commit_controller_spec.rb
index 7793bf1e421..bbe400dad88 100644
--- a/spec/controllers/commit_controller_spec.rb
+++ b/spec/controllers/commit_controller_spec.rb
@@ -143,4 +143,53 @@ describe Projects::CommitController do
expect(assigns(:tags)).to include("v1.1.0")
end
end
+
+ describe '#revert' do
+ context 'when target branch is not provided' do
+ it 'should render the 404 page' do
+ post(:revert,
+ namespace_id: project.namespace.to_param,
+ project_id: project.to_param,
+ id: commit.id)
+
+ expect(response).not_to be_success
+ expect(response.status).to eq(404)
+ end
+ end
+
+ context 'when the revert was successful' do
+ it 'should redirect to the commits page' do
+ post(:revert,
+ namespace_id: project.namespace.to_param,
+ project_id: project.to_param,
+ target_branch: 'master',
+ id: commit.id)
+
+ expect(response).to redirect_to namespace_project_commits_path(project.namespace, project, 'master')
+ expect(flash[:notice]).to eq('The commit has been successfully reverted.')
+ end
+ end
+
+ context 'when the revert failed' do
+ before do
+ post(:revert,
+ namespace_id: project.namespace.to_param,
+ project_id: project.to_param,
+ target_branch: 'master',
+ id: commit.id)
+ end
+
+ it 'should redirect to the commit page' do
+ # Reverting a commit that has been already reverted.
+ post(:revert,
+ namespace_id: project.namespace.to_param,
+ project_id: project.to_param,
+ target_branch: 'master',
+ id: commit.id)
+
+ expect(response).to redirect_to namespace_project_commit_path(project.namespace, project, commit.id)
+ expect(flash[:alert]).to match('Sorry, we cannot revert this commit automatically.')
+ end
+ end
+ end
end
diff --git a/spec/controllers/profile_keys_controller_spec.rb b/spec/controllers/profiles/keys_controller_spec.rb
index b6573f105dc..b6573f105dc 100644
--- a/spec/controllers/profile_keys_controller_spec.rb
+++ b/spec/controllers/profiles/keys_controller_spec.rb
diff --git a/spec/controllers/blame_controller_spec.rb b/spec/controllers/projects/blame_controller_spec.rb
index 25f06299a29..25f06299a29 100644
--- a/spec/controllers/blame_controller_spec.rb
+++ b/spec/controllers/projects/blame_controller_spec.rb
diff --git a/spec/controllers/branches_controller_spec.rb b/spec/controllers/projects/branches_controller_spec.rb
index 8e06d4bdc77..8e06d4bdc77 100644
--- a/spec/controllers/branches_controller_spec.rb
+++ b/spec/controllers/projects/branches_controller_spec.rb
diff --git a/spec/controllers/commits_controller_spec.rb b/spec/controllers/projects/commits_controller_spec.rb
index 7d8089c4bc6..7d8089c4bc6 100644
--- a/spec/controllers/commits_controller_spec.rb
+++ b/spec/controllers/projects/commits_controller_spec.rb
diff --git a/spec/controllers/projects/imports_controller_spec.rb b/spec/controllers/projects/imports_controller_spec.rb
index 85d1d1e0524..0147bd2b953 100644
--- a/spec/controllers/projects/imports_controller_spec.rb
+++ b/spec/controllers/projects/imports_controller_spec.rb
@@ -104,6 +104,18 @@ describe Projects::ImportsController do
end
end
end
+
+ context 'when import never happened' do
+ before do
+ project.update_attribute(:import_status, :none)
+ end
+
+ it 'redirects to namespace_project_path' do
+ get :show, namespace_id: project.namespace.to_param, project_id: project.to_param
+
+ expect(response).to redirect_to namespace_project_path(project.namespace, project)
+ end
+ end
end
end
end
diff --git a/spec/controllers/projects/merge_requests_controller_spec.rb b/spec/controllers/projects/merge_requests_controller_spec.rb
index 9450a389d81..e82fe26c7a6 100644
--- a/spec/controllers/projects/merge_requests_controller_spec.rb
+++ b/spec/controllers/projects/merge_requests_controller_spec.rb
@@ -123,6 +123,40 @@ describe Projects::MergeRequestsController do
end
end
+ describe 'GET #index' do
+ def get_merge_requests
+ get :index,
+ namespace_id: project.namespace.to_param,
+ project_id: project.to_param,
+ state: 'opened'
+ end
+
+ context 'when filtering by opened state' do
+
+ context 'with opened merge requests' do
+ it 'should list those merge requests' do
+ get_merge_requests
+
+ expect(assigns(:merge_requests)).to include(merge_request)
+ end
+ end
+
+ context 'with reopened merge requests' do
+ before do
+ merge_request.close!
+ merge_request.reopen!
+ end
+
+ it 'should list those merge requests' do
+ get_merge_requests
+
+ expect(assigns(:merge_requests)).to include(merge_request)
+ end
+ end
+
+ end
+ end
+
describe 'GET diffs' do
def go(format: 'html')
get :diffs,
diff --git a/spec/controllers/projects/repositories_controller_spec.rb b/spec/controllers/projects/repositories_controller_spec.rb
index 18a30033ed8..09ec4f18f9d 100644
--- a/spec/controllers/projects/repositories_controller_spec.rb
+++ b/spec/controllers/projects/repositories_controller_spec.rb
@@ -8,15 +8,10 @@ describe Projects::RepositoriesController do
before do
sign_in(user)
project.team << [user, :developer]
-
- allow(ArchiveRepositoryService).to receive(:new).and_return(service)
end
- let(:service) { ArchiveRepositoryService.new(project, "master", "zip") }
-
- it "executes ArchiveRepositoryService" do
- expect(ArchiveRepositoryService).to receive(:new).with(project, "master", "zip")
- expect(service).to receive(:execute)
+ it "uses Gitlab::Workhorse" do
+ expect(Gitlab::Workhorse).to receive(:send_git_archive).with(project, "master", "zip")
get :archive, namespace_id: project.namespace.path, project_id: project.path, ref: "master", format: "zip"
end
@@ -24,7 +19,7 @@ describe Projects::RepositoriesController do
context "when the service raises an error" do
before do
- allow(service).to receive(:execute).and_raise("Archive failed")
+ allow(Gitlab::Workhorse).to receive(:send_git_archive).and_raise("Archive failed")
end
it "renders Not Found" do
diff --git a/spec/controllers/sent_notification_controller_spec.rb b/spec/controllers/sent_notifications_controller_spec.rb
index 9ced397bd4a..9ced397bd4a 100644
--- a/spec/controllers/sent_notification_controller_spec.rb
+++ b/spec/controllers/sent_notifications_controller_spec.rb
diff --git a/spec/factories/ci/builds.rb b/spec/factories/ci/builds.rb
index c1b6ecd329a..a46466798d6 100644
--- a/spec/factories/ci/builds.rb
+++ b/spec/factories/ci/builds.rb
@@ -16,10 +16,30 @@ FactoryGirl.define do
commit factory: :ci_commit
+ trait :success do
+ status 'success'
+ end
+
+ trait :failed do
+ status 'failed'
+ end
+
trait :canceled do
status 'canceled'
end
+ trait :running do
+ status 'running'
+ end
+
+ trait :pending do
+ status 'pending'
+ end
+
+ trait :allowed_to_fail do
+ allow_failure true
+ end
+
after(:build) do |build, evaluator|
build.project = build.commit.project
end
@@ -33,8 +53,8 @@ FactoryGirl.define do
tag true
end
- factory :ci_build_with_trace do
- after(:create) do |build, evaluator|
+ trait :trace do
+ after(:create) do |build, evaluator|
build.trace = 'BUILD TRACE'
end
end
@@ -42,14 +62,13 @@ FactoryGirl.define do
trait :artifacts do
after(:create) do |build, _|
build.artifacts_file =
- fixture_file_upload(Rails.root +
- 'spec/fixtures/ci_build_artifacts.zip',
- 'application/zip')
+ fixture_file_upload(Rails.root.join('spec/fixtures/ci_build_artifacts.zip'),
+ 'application/zip')
build.artifacts_metadata =
- fixture_file_upload(Rails.root +
- 'spec/fixtures/ci_build_artifacts_metadata.gz',
- 'application/x-gzip')
+ fixture_file_upload(Rails.root.join('spec/fixtures/ci_build_artifacts_metadata.gz'),
+ 'application/x-gzip')
+
build.save!
end
end
diff --git a/spec/factories/ci/runners.rb b/spec/factories/ci/runners.rb
index db759eca9ac..265663e8453 100644
--- a/spec/factories/ci/runners.rb
+++ b/spec/factories/ci/runners.rb
@@ -25,14 +25,12 @@ FactoryGirl.define do
"My runner#{n}"
end
- platform "darwin"
+ platform "darwin"
+ is_shared false
+ active true
- factory :ci_shared_runner do
+ trait :shared do
is_shared true
end
-
- factory :ci_specific_runner do
- is_shared false
- end
end
end
diff --git a/spec/factories/merge_requests.rb b/spec/factories/merge_requests.rb
index 0c6a881f868..00de7bb5294 100644
--- a/spec/factories/merge_requests.rb
+++ b/spec/factories/merge_requests.rb
@@ -24,6 +24,7 @@
# merge_params :text
# merge_when_build_succeeds :boolean default(FALSE), not null
# merge_user_id :integer
+# merge_commit_sha :string
#
FactoryGirl.define do
diff --git a/spec/factories/notes.rb b/spec/factories/notes.rb
index 35a20adeef3..32c202891d8 100644
--- a/spec/factories/notes.rb
+++ b/spec/factories/notes.rb
@@ -34,6 +34,8 @@ FactoryGirl.define do
factory :note_on_merge_request_diff, traits: [:on_merge_request, :on_diff]
factory :note_on_project_snippet, traits: [:on_project_snippet]
factory :system_note, traits: [:system]
+ factory :downvote_note, traits: [:award, :downvote]
+ factory :upvote_note, traits: [:award, :upvote]
trait :on_commit do
project
@@ -65,6 +67,18 @@ FactoryGirl.define do
system true
end
+ trait :award do
+ is_award true
+ end
+
+ trait :downvote do
+ note "thumbsdown"
+ end
+
+ trait :upvote do
+ note "thumbsup"
+ end
+
trait :with_attachment do
attachment { fixture_file_upload(Rails.root + "spec/fixtures/dk.png", "`/png") }
end
diff --git a/spec/factories/todos.rb b/spec/factories/todos.rb
new file mode 100644
index 00000000000..bd85b1d798a
--- /dev/null
+++ b/spec/factories/todos.rb
@@ -0,0 +1,34 @@
+# == Schema Information
+#
+# Table name: todos
+#
+# id :integer not null, primary key
+# user_id :integer not null
+# project_id :integer not null
+# target_id :integer not null
+# target_type :string not null
+# author_id :integer
+# note_id :integer
+# action :integer not null
+# state :string not null
+# created_at :datetime
+# updated_at :datetime
+#
+
+FactoryGirl.define do
+ factory :todo do
+ project
+ author
+ user
+ target factory: :issue
+ action { Todo::ASSIGNED }
+
+ trait :assigned do
+ action { Todo::ASSIGNED }
+ end
+
+ trait :mentioned do
+ action { Todo::MENTIONED }
+ end
+ end
+end
diff --git a/spec/features/runners_spec.rb b/spec/features/runners_spec.rb
index d97831aae14..e8886e7edf9 100644
--- a/spec/features/runners_spec.rb
+++ b/spec/features/runners_spec.rb
@@ -17,10 +17,10 @@ describe "Runners" do
@project3 = FactoryGirl.create :empty_project
@project3.team << [user, :developer]
- @shared_runner = FactoryGirl.create :ci_shared_runner
- @specific_runner = FactoryGirl.create :ci_specific_runner
- @specific_runner2 = FactoryGirl.create :ci_specific_runner
- @specific_runner3 = FactoryGirl.create :ci_specific_runner
+ @shared_runner = FactoryGirl.create :ci_runner, :shared
+ @specific_runner = FactoryGirl.create :ci_runner
+ @specific_runner2 = FactoryGirl.create :ci_runner
+ @specific_runner3 = FactoryGirl.create :ci_runner
@project.runners << @specific_runner
@project2.runners << @specific_runner2
@project3.runners << @specific_runner3
@@ -84,7 +84,7 @@ describe "Runners" do
before do
@project = FactoryGirl.create :empty_project
@project.team << [user, :master]
- @specific_runner = FactoryGirl.create :ci_specific_runner
+ @specific_runner = FactoryGirl.create :ci_runner
@project.runners << @specific_runner
end
diff --git a/spec/helpers/gitlab_markdown_helper_spec.rb b/spec/helpers/gitlab_markdown_helper_spec.rb
index 9a05b21335c..9adcd916ced 100644
--- a/spec/helpers/gitlab_markdown_helper_spec.rb
+++ b/spec/helpers/gitlab_markdown_helper_spec.rb
@@ -113,7 +113,7 @@ describe GitlabMarkdownHelper do
it 'should replace commit message with emoji to link' do
actual = link_to_gfm(':book:Book', '/foo')
expect(actual).
- to eq %Q(<img class="emoji" title=":book:" alt=":book:" src="http://localhost/assets/emoji/1F4D6.png" height="20" width="20" align="absmiddle"><a href="/foo">Book</a>)
+ to eq %Q(<img class="emoji" title=":book:" alt=":book:" src="http://localhost/assets/1F4D6.png" height="20" width="20" align="absmiddle"><a href="/foo">Book</a>)
end
end
diff --git a/spec/lib/banzai/filter/emoji_filter_spec.rb b/spec/lib/banzai/filter/emoji_filter_spec.rb
index cf314058158..b5b38cf0c8c 100644
--- a/spec/lib/banzai/filter/emoji_filter_spec.rb
+++ b/spec/lib/banzai/filter/emoji_filter_spec.rb
@@ -14,7 +14,7 @@ describe Banzai::Filter::EmojiFilter, lib: true do
it 'replaces supported emoji' do
doc = filter('<p>:heart:</p>')
- expect(doc.css('img').first.attr('src')).to eq 'https://foo.com/assets/emoji/2764.png'
+ expect(doc.css('img').first.attr('src')).to eq 'https://foo.com/assets/2764.png'
end
it 'ignores unsupported emoji' do
@@ -25,7 +25,7 @@ describe Banzai::Filter::EmojiFilter, lib: true do
it 'correctly encodes the URL' do
doc = filter('<p>:+1:</p>')
- expect(doc.css('img').first.attr('src')).to eq 'https://foo.com/assets/emoji/1F44D.png'
+ expect(doc.css('img').first.attr('src')).to eq 'https://foo.com/assets/1F44D.png'
end
it 'matches at the start of a string' do
diff --git a/spec/lib/ci/status_spec.rb b/spec/lib/ci/status_spec.rb
new file mode 100644
index 00000000000..a2eb14f3a97
--- /dev/null
+++ b/spec/lib/ci/status_spec.rb
@@ -0,0 +1,41 @@
+require 'spec_helper'
+
+describe Ci::Status do
+ describe '.get_status' do
+ subject { described_class.get_status(statuses) }
+
+ [:ci_build, :generic_commit_status].each do |type|
+ context "for #{type}" do
+ context 'all successful' do
+ let(:statuses) { Array.new(2) { create(type, status: :success) } }
+ it { is_expected.to eq 'success' }
+ end
+
+ context 'at least one failed' do
+ let(:statuses) { [create(type, status: :success), create(type, status: :failed)] }
+ it { is_expected.to eq 'failed' }
+ end
+
+ context 'at least one running' do
+ let(:statuses) { [create(type, status: :success), create(type, status: :running)] }
+ it { is_expected.to eq 'running' }
+ end
+
+ context 'at least one pending' do
+ let(:statuses) { [create(type, status: :success), create(type, status: :pending)] }
+ it { is_expected.to eq 'running' }
+ end
+
+ context 'success and failed but allowed to fail' do
+ let(:statuses) { [create(type, status: :success), create(type, status: :failed, allow_failure: true)] }
+ it { is_expected.to eq 'success' }
+ end
+
+ context 'one failed but allowed to fail' do
+ let(:statuses) { [create(type, status: :failed, allow_failure: true)] }
+ it { is_expected.to eq 'success' }
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/o_auth/user_spec.rb b/spec/lib/gitlab/o_auth/user_spec.rb
index 925bc442a90..3a769acfdc0 100644
--- a/spec/lib/gitlab/o_auth/user_spec.rb
+++ b/spec/lib/gitlab/o_auth/user_spec.rb
@@ -41,7 +41,20 @@ describe Gitlab::OAuth::User, lib: true do
describe 'signup' do
shared_examples "to verify compliance with allow_single_sign_on" do
- context "with allow_single_sign_on enabled" do
+ context "with new allow_single_sign_on enabled syntax" do
+ before { stub_omniauth_config(allow_single_sign_on: ['twitter']) }
+
+ it "creates a user from Omniauth" do
+ oauth_user.save
+
+ expect(gl_user).to be_valid
+ identity = gl_user.identities.first
+ expect(identity.extern_uid).to eql uid
+ expect(identity.provider).to eql 'twitter'
+ end
+ end
+
+ context "with old allow_single_sign_on enabled syntax" do
before { stub_omniauth_config(allow_single_sign_on: true) }
it "creates a user from Omniauth" do
@@ -54,7 +67,14 @@ describe Gitlab::OAuth::User, lib: true do
end
end
- context "with allow_single_sign_on disabled (Default)" do
+ context "with new allow_single_sign_on disabled syntax" do
+ before { stub_omniauth_config(allow_single_sign_on: []) }
+ it "throws an error" do
+ expect{ oauth_user.save }.to raise_error StandardError
+ end
+ end
+
+ context "with old allow_single_sign_on disabled (Default)" do
before { stub_omniauth_config(allow_single_sign_on: false) }
it "throws an error" do
expect{ oauth_user.save }.to raise_error StandardError
@@ -135,7 +155,7 @@ describe Gitlab::OAuth::User, lib: true do
describe 'blocking' do
let(:provider) { 'twitter' }
- before { stub_omniauth_config(allow_single_sign_on: true) }
+ before { stub_omniauth_config(allow_single_sign_on: ['twitter']) }
context 'signup with omniauth only' do
context 'dont block on create' do
diff --git a/spec/lib/gitlab/push_data_builder_spec.rb b/spec/lib/gitlab/push_data_builder_spec.rb
index 257e4a38435..961022b9d12 100644
--- a/spec/lib/gitlab/push_data_builder_spec.rb
+++ b/spec/lib/gitlab/push_data_builder_spec.rb
@@ -1,12 +1,12 @@
require 'spec_helper'
-describe 'Gitlab::PushDataBuilder', lib: true do
+describe Gitlab::PushDataBuilder, lib: true do
let(:project) { create(:project) }
let(:user) { create(:user) }
- describe :build_sample do
- let(:data) { Gitlab::PushDataBuilder.build_sample(project, user) }
+ describe '.build_sample' do
+ let(:data) { described_class.build_sample(project, user) }
it { expect(data).to be_a(Hash) }
it { expect(data[:before]).to eq('6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9') }
@@ -22,13 +22,11 @@ describe 'Gitlab::PushDataBuilder', lib: true do
include_examples 'deprecated repository hook data'
end
- describe :build do
+ describe '.build' do
let(:data) do
- Gitlab::PushDataBuilder.build(project,
- user,
- Gitlab::Git::BLANK_SHA,
- '8a2a6eb295bb170b34c24c76c49ed0e9b2eaf34b',
- 'refs/tags/v1.1.0')
+ described_class.build(project, user, Gitlab::Git::BLANK_SHA,
+ '8a2a6eb295bb170b34c24c76c49ed0e9b2eaf34b',
+ 'refs/tags/v1.1.0')
end
it { expect(data).to be_a(Hash) }
@@ -38,5 +36,10 @@ describe 'Gitlab::PushDataBuilder', lib: true do
it { expect(data[:ref]).to eq('refs/tags/v1.1.0') }
it { expect(data[:commits]).to be_empty }
it { expect(data[:total_commits_count]).to be_zero }
+
+ it 'does not raise an error when given nil commits' do
+ expect { described_class.build(spy, spy, spy, spy, spy, nil) }.
+ not_to raise_error
+ end
end
end
diff --git a/spec/lib/gitlab/saml/user_spec.rb b/spec/lib/gitlab/saml/user_spec.rb
new file mode 100644
index 00000000000..de7cd99d49d
--- /dev/null
+++ b/spec/lib/gitlab/saml/user_spec.rb
@@ -0,0 +1,271 @@
+require 'spec_helper'
+
+describe Gitlab::Saml::User, lib: true do
+ let(:saml_user) { described_class.new(auth_hash) }
+ let(:gl_user) { saml_user.gl_user }
+ let(:uid) { 'my-uid' }
+ let(:provider) { 'saml' }
+ let(:auth_hash) { OmniAuth::AuthHash.new(uid: uid, provider: provider, info: info_hash) }
+ let(:info_hash) do
+ {
+ name: 'John',
+ email: 'john@mail.com'
+ }
+ end
+ let(:ldap_user) { Gitlab::LDAP::Person.new(Net::LDAP::Entry.new, 'ldapmain') }
+
+ describe '#save' do
+ def stub_omniauth_config(messages)
+ allow(Gitlab.config.omniauth).to receive_messages(messages)
+ end
+
+ def stub_ldap_config(messages)
+ allow(Gitlab::LDAP::Config).to receive_messages(messages)
+ end
+
+ describe 'account exists on server' do
+ before { stub_omniauth_config({ allow_single_sign_on: ['saml'], auto_link_saml_user: true }) }
+ context 'and should bind with SAML' do
+ let!(:existing_user) { create(:user, email: 'john@mail.com', username: 'john') }
+ it 'adds the SAML identity to the existing user' do
+ saml_user.save
+ expect(gl_user).to be_valid
+ expect(gl_user).to eq existing_user
+ identity = gl_user.identities.first
+ expect(identity.extern_uid).to eql uid
+ expect(identity.provider).to eql 'saml'
+ end
+ end
+ end
+
+ describe 'no account exists on server' do
+ shared_examples 'to verify compliance with allow_single_sign_on' do
+ context 'with allow_single_sign_on enabled' do
+ before { stub_omniauth_config(allow_single_sign_on: ['saml']) }
+
+ it 'creates a user from SAML' do
+ saml_user.save
+
+ expect(gl_user).to be_valid
+ identity = gl_user.identities.first
+ expect(identity.extern_uid).to eql uid
+ expect(identity.provider).to eql 'saml'
+ end
+ end
+
+ context 'with allow_single_sign_on default (["saml"])' do
+ before { stub_omniauth_config(allow_single_sign_on: ['saml']) }
+ it 'should not throw an error' do
+ expect{ saml_user.save }.not_to raise_error
+ end
+ end
+
+ context 'with allow_single_sign_on disabled' do
+ before { stub_omniauth_config(allow_single_sign_on: false) }
+ it 'should throw an error' do
+ expect{ saml_user.save }.to raise_error StandardError
+ end
+ end
+ end
+
+ context 'with auto_link_ldap_user disabled (default)' do
+ before { stub_omniauth_config({ auto_link_ldap_user: false, auto_link_saml_user: false, allow_single_sign_on: ['saml'] }) }
+ include_examples 'to verify compliance with allow_single_sign_on'
+ end
+
+ context 'with auto_link_ldap_user enabled' do
+ before { stub_omniauth_config({ auto_link_ldap_user: true, auto_link_saml_user: false }) }
+
+ context 'and no LDAP provider defined' do
+ before { stub_ldap_config(providers: []) }
+
+ include_examples 'to verify compliance with allow_single_sign_on'
+ end
+
+ context 'and at least one LDAP provider is defined' do
+ before { stub_ldap_config(providers: %w(ldapmain)) }
+
+ context 'and a corresponding LDAP person' do
+ before do
+ allow(ldap_user).to receive(:uid) { uid }
+ allow(ldap_user).to receive(:username) { uid }
+ allow(ldap_user).to receive(:email) { ['johndoe@example.com','john2@example.com'] }
+ allow(ldap_user).to receive(:dn) { 'uid=user1,ou=People,dc=example' }
+ allow(Gitlab::LDAP::Person).to receive(:find_by_uid).and_return(ldap_user)
+ end
+
+ context 'and no account for the LDAP user' do
+
+ it 'creates a user with dual LDAP and SAML identities' do
+ saml_user.save
+
+ expect(gl_user).to be_valid
+ expect(gl_user.username).to eql uid
+ expect(gl_user.email).to eql 'johndoe@example.com'
+ expect(gl_user.identities.length).to eql 2
+ identities_as_hash = gl_user.identities.map { |id| { provider: id.provider, extern_uid: id.extern_uid } }
+ expect(identities_as_hash).to match_array([ { provider: 'ldapmain', extern_uid: 'uid=user1,ou=People,dc=example' },
+ { provider: 'saml', extern_uid: uid }
+ ])
+ end
+ end
+
+ context 'and LDAP user has an account already' do
+ let!(:existing_user) { create(:omniauth_user, email: 'john@example.com', extern_uid: 'uid=user1,ou=People,dc=example', provider: 'ldapmain', username: 'john') }
+ it "adds the omniauth identity to the LDAP account" do
+ saml_user.save
+
+ expect(gl_user).to be_valid
+ expect(gl_user.username).to eql 'john'
+ expect(gl_user.email).to eql 'john@example.com'
+ expect(gl_user.identities.length).to eql 2
+ identities_as_hash = gl_user.identities.map { |id| { provider: id.provider, extern_uid: id.extern_uid } }
+ expect(identities_as_hash).to match_array([ { provider: 'ldapmain', extern_uid: 'uid=user1,ou=People,dc=example' },
+ { provider: 'saml', extern_uid: uid }
+ ])
+ end
+ end
+ end
+
+ context 'and no corresponding LDAP person' do
+ before { allow(Gitlab::LDAP::Person).to receive(:find_by_uid).and_return(nil) }
+
+ include_examples 'to verify compliance with allow_single_sign_on'
+ end
+ end
+ end
+
+ end
+
+ describe 'blocking' do
+ before { stub_omniauth_config({ allow_saml_sign_up: true, auto_link_saml_user: true }) }
+
+ context 'signup with SAML only' do
+ context 'dont block on create' do
+ before { stub_omniauth_config(block_auto_created_users: false) }
+
+ it 'should not block the user' do
+ saml_user.save
+ expect(gl_user).to be_valid
+ expect(gl_user).not_to be_blocked
+ end
+ end
+
+ context 'block on create' do
+ before { stub_omniauth_config(block_auto_created_users: true) }
+
+ it 'should block user' do
+ saml_user.save
+ expect(gl_user).to be_valid
+ expect(gl_user).to be_blocked
+ end
+ end
+ end
+
+ context 'signup with linked omniauth and LDAP account' do
+ before do
+ stub_omniauth_config(auto_link_ldap_user: true)
+ allow(ldap_user).to receive(:uid) { uid }
+ allow(ldap_user).to receive(:username) { uid }
+ allow(ldap_user).to receive(:email) { ['johndoe@example.com','john2@example.com'] }
+ allow(ldap_user).to receive(:dn) { 'uid=user1,ou=People,dc=example' }
+ allow(saml_user).to receive(:ldap_person).and_return(ldap_user)
+ end
+
+ context "and no account for the LDAP user" do
+ context 'dont block on create (LDAP)' do
+ before { allow_any_instance_of(Gitlab::LDAP::Config).to receive_messages(block_auto_created_users: false) }
+
+ it do
+ saml_user.save
+ expect(gl_user).to be_valid
+ expect(gl_user).not_to be_blocked
+ end
+ end
+
+ context 'block on create (LDAP)' do
+ before { allow_any_instance_of(Gitlab::LDAP::Config).to receive_messages(block_auto_created_users: true) }
+
+ it do
+ saml_user.save
+ expect(gl_user).to be_valid
+ expect(gl_user).to be_blocked
+ end
+ end
+ end
+
+ context 'and LDAP user has an account already' do
+ let!(:existing_user) { create(:omniauth_user, email: 'john@example.com', extern_uid: 'uid=user1,ou=People,dc=example', provider: 'ldapmain', username: 'john') }
+
+ context 'dont block on create (LDAP)' do
+ before { allow_any_instance_of(Gitlab::LDAP::Config).to receive_messages(block_auto_created_users: false) }
+
+ it do
+ saml_user.save
+ expect(gl_user).to be_valid
+ expect(gl_user).not_to be_blocked
+ end
+ end
+
+ context 'block on create (LDAP)' do
+ before { allow_any_instance_of(Gitlab::LDAP::Config).to receive_messages(block_auto_created_users: true) }
+
+ it do
+ saml_user.save
+ expect(gl_user).to be_valid
+ expect(gl_user).not_to be_blocked
+ end
+ end
+ end
+ end
+
+
+ context 'sign-in' do
+ before do
+ saml_user.save
+ saml_user.gl_user.activate
+ end
+
+ context 'dont block on create' do
+ before { stub_omniauth_config(block_auto_created_users: false) }
+
+ it do
+ saml_user.save
+ expect(gl_user).to be_valid
+ expect(gl_user).not_to be_blocked
+ end
+ end
+
+ context 'block on create' do
+ before { stub_omniauth_config(block_auto_created_users: true) }
+
+ it do
+ saml_user.save
+ expect(gl_user).to be_valid
+ expect(gl_user).not_to be_blocked
+ end
+ end
+
+ context 'dont block on create (LDAP)' do
+ before { allow_any_instance_of(Gitlab::LDAP::Config).to receive_messages(block_auto_created_users: false) }
+
+ it do
+ saml_user.save
+ expect(gl_user).to be_valid
+ expect(gl_user).not_to be_blocked
+ end
+ end
+
+ context 'block on create (LDAP)' do
+ before { allow_any_instance_of(Gitlab::LDAP::Config).to receive_messages(block_auto_created_users: true) }
+
+ it do
+ saml_user.save
+ expect(gl_user).to be_valid
+ expect(gl_user).not_to be_blocked
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/workhorse_spec.rb b/spec/lib/gitlab/workhorse_spec.rb
new file mode 100644
index 00000000000..d940bf05061
--- /dev/null
+++ b/spec/lib/gitlab/workhorse_spec.rb
@@ -0,0 +1,18 @@
+require 'spec_helper'
+
+describe Gitlab::Workhorse, lib: true do
+ let(:project) { create(:project) }
+ let(:subject) { Gitlab::Workhorse }
+
+ describe "#send_git_archive" do
+ context "when the repository doesn't have an archive file path" do
+ before do
+ allow(project.repository).to receive(:archive_metadata).and_return(Hash.new)
+ end
+
+ it "raises an error" do
+ expect { subject.send_git_archive(project, "master", "zip") }.to raise_error(RuntimeError)
+ end
+ end
+ end
+end
diff --git a/spec/models/blob_spec.rb b/spec/models/blob_spec.rb
new file mode 100644
index 00000000000..78e95c8fac5
--- /dev/null
+++ b/spec/models/blob_spec.rb
@@ -0,0 +1,81 @@
+require 'rails_helper'
+
+describe Blob do
+ describe '.decorate' do
+ it 'returns NilClass when given nil' do
+ expect(described_class.decorate(nil)).to be_nil
+ end
+ end
+
+ describe '#svg?' do
+ it 'is falsey when not text' do
+ git_blob = double(text?: false)
+
+ expect(described_class.decorate(git_blob)).not_to be_svg
+ end
+
+ it 'is falsey when no language is detected' do
+ git_blob = double(text?: true, language: nil)
+
+ expect(described_class.decorate(git_blob)).not_to be_svg
+ end
+
+ it' is falsey when language is not SVG' do
+ git_blob = double(text?: true, language: double(name: 'XML'))
+
+ expect(described_class.decorate(git_blob)).not_to be_svg
+ end
+
+ it 'is truthy when language is SVG' do
+ git_blob = double(text?: true, language: double(name: 'SVG'))
+
+ expect(described_class.decorate(git_blob)).to be_svg
+ end
+ end
+
+ describe '#to_partial_path' do
+ def stubbed_blob(overrides = {})
+ overrides.reverse_merge!(
+ image?: false,
+ language: nil,
+ lfs_pointer?: false,
+ svg?: false,
+ text?: false
+ )
+
+ described_class.decorate(double).tap do |blob|
+ allow(blob).to receive_messages(overrides)
+ end
+ end
+
+ it 'handles LFS pointers' do
+ blob = stubbed_blob(lfs_pointer?: true)
+
+ expect(blob.to_partial_path).to eq 'download'
+ end
+
+ it 'handles SVGs' do
+ blob = stubbed_blob(text?: true, svg?: true)
+
+ expect(blob.to_partial_path).to eq 'image'
+ end
+
+ it 'handles images' do
+ blob = stubbed_blob(image?: true)
+
+ expect(blob.to_partial_path).to eq 'image'
+ end
+
+ it 'handles text' do
+ blob = stubbed_blob(text?: true)
+
+ expect(blob.to_partial_path).to eq 'text'
+ end
+
+ it 'defaults to download' do
+ blob = stubbed_blob
+
+ expect(blob.to_partial_path).to eq 'download'
+ end
+ end
+end
diff --git a/spec/models/build_spec.rb b/spec/models/build_spec.rb
index 606340d87e4..e3d3d453653 100644
--- a/spec/models/build_spec.rb
+++ b/spec/models/build_spec.rb
@@ -243,7 +243,7 @@ describe Ci::Build, models: true do
end
describe :can_be_served? do
- let(:runner) { FactoryGirl.create :ci_specific_runner }
+ let(:runner) { FactoryGirl.create :ci_runner }
before { build.project.runners << runner }
@@ -285,7 +285,7 @@ describe Ci::Build, models: true do
end
context 'if there are runner' do
- let(:runner) { FactoryGirl.create :ci_specific_runner }
+ let(:runner) { FactoryGirl.create :ci_runner }
before do
build.project.runners << runner
@@ -322,7 +322,7 @@ describe Ci::Build, models: true do
it { is_expected.to be_truthy }
context "and there are specific runner" do
- let(:runner) { FactoryGirl.create :ci_specific_runner, contacted_at: 1.second.ago }
+ let(:runner) { FactoryGirl.create :ci_runner, contacted_at: 1.second.ago }
before do
build.project.runners << runner
@@ -346,15 +346,14 @@ describe Ci::Build, models: true do
describe :artifacts_download_url do
subject { build.artifacts_download_url }
- it "should be nil if artifact doesn't exist" do
- build.update_attributes(artifacts_file: nil)
- is_expected.to be_nil
+ context 'artifacts file does not exist' do
+ before { build.update_attributes(artifacts_file: nil) }
+ it { is_expected.to be_nil }
end
- it 'should not be nil if artifact exist' do
- gif = fixture_file_upload(Rails.root + 'spec/fixtures/banana_sample.gif', 'image/gif')
- build.update_attributes(artifacts_file: gif)
- is_expected.to_not be_nil
+ context 'artifacts file exists' do
+ let(:build) { create(:ci_build, :artifacts) }
+ it { is_expected.to_not be_nil }
end
end
@@ -381,11 +380,7 @@ describe Ci::Build, models: true do
end
context 'artifacts archive exists' do
- before do
- gif = fixture_file_upload(Rails.root + 'spec/fixtures/banana_sample.gif', 'image/gif')
- build.update_attributes(artifacts_file: gif)
- end
-
+ let(:build) { create(:ci_build, :artifacts) }
it { is_expected.to be_truthy }
end
end
@@ -398,16 +393,7 @@ describe Ci::Build, models: true do
end
context 'artifacts archive is a zip file and metadata exists' do
- before do
- fixture_dir = Rails.root + 'spec/fixtures/'
- archive = fixture_file_upload(fixture_dir + 'ci_build_artifacts.zip',
- 'application/zip')
- metadata = fixture_file_upload(fixture_dir + 'ci_build_artifacts_metadata.gz',
- 'application/x-gzip')
- build.update_attributes(artifacts_file: archive)
- build.update_attributes(artifacts_metadata: metadata)
- end
-
+ let(:build) { create(:ci_build, :artifacts) }
it { is_expected.to be_truthy }
end
end
@@ -511,6 +497,103 @@ describe Ci::Build, models: true do
expect(@build2.merge_request.id).to eq(@merge_request.id)
end
end
+ end
+
+ describe 'build erasable' do
+ shared_examples 'erasable' do
+ it 'should remove artifact file' do
+ expect(build.artifacts_file.exists?).to be_falsy
+ end
+
+ it 'should remove artifact metadata file' do
+ expect(build.artifacts_metadata.exists?).to be_falsy
+ end
+
+ it 'should erase build trace in trace file' do
+ expect(build.trace).to be_empty
+ end
+
+ it 'should set erased to true' do
+ expect(build.erased?).to be true
+ end
+
+ it 'should set erase date' do
+ expect(build.erased_at).to_not be_falsy
+ end
+ end
+
+ context 'build is not erasable' do
+ let!(:build) { create(:ci_build) }
+
+ describe '#erase' do
+ subject { build.erase }
+
+ it { is_expected.to be false }
+ end
+
+ describe '#erasable?' do
+ subject { build.erasable? }
+ it { is_expected.to eq false }
+ end
+ end
+
+ context 'build is erasable' do
+ let!(:build) { create(:ci_build, :trace, :success, :artifacts) }
+
+ describe '#erase' do
+ before { build.erase(erased_by: user) }
+
+ context 'erased by user' do
+ let!(:user) { create(:user, username: 'eraser') }
+
+ include_examples 'erasable'
+
+ it 'should record user who erased a build' do
+ expect(build.erased_by).to eq user
+ end
+ end
+
+ context 'erased by system' do
+ let(:user) { nil }
+
+ include_examples 'erasable'
+
+ it 'should not set user who erased a build' do
+ expect(build.erased_by).to be_nil
+ end
+ end
+ end
+ describe '#erasable?' do
+ subject { build.erasable? }
+ it { is_expected.to eq true }
+ end
+
+ describe '#erased?' do
+ let!(:build) { create(:ci_build, :trace, :success, :artifacts) }
+ subject { build.erased? }
+
+ context 'build has not been erased' do
+ it { is_expected.to be false }
+ end
+
+ context 'build has been erased' do
+ before { build.erase }
+
+ it { is_expected.to be true }
+ end
+ end
+
+ context 'metadata and build trace are not available' do
+ let!(:build) { create(:ci_build, :success, :artifacts) }
+ before { build.remove_artifacts_metadata! }
+
+ describe '#erase' do
+ it 'should not raise error' do
+ expect { build.erase }.to_not raise_error
+ end
+ end
+ end
+ end
end
end
diff --git a/spec/models/ci/commit_spec.rb b/spec/models/ci/commit_spec.rb
index dfc0cc3be1c..4dc309a4255 100644
--- a/spec/models/ci/commit_spec.rb
+++ b/spec/models/ci/commit_spec.rb
@@ -247,6 +247,35 @@ describe Ci::Commit, models: true do
end
end
+
+ context 'custom stage with first job allowed to fail' do
+ let(:yaml) do
+ {
+ stages: ['clean', 'test'],
+ clean_job: {
+ stage: 'clean',
+ allow_failure: true,
+ script: 'BUILD',
+ },
+ test_job: {
+ stage: 'test',
+ script: 'TEST',
+ },
+ }
+ end
+
+ before do
+ stub_ci_commit_yaml_file(YAML.dump(yaml))
+ create_builds
+ end
+
+ it 'properly schedules builds' do
+ expect(commit.builds.pluck(:status)).to contain_exactly('pending')
+ commit.builds.running_or_pending.each(&:drop)
+ expect(commit.builds.pluck(:status)).to contain_exactly('pending', 'failed')
+ end
+ end
+
context 'properly creates builds when "when" is defined' do
let(:yaml) do
{
diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb
index 232760dfeba..e891838672e 100644
--- a/spec/models/ci/runner_spec.rb
+++ b/spec/models/ci/runner_spec.rb
@@ -39,7 +39,7 @@ describe Ci::Runner, models: true do
describe :assign_to do
let!(:project) { FactoryGirl.create :empty_project }
- let!(:shared_runner) { FactoryGirl.create(:ci_shared_runner) }
+ let!(:shared_runner) { FactoryGirl.create(:ci_runner, :shared) }
before { shared_runner.assign_to(project) }
@@ -52,15 +52,15 @@ describe Ci::Runner, models: true do
subject { Ci::Runner.online }
before do
- @runner1 = FactoryGirl.create(:ci_shared_runner, contacted_at: 1.year.ago)
- @runner2 = FactoryGirl.create(:ci_shared_runner, contacted_at: 1.second.ago)
+ @runner1 = FactoryGirl.create(:ci_runner, :shared, contacted_at: 1.year.ago)
+ @runner2 = FactoryGirl.create(:ci_runner, :shared, contacted_at: 1.second.ago)
end
it { is_expected.to eq([@runner2])}
end
describe :online? do
- let(:runner) { FactoryGirl.create(:ci_shared_runner) }
+ let(:runner) { FactoryGirl.create(:ci_runner, :shared) }
subject { runner.online? }
@@ -84,7 +84,7 @@ describe Ci::Runner, models: true do
end
describe :status do
- let(:runner) { FactoryGirl.create(:ci_shared_runner, contacted_at: 1.second.ago) }
+ let(:runner) { FactoryGirl.create(:ci_runner, :shared, contacted_at: 1.second.ago) }
subject { runner.status }
@@ -115,7 +115,7 @@ describe Ci::Runner, models: true do
describe "belongs_to_one_project?" do
it "returns false if there are two projects runner assigned to" do
- runner = FactoryGirl.create(:ci_specific_runner)
+ runner = FactoryGirl.create(:ci_runner)
project = FactoryGirl.create(:empty_project)
project1 = FactoryGirl.create(:empty_project)
project.runners << runner
@@ -125,7 +125,7 @@ describe Ci::Runner, models: true do
end
it "returns true" do
- runner = FactoryGirl.create(:ci_specific_runner)
+ runner = FactoryGirl.create(:ci_runner)
project = FactoryGirl.create(:empty_project)
project.runners << runner
diff --git a/spec/models/commit_spec.rb b/spec/models/commit_spec.rb
index ecf37b40c58..253902512c3 100644
--- a/spec/models/commit_spec.rb
+++ b/spec/models/commit_spec.rb
@@ -118,4 +118,38 @@ eos
it { expect(data[:modified]).to eq([".gitmodules"]) }
it { expect(data[:removed]).to eq([]) }
end
+
+ describe '#reverts_commit?' do
+ let(:another_commit) { double(:commit, revert_description: "This reverts commit #{commit.sha}") }
+
+ it { expect(commit.reverts_commit?(another_commit)).to be_falsy }
+
+ context 'commit has no description' do
+ before { allow(commit).to receive(:description?).and_return(false) }
+
+ it { expect(commit.reverts_commit?(another_commit)).to be_falsy }
+ end
+
+ context "another_commit's description does not revert commit" do
+ before { allow(commit).to receive(:description).and_return("Foo Bar") }
+
+ it { expect(commit.reverts_commit?(another_commit)).to be_falsy }
+ end
+
+ context "another_commit's description reverts commit" do
+ before { allow(commit).to receive(:description).and_return("Foo #{another_commit.revert_description} Bar") }
+
+ it { expect(commit.reverts_commit?(another_commit)).to be_truthy }
+ end
+
+ context "another_commit's description reverts merged merge request" do
+ before do
+ revert_description = "This reverts merge request !foo123"
+ allow(another_commit).to receive(:revert_description).and_return(revert_description)
+ allow(commit).to receive(:description).and_return("Foo #{another_commit.revert_description} Bar")
+ end
+
+ it { expect(commit.reverts_commit?(another_commit)).to be_truthy }
+ end
+ end
end
diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb
index f35b48601ad..c51f34034d7 100644
--- a/spec/models/merge_request_spec.rb
+++ b/spec/models/merge_request_spec.rb
@@ -24,6 +24,7 @@
# merge_params :text
# merge_when_build_succeeds :boolean default(FALSE), not null
# merge_user_id :integer
+# merge_commit_sha :string
#
require 'spec_helper'
diff --git a/spec/models/note_spec.rb b/spec/models/note_spec.rb
index 9182b42661d..583937ca748 100644
--- a/spec/models/note_spec.rb
+++ b/spec/models/note_spec.rb
@@ -26,6 +26,8 @@ describe Note, models: true do
it { is_expected.to belong_to(:project) }
it { is_expected.to belong_to(:noteable) }
it { is_expected.to belong_to(:author).class_name('User') }
+
+ it { is_expected.to have_many(:todos).dependent(:destroy) }
end
describe 'validation' do
@@ -203,11 +205,19 @@ describe Note, models: true do
end
describe "set_award!" do
- let(:issue) { create :issue }
+ let(:merge_request) { create :merge_request }
it "converts aliases to actual name" do
- note = create :note, note: ":+1:", noteable: issue
+ note = create(:note, note: ":+1:", noteable: merge_request)
expect(note.reload.note).to eq("thumbsup")
end
+
+ it "is not an award emoji when comment is on a diff" do
+ note = create(:note, note: ":blowfish:", noteable: merge_request, line_code: "11d5d2e667e9da4f7f610f81d86c974b146b13bd_0_2")
+ note = note.reload
+
+ expect(note.note).to eq(":blowfish:")
+ expect(note.is_award?).to be_falsy
+ end
end
end
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index a3de23369e1..3ccb627a259 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -519,8 +519,8 @@ describe Project, models: true do
describe :any_runners do
let(:project) { create(:empty_project, shared_runners_enabled: shared_runners_enabled) }
- let(:specific_runner) { create(:ci_specific_runner) }
- let(:shared_runner) { create(:ci_shared_runner) }
+ let(:specific_runner) { create(:ci_runner) }
+ let(:shared_runner) { create(:ci_runner, :shared) }
context 'for shared runners disabled' do
let(:shared_runners_enabled) { false }
diff --git a/spec/models/project_team_spec.rb b/spec/models/project_team_spec.rb
index 5cd5ae327bf..7b63da005f0 100644
--- a/spec/models/project_team_spec.rb
+++ b/spec/models/project_team_spec.rb
@@ -68,14 +68,24 @@ describe ProjectTeam, models: true do
end
describe "#human_max_access" do
- it "return master role" do
- user = create :user
- group = create :group
- group.add_users([user.id], GroupMember::MASTER)
- project = create(:project, namespace: group)
- project.team << [user, :guest]
-
- expect(project.team.human_max_access(user.id)).to eq("Master")
+ it 'returns Master role' do
+ user = create(:user)
+ group = create(:group)
+ group.add_master(user)
+
+ project = build_stubbed(:empty_project, namespace: group)
+
+ expect(project.team.human_max_access(user.id)).to eq 'Master'
+ end
+
+ it 'returns Owner role' do
+ user = create(:user)
+ group = create(:group)
+ group.add_owner(user)
+
+ project = build_stubbed(:empty_project, namespace: group)
+
+ expect(project.team.human_max_access(user.id)).to eq 'Owner'
end
end
end
diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb
index e1ee43e64db..b596782f4e1 100644
--- a/spec/models/repository_spec.rb
+++ b/spec/models/repository_spec.rb
@@ -5,6 +5,15 @@ describe Repository, models: true do
let(:repository) { create(:project).repository }
let(:user) { create(:user) }
+ let(:commit_options) do
+ author = repository.user_to_committer(user)
+ { message: 'Test message', committer: author, author: author }
+ end
+ let(:merge_commit) do
+ source_sha = repository.find_branch('feature').target
+ merge_commit_id = repository.merge(user, source_sha, 'master', commit_options)
+ repository.commit(merge_commit_id)
+ end
describe :branch_names_contains do
subject { repository.branch_names_contains(sample_commit.id) }
@@ -200,13 +209,22 @@ describe Repository, models: true do
describe :commit_with_hooks do
context 'when pre hooks were successful' do
- it 'should run without errors' do
- expect_any_instance_of(GitHooksService).to receive(:execute).and_return(true)
+ before do
+ expect_any_instance_of(GitHooksService).to receive(:execute).
+ and_return(true)
+ end
+ it 'should run without errors' do
expect do
repository.commit_with_hooks(user, 'feature') { sample_commit.id }
end.not_to raise_error
end
+
+ it 'should ensure the autocrlf Git option is set to :input' do
+ expect(repository).to receive(:update_autocrlf_option)
+
+ repository.commit_with_hooks(user, 'feature') { sample_commit.id }
+ end
end
context 'when pre hooks failed' do
@@ -220,6 +238,25 @@ describe Repository, models: true do
end
end
+ describe '#exists?' do
+ it 'returns true when a repository exists' do
+ expect(repository.exists?).to eq(true)
+ end
+
+ it 'returns false when a repository does not exist' do
+ expect(repository.raw_repository).to receive(:rugged).
+ and_raise(Gitlab::Git::Repository::NoRepository)
+
+ expect(repository.exists?).to eq(false)
+ end
+
+ it 'returns false when there is no namespace' do
+ allow(repository).to receive(:path_with_namespace).and_return(nil)
+
+ expect(repository.exists?).to eq(false)
+ end
+ end
+
describe '#has_visible_content?' do
subject { repository.has_visible_content? }
@@ -249,6 +286,33 @@ describe Repository, models: true do
end
end
+ describe '#update_autocrlf_option' do
+ describe 'when autocrlf is not already set to :input' do
+ before do
+ repository.raw_repository.autocrlf = true
+ end
+
+ it 'sets autocrlf to :input' do
+ repository.update_autocrlf_option
+
+ expect(repository.raw_repository.autocrlf).to eq(:input)
+ end
+ end
+
+ describe 'when autocrlf is already set to :input' do
+ before do
+ repository.raw_repository.autocrlf = :input
+ end
+
+ it 'does nothing' do
+ expect(repository.raw_repository).to_not receive(:autocrlf=).
+ with(:input)
+
+ repository.update_autocrlf_option
+ end
+ end
+ end
+
describe '#empty?' do
let(:empty_repository) { create(:project_empty_repo).repository }
@@ -297,6 +361,20 @@ describe Repository, models: true do
repository.expire_cache('master')
end
+
+ it 'expires the emptiness cache for an empty repository' do
+ expect(repository).to receive(:empty?).and_return(true)
+ expect(repository).to receive(:expire_emptiness_caches)
+
+ repository.expire_cache
+ end
+
+ it 'does not expire the emptiness cache for a non-empty repository' do
+ expect(repository).to receive(:empty?).and_return(false)
+ expect(repository).to_not receive(:expire_emptiness_caches)
+
+ repository.expire_cache
+ end
end
describe '#expire_root_ref_cache' do
@@ -355,9 +433,35 @@ describe Repository, models: true do
end
end
+ describe '#expire_emptiness_caches' do
+ let(:cache) { repository.send(:cache) }
+
+ it 'expires the caches' do
+ expect(cache).to receive(:expire).with(:empty?)
+ expect(repository).to receive(:expire_has_visible_content_cache)
+
+ repository.expire_emptiness_caches
+ end
+ end
+
describe :skip_merged_commit do
subject { repository.commits(Gitlab::Git::BRANCH_REF_PREFIX + "'test'", nil, 100, 0, true).map{ |k| k.id } }
it { is_expected.not_to include('e56497bb5f03a90a51293fc6d516788730953899') }
end
+
+ describe '#merge' do
+ it 'should merge the code and return the commit id' do
+ expect(merge_commit).to be_present
+ expect(repository.blob_at(merge_commit.id, 'files/ruby/feature.rb')).to be_present
+ end
+ end
+
+ describe '#revert_merge' do
+ it 'should revert the changes' do
+ repository.revert(user, merge_commit, 'master')
+
+ expect(repository.blob_at_branch('master', 'files/ruby/feature.rb')).not_to be_present
+ end
+ end
end
diff --git a/spec/models/todo_spec.rb.rb b/spec/models/todo_spec.rb.rb
new file mode 100644
index 00000000000..ac481bf9fbd
--- /dev/null
+++ b/spec/models/todo_spec.rb.rb
@@ -0,0 +1,89 @@
+# == Schema Information
+#
+# Table name: todos
+#
+# id :integer not null, primary key
+# user_id :integer not null
+# project_id :integer not null
+# target_id :integer not null
+# target_type :string not null
+# author_id :integer
+# note_id :integer
+# action :integer not null
+# state :string not null
+# created_at :datetime
+# updated_at :datetime
+#
+
+require 'spec_helper'
+
+describe Todo, models: true do
+ describe 'relationships' do
+ it { is_expected.to belong_to(:author).class_name("User") }
+ it { is_expected.to belong_to(:note) }
+ it { is_expected.to belong_to(:project) }
+ it { is_expected.to belong_to(:target).touch(true) }
+ it { is_expected.to belong_to(:user) }
+ end
+
+ describe 'respond to' do
+ it { is_expected.to respond_to(:author_name) }
+ it { is_expected.to respond_to(:author_email) }
+ end
+
+ describe 'validations' do
+ it { is_expected.to validate_presence_of(:action) }
+ it { is_expected.to validate_presence_of(:target) }
+ it { is_expected.to validate_presence_of(:user) }
+ end
+
+ describe '#action_name' do
+ it 'returns proper message when action is an assigment' do
+ subject.action = Todo::ASSIGNED
+
+ expect(subject.action_name).to eq 'assigned'
+ end
+
+ it 'returns proper message when action is a mention' do
+ subject.action = Todo::MENTIONED
+
+ expect(subject.action_name).to eq 'mentioned you on'
+ end
+ end
+
+ describe '#body' do
+ before do
+ subject.target = build(:issue, title: 'Bugfix')
+ end
+
+ it 'returns target title when note is blank' do
+ subject.note = nil
+
+ expect(subject.body).to eq 'Bugfix'
+ end
+
+ it 'returns note when note is present' do
+ subject.note = build(:note, note: 'quick fix')
+
+ expect(subject.body).to eq 'quick fix'
+ end
+ end
+
+ describe '#target_iid' do
+ let(:issue) { build(:issue, id: 1, iid: 5) }
+
+ before do
+ subject.target = issue
+ end
+
+ it 'returns target.iid when target respond to iid' do
+ expect(subject.target_iid).to eq 5
+ end
+
+ it 'returns target_id when target does not respond to iid' do
+ allow(issue).to receive(:respond_to?).with(:iid).and_return(false)
+
+ expect(subject.target_iid).to eq 1
+ end
+ end
+end
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index 47ce409fe4b..32d4f39b04a 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -92,6 +92,7 @@ describe User, models: true do
it { is_expected.to have_many(:identities).dependent(:destroy) }
it { is_expected.to have_one(:abuse_report) }
it { is_expected.to have_many(:spam_logs).dependent(:destroy) }
+ it { is_expected.to have_many(:todos).dependent(:destroy) }
end
describe 'validations' do
diff --git a/spec/requests/api/builds_spec.rb b/spec/requests/api/builds_spec.rb
index 6c07802db8b..175ee861a71 100644
--- a/spec/requests/api/builds_spec.rb
+++ b/spec/requests/api/builds_spec.rb
@@ -4,148 +4,190 @@ describe API::API, api: true do
include ApiHelpers
let(:user) { create(:user) }
+ let(:api_user) { user }
let(:user2) { create(:user) }
let!(:project) { create(:project, creator_id: user.id) }
let!(:developer) { create(:project_member, user: user, project: project, access_level: ProjectMember::DEVELOPER) }
let!(:reporter) { create(:project_member, user: user2, project: project, access_level: ProjectMember::REPORTER) }
let(:commit) { create(:ci_commit, project: project)}
let(:build) { create(:ci_build, commit: commit) }
- let(:build_with_trace) { create(:ci_build_with_trace, commit: commit) }
- let(:build_canceled) { create(:ci_build, :canceled, commit: commit) }
describe 'GET /projects/:id/builds ' do
+ let(:query) { '' }
+
+ before { get api("/projects/#{project.id}/builds?#{query}", api_user) }
+
context 'authorized user' do
it 'should return project builds' do
- get api("/projects/#{project.id}/builds", user)
-
expect(response.status).to eq(200)
expect(json_response).to be_an Array
end
- it 'should filter project with one scope element' do
- get api("/projects/#{project.id}/builds?scope=pending", user)
+ context 'filter project with one scope element' do
+ let(:query) { 'scope=pending' }
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
+ it do
+ expect(response.status).to eq(200)
+ expect(json_response).to be_an Array
+ end
end
- it 'should filter project with array of scope elements' do
- get api("/projects/#{project.id}/builds?scope[0]=pending&scope[1]=running", user)
+ context 'filter project with array of scope elements' do
+ let(:query) { 'scope[0]=pending&scope[1]=running' }
- expect(response.status).to eq(200)
- expect(json_response).to be_an Array
+ it do
+ expect(response.status).to eq(200)
+ expect(json_response).to be_an Array
+ end
end
- it 'should respond 400 when scope contains invalid state' do
- get api("/projects/#{project.id}/builds?scope[0]=pending&scope[1]=unknown_status", user)
+ context 'respond 400 when scope contains invalid state' do
+ let(:query) { 'scope[0]=pending&scope[1]=unknown_status' }
- expect(response.status).to eq(400)
+ it { expect(response.status).to eq(400) }
end
end
context 'unauthorized user' do
- it 'should not return project builds' do
- get api("/projects/#{project.id}/builds")
+ let(:api_user) { nil }
+ it 'should not return project builds' do
expect(response.status).to eq(401)
end
end
end
describe 'GET /projects/:id/repository/commits/:sha/builds' do
+ before do
+ project.ensure_ci_commit(commit.sha)
+ get api("/projects/#{project.id}/repository/commits/#{commit.sha}/builds", api_user)
+ end
+
context 'authorized user' do
it 'should return project builds for specific commit' do
- project.ensure_ci_commit(commit.sha)
- get api("/projects/#{project.id}/repository/commits/#{commit.sha}/builds", user)
-
expect(response.status).to eq(200)
expect(json_response).to be_an Array
end
end
context 'unauthorized user' do
- it 'should not return project builds' do
- project.ensure_ci_commit(commit.sha)
- get api("/projects/#{project.id}/repository/commits/#{commit.sha}/builds")
+ let(:api_user) { nil }
+ it 'should not return project builds' do
expect(response.status).to eq(401)
end
end
end
describe 'GET /projects/:id/builds/:build_id' do
+ before { get api("/projects/#{project.id}/builds/#{build.id}", api_user) }
+
context 'authorized user' do
it 'should return specific build data' do
- get api("/projects/#{project.id}/builds/#{build.id}", user)
-
expect(response.status).to eq(200)
expect(json_response['name']).to eq('test')
end
end
context 'unauthorized user' do
- it 'should not return specific build data' do
- get api("/projects/#{project.id}/builds/#{build.id}")
+ let(:api_user) { nil }
+ it 'should not return specific build data' do
expect(response.status).to eq(401)
end
end
end
+ describe 'GET /projects/:id/builds/:build_id/artifacts' do
+ before { get api("/projects/#{project.id}/builds/#{build.id}/artifacts", api_user) }
+
+ context 'build with artifacts' do
+ let(:build) { create(:ci_build, :artifacts, commit: commit) }
+
+ context 'authorized user' do
+ let(:download_headers) do
+ { 'Content-Transfer-Encoding'=>'binary',
+ 'Content-Disposition'=>'attachment; filename=ci_build_artifacts.zip' }
+ end
+
+ it 'should return specific build artifacts' do
+ expect(response.status).to eq(200)
+ expect(response.headers).to include(download_headers)
+ end
+ end
+
+ context 'unauthorized user' do
+ let(:api_user) { nil }
+
+ it 'should not return specific build artifacts' do
+ expect(response.status).to eq(401)
+ end
+ end
+ end
+
+ it 'should not return build artifacts if not uploaded' do
+ expect(response.status).to eq(404)
+ end
+ end
+
describe 'GET /projects/:id/builds/:build_id/trace' do
+ let(:build) { create(:ci_build, :trace, commit: commit) }
+
+ before { get api("/projects/#{project.id}/builds/#{build.id}/trace", api_user) }
+
context 'authorized user' do
it 'should return specific build trace' do
- get api("/projects/#{project.id}/builds/#{build_with_trace.id}/trace", user)
-
expect(response.status).to eq(200)
- expect(response.body).to eq(build_with_trace.trace)
+ expect(response.body).to eq(build.trace)
end
end
context 'unauthorized user' do
- it 'should not return specific build trace' do
- get api("/projects/#{project.id}/builds/#{build_with_trace.id}/trace")
+ let(:api_user) { nil }
+ it 'should not return specific build trace' do
expect(response.status).to eq(401)
end
end
end
describe 'POST /projects/:id/builds/:build_id/cancel' do
+ before { post api("/projects/#{project.id}/builds/#{build.id}/cancel", api_user) }
+
context 'authorized user' do
context 'user with :update_build persmission' do
it 'should cancel running or pending build' do
- post api("/projects/#{project.id}/builds/#{build.id}/cancel", user)
-
expect(response.status).to eq(201)
expect(project.builds.first.status).to eq('canceled')
end
end
context 'user without :update_build permission' do
- it 'should not cancel build' do
- post api("/projects/#{project.id}/builds/#{build.id}/cancel", user2)
+ let(:api_user) { user2 }
+ it 'should not cancel build' do
expect(response.status).to eq(403)
end
end
end
context 'unauthorized user' do
- it 'should not cancel build' do
- post api("/projects/#{project.id}/builds/#{build.id}/cancel")
+ let(:api_user) { nil }
+ it 'should not cancel build' do
expect(response.status).to eq(401)
end
end
end
describe 'POST /projects/:id/builds/:build_id/retry' do
+ let(:build) { create(:ci_build, :canceled, commit: commit) }
+
+ before { post api("/projects/#{project.id}/builds/#{build.id}/retry", api_user) }
+
context 'authorized user' do
- context 'user with :update_build persmission' do
+ context 'user with :update_build permission' do
it 'should retry non-running build' do
- post api("/projects/#{project.id}/builds/#{build_canceled.id}/retry", user)
-
expect(response.status).to eq(201)
expect(project.builds.first.status).to eq('canceled')
expect(json_response['status']).to eq('pending')
@@ -153,20 +195,50 @@ describe API::API, api: true do
end
context 'user without :update_build permission' do
- it 'should not retry build' do
- post api("/projects/#{project.id}/builds/#{build_canceled.id}/retry", user2)
+ let(:api_user) { user2 }
+ it 'should not retry build' do
expect(response.status).to eq(403)
end
end
end
context 'unauthorized user' do
- it 'should not retry build' do
- post api("/projects/#{project.id}/builds/#{build_canceled.id}/retry")
+ let(:api_user) { nil }
+ it 'should not retry build' do
expect(response.status).to eq(401)
end
end
end
+
+ describe 'POST /projects/:id/builds/:build_id/erase' do
+ before do
+ post api("/projects/#{project.id}/builds/#{build.id}/erase", user)
+ end
+
+ context 'build is erasable' do
+ let(:build) { create(:ci_build, :trace, :artifacts, :success, project: project, commit: commit) }
+
+ it 'should erase build content' do
+ expect(response.status).to eq 201
+ expect(build.trace).to be_empty
+ expect(build.artifacts_file.exists?).to be_falsy
+ expect(build.artifacts_metadata.exists?).to be_falsy
+ end
+
+ it 'should update build' do
+ expect(build.reload.erased_at).to be_truthy
+ expect(build.reload.erased_by).to eq user
+ end
+ end
+
+ context 'build is not erasable' do
+ let(:build) { create(:ci_build, :trace, project: project, commit: commit) }
+
+ it 'should respond with forbidden' do
+ expect(response.status).to eq 403
+ end
+ end
+ end
end
diff --git a/spec/requests/api/repositories_spec.rb b/spec/requests/api/repositories_spec.rb
index 4911cdd9da6..0ae63b0afec 100644
--- a/spec/requests/api/repositories_spec.rb
+++ b/spec/requests/api/repositories_spec.rb
@@ -4,6 +4,7 @@ require 'mime/types'
describe API::API, api: true do
include ApiHelpers
include RepoHelpers
+ include WorkhorseHelpers
let(:user) { create(:user) }
let(:user2) { create(:user) }
@@ -91,21 +92,27 @@ describe API::API, api: true do
get api("/projects/#{project.id}/repository/archive", user)
repo_name = project.repository.name.gsub("\.git", "")
expect(response.status).to eq(200)
- expect(json_response['ArchivePath']).to match(/#{repo_name}\-[^\.]+\.tar.gz/)
+ type, params = workhorse_send_data
+ expect(type).to eq('git-archive')
+ expect(params['ArchivePath']).to match(/#{repo_name}\-[^\.]+\.tar.gz/)
end
it "should get the archive.zip" do
get api("/projects/#{project.id}/repository/archive.zip", user)
repo_name = project.repository.name.gsub("\.git", "")
expect(response.status).to eq(200)
- expect(json_response['ArchivePath']).to match(/#{repo_name}\-[^\.]+\.zip/)
+ type, params = workhorse_send_data
+ expect(type).to eq('git-archive')
+ expect(params['ArchivePath']).to match(/#{repo_name}\-[^\.]+\.zip/)
end
it "should get the archive.tar.bz2" do
get api("/projects/#{project.id}/repository/archive.tar.bz2", user)
repo_name = project.repository.name.gsub("\.git", "")
expect(response.status).to eq(200)
- expect(json_response['ArchivePath']).to match(/#{repo_name}\-[^\.]+\.tar.bz2/)
+ type, params = workhorse_send_data
+ expect(type).to eq('git-archive')
+ expect(params['ArchivePath']).to match(/#{repo_name}\-[^\.]+\.tar.bz2/)
end
it "should return 404 for invalid sha" do
diff --git a/spec/requests/api/runners_spec.rb b/spec/requests/api/runners_spec.rb
new file mode 100644
index 00000000000..78484747d6a
--- /dev/null
+++ b/spec/requests/api/runners_spec.rb
@@ -0,0 +1,464 @@
+require 'spec_helper'
+
+describe API::Runners, api: true do
+ include ApiHelpers
+
+ let(:admin) { create(:user, :admin) }
+ let(:user) { create(:user) }
+ let(:user2) { create(:user) }
+
+ let(:project) { create(:project, creator_id: user.id) }
+ let(:project2) { create(:project, creator_id: user.id) }
+
+ let!(:shared_runner) { create(:ci_runner, :shared) }
+ let!(:unused_specific_runner) { create(:ci_runner) }
+
+ let!(:specific_runner) do
+ create(:ci_runner).tap do |runner|
+ create(:ci_runner_project, runner: runner, project: project)
+ end
+ end
+
+ let!(:two_projects_runner) do
+ create(:ci_runner).tap do |runner|
+ create(:ci_runner_project, runner: runner, project: project)
+ create(:ci_runner_project, runner: runner, project: project2)
+ end
+ end
+
+ before do
+ # Set project access for users
+ create(:project_member, user: user, project: project, access_level: ProjectMember::MASTER)
+ create(:project_member, user: user, project: project2, access_level: ProjectMember::MASTER)
+ create(:project_member, user: user2, project: project, access_level: ProjectMember::REPORTER)
+ end
+
+ describe 'GET /runners' do
+ context 'authorized user' do
+ it 'should return user available runners' do
+ get api('/runners', user)
+ shared = json_response.any?{ |r| r['is_shared'] }
+
+ expect(response.status).to eq(200)
+ expect(json_response).to be_an Array
+ expect(shared).to be_falsey
+ end
+
+ it 'should filter runners by scope' do
+ get api('/runners?scope=active', user)
+ shared = json_response.any?{ |r| r['is_shared'] }
+
+ expect(response.status).to eq(200)
+ expect(json_response).to be_an Array
+ expect(shared).to be_falsey
+ end
+
+ it 'should avoid filtering if scope is invalid' do
+ get api('/runners?scope=unknown', user)
+ expect(response.status).to eq(400)
+ end
+ end
+
+ context 'unauthorized user' do
+ it 'should not return runners' do
+ get api('/runners')
+
+ expect(response.status).to eq(401)
+ end
+ end
+ end
+
+ describe 'GET /runners/all' do
+ context 'authorized user' do
+ context 'with admin privileges' do
+ it 'should return all runners' do
+ get api('/runners/all', admin)
+ shared = json_response.any?{ |r| r['is_shared'] }
+
+ expect(response.status).to eq(200)
+ expect(json_response).to be_an Array
+ expect(shared).to be_truthy
+ end
+ end
+
+ context 'without admin privileges' do
+ it 'should not return runners list' do
+ get api('/runners/all', user)
+
+ expect(response.status).to eq(403)
+ end
+ end
+
+ it 'should filter runners by scope' do
+ get api('/runners/all?scope=specific', admin)
+ shared = json_response.any?{ |r| r['is_shared'] }
+
+ expect(response.status).to eq(200)
+ expect(json_response).to be_an Array
+ expect(shared).to be_falsey
+ end
+
+ it 'should avoid filtering if scope is invalid' do
+ get api('/runners?scope=unknown', admin)
+ expect(response.status).to eq(400)
+ end
+ end
+
+ context 'unauthorized user' do
+ it 'should not return runners' do
+ get api('/runners')
+
+ expect(response.status).to eq(401)
+ end
+ end
+ end
+
+ describe 'GET /runners/:id' do
+ context 'admin user' do
+ context 'when runner is shared' do
+ it "should return runner's details" do
+ get api("/runners/#{shared_runner.id}", admin)
+
+ expect(response.status).to eq(200)
+ expect(json_response['description']).to eq(shared_runner.description)
+ end
+ end
+
+ context 'when runner is not shared' do
+ it "should return runner's details" do
+ get api("/runners/#{specific_runner.id}", admin)
+
+ expect(response.status).to eq(200)
+ expect(json_response['description']).to eq(specific_runner.description)
+ end
+ end
+
+ it 'should return 404 if runner does not exists' do
+ get api('/runners/9999', admin)
+
+ expect(response.status).to eq(404)
+ end
+ end
+
+ context "runner project's administrative user" do
+ context 'when runner is not shared' do
+ it "should return runner's details" do
+ get api("/runners/#{specific_runner.id}", user)
+
+ expect(response.status).to eq(200)
+ expect(json_response['description']).to eq(specific_runner.description)
+ end
+ end
+
+ context 'when runner is shared' do
+ it "should return runner's details" do
+ get api("/runners/#{shared_runner.id}", user)
+
+ expect(response.status).to eq(200)
+ expect(json_response['description']).to eq(shared_runner.description)
+ end
+ end
+ end
+
+ context 'other authorized user' do
+ it "should not return runner's details" do
+ get api("/runners/#{specific_runner.id}", user2)
+
+ expect(response.status).to eq(403)
+ end
+ end
+
+ context 'unauthorized user' do
+ it "should not return runner's details" do
+ get api("/runners/#{specific_runner.id}")
+
+ expect(response.status).to eq(401)
+ end
+ end
+ end
+
+ describe 'PUT /runners/:id' do
+ context 'admin user' do
+ context 'when runner is shared' do
+ it 'should update runner' do
+ description = shared_runner.description
+ active = shared_runner.active
+
+ put api("/runners/#{shared_runner.id}", admin), description: "#{description}_updated", active: !active,
+ tag_list: ['ruby2.1', 'pgsql', 'mysql']
+ shared_runner.reload
+
+ expect(response.status).to eq(200)
+ expect(shared_runner.description).to eq("#{description}_updated")
+ expect(shared_runner.active).to eq(!active)
+ expect(shared_runner.tag_list).to include('ruby2.1', 'pgsql', 'mysql')
+ end
+ end
+
+ context 'when runner is not shared' do
+ it 'should update runner' do
+ description = specific_runner.description
+ put api("/runners/#{specific_runner.id}", admin), description: 'test'
+ specific_runner.reload
+
+ expect(response.status).to eq(200)
+ expect(specific_runner.description).to eq('test')
+ expect(specific_runner.description).not_to eq(description)
+ end
+ end
+
+ it 'should return 404 if runner does not exists' do
+ put api('/runners/9999', admin), description: 'test'
+
+ expect(response.status).to eq(404)
+ end
+ end
+
+ context 'authorized user' do
+ context 'when runner is shared' do
+ it 'should not update runner' do
+ put api("/runners/#{shared_runner.id}", user)
+
+ expect(response.status).to eq(403)
+ end
+ end
+
+ context 'when runner is not shared' do
+ it 'should not update runner without access to it' do
+ put api("/runners/#{specific_runner.id}", user2)
+
+ expect(response.status).to eq(403)
+ end
+
+ it 'should update runner with access to it' do
+ description = specific_runner.description
+ put api("/runners/#{specific_runner.id}", admin), description: 'test'
+ specific_runner.reload
+
+ expect(response.status).to eq(200)
+ expect(specific_runner.description).to eq('test')
+ expect(specific_runner.description).not_to eq(description)
+ end
+ end
+ end
+
+ context 'unauthorized user' do
+ it 'should not delete runner' do
+ put api("/runners/#{specific_runner.id}")
+
+ expect(response.status).to eq(401)
+ end
+ end
+ end
+
+ describe 'DELETE /runners/:id' do
+ context 'admin user' do
+ context 'when runner is shared' do
+ it 'should delete runner' do
+ expect do
+ delete api("/runners/#{shared_runner.id}", admin)
+ end.to change{ Ci::Runner.shared.count }.by(-1)
+ expect(response.status).to eq(200)
+ end
+ end
+
+ context 'when runner is not shared' do
+ it 'should delete unused runner' do
+ expect do
+ delete api("/runners/#{unused_specific_runner.id}", admin)
+ end.to change{ Ci::Runner.specific.count }.by(-1)
+ expect(response.status).to eq(200)
+ end
+
+ it 'should delete used runner' do
+ expect do
+ delete api("/runners/#{specific_runner.id}", admin)
+ end.to change{ Ci::Runner.specific.count }.by(-1)
+ expect(response.status).to eq(200)
+ end
+ end
+
+ it 'should return 404 if runner does not exists' do
+ delete api('/runners/9999', admin)
+
+ expect(response.status).to eq(404)
+ end
+ end
+
+ context 'authorized user' do
+ context 'when runner is shared' do
+ it 'should not delete runner' do
+ delete api("/runners/#{shared_runner.id}", user)
+ expect(response.status).to eq(403)
+ end
+ end
+
+ context 'when runner is not shared' do
+ it 'should not delete runner without access to it' do
+ delete api("/runners/#{specific_runner.id}", user2)
+ expect(response.status).to eq(403)
+ end
+
+ it 'should not delete runner with more than one associated project' do
+ delete api("/runners/#{two_projects_runner.id}", user)
+ expect(response.status).to eq(403)
+ end
+
+ it 'should delete runner for one owned project' do
+ expect do
+ delete api("/runners/#{specific_runner.id}", user)
+ end.to change{ Ci::Runner.specific.count }.by(-1)
+ expect(response.status).to eq(200)
+ end
+ end
+ end
+
+ context 'unauthorized user' do
+ it 'should not delete runner' do
+ delete api("/runners/#{specific_runner.id}")
+
+ expect(response.status).to eq(401)
+ end
+ end
+ end
+
+ describe 'GET /projects/:id/runners' do
+ context 'authorized user with master privileges' do
+ it "should return project's runners" do
+ get api("/projects/#{project.id}/runners", user)
+ shared = json_response.any?{ |r| r['is_shared'] }
+
+ expect(response.status).to eq(200)
+ expect(json_response).to be_an Array
+ expect(shared).to be_truthy
+ end
+ end
+
+ context 'authorized user without master privileges' do
+ it "should not return project's runners" do
+ get api("/projects/#{project.id}/runners", user2)
+
+ expect(response.status).to eq(403)
+ end
+ end
+
+ context 'unauthorized user' do
+ it "should not return project's runners" do
+ get api("/projects/#{project.id}/runners")
+
+ expect(response.status).to eq(401)
+ end
+ end
+ end
+
+ describe 'POST /projects/:id/runners' do
+ context 'authorized user' do
+ it 'should enable specific runner' do
+ specific_runner2 = create(:ci_runner).tap do |runner|
+ create(:ci_runner_project, runner: runner, project: project2)
+ end
+
+ expect do
+ post api("/projects/#{project.id}/runners", user), runner_id: specific_runner2.id
+ end.to change{ project.runners.count }.by(+1)
+ expect(response.status).to eq(201)
+ end
+
+ it 'should avoid changes when enabling already enabled runner' do
+ expect do
+ post api("/projects/#{project.id}/runners", user), runner_id: specific_runner.id
+ end.to change{ project.runners.count }.by(0)
+ expect(response.status).to eq(201)
+ end
+
+ it 'should not enable shared runner' do
+ post api("/projects/#{project.id}/runners", user), runner_id: shared_runner.id
+
+ expect(response.status).to eq(403)
+ end
+
+ context 'user is admin' do
+ it 'should enable any specific runner' do
+ expect do
+ post api("/projects/#{project.id}/runners", admin), runner_id: unused_specific_runner.id
+ end.to change{ project.runners.count }.by(+1)
+ expect(response.status).to eq(201)
+ end
+ end
+
+ context 'user is not admin' do
+ it 'should not enable runner without access to' do
+ post api("/projects/#{project.id}/runners", user), runner_id: unused_specific_runner.id
+
+ expect(response.status).to eq(403)
+ end
+ end
+
+ it 'should raise an error when no runner_id param is provided' do
+ post api("/projects/#{project.id}/runners", admin)
+
+ expect(response.status).to eq(400)
+ end
+ end
+
+ context 'authorized user without permissions' do
+ it 'should not enable runner' do
+ post api("/projects/#{project.id}/runners", user2)
+
+ expect(response.status).to eq(403)
+ end
+ end
+
+ context 'unauthorized user' do
+ it 'should not enable runner' do
+ post api("/projects/#{project.id}/runners")
+
+ expect(response.status).to eq(401)
+ end
+ end
+ end
+
+ describe 'DELETE /projects/:id/runners/:runner_id' do
+ context 'authorized user' do
+ context 'when runner have more than one associated projects' do
+ it "should disable project's runner" do
+ expect do
+ delete api("/projects/#{project.id}/runners/#{two_projects_runner.id}", user)
+ end.to change{ project.runners.count }.by(-1)
+ expect(response.status).to eq(200)
+ end
+ end
+
+ context 'when runner have one associated projects' do
+ it "should not disable project's runner" do
+ expect do
+ delete api("/projects/#{project.id}/runners/#{specific_runner.id}", user)
+ end.to change{ project.runners.count }.by(0)
+ expect(response.status).to eq(403)
+ end
+ end
+
+ it 'should return 404 is runner is not found' do
+ delete api("/projects/#{project.id}/runners/9999", user)
+
+ expect(response.status).to eq(404)
+ end
+ end
+
+ context 'authorized user without permissions' do
+ it "should not disable project's runner" do
+ delete api("/projects/#{project.id}/runners/#{specific_runner.id}", user2)
+
+ expect(response.status).to eq(403)
+ end
+ end
+
+ context 'unauthorized user' do
+ it "should not disable project's runner" do
+ delete api("/projects/#{project.id}/runners/#{specific_runner.id}")
+
+ expect(response.status).to eq(401)
+ end
+ end
+ end
+end
diff --git a/spec/requests/ci/api/builds_spec.rb b/spec/requests/ci/api/builds_spec.rb
index 01b369720ca..57d7eb927fd 100644
--- a/spec/requests/ci/api/builds_spec.rb
+++ b/spec/requests/ci/api/builds_spec.rb
@@ -131,20 +131,28 @@ describe Ci::API::API do
end
describe "PUT /builds/:id" do
- let(:commit) { FactoryGirl.create(:ci_commit, project: project)}
- let(:build) { FactoryGirl.create(:ci_build, commit: commit, runner_id: runner.id) }
+ let(:commit) {create(:ci_commit, project: project)}
+ let(:build) { create(:ci_build, :trace, commit: commit, runner_id: runner.id) }
- it "should update a running build" do
+ before do
build.run!
put ci_api("/builds/#{build.id}"), token: runner.token
+ end
+
+ it "should update a running build" do
expect(response.status).to eq(200)
end
- it 'Should not override trace information when no trace is given' do
- build.run!
- build.update!(trace: 'hello_world')
- put ci_api("/builds/#{build.id}"), token: runner.token
- expect(build.reload.trace).to eq 'hello_world'
+ it 'should not override trace information when no trace is given' do
+ expect(build.reload.trace).to eq 'BUILD TRACE'
+ end
+
+ context 'build has been erased' do
+ let(:build) { create(:ci_build, runner_id: runner.id, erased_at: Time.now) }
+
+ it 'should respond with forbidden' do
+ expect(response.status).to eq 403
+ end
end
end
@@ -191,9 +199,10 @@ describe Ci::API::API do
end
end
- context 'token is invalid' do
- it 'should respond with forbidden'do
- post authorize_url, { token: 'invalid', filesize: 100 }
+ context 'authorization token is invalid' do
+ before { post authorize_url, { token: 'invalid', filesize: 100 } }
+
+ it 'should respond with forbidden' do
expect(response.status).to eq(403)
end
end
@@ -206,6 +215,15 @@ describe Ci::API::API do
allow(ArtifactUploader).to receive(:artifacts_upload_path).and_return('/')
end
+ context 'build has been erased' do
+ let(:build) { create(:ci_build, erased_at: Time.now) }
+ before { upload_artifacts(file_upload, headers_with_token) }
+
+ it 'should respond with forbidden' do
+ expect(response.status).to eq 403
+ end
+ end
+
context "should post artifact to running build" do
it "uses regual file post" do
upload_artifacts(file_upload, headers_with_token, false)
@@ -234,7 +252,9 @@ describe Ci::API::API do
let(:stored_artifacts_file) { build.reload.artifacts_file.file }
let(:stored_metadata_file) { build.reload.artifacts_metadata.file }
- before { post(post_url, post_data, headers_with_token) }
+ before do
+ post(post_url, post_data, headers_with_token)
+ end
context 'post data accelerated by workhorse is correct' do
let(:post_data) do
diff --git a/spec/services/archive_repository_service_spec.rb b/spec/services/archive_repository_service_spec.rb
deleted file mode 100644
index bd871605c66..00000000000
--- a/spec/services/archive_repository_service_spec.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-require 'spec_helper'
-
-describe ArchiveRepositoryService, services: true do
- let(:project) { create(:project) }
- subject { ArchiveRepositoryService.new(project, "master", "zip") }
-
- describe "#execute" do
- it "cleans old archives" do
- expect(RepositoryArchiveCacheWorker).to receive(:perform_async)
-
- subject.execute(timeout: 0.0)
- end
-
- context "when the repository doesn't have an archive file path" do
- before do
- allow(project.repository).to receive(:archive_metadata).and_return(Hash.new)
- end
-
- it "raises an error" do
- expect { subject.execute(timeout: 0.0) }.to raise_error(RuntimeError)
- end
- end
-
- end
-end
diff --git a/spec/services/ci/create_builds_service_spec.rb b/spec/services/ci/create_builds_service_spec.rb
new file mode 100644
index 00000000000..1fca3628686
--- /dev/null
+++ b/spec/services/ci/create_builds_service_spec.rb
@@ -0,0 +1,28 @@
+require 'spec_helper'
+
+describe Ci::CreateBuildsService, services: true do
+ let(:commit) { create(:ci_commit) }
+ let(:user) { create(:user) }
+
+ describe '#execute' do
+ # Using stubbed .gitlab-ci.yml created in commit factory
+ #
+
+ subject do
+ described_class.new.execute(commit, 'test', 'master', nil, user, nil, status)
+ end
+
+ context 'next builds available' do
+ let(:status) { 'success' }
+
+ it { is_expected.to be_an_instance_of Array }
+ it { is_expected.to all(be_an_instance_of Ci::Build) }
+ end
+
+ context 'builds skipped' do
+ let(:status) { 'skipped' }
+
+ it { is_expected.to be_empty }
+ end
+ end
+end
diff --git a/spec/services/git_push_service_spec.rb b/spec/services/git_push_service_spec.rb
index eb3a5fe43f5..994585fb32c 100644
--- a/spec/services/git_push_service_spec.rb
+++ b/spec/services/git_push_service_spec.rb
@@ -5,7 +5,6 @@ describe GitPushService, services: true do
let(:user) { create :user }
let(:project) { create :project }
- let(:service) { GitPushService.new }
before do
@blankrev = Gitlab::Git::BLANK_SHA
@@ -15,10 +14,17 @@ describe GitPushService, services: true do
end
describe 'Push branches' do
+
+ let(:oldrev) { @oldrev }
+ let(:newrev) { @newrev }
+
+ subject do
+ execute_service(project, user, oldrev, newrev, @ref )
+ end
+
context 'new branch' do
- subject do
- service.execute(project, user, @blankrev, @newrev, @ref)
- end
+
+ let(:oldrev) { @blankrev }
it { is_expected.to be_truthy }
@@ -36,9 +42,6 @@ describe GitPushService, services: true do
end
context 'existing branch' do
- subject do
- service.execute(project, user, @oldrev, @newrev, @ref)
- end
it { is_expected.to be_truthy }
@@ -50,9 +53,8 @@ describe GitPushService, services: true do
end
context 'rm branch' do
- subject do
- service.execute(project, user, @oldrev, @blankrev, @ref)
- end
+
+ let(:newrev) { @blankrev }
it { is_expected.to be_truthy }
@@ -72,7 +74,7 @@ describe GitPushService, services: true do
describe "Git Push Data" do
before do
- service.execute(project, user, @oldrev, @newrev, @ref)
+ service = execute_service(project, user, @oldrev, @newrev, @ref )
@push_data = service.push_data
@commit = project.commit(@newrev)
end
@@ -134,20 +136,21 @@ describe GitPushService, services: true do
describe "Push Event" do
before do
- service.execute(project, user, @oldrev, @newrev, @ref)
+ service = execute_service(project, user, @oldrev, @newrev, @ref )
@event = Event.last
+ @push_data = service.push_data
end
it { expect(@event).not_to be_nil }
it { expect(@event.project).to eq(project) }
it { expect(@event.action).to eq(Event::PUSHED) }
- it { expect(@event.data).to eq(service.push_data) }
+ it { expect(@event.data).to eq(@push_data) }
context "Updates merge requests" do
it "when pushing a new branch for the first time" do
expect(project).to receive(:update_merge_requests).
with(@blankrev, 'newrev', 'refs/heads/master', user)
- service.execute(project, user, @blankrev, 'newrev', 'refs/heads/master')
+ execute_service(project, user, @blankrev, 'newrev', 'refs/heads/master' )
end
end
end
@@ -158,7 +161,7 @@ describe GitPushService, services: true do
expect(project).to receive(:execute_hooks)
expect(project.default_branch).to eq("master")
expect(project.protected_branches).to receive(:create).with({ name: "master", developers_can_push: false })
- service.execute(project, user, @blankrev, 'newrev', 'refs/heads/master')
+ execute_service(project, user, @blankrev, 'newrev', 'refs/heads/master' )
end
it "when pushing a branch for the first time with default branch protection disabled" do
@@ -167,7 +170,7 @@ describe GitPushService, services: true do
expect(project).to receive(:execute_hooks)
expect(project.default_branch).to eq("master")
expect(project.protected_branches).not_to receive(:create)
- service.execute(project, user, @blankrev, 'newrev', 'refs/heads/master')
+ execute_service(project, user, @blankrev, 'newrev', 'refs/heads/master' )
end
it "when pushing a branch for the first time with default branch protection set to 'developers can push'" do
@@ -176,12 +179,12 @@ describe GitPushService, services: true do
expect(project).to receive(:execute_hooks)
expect(project.default_branch).to eq("master")
expect(project.protected_branches).to receive(:create).with({ name: "master", developers_can_push: true })
- service.execute(project, user, @blankrev, 'newrev', 'refs/heads/master')
+ execute_service(project, user, @blankrev, 'newrev', 'refs/heads/master' )
end
it "when pushing new commits to existing branch" do
expect(project).to receive(:execute_hooks)
- service.execute(project, user, 'oldrev', 'newrev', 'refs/heads/master')
+ execute_service(project, user, 'oldrev', 'newrev', 'refs/heads/master' )
end
end
end
@@ -204,7 +207,7 @@ describe GitPushService, services: true do
it "creates a note if a pushed commit mentions an issue" do
expect(SystemNoteService).to receive(:cross_reference).with(issue, commit, commit_author)
- service.execute(project, user, @oldrev, @newrev, @ref)
+ execute_service(project, user, @oldrev, @newrev, @ref )
end
it "only creates a cross-reference note if one doesn't already exist" do
@@ -212,7 +215,7 @@ describe GitPushService, services: true do
expect(SystemNoteService).not_to receive(:cross_reference).with(issue, commit, commit_author)
- service.execute(project, user, @oldrev, @newrev, @ref)
+ execute_service(project, user, @oldrev, @newrev, @ref )
end
it "defaults to the pushing user if the commit's author is not known" do
@@ -222,7 +225,7 @@ describe GitPushService, services: true do
)
expect(SystemNoteService).to receive(:cross_reference).with(issue, commit, user)
- service.execute(project, user, @oldrev, @newrev, @ref)
+ execute_service(project, user, @oldrev, @newrev, @ref )
end
it "finds references in the first push to a non-default branch" do
@@ -231,7 +234,7 @@ describe GitPushService, services: true do
expect(SystemNoteService).to receive(:cross_reference).with(issue, commit, commit_author)
- service.execute(project, user, @blankrev, @newrev, 'refs/heads/other')
+ execute_service(project, user, @blankrev, @newrev, 'refs/heads/other' )
end
end
@@ -255,18 +258,18 @@ describe GitPushService, services: true do
context "to default branches" do
it "closes issues" do
- service.execute(project, user, @oldrev, @newrev, @ref)
+ execute_service(project, user, @oldrev, @newrev, @ref )
expect(Issue.find(issue.id)).to be_closed
end
it "adds a note indicating that the issue is now closed" do
expect(SystemNoteService).to receive(:change_status).with(issue, project, commit_author, "closed", closing_commit)
- service.execute(project, user, @oldrev, @newrev, @ref)
+ execute_service(project, user, @oldrev, @newrev, @ref )
end
it "doesn't create additional cross-reference notes" do
expect(SystemNoteService).not_to receive(:cross_reference)
- service.execute(project, user, @oldrev, @newrev, @ref)
+ execute_service(project, user, @oldrev, @newrev, @ref )
end
it "doesn't close issues when external issue tracker is in use" do
@@ -274,7 +277,7 @@ describe GitPushService, services: true do
# The push still shouldn't create cross-reference notes.
expect do
- service.execute(project, user, @oldrev, @newrev, 'refs/heads/hurf')
+ execute_service(project, user, @oldrev, @newrev, 'refs/heads/hurf' )
end.not_to change { Note.where(project_id: project.id, system: true).count }
end
end
@@ -287,11 +290,11 @@ describe GitPushService, services: true do
it "creates cross-reference notes" do
expect(SystemNoteService).to receive(:cross_reference).with(issue, closing_commit, commit_author)
- service.execute(project, user, @oldrev, @newrev, @ref)
+ execute_service(project, user, @oldrev, @newrev, @ref )
end
it "doesn't close issues" do
- service.execute(project, user, @oldrev, @newrev, @ref)
+ execute_service(project, user, @oldrev, @newrev, @ref )
expect(Issue.find(issue.id)).to be_opened
end
end
@@ -328,7 +331,7 @@ describe GitPushService, services: true do
let(:message) { "this is some work.\n\nrelated to JIRA-1" }
it "should initiate one api call to jira server to mention the issue" do
- service.execute(project, user, @oldrev, @newrev, @ref)
+ execute_service(project, user, @oldrev, @newrev, @ref )
expect(WebMock).to have_requested(:post, jira_api_comment_url).with(
body: /mentioned this issue in/
@@ -346,7 +349,7 @@ describe GitPushService, services: true do
}
}.to_json
- service.execute(project, user, @oldrev, @newrev, @ref)
+ execute_service(project, user, @oldrev, @newrev, @ref )
expect(WebMock).to have_requested(:post, jira_api_transition_url).with(
body: transition_body
).once
@@ -357,7 +360,7 @@ describe GitPushService, services: true do
body: "Issue solved with [#{closing_commit.id}|http://localhost/#{project.path_with_namespace}/commit/#{closing_commit.id}]."
}.to_json
- service.execute(project, user, @oldrev, @newrev, @ref)
+ execute_service(project, user, @oldrev, @newrev, @ref )
expect(WebMock).to have_requested(:post, jira_api_comment_url).with(
body: comment_body
).once
@@ -376,7 +379,13 @@ describe GitPushService, services: true do
end
it 'push to first branch updates HEAD' do
- service.execute(project, user, @blankrev, @newrev, new_ref)
+ execute_service(project, user, @blankrev, @newrev, new_ref )
end
end
+
+ def execute_service(project, user, oldrev, newrev, ref)
+ service = described_class.new(project, user, oldrev: oldrev, newrev: newrev, ref: ref )
+ service.execute
+ service
+ end
end
diff --git a/spec/services/issues/close_service_spec.rb b/spec/services/issues/close_service_spec.rb
index 3a8daf28f5e..62b25709a5d 100644
--- a/spec/services/issues/close_service_spec.rb
+++ b/spec/services/issues/close_service_spec.rb
@@ -5,6 +5,7 @@ describe Issues::CloseService, services: true do
let(:user2) { create(:user) }
let(:issue) { create(:issue, assignee: user2) }
let(:project) { issue.project }
+ let!(:todo) { create(:todo, :assigned, user: user, project: project, target: issue, author: user2) }
before do
project.team << [user, :master]
@@ -32,6 +33,10 @@ describe Issues::CloseService, services: true do
note = @issue.notes.last
expect(note.note).to include "Status changed to closed"
end
+
+ it 'marks todos as done' do
+ expect(todo.reload).to be_done
+ end
end
context "external issue tracker" do
@@ -42,6 +47,7 @@ describe Issues::CloseService, services: true do
it { expect(@issue).to be_valid }
it { expect(@issue).to be_opened }
+ it { expect(todo.reload).to be_pending }
end
end
end
diff --git a/spec/services/issues/create_service_spec.rb b/spec/services/issues/create_service_spec.rb
index 2148d091a57..5e7915db7e1 100644
--- a/spec/services/issues/create_service_spec.rb
+++ b/spec/services/issues/create_service_spec.rb
@@ -3,14 +3,18 @@ require 'spec_helper'
describe Issues::CreateService, services: true do
let(:project) { create(:empty_project) }
let(:user) { create(:user) }
+ let(:assignee) { create(:user) }
describe :execute do
- context "valid params" do
+ context 'valid params' do
before do
project.team << [user, :master]
+ project.team << [assignee, :master]
+
opts = {
title: 'Awesome issue',
- description: 'please fix'
+ description: 'please fix',
+ assignee: assignee
}
@issue = Issues::CreateService.new(project, user, opts).execute
@@ -18,6 +22,21 @@ describe Issues::CreateService, services: true do
it { expect(@issue).to be_valid }
it { expect(@issue.title).to eq('Awesome issue') }
+ it { expect(@issue.assignee).to eq assignee }
+
+ it 'creates a pending todo for new assignee' do
+ attributes = {
+ project: project,
+ author: user,
+ user: assignee,
+ target_id: @issue.id,
+ target_type: @issue.class.name,
+ action: Todo::ASSIGNED,
+ state: :pending
+ }
+
+ expect(Todo.where(attributes).count).to eq 1
+ end
end
end
end
diff --git a/spec/services/issues/update_service_spec.rb b/spec/services/issues/update_service_spec.rb
index 87da0e9618b..e579e49dfa7 100644
--- a/spec/services/issues/update_service_spec.rb
+++ b/spec/services/issues/update_service_spec.rb
@@ -80,6 +80,74 @@ describe Issues::UpdateService, services: true do
end
end
+ context 'todos' do
+ let!(:todo) { create(:todo, :assigned, user: user, project: project, target: issue, author: user2) }
+
+ context 'when the title change' do
+ before do
+ update_issue({ title: 'New title' })
+ end
+
+ it 'marks pending todos as done' do
+ expect(todo.reload.done?).to eq true
+ end
+ end
+
+ context 'when the description change' do
+ before do
+ update_issue({ description: 'Also please fix' })
+ end
+
+ it 'marks todos as done' do
+ expect(todo.reload.done?).to eq true
+ end
+ end
+
+ context 'when is reassigned' do
+ before do
+ update_issue({ assignee: user2 })
+ end
+
+ it 'marks previous assignee todos as done' do
+ expect(todo.reload.done?).to eq true
+ end
+
+ it 'creates a todo for new assignee' do
+ attributes = {
+ project: project,
+ author: user,
+ user: user2,
+ target_id: issue.id,
+ target_type: issue.class.name,
+ action: Todo::ASSIGNED,
+ state: :pending
+ }
+
+ expect(Todo.where(attributes).count).to eq 1
+ end
+ end
+
+ context 'when the milestone change' do
+ before do
+ update_issue({ milestone: create(:milestone) })
+ end
+
+ it 'marks todos as done' do
+ expect(todo.reload.done?).to eq true
+ end
+ end
+
+ context 'when the labels change' do
+ before do
+ update_issue({ label_ids: [label.id] })
+ end
+
+ it 'marks todos as done' do
+ expect(todo.reload.done?).to eq true
+ end
+ end
+ end
+
context 'when Issue has tasks' do
before { update_issue({ description: "- [ ] Task 1\n- [ ] Task 2" }) }
@@ -144,6 +212,5 @@ describe Issues::UpdateService, services: true do
end
end
end
-
end
end
diff --git a/spec/services/merge_requests/close_service_spec.rb b/spec/services/merge_requests/close_service_spec.rb
index 50d0c288790..8443a00e70c 100644
--- a/spec/services/merge_requests/close_service_spec.rb
+++ b/spec/services/merge_requests/close_service_spec.rb
@@ -5,6 +5,7 @@ describe MergeRequests::CloseService, services: true do
let(:user2) { create(:user) }
let(:merge_request) { create(:merge_request, assignee: user2) }
let(:project) { merge_request.project }
+ let!(:todo) { create(:todo, :assigned, user: user, project: project, target: merge_request, author: user2) }
before do
project.team << [user, :master]
@@ -41,6 +42,10 @@ describe MergeRequests::CloseService, services: true do
note = @merge_request.notes.last
expect(note.note).to include 'Status changed to closed'
end
+
+ it 'marks todos as done' do
+ expect(todo.reload).to be_done
+ end
end
end
end
diff --git a/spec/services/merge_requests/create_service_spec.rb b/spec/services/merge_requests/create_service_spec.rb
index be8f1676eeb..120f4d6a669 100644
--- a/spec/services/merge_requests/create_service_spec.rb
+++ b/spec/services/merge_requests/create_service_spec.rb
@@ -3,6 +3,7 @@ require 'spec_helper'
describe MergeRequests::CreateService, services: true do
let(:project) { create(:project) }
let(:user) { create(:user) }
+ let(:assignee) { create(:user) }
describe :execute do
context 'valid params' do
@@ -14,10 +15,12 @@ describe MergeRequests::CreateService, services: true do
target_branch: 'master'
}
end
+
let(:service) { MergeRequests::CreateService.new(project, user, opts) }
before do
project.team << [user, :master]
+ project.team << [assignee, :developer]
allow(service).to receive(:execute_hooks)
@merge_request = service.execute
@@ -25,10 +28,49 @@ describe MergeRequests::CreateService, services: true do
it { expect(@merge_request).to be_valid }
it { expect(@merge_request.title).to eq('Awesome merge_request') }
+ it { expect(@merge_request.assignee).to be_nil }
it 'should execute hooks with default action' do
expect(service).to have_received(:execute_hooks).with(@merge_request)
end
+
+ it 'does not creates todos' do
+ attributes = {
+ project: project,
+ target_id: @merge_request.id,
+ target_type: @merge_request.class.name
+ }
+
+ expect(Todo.where(attributes).count).to be_zero
+ end
+
+ context 'when merge request is assigned to someone' do
+ let(:opts) do
+ {
+ title: 'Awesome merge_request',
+ description: 'please fix',
+ source_branch: 'feature',
+ target_branch: 'master',
+ assignee: assignee
+ }
+ end
+
+ it { expect(@merge_request.assignee).to eq assignee }
+
+ it 'creates a todo for new assignee' do
+ attributes = {
+ project: project,
+ author: user,
+ user: assignee,
+ target_id: @merge_request.id,
+ target_type: @merge_request.class.name,
+ action: Todo::ASSIGNED,
+ state: :pending
+ }
+
+ expect(Todo.where(attributes).count).to eq 1
+ end
+ end
end
end
end
diff --git a/spec/services/merge_requests/merge_when_build_succeeds_service_spec.rb b/spec/services/merge_requests/merge_when_build_succeeds_service_spec.rb
index de9fed2b7dd..52a302e0e1a 100644
--- a/spec/services/merge_requests/merge_when_build_succeeds_service_spec.rb
+++ b/spec/services/merge_requests/merge_when_build_succeeds_service_spec.rb
@@ -54,14 +54,84 @@ describe MergeRequests::MergeWhenBuildSucceedsService do
end
describe "#trigger" do
- let(:build) { create(:ci_build, ref: mr_merge_if_green_enabled.source_branch, status: "success") }
+ context 'build with ref' do
+ let(:build) { create(:ci_build, ref: mr_merge_if_green_enabled.source_branch, status: "success") }
- it "merges all merge requests with merge when build succeeds enabled" do
- allow_any_instance_of(MergeRequest).to receive(:ci_commit).and_return(ci_commit)
- allow(ci_commit).to receive(:success?).and_return(true)
+ it "merges all merge requests with merge when build succeeds enabled" do
+ allow_any_instance_of(MergeRequest).to receive(:ci_commit).and_return(ci_commit)
+ allow(ci_commit).to receive(:success?).and_return(true)
+
+ expect(MergeWorker).to receive(:perform_async)
+ service.trigger(build)
+ end
+ end
+
+ context 'triggered by an old build' do
+ let(:old_build) { create(:ci_build, ref: mr_merge_if_green_enabled.source_branch, status: "success") }
+ let(:build) { create(:ci_build, ref: mr_merge_if_green_enabled.source_branch, status: "success") }
+
+ it "merges all merge requests with merge when build succeeds enabled" do
+ allow_any_instance_of(MergeRequest).to receive(:ci_commit).and_return(ci_commit)
+ allow(ci_commit).to receive(:success?).and_return(true)
+ allow(old_build).to receive(:sha).and_return('1234abcdef')
+
+ expect(MergeWorker).to_not receive(:perform_async)
+ service.trigger(old_build)
+ end
+ end
+
+ context 'commit status without ref' do
+ let(:commit_status) { create(:generic_commit_status, status: 'success') }
+
+ before { mr_merge_if_green_enabled }
+
+ it "doesn't merge a requests for status on other branch" do
+ allow(project.repository).to receive(:branch_names_contains).with(commit_status.sha).and_return([])
+
+ expect(MergeWorker).to_not receive(:perform_async)
+ service.trigger(commit_status)
+ end
+
+ it 'discovers branches and merges all merge requests when status is success' do
+ allow(project.repository).to receive(:branch_names_contains).
+ with(commit_status.sha).and_return([mr_merge_if_green_enabled.source_branch])
+ allow(ci_commit).to receive(:success?).and_return(true)
+ allow_any_instance_of(MergeRequest).to receive(:ci_commit).and_return(ci_commit)
+ allow(ci_commit).to receive(:success?).and_return(true)
+
+ expect(MergeWorker).to receive(:perform_async)
+ service.trigger(commit_status)
+ end
+ end
- expect(MergeWorker).to receive(:perform_async)
- service.trigger(build)
+ context 'properly handles multiple stages' do
+ let(:ref) { mr_merge_if_green_enabled.source_branch }
+ let(:build) { create(:ci_build, commit: ci_commit, ref: ref, name: 'build', stage: 'build') }
+ let(:test) { create(:ci_build, commit: ci_commit, ref: ref, name: 'test', stage: 'test') }
+
+ before do
+ # This behavior of MergeRequest: we instantiate a new object
+ allow_any_instance_of(MergeRequest).to receive(:ci_commit).and_wrap_original do
+ Ci::Commit.find(ci_commit.id)
+ end
+
+ # We create test after the build
+ allow(ci_commit).to receive(:create_next_builds).and_wrap_original do
+ test
+ end
+ end
+
+ it "doesn't merge if some stages failed" do
+ expect(MergeWorker).to_not receive(:perform_async)
+ build.success
+ test.drop
+ end
+
+ it 'merge when all stages succeeded' do
+ expect(MergeWorker).to receive(:perform_async)
+ build.success
+ test.success
+ end
end
end
diff --git a/spec/services/merge_requests/update_service_spec.rb b/spec/services/merge_requests/update_service_spec.rb
index 2e9e6e0870d..99703c7a8ec 100644
--- a/spec/services/merge_requests/update_service_spec.rb
+++ b/spec/services/merge_requests/update_service_spec.rb
@@ -98,6 +98,84 @@ describe MergeRequests::UpdateService, services: true do
end
end
+ context 'todos' do
+ let!(:pending_todo) { create(:todo, :assigned, user: user, project: project, target: merge_request, author: user2) }
+
+ context 'when the title change' do
+ before do
+ update_merge_request({ title: 'New title' })
+ end
+
+ it 'marks pending todos as done' do
+ expect(pending_todo.reload).to be_done
+ end
+ end
+
+ context 'when the description change' do
+ before do
+ update_merge_request({ description: 'Also please fix' })
+ end
+
+ it 'marks pending todos as done' do
+ expect(pending_todo.reload).to be_done
+ end
+ end
+
+ context 'when is reassigned' do
+ before do
+ update_merge_request({ assignee: user2 })
+ end
+
+ it 'marks previous assignee pending todos as done' do
+ expect(pending_todo.reload).to be_done
+ end
+
+ it 'creates a pending todo for new assignee' do
+ attributes = {
+ project: project,
+ author: user,
+ user: user2,
+ target_id: merge_request.id,
+ target_type: merge_request.class.name,
+ action: Todo::ASSIGNED,
+ state: :pending
+ }
+
+ expect(Todo.where(attributes).count).to eq 1
+ end
+ end
+
+ context 'when the milestone change' do
+ before do
+ update_merge_request({ milestone: create(:milestone) })
+ end
+
+ it 'marks pending todos as done' do
+ expect(pending_todo.reload).to be_done
+ end
+ end
+
+ context 'when the labels change' do
+ before do
+ update_merge_request({ label_ids: [label.id] })
+ end
+
+ it 'marks pending todos as done' do
+ expect(pending_todo.reload).to be_done
+ end
+ end
+
+ context 'when the target branch change' do
+ before do
+ update_merge_request({ target_branch: 'target' })
+ end
+
+ it 'marks pending todos as done' do
+ expect(pending_todo.reload).to be_done
+ end
+ end
+ end
+
context 'when MergeRequest has tasks' do
before { update_merge_request({ description: "- [ ] Task 1\n- [ ] Task 2" }) }
@@ -130,6 +208,5 @@ describe MergeRequests::UpdateService, services: true do
end
end
end
-
end
end
diff --git a/spec/services/notes/post_process_service_spec.rb b/spec/services/notes/post_process_service_spec.rb
index 1a3f339bd64..d4c50f824c1 100644
--- a/spec/services/notes/post_process_service_spec.rb
+++ b/spec/services/notes/post_process_service_spec.rb
@@ -20,6 +20,7 @@ describe Notes::PostProcessService, services: true do
it do
expect(project).to receive(:execute_hooks)
expect(project).to receive(:execute_services)
+
Notes::PostProcessService.new(@note).execute
end
end
diff --git a/spec/services/notes/update_service_spec.rb b/spec/services/notes/update_service_spec.rb
new file mode 100644
index 00000000000..dde4bde7dc2
--- /dev/null
+++ b/spec/services/notes/update_service_spec.rb
@@ -0,0 +1,45 @@
+require 'spec_helper'
+
+describe Notes::UpdateService, services: true do
+ let(:project) { create(:empty_project) }
+ let(:user) { create(:user) }
+ let(:user2) { create(:user) }
+ let(:issue) { create(:issue, project: project) }
+ let(:note) { create(:note, project: project, noteable: issue, author: user, note: 'Old note') }
+
+ before do
+ project.team << [user, :master]
+ project.team << [user2, :developer]
+ end
+
+ describe '#execute' do
+ def update_note(opts)
+ @note = Notes::UpdateService.new(project, user, opts).execute(note)
+ @note.reload
+ end
+
+ context 'todos' do
+ let!(:todo) { create(:todo, :assigned, user: user, project: project, target: issue, author: user2) }
+
+ context 'when the note change' do
+ before do
+ update_note({ note: 'New note' })
+ end
+
+ it 'marks todos as done' do
+ expect(todo.reload).to be_done
+ end
+ end
+
+ context 'when the note does not change' do
+ before do
+ update_note({ note: 'Old note' })
+ end
+
+ it 'keep todos' do
+ expect(todo.reload).to be_pending
+ end
+ end
+ end
+ end
+end
diff --git a/spec/services/todo_service_spec.rb b/spec/services/todo_service_spec.rb
new file mode 100644
index 00000000000..df3aa955f24
--- /dev/null
+++ b/spec/services/todo_service_spec.rb
@@ -0,0 +1,264 @@
+require 'spec_helper'
+
+describe TodoService, services: true do
+ let(:author) { create(:user) }
+ let(:john_doe) { create(:user, username: 'john_doe') }
+ let(:michael) { create(:user, username: 'michael') }
+ let(:stranger) { create(:user, username: 'stranger') }
+ let(:project) { create(:project) }
+ let(:mentions) { [author.to_reference, john_doe.to_reference, michael.to_reference, stranger.to_reference].join(' ') }
+ let(:service) { described_class.new }
+
+ before do
+ project.team << [author, :developer]
+ project.team << [john_doe, :developer]
+ project.team << [michael, :developer]
+ end
+
+ describe 'Issues' do
+ let(:issue) { create(:issue, project: project, assignee: john_doe, author: author, description: mentions) }
+ let(:unassigned_issue) { create(:issue, project: project, assignee: nil) }
+
+ describe '#new_issue' do
+ it 'creates a todo if assigned' do
+ service.new_issue(issue, author)
+
+ should_create_todo(user: john_doe, target: issue, action: Todo::ASSIGNED)
+ end
+
+ it 'does not create a todo if unassigned' do
+ should_not_create_any_todo { service.new_issue(unassigned_issue, author) }
+ end
+
+ it 'does not create a todo if assignee is the current user' do
+ should_not_create_any_todo { service.new_issue(unassigned_issue, john_doe) }
+ end
+
+ it 'creates a todo for each valid mentioned user' do
+ service.new_issue(issue, author)
+
+ should_create_todo(user: michael, target: issue, action: Todo::MENTIONED)
+ should_not_create_todo(user: author, target: issue, action: Todo::MENTIONED)
+ should_not_create_todo(user: john_doe, target: issue, action: Todo::MENTIONED)
+ should_not_create_todo(user: stranger, target: issue, action: Todo::MENTIONED)
+ end
+ end
+
+ describe '#update_issue' do
+ it 'creates a todo for each valid mentioned user' do
+ service.update_issue(issue, author)
+
+ should_create_todo(user: michael, target: issue, action: Todo::MENTIONED)
+ should_create_todo(user: john_doe, target: issue, action: Todo::MENTIONED)
+ should_not_create_todo(user: author, target: issue, action: Todo::MENTIONED)
+ should_not_create_todo(user: stranger, target: issue, action: Todo::MENTIONED)
+ end
+
+ it 'does not create a todo if user was already mentioned' do
+ create(:todo, :mentioned, user: michael, project: project, target: issue, author: author)
+
+ expect { service.update_issue(issue, author) }.not_to change(michael.todos, :count)
+ end
+ end
+
+ describe '#close_issue' do
+ it 'marks related pending todos to the target for the user as done' do
+ first_todo = create(:todo, :assigned, user: john_doe, project: project, target: issue, author: author)
+ second_todo = create(:todo, :assigned, user: john_doe, project: project, target: issue, author: author)
+
+ service.close_issue(issue, john_doe)
+
+ expect(first_todo.reload).to be_done
+ expect(second_todo.reload).to be_done
+ end
+ end
+
+ describe '#reassigned_issue' do
+ it 'creates a pending todo for new assignee' do
+ unassigned_issue.update_attribute(:assignee, john_doe)
+ service.reassigned_issue(unassigned_issue, author)
+
+ should_create_todo(user: john_doe, target: unassigned_issue, action: Todo::ASSIGNED)
+ end
+
+ it 'does not create a todo if unassigned' do
+ issue.update_attribute(:assignee, nil)
+
+ should_not_create_any_todo { service.reassigned_issue(issue, author) }
+ end
+
+ it 'does not create a todo if new assignee is the current user' do
+ unassigned_issue.update_attribute(:assignee, john_doe)
+
+ should_not_create_any_todo { service.reassigned_issue(unassigned_issue, john_doe) }
+ end
+ end
+
+ describe '#mark_pending_todos_as_done' do
+ it 'marks related pending todos to the target for the user as done' do
+ first_todo = create(:todo, :assigned, user: john_doe, project: project, target: issue, author: author)
+ second_todo = create(:todo, :assigned, user: john_doe, project: project, target: issue, author: author)
+
+ service.mark_pending_todos_as_done(issue, john_doe)
+
+ expect(first_todo.reload).to be_done
+ expect(second_todo.reload).to be_done
+ end
+ end
+
+ describe '#new_note' do
+ let!(:first_todo) { create(:todo, :assigned, user: john_doe, project: project, target: issue, author: author) }
+ let!(:second_todo) { create(:todo, :assigned, user: john_doe, project: project, target: issue, author: author) }
+ let(:note) { create(:note, project: project, noteable: issue, author: john_doe, note: mentions) }
+ let(:award_note) { create(:note, :award, project: project, noteable: issue, author: john_doe, note: 'thumbsup') }
+ let(:system_note) { create(:system_note, project: project, noteable: issue) }
+
+ it 'mark related pending todos to the noteable for the note author as done' do
+ first_todo = create(:todo, :assigned, user: john_doe, project: project, target: issue, author: author)
+ second_todo = create(:todo, :assigned, user: john_doe, project: project, target: issue, author: author)
+
+ service.new_note(note, john_doe)
+
+ expect(first_todo.reload).to be_done
+ expect(second_todo.reload).to be_done
+ end
+
+ it 'mark related pending todos to the noteable for the award note author as done' do
+ service.new_note(award_note, john_doe)
+
+ expect(first_todo.reload).to be_done
+ expect(second_todo.reload).to be_done
+ end
+
+ it 'does not mark related pending todos it is a system note' do
+ service.new_note(system_note, john_doe)
+
+ expect(first_todo.reload).to be_pending
+ expect(second_todo.reload).to be_pending
+ end
+
+ it 'creates a todo for each valid mentioned user' do
+ service.new_note(note, john_doe)
+
+ should_create_todo(user: michael, target: issue, author: john_doe, action: Todo::MENTIONED, note: note)
+ should_create_todo(user: author, target: issue, author: john_doe, action: Todo::MENTIONED, note: note)
+ should_not_create_todo(user: john_doe, target: issue, author: john_doe, action: Todo::MENTIONED, note: note)
+ should_not_create_todo(user: stranger, target: issue, author: john_doe, action: Todo::MENTIONED, note: note)
+ end
+ end
+ end
+
+ describe 'Merge Requests' do
+ let(:mr_assigned) { create(:merge_request, source_project: project, author: author, assignee: john_doe, description: mentions) }
+ let(:mr_unassigned) { create(:merge_request, source_project: project, author: author, assignee: nil) }
+
+ describe '#new_merge_request' do
+ it 'creates a pending todo if assigned' do
+ service.new_merge_request(mr_assigned, author)
+
+ should_create_todo(user: john_doe, target: mr_assigned, action: Todo::ASSIGNED)
+ end
+
+ it 'does not create a todo if unassigned' do
+ should_not_create_any_todo { service.new_merge_request(mr_unassigned, author) }
+ end
+
+ it 'does not create a todo if assignee is the current user' do
+ should_not_create_any_todo { service.new_merge_request(mr_unassigned, john_doe) }
+ end
+
+ it 'creates a todo for each valid mentioned user' do
+ service.new_merge_request(mr_assigned, author)
+
+ should_create_todo(user: michael, target: mr_assigned, action: Todo::MENTIONED)
+ should_not_create_todo(user: author, target: mr_assigned, action: Todo::MENTIONED)
+ should_not_create_todo(user: john_doe, target: mr_assigned, action: Todo::MENTIONED)
+ should_not_create_todo(user: stranger, target: mr_assigned, action: Todo::MENTIONED)
+ end
+ end
+
+ describe '#update_merge_request' do
+ it 'creates a todo for each valid mentioned user' do
+ service.update_merge_request(mr_assigned, author)
+
+ should_create_todo(user: michael, target: mr_assigned, action: Todo::MENTIONED)
+ should_create_todo(user: john_doe, target: mr_assigned, action: Todo::MENTIONED)
+ should_not_create_todo(user: author, target: mr_assigned, action: Todo::MENTIONED)
+ should_not_create_todo(user: stranger, target: mr_assigned, action: Todo::MENTIONED)
+ end
+
+ it 'does not create a todo if user was already mentioned' do
+ create(:todo, :mentioned, user: michael, project: project, target: mr_assigned, author: author)
+
+ expect { service.update_merge_request(mr_assigned, author) }.not_to change(michael.todos, :count)
+ end
+ end
+
+ describe '#close_merge_request' do
+ it 'marks related pending todos to the target for the user as done' do
+ first_todo = create(:todo, :assigned, user: john_doe, project: project, target: mr_assigned, author: author)
+ second_todo = create(:todo, :assigned, user: john_doe, project: project, target: mr_assigned, author: author)
+ service.close_merge_request(mr_assigned, john_doe)
+
+ expect(first_todo.reload).to be_done
+ expect(second_todo.reload).to be_done
+ end
+ end
+
+ describe '#reassigned_merge_request' do
+ it 'creates a pending todo for new assignee' do
+ mr_unassigned.update_attribute(:assignee, john_doe)
+ service.reassigned_merge_request(mr_unassigned, author)
+
+ should_create_todo(user: john_doe, target: mr_unassigned, action: Todo::ASSIGNED)
+ end
+
+ it 'does not create a todo if unassigned' do
+ mr_assigned.update_attribute(:assignee, nil)
+
+ should_not_create_any_todo { service.reassigned_merge_request(mr_assigned, author) }
+ end
+
+ it 'does not create a todo if new assignee is the current user' do
+ mr_assigned.update_attribute(:assignee, john_doe)
+
+ should_not_create_any_todo { service.reassigned_merge_request(mr_assigned, john_doe) }
+ end
+ end
+
+ describe '#merge_merge_request' do
+ it 'marks related pending todos to the target for the user as done' do
+ first_todo = create(:todo, :assigned, user: john_doe, project: project, target: mr_assigned, author: author)
+ second_todo = create(:todo, :assigned, user: john_doe, project: project, target: mr_assigned, author: author)
+ service.merge_merge_request(mr_assigned, john_doe)
+
+ expect(first_todo.reload).to be_done
+ expect(second_todo.reload).to be_done
+ end
+ end
+ end
+
+ def should_create_todo(attributes = {})
+ attributes.reverse_merge!(
+ project: project,
+ author: author,
+ state: :pending
+ )
+
+ expect(Todo.where(attributes).count).to eq 1
+ end
+
+ def should_not_create_todo(attributes = {})
+ attributes.reverse_merge!(
+ project: project,
+ author: author,
+ state: :pending
+ )
+
+ expect(Todo.where(attributes).count).to eq 0
+ end
+
+ def should_not_create_any_todo
+ expect { yield }.not_to change(Todo, :count)
+ end
+end
diff --git a/spec/support/workhorse_helpers.rb b/spec/support/workhorse_helpers.rb
new file mode 100644
index 00000000000..107b6e30924
--- /dev/null
+++ b/spec/support/workhorse_helpers.rb
@@ -0,0 +1,16 @@
+module WorkhorseHelpers
+ extend self
+
+ def workhorse_send_data
+ @_workhorse_send_data ||= begin
+ header = response.headers[Gitlab::Workhorse::SEND_DATA_HEADER]
+ split_header = header.split(':')
+ type = split_header.shift
+ header = split_header.join(':')
+ [
+ type,
+ JSON.parse(Base64.urlsafe_decode64(header)),
+ ]
+ end
+ end
+end
diff --git a/spec/workers/repository_fork_worker_spec.rb b/spec/workers/repository_fork_worker_spec.rb
index dae31992620..172537474ee 100644
--- a/spec/workers/repository_fork_worker_spec.rb
+++ b/spec/workers/repository_fork_worker_spec.rb
@@ -19,6 +19,18 @@ describe RepositoryForkWorker do
fork_project.namespace.path)
end
+ it 'flushes the empty caches' do
+ expect_any_instance_of(Gitlab::Shell).to receive(:fork_repository).
+ with(project.path_with_namespace, fork_project.namespace.path).
+ and_return(true)
+
+ expect_any_instance_of(Repository).to receive(:expire_emptiness_caches).
+ and_call_original
+
+ subject.perform(project.id, project.path_with_namespace,
+ fork_project.namespace.path)
+ end
+
it "handles bad fork" do
expect_any_instance_of(Gitlab::Shell).to receive(:fork_repository).and_return(false)
subject.perform(
diff --git a/spec/workers/repository_import_worker_spec.rb b/spec/workers/repository_import_worker_spec.rb
new file mode 100644
index 00000000000..6739063543b
--- /dev/null
+++ b/spec/workers/repository_import_worker_spec.rb
@@ -0,0 +1,19 @@
+require 'spec_helper'
+
+describe RepositoryImportWorker do
+ let(:project) { create(:project) }
+
+ subject { described_class.new }
+
+ describe '#perform' do
+ it 'imports a project' do
+ expect_any_instance_of(Projects::ImportService).to receive(:execute).
+ and_return({ status: :ok })
+
+ expect_any_instance_of(Repository).to receive(:expire_emptiness_caches)
+ expect_any_instance_of(Project).to receive(:import_finish)
+
+ subject.perform(project.id)
+ end
+ end
+end