@sveltia/ui 0.65.2 → 0.65.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/emoji/emoji-suggestions.svelte +2 -25
- package/dist/components/emoji/emoji-suggestions.svelte.d.ts +2 -2
- package/dist/components/emoji/emoji.d.ts +4 -5
- package/dist/components/emoji/emoji.js +59 -105
- package/dist/components/emoji/generated.d.ts +14 -0
- package/dist/components/emoji/generated.js +1921 -0
- package/dist/components/text-editor/shiki/generated.d.ts +1 -1
- package/dist/components/text-editor/shiki/generated.js +1 -1
- package/dist/typedefs.d.ts +3 -7
- package/dist/typedefs.js +3 -8
- package/package.json +2 -2
- package/dist/components/emoji/cache.d.ts +0 -3
- package/dist/components/emoji/cache.js +0 -96
- package/dist/components/emoji/loader.d.ts +0 -17
- package/dist/components/emoji/loader.js +0 -78
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
<script>
|
|
13
13
|
import { _ } from '@sveltia/i18n';
|
|
14
14
|
import { onMount } from 'svelte';
|
|
15
|
-
import {
|
|
15
|
+
import { searchEmojis } from './emoji.js';
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
18
|
* @import { EmojiAnchorRect, EmojiEntry, EmojiTrigger } from '../../typedefs';
|
|
@@ -84,12 +84,6 @@
|
|
|
84
84
|
* @type {HTMLElement | undefined}
|
|
85
85
|
*/
|
|
86
86
|
let listElement = $state();
|
|
87
|
-
/**
|
|
88
|
-
* Monotonically increasing counter used to discard the result of a search that has been
|
|
89
|
-
* superseded while the emoji list was being loaded.
|
|
90
|
-
* @type {number}
|
|
91
|
-
*/
|
|
92
|
-
let searchGeneration = 0;
|
|
93
87
|
/**
|
|
94
88
|
* Identifier of the shortcode the user has dismissed with the Escape key, so the suggestions
|
|
95
89
|
* don’t come back while they keep typing it.
|
|
@@ -167,14 +161,13 @@
|
|
|
167
161
|
candidates = [];
|
|
168
162
|
selectedIndex = 0;
|
|
169
163
|
anchorRect = undefined;
|
|
170
|
-
searchGeneration += 1;
|
|
171
164
|
};
|
|
172
165
|
|
|
173
166
|
/**
|
|
174
167
|
* Feed the shortcode being typed into the list, or nothing to close it.
|
|
175
168
|
* @param {EmojiTrigger} [newTrigger] Shortcode state.
|
|
176
169
|
*/
|
|
177
|
-
export const update =
|
|
170
|
+
export const update = (newTrigger) => {
|
|
178
171
|
if (!newTrigger) {
|
|
179
172
|
if (trigger || dismissedShortcodeId) {
|
|
180
173
|
close();
|
|
@@ -202,17 +195,6 @@
|
|
|
202
195
|
}
|
|
203
196
|
|
|
204
197
|
trigger = newTrigger;
|
|
205
|
-
searchGeneration += 1;
|
|
206
|
-
|
|
207
|
-
const generation = searchGeneration;
|
|
208
|
-
|
|
209
|
-
await loadEmojiList();
|
|
210
|
-
|
|
211
|
-
// Bail out if the user has kept typing in the meantime
|
|
212
|
-
if (generation !== searchGeneration) {
|
|
213
|
-
return;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
198
|
candidates = searchEmojis(query);
|
|
217
199
|
selectedIndex = 0;
|
|
218
200
|
};
|
|
@@ -359,11 +341,6 @@
|
|
|
359
341
|
});
|
|
360
342
|
|
|
361
343
|
onMount(() => {
|
|
362
|
-
// Warm the data up front, so the first shortcode the user types shows suggestions straight away
|
|
363
|
-
// rather than waiting on the network. The loader memoizes, so this costs one request per page
|
|
364
|
-
// however many fields are on it, and nothing at all once it’s cached.
|
|
365
|
-
loadEmojiList();
|
|
366
|
-
|
|
367
344
|
/**
|
|
368
345
|
* Follow the caret when the page or an ancestor is scrolled or the window is resized.
|
|
369
346
|
*/
|
|
@@ -5,7 +5,7 @@ type EmojiSuggestions = {
|
|
|
5
5
|
} & {
|
|
6
6
|
isOpen: () => boolean;
|
|
7
7
|
close: (dismissed?: boolean | undefined) => void;
|
|
8
|
-
update: (newTrigger?: EmojiTrigger | undefined) =>
|
|
8
|
+
update: (newTrigger?: EmojiTrigger | undefined) => void;
|
|
9
9
|
moveSelection: (delta: number) => void;
|
|
10
10
|
selectHighlighted: () => void;
|
|
11
11
|
handleKeyDown: (event: KeyboardEvent) => boolean;
|
|
@@ -39,7 +39,7 @@ declare const EmojiSuggestions: import("svelte").Component<{
|
|
|
39
39
|
}, {
|
|
40
40
|
isOpen: () => boolean;
|
|
41
41
|
close: (dismissed?: boolean | undefined) => void;
|
|
42
|
-
update: (newTrigger?: EmojiTrigger | undefined) =>
|
|
42
|
+
update: (newTrigger?: EmojiTrigger | undefined) => void;
|
|
43
43
|
moveSelection: (delta: number) => void;
|
|
44
44
|
selectHighlighted: () => void;
|
|
45
45
|
handleKeyDown: (event: KeyboardEvent) => boolean;
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @import {
|
|
2
|
+
* @import { EmojiEntry } from '../../typedefs';
|
|
3
3
|
*/
|
|
4
4
|
/**
|
|
5
5
|
* Regular expression that matches an emoji shortcode being typed at the end of a line, like `:smi`.
|
|
6
6
|
* The colon must be at the beginning of the text or preceded by a whitespace or an opening bracket,
|
|
7
7
|
* so a colon in the middle of a word, as in `https://` or `12:34`, doesn’t trigger the suggestions.
|
|
8
|
+
* The query is bounded to keep a runaway line from being searched for, at a length that still
|
|
9
|
+
* accommodates the longest published shortcode.
|
|
8
10
|
*/
|
|
9
11
|
export const EMOJI_TRIGGER_REGEX: RegExp;
|
|
10
12
|
/**
|
|
@@ -13,9 +15,7 @@ export const EMOJI_TRIGGER_REGEX: RegExp;
|
|
|
13
15
|
* — a single letter otherwise matches over a thousand emojis, all rendered on every keystroke.
|
|
14
16
|
*/
|
|
15
17
|
export const MAX_EMOJI_SUGGESTIONS: 50;
|
|
16
|
-
export function
|
|
17
|
-
export function parseEmojiData(data: EmojiData): EmojiEntry[];
|
|
18
|
-
export function loadEmojiList(): Promise<EmojiEntry[]>;
|
|
18
|
+
export function parseEmojiData(data: string): EmojiEntry[];
|
|
19
19
|
/**
|
|
20
20
|
* Rank given when there is no match at all. Higher than any real rank, so an unmatched emoji sorts
|
|
21
21
|
* last and the ranks can still be compared arithmetically.
|
|
@@ -30,5 +30,4 @@ export function getEmojiMatchRank({ name, aliases }: EmojiEntry, query: string):
|
|
|
30
30
|
export function searchEmojis(query: string): EmojiEntry[];
|
|
31
31
|
export function getEmojiInsertText(emoji: string, textAfterCaret: string): string;
|
|
32
32
|
export function detectEmojiTrigger(textBeforeCaret: string): string | undefined;
|
|
33
|
-
import type { EmojiData } from '../../typedefs';
|
|
34
33
|
import type { EmojiEntry } from '../../typedefs';
|
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { getEmojiDataLoader } from './loader.js';
|
|
1
|
+
import { EMOJI_DATA } from './generated.js';
|
|
3
2
|
|
|
4
3
|
/**
|
|
5
|
-
* @import {
|
|
4
|
+
* @import { EmojiEntry } from '../../typedefs';
|
|
6
5
|
*/
|
|
7
6
|
|
|
8
7
|
/**
|
|
9
8
|
* Regular expression that matches an emoji shortcode being typed at the end of a line, like `:smi`.
|
|
10
9
|
* The colon must be at the beginning of the text or preceded by a whitespace or an opening bracket,
|
|
11
10
|
* so a colon in the middle of a word, as in `https://` or `12:34`, doesn’t trigger the suggestions.
|
|
11
|
+
* The query is bounded to keep a runaway line from being searched for, at a length that still
|
|
12
|
+
* accommodates the longest published shortcode.
|
|
12
13
|
*/
|
|
13
|
-
export const EMOJI_TRIGGER_REGEX = /(?<=^|[\s([{"'«])(?::)(?<query>[a-zA-Z0-9_+-]{1,
|
|
14
|
+
export const EMOJI_TRIGGER_REGEX = /(?<=^|[\s([{"'«])(?::)(?<query>[a-zA-Z0-9_+-]{1,64})$/;
|
|
14
15
|
|
|
15
16
|
/**
|
|
16
17
|
* Maximum number of emoji suggestions offered, matching what Discord shows. The dropdown displays
|
|
@@ -20,82 +21,36 @@ export const EMOJI_TRIGGER_REGEX = /(?<=^|[\s([{"'«])(?::)(?<query>[a-zA-Z0-9_+
|
|
|
20
21
|
export const MAX_EMOJI_SUGGESTIONS = 50;
|
|
21
22
|
|
|
22
23
|
/**
|
|
23
|
-
*
|
|
24
|
-
*
|
|
24
|
+
* Separator between the words of a shortcode. Most use an underscore, as in `party_popper`, but the
|
|
25
|
+
* flags and the compound people use a hyphen, as in `flag-ca` and `man-woman-girl`.
|
|
25
26
|
*/
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* In-flight or completed loader for {@link emojiList}, so the data is only fetched once.
|
|
29
|
-
* @type {Promise<EmojiEntry[]> | undefined}
|
|
30
|
-
*/
|
|
31
|
-
let loader;
|
|
32
|
-
|
|
27
|
+
const WORD_SEPARATOR_REGEX = /[-_]/;
|
|
33
28
|
/**
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
* ones are written with spaces or commas instead, like `heart hands`. A query can contain neither,
|
|
38
|
-
* so those names would be unreachable by their own shortcode and would be shown as something the
|
|
39
|
-
* user can’t type back.
|
|
40
|
-
* @internal
|
|
41
|
-
* @param {string} name Name as published.
|
|
42
|
-
* @returns {string} Name made up of the characters a query can contain.
|
|
29
|
+
* Emoji list, parsed out of the data the first time it’s searched. This is `undefined` until then,
|
|
30
|
+
* so a page that never sees a shortcode never pays for it.
|
|
31
|
+
* @type {EmojiEntry[] | undefined}
|
|
43
32
|
*/
|
|
44
|
-
|
|
45
|
-
name
|
|
46
|
-
.toLowerCase()
|
|
47
|
-
// Runs of anything a query can’t contain become a single separator
|
|
48
|
-
.replace(/[^a-z0-9_+-]+/g, '_')
|
|
49
|
-
.replace(/^_+|_+$/g, '');
|
|
33
|
+
let emojiList;
|
|
50
34
|
|
|
51
35
|
/**
|
|
52
|
-
* Convert the
|
|
36
|
+
* Convert the generated emoji data into a searchable list.
|
|
53
37
|
* @internal
|
|
54
|
-
* @param {
|
|
55
|
-
* followed by any keywords.
|
|
38
|
+
* @param {string} data Emoji data, one line per emoji. See `generated.js` for the format.
|
|
56
39
|
* @returns {EmojiEntry[]} Emoji list.
|
|
57
40
|
*/
|
|
58
41
|
export const parseEmojiData = (data) =>
|
|
59
|
-
|
|
60
|
-
emoji,
|
|
61
|
-
name
|
|
62
|
-
// Some of the keywords are capitalized, e.g. `NASA` and `XD`
|
|
63
|
-
aliases: aliases.map((alias) => alias.toLowerCase()),
|
|
64
|
-
}));
|
|
42
|
+
data.split('\n').map((line) => {
|
|
43
|
+
const [emoji, shortcodes, keywords = ''] = line.split('\t');
|
|
44
|
+
const [name, ...otherShortcodes] = shortcodes.split(' ');
|
|
65
45
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
export const loadEmojiList = async () => {
|
|
75
|
-
loader ??= (async () => {
|
|
76
|
-
try {
|
|
77
|
-
let data = await getCachedEmojiData();
|
|
78
|
-
|
|
79
|
-
if (!data) {
|
|
80
|
-
data = await getEmojiDataLoader()();
|
|
81
|
-
// Don’t make the caller wait on the write
|
|
82
|
-
cacheEmojiData(data);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
emojiList = parseEmojiData(data);
|
|
86
|
-
} catch (ex) {
|
|
87
|
-
// Allow a later attempt to retry, so a transient network failure isn’t permanent
|
|
88
|
-
loader = undefined;
|
|
89
|
-
emojiList = [];
|
|
90
|
-
// eslint-disable-next-line no-console
|
|
91
|
-
console.error(ex);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
return /** @type {EmojiEntry[]} */ (emojiList);
|
|
95
|
-
})();
|
|
96
|
-
|
|
97
|
-
return loader;
|
|
98
|
-
};
|
|
46
|
+
return {
|
|
47
|
+
emoji,
|
|
48
|
+
name,
|
|
49
|
+
// The alternative shortcodes come first, because they’re what the user might type, while the
|
|
50
|
+
// keywords merely describe the emoji
|
|
51
|
+
aliases: [...otherShortcodes, ...(keywords ? keywords.split(' ') : [])],
|
|
52
|
+
};
|
|
53
|
+
});
|
|
99
54
|
|
|
100
55
|
/**
|
|
101
56
|
* Rank given when there is no match at all. Higher than any real rank, so an unmatched emoji sorts
|
|
@@ -104,29 +59,30 @@ export const loadEmojiList = async () => {
|
|
|
104
59
|
export const NO_EMOJI_MATCH = 9;
|
|
105
60
|
|
|
106
61
|
/**
|
|
107
|
-
* Get how well an emoji’s
|
|
62
|
+
* Get how well an emoji’s canonical shortcode matches the given query. A lower rank means a better
|
|
63
|
+
* match.
|
|
108
64
|
*
|
|
109
|
-
* A match has to start at a word boundary. The
|
|
110
|
-
* whole, so a partly typed `:
|
|
111
|
-
*
|
|
65
|
+
* A match has to start at a word boundary. The shortcode is matched word by word rather than only
|
|
66
|
+
* as a whole, so a partly typed `:polar` reaches `polar_bear` just as `:polar_bear` does, and the
|
|
67
|
+
* whole shortcode is tested as well, so a query spanning a word boundary like `:polar_b` still
|
|
112
68
|
* matches. What this rules out is a match starting mid-word, which is nearly always coincidental:
|
|
113
69
|
* `:age` would otherwise turn up `mage`, `bagel`, `baggage`, `pager` and `package`.
|
|
114
70
|
* @internal
|
|
115
|
-
* @param {string} name Canonical
|
|
71
|
+
* @param {string} name Canonical shortcode.
|
|
116
72
|
* @param {string} query Lower-cased search query without the leading colon.
|
|
117
73
|
* @returns {number} Rank, or {@link NO_EMOJI_MATCH}.
|
|
118
74
|
*/
|
|
119
75
|
export const getEmojiNameMatchRank = (name, query) => {
|
|
120
|
-
const words = name.split(
|
|
76
|
+
const words = name.split(WORD_SEPARATOR_REGEX);
|
|
121
77
|
|
|
122
78
|
if (name === query) {
|
|
123
79
|
return 0;
|
|
124
80
|
}
|
|
125
81
|
|
|
126
|
-
// What the
|
|
82
|
+
// What the shortcode leads with is what the emoji mostly is, so `heart_eyes` is a better `:heart`
|
|
127
83
|
// match than `sparkling_heart`, where the word merely turns up along the way. The whole leading
|
|
128
84
|
// word has to match: `japanese_castle` is not what `:japan` is after, nor `crystal_ball` `:cry`.
|
|
129
|
-
if (name.startsWith(
|
|
85
|
+
if (name.startsWith(query) && WORD_SEPARATOR_REGEX.test(name.charAt(query.length))) {
|
|
130
86
|
return 1;
|
|
131
87
|
}
|
|
132
88
|
|
|
@@ -134,7 +90,7 @@ export const getEmojiNameMatchRank = (name, query) => {
|
|
|
134
90
|
return 2;
|
|
135
91
|
}
|
|
136
92
|
|
|
137
|
-
// The whole
|
|
93
|
+
// The whole shortcode is tested too, so a query spanning a word boundary like `:polar_b` matches
|
|
138
94
|
if (name.startsWith(query) || words.some((word) => word.startsWith(query))) {
|
|
139
95
|
return 4;
|
|
140
96
|
}
|
|
@@ -143,11 +99,11 @@ export const getEmojiNameMatchRank = (name, query) => {
|
|
|
143
99
|
};
|
|
144
100
|
|
|
145
101
|
/**
|
|
146
|
-
* Get how well an emoji’s keywords match the given query. A lower rank
|
|
147
|
-
* ranks interleave with {@link getEmojiNameMatchRank}’s: an exact keyword
|
|
148
|
-
* of the
|
|
102
|
+
* Get how well an emoji’s alternative shortcodes and keywords match the given query. A lower rank
|
|
103
|
+
* means a better match. The ranks interleave with {@link getEmojiNameMatchRank}’s: an exact keyword
|
|
104
|
+
* sits between a whole word of the shortcode and a partial one.
|
|
149
105
|
* @internal
|
|
150
|
-
* @param {string[]} aliases Lower-cased alternative keywords.
|
|
106
|
+
* @param {string[]} aliases Lower-cased alternative shortcodes and keywords.
|
|
151
107
|
* @param {string} query Lower-cased search query without the leading colon.
|
|
152
108
|
* @returns {number} Rank, or {@link NO_EMOJI_MATCH}.
|
|
153
109
|
*/
|
|
@@ -164,17 +120,17 @@ export const getEmojiAliasMatchRank = (aliases, query) => {
|
|
|
164
120
|
};
|
|
165
121
|
|
|
166
122
|
/**
|
|
167
|
-
* Get how well an emoji matches the given query, as the best of its
|
|
168
|
-
*
|
|
123
|
+
* Get how well an emoji matches the given query, as the best of its shortcode and keyword ranks
|
|
124
|
+
* plus the shortcode rank on its own.
|
|
169
125
|
*
|
|
170
|
-
* The
|
|
171
|
-
* while the keywords are merely associated with it. Many emojis share a keyword — `
|
|
172
|
-
*
|
|
173
|
-
* `
|
|
126
|
+
* The shortcode rank is kept so it can break ties, because the shortcode is what the emoji is
|
|
127
|
+
* called while the keywords are merely associated with it. Many emojis share a keyword — `canada`
|
|
128
|
+
* belongs to 🇨🇦 and 🍁 alike — and the one that also carries the query in its shortcode,
|
|
129
|
+
* `flag-ca`, is the one the user is after.
|
|
174
130
|
* @internal
|
|
175
131
|
* @param {EmojiEntry} entry Emoji entry.
|
|
176
132
|
* @param {string} query Lower-cased search query without the leading colon.
|
|
177
|
-
* @returns {{ rank: number, nameRank: number }} Best rank and
|
|
133
|
+
* @returns {{ rank: number, nameRank: number }} Best rank and shortcode rank, either of which is
|
|
178
134
|
* {@link NO_EMOJI_MATCH} when there is nothing to match.
|
|
179
135
|
*/
|
|
180
136
|
export const getEmojiMatchRank = ({ name, aliases }, query) => {
|
|
@@ -188,11 +144,10 @@ export const getEmojiMatchRank = ({ name, aliases }, query) => {
|
|
|
188
144
|
* Get how central a match is to the emoji, to separate emojis that match equally well. A lower
|
|
189
145
|
* number means the query is more of what the emoji is about.
|
|
190
146
|
*
|
|
191
|
-
* For a
|
|
192
|
-
* `:heart` than `smiling_face_with_heart_eyes` is. For a keyword match, it’s how
|
|
193
|
-
* keyword
|
|
194
|
-
*
|
|
195
|
-
* 💏 `kiss` buries it third among nineteen.
|
|
147
|
+
* For a shortcode match, that’s how much of the shortcode the query accounts for: `red_heart` is
|
|
148
|
+
* more of a `:heart` than `smiling_face_with_heart_eyes` is. For a keyword match, it’s how early
|
|
149
|
+
* the keyword comes — the alternative shortcodes are listed first, then the words of the Unicode
|
|
150
|
+
* name in the order it spells them out, which is roughly most to least defining.
|
|
196
151
|
* @internal
|
|
197
152
|
* @param {EmojiEntry} entry Emoji entry.
|
|
198
153
|
* @param {string} query Lower-cased search query without the leading colon.
|
|
@@ -200,7 +155,7 @@ export const getEmojiMatchRank = ({ name, aliases }, query) => {
|
|
|
200
155
|
*/
|
|
201
156
|
const getMatchCentrality = ({ name, aliases }, query) => {
|
|
202
157
|
if (getEmojiNameMatchRank(name, query) < NO_EMOJI_MATCH) {
|
|
203
|
-
return name.split(
|
|
158
|
+
return name.split(WORD_SEPARATOR_REGEX).length;
|
|
204
159
|
}
|
|
205
160
|
|
|
206
161
|
const index = aliases.findIndex((alias) => alias === query || alias.startsWith(query));
|
|
@@ -209,8 +164,7 @@ const getMatchCentrality = ({ name, aliases }, query) => {
|
|
|
209
164
|
};
|
|
210
165
|
|
|
211
166
|
/**
|
|
212
|
-
* Search the
|
|
213
|
-
* {@link loadEmojiList} has been resolved beforehand.
|
|
167
|
+
* Search the emoji list for the given query.
|
|
214
168
|
* @param {string} query Search query without the leading colon, e.g. `smi`.
|
|
215
169
|
* @returns {EmojiEntry[]} Matching emojis, best match first, capped at
|
|
216
170
|
* {@link MAX_EMOJI_SUGGESTIONS}.
|
|
@@ -218,10 +172,12 @@ const getMatchCentrality = ({ name, aliases }, query) => {
|
|
|
218
172
|
export const searchEmojis = (query) => {
|
|
219
173
|
const normalizedQuery = query.toLowerCase();
|
|
220
174
|
|
|
221
|
-
if (!
|
|
175
|
+
if (!normalizedQuery) {
|
|
222
176
|
return [];
|
|
223
177
|
}
|
|
224
178
|
|
|
179
|
+
emojiList ??= parseEmojiData(EMOJI_DATA);
|
|
180
|
+
|
|
225
181
|
return (
|
|
226
182
|
emojiList
|
|
227
183
|
.map((entry) => {
|
|
@@ -230,12 +186,10 @@ export const searchEmojis = (query) => {
|
|
|
230
186
|
return { entry, rank, nameRank, centrality: getMatchCentrality(entry, normalizedQuery) };
|
|
231
187
|
})
|
|
232
188
|
.filter(({ rank }) => rank < NO_EMOJI_MATCH)
|
|
233
|
-
// Equally ranked emojis are settled by the
|
|
234
|
-
// emoji, then by the published order — `Array.prototype.sort()`
|
|
235
|
-
//
|
|
236
|
-
//
|
|
237
|
-
// an emoji is used, and newer emojis are simply appended. 🫶 `heart_hands` sits at 1826, so
|
|
238
|
-
// without the two keys before it, it loses every tie to whatever happens to be older.
|
|
189
|
+
// Equally ranked emojis are settled by the shortcode, then by how central the match is to the
|
|
190
|
+
// emoji, then by the published order, which is the Unicode order — `Array.prototype.sort()`
|
|
191
|
+
// is stable. That last resort roughly groups the like with the like, so a tie between two
|
|
192
|
+
// country flags or two smileys at least comes out in a familiar order.
|
|
239
193
|
.sort((a, b) => a.rank - b.rank || a.nameRank - b.nameRank || a.centrality - b.centrality)
|
|
240
194
|
.slice(0, MAX_EMOJI_SUGGESTIONS)
|
|
241
195
|
.map(({ entry }) => entry)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Emoji list from `emoji-data` v16.0.0, in the Unicode order the dataset publishes.
|
|
3
|
+
*
|
|
4
|
+
* One line per emoji, made up of tab-separated fields: the emoji character, its shortcodes, and any
|
|
5
|
+
* further searchable words taken from its Unicode name. Multiple shortcodes or keywords within a
|
|
6
|
+
* field are separated by a space, and the last field is left out when there are no extra keywords.
|
|
7
|
+
* The first shortcode is the canonical one, the one shown alongside the emoji in the suggestions.
|
|
8
|
+
*
|
|
9
|
+
* It’s a single string rather than an object so that it costs one line per emoji in the bundle
|
|
10
|
+
* instead of a few hundred bytes of punctuation, and so that nothing is parsed until the first
|
|
11
|
+
* shortcode is actually typed.
|
|
12
|
+
* @see https://github.com/iamcal/emoji-data
|
|
13
|
+
*/
|
|
14
|
+
export const EMOJI_DATA: "😀\tgrinning\tface\n😃\tsmiley\tsmiling face open mouth\n😄\tsmile\tsmiling face open mouth eyes\n😁\tgrin\tgrinning face smiling eyes\n😆\tlaughing satisfied\tsmiling face open mouth tightly-closed eyes\n😅\tsweat_smile\tsmiling face open mouth cold\n🤣\trolling_on_the_floor_laughing\n😂\tjoy\tface tears\n🙂\tslightly_smiling_face\n🙃\tupside_down_face\tupside-down\n🫠\tmelting_face\n😉\twink\twinking face\n😊\tblush\tsmiling face eyes\n😇\tinnocent\tsmiling face halo\n🥰\tsmiling_face_with_3_hearts\teyes three\n😍\theart_eyes\tsmiling face heart-shaped\n🤩\tstar-struck grinning_face_with_star_eyes\n😘\tkissing_heart\tface throwing kiss\n😗\tkissing\tface\n☺️\trelaxed\twhite smiling face\n😚\tkissing_closed_eyes\tface\n😙\tkissing_smiling_eyes\tface\n🥲\tsmiling_face_with_tear\n😋\tyum\tface savouring delicious food\n😛\tstuck_out_tongue\tface stuck-out\n😜\tstuck_out_tongue_winking_eye\tface stuck-out\n🤪\tzany_face grinning_face_with_one_large_and_one_small_eye\n😝\tstuck_out_tongue_closed_eyes\tface stuck-out tightly-closed\n🤑\tmoney_mouth_face\tmoney-mouth\n🤗\thugging_face\n🤭\tface_with_hand_over_mouth smiling_face_with_smiling_eyes_and_hand_covering_mouth\n🫢\tface_with_open_eyes_and_hand_over_mouth\n🫣\tface_with_peeking_eye\n🤫\tshushing_face face_with_finger_covering_closed_lips\n🤔\tthinking_face\n🫡\tsaluting_face\n🤐\tzipper_mouth_face\tzipper-mouth\n🤨\tface_with_raised_eyebrow face_with_one_eyebrow_raised\n😐\tneutral_face\n😑\texpressionless\tface\n😶\tno_mouth\tface without\n🫥\tdotted_line_face\n😶🌫️\tface_in_clouds\n😏\tsmirk\tsmirking face\n😒\tunamused\tface\n🙄\tface_with_rolling_eyes\n😬\tgrimacing\tface\n😮💨\tface_exhaling\n🤥\tlying_face\n🫨\tshaking_face\n🙂↔️\thead_shaking_horizontally\n🙂↕️\thead_shaking_vertically\n😌\trelieved\tface\n😔\tpensive\tface\n😪\tsleepy\tface\n🤤\tdrooling_face\n😴\tsleeping\tface\n\tface_with_bags_under_eyes\n😷\tmask\tface medical\n🤒\tface_with_thermometer\n🤕\tface_with_head_bandage\thead-bandage\n🤢\tnauseated_face\n🤮\tface_vomiting face_with_open_mouth_vomiting\n🤧\tsneezing_face\n🥵\thot_face\toverheated\n🥶\tcold_face\tfreezing\n🥴\twoozy_face\tuneven eyes wavy mouth\n😵\tdizzy_face\n😵💫\tface_with_spiral_eyes\n🤯\texploding_head shocked_face_with_exploding_head\n🤠\tface_with_cowboy_hat\n🥳\tpartying_face\tparty horn hat\n🥸\tdisguised_face\n😎\tsunglasses\tsmiling face\n🤓\tnerd_face\n🧐\tface_with_monocle\n😕\tconfused\tface\n🫤\tface_with_diagonal_mouth\n😟\tworried\tface\n🙁\tslightly_frowning_face\n☹️\twhite_frowning_face\n😮\topen_mouth\tface\n😯\thushed\tface\n😲\tastonished\tface\n😳\tflushed\tface\n🥺\tpleading_face\teyes\n🥹\tface_holding_back_tears\n😦\tfrowning\tface open mouth\n😧\tanguished\tface\n😨\tfearful\tface\n😰\tcold_sweat\tface open mouth\n😥\tdisappointed_relieved\tbut face\n😢\tcry\tcrying face\n😭\tsob\tloudly crying face\n😱\tscream\tface screaming fear\n😖\tconfounded\tface\n😣\tpersevere\tpersevering face\n😞\tdisappointed\tface\n😓\tsweat\tface cold\n😩\tweary\tface\n😫\ttired_face\n🥱\tyawning_face\n😤\ttriumph\tface look\n😡\trage\tpouting face\n😠\tangry\tface\n🤬\tface_with_symbols_on_mouth serious_face_with_symbols_covering_mouth\n😈\tsmiling_imp\tface horns\n👿\timp\n💀\tskull\n☠️\tskull_and_crossbones\n💩\thankey poop shit\tpile poo\n🤡\tclown_face\n👹\tjapanese_ogre\n👺\tjapanese_goblin\n👻\tghost\n👽\talien\textraterrestrial\n👾\tspace_invader\talien monster\n🤖\trobot_face\n😺\tsmiley_cat\tsmiling face open mouth\n😸\tsmile_cat\tgrinning face smiling eyes\n😹\tjoy_cat\tface tears\n😻\theart_eyes_cat\tsmiling face heart-shaped\n😼\tsmirk_cat\tface wry smile\n😽\tkissing_cat\tface closed eyes\n🙀\tscream_cat\tweary face\n😿\tcrying_cat_face\n😾\tpouting_cat\tface\n🙈\tsee_no_evil\tsee-no-evil monkey\n🙉\thear_no_evil\thear-no-evil monkey\n🙊\tspeak_no_evil\tspeak-no-evil monkey\n💌\tlove_letter\n💘\tcupid\theart arrow\n💝\tgift_heart\tribbon\n💖\tsparkling_heart\n💗\theartpulse\tgrowing heart\n💓\theartbeat\tbeating heart\n💞\trevolving_hearts\n💕\ttwo_hearts\n💟\theart_decoration\n❣️\theavy_heart_exclamation_mark_ornament\n💔\tbroken_heart\n❤️🔥\theart_on_fire\n❤️🩹\tmending_heart\n❤️\theart\theavy black\n🩷\tpink_heart\n🧡\torange_heart\n💛\tyellow_heart\n💚\tgreen_heart\n💙\tblue_heart\n🩵\tlight_blue_heart\n💜\tpurple_heart\n🤎\tbrown_heart\n🖤\tblack_heart\n🩶\tgrey_heart\n🤍\twhite_heart\n💋\tkiss\tmark\n💯\t100\thundred points symbol\n💢\tanger\tsymbol\n💥\tboom collision\tsymbol\n💫\tdizzy\tsymbol\n💦\tsweat_drops\tsplashing symbol\n💨\tdash\tsymbol\n🕳️\thole\n💬\tspeech_balloon\n👁️🗨️\teye-in-speech-bubble\n🗨️\tleft_speech_bubble\n🗯️\tright_anger_bubble\n💭\tthought_balloon\n💤\tzzz\tsleeping symbol\n👋\twave\twaving hand sign\n🤚\traised_back_of_hand\n🖐️\traised_hand_with_fingers_splayed\n✋\thand raised_hand\n🖖\tspock-hand\traised part between middle ring fingers\n🫱\trightwards_hand\n🫲\tleftwards_hand\n🫳\tpalm_down_hand\n🫴\tpalm_up_hand\n🫷\tleftwards_pushing_hand\n🫸\trightwards_pushing_hand\n👌\tok_hand\tsign\n🤌\tpinched_fingers\n🤏\tpinching_hand\n✌️\tv\tvictory hand\n🤞\tcrossed_fingers hand_with_index_and_middle_fingers_crossed\n🫰\thand_with_index_finger_and_thumb_crossed\n🤟\ti_love_you_hand_sign\n🤘\tthe_horns sign_of_the_horns\n🤙\tcall_me_hand\n👈\tpoint_left\twhite pointing backhand index\n👉\tpoint_right\twhite pointing backhand index\n👆\tpoint_up_2\twhite pointing backhand index\n🖕\tmiddle_finger reversed_hand_with_middle_finger_extended\n👇\tpoint_down\twhite pointing backhand index\n☝️\tpoint_up\twhite pointing index\n🫵\tindex_pointing_at_the_viewer\n👍\t+1 thumbsup\tthumbs up sign\n👎\t-1 thumbsdown\tthumbs down sign\n✊\tfist\traised\n👊\tfacepunch punch\tfisted hand sign\n🤛\tleft-facing_fist\tleft-facing\n🤜\tright-facing_fist\tright-facing\n👏\tclap\tclapping hands sign\n🙌\traised_hands\tperson raising both celebration\n🫶\theart_hands\n👐\topen_hands\tsign\n🤲\tpalms_up_together\n🤝\thandshake\n🙏\tpray\tperson folded hands\n✍️\twriting_hand\n💅\tnail_care\tpolish\n🤳\tselfie\n💪\tmuscle\tflexed biceps\n🦾\tmechanical_arm\n🦿\tmechanical_leg\n🦵\tleg\n🦶\tfoot\n👂\tear\n🦻\tear_with_hearing_aid\n👃\tnose\n🧠\tbrain\n🫀\tanatomical_heart\n🫁\tlungs\n🦷\ttooth\n🦴\tbone\n👀\teyes\n👁️\teye\n👅\ttongue\n👄\tlips\tmouth\n🫦\tbiting_lip\n👶\tbaby\n🧒\tchild\n👦\tboy\n👧\tgirl\n🧑\tadult\n👱\tperson_with_blond_hair\n👨\tman\n🧔\tbearded_person\n🧔♂️\tman_with_beard\n🧔♀️\twoman_with_beard\n👨🦰\tred_haired_man\thair\n👨🦱\tcurly_haired_man\thair\n👨🦳\twhite_haired_man\thair\n👨🦲\tbald_man\n👩\twoman\n👩🦰\tred_haired_woman\thair\n🧑🦰\tred_haired_person\thair\n👩🦱\tcurly_haired_woman\thair\n🧑🦱\tcurly_haired_person\thair\n👩🦳\twhite_haired_woman\thair\n🧑🦳\twhite_haired_person\thair\n👩🦲\tbald_woman\n🧑🦲\tbald_person\n👱♀️\tblond-haired-woman\thair\n👱♂️\tblond-haired-man\thair\n🧓\tolder_adult\n👴\tolder_man\n👵\tolder_woman\n🙍\tperson_frowning\n🙍♂️\tman-frowning\n🙍♀️\twoman-frowning\n🙎\tperson_with_pouting_face\n🙎♂️\tman-pouting\n🙎♀️\twoman-pouting\n🙅\tno_good\tface gesture\n🙅♂️\tman-gesturing-no\n🙅♀️\twoman-gesturing-no\n🙆\tok_woman\tface gesture\n🙆♂️\tman-gesturing-ok\n🙆♀️\twoman-gesturing-ok\n💁\tinformation_desk_person\n💁♂️\tman-tipping-hand\n💁♀️\twoman-tipping-hand\n🙋\traising_hand\thappy person one\n🙋♂️\tman-raising-hand\n🙋♀️\twoman-raising-hand\n🧏\tdeaf_person\n🧏♂️\tdeaf_man\n🧏♀️\tdeaf_woman\n🙇\tbow\tperson bowing deeply\n🙇♂️\tman-bowing\n🙇♀️\twoman-bowing\n🤦\tface_palm\n🤦♂️\tman-facepalming\n🤦♀️\twoman-facepalming\n🤷\tshrug\n🤷♂️\tman-shrugging\n🤷♀️\twoman-shrugging\n🧑⚕️\thealth_worker\n👨⚕️\tmale-doctor\tman health worker\n👩⚕️\tfemale-doctor\twoman health worker\n🧑🎓\tstudent\n👨🎓\tmale-student\tman\n👩🎓\tfemale-student\twoman\n🧑🏫\tteacher\n👨🏫\tmale-teacher\tman\n👩🏫\tfemale-teacher\twoman\n🧑⚖️\tjudge\n👨⚖️\tmale-judge\tman\n👩⚖️\tfemale-judge\twoman\n🧑🌾\tfarmer\n👨🌾\tmale-farmer\tman\n👩🌾\tfemale-farmer\twoman\n🧑🍳\tcook\n👨🍳\tmale-cook\tman\n👩🍳\tfemale-cook\twoman\n🧑🔧\tmechanic\n👨🔧\tmale-mechanic\tman\n👩🔧\tfemale-mechanic\twoman\n🧑🏭\tfactory_worker\n👨🏭\tmale-factory-worker\tman\n👩🏭\tfemale-factory-worker\twoman\n🧑💼\toffice_worker\n👨💼\tmale-office-worker\tman\n👩💼\tfemale-office-worker\twoman\n🧑🔬\tscientist\n👨🔬\tmale-scientist\tman\n👩🔬\tfemale-scientist\twoman\n🧑💻\ttechnologist\n👨💻\tmale-technologist\tman\n👩💻\tfemale-technologist\twoman\n🧑🎤\tsinger\n👨🎤\tmale-singer\tman\n👩🎤\tfemale-singer\twoman\n🧑🎨\tartist\n👨🎨\tmale-artist\tman\n👩🎨\tfemale-artist\twoman\n🧑✈️\tpilot\n👨✈️\tmale-pilot\tman\n👩✈️\tfemale-pilot\twoman\n🧑🚀\tastronaut\n👨🚀\tmale-astronaut\tman\n👩🚀\tfemale-astronaut\twoman\n🧑🚒\tfirefighter\n👨🚒\tmale-firefighter\tman\n👩🚒\tfemale-firefighter\twoman\n👮\tcop\tpolice officer\n👮♂️\tmale-police-officer\tman\n👮♀️\tfemale-police-officer\twoman\n🕵️\tsleuth_or_spy\tdetective\n🕵️♂️\tmale-detective\tman\n🕵️♀️\tfemale-detective\twoman\n💂\tguardsman\n💂♂️\tmale-guard\tman\n💂♀️\tfemale-guard\twoman\n🥷\tninja\n👷\tconstruction_worker\n👷♂️\tmale-construction-worker\tman\n👷♀️\tfemale-construction-worker\twoman\n🫅\tperson_with_crown\n🤴\tprince\n👸\tprincess\n👳\tman_with_turban\n👳♂️\tman-wearing-turban\n👳♀️\twoman-wearing-turban\n👲\tman_with_gua_pi_mao\n🧕\tperson_with_headscarf\n🤵\tperson_in_tuxedo\tman\n🤵♂️\tman_in_tuxedo\n🤵♀️\twoman_in_tuxedo\n👰\tbride_with_veil\n👰♂️\tman_with_veil\n👰♀️\twoman_with_veil\n🤰\tpregnant_woman\n🫃\tpregnant_man\n🫄\tpregnant_person\n🤱\tbreast-feeding\n👩🍼\twoman_feeding_baby\n👨🍼\tman_feeding_baby\n🧑🍼\tperson_feeding_baby\n👼\tangel\tbaby\n🎅\tsanta\tfather christmas\n🤶\tmrs_claus mother_christmas\n🧑🎄\tmx_claus\n🦸\tsuperhero\n🦸♂️\tmale_superhero\tman\n🦸♀️\tfemale_superhero\twoman\n🦹\tsupervillain\n🦹♂️\tmale_supervillain\tman\n🦹♀️\tfemale_supervillain\twoman\n🧙\tmage\n🧙♂️\tmale_mage\tman\n🧙♀️\tfemale_mage\twoman\n🧚\tfairy\n🧚♂️\tmale_fairy\tman\n🧚♀️\tfemale_fairy\twoman\n🧛\tvampire\n🧛♂️\tmale_vampire\tman\n🧛♀️\tfemale_vampire\twoman\n🧜\tmerperson\n🧜♂️\tmerman\n🧜♀️\tmermaid\n🧝\telf\n🧝♂️\tmale_elf\tman\n🧝♀️\tfemale_elf\twoman\n🧞\tgenie\n🧞♂️\tmale_genie\tman\n🧞♀️\tfemale_genie\twoman\n🧟\tzombie\n🧟♂️\tmale_zombie\tman\n🧟♀️\tfemale_zombie\twoman\n🧌\ttroll\n💆\tmassage\tface\n💆♂️\tman-getting-massage\n💆♀️\twoman-getting-massage\n💇\thaircut\n💇♂️\tman-getting-haircut\n💇♀️\twoman-getting-haircut\n🚶\twalking\tpedestrian\n🚶♂️\tman-walking\n🚶♀️\twoman-walking\n🚶➡️\tperson_walking_facing_right\n🚶♀️➡️\twoman_walking_facing_right\n🚶♂️➡️\tman_walking_facing_right\n🧍\tstanding_person\n🧍♂️\tman_standing\n🧍♀️\twoman_standing\n🧎\tkneeling_person\n🧎♂️\tman_kneeling\n🧎♀️\twoman_kneeling\n🧎➡️\tperson_kneeling_facing_right\n🧎♀️➡️\twoman_kneeling_facing_right\n🧎♂️➡️\tman_kneeling_facing_right\n🧑🦯\tperson_with_probing_cane\twhite\n🧑🦯➡️\tperson_with_white_cane_facing_right\n👨🦯\tman_with_probing_cane\twhite\n👨🦯➡️\tman_with_white_cane_facing_right\n👩🦯\twoman_with_probing_cane\twhite\n👩🦯➡️\twoman_with_white_cane_facing_right\n🧑🦼\tperson_in_motorized_wheelchair\n🧑🦼➡️\tperson_in_motorized_wheelchair_facing_right\n👨🦼\tman_in_motorized_wheelchair\n👨🦼➡️\tman_in_motorized_wheelchair_facing_right\n👩🦼\twoman_in_motorized_wheelchair\n👩🦼➡️\twoman_in_motorized_wheelchair_facing_right\n🧑🦽\tperson_in_manual_wheelchair\n🧑🦽➡️\tperson_in_manual_wheelchair_facing_right\n👨🦽\tman_in_manual_wheelchair\n👨🦽➡️\tman_in_manual_wheelchair_facing_right\n👩🦽\twoman_in_manual_wheelchair\n👩🦽➡️\twoman_in_manual_wheelchair_facing_right\n🏃\trunner running\n🏃♂️\tman-running\n🏃♀️\twoman-running\n🏃➡️\tperson_running_facing_right\n🏃♀️➡️\twoman_running_facing_right\n🏃♂️➡️\tman_running_facing_right\n💃\tdancer\n🕺\tman_dancing\n🕴️\tman_in_business_suit_levitating\tperson\n👯\tdancers\twoman bunny ears\n👯♂️\tmen-with-bunny-ears-partying man-with-bunny-ears-partying\n👯♀️\twomen-with-bunny-ears-partying woman-with-bunny-ears-partying\n🧖\tperson_in_steamy_room\n🧖♂️\tman_in_steamy_room\n🧖♀️\twoman_in_steamy_room\n🧗\tperson_climbing\n🧗♂️\tman_climbing\n🧗♀️\twoman_climbing\n🤺\tfencer\n🏇\thorse_racing\n⛷️\tskier\n🏂\tsnowboarder\n🏌️\tgolfer\tperson golfing\n🏌️♂️\tman-golfing\n🏌️♀️\twoman-golfing\n🏄\tsurfer\n🏄♂️\tman-surfing\n🏄♀️\twoman-surfing\n🚣\trowboat\n🚣♂️\tman-rowing-boat\n🚣♀️\twoman-rowing-boat\n🏊\tswimmer\n🏊♂️\tman-swimming\n🏊♀️\twoman-swimming\n⛹️\tperson_with_ball\tbouncing\n⛹️♂️\tman-bouncing-ball\n⛹️♀️\twoman-bouncing-ball\n🏋️\tweight_lifter\tperson lifting weights\n🏋️♂️\tman-lifting-weights\n🏋️♀️\twoman-lifting-weights\n🚴\tbicyclist\n🚴♂️\tman-biking\n🚴♀️\twoman-biking\n🚵\tmountain_bicyclist\n🚵♂️\tman-mountain-biking\n🚵♀️\twoman-mountain-biking\n🤸\tperson_doing_cartwheel\n🤸♂️\tman-cartwheeling\n🤸♀️\twoman-cartwheeling\n🤼\twrestlers\n🤼♂️\tman-wrestling\tmen\n🤼♀️\twoman-wrestling\twomen\n🤽\twater_polo\n🤽♂️\tman-playing-water-polo\n🤽♀️\twoman-playing-water-polo\n🤾\thandball\n🤾♂️\tman-playing-handball\n🤾♀️\twoman-playing-handball\n🤹\tjuggling\n🤹♂️\tman-juggling\n🤹♀️\twoman-juggling\n🧘\tperson_in_lotus_position\n🧘♂️\tman_in_lotus_position\n🧘♀️\twoman_in_lotus_position\n🛀\tbath\n🛌\tsleeping_accommodation\n🧑🤝🧑\tpeople_holding_hands\n👭\ttwo_women_holding_hands women_holding_hands\n👫\tman_and_woman_holding_hands woman_and_man_holding_hands couple\n👬\ttwo_men_holding_hands men_holding_hands\n💏\tcouplekiss\tkiss\n👩❤️💋👨\twoman-kiss-man\n👨❤️💋👨\tman-kiss-man\n👩❤️💋👩\twoman-kiss-woman\n💑\tcouple_with_heart\n👩❤️👨\twoman-heart-man\tcouple\n👨❤️👨\tman-heart-man\tcouple\n👩❤️👩\twoman-heart-woman\tcouple\n👨👩👦\tman-woman-boy\tfamily\n👨👩👧\tman-woman-girl\tfamily\n👨👩👧👦\tman-woman-girl-boy\tfamily\n👨👩👦👦\tman-woman-boy-boy\tfamily\n👨👩👧👧\tman-woman-girl-girl\tfamily\n👨👨👦\tman-man-boy\tfamily\n👨👨👧\tman-man-girl\tfamily\n👨👨👧👦\tman-man-girl-boy\tfamily\n👨👨👦👦\tman-man-boy-boy\tfamily\n👨👨👧👧\tman-man-girl-girl\tfamily\n👩👩👦\twoman-woman-boy\tfamily\n👩👩👧\twoman-woman-girl\tfamily\n👩👩👧👦\twoman-woman-girl-boy\tfamily\n👩👩👦👦\twoman-woman-boy-boy\tfamily\n👩👩👧👧\twoman-woman-girl-girl\tfamily\n👨👦\tman-boy\tfamily\n👨👦👦\tman-boy-boy\tfamily\n👨👧\tman-girl\tfamily\n👨👧👦\tman-girl-boy\tfamily\n👨👧👧\tman-girl-girl\tfamily\n👩👦\twoman-boy\tfamily\n👩👦👦\twoman-boy-boy\tfamily\n👩👧\twoman-girl\tfamily\n👩👧👦\twoman-girl-boy\tfamily\n👩👧👧\twoman-girl-girl\tfamily\n🗣️\tspeaking_head_in_silhouette\n👤\tbust_in_silhouette\n👥\tbusts_in_silhouette\n🫂\tpeople_hugging\n👪\tfamily\n🧑🧑🧒\tfamily_adult_adult_child\n🧑🧑🧒🧒\tfamily_adult_adult_child_child\n🧑🧒\tfamily_adult_child\n🧑🧒🧒\tfamily_adult_child_child\n👣\tfootprints\n\tfingerprint\n🐵\tmonkey_face\n🐒\tmonkey\n🦍\tgorilla\n🦧\torangutan\n🐶\tdog\tface\n🐕\tdog2\tdog\n🦮\tguide_dog\n🐕🦺\tservice_dog\n🐩\tpoodle\n🐺\twolf\tface\n🦊\tfox_face\n🦝\traccoon\n🐱\tcat\tface\n🐈\tcat2\tcat\n🐈⬛\tblack_cat\n🦁\tlion_face\n🐯\ttiger\tface\n🐅\ttiger2\ttiger\n🐆\tleopard\n🐴\thorse\tface\n🫎\tmoose\n🫏\tdonkey\n🐎\tracehorse\thorse\n🦄\tunicorn_face\n🦓\tzebra_face\n🦌\tdeer\n🦬\tbison\n🐮\tcow\tface\n🐂\tox\n🐃\twater_buffalo\n🐄\tcow2\tcow\n🐷\tpig\tface\n🐖\tpig2\tpig\n🐗\tboar\n🐽\tpig_nose\n🐏\tram\n🐑\tsheep\n🐐\tgoat\n🐪\tdromedary_camel\n🐫\tcamel\tbactrian\n🦙\tllama\n🦒\tgiraffe_face\n🐘\telephant\n🦣\tmammoth\n🦏\trhinoceros\n🦛\thippopotamus\n🐭\tmouse\tface\n🐁\tmouse2\tmouse\n🐀\trat\n🐹\thamster\tface\n🐰\trabbit\tface\n🐇\trabbit2\trabbit\n🐿️\tchipmunk\n🦫\tbeaver\n🦔\thedgehog\n🦇\tbat\n🐻\tbear\tface\n🐻❄️\tpolar_bear\n🐨\tkoala\n🐼\tpanda_face\n🦥\tsloth\n🦦\totter\n🦨\tskunk\n🦘\tkangaroo\n🦡\tbadger\n🐾\tfeet paw_prints\n🦃\tturkey\n🐔\tchicken\n🐓\trooster\n🐣\thatching_chick\n🐤\tbaby_chick\n🐥\thatched_chick\tfront-facing baby\n🐦\tbird\n🐧\tpenguin\n🕊️\tdove_of_peace\n🦅\teagle\n🦆\tduck\n🦢\tswan\n🦉\towl\n🦤\tdodo\n🪶\tfeather\n🦩\tflamingo\n🦚\tpeacock\n🦜\tparrot\n🪽\twing\n🐦⬛\tblack_bird\n🪿\tgoose\n🐦🔥\tphoenix\n🐸\tfrog\tface\n🐊\tcrocodile\n🐢\tturtle\n🦎\tlizard\n🐍\tsnake\n🐲\tdragon_face\n🐉\tdragon\n🦕\tsauropod\n🦖\tt-rex\n🐳\twhale\tspouting\n🐋\twhale2\twhale\n🐬\tdolphin flipper\n🦭\tseal\n🐟\tfish\n🐠\ttropical_fish\n🐡\tblowfish\n🦈\tshark\n🐙\toctopus\n🐚\tshell\tspiral\n🪸\tcoral\n🪼\tjellyfish\n🦀\tcrab\n🦞\tlobster\n🦐\tshrimp\n🦑\tsquid\n🦪\toyster\n🐌\tsnail\n🦋\tbutterfly\n🐛\tbug\n🐜\tant\n🐝\tbee honeybee\n🪲\tbeetle\n🐞\tladybug lady_beetle\n🦗\tcricket\n🪳\tcockroach\n🕷️\tspider\n🕸️\tspider_web\n🦂\tscorpion\n🦟\tmosquito\n🪰\tfly\n🪱\tworm\n🦠\tmicrobe\n💐\tbouquet\n🌸\tcherry_blossom\n💮\twhite_flower\n🪷\tlotus\n🏵️\trosette\n🌹\trose\n🥀\twilted_flower\n🌺\thibiscus\n🌻\tsunflower\n🌼\tblossom\n🌷\ttulip\n🪻\thyacinth\n🌱\tseedling\n🪴\tpotted_plant\n🌲\tevergreen_tree\n🌳\tdeciduous_tree\n🌴\tpalm_tree\n🌵\tcactus\n🌾\tear_of_rice\n🌿\therb\n☘️\tshamrock\n🍀\tfour_leaf_clover\n🍁\tmaple_leaf\n🍂\tfallen_leaf\n🍃\tleaves\tleaf fluttering wind\n🪹\tempty_nest\n🪺\tnest_with_eggs\n🍄\tmushroom\n\tleafless_tree\n🍇\tgrapes\n🍈\tmelon\n🍉\twatermelon\n🍊\ttangerine\n🍋\tlemon\n🍋🟩\tlime\n🍌\tbanana\n🍍\tpineapple\n🥭\tmango\n🍎\tapple\tred\n🍏\tgreen_apple\n🍐\tpear\n🍑\tpeach\n🍒\tcherries\n🍓\tstrawberry\n🫐\tblueberries\n🥝\tkiwifruit\n🍅\ttomato\n🫒\tolive\n🥥\tcoconut\n🥑\tavocado\n🍆\teggplant\taubergine\n🥔\tpotato\n🥕\tcarrot\n🌽\tcorn\tear maize\n🌶️\thot_pepper\n🫑\tbell_pepper\n🥒\tcucumber\n🥬\tleafy_green\n🥦\tbroccoli\n🧄\tgarlic\n🧅\tonion\n🥜\tpeanuts\n🫘\tbeans\n🌰\tchestnut\n🫚\tginger_root\n🫛\tpea_pod\n🍄🟫\tbrown_mushroom\n\troot_vegetable\n🍞\tbread\n🥐\tcroissant\n🥖\tbaguette_bread\n🫓\tflatbread\n🥨\tpretzel\n🥯\tbagel\n🥞\tpancakes\n🧇\twaffle\n🧀\tcheese_wedge\n🍖\tmeat_on_bone\n🍗\tpoultry_leg\n🥩\tcut_of_meat\n🥓\tbacon\n🍔\thamburger\n🍟\tfries\tfrench\n🍕\tpizza\tslice\n🌭\thotdog\thot dog\n🥪\tsandwich\n🌮\ttaco\n🌯\tburrito\n🫔\ttamale\n🥙\tstuffed_flatbread\n🧆\tfalafel\n🥚\tegg\n🍳\tfried_egg cooking\n🥘\tshallow_pan_of_food\n🍲\tstew\tpot food\n🫕\tfondue\n🥣\tbowl_with_spoon\n🥗\tgreen_salad\n🍿\tpopcorn\n🧈\tbutter\n🧂\tsalt\tshaker\n🥫\tcanned_food\n🍱\tbento\tbox\n🍘\trice_cracker\n🍙\trice_ball\n🍚\trice\tcooked\n🍛\tcurry\trice\n🍜\tramen\tsteaming bowl\n🍝\tspaghetti\n🍠\tsweet_potato\troasted\n🍢\toden\n🍣\tsushi\n🍤\tfried_shrimp\n🍥\tfish_cake\tswirl design\n🥮\tmoon_cake\n🍡\tdango\n🥟\tdumpling\n🥠\tfortune_cookie\n🥡\ttakeout_box\n🍦\ticecream\tsoft ice cream\n🍧\tshaved_ice\n🍨\tice_cream\n🍩\tdoughnut\n🍪\tcookie\n🎂\tbirthday\tcake\n🍰\tcake\tshortcake\n🧁\tcupcake\n🥧\tpie\n🍫\tchocolate_bar\n🍬\tcandy\n🍭\tlollipop\n🍮\tcustard\n🍯\thoney_pot\n🍼\tbaby_bottle\n🥛\tglass_of_milk\n☕\tcoffee\thot beverage\n🫖\tteapot\n🍵\ttea\tteacup without handle\n🍶\tsake\tbottle cup\n🍾\tchampagne\tbottle popping cork\n🍷\twine_glass\n🍸\tcocktail\tglass\n🍹\ttropical_drink\n🍺\tbeer\tmug\n🍻\tbeers\tclinking beer mugs\n🥂\tclinking_glasses\n🥃\ttumbler_glass\n🫗\tpouring_liquid\n🥤\tcup_with_straw\n🧋\tbubble_tea\n🧃\tbeverage_box\n🧉\tmate_drink\n🧊\tice_cube\n🥢\tchopsticks\n🍽️\tknife_fork_plate\n🍴\tfork_and_knife\n🥄\tspoon\n🔪\thocho knife\n🫙\tjar\n🏺\tamphora\n🌍\tearth_africa\tglobe europe-africa\n🌎\tearth_americas\tglobe\n🌏\tearth_asia\tglobe asia-australia\n🌐\tglobe_with_meridians\n🗺️\tworld_map\n🗾\tjapan\tsilhouette\n🧭\tcompass\n🏔️\tsnow_capped_mountain\tsnow-capped\n⛰️\tmountain\n🌋\tvolcano\n🗻\tmount_fuji\n🏕️\tcamping\n🏖️\tbeach_with_umbrella\n🏜️\tdesert\n🏝️\tdesert_island\n🏞️\tnational_park\n🏟️\tstadium\n🏛️\tclassical_building\n🏗️\tbuilding_construction\n🧱\tbricks\tbrick\n🪨\trock\n🪵\twood\n🛖\thut\n🏘️\thouse_buildings\thouses\n🏚️\tderelict_house_building\n🏠\thouse\tbuilding\n🏡\thouse_with_garden\n🏢\toffice\tbuilding\n🏣\tpost_office\tjapanese\n🏤\teuropean_post_office\n🏥\thospital\n🏦\tbank\n🏨\thotel\n🏩\tlove_hotel\n🏪\tconvenience_store\n🏫\tschool\n🏬\tdepartment_store\n🏭\tfactory\n🏯\tjapanese_castle\n🏰\teuropean_castle\n💒\twedding\n🗼\ttokyo_tower\n🗽\tstatue_of_liberty\n⛪\tchurch\n🕌\tmosque\n🛕\thindu_temple\n🕍\tsynagogue\n⛩️\tshinto_shrine\n🕋\tkaaba\n⛲\tfountain\n⛺\ttent\n🌁\tfoggy\n🌃\tnight_with_stars\n🏙️\tcityscape\n🌄\tsunrise_over_mountains\n🌅\tsunrise\n🌆\tcity_sunset\tcityscape at dusk\n🌇\tcity_sunrise\tsunset over buildings\n🌉\tbridge_at_night\n♨️\thotsprings\thot springs\n🎠\tcarousel_horse\n🛝\tplayground_slide\n🎡\tferris_wheel\n🎢\troller_coaster\n💈\tbarber\tpole\n🎪\tcircus_tent\n🚂\tsteam_locomotive\n🚃\trailway_car\n🚄\tbullettrain_side\thigh-speed train\n🚅\tbullettrain_front\thigh-speed train bullet nose\n🚆\ttrain2\ttrain\n🚇\tmetro\n🚈\tlight_rail\n🚉\tstation\n🚊\ttram\n🚝\tmonorail\n🚞\tmountain_railway\n🚋\ttrain\ttram car\n🚌\tbus\n🚍\toncoming_bus\n🚎\ttrolleybus\n🚐\tminibus\n🚑\tambulance\n🚒\tfire_engine\n🚓\tpolice_car\n🚔\toncoming_police_car\n🚕\ttaxi\n🚖\toncoming_taxi\n🚗\tcar red_car\tautomobile\n🚘\toncoming_automobile\n🚙\tblue_car\trecreational vehicle\n🛻\tpickup_truck\n🚚\ttruck\tdelivery\n🚛\tarticulated_lorry\n🚜\ttractor\n🏎️\tracing_car\n🏍️\tracing_motorcycle\n🛵\tmotor_scooter\n🦽\tmanual_wheelchair\n🦼\tmotorized_wheelchair\n🛺\tauto_rickshaw\n🚲\tbike\tbicycle\n🛴\tscooter\n🛹\tskateboard\n🛼\troller_skate\n🚏\tbusstop\tbus stop\n🛣️\tmotorway\n🛤️\trailway_track\n🛢️\toil_drum\n⛽\tfuelpump\tfuel pump\n🛞\twheel\n🚨\trotating_light\tpolice cars revolving\n🚥\ttraffic_light\thorizontal\n🚦\tvertical_traffic_light\n🛑\toctagonal_sign\n🚧\tconstruction\tsign\n⚓\tanchor\n🛟\tring_buoy\n⛵\tboat sailboat\n🛶\tcanoe\n🚤\tspeedboat\n🛳️\tpassenger_ship\n⛴️\tferry\n🛥️\tmotor_boat\n🚢\tship\n✈️\tairplane\n🛩️\tsmall_airplane\n🛫\tairplane_departure\n🛬\tairplane_arriving\n🪂\tparachute\n💺\tseat\n🚁\thelicopter\n🚟\tsuspension_railway\n🚠\tmountain_cableway\n🚡\taerial_tramway\n🛰️\tsatellite\n🚀\trocket\n🛸\tflying_saucer\n🛎️\tbellhop_bell\n🧳\tluggage\n⌛\thourglass\n⏳\thourglass_flowing_sand\n⌚\twatch\n⏰\talarm_clock\n⏱️\tstopwatch\n⏲️\ttimer_clock\n🕰️\tmantelpiece_clock\n🕛\tclock12\tclock face twelve oclock\n🕧\tclock1230\tclock face twelve-thirty\n🕐\tclock1\tclock face one oclock\n🕜\tclock130\tclock face one-thirty\n🕑\tclock2\tclock face two oclock\n🕝\tclock230\tclock face two-thirty\n🕒\tclock3\tclock face three oclock\n🕞\tclock330\tclock face three-thirty\n🕓\tclock4\tclock face four oclock\n🕟\tclock430\tclock face four-thirty\n🕔\tclock5\tclock face five oclock\n🕠\tclock530\tclock face five-thirty\n🕕\tclock6\tclock face six oclock\n🕡\tclock630\tclock face six-thirty\n🕖\tclock7\tclock face seven oclock\n🕢\tclock730\tclock face seven-thirty\n🕗\tclock8\tclock face eight oclock\n🕣\tclock830\tclock face eight-thirty\n🕘\tclock9\tclock face nine oclock\n🕤\tclock930\tclock face nine-thirty\n🕙\tclock10\tclock face ten oclock\n🕥\tclock1030\tclock face ten-thirty\n🕚\tclock11\tclock face eleven oclock\n🕦\tclock1130\tclock face eleven-thirty\n🌑\tnew_moon\tsymbol\n🌒\twaxing_crescent_moon\tsymbol\n🌓\tfirst_quarter_moon\tsymbol\n🌔\tmoon waxing_gibbous_moon\tsymbol\n🌕\tfull_moon\tsymbol\n🌖\twaning_gibbous_moon\tsymbol\n🌗\tlast_quarter_moon\tsymbol\n🌘\twaning_crescent_moon\tsymbol\n🌙\tcrescent_moon\n🌚\tnew_moon_with_face\n🌛\tfirst_quarter_moon_with_face\n🌜\tlast_quarter_moon_with_face\n🌡️\tthermometer\n☀️\tsunny\tblack sun rays\n🌝\tfull_moon_with_face\n🌞\tsun_with_face\n🪐\tringed_planet\n⭐\tstar\twhite medium\n🌟\tstar2\tglowing star\n🌠\tstars\tshooting star\n🌌\tmilky_way\n☁️\tcloud\n⛅\tpartly_sunny\tsun behind cloud\n⛈️\tthunder_cloud_and_rain\tlightning\n🌤️\tmostly_sunny sun_small_cloud\tbehind\n🌥️\tbarely_sunny sun_behind_cloud\tlarge\n🌦️\tpartly_sunny_rain sun_behind_rain_cloud\n🌧️\train_cloud\n🌨️\tsnow_cloud\n🌩️\tlightning lightning_cloud\n🌪️\ttornado tornado_cloud\n🌫️\tfog\n🌬️\twind_blowing_face\n🌀\tcyclone\n🌈\trainbow\n🌂\tclosed_umbrella\n☂️\tumbrella\n☔\tumbrella_with_rain_drops\n⛱️\tumbrella_on_ground\n⚡\tzap\thigh voltage sign\n❄️\tsnowflake\n☃️\tsnowman\n⛄\tsnowman_without_snow\n☄️\tcomet\n🔥\tfire\n💧\tdroplet\n🌊\tocean\twater wave\n🎃\tjack_o_lantern\tjack-o-lantern\n🎄\tchristmas_tree\n🎆\tfireworks\n🎇\tsparkler\tfirework\n🧨\tfirecracker\n✨\tsparkles\n🎈\tballoon\n🎉\ttada\tparty popper\n🎊\tconfetti_ball\n🎋\ttanabata_tree\n🎍\tbamboo\tpine decoration\n🎎\tdolls\tjapanese\n🎏\tflags\tcarp streamer\n🎐\twind_chime\n🎑\trice_scene\tmoon viewing ceremony\n🧧\tred_envelope\tgift\n🎀\tribbon\n🎁\tgift\twrapped present\n🎗️\treminder_ribbon\n🎟️\tadmission_tickets\n🎫\tticket\n🎖️\tmedal\tmilitary\n🏆\ttrophy\n🏅\tsports_medal\n🥇\tfirst_place_medal\n🥈\tsecond_place_medal\n🥉\tthird_place_medal\n⚽\tsoccer\tball\n⚾\tbaseball\n🥎\tsoftball\n🏀\tbasketball\thoop\n🏐\tvolleyball\n🏈\tfootball\tamerican\n🏉\trugby_football\n🎾\ttennis\tracquet ball\n🥏\tflying_disc\n🎳\tbowling\n🏏\tcricket_bat_and_ball\n🏑\tfield_hockey_stick_and_ball\n🏒\tice_hockey_stick_and_puck\n🥍\tlacrosse\tstick ball\n🏓\ttable_tennis_paddle_and_ball\n🏸\tbadminton_racquet_and_shuttlecock\n🥊\tboxing_glove\n🥋\tmartial_arts_uniform\n🥅\tgoal_net\n⛳\tgolf\tflag hole\n⛸️\tice_skate\n🎣\tfishing_pole_and_fish\n🤿\tdiving_mask\n🎽\trunning_shirt_with_sash\n🎿\tski\tboot\n🛷\tsled\n🥌\tcurling_stone\n🎯\tdart\tdirect hit\n🪀\tyo-yo\n🪁\tkite\n🔫\tgun\tpistol\n🎱\t8ball\tbilliards\n🔮\tcrystal_ball\n🪄\tmagic_wand\n🎮\tvideo_game\n🕹️\tjoystick\n🎰\tslot_machine\n🎲\tgame_die\n🧩\tjigsaw\tpuzzle piece\n🧸\tteddy_bear\n🪅\tpinata\n🪩\tmirror_ball\n🪆\tnesting_dolls\n♠️\tspades\tblack spade suit\n♥️\thearts\tblack heart suit\n♦️\tdiamonds\tblack diamond suit\n♣️\tclubs\tblack club suit\n♟️\tchess_pawn\n🃏\tblack_joker\tplaying card\n🀄\tmahjong\ttile red dragon\n🎴\tflower_playing_cards\n🎭\tperforming_arts\n🖼️\tframe_with_picture\tframed\n🎨\tart\tartist palette\n🧵\tthread\tspool\n🪡\tsewing_needle\n🧶\tyarn\tball\n🪢\tknot\n👓\teyeglasses\n🕶️\tdark_sunglasses\n🥽\tgoggles\n🥼\tlab_coat\n🦺\tsafety_vest\n👔\tnecktie\n👕\tshirt tshirt\tt-shirt\n👖\tjeans\n🧣\tscarf\n🧤\tgloves\n🧥\tcoat\n🧦\tsocks\n👗\tdress\n👘\tkimono\n🥻\tsari\n🩱\tone-piece_swimsuit\tone-piece\n🩲\tbriefs\n🩳\tshorts\n👙\tbikini\n👚\twomans_clothes\n🪭\tfolding_hand_fan\n👛\tpurse\n👜\thandbag\n👝\tpouch\n🛍️\tshopping_bags\n🎒\tschool_satchel\n🩴\tthong_sandal\n👞\tmans_shoe shoe\n👟\tathletic_shoe\n🥾\thiking_boot\n🥿\twomans_flat_shoe\n👠\thigh_heel\thigh-heeled shoe\n👡\tsandal\twomans\n🩰\tballet_shoes\n👢\tboot\twomans boots\n🪮\thair_pick\n👑\tcrown\n👒\twomans_hat\n🎩\ttophat\ttop hat\n🎓\tmortar_board\tgraduation cap\n🧢\tbilled_cap\n🪖\tmilitary_helmet\n⛑️\thelmet_with_white_cross\trescue worker s\n📿\tprayer_beads\n💄\tlipstick\n💍\tring\n💎\tgem\tstone\n🔇\tmute\tspeaker cancellation stroke\n🔈\tspeaker\n🔉\tsound\tspeaker one wave\n🔊\tloud_sound\tspeaker three waves\n📢\tloudspeaker\tpublic address\n📣\tmega\tcheering megaphone\n📯\tpostal_horn\n🔔\tbell\n🔕\tno_bell\tcancellation stroke\n🎼\tmusical_score\n🎵\tmusical_note\n🎶\tnotes\tmultiple musical\n🎙️\tstudio_microphone\n🎚️\tlevel_slider\n🎛️\tcontrol_knobs\n🎤\tmicrophone\n🎧\theadphones\theadphone\n📻\tradio\n🎷\tsaxophone\n🪗\taccordion\n🎸\tguitar\n🎹\tmusical_keyboard\n🎺\ttrumpet\n🎻\tviolin\n🪕\tbanjo\n🥁\tdrum_with_drumsticks\n🪘\tlong_drum\n🪇\tmaracas\n🪈\tflute\n\tharp\n📱\tiphone\tmobile phone\n📲\tcalling\tmobile phone rightwards arrow at left\n☎️\tphone telephone\tblack\n📞\ttelephone_receiver\n📟\tpager\n📠\tfax\tmachine\n🔋\tbattery\n🪫\tlow_battery\n🔌\telectric_plug\n💻\tcomputer\tpersonal\n🖥️\tdesktop_computer\n🖨️\tprinter\n⌨️\tkeyboard\n🖱️\tthree_button_mouse\tcomputer\n🖲️\ttrackball\n💽\tminidisc\n💾\tfloppy_disk\n💿\tcd\toptical disc\n📀\tdvd\n🧮\tabacus\n🎥\tmovie_camera\n🎞️\tfilm_frames\n📽️\tfilm_projector\n🎬\tclapper\tboard\n📺\ttv\ttelevision\n📷\tcamera\n📸\tcamera_with_flash\n📹\tvideo_camera\n📼\tvhs\tvideocassette\n🔍\tmag\tleft-pointing magnifying glass\n🔎\tmag_right\tright-pointing magnifying glass\n🕯️\tcandle\n💡\tbulb\telectric light\n🔦\tflashlight\telectric torch\n🏮\tizakaya_lantern lantern\n🪔\tdiya_lamp\n📔\tnotebook_with_decorative_cover\n📕\tclosed_book\n📖\tbook open_book\n📗\tgreen_book\n📘\tblue_book\n📙\torange_book\n📚\tbooks\n📓\tnotebook\n📒\tledger\n📃\tpage_with_curl\n📜\tscroll\n📄\tpage_facing_up\n📰\tnewspaper\n🗞️\trolled_up_newspaper\trolled-up\n📑\tbookmark_tabs\n🔖\tbookmark\n🏷️\tlabel\n💰\tmoneybag\tmoney bag\n🪙\tcoin\n💴\tyen\tbanknote sign\n💵\tdollar\tbanknote sign\n💶\teuro\tbanknote sign\n💷\tpound\tbanknote sign\n💸\tmoney_with_wings\n💳\tcredit_card\n🧾\treceipt\n💹\tchart\tupwards trend yen sign\n✉️\temail envelope\n📧\te-mail\tsymbol\n📨\tincoming_envelope\n📩\tenvelope_with_arrow\tdownwards above\n📤\toutbox_tray\n📥\tinbox_tray\n📦\tpackage\n📫\tmailbox\tclosed raised flag\n📪\tmailbox_closed\tlowered flag\n📬\tmailbox_with_mail\topen raised flag\n📭\tmailbox_with_no_mail\topen lowered flag\n📮\tpostbox\n🗳️\tballot_box_with_ballot\n✏️\tpencil2\tpencil\n✒️\tblack_nib\n🖋️\tlower_left_fountain_pen\n🖊️\tlower_left_ballpoint_pen\n🖌️\tlower_left_paintbrush\n🖍️\tlower_left_crayon\n📝\tmemo pencil\n💼\tbriefcase\n📁\tfile_folder\n📂\topen_file_folder\n🗂️\tcard_index_dividers\n📅\tdate\tcalendar\n📆\tcalendar\ttear-off\n🗒️\tspiral_note_pad\tnotepad\n🗓️\tspiral_calendar_pad\n📇\tcard_index\n📈\tchart_with_upwards_trend\n📉\tchart_with_downwards_trend\n📊\tbar_chart\n📋\tclipboard\n📌\tpushpin\n📍\tround_pushpin\n📎\tpaperclip\n🖇️\tlinked_paperclips\n📏\tstraight_ruler\n📐\ttriangular_ruler\n✂️\tscissors\tblack\n🗃️\tcard_file_box\n🗄️\tfile_cabinet\n🗑️\twastebasket\n🔒\tlock\n🔓\tunlock\topen lock\n🔏\tlock_with_ink_pen\n🔐\tclosed_lock_with_key\n🔑\tkey\n🗝️\told_key\n🔨\thammer\n🪓\taxe\n⛏️\tpick\n⚒️\thammer_and_pick\n🛠️\thammer_and_wrench\n🗡️\tdagger_knife\n⚔️\tcrossed_swords\n💣\tbomb\n🪃\tboomerang\n🏹\tbow_and_arrow\n🛡️\tshield\n🪚\tcarpentry_saw\n🔧\twrench\n🪛\tscrewdriver\n🔩\tnut_and_bolt\n⚙️\tgear\n🗜️\tcompression\tclamp\n⚖️\tscales\tbalance scale\n🦯\tprobing_cane\n🔗\tlink\tsymbol\n⛓️💥\tbroken_chain\n⛓️\tchains\n🪝\thook\n🧰\ttoolbox\n🧲\tmagnet\n🪜\tladder\n\tshovel\n⚗️\talembic\n🧪\ttest_tube\n🧫\tpetri_dish\n🧬\tdna\tdouble helix\n🔬\tmicroscope\n🔭\ttelescope\n📡\tsatellite_antenna\n💉\tsyringe\n🩸\tdrop_of_blood\n💊\tpill\n🩹\tadhesive_bandage\n🩼\tcrutch\n🩺\tstethoscope\n🩻\tx-ray\n🚪\tdoor\n🛗\televator\n🪞\tmirror\n🪟\twindow\n🛏️\tbed\n🛋️\tcouch_and_lamp\n🪑\tchair\n🚽\ttoilet\n🪠\tplunger\n🚿\tshower\n🛁\tbathtub\n🪤\tmouse_trap\n🪒\trazor\n🧴\tlotion_bottle\n🧷\tsafety_pin\n🧹\tbroom\n🧺\tbasket\n🧻\troll_of_paper\n🪣\tbucket\n🧼\tsoap\tbar\n🫧\tbubbles\n🪥\ttoothbrush\n🧽\tsponge\n🧯\tfire_extinguisher\n🛒\tshopping_trolley\n🚬\tsmoking\tsymbol\n⚰️\tcoffin\n🪦\theadstone\n⚱️\tfuneral_urn\n🧿\tnazar_amulet\n🪬\thamsa\n🗿\tmoyai\n🪧\tplacard\n🪪\tidentification_card\n🏧\tatm\tautomated teller machine\n🚮\tput_litter_in_its_place\tsymbol\n🚰\tpotable_water\tsymbol\n♿\twheelchair\tsymbol\n🚹\tmens\tsymbol\n🚺\twomens\tsymbol\n🚻\trestroom\n🚼\tbaby_symbol\n🚾\twc\twater closet\n🛂\tpassport_control\n🛃\tcustoms\n🛄\tbaggage_claim\n🛅\tleft_luggage\n⚠️\twarning\tsign\n🚸\tchildren_crossing\n⛔\tno_entry\n🚫\tno_entry_sign\n🚳\tno_bicycles\n🚭\tno_smoking\tsymbol\n🚯\tdo_not_litter\tsymbol\n🚱\tnon-potable_water\tnon-potable symbol\n🚷\tno_pedestrians\n📵\tno_mobile_phones\n🔞\tunderage\tno one under eighteen symbol\n☢️\tradioactive_sign\n☣️\tbiohazard_sign\n⬆️\tarrow_up\tupwards black\n↗️\tarrow_upper_right\tnorth east\n➡️\tarrow_right\tblack rightwards\n↘️\tarrow_lower_right\tsouth east\n⬇️\tarrow_down\tdownwards black\n↙️\tarrow_lower_left\tsouth west\n⬅️\tarrow_left\tleftwards black\n↖️\tarrow_upper_left\tnorth west\n↕️\tarrow_up_down\n↔️\tleft_right_arrow\n↩️\tleftwards_arrow_with_hook\n↪️\tarrow_right_hook\trightwards\n⤴️\tarrow_heading_up\tpointing rightwards then curving upwards\n⤵️\tarrow_heading_down\tpointing rightwards then curving downwards\n🔃\tarrows_clockwise\tdownwards upwards open circle\n🔄\tarrows_counterclockwise\tanticlockwise downwards upwards open circle\n🔙\tback\tleftwards arrow above\n🔚\tend\tleftwards arrow above\n🔛\ton\texclamation mark left right arrow above\n🔜\tsoon\trightwards arrow above\n🔝\ttop\tupwards arrow above\n🛐\tplace_of_worship\n⚛️\tatom_symbol\n🕉️\tom_symbol\n✡️\tstar_of_david\n☸️\twheel_of_dharma\n☯️\tyin_yang\n✝️\tlatin_cross\n☦️\torthodox_cross\n☪️\tstar_and_crescent\n☮️\tpeace_symbol\n🕎\tmenorah_with_nine_branches\n🔯\tsix_pointed_star\tmiddle dot\n🪯\tkhanda\n♈\taries\n♉\ttaurus\n♊\tgemini\n♋\tcancer\n♌\tleo\n♍\tvirgo\n♎\tlibra\n♏\tscorpius\n♐\tsagittarius\n♑\tcapricorn\n♒\taquarius\n♓\tpisces\n⛎\tophiuchus\n🔀\ttwisted_rightwards_arrows\n🔁\trepeat\tclockwise rightwards leftwards open circle arrows\n🔂\trepeat_one\tclockwise rightwards leftwards open circle arrows circled overlay\n▶️\tarrow_forward\tblack right-pointing triangle\n⏩\tfast_forward\tblack right-pointing double triangle\n⏭️\tblack_right_pointing_double_triangle_with_vertical_bar\tnext track button\n⏯️\tblack_right_pointing_triangle_with_double_vertical_bar\tplay pause button\n◀️\tarrow_backward\tblack left-pointing triangle\n⏪\trewind\tblack left-pointing double triangle\n⏮️\tblack_left_pointing_double_triangle_with_vertical_bar\tlast track button\n🔼\tarrow_up_small\tup-pointing red triangle\n⏫\tarrow_double_up\tblack up-pointing triangle\n🔽\tarrow_down_small\tdown-pointing red triangle\n⏬\tarrow_double_down\tblack down-pointing triangle\n⏸️\tdouble_vertical_bar\tpause button\n⏹️\tblack_square_for_stop\tbutton\n⏺️\tblack_circle_for_record\tbutton\n⏏️\teject\tbutton\n🎦\tcinema\n🔅\tlow_brightness\tsymbol\n🔆\thigh_brightness\tsymbol\n📶\tsignal_strength\tantenna bars\n🛜\twireless\n📳\tvibration_mode\n📴\tmobile_phone_off\n♀️\tfemale_sign\n♂️\tmale_sign\n⚧️\ttransgender_symbol\n✖️\theavy_multiplication_x\n➕\theavy_plus_sign\n➖\theavy_minus_sign\n➗\theavy_division_sign\n🟰\theavy_equals_sign\n♾️\tinfinity\n‼️\tbangbang\tdouble exclamation mark\n⁉️\tinterrobang\texclamation question mark\n❓\tquestion\tblack mark ornament\n❔\tgrey_question\twhite mark ornament\n❕\tgrey_exclamation\twhite mark ornament\n❗\texclamation heavy_exclamation_mark\tsymbol\n〰️\twavy_dash\n💱\tcurrency_exchange\n💲\theavy_dollar_sign\n⚕️\tmedical_symbol staff_of_aesculapius\n♻️\trecycle\tblack universal recycling symbol\n⚜️\tfleur_de_lis\tfleur-de-lis\n🔱\ttrident\temblem\n📛\tname_badge\n🔰\tbeginner\tjapanese symbol\n⭕\to\theavy large circle\n✅\twhite_check_mark\theavy\n☑️\tballot_box_with_check\n✔️\theavy_check_mark\n❌\tx\tcross mark\n❎\tnegative_squared_cross_mark\n➰\tcurly_loop\n➿\tloop\tdouble curly\n〽️\tpart_alternation_mark\n✳️\teight_spoked_asterisk\n✴️\teight_pointed_black_star\n❇️\tsparkle\n©️\tcopyright\tsign\n®️\tregistered\tsign\n™️\ttm\ttrade mark sign\n\tsplatter\n#️⃣\thash\tkey\n*️⃣\tkeycap_star\n0️⃣\tzero\tkeycap 0\n1️⃣\tone\tkeycap 1\n2️⃣\ttwo\tkeycap 2\n3️⃣\tthree\tkeycap 3\n4️⃣\tfour\tkeycap 4\n5️⃣\tfive\tkeycap 5\n6️⃣\tsix\tkeycap 6\n7️⃣\tseven\tkeycap 7\n8️⃣\teight\tkeycap 8\n9️⃣\tnine\tkeycap 9\n🔟\tkeycap_ten\n🔠\tcapital_abcd\tinput symbol latin letters\n🔡\tabcd\tinput symbol latin small letters\n🔢\t1234\tinput symbol numbers\n🔣\tsymbols\tinput symbol\n🔤\tabc\tinput symbol latin letters\n🅰️\ta\tnegative squared latin capital letter\n🆎\tab\tnegative squared\n🅱️\tb\tnegative squared latin capital letter\n🆑\tcl\tsquared\n🆒\tcool\tsquared\n🆓\tfree\tsquared\nℹ️\tinformation_source\n🆔\tid\tsquared\nⓂ️\tm\tcircled latin capital letter\n🆕\tnew\tsquared\n🆖\tng\tsquared\n🅾️\to2\tnegative squared latin capital letter o\n🆗\tok\tsquared\n🅿️\tparking\tnegative squared latin capital letter p\n🆘\tsos\tsquared\n🆙\tup\tsquared exclamation mark\n🆚\tvs\tsquared\n🈁\tkoko\tsquared katakana\n🈂️\tsa\tsquared katakana\n🈷️\tu6708\tsquared cjk unified ideograph-6708\n🈶\tu6709\tsquared cjk unified ideograph-6709\n🈯\tu6307\tsquared cjk unified ideograph-6307\n🉐\tideograph_advantage\tcircled\n🈹\tu5272\tsquared cjk unified ideograph-5272\n🈚\tu7121\tsquared cjk unified ideograph-7121\n🈲\tu7981\tsquared cjk unified ideograph-7981\n🉑\taccept\tcircled ideograph\n🈸\tu7533\tsquared cjk unified ideograph-7533\n🈴\tu5408\tsquared cjk unified ideograph-5408\n🈳\tu7a7a\tsquared cjk unified ideograph-7a7a\n㊗️\tcongratulations\tcircled ideograph congratulation\n㊙️\tsecret\tcircled ideograph\n🈺\tu55b6\tsquared cjk unified ideograph-55b6\n🈵\tu6e80\tsquared cjk unified ideograph-6e80\n🔴\tred_circle\tlarge\n🟠\tlarge_orange_circle\n🟡\tlarge_yellow_circle\n🟢\tlarge_green_circle\n🔵\tlarge_blue_circle\n🟣\tlarge_purple_circle\n🟤\tlarge_brown_circle\n⚫\tblack_circle\tmedium\n⚪\twhite_circle\tmedium\n🟥\tlarge_red_square\n🟧\tlarge_orange_square\n🟨\tlarge_yellow_square\n🟩\tlarge_green_square\n🟦\tlarge_blue_square\n🟪\tlarge_purple_square\n🟫\tlarge_brown_square\n⬛\tblack_large_square\n⬜\twhite_large_square\n◼️\tblack_medium_square\n◻️\twhite_medium_square\n◾\tblack_medium_small_square\n◽\twhite_medium_small_square\n▪️\tblack_small_square\n▫️\twhite_small_square\n🔶\tlarge_orange_diamond\n🔷\tlarge_blue_diamond\n🔸\tsmall_orange_diamond\n🔹\tsmall_blue_diamond\n🔺\tsmall_red_triangle\tup-pointing\n🔻\tsmall_red_triangle_down\tdown-pointing\n💠\tdiamond_shape_with_a_dot_inside\n🔘\tradio_button\n🔳\twhite_square_button\n🔲\tblack_square_button\n🏁\tcheckered_flag\tchequered\n🚩\ttriangular_flag_on_post\n🎌\tcrossed_flags\n🏴\twaving_black_flag\n🏳️\twaving_white_flag\n🏳️🌈\trainbow-flag\n🏳️⚧️\ttransgender_flag\n🏴☠️\tpirate_flag\n🇦🇨\tflag-ac\tascension island\n🇦🇩\tflag-ad\tandorra\n🇦🇪\tflag-ae\tunited arab emirates\n🇦🇫\tflag-af\tafghanistan\n🇦🇬\tflag-ag\tantigua barbuda\n🇦🇮\tflag-ai\tanguilla\n🇦🇱\tflag-al\talbania\n🇦🇲\tflag-am\tarmenia\n🇦🇴\tflag-ao\tangola\n🇦🇶\tflag-aq\tantarctica\n🇦🇷\tflag-ar\targentina\n🇦🇸\tflag-as\tamerican samoa\n🇦🇹\tflag-at\taustria\n🇦🇺\tflag-au\taustralia\n🇦🇼\tflag-aw\taruba\n🇦🇽\tflag-ax\tland islands\n🇦🇿\tflag-az\tazerbaijan\n🇧🇦\tflag-ba\tbosnia herzegovina\n🇧🇧\tflag-bb\tbarbados\n🇧🇩\tflag-bd\tbangladesh\n🇧🇪\tflag-be\tbelgium\n🇧🇫\tflag-bf\tburkina faso\n🇧🇬\tflag-bg\tbulgaria\n🇧🇭\tflag-bh\tbahrain\n🇧🇮\tflag-bi\tburundi\n🇧🇯\tflag-bj\tbenin\n🇧🇱\tflag-bl\tst barth lemy\n🇧🇲\tflag-bm\tbermuda\n🇧🇳\tflag-bn\tbrunei\n🇧🇴\tflag-bo\tbolivia\n🇧🇶\tflag-bq\tcaribbean netherlands\n🇧🇷\tflag-br\tbrazil\n🇧🇸\tflag-bs\tbahamas\n🇧🇹\tflag-bt\tbhutan\n🇧🇻\tflag-bv\tbouvet island\n🇧🇼\tflag-bw\tbotswana\n🇧🇾\tflag-by\tbelarus\n🇧🇿\tflag-bz\tbelize\n🇨🇦\tflag-ca\tcanada\n🇨🇨\tflag-cc\tcocos keeling islands\n🇨🇩\tflag-cd\tcongo - kinshasa\n🇨🇫\tflag-cf\tcentral african republic\n🇨🇬\tflag-cg\tcongo - brazzaville\n🇨🇭\tflag-ch\tswitzerland\n🇨🇮\tflag-ci\tc te d ivoire\n🇨🇰\tflag-ck\tcook islands\n🇨🇱\tflag-cl\tchile\n🇨🇲\tflag-cm\tcameroon\n🇨🇳\tcn flag-cn\tchina\n🇨🇴\tflag-co\tcolombia\n🇨🇵\tflag-cp\tclipperton island\n🇨🇶\tflag-sark\n🇨🇷\tflag-cr\tcosta rica\n🇨🇺\tflag-cu\tcuba\n🇨🇻\tflag-cv\tcape verde\n🇨🇼\tflag-cw\tcura ao\n🇨🇽\tflag-cx\tchristmas island\n🇨🇾\tflag-cy\tcyprus\n🇨🇿\tflag-cz\tczechia\n🇩🇪\tde flag-de\tgermany\n🇩🇬\tflag-dg\tdiego garcia\n🇩🇯\tflag-dj\tdjibouti\n🇩🇰\tflag-dk\tdenmark\n🇩🇲\tflag-dm\tdominica\n🇩🇴\tflag-do\tdominican republic\n🇩🇿\tflag-dz\talgeria\n🇪🇦\tflag-ea\tceuta melilla\n🇪🇨\tflag-ec\tecuador\n🇪🇪\tflag-ee\testonia\n🇪🇬\tflag-eg\tegypt\n🇪🇭\tflag-eh\twestern sahara\n🇪🇷\tflag-er\teritrea\n🇪🇸\tes flag-es\tspain\n🇪🇹\tflag-et\tethiopia\n🇪🇺\tflag-eu\teuropean union\n🇫🇮\tflag-fi\tfinland\n🇫🇯\tflag-fj\tfiji\n🇫🇰\tflag-fk\tfalkland islands\n🇫🇲\tflag-fm\tmicronesia\n🇫🇴\tflag-fo\tfaroe islands\n🇫🇷\tfr flag-fr\tfrance\n🇬🇦\tflag-ga\tgabon\n🇬🇧\tgb uk flag-gb\tunited kingdom\n🇬🇩\tflag-gd\tgrenada\n🇬🇪\tflag-ge\tgeorgia\n🇬🇫\tflag-gf\tfrench guiana\n🇬🇬\tflag-gg\tguernsey\n🇬🇭\tflag-gh\tghana\n🇬🇮\tflag-gi\tgibraltar\n🇬🇱\tflag-gl\tgreenland\n🇬🇲\tflag-gm\tgambia\n🇬🇳\tflag-gn\tguinea\n🇬🇵\tflag-gp\tguadeloupe\n🇬🇶\tflag-gq\tequatorial guinea\n🇬🇷\tflag-gr\tgreece\n🇬🇸\tflag-gs\tsouth georgia sandwich islands\n🇬🇹\tflag-gt\tguatemala\n🇬🇺\tflag-gu\tguam\n🇬🇼\tflag-gw\tguinea-bissau\n🇬🇾\tflag-gy\tguyana\n🇭🇰\tflag-hk\thong kong sar china\n🇭🇲\tflag-hm\theard mcdonald islands\n🇭🇳\tflag-hn\thonduras\n🇭🇷\tflag-hr\tcroatia\n🇭🇹\tflag-ht\thaiti\n🇭🇺\tflag-hu\thungary\n🇮🇨\tflag-ic\tcanary islands\n🇮🇩\tflag-id\tindonesia\n🇮🇪\tflag-ie\tireland\n🇮🇱\tflag-il\tisrael\n🇮🇲\tflag-im\tisle man\n🇮🇳\tflag-in\tindia\n🇮🇴\tflag-io\tbritish indian ocean territory\n🇮🇶\tflag-iq\tiraq\n🇮🇷\tflag-ir\tiran\n🇮🇸\tflag-is\ticeland\n🇮🇹\tit flag-it\titaly\n🇯🇪\tflag-je\tjersey\n🇯🇲\tflag-jm\tjamaica\n🇯🇴\tflag-jo\tjordan\n🇯🇵\tjp flag-jp\tjapan\n🇰🇪\tflag-ke\tkenya\n🇰🇬\tflag-kg\tkyrgyzstan\n🇰🇭\tflag-kh\tcambodia\n🇰🇮\tflag-ki\tkiribati\n🇰🇲\tflag-km\tcomoros\n🇰🇳\tflag-kn\tst kitts nevis\n🇰🇵\tflag-kp\tnorth korea\n🇰🇷\tkr flag-kr\tsouth korea\n🇰🇼\tflag-kw\tkuwait\n🇰🇾\tflag-ky\tcayman islands\n🇰🇿\tflag-kz\tkazakhstan\n🇱🇦\tflag-la\tlaos\n🇱🇧\tflag-lb\tlebanon\n🇱🇨\tflag-lc\tst lucia\n🇱🇮\tflag-li\tliechtenstein\n🇱🇰\tflag-lk\tsri lanka\n🇱🇷\tflag-lr\tliberia\n🇱🇸\tflag-ls\tlesotho\n🇱🇹\tflag-lt\tlithuania\n🇱🇺\tflag-lu\tluxembourg\n🇱🇻\tflag-lv\tlatvia\n🇱🇾\tflag-ly\tlibya\n🇲🇦\tflag-ma\tmorocco\n🇲🇨\tflag-mc\tmonaco\n🇲🇩\tflag-md\tmoldova\n🇲🇪\tflag-me\tmontenegro\n🇲🇫\tflag-mf\tst martin\n🇲🇬\tflag-mg\tmadagascar\n🇲🇭\tflag-mh\tmarshall islands\n🇲🇰\tflag-mk\tnorth macedonia\n🇲🇱\tflag-ml\tmali\n🇲🇲\tflag-mm\tmyanmar burma\n🇲🇳\tflag-mn\tmongolia\n🇲🇴\tflag-mo\tmacao sar china\n🇲🇵\tflag-mp\tnorthern mariana islands\n🇲🇶\tflag-mq\tmartinique\n🇲🇷\tflag-mr\tmauritania\n🇲🇸\tflag-ms\tmontserrat\n🇲🇹\tflag-mt\tmalta\n🇲🇺\tflag-mu\tmauritius\n🇲🇻\tflag-mv\tmaldives\n🇲🇼\tflag-mw\tmalawi\n🇲🇽\tflag-mx\tmexico\n🇲🇾\tflag-my\tmalaysia\n🇲🇿\tflag-mz\tmozambique\n🇳🇦\tflag-na\tnamibia\n🇳🇨\tflag-nc\tnew caledonia\n🇳🇪\tflag-ne\tniger\n🇳🇫\tflag-nf\tnorfolk island\n🇳🇬\tflag-ng\tnigeria\n🇳🇮\tflag-ni\tnicaragua\n🇳🇱\tflag-nl\tnetherlands\n🇳🇴\tflag-no\tnorway\n🇳🇵\tflag-np\tnepal\n🇳🇷\tflag-nr\tnauru\n🇳🇺\tflag-nu\tniue\n🇳🇿\tflag-nz\tnew zealand\n🇴🇲\tflag-om\toman\n🇵🇦\tflag-pa\tpanama\n🇵🇪\tflag-pe\tperu\n🇵🇫\tflag-pf\tfrench polynesia\n🇵🇬\tflag-pg\tpapua new guinea\n🇵🇭\tflag-ph\tphilippines\n🇵🇰\tflag-pk\tpakistan\n🇵🇱\tflag-pl\tpoland\n🇵🇲\tflag-pm\tst pierre miquelon\n🇵🇳\tflag-pn\tpitcairn islands\n🇵🇷\tflag-pr\tpuerto rico\n🇵🇸\tflag-ps\tpalestinian territories\n🇵🇹\tflag-pt\tportugal\n🇵🇼\tflag-pw\tpalau\n🇵🇾\tflag-py\tparaguay\n🇶🇦\tflag-qa\tqatar\n🇷🇪\tflag-re\tr union\n🇷🇴\tflag-ro\tromania\n🇷🇸\tflag-rs\tserbia\n🇷🇺\tru flag-ru\trussia\n🇷🇼\tflag-rw\trwanda\n🇸🇦\tflag-sa\tsaudi arabia\n🇸🇧\tflag-sb\tsolomon islands\n🇸🇨\tflag-sc\tseychelles\n🇸🇩\tflag-sd\tsudan\n🇸🇪\tflag-se\tsweden\n🇸🇬\tflag-sg\tsingapore\n🇸🇭\tflag-sh\tst helena\n🇸🇮\tflag-si\tslovenia\n🇸🇯\tflag-sj\tsvalbard jan mayen\n🇸🇰\tflag-sk\tslovakia\n🇸🇱\tflag-sl\tsierra leone\n🇸🇲\tflag-sm\tsan marino\n🇸🇳\tflag-sn\tsenegal\n🇸🇴\tflag-so\tsomalia\n🇸🇷\tflag-sr\tsuriname\n🇸🇸\tflag-ss\tsouth sudan\n🇸🇹\tflag-st\ts o tom pr ncipe\n🇸🇻\tflag-sv\tel salvador\n🇸🇽\tflag-sx\tsint maarten\n🇸🇾\tflag-sy\tsyria\n🇸🇿\tflag-sz\teswatini\n🇹🇦\tflag-ta\ttristan da cunha\n🇹🇨\tflag-tc\tturks caicos islands\n🇹🇩\tflag-td\tchad\n🇹🇫\tflag-tf\tfrench southern territories\n🇹🇬\tflag-tg\ttogo\n🇹🇭\tflag-th\tthailand\n🇹🇯\tflag-tj\ttajikistan\n🇹🇰\tflag-tk\ttokelau\n🇹🇱\tflag-tl\ttimor-leste\n🇹🇲\tflag-tm\tturkmenistan\n🇹🇳\tflag-tn\ttunisia\n🇹🇴\tflag-to\ttonga\n🇹🇷\tflag-tr\tt rkiye\n🇹🇹\tflag-tt\ttrinidad tobago\n🇹🇻\tflag-tv\ttuvalu\n🇹🇼\tflag-tw\ttaiwan\n🇹🇿\tflag-tz\ttanzania\n🇺🇦\tflag-ua\tukraine\n🇺🇬\tflag-ug\tuganda\n🇺🇲\tflag-um\tu s outlying islands\n🇺🇳\tflag-un\tunited nations\n🇺🇸\tus flag-us\tunited states\n🇺🇾\tflag-uy\turuguay\n🇺🇿\tflag-uz\tuzbekistan\n🇻🇦\tflag-va\tvatican city\n🇻🇨\tflag-vc\tst vincent grenadines\n🇻🇪\tflag-ve\tvenezuela\n🇻🇬\tflag-vg\tbritish virgin islands\n🇻🇮\tflag-vi\tu s virgin islands\n🇻🇳\tflag-vn\tvietnam\n🇻🇺\tflag-vu\tvanuatu\n🇼🇫\tflag-wf\twallis futuna\n🇼🇸\tflag-ws\tsamoa\n🇽🇰\tflag-xk\tkosovo\n🇾🇪\tflag-ye\tyemen\n🇾🇹\tflag-yt\tmayotte\n🇿🇦\tflag-za\tsouth africa\n🇿🇲\tflag-zm\tzambia\n🇿🇼\tflag-zw\tzimbabwe\n🏴\tflag-england\n🏴\tflag-scotland\n🏴\tflag-wales";
|