diff --git a/CHANGELOG.md b/CHANGELOG.md index 524e877..5718f8c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,6 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). Procedure when bumping the version number: - 1. Update dependencies in a separate commit 2. Set version number in `Cargo.toml` 3. Add new section in this changelog @@ -14,108 +13,19 @@ Procedure when bumping the version number: ## Unreleased -## v0.6.1 - 2025-02-23 - -### Changed - -- Updated set of emoji names - -### Fixed - -- Nick hue hashing algorithm in some edge cases - -## v0.6.0 - 2025-02-21 - -### Added - -- `api::Time::from_timestamp` -- `api::Time::as_timestamp` -- `bot::botrulez::full_help` -- `bot::botrulez::ping` -- `bot::botrulez::short_help` -- `bot::botrulez::uptime` -- `bot::botrulez::format_relative_time` - -### Changed - -- **(breaking)** Switched to `jiff` from `time` -- **(breaking)** `api::Time` contents are now an `i64` -- **(breaking)** Bumped `tokio-tungstenite` dependency from `0.18` to `0.24`. If - this causes a panic while using euphoxide, consider following the steps - mentioned in the [tokio-tungstenite README]. If I'm reading the [rustls docs] - correctly, it is on the users of the libraries to set the required features. -- `bot::botrulez::format_duration` now no longer mentions "since" or "ago", but - instead has a sign (`-`) if the duration is negative. - -[tokio-tungstenite README]: https://github.com/snapview/tokio-tungstenite?tab=readme-ov-file#features -[rustls docs]: https://docs.rs/rustls/0.23.19/rustls/crypto/struct.CryptoProvider.html#using-the-per-process-default-cryptoprovider - -### Removed - -- `api::Time::new` - -## v0.5.1 - 2024-05-20 - -### Added - -- `Emoji::load_from_json` - -### Changed - -- Updated set of emoji names - -## v0.5.0 - 2023-12-27 - -### Changed - -- **(breaking)** `bot::instance::ServerConfig::default` now points to `euphoria.leet.nu` -- **(breaking)** Bumped `cookie` dependency from `0.17` to `0.18` -- **(breaking)** Bumped `tokio-tungstenite` dependency from `0.18` to `0.21` -- Updated set of emoji names -- Documentation now references `euphoria.leet.nu` instead of `euphoria.io` - -## v0.4.0 - 2023-05-14 - -### Added - -- `bot::botrulez::Uptime` now implements `bot::command::Command` -- `bot::command::parse_prefix_initiated` -- `bot::commands::Commands::fallthrough` -- `bot::commands::Commands::set_fallthrough` -- `conn::Error::ConnectionTimedOut` - -### Changed - -- **(breaking)** `bot::command::ClapCommand::execute` now returns a `Result` instead of a `Result<(), E>` -- **(breaking)** `bot::command::Command::execute` now returns a `Result` instead of a `Result<(), E>` -- **(breaking)** `bot::commands::Commands::handle_packet` now returns a `Result` instead of a `Result<(), E>` -- **(breaking)** `bot::instance::Snapshot` renamed to `ConnSnapshot` -- **(breaking)** `conn::Conn::connect` now returns `conn::Result` -- `bot::instance::Instance` now implements `Clone` - -### Fixed - -- **(breaking)** Deserializing empty events and replies by turning unit structs into empty structs -- `phone` and `mobile` emoji -- Instances getting stuck in "Connecting" state -- Euph errors always turning into `conn::Error`s - ## v0.3.1 - 2023-02-26 ### Added - - `bot::botrulez::FullHelp` now implements `bot::command::Command` - `bot::botrulez::Ping` now implements `bot::command::Command` - `bot::botrulez::ShortHelp` now implements `bot::command::Command` - `bot::instances::Instances::is_from_known_instance` ### Changed - - Instances log to target `euphoxide::live::` - Instances stay connected if auth is required but no password is set ### Fixed - - `!uptime` minute count - Instance reconnecting after encountering a 404 (it now stops and logs an error) - Instance taking too long to stop when stopped during reconnect delay @@ -123,7 +33,6 @@ Procedure when bumping the version number: ## v0.3.0 - 2023-02-11 ### Added - - `bot` feature - `bot` module (enable the `bot` feature to use) - `Emoji` for finding, replacing and removing colon-delimited emoji in text @@ -136,25 +45,21 @@ Procedure when bumping the version number: - VSCode project settings ### Changed - -- **(breaking)** `conn` module redesigned and rewritten -- **(breaking)** `nick_hue` moved to `nick::hue_without_removing_emoji` +- `conn` module redesigned and rewritten (backwards-incompatible) +- `nick_hue` moved to `nick::hue_without_removing_emoji` - Renamed `testbot` example to `testbot_manual` ### Removed - -- **(breaking)** `connect` (see `conn::Conn::connect`) -- **(breaking)** `wrap` (see `conn::Conn::wrap`) +- `connect` (see `conn::Conn::connect`) +- `wrap` (see `conn::Conn::wrap`) ## v0.2.0 - 2022-12-10 ### Added - - `connect` ### Changed - -- **(breaking)** Updated dependencies +- Updated dependencies (backwards-incompatible) ## v0.1.0 - 2022-10-23 diff --git a/Cargo.toml b/Cargo.toml index cf65579..b96f2cf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,34 +1,33 @@ [package] name = "euphoxide" -version = "0.6.1" +version = "0.3.1" edition = "2021" [features] bot = ["dep:async-trait", "dep:clap", "dep:cookie"] [dependencies] -async-trait = { version = "0.1.86", optional = true } -caseless = "0.2.2" -cookie = { version = "0.18.1", optional = true } -futures-util = { version = "0.3.31", default-features = false, features = ["sink"] } -jiff = { version = "0.2.1", features = ["serde"] } -log = "0.4.25" -serde = { version = "1.0.218", features = ["derive"] } -serde_json = "1.0.139" -tokio = { version = "1.43.0", features = ["time", "sync", "macros", "rt"] } -tokio-stream = "0.1.17" -tokio-tungstenite = { version = "0.26.2", features = ["rustls-tls-native-roots"] } -unicode-normalization = "0.1.24" +async-trait = { version = "0.1.64", optional = true } +caseless = "0.2.1" +cookie = { version = "0.17.0", optional = true } +futures-util = { version = "0.3.26", default-features = false, features = ["sink"] } +log = "0.4.17" +serde = { version = "1.0.152", features = ["derive"] } +serde_json = "1.0.93" +time = { version = "0.3.20", features = ["serde"] } +tokio = { version = "1.25.0", features = ["time", "sync", "macros", "rt"] } +tokio-stream = "0.1.12" +tokio-tungstenite = { version = "0.18.0", features = ["rustls-tls-native-roots"] } +unicode-normalization = "0.1.22" [dependencies.clap] -version = "4.5.30" +version = "4.1.6" optional = true default-features = false features = ["std", "derive", "deprecated"] [dev-dependencies] # For example bot -rustls = "0.23.23" -tokio = { version = "1.43.0", features = ["rt-multi-thread"] } +tokio = { version = "1.25.0", features = ["rt-multi-thread"] } [[example]] name = "testbot_instance" @@ -41,24 +40,3 @@ required-features = ["bot"] [[example]] name = "testbot_commands" required-features = ["bot"] - -[lints] -rust.unsafe_code = { level = "forbid", priority = 1 } -# Lint groups -rust.deprecated_safe = "warn" -rust.future_incompatible = "warn" -rust.keyword_idents = "warn" -rust.rust_2018_idioms = "warn" -rust.unused = "warn" -# Individual lints -rust.non_local_definitions = "warn" -rust.redundant_imports = "warn" -rust.redundant_lifetimes = "warn" -rust.single_use_lifetimes = "warn" -rust.unit_bindings = "warn" -rust.unnameable_types = "warn" -rust.unused_import_braces = "warn" -rust.unused_lifetimes = "warn" -rust.unused_qualifications = "warn" -# Clippy -clippy.use_self = "warn" diff --git a/examples/testbot_commands.rs b/examples/testbot_commands.rs index c3afada..34ed170 100644 --- a/examples/testbot_commands.rs +++ b/examples/testbot_commands.rs @@ -12,8 +12,8 @@ use euphoxide::bot::commands::Commands; use euphoxide::bot::instance::{Event, ServerConfig}; use euphoxide::bot::instances::Instances; use euphoxide::conn; -use jiff::Timestamp; use log::error; +use time::OffsetDateTime; use tokio::sync::mpsc; const HELP: &str = "I'm an example bot for https://github.com/Garmelon/euphoxide"; @@ -34,10 +34,10 @@ impl ClapCommand for Kill { msg: &Message, ctx: &Context, bot: &mut Bot, - ) -> Result { + ) -> Result<(), conn::Error> { bot.stop = true; ctx.reply(msg.id, "/me dies").await?; - Ok(true) + Ok(()) } } @@ -61,20 +61,20 @@ impl ClapCommand for Test { msg: &Message, ctx: &Context, _bot: &mut Bot, - ) -> Result { + ) -> Result<(), conn::Error> { let content = if args.amount == 1 { format!("/me did {} test", args.amount) } else { format!("/me did {} tests", args.amount) }; ctx.reply(msg.id, content).await?; - Ok(true) + Ok(()) } } struct Bot { commands: Arc>, - start_time: Timestamp, + start_time: OffsetDateTime, stop: bool, } @@ -85,18 +85,13 @@ impl HasDescriptions for Bot { } impl HasStartTime for Bot { - fn start_time(&self) -> Timestamp { + fn start_time(&self) -> OffsetDateTime { self.start_time } } #[tokio::main] async fn main() { - // https://github.com/snapview/tokio-tungstenite/issues/353#issuecomment-2455247837 - rustls::crypto::aws_lc_rs::default_provider() - .install_default() - .unwrap(); - let (tx, mut rx) = mpsc::unbounded_channel(); let mut instances = Instances::new(ServerConfig::default()); @@ -112,7 +107,7 @@ async fn main() { let mut bot = Bot { commands: cmds.clone(), - start_time: Timestamp::now(), + start_time: OffsetDateTime::now_utc(), stop: false, }; diff --git a/examples/testbot_instance.rs b/examples/testbot_instance.rs index f60f3b9..dd90f0e 100644 --- a/examples/testbot_instance.rs +++ b/examples/testbot_instance.rs @@ -3,15 +3,47 @@ use euphoxide::api::packet::ParsedPacket; use euphoxide::api::{Data, Nick, Send}; -use euphoxide::bot::botrulez; -use euphoxide::bot::instance::{ConnSnapshot, Event, ServerConfig}; -use jiff::Timestamp; +use euphoxide::bot::instance::{Event, ServerConfig, Snapshot}; +use time::OffsetDateTime; use tokio::sync::mpsc; const NICK: &str = "TestBot"; const HELP: &str = "I'm an example bot for https://github.com/Garmelon/euphoxide"; -async fn on_packet(packet: ParsedPacket, snapshot: ConnSnapshot) -> Result<(), ()> { +fn format_delta(delta: time::Duration) -> String { + const MINUTE: u64 = 60; + const HOUR: u64 = MINUTE * 60; + const DAY: u64 = HOUR * 24; + + let mut seconds: u64 = delta.whole_seconds().try_into().unwrap(); + let mut parts = vec![]; + + let days = seconds / DAY; + if days > 0 { + parts.push(format!("{days}d")); + seconds -= days * DAY; + } + + let hours = seconds / HOUR; + if hours > 0 { + parts.push(format!("{hours}h")); + seconds -= hours * HOUR; + } + + let mins = seconds / MINUTE; + if mins > 0 { + parts.push(format!("{mins}m")); + seconds -= mins * MINUTE; + } + + if parts.is_empty() || seconds > 0 { + parts.push(format!("{seconds}s")); + } + + parts.join(" ") +} + +async fn on_packet(packet: ParsedPacket, snapshot: Snapshot) -> Result<(), ()> { let data = match packet.content { Ok(data) => data, Err(err) => { @@ -75,11 +107,8 @@ async fn on_packet(packet: ParsedPacket, snapshot: ConnSnapshot) -> Result<(), ( reply = Some(HELP.to_string()); } else if content == format!("!uptime @{NICK}") { if let Some(joined) = snapshot.state.joined() { - let delta = Timestamp::now() - joined.since; - reply = Some(format!( - "/me has been up for {}", - botrulez::format_duration(delta) - )); + let delta = OffsetDateTime::now_utc() - joined.since; + reply = Some(format!("/me has been up for {}", format_delta(delta))); } } else if content == "!test" { reply = Some("Test successful!".to_string()); @@ -122,11 +151,6 @@ async fn on_packet(packet: ParsedPacket, snapshot: ConnSnapshot) -> Result<(), ( #[tokio::main] async fn main() { - // https://github.com/snapview/tokio-tungstenite/issues/353#issuecomment-2455247837 - rustls::crypto::aws_lc_rs::default_provider() - .install_default() - .unwrap(); - let (tx, mut rx) = mpsc::unbounded_channel(); let _instance = ServerConfig::default() diff --git a/examples/testbot_instances.rs b/examples/testbot_instances.rs index 0fb612f..4632597 100644 --- a/examples/testbot_instances.rs +++ b/examples/testbot_instances.rs @@ -3,16 +3,48 @@ use euphoxide::api::packet::ParsedPacket; use euphoxide::api::{Data, Nick, Send}; -use euphoxide::bot::botrulez; -use euphoxide::bot::instance::{ConnSnapshot, Event, ServerConfig}; +use euphoxide::bot::instance::{Event, ServerConfig, Snapshot}; use euphoxide::bot::instances::Instances; -use jiff::Timestamp; +use time::OffsetDateTime; use tokio::sync::mpsc; const NICK: &str = "TestBot"; const HELP: &str = "I'm an example bot for https://github.com/Garmelon/euphoxide"; -async fn on_packet(packet: ParsedPacket, snapshot: ConnSnapshot) -> Result<(), ()> { +fn format_delta(delta: time::Duration) -> String { + const MINUTE: u64 = 60; + const HOUR: u64 = MINUTE * 60; + const DAY: u64 = HOUR * 24; + + let mut seconds: u64 = delta.whole_seconds().try_into().unwrap(); + let mut parts = vec![]; + + let days = seconds / DAY; + if days > 0 { + parts.push(format!("{days}d")); + seconds -= days * DAY; + } + + let hours = seconds / HOUR; + if hours > 0 { + parts.push(format!("{hours}h")); + seconds -= hours * HOUR; + } + + let mins = seconds / MINUTE; + if mins > 0 { + parts.push(format!("{mins}m")); + seconds -= mins * MINUTE; + } + + if parts.is_empty() || seconds > 0 { + parts.push(format!("{seconds}s")); + } + + parts.join(" ") +} + +async fn on_packet(packet: ParsedPacket, snapshot: Snapshot) -> Result<(), ()> { let data = match packet.content { Ok(data) => data, Err(err) => { @@ -76,11 +108,8 @@ async fn on_packet(packet: ParsedPacket, snapshot: ConnSnapshot) -> Result<(), ( reply = Some(HELP.to_string()); } else if content == format!("!uptime @{NICK}") { if let Some(joined) = snapshot.state.joined() { - let delta = Timestamp::now() - joined.since; - reply = Some(format!( - "/me has been up for {}", - botrulez::format_duration(delta) - )); + let delta = OffsetDateTime::now_utc() - joined.since; + reply = Some(format!("/me has been up for {}", format_delta(delta))); } } else if content == "!test" { reply = Some("Test successful!".to_string()); @@ -123,11 +152,6 @@ async fn on_packet(packet: ParsedPacket, snapshot: ConnSnapshot) -> Result<(), ( #[tokio::main] async fn main() { - // https://github.com/snapview/tokio-tungstenite/issues/353#issuecomment-2455247837 - rustls::crypto::aws_lc_rs::default_provider() - .install_default() - .unwrap(); - let (tx, mut rx) = mpsc::unbounded_channel(); let mut instances = Instances::new(ServerConfig::default()); diff --git a/examples/testbot_manual.rs b/examples/testbot_manual.rs index da21db0..8a7afe0 100644 --- a/examples/testbot_manual.rs +++ b/examples/testbot_manual.rs @@ -6,16 +6,48 @@ use std::time::Duration; use euphoxide::api::packet::ParsedPacket; use euphoxide::api::{Data, Nick, Send}; -use euphoxide::bot::botrulez; use euphoxide::conn::{Conn, ConnTx, State}; -use jiff::Timestamp; +use time::OffsetDateTime; const TIMEOUT: Duration = Duration::from_secs(10); -const DOMAIN: &str = "euphoria.leet.nu"; +const DOMAIN: &str = "euphoria.io"; const ROOM: &str = "test"; const NICK: &str = "TestBot"; const HELP: &str = "I'm an example bot for https://github.com/Garmelon/euphoxide"; +fn format_delta(delta: time::Duration) -> String { + const MINUTE: u64 = 60; + const HOUR: u64 = MINUTE * 60; + const DAY: u64 = HOUR * 24; + + let mut seconds: u64 = delta.whole_seconds().try_into().unwrap(); + let mut parts = vec![]; + + let days = seconds / DAY; + if days > 0 { + parts.push(format!("{days}d")); + seconds -= days * DAY; + } + + let hours = seconds / HOUR; + if hours > 0 { + parts.push(format!("{hours}h")); + seconds -= hours * HOUR; + } + + let mins = seconds / MINUTE; + if mins > 0 { + parts.push(format!("{mins}m")); + seconds -= mins * MINUTE; + } + + if parts.is_empty() || seconds > 0 { + parts.push(format!("{seconds}s")); + } + + parts.join(" ") +} + async fn on_packet(packet: ParsedPacket, conn_tx: &ConnTx, state: &State) -> Result<(), ()> { let data = match packet.content { Ok(data) => data, @@ -80,11 +112,8 @@ async fn on_packet(packet: ParsedPacket, conn_tx: &ConnTx, state: &State) -> Res reply = Some(HELP.to_string()); } else if content == format!("!uptime @{NICK}") { if let Some(joined) = state.joined() { - let delta = Timestamp::now() - joined.since; - reply = Some(format!( - "/me has been up for {}", - botrulez::format_duration(delta) - )); + let delta = OffsetDateTime::now_utc() - joined.since; + reply = Some(format!("/me has been up for {}", format_delta(delta))); } } else if content == "!test" { reply = Some("Test successful!".to_string()); @@ -126,11 +155,6 @@ async fn on_packet(packet: ParsedPacket, conn_tx: &ConnTx, state: &State) -> Res #[tokio::main] async fn main() -> Result<(), Box> { - // https://github.com/snapview/tokio-tungstenite/issues/353#issuecomment-2455247837 - rustls::crypto::aws_lc_rs::default_provider() - .install_default() - .unwrap(); - let (mut conn, _) = Conn::connect(DOMAIN, ROOM, false, None, TIMEOUT).await?; while let Ok(packet) = conn.recv().await { diff --git a/src/api.rs b/src/api.rs index e24ca1d..5923f47 100644 --- a/src/api.rs +++ b/src/api.rs @@ -1,6 +1,4 @@ -//! Models the [euphoria API][0]. -//! -//! [0]: https://euphoria.leet.nu/heim/api +//! Models the euphoria API at . mod account_cmds; mod events; diff --git a/src/api/account_cmds.rs b/src/api/account_cmds.rs index 01ef7f0..6a39db6 100644 --- a/src/api/account_cmds.rs +++ b/src/api/account_cmds.rs @@ -56,7 +56,7 @@ pub struct ChangePassword { /// Return the outcome of changing the password. #[derive(Debug, Clone, Serialize, Deserialize)] -pub struct ChangePasswordReply {} +pub struct ChangePasswordReply; /// Attempt to log an anonymous session into an account. /// @@ -99,11 +99,11 @@ pub struct LoginReply { /// [`DisconnectEvent`](super::DisconnectEvent) shortly after. The next /// connection the client makes will be a logged out session. #[derive(Debug, Clone, Serialize, Deserialize)] -pub struct Logout {} +pub struct Logout; /// Confirm a logout. #[derive(Debug, Clone, Serialize, Deserialize)] -pub struct LogoutReply {} +pub struct LogoutReply; /// Create a new account and logs into it. /// @@ -146,11 +146,11 @@ pub struct RegisterAccountReply { /// An error will be returned if the account has no unverified email addresses /// associated with it. #[derive(Debug, Clone, Serialize, Deserialize)] -pub struct ResendVerificationEmail {} +pub struct ResendVerificationEmail; /// Indicate that a verification email has been sent. #[derive(Debug, Clone, Serialize, Deserialize)] -pub struct ResendVerificationEmailReply {} +pub struct ResendVerificationEmailReply; /// Generate a password reset request. /// @@ -164,4 +164,4 @@ pub struct ResetPassword { /// Confirm that the password reset is in progress. #[derive(Debug, Clone, Serialize, Deserialize)] -pub struct ResetPasswordReply {} +pub struct ResetPasswordReply; diff --git a/src/api/events.rs b/src/api/events.rs index 8abe04d..a80a49d 100644 --- a/src/api/events.rs +++ b/src/api/events.rs @@ -68,7 +68,7 @@ pub struct LoginEvent { /// Sent to all sessions of an agent when that agent is logged out (except for /// the session that issued the logout command). #[derive(Debug, Clone, Serialize, Deserialize)] -pub struct LogoutEvent {} +pub struct LogoutEvent; /// Indicates some server-side event that impacts the presence of sessions in a /// room. diff --git a/src/api/room_cmds.rs b/src/api/room_cmds.rs index 0a2d553..bb60e0a 100644 --- a/src/api/room_cmds.rs +++ b/src/api/room_cmds.rs @@ -110,7 +110,7 @@ pub struct SendReply(pub Message); /// Request a list of sessions currently joined in the room. #[derive(Debug, Clone, Serialize, Deserialize)] -pub struct Who {} +pub struct Who; /// Lists the sessions currently joined in the room. #[derive(Debug, Clone, Serialize, Deserialize)] diff --git a/src/api/types.rs b/src/api/types.rs index b1408a8..d1a393d 100644 --- a/src/api/types.rs +++ b/src/api/types.rs @@ -10,9 +10,9 @@ use std::num::ParseIntError; use std::str::FromStr; use std::{error, fmt}; -use jiff::Timestamp; use serde::{de, ser, Deserialize, Serialize}; use serde_json::Value; +use time::{OffsetDateTime, UtcOffset}; /// Describes an account and its preferred name. #[derive(Debug, Clone, Serialize, Deserialize)] @@ -403,19 +403,19 @@ impl<'de> Deserialize<'de> for Snowflake { /// Time is specified as a signed 64-bit integer, giving the number of seconds /// since the Unix Epoch. #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] -pub struct Time(pub i64); +pub struct Time(#[serde(with = "time::serde::timestamp")] pub OffsetDateTime); impl Time { - pub fn from_timestamp(time: Timestamp) -> Self { - Self(time.as_second()) - } - - pub fn as_timestamp(&self) -> Timestamp { - Timestamp::from_second(self.0).unwrap() + pub fn new(time: OffsetDateTime) -> Self { + let time = time + .to_offset(UtcOffset::UTC) + .replace_millisecond(0) + .unwrap(); + Self(time) } pub fn now() -> Self { - Self::from_timestamp(Timestamp::now()) + Self::new(OffsetDateTime::now_utc()) } } diff --git a/src/bot/botrulez.rs b/src/bot/botrulez.rs index 6dd5adb..3161ad6 100644 --- a/src/bot/botrulez.rs +++ b/src/bot/botrulez.rs @@ -1,10 +1,10 @@ //! The main [botrulez](https://github.com/jedevc/botrulez) commands. -pub mod full_help; -pub mod ping; -pub mod short_help; -pub mod uptime; +mod full_help; +mod ping; +mod short_help; +mod uptime; pub use self::full_help::{FullHelp, HasDescriptions}; pub use self::ping::Ping; pub use self::short_help::ShortHelp; -pub use self::uptime::{format_duration, format_relative_time, format_time, HasStartTime, Uptime}; +pub use self::uptime::{format_duration, format_time, HasStartTime, Uptime}; diff --git a/src/bot/botrulez/full_help.rs b/src/bot/botrulez/full_help.rs index 20ffcc4..f1508ab 100644 --- a/src/bot/botrulez/full_help.rs +++ b/src/bot/botrulez/full_help.rs @@ -50,20 +50,12 @@ where B: HasDescriptions + Send, E: From, { - async fn execute( - &self, - arg: &str, - msg: &Message, - ctx: &Context, - bot: &mut B, - ) -> Result { + async fn execute(&self, arg: &str, msg: &Message, ctx: &Context, bot: &mut B) -> Result<(), E> { if arg.trim().is_empty() { let reply = self.formulate_reply(ctx, bot); ctx.reply(msg.id, reply).await?; - Ok(true) - } else { - Ok(false) } + Ok(()) } } @@ -85,9 +77,9 @@ where msg: &Message, ctx: &Context, bot: &mut B, - ) -> Result { + ) -> Result<(), E> { let reply = self.formulate_reply(ctx, bot); ctx.reply(msg.id, reply).await?; - Ok(true) + Ok(()) } } diff --git a/src/bot/botrulez/ping.rs b/src/bot/botrulez/ping.rs index c7cea39..cb48195 100644 --- a/src/bot/botrulez/ping.rs +++ b/src/bot/botrulez/ping.rs @@ -30,13 +30,11 @@ where msg: &Message, ctx: &Context, _bot: &mut B, - ) -> Result { + ) -> Result<(), E> { if arg.trim().is_empty() { ctx.reply(msg.id, &self.0).await?; - Ok(true) - } else { - Ok(false) } + Ok(()) } } @@ -57,8 +55,8 @@ where msg: &Message, ctx: &Context, _bot: &mut B, - ) -> Result { + ) -> Result<(), E> { ctx.reply(msg.id, &self.0).await?; - Ok(true) + Ok(()) } } diff --git a/src/bot/botrulez/short_help.rs b/src/bot/botrulez/short_help.rs index 1a359be..028c1d1 100644 --- a/src/bot/botrulez/short_help.rs +++ b/src/bot/botrulez/short_help.rs @@ -24,13 +24,11 @@ where msg: &Message, ctx: &Context, _bot: &mut B, - ) -> Result { + ) -> Result<(), E> { if arg.trim().is_empty() { ctx.reply(msg.id, &self.0).await?; - Ok(true) - } else { - Ok(false) } + Ok(()) } } @@ -51,8 +49,8 @@ where msg: &Message, ctx: &Context, _bot: &mut B, - ) -> Result { + ) -> Result<(), E> { ctx.reply(msg.id, &self.0).await?; - Ok(true) + Ok(()) } } diff --git a/src/bot/botrulez/uptime.rs b/src/bot/botrulez/uptime.rs index d8b1d0d..a892ed3 100644 --- a/src/bot/botrulez/uptime.rs +++ b/src/bot/botrulez/uptime.rs @@ -1,29 +1,24 @@ use async_trait::async_trait; use clap::Parser; -use jiff::{Span, Timestamp, Unit}; +use time::macros::format_description; +use time::{Duration, OffsetDateTime, UtcOffset}; use crate::api::Message; -use crate::bot::command::{ClapCommand, Command, Context}; +use crate::bot::command::{ClapCommand, Context}; use crate::conn; -pub fn format_time(t: Timestamp) -> String { - t.strftime("%Y-%m-%d %H:%M:%S UTC").to_string() +pub fn format_time(t: OffsetDateTime) -> String { + let t = t.to_offset(UtcOffset::UTC); + let format = format_description!("[year]-[month]-[day] [hour]:[minute]:[second] UTC"); + t.format(format).unwrap() } -pub fn format_relative_time(d: Span) -> String { - if d.is_positive() { - format!("in {}", format_duration(d.abs())) - } else { - format!("{} ago", format_duration(d.abs())) - } -} - -pub fn format_duration(d: Span) -> String { - let total = d.abs().total(Unit::Second).unwrap() as i64; - let secs = total % 60; - let mins = (total / 60) % 60; - let hours = (total / 60 / 60) % 24; - let days = total / 60 / 60 / 24; +pub fn format_duration(d: Duration) -> String { + let d_abs = d.abs(); + let days = d_abs.whole_days(); + let hours = d_abs.whole_hours() % 24; + let mins = d_abs.whole_minutes() % 60; + let secs = d_abs.whole_seconds() % 60; let mut segments = vec![]; if days > 0 { @@ -44,63 +39,16 @@ pub fn format_duration(d: Span) -> String { let segments = segments.join(" "); if d.is_positive() { - segments + format!("in {segments}") } else { - format!("-{segments}") + format!("{segments} ago") } } pub struct Uptime; pub trait HasStartTime { - fn start_time(&self) -> Timestamp; -} - -impl Uptime { - fn formulate_reply(&self, ctx: &Context, bot: &B, connected: bool) -> String { - let start = bot.start_time(); - let now = Timestamp::now(); - - let mut reply = format!( - "/me has been up since {} ({})", - format_time(start), - format_relative_time(start - now), - ); - - if connected { - let since = ctx.joined.since; - reply.push_str(&format!( - ", connected since {} ({})", - format_time(since), - format_relative_time(since - now), - )); - } - - reply - } -} - -#[async_trait] -impl Command for Uptime -where - B: HasStartTime + Send, - E: From, -{ - async fn execute( - &self, - arg: &str, - msg: &Message, - ctx: &Context, - bot: &mut B, - ) -> Result { - if arg.trim().is_empty() { - let reply = self.formulate_reply(ctx, bot, false); - ctx.reply(msg.id, reply).await?; - Ok(true) - } else { - Ok(false) - } - } + fn start_time(&self) -> OffsetDateTime; } /// Show how long the bot has been online. @@ -108,7 +56,7 @@ where pub struct Args { /// Show how long the bot has been connected without interruption. #[arg(long, short)] - pub connected: bool, + connected: bool, } #[async_trait] @@ -125,9 +73,26 @@ where msg: &Message, ctx: &Context, bot: &mut B, - ) -> Result { - let reply = self.formulate_reply(ctx, bot, args.connected); + ) -> Result<(), E> { + let start = bot.start_time(); + let now = OffsetDateTime::now_utc(); + + let mut reply = format!( + "/me has been up since {} ({})", + format_time(start), + format_duration(start - now), + ); + + if args.connected { + let since = ctx.joined.since; + reply.push_str(&format!( + ", connected since {} ({})", + format_time(since), + format_duration(since - now), + )); + } + ctx.reply(msg.id, reply).await?; - Ok(true) + Ok(()) } } diff --git a/src/bot/command.rs b/src/bot/command.rs index 226adb0..5c400ca 100644 --- a/src/bot/command.rs +++ b/src/bot/command.rs @@ -54,11 +54,5 @@ pub trait Command { None } - async fn execute( - &self, - arg: &str, - msg: &Message, - ctx: &Context, - bot: &mut B, - ) -> Result; + async fn execute(&self, arg: &str, msg: &Message, ctx: &Context, bot: &mut B) -> Result<(), E>; } diff --git a/src/bot/command/bang.rs b/src/bot/command/bang.rs index a55d99d..16c9b12 100644 --- a/src/bot/command/bang.rs +++ b/src/bot/command/bang.rs @@ -5,15 +5,11 @@ use crate::nick; use super::{Command, Context}; -// TODO Don't ignore leading whitespace? -// I'm not entirely happy with how commands handle whitespace, and on euphoria, -// prefixing commands with whitespace is traditionally used to not trigger them. - -/// Parse leading whitespace followed by an prefix-initiated command. +/// Parse leading whitespace followed by an `!`-initiated command. /// /// Returns the command name and the remaining text with one leading whitespace /// removed. The remaining text may be the empty string. -pub fn parse_prefix_initiated<'a>(text: &'a str, prefix: &str) -> Option<(&'a str, &'a str)> { +fn parse_command<'a>(text: &'a str, prefix: &str) -> Option<(&'a str, &'a str)> { let text = text.trim_start(); let text = text.strip_prefix(prefix)?; let (name, rest) = text.split_once(char::is_whitespace).unwrap_or((text, "")); @@ -23,6 +19,20 @@ pub fn parse_prefix_initiated<'a>(text: &'a str, prefix: &str) -> Option<(&'a st Some((name, rest)) } +/// Parse leading whitespace followed by an `@`-initiated nick. +/// +/// Returns the nick and the remaining text with one leading whitespace removed. +/// The remaining text may be the empty string. +fn parse_specific(text: &str) -> Option<(&str, &str)> { + let text = text.trim_start(); + let text = text.strip_prefix('@')?; + let (name, rest) = text.split_once(char::is_whitespace).unwrap_or((text, "")); + if name.is_empty() { + return None; + } + Some((name, rest)) +} + pub struct Global { prefix: String, name: String, @@ -55,21 +65,15 @@ where Some(format!("{}{} - {inner}", self.prefix, self.name)) } - async fn execute( - &self, - arg: &str, - msg: &Message, - ctx: &Context, - bot: &mut B, - ) -> Result { + async fn execute(&self, arg: &str, msg: &Message, ctx: &Context, bot: &mut B) -> Result<(), E> { // TODO Replace with let-else - let (name, rest) = match parse_prefix_initiated(arg, &self.prefix) { + let (name, rest) = match parse_command(arg, &self.prefix) { Some(parsed) => parsed, - None => return Ok(false), + None => return Ok(()), }; if name != self.name { - return Ok(false); + return Ok(()); } self.inner.execute(rest, msg, ctx, bot).await @@ -108,28 +112,22 @@ where Some(format!("{}{} - {inner}", self.prefix, self.name)) } - async fn execute( - &self, - arg: &str, - msg: &Message, - ctx: &Context, - bot: &mut B, - ) -> Result { + async fn execute(&self, arg: &str, msg: &Message, ctx: &Context, bot: &mut B) -> Result<(), E> { // TODO Replace with let-else - let (name, rest) = match parse_prefix_initiated(arg, &self.prefix) { + let (name, rest) = match parse_command(arg, &self.prefix) { Some(parsed) => parsed, - None => return Ok(false), + None => return Ok(()), }; if name != self.name { - return Ok(false); + return Ok(()); } - if parse_prefix_initiated(rest, "@").is_some() { + if parse_specific(rest).is_some() { // The command looks like a specific command. If we treated it like // a general command match, we would interpret other bots' specific // commands as general commands. - return Ok(false); + return Ok(()); } self.inner.execute(rest, msg, ctx, bot).await @@ -169,31 +167,25 @@ where Some(format!("{}{} @{nick} - {inner}", self.prefix, self.name)) } - async fn execute( - &self, - arg: &str, - msg: &Message, - ctx: &Context, - bot: &mut B, - ) -> Result { + async fn execute(&self, arg: &str, msg: &Message, ctx: &Context, bot: &mut B) -> Result<(), E> { // TODO Replace with let-else - let (name, rest) = match parse_prefix_initiated(arg, &self.prefix) { + let (name, rest) = match parse_command(arg, &self.prefix) { Some(parsed) => parsed, - None => return Ok(false), + None => return Ok(()), }; if name != self.name { - return Ok(false); + return Ok(()); } // TODO Replace with let-else - let (nick, rest) = match parse_prefix_initiated(rest, "@") { + let (nick, rest) = match parse_specific(rest) { Some(parsed) => parsed, - None => return Ok(false), + None => return Ok(()), }; if nick::normalize(nick) != nick::normalize(&ctx.joined.session.name) { - return Ok(false); + return Ok(()); } self.inner.execute(rest, msg, ctx, bot).await @@ -202,34 +194,33 @@ where #[cfg(test)] mod test { - use super::parse_prefix_initiated; + use super::{parse_command, parse_specific}; #[test] - fn test_parse_prefixed() { - assert_eq!(parse_prefix_initiated("!foo", "!"), Some(("foo", ""))); - assert_eq!(parse_prefix_initiated(" !foo", "!"), Some(("foo", ""))); - assert_eq!( - parse_prefix_initiated("!foo ", "!"), - Some(("foo", " ")) - ); - assert_eq!( - parse_prefix_initiated(" !foo ", "!"), - Some(("foo", " ")) - ); - assert_eq!( - parse_prefix_initiated("!foo @bar", "!"), - Some(("foo", "@bar")) - ); - assert_eq!( - parse_prefix_initiated("!foo @bar", "!"), - Some(("foo", " @bar")) - ); - assert_eq!( - parse_prefix_initiated("!foo @bar ", "!"), - Some(("foo", "@bar ")) - ); - assert_eq!(parse_prefix_initiated("! foo @bar", "!"), None); - assert_eq!(parse_prefix_initiated("!", "!"), None); - assert_eq!(parse_prefix_initiated("?foo", "!"), None); + fn test_parse_command() { + assert_eq!(parse_command("!foo", "!"), Some(("foo", ""))); + assert_eq!(parse_command(" !foo", "!"), Some(("foo", ""))); + assert_eq!(parse_command("!foo ", "!"), Some(("foo", " "))); + assert_eq!(parse_command(" !foo ", "!"), Some(("foo", " "))); + assert_eq!(parse_command("!foo @bar", "!"), Some(("foo", "@bar"))); + assert_eq!(parse_command("!foo @bar", "!"), Some(("foo", " @bar"))); + assert_eq!(parse_command("!foo @bar ", "!"), Some(("foo", "@bar "))); + assert_eq!(parse_command("! foo @bar", "!"), None); + assert_eq!(parse_command("!", "!"), None); + assert_eq!(parse_command("?foo", "!"), None); + } + + #[test] + fn test_parse_specific() { + assert_eq!(parse_specific("@foo"), Some(("foo", ""))); + assert_eq!(parse_specific(" @foo"), Some(("foo", ""))); + assert_eq!(parse_specific("@foo "), Some(("foo", " "))); + assert_eq!(parse_specific(" @foo "), Some(("foo", " "))); + assert_eq!(parse_specific("@foo !bar"), Some(("foo", "!bar"))); + assert_eq!(parse_specific("@foo !bar"), Some(("foo", " !bar"))); + assert_eq!(parse_specific("@foo !bar "), Some(("foo", "!bar "))); + assert_eq!(parse_specific("@ foo !bar"), None); + assert_eq!(parse_specific("@"), None); + assert_eq!(parse_specific("?foo"), None); } } diff --git a/src/bot/command/clap.rs b/src/bot/command/clap.rs index a22b49a..efb7fce 100644 --- a/src/bot/command/clap.rs +++ b/src/bot/command/clap.rs @@ -16,7 +16,7 @@ pub trait ClapCommand { msg: &Message, ctx: &Context, bot: &mut B, - ) -> Result; + ) -> Result<(), E>; } /// Parse bash-like quoted arguments separated by whitespace. @@ -110,18 +110,12 @@ where C::Args::command().get_about().map(|s| format!("{s}")) } - async fn execute( - &self, - arg: &str, - msg: &Message, - ctx: &Context, - bot: &mut B, - ) -> Result { + async fn execute(&self, arg: &str, msg: &Message, ctx: &Context, bot: &mut B) -> Result<(), E> { let mut args = match parse_quoted_args(arg) { Ok(args) => args, Err(err) => { ctx.reply(msg.id, err).await?; - return Ok(true); + return Ok(()); } }; @@ -133,7 +127,7 @@ where Ok(args) => args, Err(err) => { ctx.reply(msg.id, format!("{}", err.render())).await?; - return Ok(true); + return Ok(()); } }; diff --git a/src/bot/command/hidden.rs b/src/bot/command/hidden.rs index 0aad60d..c3f6bf2 100644 --- a/src/bot/command/hidden.rs +++ b/src/bot/command/hidden.rs @@ -17,13 +17,7 @@ where None } - async fn execute( - &self, - arg: &str, - msg: &Message, - ctx: &Context, - bot: &mut B, - ) -> Result { + async fn execute(&self, arg: &str, msg: &Message, ctx: &Context, bot: &mut B) -> Result<(), E> { self.0.execute(arg, msg, ctx, bot).await } } diff --git a/src/bot/command/prefixed.rs b/src/bot/command/prefixed.rs index f572732..486ab55 100644 --- a/src/bot/command/prefixed.rs +++ b/src/bot/command/prefixed.rs @@ -29,17 +29,11 @@ where Some(format!("{} - {inner}", self.prefix)) } - async fn execute( - &self, - arg: &str, - msg: &Message, - ctx: &Context, - bot: &mut B, - ) -> Result { + async fn execute(&self, arg: &str, msg: &Message, ctx: &Context, bot: &mut B) -> Result<(), E> { if let Some(rest) = arg.trim_start().strip_prefix(&self.prefix) { self.inner.execute(rest, msg, ctx, bot).await } else { - Ok(false) + Ok(()) } } } diff --git a/src/bot/commands.rs b/src/bot/commands.rs index a37cb5d..b9e6993 100644 --- a/src/bot/commands.rs +++ b/src/bot/commands.rs @@ -3,36 +3,15 @@ use crate::api::{Data, SendEvent}; use crate::conn; use super::command::{Command, Context}; -use super::instance::{ConnSnapshot, InstanceConfig}; +use super::instance::{InstanceConfig, Snapshot}; pub struct Commands { commands: Vec + Send + Sync>>, - fallthrough: bool, } impl Commands { pub fn new() -> Self { - Self { - commands: vec![], - fallthrough: false, - } - } - - /// Whether further commands should be executed after a command returns - /// `true`. - /// - /// If disabled, commands are run until the first command that returns - /// `true`. If enabled, all commands are run irrespective of their return - /// values. - pub fn fallthrough(&self) -> bool { - self.fallthrough - } - - /// Set whether fallthrough is active. - /// - /// See [`Self::fallthrough`] for more details. - pub fn set_fallthrough(&mut self, active: bool) { - self.fallthrough = active; + Self { commands: vec![] } } pub fn add(&mut self, command: C) @@ -49,22 +28,21 @@ impl Commands { .collect::>() } - /// Returns `true` if one or more commands returned `true`, `false` - /// otherwise. + /// Returns `true` if a command was found and executed, `false` otherwise. pub async fn handle_packet( &self, config: &InstanceConfig, packet: &ParsedPacket, - snapshot: &ConnSnapshot, + snapshot: &Snapshot, bot: &mut B, - ) -> Result { + ) -> Result<(), E> { let msg = match &packet.content { Ok(Data::SendEvent(SendEvent(msg))) => msg, - _ => return Ok(false), + _ => return Ok(()), }; let joined = match &snapshot.state { - conn::State::Joining(_) => return Ok(false), + conn::State::Joining(_) => return Ok(()), conn::State::Joined(joined) => joined.clone(), }; @@ -74,15 +52,11 @@ impl Commands { joined, }; - let mut handled = false; for command in &self.commands { - handled = handled || command.execute(&msg.content, msg, &ctx, bot).await?; - if !self.fallthrough && handled { - break; - } + command.execute(&msg.content, msg, &ctx, bot).await?; } - Ok(handled) + Ok(()) } } diff --git a/src/bot/instance.rs b/src/bot/instance.rs index 0d00d4d..04ce031 100644 --- a/src/bot/instance.rs +++ b/src/bot/instance.rs @@ -98,7 +98,7 @@ impl Default for ServerConfig { Self { timeout: Duration::from_secs(30), reconnect_delay: Duration::from_secs(30), - domain: "euphoria.leet.nu".to_string(), + domain: "euphoria.io".to_string(), cookies: Arc::new(Mutex::new(CookieJar::new())), } } @@ -193,12 +193,12 @@ impl InstanceConfig { /// Snapshot of a [`Conn`]'s state immediately after receiving a packet. #[derive(Debug, Clone)] -pub struct ConnSnapshot { +pub struct Snapshot { pub conn_tx: ConnTx, pub state: State, } -impl ConnSnapshot { +impl Snapshot { fn from_conn(conn: &Conn) -> Self { Self { conn_tx: conn.tx().clone(), @@ -224,8 +224,8 @@ impl ConnSnapshot { #[derive(Debug)] pub enum Event { Connecting(InstanceConfig), - Connected(InstanceConfig, ConnSnapshot), - Packet(InstanceConfig, ParsedPacket, ConnSnapshot), + Connected(InstanceConfig, Snapshot), + Packet(InstanceConfig, ParsedPacket, Snapshot), Disconnected(InstanceConfig), Stopped(InstanceConfig), } @@ -251,7 +251,7 @@ enum Request { enum RunError { StoppedManually, InstanceDropped, - CouldNotConnect(conn::Error), + CouldNotConnect(tungstenite::Error), Conn(conn::Error), } @@ -273,13 +273,13 @@ enum RunError { /// either case, the last event the instance sends will be an /// [`Event::Stopped`]. If it is not stopped using one of these two ways, it /// will continue to run and reconnect indefinitely. -#[derive(Debug, Clone)] +#[derive(Debug)] pub struct Instance { config: InstanceConfig, request_tx: mpsc::UnboundedSender, // In theory, request_tx should be sufficient as canary, but I'm not sure // exactly how to check it during the reconnect timeout. - _canary_tx: mpsc::UnboundedSender, + _canary_tx: oneshot::Sender, } impl Instance { @@ -312,7 +312,7 @@ impl Instance { idebug!(config, "Created with config {config:?}"); let (request_tx, request_rx) = mpsc::unbounded_channel(); - let (canary_tx, canary_rx) = mpsc::unbounded_channel(); + let (canary_tx, canary_rx) = oneshot::channel(); tokio::spawn(Self::run::( config.clone(), @@ -360,11 +360,11 @@ impl Instance { config: InstanceConfig, on_event: F, request_rx: mpsc::UnboundedReceiver, - mut canary_rx: mpsc::UnboundedReceiver, + canary_rx: oneshot::Receiver, ) { select! { _ = Self::stay_connected(&config, &on_event, request_rx) => (), - _ = canary_rx.recv() => { idebug!(config, "Instance dropped"); }, + _ = canary_rx => { idebug!(config, "Instance dropped"); }, } on_event(Event::Stopped(config)) } @@ -394,9 +394,9 @@ impl Instance { idebug!(config, "Instance dropped"); break; } - Err(RunError::CouldNotConnect(conn::Error::Tungstenite( - tungstenite::Error::Http(response), - ))) if response.status() == StatusCode::NOT_FOUND => { + Err(RunError::CouldNotConnect(tungstenite::Error::Http(response))) + if response.status() == StatusCode::NOT_FOUND => + { iwarn!(config, "Failed to connect: room does not exist"); break; } @@ -458,10 +458,7 @@ impl Instance { .map_err(RunError::CouldNotConnect)?; Self::set_cookies(config, cookies); - on_event(Event::Connected( - config.clone(), - ConnSnapshot::from_conn(&conn), - )); + on_event(Event::Connected(config.clone(), Snapshot::from_conn(&conn))); let conn_tx = conn.tx().clone(); select! { @@ -477,7 +474,7 @@ impl Instance { ) -> Result<(), RunError> { loop { let packet = conn.recv().await.map_err(RunError::Conn)?; - let snapshot = ConnSnapshot::from_conn(conn); + let snapshot = Snapshot::from_conn(conn); match &packet.content { Ok(Data::SnapshotEvent(snapshot)) => { diff --git a/src/conn.rs b/src/conn.rs index 7255d60..dcfc948 100644 --- a/src/conn.rs +++ b/src/conn.rs @@ -6,8 +6,8 @@ use std::future::Future; use std::time::{Duration, Instant}; use std::{error, fmt, result}; +use ::time::OffsetDateTime; use futures_util::SinkExt; -use jiff::Timestamp; use log::debug; use tokio::net::TcpStream; use tokio::select; @@ -30,8 +30,6 @@ pub type WsStream = WebSocketStream>; pub enum Error { /// The connection is now closed. ConnectionClosed, - /// The connection was not opened in time. - ConnectionTimedOut, /// The server didn't reply to one of our commands in time. CommandTimedOut, /// The server did something that violated the api specification. @@ -47,7 +45,6 @@ impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { Self::ConnectionClosed => write!(f, "connection closed"), - Self::ConnectionTimedOut => write!(f, "connection did not open in time"), Self::CommandTimedOut => write!(f, "server did not reply to command in time"), Self::ProtocolViolation(msg) => write!(f, "{msg}"), Self::Euph(msg) => write!(f, "{msg}"), @@ -75,7 +72,7 @@ pub type Result = result::Result; #[derive(Debug, Clone)] pub struct Joining { - pub since: Timestamp, + pub since: OffsetDateTime, pub hello: Option, pub snapshot: Option, pub bounce: Option, @@ -84,7 +81,7 @@ pub struct Joining { impl Joining { fn new() -> Self { Self { - since: Timestamp::now(), + since: OffsetDateTime::now_utc(), hello: None, snapshot: None, bounce: None, @@ -122,7 +119,7 @@ impl Joining { .map(|s| (s.session_id.clone(), SessionInfo::Full(s))) .collect::>(); Some(Joined { - since: Timestamp::now(), + since: OffsetDateTime::now_utc(), session, account: hello.account.clone(), listing, @@ -164,7 +161,7 @@ impl SessionInfo { #[derive(Debug, Clone)] pub struct Joined { - pub since: Timestamp, + pub since: OffsetDateTime, pub session: SessionView, pub account: Option, pub listing: HashMap, @@ -427,7 +424,7 @@ impl Conn { } tungstenite::Message::Ping(_) => {} tungstenite::Message::Pong(payload) => { - if self.last_ws_ping_payload == Some(payload.to_vec()) { + if self.last_ws_ping_payload == Some(payload) { self.last_ws_ping_replied_to = true; } } @@ -444,11 +441,10 @@ impl Conn { self.replies.complete(id, packet.clone()); } - if let Ok(data) = &packet.content { - self.on_data(&packet.id, data).await?; + match &packet.content { + Ok(data) => self.on_data(&packet.id, data).await, + Err(msg) => Err(Error::Euph(msg.clone())), } - - Ok(()) } async fn on_data(&mut self, id: &Option, data: &Data) -> Result<()> { @@ -522,18 +518,16 @@ impl Conn { self.disconnect().await?; } - let now = Timestamp::now(); + let now = OffsetDateTime::now_utc(); // Send new ws ping - let ws_payload = now.as_millisecond().to_be_bytes().to_vec(); + let ws_payload = now.unix_timestamp_nanos().to_be_bytes().to_vec(); self.last_ws_ping_payload = Some(ws_payload.clone()); self.last_ws_ping_replied_to = false; - self.ws - .send(tungstenite::Message::Ping(ws_payload.into())) - .await?; + self.ws.send(tungstenite::Message::Ping(ws_payload)).await?; // Send new euph ping - let euph_payload = Time::from_timestamp(now); + let euph_payload = Time::new(now); self.last_euph_ping_payload = Some(euph_payload); self.last_euph_ping_replied_to = false; let (tx, _) = oneshot::channel(); @@ -563,7 +557,7 @@ impl Conn { .into_packet()?; debug!(target: "euphoxide::conn::full", "Sending {packet:?}"); - let msg = tungstenite::Message::Text(serde_json::to_string(&packet)?.into()); + let msg = tungstenite::Message::Text(serde_json::to_string(&packet)?); self.ws.send(msg).await?; let _ = reply_tx.send(self.replies.wait_for(id)); @@ -581,7 +575,7 @@ impl Conn { .into_packet()?; debug!(target: "euphoxide::conn::full", "Sending {packet:?}"); - let msg = tungstenite::Message::Text(serde_json::to_string(&packet)?.into()); + let msg = tungstenite::Message::Text(serde_json::to_string(&packet)?); self.ws.send(msg).await?; Ok(()) @@ -619,7 +613,7 @@ impl Conn { human: bool, cookies: Option, timeout: Duration, - ) -> Result<(Self, Vec)> { + ) -> tungstenite::Result<(Self, Vec)> { let human = if human { "?h=1" } else { "" }; let uri = format!("wss://{domain}/room/{room}/ws{human}"); debug!("Connecting to {uri} with cookies: {cookies:?}"); @@ -628,10 +622,7 @@ impl Conn { request.headers_mut().append(header::COOKIE, cookies); } - let (ws, response) = - tokio::time::timeout(timeout, tokio_tungstenite::connect_async(request)) - .await - .map_err(|_| Error::ConnectionTimedOut)??; + let (ws, response) = tokio_tungstenite::connect_async(request).await?; let (mut parts, _) = response.into_parts(); let cookies_set = match parts.headers.entry(header::SET_COOKIE) { header::Entry::Occupied(entry) => entry.remove_entry_mult().1.collect(), diff --git a/src/emoji.json b/src/emoji.json deleted file mode 100644 index b26a1f7..0000000 --- a/src/emoji.json +++ /dev/null @@ -1,3840 +0,0 @@ -{ - "+1": "~plusone", - "-1": "~minusone", - "100": "1f4af", - "1234": "1f522", - "1st_place_medal": "1f947", - "2nd_place_medal": "1f948", - "3rd_place_medal": "1f949", - "8ball": "1f3b1", - "a": "1f170-fe0f", - "ab": "1f18e", - "abacus": "1f9ee", - "abc": "1f524", - "abcd": "1f521", - "accept": "1f251", - "accordion": "1fa97", - "adhesive_bandage": "1fa79", - "adult": "1f9d1", - "aerial_tramway": "1f6a1", - "afghanistan": "1f1e6-1f1eb", - "airplane": "2708-fe0f", - "aland_islands": "1f1e6-1f1fd", - "alarm_clock": "23f0", - "albania": "1f1e6-1f1f1", - "alembic": "2697-fe0f", - "algeria": "1f1e9-1f1ff", - "alien": "1f47d", - "ambulance": "1f691", - "american_samoa": "1f1e6-1f1f8", - "amphora": "1f3fa", - "anatomical_heart": "1fac0", - "anchor": "2693", - "andorra": "1f1e6-1f1e9", - "angel": "1f47c", - "anger": "1f4a2", - "angola": "1f1e6-1f1f4", - "angry": "1f620", - "anguilla": "1f1e6-1f1ee", - "anguished": "1f627", - "ant": "1f41c", - "antarctica": "1f1e6-1f1f6", - "antigua_barbuda": "1f1e6-1f1ec", - "apple": "1f34e", - "aquarius": "2652", - "argentina": "1f1e6-1f1f7", - "aries": "2648", - "armenia": "1f1e6-1f1f2", - "arrow_backward": "25c0-fe0f", - "arrow_double_down": "23ec", - "arrow_double_up": "23eb", - "arrow_down": "2b07-fe0f", - "arrow_down_small": "1f53d", - "arrow_forward": "25b6-fe0f", - "arrow_heading_down": "2935-fe0f", - "arrow_heading_up": "2934-fe0f", - "arrow_left": "2b05-fe0f", - "arrow_lower_left": "2199-fe0f", - "arrow_lower_right": "2198-fe0f", - "arrow_right": "27a1-fe0f", - "arrow_right_hook": "21aa-fe0f", - "arrow_up": "2b06-fe0f", - "arrow_up_down": "2195-fe0f", - "arrow_up_small": "1f53c", - "arrow_upper_left": "2196-fe0f", - "arrow_upper_right": "2197-fe0f", - "arrows_clockwise": "1f503", - "arrows_counterclockwise": "1f504", - "art": "1f3a8", - "articulated_lorry": "1f69b", - "artificial_satellite": "1f6f0-fe0f", - "artist": "1f9d1-200d-1f3a8", - "artist_dark_skin_tone": "1f9d1-1f3ff-200d-1f3a8", - "artist_light_skin_tone": "1f9d1-1f3fb-200d-1f3a8", - "artist_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f3a8", - "artist_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f3a8", - "artist_medium_skin_tone": "1f9d1-1f3fd-200d-1f3a8", - "aruba": "1f1e6-1f1fc", - "ascension_island": "1f1e6-1f1e8", - "asterisk": "2a-fe0f-20e3", - "astonished": "1f632", - "astronaut": "1f9d1-200d-1f680", - "astronaut_dark_skin_tone": "1f9d1-1f3ff-200d-1f680", - "astronaut_light_skin_tone": "1f9d1-1f3fb-200d-1f680", - "astronaut_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f680", - "astronaut_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f680", - "astronaut_medium_skin_tone": "1f9d1-1f3fd-200d-1f680", - "athletic_shoe": "1f45f", - "atm": "1f3e7", - "atom_symbol": "269b-fe0f", - "australia": "1f1e6-1f1fa", - "austria": "1f1e6-1f1f9", - "auto_rickshaw": "1f6fa", - "avocado": "1f951", - "axe": "1fa93", - "azerbaijan": "1f1e6-1f1ff", - "b": "1f171-fe0f", - "baby": "1f476", - "baby_angel_dark_skin_tone": "1f47c-1f3ff", - "baby_angel_light_skin_tone": "1f47c-1f3fb", - "baby_angel_medium-dark_skin_tone": "1f47c-1f3fe", - "baby_angel_medium-light_skin_tone": "1f47c-1f3fc", - "baby_angel_medium_skin_tone": "1f47c-1f3fd", - "baby_bottle": "1f37c", - "baby_chick": "1f424", - "baby_dark_skin_tone": "1f476-1f3ff", - "baby_light_skin_tone": "1f476-1f3fb", - "baby_medium-dark_skin_tone": "1f476-1f3fe", - "baby_medium-light_skin_tone": "1f476-1f3fc", - "baby_medium_skin_tone": "1f476-1f3fd", - "baby_symbol": "1f6bc", - "back": "1f519", - "backhand_index_pointing_down_dark_skin_tone": "1f447-1f3ff", - "backhand_index_pointing_down_light_skin_tone": "1f447-1f3fb", - "backhand_index_pointing_down_medium-dark_skin_tone": "1f447-1f3fe", - "backhand_index_pointing_down_medium-light_skin_tone": "1f447-1f3fc", - "backhand_index_pointing_down_medium_skin_tone": "1f447-1f3fd", - "backhand_index_pointing_left_dark_skin_tone": "1f448-1f3ff", - "backhand_index_pointing_left_light_skin_tone": "1f448-1f3fb", - "backhand_index_pointing_left_medium-dark_skin_tone": "1f448-1f3fe", - "backhand_index_pointing_left_medium-light_skin_tone": "1f448-1f3fc", - "backhand_index_pointing_left_medium_skin_tone": "1f448-1f3fd", - "backhand_index_pointing_right_dark_skin_tone": "1f449-1f3ff", - "backhand_index_pointing_right_light_skin_tone": "1f449-1f3fb", - "backhand_index_pointing_right_medium-dark_skin_tone": "1f449-1f3fe", - "backhand_index_pointing_right_medium-light_skin_tone": "1f449-1f3fc", - "backhand_index_pointing_right_medium_skin_tone": "1f449-1f3fd", - "backhand_index_pointing_up_dark_skin_tone": "1f446-1f3ff", - "backhand_index_pointing_up_light_skin_tone": "1f446-1f3fb", - "backhand_index_pointing_up_medium-dark_skin_tone": "1f446-1f3fe", - "backhand_index_pointing_up_medium-light_skin_tone": "1f446-1f3fc", - "backhand_index_pointing_up_medium_skin_tone": "1f446-1f3fd", - "bacon": "1f953", - "badger": "1f9a1", - "badminton": "1f3f8", - "bagel": "1f96f", - "baggage_claim": "1f6c4", - "baguette_bread": "1f956", - "bahamas": "1f1e7-1f1f8", - "bahrain": "1f1e7-1f1ed", - "balance_scale": "2696-fe0f", - "bald_man": "1f468-200d-1f9b2", - "bald_woman": "1f469-200d-1f9b2", - "ballet_shoes": "1fa70", - "balloon": "1f388", - "ballot_box": "1f5f3-fe0f", - "ballot_box_with_check": "2611-fe0f", - "bamboo": "1f38d", - "banana": "1f34c", - "bangbang": "203c-fe0f", - "bangladesh": "1f1e7-1f1e9", - "banjo": "1fa95", - "bank": "1f3e6", - "bar_chart": "1f4ca", - "barbados": "1f1e7-1f1e7", - "barber": "1f488", - "baseball": "26be", - "basket": "1f9fa", - "basketball": "1f3c0", - "basketball_man": "26f9-fe0f-200d-2642-fe0f", - "basketball_woman": "26f9-fe0f-200d-2640-fe0f", - "bat": "1f987", - "bath": "1f6c0", - "bathtub": "1f6c1", - "battery": "1f50b", - "beach_umbrella": "1f3d6-fe0f", - "beans": "1fad8", - "bear": "1f43b", - "bearded_person": "1f9d4", - "beaver": "1f9ab", - "bed": "1f6cf-fe0f", - "bee": "1f41d", - "beer": "1f37a", - "beers": "1f37b", - "beetle": "1fab2", - "beginner": "1f530", - "belarus": "1f1e7-1f1fe", - "belgium": "1f1e7-1f1ea", - "belize": "1f1e7-1f1ff", - "bell": "1f514", - "bell_pepper": "1fad1", - "bellhop_bell": "1f6ce-fe0f", - "benin": "1f1e7-1f1ef", - "bento": "1f371", - "bermuda": "1f1e7-1f1f2", - "beverage_box": "1f9c3", - "bhutan": "1f1e7-1f1f9", - "bicyclist": "1f6b4", - "bike": "1f6b2", - "biking_man": "1f6b4-200d-2642-fe0f", - "biking_woman": "1f6b4-200d-2640-fe0f", - "bikini": "1f459", - "billed_cap": "1f9e2", - "biohazard": "2623-fe0f", - "bird": "1f426", - "birthday": "1f382", - "bison": "1f9ac", - "biting_lip": "1fae6", - "black_bird": "1f426-200d-2b1b", - "black_cat": "1f408-200d-2b1b", - "black_circle": "26ab", - "black_flag": "1f3f4", - "black_heart": "1f5a4", - "black_joker": "1f0cf", - "black_large_square": "2b1b", - "black_medium_small_square": "25fe", - "black_medium_square": "25fc-fe0f", - "black_nib": "2712-fe0f", - "black_small_square": "25aa-fe0f", - "black_square_button": "1f532", - "blond_haired_man": "1f471-200d-2642-fe0f", - "blond_haired_person": "1f471", - "blond_haired_woman": "1f471-200d-2640-fe0f", - "blonde_woman": "1f471-200d-2640-fe0f", - "blossom": "1f33c", - "blowfish": "1f421", - "blue_book": "1f4d8", - "blue_car": "1f699", - "blue_heart": "1f499", - "blue_square": "1f7e6", - "blueberries": "1fad0", - "blush": "1f60a", - "boar": "1f417", - "boat": "26f5", - "bolivia": "1f1e7-1f1f4", - "bomb": "1f4a3", - "bone": "1f9b4", - "book": "1f4d6", - "bookmark": "1f516", - "bookmark_tabs": "1f4d1", - "books": "1f4da", - "boom": "1f4a5", - "boomerang": "1fa83", - "boot": "1f462", - "bosnia_herzegovina": "1f1e7-1f1e6", - "bot": "~bot", - "botswana": "1f1e7-1f1fc", - "bouncing_ball_man": "26f9-fe0f-200d-2642-fe0f", - "bouncing_ball_person": "26f9-fe0f", - "bouncing_ball_woman": "26f9-fe0f-200d-2640-fe0f", - "bouquet": "1f490", - "bouvet_island": "1f1e7-1f1fb", - "bow": "1f647", - "bow_and_arrow": "1f3f9", - "bowing_man": "1f647-200d-2642-fe0f", - "bowing_woman": "1f647-200d-2640-fe0f", - "bowl_with_spoon": "1f963", - "bowling": "1f3b3", - "boxing_glove": "1f94a", - "boy": "1f466", - "boy_dark_skin_tone": "1f466-1f3ff", - "boy_light_skin_tone": "1f466-1f3fb", - "boy_medium-dark_skin_tone": "1f466-1f3fe", - "boy_medium-light_skin_tone": "1f466-1f3fc", - "boy_medium_skin_tone": "1f466-1f3fd", - "brain": "1f9e0", - "brazil": "1f1e7-1f1f7", - "bread": "1f35e", - "breast-feeding_dark_skin_tone": "1f931-1f3ff", - "breast-feeding_light_skin_tone": "1f931-1f3fb", - "breast-feeding_medium-dark_skin_tone": "1f931-1f3fe", - "breast-feeding_medium-light_skin_tone": "1f931-1f3fc", - "breast-feeding_medium_skin_tone": "1f931-1f3fd", - "breast_feeding": "1f931", - "bricks": "1f9f1", - "bride_with_veil": "1f470-200d-2640-fe0f", - "bridge_at_night": "1f309", - "briefcase": "1f4bc", - "british_indian_ocean_territory": "1f1ee-1f1f4", - "british_virgin_islands": "1f1fb-1f1ec", - "broccoli": "1f966", - "broken_chain": "26d3-fe0f-200d-1f4a5", - "broken_heart": "1f494", - "bronze": "~bronze", - "bronze!?": "~bronze2", - "bronze?!": "~bronze2", - "broom": "1f9f9", - "brown_circle": "1f7e4", - "brown_heart": "1f90e", - "brown_mushroom": "1f344-200d-1f7eb", - "brown_square": "1f7eb", - "brunei": "1f1e7-1f1f3", - "bubble_tea": "1f9cb", - "bubbles": "1fae7", - "bucket": "1faa3", - "bug": "1f41b", - "building_construction": "1f3d7-fe0f", - "bulb": "1f4a1", - "bulgaria": "1f1e7-1f1ec", - "bullettrain_front": "1f685", - "bullettrain_side": "1f684", - "burkina_faso": "1f1e7-1f1eb", - "burrito": "1f32f", - "burundi": "1f1e7-1f1ee", - "bus": "1f68c", - "business_suit_levitating": "1f574-fe0f", - "busstop": "1f68f", - "bust_in_silhouette": "1f464", - "busts_in_silhouette": "1f465", - "butter": "1f9c8", - "butterfly": "1f98b", - "cactus": "1f335", - "cake": "1f370", - "calendar": "1f4c6", - "call_me_hand": "1f919", - "call_me_hand_dark_skin_tone": "1f919-1f3ff", - "call_me_hand_light_skin_tone": "1f919-1f3fb", - "call_me_hand_medium-dark_skin_tone": "1f919-1f3fe", - "call_me_hand_medium-light_skin_tone": "1f919-1f3fc", - "call_me_hand_medium_skin_tone": "1f919-1f3fd", - "calling": "1f4f2", - "cambodia": "1f1f0-1f1ed", - "camel": "1f42b", - "camera": "1f4f7", - "camera_flash": "1f4f8", - "cameroon": "1f1e8-1f1f2", - "camping": "1f3d5-fe0f", - "canada": "1f1e8-1f1e6", - "canary_islands": "1f1ee-1f1e8", - "cancer": "264b", - "candle": "1f56f-fe0f", - "candy": "1f36c", - "canned_food": "1f96b", - "canoe": "1f6f6", - "cape_verde": "1f1e8-1f1fb", - "capital_abcd": "1f520", - "capricorn": "2651", - "car": "1f697", - "card_file_box": "1f5c3-fe0f", - "card_index": "1f4c7", - "card_index_dividers": "1f5c2-fe0f", - "caribbean_netherlands": "1f1e7-1f1f6", - "carousel_horse": "1f3a0", - "carpentry_saw": "1fa9a", - "carrot": "1f955", - "cartwheeling": "1f938", - "cat": "1f431", - "cat2": "1f408", - "cayman_islands": "1f1f0-1f1fe", - "cd": "1f4bf", - "central_african_republic": "1f1e8-1f1eb", - "ceuta_melilla": "1f1ea-1f1e6", - "chad": "1f1f9-1f1e9", - "chains": "26d3-fe0f", - "chair": "1fa91", - "champagne": "1f37e", - "chart": "1f4b9", - "chart_with_downwards_trend": "1f4c9", - "chart_with_upwards_trend": "1f4c8", - "checkered_flag": "1f3c1", - "cheese": "1f9c0", - "cherries": "1f352", - "cherry_blossom": "1f338", - "chess_pawn": "265f-fe0f", - "chestnut": "1f330", - "chicken": "1f414", - "child": "1f9d2", - "child_dark_skin_tone": "1f9d2-1f3ff", - "child_light_skin_tone": "1f9d2-1f3fb", - "child_medium-dark_skin_tone": "1f9d2-1f3fe", - "child_medium-light_skin_tone": "1f9d2-1f3fc", - "child_medium_skin_tone": "1f9d2-1f3fd", - "children_crossing": "1f6b8", - "chile": "1f1e8-1f1f1", - "chipmunk": "1f43f-fe0f", - "chocolate_bar": "1f36b", - "chopsticks": "1f962", - "christmas_island": "1f1e8-1f1fd", - "christmas_tree": "1f384", - "chromakode": "~chromakode", - "church": "26ea", - "cinema": "1f3a6", - "circus_tent": "1f3aa", - "city_sunrise": "1f307", - "city_sunset": "1f306", - "cityscape": "1f3d9-fe0f", - "cl": "1f191", - "clamp": "1f5dc-fe0f", - "clap": "1f44f", - "clapper": "1f3ac", - "clapping_hands_dark_skin_tone": "1f44f-1f3ff", - "clapping_hands_light_skin_tone": "1f44f-1f3fb", - "clapping_hands_medium-dark_skin_tone": "1f44f-1f3fe", - "clapping_hands_medium-light_skin_tone": "1f44f-1f3fc", - "clapping_hands_medium_skin_tone": "1f44f-1f3fd", - "classical_building": "1f3db-fe0f", - "climbing": "1f9d7", - "climbing_man": "1f9d7-200d-2642-fe0f", - "climbing_woman": "1f9d7-200d-2640-fe0f", - "clinking_glasses": "1f942", - "clipboard": "1f4cb", - "clipperton_island": "1f1e8-1f1f5", - "clock1": "1f550", - "clock10": "1f559", - "clock1030": "1f565", - "clock11": "1f55a", - "clock1130": "1f566", - "clock12": "1f55b", - "clock1230": "1f567", - "clock130": "1f55c", - "clock2": "1f551", - "clock230": "1f55d", - "clock3": "1f552", - "clock330": "1f55e", - "clock4": "1f553", - "clock430": "1f55f", - "clock5": "1f554", - "clock530": "1f560", - "clock6": "1f555", - "clock630": "1f561", - "clock7": "1f556", - "clock730": "1f562", - "clock8": "1f557", - "clock830": "1f563", - "clock9": "1f558", - "clock930": "1f564", - "closed_book": "1f4d5", - "closed_lock_with_key": "1f510", - "closed_umbrella": "1f302", - "cloud": "2601-fe0f", - "cloud_with_lightning": "1f329-fe0f", - "cloud_with_lightning_and_rain": "26c8-fe0f", - "cloud_with_rain": "1f327-fe0f", - "cloud_with_snow": "1f328-fe0f", - "clown_face": "1f921", - "clubs": "2663-fe0f", - "cn": "1f1e8-1f1f3", - "coat": "1f9e5", - "cockroach": "1fab3", - "cocktail": "1f378", - "coconut": "1f965", - "cocos_islands": "1f1e8-1f1e8", - "coffee": "2615", - "coffin": "26b0-fe0f", - "coin": "1fa99", - "cold_face": "1f976", - "cold_sweat": "1f630", - "collision": "1f4a5", - "colombia": "1f1e8-1f1f4", - "comet": "2604-fe0f", - "comoros": "1f1f0-1f1f2", - "compass": "1f9ed", - "computer": "1f4bb", - "computer_mouse": "1f5b1-fe0f", - "confetti_ball": "1f38a", - "confounded": "1f616", - "confused": "1f615", - "congo_brazzaville": "1f1e8-1f1ec", - "congo_kinshasa": "1f1e8-1f1e9", - "congratulations": "3297-fe0f", - "construction": "1f6a7", - "construction_worker": "1f477", - "construction_worker_dark_skin_tone": "1f477-1f3ff", - "construction_worker_light_skin_tone": "1f477-1f3fb", - "construction_worker_man": "1f477-200d-2642-fe0f", - "construction_worker_medium-dark_skin_tone": "1f477-1f3fe", - "construction_worker_medium-light_skin_tone": "1f477-1f3fc", - "construction_worker_medium_skin_tone": "1f477-1f3fd", - "construction_worker_woman": "1f477-200d-2640-fe0f", - "control_knobs": "1f39b-fe0f", - "convenience_store": "1f3ea", - "cook": "1f9d1-200d-1f373", - "cook_dark_skin_tone": "1f9d1-1f3ff-200d-1f373", - "cook_islands": "1f1e8-1f1f0", - "cook_light_skin_tone": "1f9d1-1f3fb-200d-1f373", - "cook_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f373", - "cook_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f373", - "cook_medium_skin_tone": "1f9d1-1f3fd-200d-1f373", - "cookie": "1f36a", - "cool": "1f192", - "cop": "1f46e", - "copyright": "a9-fe0f", - "coral": "1fab8", - "corn": "1f33d", - "costa_rica": "1f1e8-1f1f7", - "cote_divoire": "1f1e8-1f1ee", - "couch_and_lamp": "1f6cb-fe0f", - "couple": "1f46b", - "couple_with_heart": "1f491", - "couple_with_heart_dark_skin_tone": "1f491-1f3ff", - "couple_with_heart_light_skin_tone": "1f491-1f3fb", - "couple_with_heart_man_man": "1f468-200d-2764-fe0f-200d-1f468", - "couple_with_heart_man_man_dark_skin_tone": "1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff", - "couple_with_heart_man_man_dark_skin_tone_light_skin_tone": "1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fb", - "couple_with_heart_man_man_dark_skin_tone_medium-dark_skin_tone": "1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fe", - "couple_with_heart_man_man_dark_skin_tone_medium-light_skin_tone": "1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fc", - "couple_with_heart_man_man_dark_skin_tone_medium_skin_tone": "1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fd", - "couple_with_heart_man_man_light_skin_tone": "1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb", - "couple_with_heart_man_man_light_skin_tone_dark_skin_tone": "1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3ff", - "couple_with_heart_man_man_light_skin_tone_medium-dark_skin_tone": "1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fe", - "couple_with_heart_man_man_light_skin_tone_medium-light_skin_tone": "1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fc", - "couple_with_heart_man_man_light_skin_tone_medium_skin_tone": "1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fd", - "couple_with_heart_man_man_medium-dark_skin_tone": "1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe", - "couple_with_heart_man_man_medium-dark_skin_tone_dark_skin_tone": "1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3ff", - "couple_with_heart_man_man_medium-dark_skin_tone_light_skin_tone": "1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fb", - "couple_with_heart_man_man_medium-dark_skin_tone_medium-light_skin_tone": "1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fc", - "couple_with_heart_man_man_medium-dark_skin_tone_medium_skin_tone": "1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fd", - "couple_with_heart_man_man_medium-light_skin_tone": "1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc", - "couple_with_heart_man_man_medium-light_skin_tone_dark_skin_tone": "1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3ff", - "couple_with_heart_man_man_medium-light_skin_tone_light_skin_tone": "1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fb", - "couple_with_heart_man_man_medium-light_skin_tone_medium-dark_skin_tone": "1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fe", - "couple_with_heart_man_man_medium-light_skin_tone_medium_skin_tone": "1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fd", - "couple_with_heart_man_man_medium_skin_tone": "1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd", - "couple_with_heart_man_man_medium_skin_tone_dark_skin_tone": "1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3ff", - "couple_with_heart_man_man_medium_skin_tone_light_skin_tone": "1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fb", - "couple_with_heart_man_man_medium_skin_tone_medium-dark_skin_tone": "1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fe", - "couple_with_heart_man_man_medium_skin_tone_medium-light_skin_tone": "1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fc", - "couple_with_heart_medium-dark_skin_tone": "1f491-1f3fe", - "couple_with_heart_medium-light_skin_tone": "1f491-1f3fc", - "couple_with_heart_medium_skin_tone": "1f491-1f3fd", - "couple_with_heart_person_person_dark_skin_tone_light_skin_tone": "1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fb", - "couple_with_heart_person_person_dark_skin_tone_medium-dark_skin_tone": "1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fe", - "couple_with_heart_person_person_dark_skin_tone_medium-light_skin_tone": "1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fc", - "couple_with_heart_person_person_dark_skin_tone_medium_skin_tone": "1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fd", - "couple_with_heart_person_person_light_skin_tone_dark_skin_tone": "1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3ff", - "couple_with_heart_person_person_light_skin_tone_medium-dark_skin_tone": "1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fe", - "couple_with_heart_person_person_light_skin_tone_medium-light_skin_tone": "1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fc", - "couple_with_heart_person_person_light_skin_tone_medium_skin_tone": "1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fd", - "couple_with_heart_person_person_medium-dark_skin_tone_dark_skin_tone": "1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3ff", - "couple_with_heart_person_person_medium-dark_skin_tone_light_skin_tone": "1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fb", - "couple_with_heart_person_person_medium-dark_skin_tone_medium-light_skin_tone": "1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fc", - "couple_with_heart_person_person_medium-dark_skin_tone_medium_skin_tone": "1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fd", - "couple_with_heart_person_person_medium-light_skin_tone_dark_skin_tone": "1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3ff", - "couple_with_heart_person_person_medium-light_skin_tone_light_skin_tone": "1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fb", - "couple_with_heart_person_person_medium-light_skin_tone_medium-dark_skin_tone": "1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fe", - "couple_with_heart_person_person_medium-light_skin_tone_medium_skin_tone": "1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fd", - "couple_with_heart_person_person_medium_skin_tone_dark_skin_tone": "1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3ff", - "couple_with_heart_person_person_medium_skin_tone_light_skin_tone": "1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fb", - "couple_with_heart_person_person_medium_skin_tone_medium-dark_skin_tone": "1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fe", - "couple_with_heart_person_person_medium_skin_tone_medium-light_skin_tone": "1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fc", - "couple_with_heart_woman_man": "1f469-200d-2764-fe0f-200d-1f468", - "couple_with_heart_woman_man_dark_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff", - "couple_with_heart_woman_man_dark_skin_tone_light_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fb", - "couple_with_heart_woman_man_dark_skin_tone_medium-dark_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fe", - "couple_with_heart_woman_man_dark_skin_tone_medium-light_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fc", - "couple_with_heart_woman_man_dark_skin_tone_medium_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fd", - "couple_with_heart_woman_man_light_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb", - "couple_with_heart_woman_man_light_skin_tone_dark_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3ff", - "couple_with_heart_woman_man_light_skin_tone_medium-dark_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fe", - "couple_with_heart_woman_man_light_skin_tone_medium-light_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fc", - "couple_with_heart_woman_man_light_skin_tone_medium_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fd", - "couple_with_heart_woman_man_medium-dark_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe", - "couple_with_heart_woman_man_medium-dark_skin_tone_dark_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3ff", - "couple_with_heart_woman_man_medium-dark_skin_tone_light_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fb", - "couple_with_heart_woman_man_medium-dark_skin_tone_medium-light_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fc", - "couple_with_heart_woman_man_medium-dark_skin_tone_medium_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fd", - "couple_with_heart_woman_man_medium-light_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc", - "couple_with_heart_woman_man_medium-light_skin_tone_dark_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3ff", - "couple_with_heart_woman_man_medium-light_skin_tone_light_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fb", - "couple_with_heart_woman_man_medium-light_skin_tone_medium-dark_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fe", - "couple_with_heart_woman_man_medium-light_skin_tone_medium_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fd", - "couple_with_heart_woman_man_medium_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd", - "couple_with_heart_woman_man_medium_skin_tone_dark_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3ff", - "couple_with_heart_woman_man_medium_skin_tone_light_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fb", - "couple_with_heart_woman_man_medium_skin_tone_medium-dark_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fe", - "couple_with_heart_woman_man_medium_skin_tone_medium-light_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fc", - "couple_with_heart_woman_woman": "1f469-200d-2764-fe0f-200d-1f469", - "couple_with_heart_woman_woman_dark_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3ff", - "couple_with_heart_woman_woman_dark_skin_tone_light_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fb", - "couple_with_heart_woman_woman_dark_skin_tone_medium-dark_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fe", - "couple_with_heart_woman_woman_dark_skin_tone_medium-light_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fc", - "couple_with_heart_woman_woman_dark_skin_tone_medium_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fd", - "couple_with_heart_woman_woman_light_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fb", - "couple_with_heart_woman_woman_light_skin_tone_dark_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3ff", - "couple_with_heart_woman_woman_light_skin_tone_medium-dark_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fe", - "couple_with_heart_woman_woman_light_skin_tone_medium-light_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fc", - "couple_with_heart_woman_woman_light_skin_tone_medium_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fd", - "couple_with_heart_woman_woman_medium-dark_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fe", - "couple_with_heart_woman_woman_medium-dark_skin_tone_dark_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3ff", - "couple_with_heart_woman_woman_medium-dark_skin_tone_light_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fb", - "couple_with_heart_woman_woman_medium-dark_skin_tone_medium-light_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fc", - "couple_with_heart_woman_woman_medium-dark_skin_tone_medium_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fd", - "couple_with_heart_woman_woman_medium-light_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fc", - "couple_with_heart_woman_woman_medium-light_skin_tone_dark_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3ff", - "couple_with_heart_woman_woman_medium-light_skin_tone_light_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fb", - "couple_with_heart_woman_woman_medium-light_skin_tone_medium-dark_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fe", - "couple_with_heart_woman_woman_medium-light_skin_tone_medium_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fd", - "couple_with_heart_woman_woman_medium_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fd", - "couple_with_heart_woman_woman_medium_skin_tone_dark_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3ff", - "couple_with_heart_woman_woman_medium_skin_tone_light_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fb", - "couple_with_heart_woman_woman_medium_skin_tone_medium-dark_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fe", - "couple_with_heart_woman_woman_medium_skin_tone_medium-light_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fc", - "couplekiss": "1f48f", - "couplekiss_man_man": "1f468-200d-2764-fe0f-200d-1f48b-200d-1f468", - "couplekiss_man_woman": "1f469-200d-2764-fe0f-200d-1f48b-200d-1f468", - "couplekiss_woman_woman": "1f469-200d-2764-fe0f-200d-1f48b-200d-1f469", - "cow": "1f42e", - "cow2": "1f404", - "cowboy": "1f920", - "cowboy_hat_face": "1f920", - "cowgirl": "1f920", - "crab": "1f980", - "crayon": "1f58d-fe0f", - "credit_card": "1f4b3", - "crescent_moon": "1f319", - "cricket": "1f997", - "cricket_game": "1f3cf", - "croatia": "1f1ed-1f1f7", - "crocodile": "1f40a", - "croissant": "1f950", - "crossed_fingers": "1f91e", - "crossed_fingers_dark_skin_tone": "1f91e-1f3ff", - "crossed_fingers_light_skin_tone": "1f91e-1f3fb", - "crossed_fingers_medium-dark_skin_tone": "1f91e-1f3fe", - "crossed_fingers_medium-light_skin_tone": "1f91e-1f3fc", - "crossed_fingers_medium_skin_tone": "1f91e-1f3fd", - "crossed_flags": "1f38c", - "crossed_swords": "2694-fe0f", - "crown": "1f451", - "crutch": "1fa7c", - "cry": "1f622", - "crying_cat_face": "1f63f", - "crystal_ball": "1f52e", - "cuba": "1f1e8-1f1fa", - "cucumber": "1f952", - "cup_with_straw": "1f964", - "cupcake": "1f9c1", - "cupid": "1f498", - "curacao": "1f1e8-1f1fc", - "curling_stone": "1f94c", - "curly_haired_man": "1f468-200d-1f9b1", - "curly_haired_woman": "1f469-200d-1f9b1", - "curly_loop": "27b0", - "currency_exchange": "1f4b1", - "curry": "1f35b", - "cursing_face": "1f92c", - "custard": "1f36e", - "customs": "1f6c3", - "cut_of_meat": "1f969", - "cyclone": "1f300", - "cyprus": "1f1e8-1f1fe", - "czech_republic": "1f1e8-1f1ff", - "dagger": "1f5e1-fe0f", - "dancer": "1f483", - "dancers": "1f46f", - "dancing_men": "1f46f-200d-2642-fe0f", - "dancing_women": "1f46f-200d-2640-fe0f", - "dango": "1f361", - "dark_sunglasses": "1f576-fe0f", - "dart": "1f3af", - "dash": "1f4a8", - "date": "1f4c5", - "de": "1f1e9-1f1ea", - "deaf_man": "1f9cf-200d-2642-fe0f", - "deaf_man_dark_skin_tone": "1f9cf-1f3ff-200d-2642-fe0f", - "deaf_man_light_skin_tone": "1f9cf-1f3fb-200d-2642-fe0f", - "deaf_man_medium-dark_skin_tone": "1f9cf-1f3fe-200d-2642-fe0f", - "deaf_man_medium-light_skin_tone": "1f9cf-1f3fc-200d-2642-fe0f", - "deaf_man_medium_skin_tone": "1f9cf-1f3fd-200d-2642-fe0f", - "deaf_person": "1f9cf", - "deaf_person_dark_skin_tone": "1f9cf-1f3ff", - "deaf_person_light_skin_tone": "1f9cf-1f3fb", - "deaf_person_medium-dark_skin_tone": "1f9cf-1f3fe", - "deaf_person_medium-light_skin_tone": "1f9cf-1f3fc", - "deaf_person_medium_skin_tone": "1f9cf-1f3fd", - "deaf_woman": "1f9cf-200d-2640-fe0f", - "deaf_woman_dark_skin_tone": "1f9cf-1f3ff-200d-2640-fe0f", - "deaf_woman_light_skin_tone": "1f9cf-1f3fb-200d-2640-fe0f", - "deaf_woman_medium-dark_skin_tone": "1f9cf-1f3fe-200d-2640-fe0f", - "deaf_woman_medium-light_skin_tone": "1f9cf-1f3fc-200d-2640-fe0f", - "deaf_woman_medium_skin_tone": "1f9cf-1f3fd-200d-2640-fe0f", - "dealwithit": "~dealwithit", - "deciduous_tree": "1f333", - "deer": "1f98c", - "denmark": "1f1e9-1f1f0", - "department_store": "1f3ec", - "derelict_house": "1f3da-fe0f", - "desert": "1f3dc-fe0f", - "desert_island": "1f3dd-fe0f", - "desktop_computer": "1f5a5-fe0f", - "detective": "1f575-fe0f", - "detective_dark_skin_tone": "1f575-1f3ff", - "detective_light_skin_tone": "1f575-1f3fb", - "detective_medium-dark_skin_tone": "1f575-1f3fe", - "detective_medium-light_skin_tone": "1f575-1f3fc", - "detective_medium_skin_tone": "1f575-1f3fd", - "diamond_shape_with_a_dot_inside": "1f4a0", - "diamonds": "2666-fe0f", - "diego_garcia": "1f1e9-1f1ec", - "disappointed": "1f61e", - "disappointed_relieved": "1f625", - "disguised_face": "1f978", - "diving_mask": "1f93f", - "diya_lamp": "1fa94", - "dizzy": "1f4ab", - "dizzy_face": "1f635", - "djibouti": "1f1e9-1f1ef", - "dna": "1f9ec", - "do_not_litter": "1f6af", - "dodo": "1f9a4", - "dog": "1f436", - "dog2": "1f415", - "dollar": "1f4b5", - "dolls": "1f38e", - "dolphin": "1f42c", - "dominica": "1f1e9-1f1f2", - "dominican_republic": "1f1e9-1f1f4", - "donkey": "1facf", - "door": "1f6aa", - "dotted_line_face": "1fae5", - "doughnut": "1f369", - "dove": "1f54a-fe0f", - "dragon": "1f409", - "dragon_face": "1f432", - "dress": "1f457", - "dromedary_camel": "1f42a", - "drooling_face": "1f924", - "drop_of_blood": "1fa78", - "droplet": "1f4a7", - "drum": "1f941", - "duck": "1f986", - "dumpling": "1f95f", - "dvd": "1f4c0", - "e-mail": "1f4e7", - "eagle": "1f985", - "ear": "1f442", - "ear_dark_skin_tone": "1f442-1f3ff", - "ear_light_skin_tone": "1f442-1f3fb", - "ear_medium-dark_skin_tone": "1f442-1f3fe", - "ear_medium-light_skin_tone": "1f442-1f3fc", - "ear_medium_skin_tone": "1f442-1f3fd", - "ear_of_rice": "1f33e", - "ear_with_hearing_aid": "1f9bb", - "ear_with_hearing_aid_dark_skin_tone": "1f9bb-1f3ff", - "ear_with_hearing_aid_light_skin_tone": "1f9bb-1f3fb", - "ear_with_hearing_aid_medium-dark_skin_tone": "1f9bb-1f3fe", - "ear_with_hearing_aid_medium-light_skin_tone": "1f9bb-1f3fc", - "ear_with_hearing_aid_medium_skin_tone": "1f9bb-1f3fd", - "earth_africa": "1f30d", - "earth_americas": "1f30e", - "earth_asia": "1f30f", - "ecuador": "1f1ea-1f1e8", - "egg": "1f95a", - "eggplant": "1f346", - "egypt": "1f1ea-1f1ec", - "eight": "38-fe0f-20e3", - "eight_pointed_black_star": "2734-fe0f", - "eight_spoked_asterisk": "2733-fe0f", - "eject_button": "23cf-fe0f", - "el_salvador": "1f1f8-1f1fb", - "electric_plug": "1f50c", - "elephant": "1f418", - "elevator": "1f6d7", - "elf": "1f9dd", - "elf_dark_skin_tone": "1f9dd-1f3ff", - "elf_light_skin_tone": "1f9dd-1f3fb", - "elf_man": "1f9dd-200d-2642-fe0f", - "elf_medium-dark_skin_tone": "1f9dd-1f3fe", - "elf_medium-light_skin_tone": "1f9dd-1f3fc", - "elf_medium_skin_tone": "1f9dd-1f3fd", - "elf_woman": "1f9dd-200d-2640-fe0f", - "email": "1f4e7", - "empty_nest": "1fab9", - "end": "1f51a", - "england": "1f3f4-e0067-e0062-e0065-e006e-e0067-e007f", - "envelope": "2709-fe0f", - "envelope_with_arrow": "1f4e9", - "equatorial_guinea": "1f1ec-1f1f6", - "eritrea": "1f1ea-1f1f7", - "es": "1f1ea-1f1f8", - "estonia": "1f1ea-1f1ea", - "ethiopia": "1f1ea-1f1f9", - "eu": "1f1ea-1f1fa", - "euphoria": "~euphoria", - "euphoria!": "~euphoric", - "euro": "1f4b6", - "european_castle": "1f3f0", - "european_post_office": "1f3e4", - "european_union": "1f1ea-1f1fa", - "evergreen_tree": "1f332", - "exclamation": "2757", - "exploding_head": "1f92f", - "expressionless": "1f611", - "eye": "1f441-fe0f", - "eye_speech_bubble": "1f441-fe0f-200d-1f5e8-fe0f", - "eyeglasses": "1f453", - "eyes": "1f440", - "face_exhaling": "1f62e-200d-1f4a8", - "face_holding_back_tears": "1f979", - "face_in_clouds": "1f636-200d-1f32b-fe0f", - "face_with_diagonal_mouth": "1fae4", - "face_with_head_bandage": "1f915", - "face_with_open_eyes_and_hand_over_mouth": "1fae2", - "face_with_peeking_eye": "1fae3", - "face_with_spiral_eyes": "1f635-200d-1f4ab", - "face_with_thermometer": "1f912", - "facepalm": "1f926", - "facepunch": "1f44a", - "factory": "1f3ed", - "factory_worker": "1f9d1-200d-1f3ed", - "factory_worker_dark_skin_tone": "1f9d1-1f3ff-200d-1f3ed", - "factory_worker_light_skin_tone": "1f9d1-1f3fb-200d-1f3ed", - "factory_worker_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f3ed", - "factory_worker_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f3ed", - "factory_worker_medium_skin_tone": "1f9d1-1f3fd-200d-1f3ed", - "fairy": "1f9da", - "fairy_dark_skin_tone": "1f9da-1f3ff", - "fairy_light_skin_tone": "1f9da-1f3fb", - "fairy_man": "1f9da-200d-2642-fe0f", - "fairy_medium-dark_skin_tone": "1f9da-1f3fe", - "fairy_medium-light_skin_tone": "1f9da-1f3fc", - "fairy_medium_skin_tone": "1f9da-1f3fd", - "fairy_woman": "1f9da-200d-2640-fe0f", - "falafel": "1f9c6", - "falkland_islands": "1f1eb-1f1f0", - "fallen_leaf": "1f342", - "family": "1f46a", - "family_adult_adult_child": "1f9d1-200d-1f9d1-200d-1f9d2", - "family_adult_adult_child_child": "1f9d1-200d-1f9d1-200d-1f9d2-200d-1f9d2", - "family_adult_child": "1f9d1-200d-1f9d2", - "family_adult_child_child": "1f9d1-200d-1f9d2-200d-1f9d2", - "family_man_boy": "1f468-200d-1f466", - "family_man_boy_boy": "1f468-200d-1f466-200d-1f466", - "family_man_girl": "1f468-200d-1f467", - "family_man_girl_boy": "1f468-200d-1f467-200d-1f466", - "family_man_girl_girl": "1f468-200d-1f467-200d-1f467", - "family_man_man_boy": "1f468-200d-1f468-200d-1f466", - "family_man_man_boy_boy": "1f468-200d-1f468-200d-1f466-200d-1f466", - "family_man_man_girl": "1f468-200d-1f468-200d-1f467", - "family_man_man_girl_boy": "1f468-200d-1f468-200d-1f467-200d-1f466", - "family_man_man_girl_girl": "1f468-200d-1f468-200d-1f467-200d-1f467", - "family_man_woman_boy": "1f468-200d-1f469-200d-1f466", - "family_man_woman_boy_boy": "1f468-200d-1f469-200d-1f466-200d-1f466", - "family_man_woman_girl": "1f468-200d-1f469-200d-1f467", - "family_man_woman_girl_boy": "1f468-200d-1f469-200d-1f467-200d-1f466", - "family_man_woman_girl_girl": "1f468-200d-1f469-200d-1f467-200d-1f467", - "family_woman_boy": "1f469-200d-1f466", - "family_woman_boy_boy": "1f469-200d-1f466-200d-1f466", - "family_woman_girl": "1f469-200d-1f467", - "family_woman_girl_boy": "1f469-200d-1f467-200d-1f466", - "family_woman_girl_girl": "1f469-200d-1f467-200d-1f467", - "family_woman_woman_boy": "1f469-200d-1f469-200d-1f466", - "family_woman_woman_boy_boy": "1f469-200d-1f469-200d-1f466-200d-1f466", - "family_woman_woman_girl": "1f469-200d-1f469-200d-1f467", - "family_woman_woman_girl_boy": "1f469-200d-1f469-200d-1f467-200d-1f466", - "family_woman_woman_girl_girl": "1f469-200d-1f469-200d-1f467-200d-1f467", - "farmer": "1f9d1-200d-1f33e", - "farmer_dark_skin_tone": "1f9d1-1f3ff-200d-1f33e", - "farmer_light_skin_tone": "1f9d1-1f3fb-200d-1f33e", - "farmer_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f33e", - "farmer_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f33e", - "farmer_medium_skin_tone": "1f9d1-1f3fd-200d-1f33e", - "faroe_islands": "1f1eb-1f1f4", - "fast_forward": "23e9", - "fax": "1f4e0", - "fearful": "1f628", - "feather": "1fab6", - "feet": "1f43e", - "female_detective": "1f575-fe0f-200d-2640-fe0f", - "female_sign": "2640-fe0f", - "ferris_wheel": "1f3a1", - "ferry": "26f4-fe0f", - "field_hockey": "1f3d1", - "fiji": "1f1eb-1f1ef", - "file_cabinet": "1f5c4-fe0f", - "file_folder": "1f4c1", - "film_projector": "1f4fd-fe0f", - "film_strip": "1f39e-fe0f", - "finland": "1f1eb-1f1ee", - "fire": "1f525", - "fire_engine": "1f692", - "fire_extinguisher": "1f9ef", - "firecracker": "1f9e8", - "firefighter": "1f9d1-200d-1f692", - "firefighter_dark_skin_tone": "1f9d1-1f3ff-200d-1f692", - "firefighter_light_skin_tone": "1f9d1-1f3fb-200d-1f692", - "firefighter_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f692", - "firefighter_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f692", - "firefighter_medium_skin_tone": "1f9d1-1f3fd-200d-1f692", - "fireworks": "1f386", - "first_quarter_moon": "1f313", - "first_quarter_moon_with_face": "1f31b", - "fish": "1f41f", - "fish_cake": "1f365", - "fishing_pole_and_fish": "1f3a3", - "fist": "270a", - "fist_left": "1f91b", - "fist_oncoming": "1f44a", - "fist_raised": "270a", - "fist_right": "1f91c", - "five": "35-fe0f-20e3", - "fjafjkldskf7jkfdj": "1f577-fe0f", - "flags": "1f38f", - "flamingo": "1f9a9", - "flashlight": "1f526", - "flat_shoe": "1f97f", - "flatbread": "1fad3", - "fleur_de_lis": "269c-fe0f", - "flexed_biceps_dark_skin_tone": "1f4aa-1f3ff", - "flexed_biceps_light_skin_tone": "1f4aa-1f3fb", - "flexed_biceps_medium-dark_skin_tone": "1f4aa-1f3fe", - "flexed_biceps_medium-light_skin_tone": "1f4aa-1f3fc", - "flexed_biceps_medium_skin_tone": "1f4aa-1f3fd", - "flight_arrival": "1f6ec", - "flight_departure": "1f6eb", - "flipper": "1f42c", - "floppy_disk": "1f4be", - "flower_playing_cards": "1f3b4", - "flushed": "1f633", - "flute": "1fa88", - "fly": "1fab0", - "flying_disc": "1f94f", - "flying_saucer": "1f6f8", - "fog": "1f32b-fe0f", - "foggy": "1f301", - "folded_hands_dark_skin_tone": "1f64f-1f3ff", - "folded_hands_light_skin_tone": "1f64f-1f3fb", - "folded_hands_medium-dark_skin_tone": "1f64f-1f3fe", - "folded_hands_medium-light_skin_tone": "1f64f-1f3fc", - "folded_hands_medium_skin_tone": "1f64f-1f3fd", - "folding_hand_fan": "1faad", - "fondue": "1fad5", - "foot": "1f9b6", - "foot_dark_skin_tone": "1f9b6-1f3ff", - "foot_light_skin_tone": "1f9b6-1f3fb", - "foot_medium-dark_skin_tone": "1f9b6-1f3fe", - "foot_medium-light_skin_tone": "1f9b6-1f3fc", - "foot_medium_skin_tone": "1f9b6-1f3fd", - "football": "1f3c8", - "footprints": "1f463", - "fork_and_knife": "1f374", - "fortune_cookie": "1f960", - "fountain": "26f2", - "fountain_pen": "1f58b-fe0f", - "four": "34-fe0f-20e3", - "four_leaf_clover": "1f340", - "fox_face": "1f98a", - "fr": "1f1eb-1f1f7", - "framed_picture": "1f5bc-fe0f", - "free": "1f193", - "french_guiana": "1f1ec-1f1eb", - "french_polynesia": "1f1f5-1f1eb", - "french_southern_territories": "1f1f9-1f1eb", - "fried_egg": "1f373", - "fried_shrimp": "1f364", - "fries": "1f35f", - "frog": "1f438", - "frowning": "1f626", - "frowning_face": "2639-fe0f", - "frowning_man": "1f64d-200d-2642-fe0f", - "frowning_person": "1f64d", - "frowning_woman": "1f64d-200d-2640-fe0f", - "fu": "1f595", - "fuelpump": "26fd", - "full_moon": "1f315", - "full_moon_with_face": "1f31d", - "funeral_urn": "26b1-fe0f", - "gabon": "1f1ec-1f1e6", - "gambia": "1f1ec-1f1f2", - "game_die": "1f3b2", - "garlic": "1f9c4", - "gb": "1f1ec-1f1e7", - "gear": "2699-fe0f", - "gem": "1f48e", - "gemini": "264a", - "genie": "1f9de", - "genie_man": "1f9de-200d-2642-fe0f", - "genie_woman": "1f9de-200d-2640-fe0f", - "georgia": "1f1ec-1f1ea", - "ghana": "1f1ec-1f1ed", - "ghost": "1f47b", - "ghoti": "1f41f", - "gibraltar": "1f1ec-1f1ee", - "gift": "1f381", - "gift_heart": "1f49d", - "ginger_root": "1fada", - "giraffe": "1f992", - "girl": "1f467", - "girl_dark_skin_tone": "1f467-1f3ff", - "girl_light_skin_tone": "1f467-1f3fb", - "girl_medium-dark_skin_tone": "1f467-1f3fe", - "girl_medium-light_skin_tone": "1f467-1f3fc", - "girl_medium_skin_tone": "1f467-1f3fd", - "globe_with_meridians": "1f310", - "gloves": "1f9e4", - "goal_net": "1f945", - "goat": "1f410", - "goggles": "1f97d", - "golf": "26f3", - "golfing": "1f3cc-fe0f", - "golfing_man": "1f3cc-fe0f-200d-2642-fe0f", - "golfing_woman": "1f3cc-fe0f-200d-2640-fe0f", - "goose": "1fabf", - "gorilla": "1f98d", - "grapes": "1f347", - "greece": "1f1ec-1f1f7", - "green_apple": "1f34f", - "green_book": "1f4d7", - "green_circle": "1f7e2", - "green_heart": "1f49a", - "green_salad": "1f957", - "green_square": "1f7e9", - "greenduck": "~greenduck", - "greenland": "1f1ec-1f1f1", - "grenada": "1f1ec-1f1e9", - "grey_exclamation": "2755", - "grey_heart": "1fa76", - "grey_question": "2754", - "grimacing": "1f62c", - "grin": "1f601", - "grinning": "1f600", - "guadeloupe": "1f1ec-1f1f5", - "guam": "1f1ec-1f1fa", - "guard": "1f482", - "guard_dark_skin_tone": "1f482-1f3ff", - "guard_light_skin_tone": "1f482-1f3fb", - "guard_medium-dark_skin_tone": "1f482-1f3fe", - "guard_medium-light_skin_tone": "1f482-1f3fc", - "guard_medium_skin_tone": "1f482-1f3fd", - "guardsman": "1f482-200d-2642-fe0f", - "guardswoman": "1f482-200d-2640-fe0f", - "guatemala": "1f1ec-1f1f9", - "guernsey": "1f1ec-1f1ec", - "guide_dog": "1f9ae", - "guinea": "1f1ec-1f1f3", - "guinea_bissau": "1f1ec-1f1fc", - "guitar": "1f3b8", - "gun": "1f52b", - "guyana": "1f1ec-1f1fe", - "hair_pick": "1faae", - "haircut": "1f487", - "haircut_man": "1f487-200d-2642-fe0f", - "haircut_woman": "1f487-200d-2640-fe0f", - "haiti": "1f1ed-1f1f9", - "hamburger": "1f354", - "hammer": "1f528", - "hammer_and_pick": "2692-fe0f", - "hammer_and_wrench": "1f6e0-fe0f", - "hamsa": "1faac", - "hamster": "1f439", - "hand": "270b", - "hand_over_mouth": "1f92d", - "hand_with_fingers_splayed_dark_skin_tone": "1f590-1f3ff", - "hand_with_fingers_splayed_light_skin_tone": "1f590-1f3fb", - "hand_with_fingers_splayed_medium-dark_skin_tone": "1f590-1f3fe", - "hand_with_fingers_splayed_medium-light_skin_tone": "1f590-1f3fc", - "hand_with_fingers_splayed_medium_skin_tone": "1f590-1f3fd", - "hand_with_index_finger_and_thumb_crossed": "1faf0", - "hand_with_index_finger_and_thumb_crossed_dark_skin_tone": "1faf0-1f3ff", - "hand_with_index_finger_and_thumb_crossed_light_skin_tone": "1faf0-1f3fb", - "hand_with_index_finger_and_thumb_crossed_medium-dark_skin_tone": "1faf0-1f3fe", - "hand_with_index_finger_and_thumb_crossed_medium-light_skin_tone": "1faf0-1f3fc", - "hand_with_index_finger_and_thumb_crossed_medium_skin_tone": "1faf0-1f3fd", - "handbag": "1f45c", - "handball_person": "1f93e", - "handshake": "1f91d", - "handshake_dark_skin_tone": "1f91d-1f3ff", - "handshake_dark_skin_tone_light_skin_tone": "1faf1-1f3ff-200d-1faf2-1f3fb", - "handshake_dark_skin_tone_medium-dark_skin_tone": "1faf1-1f3ff-200d-1faf2-1f3fe", - "handshake_dark_skin_tone_medium-light_skin_tone": "1faf1-1f3ff-200d-1faf2-1f3fc", - "handshake_dark_skin_tone_medium_skin_tone": "1faf1-1f3ff-200d-1faf2-1f3fd", - "handshake_light_skin_tone": "1f91d-1f3fb", - "handshake_light_skin_tone_dark_skin_tone": "1faf1-1f3fb-200d-1faf2-1f3ff", - "handshake_light_skin_tone_medium-dark_skin_tone": "1faf1-1f3fb-200d-1faf2-1f3fe", - "handshake_light_skin_tone_medium-light_skin_tone": "1faf1-1f3fb-200d-1faf2-1f3fc", - "handshake_light_skin_tone_medium_skin_tone": "1faf1-1f3fb-200d-1faf2-1f3fd", - "handshake_medium-dark_skin_tone": "1f91d-1f3fe", - "handshake_medium-dark_skin_tone_dark_skin_tone": "1faf1-1f3fe-200d-1faf2-1f3ff", - "handshake_medium-dark_skin_tone_light_skin_tone": "1faf1-1f3fe-200d-1faf2-1f3fb", - "handshake_medium-dark_skin_tone_medium-light_skin_tone": "1faf1-1f3fe-200d-1faf2-1f3fc", - "handshake_medium-dark_skin_tone_medium_skin_tone": "1faf1-1f3fe-200d-1faf2-1f3fd", - "handshake_medium-light_skin_tone": "1f91d-1f3fc", - "handshake_medium-light_skin_tone_dark_skin_tone": "1faf1-1f3fc-200d-1faf2-1f3ff", - "handshake_medium-light_skin_tone_light_skin_tone": "1faf1-1f3fc-200d-1faf2-1f3fb", - "handshake_medium-light_skin_tone_medium-dark_skin_tone": "1faf1-1f3fc-200d-1faf2-1f3fe", - "handshake_medium-light_skin_tone_medium_skin_tone": "1faf1-1f3fc-200d-1faf2-1f3fd", - "handshake_medium_skin_tone": "1f91d-1f3fd", - "handshake_medium_skin_tone_dark_skin_tone": "1faf1-1f3fd-200d-1faf2-1f3ff", - "handshake_medium_skin_tone_light_skin_tone": "1faf1-1f3fd-200d-1faf2-1f3fb", - "handshake_medium_skin_tone_medium-dark_skin_tone": "1faf1-1f3fd-200d-1faf2-1f3fe", - "handshake_medium_skin_tone_medium-light_skin_tone": "1faf1-1f3fd-200d-1faf2-1f3fc", - "hankey": "1f4a9", - "happy": "1f604", - "hash": "23-fe0f-20e3", - "hatched_chick": "1f425", - "hatching_chick": "1f423", - "head_shaking_horizontally": "1f642-200d-2194-fe0f", - "head_shaking_vertically": "1f642-200d-2195-fe0f", - "headphones": "1f3a7", - "headstone": "1faa6", - "health_worker": "1f9d1-200d-2695-fe0f", - "health_worker_dark_skin_tone": "1f9d1-1f3ff-200d-2695-fe0f", - "health_worker_light_skin_tone": "1f9d1-1f3fb-200d-2695-fe0f", - "health_worker_medium-dark_skin_tone": "1f9d1-1f3fe-200d-2695-fe0f", - "health_worker_medium-light_skin_tone": "1f9d1-1f3fc-200d-2695-fe0f", - "health_worker_medium_skin_tone": "1f9d1-1f3fd-200d-2695-fe0f", - "hear_no_evil": "1f649", - "heard_mcdonald_islands": "1f1ed-1f1f2", - "heart": "2764-fe0f", - "heart_decoration": "1f49f", - "heart_eyes": "1f60d", - "heart_eyes_cat": "1f63b", - "heart_hands": "1faf6", - "heart_hands_dark_skin_tone": "1faf6-1f3ff", - "heart_hands_light_skin_tone": "1faf6-1f3fb", - "heart_hands_medium-dark_skin_tone": "1faf6-1f3fe", - "heart_hands_medium-light_skin_tone": "1faf6-1f3fc", - "heart_hands_medium_skin_tone": "1faf6-1f3fd", - "heart_on_fire": "2764-fe0f-200d-1f525", - "heartbeat": "1f493", - "heartpulse": "1f497", - "hearts": "2665-fe0f", - "heavy_check_mark": "2714-fe0f", - "heavy_division_sign": "2797", - "heavy_dollar_sign": "1f4b2", - "heavy_equals_sign": "1f7f0", - "heavy_exclamation_mark": "2757", - "heavy_heart_exclamation": "2763-fe0f", - "heavy_minus_sign": "2796", - "heavy_multiplication_x": "2716-fe0f", - "heavy_plus_sign": "2795", - "hedgehog": "1f994", - "helicopter": "1f681", - "herb": "1f33f", - "hibiscus": "1f33a", - "high_brightness": "1f506", - "high_heel": "1f460", - "hiking_boot": "1f97e", - "hindu_temple": "1f6d5", - "hippopotamus": "1f99b", - "hocho": "1f52a", - "hole": "1f573-fe0f", - "honduras": "1f1ed-1f1f3", - "honey_pot": "1f36f", - "honeybee": "1f41d", - "hong_kong": "1f1ed-1f1f0", - "hook": "1fa9d", - "horse": "1f434", - "horse_racing": "1f3c7", - "horse_racing_dark_skin_tone": "1f3c7-1f3ff", - "horse_racing_light_skin_tone": "1f3c7-1f3fb", - "horse_racing_medium-dark_skin_tone": "1f3c7-1f3fe", - "horse_racing_medium-light_skin_tone": "1f3c7-1f3fc", - "horse_racing_medium_skin_tone": "1f3c7-1f3fd", - "hospital": "1f3e5", - "hot_face": "1f975", - "hot_pepper": "1f336-fe0f", - "hotdog": "1f32d", - "hotel": "1f3e8", - "hotsprings": "2668-fe0f", - "hourglass": "231b", - "hourglass_flowing_sand": "23f3", - "house": "1f3e0", - "house_with_garden": "1f3e1", - "houses": "1f3d8-fe0f", - "hugs": "1f917", - "hungary": "1f1ed-1f1fa", - "hushed": "1f62f", - "hut": "1f6d6", - "hyacinth": "1fabb", - "ice_cream": "1f368", - "ice_cube": "1f9ca", - "ice_hockey": "1f3d2", - "ice_skate": "26f8-fe0f", - "icecream": "1f366", - "iceland": "1f1ee-1f1f8", - "id": "1f194", - "identification_card": "1faaa", - "ideograph_advantage": "1f250", - "imp": "1f47f", - "inbox_tray": "1f4e5", - "incoming_envelope": "1f4e8", - "index_pointing_at_the_viewer": "1faf5", - "index_pointing_at_the_viewer_dark_skin_tone": "1faf5-1f3ff", - "index_pointing_at_the_viewer_light_skin_tone": "1faf5-1f3fb", - "index_pointing_at_the_viewer_medium-dark_skin_tone": "1faf5-1f3fe", - "index_pointing_at_the_viewer_medium-light_skin_tone": "1faf5-1f3fc", - "index_pointing_at_the_viewer_medium_skin_tone": "1faf5-1f3fd", - "index_pointing_up_dark_skin_tone": "261d-1f3ff", - "index_pointing_up_light_skin_tone": "261d-1f3fb", - "index_pointing_up_medium-dark_skin_tone": "261d-1f3fe", - "index_pointing_up_medium-light_skin_tone": "261d-1f3fc", - "index_pointing_up_medium_skin_tone": "261d-1f3fd", - "india": "1f1ee-1f1f3", - "indonesia": "1f1ee-1f1e9", - "infinity": "267e-fe0f", - "information_desk_person": "1f481", - "information_source": "2139-fe0f", - "innocent": "1f607", - "interrobang": "2049-fe0f", - "iran": "1f1ee-1f1f7", - "iraq": "1f1ee-1f1f6", - "ireland": "1f1ee-1f1ea", - "isle_of_man": "1f1ee-1f1f2", - "israel": "1f1ee-1f1f1", - "it": "1f1ee-1f1f9", - "izakaya_lantern": "1f3ee", - "jack_o_lantern": "1f383", - "jamaica": "1f1ef-1f1f2", - "japan": "1f5fe", - "japanese_castle": "1f3ef", - "japanese_goblin": "1f47a", - "japanese_ogre": "1f479", - "jar": "1fad9", - "jeans": "1f456", - "jellyfish": "1fabc", - "jersey": "1f1ef-1f1ea", - "jigsaw": "1f9e9", - "jordan": "1f1ef-1f1f4", - "joy": "1f602", - "joy_cat": "1f639", - "joystick": "1f579-fe0f", - "jp": "1f1ef-1f1f5", - "judge": "1f9d1-200d-2696-fe0f", - "judge_dark_skin_tone": "1f9d1-1f3ff-200d-2696-fe0f", - "judge_light_skin_tone": "1f9d1-1f3fb-200d-2696-fe0f", - "judge_medium-dark_skin_tone": "1f9d1-1f3fe-200d-2696-fe0f", - "judge_medium-light_skin_tone": "1f9d1-1f3fc-200d-2696-fe0f", - "judge_medium_skin_tone": "1f9d1-1f3fd-200d-2696-fe0f", - "juggling_person": "1f939", - "kaaba": "1f54b", - "kangaroo": "1f998", - "kazakhstan": "1f1f0-1f1ff", - "kenya": "1f1f0-1f1ea", - "key": "1f511", - "keyboard": "2328-fe0f", - "keycap_ten": "1f51f", - "khanda": "1faaf", - "kick_scooter": "1f6f4", - "kimono": "1f458", - "kiribati": "1f1f0-1f1ee", - "kiss": "1f48b", - "kiss_dark_skin_tone": "1f48f-1f3ff", - "kiss_light_skin_tone": "1f48f-1f3fb", - "kiss_man_man_dark_skin_tone": "1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", - "kiss_man_man_dark_skin_tone_light_skin_tone": "1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", - "kiss_man_man_dark_skin_tone_medium-dark_skin_tone": "1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", - "kiss_man_man_dark_skin_tone_medium-light_skin_tone": "1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", - "kiss_man_man_dark_skin_tone_medium_skin_tone": "1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", - "kiss_man_man_light_skin_tone": "1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", - "kiss_man_man_light_skin_tone_dark_skin_tone": "1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", - "kiss_man_man_light_skin_tone_medium-dark_skin_tone": "1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", - "kiss_man_man_light_skin_tone_medium-light_skin_tone": "1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", - "kiss_man_man_light_skin_tone_medium_skin_tone": "1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", - "kiss_man_man_medium-dark_skin_tone": "1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", - "kiss_man_man_medium-dark_skin_tone_dark_skin_tone": "1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", - "kiss_man_man_medium-dark_skin_tone_light_skin_tone": "1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", - "kiss_man_man_medium-dark_skin_tone_medium-light_skin_tone": "1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", - "kiss_man_man_medium-dark_skin_tone_medium_skin_tone": "1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", - "kiss_man_man_medium-light_skin_tone": "1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", - "kiss_man_man_medium-light_skin_tone_dark_skin_tone": "1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", - "kiss_man_man_medium-light_skin_tone_light_skin_tone": "1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", - "kiss_man_man_medium-light_skin_tone_medium-dark_skin_tone": "1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", - "kiss_man_man_medium-light_skin_tone_medium_skin_tone": "1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", - "kiss_man_man_medium_skin_tone": "1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", - "kiss_man_man_medium_skin_tone_dark_skin_tone": "1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", - "kiss_man_man_medium_skin_tone_light_skin_tone": "1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", - "kiss_man_man_medium_skin_tone_medium-dark_skin_tone": "1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", - "kiss_man_man_medium_skin_tone_medium-light_skin_tone": "1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", - "kiss_medium-dark_skin_tone": "1f48f-1f3fe", - "kiss_medium-light_skin_tone": "1f48f-1f3fc", - "kiss_medium_skin_tone": "1f48f-1f3fd", - "kiss_person_person_dark_skin_tone_light_skin_tone": "1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb", - "kiss_person_person_dark_skin_tone_medium-dark_skin_tone": "1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe", - "kiss_person_person_dark_skin_tone_medium-light_skin_tone": "1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc", - "kiss_person_person_dark_skin_tone_medium_skin_tone": "1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd", - "kiss_person_person_light_skin_tone_dark_skin_tone": "1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff", - "kiss_person_person_light_skin_tone_medium-dark_skin_tone": "1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe", - "kiss_person_person_light_skin_tone_medium-light_skin_tone": "1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc", - "kiss_person_person_light_skin_tone_medium_skin_tone": "1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd", - "kiss_person_person_medium-dark_skin_tone_dark_skin_tone": "1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff", - "kiss_person_person_medium-dark_skin_tone_light_skin_tone": "1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb", - "kiss_person_person_medium-dark_skin_tone_medium-light_skin_tone": "1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc", - "kiss_person_person_medium-dark_skin_tone_medium_skin_tone": "1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd", - "kiss_person_person_medium-light_skin_tone_dark_skin_tone": "1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff", - "kiss_person_person_medium-light_skin_tone_light_skin_tone": "1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb", - "kiss_person_person_medium-light_skin_tone_medium-dark_skin_tone": "1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe", - "kiss_person_person_medium-light_skin_tone_medium_skin_tone": "1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd", - "kiss_person_person_medium_skin_tone_dark_skin_tone": "1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff", - "kiss_person_person_medium_skin_tone_light_skin_tone": "1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb", - "kiss_person_person_medium_skin_tone_medium-dark_skin_tone": "1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe", - "kiss_person_person_medium_skin_tone_medium-light_skin_tone": "1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc", - "kiss_woman_man_dark_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", - "kiss_woman_man_dark_skin_tone_light_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", - "kiss_woman_man_dark_skin_tone_medium-dark_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", - "kiss_woman_man_dark_skin_tone_medium-light_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", - "kiss_woman_man_dark_skin_tone_medium_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", - "kiss_woman_man_light_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", - "kiss_woman_man_light_skin_tone_dark_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", - "kiss_woman_man_light_skin_tone_medium-dark_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", - "kiss_woman_man_light_skin_tone_medium-light_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", - "kiss_woman_man_light_skin_tone_medium_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", - "kiss_woman_man_medium-dark_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", - "kiss_woman_man_medium-dark_skin_tone_dark_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", - "kiss_woman_man_medium-dark_skin_tone_light_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", - "kiss_woman_man_medium-dark_skin_tone_medium-light_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", - "kiss_woman_man_medium-dark_skin_tone_medium_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", - "kiss_woman_man_medium-light_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", - "kiss_woman_man_medium-light_skin_tone_dark_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", - "kiss_woman_man_medium-light_skin_tone_light_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", - "kiss_woman_man_medium-light_skin_tone_medium-dark_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", - "kiss_woman_man_medium-light_skin_tone_medium_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", - "kiss_woman_man_medium_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", - "kiss_woman_man_medium_skin_tone_dark_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", - "kiss_woman_man_medium_skin_tone_light_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", - "kiss_woman_man_medium_skin_tone_medium-dark_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", - "kiss_woman_man_medium_skin_tone_medium-light_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", - "kiss_woman_woman_dark_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff", - "kiss_woman_woman_dark_skin_tone_light_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb", - "kiss_woman_woman_dark_skin_tone_medium-dark_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe", - "kiss_woman_woman_dark_skin_tone_medium-light_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc", - "kiss_woman_woman_dark_skin_tone_medium_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd", - "kiss_woman_woman_light_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb", - "kiss_woman_woman_light_skin_tone_dark_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff", - "kiss_woman_woman_light_skin_tone_medium-dark_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe", - "kiss_woman_woman_light_skin_tone_medium-light_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc", - "kiss_woman_woman_light_skin_tone_medium_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd", - "kiss_woman_woman_medium-dark_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe", - "kiss_woman_woman_medium-dark_skin_tone_dark_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff", - "kiss_woman_woman_medium-dark_skin_tone_light_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb", - "kiss_woman_woman_medium-dark_skin_tone_medium-light_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc", - "kiss_woman_woman_medium-dark_skin_tone_medium_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd", - "kiss_woman_woman_medium-light_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc", - "kiss_woman_woman_medium-light_skin_tone_dark_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff", - "kiss_woman_woman_medium-light_skin_tone_light_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb", - "kiss_woman_woman_medium-light_skin_tone_medium-dark_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe", - "kiss_woman_woman_medium-light_skin_tone_medium_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd", - "kiss_woman_woman_medium_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd", - "kiss_woman_woman_medium_skin_tone_dark_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff", - "kiss_woman_woman_medium_skin_tone_light_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb", - "kiss_woman_woman_medium_skin_tone_medium-dark_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe", - "kiss_woman_woman_medium_skin_tone_medium-light_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc", - "kissing": "1f617", - "kissing_cat": "1f63d", - "kissing_closed_eyes": "1f61a", - "kissing_heart": "1f618", - "kissing_smiling_eyes": "1f619", - "kite": "1fa81", - "kiwi_fruit": "1f95d", - "kneeling_man": "1f9ce-200d-2642-fe0f", - "kneeling_person": "1f9ce", - "kneeling_woman": "1f9ce-200d-2640-fe0f", - "knife": "1f52a", - "knot": "1faa2", - "koala": "1f428", - "koko": "1f201", - "kosovo": "1f1fd-1f1f0", - "kr": "1f1f0-1f1f7", - "kuwait": "1f1f0-1f1fc", - "kyrgyzstan": "1f1f0-1f1ec", - "lab_coat": "1f97c", - "label": "1f3f7-fe0f", - "lacrosse": "1f94d", - "ladder": "1fa9c", - "lady_beetle": "1f41e", - "lantern": "1f3ee", - "laos": "1f1f1-1f1e6", - "large_blue_circle": "1f535", - "large_blue_diamond": "1f537", - "large_orange_diamond": "1f536", - "last_quarter_moon": "1f317", - "last_quarter_moon_with_face": "1f31c", - "latin_cross": "271d-fe0f", - "latvia": "1f1f1-1f1fb", - "laughing": "1f606", - "leafy_green": "1f96c", - "leaves": "1f343", - "lebanon": "1f1f1-1f1e7", - "leck": "~leck", - "ledger": "1f4d2", - "left-facing_fist_dark_skin_tone": "1f91b-1f3ff", - "left-facing_fist_light_skin_tone": "1f91b-1f3fb", - "left-facing_fist_medium-dark_skin_tone": "1f91b-1f3fe", - "left-facing_fist_medium-light_skin_tone": "1f91b-1f3fc", - "left-facing_fist_medium_skin_tone": "1f91b-1f3fd", - "left_luggage": "1f6c5", - "left_right_arrow": "2194-fe0f", - "left_speech_bubble": "1f5e8-fe0f", - "leftwards_arrow_with_hook": "21a9-fe0f", - "leftwards_hand": "1faf2", - "leftwards_hand_dark_skin_tone": "1faf2-1f3ff", - "leftwards_hand_light_skin_tone": "1faf2-1f3fb", - "leftwards_hand_medium-dark_skin_tone": "1faf2-1f3fe", - "leftwards_hand_medium-light_skin_tone": "1faf2-1f3fc", - "leftwards_hand_medium_skin_tone": "1faf2-1f3fd", - "leftwards_pushing_hand": "1faf7", - "leftwards_pushing_hand_dark_skin_tone": "1faf7-1f3ff", - "leftwards_pushing_hand_light_skin_tone": "1faf7-1f3fb", - "leftwards_pushing_hand_medium-dark_skin_tone": "1faf7-1f3fe", - "leftwards_pushing_hand_medium-light_skin_tone": "1faf7-1f3fc", - "leftwards_pushing_hand_medium_skin_tone": "1faf7-1f3fd", - "leg": "1f9b5", - "leg_dark_skin_tone": "1f9b5-1f3ff", - "leg_light_skin_tone": "1f9b5-1f3fb", - "leg_medium-dark_skin_tone": "1f9b5-1f3fe", - "leg_medium-light_skin_tone": "1f9b5-1f3fc", - "leg_medium_skin_tone": "1f9b5-1f3fd", - "lemon": "1f34b", - "leo": "264c", - "leopard": "1f406", - "lesotho": "1f1f1-1f1f8", - "level_slider": "1f39a-fe0f", - "liberia": "1f1f1-1f1f7", - "libra": "264e", - "libya": "1f1f1-1f1fe", - "liechtenstein": "1f1f1-1f1ee", - "light_blue_heart": "1fa75", - "light_rail": "1f688", - "lime": "1f34b-200d-1f7e9", - "link": "1f517", - "lion": "1f981", - "lips": "1f444", - "lipstick": "1f484", - "lithuania": "1f1f1-1f1f9", - "lizard": "1f98e", - "llama": "1f999", - "lobster": "1f99e", - "lock": "1f512", - "lock_with_ink_pen": "1f50f", - "lollipop": "1f36d", - "long_drum": "1fa98", - "loop": "27bf", - "lotion_bottle": "1f9f4", - "lotus": "1fab7", - "lotus_position": "1f9d8", - "lotus_position_man": "1f9d8-200d-2642-fe0f", - "lotus_position_woman": "1f9d8-200d-2640-fe0f", - "loud_sound": "1f50a", - "loudspeaker": "1f4e2", - "love-you_gesture_dark_skin_tone": "1f91f-1f3ff", - "love-you_gesture_light_skin_tone": "1f91f-1f3fb", - "love-you_gesture_medium-dark_skin_tone": "1f91f-1f3fe", - "love-you_gesture_medium-light_skin_tone": "1f91f-1f3fc", - "love-you_gesture_medium_skin_tone": "1f91f-1f3fd", - "love_hotel": "1f3e9", - "love_letter": "1f48c", - "love_you_gesture": "1f91f", - "low_battery": "1faab", - "low_brightness": "1f505", - "luggage": "1f9f3", - "lungs": "1fac1", - "luxembourg": "1f1f1-1f1fa", - "lying_face": "1f925", - "m": "24c2-fe0f", - "macau": "1f1f2-1f1f4", - "macedonia": "1f1f2-1f1f0", - "madagascar": "1f1f2-1f1ec", - "mag": "1f50d", - "mag_right": "1f50e", - "mage": "1f9d9", - "mage_dark_skin_tone": "1f9d9-1f3ff", - "mage_light_skin_tone": "1f9d9-1f3fb", - "mage_man": "1f9d9-200d-2642-fe0f", - "mage_medium-dark_skin_tone": "1f9d9-1f3fe", - "mage_medium-light_skin_tone": "1f9d9-1f3fc", - "mage_medium_skin_tone": "1f9d9-1f3fd", - "mage_woman": "1f9d9-200d-2640-fe0f", - "magic_wand": "1fa84", - "magnet": "1f9f2", - "mahjong": "1f004", - "mailbox": "1f4eb", - "mailbox_closed": "1f4ea", - "mailbox_with_mail": "1f4ec", - "mailbox_with_no_mail": "1f4ed", - "malawi": "1f1f2-1f1fc", - "malaysia": "1f1f2-1f1fe", - "maldives": "1f1f2-1f1fb", - "male_detective": "1f575-fe0f-200d-2642-fe0f", - "male_sign": "2642-fe0f", - "mali": "1f1f2-1f1f1", - "malta": "1f1f2-1f1f9", - "mammoth": "1f9a3", - "man": "1f468", - "man_artist": "1f468-200d-1f3a8", - "man_artist_dark_skin_tone": "1f468-1f3ff-200d-1f3a8", - "man_artist_light_skin_tone": "1f468-1f3fb-200d-1f3a8", - "man_artist_medium-dark_skin_tone": "1f468-1f3fe-200d-1f3a8", - "man_artist_medium-light_skin_tone": "1f468-1f3fc-200d-1f3a8", - "man_artist_medium_skin_tone": "1f468-1f3fd-200d-1f3a8", - "man_astronaut": "1f468-200d-1f680", - "man_astronaut_dark_skin_tone": "1f468-1f3ff-200d-1f680", - "man_astronaut_light_skin_tone": "1f468-1f3fb-200d-1f680", - "man_astronaut_medium-dark_skin_tone": "1f468-1f3fe-200d-1f680", - "man_astronaut_medium-light_skin_tone": "1f468-1f3fc-200d-1f680", - "man_astronaut_medium_skin_tone": "1f468-1f3fd-200d-1f680", - "man_beard": "1f9d4-200d-2642-fe0f", - "man_biking_dark_skin_tone": "1f6b4-1f3ff-200d-2642-fe0f", - "man_biking_light_skin_tone": "1f6b4-1f3fb-200d-2642-fe0f", - "man_biking_medium-dark_skin_tone": "1f6b4-1f3fe-200d-2642-fe0f", - "man_biking_medium-light_skin_tone": "1f6b4-1f3fc-200d-2642-fe0f", - "man_biking_medium_skin_tone": "1f6b4-1f3fd-200d-2642-fe0f", - "man_bouncing_ball_dark_skin_tone": "26f9-1f3ff-200d-2642-fe0f", - "man_bouncing_ball_light_skin_tone": "26f9-1f3fb-200d-2642-fe0f", - "man_bouncing_ball_medium-dark_skin_tone": "26f9-1f3fe-200d-2642-fe0f", - "man_bouncing_ball_medium-light_skin_tone": "26f9-1f3fc-200d-2642-fe0f", - "man_bouncing_ball_medium_skin_tone": "26f9-1f3fd-200d-2642-fe0f", - "man_bowing_dark_skin_tone": "1f647-1f3ff-200d-2642-fe0f", - "man_bowing_light_skin_tone": "1f647-1f3fb-200d-2642-fe0f", - "man_bowing_medium-dark_skin_tone": "1f647-1f3fe-200d-2642-fe0f", - "man_bowing_medium-light_skin_tone": "1f647-1f3fc-200d-2642-fe0f", - "man_bowing_medium_skin_tone": "1f647-1f3fd-200d-2642-fe0f", - "man_cartwheeling": "1f938-200d-2642-fe0f", - "man_cartwheeling_dark_skin_tone": "1f938-1f3ff-200d-2642-fe0f", - "man_cartwheeling_light_skin_tone": "1f938-1f3fb-200d-2642-fe0f", - "man_cartwheeling_medium-dark_skin_tone": "1f938-1f3fe-200d-2642-fe0f", - "man_cartwheeling_medium-light_skin_tone": "1f938-1f3fc-200d-2642-fe0f", - "man_cartwheeling_medium_skin_tone": "1f938-1f3fd-200d-2642-fe0f", - "man_climbing_dark_skin_tone": "1f9d7-1f3ff-200d-2642-fe0f", - "man_climbing_light_skin_tone": "1f9d7-1f3fb-200d-2642-fe0f", - "man_climbing_medium-dark_skin_tone": "1f9d7-1f3fe-200d-2642-fe0f", - "man_climbing_medium-light_skin_tone": "1f9d7-1f3fc-200d-2642-fe0f", - "man_climbing_medium_skin_tone": "1f9d7-1f3fd-200d-2642-fe0f", - "man_construction_worker_dark_skin_tone": "1f477-1f3ff-200d-2642-fe0f", - "man_construction_worker_light_skin_tone": "1f477-1f3fb-200d-2642-fe0f", - "man_construction_worker_medium-dark_skin_tone": "1f477-1f3fe-200d-2642-fe0f", - "man_construction_worker_medium-light_skin_tone": "1f477-1f3fc-200d-2642-fe0f", - "man_construction_worker_medium_skin_tone": "1f477-1f3fd-200d-2642-fe0f", - "man_cook": "1f468-200d-1f373", - "man_cook_dark_skin_tone": "1f468-1f3ff-200d-1f373", - "man_cook_light_skin_tone": "1f468-1f3fb-200d-1f373", - "man_cook_medium-dark_skin_tone": "1f468-1f3fe-200d-1f373", - "man_cook_medium-light_skin_tone": "1f468-1f3fc-200d-1f373", - "man_cook_medium_skin_tone": "1f468-1f3fd-200d-1f373", - "man_dancing": "1f57a", - "man_dancing_dark_skin_tone": "1f57a-1f3ff", - "man_dancing_light_skin_tone": "1f57a-1f3fb", - "man_dancing_medium-dark_skin_tone": "1f57a-1f3fe", - "man_dancing_medium-light_skin_tone": "1f57a-1f3fc", - "man_dancing_medium_skin_tone": "1f57a-1f3fd", - "man_dark_skin_tone": "1f468-1f3ff", - "man_dark_skin_tone_bald": "1f468-1f3ff-200d-1f9b2", - "man_dark_skin_tone_beard": "1f9d4-1f3ff-200d-2642-fe0f", - "man_dark_skin_tone_blond_hair": "1f471-1f3ff-200d-2642-fe0f", - "man_dark_skin_tone_curly_hair": "1f468-1f3ff-200d-1f9b1", - "man_dark_skin_tone_red_hair": "1f468-1f3ff-200d-1f9b0", - "man_dark_skin_tone_white_hair": "1f468-1f3ff-200d-1f9b3", - "man_detective_dark_skin_tone": "1f575-1f3ff-200d-2642-fe0f", - "man_detective_light_skin_tone": "1f575-1f3fb-200d-2642-fe0f", - "man_detective_medium-dark_skin_tone": "1f575-1f3fe-200d-2642-fe0f", - "man_detective_medium-light_skin_tone": "1f575-1f3fc-200d-2642-fe0f", - "man_detective_medium_skin_tone": "1f575-1f3fd-200d-2642-fe0f", - "man_elf_dark_skin_tone": "1f9dd-1f3ff-200d-2642-fe0f", - "man_elf_light_skin_tone": "1f9dd-1f3fb-200d-2642-fe0f", - "man_elf_medium-dark_skin_tone": "1f9dd-1f3fe-200d-2642-fe0f", - "man_elf_medium-light_skin_tone": "1f9dd-1f3fc-200d-2642-fe0f", - "man_elf_medium_skin_tone": "1f9dd-1f3fd-200d-2642-fe0f", - "man_facepalming": "1f926-200d-2642-fe0f", - "man_facepalming_dark_skin_tone": "1f926-1f3ff-200d-2642-fe0f", - "man_facepalming_light_skin_tone": "1f926-1f3fb-200d-2642-fe0f", - "man_facepalming_medium-dark_skin_tone": "1f926-1f3fe-200d-2642-fe0f", - "man_facepalming_medium-light_skin_tone": "1f926-1f3fc-200d-2642-fe0f", - "man_facepalming_medium_skin_tone": "1f926-1f3fd-200d-2642-fe0f", - "man_factory_worker": "1f468-200d-1f3ed", - "man_factory_worker_dark_skin_tone": "1f468-1f3ff-200d-1f3ed", - "man_factory_worker_light_skin_tone": "1f468-1f3fb-200d-1f3ed", - "man_factory_worker_medium-dark_skin_tone": "1f468-1f3fe-200d-1f3ed", - "man_factory_worker_medium-light_skin_tone": "1f468-1f3fc-200d-1f3ed", - "man_factory_worker_medium_skin_tone": "1f468-1f3fd-200d-1f3ed", - "man_fairy_dark_skin_tone": "1f9da-1f3ff-200d-2642-fe0f", - "man_fairy_light_skin_tone": "1f9da-1f3fb-200d-2642-fe0f", - "man_fairy_medium-dark_skin_tone": "1f9da-1f3fe-200d-2642-fe0f", - "man_fairy_medium-light_skin_tone": "1f9da-1f3fc-200d-2642-fe0f", - "man_fairy_medium_skin_tone": "1f9da-1f3fd-200d-2642-fe0f", - "man_farmer": "1f468-200d-1f33e", - "man_farmer_dark_skin_tone": "1f468-1f3ff-200d-1f33e", - "man_farmer_light_skin_tone": "1f468-1f3fb-200d-1f33e", - "man_farmer_medium-dark_skin_tone": "1f468-1f3fe-200d-1f33e", - "man_farmer_medium-light_skin_tone": "1f468-1f3fc-200d-1f33e", - "man_farmer_medium_skin_tone": "1f468-1f3fd-200d-1f33e", - "man_feeding_baby": "1f468-200d-1f37c", - "man_feeding_baby_dark_skin_tone": "1f468-1f3ff-200d-1f37c", - "man_feeding_baby_light_skin_tone": "1f468-1f3fb-200d-1f37c", - "man_feeding_baby_medium-dark_skin_tone": "1f468-1f3fe-200d-1f37c", - "man_feeding_baby_medium-light_skin_tone": "1f468-1f3fc-200d-1f37c", - "man_feeding_baby_medium_skin_tone": "1f468-1f3fd-200d-1f37c", - "man_firefighter": "1f468-200d-1f692", - "man_firefighter_dark_skin_tone": "1f468-1f3ff-200d-1f692", - "man_firefighter_light_skin_tone": "1f468-1f3fb-200d-1f692", - "man_firefighter_medium-dark_skin_tone": "1f468-1f3fe-200d-1f692", - "man_firefighter_medium-light_skin_tone": "1f468-1f3fc-200d-1f692", - "man_firefighter_medium_skin_tone": "1f468-1f3fd-200d-1f692", - "man_frowning_dark_skin_tone": "1f64d-1f3ff-200d-2642-fe0f", - "man_frowning_light_skin_tone": "1f64d-1f3fb-200d-2642-fe0f", - "man_frowning_medium-dark_skin_tone": "1f64d-1f3fe-200d-2642-fe0f", - "man_frowning_medium-light_skin_tone": "1f64d-1f3fc-200d-2642-fe0f", - "man_frowning_medium_skin_tone": "1f64d-1f3fd-200d-2642-fe0f", - "man_gesturing_no_dark_skin_tone": "1f645-1f3ff-200d-2642-fe0f", - "man_gesturing_no_light_skin_tone": "1f645-1f3fb-200d-2642-fe0f", - "man_gesturing_no_medium-dark_skin_tone": "1f645-1f3fe-200d-2642-fe0f", - "man_gesturing_no_medium-light_skin_tone": "1f645-1f3fc-200d-2642-fe0f", - "man_gesturing_no_medium_skin_tone": "1f645-1f3fd-200d-2642-fe0f", - "man_gesturing_ok_dark_skin_tone": "1f646-1f3ff-200d-2642-fe0f", - "man_gesturing_ok_light_skin_tone": "1f646-1f3fb-200d-2642-fe0f", - "man_gesturing_ok_medium-dark_skin_tone": "1f646-1f3fe-200d-2642-fe0f", - "man_gesturing_ok_medium-light_skin_tone": "1f646-1f3fc-200d-2642-fe0f", - "man_gesturing_ok_medium_skin_tone": "1f646-1f3fd-200d-2642-fe0f", - "man_getting_haircut_dark_skin_tone": "1f487-1f3ff-200d-2642-fe0f", - "man_getting_haircut_light_skin_tone": "1f487-1f3fb-200d-2642-fe0f", - "man_getting_haircut_medium-dark_skin_tone": "1f487-1f3fe-200d-2642-fe0f", - "man_getting_haircut_medium-light_skin_tone": "1f487-1f3fc-200d-2642-fe0f", - "man_getting_haircut_medium_skin_tone": "1f487-1f3fd-200d-2642-fe0f", - "man_getting_massage_dark_skin_tone": "1f486-1f3ff-200d-2642-fe0f", - "man_getting_massage_light_skin_tone": "1f486-1f3fb-200d-2642-fe0f", - "man_getting_massage_medium-dark_skin_tone": "1f486-1f3fe-200d-2642-fe0f", - "man_getting_massage_medium-light_skin_tone": "1f486-1f3fc-200d-2642-fe0f", - "man_getting_massage_medium_skin_tone": "1f486-1f3fd-200d-2642-fe0f", - "man_golfing_dark_skin_tone": "1f3cc-1f3ff-200d-2642-fe0f", - "man_golfing_light_skin_tone": "1f3cc-1f3fb-200d-2642-fe0f", - "man_golfing_medium-dark_skin_tone": "1f3cc-1f3fe-200d-2642-fe0f", - "man_golfing_medium-light_skin_tone": "1f3cc-1f3fc-200d-2642-fe0f", - "man_golfing_medium_skin_tone": "1f3cc-1f3fd-200d-2642-fe0f", - "man_guard_dark_skin_tone": "1f482-1f3ff-200d-2642-fe0f", - "man_guard_light_skin_tone": "1f482-1f3fb-200d-2642-fe0f", - "man_guard_medium-dark_skin_tone": "1f482-1f3fe-200d-2642-fe0f", - "man_guard_medium-light_skin_tone": "1f482-1f3fc-200d-2642-fe0f", - "man_guard_medium_skin_tone": "1f482-1f3fd-200d-2642-fe0f", - "man_health_worker": "1f468-200d-2695-fe0f", - "man_health_worker_dark_skin_tone": "1f468-1f3ff-200d-2695-fe0f", - "man_health_worker_light_skin_tone": "1f468-1f3fb-200d-2695-fe0f", - "man_health_worker_medium-dark_skin_tone": "1f468-1f3fe-200d-2695-fe0f", - "man_health_worker_medium-light_skin_tone": "1f468-1f3fc-200d-2695-fe0f", - "man_health_worker_medium_skin_tone": "1f468-1f3fd-200d-2695-fe0f", - "man_in_lotus_position_dark_skin_tone": "1f9d8-1f3ff-200d-2642-fe0f", - "man_in_lotus_position_light_skin_tone": "1f9d8-1f3fb-200d-2642-fe0f", - "man_in_lotus_position_medium-dark_skin_tone": "1f9d8-1f3fe-200d-2642-fe0f", - "man_in_lotus_position_medium-light_skin_tone": "1f9d8-1f3fc-200d-2642-fe0f", - "man_in_lotus_position_medium_skin_tone": "1f9d8-1f3fd-200d-2642-fe0f", - "man_in_manual_wheelchair": "1f468-200d-1f9bd", - "man_in_manual_wheelchair_dark_skin_tone": "1f468-1f3ff-200d-1f9bd", - "man_in_manual_wheelchair_facing_right": "1f468-200d-1f9bd-200d-27a1-fe0f", - "man_in_manual_wheelchair_facing_right_dark_skin_tone": "1f468-1f3ff-200d-1f9bd-200d-27a1-fe0f", - "man_in_manual_wheelchair_facing_right_light_skin_tone": "1f468-1f3fb-200d-1f9bd-200d-27a1-fe0f", - "man_in_manual_wheelchair_facing_right_medium-dark_skin_tone": "1f468-1f3fe-200d-1f9bd-200d-27a1-fe0f", - "man_in_manual_wheelchair_facing_right_medium-light_skin_tone": "1f468-1f3fc-200d-1f9bd-200d-27a1-fe0f", - "man_in_manual_wheelchair_facing_right_medium_skin_tone": "1f468-1f3fd-200d-1f9bd-200d-27a1-fe0f", - "man_in_manual_wheelchair_light_skin_tone": "1f468-1f3fb-200d-1f9bd", - "man_in_manual_wheelchair_medium-dark_skin_tone": "1f468-1f3fe-200d-1f9bd", - "man_in_manual_wheelchair_medium-light_skin_tone": "1f468-1f3fc-200d-1f9bd", - "man_in_manual_wheelchair_medium_skin_tone": "1f468-1f3fd-200d-1f9bd", - "man_in_motorized_wheelchair": "1f468-200d-1f9bc", - "man_in_motorized_wheelchair_dark_skin_tone": "1f468-1f3ff-200d-1f9bc", - "man_in_motorized_wheelchair_facing_right": "1f468-200d-1f9bc-200d-27a1-fe0f", - "man_in_motorized_wheelchair_facing_right_dark_skin_tone": "1f468-1f3ff-200d-1f9bc-200d-27a1-fe0f", - "man_in_motorized_wheelchair_facing_right_light_skin_tone": "1f468-1f3fb-200d-1f9bc-200d-27a1-fe0f", - "man_in_motorized_wheelchair_facing_right_medium-dark_skin_tone": "1f468-1f3fe-200d-1f9bc-200d-27a1-fe0f", - "man_in_motorized_wheelchair_facing_right_medium-light_skin_tone": "1f468-1f3fc-200d-1f9bc-200d-27a1-fe0f", - "man_in_motorized_wheelchair_facing_right_medium_skin_tone": "1f468-1f3fd-200d-1f9bc-200d-27a1-fe0f", - "man_in_motorized_wheelchair_light_skin_tone": "1f468-1f3fb-200d-1f9bc", - "man_in_motorized_wheelchair_medium-dark_skin_tone": "1f468-1f3fe-200d-1f9bc", - "man_in_motorized_wheelchair_medium-light_skin_tone": "1f468-1f3fc-200d-1f9bc", - "man_in_motorized_wheelchair_medium_skin_tone": "1f468-1f3fd-200d-1f9bc", - "man_in_steamy_room_dark_skin_tone": "1f9d6-1f3ff-200d-2642-fe0f", - "man_in_steamy_room_light_skin_tone": "1f9d6-1f3fb-200d-2642-fe0f", - "man_in_steamy_room_medium-dark_skin_tone": "1f9d6-1f3fe-200d-2642-fe0f", - "man_in_steamy_room_medium-light_skin_tone": "1f9d6-1f3fc-200d-2642-fe0f", - "man_in_steamy_room_medium_skin_tone": "1f9d6-1f3fd-200d-2642-fe0f", - "man_in_tuxedo": "1f935-200d-2642-fe0f", - "man_in_tuxedo_dark_skin_tone": "1f935-1f3ff-200d-2642-fe0f", - "man_in_tuxedo_light_skin_tone": "1f935-1f3fb-200d-2642-fe0f", - "man_in_tuxedo_medium-dark_skin_tone": "1f935-1f3fe-200d-2642-fe0f", - "man_in_tuxedo_medium-light_skin_tone": "1f935-1f3fc-200d-2642-fe0f", - "man_in_tuxedo_medium_skin_tone": "1f935-1f3fd-200d-2642-fe0f", - "man_judge": "1f468-200d-2696-fe0f", - "man_judge_dark_skin_tone": "1f468-1f3ff-200d-2696-fe0f", - "man_judge_light_skin_tone": "1f468-1f3fb-200d-2696-fe0f", - "man_judge_medium-dark_skin_tone": "1f468-1f3fe-200d-2696-fe0f", - "man_judge_medium-light_skin_tone": "1f468-1f3fc-200d-2696-fe0f", - "man_judge_medium_skin_tone": "1f468-1f3fd-200d-2696-fe0f", - "man_juggling": "1f939-200d-2642-fe0f", - "man_juggling_dark_skin_tone": "1f939-1f3ff-200d-2642-fe0f", - "man_juggling_light_skin_tone": "1f939-1f3fb-200d-2642-fe0f", - "man_juggling_medium-dark_skin_tone": "1f939-1f3fe-200d-2642-fe0f", - "man_juggling_medium-light_skin_tone": "1f939-1f3fc-200d-2642-fe0f", - "man_juggling_medium_skin_tone": "1f939-1f3fd-200d-2642-fe0f", - "man_kneeling_dark_skin_tone": "1f9ce-1f3ff-200d-2642-fe0f", - "man_kneeling_facing_right": "1f9ce-200d-2642-fe0f-200d-27a1-fe0f", - "man_kneeling_facing_right_dark_skin_tone": "1f9ce-1f3ff-200d-2642-fe0f-200d-27a1-fe0f", - "man_kneeling_facing_right_light_skin_tone": "1f9ce-1f3fb-200d-2642-fe0f-200d-27a1-fe0f", - "man_kneeling_facing_right_medium-dark_skin_tone": "1f9ce-1f3fe-200d-2642-fe0f-200d-27a1-fe0f", - "man_kneeling_facing_right_medium-light_skin_tone": "1f9ce-1f3fc-200d-2642-fe0f-200d-27a1-fe0f", - "man_kneeling_facing_right_medium_skin_tone": "1f9ce-1f3fd-200d-2642-fe0f-200d-27a1-fe0f", - "man_kneeling_light_skin_tone": "1f9ce-1f3fb-200d-2642-fe0f", - "man_kneeling_medium-dark_skin_tone": "1f9ce-1f3fe-200d-2642-fe0f", - "man_kneeling_medium-light_skin_tone": "1f9ce-1f3fc-200d-2642-fe0f", - "man_kneeling_medium_skin_tone": "1f9ce-1f3fd-200d-2642-fe0f", - "man_lifting_weights_dark_skin_tone": "1f3cb-1f3ff-200d-2642-fe0f", - "man_lifting_weights_light_skin_tone": "1f3cb-1f3fb-200d-2642-fe0f", - "man_lifting_weights_medium-dark_skin_tone": "1f3cb-1f3fe-200d-2642-fe0f", - "man_lifting_weights_medium-light_skin_tone": "1f3cb-1f3fc-200d-2642-fe0f", - "man_lifting_weights_medium_skin_tone": "1f3cb-1f3fd-200d-2642-fe0f", - "man_light_skin_tone": "1f468-1f3fb", - "man_light_skin_tone_bald": "1f468-1f3fb-200d-1f9b2", - "man_light_skin_tone_beard": "1f9d4-1f3fb-200d-2642-fe0f", - "man_light_skin_tone_blond_hair": "1f471-1f3fb-200d-2642-fe0f", - "man_light_skin_tone_curly_hair": "1f468-1f3fb-200d-1f9b1", - "man_light_skin_tone_red_hair": "1f468-1f3fb-200d-1f9b0", - "man_light_skin_tone_white_hair": "1f468-1f3fb-200d-1f9b3", - "man_mage_dark_skin_tone": "1f9d9-1f3ff-200d-2642-fe0f", - "man_mage_light_skin_tone": "1f9d9-1f3fb-200d-2642-fe0f", - "man_mage_medium-dark_skin_tone": "1f9d9-1f3fe-200d-2642-fe0f", - "man_mage_medium-light_skin_tone": "1f9d9-1f3fc-200d-2642-fe0f", - "man_mage_medium_skin_tone": "1f9d9-1f3fd-200d-2642-fe0f", - "man_mechanic": "1f468-200d-1f527", - "man_mechanic_dark_skin_tone": "1f468-1f3ff-200d-1f527", - "man_mechanic_light_skin_tone": "1f468-1f3fb-200d-1f527", - "man_mechanic_medium-dark_skin_tone": "1f468-1f3fe-200d-1f527", - "man_mechanic_medium-light_skin_tone": "1f468-1f3fc-200d-1f527", - "man_mechanic_medium_skin_tone": "1f468-1f3fd-200d-1f527", - "man_medium-dark_skin_tone": "1f468-1f3fe", - "man_medium-dark_skin_tone_bald": "1f468-1f3fe-200d-1f9b2", - "man_medium-dark_skin_tone_beard": "1f9d4-1f3fe-200d-2642-fe0f", - "man_medium-dark_skin_tone_blond_hair": "1f471-1f3fe-200d-2642-fe0f", - "man_medium-dark_skin_tone_curly_hair": "1f468-1f3fe-200d-1f9b1", - "man_medium-dark_skin_tone_red_hair": "1f468-1f3fe-200d-1f9b0", - "man_medium-dark_skin_tone_white_hair": "1f468-1f3fe-200d-1f9b3", - "man_medium-light_skin_tone": "1f468-1f3fc", - "man_medium-light_skin_tone_bald": "1f468-1f3fc-200d-1f9b2", - "man_medium-light_skin_tone_beard": "1f9d4-1f3fc-200d-2642-fe0f", - "man_medium-light_skin_tone_blond_hair": "1f471-1f3fc-200d-2642-fe0f", - "man_medium-light_skin_tone_curly_hair": "1f468-1f3fc-200d-1f9b1", - "man_medium-light_skin_tone_red_hair": "1f468-1f3fc-200d-1f9b0", - "man_medium-light_skin_tone_white_hair": "1f468-1f3fc-200d-1f9b3", - "man_medium_skin_tone": "1f468-1f3fd", - "man_medium_skin_tone_bald": "1f468-1f3fd-200d-1f9b2", - "man_medium_skin_tone_beard": "1f9d4-1f3fd-200d-2642-fe0f", - "man_medium_skin_tone_blond_hair": "1f471-1f3fd-200d-2642-fe0f", - "man_medium_skin_tone_curly_hair": "1f468-1f3fd-200d-1f9b1", - "man_medium_skin_tone_red_hair": "1f468-1f3fd-200d-1f9b0", - "man_medium_skin_tone_white_hair": "1f468-1f3fd-200d-1f9b3", - "man_mountain_biking_dark_skin_tone": "1f6b5-1f3ff-200d-2642-fe0f", - "man_mountain_biking_light_skin_tone": "1f6b5-1f3fb-200d-2642-fe0f", - "man_mountain_biking_medium-dark_skin_tone": "1f6b5-1f3fe-200d-2642-fe0f", - "man_mountain_biking_medium-light_skin_tone": "1f6b5-1f3fc-200d-2642-fe0f", - "man_mountain_biking_medium_skin_tone": "1f6b5-1f3fd-200d-2642-fe0f", - "man_office_worker": "1f468-200d-1f4bc", - "man_office_worker_dark_skin_tone": "1f468-1f3ff-200d-1f4bc", - "man_office_worker_light_skin_tone": "1f468-1f3fb-200d-1f4bc", - "man_office_worker_medium-dark_skin_tone": "1f468-1f3fe-200d-1f4bc", - "man_office_worker_medium-light_skin_tone": "1f468-1f3fc-200d-1f4bc", - "man_office_worker_medium_skin_tone": "1f468-1f3fd-200d-1f4bc", - "man_pilot": "1f468-200d-2708-fe0f", - "man_pilot_dark_skin_tone": "1f468-1f3ff-200d-2708-fe0f", - "man_pilot_light_skin_tone": "1f468-1f3fb-200d-2708-fe0f", - "man_pilot_medium-dark_skin_tone": "1f468-1f3fe-200d-2708-fe0f", - "man_pilot_medium-light_skin_tone": "1f468-1f3fc-200d-2708-fe0f", - "man_pilot_medium_skin_tone": "1f468-1f3fd-200d-2708-fe0f", - "man_playing_handball": "1f93e-200d-2642-fe0f", - "man_playing_handball_dark_skin_tone": "1f93e-1f3ff-200d-2642-fe0f", - "man_playing_handball_light_skin_tone": "1f93e-1f3fb-200d-2642-fe0f", - "man_playing_handball_medium-dark_skin_tone": "1f93e-1f3fe-200d-2642-fe0f", - "man_playing_handball_medium-light_skin_tone": "1f93e-1f3fc-200d-2642-fe0f", - "man_playing_handball_medium_skin_tone": "1f93e-1f3fd-200d-2642-fe0f", - "man_playing_water_polo": "1f93d-200d-2642-fe0f", - "man_playing_water_polo_dark_skin_tone": "1f93d-1f3ff-200d-2642-fe0f", - "man_playing_water_polo_light_skin_tone": "1f93d-1f3fb-200d-2642-fe0f", - "man_playing_water_polo_medium-dark_skin_tone": "1f93d-1f3fe-200d-2642-fe0f", - "man_playing_water_polo_medium-light_skin_tone": "1f93d-1f3fc-200d-2642-fe0f", - "man_playing_water_polo_medium_skin_tone": "1f93d-1f3fd-200d-2642-fe0f", - "man_police_officer_dark_skin_tone": "1f46e-1f3ff-200d-2642-fe0f", - "man_police_officer_light_skin_tone": "1f46e-1f3fb-200d-2642-fe0f", - "man_police_officer_medium-dark_skin_tone": "1f46e-1f3fe-200d-2642-fe0f", - "man_police_officer_medium-light_skin_tone": "1f46e-1f3fc-200d-2642-fe0f", - "man_police_officer_medium_skin_tone": "1f46e-1f3fd-200d-2642-fe0f", - "man_pouting_dark_skin_tone": "1f64e-1f3ff-200d-2642-fe0f", - "man_pouting_light_skin_tone": "1f64e-1f3fb-200d-2642-fe0f", - "man_pouting_medium-dark_skin_tone": "1f64e-1f3fe-200d-2642-fe0f", - "man_pouting_medium-light_skin_tone": "1f64e-1f3fc-200d-2642-fe0f", - "man_pouting_medium_skin_tone": "1f64e-1f3fd-200d-2642-fe0f", - "man_raising_hand_dark_skin_tone": "1f64b-1f3ff-200d-2642-fe0f", - "man_raising_hand_light_skin_tone": "1f64b-1f3fb-200d-2642-fe0f", - "man_raising_hand_medium-dark_skin_tone": "1f64b-1f3fe-200d-2642-fe0f", - "man_raising_hand_medium-light_skin_tone": "1f64b-1f3fc-200d-2642-fe0f", - "man_raising_hand_medium_skin_tone": "1f64b-1f3fd-200d-2642-fe0f", - "man_rowing_boat_dark_skin_tone": "1f6a3-1f3ff-200d-2642-fe0f", - "man_rowing_boat_light_skin_tone": "1f6a3-1f3fb-200d-2642-fe0f", - "man_rowing_boat_medium-dark_skin_tone": "1f6a3-1f3fe-200d-2642-fe0f", - "man_rowing_boat_medium-light_skin_tone": "1f6a3-1f3fc-200d-2642-fe0f", - "man_rowing_boat_medium_skin_tone": "1f6a3-1f3fd-200d-2642-fe0f", - "man_running_dark_skin_tone": "1f3c3-1f3ff-200d-2642-fe0f", - "man_running_facing_right": "1f3c3-200d-2642-fe0f-200d-27a1-fe0f", - "man_running_facing_right_dark_skin_tone": "1f3c3-1f3ff-200d-2642-fe0f-200d-27a1-fe0f", - "man_running_facing_right_light_skin_tone": "1f3c3-1f3fb-200d-2642-fe0f-200d-27a1-fe0f", - "man_running_facing_right_medium-dark_skin_tone": "1f3c3-1f3fe-200d-2642-fe0f-200d-27a1-fe0f", - "man_running_facing_right_medium-light_skin_tone": "1f3c3-1f3fc-200d-2642-fe0f-200d-27a1-fe0f", - "man_running_facing_right_medium_skin_tone": "1f3c3-1f3fd-200d-2642-fe0f-200d-27a1-fe0f", - "man_running_light_skin_tone": "1f3c3-1f3fb-200d-2642-fe0f", - "man_running_medium-dark_skin_tone": "1f3c3-1f3fe-200d-2642-fe0f", - "man_running_medium-light_skin_tone": "1f3c3-1f3fc-200d-2642-fe0f", - "man_running_medium_skin_tone": "1f3c3-1f3fd-200d-2642-fe0f", - "man_scientist": "1f468-200d-1f52c", - "man_scientist_dark_skin_tone": "1f468-1f3ff-200d-1f52c", - "man_scientist_light_skin_tone": "1f468-1f3fb-200d-1f52c", - "man_scientist_medium-dark_skin_tone": "1f468-1f3fe-200d-1f52c", - "man_scientist_medium-light_skin_tone": "1f468-1f3fc-200d-1f52c", - "man_scientist_medium_skin_tone": "1f468-1f3fd-200d-1f52c", - "man_shrugging": "1f937-200d-2642-fe0f", - "man_shrugging_dark_skin_tone": "1f937-1f3ff-200d-2642-fe0f", - "man_shrugging_light_skin_tone": "1f937-1f3fb-200d-2642-fe0f", - "man_shrugging_medium-dark_skin_tone": "1f937-1f3fe-200d-2642-fe0f", - "man_shrugging_medium-light_skin_tone": "1f937-1f3fc-200d-2642-fe0f", - "man_shrugging_medium_skin_tone": "1f937-1f3fd-200d-2642-fe0f", - "man_singer": "1f468-200d-1f3a4", - "man_singer_dark_skin_tone": "1f468-1f3ff-200d-1f3a4", - "man_singer_light_skin_tone": "1f468-1f3fb-200d-1f3a4", - "man_singer_medium-dark_skin_tone": "1f468-1f3fe-200d-1f3a4", - "man_singer_medium-light_skin_tone": "1f468-1f3fc-200d-1f3a4", - "man_singer_medium_skin_tone": "1f468-1f3fd-200d-1f3a4", - "man_standing_dark_skin_tone": "1f9cd-1f3ff-200d-2642-fe0f", - "man_standing_light_skin_tone": "1f9cd-1f3fb-200d-2642-fe0f", - "man_standing_medium-dark_skin_tone": "1f9cd-1f3fe-200d-2642-fe0f", - "man_standing_medium-light_skin_tone": "1f9cd-1f3fc-200d-2642-fe0f", - "man_standing_medium_skin_tone": "1f9cd-1f3fd-200d-2642-fe0f", - "man_student": "1f468-200d-1f393", - "man_student_dark_skin_tone": "1f468-1f3ff-200d-1f393", - "man_student_light_skin_tone": "1f468-1f3fb-200d-1f393", - "man_student_medium-dark_skin_tone": "1f468-1f3fe-200d-1f393", - "man_student_medium-light_skin_tone": "1f468-1f3fc-200d-1f393", - "man_student_medium_skin_tone": "1f468-1f3fd-200d-1f393", - "man_superhero_dark_skin_tone": "1f9b8-1f3ff-200d-2642-fe0f", - "man_superhero_light_skin_tone": "1f9b8-1f3fb-200d-2642-fe0f", - "man_superhero_medium-dark_skin_tone": "1f9b8-1f3fe-200d-2642-fe0f", - "man_superhero_medium-light_skin_tone": "1f9b8-1f3fc-200d-2642-fe0f", - "man_superhero_medium_skin_tone": "1f9b8-1f3fd-200d-2642-fe0f", - "man_supervillain_dark_skin_tone": "1f9b9-1f3ff-200d-2642-fe0f", - "man_supervillain_light_skin_tone": "1f9b9-1f3fb-200d-2642-fe0f", - "man_supervillain_medium-dark_skin_tone": "1f9b9-1f3fe-200d-2642-fe0f", - "man_supervillain_medium-light_skin_tone": "1f9b9-1f3fc-200d-2642-fe0f", - "man_supervillain_medium_skin_tone": "1f9b9-1f3fd-200d-2642-fe0f", - "man_surfing_dark_skin_tone": "1f3c4-1f3ff-200d-2642-fe0f", - "man_surfing_light_skin_tone": "1f3c4-1f3fb-200d-2642-fe0f", - "man_surfing_medium-dark_skin_tone": "1f3c4-1f3fe-200d-2642-fe0f", - "man_surfing_medium-light_skin_tone": "1f3c4-1f3fc-200d-2642-fe0f", - "man_surfing_medium_skin_tone": "1f3c4-1f3fd-200d-2642-fe0f", - "man_swimming_dark_skin_tone": "1f3ca-1f3ff-200d-2642-fe0f", - "man_swimming_light_skin_tone": "1f3ca-1f3fb-200d-2642-fe0f", - "man_swimming_medium-dark_skin_tone": "1f3ca-1f3fe-200d-2642-fe0f", - "man_swimming_medium-light_skin_tone": "1f3ca-1f3fc-200d-2642-fe0f", - "man_swimming_medium_skin_tone": "1f3ca-1f3fd-200d-2642-fe0f", - "man_teacher": "1f468-200d-1f3eb", - "man_teacher_dark_skin_tone": "1f468-1f3ff-200d-1f3eb", - "man_teacher_light_skin_tone": "1f468-1f3fb-200d-1f3eb", - "man_teacher_medium-dark_skin_tone": "1f468-1f3fe-200d-1f3eb", - "man_teacher_medium-light_skin_tone": "1f468-1f3fc-200d-1f3eb", - "man_teacher_medium_skin_tone": "1f468-1f3fd-200d-1f3eb", - "man_technologist": "1f468-200d-1f4bb", - "man_technologist_dark_skin_tone": "1f468-1f3ff-200d-1f4bb", - "man_technologist_light_skin_tone": "1f468-1f3fb-200d-1f4bb", - "man_technologist_medium-dark_skin_tone": "1f468-1f3fe-200d-1f4bb", - "man_technologist_medium-light_skin_tone": "1f468-1f3fc-200d-1f4bb", - "man_technologist_medium_skin_tone": "1f468-1f3fd-200d-1f4bb", - "man_tipping_hand_dark_skin_tone": "1f481-1f3ff-200d-2642-fe0f", - "man_tipping_hand_light_skin_tone": "1f481-1f3fb-200d-2642-fe0f", - "man_tipping_hand_medium-dark_skin_tone": "1f481-1f3fe-200d-2642-fe0f", - "man_tipping_hand_medium-light_skin_tone": "1f481-1f3fc-200d-2642-fe0f", - "man_tipping_hand_medium_skin_tone": "1f481-1f3fd-200d-2642-fe0f", - "man_vampire_dark_skin_tone": "1f9db-1f3ff-200d-2642-fe0f", - "man_vampire_light_skin_tone": "1f9db-1f3fb-200d-2642-fe0f", - "man_vampire_medium-dark_skin_tone": "1f9db-1f3fe-200d-2642-fe0f", - "man_vampire_medium-light_skin_tone": "1f9db-1f3fc-200d-2642-fe0f", - "man_vampire_medium_skin_tone": "1f9db-1f3fd-200d-2642-fe0f", - "man_walking_dark_skin_tone": "1f6b6-1f3ff-200d-2642-fe0f", - "man_walking_facing_right": "1f6b6-200d-2642-fe0f-200d-27a1-fe0f", - "man_walking_facing_right_dark_skin_tone": "1f6b6-1f3ff-200d-2642-fe0f-200d-27a1-fe0f", - "man_walking_facing_right_light_skin_tone": "1f6b6-1f3fb-200d-2642-fe0f-200d-27a1-fe0f", - "man_walking_facing_right_medium-dark_skin_tone": "1f6b6-1f3fe-200d-2642-fe0f-200d-27a1-fe0f", - "man_walking_facing_right_medium-light_skin_tone": "1f6b6-1f3fc-200d-2642-fe0f-200d-27a1-fe0f", - "man_walking_facing_right_medium_skin_tone": "1f6b6-1f3fd-200d-2642-fe0f-200d-27a1-fe0f", - "man_walking_light_skin_tone": "1f6b6-1f3fb-200d-2642-fe0f", - "man_walking_medium-dark_skin_tone": "1f6b6-1f3fe-200d-2642-fe0f", - "man_walking_medium-light_skin_tone": "1f6b6-1f3fc-200d-2642-fe0f", - "man_walking_medium_skin_tone": "1f6b6-1f3fd-200d-2642-fe0f", - "man_wearing_turban_dark_skin_tone": "1f473-1f3ff-200d-2642-fe0f", - "man_wearing_turban_light_skin_tone": "1f473-1f3fb-200d-2642-fe0f", - "man_wearing_turban_medium-dark_skin_tone": "1f473-1f3fe-200d-2642-fe0f", - "man_wearing_turban_medium-light_skin_tone": "1f473-1f3fc-200d-2642-fe0f", - "man_wearing_turban_medium_skin_tone": "1f473-1f3fd-200d-2642-fe0f", - "man_with_gua_pi_mao": "1f472", - "man_with_probing_cane": "1f468-200d-1f9af", - "man_with_turban": "1f473-200d-2642-fe0f", - "man_with_veil": "1f470-200d-2642-fe0f", - "man_with_veil_dark_skin_tone": "1f470-1f3ff-200d-2642-fe0f", - "man_with_veil_light_skin_tone": "1f470-1f3fb-200d-2642-fe0f", - "man_with_veil_medium-dark_skin_tone": "1f470-1f3fe-200d-2642-fe0f", - "man_with_veil_medium-light_skin_tone": "1f470-1f3fc-200d-2642-fe0f", - "man_with_veil_medium_skin_tone": "1f470-1f3fd-200d-2642-fe0f", - "man_with_white_cane_dark_skin_tone": "1f468-1f3ff-200d-1f9af", - "man_with_white_cane_facing_right": "1f468-200d-1f9af-200d-27a1-fe0f", - "man_with_white_cane_facing_right_dark_skin_tone": "1f468-1f3ff-200d-1f9af-200d-27a1-fe0f", - "man_with_white_cane_facing_right_light_skin_tone": "1f468-1f3fb-200d-1f9af-200d-27a1-fe0f", - "man_with_white_cane_facing_right_medium-dark_skin_tone": "1f468-1f3fe-200d-1f9af-200d-27a1-fe0f", - "man_with_white_cane_facing_right_medium-light_skin_tone": "1f468-1f3fc-200d-1f9af-200d-27a1-fe0f", - "man_with_white_cane_facing_right_medium_skin_tone": "1f468-1f3fd-200d-1f9af-200d-27a1-fe0f", - "man_with_white_cane_light_skin_tone": "1f468-1f3fb-200d-1f9af", - "man_with_white_cane_medium-dark_skin_tone": "1f468-1f3fe-200d-1f9af", - "man_with_white_cane_medium-light_skin_tone": "1f468-1f3fc-200d-1f9af", - "man_with_white_cane_medium_skin_tone": "1f468-1f3fd-200d-1f9af", - "mandarin": "1f34a", - "mango": "1f96d", - "mans_shoe": "1f45e", - "mantelpiece_clock": "1f570-fe0f", - "manual_wheelchair": "1f9bd", - "maple_leaf": "1f341", - "maracas": "1fa87", - "marshall_islands": "1f1f2-1f1ed", - "martial_arts_uniform": "1f94b", - "martinique": "1f1f2-1f1f6", - "mask": "1f637", - "massage": "1f486", - "massage_man": "1f486-200d-2642-fe0f", - "massage_woman": "1f486-200d-2640-fe0f", - "mate": "1f9c9", - "mauritania": "1f1f2-1f1f7", - "mauritius": "1f1f2-1f1fa", - "mayotte": "1f1fe-1f1f9", - "meat_on_bone": "1f356", - "mechanic": "1f9d1-200d-1f527", - "mechanic_dark_skin_tone": "1f9d1-1f3ff-200d-1f527", - "mechanic_light_skin_tone": "1f9d1-1f3fb-200d-1f527", - "mechanic_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f527", - "mechanic_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f527", - "mechanic_medium_skin_tone": "1f9d1-1f3fd-200d-1f527", - "mechanical_arm": "1f9be", - "mechanical_leg": "1f9bf", - "medal_military": "1f396-fe0f", - "medal_sports": "1f3c5", - "medical_symbol": "2695-fe0f", - "mega": "1f4e3", - "melon": "1f348", - "melting_face": "1fae0", - "memo": "1f4dd", - "men_holding_hands_dark_skin_tone": "1f46c-1f3ff", - "men_holding_hands_dark_skin_tone_light_skin_tone": "1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb", - "men_holding_hands_dark_skin_tone_medium-dark_skin_tone": "1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe", - "men_holding_hands_dark_skin_tone_medium-light_skin_tone": "1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc", - "men_holding_hands_dark_skin_tone_medium_skin_tone": "1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd", - "men_holding_hands_light_skin_tone": "1f46c-1f3fb", - "men_holding_hands_light_skin_tone_dark_skin_tone": "1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff", - "men_holding_hands_light_skin_tone_medium-dark_skin_tone": "1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe", - "men_holding_hands_light_skin_tone_medium-light_skin_tone": "1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc", - "men_holding_hands_light_skin_tone_medium_skin_tone": "1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd", - "men_holding_hands_medium-dark_skin_tone": "1f46c-1f3fe", - "men_holding_hands_medium-dark_skin_tone_dark_skin_tone": "1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff", - "men_holding_hands_medium-dark_skin_tone_light_skin_tone": "1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb", - "men_holding_hands_medium-dark_skin_tone_medium-light_skin_tone": "1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc", - "men_holding_hands_medium-dark_skin_tone_medium_skin_tone": "1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd", - "men_holding_hands_medium-light_skin_tone": "1f46c-1f3fc", - "men_holding_hands_medium-light_skin_tone_dark_skin_tone": "1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff", - "men_holding_hands_medium-light_skin_tone_light_skin_tone": "1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb", - "men_holding_hands_medium-light_skin_tone_medium-dark_skin_tone": "1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe", - "men_holding_hands_medium-light_skin_tone_medium_skin_tone": "1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd", - "men_holding_hands_medium_skin_tone": "1f46c-1f3fd", - "men_holding_hands_medium_skin_tone_dark_skin_tone": "1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff", - "men_holding_hands_medium_skin_tone_light_skin_tone": "1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb", - "men_holding_hands_medium_skin_tone_medium-dark_skin_tone": "1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe", - "men_holding_hands_medium_skin_tone_medium-light_skin_tone": "1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc", - "men_wrestling": "1f93c-200d-2642-fe0f", - "mending_heart": "2764-fe0f-200d-1fa79", - "menorah": "1f54e", - "mens": "1f6b9", - "mermaid": "1f9dc-200d-2640-fe0f", - "mermaid_dark_skin_tone": "1f9dc-1f3ff-200d-2640-fe0f", - "mermaid_light_skin_tone": "1f9dc-1f3fb-200d-2640-fe0f", - "mermaid_medium-dark_skin_tone": "1f9dc-1f3fe-200d-2640-fe0f", - "mermaid_medium-light_skin_tone": "1f9dc-1f3fc-200d-2640-fe0f", - "mermaid_medium_skin_tone": "1f9dc-1f3fd-200d-2640-fe0f", - "merman": "1f9dc-200d-2642-fe0f", - "merman_dark_skin_tone": "1f9dc-1f3ff-200d-2642-fe0f", - "merman_light_skin_tone": "1f9dc-1f3fb-200d-2642-fe0f", - "merman_medium-dark_skin_tone": "1f9dc-1f3fe-200d-2642-fe0f", - "merman_medium-light_skin_tone": "1f9dc-1f3fc-200d-2642-fe0f", - "merman_medium_skin_tone": "1f9dc-1f3fd-200d-2642-fe0f", - "merperson": "1f9dc", - "merperson_dark_skin_tone": "1f9dc-1f3ff", - "merperson_light_skin_tone": "1f9dc-1f3fb", - "merperson_medium-dark_skin_tone": "1f9dc-1f3fe", - "merperson_medium-light_skin_tone": "1f9dc-1f3fc", - "merperson_medium_skin_tone": "1f9dc-1f3fd", - "metal": "1f918", - "metro": "1f687", - "mexico": "1f1f2-1f1fd", - "microbe": "1f9a0", - "micronesia": "1f1eb-1f1f2", - "microphone": "1f3a4", - "microscope": "1f52c", - "middle_finger": "1f595", - "middle_finger_dark_skin_tone": "1f595-1f3ff", - "middle_finger_light_skin_tone": "1f595-1f3fb", - "middle_finger_medium-dark_skin_tone": "1f595-1f3fe", - "middle_finger_medium-light_skin_tone": "1f595-1f3fc", - "middle_finger_medium_skin_tone": "1f595-1f3fd", - "military_helmet": "1fa96", - "milk_glass": "1f95b", - "milky_way": "1f30c", - "minibus": "1f690", - "minidisc": "1f4bd", - "mirror": "1fa9e", - "mirror_ball": "1faa9", - "mobile": "1f4f1", - "mobile_phone_off": "1f4f4", - "moldova": "1f1f2-1f1e9", - "monaco": "1f1f2-1f1e8", - "money_mouth_face": "1f911", - "money_with_wings": "1f4b8", - "moneybag": "1f4b0", - "mongolia": "1f1f2-1f1f3", - "monkey": "1f412", - "monkey_face": "1f435", - "monocle_face": "1f9d0", - "monorail": "1f69d", - "montenegro": "1f1f2-1f1ea", - "montserrat": "1f1f2-1f1f8", - "moon": "1f314", - "moon_cake": "1f96e", - "moose": "1face", - "morocco": "1f1f2-1f1e6", - "mortar_board": "1f393", - "mosque": "1f54c", - "mosquito": "1f99f", - "motor_boat": "1f6e5-fe0f", - "motor_scooter": "1f6f5", - "motorcycle": "1f3cd-fe0f", - "motorized_wheelchair": "1f9bc", - "motorway": "1f6e3-fe0f", - "mount_fuji": "1f5fb", - "mountain": "26f0-fe0f", - "mountain_bicyclist": "1f6b5", - "mountain_biking_man": "1f6b5-200d-2642-fe0f", - "mountain_biking_woman": "1f6b5-200d-2640-fe0f", - "mountain_cableway": "1f6a0", - "mountain_railway": "1f69e", - "mountain_snow": "1f3d4-fe0f", - "mouse": "1f42d", - "mouse2": "1f401", - "mouse_trap": "1faa4", - "movie_camera": "1f3a5", - "moyai": "1f5ff", - "mozambique": "1f1f2-1f1ff", - "mrs_claus": "1f936", - "mrs_claus_dark_skin_tone": "1f936-1f3ff", - "mrs_claus_light_skin_tone": "1f936-1f3fb", - "mrs_claus_medium-dark_skin_tone": "1f936-1f3fe", - "mrs_claus_medium-light_skin_tone": "1f936-1f3fc", - "mrs_claus_medium_skin_tone": "1f936-1f3fd", - "muscle": "1f4aa", - "mushroom": "1f344", - "musical_keyboard": "1f3b9", - "musical_note": "1f3b5", - "musical_score": "1f3bc", - "mute": "1f507", - "mx_claus": "1f9d1-200d-1f384", - "mx_claus_dark_skin_tone": "1f9d1-1f3ff-200d-1f384", - "mx_claus_light_skin_tone": "1f9d1-1f3fb-200d-1f384", - "mx_claus_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f384", - "mx_claus_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f384", - "mx_claus_medium_skin_tone": "1f9d1-1f3fd-200d-1f384", - "myanmar": "1f1f2-1f1f2", - "nail_care": "1f485", - "nail_polish_dark_skin_tone": "1f485-1f3ff", - "nail_polish_light_skin_tone": "1f485-1f3fb", - "nail_polish_medium-dark_skin_tone": "1f485-1f3fe", - "nail_polish_medium-light_skin_tone": "1f485-1f3fc", - "nail_polish_medium_skin_tone": "1f485-1f3fd", - "name_badge": "1f4db", - "namibia": "1f1f3-1f1e6", - "national_park": "1f3de-fe0f", - "nauru": "1f1f3-1f1f7", - "nauseated_face": "1f922", - "nazar_amulet": "1f9ff", - "necktie": "1f454", - "negative_squared_cross_mark": "274e", - "nepal": "1f1f3-1f1f5", - "nerd_face": "1f913", - "nest_with_eggs": "1faba", - "nesting_dolls": "1fa86", - "netherlands": "1f1f3-1f1f1", - "neutral_face": "1f610", - "new": "1f195", - "new_caledonia": "1f1f3-1f1e8", - "new_moon": "1f311", - "new_moon_with_face": "1f31a", - "new_zealand": "1f1f3-1f1ff", - "newspaper": "1f4f0", - "newspaper_roll": "1f5de-fe0f", - "next_track_button": "23ed-fe0f", - "ng": "1f196", - "ng_man": "1f645-200d-2642-fe0f", - "ng_woman": "1f645-200d-2640-fe0f", - "nicaragua": "1f1f3-1f1ee", - "niger": "1f1f3-1f1ea", - "nigeria": "1f1f3-1f1ec", - "night_with_stars": "1f303", - "nine": "39-fe0f-20e3", - "ninja": "1f977", - "ninja_dark_skin_tone": "1f977-1f3ff", - "ninja_light_skin_tone": "1f977-1f3fb", - "ninja_medium-dark_skin_tone": "1f977-1f3fe", - "ninja_medium-light_skin_tone": "1f977-1f3fc", - "ninja_medium_skin_tone": "1f977-1f3fd", - "niue": "1f1f3-1f1fa", - "no_bell": "1f515", - "no_bicycles": "1f6b3", - "no_entry": "26d4", - "no_entry_sign": "1f6ab", - "no_good": "1f645", - "no_good_man": "1f645-200d-2642-fe0f", - "no_good_woman": "1f645-200d-2640-fe0f", - "no_mobile_phones": "1f4f5", - "no_mouth": "1f636", - "no_pedestrians": "1f6b7", - "no_smoking": "1f6ad", - "non-potable_water": "1f6b1", - "norfolk_island": "1f1f3-1f1eb", - "north_korea": "1f1f0-1f1f5", - "northern_mariana_islands": "1f1f2-1f1f5", - "norway": "1f1f3-1f1f4", - "nose": "1f443", - "nose_dark_skin_tone": "1f443-1f3ff", - "nose_light_skin_tone": "1f443-1f3fb", - "nose_medium-dark_skin_tone": "1f443-1f3fe", - "nose_medium-light_skin_tone": "1f443-1f3fc", - "nose_medium_skin_tone": "1f443-1f3fd", - "notebook": "1f4d3", - "notebook_with_decorative_cover": "1f4d4", - "notes": "1f3b6", - "nut_and_bolt": "1f529", - "o": "2b55", - "o2": "1f17e-fe0f", - "ocean": "1f30a", - "octopus": "1f419", - "oden": "1f362", - "office": "1f3e2", - "office_worker": "1f9d1-200d-1f4bc", - "office_worker_dark_skin_tone": "1f9d1-1f3ff-200d-1f4bc", - "office_worker_light_skin_tone": "1f9d1-1f3fb-200d-1f4bc", - "office_worker_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f4bc", - "office_worker_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f4bc", - "office_worker_medium_skin_tone": "1f9d1-1f3fd-200d-1f4bc", - "oil_drum": "1f6e2-fe0f", - "ok": "1f197", - "ok_hand": "1f44c", - "ok_hand_dark_skin_tone": "1f44c-1f3ff", - "ok_hand_light_skin_tone": "1f44c-1f3fb", - "ok_hand_medium-dark_skin_tone": "1f44c-1f3fe", - "ok_hand_medium-light_skin_tone": "1f44c-1f3fc", - "ok_hand_medium_skin_tone": "1f44c-1f3fd", - "ok_man": "1f646-200d-2642-fe0f", - "ok_person": "1f646", - "ok_woman": "1f646-200d-2640-fe0f", - "old_key": "1f5dd-fe0f", - "old_man_dark_skin_tone": "1f474-1f3ff", - "old_man_light_skin_tone": "1f474-1f3fb", - "old_man_medium-dark_skin_tone": "1f474-1f3fe", - "old_man_medium-light_skin_tone": "1f474-1f3fc", - "old_man_medium_skin_tone": "1f474-1f3fd", - "old_woman_dark_skin_tone": "1f475-1f3ff", - "old_woman_light_skin_tone": "1f475-1f3fb", - "old_woman_medium-dark_skin_tone": "1f475-1f3fe", - "old_woman_medium-light_skin_tone": "1f475-1f3fc", - "old_woman_medium_skin_tone": "1f475-1f3fd", - "older_adult": "1f9d3", - "older_man": "1f474", - "older_person_dark_skin_tone": "1f9d3-1f3ff", - "older_person_light_skin_tone": "1f9d3-1f3fb", - "older_person_medium-dark_skin_tone": "1f9d3-1f3fe", - "older_person_medium-light_skin_tone": "1f9d3-1f3fc", - "older_person_medium_skin_tone": "1f9d3-1f3fd", - "older_woman": "1f475", - "olive": "1fad2", - "om": "1f549-fe0f", - "oman": "1f1f4-1f1f2", - "on": "1f51b", - "oncoming_automobile": "1f698", - "oncoming_bus": "1f68d", - "oncoming_fist_dark_skin_tone": "1f44a-1f3ff", - "oncoming_fist_light_skin_tone": "1f44a-1f3fb", - "oncoming_fist_medium-dark_skin_tone": "1f44a-1f3fe", - "oncoming_fist_medium-light_skin_tone": "1f44a-1f3fc", - "oncoming_fist_medium_skin_tone": "1f44a-1f3fd", - "oncoming_police_car": "1f694", - "oncoming_taxi": "1f696", - "one": "31-fe0f-20e3", - "one_piece_swimsuit": "1fa71", - "onion": "1f9c5", - "open_book": "1f4d6", - "open_file_folder": "1f4c2", - "open_hands": "1f450", - "open_hands_dark_skin_tone": "1f450-1f3ff", - "open_hands_light_skin_tone": "1f450-1f3fb", - "open_hands_medium-dark_skin_tone": "1f450-1f3fe", - "open_hands_medium-light_skin_tone": "1f450-1f3fc", - "open_hands_medium_skin_tone": "1f450-1f3fd", - "open_mouth": "1f62e", - "open_umbrella": "2602-fe0f", - "ophiuchus": "26ce", - "orange": "1f34a", - "orange_book": "1f4d9", - "orange_circle": "1f7e0", - "orange_heart": "1f9e1", - "orange_square": "1f7e7", - "orangutan": "1f9a7", - "orthodox_cross": "2626-fe0f", - "otter": "1f9a6", - "outbox_tray": "1f4e4", - "owl": "1f989", - "ox": "1f402", - "oyster": "1f9aa", - "package": "1f4e6", - "page_facing_up": "1f4c4", - "page_with_curl": "1f4c3", - "pager": "1f4df", - "paintbrush": "1f58c-fe0f", - "pakistan": "1f1f5-1f1f0", - "palau": "1f1f5-1f1fc", - "palestinian_territories": "1f1f5-1f1f8", - "palm_down_hand": "1faf3", - "palm_down_hand_dark_skin_tone": "1faf3-1f3ff", - "palm_down_hand_light_skin_tone": "1faf3-1f3fb", - "palm_down_hand_medium-dark_skin_tone": "1faf3-1f3fe", - "palm_down_hand_medium-light_skin_tone": "1faf3-1f3fc", - "palm_down_hand_medium_skin_tone": "1faf3-1f3fd", - "palm_tree": "1f334", - "palm_up_hand": "1faf4", - "palm_up_hand_dark_skin_tone": "1faf4-1f3ff", - "palm_up_hand_light_skin_tone": "1faf4-1f3fb", - "palm_up_hand_medium-dark_skin_tone": "1faf4-1f3fe", - "palm_up_hand_medium-light_skin_tone": "1faf4-1f3fc", - "palm_up_hand_medium_skin_tone": "1faf4-1f3fd", - "palms_up_together": "1f932", - "palms_up_together_dark_skin_tone": "1f932-1f3ff", - "palms_up_together_light_skin_tone": "1f932-1f3fb", - "palms_up_together_medium-dark_skin_tone": "1f932-1f3fe", - "palms_up_together_medium-light_skin_tone": "1f932-1f3fc", - "palms_up_together_medium_skin_tone": "1f932-1f3fd", - "panama": "1f1f5-1f1e6", - "pancakes": "1f95e", - "panda_face": "1f43c", - "paperclip": "1f4ce", - "paperclips": "1f587-fe0f", - "papua_new_guinea": "1f1f5-1f1ec", - "parachute": "1fa82", - "paraguay": "1f1f5-1f1fe", - "parasol_on_ground": "26f1-fe0f", - "parking": "1f17f-fe0f", - "parrot": "1f99c", - "part_alternation_mark": "303d-fe0f", - "partly_sunny": "26c5", - "partying_face": "1f973", - "passenger_ship": "1f6f3-fe0f", - "passport_control": "1f6c2", - "pause_button": "23f8-fe0f", - "paw_prints": "1f43e", - "pea_pod": "1fadb", - "peace_symbol": "262e-fe0f", - "peach": "1f351", - "peacock": "1f99a", - "peanuts": "1f95c", - "pear": "1f350", - "pen": "1f58a-fe0f", - "pencil": "1f4dd", - "pencil2": "270f-fe0f", - "penguin": "1f427", - "pensive": "1f614", - "people_holding_hands": "1f9d1-200d-1f91d-200d-1f9d1", - "people_holding_hands_dark_skin_tone": "1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff", - "people_holding_hands_dark_skin_tone_light_skin_tone": "1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb", - "people_holding_hands_dark_skin_tone_medium-dark_skin_tone": "1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe", - "people_holding_hands_dark_skin_tone_medium-light_skin_tone": "1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc", - "people_holding_hands_dark_skin_tone_medium_skin_tone": "1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd", - "people_holding_hands_light_skin_tone": "1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb", - "people_holding_hands_light_skin_tone_dark_skin_tone": "1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff", - "people_holding_hands_light_skin_tone_medium-dark_skin_tone": "1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe", - "people_holding_hands_light_skin_tone_medium-light_skin_tone": "1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc", - "people_holding_hands_light_skin_tone_medium_skin_tone": "1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd", - "people_holding_hands_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe", - "people_holding_hands_medium-dark_skin_tone_dark_skin_tone": "1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff", - "people_holding_hands_medium-dark_skin_tone_light_skin_tone": "1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb", - "people_holding_hands_medium-dark_skin_tone_medium-light_skin_tone": "1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc", - "people_holding_hands_medium-dark_skin_tone_medium_skin_tone": "1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd", - "people_holding_hands_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc", - "people_holding_hands_medium-light_skin_tone_dark_skin_tone": "1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff", - "people_holding_hands_medium-light_skin_tone_light_skin_tone": "1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb", - "people_holding_hands_medium-light_skin_tone_medium-dark_skin_tone": "1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe", - "people_holding_hands_medium-light_skin_tone_medium_skin_tone": "1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd", - "people_holding_hands_medium_skin_tone": "1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd", - "people_holding_hands_medium_skin_tone_dark_skin_tone": "1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff", - "people_holding_hands_medium_skin_tone_light_skin_tone": "1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb", - "people_holding_hands_medium_skin_tone_medium-dark_skin_tone": "1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe", - "people_holding_hands_medium_skin_tone_medium-light_skin_tone": "1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc", - "people_hugging": "1fac2", - "performing_arts": "1f3ad", - "persevere": "1f623", - "person_bald": "1f9d1-200d-1f9b2", - "person_biking_dark_skin_tone": "1f6b4-1f3ff", - "person_biking_light_skin_tone": "1f6b4-1f3fb", - "person_biking_medium-dark_skin_tone": "1f6b4-1f3fe", - "person_biking_medium-light_skin_tone": "1f6b4-1f3fc", - "person_biking_medium_skin_tone": "1f6b4-1f3fd", - "person_bouncing_ball_dark_skin_tone": "26f9-1f3ff", - "person_bouncing_ball_light_skin_tone": "26f9-1f3fb", - "person_bouncing_ball_medium-dark_skin_tone": "26f9-1f3fe", - "person_bouncing_ball_medium-light_skin_tone": "26f9-1f3fc", - "person_bouncing_ball_medium_skin_tone": "26f9-1f3fd", - "person_bowing_dark_skin_tone": "1f647-1f3ff", - "person_bowing_light_skin_tone": "1f647-1f3fb", - "person_bowing_medium-dark_skin_tone": "1f647-1f3fe", - "person_bowing_medium-light_skin_tone": "1f647-1f3fc", - "person_bowing_medium_skin_tone": "1f647-1f3fd", - "person_cartwheeling_dark_skin_tone": "1f938-1f3ff", - "person_cartwheeling_light_skin_tone": "1f938-1f3fb", - "person_cartwheeling_medium-dark_skin_tone": "1f938-1f3fe", - "person_cartwheeling_medium-light_skin_tone": "1f938-1f3fc", - "person_cartwheeling_medium_skin_tone": "1f938-1f3fd", - "person_climbing_dark_skin_tone": "1f9d7-1f3ff", - "person_climbing_light_skin_tone": "1f9d7-1f3fb", - "person_climbing_medium-dark_skin_tone": "1f9d7-1f3fe", - "person_climbing_medium-light_skin_tone": "1f9d7-1f3fc", - "person_climbing_medium_skin_tone": "1f9d7-1f3fd", - "person_curly_hair": "1f9d1-200d-1f9b1", - "person_dark_skin_tone": "1f9d1-1f3ff", - "person_dark_skin_tone_bald": "1f9d1-1f3ff-200d-1f9b2", - "person_dark_skin_tone_beard": "1f9d4-1f3ff", - "person_dark_skin_tone_blond_hair": "1f471-1f3ff", - "person_dark_skin_tone_curly_hair": "1f9d1-1f3ff-200d-1f9b1", - "person_dark_skin_tone_red_hair": "1f9d1-1f3ff-200d-1f9b0", - "person_dark_skin_tone_white_hair": "1f9d1-1f3ff-200d-1f9b3", - "person_facepalming_dark_skin_tone": "1f926-1f3ff", - "person_facepalming_light_skin_tone": "1f926-1f3fb", - "person_facepalming_medium-dark_skin_tone": "1f926-1f3fe", - "person_facepalming_medium-light_skin_tone": "1f926-1f3fc", - "person_facepalming_medium_skin_tone": "1f926-1f3fd", - "person_feeding_baby": "1f9d1-200d-1f37c", - "person_feeding_baby_dark_skin_tone": "1f9d1-1f3ff-200d-1f37c", - "person_feeding_baby_light_skin_tone": "1f9d1-1f3fb-200d-1f37c", - "person_feeding_baby_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f37c", - "person_feeding_baby_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f37c", - "person_feeding_baby_medium_skin_tone": "1f9d1-1f3fd-200d-1f37c", - "person_fencing": "1f93a", - "person_frowning_dark_skin_tone": "1f64d-1f3ff", - "person_frowning_light_skin_tone": "1f64d-1f3fb", - "person_frowning_medium-dark_skin_tone": "1f64d-1f3fe", - "person_frowning_medium-light_skin_tone": "1f64d-1f3fc", - "person_frowning_medium_skin_tone": "1f64d-1f3fd", - "person_gesturing_no_dark_skin_tone": "1f645-1f3ff", - "person_gesturing_no_light_skin_tone": "1f645-1f3fb", - "person_gesturing_no_medium-dark_skin_tone": "1f645-1f3fe", - "person_gesturing_no_medium-light_skin_tone": "1f645-1f3fc", - "person_gesturing_no_medium_skin_tone": "1f645-1f3fd", - "person_gesturing_ok_dark_skin_tone": "1f646-1f3ff", - "person_gesturing_ok_light_skin_tone": "1f646-1f3fb", - "person_gesturing_ok_medium-dark_skin_tone": "1f646-1f3fe", - "person_gesturing_ok_medium-light_skin_tone": "1f646-1f3fc", - "person_gesturing_ok_medium_skin_tone": "1f646-1f3fd", - "person_getting_haircut_dark_skin_tone": "1f487-1f3ff", - "person_getting_haircut_light_skin_tone": "1f487-1f3fb", - "person_getting_haircut_medium-dark_skin_tone": "1f487-1f3fe", - "person_getting_haircut_medium-light_skin_tone": "1f487-1f3fc", - "person_getting_haircut_medium_skin_tone": "1f487-1f3fd", - "person_getting_massage_dark_skin_tone": "1f486-1f3ff", - "person_getting_massage_light_skin_tone": "1f486-1f3fb", - "person_getting_massage_medium-dark_skin_tone": "1f486-1f3fe", - "person_getting_massage_medium-light_skin_tone": "1f486-1f3fc", - "person_getting_massage_medium_skin_tone": "1f486-1f3fd", - "person_golfing_dark_skin_tone": "1f3cc-1f3ff", - "person_golfing_light_skin_tone": "1f3cc-1f3fb", - "person_golfing_medium-dark_skin_tone": "1f3cc-1f3fe", - "person_golfing_medium-light_skin_tone": "1f3cc-1f3fc", - "person_golfing_medium_skin_tone": "1f3cc-1f3fd", - "person_in_bed_dark_skin_tone": "1f6cc-1f3ff", - "person_in_bed_light_skin_tone": "1f6cc-1f3fb", - "person_in_bed_medium-dark_skin_tone": "1f6cc-1f3fe", - "person_in_bed_medium-light_skin_tone": "1f6cc-1f3fc", - "person_in_bed_medium_skin_tone": "1f6cc-1f3fd", - "person_in_lotus_position_dark_skin_tone": "1f9d8-1f3ff", - "person_in_lotus_position_light_skin_tone": "1f9d8-1f3fb", - "person_in_lotus_position_medium-dark_skin_tone": "1f9d8-1f3fe", - "person_in_lotus_position_medium-light_skin_tone": "1f9d8-1f3fc", - "person_in_lotus_position_medium_skin_tone": "1f9d8-1f3fd", - "person_in_manual_wheelchair": "1f9d1-200d-1f9bd", - "person_in_manual_wheelchair_dark_skin_tone": "1f9d1-1f3ff-200d-1f9bd", - "person_in_manual_wheelchair_facing_right": "1f9d1-200d-1f9bd-200d-27a1-fe0f", - "person_in_manual_wheelchair_facing_right_dark_skin_tone": "1f9d1-1f3ff-200d-1f9bd-200d-27a1-fe0f", - "person_in_manual_wheelchair_facing_right_light_skin_tone": "1f9d1-1f3fb-200d-1f9bd-200d-27a1-fe0f", - "person_in_manual_wheelchair_facing_right_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f9bd-200d-27a1-fe0f", - "person_in_manual_wheelchair_facing_right_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f9bd-200d-27a1-fe0f", - "person_in_manual_wheelchair_facing_right_medium_skin_tone": "1f9d1-1f3fd-200d-1f9bd-200d-27a1-fe0f", - "person_in_manual_wheelchair_light_skin_tone": "1f9d1-1f3fb-200d-1f9bd", - "person_in_manual_wheelchair_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f9bd", - "person_in_manual_wheelchair_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f9bd", - "person_in_manual_wheelchair_medium_skin_tone": "1f9d1-1f3fd-200d-1f9bd", - "person_in_motorized_wheelchair": "1f9d1-200d-1f9bc", - "person_in_motorized_wheelchair_dark_skin_tone": "1f9d1-1f3ff-200d-1f9bc", - "person_in_motorized_wheelchair_facing_right": "1f9d1-200d-1f9bc-200d-27a1-fe0f", - "person_in_motorized_wheelchair_facing_right_dark_skin_tone": "1f9d1-1f3ff-200d-1f9bc-200d-27a1-fe0f", - "person_in_motorized_wheelchair_facing_right_light_skin_tone": "1f9d1-1f3fb-200d-1f9bc-200d-27a1-fe0f", - "person_in_motorized_wheelchair_facing_right_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f9bc-200d-27a1-fe0f", - "person_in_motorized_wheelchair_facing_right_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f9bc-200d-27a1-fe0f", - "person_in_motorized_wheelchair_facing_right_medium_skin_tone": "1f9d1-1f3fd-200d-1f9bc-200d-27a1-fe0f", - "person_in_motorized_wheelchair_light_skin_tone": "1f9d1-1f3fb-200d-1f9bc", - "person_in_motorized_wheelchair_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f9bc", - "person_in_motorized_wheelchair_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f9bc", - "person_in_motorized_wheelchair_medium_skin_tone": "1f9d1-1f3fd-200d-1f9bc", - "person_in_steamy_room_dark_skin_tone": "1f9d6-1f3ff", - "person_in_steamy_room_light_skin_tone": "1f9d6-1f3fb", - "person_in_steamy_room_medium-dark_skin_tone": "1f9d6-1f3fe", - "person_in_steamy_room_medium-light_skin_tone": "1f9d6-1f3fc", - "person_in_steamy_room_medium_skin_tone": "1f9d6-1f3fd", - "person_in_suit_levitating_dark_skin_tone": "1f574-1f3ff", - "person_in_suit_levitating_light_skin_tone": "1f574-1f3fb", - "person_in_suit_levitating_medium-dark_skin_tone": "1f574-1f3fe", - "person_in_suit_levitating_medium-light_skin_tone": "1f574-1f3fc", - "person_in_suit_levitating_medium_skin_tone": "1f574-1f3fd", - "person_in_tuxedo": "1f935", - "person_in_tuxedo_dark_skin_tone": "1f935-1f3ff", - "person_in_tuxedo_light_skin_tone": "1f935-1f3fb", - "person_in_tuxedo_medium-dark_skin_tone": "1f935-1f3fe", - "person_in_tuxedo_medium-light_skin_tone": "1f935-1f3fc", - "person_in_tuxedo_medium_skin_tone": "1f935-1f3fd", - "person_juggling_dark_skin_tone": "1f939-1f3ff", - "person_juggling_light_skin_tone": "1f939-1f3fb", - "person_juggling_medium-dark_skin_tone": "1f939-1f3fe", - "person_juggling_medium-light_skin_tone": "1f939-1f3fc", - "person_juggling_medium_skin_tone": "1f939-1f3fd", - "person_kneeling_dark_skin_tone": "1f9ce-1f3ff", - "person_kneeling_facing_right": "1f9ce-200d-27a1-fe0f", - "person_kneeling_facing_right_dark_skin_tone": "1f9ce-1f3ff-200d-27a1-fe0f", - "person_kneeling_facing_right_light_skin_tone": "1f9ce-1f3fb-200d-27a1-fe0f", - "person_kneeling_facing_right_medium-dark_skin_tone": "1f9ce-1f3fe-200d-27a1-fe0f", - "person_kneeling_facing_right_medium-light_skin_tone": "1f9ce-1f3fc-200d-27a1-fe0f", - "person_kneeling_facing_right_medium_skin_tone": "1f9ce-1f3fd-200d-27a1-fe0f", - "person_kneeling_light_skin_tone": "1f9ce-1f3fb", - "person_kneeling_medium-dark_skin_tone": "1f9ce-1f3fe", - "person_kneeling_medium-light_skin_tone": "1f9ce-1f3fc", - "person_kneeling_medium_skin_tone": "1f9ce-1f3fd", - "person_lifting_weights_dark_skin_tone": "1f3cb-1f3ff", - "person_lifting_weights_light_skin_tone": "1f3cb-1f3fb", - "person_lifting_weights_medium-dark_skin_tone": "1f3cb-1f3fe", - "person_lifting_weights_medium-light_skin_tone": "1f3cb-1f3fc", - "person_lifting_weights_medium_skin_tone": "1f3cb-1f3fd", - "person_light_skin_tone": "1f9d1-1f3fb", - "person_light_skin_tone_bald": "1f9d1-1f3fb-200d-1f9b2", - "person_light_skin_tone_beard": "1f9d4-1f3fb", - "person_light_skin_tone_blond_hair": "1f471-1f3fb", - "person_light_skin_tone_curly_hair": "1f9d1-1f3fb-200d-1f9b1", - "person_light_skin_tone_red_hair": "1f9d1-1f3fb-200d-1f9b0", - "person_light_skin_tone_white_hair": "1f9d1-1f3fb-200d-1f9b3", - "person_medium-dark_skin_tone": "1f9d1-1f3fe", - "person_medium-dark_skin_tone_bald": "1f9d1-1f3fe-200d-1f9b2", - "person_medium-dark_skin_tone_beard": "1f9d4-1f3fe", - "person_medium-dark_skin_tone_blond_hair": "1f471-1f3fe", - "person_medium-dark_skin_tone_curly_hair": "1f9d1-1f3fe-200d-1f9b1", - "person_medium-dark_skin_tone_red_hair": "1f9d1-1f3fe-200d-1f9b0", - "person_medium-dark_skin_tone_white_hair": "1f9d1-1f3fe-200d-1f9b3", - "person_medium-light_skin_tone": "1f9d1-1f3fc", - "person_medium-light_skin_tone_bald": "1f9d1-1f3fc-200d-1f9b2", - "person_medium-light_skin_tone_beard": "1f9d4-1f3fc", - "person_medium-light_skin_tone_blond_hair": "1f471-1f3fc", - "person_medium-light_skin_tone_curly_hair": "1f9d1-1f3fc-200d-1f9b1", - "person_medium-light_skin_tone_red_hair": "1f9d1-1f3fc-200d-1f9b0", - "person_medium-light_skin_tone_white_hair": "1f9d1-1f3fc-200d-1f9b3", - "person_medium_skin_tone": "1f9d1-1f3fd", - "person_medium_skin_tone_bald": "1f9d1-1f3fd-200d-1f9b2", - "person_medium_skin_tone_beard": "1f9d4-1f3fd", - "person_medium_skin_tone_blond_hair": "1f471-1f3fd", - "person_medium_skin_tone_curly_hair": "1f9d1-1f3fd-200d-1f9b1", - "person_medium_skin_tone_red_hair": "1f9d1-1f3fd-200d-1f9b0", - "person_medium_skin_tone_white_hair": "1f9d1-1f3fd-200d-1f9b3", - "person_mountain_biking_dark_skin_tone": "1f6b5-1f3ff", - "person_mountain_biking_light_skin_tone": "1f6b5-1f3fb", - "person_mountain_biking_medium-dark_skin_tone": "1f6b5-1f3fe", - "person_mountain_biking_medium-light_skin_tone": "1f6b5-1f3fc", - "person_mountain_biking_medium_skin_tone": "1f6b5-1f3fd", - "person_playing_handball_dark_skin_tone": "1f93e-1f3ff", - "person_playing_handball_light_skin_tone": "1f93e-1f3fb", - "person_playing_handball_medium-dark_skin_tone": "1f93e-1f3fe", - "person_playing_handball_medium-light_skin_tone": "1f93e-1f3fc", - "person_playing_handball_medium_skin_tone": "1f93e-1f3fd", - "person_playing_water_polo_dark_skin_tone": "1f93d-1f3ff", - "person_playing_water_polo_light_skin_tone": "1f93d-1f3fb", - "person_playing_water_polo_medium-dark_skin_tone": "1f93d-1f3fe", - "person_playing_water_polo_medium-light_skin_tone": "1f93d-1f3fc", - "person_playing_water_polo_medium_skin_tone": "1f93d-1f3fd", - "person_pouting_dark_skin_tone": "1f64e-1f3ff", - "person_pouting_light_skin_tone": "1f64e-1f3fb", - "person_pouting_medium-dark_skin_tone": "1f64e-1f3fe", - "person_pouting_medium-light_skin_tone": "1f64e-1f3fc", - "person_pouting_medium_skin_tone": "1f64e-1f3fd", - "person_raising_hand_dark_skin_tone": "1f64b-1f3ff", - "person_raising_hand_light_skin_tone": "1f64b-1f3fb", - "person_raising_hand_medium-dark_skin_tone": "1f64b-1f3fe", - "person_raising_hand_medium-light_skin_tone": "1f64b-1f3fc", - "person_raising_hand_medium_skin_tone": "1f64b-1f3fd", - "person_red_hair": "1f9d1-200d-1f9b0", - "person_rowing_boat_dark_skin_tone": "1f6a3-1f3ff", - "person_rowing_boat_light_skin_tone": "1f6a3-1f3fb", - "person_rowing_boat_medium-dark_skin_tone": "1f6a3-1f3fe", - "person_rowing_boat_medium-light_skin_tone": "1f6a3-1f3fc", - "person_rowing_boat_medium_skin_tone": "1f6a3-1f3fd", - "person_running_dark_skin_tone": "1f3c3-1f3ff", - "person_running_facing_right": "1f3c3-200d-27a1-fe0f", - "person_running_facing_right_dark_skin_tone": "1f3c3-1f3ff-200d-27a1-fe0f", - "person_running_facing_right_light_skin_tone": "1f3c3-1f3fb-200d-27a1-fe0f", - "person_running_facing_right_medium-dark_skin_tone": "1f3c3-1f3fe-200d-27a1-fe0f", - "person_running_facing_right_medium-light_skin_tone": "1f3c3-1f3fc-200d-27a1-fe0f", - "person_running_facing_right_medium_skin_tone": "1f3c3-1f3fd-200d-27a1-fe0f", - "person_running_light_skin_tone": "1f3c3-1f3fb", - "person_running_medium-dark_skin_tone": "1f3c3-1f3fe", - "person_running_medium-light_skin_tone": "1f3c3-1f3fc", - "person_running_medium_skin_tone": "1f3c3-1f3fd", - "person_shrugging_dark_skin_tone": "1f937-1f3ff", - "person_shrugging_light_skin_tone": "1f937-1f3fb", - "person_shrugging_medium-dark_skin_tone": "1f937-1f3fe", - "person_shrugging_medium-light_skin_tone": "1f937-1f3fc", - "person_shrugging_medium_skin_tone": "1f937-1f3fd", - "person_standing_dark_skin_tone": "1f9cd-1f3ff", - "person_standing_light_skin_tone": "1f9cd-1f3fb", - "person_standing_medium-dark_skin_tone": "1f9cd-1f3fe", - "person_standing_medium-light_skin_tone": "1f9cd-1f3fc", - "person_standing_medium_skin_tone": "1f9cd-1f3fd", - "person_surfing_dark_skin_tone": "1f3c4-1f3ff", - "person_surfing_light_skin_tone": "1f3c4-1f3fb", - "person_surfing_medium-dark_skin_tone": "1f3c4-1f3fe", - "person_surfing_medium-light_skin_tone": "1f3c4-1f3fc", - "person_surfing_medium_skin_tone": "1f3c4-1f3fd", - "person_swimming_dark_skin_tone": "1f3ca-1f3ff", - "person_swimming_light_skin_tone": "1f3ca-1f3fb", - "person_swimming_medium-dark_skin_tone": "1f3ca-1f3fe", - "person_swimming_medium-light_skin_tone": "1f3ca-1f3fc", - "person_swimming_medium_skin_tone": "1f3ca-1f3fd", - "person_taking_bath_dark_skin_tone": "1f6c0-1f3ff", - "person_taking_bath_light_skin_tone": "1f6c0-1f3fb", - "person_taking_bath_medium-dark_skin_tone": "1f6c0-1f3fe", - "person_taking_bath_medium-light_skin_tone": "1f6c0-1f3fc", - "person_taking_bath_medium_skin_tone": "1f6c0-1f3fd", - "person_tipping_hand_dark_skin_tone": "1f481-1f3ff", - "person_tipping_hand_light_skin_tone": "1f481-1f3fb", - "person_tipping_hand_medium-dark_skin_tone": "1f481-1f3fe", - "person_tipping_hand_medium-light_skin_tone": "1f481-1f3fc", - "person_tipping_hand_medium_skin_tone": "1f481-1f3fd", - "person_walking_dark_skin_tone": "1f6b6-1f3ff", - "person_walking_facing_right": "1f6b6-200d-27a1-fe0f", - "person_walking_facing_right_dark_skin_tone": "1f6b6-1f3ff-200d-27a1-fe0f", - "person_walking_facing_right_light_skin_tone": "1f6b6-1f3fb-200d-27a1-fe0f", - "person_walking_facing_right_medium-dark_skin_tone": "1f6b6-1f3fe-200d-27a1-fe0f", - "person_walking_facing_right_medium-light_skin_tone": "1f6b6-1f3fc-200d-27a1-fe0f", - "person_walking_facing_right_medium_skin_tone": "1f6b6-1f3fd-200d-27a1-fe0f", - "person_walking_light_skin_tone": "1f6b6-1f3fb", - "person_walking_medium-dark_skin_tone": "1f6b6-1f3fe", - "person_walking_medium-light_skin_tone": "1f6b6-1f3fc", - "person_walking_medium_skin_tone": "1f6b6-1f3fd", - "person_wearing_turban_dark_skin_tone": "1f473-1f3ff", - "person_wearing_turban_light_skin_tone": "1f473-1f3fb", - "person_wearing_turban_medium-dark_skin_tone": "1f473-1f3fe", - "person_wearing_turban_medium-light_skin_tone": "1f473-1f3fc", - "person_wearing_turban_medium_skin_tone": "1f473-1f3fd", - "person_white_hair": "1f9d1-200d-1f9b3", - "person_with_crown": "1fac5", - "person_with_crown_dark_skin_tone": "1fac5-1f3ff", - "person_with_crown_light_skin_tone": "1fac5-1f3fb", - "person_with_crown_medium-dark_skin_tone": "1fac5-1f3fe", - "person_with_crown_medium-light_skin_tone": "1fac5-1f3fc", - "person_with_crown_medium_skin_tone": "1fac5-1f3fd", - "person_with_probing_cane": "1f9d1-200d-1f9af", - "person_with_skullcap_dark_skin_tone": "1f472-1f3ff", - "person_with_skullcap_light_skin_tone": "1f472-1f3fb", - "person_with_skullcap_medium-dark_skin_tone": "1f472-1f3fe", - "person_with_skullcap_medium-light_skin_tone": "1f472-1f3fc", - "person_with_skullcap_medium_skin_tone": "1f472-1f3fd", - "person_with_turban": "1f473", - "person_with_veil": "1f470", - "person_with_veil_dark_skin_tone": "1f470-1f3ff", - "person_with_veil_light_skin_tone": "1f470-1f3fb", - "person_with_veil_medium-dark_skin_tone": "1f470-1f3fe", - "person_with_veil_medium-light_skin_tone": "1f470-1f3fc", - "person_with_veil_medium_skin_tone": "1f470-1f3fd", - "person_with_white_cane_dark_skin_tone": "1f9d1-1f3ff-200d-1f9af", - "person_with_white_cane_facing_right": "1f9d1-200d-1f9af-200d-27a1-fe0f", - "person_with_white_cane_facing_right_dark_skin_tone": "1f9d1-1f3ff-200d-1f9af-200d-27a1-fe0f", - "person_with_white_cane_facing_right_light_skin_tone": "1f9d1-1f3fb-200d-1f9af-200d-27a1-fe0f", - "person_with_white_cane_facing_right_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f9af-200d-27a1-fe0f", - "person_with_white_cane_facing_right_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f9af-200d-27a1-fe0f", - "person_with_white_cane_facing_right_medium_skin_tone": "1f9d1-1f3fd-200d-1f9af-200d-27a1-fe0f", - "person_with_white_cane_light_skin_tone": "1f9d1-1f3fb-200d-1f9af", - "person_with_white_cane_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f9af", - "person_with_white_cane_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f9af", - "person_with_white_cane_medium_skin_tone": "1f9d1-1f3fd-200d-1f9af", - "peru": "1f1f5-1f1ea", - "petri_dish": "1f9eb", - "pewpewpew": "~pewpewpew", - "philippines": "1f1f5-1f1ed", - "phoenix": "1f426-200d-1f525", - "phone": "260e-fe0f", - "pick": "26cf-fe0f", - "pickup_truck": "1f6fb", - "pie": "1f967", - "pig": "1f437", - "pig2": "1f416", - "pig_nose": "1f43d", - "pill": "1f48a", - "pilot": "1f9d1-200d-2708-fe0f", - "pilot_dark_skin_tone": "1f9d1-1f3ff-200d-2708-fe0f", - "pilot_light_skin_tone": "1f9d1-1f3fb-200d-2708-fe0f", - "pilot_medium-dark_skin_tone": "1f9d1-1f3fe-200d-2708-fe0f", - "pilot_medium-light_skin_tone": "1f9d1-1f3fc-200d-2708-fe0f", - "pilot_medium_skin_tone": "1f9d1-1f3fd-200d-2708-fe0f", - "pinata": "1fa85", - "pinched_fingers": "1f90c", - "pinched_fingers_dark_skin_tone": "1f90c-1f3ff", - "pinched_fingers_light_skin_tone": "1f90c-1f3fb", - "pinched_fingers_medium-dark_skin_tone": "1f90c-1f3fe", - "pinched_fingers_medium-light_skin_tone": "1f90c-1f3fc", - "pinched_fingers_medium_skin_tone": "1f90c-1f3fd", - "pinching_hand": "1f90f", - "pinching_hand_dark_skin_tone": "1f90f-1f3ff", - "pinching_hand_light_skin_tone": "1f90f-1f3fb", - "pinching_hand_medium-dark_skin_tone": "1f90f-1f3fe", - "pinching_hand_medium-light_skin_tone": "1f90f-1f3fc", - "pinching_hand_medium_skin_tone": "1f90f-1f3fd", - "pineapple": "1f34d", - "ping_pong": "1f3d3", - "pink_heart": "1fa77", - "pirate_flag": "1f3f4-200d-2620-fe0f", - "pisces": "2653", - "pitcairn_islands": "1f1f5-1f1f3", - "pizza": "1f355", - "placard": "1faa7", - "place_of_worship": "1f6d0", - "plate_with_cutlery": "1f37d-fe0f", - "play_or_pause_button": "23ef-fe0f", - "playground_slide": "1f6dd", - "pleading_face": "1f97a", - "plunger": "1faa0", - "point_down": "1f447", - "point_left": "1f448", - "point_right": "1f449", - "point_up": "261d-fe0f", - "point_up_2": "1f446", - "poland": "1f1f5-1f1f1", - "polar_bear": "1f43b-200d-2744-fe0f", - "police_car": "1f693", - "police_officer": "1f46e", - "police_officer_dark_skin_tone": "1f46e-1f3ff", - "police_officer_light_skin_tone": "1f46e-1f3fb", - "police_officer_medium-dark_skin_tone": "1f46e-1f3fe", - "police_officer_medium-light_skin_tone": "1f46e-1f3fc", - "police_officer_medium_skin_tone": "1f46e-1f3fd", - "policeman": "1f46e-200d-2642-fe0f", - "policewoman": "1f46e-200d-2640-fe0f", - "poodle": "1f429", - "poop": "1f4a9", - "popcorn": "1f37f", - "portugal": "1f1f5-1f1f9", - "post_office": "1f3e3", - "postal_horn": "1f4ef", - "postbox": "1f4ee", - "potable_water": "1f6b0", - "potato": "1f954", - "potted_plant": "1fab4", - "pouch": "1f45d", - "poultry_leg": "1f357", - "pound": "1f4b7", - "pouring_liquid": "1fad7", - "pout": "1f621", - "pouting_cat": "1f63e", - "pouting_face": "1f64e", - "pouting_man": "1f64e-200d-2642-fe0f", - "pouting_woman": "1f64e-200d-2640-fe0f", - "pray": "1f64f", - "prayer_beads": "1f4ff", - "pregnant_man": "1fac3", - "pregnant_man_dark_skin_tone": "1fac3-1f3ff", - "pregnant_man_light_skin_tone": "1fac3-1f3fb", - "pregnant_man_medium-dark_skin_tone": "1fac3-1f3fe", - "pregnant_man_medium-light_skin_tone": "1fac3-1f3fc", - "pregnant_man_medium_skin_tone": "1fac3-1f3fd", - "pregnant_person": "1fac4", - "pregnant_person_dark_skin_tone": "1fac4-1f3ff", - "pregnant_person_light_skin_tone": "1fac4-1f3fb", - "pregnant_person_medium-dark_skin_tone": "1fac4-1f3fe", - "pregnant_person_medium-light_skin_tone": "1fac4-1f3fc", - "pregnant_person_medium_skin_tone": "1fac4-1f3fd", - "pregnant_woman": "1f930", - "pregnant_woman_dark_skin_tone": "1f930-1f3ff", - "pregnant_woman_light_skin_tone": "1f930-1f3fb", - "pregnant_woman_medium-dark_skin_tone": "1f930-1f3fe", - "pregnant_woman_medium-light_skin_tone": "1f930-1f3fc", - "pregnant_woman_medium_skin_tone": "1f930-1f3fd", - "pretzel": "1f968", - "previous_track_button": "23ee-fe0f", - "prince": "1f934", - "prince_dark_skin_tone": "1f934-1f3ff", - "prince_light_skin_tone": "1f934-1f3fb", - "prince_medium-dark_skin_tone": "1f934-1f3fe", - "prince_medium-light_skin_tone": "1f934-1f3fc", - "prince_medium_skin_tone": "1f934-1f3fd", - "princess": "1f478", - "princess_dark_skin_tone": "1f478-1f3ff", - "princess_light_skin_tone": "1f478-1f3fb", - "princess_medium-dark_skin_tone": "1f478-1f3fe", - "princess_medium-light_skin_tone": "1f478-1f3fc", - "princess_medium_skin_tone": "1f478-1f3fd", - "printer": "1f5a8-fe0f", - "probing_cane": "1f9af", - "puerto_rico": "1f1f5-1f1f7", - "punch": "1f44a", - "purple_circle": "1f7e3", - "purple_heart": "1f49c", - "purple_square": "1f7ea", - "purse": "1f45b", - "pushpin": "1f4cc", - "put_litter_in_its_place": "1f6ae", - "qatar": "1f1f6-1f1e6", - "question": "2753", - "rabbit": "1f430", - "rabbit2": "1f407", - "raccoon": "1f99d", - "racehorse": "1f40e", - "racing_car": "1f3ce-fe0f", - "radio": "1f4fb", - "radio_button": "1f518", - "radioactive": "2622-fe0f", - "rage": "1f621", - "railway_car": "1f683", - "railway_track": "1f6e4-fe0f", - "rainbow": "1f308", - "rainbow_flag": "1f3f3-fe0f-200d-1f308", - "raised_back_of_hand": "1f91a", - "raised_back_of_hand_dark_skin_tone": "1f91a-1f3ff", - "raised_back_of_hand_light_skin_tone": "1f91a-1f3fb", - "raised_back_of_hand_medium-dark_skin_tone": "1f91a-1f3fe", - "raised_back_of_hand_medium-light_skin_tone": "1f91a-1f3fc", - "raised_back_of_hand_medium_skin_tone": "1f91a-1f3fd", - "raised_eyebrow": "1f928", - "raised_fist_dark_skin_tone": "270a-1f3ff", - "raised_fist_light_skin_tone": "270a-1f3fb", - "raised_fist_medium-dark_skin_tone": "270a-1f3fe", - "raised_fist_medium-light_skin_tone": "270a-1f3fc", - "raised_fist_medium_skin_tone": "270a-1f3fd", - "raised_hand": "270b", - "raised_hand_dark_skin_tone": "270b-1f3ff", - "raised_hand_light_skin_tone": "270b-1f3fb", - "raised_hand_medium-dark_skin_tone": "270b-1f3fe", - "raised_hand_medium-light_skin_tone": "270b-1f3fc", - "raised_hand_medium_skin_tone": "270b-1f3fd", - "raised_hand_with_fingers_splayed": "1f590-fe0f", - "raised_hands": "1f64c", - "raising_hand": "1f64b", - "raising_hand_man": "1f64b-200d-2642-fe0f", - "raising_hand_woman": "1f64b-200d-2640-fe0f", - "raising_hands_dark_skin_tone": "1f64c-1f3ff", - "raising_hands_light_skin_tone": "1f64c-1f3fb", - "raising_hands_medium-dark_skin_tone": "1f64c-1f3fe", - "raising_hands_medium-light_skin_tone": "1f64c-1f3fc", - "raising_hands_medium_skin_tone": "1f64c-1f3fd", - "ram": "1f40f", - "ramen": "1f35c", - "rat": "1f400", - "razor": "1fa92", - "receipt": "1f9fe", - "record_button": "23fa-fe0f", - "recycle": "267b-fe0f", - "red_car": "1f697", - "red_circle": "1f534", - "red_envelope": "1f9e7", - "red_haired_man": "1f468-200d-1f9b0", - "red_haired_woman": "1f469-200d-1f9b0", - "red_square": "1f7e5", - "registered": "ae-fe0f", - "relaxed": "263a-fe0f", - "relieved": "1f60c", - "reminder_ribbon": "1f397-fe0f", - "repeat": "1f501", - "repeat_one": "1f502", - "rescue_worker_helmet": "26d1-fe0f", - "restroom": "1f6bb", - "reunion": "1f1f7-1f1ea", - "revolving_hearts": "1f49e", - "rewind": "23ea", - "rhinoceros": "1f98f", - "ribbon": "1f380", - "rice": "1f35a", - "rice_ball": "1f359", - "rice_cracker": "1f358", - "rice_scene": "1f391", - "right-facing_fist_dark_skin_tone": "1f91c-1f3ff", - "right-facing_fist_light_skin_tone": "1f91c-1f3fb", - "right-facing_fist_medium-dark_skin_tone": "1f91c-1f3fe", - "right-facing_fist_medium-light_skin_tone": "1f91c-1f3fc", - "right-facing_fist_medium_skin_tone": "1f91c-1f3fd", - "right_anger_bubble": "1f5ef-fe0f", - "rightwards_hand": "1faf1", - "rightwards_hand_dark_skin_tone": "1faf1-1f3ff", - "rightwards_hand_light_skin_tone": "1faf1-1f3fb", - "rightwards_hand_medium-dark_skin_tone": "1faf1-1f3fe", - "rightwards_hand_medium-light_skin_tone": "1faf1-1f3fc", - "rightwards_hand_medium_skin_tone": "1faf1-1f3fd", - "rightwards_pushing_hand": "1faf8", - "rightwards_pushing_hand_dark_skin_tone": "1faf8-1f3ff", - "rightwards_pushing_hand_light_skin_tone": "1faf8-1f3fb", - "rightwards_pushing_hand_medium-dark_skin_tone": "1faf8-1f3fe", - "rightwards_pushing_hand_medium-light_skin_tone": "1faf8-1f3fc", - "rightwards_pushing_hand_medium_skin_tone": "1faf8-1f3fd", - "ring": "1f48d", - "ring_buoy": "1f6df", - "ringed_planet": "1fa90", - "robot": "1f916", - "rock": "1faa8", - "rocket": "1f680", - "rofl": "1f923", - "roll_eyes": "1f644", - "roll_of_paper": "1f9fb", - "roller_coaster": "1f3a2", - "roller_skate": "1f6fc", - "romania": "1f1f7-1f1f4", - "rooster": "1f413", - "rose": "1f339", - "rosette": "1f3f5-fe0f", - "rotating_light": "1f6a8", - "round_pushpin": "1f4cd", - "rowboat": "1f6a3", - "rowing_man": "1f6a3-200d-2642-fe0f", - "rowing_woman": "1f6a3-200d-2640-fe0f", - "ru": "1f1f7-1f1fa", - "rugby_football": "1f3c9", - "runner": "1f3c3", - "running": "1f3c3", - "running_man": "1f3c3-200d-2642-fe0f", - "running_shirt_with_sash": "1f3bd", - "running_woman": "1f3c3-200d-2640-fe0f", - "rwanda": "1f1f7-1f1fc", - "sa": "1f202-fe0f", - "sad": "1f622", - "safety_pin": "1f9f7", - "safety_vest": "1f9ba", - "sagittarius": "2650", - "sailboat": "26f5", - "sake": "1f376", - "salt": "1f9c2", - "saluting_face": "1fae1", - "samoa": "1f1fc-1f1f8", - "san_marino": "1f1f8-1f1f2", - "sandal": "1f461", - "sandwich": "1f96a", - "santa": "1f385", - "santa_claus_dark_skin_tone": "1f385-1f3ff", - "santa_claus_light_skin_tone": "1f385-1f3fb", - "santa_claus_medium-dark_skin_tone": "1f385-1f3fe", - "santa_claus_medium-light_skin_tone": "1f385-1f3fc", - "santa_claus_medium_skin_tone": "1f385-1f3fd", - "sao_tome_principe": "1f1f8-1f1f9", - "sari": "1f97b", - "sassy_man": "1f481-200d-2642-fe0f", - "sassy_woman": "1f481-200d-2640-fe0f", - "satellite": "1f4e1", - "satisfied": "1f606", - "saudi_arabia": "1f1f8-1f1e6", - "sauna_man": "1f9d6-200d-2642-fe0f", - "sauna_person": "1f9d6", - "sauna_woman": "1f9d6-200d-2640-fe0f", - "sauropod": "1f995", - "saxophone": "1f3b7", - "scarf": "1f9e3", - "school": "1f3eb", - "school_satchel": "1f392", - "scientist": "1f9d1-200d-1f52c", - "scientist_dark_skin_tone": "1f9d1-1f3ff-200d-1f52c", - "scientist_light_skin_tone": "1f9d1-1f3fb-200d-1f52c", - "scientist_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f52c", - "scientist_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f52c", - "scientist_medium_skin_tone": "1f9d1-1f3fd-200d-1f52c", - "scissors": "2702-fe0f", - "scorpion": "1f982", - "scorpius": "264f", - "scotland": "1f3f4-e0067-e0062-e0073-e0063-e0074-e007f", - "scream": "1f631", - "scream_cat": "1f640", - "screwdriver": "1fa9b", - "scroll": "1f4dc", - "seal": "1f9ad", - "seat": "1f4ba", - "secret": "3299-fe0f", - "see_no_evil": "1f648", - "seedling": "1f331", - "selfie": "1f933", - "selfie_dark_skin_tone": "1f933-1f3ff", - "selfie_light_skin_tone": "1f933-1f3fb", - "selfie_medium-dark_skin_tone": "1f933-1f3fe", - "selfie_medium-light_skin_tone": "1f933-1f3fc", - "selfie_medium_skin_tone": "1f933-1f3fd", - "senegal": "1f1f8-1f1f3", - "serbia": "1f1f7-1f1f8", - "service_dog": "1f415-200d-1f9ba", - "seven": "37-fe0f-20e3", - "sewing_needle": "1faa1", - "seychelles": "1f1f8-1f1e8", - "shaking_face": "1fae8", - "shallow_pan_of_food": "1f958", - "shamrock": "2618-fe0f", - "shark": "1f988", - "shaved_ice": "1f367", - "sheep": "1f411", - "shell": "1f41a", - "shield": "1f6e1-fe0f", - "shinto_shrine": "26e9-fe0f", - "ship": "1f6a2", - "shirt": "1f455", - "shit": "~shit", - "shoe": "1f45e", - "shopping": "1f6cd-fe0f", - "shopping_cart": "1f6d2", - "shorts": "1fa73", - "shower": "1f6bf", - "shrimp": "1f990", - "shrug": "1f937", - "shushing_face": "1f92b", - "sierra_leone": "1f1f8-1f1f1", - "sign_of_the_horns_dark_skin_tone": "1f918-1f3ff", - "sign_of_the_horns_light_skin_tone": "1f918-1f3fb", - "sign_of_the_horns_medium-dark_skin_tone": "1f918-1f3fe", - "sign_of_the_horns_medium-light_skin_tone": "1f918-1f3fc", - "sign_of_the_horns_medium_skin_tone": "1f918-1f3fd", - "signal_strength": "1f4f6", - "singapore": "1f1f8-1f1ec", - "singer": "1f9d1-200d-1f3a4", - "singer_dark_skin_tone": "1f9d1-1f3ff-200d-1f3a4", - "singer_light_skin_tone": "1f9d1-1f3fb-200d-1f3a4", - "singer_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f3a4", - "singer_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f3a4", - "singer_medium_skin_tone": "1f9d1-1f3fd-200d-1f3a4", - "sint_maarten": "1f1f8-1f1fd", - "six": "36-fe0f-20e3", - "six_pointed_star": "1f52f", - "skateboard": "1f6f9", - "ski": "1f3bf", - "skier": "26f7-fe0f", - "skull": "1f480", - "skull_and_crossbones": "2620-fe0f", - "skunk": "1f9a8", - "sled": "1f6f7", - "sleeping": "1f634", - "sleeping_bed": "1f6cc", - "sleepy": "1f62a", - "slightly_frowning_face": "1f641", - "slightly_smiling_face": "1f642", - "slot_machine": "1f3b0", - "sloth": "1f9a5", - "slovakia": "1f1f8-1f1f0", - "slovenia": "1f1f8-1f1ee", - "small_airplane": "1f6e9-fe0f", - "small_blue_diamond": "1f539", - "small_orange_diamond": "1f538", - "small_red_triangle": "1f53a", - "small_red_triangle_down": "1f53b", - "smile": "1f604", - "smile_cat": "1f638", - "smiley": "1f603", - "smiley_cat": "1f63a", - "smiling_face_with_tear": "1f972", - "smiling_face_with_three_hearts": "1f970", - "smiling_imp": "1f608", - "smirk": "1f60f", - "smirk_cat": "1f63c", - "smoking": "1f6ac", - "snail": "1f40c", - "snake": "1f40d", - "sneezing_face": "1f927", - "snowboarder": "1f3c2", - "snowboarder_dark_skin_tone": "1f3c2-1f3ff", - "snowboarder_light_skin_tone": "1f3c2-1f3fb", - "snowboarder_medium-dark_skin_tone": "1f3c2-1f3fe", - "snowboarder_medium-light_skin_tone": "1f3c2-1f3fc", - "snowboarder_medium_skin_tone": "1f3c2-1f3fd", - "snowflake": "2744-fe0f", - "snowman": "26c4", - "snowman_with_snow": "2603-fe0f", - "soap": "1f9fc", - "sob": "1f62d", - "soccer": "26bd", - "socks": "1f9e6", - "softball": "1f94e", - "solomon_islands": "1f1f8-1f1e7", - "somalia": "1f1f8-1f1f4", - "soon": "1f51c", - "sos": "1f198", - "sound": "1f509", - "south_africa": "1f1ff-1f1e6", - "south_georgia_south_sandwich_islands": "1f1ec-1f1f8", - "south_sudan": "1f1f8-1f1f8", - "space_invader": "1f47e", - "spades": "2660-fe0f", - "spaghetti": "1f35d", - "sparkle": "2747-fe0f", - "sparkler": "1f387", - "sparkles": "2728", - "sparkling_heart": "1f496", - "speak_no_evil": "1f64a", - "speaker": "1f508", - "speaking_head": "1f5e3-fe0f", - "speech_balloon": "1f4ac", - "speedboat": "1f6a4", - "spider": "1f577-fe0f", - "spider_web": "1f578-fe0f", - "spiral_calendar": "1f5d3-fe0f", - "spiral_notepad": "1f5d2-fe0f", - "sponge": "1f9fd", - "spoon": "1f944", - "squid": "1f991", - "sri_lanka": "1f1f1-1f1f0", - "st_barthelemy": "1f1e7-1f1f1", - "st_helena": "1f1f8-1f1ed", - "st_kitts_nevis": "1f1f0-1f1f3", - "st_lucia": "1f1f1-1f1e8", - "st_martin": "1f1f2-1f1eb", - "st_pierre_miquelon": "1f1f5-1f1f2", - "st_vincent_grenadines": "1f1fb-1f1e8", - "stadium": "1f3df-fe0f", - "standing_man": "1f9cd-200d-2642-fe0f", - "standing_person": "1f9cd", - "standing_woman": "1f9cd-200d-2640-fe0f", - "star": "2b50", - "star2": "1f31f", - "star_and_crescent": "262a-fe0f", - "star_of_david": "2721-fe0f", - "star_struck": "1f929", - "stars": "1f320", - "station": "1f689", - "statue_of_liberty": "1f5fd", - "steam_locomotive": "1f682", - "stethoscope": "1fa7a", - "stew": "1f372", - "stop_button": "23f9-fe0f", - "stop_sign": "1f6d1", - "stopwatch": "23f1-fe0f", - "straight_ruler": "1f4cf", - "strawberry": "1f353", - "stuck_out_tongue": "1f61b", - "stuck_out_tongue_closed_eyes": "1f61d", - "stuck_out_tongue_winking_eye": "1f61c", - "student": "1f9d1-200d-1f393", - "student_dark_skin_tone": "1f9d1-1f3ff-200d-1f393", - "student_light_skin_tone": "1f9d1-1f3fb-200d-1f393", - "student_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f393", - "student_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f393", - "student_medium_skin_tone": "1f9d1-1f3fd-200d-1f393", - "studio_microphone": "1f399-fe0f", - "stuffed_flatbread": "1f959", - "sudan": "1f1f8-1f1e9", - "sun": "2600-fe0f", - "sun_behind_large_cloud": "1f325-fe0f", - "sun_behind_rain_cloud": "1f326-fe0f", - "sun_behind_small_cloud": "1f324-fe0f", - "sun_with_face": "1f31e", - "sunflower": "1f33b", - "sunglasses": "1f60e", - "sunny": "2600-fe0f", - "sunrise": "1f305", - "sunrise_over_mountains": "1f304", - "superhero": "1f9b8", - "superhero_dark_skin_tone": "1f9b8-1f3ff", - "superhero_light_skin_tone": "1f9b8-1f3fb", - "superhero_man": "1f9b8-200d-2642-fe0f", - "superhero_medium-dark_skin_tone": "1f9b8-1f3fe", - "superhero_medium-light_skin_tone": "1f9b8-1f3fc", - "superhero_medium_skin_tone": "1f9b8-1f3fd", - "superhero_woman": "1f9b8-200d-2640-fe0f", - "supervillain": "1f9b9", - "supervillain_dark_skin_tone": "1f9b9-1f3ff", - "supervillain_light_skin_tone": "1f9b9-1f3fb", - "supervillain_man": "1f9b9-200d-2642-fe0f", - "supervillain_medium-dark_skin_tone": "1f9b9-1f3fe", - "supervillain_medium-light_skin_tone": "1f9b9-1f3fc", - "supervillain_medium_skin_tone": "1f9b9-1f3fd", - "supervillain_woman": "1f9b9-200d-2640-fe0f", - "surfer": "1f3c4", - "surfing_man": "1f3c4-200d-2642-fe0f", - "surfing_woman": "1f3c4-200d-2640-fe0f", - "suriname": "1f1f8-1f1f7", - "sushi": "1f363", - "suspension_railway": "1f69f", - "svalbard_jan_mayen": "1f1f8-1f1ef", - "swan": "1f9a2", - "swaziland": "1f1f8-1f1ff", - "sweat": "1f613", - "sweat_drops": "1f4a6", - "sweat_smile": "1f605", - "sweden": "1f1f8-1f1ea", - "sweet_potato": "1f360", - "swim_brief": "1fa72", - "swimmer": "1f3ca", - "swimming_man": "1f3ca-200d-2642-fe0f", - "swimming_woman": "1f3ca-200d-2640-fe0f", - "switzerland": "1f1e8-1f1ed", - "symbols": "1f523", - "synagogue": "1f54d", - "syria": "1f1f8-1f1fe", - "syringe": "1f489", - "t-rex": "1f996", - "taco": "1f32e", - "tada": "1f389", - "taiwan": "1f1f9-1f1fc", - "tajikistan": "1f1f9-1f1ef", - "takeout_box": "1f961", - "tamale": "1fad4", - "tanabata_tree": "1f38b", - "tangerine": "1f34a", - "tanzania": "1f1f9-1f1ff", - "taurus": "2649", - "taxi": "1f695", - "tea": "1f375", - "teacher": "1f9d1-200d-1f3eb", - "teacher_dark_skin_tone": "1f9d1-1f3ff-200d-1f3eb", - "teacher_light_skin_tone": "1f9d1-1f3fb-200d-1f3eb", - "teacher_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f3eb", - "teacher_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f3eb", - "teacher_medium_skin_tone": "1f9d1-1f3fd-200d-1f3eb", - "teapot": "1fad6", - "technologist": "1f9d1-200d-1f4bb", - "technologist_dark_skin_tone": "1f9d1-1f3ff-200d-1f4bb", - "technologist_light_skin_tone": "1f9d1-1f3fb-200d-1f4bb", - "technologist_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f4bb", - "technologist_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f4bb", - "technologist_medium_skin_tone": "1f9d1-1f3fd-200d-1f4bb", - "teddy_bear": "1f9f8", - "telephone": "260e-fe0f", - "telephone_receiver": "1f4de", - "telescope": "1f52d", - "tennis": "1f3be", - "tent": "26fa", - "test_tube": "1f9ea", - "thailand": "1f1f9-1f1ed", - "thermometer": "1f321-fe0f", - "thinking": "1f914", - "thong_sandal": "1fa74", - "thought_balloon": "1f4ad", - "thread": "1f9f5", - "three": "33-fe0f-20e3", - "thumbs_down_dark_skin_tone": "1f44e-1f3ff", - "thumbs_down_light_skin_tone": "1f44e-1f3fb", - "thumbs_down_medium-dark_skin_tone": "1f44e-1f3fe", - "thumbs_down_medium-light_skin_tone": "1f44e-1f3fc", - "thumbs_down_medium_skin_tone": "1f44e-1f3fd", - "thumbs_up_dark_skin_tone": "1f44d-1f3ff", - "thumbs_up_light_skin_tone": "1f44d-1f3fb", - "thumbs_up_medium-dark_skin_tone": "1f44d-1f3fe", - "thumbs_up_medium-light_skin_tone": "1f44d-1f3fc", - "thumbs_up_medium_skin_tone": "1f44d-1f3fd", - "thumbsdown": "1f44e", - "thumbsup": "1f44d", - "ticket": "1f3ab", - "tickets": "1f39f-fe0f", - "tiger": "1f42f", - "tiger2": "1f405", - "timer_clock": "23f2-fe0f", - "timor_leste": "1f1f9-1f1f1", - "tipping_hand_man": "1f481-200d-2642-fe0f", - "tipping_hand_person": "1f481", - "tipping_hand_woman": "1f481-200d-2640-fe0f", - "tired_face": "1f62b", - "tm": "2122-fe0f", - "togo": "1f1f9-1f1ec", - "toilet": "1f6bd", - "tokelau": "1f1f9-1f1f0", - "tokyo_tower": "1f5fc", - "tomato": "1f345", - "tonga": "1f1f9-1f1f4", - "tongue": "1f445", - "toolbox": "1f9f0", - "tooth": "1f9b7", - "toothbrush": "1faa5", - "top": "1f51d", - "tophat": "1f3a9", - "tornado": "1f32a-fe0f", - "tr": "1f1f9-1f1f7", - "trackball": "1f5b2-fe0f", - "tractor": "1f69c", - "traffic_light": "1f6a5", - "train": "1f68b", - "train2": "1f686", - "tram": "1f68a", - "transgender_flag": "1f3f3-fe0f-200d-26a7-fe0f", - "transgender_symbol": "26a7-fe0f", - "triangular_flag_on_post": "1f6a9", - "triangular_ruler": "1f4d0", - "trident": "1f531", - "trinidad_tobago": "1f1f9-1f1f9", - "tristan_da_cunha": "1f1f9-1f1e6", - "triumph": "1f624", - "troll": "1f9cc", - "trolleybus": "1f68e", - "trophy": "1f3c6", - "tropical_drink": "1f379", - "tropical_fish": "1f420", - "truck": "1f69a", - "trumpet": "1f3ba", - "tshirt": "1f455", - "tulip": "1f337", - "tumbler_glass": "1f943", - "tumbleweed": "~tumbleweed", - "tumbleweed!": "~tumbleweed2", - "tumbleweed2": "~tumbleweed2", - "tunisia": "1f1f9-1f1f3", - "turkey": "1f983", - "turkmenistan": "1f1f9-1f1f2", - "turks_caicos_islands": "1f1f9-1f1e8", - "turtle": "1f422", - "tuvalu": "1f1f9-1f1fb", - "tv": "1f4fa", - "twisted_rightwards_arrows": "1f500", - "two": "32-fe0f-20e3", - "two_hearts": "1f495", - "two_men_holding_hands": "1f46c", - "two_women_holding_hands": "1f46d", - "u5272": "1f239", - "u5408": "1f234", - "u55b6": "1f23a", - "u6307": "1f22f", - "u6708": "1f237-fe0f", - "u6709": "1f236", - "u6e80": "1f235", - "u7121": "1f21a", - "u7533": "1f238", - "u7981": "1f232", - "u7a7a": "1f233", - "uganda": "1f1fa-1f1ec", - "uk": "1f1ec-1f1e7", - "ukraine": "1f1fa-1f1e6", - "umbrella": "2614", - "unamused": "1f612", - "underage": "1f51e", - "unicorn": "1f984", - "united_arab_emirates": "1f1e6-1f1ea", - "united_nations": "1f1fa-1f1f3", - "unlock": "1f513", - "up": "1f199", - "upside_down_face": "1f643", - "uruguay": "1f1fa-1f1fe", - "us": "1f1fa-1f1f8", - "us_outlying_islands": "1f1fa-1f1f2", - "us_virgin_islands": "1f1fb-1f1ee", - "uzbekistan": "1f1fa-1f1ff", - "v": "270c-fe0f", - "vampire": "1f9db", - "vampire_dark_skin_tone": "1f9db-1f3ff", - "vampire_light_skin_tone": "1f9db-1f3fb", - "vampire_man": "1f9db-200d-2642-fe0f", - "vampire_medium-dark_skin_tone": "1f9db-1f3fe", - "vampire_medium-light_skin_tone": "1f9db-1f3fc", - "vampire_medium_skin_tone": "1f9db-1f3fd", - "vampire_woman": "1f9db-200d-2640-fe0f", - "vanuatu": "1f1fb-1f1fa", - "vatican_city": "1f1fb-1f1e6", - "venezuela": "1f1fb-1f1ea", - "vertical_traffic_light": "1f6a6", - "vhs": "1f4fc", - "vibration_mode": "1f4f3", - "victory_hand_dark_skin_tone": "270c-1f3ff", - "victory_hand_light_skin_tone": "270c-1f3fb", - "victory_hand_medium-dark_skin_tone": "270c-1f3fe", - "victory_hand_medium-light_skin_tone": "270c-1f3fc", - "victory_hand_medium_skin_tone": "270c-1f3fd", - "video_camera": "1f4f9", - "video_game": "1f3ae", - "vietnam": "1f1fb-1f1f3", - "violin": "1f3bb", - "virgo": "264d", - "volcano": "1f30b", - "volleyball": "1f3d0", - "vomiting_face": "1f92e", - "vs": "1f19a", - "vulcan_salute": "1f596", - "vulcan_salute_dark_skin_tone": "1f596-1f3ff", - "vulcan_salute_light_skin_tone": "1f596-1f3fb", - "vulcan_salute_medium-dark_skin_tone": "1f596-1f3fe", - "vulcan_salute_medium-light_skin_tone": "1f596-1f3fc", - "vulcan_salute_medium_skin_tone": "1f596-1f3fd", - "waffle": "1f9c7", - "wales": "1f3f4-e0067-e0062-e0077-e006c-e0073-e007f", - "walking": "1f6b6", - "walking_man": "1f6b6-200d-2642-fe0f", - "walking_woman": "1f6b6-200d-2640-fe0f", - "wallis_futuna": "1f1fc-1f1eb", - "waning_crescent_moon": "1f318", - "waning_gibbous_moon": "1f316", - "warning": "26a0-fe0f", - "wastebasket": "1f5d1-fe0f", - "watch": "231a", - "water_buffalo": "1f403", - "water_polo": "1f93d", - "watermelon": "1f349", - "wave": "1f44b", - "waving_hand_dark_skin_tone": "1f44b-1f3ff", - "waving_hand_light_skin_tone": "1f44b-1f3fb", - "waving_hand_medium-dark_skin_tone": "1f44b-1f3fe", - "waving_hand_medium-light_skin_tone": "1f44b-1f3fc", - "waving_hand_medium_skin_tone": "1f44b-1f3fd", - "wavy_dash": "3030-fe0f", - "waxing_crescent_moon": "1f312", - "waxing_gibbous_moon": "1f314", - "wc": "1f6be", - "weary": "1f629", - "wedding": "1f492", - "weight_lifting": "1f3cb-fe0f", - "weight_lifting_man": "1f3cb-fe0f-200d-2642-fe0f", - "weight_lifting_woman": "1f3cb-fe0f-200d-2640-fe0f", - "western_sahara": "1f1ea-1f1ed", - "whale": "1f433", - "whale2": "1f40b", - "wheel": "1f6de", - "wheel_of_dharma": "2638-fe0f", - "wheelchair": "267f", - "white_check_mark": "2705", - "white_circle": "26aa", - "white_flag": "1f3f3-fe0f", - "white_flower": "1f4ae", - "white_haired_man": "1f468-200d-1f9b3", - "white_haired_woman": "1f469-200d-1f9b3", - "white_heart": "1f90d", - "white_large_square": "2b1c", - "white_medium_small_square": "25fd", - "white_medium_square": "25fb-fe0f", - "white_small_square": "25ab-fe0f", - "white_square_button": "1f533", - "wilted_flower": "1f940", - "wind_chime": "1f390", - "wind_face": "1f32c-fe0f", - "window": "1fa9f", - "wine_glass": "1f377", - "wing": "1fabd", - "wink": "1f609", - "wireless": "1f6dc", - "wolf": "1f43a", - "woman": "1f469", - "woman_and_man_holding_hands_dark_skin_tone": "1f46b-1f3ff", - "woman_and_man_holding_hands_dark_skin_tone_light_skin_tone": "1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb", - "woman_and_man_holding_hands_dark_skin_tone_medium-dark_skin_tone": "1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe", - "woman_and_man_holding_hands_dark_skin_tone_medium-light_skin_tone": "1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc", - "woman_and_man_holding_hands_dark_skin_tone_medium_skin_tone": "1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd", - "woman_and_man_holding_hands_light_skin_tone": "1f46b-1f3fb", - "woman_and_man_holding_hands_light_skin_tone_dark_skin_tone": "1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff", - "woman_and_man_holding_hands_light_skin_tone_medium-dark_skin_tone": "1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe", - "woman_and_man_holding_hands_light_skin_tone_medium-light_skin_tone": "1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc", - "woman_and_man_holding_hands_light_skin_tone_medium_skin_tone": "1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd", - "woman_and_man_holding_hands_medium-dark_skin_tone": "1f46b-1f3fe", - "woman_and_man_holding_hands_medium-dark_skin_tone_dark_skin_tone": "1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff", - "woman_and_man_holding_hands_medium-dark_skin_tone_light_skin_tone": "1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb", - "woman_and_man_holding_hands_medium-dark_skin_tone_medium-light_skin_tone": "1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc", - "woman_and_man_holding_hands_medium-dark_skin_tone_medium_skin_tone": "1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd", - "woman_and_man_holding_hands_medium-light_skin_tone": "1f46b-1f3fc", - "woman_and_man_holding_hands_medium-light_skin_tone_dark_skin_tone": "1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff", - "woman_and_man_holding_hands_medium-light_skin_tone_light_skin_tone": "1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb", - "woman_and_man_holding_hands_medium-light_skin_tone_medium-dark_skin_tone": "1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe", - "woman_and_man_holding_hands_medium-light_skin_tone_medium_skin_tone": "1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd", - "woman_and_man_holding_hands_medium_skin_tone": "1f46b-1f3fd", - "woman_and_man_holding_hands_medium_skin_tone_dark_skin_tone": "1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff", - "woman_and_man_holding_hands_medium_skin_tone_light_skin_tone": "1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb", - "woman_and_man_holding_hands_medium_skin_tone_medium-dark_skin_tone": "1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe", - "woman_and_man_holding_hands_medium_skin_tone_medium-light_skin_tone": "1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc", - "woman_artist": "1f469-200d-1f3a8", - "woman_artist_dark_skin_tone": "1f469-1f3ff-200d-1f3a8", - "woman_artist_light_skin_tone": "1f469-1f3fb-200d-1f3a8", - "woman_artist_medium-dark_skin_tone": "1f469-1f3fe-200d-1f3a8", - "woman_artist_medium-light_skin_tone": "1f469-1f3fc-200d-1f3a8", - "woman_artist_medium_skin_tone": "1f469-1f3fd-200d-1f3a8", - "woman_astronaut": "1f469-200d-1f680", - "woman_astronaut_dark_skin_tone": "1f469-1f3ff-200d-1f680", - "woman_astronaut_light_skin_tone": "1f469-1f3fb-200d-1f680", - "woman_astronaut_medium-dark_skin_tone": "1f469-1f3fe-200d-1f680", - "woman_astronaut_medium-light_skin_tone": "1f469-1f3fc-200d-1f680", - "woman_astronaut_medium_skin_tone": "1f469-1f3fd-200d-1f680", - "woman_beard": "1f9d4-200d-2640-fe0f", - "woman_biking_dark_skin_tone": "1f6b4-1f3ff-200d-2640-fe0f", - "woman_biking_light_skin_tone": "1f6b4-1f3fb-200d-2640-fe0f", - "woman_biking_medium-dark_skin_tone": "1f6b4-1f3fe-200d-2640-fe0f", - "woman_biking_medium-light_skin_tone": "1f6b4-1f3fc-200d-2640-fe0f", - "woman_biking_medium_skin_tone": "1f6b4-1f3fd-200d-2640-fe0f", - "woman_bouncing_ball_dark_skin_tone": "26f9-1f3ff-200d-2640-fe0f", - "woman_bouncing_ball_light_skin_tone": "26f9-1f3fb-200d-2640-fe0f", - "woman_bouncing_ball_medium-dark_skin_tone": "26f9-1f3fe-200d-2640-fe0f", - "woman_bouncing_ball_medium-light_skin_tone": "26f9-1f3fc-200d-2640-fe0f", - "woman_bouncing_ball_medium_skin_tone": "26f9-1f3fd-200d-2640-fe0f", - "woman_bowing_dark_skin_tone": "1f647-1f3ff-200d-2640-fe0f", - "woman_bowing_light_skin_tone": "1f647-1f3fb-200d-2640-fe0f", - "woman_bowing_medium-dark_skin_tone": "1f647-1f3fe-200d-2640-fe0f", - "woman_bowing_medium-light_skin_tone": "1f647-1f3fc-200d-2640-fe0f", - "woman_bowing_medium_skin_tone": "1f647-1f3fd-200d-2640-fe0f", - "woman_cartwheeling": "1f938-200d-2640-fe0f", - "woman_cartwheeling_dark_skin_tone": "1f938-1f3ff-200d-2640-fe0f", - "woman_cartwheeling_light_skin_tone": "1f938-1f3fb-200d-2640-fe0f", - "woman_cartwheeling_medium-dark_skin_tone": "1f938-1f3fe-200d-2640-fe0f", - "woman_cartwheeling_medium-light_skin_tone": "1f938-1f3fc-200d-2640-fe0f", - "woman_cartwheeling_medium_skin_tone": "1f938-1f3fd-200d-2640-fe0f", - "woman_climbing_dark_skin_tone": "1f9d7-1f3ff-200d-2640-fe0f", - "woman_climbing_light_skin_tone": "1f9d7-1f3fb-200d-2640-fe0f", - "woman_climbing_medium-dark_skin_tone": "1f9d7-1f3fe-200d-2640-fe0f", - "woman_climbing_medium-light_skin_tone": "1f9d7-1f3fc-200d-2640-fe0f", - "woman_climbing_medium_skin_tone": "1f9d7-1f3fd-200d-2640-fe0f", - "woman_construction_worker_dark_skin_tone": "1f477-1f3ff-200d-2640-fe0f", - "woman_construction_worker_light_skin_tone": "1f477-1f3fb-200d-2640-fe0f", - "woman_construction_worker_medium-dark_skin_tone": "1f477-1f3fe-200d-2640-fe0f", - "woman_construction_worker_medium-light_skin_tone": "1f477-1f3fc-200d-2640-fe0f", - "woman_construction_worker_medium_skin_tone": "1f477-1f3fd-200d-2640-fe0f", - "woman_cook": "1f469-200d-1f373", - "woman_cook_dark_skin_tone": "1f469-1f3ff-200d-1f373", - "woman_cook_light_skin_tone": "1f469-1f3fb-200d-1f373", - "woman_cook_medium-dark_skin_tone": "1f469-1f3fe-200d-1f373", - "woman_cook_medium-light_skin_tone": "1f469-1f3fc-200d-1f373", - "woman_cook_medium_skin_tone": "1f469-1f3fd-200d-1f373", - "woman_dancing": "1f483", - "woman_dancing_dark_skin_tone": "1f483-1f3ff", - "woman_dancing_light_skin_tone": "1f483-1f3fb", - "woman_dancing_medium-dark_skin_tone": "1f483-1f3fe", - "woman_dancing_medium-light_skin_tone": "1f483-1f3fc", - "woman_dancing_medium_skin_tone": "1f483-1f3fd", - "woman_dark_skin_tone": "1f469-1f3ff", - "woman_dark_skin_tone_bald": "1f469-1f3ff-200d-1f9b2", - "woman_dark_skin_tone_beard": "1f9d4-1f3ff-200d-2640-fe0f", - "woman_dark_skin_tone_blond_hair": "1f471-1f3ff-200d-2640-fe0f", - "woman_dark_skin_tone_curly_hair": "1f469-1f3ff-200d-1f9b1", - "woman_dark_skin_tone_red_hair": "1f469-1f3ff-200d-1f9b0", - "woman_dark_skin_tone_white_hair": "1f469-1f3ff-200d-1f9b3", - "woman_detective_dark_skin_tone": "1f575-1f3ff-200d-2640-fe0f", - "woman_detective_light_skin_tone": "1f575-1f3fb-200d-2640-fe0f", - "woman_detective_medium-dark_skin_tone": "1f575-1f3fe-200d-2640-fe0f", - "woman_detective_medium-light_skin_tone": "1f575-1f3fc-200d-2640-fe0f", - "woman_detective_medium_skin_tone": "1f575-1f3fd-200d-2640-fe0f", - "woman_elf_dark_skin_tone": "1f9dd-1f3ff-200d-2640-fe0f", - "woman_elf_light_skin_tone": "1f9dd-1f3fb-200d-2640-fe0f", - "woman_elf_medium-dark_skin_tone": "1f9dd-1f3fe-200d-2640-fe0f", - "woman_elf_medium-light_skin_tone": "1f9dd-1f3fc-200d-2640-fe0f", - "woman_elf_medium_skin_tone": "1f9dd-1f3fd-200d-2640-fe0f", - "woman_facepalming": "1f926-200d-2640-fe0f", - "woman_facepalming_dark_skin_tone": "1f926-1f3ff-200d-2640-fe0f", - "woman_facepalming_light_skin_tone": "1f926-1f3fb-200d-2640-fe0f", - "woman_facepalming_medium-dark_skin_tone": "1f926-1f3fe-200d-2640-fe0f", - "woman_facepalming_medium-light_skin_tone": "1f926-1f3fc-200d-2640-fe0f", - "woman_facepalming_medium_skin_tone": "1f926-1f3fd-200d-2640-fe0f", - "woman_factory_worker": "1f469-200d-1f3ed", - "woman_factory_worker_dark_skin_tone": "1f469-1f3ff-200d-1f3ed", - "woman_factory_worker_light_skin_tone": "1f469-1f3fb-200d-1f3ed", - "woman_factory_worker_medium-dark_skin_tone": "1f469-1f3fe-200d-1f3ed", - "woman_factory_worker_medium-light_skin_tone": "1f469-1f3fc-200d-1f3ed", - "woman_factory_worker_medium_skin_tone": "1f469-1f3fd-200d-1f3ed", - "woman_fairy_dark_skin_tone": "1f9da-1f3ff-200d-2640-fe0f", - "woman_fairy_light_skin_tone": "1f9da-1f3fb-200d-2640-fe0f", - "woman_fairy_medium-dark_skin_tone": "1f9da-1f3fe-200d-2640-fe0f", - "woman_fairy_medium-light_skin_tone": "1f9da-1f3fc-200d-2640-fe0f", - "woman_fairy_medium_skin_tone": "1f9da-1f3fd-200d-2640-fe0f", - "woman_farmer": "1f469-200d-1f33e", - "woman_farmer_dark_skin_tone": "1f469-1f3ff-200d-1f33e", - "woman_farmer_light_skin_tone": "1f469-1f3fb-200d-1f33e", - "woman_farmer_medium-dark_skin_tone": "1f469-1f3fe-200d-1f33e", - "woman_farmer_medium-light_skin_tone": "1f469-1f3fc-200d-1f33e", - "woman_farmer_medium_skin_tone": "1f469-1f3fd-200d-1f33e", - "woman_feeding_baby": "1f469-200d-1f37c", - "woman_feeding_baby_dark_skin_tone": "1f469-1f3ff-200d-1f37c", - "woman_feeding_baby_light_skin_tone": "1f469-1f3fb-200d-1f37c", - "woman_feeding_baby_medium-dark_skin_tone": "1f469-1f3fe-200d-1f37c", - "woman_feeding_baby_medium-light_skin_tone": "1f469-1f3fc-200d-1f37c", - "woman_feeding_baby_medium_skin_tone": "1f469-1f3fd-200d-1f37c", - "woman_firefighter": "1f469-200d-1f692", - "woman_firefighter_dark_skin_tone": "1f469-1f3ff-200d-1f692", - "woman_firefighter_light_skin_tone": "1f469-1f3fb-200d-1f692", - "woman_firefighter_medium-dark_skin_tone": "1f469-1f3fe-200d-1f692", - "woman_firefighter_medium-light_skin_tone": "1f469-1f3fc-200d-1f692", - "woman_firefighter_medium_skin_tone": "1f469-1f3fd-200d-1f692", - "woman_frowning_dark_skin_tone": "1f64d-1f3ff-200d-2640-fe0f", - "woman_frowning_light_skin_tone": "1f64d-1f3fb-200d-2640-fe0f", - "woman_frowning_medium-dark_skin_tone": "1f64d-1f3fe-200d-2640-fe0f", - "woman_frowning_medium-light_skin_tone": "1f64d-1f3fc-200d-2640-fe0f", - "woman_frowning_medium_skin_tone": "1f64d-1f3fd-200d-2640-fe0f", - "woman_gesturing_no_dark_skin_tone": "1f645-1f3ff-200d-2640-fe0f", - "woman_gesturing_no_light_skin_tone": "1f645-1f3fb-200d-2640-fe0f", - "woman_gesturing_no_medium-dark_skin_tone": "1f645-1f3fe-200d-2640-fe0f", - "woman_gesturing_no_medium-light_skin_tone": "1f645-1f3fc-200d-2640-fe0f", - "woman_gesturing_no_medium_skin_tone": "1f645-1f3fd-200d-2640-fe0f", - "woman_gesturing_ok_dark_skin_tone": "1f646-1f3ff-200d-2640-fe0f", - "woman_gesturing_ok_light_skin_tone": "1f646-1f3fb-200d-2640-fe0f", - "woman_gesturing_ok_medium-dark_skin_tone": "1f646-1f3fe-200d-2640-fe0f", - "woman_gesturing_ok_medium-light_skin_tone": "1f646-1f3fc-200d-2640-fe0f", - "woman_gesturing_ok_medium_skin_tone": "1f646-1f3fd-200d-2640-fe0f", - "woman_getting_haircut_dark_skin_tone": "1f487-1f3ff-200d-2640-fe0f", - "woman_getting_haircut_light_skin_tone": "1f487-1f3fb-200d-2640-fe0f", - "woman_getting_haircut_medium-dark_skin_tone": "1f487-1f3fe-200d-2640-fe0f", - "woman_getting_haircut_medium-light_skin_tone": "1f487-1f3fc-200d-2640-fe0f", - "woman_getting_haircut_medium_skin_tone": "1f487-1f3fd-200d-2640-fe0f", - "woman_getting_massage_dark_skin_tone": "1f486-1f3ff-200d-2640-fe0f", - "woman_getting_massage_light_skin_tone": "1f486-1f3fb-200d-2640-fe0f", - "woman_getting_massage_medium-dark_skin_tone": "1f486-1f3fe-200d-2640-fe0f", - "woman_getting_massage_medium-light_skin_tone": "1f486-1f3fc-200d-2640-fe0f", - "woman_getting_massage_medium_skin_tone": "1f486-1f3fd-200d-2640-fe0f", - "woman_golfing_dark_skin_tone": "1f3cc-1f3ff-200d-2640-fe0f", - "woman_golfing_light_skin_tone": "1f3cc-1f3fb-200d-2640-fe0f", - "woman_golfing_medium-dark_skin_tone": "1f3cc-1f3fe-200d-2640-fe0f", - "woman_golfing_medium-light_skin_tone": "1f3cc-1f3fc-200d-2640-fe0f", - "woman_golfing_medium_skin_tone": "1f3cc-1f3fd-200d-2640-fe0f", - "woman_guard_dark_skin_tone": "1f482-1f3ff-200d-2640-fe0f", - "woman_guard_light_skin_tone": "1f482-1f3fb-200d-2640-fe0f", - "woman_guard_medium-dark_skin_tone": "1f482-1f3fe-200d-2640-fe0f", - "woman_guard_medium-light_skin_tone": "1f482-1f3fc-200d-2640-fe0f", - "woman_guard_medium_skin_tone": "1f482-1f3fd-200d-2640-fe0f", - "woman_health_worker": "1f469-200d-2695-fe0f", - "woman_health_worker_dark_skin_tone": "1f469-1f3ff-200d-2695-fe0f", - "woman_health_worker_light_skin_tone": "1f469-1f3fb-200d-2695-fe0f", - "woman_health_worker_medium-dark_skin_tone": "1f469-1f3fe-200d-2695-fe0f", - "woman_health_worker_medium-light_skin_tone": "1f469-1f3fc-200d-2695-fe0f", - "woman_health_worker_medium_skin_tone": "1f469-1f3fd-200d-2695-fe0f", - "woman_in_lotus_position_dark_skin_tone": "1f9d8-1f3ff-200d-2640-fe0f", - "woman_in_lotus_position_light_skin_tone": "1f9d8-1f3fb-200d-2640-fe0f", - "woman_in_lotus_position_medium-dark_skin_tone": "1f9d8-1f3fe-200d-2640-fe0f", - "woman_in_lotus_position_medium-light_skin_tone": "1f9d8-1f3fc-200d-2640-fe0f", - "woman_in_lotus_position_medium_skin_tone": "1f9d8-1f3fd-200d-2640-fe0f", - "woman_in_manual_wheelchair": "1f469-200d-1f9bd", - "woman_in_manual_wheelchair_dark_skin_tone": "1f469-1f3ff-200d-1f9bd", - "woman_in_manual_wheelchair_facing_right": "1f469-200d-1f9bd-200d-27a1-fe0f", - "woman_in_manual_wheelchair_facing_right_dark_skin_tone": "1f469-1f3ff-200d-1f9bd-200d-27a1-fe0f", - "woman_in_manual_wheelchair_facing_right_light_skin_tone": "1f469-1f3fb-200d-1f9bd-200d-27a1-fe0f", - "woman_in_manual_wheelchair_facing_right_medium-dark_skin_tone": "1f469-1f3fe-200d-1f9bd-200d-27a1-fe0f", - "woman_in_manual_wheelchair_facing_right_medium-light_skin_tone": "1f469-1f3fc-200d-1f9bd-200d-27a1-fe0f", - "woman_in_manual_wheelchair_facing_right_medium_skin_tone": "1f469-1f3fd-200d-1f9bd-200d-27a1-fe0f", - "woman_in_manual_wheelchair_light_skin_tone": "1f469-1f3fb-200d-1f9bd", - "woman_in_manual_wheelchair_medium-dark_skin_tone": "1f469-1f3fe-200d-1f9bd", - "woman_in_manual_wheelchair_medium-light_skin_tone": "1f469-1f3fc-200d-1f9bd", - "woman_in_manual_wheelchair_medium_skin_tone": "1f469-1f3fd-200d-1f9bd", - "woman_in_motorized_wheelchair": "1f469-200d-1f9bc", - "woman_in_motorized_wheelchair_dark_skin_tone": "1f469-1f3ff-200d-1f9bc", - "woman_in_motorized_wheelchair_facing_right": "1f469-200d-1f9bc-200d-27a1-fe0f", - "woman_in_motorized_wheelchair_facing_right_dark_skin_tone": "1f469-1f3ff-200d-1f9bc-200d-27a1-fe0f", - "woman_in_motorized_wheelchair_facing_right_light_skin_tone": "1f469-1f3fb-200d-1f9bc-200d-27a1-fe0f", - "woman_in_motorized_wheelchair_facing_right_medium-dark_skin_tone": "1f469-1f3fe-200d-1f9bc-200d-27a1-fe0f", - "woman_in_motorized_wheelchair_facing_right_medium-light_skin_tone": "1f469-1f3fc-200d-1f9bc-200d-27a1-fe0f", - "woman_in_motorized_wheelchair_facing_right_medium_skin_tone": "1f469-1f3fd-200d-1f9bc-200d-27a1-fe0f", - "woman_in_motorized_wheelchair_light_skin_tone": "1f469-1f3fb-200d-1f9bc", - "woman_in_motorized_wheelchair_medium-dark_skin_tone": "1f469-1f3fe-200d-1f9bc", - "woman_in_motorized_wheelchair_medium-light_skin_tone": "1f469-1f3fc-200d-1f9bc", - "woman_in_motorized_wheelchair_medium_skin_tone": "1f469-1f3fd-200d-1f9bc", - "woman_in_steamy_room_dark_skin_tone": "1f9d6-1f3ff-200d-2640-fe0f", - "woman_in_steamy_room_light_skin_tone": "1f9d6-1f3fb-200d-2640-fe0f", - "woman_in_steamy_room_medium-dark_skin_tone": "1f9d6-1f3fe-200d-2640-fe0f", - "woman_in_steamy_room_medium-light_skin_tone": "1f9d6-1f3fc-200d-2640-fe0f", - "woman_in_steamy_room_medium_skin_tone": "1f9d6-1f3fd-200d-2640-fe0f", - "woman_in_tuxedo": "1f935-200d-2640-fe0f", - "woman_in_tuxedo_dark_skin_tone": "1f935-1f3ff-200d-2640-fe0f", - "woman_in_tuxedo_light_skin_tone": "1f935-1f3fb-200d-2640-fe0f", - "woman_in_tuxedo_medium-dark_skin_tone": "1f935-1f3fe-200d-2640-fe0f", - "woman_in_tuxedo_medium-light_skin_tone": "1f935-1f3fc-200d-2640-fe0f", - "woman_in_tuxedo_medium_skin_tone": "1f935-1f3fd-200d-2640-fe0f", - "woman_judge": "1f469-200d-2696-fe0f", - "woman_judge_dark_skin_tone": "1f469-1f3ff-200d-2696-fe0f", - "woman_judge_light_skin_tone": "1f469-1f3fb-200d-2696-fe0f", - "woman_judge_medium-dark_skin_tone": "1f469-1f3fe-200d-2696-fe0f", - "woman_judge_medium-light_skin_tone": "1f469-1f3fc-200d-2696-fe0f", - "woman_judge_medium_skin_tone": "1f469-1f3fd-200d-2696-fe0f", - "woman_juggling": "1f939-200d-2640-fe0f", - "woman_juggling_dark_skin_tone": "1f939-1f3ff-200d-2640-fe0f", - "woman_juggling_light_skin_tone": "1f939-1f3fb-200d-2640-fe0f", - "woman_juggling_medium-dark_skin_tone": "1f939-1f3fe-200d-2640-fe0f", - "woman_juggling_medium-light_skin_tone": "1f939-1f3fc-200d-2640-fe0f", - "woman_juggling_medium_skin_tone": "1f939-1f3fd-200d-2640-fe0f", - "woman_kneeling_dark_skin_tone": "1f9ce-1f3ff-200d-2640-fe0f", - "woman_kneeling_facing_right": "1f9ce-200d-2640-fe0f-200d-27a1-fe0f", - "woman_kneeling_facing_right_dark_skin_tone": "1f9ce-1f3ff-200d-2640-fe0f-200d-27a1-fe0f", - "woman_kneeling_facing_right_light_skin_tone": "1f9ce-1f3fb-200d-2640-fe0f-200d-27a1-fe0f", - "woman_kneeling_facing_right_medium-dark_skin_tone": "1f9ce-1f3fe-200d-2640-fe0f-200d-27a1-fe0f", - "woman_kneeling_facing_right_medium-light_skin_tone": "1f9ce-1f3fc-200d-2640-fe0f-200d-27a1-fe0f", - "woman_kneeling_facing_right_medium_skin_tone": "1f9ce-1f3fd-200d-2640-fe0f-200d-27a1-fe0f", - "woman_kneeling_light_skin_tone": "1f9ce-1f3fb-200d-2640-fe0f", - "woman_kneeling_medium-dark_skin_tone": "1f9ce-1f3fe-200d-2640-fe0f", - "woman_kneeling_medium-light_skin_tone": "1f9ce-1f3fc-200d-2640-fe0f", - "woman_kneeling_medium_skin_tone": "1f9ce-1f3fd-200d-2640-fe0f", - "woman_lifting_weights_dark_skin_tone": "1f3cb-1f3ff-200d-2640-fe0f", - "woman_lifting_weights_light_skin_tone": "1f3cb-1f3fb-200d-2640-fe0f", - "woman_lifting_weights_medium-dark_skin_tone": "1f3cb-1f3fe-200d-2640-fe0f", - "woman_lifting_weights_medium-light_skin_tone": "1f3cb-1f3fc-200d-2640-fe0f", - "woman_lifting_weights_medium_skin_tone": "1f3cb-1f3fd-200d-2640-fe0f", - "woman_light_skin_tone": "1f469-1f3fb", - "woman_light_skin_tone_bald": "1f469-1f3fb-200d-1f9b2", - "woman_light_skin_tone_beard": "1f9d4-1f3fb-200d-2640-fe0f", - "woman_light_skin_tone_blond_hair": "1f471-1f3fb-200d-2640-fe0f", - "woman_light_skin_tone_curly_hair": "1f469-1f3fb-200d-1f9b1", - "woman_light_skin_tone_red_hair": "1f469-1f3fb-200d-1f9b0", - "woman_light_skin_tone_white_hair": "1f469-1f3fb-200d-1f9b3", - "woman_mage_dark_skin_tone": "1f9d9-1f3ff-200d-2640-fe0f", - "woman_mage_light_skin_tone": "1f9d9-1f3fb-200d-2640-fe0f", - "woman_mage_medium-dark_skin_tone": "1f9d9-1f3fe-200d-2640-fe0f", - "woman_mage_medium-light_skin_tone": "1f9d9-1f3fc-200d-2640-fe0f", - "woman_mage_medium_skin_tone": "1f9d9-1f3fd-200d-2640-fe0f", - "woman_mechanic": "1f469-200d-1f527", - "woman_mechanic_dark_skin_tone": "1f469-1f3ff-200d-1f527", - "woman_mechanic_light_skin_tone": "1f469-1f3fb-200d-1f527", - "woman_mechanic_medium-dark_skin_tone": "1f469-1f3fe-200d-1f527", - "woman_mechanic_medium-light_skin_tone": "1f469-1f3fc-200d-1f527", - "woman_mechanic_medium_skin_tone": "1f469-1f3fd-200d-1f527", - "woman_medium-dark_skin_tone": "1f469-1f3fe", - "woman_medium-dark_skin_tone_bald": "1f469-1f3fe-200d-1f9b2", - "woman_medium-dark_skin_tone_beard": "1f9d4-1f3fe-200d-2640-fe0f", - "woman_medium-dark_skin_tone_blond_hair": "1f471-1f3fe-200d-2640-fe0f", - "woman_medium-dark_skin_tone_curly_hair": "1f469-1f3fe-200d-1f9b1", - "woman_medium-dark_skin_tone_red_hair": "1f469-1f3fe-200d-1f9b0", - "woman_medium-dark_skin_tone_white_hair": "1f469-1f3fe-200d-1f9b3", - "woman_medium-light_skin_tone": "1f469-1f3fc", - "woman_medium-light_skin_tone_bald": "1f469-1f3fc-200d-1f9b2", - "woman_medium-light_skin_tone_beard": "1f9d4-1f3fc-200d-2640-fe0f", - "woman_medium-light_skin_tone_blond_hair": "1f471-1f3fc-200d-2640-fe0f", - "woman_medium-light_skin_tone_curly_hair": "1f469-1f3fc-200d-1f9b1", - "woman_medium-light_skin_tone_red_hair": "1f469-1f3fc-200d-1f9b0", - "woman_medium-light_skin_tone_white_hair": "1f469-1f3fc-200d-1f9b3", - "woman_medium_skin_tone": "1f469-1f3fd", - "woman_medium_skin_tone_bald": "1f469-1f3fd-200d-1f9b2", - "woman_medium_skin_tone_beard": "1f9d4-1f3fd-200d-2640-fe0f", - "woman_medium_skin_tone_blond_hair": "1f471-1f3fd-200d-2640-fe0f", - "woman_medium_skin_tone_curly_hair": "1f469-1f3fd-200d-1f9b1", - "woman_medium_skin_tone_red_hair": "1f469-1f3fd-200d-1f9b0", - "woman_medium_skin_tone_white_hair": "1f469-1f3fd-200d-1f9b3", - "woman_mountain_biking_dark_skin_tone": "1f6b5-1f3ff-200d-2640-fe0f", - "woman_mountain_biking_light_skin_tone": "1f6b5-1f3fb-200d-2640-fe0f", - "woman_mountain_biking_medium-dark_skin_tone": "1f6b5-1f3fe-200d-2640-fe0f", - "woman_mountain_biking_medium-light_skin_tone": "1f6b5-1f3fc-200d-2640-fe0f", - "woman_mountain_biking_medium_skin_tone": "1f6b5-1f3fd-200d-2640-fe0f", - "woman_office_worker": "1f469-200d-1f4bc", - "woman_office_worker_dark_skin_tone": "1f469-1f3ff-200d-1f4bc", - "woman_office_worker_light_skin_tone": "1f469-1f3fb-200d-1f4bc", - "woman_office_worker_medium-dark_skin_tone": "1f469-1f3fe-200d-1f4bc", - "woman_office_worker_medium-light_skin_tone": "1f469-1f3fc-200d-1f4bc", - "woman_office_worker_medium_skin_tone": "1f469-1f3fd-200d-1f4bc", - "woman_pilot": "1f469-200d-2708-fe0f", - "woman_pilot_dark_skin_tone": "1f469-1f3ff-200d-2708-fe0f", - "woman_pilot_light_skin_tone": "1f469-1f3fb-200d-2708-fe0f", - "woman_pilot_medium-dark_skin_tone": "1f469-1f3fe-200d-2708-fe0f", - "woman_pilot_medium-light_skin_tone": "1f469-1f3fc-200d-2708-fe0f", - "woman_pilot_medium_skin_tone": "1f469-1f3fd-200d-2708-fe0f", - "woman_playing_handball": "1f93e-200d-2640-fe0f", - "woman_playing_handball_dark_skin_tone": "1f93e-1f3ff-200d-2640-fe0f", - "woman_playing_handball_light_skin_tone": "1f93e-1f3fb-200d-2640-fe0f", - "woman_playing_handball_medium-dark_skin_tone": "1f93e-1f3fe-200d-2640-fe0f", - "woman_playing_handball_medium-light_skin_tone": "1f93e-1f3fc-200d-2640-fe0f", - "woman_playing_handball_medium_skin_tone": "1f93e-1f3fd-200d-2640-fe0f", - "woman_playing_water_polo": "1f93d-200d-2640-fe0f", - "woman_playing_water_polo_dark_skin_tone": "1f93d-1f3ff-200d-2640-fe0f", - "woman_playing_water_polo_light_skin_tone": "1f93d-1f3fb-200d-2640-fe0f", - "woman_playing_water_polo_medium-dark_skin_tone": "1f93d-1f3fe-200d-2640-fe0f", - "woman_playing_water_polo_medium-light_skin_tone": "1f93d-1f3fc-200d-2640-fe0f", - "woman_playing_water_polo_medium_skin_tone": "1f93d-1f3fd-200d-2640-fe0f", - "woman_police_officer_dark_skin_tone": "1f46e-1f3ff-200d-2640-fe0f", - "woman_police_officer_light_skin_tone": "1f46e-1f3fb-200d-2640-fe0f", - "woman_police_officer_medium-dark_skin_tone": "1f46e-1f3fe-200d-2640-fe0f", - "woman_police_officer_medium-light_skin_tone": "1f46e-1f3fc-200d-2640-fe0f", - "woman_police_officer_medium_skin_tone": "1f46e-1f3fd-200d-2640-fe0f", - "woman_pouting_dark_skin_tone": "1f64e-1f3ff-200d-2640-fe0f", - "woman_pouting_light_skin_tone": "1f64e-1f3fb-200d-2640-fe0f", - "woman_pouting_medium-dark_skin_tone": "1f64e-1f3fe-200d-2640-fe0f", - "woman_pouting_medium-light_skin_tone": "1f64e-1f3fc-200d-2640-fe0f", - "woman_pouting_medium_skin_tone": "1f64e-1f3fd-200d-2640-fe0f", - "woman_raising_hand_dark_skin_tone": "1f64b-1f3ff-200d-2640-fe0f", - "woman_raising_hand_light_skin_tone": "1f64b-1f3fb-200d-2640-fe0f", - "woman_raising_hand_medium-dark_skin_tone": "1f64b-1f3fe-200d-2640-fe0f", - "woman_raising_hand_medium-light_skin_tone": "1f64b-1f3fc-200d-2640-fe0f", - "woman_raising_hand_medium_skin_tone": "1f64b-1f3fd-200d-2640-fe0f", - "woman_rowing_boat_dark_skin_tone": "1f6a3-1f3ff-200d-2640-fe0f", - "woman_rowing_boat_light_skin_tone": "1f6a3-1f3fb-200d-2640-fe0f", - "woman_rowing_boat_medium-dark_skin_tone": "1f6a3-1f3fe-200d-2640-fe0f", - "woman_rowing_boat_medium-light_skin_tone": "1f6a3-1f3fc-200d-2640-fe0f", - "woman_rowing_boat_medium_skin_tone": "1f6a3-1f3fd-200d-2640-fe0f", - "woman_running_dark_skin_tone": "1f3c3-1f3ff-200d-2640-fe0f", - "woman_running_facing_right": "1f3c3-200d-2640-fe0f-200d-27a1-fe0f", - "woman_running_facing_right_dark_skin_tone": "1f3c3-1f3ff-200d-2640-fe0f-200d-27a1-fe0f", - "woman_running_facing_right_light_skin_tone": "1f3c3-1f3fb-200d-2640-fe0f-200d-27a1-fe0f", - "woman_running_facing_right_medium-dark_skin_tone": "1f3c3-1f3fe-200d-2640-fe0f-200d-27a1-fe0f", - "woman_running_facing_right_medium-light_skin_tone": "1f3c3-1f3fc-200d-2640-fe0f-200d-27a1-fe0f", - "woman_running_facing_right_medium_skin_tone": "1f3c3-1f3fd-200d-2640-fe0f-200d-27a1-fe0f", - "woman_running_light_skin_tone": "1f3c3-1f3fb-200d-2640-fe0f", - "woman_running_medium-dark_skin_tone": "1f3c3-1f3fe-200d-2640-fe0f", - "woman_running_medium-light_skin_tone": "1f3c3-1f3fc-200d-2640-fe0f", - "woman_running_medium_skin_tone": "1f3c3-1f3fd-200d-2640-fe0f", - "woman_scientist": "1f469-200d-1f52c", - "woman_scientist_dark_skin_tone": "1f469-1f3ff-200d-1f52c", - "woman_scientist_light_skin_tone": "1f469-1f3fb-200d-1f52c", - "woman_scientist_medium-dark_skin_tone": "1f469-1f3fe-200d-1f52c", - "woman_scientist_medium-light_skin_tone": "1f469-1f3fc-200d-1f52c", - "woman_scientist_medium_skin_tone": "1f469-1f3fd-200d-1f52c", - "woman_shrugging": "1f937-200d-2640-fe0f", - "woman_shrugging_dark_skin_tone": "1f937-1f3ff-200d-2640-fe0f", - "woman_shrugging_light_skin_tone": "1f937-1f3fb-200d-2640-fe0f", - "woman_shrugging_medium-dark_skin_tone": "1f937-1f3fe-200d-2640-fe0f", - "woman_shrugging_medium-light_skin_tone": "1f937-1f3fc-200d-2640-fe0f", - "woman_shrugging_medium_skin_tone": "1f937-1f3fd-200d-2640-fe0f", - "woman_singer": "1f469-200d-1f3a4", - "woman_singer_dark_skin_tone": "1f469-1f3ff-200d-1f3a4", - "woman_singer_light_skin_tone": "1f469-1f3fb-200d-1f3a4", - "woman_singer_medium-dark_skin_tone": "1f469-1f3fe-200d-1f3a4", - "woman_singer_medium-light_skin_tone": "1f469-1f3fc-200d-1f3a4", - "woman_singer_medium_skin_tone": "1f469-1f3fd-200d-1f3a4", - "woman_standing_dark_skin_tone": "1f9cd-1f3ff-200d-2640-fe0f", - "woman_standing_light_skin_tone": "1f9cd-1f3fb-200d-2640-fe0f", - "woman_standing_medium-dark_skin_tone": "1f9cd-1f3fe-200d-2640-fe0f", - "woman_standing_medium-light_skin_tone": "1f9cd-1f3fc-200d-2640-fe0f", - "woman_standing_medium_skin_tone": "1f9cd-1f3fd-200d-2640-fe0f", - "woman_student": "1f469-200d-1f393", - "woman_student_dark_skin_tone": "1f469-1f3ff-200d-1f393", - "woman_student_light_skin_tone": "1f469-1f3fb-200d-1f393", - "woman_student_medium-dark_skin_tone": "1f469-1f3fe-200d-1f393", - "woman_student_medium-light_skin_tone": "1f469-1f3fc-200d-1f393", - "woman_student_medium_skin_tone": "1f469-1f3fd-200d-1f393", - "woman_superhero_dark_skin_tone": "1f9b8-1f3ff-200d-2640-fe0f", - "woman_superhero_light_skin_tone": "1f9b8-1f3fb-200d-2640-fe0f", - "woman_superhero_medium-dark_skin_tone": "1f9b8-1f3fe-200d-2640-fe0f", - "woman_superhero_medium-light_skin_tone": "1f9b8-1f3fc-200d-2640-fe0f", - "woman_superhero_medium_skin_tone": "1f9b8-1f3fd-200d-2640-fe0f", - "woman_supervillain_dark_skin_tone": "1f9b9-1f3ff-200d-2640-fe0f", - "woman_supervillain_light_skin_tone": "1f9b9-1f3fb-200d-2640-fe0f", - "woman_supervillain_medium-dark_skin_tone": "1f9b9-1f3fe-200d-2640-fe0f", - "woman_supervillain_medium-light_skin_tone": "1f9b9-1f3fc-200d-2640-fe0f", - "woman_supervillain_medium_skin_tone": "1f9b9-1f3fd-200d-2640-fe0f", - "woman_surfing_dark_skin_tone": "1f3c4-1f3ff-200d-2640-fe0f", - "woman_surfing_light_skin_tone": "1f3c4-1f3fb-200d-2640-fe0f", - "woman_surfing_medium-dark_skin_tone": "1f3c4-1f3fe-200d-2640-fe0f", - "woman_surfing_medium-light_skin_tone": "1f3c4-1f3fc-200d-2640-fe0f", - "woman_surfing_medium_skin_tone": "1f3c4-1f3fd-200d-2640-fe0f", - "woman_swimming_dark_skin_tone": "1f3ca-1f3ff-200d-2640-fe0f", - "woman_swimming_light_skin_tone": "1f3ca-1f3fb-200d-2640-fe0f", - "woman_swimming_medium-dark_skin_tone": "1f3ca-1f3fe-200d-2640-fe0f", - "woman_swimming_medium-light_skin_tone": "1f3ca-1f3fc-200d-2640-fe0f", - "woman_swimming_medium_skin_tone": "1f3ca-1f3fd-200d-2640-fe0f", - "woman_teacher": "1f469-200d-1f3eb", - "woman_teacher_dark_skin_tone": "1f469-1f3ff-200d-1f3eb", - "woman_teacher_light_skin_tone": "1f469-1f3fb-200d-1f3eb", - "woman_teacher_medium-dark_skin_tone": "1f469-1f3fe-200d-1f3eb", - "woman_teacher_medium-light_skin_tone": "1f469-1f3fc-200d-1f3eb", - "woman_teacher_medium_skin_tone": "1f469-1f3fd-200d-1f3eb", - "woman_technologist": "1f469-200d-1f4bb", - "woman_technologist_dark_skin_tone": "1f469-1f3ff-200d-1f4bb", - "woman_technologist_light_skin_tone": "1f469-1f3fb-200d-1f4bb", - "woman_technologist_medium-dark_skin_tone": "1f469-1f3fe-200d-1f4bb", - "woman_technologist_medium-light_skin_tone": "1f469-1f3fc-200d-1f4bb", - "woman_technologist_medium_skin_tone": "1f469-1f3fd-200d-1f4bb", - "woman_tipping_hand_dark_skin_tone": "1f481-1f3ff-200d-2640-fe0f", - "woman_tipping_hand_light_skin_tone": "1f481-1f3fb-200d-2640-fe0f", - "woman_tipping_hand_medium-dark_skin_tone": "1f481-1f3fe-200d-2640-fe0f", - "woman_tipping_hand_medium-light_skin_tone": "1f481-1f3fc-200d-2640-fe0f", - "woman_tipping_hand_medium_skin_tone": "1f481-1f3fd-200d-2640-fe0f", - "woman_vampire_dark_skin_tone": "1f9db-1f3ff-200d-2640-fe0f", - "woman_vampire_light_skin_tone": "1f9db-1f3fb-200d-2640-fe0f", - "woman_vampire_medium-dark_skin_tone": "1f9db-1f3fe-200d-2640-fe0f", - "woman_vampire_medium-light_skin_tone": "1f9db-1f3fc-200d-2640-fe0f", - "woman_vampire_medium_skin_tone": "1f9db-1f3fd-200d-2640-fe0f", - "woman_walking_dark_skin_tone": "1f6b6-1f3ff-200d-2640-fe0f", - "woman_walking_facing_right": "1f6b6-200d-2640-fe0f-200d-27a1-fe0f", - "woman_walking_facing_right_dark_skin_tone": "1f6b6-1f3ff-200d-2640-fe0f-200d-27a1-fe0f", - "woman_walking_facing_right_light_skin_tone": "1f6b6-1f3fb-200d-2640-fe0f-200d-27a1-fe0f", - "woman_walking_facing_right_medium-dark_skin_tone": "1f6b6-1f3fe-200d-2640-fe0f-200d-27a1-fe0f", - "woman_walking_facing_right_medium-light_skin_tone": "1f6b6-1f3fc-200d-2640-fe0f-200d-27a1-fe0f", - "woman_walking_facing_right_medium_skin_tone": "1f6b6-1f3fd-200d-2640-fe0f-200d-27a1-fe0f", - "woman_walking_light_skin_tone": "1f6b6-1f3fb-200d-2640-fe0f", - "woman_walking_medium-dark_skin_tone": "1f6b6-1f3fe-200d-2640-fe0f", - "woman_walking_medium-light_skin_tone": "1f6b6-1f3fc-200d-2640-fe0f", - "woman_walking_medium_skin_tone": "1f6b6-1f3fd-200d-2640-fe0f", - "woman_wearing_turban_dark_skin_tone": "1f473-1f3ff-200d-2640-fe0f", - "woman_wearing_turban_light_skin_tone": "1f473-1f3fb-200d-2640-fe0f", - "woman_wearing_turban_medium-dark_skin_tone": "1f473-1f3fe-200d-2640-fe0f", - "woman_wearing_turban_medium-light_skin_tone": "1f473-1f3fc-200d-2640-fe0f", - "woman_wearing_turban_medium_skin_tone": "1f473-1f3fd-200d-2640-fe0f", - "woman_with_headscarf": "1f9d5", - "woman_with_headscarf_dark_skin_tone": "1f9d5-1f3ff", - "woman_with_headscarf_light_skin_tone": "1f9d5-1f3fb", - "woman_with_headscarf_medium-dark_skin_tone": "1f9d5-1f3fe", - "woman_with_headscarf_medium-light_skin_tone": "1f9d5-1f3fc", - "woman_with_headscarf_medium_skin_tone": "1f9d5-1f3fd", - "woman_with_probing_cane": "1f469-200d-1f9af", - "woman_with_turban": "1f473-200d-2640-fe0f", - "woman_with_veil": "1f470-200d-2640-fe0f", - "woman_with_veil_dark_skin_tone": "1f470-1f3ff-200d-2640-fe0f", - "woman_with_veil_light_skin_tone": "1f470-1f3fb-200d-2640-fe0f", - "woman_with_veil_medium-dark_skin_tone": "1f470-1f3fe-200d-2640-fe0f", - "woman_with_veil_medium-light_skin_tone": "1f470-1f3fc-200d-2640-fe0f", - "woman_with_veil_medium_skin_tone": "1f470-1f3fd-200d-2640-fe0f", - "woman_with_white_cane_dark_skin_tone": "1f469-1f3ff-200d-1f9af", - "woman_with_white_cane_facing_right": "1f469-200d-1f9af-200d-27a1-fe0f", - "woman_with_white_cane_facing_right_dark_skin_tone": "1f469-1f3ff-200d-1f9af-200d-27a1-fe0f", - "woman_with_white_cane_facing_right_light_skin_tone": "1f469-1f3fb-200d-1f9af-200d-27a1-fe0f", - "woman_with_white_cane_facing_right_medium-dark_skin_tone": "1f469-1f3fe-200d-1f9af-200d-27a1-fe0f", - "woman_with_white_cane_facing_right_medium-light_skin_tone": "1f469-1f3fc-200d-1f9af-200d-27a1-fe0f", - "woman_with_white_cane_facing_right_medium_skin_tone": "1f469-1f3fd-200d-1f9af-200d-27a1-fe0f", - "woman_with_white_cane_light_skin_tone": "1f469-1f3fb-200d-1f9af", - "woman_with_white_cane_medium-dark_skin_tone": "1f469-1f3fe-200d-1f9af", - "woman_with_white_cane_medium-light_skin_tone": "1f469-1f3fc-200d-1f9af", - "woman_with_white_cane_medium_skin_tone": "1f469-1f3fd-200d-1f9af", - "womans_clothes": "1f45a", - "womans_hat": "1f452", - "women_holding_hands_dark_skin_tone": "1f46d-1f3ff", - "women_holding_hands_dark_skin_tone_light_skin_tone": "1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb", - "women_holding_hands_dark_skin_tone_medium-dark_skin_tone": "1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe", - "women_holding_hands_dark_skin_tone_medium-light_skin_tone": "1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc", - "women_holding_hands_dark_skin_tone_medium_skin_tone": "1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd", - "women_holding_hands_light_skin_tone": "1f46d-1f3fb", - "women_holding_hands_light_skin_tone_dark_skin_tone": "1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff", - "women_holding_hands_light_skin_tone_medium-dark_skin_tone": "1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe", - "women_holding_hands_light_skin_tone_medium-light_skin_tone": "1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc", - "women_holding_hands_light_skin_tone_medium_skin_tone": "1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd", - "women_holding_hands_medium-dark_skin_tone": "1f46d-1f3fe", - "women_holding_hands_medium-dark_skin_tone_dark_skin_tone": "1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff", - "women_holding_hands_medium-dark_skin_tone_light_skin_tone": "1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb", - "women_holding_hands_medium-dark_skin_tone_medium-light_skin_tone": "1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc", - "women_holding_hands_medium-dark_skin_tone_medium_skin_tone": "1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd", - "women_holding_hands_medium-light_skin_tone": "1f46d-1f3fc", - "women_holding_hands_medium-light_skin_tone_dark_skin_tone": "1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff", - "women_holding_hands_medium-light_skin_tone_light_skin_tone": "1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb", - "women_holding_hands_medium-light_skin_tone_medium-dark_skin_tone": "1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe", - "women_holding_hands_medium-light_skin_tone_medium_skin_tone": "1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd", - "women_holding_hands_medium_skin_tone": "1f46d-1f3fd", - "women_holding_hands_medium_skin_tone_dark_skin_tone": "1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff", - "women_holding_hands_medium_skin_tone_light_skin_tone": "1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb", - "women_holding_hands_medium_skin_tone_medium-dark_skin_tone": "1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe", - "women_holding_hands_medium_skin_tone_medium-light_skin_tone": "1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc", - "women_wrestling": "1f93c-200d-2640-fe0f", - "womens": "1f6ba", - "wood": "1fab5", - "woozy_face": "1f974", - "world_map": "1f5fa-fe0f", - "worm": "1fab1", - "worried": "1f61f", - "wrench": "1f527", - "wrestling": "1f93c", - "writing_hand": "270d-fe0f", - "writing_hand_dark_skin_tone": "270d-1f3ff", - "writing_hand_light_skin_tone": "270d-1f3fb", - "writing_hand_medium-dark_skin_tone": "270d-1f3fe", - "writing_hand_medium-light_skin_tone": "270d-1f3fc", - "writing_hand_medium_skin_tone": "270d-1f3fd", - "x": "274c", - "x_ray": "1fa7b", - "xyzzy": "~xyzzy", - "yarn": "1f9f6", - "yawning_face": "1f971", - "yellow_circle": "1f7e1", - "yellow_heart": "1f49b", - "yellow_square": "1f7e8", - "yemen": "1f1fe-1f1ea", - "yen": "1f4b4", - "yin_yang": "262f-fe0f", - "yo_yo": "1fa80", - "yum": "1f60b", - "zambia": "1f1ff-1f1f2", - "zany_face": "1f92a", - "zap": "26a1", - "zebra": "1f993", - "zero": "30-fe0f-20e3", - "zimbabwe": "1f1ff-1f1fc", - "zipper_mouth_face": "1f910", - "zombie": "1f9df", - "zombie_man": "1f9df-200d-2642-fe0f", - "zombie_woman": "1f9df-200d-2640-fe0f", - "zzz": "1f4a4" -} diff --git a/src/emoji.rs b/src/emoji.rs index f7a9e75..5f42e5d 100644 --- a/src/emoji.rs +++ b/src/emoji.rs @@ -1,54 +1,36 @@ -//! All emoji the euphoria.leet.nu client knows. +//! All emoji the vanilla euphoria.io client knows. use std::borrow::Cow; use std::collections::HashMap; use std::ops::RangeInclusive; -/// Euphoria.leet.nu emoji list, obtainable via shell command: -/// -/// ```bash -/// curl 'https://euphoria.leet.nu/static/emoji.json' \ -/// | jq 'to_entries | sort_by(.key) | from_entries' \ -/// > emoji.json -/// ``` -const EMOJI_JSON: &str = include_str!("emoji.json"); +const EMOJI_RAW: &str = include_str!("emoji.txt"); /// A map from emoji names to their unicode representation. Not all emojis have /// such a representation. pub struct Emoji(pub HashMap>); -fn parse_hex_to_char(hex: &str) -> Option { - u32::from_str_radix(hex, 16).ok()?.try_into().ok() +fn parse_hex_to_char(hex: &str) -> char { + u32::from_str_radix(hex, 16).unwrap().try_into().unwrap() } -fn parse_code_points(code_points: &str) -> Option { - code_points - .split('-') - .map(parse_hex_to_char) - .collect::>() +fn parse_line(line: &str) -> (String, Option) { + let mut line = line.split_ascii_whitespace(); + let name = line.next().unwrap().to_string(); + let unicode = line.map(parse_hex_to_char).collect::(); + let unicode = Some(unicode).filter(|u| !u.is_empty()); + (name, unicode) } impl Emoji { - /// Load a list of emoji compiled into the library. pub fn load() -> Self { - Self::load_from_json(EMOJI_JSON).unwrap() - } - - /// Load a list of emoji from a string containing a JSON object. - /// - /// The object keys are the emoji names (without colons `:`). The object - /// values are the emoji code points encoded as hexadecimal numbers and - /// separated by a dash `-` (e.g. `"34-fe0f-20e3"`). Emojis whose values - /// don't match this schema are interpreted as emojis without unicode - /// representation. - pub fn load_from_json(json: &str) -> Option { - let map = serde_json::from_str::>(json) - .ok()? - .into_iter() - .map(|(k, v)| (k, parse_code_points(&v))) - .collect::>(); - - Some(Self(map)) + let map = EMOJI_RAW + .lines() + .map(|l| l.trim()) + .filter(|l| !l.is_empty() && !l.starts_with('#')) + .map(parse_line) + .collect(); + Self(map) } pub fn get(&self, name: &str) -> Option> { diff --git a/src/emoji.txt b/src/emoji.txt new file mode 100644 index 0000000..9034f59 --- /dev/null +++ b/src/emoji.txt @@ -0,0 +1,914 @@ +# The vanilla euphoria frontend uses version 0.2.4 of the npm package +# "emoji-annotation-to-unicode" [0]. It ignores all emoji set to null [1]. It +# removes the "iphone" emoji [2] and replaces it with the "phone" emoji [3]. It +# also adds a few more emoji names without a unicode equivalent [4]. +# +# [0]: https://www.npmjs.com/package/emoji-annotation-to-unicode/v/0.2.4 +# [1]: https://github.com/euphoria-io/heim/blob/978c921063e6b06012fc8d16d9fbf1b3a0be1191/client/lib/emoji.js#L37-L39 +# [2]: https://github.com/euphoria-io/heim/blob/978c921063e6b06012fc8d16d9fbf1b3a0be1191/client/lib/emoji.js#L26 +# [3]: https://github.com/euphoria-io/heim/blob/978c921063e6b06012fc8d16d9fbf1b3a0be1191/client/lib/emoji.js#L23 +# [4]: https://github.com/euphoria-io/heim/blob/978c921063e6b06012fc8d16d9fbf1b3a0be1191/client/lib/emoji.js#L8-L22 + +# Any line that is empty or starts with # is ignored. + +# Each emoji is represented as a single line. The line starts with the emoji +# name, followed by zero or more hexadecimal unicode code points. These elements +# are separated by one or more spaces. If mp code points are listed, the emoji +# does not correspond to any unicode code points. + +################################# +## emoji-annotation-to-unicode ## +################################# + ++1 1f44d +-1 1f44e +100 1f4af +1234 1f522 +8ball 1f3b1 +a 1f170 +ab 1f18e +abc 1f524 +abcd 1f521 +accept 1f251 +aerial_tramway 1f6a1 +airplane 2708 +alarm_clock 23f0 +alien 1f47d +ambulance 1f691 +anchor 2693 +angel 1f47c +anger 1f4a2 +angry 1f620 +anguished 1f627 +ant 1f41c +apple 1f34e +aquarius 2652 +aries 2648 +arrow_backward 25c0 +arrow_double_down 23ec +arrow_double_up 23eb +arrow_down 2b07 +arrow_down_small 1f53d +arrow_forward 25b6 +arrow_heading_down 2935 +arrow_heading_up 2934 +arrow_left 2b05 +arrow_lower_left 2199 +arrow_lower_right 2198 +arrow_right 27a1 +arrow_right_hook 21aa +arrow_up 2b06 +arrow_up_down 2195 +arrow_up_small 1f53c +arrow_upper_left 2196 +arrow_upper_right 2197 +arrows_clockwise 1f503 +arrows_counterclockwise 1f504 +art 1f3a8 +articulated_lorry 1f69b +astonished 1f632 +athletic_shoe 1f45f +atm 1f3e7 +b 1f171 +baby 1f476 +baby_bottle 1f37c +baby_chick 1f424 +baby_symbol 1f6bc +back 1f519 +baggage_claim 1f6c4 +balloon 1f388 +ballot_box_with_check 2611 +bamboo 1f38d +banana 1f34c +bangbang 203c +bank 1f3e6 +bar_chart 1f4ca +barber 1f488 +baseball 26be +basketball 1f3c0 +bath 1f6c0 +bathtub 1f6c1 +battery 1f50b +bear 1f43b +bee 1f41d +beer 1f37a +beers 1f37b +beetle 1f41e +beginner 1f530 +bell 1f514 +bento 1f371 +bicyclist 1f6b4 +bike 1f6b2 +bikini 1f459 +bird 1f426 +birthday 1f382 +black_circle 26ab +black_joker 1f0cf +black_large_square 2b1b +black_medium_small_square 25fe +black_medium_square 25fc +black_nib 2712 +black_small_square 25aa +black_square_button 1f532 +blossom 1f33c +blowfish 1f421 +blue_book 1f4d8 +blue_car 1f699 +blue_heart 1f499 +blush 1f60a +boar 1f417 +boat 26f5 +bomb 1f4a3 +book 1f4d6 +bookmark 1f516 +bookmark_tabs 1f4d1 +books 1f4da +boom 1f4a5 +boot 1f462 +bouquet 1f490 +bow 1f647 +bowling 1f3b3 +boy 1f466 +bread 1f35e +bride_with_veil 1f470 +bridge_at_night 1f309 +briefcase 1f4bc +broken_heart 1f494 +bug 1f41b +bulb 1f4a1 +bullettrain_front 1f685 +bullettrain_side 1f684 +bus 1f68c +busstop 1f68f +bust_in_silhouette 1f464 +busts_in_silhouette 1f465 +cactus 1f335 +cake 1f370 +calendar 1f4c6 +calling 1f4f2 +camel 1f42b +camera 1f4f7 +cancer 264b +candy 1f36c +capital_abcd 1f520 +capricorn 2651 +car 1f697 +card_index 1f4c7 +carousel_horse 1f3a0 +cat 1f431 +cat2 1f408 +cd 1f4bf +chart 1f4b9 +chart_with_downwards_trend 1f4c9 +chart_with_upwards_trend 1f4c8 +checkered_flag 1f3c1 +cherries 1f352 +cherry_blossom 1f338 +chestnut 1f330 +chicken 1f414 +children_crossing 1f6b8 +chocolate_bar 1f36b +christmas_tree 1f384 +church 26ea +cinema 1f3a6 +circus_tent 1f3aa +city_sunrise 1f307 +city_sunset 1f306 +cl 1f191 +clap 1f44f +clapper 1f3ac +clipboard 1f4cb +clock1 1f550 +clock10 1f559 +clock1030 1f565 +clock11 1f55a +clock1130 1f566 +clock12 1f55b +clock1230 1f567 +clock130 1f55c +clock2 1f551 +clock230 1f55d +clock3 1f552 +clock330 1f55e +clock4 1f553 +clock430 1f55f +clock5 1f554 +clock530 1f560 +clock6 1f555 +clock630 1f561 +clock7 1f556 +clock730 1f562 +clock8 1f557 +clock830 1f563 +clock9 1f558 +clock930 1f564 +closed_book 1f4d5 +closed_lock_with_key 1f510 +closed_umbrella 1f302 +cloud 2601 +clubs 2663 +cn 1f1e8 1f1f3 +cocktail 1f378 +coffee 2615 +cold_sweat 1f630 +collision 1f4a5 +computer 1f4bb +confetti_ball 1f38a +confounded 1f616 +confused 1f615 +congratulations 3297 +construction 1f6a7 +construction_worker 1f477 +convenience_store 1f3ea +cookie 1f36a +cool 1f192 +cop 1f46e +copyright 00a9 +corn 1f33d +couple 1f46b +couple_with_heart 1f491 +couplekiss 1f48f +cow 1f42e +cow2 1f404 +credit_card 1f4b3 +crescent_moon 1f319 +crocodile 1f40a +crossed_flags 1f38c +crown 1f451 +cry 1f622 +crying_cat_face 1f63f +crystal_ball 1f52e +cupid 1f498 +curly_loop 27b0 +currency_exchange 1f4b1 +curry 1f35b +custard 1f36e +customs 1f6c3 +cyclone 1f300 +dancer 1f483 +dancers 1f46f +dango 1f361 +dart 1f3af +dash 1f4a8 +date 1f4c5 +de 1f1e9 1f1ea +deciduous_tree 1f333 +department_store 1f3ec +diamond_shape_with_a_dot_inside 1f4a0 +diamonds 2666 +disappointed 1f61e +disappointed_relieved 1f625 +dizzy 1f4ab +dizzy_face 1f635 +do_not_litter 1f6af +dog 1f436 +dog2 1f415 +dollar 1f4b5 +dolls 1f38e +dolphin 1f42c +door 1f6aa +doughnut 1f369 +dragon 1f409 +dragon_face 1f432 +dress 1f457 +dromedary_camel 1f42a +droplet 1f4a7 +dvd 1f4c0 +e-mail 1f4e7 +ear 1f442 +ear_of_rice 1f33e +earth_africa 1f30d +earth_americas 1f30e +earth_asia 1f30f +egg 1f373 +eggplant 1f346 +eight 0038 20e3 +eight_pointed_black_star 2734 +eight_spoked_asterisk 2733 +electric_plug 1f50c +elephant 1f418 +email 2709 +end 1f51a +envelope 2709 +envelope_with_arrow 1f4e9 +es 1f1ea 1f1f8 +euro 1f4b6 +european_castle 1f3f0 +european_post_office 1f3e4 +evergreen_tree 1f332 +exclamation 2757 +expressionless 1f611 +eyeglasses 1f453 +eyes 1f440 +facepunch 1f44a +factory 1f3ed +fallen_leaf 1f342 +family 1f46a +fast_forward 23e9 +fax 1f4e0 +fearful 1f628 +feet 1f43e +ferris_wheel 1f3a1 +file_folder 1f4c1 +fire 1f525 +fire_engine 1f692 +fireworks 1f386 +first_quarter_moon 1f313 +first_quarter_moon_with_face 1f31b +fish 1f41f +fish_cake 1f365 +fishing_pole_and_fish 1f3a3 +fist 270a +five 0035 20e3 +flags 1f38f +flashlight 1f526 +flipper 1f42c +floppy_disk 1f4be +flower_playing_cards 1f3b4 +flushed 1f633 +foggy 1f301 +football 1f3c8 +footprints 1f463 +fork_and_knife 1f374 +fountain 26f2 +four 0034 20e3 +four_leaf_clover 1f340 +fr 1f1eb 1f1f7 +free 1f193 +fried_shrimp 1f364 +fries 1f35f +frog 1f438 +frowning 1f626 +fuelpump 26fd +full_moon 1f315 +full_moon_with_face 1f31d +game_die 1f3b2 +gb 1f1ec 1f1e7 +gem 1f48e +gemini 264a +ghost 1f47b +gift 1f381 +gift_heart 1f49d +girl 1f467 +globe_with_meridians 1f310 +goat 1f410 +golf 26f3 +grapes 1f347 +green_apple 1f34f +green_book 1f4d7 +green_heart 1f49a +grey_exclamation 2755 +grey_question 2754 +grimacing 1f62c +grin 1f601 +grinning 1f600 +guardsman 1f482 +guitar 1f3b8 +gun 1f52b +haircut 1f487 +hamburger 1f354 +hammer 1f528 +hamster 1f439 +hand 270b +handbag 1f45c +hankey 1f4a9 +hash 0023 20e3 +hatched_chick 1f425 +hatching_chick 1f423 +headphones 1f3a7 +hear_no_evil 1f649 +heart 2764 +heart_decoration 1f49f +heart_eyes 1f60d +heart_eyes_cat 1f63b +heartbeat 1f493 +heartpulse 1f497 +hearts 2665 +heavy_check_mark 2714 +heavy_division_sign 2797 +heavy_dollar_sign 1f4b2 +heavy_exclamation_mark 2757 +heavy_minus_sign 2796 +heavy_multiplication_x 2716 +heavy_plus_sign 2795 +helicopter 1f681 +herb 1f33f +hibiscus 1f33a +high_brightness 1f506 +high_heel 1f460 +hocho 1f52a +honey_pot 1f36f +honeybee 1f41d +horse 1f434 +horse_racing 1f3c7 +hospital 1f3e5 +hotel 1f3e8 +hotsprings 2668 +hourglass 231b +hourglass_flowing_sand 23f3 +house 1f3e0 +house_with_garden 1f3e1 +hushed 1f62f +ice_cream 1f368 +icecream 1f366 +id 1f194 +ideograph_advantage 1f250 +imp 1f47f +inbox_tray 1f4e5 +incoming_envelope 1f4e8 +information_desk_person 1f481 +information_source 2139 +innocent 1f607 +interrobang 2049 +# iphone 1f4f1 +it 1f1ee 1f1f9 +izakaya_lantern 1f3ee +jack_o_lantern 1f383 +japan 1f5fe +japanese_castle 1f3ef +japanese_goblin 1f47a +japanese_ogre 1f479 +jeans 1f456 +joy 1f602 +joy_cat 1f639 +jp 1f1ef 1f1f5 +key 1f511 +keycap_ten 1f51f +kimono 1f458 +kiss 1f48b +kissing 1f617 +kissing_cat 1f63d +kissing_closed_eyes 1f61a +kissing_heart 1f618 +kissing_smiling_eyes 1f619 +knife 1f52a +koala 1f428 +koko 1f201 +kr 1f1f0 1f1f7 +lantern 1f3ee +large_blue_circle 1f535 +large_blue_diamond 1f537 +large_orange_diamond 1f536 +last_quarter_moon 1f317 +last_quarter_moon_with_face 1f31c +laughing 1f606 +leaves 1f343 +ledger 1f4d2 +left_luggage 1f6c5 +left_right_arrow 2194 +leftwards_arrow_with_hook 21a9 +lemon 1f34b +leo 264c +leopard 1f406 +libra 264e +light_rail 1f688 +link 1f517 +lips 1f444 +lipstick 1f484 +lock 1f512 +lock_with_ink_pen 1f50f +lollipop 1f36d +loop 27bf +loud_sound 1f50a +loudspeaker 1f4e2 +love_hotel 1f3e9 +love_letter 1f48c +low_brightness 1f505 +m 24c2 +mag 1f50d +mag_right 1f50e +mahjong 1f004 +mailbox 1f4eb +mailbox_closed 1f4ea +mailbox_with_mail 1f4ec +mailbox_with_no_mail 1f4ed +man 1f468 +man_with_gua_pi_mao 1f472 +man_with_turban 1f473 +mans_shoe 1f45e +maple_leaf 1f341 +mask 1f637 +massage 1f486 +meat_on_bone 1f356 +mega 1f4e3 +melon 1f348 +memo 1f4dd +mens 1f6b9 +metro 1f687 +microphone 1f3a4 +microscope 1f52c +milky_way 1f30c +minibus 1f690 +minidisc 1f4bd +mobile_phone_off 1f4f4 +money_with_wings 1f4b8 +moneybag 1f4b0 +monkey 1f412 +monkey_face 1f435 +monorail 1f69d +moon 1f314 +mortar_board 1f393 +mount_fuji 1f5fb +mountain_bicyclist 1f6b5 +mountain_cableway 1f6a0 +mountain_railway 1f69e +mouse 1f42d +mouse2 1f401 +movie_camera 1f3a5 +moyai 1f5ff +muscle 1f4aa +mushroom 1f344 +musical_keyboard 1f3b9 +musical_note 1f3b5 +musical_score 1f3bc +mute 1f507 +nail_care 1f485 +name_badge 1f4db +necktie 1f454 +negative_squared_cross_mark 274e +neutral_face 1f610 +new 1f195 +new_moon 1f311 +new_moon_with_face 1f31a +newspaper 1f4f0 +ng 1f196 +night_with_stars 1f303 +nine 0039 20e3 +no_bell 1f515 +no_bicycles 1f6b3 +no_entry 26d4 +no_entry_sign 1f6ab +no_good 1f645 +no_mobile_phones 1f4f5 +no_mouth 1f636 +no_pedestrians 1f6b7 +no_smoking 1f6ad +non-potable_water 1f6b1 +nose 1f443 +notebook 1f4d3 +notebook_with_decorative_cover 1f4d4 +notes 1f3b6 +nut_and_bolt 1f529 +o 2b55 +o2 1f17e +ocean 1f30a +octopus 1f419 +oden 1f362 +office 1f3e2 +ok 1f197 +ok_hand 1f44c +ok_woman 1f646 +older_man 1f474 +older_woman 1f475 +on 1f51b +oncoming_automobile 1f698 +oncoming_bus 1f68d +oncoming_police_car 1f694 +oncoming_taxi 1f696 +one 0031 20e3 +open_book 1f4d6 +open_file_folder 1f4c2 +open_hands 1f450 +open_mouth 1f62e +ophiuchus 26ce +orange_book 1f4d9 +outbox_tray 1f4e4 +ox 1f402 +package 1f4e6 +page_facing_up 1f4c4 +page_with_curl 1f4c3 +pager 1f4df +palm_tree 1f334 +panda_face 1f43c +paperclip 1f4ce +parking 1f17f +part_alternation_mark 303d +partly_sunny 26c5 +passport_control 1f6c2 +paw_prints 1f43e +peach 1f351 +pear 1f350 +pencil 1f4dd +pencil2 270f +penguin 1f427 +pensive 1f614 +performing_arts 1f3ad +persevere 1f623 +person_frowning 1f64d +person_with_blond_hair 1f471 +person_with_pouting_face 1f64e +phone 260e +pig 1f437 +pig2 1f416 +pig_nose 1f43d +pill 1f48a +pineapple 1f34d +pisces 2653 +pizza 1f355 +point_down 1f447 +point_left 1f448 +point_right 1f449 +point_up 261d +point_up_2 1f446 +police_car 1f693 +poodle 1f429 +poop 1f4a9 +post_office 1f3e3 +postal_horn 1f4ef +postbox 1f4ee +potable_water 1f6b0 +pouch 1f45d +poultry_leg 1f357 +pound 1f4b7 +pouting_cat 1f63e +pray 1f64f +princess 1f478 +punch 1f44a +purple_heart 1f49c +purse 1f45b +pushpin 1f4cc +put_litter_in_its_place 1f6ae +question 2753 +rabbit 1f430 +rabbit2 1f407 +racehorse 1f40e +radio 1f4fb +radio_button 1f518 +rage 1f621 +railway_car 1f683 +rainbow 1f308 +raised_hand 270b +raised_hands 1f64c +raising_hand 1f64b +ram 1f40f +ramen 1f35c +rat 1f400 +recycle 267b +red_car 1f697 +red_circle 1f534 +registered 00ae +relaxed 263a +relieved 1f60c +repeat 1f501 +repeat_one 1f502 +restroom 1f6bb +revolving_hearts 1f49e +rewind 23ea +ribbon 1f380 +rice 1f35a +rice_ball 1f359 +rice_cracker 1f358 +rice_scene 1f391 +ring 1f48d +rocket 1f680 +roller_coaster 1f3a2 +rooster 1f413 +rose 1f339 +rotating_light 1f6a8 +round_pushpin 1f4cd +rowboat 1f6a3 +ru 1f1f7 1f1fa +rugby_football 1f3c9 +runner 1f3c3 +running 1f3c3 +running_shirt_with_sash 1f3bd +sa 1f202 +sagittarius 2650 +sailboat 26f5 +sake 1f376 +sandal 1f461 +santa 1f385 +satellite 1f4e1 +satisfied 1f606 +saxophone 1f3b7 +school 1f3eb +school_satchel 1f392 +scissors 2702 +scorpius 264f +scream 1f631 +scream_cat 1f640 +scroll 1f4dc +seat 1f4ba +secret 3299 +see_no_evil 1f648 +seedling 1f331 +seven 0037 20e3 +shaved_ice 1f367 +sheep 1f411 +shell 1f41a +ship 1f6a2 +shirt 1f455 +shit 1f4a9 +shoe 1f45e +shower 1f6bf +signal_strength 1f4f6 +six 0036 20e3 +six_pointed_star 1f52f +ski 1f3bf +skull 1f480 +sleeping 1f634 +sleepy 1f62a +slot_machine 1f3b0 +small_blue_diamond 1f539 +small_orange_diamond 1f538 +small_red_triangle 1f53a +small_red_triangle_down 1f53b +smile 1f604 +smile_cat 1f638 +smiley 1f603 +smiley_cat 1f63a +smiling_imp 1f608 +smirk 1f60f +smirk_cat 1f63c +smoking 1f6ac +snail 1f40c +snake 1f40d +snowboarder 1f3c2 +snowflake 2744 +snowman 26c4 +sob 1f62d +soccer 26bd +soon 1f51c +sos 1f198 +sound 1f509 +space_invader 1f47e +spades 2660 +spaghetti 1f35d +sparkle 2747 +sparkler 1f387 +sparkles 2728 +sparkling_heart 1f496 +speak_no_evil 1f64a +speaker 1f508 +speech_balloon 1f4ac +speedboat 1f6a4 +star 2b50 +star2 1f31f +stars 1f320 +station 1f689 +statue_of_liberty 1f5fd +steam_locomotive 1f682 +stew 1f372 +straight_ruler 1f4cf +strawberry 1f353 +stuck_out_tongue 1f61b +stuck_out_tongue_closed_eyes 1f61d +stuck_out_tongue_winking_eye 1f61c +sun_with_face 1f31e +sunflower 1f33b +sunglasses 1f60e +sunny 2600 +sunrise 1f305 +sunrise_over_mountains 1f304 +surfer 1f3c4 +sushi 1f363 +suspension_railway 1f69f +sweat 1f613 +sweat_drops 1f4a6 +sweat_smile 1f605 +sweet_potato 1f360 +swimmer 1f3ca +symbols 1f523 +syringe 1f489 +tada 1f389 +tanabata_tree 1f38b +tangerine 1f34a +taurus 2649 +taxi 1f695 +tea 1f375 +telephone 260e +telephone_receiver 1f4de +telescope 1f52d +tennis 1f3be +tent 26fa +thought_balloon 1f4ad +three 0033 20e3 +thumbsdown 1f44e +thumbsup 1f44d +ticket 1f3ab +tiger 1f42f +tiger2 1f405 +tired_face 1f62b +tm 2122 +toilet 1f6bd +tokyo_tower 1f5fc +tomato 1f345 +tongue 1f445 +top 1f51d +tophat 1f3a9 +tractor 1f69c +traffic_light 1f6a5 +train 1f68b +train2 1f686 +tram 1f68a +triangular_flag_on_post 1f6a9 +triangular_ruler 1f4d0 +trident 1f531 +triumph 1f624 +trolleybus 1f68e +trophy 1f3c6 +tropical_drink 1f379 +tropical_fish 1f420 +truck 1f69a +trumpet 1f3ba +tshirt 1f455 +tulip 1f337 +turtle 1f422 +tv 1f4fa +twisted_rightwards_arrows 1f500 +two 0032 20e3 +two_hearts 1f495 +two_men_holding_hands 1f46c +two_women_holding_hands 1f46d +u5272 1f239 +u5408 1f234 +u55b6 1f23a +u6307 1f22f +u6708 1f237 +u6709 1f236 +u6e80 1f235 +u7121 1f21a +u7533 1f238 +u7981 1f232 +u7a7a 1f233 +uk 1f1ec 1f1e7 +umbrella 2614 +unamused 1f612 +underage 1f51e +unlock 1f513 +up 1f199 +us 1f1fa 1f1f8 +v 270c +vertical_traffic_light 1f6a6 +vhs 1f4fc +vibration_mode 1f4f3 +video_camera 1f4f9 +video_game 1f3ae +violin 1f3bb +virgo 264d +volcano 1f30b +vs 1f19a +walking 1f6b6 +waning_crescent_moon 1f318 +waning_gibbous_moon 1f316 +warning 26a0 +watch 231a +water_buffalo 1f403 +watermelon 1f349 +wave 1f44b +wavy_dash 3030 +waxing_crescent_moon 1f312 +waxing_gibbous_moon 1f314 +wc 1f6be +weary 1f629 +wedding 1f492 +whale 1f433 +whale2 1f40b +wheelchair 267f +white_check_mark 2705 +white_circle 26aa +white_flower 1f4ae +white_large_square 2b1c +white_medium_small_square 25fd +white_medium_square 25fb +white_small_square 25ab +white_square_button 1f533 +wind_chime 1f390 +wine_glass 1f377 +wink 1f609 +wolf 1f43a +woman 1f469 +womans_clothes 1f45a +womans_hat 1f452 +womens 1f6ba +worried 1f61f +wrench 1f527 +x 274c +yellow_heart 1f49b +yen 1f4b4 +yum 1f60b +zap 26a1 +zero 0030 20e3 +zzz 1f4a4 +simple_smile 1f642 + +################## +## custom emoji ## +################## + ++1 +bronze +bronze!? +bronze?! +euphoria +euphoria! +chromakode +pewpewpew +leck +dealwithit +spider +indigo_heart +orange_heart +bot +greenduck +phone 1f4f1 diff --git a/src/lib.rs b/src/lib.rs index 380b321..66fb34e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,14 @@ +#![forbid(unsafe_code)] +// Rustc lint groups +#![warn(future_incompatible)] +#![warn(rust_2018_idioms)] +#![warn(unused)] +// Rustc lints +#![warn(noop_method_call)] +#![warn(single_use_lifetimes)] +// Clippy lints +#![warn(clippy::use_self)] + pub mod api; #[cfg(feature = "bot")] pub mod bot; diff --git a/src/nick.rs b/src/nick.rs index fc652bf..4a11393 100644 --- a/src/nick.rs +++ b/src/nick.rs @@ -5,10 +5,9 @@ use unicode_normalization::UnicodeNormalization; use crate::emoji::Emoji; -fn hue_normalize(emoji: &Emoji, text: &str) -> String { - emoji - .remove(text) - .chars() +/// Does not remove emoji. +fn hue_normalize(text: &str) -> String { + text.chars() .filter(|&c| c.is_ascii_alphanumeric() || c == '_' || c == '-') .map(|c| c.to_ascii_lowercase()) .collect() @@ -16,7 +15,7 @@ fn hue_normalize(emoji: &Emoji, text: &str) -> String { /// A re-implementation of [euphoria's nick hue hashing algorithm][0]. /// -/// [0]: https://github.com/CylonicRaider/heim/blob/097a1fde89ada53de2b70e51e635257f27956e4e/client/lib/heim/hueHash.js +/// [0]: https://github.com/euphoria-io/heim/blob/master/client/lib/hueHash.js fn hue_hash(text: &str, offset: i64) -> u8 { let mut val = 0_i32; for bibyte in text.encode_utf16() { @@ -36,13 +35,7 @@ const GREENIE_OFFSET: i64 = 148 - 192; // 148 - hue_hash("greenie", 0) /// This should be slightly faster than [`hue`] but produces incorrect results /// if any colon-delimited emoji are present. pub fn hue_without_removing_emoji(nick: &str) -> u8 { - // An emoji-less version of hue_normalize - let normalized = nick - .chars() - .filter(|&c| c.is_ascii_alphanumeric() || c == '_' || c == '-') - .map(|c| c.to_ascii_lowercase()) - .collect::(); - + let normalized = hue_normalize(nick); if normalized.is_empty() { hue_hash(nick, GREENIE_OFFSET) } else { @@ -55,14 +48,9 @@ pub fn hue_without_removing_emoji(nick: &str) -> u8 { /// This is a reimplementation of [euphoria's nick hue hashing algorithm][0]. It /// should always return the same value as the official client's implementation. /// -/// [0]: https://github.com/CylonicRaider/heim/blob/097a1fde89ada53de2b70e51e635257f27956e4e/client/lib/heim/hueHash.js +/// [0]: https://github.com/euphoria-io/heim/blob/978c921063e6b06012fc8d16d9fbf1b3a0be1191/client/lib/hueHash.js pub fn hue(emoji: &Emoji, nick: &str) -> u8 { - let normalized = hue_normalize(emoji, nick); - if normalized.is_empty() { - hue_hash(nick, GREENIE_OFFSET) - } else { - hue_hash(&normalized, GREENIE_OFFSET) - } + hue_without_removing_emoji(&emoji.remove(nick)) } /// Normalize a nick to a form that can be compared against other nicks. @@ -86,7 +74,7 @@ pub fn hue(emoji: &Emoji, nick: &str) -> u8 { /// property that's easier to implement, even though it may be incorrect in some /// edge cases. /// -/// [0]: https://github.com/CylonicRaider/heim/blob/978c921063e6b06012fc8d16d9fbf1b3a0be1191/client/lib/stores/chat.js#L14 +/// [0]: https://github.com/euphoria-io/heim/blob/978c921063e6b06012fc8d16d9fbf1b3a0be1191/client/lib/stores/chat.js#L14 pub fn normalize(nick: &str) -> String { mention(nick) // Step 1 .nfkc() // Step 2