From 384ce7fc6dc9a7783e673f196e3e7c01553a6ae7 Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Wed, 8 May 2024 13:43:33 -0400 Subject: [PATCH 01/95] feat(emoji): added the cog --- emoji/__init__.py | 5 +++++ emoji/emoji.py | 11 +++++++++++ emoji/info.json | 16 ++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 emoji/__init__.py create mode 100644 emoji/emoji.py create mode 100644 emoji/info.json diff --git a/emoji/__init__.py b/emoji/__init__.py new file mode 100644 index 0000000..feaa7fc --- /dev/null +++ b/emoji/__init__.py @@ -0,0 +1,5 @@ +from .emoji import Emoji + + +async def setup(bot): + await bot.add_cog(Emoji(bot)) diff --git a/emoji/emoji.py b/emoji/emoji.py new file mode 100644 index 0000000..7dea9f9 --- /dev/null +++ b/emoji/emoji.py @@ -0,0 +1,11 @@ +import discord +from redbot.core import commands + + +class Emoji(commands.cog): + """Retrieve information about emojis.""" + + @commands.hybrid_command() + async def emoji(self, ctx: commands.Context, emoji: discord.Emoji, ephemeral: bool = False) -> None: + """Retrieve information about an emoji.""" + await ctx.send(content=f"Emoji: {emoji}", ephemeral=ephemeral) diff --git a/emoji/info.json b/emoji/info.json new file mode 100644 index 0000000..0aca458 --- /dev/null +++ b/emoji/info.json @@ -0,0 +1,16 @@ +{ + "author" : ["SeaswimmerTheFsh (seasw.)"], + "install_msg" : "Thank you for installing Emoji!", + "name" : "Emoji", + "short" : "Retrieve information about emojis.", + "description" : "Retrieve information about emojis.", + "end_user_data_statement" : "This cog does not store end user data.", + "hidden": false, + "disabled": false, + "min_bot_version": "3.5.0", + "min_python_version": [3, 10, 0], + "requirements": ["pillow"], + "tags": [ + "utility" + ] +} From ea1f7a7f8efaf49bf0760b5ab4d6ff7766effd8a Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Wed, 8 May 2024 13:47:33 -0400 Subject: [PATCH 02/95] fix(emoji): fixed the cog refusing to load --- emoji/emoji.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/emoji/emoji.py b/emoji/emoji.py index 7dea9f9..48897dc 100644 --- a/emoji/emoji.py +++ b/emoji/emoji.py @@ -1,10 +1,35 @@ +from typing import Any, Literal + import discord +from red_commons.logging import RedTraceLogger, getLogger from redbot.core import commands +from redbot.core.bot import Red +from redbot.core.utils.chat_formatting import humanize_list class Emoji(commands.cog): """Retrieve information about emojis.""" + __author__: list[str] = ["SeaswimmerTheFsh"] + __version__: str = "1.0.0" + __documentation__: str = "https://seacogs.coastalcommits.com/emoji/" + + def __init__(self, bot: Red) -> None: + super().__init__() + self.bot: Red = bot + self.logger: RedTraceLogger = getLogger(name="red.SeaCogs.Emoji") + + def format_help_for_context(self, ctx: commands.Context) -> str: + pre_processed: Any | Literal[''] = super().format_help_for_context(ctx) or "" + n: Literal['\n'] | Literal[''] = "\n" if "\n\n" not in pre_processed else "" + text: list[str] = [ + f"{pre_processed}{n}", + f"Cog Version: **{self.__version__}**", + f"Author: {humanize_list(items=self.__author__)}", + f"Documentation: {self.__documentation__}", + ] + return "\n".join(text) + @commands.hybrid_command() async def emoji(self, ctx: commands.Context, emoji: discord.Emoji, ephemeral: bool = False) -> None: """Retrieve information about an emoji.""" From 8fdf587bde5c523521143d7da119dd0d7a5d6dd8 Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Wed, 8 May 2024 13:50:46 -0400 Subject: [PATCH 03/95] fix(emoji): specify a name for the hybrid command --- emoji/emoji.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emoji/emoji.py b/emoji/emoji.py index 48897dc..b83a0d9 100644 --- a/emoji/emoji.py +++ b/emoji/emoji.py @@ -30,7 +30,7 @@ class Emoji(commands.cog): ] return "\n".join(text) - @commands.hybrid_command() + @commands.hybrid_command(name="emoji") async def emoji(self, ctx: commands.Context, emoji: discord.Emoji, ephemeral: bool = False) -> None: """Retrieve information about an emoji.""" await ctx.send(content=f"Emoji: {emoji}", ephemeral=ephemeral) From 20c3007306f4f13d6c671071a7ce41aa51babc8a Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Wed, 8 May 2024 13:53:21 -0400 Subject: [PATCH 04/95] renamed emoji to emojiinfo --- emoji/__init__.py | 5 ----- emojiinfo/__init__.py | 5 +++++ emoji/emoji.py => emojiinfo/emojiinfo.py | 2 +- {emoji => emojiinfo}/info.json | 0 4 files changed, 6 insertions(+), 6 deletions(-) delete mode 100644 emoji/__init__.py create mode 100644 emojiinfo/__init__.py rename emoji/emoji.py => emojiinfo/emojiinfo.py (97%) rename {emoji => emojiinfo}/info.json (100%) diff --git a/emoji/__init__.py b/emoji/__init__.py deleted file mode 100644 index feaa7fc..0000000 --- a/emoji/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from .emoji import Emoji - - -async def setup(bot): - await bot.add_cog(Emoji(bot)) diff --git a/emojiinfo/__init__.py b/emojiinfo/__init__.py new file mode 100644 index 0000000..fb9994a --- /dev/null +++ b/emojiinfo/__init__.py @@ -0,0 +1,5 @@ +from .emojiinfo import EmojiInfo + + +async def setup(bot): + await bot.add_cog(EmojiInfo(bot)) diff --git a/emoji/emoji.py b/emojiinfo/emojiinfo.py similarity index 97% rename from emoji/emoji.py rename to emojiinfo/emojiinfo.py index b83a0d9..6e4d21a 100644 --- a/emoji/emoji.py +++ b/emojiinfo/emojiinfo.py @@ -7,7 +7,7 @@ from redbot.core.bot import Red from redbot.core.utils.chat_formatting import humanize_list -class Emoji(commands.cog): +class EmojiInfo(commands.cog): """Retrieve information about emojis.""" __author__: list[str] = ["SeaswimmerTheFsh"] diff --git a/emoji/info.json b/emojiinfo/info.json similarity index 100% rename from emoji/info.json rename to emojiinfo/info.json From c266997a78c6c8732f2702545d4540c54f03f59d Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Wed, 8 May 2024 13:54:55 -0400 Subject: [PATCH 05/95] fix(emojiinfo): use commands.Cog instead of commands.cog --- emojiinfo/emojiinfo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emojiinfo/emojiinfo.py b/emojiinfo/emojiinfo.py index 6e4d21a..40701d6 100644 --- a/emojiinfo/emojiinfo.py +++ b/emojiinfo/emojiinfo.py @@ -7,7 +7,7 @@ from redbot.core.bot import Red from redbot.core.utils.chat_formatting import humanize_list -class EmojiInfo(commands.cog): +class EmojiInfo(commands.Cog): """Retrieve information about emojis.""" __author__: list[str] = ["SeaswimmerTheFsh"] From d87c37239d9c22954594a19a3fdc334c60f8fd97 Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Wed, 8 May 2024 13:58:58 -0400 Subject: [PATCH 06/95] fix(emojiinfo): fixed error if you input a default discord emoji --- emojiinfo/emojiinfo.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/emojiinfo/emojiinfo.py b/emojiinfo/emojiinfo.py index 40701d6..ab39a05 100644 --- a/emojiinfo/emojiinfo.py +++ b/emojiinfo/emojiinfo.py @@ -1,6 +1,5 @@ from typing import Any, Literal -import discord from red_commons.logging import RedTraceLogger, getLogger from redbot.core import commands from redbot.core.bot import Red @@ -31,6 +30,6 @@ class EmojiInfo(commands.Cog): return "\n".join(text) @commands.hybrid_command(name="emoji") - async def emoji(self, ctx: commands.Context, emoji: discord.Emoji, ephemeral: bool = False) -> None: + async def emoji(self, ctx: commands.Context, emoji: str, ephemeral: bool = False) -> None: """Retrieve information about an emoji.""" await ctx.send(content=f"Emoji: {emoji}", ephemeral=ephemeral) From b910d8c6147fb5e76a65dd3e66346e9c912d985b Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Wed, 8 May 2024 14:26:03 -0400 Subject: [PATCH 07/95] feat(emojiinfo): added most of the cog's functionality --- emojiinfo/emojiinfo.py | 40 +++++- poetry.lock | 317 +++++++++++++++++++++-------------------- pyproject.toml | 1 + 3 files changed, 206 insertions(+), 152 deletions(-) diff --git a/emojiinfo/emojiinfo.py b/emojiinfo/emojiinfo.py index ab39a05..e6abbaa 100644 --- a/emojiinfo/emojiinfo.py +++ b/emojiinfo/emojiinfo.py @@ -1,5 +1,8 @@ +import io from typing import Any, Literal +import discord +from colorthief import ColorThief from red_commons.logging import RedTraceLogger, getLogger from redbot.core import commands from redbot.core.bot import Red @@ -29,7 +32,42 @@ class EmojiInfo(commands.Cog): ] return "\n".join(text) + async def fetch_twemoji(self, unicode_emoji) -> str: + base_url = "https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/72x72/" + emoji_codepoint = "-".join([hex(ord(char))[2:] for char in unicode_emoji]) + segments = emoji_codepoint.split("-") + valid_segments = [seg for seg in segments if len(seg) >= 4] + emoji_url = f"{base_url}{valid_segments[0]}.png" + return emoji_url + + async def fetch_primary_color(self, emoji_url: str) -> discord.Color | None: + async with self.bot.http_session.get(emoji_url) as response: + if response.status != 200: + return None + image = await response.read() + dominant_color = ColorThief(io.BytesIO(image)).get_color(quality=1) + color = discord.Color.from_rgb(*dominant_color) + return color + @commands.hybrid_command(name="emoji") async def emoji(self, ctx: commands.Context, emoji: str, ephemeral: bool = False) -> None: """Retrieve information about an emoji.""" - await ctx.send(content=f"Emoji: {emoji}", ephemeral=ephemeral) + emoji: discord.PartialEmoji = discord.PartialEmoji.from_str(value=emoji) + if emoji.is_unicode_emoji(): + emoji_url = await self.fetch_twemoji(unicode_emoji=emoji.name) + else: + emoji_url = emoji.url + string: str = ( + f"Name: {emoji}\n" + f"ID: {emoji.id}\n" if emoji.id else "" + f"Native: {emoji.is_unicode_emoji()}\n" + f"Animated: {emoji.animated}\n" + f"Markdown: `:{emoji.name}:`\n" + f"URL: [Click Here]({emoji_url})" + ) + if await ctx.embed_requested(): + embed = embed = discord.Embed(title="Emoji Information", description=string, color = await self.fetch_primary_color(emoji_url) or await ctx.embed_color) + embed.set_thumbnail(url=emoji_url) + await ctx.send(embed=embed, ephemeral=ephemeral) + else: + await ctx.send(content=string, ephemeral=ephemeral) diff --git a/poetry.lock b/poetry.lock index 2767d72..50be601 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] name = "aiohttp" @@ -560,6 +560,20 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "colorthief" +version = "0.2.1" +description = "A module for grabbing the color palette from an image." +optional = false +python-versions = "*" +files = [ + {file = "colorthief-0.2.1-py2.py3-none-any.whl", hash = "sha256:b04fc8ce5cf9c888768745e29cb19b7b688d5711af6fba26e8057debabec56b9"}, + {file = "colorthief-0.2.1.tar.gz", hash = "sha256:079cb0c95bdd669c4643e2f7494de13b0b6029d5cdbe2d74d5d3c3386bd57221"}, +] + +[package.dependencies] +Pillow = "*" + [[package]] name = "contextlib2" version = "21.6.0" @@ -1303,61 +1317,62 @@ files = [ [[package]] name = "orjson" -version = "3.9.15" +version = "3.10.0" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false python-versions = ">=3.8" files = [ - {file = "orjson-3.9.15-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:d61f7ce4727a9fa7680cd6f3986b0e2c732639f46a5e0156e550e35258aa313a"}, - {file = "orjson-3.9.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4feeb41882e8aa17634b589533baafdceb387e01e117b1ec65534ec724023d04"}, - {file = "orjson-3.9.15-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fbbeb3c9b2edb5fd044b2a070f127a0ac456ffd079cb82746fc84af01ef021a4"}, - {file = "orjson-3.9.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b66bcc5670e8a6b78f0313bcb74774c8291f6f8aeef10fe70e910b8040f3ab75"}, - {file = "orjson-3.9.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2973474811db7b35c30248d1129c64fd2bdf40d57d84beed2a9a379a6f57d0ab"}, - {file = "orjson-3.9.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fe41b6f72f52d3da4db524c8653e46243c8c92df826ab5ffaece2dba9cccd58"}, - {file = "orjson-3.9.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4228aace81781cc9d05a3ec3a6d2673a1ad0d8725b4e915f1089803e9efd2b99"}, - {file = "orjson-3.9.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6f7b65bfaf69493c73423ce9db66cfe9138b2f9ef62897486417a8fcb0a92bfe"}, - {file = "orjson-3.9.15-cp310-none-win32.whl", hash = "sha256:2d99e3c4c13a7b0fb3792cc04c2829c9db07838fb6973e578b85c1745e7d0ce7"}, - {file = "orjson-3.9.15-cp310-none-win_amd64.whl", hash = "sha256:b725da33e6e58e4a5d27958568484aa766e825e93aa20c26c91168be58e08cbb"}, - {file = "orjson-3.9.15-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c8e8fe01e435005d4421f183038fc70ca85d2c1e490f51fb972db92af6e047c2"}, - {file = "orjson-3.9.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87f1097acb569dde17f246faa268759a71a2cb8c96dd392cd25c668b104cad2f"}, - {file = "orjson-3.9.15-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff0f9913d82e1d1fadbd976424c316fbc4d9c525c81d047bbdd16bd27dd98cfc"}, - {file = "orjson-3.9.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8055ec598605b0077e29652ccfe9372247474375e0e3f5775c91d9434e12d6b1"}, - {file = "orjson-3.9.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d6768a327ea1ba44c9114dba5fdda4a214bdb70129065cd0807eb5f010bfcbb5"}, - {file = "orjson-3.9.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12365576039b1a5a47df01aadb353b68223da413e2e7f98c02403061aad34bde"}, - {file = "orjson-3.9.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:71c6b009d431b3839d7c14c3af86788b3cfac41e969e3e1c22f8a6ea13139404"}, - {file = "orjson-3.9.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e18668f1bd39e69b7fed19fa7cd1cd110a121ec25439328b5c89934e6d30d357"}, - {file = "orjson-3.9.15-cp311-none-win32.whl", hash = "sha256:62482873e0289cf7313461009bf62ac8b2e54bc6f00c6fabcde785709231a5d7"}, - {file = "orjson-3.9.15-cp311-none-win_amd64.whl", hash = "sha256:b3d336ed75d17c7b1af233a6561cf421dee41d9204aa3cfcc6c9c65cd5bb69a8"}, - {file = "orjson-3.9.15-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:82425dd5c7bd3adfe4e94c78e27e2fa02971750c2b7ffba648b0f5d5cc016a73"}, - {file = "orjson-3.9.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c51378d4a8255b2e7c1e5cc430644f0939539deddfa77f6fac7b56a9784160a"}, - {file = "orjson-3.9.15-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6ae4e06be04dc00618247c4ae3f7c3e561d5bc19ab6941427f6d3722a0875ef7"}, - {file = "orjson-3.9.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bcef128f970bb63ecf9a65f7beafd9b55e3aaf0efc271a4154050fc15cdb386e"}, - {file = "orjson-3.9.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b72758f3ffc36ca566ba98a8e7f4f373b6c17c646ff8ad9b21ad10c29186f00d"}, - {file = "orjson-3.9.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c57bc7b946cf2efa67ac55766e41764b66d40cbd9489041e637c1304400494"}, - {file = "orjson-3.9.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:946c3a1ef25338e78107fba746f299f926db408d34553b4754e90a7de1d44068"}, - {file = "orjson-3.9.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2f256d03957075fcb5923410058982aea85455d035607486ccb847f095442bda"}, - {file = "orjson-3.9.15-cp312-none-win_amd64.whl", hash = "sha256:5bb399e1b49db120653a31463b4a7b27cf2fbfe60469546baf681d1b39f4edf2"}, - {file = "orjson-3.9.15-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b17f0f14a9c0ba55ff6279a922d1932e24b13fc218a3e968ecdbf791b3682b25"}, - {file = "orjson-3.9.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f6cbd8e6e446fb7e4ed5bac4661a29e43f38aeecbf60c4b900b825a353276a1"}, - {file = "orjson-3.9.15-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:76bc6356d07c1d9f4b782813094d0caf1703b729d876ab6a676f3aaa9a47e37c"}, - {file = "orjson-3.9.15-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fdfa97090e2d6f73dced247a2f2d8004ac6449df6568f30e7fa1a045767c69a6"}, - {file = "orjson-3.9.15-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7413070a3e927e4207d00bd65f42d1b780fb0d32d7b1d951f6dc6ade318e1b5a"}, - {file = "orjson-3.9.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9cf1596680ac1f01839dba32d496136bdd5d8ffb858c280fa82bbfeb173bdd40"}, - {file = "orjson-3.9.15-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:809d653c155e2cc4fd39ad69c08fdff7f4016c355ae4b88905219d3579e31eb7"}, - {file = "orjson-3.9.15-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:920fa5a0c5175ab14b9c78f6f820b75804fb4984423ee4c4f1e6d748f8b22bc1"}, - {file = "orjson-3.9.15-cp38-none-win32.whl", hash = "sha256:2b5c0f532905e60cf22a511120e3719b85d9c25d0e1c2a8abb20c4dede3b05a5"}, - {file = "orjson-3.9.15-cp38-none-win_amd64.whl", hash = "sha256:67384f588f7f8daf040114337d34a5188346e3fae6c38b6a19a2fe8c663a2f9b"}, - {file = "orjson-3.9.15-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:6fc2fe4647927070df3d93f561d7e588a38865ea0040027662e3e541d592811e"}, - {file = "orjson-3.9.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34cbcd216e7af5270f2ffa63a963346845eb71e174ea530867b7443892d77180"}, - {file = "orjson-3.9.15-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f541587f5c558abd93cb0de491ce99a9ef8d1ae29dd6ab4dbb5a13281ae04cbd"}, - {file = "orjson-3.9.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92255879280ef9c3c0bcb327c5a1b8ed694c290d61a6a532458264f887f052cb"}, - {file = "orjson-3.9.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:05a1f57fb601c426635fcae9ddbe90dfc1ed42245eb4c75e4960440cac667262"}, - {file = "orjson-3.9.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ede0bde16cc6e9b96633df1631fbcd66491d1063667f260a4f2386a098393790"}, - {file = "orjson-3.9.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e88b97ef13910e5f87bcbc4dd7979a7de9ba8702b54d3204ac587e83639c0c2b"}, - {file = "orjson-3.9.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:57d5d8cf9c27f7ef6bc56a5925c7fbc76b61288ab674eb352c26ac780caa5b10"}, - {file = "orjson-3.9.15-cp39-none-win32.whl", hash = "sha256:001f4eb0ecd8e9ebd295722d0cbedf0748680fb9998d3993abaed2f40587257a"}, - {file = "orjson-3.9.15-cp39-none-win_amd64.whl", hash = "sha256:ea0b183a5fe6b2b45f3b854b0d19c4e932d6f5934ae1f723b07cf9560edd4ec7"}, - {file = "orjson-3.9.15.tar.gz", hash = "sha256:95cae920959d772f30ab36d3b25f83bb0f3be671e986c72ce22f8fa700dae061"}, + {file = "orjson-3.10.0-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:47af5d4b850a2d1328660661f0881b67fdbe712aea905dadd413bdea6f792c33"}, + {file = "orjson-3.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c90681333619d78360d13840c7235fdaf01b2b129cb3a4f1647783b1971542b6"}, + {file = "orjson-3.10.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:400c5b7c4222cb27b5059adf1fb12302eebcabf1978f33d0824aa5277ca899bd"}, + {file = "orjson-3.10.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5dcb32e949eae80fb335e63b90e5808b4b0f64e31476b3777707416b41682db5"}, + {file = "orjson-3.10.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa7d507c7493252c0a0264b5cc7e20fa2f8622b8a83b04d819b5ce32c97cf57b"}, + {file = "orjson-3.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e286a51def6626f1e0cc134ba2067dcf14f7f4b9550f6dd4535fd9d79000040b"}, + {file = "orjson-3.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8acd4b82a5f3a3ec8b1dc83452941d22b4711964c34727eb1e65449eead353ca"}, + {file = "orjson-3.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:30707e646080dd3c791f22ce7e4a2fc2438765408547c10510f1f690bd336217"}, + {file = "orjson-3.10.0-cp310-none-win32.whl", hash = "sha256:115498c4ad34188dcb73464e8dc80e490a3e5e88a925907b6fedcf20e545001a"}, + {file = "orjson-3.10.0-cp310-none-win_amd64.whl", hash = "sha256:6735dd4a5a7b6df00a87d1d7a02b84b54d215fb7adac50dd24da5997ffb4798d"}, + {file = "orjson-3.10.0-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9587053e0cefc284e4d1cd113c34468b7d3f17666d22b185ea654f0775316a26"}, + {file = "orjson-3.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bef1050b1bdc9ea6c0d08468e3e61c9386723633b397e50b82fda37b3563d72"}, + {file = "orjson-3.10.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d16c6963ddf3b28c0d461641517cd312ad6b3cf303d8b87d5ef3fa59d6844337"}, + {file = "orjson-3.10.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4251964db47ef090c462a2d909f16c7c7d5fe68e341dabce6702879ec26d1134"}, + {file = "orjson-3.10.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:73bbbdc43d520204d9ef0817ac03fa49c103c7f9ea94f410d2950755be2c349c"}, + {file = "orjson-3.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:414e5293b82373606acf0d66313aecb52d9c8c2404b1900683eb32c3d042dbd7"}, + {file = "orjson-3.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:feaed5bb09877dc27ed0d37f037ddef6cb76d19aa34b108db270d27d3d2ef747"}, + {file = "orjson-3.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5127478260db640323cea131ee88541cb1a9fbce051f0b22fa2f0892f44da302"}, + {file = "orjson-3.10.0-cp311-none-win32.whl", hash = "sha256:b98345529bafe3c06c09996b303fc0a21961820d634409b8639bc16bd4f21b63"}, + {file = "orjson-3.10.0-cp311-none-win_amd64.whl", hash = "sha256:658ca5cee3379dd3d37dbacd43d42c1b4feee99a29d847ef27a1cb18abdfb23f"}, + {file = "orjson-3.10.0-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:4329c1d24fd130ee377e32a72dc54a3c251e6706fccd9a2ecb91b3606fddd998"}, + {file = "orjson-3.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef0f19fdfb6553342b1882f438afd53c7cb7aea57894c4490c43e4431739c700"}, + {file = "orjson-3.10.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c4f60db24161534764277f798ef53b9d3063092f6d23f8f962b4a97edfa997a0"}, + {file = "orjson-3.10.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1de3fd5c7b208d836f8ecb4526995f0d5877153a4f6f12f3e9bf11e49357de98"}, + {file = "orjson-3.10.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f93e33f67729d460a177ba285002035d3f11425ed3cebac5f6ded4ef36b28344"}, + {file = "orjson-3.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:237ba922aef472761acd697eef77fef4831ab769a42e83c04ac91e9f9e08fa0e"}, + {file = "orjson-3.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98c1bfc6a9bec52bc8f0ab9b86cc0874b0299fccef3562b793c1576cf3abb570"}, + {file = "orjson-3.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:30d795a24be16c03dca0c35ca8f9c8eaaa51e3342f2c162d327bd0225118794a"}, + {file = "orjson-3.10.0-cp312-none-win32.whl", hash = "sha256:6a3f53dc650bc860eb26ec293dfb489b2f6ae1cbfc409a127b01229980e372f7"}, + {file = "orjson-3.10.0-cp312-none-win_amd64.whl", hash = "sha256:983db1f87c371dc6ffc52931eb75f9fe17dc621273e43ce67bee407d3e5476e9"}, + {file = "orjson-3.10.0-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9a667769a96a72ca67237224a36faf57db0c82ab07d09c3aafc6f956196cfa1b"}, + {file = "orjson-3.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ade1e21dfde1d37feee8cf6464c20a2f41fa46c8bcd5251e761903e46102dc6b"}, + {file = "orjson-3.10.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:23c12bb4ced1c3308eff7ba5c63ef8f0edb3e4c43c026440247dd6c1c61cea4b"}, + {file = "orjson-3.10.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2d014cf8d4dc9f03fc9f870de191a49a03b1bcda51f2a957943fb9fafe55aac"}, + {file = "orjson-3.10.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eadecaa16d9783affca33597781328e4981b048615c2ddc31c47a51b833d6319"}, + {file = "orjson-3.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd583341218826f48bd7c6ebf3310b4126216920853cbc471e8dbeaf07b0b80e"}, + {file = "orjson-3.10.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:90bfc137c75c31d32308fd61951d424424426ddc39a40e367704661a9ee97095"}, + {file = "orjson-3.10.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:13b5d3c795b09a466ec9fcf0bd3ad7b85467d91a60113885df7b8d639a9d374b"}, + {file = "orjson-3.10.0-cp38-none-win32.whl", hash = "sha256:5d42768db6f2ce0162544845facb7c081e9364a5eb6d2ef06cd17f6050b048d8"}, + {file = "orjson-3.10.0-cp38-none-win_amd64.whl", hash = "sha256:33e6655a2542195d6fd9f850b428926559dee382f7a862dae92ca97fea03a5ad"}, + {file = "orjson-3.10.0-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:4050920e831a49d8782a1720d3ca2f1c49b150953667eed6e5d63a62e80f46a2"}, + {file = "orjson-3.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1897aa25a944cec774ce4a0e1c8e98fb50523e97366c637b7d0cddabc42e6643"}, + {file = "orjson-3.10.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9bf565a69e0082ea348c5657401acec3cbbb31564d89afebaee884614fba36b4"}, + {file = "orjson-3.10.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b6ebc17cfbbf741f5c1a888d1854354536f63d84bee537c9a7c0335791bb9009"}, + {file = "orjson-3.10.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2817877d0b69f78f146ab305c5975d0618df41acf8811249ee64231f5953fee"}, + {file = "orjson-3.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57d017863ec8aa4589be30a328dacd13c2dc49de1c170bc8d8c8a98ece0f2925"}, + {file = "orjson-3.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:22c2f7e377ac757bd3476ecb7480c8ed79d98ef89648f0176deb1da5cd014eb7"}, + {file = "orjson-3.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e62ba42bfe64c60c1bc84799944f80704e996592c6b9e14789c8e2a303279912"}, + {file = "orjson-3.10.0-cp39-none-win32.whl", hash = "sha256:60c0b1bdbccd959ebd1575bd0147bd5e10fc76f26216188be4a36b691c937077"}, + {file = "orjson-3.10.0-cp39-none-win_amd64.whl", hash = "sha256:175a41500ebb2fdf320bf78e8b9a75a1279525b62ba400b2b2444e274c2c8bee"}, + {file = "orjson-3.10.0.tar.gz", hash = "sha256:ba4d8cac5f2e2cff36bea6b6481cdb92b38c202bcec603d6f5ff91960595a1ed"}, ] [[package]] @@ -1704,101 +1719,101 @@ pyyaml = "*" [[package]] name = "rapidfuzz" -version = "3.6.2" +version = "3.7.0" description = "rapid fuzzy string matching" optional = false python-versions = ">=3.8" files = [ - {file = "rapidfuzz-3.6.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a5637e6bf11b15b5aff6ee818c76bdec99ad208511b78985e6209ba648a6e3ee"}, - {file = "rapidfuzz-3.6.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:380586664f2f63807050ddb95e7702888b4f0b425abf17655940c411f39287ad"}, - {file = "rapidfuzz-3.6.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3168ff565d4b8c239cf11fb604dd2507d30e9bcaac76a4077c0ac23cf2c866ed"}, - {file = "rapidfuzz-3.6.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be69f7fd46b5c6467fe5e2fd4cff3816b0c03048eed8a4becb9a73e6000960e7"}, - {file = "rapidfuzz-3.6.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cbd5894f23fdf5697499cf759523639838ac822bd1600e343fdce7313baa02ae"}, - {file = "rapidfuzz-3.6.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:85a5b6e026393fe39fb61146b9c17c5af66fffbe1410e992c4bb06d9ec327bd3"}, - {file = "rapidfuzz-3.6.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab269adfc64480f209e99f253391a10735edd5c09046e04899adab5fb132f20e"}, - {file = "rapidfuzz-3.6.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35aeac852bca06023d6bbd50c1fc504ca5a9a3613d5e75a140f0be7601fa34ef"}, - {file = "rapidfuzz-3.6.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e706f302c6a3ae0d74edd0d6ace46aee1ae07c563b436ccf5ff04db2b3571e60"}, - {file = "rapidfuzz-3.6.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bec353f022011e6e5cd28ccb8700fbd2a33918197af0d4e0abb3c3f4845cc864"}, - {file = "rapidfuzz-3.6.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ef3925daaa93eed20401012e219f569ff0c039ed5bf4ce2d3737b4f75d441622"}, - {file = "rapidfuzz-3.6.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:6ee98d88ae9ccc77ff61992ed33b2496478def5dc0da55c9a9aa06fcb725a352"}, - {file = "rapidfuzz-3.6.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:423c7c588b09d618601097b7a0017dfcb91132a2076bef29023c5f3cd2dc3de1"}, - {file = "rapidfuzz-3.6.2-cp310-cp310-win32.whl", hash = "sha256:c17c5efee347a40a6f4c1eec59e3d7d1e22f7613a97f8b8a07733ef723483a04"}, - {file = "rapidfuzz-3.6.2-cp310-cp310-win_amd64.whl", hash = "sha256:4209816626d8d6ff8ae7dc248061c6059e618b70c6e6f6e4d7444ae3740b2b85"}, - {file = "rapidfuzz-3.6.2-cp310-cp310-win_arm64.whl", hash = "sha256:1c54d3c85e522d3ac9ee39415f183c8fa184c4f87e7e5a37938f15a6d50e853a"}, - {file = "rapidfuzz-3.6.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e06f6d270112f5db001f1cba5a97e1a48aee3d3dbdcbea3ec027c230462dbf9b"}, - {file = "rapidfuzz-3.6.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:080cb71b50cb6aff11d1c6aeb157f273e2da0b2bdb3f9d7b01257e49e69a8576"}, - {file = "rapidfuzz-3.6.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a7895e04a22d6515bc91a850e0831f2405547605aa311d1ffec51e4818abc3c1"}, - {file = "rapidfuzz-3.6.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd82f9838519136b7083dd1e3149ee80344521f3dc37f744f227505ff0883efb"}, - {file = "rapidfuzz-3.6.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a945567c2b0b6e069454c9782d5234b0b6795718adf7a9f868bd3144afa6a023"}, - {file = "rapidfuzz-3.6.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:673ba2c343644805acdae1cb949c6a4de71aa2f62a998978551ebea59603af3f"}, - {file = "rapidfuzz-3.6.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d457c89bac1471442002e70551e8268e639b3870b4a4521eae363c07253be87"}, - {file = "rapidfuzz-3.6.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:495c0d8e14e6f12520eb7fc71b9ba9fcaafb47fc23a654e6e89b6c7985ec0020"}, - {file = "rapidfuzz-3.6.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6d67b649bf3e1b1722d04eca44d37919aef88305ce7ad05564502d013cf550fd"}, - {file = "rapidfuzz-3.6.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e48dde8ca83d11daa00900cf6a5d281a1297aef9b7bfa73801af6e8822be5019"}, - {file = "rapidfuzz-3.6.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:824cc381cf81cbf8d158f6935664ec2a69e6ac3b1d39fa201988bf81a257f775"}, - {file = "rapidfuzz-3.6.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:1dfe4c24957474ce0ac75d886387e30e292b4be39228a6d71f76de414dc187db"}, - {file = "rapidfuzz-3.6.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d57b98013b802621bbc8b12a46bfc9d36ac552ab51ca207f7ce167ad46adabeb"}, - {file = "rapidfuzz-3.6.2-cp311-cp311-win32.whl", hash = "sha256:9a07dffac439223b4f1025dbfc68f4445a3460a859309c9858c2a3fa29617cdc"}, - {file = "rapidfuzz-3.6.2-cp311-cp311-win_amd64.whl", hash = "sha256:95a49c6b8bf1229743ae585dd5b7d57f0d15a7eb6e826866d5c9965ba958503c"}, - {file = "rapidfuzz-3.6.2-cp311-cp311-win_arm64.whl", hash = "sha256:af7c19ec86e11488539380d3db1755be5d561a3c0e7b04ff9d07abd7f9a8e9d8"}, - {file = "rapidfuzz-3.6.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:de8adc12161bf282c60f12dc9233bb31632f71d446a010fe7469a69b8153427f"}, - {file = "rapidfuzz-3.6.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:337e357f693130c4c6be740652542b260e36f622c59e01fa33d58f1d2750c930"}, - {file = "rapidfuzz-3.6.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6468f8bc8c3c50604f43631550ef9cfec873515dba5023ca34d461be94669fc8"}, - {file = "rapidfuzz-3.6.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74c6773b11445b5e5cf93ca383171cd0ac0cdeafea11a7b2a5688f8bf8d813e6"}, - {file = "rapidfuzz-3.6.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1507fc5769aa109dda4de3a15f822a0f6a03e18d627bd0ba3ddbb253cf70e07"}, - {file = "rapidfuzz-3.6.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:617949a70150e6fffdaed19253dd49f7a53528411dc8bf7663d499ba21e0f61e"}, - {file = "rapidfuzz-3.6.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f8b77779174b1b40aa70827692571ab457061897846255ad7d5d559e2edb1932"}, - {file = "rapidfuzz-3.6.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80e51b22a7da83f9c87a97e92df07ed0612c74c35496590255f4b5d5b4212dfe"}, - {file = "rapidfuzz-3.6.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3ae7c86914cb6673e97e187ba431b9c4cf4177d9ae77f8a1e5b2ba9a5628839e"}, - {file = "rapidfuzz-3.6.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ddc380ffaa90f204cc9ddcb779114b9ab6f015246d549de9d47871a97ef9f18a"}, - {file = "rapidfuzz-3.6.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:3c1dc078ef371fce09f9f3eec2ca4eaa2a8cd412ec53941015b4f39f14d34407"}, - {file = "rapidfuzz-3.6.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:9a74102fc5a2534fe91f7507838623e1f3a149d8e05648389c42bb42e14b1c3f"}, - {file = "rapidfuzz-3.6.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:48e1eaea8fcd522fca7f04f0480663f0f0cfb77957092cce60a93f4462864996"}, - {file = "rapidfuzz-3.6.2-cp312-cp312-win32.whl", hash = "sha256:66b008bf2972740cd2dda5d382eb8bdb87265cd88198e71c7797bdc0d1f79d20"}, - {file = "rapidfuzz-3.6.2-cp312-cp312-win_amd64.whl", hash = "sha256:87ac3a87f2251ae2e95fc9478ca5c759de6d141d04c84d3fec9f9cdcfc167b33"}, - {file = "rapidfuzz-3.6.2-cp312-cp312-win_arm64.whl", hash = "sha256:b593cc51aed887e93b78c2f94dfae9008be2b23d17afd3b1f1d3eb3913b58f26"}, - {file = "rapidfuzz-3.6.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7d830bc7a9b586a374147ec60b08b1f9ae5996b43f75cc514f37faef3866b519"}, - {file = "rapidfuzz-3.6.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dbee7f5ff11872b76505cbd87c814abc823e8757f11c69062eb3b25130a283da"}, - {file = "rapidfuzz-3.6.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28c011fb31f2c3f82f503aedd6097d3d3854e574e327a119a3b7eb2cf90b79ca"}, - {file = "rapidfuzz-3.6.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cda81d0e0ce0c13abfa46b24e10c1e85f9c6acb628f0a9a948f5779f9c2076a2"}, - {file = "rapidfuzz-3.6.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c279928651ce0e9e5220dcb25a00cc53b65e592a0861336a38299bcdca3a596"}, - {file = "rapidfuzz-3.6.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:35bd4bc9c40e6994c5d6edea4b9319388b4d9711c13c66d543bb4c37624b4184"}, - {file = "rapidfuzz-3.6.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d07899506a5a8760448d9df036d528b55a554bf571714173635c79eef4a86e58"}, - {file = "rapidfuzz-3.6.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb2e51d01b9c6d6954a3e055c57a80d4685b4fc82719db5519fc153566bcd6bb"}, - {file = "rapidfuzz-3.6.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:153d065e353371cc0aeff32b99999a5758266a64e958d1364189367c1c9f6814"}, - {file = "rapidfuzz-3.6.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4edcceebb85ebfa49a3ddcde20ad891d36c08dc0fd592efdab0e7d313a4e36af"}, - {file = "rapidfuzz-3.6.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3549123fca5bb817341025f98e8e49ca99f84596c7c4f92b658f8e5836040d4a"}, - {file = "rapidfuzz-3.6.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:84c1032ae42628465b7a5cc35249906061e18a8193c9c27cbd2db54e9823a9a6"}, - {file = "rapidfuzz-3.6.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:9bcc91ebd8fc69a6bd3b5711c8250f5f4e70606b4da75ef415f57ad209978205"}, - {file = "rapidfuzz-3.6.2-cp38-cp38-win32.whl", hash = "sha256:f3a70f341c4c111bad910d2df69c78577a98af140319a996af24c9385939335d"}, - {file = "rapidfuzz-3.6.2-cp38-cp38-win_amd64.whl", hash = "sha256:354ad5fe655beb7b279390cb58334903931c5452ecbad1b1666ffb06786498e2"}, - {file = "rapidfuzz-3.6.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1b86b93d93020c2b3edc1665d75c8855784845fc0a739b312c26c3a4bf0c80d5"}, - {file = "rapidfuzz-3.6.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:28243086ed0e50808bb56632e5442c457241646aeafafd501ac87901f40a3237"}, - {file = "rapidfuzz-3.6.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ed52461ae5a9ea4c400d38e2649c74a413f1a6d8fb8308b66f1fbd122514732f"}, - {file = "rapidfuzz-3.6.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a46220f86a5f9cb016af31525e0d0865cad437d02239aa0d8aed2ab8bff1f1c"}, - {file = "rapidfuzz-3.6.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81a630ed2fc3ec5fc7400eb66bab1f87e282b4d47f0abe3e48c6634dfa13b5e4"}, - {file = "rapidfuzz-3.6.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8e5a437b9089df6242a718d9c31ab1742989e9400a0977af012ef483b63b4c2"}, - {file = "rapidfuzz-3.6.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16270b5529de83b7bae7457e952e4d9cf3fbf029a837dd32d415bb9e0eb8e599"}, - {file = "rapidfuzz-3.6.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5378c04102c7f084cde30a100154fa6d7e2baf0d51a6bdd2f912545559c1fb35"}, - {file = "rapidfuzz-3.6.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7f18397c8d6a65fc0b288d2fc29bc7baeea6ba91eeb95163a3cd98f23cd3bc85"}, - {file = "rapidfuzz-3.6.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2acd2514defce81e6ff4bbff50252d5e7df8e85a731442c4b83e44c86cf1c916"}, - {file = "rapidfuzz-3.6.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:1df2faf80201952e252413b6fac6f3e146080dcebb87bb1bb722508e67558ed8"}, - {file = "rapidfuzz-3.6.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6440ed0b3007c1c9286b0b88fe2ab2d9e83edd60cd62293b3dfabb732b4e8a30"}, - {file = "rapidfuzz-3.6.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4fcfa23b5553b27f4016df77c53172ea743454cf12c28cfa7c35a309a2be93b3"}, - {file = "rapidfuzz-3.6.2-cp39-cp39-win32.whl", hash = "sha256:2d580d937146e803c8e5e1b87916cab8d6f84013b6392713e201efcda335c7d8"}, - {file = "rapidfuzz-3.6.2-cp39-cp39-win_amd64.whl", hash = "sha256:fe2a68be734e8e88af23385c68d6467e15818b6b1df1cbfebf7bff577226c957"}, - {file = "rapidfuzz-3.6.2-cp39-cp39-win_arm64.whl", hash = "sha256:6478f7803efebf5f644d0b758439c5b25728550fdfbb19783d150004c46a75a9"}, - {file = "rapidfuzz-3.6.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:36ce7b68a7b90b787cdd73480a68d2f1ca63c31a3a9d5a79a8736f978e1e9344"}, - {file = "rapidfuzz-3.6.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53597fd72a9340bcdd80d3620f4957c2b92f9b569313b969a3abdaffd193aae6"}, - {file = "rapidfuzz-3.6.2-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4f6de745fe6ce46a422d353ee10599013631d7d714a36d025f164b2d4e8c000"}, - {file = "rapidfuzz-3.6.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62df2136068e2515ed8beb01756381ff62c29384d785e3bf46e3111d4ea3ba1e"}, - {file = "rapidfuzz-3.6.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7382c90170f60c846c81a07ddd80bb2e8c43c8383754486fa37f67391a571897"}, - {file = "rapidfuzz-3.6.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f31314fd2e2f3dc3e519e6f93669462ce7953df2def1c344aa8f5345976d0eb2"}, - {file = "rapidfuzz-3.6.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:012221629d54d3bee954148247f711eb86d4d390b589ebfe03172ea0b37a7531"}, - {file = "rapidfuzz-3.6.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d41dd59a70decfce6595315367a2fea2af660d92a9d144acc6479030501014d7"}, - {file = "rapidfuzz-3.6.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f9fa14136a5b0cba1ec42531f7c3e0b0d3edb7fd6bc5e5ae7b498541f3855ab"}, - {file = "rapidfuzz-3.6.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:259364199cbfeca33b1af369fc7951f71717aa285184a3fa5a7b1772da1b89db"}, - {file = "rapidfuzz-3.6.2.tar.gz", hash = "sha256:cf911e792ab0c431694c9bf2648afabfd92099103f2e31492893e078ddca5e1a"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:860f438238f1807532aa5c5c25e74c284232ccc115fe84697b78e25d48f364f7"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4bb9285abeb0477cdb2f8ea0cf7fd4b5f72ed5a9a7d3f0c0bb4a5239db2fc1ed"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:08671280e0c04d2bb3f39511f13cae5914e6690036fd1eefc3d47a47f9fae634"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04bae4d9c16ce1bab6447d196fb8258d98139ed8f9b288a38b84887985e4227b"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1efa2268b51b68156fb84d18ca1720311698a58051c4a19c40d670057ce60519"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:600b4d4315f33ec0356c0dab3991a5d5761102420bcff29e0773706aa48936e8"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18bc2f13c73d5d34499ff6ada55b052c445d3aa64d22c2639e5ab45472568046"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e11c5e6593be41a555475c9c20320342c1f5585d635a064924956944c465ad4"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d7878025248b99ccca3285891899373f98548f2ca13835d83619ffc42241c626"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b4a7e37fe136022d944374fcd8a2f72b8a19f7b648d2cdfb946667e9ede97f9f"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b5881856f830351aaabd869151124f64a80bf61560546d9588a630a4e933a5de"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:c788b11565cc176fab8fab6dfcd469031e906927db94bf7e422afd8ef8f88a5a"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9e17a3092e74025d896ef1d67ac236c83494da37a78ef84c712e4e2273c115f1"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-win32.whl", hash = "sha256:e499c823206c9ffd9d89aa11f813a4babdb9219417d4efe4c8a6f8272da00e98"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:91f798cc00cd94a0def43e9befc6e867c9bd8fa8f882d1eaa40042f528b7e2c7"}, + {file = "rapidfuzz-3.7.0-cp310-cp310-win_arm64.whl", hash = "sha256:d5a3872f35bec89f07b993fa1c5401d11b9e68bcdc1b9737494e279308a38a5f"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ef6b6ab64c4c91c57a6b58e1d690b59453bfa1f1e9757a7e52e59b4079e36631"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2f9070b42c0ba030b045bba16a35bdb498a0d6acb0bdb3ff4e325960e685e290"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:63044c63565f50818d885bfcd40ac369947da4197de56b4d6c26408989d48edf"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49b0c47860c733a3d73a4b70b97b35c8cbf24ef24f8743732f0d1c412a8c85de"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1b14489b038f007f425a06fcf28ac6313c02cb603b54e3a28d9cfae82198cc0"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be08f39e397a618aab907887465d7fabc2d1a4d15d1a67cb8b526a7fb5202a3e"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16895dc62a7b92028f9c8b6d22830f1cbc77306ee794f461afc6028e1a8d7539"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:579cce49dfa57ffd8c8227b3fb53cced54b4df70cec502e63e9799b4d1f44004"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:40998c8dc35fdd221790b8b5134a8d7499adbfab9a5dd9ec626c7e92e17a43ed"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:dc3fdb4738a6b83ae27f1d8923b00d3a9c2b5c50da75b9f8b81841839c6e3e1f"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:92b8146fbfb37ac358ef7e0f6b79619e4f793fbbe894b99ea87920f9c0a9d77d"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:1dfceaa7c2914585bb8a043265c39ec09078f13fbf53b5525722fc074306b6fa"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f332d61f51b0b9c8b55a0fb052b4764b6ad599ea8ce948ac47a4388e9083c35e"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-win32.whl", hash = "sha256:dfd1e4819f1f3c47141f86159b44b7360ecb19bf675080b3b40437bf97273ab9"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:594b9c33fc1a86784962043ee3fbaaed875fbaadff72e467c2f7a83cd6c5d69d"}, + {file = "rapidfuzz-3.7.0-cp311-cp311-win_arm64.whl", hash = "sha256:0b13a6823a1b83ae43f8bf35955df35032bee7bec0daf9b5ab836e0286067434"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:075a419a0ec29be44b3d7f4bcfa5cb7e91e419379a85fc05eb33de68315bd96f"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:51a5b96d2081c3afbef1842a61d63e55d0a5a201473e6975a80190ff2d6f22ca"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9460d8fddac7ea46dff9298eee9aa950dbfe79f2eb509a9f18fbaefcd10894c"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f39eb1513ee139ba6b5c01fe47ddf2d87e9560dd7fdee1068f7f6efbae70de34"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eace9fdde58a425d4c9a93021b24a0cac830df167a5b2fc73299e2acf9f41493"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cc77237242303733de47829028a0a8b6ab9188b23ec9d9ff0a674fdcd3c8e7f"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:74e692357dd324dff691d379ef2c094c9ec526c0ce83ed43a066e4e68fe70bf6"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f2075ac9ee5c15d33d24a1efc8368d095602b5fd9634c5b5f24d83e41903528"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5a8ba64d72329a940ff6c74b721268c2004eecc48558f648a38e96915b5d1c1b"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a1f268a2a37cd22573b4a06eccd481c04504b246d3cadc2d8e8dfa64b575636d"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:42c2e8a2341363c7caf276efdbe1a673fc5267a02568c47c8e980f12e9bc8727"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:a9acca34b34fb895ee6a84c436bb919f3b9cd8f43e7003d43e9573a1d990ff74"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9bad6a0fe3bc1753dacaa6229a8ba7d9844eb7ae24d44d17c5f4c51c91a8a95e"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-win32.whl", hash = "sha256:c86bc4b1d2380739e6485396195e30021df509b4923f3f757914e171587bce7c"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:d7361608c8e73a1dc0203a87d151cddebdade0098a047c46da43c469c07df964"}, + {file = "rapidfuzz-3.7.0-cp312-cp312-win_arm64.whl", hash = "sha256:8fdc26e7863e0f63c2185d53bb61f5173ad4451c1c8287b535b30ea25a419a5a"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9b6167468f76779a14b9af66210f68741af94d32d086f19118de4e919f00585c"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5bd394e28ff221557ea4d8152fcec3e66d9f620557feca5f2bedc4c21f8cf2f9"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8e70f876ca89a6df344f8157ac60384e8c05a0dfb442da2490c3f1c45238ccf5"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c837f89d86a5affe9ee6574dad6b195475676a6ab171a67920fc99966f2ab2c"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cda4550a98658f9a8bcdc03d0498ed1565c1563880e3564603a9eaae28d51b2a"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecd70212fd9f1f8b1d3bdd8bcb05acc143defebd41148bdab43e573b043bb241"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:187db4cc8fb54f8c49c67b7f38ef3a122ce23be273032fa2ff34112a2694c3d8"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4604dfc1098920c4eb6d0c6b5cc7bdd4bf95b48633e790c1d3f100a25870691d"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01581b688c5f4f6665b779135e32db0edab1d78028abf914bb91469928efa383"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0828b55ec8ad084febdf4ab0c942eb1f81c97c0935f1cb0be0b4ea84ce755988"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:150c98b65faff17b917b9d36bff8a4d37b6173579c6bc2e38ff2044e209d37a4"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7e4eea225d2bff1aff4c85fcc44716596d3699374d99eb5906b7a7560297460e"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7bc944d7e830cfce0f8b4813875f05904207017b66e25ab7ee757507001310a9"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-win32.whl", hash = "sha256:3e55f02105c451ab6ff0edaaba57cab1b6c0a0241cfb2b306d4e8e1503adba50"}, + {file = "rapidfuzz-3.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:41851620d2900791d66d9b6092fc163441d7dd91a460c73b07957ff1c517bc30"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e8041c6b2d339766efe6298fa272f79d6dd799965df364ef4e50f488c101c899"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4e09d81008e212fc824ea23603ff5270d75886e72372fa6c7c41c1880bcb57ed"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:419c8961e861fb5fc5590056c66a279623d1ea27809baea17e00cdc313f1217a"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1522eaab91b9400b3ef16eebe445940a19e70035b5bc5d98aef23d66e9ac1df0"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:611278ce3136f4544d596af18ab8849827d64372e1d8888d9a8d071bf4a3f44d"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4efa9bfc5b955b6474ee077eee154e240441842fa304f280b06e6b6aa58a1d1e"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0cc9d3c8261457af3f8756b1f71a9fdc4892978a9e8b967976d2803e08bf972"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce728e2b582fd396bc2559160ee2e391e6a4b5d2e455624044699d96abe8a396"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3a6a36c9299e059e0bee3409218bc5235a46570c20fc980cdee5ed21ea6110ad"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9ea720db8def684c1eb71dadad1f61c9b52f4d979263eb5d443f2b22b0d5430a"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:358692f1df3f8aebcd48e69c77c948c9283b44c0efbaf1eeea01739efe3cd9a6"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:faded69ffe79adcefa8da08f414a0fd52375e2b47f57be79471691dad9656b5a"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7f9f3dc14fadbd553975f824ac48c381f42192cec9d7e5711b528357662a8d8e"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-win32.whl", hash = "sha256:7be5f460ff42d7d27729115bfe8a02e83fa0284536d8630ee900d17b75c29e65"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:dd5ad2c12dab2b98340c4b7b9592c8f349730bda9a2e49675ea592bbcbc1360b"}, + {file = "rapidfuzz-3.7.0-cp39-cp39-win_arm64.whl", hash = "sha256:aa163257a0ac4e70f9009d25e5030bdd83a8541dfa3ba78dc86b35c9e16a80b4"}, + {file = "rapidfuzz-3.7.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4e50840a8a8e0229563eeaf22e21a203359859557db8829f4d0285c17126c5fb"}, + {file = "rapidfuzz-3.7.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:632f09e19365ace5ff2670008adc8bf23d03d668b03a30230e5b60ff9317ee93"}, + {file = "rapidfuzz-3.7.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:209dda6ae66b702f74a78cef555397cdc2a83d7f48771774a20d2fc30808b28c"}, + {file = "rapidfuzz-3.7.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bc0b78572626af6ab134895e4dbfe4f4d615d18dcc43b8d902d8e45471aabba"}, + {file = "rapidfuzz-3.7.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7ba14850cc8258b3764ea16b8a4409ac2ba16d229bde7a5f495dd479cd9ccd56"}, + {file = "rapidfuzz-3.7.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b917764fd2b267addc9d03a96d26f751f6117a95f617428c44a069057653b528"}, + {file = "rapidfuzz-3.7.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1252ca156e1b053e84e5ae1c8e9e062ee80468faf23aa5c543708212a42795fd"}, + {file = "rapidfuzz-3.7.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:86c7676a32d7524e40bc73546e511a408bc831ae5b163029d325ea3a2027d089"}, + {file = "rapidfuzz-3.7.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20e7d729af2e5abb29caa070ec048aba042f134091923d9ca2ac662b5604577e"}, + {file = "rapidfuzz-3.7.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:86eea3e6c314a9238de568254a9c591ec73c2985f125675ed5f171d869c47773"}, + {file = "rapidfuzz-3.7.0.tar.gz", hash = "sha256:620df112c39c6d27316dc1e22046dc0382d6d91fd60d7c51bd41ca0333d867e9"}, ] [package.extras] @@ -1820,13 +1835,13 @@ dev = ["black (==22.1.0)", "flake8 (==4.0.1)", "isort (==5.10.1)"] [[package]] name = "red-discordbot" -version = "3.5.7" +version = "3.5.9" description = "A highly customisable Discord bot" optional = false python-versions = "<3.12,>=3.8.1" files = [ - {file = "Red-DiscordBot-3.5.7.tar.gz", hash = "sha256:7673ea794016b6d3d7b96eb07a46cd92c52974e15b3a6ad95608df69dc320838"}, - {file = "Red_DiscordBot-3.5.7-py3-none-any.whl", hash = "sha256:3b9df02cd8efd35170c9505e3f0a8c9b1bd415bcc2ca451a19733d28b1b3a5b4"}, + {file = "Red_DiscordBot-3.5.9-py3-none-any.whl", hash = "sha256:d392c4947f95151435792e99cc74afb7c440b11fb516fa59927f5e462c61385f"}, + {file = "red_discordbot-3.5.9.tar.gz", hash = "sha256:1f50e508b6923868ea4d7bb0eb80a2b1dbdeae248cf0a57717539ca6f5c5874f"}, ] [package.dependencies] @@ -1848,14 +1863,14 @@ markdown = "3.6" markdown-it-py = "3.0.0" mdurl = "0.1.2" multidict = "6.0.5" -orjson = "3.9.15" +orjson = "3.10.0" packaging = "24.0" platformdirs = "4.2.0" psutil = "5.9.8" pygments = "2.17.2" python-dateutil = "2.9.0.post0" pyyaml = "6.0.1" -rapidfuzz = "3.6.2" +rapidfuzz = "3.7.0" red-commons = "1.0.0" red-lavalink = "0.11.0" rich = "13.7.1" @@ -1867,11 +1882,11 @@ yarl = "1.9.4" [package.extras] all = ["async-timeout (==4.0.3)", "asyncpg (==0.29.0)"] -dev = ["alabaster (==0.7.13)", "astroid (==3.1.0)", "async-timeout (==4.0.3)", "asyncpg (==0.29.0)", "black (==23.12.1)", "certifi (==2024.2.2)", "charset-normalizer (==3.3.2)", "dill (==0.3.8)", "docutils (==0.20.1)", "exceptiongroup (==1.2.0)", "imagesize (==1.4.1)", "importlib-metadata (==7.1.0)", "iniconfig (==2.0.0)", "isort (==5.13.2)", "jinja2 (==3.1.3)", "markupsafe (==2.1.5)", "mccabe (==0.7.0)", "mypy-extensions (==1.0.0)", "pathspec (==0.12.1)", "pluggy (==1.4.0)", "pylint (==3.1.0)", "pytest (==7.4.4)", "pytest-asyncio (==0.21.1)", "pytest-mock (==3.12.0)", "pytz (==2024.1)", "requests (==2.31.0)", "snowballstemmer (==2.2.0)", "sphinx (==7.1.2)", "sphinx-prompt (==1.7.0)", "sphinx-rtd-theme (==2.0.0)", "sphinxcontrib-applehelp (==1.0.4)", "sphinxcontrib-devhelp (==1.0.2)", "sphinxcontrib-htmlhelp (==2.0.1)", "sphinxcontrib-jquery (==4.1)", "sphinxcontrib-jsmath (==1.0.1)", "sphinxcontrib-qthelp (==1.0.3)", "sphinxcontrib-serializinghtml (==1.1.5)", "sphinxcontrib-trio (==1.1.2)", "tomli (==2.0.1)", "tomli (==2.0.1)", "tomlkit (==0.12.4)", "urllib3 (==2.2.1)", "zipp (==3.18.1)"] +dev = ["alabaster (==0.7.13)", "astroid (==3.1.0)", "async-timeout (==4.0.3)", "asyncpg (==0.29.0)", "black (==23.12.1)", "certifi (==2024.2.2)", "charset-normalizer (==3.3.2)", "dill (==0.3.8)", "docutils (==0.20.1)", "exceptiongroup (==1.2.0)", "imagesize (==1.4.1)", "importlib-metadata (==7.1.0)", "iniconfig (==2.0.0)", "isort (==5.13.2)", "jinja2 (==3.1.3)", "markupsafe (==2.1.5)", "mccabe (==0.7.0)", "mypy-extensions (==1.0.0)", "pathspec (==0.12.1)", "pluggy (==1.4.0)", "pylint (==3.1.0)", "pytest (==7.4.4)", "pytest-asyncio (==0.21.1)", "pytest-mock (==3.14.0)", "pytz (==2024.1)", "requests (==2.31.0)", "snowballstemmer (==2.2.0)", "sphinx (==7.1.2)", "sphinx-prompt (==1.7.0)", "sphinx-rtd-theme (==2.0.0)", "sphinxcontrib-applehelp (==1.0.4)", "sphinxcontrib-devhelp (==1.0.2)", "sphinxcontrib-htmlhelp (==2.0.1)", "sphinxcontrib-jquery (==4.1)", "sphinxcontrib-jsmath (==1.0.1)", "sphinxcontrib-qthelp (==1.0.3)", "sphinxcontrib-serializinghtml (==1.1.5)", "sphinxcontrib-trio (==1.1.2)", "tomli (==2.0.1)", "tomli (==2.0.1)", "tomlkit (==0.12.4)", "urllib3 (==2.2.1)", "zipp (==3.18.1)"] doc = ["alabaster (==0.7.13)", "certifi (==2024.2.2)", "charset-normalizer (==3.3.2)", "docutils (==0.20.1)", "imagesize (==1.4.1)", "importlib-metadata (==7.1.0)", "jinja2 (==3.1.3)", "markupsafe (==2.1.5)", "pytz (==2024.1)", "requests (==2.31.0)", "snowballstemmer (==2.2.0)", "sphinx (==7.1.2)", "sphinx-prompt (==1.7.0)", "sphinx-rtd-theme (==2.0.0)", "sphinxcontrib-applehelp (==1.0.4)", "sphinxcontrib-devhelp (==1.0.2)", "sphinxcontrib-htmlhelp (==2.0.1)", "sphinxcontrib-jquery (==4.1)", "sphinxcontrib-jsmath (==1.0.1)", "sphinxcontrib-qthelp (==1.0.3)", "sphinxcontrib-serializinghtml (==1.1.5)", "sphinxcontrib-trio (==1.1.2)", "urllib3 (==2.2.1)", "zipp (==3.18.1)"] postgres = ["async-timeout (==4.0.3)", "asyncpg (==0.29.0)"] style = ["black (==23.12.1)", "mypy-extensions (==1.0.0)", "pathspec (==0.12.1)", "tomli (==2.0.1)"] -test = ["astroid (==3.1.0)", "dill (==0.3.8)", "exceptiongroup (==1.2.0)", "iniconfig (==2.0.0)", "isort (==5.13.2)", "mccabe (==0.7.0)", "pluggy (==1.4.0)", "pylint (==3.1.0)", "pytest (==7.4.4)", "pytest-asyncio (==0.21.1)", "pytest-mock (==3.12.0)", "tomli (==2.0.1)", "tomlkit (==0.12.4)"] +test = ["astroid (==3.1.0)", "dill (==0.3.8)", "exceptiongroup (==1.2.0)", "iniconfig (==2.0.0)", "isort (==5.13.2)", "mccabe (==0.7.0)", "pluggy (==1.4.0)", "pylint (==3.1.0)", "pytest (==7.4.4)", "pytest-asyncio (==0.21.1)", "pytest-mock (==3.14.0)", "tomli (==2.0.1)", "tomlkit (==0.12.4)"] [[package]] name = "red-lavalink" @@ -2436,4 +2451,4 @@ multidict = ">=4.0" [metadata] lock-version = "2.0" python-versions = ">=3.11,<3.12" -content-hash = "42f6d2a053929b5a71b673e30f222c3e5914c723d074b453afd349e11118590f" +content-hash = "0ac382e0399d9c23c5f89a0ffeb3aae056dc8b28e864b22f815c0e3eb34175bd" diff --git a/pyproject.toml b/pyproject.toml index 93bdd53..245364d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,6 +14,7 @@ py-dactyl = "^2.0.4" websockets = "^12.0" pillow = "^10.3.0" numpy = "^1.26.4" +colorthief = "^0.2.1" [tool.poetry.group.dev] optional = true From 7ae8226ca5ff9c28dae136f570894601d4fbed4e Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Wed, 8 May 2024 14:26:40 -0400 Subject: [PATCH 08/95] fix(emojiinfo): added colorthief to the requirements --- emojiinfo/info.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emojiinfo/info.json b/emojiinfo/info.json index 0aca458..febea9b 100644 --- a/emojiinfo/info.json +++ b/emojiinfo/info.json @@ -9,7 +9,7 @@ "disabled": false, "min_bot_version": "3.5.0", "min_python_version": [3, 10, 0], - "requirements": ["pillow"], + "requirements": ["colorthief"], "tags": [ "utility" ] From 80dcfea95e947ca7fe0072bb22bd9410b533cac8 Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Wed, 8 May 2024 14:30:07 -0400 Subject: [PATCH 09/95] fix(emojiinfo): use aiohttp.ClientSession --- emojiinfo/emojiinfo.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/emojiinfo/emojiinfo.py b/emojiinfo/emojiinfo.py index e6abbaa..769e093 100644 --- a/emojiinfo/emojiinfo.py +++ b/emojiinfo/emojiinfo.py @@ -1,6 +1,7 @@ import io from typing import Any, Literal +import aiohttp import discord from colorthief import ColorThief from red_commons.logging import RedTraceLogger, getLogger @@ -41,10 +42,11 @@ class EmojiInfo(commands.Cog): return emoji_url async def fetch_primary_color(self, emoji_url: str) -> discord.Color | None: - async with self.bot.http_session.get(emoji_url) as response: - if response.status != 200: - return None - image = await response.read() + async with aiohttp.ClientSession() as session: + async with session.get(emoji_url) as response: + if response.status != 200: + return None + image = await response.read() dominant_color = ColorThief(io.BytesIO(image)).get_color(quality=1) color = discord.Color.from_rgb(*dominant_color) return color @@ -52,6 +54,7 @@ class EmojiInfo(commands.Cog): @commands.hybrid_command(name="emoji") async def emoji(self, ctx: commands.Context, emoji: str, ephemeral: bool = False) -> None: """Retrieve information about an emoji.""" + await ctx.defer(ephemeral=ephemeral) emoji: discord.PartialEmoji = discord.PartialEmoji.from_str(value=emoji) if emoji.is_unicode_emoji(): emoji_url = await self.fetch_twemoji(unicode_emoji=emoji.name) From a02a7ab3d731442679e336ef26e5c7831f40e489 Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Wed, 8 May 2024 14:34:28 -0400 Subject: [PATCH 10/95] fix(emojiinfo): fixed formatting --- emojiinfo/emojiinfo.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/emojiinfo/emojiinfo.py b/emojiinfo/emojiinfo.py index 769e093..5706a6f 100644 --- a/emojiinfo/emojiinfo.py +++ b/emojiinfo/emojiinfo.py @@ -7,7 +7,7 @@ from colorthief import ColorThief from red_commons.logging import RedTraceLogger, getLogger from redbot.core import commands from redbot.core.bot import Red -from redbot.core.utils.chat_formatting import humanize_list +from redbot.core.utils.chat_formatting import bold, humanize_list class EmojiInfo(commands.Cog): @@ -60,13 +60,17 @@ class EmojiInfo(commands.Cog): emoji_url = await self.fetch_twemoji(unicode_emoji=emoji.name) else: emoji_url = emoji.url + if emoji.id: + emoji_id = f"{bold("ID:")} `{emoji.id}`\n" + else: + emoji_id = "" string: str = ( - f"Name: {emoji}\n" - f"ID: {emoji.id}\n" if emoji.id else "" - f"Native: {emoji.is_unicode_emoji()}\n" - f"Animated: {emoji.animated}\n" - f"Markdown: `:{emoji.name}:`\n" - f"URL: [Click Here]({emoji_url})" + f"{bold("Name:")} {emoji}\n" + f"{emoji_id}" + f"{bold("Native:")} {emoji.is_unicode_emoji()}\n" + f"{bold("Animated:")} {emoji.animated}\n" + f"{bold("Markdown:")} `:{emoji.name}:`\n" + f"{bold("URL:")} [Click Here]({emoji_url})" ) if await ctx.embed_requested(): embed = embed = discord.Embed(title="Emoji Information", description=string, color = await self.fetch_primary_color(emoji_url) or await ctx.embed_color) From 1ed1eb26816098714cbda73b2fa1067d5334fe0a Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Wed, 8 May 2024 14:35:47 -0400 Subject: [PATCH 11/95] fix(emojiinfo): fixed a syntax error --- emojiinfo/emojiinfo.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/emojiinfo/emojiinfo.py b/emojiinfo/emojiinfo.py index 5706a6f..5c0f652 100644 --- a/emojiinfo/emojiinfo.py +++ b/emojiinfo/emojiinfo.py @@ -61,16 +61,16 @@ class EmojiInfo(commands.Cog): else: emoji_url = emoji.url if emoji.id: - emoji_id = f"{bold("ID:")} `{emoji.id}`\n" + emoji_id = f"{bold('ID:')} `{emoji.id}`\n" else: emoji_id = "" string: str = ( - f"{bold("Name:")} {emoji}\n" + f"{bold('Name:')} {emoji}\n" f"{emoji_id}" - f"{bold("Native:")} {emoji.is_unicode_emoji()}\n" - f"{bold("Animated:")} {emoji.animated}\n" - f"{bold("Markdown:")} `:{emoji.name}:`\n" - f"{bold("URL:")} [Click Here]({emoji_url})" + f"{bold('Native:')} {emoji.is_unicode_emoji()}\n" + f"{bold('Animated:')} {emoji.animated}\n" + f"{bold('Markdown:')} `:{emoji.name}:`\n" + f"{bold('URL:')} [Click Here]({emoji_url})" ) if await ctx.embed_requested(): embed = embed = discord.Embed(title="Emoji Information", description=string, color = await self.fetch_primary_color(emoji_url) or await ctx.embed_color) From 8ebb383a84ed40d21d4273913e302690180041f9 Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Wed, 8 May 2024 14:38:39 -0400 Subject: [PATCH 12/95] fix(emojiinfo): fixed an issue with markdown --- emojiinfo/emojiinfo.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/emojiinfo/emojiinfo.py b/emojiinfo/emojiinfo.py index 5c0f652..08d7802 100644 --- a/emojiinfo/emojiinfo.py +++ b/emojiinfo/emojiinfo.py @@ -55,26 +55,34 @@ class EmojiInfo(commands.Cog): async def emoji(self, ctx: commands.Context, emoji: str, ephemeral: bool = False) -> None: """Retrieve information about an emoji.""" await ctx.defer(ephemeral=ephemeral) + emoji: discord.PartialEmoji = discord.PartialEmoji.from_str(value=emoji) + if emoji.is_unicode_emoji(): emoji_url = await self.fetch_twemoji(unicode_emoji=emoji.name) else: emoji_url = emoji.url + if emoji.id: emoji_id = f"{bold('ID:')} `{emoji.id}`\n" + markdown = f"`<{'a' if emoji.animated else ''}:{emoji.name}:{emoji.id}>`" else: emoji_id = "" + markdown = f"`{emoji}`" + string: str = ( - f"{bold('Name:')} {emoji}\n" + f"{bold('Name:')} {emoji.name}\n" f"{emoji_id}" f"{bold('Native:')} {emoji.is_unicode_emoji()}\n" f"{bold('Animated:')} {emoji.animated}\n" - f"{bold('Markdown:')} `:{emoji.name}:`\n" + f"{bold('Markdown:')} {markdown}\n" f"{bold('URL:')} [Click Here]({emoji_url})" ) + if await ctx.embed_requested(): embed = embed = discord.Embed(title="Emoji Information", description=string, color = await self.fetch_primary_color(emoji_url) or await ctx.embed_color) embed.set_thumbnail(url=emoji_url) + await ctx.send(embed=embed, ephemeral=ephemeral) else: await ctx.send(content=string, ephemeral=ephemeral) From 537b2edafa5cb96a3d131e922e3c4ee19b71c00d Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Wed, 8 May 2024 14:45:46 -0400 Subject: [PATCH 13/95] fix(emojiinfo): catch errors if the emoji is invalid --- emojiinfo/emojiinfo.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/emojiinfo/emojiinfo.py b/emojiinfo/emojiinfo.py index 08d7802..f6cdaae 100644 --- a/emojiinfo/emojiinfo.py +++ b/emojiinfo/emojiinfo.py @@ -59,7 +59,10 @@ class EmojiInfo(commands.Cog): emoji: discord.PartialEmoji = discord.PartialEmoji.from_str(value=emoji) if emoji.is_unicode_emoji(): - emoji_url = await self.fetch_twemoji(unicode_emoji=emoji.name) + try: + emoji_url = await self.fetch_twemoji(unicode_emoji=emoji.name) + except Exception: + await ctx.send("Please provide a valid emoji!", ephemeral=ephemeral) else: emoji_url = emoji.url From 59097b676d56094eeb52f169d006f78fd7574aed Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Wed, 8 May 2024 14:46:28 -0400 Subject: [PATCH 14/95] fix(emojiinfo): forgot to return early lol --- emojiinfo/emojiinfo.py | 1 + 1 file changed, 1 insertion(+) diff --git a/emojiinfo/emojiinfo.py b/emojiinfo/emojiinfo.py index f6cdaae..8fc249a 100644 --- a/emojiinfo/emojiinfo.py +++ b/emojiinfo/emojiinfo.py @@ -63,6 +63,7 @@ class EmojiInfo(commands.Cog): emoji_url = await self.fetch_twemoji(unicode_emoji=emoji.name) except Exception: await ctx.send("Please provide a valid emoji!", ephemeral=ephemeral) + return else: emoji_url = emoji.url From 9ed16a44f2215ae2bd66ee475eff891d114e3773 Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Wed, 8 May 2024 15:34:04 -0400 Subject: [PATCH 15/95] feat(emojiinfo): added aliases and groups --- emojiinfo/data/emojis.json | 5309 ++++++++++++++++++++++++++++++++++++ emojiinfo/emojiinfo.py | 11 +- emojiinfo/model.py | 88 + 3 files changed, 5406 insertions(+), 2 deletions(-) create mode 100644 emojiinfo/data/emojis.json create mode 100644 emojiinfo/model.py diff --git a/emojiinfo/data/emojis.json b/emojiinfo/data/emojis.json new file mode 100644 index 0000000..dadae4c --- /dev/null +++ b/emojiinfo/data/emojis.json @@ -0,0 +1,5309 @@ +{ + "people": { + "grinning": "😀", + "smiley": "😃", + "smile": "😄", + "grin": "😁", + "laughing": "😆", + "satisfied": "😆", + "sweat_smile": "😅", + "joy": "😂", + "rofl": "🤣", + "rolling_on_the_floor_laughing": "🤣", + "relaxed": "☺️", + "blush": "😊", + "innocent": "😇", + "slight_smile": "🙂", + "slightly_smiling_face": "🙂", + "upside_down": "🙃", + "upside_down_face": "🙃", + "wink": "😉", + "relieved": "😌", + "smiling_face_with_tear": "🥲", + "heart_eyes": "😍", + "smiling_face_with_3_hearts": "🥰", + "kissing_heart": "😘", + "kissing": "😗", + "kissing_smiling_eyes": "😙", + "kissing_closed_eyes": "😚", + "yum": "😋", + "stuck_out_tongue": "😛", + "stuck_out_tongue_closed_eyes": "😝", + "stuck_out_tongue_winking_eye": "😜", + "zany_face": "🤪", + "face_with_raised_eyebrow": "🤨", + "face_with_monocle": "🧐", + "nerd": "🤓", + "nerd_face": "🤓", + "sunglasses": "😎", + "star_struck": "🤩", + "partying_face": "🥳", + "smirk": "😏", + "unamused": "😒", + "disappointed": "😞", + "pensive": "😔", + "worried": "😟", + "confused": "😕", + "slight_frown": "🙁", + "slightly_frowning_face": "🙁", + "frowning2": "☹️", + "white_frowning_face": "☹️", + "persevere": "😣", + "confounded": "😖", + "tired_face": "😫", + "weary": "😩", + "pleading_face": "🥺", + "cry": "😢", + "sob": "😭", + "triumph": "😤", + "face_exhaling": "😮‍💨", + "angry": "😠", + "rage": "😡", + "face_with_symbols_over_mouth": "🤬", + "exploding_head": "🤯", + "flushed": "😳", + "face_in_clouds": "😶‍🌫️", + "hot_face": "🥵", + "cold_face": "🥶", + "scream": "😱", + "fearful": "😨", + "cold_sweat": "😰", + "disappointed_relieved": "😥", + "sweat": "😓", + "hugging": "🤗", + "hugging_face": "🤗", + "thinking": "🤔", + "thinking_face": "🤔", + "face_with_hand_over_mouth": "🤭", + "yawning_face": "🥱", + "shushing_face": "🤫", + "lying_face": "🤥", + "liar": "🤥", + "no_mouth": "😶", + "neutral_face": "😐", + "expressionless": "😑", + "grimacing": "😬", + "rolling_eyes": "🙄", + "face_with_rolling_eyes": "🙄", + "hushed": "😯", + "frowning": "😦", + "anguished": "😧", + "open_mouth": "😮", + "astonished": "😲", + "sleeping": "😴", + "drooling_face": "🤤", + "drool": "🤤", + "sleepy": "😪", + "dizzy_face": "😵", + "face_with_spiral_eyes": "😵‍💫", + "zipper_mouth": "🤐", + "zipper_mouth_face": "🤐", + "woozy_face": "🥴", + "nauseated_face": "🤢", + "sick": "🤢", + "face_vomiting": "🤮", + "sneezing_face": "🤧", + "sneeze": "🤧", + "mask": "😷", + "thermometer_face": "🤒", + "face_with_thermometer": "🤒", + "head_bandage": "🤕", + "face_with_head_bandage": "🤕", + "money_mouth": "🤑", + "money_mouth_face": "🤑", + "cowboy": "🤠", + "face_with_cowboy_hat": "🤠", + "disguised_face": "🥸", + "smiling_imp": "😈", + "imp": "👿", + "japanese_ogre": "👹", + "japanese_goblin": "👺", + "clown": "🤡", + "clown_face": "🤡", + "poop": "💩", + "shit": "💩", + "hankey": "💩", + "poo": "💩", + "ghost": "👻", + "skull": "💀", + "skeleton": "💀", + "skull_crossbones": "☠️", + "skull_and_crossbones": "☠️", + "alien": "👽", + "space_invader": "👾", + "robot": "🤖", + "robot_face": "🤖", + "jack_o_lantern": "🎃", + "smiley_cat": "😺", + "smile_cat": "😸", + "joy_cat": "😹", + "heart_eyes_cat": "😻", + "smirk_cat": "😼", + "kissing_cat": "😽", + "scream_cat": "🙀", + "crying_cat_face": "😿", + "pouting_cat": "😾", + "palms_up_together": "🤲", + "palms_up_together_tone1": "🤲🏻", + "palms_up_together_light_skin_tone": "🤲🏻", + "palms_up_together_tone2": "🤲🏼", + "palms_up_together_medium_light_skin_tone": "🤲🏼", + "palms_up_together_tone3": "🤲🏽", + "palms_up_together_medium_skin_tone": "🤲🏽", + "palms_up_together_tone4": "🤲🏾", + "palms_up_together_medium_dark_skin_tone": "🤲🏾", + "palms_up_together_tone5": "🤲🏿", + "palms_up_together_dark_skin_tone": "🤲🏿", + "open_hands": "👐", + "open_hands_tone1": "👐🏻", + "open_hands_tone2": "👐🏼", + "open_hands_tone3": "👐🏽", + "open_hands_tone4": "👐🏾", + "open_hands_tone5": "👐🏿", + "raised_hands": "🙌", + "raised_hands_tone1": "🙌🏻", + "raised_hands_tone2": "🙌🏼", + "raised_hands_tone3": "🙌🏽", + "raised_hands_tone4": "🙌🏾", + "raised_hands_tone5": "🙌🏿", + "clap": "👏", + "clap_tone1": "👏🏻", + "clap_tone2": "👏🏼", + "clap_tone3": "👏🏽", + "clap_tone4": "👏🏾", + "clap_tone5": "👏🏿", + "handshake": "🤝", + "shaking_hands": "🤝", + "thumbsup": "👍", + "+1": "👍", + "thumbup": "👍", + "thumbsup_tone1": "👍🏻", + "+1_tone1": "👍🏻", + "thumbup_tone1": "👍🏻", + "thumbsup_tone2": "👍🏼", + "+1_tone2": "👍🏼", + "thumbup_tone2": "👍🏼", + "thumbsup_tone3": "👍🏽", + "+1_tone3": "👍🏽", + "thumbup_tone3": "👍🏽", + "thumbsup_tone4": "👍🏾", + "+1_tone4": "👍🏾", + "thumbup_tone4": "👍🏾", + "thumbsup_tone5": "👍🏿", + "+1_tone5": "👍🏿", + "thumbup_tone5": "👍🏿", + "thumbsdown": "👎", + "-1": "👎", + "thumbdown": "👎", + "thumbsdown_tone1": "👎🏻", + "_1_tone1": "👎🏻", + "thumbdown_tone1": "👎🏻", + "thumbsdown_tone2": "👎🏼", + "_1_tone2": "👎🏼", + "thumbdown_tone2": "👎🏼", + "thumbsdown_tone3": "👎🏽", + "_1_tone3": "👎🏽", + "thumbdown_tone3": "👎🏽", + "thumbsdown_tone4": "👎🏾", + "_1_tone4": "👎🏾", + "thumbdown_tone4": "👎🏾", + "thumbsdown_tone5": "👎🏿", + "_1_tone5": "👎🏿", + "thumbdown_tone5": "👎🏿", + "punch": "👊", + "punch_tone1": "👊🏻", + "punch_tone2": "👊🏼", + "punch_tone3": "👊🏽", + "punch_tone4": "👊🏾", + "punch_tone5": "👊🏿", + "fist": "✊", + "fist_tone1": "✊🏻", + "fist_tone2": "✊🏼", + "fist_tone3": "✊🏽", + "fist_tone4": "✊🏾", + "fist_tone5": "✊🏿", + "left_facing_fist": "🤛", + "left_fist": "🤛", + "left_facing_fist_tone1": "🤛🏻", + "left_fist_tone1": "🤛🏻", + "left_facing_fist_tone2": "🤛🏼", + "left_fist_tone2": "🤛🏼", + "left_facing_fist_tone3": "🤛🏽", + "left_fist_tone3": "🤛🏽", + "left_facing_fist_tone4": "🤛🏾", + "left_fist_tone4": "🤛🏾", + "left_facing_fist_tone5": "🤛🏿", + "left_fist_tone5": "🤛🏿", + "right_facing_fist": "🤜", + "right_fist": "🤜", + "right_facing_fist_tone1": "🤜🏻", + "right_fist_tone1": "🤜🏻", + "right_facing_fist_tone2": "🤜🏼", + "right_fist_tone2": "🤜🏼", + "right_facing_fist_tone3": "🤜🏽", + "right_fist_tone3": "🤜🏽", + "right_facing_fist_tone4": "🤜🏾", + "right_fist_tone4": "🤜🏾", + "right_facing_fist_tone5": "🤜🏿", + "right_fist_tone5": "🤜🏿", + "fingers_crossed": "🤞", + "hand_with_index_and_middle_finger_crossed": "🤞", + "fingers_crossed_tone1": "🤞🏻", + "hand_with_index_and_middle_fingers_crossed_tone1": "🤞🏻", + "fingers_crossed_tone2": "🤞🏼", + "hand_with_index_and_middle_fingers_crossed_tone2": "🤞🏼", + "fingers_crossed_tone3": "🤞🏽", + "hand_with_index_and_middle_fingers_crossed_tone3": "🤞🏽", + "fingers_crossed_tone4": "🤞🏾", + "hand_with_index_and_middle_fingers_crossed_tone4": "🤞🏾", + "fingers_crossed_tone5": "🤞🏿", + "hand_with_index_and_middle_fingers_crossed_tone5": "🤞🏿", + "v": "✌️", + "v_tone1": "✌🏻", + "v_tone2": "✌🏼", + "v_tone3": "✌🏽", + "v_tone4": "✌🏾", + "v_tone5": "✌🏿", + "love_you_gesture": "🤟", + "love_you_gesture_tone1": "🤟🏻", + "love_you_gesture_light_skin_tone": "🤟🏻", + "love_you_gesture_tone2": "🤟🏼", + "love_you_gesture_medium_light_skin_tone": "🤟🏼", + "love_you_gesture_tone3": "🤟🏽", + "love_you_gesture_medium_skin_tone": "🤟🏽", + "love_you_gesture_tone4": "🤟🏾", + "love_you_gesture_medium_dark_skin_tone": "🤟🏾", + "love_you_gesture_tone5": "🤟🏿", + "love_you_gesture_dark_skin_tone": "🤟🏿", + "metal": "🤘", + "sign_of_the_horns": "🤘", + "metal_tone1": "🤘🏻", + "sign_of_the_horns_tone1": "🤘🏻", + "metal_tone2": "🤘🏼", + "sign_of_the_horns_tone2": "🤘🏼", + "metal_tone3": "🤘🏽", + "sign_of_the_horns_tone3": "🤘🏽", + "metal_tone4": "🤘🏾", + "sign_of_the_horns_tone4": "🤘🏾", + "metal_tone5": "🤘🏿", + "sign_of_the_horns_tone5": "🤘🏿", + "ok_hand": "👌", + "ok_hand_tone1": "👌🏻", + "ok_hand_tone2": "👌🏼", + "ok_hand_tone3": "👌🏽", + "ok_hand_tone4": "👌🏾", + "ok_hand_tone5": "👌🏿", + "pinching_hand": "🤏", + "pinching_hand_tone1": "🤏🏻", + "pinching_hand_light_skin_tone": "🤏🏻", + "pinching_hand_tone2": "🤏🏼", + "pinching_hand_medium_light_skin_tone": "🤏🏼", + "pinching_hand_tone3": "🤏🏽", + "pinching_hand_medium_skin_tone": "🤏🏽", + "pinching_hand_tone4": "🤏🏾", + "pinching_hand_medium_dark_skin_tone": "🤏🏾", + "pinching_hand_tone5": "🤏🏿", + "pinching_hand_dark_skin_tone": "🤏🏿", + "pinched_fingers": "🤌", + "pinched_fingers_tone2": "🤌🏼", + "pinched_fingers_medium_light_skin_tone": "🤌🏼", + "pinched_fingers_tone1": "🤌🏻", + "pinched_fingers_light_skin_tone": "🤌🏻", + "pinched_fingers_tone3": "🤌🏽", + "pinched_fingers_medium_skin_tone": "🤌🏽", + "pinched_fingers_tone4": "🤌🏾", + "pinched_fingers_medium_dark_skin_tone": "🤌🏾", + "pinched_fingers_tone5": "🤌🏿", + "pinched_fingers_dark_skin_tone": "🤌🏿", + "point_left": "👈", + "point_left_tone1": "👈🏻", + "point_left_tone2": "👈🏼", + "point_left_tone3": "👈🏽", + "point_left_tone4": "👈🏾", + "point_left_tone5": "👈🏿", + "point_right": "👉", + "point_right_tone1": "👉🏻", + "point_right_tone2": "👉🏼", + "point_right_tone3": "👉🏽", + "point_right_tone4": "👉🏾", + "point_right_tone5": "👉🏿", + "point_up_2": "👆", + "point_up_2_tone1": "👆🏻", + "point_up_2_tone2": "👆🏼", + "point_up_2_tone3": "👆🏽", + "point_up_2_tone4": "👆🏾", + "point_up_2_tone5": "👆🏿", + "point_down": "👇", + "point_down_tone1": "👇🏻", + "point_down_tone2": "👇🏼", + "point_down_tone3": "👇🏽", + "point_down_tone4": "👇🏾", + "point_down_tone5": "👇🏿", + "point_up": "☝️", + "point_up_tone1": "☝🏻", + "point_up_tone2": "☝🏼", + "point_up_tone3": "☝🏽", + "point_up_tone4": "☝🏾", + "point_up_tone5": "☝🏿", + "raised_hand": "✋", + "raised_hand_tone1": "✋🏻", + "raised_hand_tone2": "✋🏼", + "raised_hand_tone3": "✋🏽", + "raised_hand_tone4": "✋🏾", + "raised_hand_tone5": "✋🏿", + "raised_back_of_hand": "🤚", + "back_of_hand": "🤚", + "raised_back_of_hand_tone1": "🤚🏻", + "back_of_hand_tone1": "🤚🏻", + "raised_back_of_hand_tone2": "🤚🏼", + "back_of_hand_tone2": "🤚🏼", + "raised_back_of_hand_tone3": "🤚🏽", + "back_of_hand_tone3": "🤚🏽", + "raised_back_of_hand_tone4": "🤚🏾", + "back_of_hand_tone4": "🤚🏾", + "raised_back_of_hand_tone5": "🤚🏿", + "back_of_hand_tone5": "🤚🏿", + "hand_splayed": "🖐️", + "raised_hand_with_fingers_splayed": "🖐️", + "hand_splayed_tone1": "🖐🏻", + "raised_hand_with_fingers_splayed_tone1": "🖐🏻", + "hand_splayed_tone2": "🖐🏼", + "raised_hand_with_fingers_splayed_tone2": "🖐🏼", + "hand_splayed_tone3": "🖐🏽", + "raised_hand_with_fingers_splayed_tone3": "🖐🏽", + "hand_splayed_tone4": "🖐🏾", + "raised_hand_with_fingers_splayed_tone4": "🖐🏾", + "hand_splayed_tone5": "🖐🏿", + "raised_hand_with_fingers_splayed_tone5": "🖐🏿", + "vulcan": "🖖", + "raised_hand_with_part_between_middle_and_ring_fingers": "🖖", + "vulcan_tone1": "🖖🏻", + "raised_hand_with_part_between_middle_and_ring_fingers_tone1": "🖖🏻", + "vulcan_tone2": "🖖🏼", + "raised_hand_with_part_between_middle_and_ring_fingers_tone2": "🖖🏼", + "vulcan_tone3": "🖖🏽", + "raised_hand_with_part_between_middle_and_ring_fingers_tone3": "🖖🏽", + "vulcan_tone4": "🖖🏾", + "raised_hand_with_part_between_middle_and_ring_fingers_tone4": "🖖🏾", + "vulcan_tone5": "🖖🏿", + "raised_hand_with_part_between_middle_and_ring_fingers_tone5": "🖖🏿", + "wave": "👋", + "wave_tone1": "👋🏻", + "wave_tone2": "👋🏼", + "wave_tone3": "👋🏽", + "wave_tone4": "👋🏾", + "wave_tone5": "👋🏿", + "call_me": "🤙", + "call_me_hand": "🤙", + "call_me_tone1": "🤙🏻", + "call_me_hand_tone1": "🤙🏻", + "call_me_tone2": "🤙🏼", + "call_me_hand_tone2": "🤙🏼", + "call_me_tone3": "🤙🏽", + "call_me_hand_tone3": "🤙🏽", + "call_me_tone4": "🤙🏾", + "call_me_hand_tone4": "🤙🏾", + "call_me_tone5": "🤙🏿", + "call_me_hand_tone5": "🤙🏿", + "muscle": "💪", + "muscle_tone1": "💪🏻", + "muscle_tone2": "💪🏼", + "muscle_tone3": "💪🏽", + "muscle_tone4": "💪🏾", + "muscle_tone5": "💪🏿", + "mechanical_arm": "🦾", + "middle_finger": "🖕", + "reversed_hand_with_middle_finger_extended": "🖕", + "middle_finger_tone1": "🖕🏻", + "reversed_hand_with_middle_finger_extended_tone1": "🖕🏻", + "middle_finger_tone2": "🖕🏼", + "reversed_hand_with_middle_finger_extended_tone2": "🖕🏼", + "middle_finger_tone3": "🖕🏽", + "reversed_hand_with_middle_finger_extended_tone3": "🖕🏽", + "middle_finger_tone4": "🖕🏾", + "reversed_hand_with_middle_finger_extended_tone4": "🖕🏾", + "middle_finger_tone5": "🖕🏿", + "reversed_hand_with_middle_finger_extended_tone5": "🖕🏿", + "writing_hand": "✍️", + "writing_hand_tone1": "✍🏻", + "writing_hand_tone2": "✍🏼", + "writing_hand_tone3": "✍🏽", + "writing_hand_tone4": "✍🏾", + "writing_hand_tone5": "✍🏿", + "pray": "🙏", + "pray_tone1": "🙏🏻", + "pray_tone2": "🙏🏼", + "pray_tone3": "🙏🏽", + "pray_tone4": "🙏🏾", + "pray_tone5": "🙏🏿", + "foot": "🦶", + "foot_tone1": "🦶🏻", + "foot_light_skin_tone": "🦶🏻", + "foot_tone2": "🦶🏼", + "foot_medium_light_skin_tone": "🦶🏼", + "foot_tone3": "🦶🏽", + "foot_medium_skin_tone": "🦶🏽", + "foot_tone4": "🦶🏾", + "foot_medium_dark_skin_tone": "🦶🏾", + "foot_tone5": "🦶🏿", + "foot_dark_skin_tone": "🦶🏿", + "leg": "🦵", + "leg_tone1": "🦵🏻", + "leg_light_skin_tone": "🦵🏻", + "leg_tone2": "🦵🏼", + "leg_medium_light_skin_tone": "🦵🏼", + "leg_tone3": "🦵🏽", + "leg_medium_skin_tone": "🦵🏽", + "leg_tone4": "🦵🏾", + "leg_medium_dark_skin_tone": "🦵🏾", + "leg_tone5": "🦵🏿", + "leg_dark_skin_tone": "🦵🏿", + "mechanical_leg": "🦿", + "lipstick": "💄", + "kiss": "💋", + "lips": "👄", + "tooth": "🦷", + "tongue": "👅", + "ear": "👂", + "ear_tone1": "👂🏻", + "ear_tone2": "👂🏼", + "ear_tone3": "👂🏽", + "ear_tone4": "👂🏾", + "ear_tone5": "👂🏿", + "ear_with_hearing_aid": "🦻", + "ear_with_hearing_aid_tone1": "🦻🏻", + "ear_with_hearing_aid_light_skin_tone": "🦻🏻", + "ear_with_hearing_aid_tone2": "🦻🏼", + "ear_with_hearing_aid_medium_light_skin_tone": "🦻🏼", + "ear_with_hearing_aid_tone3": "🦻🏽", + "ear_with_hearing_aid_medium_skin_tone": "🦻🏽", + "ear_with_hearing_aid_tone4": "🦻🏾", + "ear_with_hearing_aid_medium_dark_skin_tone": "🦻🏾", + "ear_with_hearing_aid_tone5": "🦻🏿", + "ear_with_hearing_aid_dark_skin_tone": "🦻🏿", + "nose": "👃", + "nose_tone1": "👃🏻", + "nose_tone2": "👃🏼", + "nose_tone3": "👃🏽", + "nose_tone4": "👃🏾", + "nose_tone5": "👃🏿", + "footprints": "👣", + "eye": "👁️", + "eyes": "👀", + "brain": "🧠", + "anatomical_heart": "🫀", + "lungs": "🫁", + "bone": "🦴", + "speaking_head": "🗣️", + "speaking_head_in_silhouette": "🗣️", + "bust_in_silhouette": "👤", + "busts_in_silhouette": "👥", + "people_hugging": "🫂", + "baby": "👶", + "baby_tone1": "👶🏻", + "baby_tone2": "👶🏼", + "baby_tone3": "👶🏽", + "baby_tone4": "👶🏾", + "baby_tone5": "👶🏿", + "girl": "👧", + "girl_tone1": "👧🏻", + "girl_tone2": "👧🏼", + "girl_tone3": "👧🏽", + "girl_tone4": "👧🏾", + "girl_tone5": "👧🏿", + "child": "🧒", + "child_tone1": "🧒🏻", + "child_light_skin_tone": "🧒🏻", + "child_tone2": "🧒🏼", + "child_medium_light_skin_tone": "🧒🏼", + "child_tone3": "🧒🏽", + "child_medium_skin_tone": "🧒🏽", + "child_tone4": "🧒🏾", + "child_medium_dark_skin_tone": "🧒🏾", + "child_tone5": "🧒🏿", + "child_dark_skin_tone": "🧒🏿", + "boy": "👦", + "boy_tone1": "👦🏻", + "boy_tone2": "👦🏼", + "boy_tone3": "👦🏽", + "boy_tone4": "👦🏾", + "boy_tone5": "👦🏿", + "woman": "👩", + "woman_tone1": "👩🏻", + "woman_tone2": "👩🏼", + "woman_tone3": "👩🏽", + "woman_tone4": "👩🏾", + "woman_tone5": "👩🏿", + "adult": "🧑", + "adult_tone1": "🧑🏻", + "adult_light_skin_tone": "🧑🏻", + "adult_tone2": "🧑🏼", + "adult_medium_light_skin_tone": "🧑🏼", + "adult_tone3": "🧑🏽", + "adult_medium_skin_tone": "🧑🏽", + "adult_tone4": "🧑🏾", + "adult_medium_dark_skin_tone": "🧑🏾", + "adult_tone5": "🧑🏿", + "adult_dark_skin_tone": "🧑🏿", + "man": "👨", + "man_tone1": "👨🏻", + "man_tone2": "👨🏼", + "man_tone3": "👨🏽", + "man_tone4": "👨🏾", + "man_tone5": "👨🏿", + "person_curly_hair": "🧑‍🦱", + "person_tone1_curly_hair": "🧑🏻‍🦱", + "person_light_skin_tone_curly_hair": "🧑🏻‍🦱", + "person_tone2_curly_hair": "🧑🏼‍🦱", + "person_medium_light_skin_tone_curly_hair": "🧑🏼‍🦱", + "person_tone3_curly_hair": "🧑🏽‍🦱", + "person_medium_skin_tone_curly_hair": "🧑🏽‍🦱", + "person_tone4_curly_hair": "🧑🏾‍🦱", + "person_medium_dark_skin_tone_curly_hair": "🧑🏾‍🦱", + "person_tone5_curly_hair": "🧑🏿‍🦱", + "person_dark_skin_tone_curly_hair": "🧑🏿‍🦱", + "woman_curly_haired": "👩‍🦱", + "woman_curly_haired_tone1": "👩🏻‍🦱", + "woman_curly_haired_light_skin_tone": "👩🏻‍🦱", + "woman_curly_haired_tone2": "👩🏼‍🦱", + "woman_curly_haired_medium_light_skin_tone": "👩🏼‍🦱", + "woman_curly_haired_tone3": "👩🏽‍🦱", + "woman_curly_haired_medium_skin_tone": "👩🏽‍🦱", + "woman_curly_haired_tone4": "👩🏾‍🦱", + "woman_curly_haired_medium_dark_skin_tone": "👩🏾‍🦱", + "woman_curly_haired_tone5": "👩🏿‍🦱", + "woman_curly_haired_dark_skin_tone": "👩🏿‍🦱", + "man_curly_haired": "👨‍🦱", + "man_curly_haired_tone1": "👨🏻‍🦱", + "man_curly_haired_light_skin_tone": "👨🏻‍🦱", + "man_curly_haired_tone2": "👨🏼‍🦱", + "man_curly_haired_medium_light_skin_tone": "👨🏼‍🦱", + "man_curly_haired_tone3": "👨🏽‍🦱", + "man_curly_haired_medium_skin_tone": "👨🏽‍🦱", + "man_curly_haired_tone4": "👨🏾‍🦱", + "man_curly_haired_medium_dark_skin_tone": "👨🏾‍🦱", + "man_curly_haired_tone5": "👨🏿‍🦱", + "man_curly_haired_dark_skin_tone": "👨🏿‍🦱", + "person_red_hair": "🧑‍🦰", + "person_tone1_red_hair": "🧑🏻‍🦰", + "person_light_skin_tone_red_hair": "🧑🏻‍🦰", + "person_tone2_red_hair": "🧑🏼‍🦰", + "person_medium_light_skin_tone_red_hair": "🧑🏼‍🦰", + "person_tone3_red_hair": "🧑🏽‍🦰", + "person_medium_skin_tone_red_hair": "🧑🏽‍🦰", + "person_tone4_red_hair": "🧑🏾‍🦰", + "person_medium_dark_skin_tone_red_hair": "🧑🏾‍🦰", + "person_tone5_red_hair": "🧑🏿‍🦰", + "person_dark_skin_tone_red_hair": "🧑🏿‍🦰", + "woman_red_haired": "👩‍🦰", + "woman_red_haired_tone1": "👩🏻‍🦰", + "woman_red_haired_light_skin_tone": "👩🏻‍🦰", + "woman_red_haired_tone2": "👩🏼‍🦰", + "woman_red_haired_medium_light_skin_tone": "👩🏼‍🦰", + "woman_red_haired_tone3": "👩🏽‍🦰", + "woman_red_haired_medium_skin_tone": "👩🏽‍🦰", + "woman_red_haired_tone4": "👩🏾‍🦰", + "woman_red_haired_medium_dark_skin_tone": "👩🏾‍🦰", + "woman_red_haired_tone5": "👩🏿‍🦰", + "woman_red_haired_dark_skin_tone": "👩🏿‍🦰", + "man_red_haired": "👨‍🦰", + "man_red_haired_tone1": "👨🏻‍🦰", + "man_red_haired_light_skin_tone": "👨🏻‍🦰", + "man_red_haired_tone2": "👨🏼‍🦰", + "man_red_haired_medium_light_skin_tone": "👨🏼‍🦰", + "man_red_haired_tone3": "👨🏽‍🦰", + "man_red_haired_medium_skin_tone": "👨🏽‍🦰", + "man_red_haired_tone4": "👨🏾‍🦰", + "man_red_haired_medium_dark_skin_tone": "👨🏾‍🦰", + "man_red_haired_tone5": "👨🏿‍🦰", + "man_red_haired_dark_skin_tone": "👨🏿‍🦰", + "blond_haired_woman": "👱‍♀️", + "blond_haired_woman_tone1": "👱🏻‍♀️", + "blond_haired_woman_light_skin_tone": "👱🏻‍♀️", + "blond_haired_woman_tone2": "👱🏼‍♀️", + "blond_haired_woman_medium_light_skin_tone": "👱🏼‍♀️", + "blond_haired_woman_tone3": "👱🏽‍♀️", + "blond_haired_woman_medium_skin_tone": "👱🏽‍♀️", + "blond_haired_woman_tone4": "👱🏾‍♀️", + "blond_haired_woman_medium_dark_skin_tone": "👱🏾‍♀️", + "blond_haired_woman_tone5": "👱🏿‍♀️", + "blond_haired_woman_dark_skin_tone": "👱🏿‍♀️", + "blond_haired_person": "👱", + "person_with_blond_hair": "👱", + "blond_haired_person_tone1": "👱🏻", + "person_with_blond_hair_tone1": "👱🏻", + "blond_haired_person_tone2": "👱🏼", + "person_with_blond_hair_tone2": "👱🏼", + "blond_haired_person_tone3": "👱🏽", + "person_with_blond_hair_tone3": "👱🏽", + "blond_haired_person_tone4": "👱🏾", + "person_with_blond_hair_tone4": "👱🏾", + "blond_haired_person_tone5": "👱🏿", + "person_with_blond_hair_tone5": "👱🏿", + "blond_haired_man": "👱‍♂️", + "blond_haired_man_tone1": "👱🏻‍♂️", + "blond_haired_man_light_skin_tone": "👱🏻‍♂️", + "blond_haired_man_tone2": "👱🏼‍♂️", + "blond_haired_man_medium_light_skin_tone": "👱🏼‍♂️", + "blond_haired_man_tone3": "👱🏽‍♂️", + "blond_haired_man_medium_skin_tone": "👱🏽‍♂️", + "blond_haired_man_tone4": "👱🏾‍♂️", + "blond_haired_man_medium_dark_skin_tone": "👱🏾‍♂️", + "blond_haired_man_tone5": "👱🏿‍♂️", + "blond_haired_man_dark_skin_tone": "👱🏿‍♂️", + "person_white_hair": "🧑‍🦳", + "person_tone1_white_hair": "🧑🏻‍🦳", + "person_light_skin_tone_white_hair": "🧑🏻‍🦳", + "person_tone2_white_hair": "🧑🏼‍🦳", + "person_medium_light_skin_tone_white_hair": "🧑🏼‍🦳", + "person_tone3_white_hair": "🧑🏽‍🦳", + "person_medium_skin_tone_white_hair": "🧑🏽‍🦳", + "person_tone4_white_hair": "🧑🏾‍🦳", + "person_medium_dark_skin_tone_white_hair": "🧑🏾‍🦳", + "person_tone5_white_hair": "🧑🏿‍🦳", + "person_dark_skin_tone_white_hair": "🧑🏿‍🦳", + "woman_white_haired": "👩‍🦳", + "woman_white_haired_tone1": "👩🏻‍🦳", + "woman_white_haired_light_skin_tone": "👩🏻‍🦳", + "woman_white_haired_tone2": "👩🏼‍🦳", + "woman_white_haired_medium_light_skin_tone": "👩🏼‍🦳", + "woman_white_haired_tone3": "👩🏽‍🦳", + "woman_white_haired_medium_skin_tone": "👩🏽‍🦳", + "woman_white_haired_tone4": "👩🏾‍🦳", + "woman_white_haired_medium_dark_skin_tone": "👩🏾‍🦳", + "woman_white_haired_tone5": "👩🏿‍🦳", + "woman_white_haired_dark_skin_tone": "👩🏿‍🦳", + "man_white_haired": "👨‍🦳", + "man_white_haired_tone1": "👨🏻‍🦳", + "man_white_haired_light_skin_tone": "👨🏻‍🦳", + "man_white_haired_tone2": "👨🏼‍🦳", + "man_white_haired_medium_light_skin_tone": "👨🏼‍🦳", + "man_white_haired_tone3": "👨🏽‍🦳", + "man_white_haired_medium_skin_tone": "👨🏽‍🦳", + "man_white_haired_tone4": "👨🏾‍🦳", + "man_white_haired_medium_dark_skin_tone": "👨🏾‍🦳", + "man_white_haired_tone5": "👨🏿‍🦳", + "man_white_haired_dark_skin_tone": "👨🏿‍🦳", + "person_bald": "🧑‍🦲", + "person_tone1_bald": "🧑🏻‍🦲", + "person_light_skin_tone_bald": "🧑🏻‍🦲", + "person_tone2_bald": "🧑🏼‍🦲", + "person_medium_light_skin_tone_bald": "🧑🏼‍🦲", + "person_tone3_bald": "🧑🏽‍🦲", + "person_medium_skin_tone_bald": "🧑🏽‍🦲", + "person_tone4_bald": "🧑🏾‍🦲", + "person_medium_dark_skin_tone_bald": "🧑🏾‍🦲", + "person_tone5_bald": "🧑🏿‍🦲", + "person_dark_skin_tone_bald": "🧑🏿‍🦲", + "woman_bald": "👩‍🦲", + "woman_bald_tone1": "👩🏻‍🦲", + "woman_bald_light_skin_tone": "👩🏻‍🦲", + "woman_bald_tone2": "👩🏼‍🦲", + "woman_bald_medium_light_skin_tone": "👩🏼‍🦲", + "woman_bald_tone3": "👩🏽‍🦲", + "woman_bald_medium_skin_tone": "👩🏽‍🦲", + "woman_bald_tone4": "👩🏾‍🦲", + "woman_bald_medium_dark_skin_tone": "👩🏾‍🦲", + "woman_bald_tone5": "👩🏿‍🦲", + "woman_bald_dark_skin_tone": "👩🏿‍🦲", + "man_bald": "👨‍🦲", + "man_bald_tone1": "👨🏻‍🦲", + "man_bald_light_skin_tone": "👨🏻‍🦲", + "man_bald_tone2": "👨🏼‍🦲", + "man_bald_medium_light_skin_tone": "👨🏼‍🦲", + "man_bald_tone3": "👨🏽‍🦲", + "man_bald_medium_skin_tone": "👨🏽‍🦲", + "man_bald_tone4": "👨🏾‍🦲", + "man_bald_medium_dark_skin_tone": "👨🏾‍🦲", + "man_bald_tone5": "👨🏿‍🦲", + "man_bald_dark_skin_tone": "👨🏿‍🦲", + "bearded_person": "🧔", + "bearded_person_tone1": "🧔🏻", + "bearded_person_light_skin_tone": "🧔🏻", + "bearded_person_tone2": "🧔🏼", + "bearded_person_medium_light_skin_tone": "🧔🏼", + "bearded_person_tone3": "🧔🏽", + "bearded_person_medium_skin_tone": "🧔🏽", + "bearded_person_tone4": "🧔🏾", + "bearded_person_medium_dark_skin_tone": "🧔🏾", + "bearded_person_tone5": "🧔🏿", + "bearded_person_dark_skin_tone": "🧔🏿", + "man_beard": "🧔‍♂️", + "man_tone1_beard": "🧔🏻‍♂️", + "man_light_skin_tone_beard": "🧔🏻‍♂️", + "man_tone2_beard": "🧔🏼‍♂️", + "man_medium_light_skin_tone_beard": "🧔🏼‍♂️", + "man_tone3_beard": "🧔🏽‍♂️", + "man_medium_skin_tone_beard": "🧔🏽‍♂️", + "man_tone4_beard": "🧔🏾‍♂️", + "man_medium_dark_skin_tone_beard": "🧔🏾‍♂️", + "man_tone5_beard": "🧔🏿‍♂️", + "man_dark_skin_tone_beard": "🧔🏿‍♂️", + "woman_beard": "🧔‍♀️", + "woman_tone1_beard": "🧔🏻‍♀️", + "woman_light_skin_tone_beard": "🧔🏻‍♀️", + "woman_tone2_beard": "🧔🏼‍♀️", + "woman_medium_light_skin_tone_beard": "🧔🏼‍♀️", + "woman_tone3_beard": "🧔🏽‍♀️", + "woman_medium_skin_tone_beard": "🧔🏽‍♀️", + "woman_tone4_beard": "🧔🏾‍♀️", + "woman_medium_dark_skin_tone_beard": "🧔🏾‍♀️", + "woman_tone5_beard": "🧔🏿‍♀️", + "woman_dark_skin_tone_beard": "🧔🏿‍♀️", + "older_woman": "👵", + "grandma": "👵", + "older_woman_tone1": "👵🏻", + "grandma_tone1": "👵🏻", + "older_woman_tone2": "👵🏼", + "grandma_tone2": "👵🏼", + "older_woman_tone3": "👵🏽", + "grandma_tone3": "👵🏽", + "older_woman_tone4": "👵🏾", + "grandma_tone4": "👵🏾", + "older_woman_tone5": "👵🏿", + "grandma_tone5": "👵🏿", + "older_adult": "🧓", + "older_adult_tone1": "🧓🏻", + "older_adult_light_skin_tone": "🧓🏻", + "older_adult_tone2": "🧓🏼", + "older_adult_medium_light_skin_tone": "🧓🏼", + "older_adult_tone3": "🧓🏽", + "older_adult_medium_skin_tone": "🧓🏽", + "older_adult_tone4": "🧓🏾", + "older_adult_medium_dark_skin_tone": "🧓🏾", + "older_adult_tone5": "🧓🏿", + "older_adult_dark_skin_tone": "🧓🏿", + "older_man": "👴", + "older_man_tone1": "👴🏻", + "older_man_tone2": "👴🏼", + "older_man_tone3": "👴🏽", + "older_man_tone4": "👴🏾", + "older_man_tone5": "👴🏿", + "man_with_chinese_cap": "👲", + "man_with_gua_pi_mao": "👲", + "man_with_chinese_cap_tone1": "👲🏻", + "man_with_gua_pi_mao_tone1": "👲🏻", + "man_with_chinese_cap_tone2": "👲🏼", + "man_with_gua_pi_mao_tone2": "👲🏼", + "man_with_chinese_cap_tone3": "👲🏽", + "man_with_gua_pi_mao_tone3": "👲🏽", + "man_with_chinese_cap_tone4": "👲🏾", + "man_with_gua_pi_mao_tone4": "👲🏾", + "man_with_chinese_cap_tone5": "👲🏿", + "man_with_gua_pi_mao_tone5": "👲🏿", + "person_wearing_turban": "👳", + "man_with_turban": "👳", + "person_wearing_turban_tone1": "👳🏻", + "man_with_turban_tone1": "👳🏻", + "person_wearing_turban_tone2": "👳🏼", + "man_with_turban_tone2": "👳🏼", + "person_wearing_turban_tone3": "👳🏽", + "man_with_turban_tone3": "👳🏽", + "person_wearing_turban_tone4": "👳🏾", + "man_with_turban_tone4": "👳🏾", + "person_wearing_turban_tone5": "👳🏿", + "man_with_turban_tone5": "👳🏿", + "woman_wearing_turban": "👳‍♀️", + "woman_wearing_turban_tone1": "👳🏻‍♀️", + "woman_wearing_turban_light_skin_tone": "👳🏻‍♀️", + "woman_wearing_turban_tone2": "👳🏼‍♀️", + "woman_wearing_turban_medium_light_skin_tone": "👳🏼‍♀️", + "woman_wearing_turban_tone3": "👳🏽‍♀️", + "woman_wearing_turban_medium_skin_tone": "👳🏽‍♀️", + "woman_wearing_turban_tone4": "👳🏾‍♀️", + "woman_wearing_turban_medium_dark_skin_tone": "👳🏾‍♀️", + "woman_wearing_turban_tone5": "👳🏿‍♀️", + "woman_wearing_turban_dark_skin_tone": "👳🏿‍♀️", + "man_wearing_turban": "👳‍♂️", + "man_wearing_turban_tone1": "👳🏻‍♂️", + "man_wearing_turban_light_skin_tone": "👳🏻‍♂️", + "man_wearing_turban_tone2": "👳🏼‍♂️", + "man_wearing_turban_medium_light_skin_tone": "👳🏼‍♂️", + "man_wearing_turban_tone3": "👳🏽‍♂️", + "man_wearing_turban_medium_skin_tone": "👳🏽‍♂️", + "man_wearing_turban_tone4": "👳🏾‍♂️", + "man_wearing_turban_medium_dark_skin_tone": "👳🏾‍♂️", + "man_wearing_turban_tone5": "👳🏿‍♂️", + "man_wearing_turban_dark_skin_tone": "👳🏿‍♂️", + "woman_with_headscarf": "🧕", + "woman_with_headscarf_tone1": "🧕🏻", + "woman_with_headscarf_light_skin_tone": "🧕🏻", + "woman_with_headscarf_tone2": "🧕🏼", + "woman_with_headscarf_medium_light_skin_tone": "🧕🏼", + "woman_with_headscarf_tone3": "🧕🏽", + "woman_with_headscarf_medium_skin_tone": "🧕🏽", + "woman_with_headscarf_tone4": "🧕🏾", + "woman_with_headscarf_medium_dark_skin_tone": "🧕🏾", + "woman_with_headscarf_tone5": "🧕🏿", + "woman_with_headscarf_dark_skin_tone": "🧕🏿", + "police_officer": "👮", + "cop": "👮", + "police_officer_tone1": "👮🏻", + "cop_tone1": "👮🏻", + "police_officer_tone2": "👮🏼", + "cop_tone2": "👮🏼", + "police_officer_tone3": "👮🏽", + "cop_tone3": "👮🏽", + "police_officer_tone4": "👮🏾", + "cop_tone4": "👮🏾", + "police_officer_tone5": "👮🏿", + "cop_tone5": "👮🏿", + "woman_police_officer": "👮‍♀️", + "woman_police_officer_tone1": "👮🏻‍♀️", + "woman_police_officer_light_skin_tone": "👮🏻‍♀️", + "woman_police_officer_tone2": "👮🏼‍♀️", + "woman_police_officer_medium_light_skin_tone": "👮🏼‍♀️", + "woman_police_officer_tone3": "👮🏽‍♀️", + "woman_police_officer_medium_skin_tone": "👮🏽‍♀️", + "woman_police_officer_tone4": "👮🏾‍♀️", + "woman_police_officer_medium_dark_skin_tone": "👮🏾‍♀️", + "woman_police_officer_tone5": "👮🏿‍♀️", + "woman_police_officer_dark_skin_tone": "👮🏿‍♀️", + "man_police_officer": "👮‍♂️", + "man_police_officer_tone1": "👮🏻‍♂️", + "man_police_officer_light_skin_tone": "👮🏻‍♂️", + "man_police_officer_tone2": "👮🏼‍♂️", + "man_police_officer_medium_light_skin_tone": "👮🏼‍♂️", + "man_police_officer_tone3": "👮🏽‍♂️", + "man_police_officer_medium_skin_tone": "👮🏽‍♂️", + "man_police_officer_tone4": "👮🏾‍♂️", + "man_police_officer_medium_dark_skin_tone": "👮🏾‍♂️", + "man_police_officer_tone5": "👮🏿‍♂️", + "man_police_officer_dark_skin_tone": "👮🏿‍♂️", + "construction_worker": "👷", + "construction_worker_tone1": "👷🏻", + "construction_worker_tone2": "👷🏼", + "construction_worker_tone3": "👷🏽", + "construction_worker_tone4": "👷🏾", + "construction_worker_tone5": "👷🏿", + "woman_construction_worker": "👷‍♀️", + "woman_construction_worker_tone1": "👷🏻‍♀️", + "woman_construction_worker_light_skin_tone": "👷🏻‍♀️", + "woman_construction_worker_tone2": "👷🏼‍♀️", + "woman_construction_worker_medium_light_skin_tone": "👷🏼‍♀️", + "woman_construction_worker_tone3": "👷🏽‍♀️", + "woman_construction_worker_medium_skin_tone": "👷🏽‍♀️", + "woman_construction_worker_tone4": "👷🏾‍♀️", + "woman_construction_worker_medium_dark_skin_tone": "👷🏾‍♀️", + "woman_construction_worker_tone5": "👷🏿‍♀️", + "woman_construction_worker_dark_skin_tone": "👷🏿‍♀️", + "man_construction_worker": "👷‍♂️", + "man_construction_worker_tone1": "👷🏻‍♂️", + "man_construction_worker_light_skin_tone": "👷🏻‍♂️", + "man_construction_worker_tone2": "👷🏼‍♂️", + "man_construction_worker_medium_light_skin_tone": "👷🏼‍♂️", + "man_construction_worker_tone3": "👷🏽‍♂️", + "man_construction_worker_medium_skin_tone": "👷🏽‍♂️", + "man_construction_worker_tone4": "👷🏾‍♂️", + "man_construction_worker_medium_dark_skin_tone": "👷🏾‍♂️", + "man_construction_worker_tone5": "👷🏿‍♂️", + "man_construction_worker_dark_skin_tone": "👷🏿‍♂️", + "guard": "💂", + "guardsman": "💂", + "guard_tone1": "💂🏻", + "guardsman_tone1": "💂🏻", + "guard_tone2": "💂🏼", + "guardsman_tone2": "💂🏼", + "guard_tone3": "💂🏽", + "guardsman_tone3": "💂🏽", + "guard_tone4": "💂🏾", + "guardsman_tone4": "💂🏾", + "guard_tone5": "💂🏿", + "guardsman_tone5": "💂🏿", + "woman_guard": "💂‍♀️", + "woman_guard_tone1": "💂🏻‍♀️", + "woman_guard_light_skin_tone": "💂🏻‍♀️", + "woman_guard_tone2": "💂🏼‍♀️", + "woman_guard_medium_light_skin_tone": "💂🏼‍♀️", + "woman_guard_tone3": "💂🏽‍♀️", + "woman_guard_medium_skin_tone": "💂🏽‍♀️", + "woman_guard_tone4": "💂🏾‍♀️", + "woman_guard_medium_dark_skin_tone": "💂🏾‍♀️", + "woman_guard_tone5": "💂🏿‍♀️", + "woman_guard_dark_skin_tone": "💂🏿‍♀️", + "man_guard": "💂‍♂️", + "man_guard_tone1": "💂🏻‍♂️", + "man_guard_light_skin_tone": "💂🏻‍♂️", + "man_guard_tone2": "💂🏼‍♂️", + "man_guard_medium_light_skin_tone": "💂🏼‍♂️", + "man_guard_tone3": "💂🏽‍♂️", + "man_guard_medium_skin_tone": "💂🏽‍♂️", + "man_guard_tone4": "💂🏾‍♂️", + "man_guard_medium_dark_skin_tone": "💂🏾‍♂️", + "man_guard_tone5": "💂🏿‍♂️", + "man_guard_dark_skin_tone": "💂🏿‍♂️", + "detective": "🕵️", + "spy": "🕵️", + "sleuth_or_spy": "🕵️", + "detective_tone1": "🕵🏻", + "spy_tone1": "🕵🏻", + "sleuth_or_spy_tone1": "🕵🏻", + "detective_tone2": "🕵🏼", + "spy_tone2": "🕵🏼", + "sleuth_or_spy_tone2": "🕵🏼", + "detective_tone3": "🕵🏽", + "spy_tone3": "🕵🏽", + "sleuth_or_spy_tone3": "🕵🏽", + "detective_tone4": "🕵🏾", + "spy_tone4": "🕵🏾", + "sleuth_or_spy_tone4": "🕵🏾", + "detective_tone5": "🕵🏿", + "spy_tone5": "🕵🏿", + "sleuth_or_spy_tone5": "🕵🏿", + "woman_detective": "🕵️‍♀️", + "woman_detective_tone1": "🕵🏻‍♀️", + "woman_detective_light_skin_tone": "🕵🏻‍♀️", + "woman_detective_tone2": "🕵🏼‍♀️", + "woman_detective_medium_light_skin_tone": "🕵🏼‍♀️", + "woman_detective_tone3": "🕵🏽‍♀️", + "woman_detective_medium_skin_tone": "🕵🏽‍♀️", + "woman_detective_tone4": "🕵🏾‍♀️", + "woman_detective_medium_dark_skin_tone": "🕵🏾‍♀️", + "woman_detective_tone5": "🕵🏿‍♀️", + "woman_detective_dark_skin_tone": "🕵🏿‍♀️", + "man_detective": "🕵️‍♂️", + "man_detective_tone1": "🕵🏻‍♂️", + "man_detective_light_skin_tone": "🕵🏻‍♂️", + "man_detective_tone2": "🕵🏼‍♂️", + "man_detective_medium_light_skin_tone": "🕵🏼‍♂️", + "man_detective_tone3": "🕵🏽‍♂️", + "man_detective_medium_skin_tone": "🕵🏽‍♂️", + "man_detective_tone4": "🕵🏾‍♂️", + "man_detective_medium_dark_skin_tone": "🕵🏾‍♂️", + "man_detective_tone5": "🕵🏿‍♂️", + "man_detective_dark_skin_tone": "🕵🏿‍♂️", + "health_worker": "🧑‍⚕️", + "health_worker_tone1": "🧑🏻‍⚕️", + "health_worker_light_skin_tone": "🧑🏻‍⚕️", + "health_worker_tone2": "🧑🏼‍⚕️", + "health_worker_medium_light_skin_tone": "🧑🏼‍⚕️", + "health_worker_tone3": "🧑🏽‍⚕️", + "health_worker_medium_skin_tone": "🧑🏽‍⚕️", + "health_worker_tone4": "🧑🏾‍⚕️", + "health_worker_medium_dark_skin_tone": "🧑🏾‍⚕️", + "health_worker_tone5": "🧑🏿‍⚕️", + "health_worker_dark_skin_tone": "🧑🏿‍⚕️", + "woman_health_worker": "👩‍⚕️", + "woman_health_worker_tone1": "👩🏻‍⚕️", + "woman_health_worker_light_skin_tone": "👩🏻‍⚕️", + "woman_health_worker_tone2": "👩🏼‍⚕️", + "woman_health_worker_medium_light_skin_tone": "👩🏼‍⚕️", + "woman_health_worker_tone3": "👩🏽‍⚕️", + "woman_health_worker_medium_skin_tone": "👩🏽‍⚕️", + "woman_health_worker_tone4": "👩🏾‍⚕️", + "woman_health_worker_medium_dark_skin_tone": "👩🏾‍⚕️", + "woman_health_worker_tone5": "👩🏿‍⚕️", + "woman_health_worker_dark_skin_tone": "👩🏿‍⚕️", + "man_health_worker": "👨‍⚕️", + "man_health_worker_tone1": "👨🏻‍⚕️", + "man_health_worker_light_skin_tone": "👨🏻‍⚕️", + "man_health_worker_tone2": "👨🏼‍⚕️", + "man_health_worker_medium_light_skin_tone": "👨🏼‍⚕️", + "man_health_worker_tone3": "👨🏽‍⚕️", + "man_health_worker_medium_skin_tone": "👨🏽‍⚕️", + "man_health_worker_tone4": "👨🏾‍⚕️", + "man_health_worker_medium_dark_skin_tone": "👨🏾‍⚕️", + "man_health_worker_tone5": "👨🏿‍⚕️", + "man_health_worker_dark_skin_tone": "👨🏿‍⚕️", + "farmer": "🧑‍🌾", + "farmer_tone1": "🧑🏻‍🌾", + "farmer_light_skin_tone": "🧑🏻‍🌾", + "farmer_tone2": "🧑🏼‍🌾", + "farmer_medium_light_skin_tone": "🧑🏼‍🌾", + "farmer_tone3": "🧑🏽‍🌾", + "farmer_medium_skin_tone": "🧑🏽‍🌾", + "farmer_tone4": "🧑🏾‍🌾", + "farmer_medium_dark_skin_tone": "🧑🏾‍🌾", + "farmer_tone5": "🧑🏿‍🌾", + "farmer_dark_skin_tone": "🧑🏿‍🌾", + "woman_farmer": "👩‍🌾", + "woman_farmer_tone1": "👩🏻‍🌾", + "woman_farmer_light_skin_tone": "👩🏻‍🌾", + "woman_farmer_tone2": "👩🏼‍🌾", + "woman_farmer_medium_light_skin_tone": "👩🏼‍🌾", + "woman_farmer_tone3": "👩🏽‍🌾", + "woman_farmer_medium_skin_tone": "👩🏽‍🌾", + "woman_farmer_tone4": "👩🏾‍🌾", + "woman_farmer_medium_dark_skin_tone": "👩🏾‍🌾", + "woman_farmer_tone5": "👩🏿‍🌾", + "woman_farmer_dark_skin_tone": "👩🏿‍🌾", + "man_farmer": "👨‍🌾", + "man_farmer_tone1": "👨🏻‍🌾", + "man_farmer_light_skin_tone": "👨🏻‍🌾", + "man_farmer_tone2": "👨🏼‍🌾", + "man_farmer_medium_light_skin_tone": "👨🏼‍🌾", + "man_farmer_tone3": "👨🏽‍🌾", + "man_farmer_medium_skin_tone": "👨🏽‍🌾", + "man_farmer_tone4": "👨🏾‍🌾", + "man_farmer_medium_dark_skin_tone": "👨🏾‍🌾", + "man_farmer_tone5": "👨🏿‍🌾", + "man_farmer_dark_skin_tone": "👨🏿‍🌾", + "cook": "🧑‍🍳", + "cook_tone1": "🧑🏻‍🍳", + "cook_light_skin_tone": "🧑🏻‍🍳", + "cook_tone2": "🧑🏼‍🍳", + "cook_medium_light_skin_tone": "🧑🏼‍🍳", + "cook_tone3": "🧑🏽‍🍳", + "cook_medium_skin_tone": "🧑🏽‍🍳", + "cook_tone4": "🧑🏾‍🍳", + "cook_medium_dark_skin_tone": "🧑🏾‍🍳", + "cook_tone5": "🧑🏿‍🍳", + "cook_dark_skin_tone": "🧑🏿‍🍳", + "woman_cook": "👩‍🍳", + "woman_cook_tone1": "👩🏻‍🍳", + "woman_cook_light_skin_tone": "👩🏻‍🍳", + "woman_cook_tone2": "👩🏼‍🍳", + "woman_cook_medium_light_skin_tone": "👩🏼‍🍳", + "woman_cook_tone3": "👩🏽‍🍳", + "woman_cook_medium_skin_tone": "👩🏽‍🍳", + "woman_cook_tone4": "👩🏾‍🍳", + "woman_cook_medium_dark_skin_tone": "👩🏾‍🍳", + "woman_cook_tone5": "👩🏿‍🍳", + "woman_cook_dark_skin_tone": "👩🏿‍🍳", + "man_cook": "👨‍🍳", + "man_cook_tone1": "👨🏻‍🍳", + "man_cook_light_skin_tone": "👨🏻‍🍳", + "man_cook_tone2": "👨🏼‍🍳", + "man_cook_medium_light_skin_tone": "👨🏼‍🍳", + "man_cook_tone3": "👨🏽‍🍳", + "man_cook_medium_skin_tone": "👨🏽‍🍳", + "man_cook_tone4": "👨🏾‍🍳", + "man_cook_medium_dark_skin_tone": "👨🏾‍🍳", + "man_cook_tone5": "👨🏿‍🍳", + "man_cook_dark_skin_tone": "👨🏿‍🍳", + "student": "🧑‍🎓", + "student_tone1": "🧑🏻‍🎓", + "student_light_skin_tone": "🧑🏻‍🎓", + "student_tone2": "🧑🏼‍🎓", + "student_medium_light_skin_tone": "🧑🏼‍🎓", + "student_tone3": "🧑🏽‍🎓", + "student_medium_skin_tone": "🧑🏽‍🎓", + "student_tone4": "🧑🏾‍🎓", + "student_medium_dark_skin_tone": "🧑🏾‍🎓", + "student_tone5": "🧑🏿‍🎓", + "student_dark_skin_tone": "🧑🏿‍🎓", + "woman_student": "👩‍🎓", + "woman_student_tone1": "👩🏻‍🎓", + "woman_student_light_skin_tone": "👩🏻‍🎓", + "woman_student_tone2": "👩🏼‍🎓", + "woman_student_medium_light_skin_tone": "👩🏼‍🎓", + "woman_student_tone3": "👩🏽‍🎓", + "woman_student_medium_skin_tone": "👩🏽‍🎓", + "woman_student_tone4": "👩🏾‍🎓", + "woman_student_medium_dark_skin_tone": "👩🏾‍🎓", + "woman_student_tone5": "👩🏿‍🎓", + "woman_student_dark_skin_tone": "👩🏿‍🎓", + "man_student": "👨‍🎓", + "man_student_tone1": "👨🏻‍🎓", + "man_student_light_skin_tone": "👨🏻‍🎓", + "man_student_tone2": "👨🏼‍🎓", + "man_student_medium_light_skin_tone": "👨🏼‍🎓", + "man_student_tone3": "👨🏽‍🎓", + "man_student_medium_skin_tone": "👨🏽‍🎓", + "man_student_tone4": "👨🏾‍🎓", + "man_student_medium_dark_skin_tone": "👨🏾‍🎓", + "man_student_tone5": "👨🏿‍🎓", + "man_student_dark_skin_tone": "👨🏿‍🎓", + "singer": "🧑‍🎤", + "singer_tone1": "🧑🏻‍🎤", + "singer_light_skin_tone": "🧑🏻‍🎤", + "singer_tone2": "🧑🏼‍🎤", + "singer_medium_light_skin_tone": "🧑🏼‍🎤", + "singer_tone3": "🧑🏽‍🎤", + "singer_medium_skin_tone": "🧑🏽‍🎤", + "singer_tone4": "🧑🏾‍🎤", + "singer_medium_dark_skin_tone": "🧑🏾‍🎤", + "singer_tone5": "🧑🏿‍🎤", + "singer_dark_skin_tone": "🧑🏿‍🎤", + "woman_singer": "👩‍🎤", + "woman_singer_tone1": "👩🏻‍🎤", + "woman_singer_light_skin_tone": "👩🏻‍🎤", + "woman_singer_tone2": "👩🏼‍🎤", + "woman_singer_medium_light_skin_tone": "👩🏼‍🎤", + "woman_singer_tone3": "👩🏽‍🎤", + "woman_singer_medium_skin_tone": "👩🏽‍🎤", + "woman_singer_tone4": "👩🏾‍🎤", + "woman_singer_medium_dark_skin_tone": "👩🏾‍🎤", + "woman_singer_tone5": "👩🏿‍🎤", + "woman_singer_dark_skin_tone": "👩🏿‍🎤", + "man_singer": "👨‍🎤", + "man_singer_tone1": "👨🏻‍🎤", + "man_singer_light_skin_tone": "👨🏻‍🎤", + "man_singer_tone2": "👨🏼‍🎤", + "man_singer_medium_light_skin_tone": "👨🏼‍🎤", + "man_singer_tone3": "👨🏽‍🎤", + "man_singer_medium_skin_tone": "👨🏽‍🎤", + "man_singer_tone4": "👨🏾‍🎤", + "man_singer_medium_dark_skin_tone": "👨🏾‍🎤", + "man_singer_tone5": "👨🏿‍🎤", + "man_singer_dark_skin_tone": "👨🏿‍🎤", + "teacher": "🧑‍🏫", + "teacher_tone1": "🧑🏻‍🏫", + "teacher_light_skin_tone": "🧑🏻‍🏫", + "teacher_tone2": "🧑🏼‍🏫", + "teacher_medium_light_skin_tone": "🧑🏼‍🏫", + "teacher_tone3": "🧑🏽‍🏫", + "teacher_medium_skin_tone": "🧑🏽‍🏫", + "teacher_tone4": "🧑🏾‍🏫", + "teacher_medium_dark_skin_tone": "🧑🏾‍🏫", + "teacher_tone5": "🧑🏿‍🏫", + "teacher_dark_skin_tone": "🧑🏿‍🏫", + "woman_teacher": "👩‍🏫", + "woman_teacher_tone1": "👩🏻‍🏫", + "woman_teacher_light_skin_tone": "👩🏻‍🏫", + "woman_teacher_tone2": "👩🏼‍🏫", + "woman_teacher_medium_light_skin_tone": "👩🏼‍🏫", + "woman_teacher_tone3": "👩🏽‍🏫", + "woman_teacher_medium_skin_tone": "👩🏽‍🏫", + "woman_teacher_tone4": "👩🏾‍🏫", + "woman_teacher_medium_dark_skin_tone": "👩🏾‍🏫", + "woman_teacher_tone5": "👩🏿‍🏫", + "woman_teacher_dark_skin_tone": "👩🏿‍🏫", + "man_teacher": "👨‍🏫", + "man_teacher_tone1": "👨🏻‍🏫", + "man_teacher_light_skin_tone": "👨🏻‍🏫", + "man_teacher_tone2": "👨🏼‍🏫", + "man_teacher_medium_light_skin_tone": "👨🏼‍🏫", + "man_teacher_tone3": "👨🏽‍🏫", + "man_teacher_medium_skin_tone": "👨🏽‍🏫", + "man_teacher_tone4": "👨🏾‍🏫", + "man_teacher_medium_dark_skin_tone": "👨🏾‍🏫", + "man_teacher_tone5": "👨🏿‍🏫", + "man_teacher_dark_skin_tone": "👨🏿‍🏫", + "factory_worker": "🧑‍🏭", + "factory_worker_tone1": "🧑🏻‍🏭", + "factory_worker_light_skin_tone": "🧑🏻‍🏭", + "factory_worker_tone2": "🧑🏼‍🏭", + "factory_worker_medium_light_skin_tone": "🧑🏼‍🏭", + "factory_worker_tone3": "🧑🏽‍🏭", + "factory_worker_medium_skin_tone": "🧑🏽‍🏭", + "factory_worker_tone4": "🧑🏾‍🏭", + "factory_worker_medium_dark_skin_tone": "🧑🏾‍🏭", + "factory_worker_tone5": "🧑🏿‍🏭", + "factory_worker_dark_skin_tone": "🧑🏿‍🏭", + "woman_factory_worker": "👩‍🏭", + "woman_factory_worker_tone1": "👩🏻‍🏭", + "woman_factory_worker_light_skin_tone": "👩🏻‍🏭", + "woman_factory_worker_tone2": "👩🏼‍🏭", + "woman_factory_worker_medium_light_skin_tone": "👩🏼‍🏭", + "woman_factory_worker_tone3": "👩🏽‍🏭", + "woman_factory_worker_medium_skin_tone": "👩🏽‍🏭", + "woman_factory_worker_tone4": "👩🏾‍🏭", + "woman_factory_worker_medium_dark_skin_tone": "👩🏾‍🏭", + "woman_factory_worker_tone5": "👩🏿‍🏭", + "woman_factory_worker_dark_skin_tone": "👩🏿‍🏭", + "man_factory_worker": "👨‍🏭", + "man_factory_worker_tone1": "👨🏻‍🏭", + "man_factory_worker_light_skin_tone": "👨🏻‍🏭", + "man_factory_worker_tone2": "👨🏼‍🏭", + "man_factory_worker_medium_light_skin_tone": "👨🏼‍🏭", + "man_factory_worker_tone3": "👨🏽‍🏭", + "man_factory_worker_medium_skin_tone": "👨🏽‍🏭", + "man_factory_worker_tone4": "👨🏾‍🏭", + "man_factory_worker_medium_dark_skin_tone": "👨🏾‍🏭", + "man_factory_worker_tone5": "👨🏿‍🏭", + "man_factory_worker_dark_skin_tone": "👨🏿‍🏭", + "technologist": "🧑‍💻", + "technologist_tone1": "🧑🏻‍💻", + "technologist_light_skin_tone": "🧑🏻‍💻", + "technologist_tone2": "🧑🏼‍💻", + "technologist_medium_light_skin_tone": "🧑🏼‍💻", + "technologist_tone3": "🧑🏽‍💻", + "technologist_medium_skin_tone": "🧑🏽‍💻", + "technologist_tone4": "🧑🏾‍💻", + "technologist_medium_dark_skin_tone": "🧑🏾‍💻", + "technologist_tone5": "🧑🏿‍💻", + "technologist_dark_skin_tone": "🧑🏿‍💻", + "woman_technologist": "👩‍💻", + "woman_technologist_tone1": "👩🏻‍💻", + "woman_technologist_light_skin_tone": "👩🏻‍💻", + "woman_technologist_tone2": "👩🏼‍💻", + "woman_technologist_medium_light_skin_tone": "👩🏼‍💻", + "woman_technologist_tone3": "👩🏽‍💻", + "woman_technologist_medium_skin_tone": "👩🏽‍💻", + "woman_technologist_tone4": "👩🏾‍💻", + "woman_technologist_medium_dark_skin_tone": "👩🏾‍💻", + "woman_technologist_tone5": "👩🏿‍💻", + "woman_technologist_dark_skin_tone": "👩🏿‍💻", + "man_technologist": "👨‍💻", + "man_technologist_tone1": "👨🏻‍💻", + "man_technologist_light_skin_tone": "👨🏻‍💻", + "man_technologist_tone2": "👨🏼‍💻", + "man_technologist_medium_light_skin_tone": "👨🏼‍💻", + "man_technologist_tone3": "👨🏽‍💻", + "man_technologist_medium_skin_tone": "👨🏽‍💻", + "man_technologist_tone4": "👨🏾‍💻", + "man_technologist_medium_dark_skin_tone": "👨🏾‍💻", + "man_technologist_tone5": "👨🏿‍💻", + "man_technologist_dark_skin_tone": "👨🏿‍💻", + "office_worker": "🧑‍💼", + "office_worker_tone1": "🧑🏻‍💼", + "office_worker_light_skin_tone": "🧑🏻‍💼", + "office_worker_tone2": "🧑🏼‍💼", + "office_worker_medium_light_skin_tone": "🧑🏼‍💼", + "office_worker_tone3": "🧑🏽‍💼", + "office_worker_medium_skin_tone": "🧑🏽‍💼", + "office_worker_tone4": "🧑🏾‍💼", + "office_worker_medium_dark_skin_tone": "🧑🏾‍💼", + "office_worker_tone5": "🧑🏿‍💼", + "office_worker_dark_skin_tone": "🧑🏿‍💼", + "woman_office_worker": "👩‍💼", + "woman_office_worker_tone1": "👩🏻‍💼", + "woman_office_worker_light_skin_tone": "👩🏻‍💼", + "woman_office_worker_tone2": "👩🏼‍💼", + "woman_office_worker_medium_light_skin_tone": "👩🏼‍💼", + "woman_office_worker_tone3": "👩🏽‍💼", + "woman_office_worker_medium_skin_tone": "👩🏽‍💼", + "woman_office_worker_tone4": "👩🏾‍💼", + "woman_office_worker_medium_dark_skin_tone": "👩🏾‍💼", + "woman_office_worker_tone5": "👩🏿‍💼", + "woman_office_worker_dark_skin_tone": "👩🏿‍💼", + "man_office_worker": "👨‍💼", + "man_office_worker_tone1": "👨🏻‍💼", + "man_office_worker_light_skin_tone": "👨🏻‍💼", + "man_office_worker_tone2": "👨🏼‍💼", + "man_office_worker_medium_light_skin_tone": "👨🏼‍💼", + "man_office_worker_tone3": "👨🏽‍💼", + "man_office_worker_medium_skin_tone": "👨🏽‍💼", + "man_office_worker_tone4": "👨🏾‍💼", + "man_office_worker_medium_dark_skin_tone": "👨🏾‍💼", + "man_office_worker_tone5": "👨🏿‍💼", + "man_office_worker_dark_skin_tone": "👨🏿‍💼", + "mechanic": "🧑‍🔧", + "mechanic_tone1": "🧑🏻‍🔧", + "mechanic_light_skin_tone": "🧑🏻‍🔧", + "mechanic_tone2": "🧑🏼‍🔧", + "mechanic_medium_light_skin_tone": "🧑🏼‍🔧", + "mechanic_tone3": "🧑🏽‍🔧", + "mechanic_medium_skin_tone": "🧑🏽‍🔧", + "mechanic_tone4": "🧑🏾‍🔧", + "mechanic_medium_dark_skin_tone": "🧑🏾‍🔧", + "mechanic_tone5": "🧑🏿‍🔧", + "mechanic_dark_skin_tone": "🧑🏿‍🔧", + "woman_mechanic": "👩‍🔧", + "woman_mechanic_tone1": "👩🏻‍🔧", + "woman_mechanic_light_skin_tone": "👩🏻‍🔧", + "woman_mechanic_tone2": "👩🏼‍🔧", + "woman_mechanic_medium_light_skin_tone": "👩🏼‍🔧", + "woman_mechanic_tone3": "👩🏽‍🔧", + "woman_mechanic_medium_skin_tone": "👩🏽‍🔧", + "woman_mechanic_tone4": "👩🏾‍🔧", + "woman_mechanic_medium_dark_skin_tone": "👩🏾‍🔧", + "woman_mechanic_tone5": "👩🏿‍🔧", + "woman_mechanic_dark_skin_tone": "👩🏿‍🔧", + "man_mechanic": "👨‍🔧", + "man_mechanic_tone1": "👨🏻‍🔧", + "man_mechanic_light_skin_tone": "👨🏻‍🔧", + "man_mechanic_tone2": "👨🏼‍🔧", + "man_mechanic_medium_light_skin_tone": "👨🏼‍🔧", + "man_mechanic_tone3": "👨🏽‍🔧", + "man_mechanic_medium_skin_tone": "👨🏽‍🔧", + "man_mechanic_tone4": "👨🏾‍🔧", + "man_mechanic_medium_dark_skin_tone": "👨🏾‍🔧", + "man_mechanic_tone5": "👨🏿‍🔧", + "man_mechanic_dark_skin_tone": "👨🏿‍🔧", + "scientist": "🧑‍🔬", + "scientist_tone1": "🧑🏻‍🔬", + "scientist_light_skin_tone": "🧑🏻‍🔬", + "scientist_tone2": "🧑🏼‍🔬", + "scientist_medium_light_skin_tone": "🧑🏼‍🔬", + "scientist_tone3": "🧑🏽‍🔬", + "scientist_medium_skin_tone": "🧑🏽‍🔬", + "scientist_tone4": "🧑🏾‍🔬", + "scientist_medium_dark_skin_tone": "🧑🏾‍🔬", + "scientist_tone5": "🧑🏿‍🔬", + "scientist_dark_skin_tone": "🧑🏿‍🔬", + "woman_scientist": "👩‍🔬", + "woman_scientist_tone1": "👩🏻‍🔬", + "woman_scientist_light_skin_tone": "👩🏻‍🔬", + "woman_scientist_tone2": "👩🏼‍🔬", + "woman_scientist_medium_light_skin_tone": "👩🏼‍🔬", + "woman_scientist_tone3": "👩🏽‍🔬", + "woman_scientist_medium_skin_tone": "👩🏽‍🔬", + "woman_scientist_tone4": "👩🏾‍🔬", + "woman_scientist_medium_dark_skin_tone": "👩🏾‍🔬", + "woman_scientist_tone5": "👩🏿‍🔬", + "woman_scientist_dark_skin_tone": "👩🏿‍🔬", + "man_scientist": "👨‍🔬", + "man_scientist_tone1": "👨🏻‍🔬", + "man_scientist_light_skin_tone": "👨🏻‍🔬", + "man_scientist_tone2": "👨🏼‍🔬", + "man_scientist_medium_light_skin_tone": "👨🏼‍🔬", + "man_scientist_tone3": "👨🏽‍🔬", + "man_scientist_medium_skin_tone": "👨🏽‍🔬", + "man_scientist_tone4": "👨🏾‍🔬", + "man_scientist_medium_dark_skin_tone": "👨🏾‍🔬", + "man_scientist_tone5": "👨🏿‍🔬", + "man_scientist_dark_skin_tone": "👨🏿‍🔬", + "artist": "🧑‍🎨", + "artist_tone1": "🧑🏻‍🎨", + "artist_light_skin_tone": "🧑🏻‍🎨", + "artist_tone2": "🧑🏼‍🎨", + "artist_medium_light_skin_tone": "🧑🏼‍🎨", + "artist_tone3": "🧑🏽‍🎨", + "artist_medium_skin_tone": "🧑🏽‍🎨", + "artist_tone4": "🧑🏾‍🎨", + "artist_medium_dark_skin_tone": "🧑🏾‍🎨", + "artist_tone5": "🧑🏿‍🎨", + "artist_dark_skin_tone": "🧑🏿‍🎨", + "woman_artist": "👩‍🎨", + "woman_artist_tone1": "👩🏻‍🎨", + "woman_artist_light_skin_tone": "👩🏻‍🎨", + "woman_artist_tone2": "👩🏼‍🎨", + "woman_artist_medium_light_skin_tone": "👩🏼‍🎨", + "woman_artist_tone3": "👩🏽‍🎨", + "woman_artist_medium_skin_tone": "👩🏽‍🎨", + "woman_artist_tone4": "👩🏾‍🎨", + "woman_artist_medium_dark_skin_tone": "👩🏾‍🎨", + "woman_artist_tone5": "👩🏿‍🎨", + "woman_artist_dark_skin_tone": "👩🏿‍🎨", + "man_artist": "👨‍🎨", + "man_artist_tone1": "👨🏻‍🎨", + "man_artist_light_skin_tone": "👨🏻‍🎨", + "man_artist_tone2": "👨🏼‍🎨", + "man_artist_medium_light_skin_tone": "👨🏼‍🎨", + "man_artist_tone3": "👨🏽‍🎨", + "man_artist_medium_skin_tone": "👨🏽‍🎨", + "man_artist_tone4": "👨🏾‍🎨", + "man_artist_medium_dark_skin_tone": "👨🏾‍🎨", + "man_artist_tone5": "👨🏿‍🎨", + "man_artist_dark_skin_tone": "👨🏿‍🎨", + "firefighter": "🧑‍🚒", + "firefighter_tone1": "🧑🏻‍🚒", + "firefighter_light_skin_tone": "🧑🏻‍🚒", + "firefighter_tone2": "🧑🏼‍🚒", + "firefighter_medium_light_skin_tone": "🧑🏼‍🚒", + "firefighter_tone3": "🧑🏽‍🚒", + "firefighter_medium_skin_tone": "🧑🏽‍🚒", + "firefighter_tone4": "🧑🏾‍🚒", + "firefighter_medium_dark_skin_tone": "🧑🏾‍🚒", + "firefighter_tone5": "🧑🏿‍🚒", + "firefighter_dark_skin_tone": "🧑🏿‍🚒", + "woman_firefighter": "👩‍🚒", + "woman_firefighter_tone1": "👩🏻‍🚒", + "woman_firefighter_light_skin_tone": "👩🏻‍🚒", + "woman_firefighter_tone2": "👩🏼‍🚒", + "woman_firefighter_medium_light_skin_tone": "👩🏼‍🚒", + "woman_firefighter_tone3": "👩🏽‍🚒", + "woman_firefighter_medium_skin_tone": "👩🏽‍🚒", + "woman_firefighter_tone4": "👩🏾‍🚒", + "woman_firefighter_medium_dark_skin_tone": "👩🏾‍🚒", + "woman_firefighter_tone5": "👩🏿‍🚒", + "woman_firefighter_dark_skin_tone": "👩🏿‍🚒", + "man_firefighter": "👨‍🚒", + "man_firefighter_tone1": "👨🏻‍🚒", + "man_firefighter_light_skin_tone": "👨🏻‍🚒", + "man_firefighter_tone2": "👨🏼‍🚒", + "man_firefighter_medium_light_skin_tone": "👨🏼‍🚒", + "man_firefighter_tone3": "👨🏽‍🚒", + "man_firefighter_medium_skin_tone": "👨🏽‍🚒", + "man_firefighter_tone4": "👨🏾‍🚒", + "man_firefighter_medium_dark_skin_tone": "👨🏾‍🚒", + "man_firefighter_tone5": "👨🏿‍🚒", + "man_firefighter_dark_skin_tone": "👨🏿‍🚒", + "pilot": "🧑‍✈️", + "pilot_tone1": "🧑🏻‍✈️", + "pilot_light_skin_tone": "🧑🏻‍✈️", + "pilot_tone2": "🧑🏼‍✈️", + "pilot_medium_light_skin_tone": "🧑🏼‍✈️", + "pilot_tone3": "🧑🏽‍✈️", + "pilot_medium_skin_tone": "🧑🏽‍✈️", + "pilot_tone4": "🧑🏾‍✈️", + "pilot_medium_dark_skin_tone": "🧑🏾‍✈️", + "pilot_tone5": "🧑🏿‍✈️", + "pilot_dark_skin_tone": "🧑🏿‍✈️", + "woman_pilot": "👩‍✈️", + "woman_pilot_tone1": "👩🏻‍✈️", + "woman_pilot_light_skin_tone": "👩🏻‍✈️", + "woman_pilot_tone2": "👩🏼‍✈️", + "woman_pilot_medium_light_skin_tone": "👩🏼‍✈️", + "woman_pilot_tone3": "👩🏽‍✈️", + "woman_pilot_medium_skin_tone": "👩🏽‍✈️", + "woman_pilot_tone4": "👩🏾‍✈️", + "woman_pilot_medium_dark_skin_tone": "👩🏾‍✈️", + "woman_pilot_tone5": "👩🏿‍✈️", + "woman_pilot_dark_skin_tone": "👩🏿‍✈️", + "man_pilot": "👨‍✈️", + "man_pilot_tone1": "👨🏻‍✈️", + "man_pilot_light_skin_tone": "👨🏻‍✈️", + "man_pilot_tone2": "👨🏼‍✈️", + "man_pilot_medium_light_skin_tone": "👨🏼‍✈️", + "man_pilot_tone3": "👨🏽‍✈️", + "man_pilot_medium_skin_tone": "👨🏽‍✈️", + "man_pilot_tone4": "👨🏾‍✈️", + "man_pilot_medium_dark_skin_tone": "👨🏾‍✈️", + "man_pilot_tone5": "👨🏿‍✈️", + "man_pilot_dark_skin_tone": "👨🏿‍✈️", + "astronaut": "🧑‍🚀", + "astronaut_tone1": "🧑🏻‍🚀", + "astronaut_light_skin_tone": "🧑🏻‍🚀", + "astronaut_tone2": "🧑🏼‍🚀", + "astronaut_medium_light_skin_tone": "🧑🏼‍🚀", + "astronaut_tone3": "🧑🏽‍🚀", + "astronaut_medium_skin_tone": "🧑🏽‍🚀", + "astronaut_tone4": "🧑🏾‍🚀", + "astronaut_medium_dark_skin_tone": "🧑🏾‍🚀", + "astronaut_tone5": "🧑🏿‍🚀", + "astronaut_dark_skin_tone": "🧑🏿‍🚀", + "woman_astronaut": "👩‍🚀", + "woman_astronaut_tone1": "👩🏻‍🚀", + "woman_astronaut_light_skin_tone": "👩🏻‍🚀", + "woman_astronaut_tone2": "👩🏼‍🚀", + "woman_astronaut_medium_light_skin_tone": "👩🏼‍🚀", + "woman_astronaut_tone3": "👩🏽‍🚀", + "woman_astronaut_medium_skin_tone": "👩🏽‍🚀", + "woman_astronaut_tone4": "👩🏾‍🚀", + "woman_astronaut_medium_dark_skin_tone": "👩🏾‍🚀", + "woman_astronaut_tone5": "👩🏿‍🚀", + "woman_astronaut_dark_skin_tone": "👩🏿‍🚀", + "man_astronaut": "👨‍🚀", + "man_astronaut_tone1": "👨🏻‍🚀", + "man_astronaut_light_skin_tone": "👨🏻‍🚀", + "man_astronaut_tone2": "👨🏼‍🚀", + "man_astronaut_medium_light_skin_tone": "👨🏼‍🚀", + "man_astronaut_tone3": "👨🏽‍🚀", + "man_astronaut_medium_skin_tone": "👨🏽‍🚀", + "man_astronaut_tone4": "👨🏾‍🚀", + "man_astronaut_medium_dark_skin_tone": "👨🏾‍🚀", + "man_astronaut_tone5": "👨🏿‍🚀", + "man_astronaut_dark_skin_tone": "👨🏿‍🚀", + "judge": "🧑‍⚖️", + "judge_tone1": "🧑🏻‍⚖️", + "judge_light_skin_tone": "🧑🏻‍⚖️", + "judge_tone2": "🧑🏼‍⚖️", + "judge_medium_light_skin_tone": "🧑🏼‍⚖️", + "judge_tone3": "🧑🏽‍⚖️", + "judge_medium_skin_tone": "🧑🏽‍⚖️", + "judge_tone4": "🧑🏾‍⚖️", + "judge_medium_dark_skin_tone": "🧑🏾‍⚖️", + "judge_tone5": "🧑🏿‍⚖️", + "judge_dark_skin_tone": "🧑🏿‍⚖️", + "woman_judge": "👩‍⚖️", + "woman_judge_tone1": "👩🏻‍⚖️", + "woman_judge_light_skin_tone": "👩🏻‍⚖️", + "woman_judge_tone2": "👩🏼‍⚖️", + "woman_judge_medium_light_skin_tone": "👩🏼‍⚖️", + "woman_judge_tone3": "👩🏽‍⚖️", + "woman_judge_medium_skin_tone": "👩🏽‍⚖️", + "woman_judge_tone4": "👩🏾‍⚖️", + "woman_judge_medium_dark_skin_tone": "👩🏾‍⚖️", + "woman_judge_tone5": "👩🏿‍⚖️", + "woman_judge_dark_skin_tone": "👩🏿‍⚖️", + "man_judge": "👨‍⚖️", + "man_judge_tone1": "👨🏻‍⚖️", + "man_judge_light_skin_tone": "👨🏻‍⚖️", + "man_judge_tone2": "👨🏼‍⚖️", + "man_judge_medium_light_skin_tone": "👨🏼‍⚖️", + "man_judge_tone3": "👨🏽‍⚖️", + "man_judge_medium_skin_tone": "👨🏽‍⚖️", + "man_judge_tone4": "👨🏾‍⚖️", + "man_judge_medium_dark_skin_tone": "👨🏾‍⚖️", + "man_judge_tone5": "👨🏿‍⚖️", + "man_judge_dark_skin_tone": "👨🏿‍⚖️", + "person_with_veil": "👰", + "person_with_veil_tone1": "👰🏻", + "person_with_veil_tone2": "👰🏼", + "person_with_veil_tone3": "👰🏽", + "person_with_veil_tone4": "👰🏾", + "person_with_veil_tone5": "👰🏿", + "woman_with_veil": "👰‍♀️", + "bride_with_veil": "👰‍♀️", + "woman_with_veil_tone1": "👰🏻‍♀️", + "woman_with_veil_light_skin_tone": "👰🏻‍♀️", + "woman_with_veil_tone2": "👰🏼‍♀️", + "woman_with_veil_medium_light_skin_tone": "👰🏼‍♀️", + "woman_with_veil_tone3": "👰🏽‍♀️", + "woman_with_veil_medium_skin_tone": "👰🏽‍♀️", + "woman_with_veil_tone4": "👰🏾‍♀️", + "woman_with_veil_medium_dark_skin_tone": "👰🏾‍♀️", + "woman_with_veil_tone5": "👰🏿‍♀️", + "woman_with_veil_dark_skin_tone": "👰🏿‍♀️", + "man_with_veil": "👰‍♂️", + "man_with_veil_tone1": "👰🏻‍♂️", + "man_with_veil_light_skin_tone": "👰🏻‍♂️", + "man_with_veil_tone2": "👰🏼‍♂️", + "man_with_veil_medium_light_skin_tone": "👰🏼‍♂️", + "man_with_veil_tone3": "👰🏽‍♂️", + "man_with_veil_medium_skin_tone": "👰🏽‍♂️", + "man_with_veil_tone4": "👰🏾‍♂️", + "man_with_veil_medium_dark_skin_tone": "👰🏾‍♂️", + "man_with_veil_tone5": "👰🏿‍♂️", + "man_with_veil_dark_skin_tone": "👰🏿‍♂️", + "person_in_tuxedo": "🤵", + "person_in_tuxedo_tone1": "🤵🏻", + "tuxedo_tone1": "🤵🏻", + "person_in_tuxedo_tone2": "🤵🏼", + "tuxedo_tone2": "🤵🏼", + "person_in_tuxedo_tone3": "🤵🏽", + "tuxedo_tone3": "🤵🏽", + "person_in_tuxedo_tone4": "🤵🏾", + "tuxedo_tone4": "🤵🏾", + "person_in_tuxedo_tone5": "🤵🏿", + "tuxedo_tone5": "🤵🏿", + "woman_in_tuxedo": "🤵‍♀️", + "woman_in_tuxedo_tone1": "🤵🏻‍♀️", + "woman_in_tuxedo_light_skin_tone": "🤵🏻‍♀️", + "woman_in_tuxedo_tone2": "🤵🏼‍♀️", + "woman_in_tuxedo_medium_light_skin_tone": "🤵🏼‍♀️", + "woman_in_tuxedo_tone3": "🤵🏽‍♀️", + "woman_in_tuxedo_medium_skin_tone": "🤵🏽‍♀️", + "woman_in_tuxedo_tone4": "🤵🏾‍♀️", + "woman_in_tuxedo_medium_dark_skin_tone": "🤵🏾‍♀️", + "woman_in_tuxedo_tone5": "🤵🏿‍♀️", + "woman_in_tuxedo_dark_skin_tone": "🤵🏿‍♀️", + "man_in_tuxedo": "🤵‍♂️", + "man_in_tuxedo_tone1": "🤵🏻‍♂️", + "man_in_tuxedo_light_skin_tone": "🤵🏻‍♂️", + "man_in_tuxedo_tone2": "🤵🏼‍♂️", + "man_in_tuxedo_medium_light_skin_tone": "🤵🏼‍♂️", + "man_in_tuxedo_tone3": "🤵🏽‍♂️", + "man_in_tuxedo_medium_skin_tone": "🤵🏽‍♂️", + "man_in_tuxedo_tone4": "🤵🏾‍♂️", + "man_in_tuxedo_medium_dark_skin_tone": "🤵🏾‍♂️", + "man_in_tuxedo_tone5": "🤵🏿‍♂️", + "man_in_tuxedo_dark_skin_tone": "🤵🏿‍♂️", + "princess": "👸", + "princess_tone1": "👸🏻", + "princess_tone2": "👸🏼", + "princess_tone3": "👸🏽", + "princess_tone4": "👸🏾", + "princess_tone5": "👸🏿", + "prince": "🤴", + "prince_tone1": "🤴🏻", + "prince_tone2": "🤴🏼", + "prince_tone3": "🤴🏽", + "prince_tone4": "🤴🏾", + "prince_tone5": "🤴🏿", + "superhero": "🦸", + "superhero_tone1": "🦸🏻", + "superhero_light_skin_tone": "🦸🏻", + "superhero_tone2": "🦸🏼", + "superhero_medium_light_skin_tone": "🦸🏼", + "superhero_tone3": "🦸🏽", + "superhero_medium_skin_tone": "🦸🏽", + "superhero_tone4": "🦸🏾", + "superhero_medium_dark_skin_tone": "🦸🏾", + "superhero_tone5": "🦸🏿", + "superhero_dark_skin_tone": "🦸🏿", + "woman_superhero": "🦸‍♀️", + "woman_superhero_tone1": "🦸🏻‍♀️", + "woman_superhero_light_skin_tone": "🦸🏻‍♀️", + "woman_superhero_tone2": "🦸🏼‍♀️", + "woman_superhero_medium_light_skin_tone": "🦸🏼‍♀️", + "woman_superhero_tone3": "🦸🏽‍♀️", + "woman_superhero_medium_skin_tone": "🦸🏽‍♀️", + "woman_superhero_tone4": "🦸🏾‍♀️", + "woman_superhero_medium_dark_skin_tone": "🦸🏾‍♀️", + "woman_superhero_tone5": "🦸🏿‍♀️", + "woman_superhero_dark_skin_tone": "🦸🏿‍♀️", + "man_superhero": "🦸‍♂️", + "man_superhero_tone1": "🦸🏻‍♂️", + "man_superhero_light_skin_tone": "🦸🏻‍♂️", + "man_superhero_tone2": "🦸🏼‍♂️", + "man_superhero_medium_light_skin_tone": "🦸🏼‍♂️", + "man_superhero_tone3": "🦸🏽‍♂️", + "man_superhero_medium_skin_tone": "🦸🏽‍♂️", + "man_superhero_tone4": "🦸🏾‍♂️", + "man_superhero_medium_dark_skin_tone": "🦸🏾‍♂️", + "man_superhero_tone5": "🦸🏿‍♂️", + "man_superhero_dark_skin_tone": "🦸🏿‍♂️", + "supervillain": "🦹", + "supervillain_tone1": "🦹🏻", + "supervillain_light_skin_tone": "🦹🏻", + "supervillain_tone2": "🦹🏼", + "supervillain_medium_light_skin_tone": "🦹🏼", + "supervillain_tone3": "🦹🏽", + "supervillain_medium_skin_tone": "🦹🏽", + "supervillain_tone4": "🦹🏾", + "supervillain_medium_dark_skin_tone": "🦹🏾", + "supervillain_tone5": "🦹🏿", + "supervillain_dark_skin_tone": "🦹🏿", + "woman_supervillain": "🦹‍♀️", + "woman_supervillain_tone1": "🦹🏻‍♀️", + "woman_supervillain_light_skin_tone": "🦹🏻‍♀️", + "woman_supervillain_tone2": "🦹🏼‍♀️", + "woman_supervillain_medium_light_skin_tone": "🦹🏼‍♀️", + "woman_supervillain_tone3": "🦹🏽‍♀️", + "woman_supervillain_medium_skin_tone": "🦹🏽‍♀️", + "woman_supervillain_tone4": "🦹🏾‍♀️", + "woman_supervillain_medium_dark_skin_tone": "🦹🏾‍♀️", + "woman_supervillain_tone5": "🦹🏿‍♀️", + "woman_supervillain_dark_skin_tone": "🦹🏿‍♀️", + "man_supervillain": "🦹‍♂️", + "man_supervillain_tone1": "🦹🏻‍♂️", + "man_supervillain_light_skin_tone": "🦹🏻‍♂️", + "man_supervillain_tone2": "🦹🏼‍♂️", + "man_supervillain_medium_light_skin_tone": "🦹🏼‍♂️", + "man_supervillain_tone3": "🦹🏽‍♂️", + "man_supervillain_medium_skin_tone": "🦹🏽‍♂️", + "man_supervillain_tone4": "🦹🏾‍♂️", + "man_supervillain_medium_dark_skin_tone": "🦹🏾‍♂️", + "man_supervillain_tone5": "🦹🏿‍♂️", + "man_supervillain_dark_skin_tone": "🦹🏿‍♂️", + "ninja": "🥷", + "ninja_tone1": "🥷🏻", + "ninja_light_skin_tone": "🥷🏻", + "ninja_tone2": "🥷🏼", + "ninja_medium_light_skin_tone": "🥷🏼", + "ninja_tone3": "🥷🏽", + "ninja_medium_skin_tone": "🥷🏽", + "ninja_tone4": "🥷🏾", + "ninja_medium_dark_skin_tone": "🥷🏾", + "ninja_tone5": "🥷🏿", + "ninja_dark_skin_tone": "🥷🏿", + "mx_claus": "🧑‍🎄", + "mx_claus_tone1": "🧑🏻‍🎄", + "mx_claus_light_skin_tone": "🧑🏻‍🎄", + "mx_claus_tone2": "🧑🏼‍🎄", + "mx_claus_medium_light_skin_tone": "🧑🏼‍🎄", + "mx_claus_tone3": "🧑🏽‍🎄", + "mx_claus_medium_skin_tone": "🧑🏽‍🎄", + "mx_claus_tone4": "🧑🏾‍🎄", + "mx_claus_medium_dark_skin_tone": "🧑🏾‍🎄", + "mx_claus_tone5": "🧑🏿‍🎄", + "mx_claus_dark_skin_tone": "🧑🏿‍🎄", + "mrs_claus": "🤶", + "mother_christmas": "🤶", + "mrs_claus_tone1": "🤶🏻", + "mother_christmas_tone1": "🤶🏻", + "mrs_claus_tone2": "🤶🏼", + "mother_christmas_tone2": "🤶🏼", + "mrs_claus_tone3": "🤶🏽", + "mother_christmas_tone3": "🤶🏽", + "mrs_claus_tone4": "🤶🏾", + "mother_christmas_tone4": "🤶🏾", + "mrs_claus_tone5": "🤶🏿", + "mother_christmas_tone5": "🤶🏿", + "santa": "🎅", + "santa_tone1": "🎅🏻", + "santa_tone2": "🎅🏼", + "santa_tone3": "🎅🏽", + "santa_tone4": "🎅🏾", + "santa_tone5": "🎅🏿", + "mage": "🧙", + "mage_tone1": "🧙🏻", + "mage_light_skin_tone": "🧙🏻", + "mage_tone2": "🧙🏼", + "mage_medium_light_skin_tone": "🧙🏼", + "mage_tone3": "🧙🏽", + "mage_medium_skin_tone": "🧙🏽", + "mage_tone4": "🧙🏾", + "mage_medium_dark_skin_tone": "🧙🏾", + "mage_tone5": "🧙🏿", + "mage_dark_skin_tone": "🧙🏿", + "woman_mage": "🧙‍♀️", + "woman_mage_tone1": "🧙🏻‍♀️", + "woman_mage_light_skin_tone": "🧙🏻‍♀️", + "woman_mage_tone2": "🧙🏼‍♀️", + "woman_mage_medium_light_skin_tone": "🧙🏼‍♀️", + "woman_mage_tone3": "🧙🏽‍♀️", + "woman_mage_medium_skin_tone": "🧙🏽‍♀️", + "woman_mage_tone4": "🧙🏾‍♀️", + "woman_mage_medium_dark_skin_tone": "🧙🏾‍♀️", + "woman_mage_tone5": "🧙🏿‍♀️", + "woman_mage_dark_skin_tone": "🧙🏿‍♀️", + "man_mage": "🧙‍♂️", + "man_mage_tone1": "🧙🏻‍♂️", + "man_mage_light_skin_tone": "🧙🏻‍♂️", + "man_mage_tone2": "🧙🏼‍♂️", + "man_mage_medium_light_skin_tone": "🧙🏼‍♂️", + "man_mage_tone3": "🧙🏽‍♂️", + "man_mage_medium_skin_tone": "🧙🏽‍♂️", + "man_mage_tone4": "🧙🏾‍♂️", + "man_mage_medium_dark_skin_tone": "🧙🏾‍♂️", + "man_mage_tone5": "🧙🏿‍♂️", + "man_mage_dark_skin_tone": "🧙🏿‍♂️", + "elf": "🧝", + "elf_tone1": "🧝🏻", + "elf_light_skin_tone": "🧝🏻", + "elf_tone2": "🧝🏼", + "elf_medium_light_skin_tone": "🧝🏼", + "elf_tone3": "🧝🏽", + "elf_medium_skin_tone": "🧝🏽", + "elf_tone4": "🧝🏾", + "elf_medium_dark_skin_tone": "🧝🏾", + "elf_tone5": "🧝🏿", + "elf_dark_skin_tone": "🧝🏿", + "woman_elf": "🧝‍♀️", + "woman_elf_tone1": "🧝🏻‍♀️", + "woman_elf_light_skin_tone": "🧝🏻‍♀️", + "woman_elf_tone2": "🧝🏼‍♀️", + "woman_elf_medium_light_skin_tone": "🧝🏼‍♀️", + "woman_elf_tone3": "🧝🏽‍♀️", + "woman_elf_medium_skin_tone": "🧝🏽‍♀️", + "woman_elf_tone4": "🧝🏾‍♀️", + "woman_elf_medium_dark_skin_tone": "🧝🏾‍♀️", + "woman_elf_tone5": "🧝🏿‍♀️", + "woman_elf_dark_skin_tone": "🧝🏿‍♀️", + "man_elf": "🧝‍♂️", + "man_elf_tone1": "🧝🏻‍♂️", + "man_elf_light_skin_tone": "🧝🏻‍♂️", + "man_elf_tone2": "🧝🏼‍♂️", + "man_elf_medium_light_skin_tone": "🧝🏼‍♂️", + "man_elf_tone3": "🧝🏽‍♂️", + "man_elf_medium_skin_tone": "🧝🏽‍♂️", + "man_elf_tone4": "🧝🏾‍♂️", + "man_elf_medium_dark_skin_tone": "🧝🏾‍♂️", + "man_elf_tone5": "🧝🏿‍♂️", + "man_elf_dark_skin_tone": "🧝🏿‍♂️", + "vampire": "🧛", + "vampire_tone1": "🧛🏻", + "vampire_light_skin_tone": "🧛🏻", + "vampire_tone2": "🧛🏼", + "vampire_medium_light_skin_tone": "🧛🏼", + "vampire_tone3": "🧛🏽", + "vampire_medium_skin_tone": "🧛🏽", + "vampire_tone4": "🧛🏾", + "vampire_medium_dark_skin_tone": "🧛🏾", + "vampire_tone5": "🧛🏿", + "vampire_dark_skin_tone": "🧛🏿", + "woman_vampire": "🧛‍♀️", + "woman_vampire_tone1": "🧛🏻‍♀️", + "woman_vampire_light_skin_tone": "🧛🏻‍♀️", + "woman_vampire_tone2": "🧛🏼‍♀️", + "woman_vampire_medium_light_skin_tone": "🧛🏼‍♀️", + "woman_vampire_tone3": "🧛🏽‍♀️", + "woman_vampire_medium_skin_tone": "🧛🏽‍♀️", + "woman_vampire_tone4": "🧛🏾‍♀️", + "woman_vampire_medium_dark_skin_tone": "🧛🏾‍♀️", + "woman_vampire_tone5": "🧛🏿‍♀️", + "woman_vampire_dark_skin_tone": "🧛🏿‍♀️", + "man_vampire": "🧛‍♂️", + "man_vampire_tone1": "🧛🏻‍♂️", + "man_vampire_light_skin_tone": "🧛🏻‍♂️", + "man_vampire_tone2": "🧛🏼‍♂️", + "man_vampire_medium_light_skin_tone": "🧛🏼‍♂️", + "man_vampire_tone3": "🧛🏽‍♂️", + "man_vampire_medium_skin_tone": "🧛🏽‍♂️", + "man_vampire_tone4": "🧛🏾‍♂️", + "man_vampire_medium_dark_skin_tone": "🧛🏾‍♂️", + "man_vampire_tone5": "🧛🏿‍♂️", + "man_vampire_dark_skin_tone": "🧛🏿‍♂️", + "zombie": "🧟", + "woman_zombie": "🧟‍♀️", + "man_zombie": "🧟‍♂️", + "genie": "🧞", + "woman_genie": "🧞‍♀️", + "man_genie": "🧞‍♂️", + "merperson": "🧜", + "merperson_tone1": "🧜🏻", + "merperson_light_skin_tone": "🧜🏻", + "merperson_tone2": "🧜🏼", + "merperson_medium_light_skin_tone": "🧜🏼", + "merperson_tone3": "🧜🏽", + "merperson_medium_skin_tone": "🧜🏽", + "merperson_tone4": "🧜🏾", + "merperson_medium_dark_skin_tone": "🧜🏾", + "merperson_tone5": "🧜🏿", + "merperson_dark_skin_tone": "🧜🏿", + "mermaid": "🧜‍♀️", + "mermaid_tone1": "🧜🏻‍♀️", + "mermaid_light_skin_tone": "🧜🏻‍♀️", + "mermaid_tone2": "🧜🏼‍♀️", + "mermaid_medium_light_skin_tone": "🧜🏼‍♀️", + "mermaid_tone3": "🧜🏽‍♀️", + "mermaid_medium_skin_tone": "🧜🏽‍♀️", + "mermaid_tone4": "🧜🏾‍♀️", + "mermaid_medium_dark_skin_tone": "🧜🏾‍♀️", + "mermaid_tone5": "🧜🏿‍♀️", + "mermaid_dark_skin_tone": "🧜🏿‍♀️", + "merman": "🧜‍♂️", + "merman_tone1": "🧜🏻‍♂️", + "merman_light_skin_tone": "🧜🏻‍♂️", + "merman_tone2": "🧜🏼‍♂️", + "merman_medium_light_skin_tone": "🧜🏼‍♂️", + "merman_tone3": "🧜🏽‍♂️", + "merman_medium_skin_tone": "🧜🏽‍♂️", + "merman_tone4": "🧜🏾‍♂️", + "merman_medium_dark_skin_tone": "🧜🏾‍♂️", + "merman_tone5": "🧜🏿‍♂️", + "merman_dark_skin_tone": "🧜🏿‍♂️", + "fairy": "🧚", + "fairy_tone1": "🧚🏻", + "fairy_light_skin_tone": "🧚🏻", + "fairy_tone2": "🧚🏼", + "fairy_medium_light_skin_tone": "🧚🏼", + "fairy_tone3": "🧚🏽", + "fairy_medium_skin_tone": "🧚🏽", + "fairy_tone4": "🧚🏾", + "fairy_medium_dark_skin_tone": "🧚🏾", + "fairy_tone5": "🧚🏿", + "fairy_dark_skin_tone": "🧚🏿", + "woman_fairy": "🧚‍♀️", + "woman_fairy_tone1": "🧚🏻‍♀️", + "woman_fairy_light_skin_tone": "🧚🏻‍♀️", + "woman_fairy_tone2": "🧚🏼‍♀️", + "woman_fairy_medium_light_skin_tone": "🧚🏼‍♀️", + "woman_fairy_tone3": "🧚🏽‍♀️", + "woman_fairy_medium_skin_tone": "🧚🏽‍♀️", + "woman_fairy_tone4": "🧚🏾‍♀️", + "woman_fairy_medium_dark_skin_tone": "🧚🏾‍♀️", + "woman_fairy_tone5": "🧚🏿‍♀️", + "woman_fairy_dark_skin_tone": "🧚🏿‍♀️", + "man_fairy": "🧚‍♂️", + "man_fairy_tone1": "🧚🏻‍♂️", + "man_fairy_light_skin_tone": "🧚🏻‍♂️", + "man_fairy_tone2": "🧚🏼‍♂️", + "man_fairy_medium_light_skin_tone": "🧚🏼‍♂️", + "man_fairy_tone3": "🧚🏽‍♂️", + "man_fairy_medium_skin_tone": "🧚🏽‍♂️", + "man_fairy_tone4": "🧚🏾‍♂️", + "man_fairy_medium_dark_skin_tone": "🧚🏾‍♂️", + "man_fairy_tone5": "🧚🏿‍♂️", + "man_fairy_dark_skin_tone": "🧚🏿‍♂️", + "angel": "👼", + "angel_tone1": "👼🏻", + "angel_tone2": "👼🏼", + "angel_tone3": "👼🏽", + "angel_tone4": "👼🏾", + "angel_tone5": "👼🏿", + "pregnant_woman": "🤰", + "expecting_woman": "🤰", + "pregnant_woman_tone1": "🤰🏻", + "expecting_woman_tone1": "🤰🏻", + "pregnant_woman_tone2": "🤰🏼", + "expecting_woman_tone2": "🤰🏼", + "pregnant_woman_tone3": "🤰🏽", + "expecting_woman_tone3": "🤰🏽", + "pregnant_woman_tone4": "🤰🏾", + "expecting_woman_tone4": "🤰🏾", + "pregnant_woman_tone5": "🤰🏿", + "expecting_woman_tone5": "🤰🏿", + "breast_feeding": "🤱", + "breast_feeding_tone1": "🤱🏻", + "breast_feeding_light_skin_tone": "🤱🏻", + "breast_feeding_tone2": "🤱🏼", + "breast_feeding_medium_light_skin_tone": "🤱🏼", + "breast_feeding_tone3": "🤱🏽", + "breast_feeding_medium_skin_tone": "🤱🏽", + "breast_feeding_tone4": "🤱🏾", + "breast_feeding_medium_dark_skin_tone": "🤱🏾", + "breast_feeding_tone5": "🤱🏿", + "breast_feeding_dark_skin_tone": "🤱🏿", + "person_feeding_baby": "🧑‍🍼", + "person_feeding_baby_tone1": "🧑🏻‍🍼", + "person_feeding_baby_light_skin_tone": "🧑🏻‍🍼", + "person_feeding_baby_tone2": "🧑🏼‍🍼", + "person_feeding_baby_medium_light_skin_tone": "🧑🏼‍🍼", + "person_feeding_baby_tone3": "🧑🏽‍🍼", + "person_feeding_baby_medium_skin_tone": "🧑🏽‍🍼", + "person_feeding_baby_tone4": "🧑🏾‍🍼", + "person_feeding_baby_medium_dark_skin_tone": "🧑🏾‍🍼", + "person_feeding_baby_tone5": "🧑🏿‍🍼", + "person_feeding_baby_dark_skin_tone": "🧑🏿‍🍼", + "woman_feeding_baby": "👩‍🍼", + "woman_feeding_baby_tone1": "👩🏻‍🍼", + "woman_feeding_baby_light_skin_tone": "👩🏻‍🍼", + "woman_feeding_baby_tone2": "👩🏼‍🍼", + "woman_feeding_baby_medium_light_skin_tone": "👩🏼‍🍼", + "woman_feeding_baby_tone3": "👩🏽‍🍼", + "woman_feeding_baby_medium_skin_tone": "👩🏽‍🍼", + "woman_feeding_baby_tone4": "👩🏾‍🍼", + "woman_feeding_baby_medium_dark_skin_tone": "👩🏾‍🍼", + "woman_feeding_baby_tone5": "👩🏿‍🍼", + "woman_feeding_baby_dark_skin_tone": "👩🏿‍🍼", + "man_feeding_baby": "👨‍🍼", + "man_feeding_baby_tone1": "👨🏻‍🍼", + "man_feeding_baby_light_skin_tone": "👨🏻‍🍼", + "man_feeding_baby_tone2": "👨🏼‍🍼", + "man_feeding_baby_medium_light_skin_tone": "👨🏼‍🍼", + "man_feeding_baby_tone3": "👨🏽‍🍼", + "man_feeding_baby_medium_skin_tone": "👨🏽‍🍼", + "man_feeding_baby_tone4": "👨🏾‍🍼", + "man_feeding_baby_medium_dark_skin_tone": "👨🏾‍🍼", + "man_feeding_baby_tone5": "👨🏿‍🍼", + "man_feeding_baby_dark_skin_tone": "👨🏿‍🍼", + "person_bowing": "🙇", + "bow": "🙇", + "person_bowing_tone1": "🙇🏻", + "bow_tone1": "🙇🏻", + "person_bowing_tone2": "🙇🏼", + "bow_tone2": "🙇🏼", + "person_bowing_tone3": "🙇🏽", + "bow_tone3": "🙇🏽", + "person_bowing_tone4": "🙇🏾", + "bow_tone4": "🙇🏾", + "person_bowing_tone5": "🙇🏿", + "bow_tone5": "🙇🏿", + "woman_bowing": "🙇‍♀️", + "woman_bowing_tone1": "🙇🏻‍♀️", + "woman_bowing_light_skin_tone": "🙇🏻‍♀️", + "woman_bowing_tone2": "🙇🏼‍♀️", + "woman_bowing_medium_light_skin_tone": "🙇🏼‍♀️", + "woman_bowing_tone3": "🙇🏽‍♀️", + "woman_bowing_medium_skin_tone": "🙇🏽‍♀️", + "woman_bowing_tone4": "🙇🏾‍♀️", + "woman_bowing_medium_dark_skin_tone": "🙇🏾‍♀️", + "woman_bowing_tone5": "🙇🏿‍♀️", + "woman_bowing_dark_skin_tone": "🙇🏿‍♀️", + "man_bowing": "🙇‍♂️", + "man_bowing_tone1": "🙇🏻‍♂️", + "man_bowing_light_skin_tone": "🙇🏻‍♂️", + "man_bowing_tone2": "🙇🏼‍♂️", + "man_bowing_medium_light_skin_tone": "🙇🏼‍♂️", + "man_bowing_tone3": "🙇🏽‍♂️", + "man_bowing_medium_skin_tone": "🙇🏽‍♂️", + "man_bowing_tone4": "🙇🏾‍♂️", + "man_bowing_medium_dark_skin_tone": "🙇🏾‍♂️", + "man_bowing_tone5": "🙇🏿‍♂️", + "man_bowing_dark_skin_tone": "🙇🏿‍♂️", + "person_tipping_hand": "💁", + "information_desk_person": "💁", + "person_tipping_hand_tone1": "💁🏻", + "information_desk_person_tone1": "💁🏻", + "person_tipping_hand_tone2": "💁🏼", + "information_desk_person_tone2": "💁🏼", + "person_tipping_hand_tone3": "💁🏽", + "information_desk_person_tone3": "💁🏽", + "person_tipping_hand_tone4": "💁🏾", + "information_desk_person_tone4": "💁🏾", + "person_tipping_hand_tone5": "💁🏿", + "information_desk_person_tone5": "💁🏿", + "woman_tipping_hand": "💁‍♀️", + "woman_tipping_hand_tone1": "💁🏻‍♀️", + "woman_tipping_hand_light_skin_tone": "💁🏻‍♀️", + "woman_tipping_hand_tone2": "💁🏼‍♀️", + "woman_tipping_hand_medium_light_skin_tone": "💁🏼‍♀️", + "woman_tipping_hand_tone3": "💁🏽‍♀️", + "woman_tipping_hand_medium_skin_tone": "💁🏽‍♀️", + "woman_tipping_hand_tone4": "💁🏾‍♀️", + "woman_tipping_hand_medium_dark_skin_tone": "💁🏾‍♀️", + "woman_tipping_hand_tone5": "💁🏿‍♀️", + "woman_tipping_hand_dark_skin_tone": "💁🏿‍♀️", + "man_tipping_hand": "💁‍♂️", + "man_tipping_hand_tone1": "💁🏻‍♂️", + "man_tipping_hand_light_skin_tone": "💁🏻‍♂️", + "man_tipping_hand_tone2": "💁🏼‍♂️", + "man_tipping_hand_medium_light_skin_tone": "💁🏼‍♂️", + "man_tipping_hand_tone3": "💁🏽‍♂️", + "man_tipping_hand_medium_skin_tone": "💁🏽‍♂️", + "man_tipping_hand_tone4": "💁🏾‍♂️", + "man_tipping_hand_medium_dark_skin_tone": "💁🏾‍♂️", + "man_tipping_hand_tone5": "💁🏿‍♂️", + "man_tipping_hand_dark_skin_tone": "💁🏿‍♂️", + "person_gesturing_no": "🙅", + "no_good": "🙅", + "person_gesturing_no_tone1": "🙅🏻", + "no_good_tone1": "🙅🏻", + "person_gesturing_no_tone2": "🙅🏼", + "no_good_tone2": "🙅🏼", + "person_gesturing_no_tone3": "🙅🏽", + "no_good_tone3": "🙅🏽", + "person_gesturing_no_tone4": "🙅🏾", + "no_good_tone4": "🙅🏾", + "person_gesturing_no_tone5": "🙅🏿", + "no_good_tone5": "🙅🏿", + "woman_gesturing_no": "🙅‍♀️", + "woman_gesturing_no_tone1": "🙅🏻‍♀️", + "woman_gesturing_no_light_skin_tone": "🙅🏻‍♀️", + "woman_gesturing_no_tone2": "🙅🏼‍♀️", + "woman_gesturing_no_medium_light_skin_tone": "🙅🏼‍♀️", + "woman_gesturing_no_tone3": "🙅🏽‍♀️", + "woman_gesturing_no_medium_skin_tone": "🙅🏽‍♀️", + "woman_gesturing_no_tone4": "🙅🏾‍♀️", + "woman_gesturing_no_medium_dark_skin_tone": "🙅🏾‍♀️", + "woman_gesturing_no_tone5": "🙅🏿‍♀️", + "woman_gesturing_no_dark_skin_tone": "🙅🏿‍♀️", + "man_gesturing_no": "🙅‍♂️", + "man_gesturing_no_tone1": "🙅🏻‍♂️", + "man_gesturing_no_light_skin_tone": "🙅🏻‍♂️", + "man_gesturing_no_tone2": "🙅🏼‍♂️", + "man_gesturing_no_medium_light_skin_tone": "🙅🏼‍♂️", + "man_gesturing_no_tone3": "🙅🏽‍♂️", + "man_gesturing_no_medium_skin_tone": "🙅🏽‍♂️", + "man_gesturing_no_tone4": "🙅🏾‍♂️", + "man_gesturing_no_medium_dark_skin_tone": "🙅🏾‍♂️", + "man_gesturing_no_tone5": "🙅🏿‍♂️", + "man_gesturing_no_dark_skin_tone": "🙅🏿‍♂️", + "person_gesturing_ok": "🙆", + "ok_woman": "🙆", + "person_gesturing_ok_tone1": "🙆🏻", + "ok_woman_tone1": "🙆🏻", + "person_gesturing_ok_tone2": "🙆🏼", + "ok_woman_tone2": "🙆🏼", + "person_gesturing_ok_tone3": "🙆🏽", + "ok_woman_tone3": "🙆🏽", + "person_gesturing_ok_tone4": "🙆🏾", + "ok_woman_tone4": "🙆🏾", + "person_gesturing_ok_tone5": "🙆🏿", + "ok_woman_tone5": "🙆🏿", + "woman_gesturing_ok": "🙆‍♀️", + "woman_gesturing_ok_tone1": "🙆🏻‍♀️", + "woman_gesturing_ok_light_skin_tone": "🙆🏻‍♀️", + "woman_gesturing_ok_tone2": "🙆🏼‍♀️", + "woman_gesturing_ok_medium_light_skin_tone": "🙆🏼‍♀️", + "woman_gesturing_ok_tone3": "🙆🏽‍♀️", + "woman_gesturing_ok_medium_skin_tone": "🙆🏽‍♀️", + "woman_gesturing_ok_tone4": "🙆🏾‍♀️", + "woman_gesturing_ok_medium_dark_skin_tone": "🙆🏾‍♀️", + "woman_gesturing_ok_tone5": "🙆🏿‍♀️", + "woman_gesturing_ok_dark_skin_tone": "🙆🏿‍♀️", + "man_gesturing_ok": "🙆‍♂️", + "man_gesturing_ok_tone1": "🙆🏻‍♂️", + "man_gesturing_ok_light_skin_tone": "🙆🏻‍♂️", + "man_gesturing_ok_tone2": "🙆🏼‍♂️", + "man_gesturing_ok_medium_light_skin_tone": "🙆🏼‍♂️", + "man_gesturing_ok_tone3": "🙆🏽‍♂️", + "man_gesturing_ok_medium_skin_tone": "🙆🏽‍♂️", + "man_gesturing_ok_tone4": "🙆🏾‍♂️", + "man_gesturing_ok_medium_dark_skin_tone": "🙆🏾‍♂️", + "man_gesturing_ok_tone5": "🙆🏿‍♂️", + "man_gesturing_ok_dark_skin_tone": "🙆🏿‍♂️", + "person_raising_hand": "🙋", + "raising_hand": "🙋", + "person_raising_hand_tone1": "🙋🏻", + "raising_hand_tone1": "🙋🏻", + "person_raising_hand_tone2": "🙋🏼", + "raising_hand_tone2": "🙋🏼", + "person_raising_hand_tone3": "🙋🏽", + "raising_hand_tone3": "🙋🏽", + "person_raising_hand_tone4": "🙋🏾", + "raising_hand_tone4": "🙋🏾", + "person_raising_hand_tone5": "🙋🏿", + "raising_hand_tone5": "🙋🏿", + "woman_raising_hand": "🙋‍♀️", + "woman_raising_hand_tone1": "🙋🏻‍♀️", + "woman_raising_hand_light_skin_tone": "🙋🏻‍♀️", + "woman_raising_hand_tone2": "🙋🏼‍♀️", + "woman_raising_hand_medium_light_skin_tone": "🙋🏼‍♀️", + "woman_raising_hand_tone3": "🙋🏽‍♀️", + "woman_raising_hand_medium_skin_tone": "🙋🏽‍♀️", + "woman_raising_hand_tone4": "🙋🏾‍♀️", + "woman_raising_hand_medium_dark_skin_tone": "🙋🏾‍♀️", + "woman_raising_hand_tone5": "🙋🏿‍♀️", + "woman_raising_hand_dark_skin_tone": "🙋🏿‍♀️", + "man_raising_hand": "🙋‍♂️", + "man_raising_hand_tone1": "🙋🏻‍♂️", + "man_raising_hand_light_skin_tone": "🙋🏻‍♂️", + "man_raising_hand_tone2": "🙋🏼‍♂️", + "man_raising_hand_medium_light_skin_tone": "🙋🏼‍♂️", + "man_raising_hand_tone3": "🙋🏽‍♂️", + "man_raising_hand_medium_skin_tone": "🙋🏽‍♂️", + "man_raising_hand_tone4": "🙋🏾‍♂️", + "man_raising_hand_medium_dark_skin_tone": "🙋🏾‍♂️", + "man_raising_hand_tone5": "🙋🏿‍♂️", + "man_raising_hand_dark_skin_tone": "🙋🏿‍♂️", + "deaf_person": "🧏", + "deaf_person_tone1": "🧏🏻", + "deaf_person_light_skin_tone": "🧏🏻", + "deaf_person_tone2": "🧏🏼", + "deaf_person_medium_light_skin_tone": "🧏🏼", + "deaf_person_tone3": "🧏🏽", + "deaf_person_medium_skin_tone": "🧏🏽", + "deaf_person_tone4": "🧏🏾", + "deaf_person_medium_dark_skin_tone": "🧏🏾", + "deaf_person_tone5": "🧏🏿", + "deaf_person_dark_skin_tone": "🧏🏿", + "deaf_woman": "🧏‍♀️", + "deaf_woman_tone1": "🧏🏻‍♀️", + "deaf_woman_light_skin_tone": "🧏🏻‍♀️", + "deaf_woman_tone2": "🧏🏼‍♀️", + "deaf_woman_medium_light_skin_tone": "🧏🏼‍♀️", + "deaf_woman_tone3": "🧏🏽‍♀️", + "deaf_woman_medium_skin_tone": "🧏🏽‍♀️", + "deaf_woman_tone4": "🧏🏾‍♀️", + "deaf_woman_medium_dark_skin_tone": "🧏🏾‍♀️", + "deaf_woman_tone5": "🧏🏿‍♀️", + "deaf_woman_dark_skin_tone": "🧏🏿‍♀️", + "deaf_man": "🧏‍♂️", + "deaf_man_tone1": "🧏🏻‍♂️", + "deaf_man_light_skin_tone": "🧏🏻‍♂️", + "deaf_man_tone2": "🧏🏼‍♂️", + "deaf_man_medium_light_skin_tone": "🧏🏼‍♂️", + "deaf_man_tone3": "🧏🏽‍♂️", + "deaf_man_medium_skin_tone": "🧏🏽‍♂️", + "deaf_man_tone4": "🧏🏾‍♂️", + "deaf_man_medium_dark_skin_tone": "🧏🏾‍♂️", + "deaf_man_tone5": "🧏🏿‍♂️", + "deaf_man_dark_skin_tone": "🧏🏿‍♂️", + "person_facepalming": "🤦", + "face_palm": "🤦", + "facepalm": "🤦", + "person_facepalming_tone1": "🤦🏻", + "face_palm_tone1": "🤦🏻", + "facepalm_tone1": "🤦🏻", + "person_facepalming_tone2": "🤦🏼", + "face_palm_tone2": "🤦🏼", + "facepalm_tone2": "🤦🏼", + "person_facepalming_tone3": "🤦🏽", + "face_palm_tone3": "🤦🏽", + "facepalm_tone3": "🤦🏽", + "person_facepalming_tone4": "🤦🏾", + "face_palm_tone4": "🤦🏾", + "facepalm_tone4": "🤦🏾", + "person_facepalming_tone5": "🤦🏿", + "face_palm_tone5": "🤦🏿", + "facepalm_tone5": "🤦🏿", + "woman_facepalming": "🤦‍♀️", + "woman_facepalming_tone1": "🤦🏻‍♀️", + "woman_facepalming_light_skin_tone": "🤦🏻‍♀️", + "woman_facepalming_tone2": "🤦🏼‍♀️", + "woman_facepalming_medium_light_skin_tone": "🤦🏼‍♀️", + "woman_facepalming_tone3": "🤦🏽‍♀️", + "woman_facepalming_medium_skin_tone": "🤦🏽‍♀️", + "woman_facepalming_tone4": "🤦🏾‍♀️", + "woman_facepalming_medium_dark_skin_tone": "🤦🏾‍♀️", + "woman_facepalming_tone5": "🤦🏿‍♀️", + "woman_facepalming_dark_skin_tone": "🤦🏿‍♀️", + "man_facepalming": "🤦‍♂️", + "man_facepalming_tone1": "🤦🏻‍♂️", + "man_facepalming_light_skin_tone": "🤦🏻‍♂️", + "man_facepalming_tone2": "🤦🏼‍♂️", + "man_facepalming_medium_light_skin_tone": "🤦🏼‍♂️", + "man_facepalming_tone3": "🤦🏽‍♂️", + "man_facepalming_medium_skin_tone": "🤦🏽‍♂️", + "man_facepalming_tone4": "🤦🏾‍♂️", + "man_facepalming_medium_dark_skin_tone": "🤦🏾‍♂️", + "man_facepalming_tone5": "🤦🏿‍♂️", + "man_facepalming_dark_skin_tone": "🤦🏿‍♂️", + "person_shrugging": "🤷", + "shrug": "🤷", + "person_shrugging_tone1": "🤷🏻", + "shrug_tone1": "🤷🏻", + "person_shrugging_tone2": "🤷🏼", + "shrug_tone2": "🤷🏼", + "person_shrugging_tone3": "🤷🏽", + "shrug_tone3": "🤷🏽", + "person_shrugging_tone4": "🤷🏾", + "shrug_tone4": "🤷🏾", + "person_shrugging_tone5": "🤷🏿", + "shrug_tone5": "🤷🏿", + "woman_shrugging": "🤷‍♀️", + "woman_shrugging_tone1": "🤷🏻‍♀️", + "woman_shrugging_light_skin_tone": "🤷🏻‍♀️", + "woman_shrugging_tone2": "🤷🏼‍♀️", + "woman_shrugging_medium_light_skin_tone": "🤷🏼‍♀️", + "woman_shrugging_tone3": "🤷🏽‍♀️", + "woman_shrugging_medium_skin_tone": "🤷🏽‍♀️", + "woman_shrugging_tone4": "🤷🏾‍♀️", + "woman_shrugging_medium_dark_skin_tone": "🤷🏾‍♀️", + "woman_shrugging_tone5": "🤷🏿‍♀️", + "woman_shrugging_dark_skin_tone": "🤷🏿‍♀️", + "man_shrugging": "🤷‍♂️", + "man_shrugging_tone1": "🤷🏻‍♂️", + "man_shrugging_light_skin_tone": "🤷🏻‍♂️", + "man_shrugging_tone2": "🤷🏼‍♂️", + "man_shrugging_medium_light_skin_tone": "🤷🏼‍♂️", + "man_shrugging_tone3": "🤷🏽‍♂️", + "man_shrugging_medium_skin_tone": "🤷🏽‍♂️", + "man_shrugging_tone4": "🤷🏾‍♂️", + "man_shrugging_medium_dark_skin_tone": "🤷🏾‍♂️", + "man_shrugging_tone5": "🤷🏿‍♂️", + "man_shrugging_dark_skin_tone": "🤷🏿‍♂️", + "person_pouting": "🙎", + "person_with_pouting_face": "🙎", + "person_pouting_tone1": "🙎🏻", + "person_with_pouting_face_tone1": "🙎🏻", + "person_pouting_tone2": "🙎🏼", + "person_with_pouting_face_tone2": "🙎🏼", + "person_pouting_tone3": "🙎🏽", + "person_with_pouting_face_tone3": "🙎🏽", + "person_pouting_tone4": "🙎🏾", + "person_with_pouting_face_tone4": "🙎🏾", + "person_pouting_tone5": "🙎🏿", + "person_with_pouting_face_tone5": "🙎🏿", + "woman_pouting": "🙎‍♀️", + "woman_pouting_tone1": "🙎🏻‍♀️", + "woman_pouting_light_skin_tone": "🙎🏻‍♀️", + "woman_pouting_tone2": "🙎🏼‍♀️", + "woman_pouting_medium_light_skin_tone": "🙎🏼‍♀️", + "woman_pouting_tone3": "🙎🏽‍♀️", + "woman_pouting_medium_skin_tone": "🙎🏽‍♀️", + "woman_pouting_tone4": "🙎🏾‍♀️", + "woman_pouting_medium_dark_skin_tone": "🙎🏾‍♀️", + "woman_pouting_tone5": "🙎🏿‍♀️", + "woman_pouting_dark_skin_tone": "🙎🏿‍♀️", + "man_pouting": "🙎‍♂️", + "man_pouting_tone1": "🙎🏻‍♂️", + "man_pouting_light_skin_tone": "🙎🏻‍♂️", + "man_pouting_tone2": "🙎🏼‍♂️", + "man_pouting_medium_light_skin_tone": "🙎🏼‍♂️", + "man_pouting_tone3": "🙎🏽‍♂️", + "man_pouting_medium_skin_tone": "🙎🏽‍♂️", + "man_pouting_tone4": "🙎🏾‍♂️", + "man_pouting_medium_dark_skin_tone": "🙎🏾‍♂️", + "man_pouting_tone5": "🙎🏿‍♂️", + "man_pouting_dark_skin_tone": "🙎🏿‍♂️", + "person_frowning": "🙍", + "person_frowning_tone1": "🙍🏻", + "person_frowning_tone2": "🙍🏼", + "person_frowning_tone3": "🙍🏽", + "person_frowning_tone4": "🙍🏾", + "person_frowning_tone5": "🙍🏿", + "woman_frowning": "🙍‍♀️", + "woman_frowning_tone1": "🙍🏻‍♀️", + "woman_frowning_light_skin_tone": "🙍🏻‍♀️", + "woman_frowning_tone2": "🙍🏼‍♀️", + "woman_frowning_medium_light_skin_tone": "🙍🏼‍♀️", + "woman_frowning_tone3": "🙍🏽‍♀️", + "woman_frowning_medium_skin_tone": "🙍🏽‍♀️", + "woman_frowning_tone4": "🙍🏾‍♀️", + "woman_frowning_medium_dark_skin_tone": "🙍🏾‍♀️", + "woman_frowning_tone5": "🙍🏿‍♀️", + "woman_frowning_dark_skin_tone": "🙍🏿‍♀️", + "man_frowning": "🙍‍♂️", + "man_frowning_tone1": "🙍🏻‍♂️", + "man_frowning_light_skin_tone": "🙍🏻‍♂️", + "man_frowning_tone2": "🙍🏼‍♂️", + "man_frowning_medium_light_skin_tone": "🙍🏼‍♂️", + "man_frowning_tone3": "🙍🏽‍♂️", + "man_frowning_medium_skin_tone": "🙍🏽‍♂️", + "man_frowning_tone4": "🙍🏾‍♂️", + "man_frowning_medium_dark_skin_tone": "🙍🏾‍♂️", + "man_frowning_tone5": "🙍🏿‍♂️", + "man_frowning_dark_skin_tone": "🙍🏿‍♂️", + "person_getting_haircut": "💇", + "haircut": "💇", + "person_getting_haircut_tone1": "💇🏻", + "haircut_tone1": "💇🏻", + "person_getting_haircut_tone2": "💇🏼", + "haircut_tone2": "💇🏼", + "person_getting_haircut_tone3": "💇🏽", + "haircut_tone3": "💇🏽", + "person_getting_haircut_tone4": "💇🏾", + "haircut_tone4": "💇🏾", + "person_getting_haircut_tone5": "💇🏿", + "haircut_tone5": "💇🏿", + "woman_getting_haircut": "💇‍♀️", + "woman_getting_haircut_tone1": "💇🏻‍♀️", + "woman_getting_haircut_light_skin_tone": "💇🏻‍♀️", + "woman_getting_haircut_tone2": "💇🏼‍♀️", + "woman_getting_haircut_medium_light_skin_tone": "💇🏼‍♀️", + "woman_getting_haircut_tone3": "💇🏽‍♀️", + "woman_getting_haircut_medium_skin_tone": "💇🏽‍♀️", + "woman_getting_haircut_tone4": "💇🏾‍♀️", + "woman_getting_haircut_medium_dark_skin_tone": "💇🏾‍♀️", + "woman_getting_haircut_tone5": "💇🏿‍♀️", + "woman_getting_haircut_dark_skin_tone": "💇🏿‍♀️", + "man_getting_haircut": "💇‍♂️", + "man_getting_haircut_tone1": "💇🏻‍♂️", + "man_getting_haircut_light_skin_tone": "💇🏻‍♂️", + "man_getting_haircut_tone2": "💇🏼‍♂️", + "man_getting_haircut_medium_light_skin_tone": "💇🏼‍♂️", + "man_getting_haircut_tone3": "💇🏽‍♂️", + "man_getting_haircut_medium_skin_tone": "💇🏽‍♂️", + "man_getting_haircut_tone4": "💇🏾‍♂️", + "man_getting_haircut_medium_dark_skin_tone": "💇🏾‍♂️", + "man_getting_haircut_tone5": "💇🏿‍♂️", + "man_getting_haircut_dark_skin_tone": "💇🏿‍♂️", + "person_getting_massage": "💆", + "massage": "💆", + "person_getting_massage_tone1": "💆🏻", + "massage_tone1": "💆🏻", + "person_getting_massage_tone2": "💆🏼", + "massage_tone2": "💆🏼", + "person_getting_massage_tone3": "💆🏽", + "massage_tone3": "💆🏽", + "person_getting_massage_tone4": "💆🏾", + "massage_tone4": "💆🏾", + "person_getting_massage_tone5": "💆🏿", + "massage_tone5": "💆🏿", + "woman_getting_face_massage": "💆‍♀️", + "woman_getting_face_massage_tone1": "💆🏻‍♀️", + "woman_getting_face_massage_light_skin_tone": "💆🏻‍♀️", + "woman_getting_face_massage_tone2": "💆🏼‍♀️", + "woman_getting_face_massage_medium_light_skin_tone": "💆🏼‍♀️", + "woman_getting_face_massage_tone3": "💆🏽‍♀️", + "woman_getting_face_massage_medium_skin_tone": "💆🏽‍♀️", + "woman_getting_face_massage_tone4": "💆🏾‍♀️", + "woman_getting_face_massage_medium_dark_skin_tone": "💆🏾‍♀️", + "woman_getting_face_massage_tone5": "💆🏿‍♀️", + "woman_getting_face_massage_dark_skin_tone": "💆🏿‍♀️", + "man_getting_face_massage": "💆‍♂️", + "man_getting_face_massage_tone1": "💆🏻‍♂️", + "man_getting_face_massage_light_skin_tone": "💆🏻‍♂️", + "man_getting_face_massage_tone2": "💆🏼‍♂️", + "man_getting_face_massage_medium_light_skin_tone": "💆🏼‍♂️", + "man_getting_face_massage_tone3": "💆🏽‍♂️", + "man_getting_face_massage_medium_skin_tone": "💆🏽‍♂️", + "man_getting_face_massage_tone4": "💆🏾‍♂️", + "man_getting_face_massage_medium_dark_skin_tone": "💆🏾‍♂️", + "man_getting_face_massage_tone5": "💆🏿‍♂️", + "man_getting_face_massage_dark_skin_tone": "💆🏿‍♂️", + "person_in_steamy_room": "🧖", + "person_in_steamy_room_tone1": "🧖🏻", + "person_in_steamy_room_light_skin_tone": "🧖🏻", + "person_in_steamy_room_tone2": "🧖🏼", + "person_in_steamy_room_medium_light_skin_tone": "🧖🏼", + "person_in_steamy_room_tone3": "🧖🏽", + "person_in_steamy_room_medium_skin_tone": "🧖🏽", + "person_in_steamy_room_tone4": "🧖🏾", + "person_in_steamy_room_medium_dark_skin_tone": "🧖🏾", + "person_in_steamy_room_tone5": "🧖🏿", + "person_in_steamy_room_dark_skin_tone": "🧖🏿", + "woman_in_steamy_room": "🧖‍♀️", + "woman_in_steamy_room_tone1": "🧖🏻‍♀️", + "woman_in_steamy_room_light_skin_tone": "🧖🏻‍♀️", + "woman_in_steamy_room_tone2": "🧖🏼‍♀️", + "woman_in_steamy_room_medium_light_skin_tone": "🧖🏼‍♀️", + "woman_in_steamy_room_tone3": "🧖🏽‍♀️", + "woman_in_steamy_room_medium_skin_tone": "🧖🏽‍♀️", + "woman_in_steamy_room_tone4": "🧖🏾‍♀️", + "woman_in_steamy_room_medium_dark_skin_tone": "🧖🏾‍♀️", + "woman_in_steamy_room_tone5": "🧖🏿‍♀️", + "woman_in_steamy_room_dark_skin_tone": "🧖🏿‍♀️", + "man_in_steamy_room": "🧖‍♂️", + "man_in_steamy_room_tone1": "🧖🏻‍♂️", + "man_in_steamy_room_light_skin_tone": "🧖🏻‍♂️", + "man_in_steamy_room_tone2": "🧖🏼‍♂️", + "man_in_steamy_room_medium_light_skin_tone": "🧖🏼‍♂️", + "man_in_steamy_room_tone3": "🧖🏽‍♂️", + "man_in_steamy_room_medium_skin_tone": "🧖🏽‍♂️", + "man_in_steamy_room_tone4": "🧖🏾‍♂️", + "man_in_steamy_room_medium_dark_skin_tone": "🧖🏾‍♂️", + "man_in_steamy_room_tone5": "🧖🏿‍♂️", + "man_in_steamy_room_dark_skin_tone": "🧖🏿‍♂️", + "nail_care": "💅", + "nail_care_tone1": "💅🏻", + "nail_care_tone2": "💅🏼", + "nail_care_tone3": "💅🏽", + "nail_care_tone4": "💅🏾", + "nail_care_tone5": "💅🏿", + "selfie": "🤳", + "selfie_tone1": "🤳🏻", + "selfie_tone2": "🤳🏼", + "selfie_tone3": "🤳🏽", + "selfie_tone4": "🤳🏾", + "selfie_tone5": "🤳🏿", + "dancer": "💃", + "dancer_tone1": "💃🏻", + "dancer_tone2": "💃🏼", + "dancer_tone3": "💃🏽", + "dancer_tone4": "💃🏾", + "dancer_tone5": "💃🏿", + "man_dancing": "🕺", + "male_dancer": "🕺", + "man_dancing_tone1": "🕺🏻", + "male_dancer_tone1": "🕺🏻", + "man_dancing_tone2": "🕺🏼", + "male_dancer_tone2": "🕺🏼", + "man_dancing_tone3": "🕺🏽", + "male_dancer_tone3": "🕺🏽", + "man_dancing_tone5": "🕺🏿", + "male_dancer_tone5": "🕺🏿", + "man_dancing_tone4": "🕺🏾", + "male_dancer_tone4": "🕺🏾", + "people_with_bunny_ears_partying": "👯", + "dancers": "👯", + "women_with_bunny_ears_partying": "👯‍♀️", + "men_with_bunny_ears_partying": "👯‍♂️", + "levitate": "🕴️", + "man_in_business_suit_levitating": "🕴️", + "levitate_tone1": "🕴🏻", + "man_in_business_suit_levitating_tone1": "🕴🏻", + "man_in_business_suit_levitating_light_skin_tone": "🕴🏻", + "levitate_tone2": "🕴🏼", + "man_in_business_suit_levitating_tone2": "🕴🏼", + "man_in_business_suit_levitating_medium_light_skin_tone": "🕴🏼", + "levitate_tone3": "🕴🏽", + "man_in_business_suit_levitating_tone3": "🕴🏽", + "man_in_business_suit_levitating_medium_skin_tone": "🕴🏽", + "levitate_tone4": "🕴🏾", + "man_in_business_suit_levitating_tone4": "🕴🏾", + "man_in_business_suit_levitating_medium_dark_skin_tone": "🕴🏾", + "levitate_tone5": "🕴🏿", + "man_in_business_suit_levitating_tone5": "🕴🏿", + "man_in_business_suit_levitating_dark_skin_tone": "🕴🏿", + "person_in_manual_wheelchair": "🧑‍🦽", + "person_in_manual_wheelchair_tone1": "🧑🏻‍🦽", + "person_in_manual_wheelchair_light_skin_tone": "🧑🏻‍🦽", + "person_in_manual_wheelchair_tone2": "🧑🏼‍🦽", + "person_in_manual_wheelchair_medium_light_skin_tone": "🧑🏼‍🦽", + "person_in_manual_wheelchair_tone3": "🧑🏽‍🦽", + "person_in_manual_wheelchair_medium_skin_tone": "🧑🏽‍🦽", + "person_in_manual_wheelchair_tone4": "🧑🏾‍🦽", + "person_in_manual_wheelchair_medium_dark_skin_tone": "🧑🏾‍🦽", + "person_in_manual_wheelchair_tone5": "🧑🏿‍🦽", + "person_in_manual_wheelchair_dark_skin_tone": "🧑🏿‍🦽", + "woman_in_manual_wheelchair": "👩‍🦽", + "woman_in_manual_wheelchair_tone1": "👩🏻‍🦽", + "woman_in_manual_wheelchair_light_skin_tone": "👩🏻‍🦽", + "woman_in_manual_wheelchair_tone2": "👩🏼‍🦽", + "woman_in_manual_wheelchair_medium_light_skin_tone": "👩🏼‍🦽", + "woman_in_manual_wheelchair_tone3": "👩🏽‍🦽", + "woman_in_manual_wheelchair_medium_skin_tone": "👩🏽‍🦽", + "woman_in_manual_wheelchair_tone4": "👩🏾‍🦽", + "woman_in_manual_wheelchair_medium_dark_skin_tone": "👩🏾‍🦽", + "woman_in_manual_wheelchair_tone5": "👩🏿‍🦽", + "woman_in_manual_wheelchair_dark_skin_tone": "👩🏿‍🦽", + "man_in_manual_wheelchair": "👨‍🦽", + "man_in_manual_wheelchair_tone1": "👨🏻‍🦽", + "man_in_manual_wheelchair_light_skin_tone": "👨🏻‍🦽", + "man_in_manual_wheelchair_tone2": "👨🏼‍🦽", + "man_in_manual_wheelchair_medium_light_skin_tone": "👨🏼‍🦽", + "man_in_manual_wheelchair_tone3": "👨🏽‍🦽", + "man_in_manual_wheelchair_medium_skin_tone": "👨🏽‍🦽", + "man_in_manual_wheelchair_tone4": "👨🏾‍🦽", + "man_in_manual_wheelchair_medium_dark_skin_tone": "👨🏾‍🦽", + "man_in_manual_wheelchair_tone5": "👨🏿‍🦽", + "man_in_manual_wheelchair_dark_skin_tone": "👨🏿‍🦽", + "person_in_motorized_wheelchair": "🧑‍🦼", + "person_in_motorized_wheelchair_tone1": "🧑🏻‍🦼", + "person_in_motorized_wheelchair_light_skin_tone": "🧑🏻‍🦼", + "person_in_motorized_wheelchair_tone2": "🧑🏼‍🦼", + "person_in_motorized_wheelchair_medium_light_skin_tone": "🧑🏼‍🦼", + "person_in_motorized_wheelchair_tone3": "🧑🏽‍🦼", + "person_in_motorized_wheelchair_medium_skin_tone": "🧑🏽‍🦼", + "person_in_motorized_wheelchair_tone4": "🧑🏾‍🦼", + "person_in_motorized_wheelchair_medium_dark_skin_tone": "🧑🏾‍🦼", + "person_in_motorized_wheelchair_tone5": "🧑🏿‍🦼", + "person_in_motorized_wheelchair_dark_skin_tone": "🧑🏿‍🦼", + "woman_in_motorized_wheelchair": "👩‍🦼", + "woman_in_motorized_wheelchair_tone1": "👩🏻‍🦼", + "woman_in_motorized_wheelchair_light_skin_tone": "👩🏻‍🦼", + "woman_in_motorized_wheelchair_tone2": "👩🏼‍🦼", + "woman_in_motorized_wheelchair_medium_light_skin_tone": "👩🏼‍🦼", + "woman_in_motorized_wheelchair_tone3": "👩🏽‍🦼", + "woman_in_motorized_wheelchair_medium_skin_tone": "👩🏽‍🦼", + "woman_in_motorized_wheelchair_tone4": "👩🏾‍🦼", + "woman_in_motorized_wheelchair_medium_dark_skin_tone": "👩🏾‍🦼", + "woman_in_motorized_wheelchair_tone5": "👩🏿‍🦼", + "woman_in_motorized_wheelchair_dark_skin_tone": "👩🏿‍🦼", + "man_in_motorized_wheelchair": "👨‍🦼", + "man_in_motorized_wheelchair_tone1": "👨🏻‍🦼", + "man_in_motorized_wheelchair_light_skin_tone": "👨🏻‍🦼", + "man_in_motorized_wheelchair_tone2": "👨🏼‍🦼", + "man_in_motorized_wheelchair_medium_light_skin_tone": "👨🏼‍🦼", + "man_in_motorized_wheelchair_tone3": "👨🏽‍🦼", + "man_in_motorized_wheelchair_medium_skin_tone": "👨🏽‍🦼", + "man_in_motorized_wheelchair_tone4": "👨🏾‍🦼", + "man_in_motorized_wheelchair_medium_dark_skin_tone": "👨🏾‍🦼", + "man_in_motorized_wheelchair_tone5": "👨🏿‍🦼", + "man_in_motorized_wheelchair_dark_skin_tone": "👨🏿‍🦼", + "person_walking": "🚶", + "walking": "🚶", + "person_walking_tone1": "🚶🏻", + "walking_tone1": "🚶🏻", + "person_walking_tone2": "🚶🏼", + "walking_tone2": "🚶🏼", + "person_walking_tone3": "🚶🏽", + "walking_tone3": "🚶🏽", + "person_walking_tone4": "🚶🏾", + "walking_tone4": "🚶🏾", + "person_walking_tone5": "🚶🏿", + "walking_tone5": "🚶🏿", + "woman_walking": "🚶‍♀️", + "woman_walking_tone1": "🚶🏻‍♀️", + "woman_walking_light_skin_tone": "🚶🏻‍♀️", + "woman_walking_tone2": "🚶🏼‍♀️", + "woman_walking_medium_light_skin_tone": "🚶🏼‍♀️", + "woman_walking_tone3": "🚶🏽‍♀️", + "woman_walking_medium_skin_tone": "🚶🏽‍♀️", + "woman_walking_tone4": "🚶🏾‍♀️", + "woman_walking_medium_dark_skin_tone": "🚶🏾‍♀️", + "woman_walking_tone5": "🚶🏿‍♀️", + "woman_walking_dark_skin_tone": "🚶🏿‍♀️", + "man_walking": "🚶‍♂️", + "man_walking_tone1": "🚶🏻‍♂️", + "man_walking_light_skin_tone": "🚶🏻‍♂️", + "man_walking_tone2": "🚶🏼‍♂️", + "man_walking_medium_light_skin_tone": "🚶🏼‍♂️", + "man_walking_tone3": "🚶🏽‍♂️", + "man_walking_medium_skin_tone": "🚶🏽‍♂️", + "man_walking_tone4": "🚶🏾‍♂️", + "man_walking_medium_dark_skin_tone": "🚶🏾‍♂️", + "man_walking_tone5": "🚶🏿‍♂️", + "man_walking_dark_skin_tone": "🚶🏿‍♂️", + "person_with_probing_cane": "🧑‍🦯", + "person_with_probing_cane_tone1": "🧑🏻‍🦯", + "person_with_probing_cane_light_skin_tone": "🧑🏻‍🦯", + "person_with_probing_cane_tone2": "🧑🏼‍🦯", + "person_with_probing_cane_medium_light_skin_tone": "🧑🏼‍🦯", + "person_with_probing_cane_tone3": "🧑🏽‍🦯", + "person_with_probing_cane_medium_skin_tone": "🧑🏽‍🦯", + "person_with_probing_cane_tone4": "🧑🏾‍🦯", + "person_with_probing_cane_medium_dark_skin_tone": "🧑🏾‍🦯", + "person_with_probing_cane_tone5": "🧑🏿‍🦯", + "person_with_probing_cane_dark_skin_tone": "🧑🏿‍🦯", + "woman_with_probing_cane": "👩‍🦯", + "woman_with_probing_cane_tone1": "👩🏻‍🦯", + "woman_with_probing_cane_light_skin_tone": "👩🏻‍🦯", + "woman_with_probing_cane_tone2": "👩🏼‍🦯", + "woman_with_probing_cane_medium_light_skin_tone": "👩🏼‍🦯", + "woman_with_probing_cane_tone3": "👩🏽‍🦯", + "woman_with_probing_cane_medium_skin_tone": "👩🏽‍🦯", + "woman_with_probing_cane_tone4": "👩🏾‍🦯", + "woman_with_probing_cane_medium_dark_skin_tone": "👩🏾‍🦯", + "woman_with_probing_cane_tone5": "👩🏿‍🦯", + "woman_with_probing_cane_dark_skin_tone": "👩🏿‍🦯", + "man_with_probing_cane": "👨‍🦯", + "man_with_probing_cane_tone1": "👨🏻‍🦯", + "man_with_probing_cane_light_skin_tone": "👨🏻‍🦯", + "man_with_probing_cane_tone3": "👨🏽‍🦯", + "man_with_probing_cane_medium_skin_tone": "👨🏽‍🦯", + "man_with_probing_cane_tone2": "👨🏼‍🦯", + "man_with_probing_cane_medium_light_skin_tone": "👨🏼‍🦯", + "man_with_probing_cane_tone4": "👨🏾‍🦯", + "man_with_probing_cane_medium_dark_skin_tone": "👨🏾‍🦯", + "man_with_probing_cane_tone5": "👨🏿‍🦯", + "man_with_probing_cane_dark_skin_tone": "👨🏿‍🦯", + "person_kneeling": "🧎", + "person_kneeling_tone1": "🧎🏻", + "person_kneeling_light_skin_tone": "🧎🏻", + "person_kneeling_tone2": "🧎🏼", + "person_kneeling_medium_light_skin_tone": "🧎🏼", + "person_kneeling_tone3": "🧎🏽", + "person_kneeling_medium_skin_tone": "🧎🏽", + "person_kneeling_tone4": "🧎🏾", + "person_kneeling_medium_dark_skin_tone": "🧎🏾", + "person_kneeling_tone5": "🧎🏿", + "person_kneeling_dark_skin_tone": "🧎🏿", + "woman_kneeling": "🧎‍♀️", + "woman_kneeling_tone1": "🧎🏻‍♀️", + "woman_kneeling_light_skin_tone": "🧎🏻‍♀️", + "woman_kneeling_tone2": "🧎🏼‍♀️", + "woman_kneeling_medium_light_skin_tone": "🧎🏼‍♀️", + "woman_kneeling_tone3": "🧎🏽‍♀️", + "woman_kneeling_medium_skin_tone": "🧎🏽‍♀️", + "woman_kneeling_tone4": "🧎🏾‍♀️", + "woman_kneeling_medium_dark_skin_tone": "🧎🏾‍♀️", + "woman_kneeling_tone5": "🧎🏿‍♀️", + "woman_kneeling_dark_skin_tone": "🧎🏿‍♀️", + "man_kneeling": "🧎‍♂️", + "man_kneeling_tone1": "🧎🏻‍♂️", + "man_kneeling_light_skin_tone": "🧎🏻‍♂️", + "man_kneeling_tone2": "🧎🏼‍♂️", + "man_kneeling_medium_light_skin_tone": "🧎🏼‍♂️", + "man_kneeling_tone3": "🧎🏽‍♂️", + "man_kneeling_medium_skin_tone": "🧎🏽‍♂️", + "man_kneeling_tone4": "🧎🏾‍♂️", + "man_kneeling_medium_dark_skin_tone": "🧎🏾‍♂️", + "man_kneeling_tone5": "🧎🏿‍♂️", + "man_kneeling_dark_skin_tone": "🧎🏿‍♂️", + "person_running": "🏃", + "runner": "🏃", + "person_running_tone1": "🏃🏻", + "runner_tone1": "🏃🏻", + "person_running_tone2": "🏃🏼", + "runner_tone2": "🏃🏼", + "person_running_tone3": "🏃🏽", + "runner_tone3": "🏃🏽", + "person_running_tone4": "🏃🏾", + "runner_tone4": "🏃🏾", + "person_running_tone5": "🏃🏿", + "runner_tone5": "🏃🏿", + "woman_running": "🏃‍♀️", + "woman_running_tone1": "🏃🏻‍♀️", + "woman_running_light_skin_tone": "🏃🏻‍♀️", + "woman_running_tone2": "🏃🏼‍♀️", + "woman_running_medium_light_skin_tone": "🏃🏼‍♀️", + "woman_running_tone3": "🏃🏽‍♀️", + "woman_running_medium_skin_tone": "🏃🏽‍♀️", + "woman_running_tone4": "🏃🏾‍♀️", + "woman_running_medium_dark_skin_tone": "🏃🏾‍♀️", + "woman_running_tone5": "🏃🏿‍♀️", + "woman_running_dark_skin_tone": "🏃🏿‍♀️", + "man_running": "🏃‍♂️", + "man_running_tone1": "🏃🏻‍♂️", + "man_running_light_skin_tone": "🏃🏻‍♂️", + "man_running_tone2": "🏃🏼‍♂️", + "man_running_medium_light_skin_tone": "🏃🏼‍♂️", + "man_running_tone3": "🏃🏽‍♂️", + "man_running_medium_skin_tone": "🏃🏽‍♂️", + "man_running_tone4": "🏃🏾‍♂️", + "man_running_medium_dark_skin_tone": "🏃🏾‍♂️", + "man_running_tone5": "🏃🏿‍♂️", + "man_running_dark_skin_tone": "🏃🏿‍♂️", + "person_standing": "🧍", + "person_standing_tone1": "🧍🏻", + "person_standing_light_skin_tone": "🧍🏻", + "person_standing_tone2": "🧍🏼", + "person_standing_medium_light_skin_tone": "🧍🏼", + "person_standing_tone3": "🧍🏽", + "person_standing_medium_skin_tone": "🧍🏽", + "person_standing_tone4": "🧍🏾", + "person_standing_medium_dark_skin_tone": "🧍🏾", + "person_standing_tone5": "🧍🏿", + "person_standing_dark_skin_tone": "🧍🏿", + "woman_standing": "🧍‍♀️", + "woman_standing_tone1": "🧍🏻‍♀️", + "woman_standing_light_skin_tone": "🧍🏻‍♀️", + "woman_standing_tone2": "🧍🏼‍♀️", + "woman_standing_medium_light_skin_tone": "🧍🏼‍♀️", + "woman_standing_tone3": "🧍🏽‍♀️", + "woman_standing_medium_skin_tone": "🧍🏽‍♀️", + "woman_standing_tone4": "🧍🏾‍♀️", + "woman_standing_medium_dark_skin_tone": "🧍🏾‍♀️", + "woman_standing_tone5": "🧍🏿‍♀️", + "woman_standing_dark_skin_tone": "🧍🏿‍♀️", + "man_standing": "🧍‍♂️", + "man_standing_tone1": "🧍🏻‍♂️", + "man_standing_light_skin_tone": "🧍🏻‍♂️", + "man_standing_tone2": "🧍🏼‍♂️", + "man_standing_medium_light_skin_tone": "🧍🏼‍♂️", + "man_standing_tone3": "🧍🏽‍♂️", + "man_standing_medium_skin_tone": "🧍🏽‍♂️", + "man_standing_tone4": "🧍🏾‍♂️", + "man_standing_medium_dark_skin_tone": "🧍🏾‍♂️", + "man_standing_tone5": "🧍🏿‍♂️", + "man_standing_dark_skin_tone": "🧍🏿‍♂️", + "people_holding_hands": "🧑‍🤝‍🧑", + "people_holding_hands_tone1": "🧑🏻‍🤝‍🧑🏻", + "people_holding_hands_light_skin_tone": "🧑🏻‍🤝‍🧑🏻", + "people_holding_hands_tone1_tone2": "🧑🏻‍🤝‍🧑🏼", + "people_holding_hands_light_skin_tone_medium_light_skin_tone": "🧑🏻‍🤝‍🧑🏼", + "people_holding_hands_tone1_tone3": "🧑🏻‍🤝‍🧑🏽", + "people_holding_hands_light_skin_tone_medium_skin_tone": "🧑🏻‍🤝‍🧑🏽", + "people_holding_hands_tone1_tone4": "🧑🏻‍🤝‍🧑🏾", + "people_holding_hands_light_skin_tone_medium_dark_skin_tone": "🧑🏻‍🤝‍🧑🏾", + "people_holding_hands_tone1_tone5": "🧑🏻‍🤝‍🧑🏿", + "people_holding_hands_light_skin_tone_dark_skin_tone": "🧑🏻‍🤝‍🧑🏿", + "people_holding_hands_tone2_tone1": "🧑🏼‍🤝‍🧑🏻", + "people_holding_hands_medium_light_skin_tone_light_skin_tone": "🧑🏼‍🤝‍🧑🏻", + "people_holding_hands_tone2": "🧑🏼‍🤝‍🧑🏼", + "people_holding_hands_medium_light_skin_tone": "🧑🏼‍🤝‍🧑🏼", + "people_holding_hands_tone2_tone3": "🧑🏼‍🤝‍🧑🏽", + "people_holding_hands_medium_light_skin_tone_medium_skin_tone": "🧑🏼‍🤝‍🧑🏽", + "people_holding_hands_tone2_tone4": "🧑🏼‍🤝‍🧑🏾", + "people_holding_hands_medium_light_skin_tone_medium_dark_skin_tone": "🧑🏼‍🤝‍🧑🏾", + "people_holding_hands_tone2_tone5": "🧑🏼‍🤝‍🧑🏿", + "people_holding_hands_medium_light_skin_tone_dark_skin_tone": "🧑🏼‍🤝‍🧑🏿", + "people_holding_hands_tone3_tone1": "🧑🏽‍🤝‍🧑🏻", + "people_holding_hands_medium_skin_tone_light_skin_tone": "🧑🏽‍🤝‍🧑🏻", + "people_holding_hands_tone3_tone2": "🧑🏽‍🤝‍🧑🏼", + "people_holding_hands_medium_skin_tone_medium_light_skin_tone": "🧑🏽‍🤝‍🧑🏼", + "people_holding_hands_tone3": "🧑🏽‍🤝‍🧑🏽", + "people_holding_hands_medium_skin_tone": "🧑🏽‍🤝‍🧑🏽", + "people_holding_hands_tone3_tone4": "🧑🏽‍🤝‍🧑🏾", + "people_holding_hands_medium_skin_tone_medium_dark_skin_tone": "🧑🏽‍🤝‍🧑🏾", + "people_holding_hands_tone3_tone5": "🧑🏽‍🤝‍🧑🏿", + "people_holding_hands_medium_skin_tone_dark_skin_tone": "🧑🏽‍🤝‍🧑🏿", + "people_holding_hands_tone4_tone1": "🧑🏾‍🤝‍🧑🏻", + "people_holding_hands_medium_dark_skin_tone_light_skin_tone": "🧑🏾‍🤝‍🧑🏻", + "people_holding_hands_tone4_tone2": "🧑🏾‍🤝‍🧑🏼", + "people_holding_hands_medium_dark_skin_tone_medium_light_skin_tone": "🧑🏾‍🤝‍🧑🏼", + "people_holding_hands_tone4_tone3": "🧑🏾‍🤝‍🧑🏽", + "people_holding_hands_medium_dark_skin_tone_medium_skin_tone": "🧑🏾‍🤝‍🧑🏽", + "people_holding_hands_tone4": "🧑🏾‍🤝‍🧑🏾", + "people_holding_hands_medium_dark_skin_tone": "🧑🏾‍🤝‍🧑🏾", + "people_holding_hands_tone4_tone5": "🧑🏾‍🤝‍🧑🏿", + "people_holding_hands_medium_dark_skin_tone_dark_skin_tone": "🧑🏾‍🤝‍🧑🏿", + "people_holding_hands_tone5_tone1": "🧑🏿‍🤝‍🧑🏻", + "people_holding_hands_dark_skin_tone_light_skin_tone": "🧑🏿‍🤝‍🧑🏻", + "people_holding_hands_tone5_tone2": "🧑🏿‍🤝‍🧑🏼", + "people_holding_hands_dark_skin_tone_medium_light_skin_tone": "🧑🏿‍🤝‍🧑🏼", + "people_holding_hands_tone5_tone3": "🧑🏿‍🤝‍🧑🏽", + "people_holding_hands_dark_skin_tone_medium_skin_tone": "🧑🏿‍🤝‍🧑🏽", + "people_holding_hands_tone5_tone4": "🧑🏿‍🤝‍🧑🏾", + "people_holding_hands_dark_skin_tone_medium_dark_skin_tone": "🧑🏿‍🤝‍🧑🏾", + "people_holding_hands_tone5": "🧑🏿‍🤝‍🧑🏿", + "people_holding_hands_dark_skin_tone": "🧑🏿‍🤝‍🧑🏿", + "couple": "👫", + "woman_and_man_holding_hands_tone1": "👫🏻", + "woman_and_man_holding_hands_light_skin_tone": "👫🏻", + "woman_and_man_holding_hands_tone1_tone2": "👩🏻‍🤝‍👨🏼", + "woman_and_man_holding_hands_light_skin_tone_medium_light_skin_tone": "👩🏻‍🤝‍👨🏼", + "woman_and_man_holding_hands_tone1_tone3": "👩🏻‍🤝‍👨🏽", + "woman_and_man_holding_hands_light_skin_tone_medium_skin_tone": "👩🏻‍🤝‍👨🏽", + "woman_and_man_holding_hands_tone1_tone4": "👩🏻‍🤝‍👨🏾", + "woman_and_man_holding_hands_light_skin_tone_medium_dark_skin_tone": "👩🏻‍🤝‍👨🏾", + "woman_and_man_holding_hands_tone1_tone5": "👩🏻‍🤝‍👨🏿", + "woman_and_man_holding_hands_light_skin_tone_dark_skin_tone": "👩🏻‍🤝‍👨🏿", + "woman_and_man_holding_hands_tone2_tone1": "👩🏼‍🤝‍👨🏻", + "woman_and_man_holding_hands_medium_light_skin_tone_light_skin_tone": "👩🏼‍🤝‍👨🏻", + "woman_and_man_holding_hands_tone2": "👫🏼", + "woman_and_man_holding_hands_medium_light_skin_tone": "👫🏼", + "woman_and_man_holding_hands_tone2_tone3": "👩🏼‍🤝‍👨🏽", + "woman_and_man_holding_hands_medium_light_skin_tone_medium_skin_tone": "👩🏼‍🤝‍👨🏽", + "woman_and_man_holding_hands_tone2_tone4": "👩🏼‍🤝‍👨🏾", + "woman_and_man_holding_hands_medium_light_skin_tone_medium_dark_skin_tone": "👩🏼‍🤝‍👨🏾", + "woman_and_man_holding_hands_tone2_tone5": "👩🏼‍🤝‍👨🏿", + "woman_and_man_holding_hands_medium_light_skin_tone_dark_skin_tone": "👩🏼‍🤝‍👨🏿", + "woman_and_man_holding_hands_tone3_tone1": "👩🏽‍🤝‍👨🏻", + "woman_and_man_holding_hands_medium_skin_tone_light_skin_tone": "👩🏽‍🤝‍👨🏻", + "woman_and_man_holding_hands_tone3_tone2": "👩🏽‍🤝‍👨🏼", + "woman_and_man_holding_hands_medium_skin_tone_medium_light_skin_tone": "👩🏽‍🤝‍👨🏼", + "woman_and_man_holding_hands_tone3": "👫🏽", + "woman_and_man_holding_hands_medium_skin_tone": "👫🏽", + "woman_and_man_holding_hands_tone3_tone4": "👩🏽‍🤝‍👨🏾", + "woman_and_man_holding_hands_medium_skin_tone_medium_dark_skin_tone": "👩🏽‍🤝‍👨🏾", + "woman_and_man_holding_hands_tone3_tone5": "👩🏽‍🤝‍👨🏿", + "woman_and_man_holding_hands_medium_skin_tone_dark_skin_tone": "👩🏽‍🤝‍👨🏿", + "woman_and_man_holding_hands_tone4_tone1": "👩🏾‍🤝‍👨🏻", + "woman_and_man_holding_hands_medium_dark_skin_tone_light_skin_tone": "👩🏾‍🤝‍👨🏻", + "woman_and_man_holding_hands_tone4_tone2": "👩🏾‍🤝‍👨🏼", + "woman_and_man_holding_hands_medium_dark_skin_tone_medium_light_skin_tone": "👩🏾‍🤝‍👨🏼", + "woman_and_man_holding_hands_tone4_tone3": "👩🏾‍🤝‍👨🏽", + "woman_and_man_holding_hands_medium_dark_skin_tone_medium_skin_tone": "👩🏾‍🤝‍👨🏽", + "woman_and_man_holding_hands_tone4": "👫🏾", + "woman_and_man_holding_hands_medium_dark_skin_tone": "👫🏾", + "woman_and_man_holding_hands_tone4_tone5": "👩🏾‍🤝‍👨🏿", + "woman_and_man_holding_hands_medium_dark_skin_tone_dark_skin_tone": "👩🏾‍🤝‍👨🏿", + "woman_and_man_holding_hands_tone5_tone1": "👩🏿‍🤝‍👨🏻", + "woman_and_man_holding_hands_dark_skin_tone_light_skin_tone": "👩🏿‍🤝‍👨🏻", + "woman_and_man_holding_hands_tone5_tone2": "👩🏿‍🤝‍👨🏼", + "woman_and_man_holding_hands_dark_skin_tone_medium_light_skin_tone": "👩🏿‍🤝‍👨🏼", + "woman_and_man_holding_hands_tone5_tone3": "👩🏿‍🤝‍👨🏽", + "woman_and_man_holding_hands_dark_skin_tone_medium_skin_tone": "👩🏿‍🤝‍👨🏽", + "woman_and_man_holding_hands_tone5_tone4": "👩🏿‍🤝‍👨🏾", + "woman_and_man_holding_hands_dark_skin_tone_medium_dark_skin_tone": "👩🏿‍🤝‍👨🏾", + "woman_and_man_holding_hands_tone5": "👫🏿", + "woman_and_man_holding_hands_dark_skin_tone": "👫🏿", + "two_women_holding_hands": "👭", + "women_holding_hands_tone1": "👭🏻", + "women_holding_hands_light_skin_tone": "👭🏻", + "women_holding_hands_tone1_tone2": "👩🏻‍🤝‍👩🏼", + "women_holding_hands_light_skin_tone_medium_light_skin_tone": "👩🏻‍🤝‍👩🏼", + "women_holding_hands_tone1_tone3": "👩🏻‍🤝‍👩🏽", + "women_holding_hands_light_skin_tone_medium_skin_tone": "👩🏻‍🤝‍👩🏽", + "women_holding_hands_tone1_tone4": "👩🏻‍🤝‍👩🏾", + "women_holding_hands_light_skin_tone_medium_dark_skin_tone": "👩🏻‍🤝‍👩🏾", + "women_holding_hands_tone1_tone5": "👩🏻‍🤝‍👩🏿", + "women_holding_hands_light_skin_tone_dark_skin_tone": "👩🏻‍🤝‍👩🏿", + "women_holding_hands_tone2_tone1": "👩🏼‍🤝‍👩🏻", + "women_holding_hands_medium_light_skin_tone_light_skin_tone": "👩🏼‍🤝‍👩🏻", + "women_holding_hands_tone2": "👭🏼", + "women_holding_hands_medium_light_skin_tone": "👭🏼", + "women_holding_hands_tone2_tone3": "👩🏼‍🤝‍👩🏽", + "women_holding_hands_medium_light_skin_tone_medium_skin_tone": "👩🏼‍🤝‍👩🏽", + "women_holding_hands_tone2_tone4": "👩🏼‍🤝‍👩🏾", + "women_holding_hands_medium_light_skin_tone_medium_dark_skin_tone": "👩🏼‍🤝‍👩🏾", + "women_holding_hands_tone2_tone5": "👩🏼‍🤝‍👩🏿", + "women_holding_hands_medium_light_skin_tone_dark_skin_tone": "👩🏼‍🤝‍👩🏿", + "women_holding_hands_tone3_tone1": "👩🏽‍🤝‍👩🏻", + "women_holding_hands_medium_skin_tone_light_skin_tone": "👩🏽‍🤝‍👩🏻", + "women_holding_hands_tone3_tone2": "👩🏽‍🤝‍👩🏼", + "women_holding_hands_medium_skin_tone_medium_light_skin_tone": "👩🏽‍🤝‍👩🏼", + "women_holding_hands_tone3": "👭🏽", + "women_holding_hands_medium_skin_tone": "👭🏽", + "women_holding_hands_tone3_tone4": "👩🏽‍🤝‍👩🏾", + "women_holding_hands_medium_skin_tone_medium_dark_skin_tone": "👩🏽‍🤝‍👩🏾", + "women_holding_hands_tone3_tone5": "👩🏽‍🤝‍👩🏿", + "women_holding_hands_medium_skin_tone_dark_skin_tone": "👩🏽‍🤝‍👩🏿", + "women_holding_hands_tone4_tone1": "👩🏾‍🤝‍👩🏻", + "women_holding_hands_medium_dark_skin_tone_light_skin_tone": "👩🏾‍🤝‍👩🏻", + "women_holding_hands_tone4_tone2": "👩🏾‍🤝‍👩🏼", + "women_holding_hands_medium_dark_skin_tone_medium_light_skin_tone": "👩🏾‍🤝‍👩🏼", + "women_holding_hands_tone4_tone3": "👩🏾‍🤝‍👩🏽", + "women_holding_hands_medium_dark_skin_tone_medium_skin_tone": "👩🏾‍🤝‍👩🏽", + "women_holding_hands_tone4": "👭🏾", + "women_holding_hands_medium_dark_skin_tone": "👭🏾", + "women_holding_hands_tone4_tone5": "👩🏾‍🤝‍👩🏿", + "women_holding_hands_medium_dark_skin_tone_dark_skin_tone": "👩🏾‍🤝‍👩🏿", + "women_holding_hands_tone5_tone1": "👩🏿‍🤝‍👩🏻", + "women_holding_hands_dark_skin_tone_light_skin_tone": "👩🏿‍🤝‍👩🏻", + "women_holding_hands_tone5_tone2": "👩🏿‍🤝‍👩🏼", + "women_holding_hands_dark_skin_tone_medium_light_skin_tone": "👩🏿‍🤝‍👩🏼", + "women_holding_hands_tone5_tone3": "👩🏿‍🤝‍👩🏽", + "women_holding_hands_dark_skin_tone_medium_skin_tone": "👩🏿‍🤝‍👩🏽", + "women_holding_hands_tone5_tone4": "👩🏿‍🤝‍👩🏾", + "women_holding_hands_dark_skin_tone_medium_dark_skin_tone": "👩🏿‍🤝‍👩🏾", + "women_holding_hands_tone5": "👭🏿", + "women_holding_hands_dark_skin_tone": "👭🏿", + "two_men_holding_hands": "👬", + "men_holding_hands_tone1": "👬🏻", + "men_holding_hands_light_skin_tone": "👬🏻", + "men_holding_hands_tone1_tone2": "👨🏻‍🤝‍👨🏼", + "men_holding_hands_light_skin_tone_medium_light_skin_tone": "👨🏻‍🤝‍👨🏼", + "men_holding_hands_tone1_tone3": "👨🏻‍🤝‍👨🏽", + "men_holding_hands_light_skin_tone_medium_skin_tone": "👨🏻‍🤝‍👨🏽", + "men_holding_hands_tone1_tone4": "👨🏻‍🤝‍👨🏾", + "men_holding_hands_light_skin_tone_medium_dark_skin_tone": "👨🏻‍🤝‍👨🏾", + "men_holding_hands_tone1_tone5": "👨🏻‍🤝‍👨🏿", + "men_holding_hands_light_skin_tone_dark_skin_tone": "👨🏻‍🤝‍👨🏿", + "men_holding_hands_tone2_tone1": "👨🏼‍🤝‍👨🏻", + "men_holding_hands_medium_light_skin_tone_light_skin_tone": "👨🏼‍🤝‍👨🏻", + "men_holding_hands_tone2": "👬🏼", + "men_holding_hands_medium_light_skin_tone": "👬🏼", + "men_holding_hands_tone2_tone3": "👨🏼‍🤝‍👨🏽", + "men_holding_hands_medium_light_skin_tone_medium_skin_tone": "👨🏼‍🤝‍👨🏽", + "men_holding_hands_tone2_tone4": "👨🏼‍🤝‍👨🏾", + "men_holding_hands_medium_light_skin_tone_medium_dark_skin_tone": "👨🏼‍🤝‍👨🏾", + "men_holding_hands_tone2_tone5": "👨🏼‍🤝‍👨🏿", + "men_holding_hands_medium_light_skin_tone_dark_skin_tone": "👨🏼‍🤝‍👨🏿", + "men_holding_hands_tone3_tone1": "👨🏽‍🤝‍👨🏻", + "men_holding_hands_medium_skin_tone_light_skin_tone": "👨🏽‍🤝‍👨🏻", + "men_holding_hands_tone3_tone2": "👨🏽‍🤝‍👨🏼", + "men_holding_hands_medium_skin_tone_medium_light_skin_tone": "👨🏽‍🤝‍👨🏼", + "men_holding_hands_tone3": "👬🏽", + "men_holding_hands_medium_skin_tone": "👬🏽", + "men_holding_hands_tone3_tone4": "👨🏽‍🤝‍👨🏾", + "men_holding_hands_medium_skin_tone_medium_dark_skin_tone": "👨🏽‍🤝‍👨🏾", + "men_holding_hands_tone3_tone5": "👨🏽‍🤝‍👨🏿", + "men_holding_hands_medium_skin_tone_dark_skin_tone": "👨🏽‍🤝‍👨🏿", + "men_holding_hands_tone4_tone1": "👨🏾‍🤝‍👨🏻", + "men_holding_hands_medium_dark_skin_tone_light_skin_tone": "👨🏾‍🤝‍👨🏻", + "men_holding_hands_tone4_tone2": "👨🏾‍🤝‍👨🏼", + "men_holding_hands_medium_dark_skin_tone_medium_light_skin_tone": "👨🏾‍🤝‍👨🏼", + "men_holding_hands_tone4_tone3": "👨🏾‍🤝‍👨🏽", + "men_holding_hands_medium_dark_skin_tone_medium_skin_tone": "👨🏾‍🤝‍👨🏽", + "men_holding_hands_tone4": "👬🏾", + "men_holding_hands_medium_dark_skin_tone": "👬🏾", + "men_holding_hands_tone4_tone5": "👨🏾‍🤝‍👨🏿", + "men_holding_hands_medium_dark_skin_tone_dark_skin_tone": "👨🏾‍🤝‍👨🏿", + "men_holding_hands_tone5_tone1": "👨🏿‍🤝‍👨🏻", + "men_holding_hands_dark_skin_tone_light_skin_tone": "👨🏿‍🤝‍👨🏻", + "men_holding_hands_tone5_tone2": "👨🏿‍🤝‍👨🏼", + "men_holding_hands_dark_skin_tone_medium_light_skin_tone": "👨🏿‍🤝‍👨🏼", + "men_holding_hands_tone5_tone3": "👨🏿‍🤝‍👨🏽", + "men_holding_hands_dark_skin_tone_medium_skin_tone": "👨🏿‍🤝‍👨🏽", + "men_holding_hands_tone5_tone4": "👨🏿‍🤝‍👨🏾", + "men_holding_hands_dark_skin_tone_medium_dark_skin_tone": "👨🏿‍🤝‍👨🏾", + "men_holding_hands_tone5": "👬🏿", + "men_holding_hands_dark_skin_tone": "👬🏿", + "couple_with_heart": "💑", + "couple_with_heart_tone1": "💑🏻", + "couple_with_heart_light_skin_tone": "💑🏻", + "couple_with_heart_person_person_tone1_tone2": "🧑🏻‍❤️‍🧑🏼", + "couple_with_heart_person_person_light_skin_tone_medium_light_skin_tone": "🧑🏻‍❤️‍🧑🏼", + "couple_with_heart_person_person_tone1_tone3": "🧑🏻‍❤️‍🧑🏽", + "couple_with_heart_person_person_light_skin_tone_medium_skin_tone": "🧑🏻‍❤️‍🧑🏽", + "couple_with_heart_person_person_tone1_tone4": "🧑🏻‍❤️‍🧑🏾", + "couple_with_heart_person_person_light_skin_tone_medium_dark_skin_tone": "🧑🏻‍❤️‍🧑🏾", + "couple_with_heart_person_person_tone1_tone5": "🧑🏻‍❤️‍🧑🏿", + "couple_with_heart_person_person_light_skin_tone_dark_skin_tone": "🧑🏻‍❤️‍🧑🏿", + "couple_with_heart_person_person_tone2_tone1": "🧑🏼‍❤️‍🧑🏻", + "couple_with_heart_person_person_medium_light_skin_tone_light_skin_tone": "🧑🏼‍❤️‍🧑🏻", + "couple_with_heart_tone2": "💑🏼", + "couple_with_heart_medium_light_skin_tone": "💑🏼", + "couple_with_heart_person_person_tone2_tone3": "🧑🏼‍❤️‍🧑🏽", + "couple_with_heart_person_person_medium_light_skin_tone_medium_skin_tone": "🧑🏼‍❤️‍🧑🏽", + "couple_with_heart_person_person_tone2_tone4": "🧑🏼‍❤️‍🧑🏾", + "couple_with_heart_person_person_medium_light_skin_tone_medium_dark_skin_tone": "🧑🏼‍❤️‍🧑🏾", + "couple_with_heart_person_person_tone2_tone5": "🧑🏼‍❤️‍🧑🏿", + "couple_with_heart_person_person_medium_light_skin_tone_dark_skin_tone": "🧑🏼‍❤️‍🧑🏿", + "couple_with_heart_person_person_tone3_tone1": "🧑🏽‍❤️‍🧑🏻", + "couple_with_heart_person_person_medium_skin_tone_light_skin_tone": "🧑🏽‍❤️‍🧑🏻", + "couple_with_heart_person_person_tone3_tone2": "🧑🏽‍❤️‍🧑🏼", + "couple_with_heart_person_person_medium_skin_tone_medium_light_skin_tone": "🧑🏽‍❤️‍🧑🏼", + "couple_with_heart_tone3": "💑🏽", + "couple_with_heart_medium_skin_tone": "💑🏽", + "couple_with_heart_person_person_tone3_tone4": "🧑🏽‍❤️‍🧑🏾", + "couple_with_heart_person_person_medium_skin_tone_medium_dark_skin_tone": "🧑🏽‍❤️‍🧑🏾", + "couple_with_heart_person_person_tone3_tone5": "🧑🏽‍❤️‍🧑🏿", + "couple_with_heart_person_person_medium_skin_tone_dark_skin_tone": "🧑🏽‍❤️‍🧑🏿", + "couple_with_heart_person_person_tone4_tone1": "🧑🏾‍❤️‍🧑🏻", + "couple_with_heart_person_person_medium_dark_skin_tone_light_skin_tone": "🧑🏾‍❤️‍🧑🏻", + "couple_with_heart_person_person_tone4_tone2": "🧑🏾‍❤️‍🧑🏼", + "couple_with_heart_person_person_medium_dark_skin_tone_medium_light_skin_tone": "🧑🏾‍❤️‍🧑🏼", + "couple_with_heart_person_person_tone4_tone3": "🧑🏾‍❤️‍🧑🏽", + "couple_with_heart_person_person_medium_dark_skin_tone_medium_skin_tone": "🧑🏾‍❤️‍🧑🏽", + "couple_with_heart_tone4": "💑🏾", + "couple_with_heart_medium_dark_skin_tone": "💑🏾", + "couple_with_heart_person_person_tone4_tone5": "🧑🏾‍❤️‍🧑🏿", + "couple_with_heart_person_person_medium_dark_skin_tone_dark_skin_tone": "🧑🏾‍❤️‍🧑🏿", + "couple_with_heart_person_person_tone5_tone1": "🧑🏿‍❤️‍🧑🏻", + "couple_with_heart_person_person_dark_skin_tone_light_skin_tone": "🧑🏿‍❤️‍🧑🏻", + "couple_with_heart_person_person_tone5_tone2": "🧑🏿‍❤️‍🧑🏼", + "couple_with_heart_person_person_dark_skin_tone_medium_light_skin_tone": "🧑🏿‍❤️‍🧑🏼", + "couple_with_heart_person_person_tone5_tone3": "🧑🏿‍❤️‍🧑🏽", + "couple_with_heart_person_person_dark_skin_tone_medium_skin_tone": "🧑🏿‍❤️‍🧑🏽", + "couple_with_heart_person_person_tone5_tone4": "🧑🏿‍❤️‍🧑🏾", + "couple_with_heart_person_person_dark_skin_tone_medium_dark_skin_tone": "🧑🏿‍❤️‍🧑🏾", + "couple_with_heart_tone5": "💑🏿", + "couple_with_heart_dark_skin_tone": "💑🏿", + "couple_with_heart_woman_man": "👩‍❤️‍👨", + "couple_with_heart_woman_man_tone1": "👩🏻‍❤️‍👨🏻", + "couple_with_heart_woman_man_light_skin_tone": "👩🏻‍❤️‍👨🏻", + "couple_with_heart_woman_man_tone1_tone2": "👩🏻‍❤️‍👨🏼", + "couple_with_heart_woman_man_light_skin_tone_medium_light_skin_tone": "👩🏻‍❤️‍👨🏼", + "couple_with_heart_woman_man_tone1_tone3": "👩🏻‍❤️‍👨🏽", + "couple_with_heart_woman_man_light_skin_tone_medium_skin_tone": "👩🏻‍❤️‍👨🏽", + "couple_with_heart_woman_man_tone1_tone4": "👩🏻‍❤️‍👨🏾", + "couple_with_heart_woman_man_light_skin_tone_medium_dark_skin_tone": "👩🏻‍❤️‍👨🏾", + "couple_with_heart_woman_man_tone1_tone5": "👩🏻‍❤️‍👨🏿", + "couple_with_heart_woman_man_light_skin_tone_dark_skin_tone": "👩🏻‍❤️‍👨🏿", + "couple_with_heart_woman_man_tone2_tone1": "👩🏼‍❤️‍👨🏻", + "couple_with_heart_woman_man_medium_light_skin_tone_light_skin_tone": "👩🏼‍❤️‍👨🏻", + "couple_with_heart_woman_man_tone2": "👩🏼‍❤️‍👨🏼", + "couple_with_heart_woman_man_medium_light_skin_tone": "👩🏼‍❤️‍👨🏼", + "couple_with_heart_woman_man_tone2_tone3": "👩🏼‍❤️‍👨🏽", + "couple_with_heart_woman_man_medium_light_skin_tone_medium_skin_tone": "👩🏼‍❤️‍👨🏽", + "couple_with_heart_woman_man_tone2_tone4": "👩🏼‍❤️‍👨🏾", + "couple_with_heart_woman_man_medium_light_skin_tone_medium_dark_skin_tone": "👩🏼‍❤️‍👨🏾", + "couple_with_heart_woman_man_tone2_tone5": "👩🏼‍❤️‍👨🏿", + "couple_with_heart_woman_man_medium_light_skin_tone_dark_skin_tone": "👩🏼‍❤️‍👨🏿", + "couple_with_heart_woman_man_tone3_tone1": "👩🏽‍❤️‍👨🏻", + "couple_with_heart_woman_man_medium_skin_tone_light_skin_tone": "👩🏽‍❤️‍👨🏻", + "couple_with_heart_woman_man_tone3_tone2": "👩🏽‍❤️‍👨🏼", + "couple_with_heart_woman_man_medium_skin_tone_medium_light_skin_tone": "👩🏽‍❤️‍👨🏼", + "couple_with_heart_woman_man_tone3": "👩🏽‍❤️‍👨🏽", + "couple_with_heart_woman_man_medium_skin_tone": "👩🏽‍❤️‍👨🏽", + "couple_with_heart_woman_man_tone3_tone4": "👩🏽‍❤️‍👨🏾", + "couple_with_heart_woman_man_medium_skin_tone_medium_dark_skin_tone": "👩🏽‍❤️‍👨🏾", + "couple_with_heart_woman_man_tone3_tone5": "👩🏽‍❤️‍👨🏿", + "couple_with_heart_woman_man_medium_skin_tone_dark_skin_tone": "👩🏽‍❤️‍👨🏿", + "couple_with_heart_woman_man_tone4_tone1": "👩🏾‍❤️‍👨🏻", + "couple_with_heart_woman_man_medium_dark_skin_tone_light_skin_tone": "👩🏾‍❤️‍👨🏻", + "couple_with_heart_woman_man_tone4_tone2": "👩🏾‍❤️‍👨🏼", + "couple_with_heart_woman_man_medium_dark_skin_tone_medium_light_skin_tone": "👩🏾‍❤️‍👨🏼", + "couple_with_heart_woman_man_tone4_tone3": "👩🏾‍❤️‍👨🏽", + "couple_with_heart_woman_man_medium_dark_skin_tone_medium_skin_tone": "👩🏾‍❤️‍👨🏽", + "couple_with_heart_woman_man_tone4": "👩🏾‍❤️‍👨🏾", + "couple_with_heart_woman_man_medium_dark_skin_tone": "👩🏾‍❤️‍👨🏾", + "couple_with_heart_woman_man_tone4_tone5": "👩🏾‍❤️‍👨🏿", + "couple_with_heart_woman_man_medium_dark_skin_tone_dark_skin_tone": "👩🏾‍❤️‍👨🏿", + "couple_with_heart_woman_man_tone5_tone1": "👩🏿‍❤️‍👨🏻", + "couple_with_heart_woman_man_dark_skin_tone_light_skin_tone": "👩🏿‍❤️‍👨🏻", + "couple_with_heart_woman_man_tone5_tone2": "👩🏿‍❤️‍👨🏼", + "couple_with_heart_woman_man_dark_skin_tone_medium_light_skin_tone": "👩🏿‍❤️‍👨🏼", + "couple_with_heart_woman_man_tone5_tone3": "👩🏿‍❤️‍👨🏽", + "couple_with_heart_woman_man_dark_skin_tone_medium_skin_tone": "👩🏿‍❤️‍👨🏽", + "couple_with_heart_woman_man_tone5_tone4": "👩🏿‍❤️‍👨🏾", + "couple_with_heart_woman_man_dark_skin_tone_medium_dark_skin_tone": "👩🏿‍❤️‍👨🏾", + "couple_with_heart_woman_man_tone5": "👩🏿‍❤️‍👨🏿", + "couple_with_heart_woman_man_dark_skin_tone": "👩🏿‍❤️‍👨🏿", + "couple_ww": "👩‍❤️‍👩", + "couple_with_heart_ww": "👩‍❤️‍👩", + "couple_with_heart_woman_woman_tone1": "👩🏻‍❤️‍👩🏻", + "couple_with_heart_woman_woman_light_skin_tone": "👩🏻‍❤️‍👩🏻", + "couple_with_heart_woman_woman_tone1_tone2": "👩🏻‍❤️‍👩🏼", + "couple_with_heart_woman_woman_light_skin_tone_medium_light_skin_tone": "👩🏻‍❤️‍👩🏼", + "couple_with_heart_woman_woman_tone1_tone3": "👩🏻‍❤️‍👩🏽", + "couple_with_heart_woman_woman_light_skin_tone_medium_skin_tone": "👩🏻‍❤️‍👩🏽", + "couple_with_heart_woman_woman_tone1_tone4": "👩🏻‍❤️‍👩🏾", + "couple_with_heart_woman_woman_light_skin_tone_medium_dark_skin_tone": "👩🏻‍❤️‍👩🏾", + "couple_with_heart_woman_woman_tone1_tone5": "👩🏻‍❤️‍👩🏿", + "couple_with_heart_woman_woman_light_skin_tone_dark_skin_tone": "👩🏻‍❤️‍👩🏿", + "couple_with_heart_woman_woman_tone2_tone1": "👩🏼‍❤️‍👩🏻", + "couple_with_heart_woman_woman_medium_light_skin_tone_light_skin_tone": "👩🏼‍❤️‍👩🏻", + "couple_with_heart_woman_woman_tone2": "👩🏼‍❤️‍👩🏼", + "couple_with_heart_woman_woman_medium_light_skin_tone": "👩🏼‍❤️‍👩🏼", + "couple_with_heart_woman_woman_tone2_tone3": "👩🏼‍❤️‍👩🏽", + "couple_with_heart_woman_woman_medium_light_skin_tone_medium_skin_tone": "👩🏼‍❤️‍👩🏽", + "couple_with_heart_woman_woman_tone2_tone4": "👩🏼‍❤️‍👩🏾", + "couple_with_heart_woman_woman_medium_light_skin_tone_medium_dark_skin_tone": "👩🏼‍❤️‍👩🏾", + "couple_with_heart_woman_woman_tone2_tone5": "👩🏼‍❤️‍👩🏿", + "couple_with_heart_woman_woman_medium_light_skin_tone_dark_skin_tone": "👩🏼‍❤️‍👩🏿", + "couple_with_heart_woman_woman_tone3_tone1": "👩🏽‍❤️‍👩🏻", + "couple_with_heart_woman_woman_medium_skin_tone_light_skin_tone": "👩🏽‍❤️‍👩🏻", + "couple_with_heart_woman_woman_tone3_tone2": "👩🏽‍❤️‍👩🏼", + "couple_with_heart_woman_woman_medium_skin_tone_medium_light_skin_tone": "👩🏽‍❤️‍👩🏼", + "couple_with_heart_woman_woman_tone3": "👩🏽‍❤️‍👩🏽", + "couple_with_heart_woman_woman_medium_skin_tone": "👩🏽‍❤️‍👩🏽", + "couple_with_heart_woman_woman_tone3_tone4": "👩🏽‍❤️‍👩🏾", + "couple_with_heart_woman_woman_medium_skin_tone_medium_dark_skin_tone": "👩🏽‍❤️‍👩🏾", + "couple_with_heart_woman_woman_tone3_tone5": "👩🏽‍❤️‍👩🏿", + "couple_with_heart_woman_woman_medium_skin_tone_dark_skin_tone": "👩🏽‍❤️‍👩🏿", + "couple_with_heart_woman_woman_tone4_tone1": "👩🏾‍❤️‍👩🏻", + "couple_with_heart_woman_woman_medium_dark_skin_tone_light_skin_tone": "👩🏾‍❤️‍👩🏻", + "couple_with_heart_woman_woman_tone4_tone2": "👩🏾‍❤️‍👩🏼", + "couple_with_heart_woman_woman_medium_dark_skin_tone_medium_light_skin_tone": "👩🏾‍❤️‍👩🏼", + "couple_with_heart_woman_woman_tone4_tone3": "👩🏾‍❤️‍👩🏽", + "couple_with_heart_woman_woman_medium_dark_skin_tone_medium_skin_tone": "👩🏾‍❤️‍👩🏽", + "couple_with_heart_woman_woman_tone4": "👩🏾‍❤️‍👩🏾", + "couple_with_heart_woman_woman_medium_dark_skin_tone": "👩🏾‍❤️‍👩🏾", + "couple_with_heart_woman_woman_tone4_tone5": "👩🏾‍❤️‍👩🏿", + "couple_with_heart_woman_woman_medium_dark_skin_tone_dark_skin_tone": "👩🏾‍❤️‍👩🏿", + "couple_with_heart_woman_woman_tone5_tone1": "👩🏿‍❤️‍👩🏻", + "couple_with_heart_woman_woman_dark_skin_tone_light_skin_tone": "👩🏿‍❤️‍👩🏻", + "couple_with_heart_woman_woman_tone5_tone2": "👩🏿‍❤️‍👩🏼", + "couple_with_heart_woman_woman_dark_skin_tone_medium_light_skin_tone": "👩🏿‍❤️‍👩🏼", + "couple_with_heart_woman_woman_tone5_tone3": "👩🏿‍❤️‍👩🏽", + "couple_with_heart_woman_woman_dark_skin_tone_medium_skin_tone": "👩🏿‍❤️‍👩🏽", + "couple_with_heart_woman_woman_tone5_tone4": "👩🏿‍❤️‍👩🏾", + "couple_with_heart_woman_woman_dark_skin_tone_medium_dark_skin_tone": "👩🏿‍❤️‍👩🏾", + "couple_with_heart_woman_woman_tone5": "👩🏿‍❤️‍👩🏿", + "couple_with_heart_woman_woman_dark_skin_tone": "👩🏿‍❤️‍👩🏿", + "couple_mm": "👨‍❤️‍👨", + "couple_with_heart_mm": "👨‍❤️‍👨", + "couple_with_heart_man_man_tone1": "👨🏻‍❤️‍👨🏻", + "couple_with_heart_man_man_light_skin_tone": "👨🏻‍❤️‍👨🏻", + "couple_with_heart_man_man_tone1_tone2": "👨🏻‍❤️‍👨🏼", + "couple_with_heart_man_man_light_skin_tone_medium_light_skin_tone": "👨🏻‍❤️‍👨🏼", + "couple_with_heart_man_man_tone1_tone3": "👨🏻‍❤️‍👨🏽", + "couple_with_heart_man_man_light_skin_tone_medium_skin_tone": "👨🏻‍❤️‍👨🏽", + "couple_with_heart_man_man_tone1_tone4": "👨🏻‍❤️‍👨🏾", + "couple_with_heart_man_man_light_skin_tone_medium_dark_skin_tone": "👨🏻‍❤️‍👨🏾", + "couple_with_heart_man_man_tone1_tone5": "👨🏻‍❤️‍👨🏿", + "couple_with_heart_man_man_light_skin_tone_dark_skin_tone": "👨🏻‍❤️‍👨🏿", + "couple_with_heart_man_man_tone2_tone1": "👨🏼‍❤️‍👨🏻", + "couple_with_heart_man_man_medium_light_skin_tone_light_skin_tone": "👨🏼‍❤️‍👨🏻", + "couple_with_heart_man_man_tone2": "👨🏼‍❤️‍👨🏼", + "couple_with_heart_man_man_medium_light_skin_tone": "👨🏼‍❤️‍👨🏼", + "couple_with_heart_man_man_tone2_tone3": "👨🏼‍❤️‍👨🏽", + "couple_with_heart_man_man_medium_light_skin_tone_medium_skin_tone": "👨🏼‍❤️‍👨🏽", + "couple_with_heart_man_man_tone2_tone4": "👨🏼‍❤️‍👨🏾", + "couple_with_heart_man_man_medium_light_skin_tone_medium_dark_skin_tone": "👨🏼‍❤️‍👨🏾", + "couple_with_heart_man_man_tone2_tone5": "👨🏼‍❤️‍👨🏿", + "couple_with_heart_man_man_medium_light_skin_tone_dark_skin_tone": "👨🏼‍❤️‍👨🏿", + "couple_with_heart_man_man_tone3_tone1": "👨🏽‍❤️‍👨🏻", + "couple_with_heart_man_man_medium_skin_tone_light_skin_tone": "👨🏽‍❤️‍👨🏻", + "couple_with_heart_man_man_tone3_tone2": "👨🏽‍❤️‍👨🏼", + "couple_with_heart_man_man_medium_skin_tone_medium_light_skin_tone": "👨🏽‍❤️‍👨🏼", + "couple_with_heart_man_man_tone3": "👨🏽‍❤️‍👨🏽", + "couple_with_heart_man_man_medium_skin_tone": "👨🏽‍❤️‍👨🏽", + "couple_with_heart_man_man_tone3_tone4": "👨🏽‍❤️‍👨🏾", + "couple_with_heart_man_man_medium_skin_tone_medium_dark_skin_tone": "👨🏽‍❤️‍👨🏾", + "couple_with_heart_man_man_tone3_tone5": "👨🏽‍❤️‍👨🏿", + "couple_with_heart_man_man_medium_skin_tone_dark_skin_tone": "👨🏽‍❤️‍👨🏿", + "couple_with_heart_man_man_tone4_tone1": "👨🏾‍❤️‍👨🏻", + "couple_with_heart_man_man_medium_dark_skin_tone_light_skin_tone": "👨🏾‍❤️‍👨🏻", + "couple_with_heart_man_man_tone4_tone2": "👨🏾‍❤️‍👨🏼", + "couple_with_heart_man_man_medium_dark_skin_tone_medium_light_skin_tone": "👨🏾‍❤️‍👨🏼", + "couple_with_heart_man_man_tone4_tone3": "👨🏾‍❤️‍👨🏽", + "couple_with_heart_man_man_medium_dark_skin_tone_medium_skin_tone": "👨🏾‍❤️‍👨🏽", + "couple_with_heart_man_man_tone4": "👨🏾‍❤️‍👨🏾", + "couple_with_heart_man_man_medium_dark_skin_tone": "👨🏾‍❤️‍👨🏾", + "couple_with_heart_man_man_tone4_tone5": "👨🏾‍❤️‍👨🏿", + "couple_with_heart_man_man_medium_dark_skin_tone_dark_skin_tone": "👨🏾‍❤️‍👨🏿", + "couple_with_heart_man_man_tone5_tone1": "👨🏿‍❤️‍👨🏻", + "couple_with_heart_man_man_dark_skin_tone_light_skin_tone": "👨🏿‍❤️‍👨🏻", + "couple_with_heart_man_man_tone5_tone2": "👨🏿‍❤️‍👨🏼", + "couple_with_heart_man_man_dark_skin_tone_medium_light_skin_tone": "👨🏿‍❤️‍👨🏼", + "couple_with_heart_man_man_tone5_tone3": "👨🏿‍❤️‍👨🏽", + "couple_with_heart_man_man_dark_skin_tone_medium_skin_tone": "👨🏿‍❤️‍👨🏽", + "couple_with_heart_man_man_tone5_tone4": "👨🏿‍❤️‍👨🏾", + "couple_with_heart_man_man_dark_skin_tone_medium_dark_skin_tone": "👨🏿‍❤️‍👨🏾", + "couple_with_heart_man_man_tone5": "👨🏿‍❤️‍👨🏿", + "couple_with_heart_man_man_dark_skin_tone": "👨🏿‍❤️‍👨🏿", + "couplekiss": "💏", + "kiss_person_person_tone5_tone4": "🧑🏿‍❤️‍💋‍🧑🏾", + "kiss_person_person_dark_skin_tone_medium_dark_skin_tone": "🧑🏿‍❤️‍💋‍🧑🏾", + "kiss_tone1": "💏🏻", + "kiss_light_skin_tone": "💏🏻", + "kiss_person_person_tone1_tone2": "🧑🏻‍❤️‍💋‍🧑🏼", + "kiss_person_person_light_skin_tone_medium_light_skin_tone": "🧑🏻‍❤️‍💋‍🧑🏼", + "kiss_person_person_tone1_tone3": "🧑🏻‍❤️‍💋‍🧑🏽", + "kiss_person_person_light_skin_tone_medium_skin_tone": "🧑🏻‍❤️‍💋‍🧑🏽", + "kiss_person_person_tone1_tone4": "🧑🏻‍❤️‍💋‍🧑🏾", + "kiss_person_person_light_skin_tone_medium_dark_skin_tone": "🧑🏻‍❤️‍💋‍🧑🏾", + "kiss_person_person_tone1_tone5": "🧑🏻‍❤️‍💋‍🧑🏿", + "kiss_person_person_light_skin_tone_dark_skin_tone": "🧑🏻‍❤️‍💋‍🧑🏿", + "kiss_person_person_tone2_tone1": "🧑🏼‍❤️‍💋‍🧑🏻", + "kiss_person_person_medium_light_skin_tone_light_skin_tone": "🧑🏼‍❤️‍💋‍🧑🏻", + "kiss_tone2": "💏🏼", + "kiss_medium_light_skin_tone": "💏🏼", + "kiss_person_person_tone2_tone3": "🧑🏼‍❤️‍💋‍🧑🏽", + "kiss_person_person_medium_light_skin_tone_medium_skin_tone": "🧑🏼‍❤️‍💋‍🧑🏽", + "kiss_person_person_tone2_tone4": "🧑🏼‍❤️‍💋‍🧑🏾", + "kiss_person_person_medium_light_skin_tone_medium_dark_skin_tone": "🧑🏼‍❤️‍💋‍🧑🏾", + "kiss_person_person_tone2_tone5": "🧑🏼‍❤️‍💋‍🧑🏿", + "kiss_person_person_medium_light_skin_tone_dark_skin_tone": "🧑🏼‍❤️‍💋‍🧑🏿", + "kiss_person_person_tone3_tone1": "🧑🏽‍❤️‍💋‍🧑🏻", + "kiss_person_person_medium_skin_tone_light_skin_tone": "🧑🏽‍❤️‍💋‍🧑🏻", + "kiss_person_person_tone3_tone2": "🧑🏽‍❤️‍💋‍🧑🏼", + "kiss_person_person_medium_skin_tone_medium_light_skin_tone": "🧑🏽‍❤️‍💋‍🧑🏼", + "kiss_tone3": "💏🏽", + "kiss_medium_skin_tone": "💏🏽", + "kiss_person_person_tone3_tone4": "🧑🏽‍❤️‍💋‍🧑🏾", + "kiss_person_person_medium_skin_tone_medium_dark_skin_tone": "🧑🏽‍❤️‍💋‍🧑🏾", + "kiss_person_person_tone3_tone5": "🧑🏽‍❤️‍💋‍🧑🏿", + "kiss_person_person_medium_skin_tone_dark_skin_tone": "🧑🏽‍❤️‍💋‍🧑🏿", + "kiss_person_person_tone4_tone1": "🧑🏾‍❤️‍💋‍🧑🏻", + "kiss_person_person_medium_dark_skin_tone_light_skin_tone": "🧑🏾‍❤️‍💋‍🧑🏻", + "kiss_person_person_tone4_tone2": "🧑🏾‍❤️‍💋‍🧑🏼", + "kiss_person_person_medium_dark_skin_tone_medium_light_skin_tone": "🧑🏾‍❤️‍💋‍🧑🏼", + "kiss_person_person_tone4_tone3": "🧑🏾‍❤️‍💋‍🧑🏽", + "kiss_person_person_medium_dark_skin_tone_medium_skin_tone": "🧑🏾‍❤️‍💋‍🧑🏽", + "kiss_tone4": "💏🏾", + "kiss_medium_dark_skin_tone": "💏🏾", + "kiss_person_person_tone4_tone5": "🧑🏾‍❤️‍💋‍🧑🏿", + "kiss_person_person_medium_dark_skin_tone_dark_skin_tone": "🧑🏾‍❤️‍💋‍🧑🏿", + "kiss_person_person_tone5_tone1": "🧑🏿‍❤️‍💋‍🧑🏻", + "kiss_person_person_dark_skin_tone_light_skin_tone": "🧑🏿‍❤️‍💋‍🧑🏻", + "kiss_person_person_tone5_tone2": "🧑🏿‍❤️‍💋‍🧑🏼", + "kiss_person_person_dark_skin_tone_medium_light_skin_tone": "🧑🏿‍❤️‍💋‍🧑🏼", + "kiss_person_person_tone5_tone3": "🧑🏿‍❤️‍💋‍🧑🏽", + "kiss_person_person_dark_skin_tone_medium_skin_tone": "🧑🏿‍❤️‍💋‍🧑🏽", + "kiss_tone5": "💏🏿", + "kiss_dark_skin_tone": "💏🏿", + "kiss_woman_man": "👩‍❤️‍💋‍👨", + "kiss_woman_man_tone1": "👩🏻‍❤️‍💋‍👨🏻", + "kiss_woman_man_light_skin_tone": "👩🏻‍❤️‍💋‍👨🏻", + "kiss_woman_man_tone1_tone2": "👩🏻‍❤️‍💋‍👨🏼", + "kiss_woman_man_light_skin_tone_medium_light_skin_tone": "👩🏻‍❤️‍💋‍👨🏼", + "kiss_woman_man_tone1_tone3": "👩🏻‍❤️‍💋‍👨🏽", + "kiss_woman_man_light_skin_tone_medium_skin_tone": "👩🏻‍❤️‍💋‍👨🏽", + "kiss_woman_man_tone1_tone4": "👩🏻‍❤️‍💋‍👨🏾", + "kiss_woman_man_light_skin_tone_medium_dark_skin_tone": "👩🏻‍❤️‍💋‍👨🏾", + "kiss_woman_man_tone1_tone5": "👩🏻‍❤️‍💋‍👨🏿", + "kiss_woman_man_light_skin_tone_dark_skin_tone": "👩🏻‍❤️‍💋‍👨🏿", + "kiss_woman_man_tone2_tone1": "👩🏼‍❤️‍💋‍👨🏻", + "kiss_woman_man_medium_light_skin_tone_light_skin_tone": "👩🏼‍❤️‍💋‍👨🏻", + "kiss_woman_man_tone2": "👩🏼‍❤️‍💋‍👨🏼", + "kiss_woman_man_medium_light_skin_tone": "👩🏼‍❤️‍💋‍👨🏼", + "kiss_woman_man_tone2_tone3": "👩🏼‍❤️‍💋‍👨🏽", + "kiss_woman_man_medium_light_skin_tone_medium_skin_tone": "👩🏼‍❤️‍💋‍👨🏽", + "kiss_woman_man_tone2_tone4": "👩🏼‍❤️‍💋‍👨🏾", + "kiss_woman_man_medium_light_skin_tone_medium_dark_skin_tone": "👩🏼‍❤️‍💋‍👨🏾", + "kiss_woman_man_tone2_tone5": "👩🏼‍❤️‍💋‍👨🏿", + "kiss_woman_man_medium_light_skin_tone_dark_skin_tone": "👩🏼‍❤️‍💋‍👨🏿", + "kiss_woman_man_tone3_tone1": "👩🏽‍❤️‍💋‍👨🏻", + "kiss_woman_man_medium_skin_tone_light_skin_tone": "👩🏽‍❤️‍💋‍👨🏻", + "kiss_woman_man_tone3_tone2": "👩🏽‍❤️‍💋‍👨🏼", + "kiss_woman_man_medium_skin_tone_medium_light_skin_tone": "👩🏽‍❤️‍💋‍👨🏼", + "kiss_woman_man_tone3": "👩🏽‍❤️‍💋‍👨🏽", + "kiss_woman_man_medium_skin_tone": "👩🏽‍❤️‍💋‍👨🏽", + "kiss_woman_man_tone3_tone4": "👩🏽‍❤️‍💋‍👨🏾", + "kiss_woman_man_medium_skin_tone_medium_dark_skin_tone": "👩🏽‍❤️‍💋‍👨🏾", + "kiss_woman_man_tone3_tone5": "👩🏽‍❤️‍💋‍👨🏿", + "kiss_woman_man_medium_skin_tone_dark_skin_tone": "👩🏽‍❤️‍💋‍👨🏿", + "kiss_woman_man_tone4_tone1": "👩🏾‍❤️‍💋‍👨🏻", + "kiss_woman_man_medium_dark_skin_tone_light_skin_tone": "👩🏾‍❤️‍💋‍👨🏻", + "kiss_woman_man_tone4_tone2": "👩🏾‍❤️‍💋‍👨🏼", + "kiss_woman_man_medium_dark_skin_tone_medium_light_skin_tone": "👩🏾‍❤️‍💋‍👨🏼", + "kiss_woman_man_tone4_tone3": "👩🏾‍❤️‍💋‍👨🏽", + "kiss_woman_man_medium_dark_skin_tone_medium_skin_tone": "👩🏾‍❤️‍💋‍👨🏽", + "kiss_woman_man_tone4": "👩🏾‍❤️‍💋‍👨🏾", + "kiss_woman_man_medium_dark_skin_tone": "👩🏾‍❤️‍💋‍👨🏾", + "kiss_woman_man_tone4_tone5": "👩🏾‍❤️‍💋‍👨🏿", + "kiss_woman_man_medium_dark_skin_tone_dark_skin_tone": "👩🏾‍❤️‍💋‍👨🏿", + "kiss_woman_man_tone5_tone1": "👩🏿‍❤️‍💋‍👨🏻", + "kiss_woman_man_dark_skin_tone_light_skin_tone": "👩🏿‍❤️‍💋‍👨🏻", + "kiss_woman_man_tone5_tone2": "👩🏿‍❤️‍💋‍👨🏼", + "kiss_woman_man_dark_skin_tone_medium_light_skin_tone": "👩🏿‍❤️‍💋‍👨🏼", + "kiss_woman_man_tone5_tone3": "👩🏿‍❤️‍💋‍👨🏽", + "kiss_woman_man_dark_skin_tone_medium_skin_tone": "👩🏿‍❤️‍💋‍👨🏽", + "kiss_woman_man_tone5_tone4": "👩🏿‍❤️‍💋‍👨🏾", + "kiss_woman_man_dark_skin_tone_medium_dark_skin_tone": "👩🏿‍❤️‍💋‍👨🏾", + "kiss_woman_man_tone5": "👩🏿‍❤️‍💋‍👨🏿", + "kiss_woman_man_dark_skin_tone": "👩🏿‍❤️‍💋‍👨🏿", + "kiss_ww": "👩‍❤️‍💋‍👩", + "couplekiss_ww": "👩‍❤️‍💋‍👩", + "kiss_woman_woman_tone1": "👩🏻‍❤️‍💋‍👩🏻", + "kiss_woman_woman_light_skin_tone": "👩🏻‍❤️‍💋‍👩🏻", + "kiss_woman_woman_tone1_tone2": "👩🏻‍❤️‍💋‍👩🏼", + "kiss_woman_woman_light_skin_tone_medium_light_skin_tone": "👩🏻‍❤️‍💋‍👩🏼", + "kiss_woman_woman_tone1_tone3": "👩🏻‍❤️‍💋‍👩🏽", + "kiss_woman_woman_light_skin_tone_medium_skin_tone": "👩🏻‍❤️‍💋‍👩🏽", + "kiss_woman_woman_tone1_tone4": "👩🏻‍❤️‍💋‍👩🏾", + "kiss_woman_woman_light_skin_tone_medium_dark_skin_tone": "👩🏻‍❤️‍💋‍👩🏾", + "kiss_woman_woman_tone1_tone5": "👩🏻‍❤️‍💋‍👩🏿", + "kiss_woman_woman_light_skin_tone_dark_skin_tone": "👩🏻‍❤️‍💋‍👩🏿", + "kiss_woman_woman_tone2_tone1": "👩🏼‍❤️‍💋‍👩🏻", + "kiss_woman_woman_medium_light_skin_tone_light_skin_tone": "👩🏼‍❤️‍💋‍👩🏻", + "kiss_woman_woman_tone2": "👩🏼‍❤️‍💋‍👩🏼", + "kiss_woman_woman_medium_light_skin_tone": "👩🏼‍❤️‍💋‍👩🏼", + "kiss_woman_woman_tone2_tone3": "👩🏼‍❤️‍💋‍👩🏽", + "kiss_woman_woman_medium_light_skin_tone_medium_skin_tone": "👩🏼‍❤️‍💋‍👩🏽", + "kiss_woman_woman_tone2_tone4": "👩🏼‍❤️‍💋‍👩🏾", + "kiss_woman_woman_medium_light_skin_tone_medium_dark_skin_tone": "👩🏼‍❤️‍💋‍👩🏾", + "kiss_woman_woman_tone2_tone5": "👩🏼‍❤️‍💋‍👩🏿", + "kiss_woman_woman_medium_light_skin_tone_dark_skin_tone": "👩🏼‍❤️‍💋‍👩🏿", + "kiss_woman_woman_tone3_tone1": "👩🏽‍❤️‍💋‍👩🏻", + "kiss_woman_woman_medium_skin_tone_light_skin_tone": "👩🏽‍❤️‍💋‍👩🏻", + "kiss_woman_woman_tone3_tone2": "👩🏽‍❤️‍💋‍👩🏼", + "kiss_woman_woman_medium_skin_tone_medium_light_skin_tone": "👩🏽‍❤️‍💋‍👩🏼", + "kiss_woman_woman_tone3": "👩🏽‍❤️‍💋‍👩🏽", + "kiss_woman_woman_medium_skin_tone": "👩🏽‍❤️‍💋‍👩🏽", + "kiss_woman_woman_tone3_tone4": "👩🏽‍❤️‍💋‍👩🏾", + "kiss_woman_woman_medium_skin_tone_medium_dark_skin_tone": "👩🏽‍❤️‍💋‍👩🏾", + "kiss_woman_woman_tone3_tone5": "👩🏽‍❤️‍💋‍👩🏿", + "kiss_woman_woman_medium_skin_tone_dark_skin_tone": "👩🏽‍❤️‍💋‍👩🏿", + "kiss_woman_woman_tone4_tone1": "👩🏾‍❤️‍💋‍👩🏻", + "kiss_woman_woman_medium_dark_skin_tone_light_skin_tone": "👩🏾‍❤️‍💋‍👩🏻", + "kiss_woman_woman_tone4_tone2": "👩🏾‍❤️‍💋‍👩🏼", + "kiss_woman_woman_medium_dark_skin_tone_medium_light_skin_tone": "👩🏾‍❤️‍💋‍👩🏼", + "kiss_woman_woman_tone4_tone3": "👩🏾‍❤️‍💋‍👩🏽", + "kiss_woman_woman_medium_dark_skin_tone_medium_skin_tone": "👩🏾‍❤️‍💋‍👩🏽", + "kiss_woman_woman_tone4": "👩🏾‍❤️‍💋‍👩🏾", + "kiss_woman_woman_medium_dark_skin_tone": "👩🏾‍❤️‍💋‍👩🏾", + "kiss_woman_woman_tone4_tone5": "👩🏾‍❤️‍💋‍👩🏿", + "kiss_woman_woman_medium_dark_skin_tone_dark_skin_tone": "👩🏾‍❤️‍💋‍👩🏿", + "kiss_woman_woman_tone5_tone1": "👩🏿‍❤️‍💋‍👩🏻", + "kiss_woman_woman_dark_skin_tone_light_skin_tone": "👩🏿‍❤️‍💋‍👩🏻", + "kiss_woman_woman_tone5_tone2": "👩🏿‍❤️‍💋‍👩🏼", + "kiss_woman_woman_dark_skin_tone_medium_light_skin_tone": "👩🏿‍❤️‍💋‍👩🏼", + "kiss_woman_woman_tone5_tone3": "👩🏿‍❤️‍💋‍👩🏽", + "kiss_woman_woman_dark_skin_tone_medium_skin_tone": "👩🏿‍❤️‍💋‍👩🏽", + "kiss_woman_woman_tone5_tone4": "👩🏿‍❤️‍💋‍👩🏾", + "kiss_woman_woman_dark_skin_tone_medium_dark_skin_tone": "👩🏿‍❤️‍💋‍👩🏾", + "kiss_woman_woman_tone5": "👩🏿‍❤️‍💋‍👩🏿", + "kiss_woman_woman_dark_skin_tone": "👩🏿‍❤️‍💋‍👩🏿", + "kiss_mm": "👨‍❤️‍💋‍👨", + "couplekiss_mm": "👨‍❤️‍💋‍👨", + "kiss_man_man_tone1": "👨🏻‍❤️‍💋‍👨🏻", + "kiss_man_man_light_skin_tone": "👨🏻‍❤️‍💋‍👨🏻", + "kiss_man_man_tone1_tone2": "👨🏻‍❤️‍💋‍👨🏼", + "kiss_man_man_light_skin_tone_medium_light_skin_tone": "👨🏻‍❤️‍💋‍👨🏼", + "kiss_man_man_tone1_tone3": "👨🏻‍❤️‍💋‍👨🏽", + "kiss_man_man_light_skin_tone_medium_skin_tone": "👨🏻‍❤️‍💋‍👨🏽", + "kiss_man_man_tone1_tone4": "👨🏻‍❤️‍💋‍👨🏾", + "kiss_man_man_light_skin_tone_medium_dark_skin_tone": "👨🏻‍❤️‍💋‍👨🏾", + "kiss_man_man_tone1_tone5": "👨🏻‍❤️‍💋‍👨🏿", + "kiss_man_man_light_skin_tone_dark_skin_tone": "👨🏻‍❤️‍💋‍👨🏿", + "kiss_man_man_tone2_tone1": "👨🏼‍❤️‍💋‍👨🏻", + "kiss_man_man_medium_light_skin_tone_light_skin_tone": "👨🏼‍❤️‍💋‍👨🏻", + "kiss_man_man_tone2": "👨🏼‍❤️‍💋‍👨🏼", + "kiss_man_man_medium_light_skin_tone": "👨🏼‍❤️‍💋‍👨🏼", + "kiss_man_man_tone2_tone3": "👨🏼‍❤️‍💋‍👨🏽", + "kiss_man_man_medium_light_skin_tone_medium_skin_tone": "👨🏼‍❤️‍💋‍👨🏽", + "kiss_man_man_tone2_tone4": "👨🏼‍❤️‍💋‍👨🏾", + "kiss_man_man_medium_light_skin_tone_medium_dark_skin_tone": "👨🏼‍❤️‍💋‍👨🏾", + "kiss_man_man_tone2_tone5": "👨🏼‍❤️‍💋‍👨🏿", + "kiss_man_man_medium_light_skin_tone_dark_skin_tone": "👨🏼‍❤️‍💋‍👨🏿", + "kiss_man_man_tone3_tone1": "👨🏽‍❤️‍💋‍👨🏻", + "kiss_man_man_medium_skin_tone_light_skin_tone": "👨🏽‍❤️‍💋‍👨🏻", + "kiss_man_man_tone3_tone2": "👨🏽‍❤️‍💋‍👨🏼", + "kiss_man_man_medium_skin_tone_medium_light_skin_tone": "👨🏽‍❤️‍💋‍👨🏼", + "kiss_man_man_tone3": "👨🏽‍❤️‍💋‍👨🏽", + "kiss_man_man_medium_skin_tone": "👨🏽‍❤️‍💋‍👨🏽", + "kiss_man_man_tone3_tone4": "👨🏽‍❤️‍💋‍👨🏾", + "kiss_man_man_medium_skin_tone_medium_dark_skin_tone": "👨🏽‍❤️‍💋‍👨🏾", + "kiss_man_man_tone3_tone5": "👨🏽‍❤️‍💋‍👨🏿", + "kiss_man_man_medium_skin_tone_dark_skin_tone": "👨🏽‍❤️‍💋‍👨🏿", + "kiss_man_man_tone4_tone1": "👨🏾‍❤️‍💋‍👨🏻", + "kiss_man_man_medium_dark_skin_tone_light_skin_tone": "👨🏾‍❤️‍💋‍👨🏻", + "kiss_man_man_tone4_tone2": "👨🏾‍❤️‍💋‍👨🏼", + "kiss_man_man_medium_dark_skin_tone_medium_light_skin_tone": "👨🏾‍❤️‍💋‍👨🏼", + "kiss_man_man_tone4_tone3": "👨🏾‍❤️‍💋‍👨🏽", + "kiss_man_man_medium_dark_skin_tone_medium_skin_tone": "👨🏾‍❤️‍💋‍👨🏽", + "kiss_man_man_tone4": "👨🏾‍❤️‍💋‍👨🏾", + "kiss_man_man_medium_dark_skin_tone": "👨🏾‍❤️‍💋‍👨🏾", + "kiss_man_man_tone4_tone5": "👨🏾‍❤️‍💋‍👨🏿", + "kiss_man_man_medium_dark_skin_tone_dark_skin_tone": "👨🏾‍❤️‍💋‍👨🏿", + "kiss_man_man_tone5_tone1": "👨🏿‍❤️‍💋‍👨🏻", + "kiss_man_man_dark_skin_tone_light_skin_tone": "👨🏿‍❤️‍💋‍👨🏻", + "kiss_man_man_tone5_tone2": "👨🏿‍❤️‍💋‍👨🏼", + "kiss_man_man_dark_skin_tone_medium_light_skin_tone": "👨🏿‍❤️‍💋‍👨🏼", + "kiss_man_man_tone5_tone3": "👨🏿‍❤️‍💋‍👨🏽", + "kiss_man_man_dark_skin_tone_medium_skin_tone": "👨🏿‍❤️‍💋‍👨🏽", + "kiss_man_man_tone5_tone4": "👨🏿‍❤️‍💋‍👨🏾", + "kiss_man_man_dark_skin_tone_medium_dark_skin_tone": "👨🏿‍❤️‍💋‍👨🏾", + "kiss_man_man_tone5": "👨🏿‍❤️‍💋‍👨🏿", + "kiss_man_man_dark_skin_tone": "👨🏿‍❤️‍💋‍👨🏿", + "family": "👪", + "family_man_woman_boy": "👨‍👩‍👦", + "family_mwg": "👨‍👩‍👧", + "family_mwgb": "👨‍👩‍👧‍👦", + "family_mwbb": "👨‍👩‍👦‍👦", + "family_mwgg": "👨‍👩‍👧‍👧", + "family_wwb": "👩‍👩‍👦", + "family_wwg": "👩‍👩‍👧", + "family_wwgb": "👩‍👩‍👧‍👦", + "family_wwbb": "👩‍👩‍👦‍👦", + "family_wwgg": "👩‍👩‍👧‍👧", + "family_mmb": "👨‍👨‍👦", + "family_mmg": "👨‍👨‍👧", + "family_mmgb": "👨‍👨‍👧‍👦", + "family_mmbb": "👨‍👨‍👦‍👦", + "family_mmgg": "👨‍👨‍👧‍👧", + "family_woman_boy": "👩‍👦", + "family_woman_girl": "👩‍👧", + "family_woman_girl_boy": "👩‍👧‍👦", + "family_woman_boy_boy": "👩‍👦‍👦", + "family_woman_girl_girl": "👩‍👧‍👧", + "family_man_boy": "👨‍👦", + "family_man_girl": "👨‍👧", + "family_man_girl_boy": "👨‍👧‍👦", + "family_man_boy_boy": "👨‍👦‍👦", + "family_man_girl_girl": "👨‍👧‍👧", + "yarn": "🧶", + "thread": "🧵", + "coat": "🧥", + "lab_coat": "🥼", + "safety_vest": "🦺", + "womans_clothes": "👚", + "shirt": "👕", + "jeans": "👖", + "briefs": "🩲", + "shorts": "🩳", + "necktie": "👔", + "dress": "👗", + "bikini": "👙", + "one_piece_swimsuit": "🩱", + "kimono": "👘", + "sari": "🥻", + "womans_flat_shoe": "🥿", + "high_heel": "👠", + "sandal": "👡", + "boot": "👢", + "mans_shoe": "👞", + "athletic_shoe": "👟", + "hiking_boot": "🥾", + "thong_sandal": "🩴", + "socks": "🧦", + "gloves": "🧤", + "scarf": "🧣", + "tophat": "🎩", + "billed_cap": "🧢", + "womans_hat": "👒", + "mortar_board": "🎓", + "helmet_with_cross": "⛑️", + "helmet_with_white_cross": "⛑️", + "military_helmet": "🪖", + "crown": "👑", + "ring": "💍", + "pouch": "👝", + "purse": "👛", + "handbag": "👜", + "briefcase": "💼", + "school_satchel": "🎒", + "luggage": "🧳", + "eyeglasses": "👓", + "dark_sunglasses": "🕶️", + "goggles": "🥽", + "closed_umbrella": "🌂" + }, + "nature": { + "dog": "🐶", + "cat": "🐱", + "mouse": "🐭", + "hamster": "🐹", + "rabbit": "🐰", + "fox": "🦊", + "fox_face": "🦊", + "bear": "🐻", + "panda_face": "🐼", + "polar_bear": "🐻‍❄️", + "koala": "🐨", + "tiger": "🐯", + "lion_face": "🦁", + "lion": "🦁", + "cow": "🐮", + "pig": "🐷", + "pig_nose": "🐽", + "frog": "🐸", + "monkey_face": "🐵", + "see_no_evil": "🙈", + "hear_no_evil": "🙉", + "speak_no_evil": "🙊", + "monkey": "🐒", + "chicken": "🐔", + "penguin": "🐧", + "bird": "🐦", + "baby_chick": "🐤", + "hatching_chick": "🐣", + "hatched_chick": "🐥", + "duck": "🦆", + "dodo": "🦤", + "eagle": "🦅", + "owl": "🦉", + "bat": "🦇", + "wolf": "🐺", + "boar": "🐗", + "horse": "🐴", + "unicorn": "🦄", + "unicorn_face": "🦄", + "bee": "🐝", + "bug": "🐛", + "butterfly": "🦋", + "snail": "🐌", + "worm": "🪱", + "lady_beetle": "🐞", + "ant": "🐜", + "fly": "🪰", + "mosquito": "🦟", + "cockroach": "🪳", + "beetle": "🪲", + "cricket": "🦗", + "spider": "🕷️", + "spider_web": "🕸️", + "scorpion": "🦂", + "turtle": "🐢", + "snake": "🐍", + "lizard": "🦎", + "t_rex": "🦖", + "sauropod": "🦕", + "octopus": "🐙", + "squid": "🦑", + "shrimp": "🦐", + "lobster": "🦞", + "crab": "🦀", + "blowfish": "🐡", + "tropical_fish": "🐠", + "fish": "🐟", + "seal": "🦭", + "dolphin": "🐬", + "whale": "🐳", + "whale2": "🐋", + "shark": "🦈", + "crocodile": "🐊", + "tiger2": "🐅", + "leopard": "🐆", + "zebra": "🦓", + "gorilla": "🦍", + "orangutan": "🦧", + "elephant": "🐘", + "mammoth": "🦣", + "bison": "🦬", + "hippopotamus": "🦛", + "rhino": "🦏", + "rhinoceros": "🦏", + "dromedary_camel": "🐪", + "camel": "🐫", + "giraffe": "🦒", + "kangaroo": "🦘", + "water_buffalo": "🐃", + "ox": "🐂", + "cow2": "🐄", + "racehorse": "🐎", + "pig2": "🐖", + "ram": "🐏", + "sheep": "🐑", + "llama": "🦙", + "goat": "🐐", + "deer": "🦌", + "dog2": "🐕", + "poodle": "🐩", + "guide_dog": "🦮", + "service_dog": "🐕‍🦺", + "cat2": "🐈", + "black_cat": "🐈‍⬛", + "rooster": "🐓", + "turkey": "🦃", + "peacock": "🦚", + "parrot": "🦜", + "swan": "🦢", + "flamingo": "🦩", + "dove": "🕊️", + "dove_of_peace": "🕊️", + "rabbit2": "🐇", + "raccoon": "🦝", + "skunk": "🦨", + "badger": "🦡", + "beaver": "🦫", + "otter": "🦦", + "sloth": "🦥", + "mouse2": "🐁", + "rat": "🐀", + "chipmunk": "🐿️", + "hedgehog": "🦔", + "feet": "🐾", + "paw_prints": "🐾", + "dragon": "🐉", + "dragon_face": "🐲", + "cactus": "🌵", + "christmas_tree": "🎄", + "evergreen_tree": "🌲", + "deciduous_tree": "🌳", + "palm_tree": "🌴", + "seedling": "🌱", + "herb": "🌿", + "shamrock": "☘️", + "four_leaf_clover": "🍀", + "bamboo": "🎍", + "tanabata_tree": "🎋", + "leaves": "🍃", + "fallen_leaf": "🍂", + "maple_leaf": "🍁", + "feather": "🪶", + "mushroom": "🍄", + "shell": "🐚", + "rock": "🪨", + "wood": "🪵", + "ear_of_rice": "🌾", + "potted_plant": "🪴", + "bouquet": "💐", + "tulip": "🌷", + "rose": "🌹", + "wilted_rose": "🥀", + "wilted_flower": "🥀", + "hibiscus": "🌺", + "cherry_blossom": "🌸", + "blossom": "🌼", + "sunflower": "🌻", + "sun_with_face": "🌞", + "full_moon_with_face": "🌝", + "first_quarter_moon_with_face": "🌛", + "last_quarter_moon_with_face": "🌜", + "new_moon_with_face": "🌚", + "full_moon": "🌕", + "waning_gibbous_moon": "🌖", + "last_quarter_moon": "🌗", + "waning_crescent_moon": "🌘", + "new_moon": "🌑", + "waxing_crescent_moon": "🌒", + "first_quarter_moon": "🌓", + "waxing_gibbous_moon": "🌔", + "crescent_moon": "🌙", + "earth_americas": "🌎", + "earth_africa": "🌍", + "earth_asia": "🌏", + "ringed_planet": "🪐", + "dizzy": "💫", + "star": "⭐", + "star2": "🌟", + "sparkles": "✨", + "zap": "⚡", + "comet": "☄️", + "boom": "💥", + "fire": "🔥", + "flame": "🔥", + "cloud_tornado": "🌪️", + "cloud_with_tornado": "🌪️", + "rainbow": "🌈", + "sunny": "☀️", + "white_sun_small_cloud": "🌤️", + "white_sun_with_small_cloud": "🌤️", + "partly_sunny": "⛅", + "white_sun_cloud": "🌥️", + "white_sun_behind_cloud": "🌥️", + "cloud": "☁️", + "white_sun_rain_cloud": "🌦️", + "white_sun_behind_cloud_with_rain": "🌦️", + "cloud_rain": "🌧️", + "cloud_with_rain": "🌧️", + "thunder_cloud_rain": "⛈️", + "thunder_cloud_and_rain": "⛈️", + "cloud_lightning": "🌩️", + "cloud_with_lightning": "🌩️", + "cloud_snow": "🌨️", + "cloud_with_snow": "🌨️", + "snowflake": "❄️", + "snowman2": "☃️", + "snowman": "⛄", + "wind_blowing_face": "🌬️", + "dash": "💨", + "droplet": "💧", + "sweat_drops": "💦", + "umbrella": "☔", + "umbrella2": "☂️", + "ocean": "🌊", + "fog": "🌫️" + }, + "food": { + "green_apple": "🍏", + "apple": "🍎", + "pear": "🍐", + "tangerine": "🍊", + "lemon": "🍋", + "banana": "🍌", + "watermelon": "🍉", + "grapes": "🍇", + "blueberries": "🫐", + "strawberry": "🍓", + "melon": "🍈", + "cherries": "🍒", + "peach": "🍑", + "mango": "🥭", + "pineapple": "🍍", + "coconut": "🥥", + "kiwi": "🥝", + "kiwifruit": "🥝", + "tomato": "🍅", + "eggplant": "🍆", + "avocado": "🥑", + "olive": "🫒", + "broccoli": "🥦", + "leafy_green": "🥬", + "bell_pepper": "🫑", + "cucumber": "🥒", + "hot_pepper": "🌶️", + "corn": "🌽", + "carrot": "🥕", + "garlic": "🧄", + "onion": "🧅", + "potato": "🥔", + "sweet_potato": "🍠", + "croissant": "🥐", + "bagel": "🥯", + "bread": "🍞", + "french_bread": "🥖", + "baguette_bread": "🥖", + "flatbread": "🫓", + "pretzel": "🥨", + "cheese": "🧀", + "cheese_wedge": "🧀", + "egg": "🥚", + "cooking": "🍳", + "butter": "🧈", + "pancakes": "🥞", + "waffle": "🧇", + "bacon": "🥓", + "cut_of_meat": "🥩", + "poultry_leg": "🍗", + "meat_on_bone": "🍖", + "hotdog": "🌭", + "hot_dog": "🌭", + "hamburger": "🍔", + "fries": "🍟", + "pizza": "🍕", + "sandwich": "🥪", + "stuffed_flatbread": "🥙", + "stuffed_pita": "🥙", + "falafel": "🧆", + "taco": "🌮", + "burrito": "🌯", + "tamale": "🫔", + "salad": "🥗", + "green_salad": "🥗", + "shallow_pan_of_food": "🥘", + "paella": "🥘", + "fondue": "🫕", + "canned_food": "🥫", + "spaghetti": "🍝", + "ramen": "🍜", + "stew": "🍲", + "curry": "🍛", + "sushi": "🍣", + "bento": "🍱", + "dumpling": "🥟", + "oyster": "🦪", + "fried_shrimp": "🍤", + "rice_ball": "🍙", + "rice": "🍚", + "rice_cracker": "🍘", + "fish_cake": "🍥", + "fortune_cookie": "🥠", + "moon_cake": "🥮", + "oden": "🍢", + "dango": "🍡", + "shaved_ice": "🍧", + "ice_cream": "🍨", + "icecream": "🍦", + "pie": "🥧", + "cupcake": "🧁", + "cake": "🍰", + "birthday": "🎂", + "custard": "🍮", + "pudding": "🍮", + "flan": "🍮", + "lollipop": "🍭", + "candy": "🍬", + "chocolate_bar": "🍫", + "popcorn": "🍿", + "doughnut": "🍩", + "cookie": "🍪", + "chestnut": "🌰", + "peanuts": "🥜", + "shelled_peanut": "🥜", + "honey_pot": "🍯", + "milk": "🥛", + "glass_of_milk": "🥛", + "baby_bottle": "🍼", + "coffee": "☕", + "tea": "🍵", + "teapot": "🫖", + "mate": "🧉", + "bubble_tea": "🧋", + "beverage_box": "🧃", + "cup_with_straw": "🥤", + "sake": "🍶", + "beer": "🍺", + "beers": "🍻", + "champagne_glass": "🥂", + "clinking_glass": "🥂", + "wine_glass": "🍷", + "tumbler_glass": "🥃", + "whisky": "🥃", + "cocktail": "🍸", + "tropical_drink": "🍹", + "champagne": "🍾", + "bottle_with_popping_cork": "🍾", + "ice_cube": "🧊", + "spoon": "🥄", + "fork_and_knife": "🍴", + "fork_knife_plate": "🍽️", + "fork_and_knife_with_plate": "🍽️", + "bowl_with_spoon": "🥣", + "takeout_box": "🥡", + "chopsticks": "🥢", + "salt": "🧂" + }, + "activity": { + "soccer": "⚽", + "basketball": "🏀", + "football": "🏈", + "baseball": "⚾", + "softball": "🥎", + "tennis": "🎾", + "volleyball": "🏐", + "rugby_football": "🏉", + "flying_disc": "🥏", + "boomerang": "🪃", + "8ball": "🎱", + "yo_yo": "🪀", + "ping_pong": "🏓", + "table_tennis": "🏓", + "badminton": "🏸", + "hockey": "🏒", + "field_hockey": "🏑", + "lacrosse": "🥍", + "cricket_game": "🏏", + "cricket_bat_ball": "🏏", + "goal": "🥅", + "goal_net": "🥅", + "golf": "⛳", + "kite": "🪁", + "bow_and_arrow": "🏹", + "archery": "🏹", + "fishing_pole_and_fish": "🎣", + "diving_mask": "🤿", + "boxing_glove": "🥊", + "boxing_gloves": "🥊", + "martial_arts_uniform": "🥋", + "karate_uniform": "🥋", + "running_shirt_with_sash": "🎽", + "skateboard": "🛹", + "roller_skate": "🛼", + "sled": "🛷", + "ice_skate": "⛸️", + "curling_stone": "🥌", + "ski": "🎿", + "skier": "⛷️", + "snowboarder": "🏂", + "snowboarder_tone1": "🏂🏻", + "snowboarder_light_skin_tone": "🏂🏻", + "snowboarder_tone2": "🏂🏼", + "snowboarder_medium_light_skin_tone": "🏂🏼", + "snowboarder_tone3": "🏂🏽", + "snowboarder_medium_skin_tone": "🏂🏽", + "snowboarder_tone4": "🏂🏾", + "snowboarder_medium_dark_skin_tone": "🏂🏾", + "snowboarder_tone5": "🏂🏿", + "snowboarder_dark_skin_tone": "🏂🏿", + "parachute": "🪂", + "person_lifting_weights": "🏋️", + "lifter": "🏋️", + "weight_lifter": "🏋️", + "person_lifting_weights_tone1": "🏋🏻", + "lifter_tone1": "🏋🏻", + "weight_lifter_tone1": "🏋🏻", + "person_lifting_weights_tone2": "🏋🏼", + "lifter_tone2": "🏋🏼", + "weight_lifter_tone2": "🏋🏼", + "person_lifting_weights_tone3": "🏋🏽", + "lifter_tone3": "🏋🏽", + "weight_lifter_tone3": "🏋🏽", + "person_lifting_weights_tone4": "🏋🏾", + "lifter_tone4": "🏋🏾", + "weight_lifter_tone4": "🏋🏾", + "person_lifting_weights_tone5": "🏋🏿", + "lifter_tone5": "🏋🏿", + "weight_lifter_tone5": "🏋🏿", + "woman_lifting_weights": "🏋️‍♀️", + "woman_lifting_weights_tone1": "🏋🏻‍♀️", + "woman_lifting_weights_light_skin_tone": "🏋🏻‍♀️", + "woman_lifting_weights_tone2": "🏋🏼‍♀️", + "woman_lifting_weights_medium_light_skin_tone": "🏋🏼‍♀️", + "woman_lifting_weights_tone3": "🏋🏽‍♀️", + "woman_lifting_weights_medium_skin_tone": "🏋🏽‍♀️", + "woman_lifting_weights_tone4": "🏋🏾‍♀️", + "woman_lifting_weights_medium_dark_skin_tone": "🏋🏾‍♀️", + "woman_lifting_weights_tone5": "🏋🏿‍♀️", + "woman_lifting_weights_dark_skin_tone": "🏋🏿‍♀️", + "man_lifting_weights": "🏋️‍♂️", + "man_lifting_weights_tone1": "🏋🏻‍♂️", + "man_lifting_weights_light_skin_tone": "🏋🏻‍♂️", + "man_lifting_weights_tone2": "🏋🏼‍♂️", + "man_lifting_weights_medium_light_skin_tone": "🏋🏼‍♂️", + "man_lifting_weights_tone3": "🏋🏽‍♂️", + "man_lifting_weights_medium_skin_tone": "🏋🏽‍♂️", + "man_lifting_weights_tone4": "🏋🏾‍♂️", + "man_lifting_weights_medium_dark_skin_tone": "🏋🏾‍♂️", + "man_lifting_weights_tone5": "🏋🏿‍♂️", + "man_lifting_weights_dark_skin_tone": "🏋🏿‍♂️", + "people_wrestling": "🤼", + "wrestlers": "🤼", + "wrestling": "🤼", + "women_wrestling": "🤼‍♀️", + "men_wrestling": "🤼‍♂️", + "person_doing_cartwheel": "🤸", + "cartwheel": "🤸", + "person_doing_cartwheel_tone1": "🤸🏻", + "cartwheel_tone1": "🤸🏻", + "person_doing_cartwheel_tone2": "🤸🏼", + "cartwheel_tone2": "🤸🏼", + "person_doing_cartwheel_tone3": "🤸🏽", + "cartwheel_tone3": "🤸🏽", + "person_doing_cartwheel_tone4": "🤸🏾", + "cartwheel_tone4": "🤸🏾", + "person_doing_cartwheel_tone5": "🤸🏿", + "cartwheel_tone5": "🤸🏿", + "woman_cartwheeling": "🤸‍♀️", + "woman_cartwheeling_tone1": "🤸🏻‍♀️", + "woman_cartwheeling_light_skin_tone": "🤸🏻‍♀️", + "woman_cartwheeling_tone2": "🤸🏼‍♀️", + "woman_cartwheeling_medium_light_skin_tone": "🤸🏼‍♀️", + "woman_cartwheeling_tone3": "🤸🏽‍♀️", + "woman_cartwheeling_medium_skin_tone": "🤸🏽‍♀️", + "woman_cartwheeling_tone4": "🤸🏾‍♀️", + "woman_cartwheeling_medium_dark_skin_tone": "🤸🏾‍♀️", + "woman_cartwheeling_tone5": "🤸🏿‍♀️", + "woman_cartwheeling_dark_skin_tone": "🤸🏿‍♀️", + "man_cartwheeling": "🤸‍♂️", + "man_cartwheeling_tone1": "🤸🏻‍♂️", + "man_cartwheeling_light_skin_tone": "🤸🏻‍♂️", + "man_cartwheeling_tone2": "🤸🏼‍♂️", + "man_cartwheeling_medium_light_skin_tone": "🤸🏼‍♂️", + "man_cartwheeling_tone3": "🤸🏽‍♂️", + "man_cartwheeling_medium_skin_tone": "🤸🏽‍♂️", + "man_cartwheeling_tone4": "🤸🏾‍♂️", + "man_cartwheeling_medium_dark_skin_tone": "🤸🏾‍♂️", + "man_cartwheeling_tone5": "🤸🏿‍♂️", + "man_cartwheeling_dark_skin_tone": "🤸🏿‍♂️", + "person_bouncing_ball": "⛹️", + "basketball_player": "⛹️", + "person_with_ball": "⛹️", + "person_bouncing_ball_tone1": "⛹🏻", + "basketball_player_tone1": "⛹🏻", + "person_with_ball_tone1": "⛹🏻", + "person_bouncing_ball_tone2": "⛹🏼", + "basketball_player_tone2": "⛹🏼", + "person_with_ball_tone2": "⛹🏼", + "person_bouncing_ball_tone3": "⛹🏽", + "basketball_player_tone3": "⛹🏽", + "person_with_ball_tone3": "⛹🏽", + "person_bouncing_ball_tone4": "⛹🏾", + "basketball_player_tone4": "⛹🏾", + "person_with_ball_tone4": "⛹🏾", + "person_bouncing_ball_tone5": "⛹🏿", + "basketball_player_tone5": "⛹🏿", + "person_with_ball_tone5": "⛹🏿", + "woman_bouncing_ball": "⛹️‍♀️", + "woman_bouncing_ball_tone1": "⛹🏻‍♀️", + "woman_bouncing_ball_light_skin_tone": "⛹🏻‍♀️", + "woman_bouncing_ball_tone2": "⛹🏼‍♀️", + "woman_bouncing_ball_medium_light_skin_tone": "⛹🏼‍♀️", + "woman_bouncing_ball_tone3": "⛹🏽‍♀️", + "woman_bouncing_ball_medium_skin_tone": "⛹🏽‍♀️", + "woman_bouncing_ball_tone4": "⛹🏾‍♀️", + "woman_bouncing_ball_medium_dark_skin_tone": "⛹🏾‍♀️", + "woman_bouncing_ball_tone5": "⛹🏿‍♀️", + "woman_bouncing_ball_dark_skin_tone": "⛹🏿‍♀️", + "man_bouncing_ball": "⛹️‍♂️", + "man_bouncing_ball_tone1": "⛹🏻‍♂️", + "man_bouncing_ball_light_skin_tone": "⛹🏻‍♂️", + "man_bouncing_ball_tone2": "⛹🏼‍♂️", + "man_bouncing_ball_medium_light_skin_tone": "⛹🏼‍♂️", + "man_bouncing_ball_tone3": "⛹🏽‍♂️", + "man_bouncing_ball_medium_skin_tone": "⛹🏽‍♂️", + "man_bouncing_ball_tone4": "⛹🏾‍♂️", + "man_bouncing_ball_medium_dark_skin_tone": "⛹🏾‍♂️", + "man_bouncing_ball_tone5": "⛹🏿‍♂️", + "man_bouncing_ball_dark_skin_tone": "⛹🏿‍♂️", + "person_fencing": "🤺", + "fencer": "🤺", + "fencing": "🤺", + "person_playing_handball": "🤾", + "handball": "🤾", + "person_playing_handball_tone1": "🤾🏻", + "handball_tone1": "🤾🏻", + "person_playing_handball_tone2": "🤾🏼", + "handball_tone2": "🤾🏼", + "person_playing_handball_tone3": "🤾🏽", + "handball_tone3": "🤾🏽", + "person_playing_handball_tone4": "🤾🏾", + "handball_tone4": "🤾🏾", + "person_playing_handball_tone5": "🤾🏿", + "handball_tone5": "🤾🏿", + "woman_playing_handball": "🤾‍♀️", + "woman_playing_handball_tone1": "🤾🏻‍♀️", + "woman_playing_handball_light_skin_tone": "🤾🏻‍♀️", + "woman_playing_handball_tone2": "🤾🏼‍♀️", + "woman_playing_handball_medium_light_skin_tone": "🤾🏼‍♀️", + "woman_playing_handball_tone3": "🤾🏽‍♀️", + "woman_playing_handball_medium_skin_tone": "🤾🏽‍♀️", + "woman_playing_handball_tone4": "🤾🏾‍♀️", + "woman_playing_handball_medium_dark_skin_tone": "🤾🏾‍♀️", + "woman_playing_handball_tone5": "🤾🏿‍♀️", + "woman_playing_handball_dark_skin_tone": "🤾🏿‍♀️", + "man_playing_handball": "🤾‍♂️", + "man_playing_handball_tone1": "🤾🏻‍♂️", + "man_playing_handball_light_skin_tone": "🤾🏻‍♂️", + "man_playing_handball_tone2": "🤾🏼‍♂️", + "man_playing_handball_medium_light_skin_tone": "🤾🏼‍♂️", + "man_playing_handball_tone3": "🤾🏽‍♂️", + "man_playing_handball_medium_skin_tone": "🤾🏽‍♂️", + "man_playing_handball_tone4": "🤾🏾‍♂️", + "man_playing_handball_medium_dark_skin_tone": "🤾🏾‍♂️", + "man_playing_handball_tone5": "🤾🏿‍♂️", + "man_playing_handball_dark_skin_tone": "🤾🏿‍♂️", + "person_golfing": "🏌️", + "golfer": "🏌️", + "person_golfing_tone1": "🏌🏻", + "person_golfing_light_skin_tone": "🏌🏻", + "person_golfing_tone2": "🏌🏼", + "person_golfing_medium_light_skin_tone": "🏌🏼", + "person_golfing_tone3": "🏌🏽", + "person_golfing_medium_skin_tone": "🏌🏽", + "person_golfing_tone4": "🏌🏾", + "person_golfing_medium_dark_skin_tone": "🏌🏾", + "person_golfing_tone5": "🏌🏿", + "person_golfing_dark_skin_tone": "🏌🏿", + "woman_golfing": "🏌️‍♀️", + "woman_golfing_tone1": "🏌🏻‍♀️", + "woman_golfing_light_skin_tone": "🏌🏻‍♀️", + "woman_golfing_tone2": "🏌🏼‍♀️", + "woman_golfing_medium_light_skin_tone": "🏌🏼‍♀️", + "woman_golfing_tone3": "🏌🏽‍♀️", + "woman_golfing_medium_skin_tone": "🏌🏽‍♀️", + "woman_golfing_tone4": "🏌🏾‍♀️", + "woman_golfing_medium_dark_skin_tone": "🏌🏾‍♀️", + "woman_golfing_tone5": "🏌🏿‍♀️", + "woman_golfing_dark_skin_tone": "🏌🏿‍♀️", + "man_golfing": "🏌️‍♂️", + "man_golfing_tone1": "🏌🏻‍♂️", + "man_golfing_light_skin_tone": "🏌🏻‍♂️", + "man_golfing_tone2": "🏌🏼‍♂️", + "man_golfing_medium_light_skin_tone": "🏌🏼‍♂️", + "man_golfing_tone3": "🏌🏽‍♂️", + "man_golfing_medium_skin_tone": "🏌🏽‍♂️", + "man_golfing_tone4": "🏌🏾‍♂️", + "man_golfing_medium_dark_skin_tone": "🏌🏾‍♂️", + "man_golfing_tone5": "🏌🏿‍♂️", + "man_golfing_dark_skin_tone": "🏌🏿‍♂️", + "horse_racing": "🏇", + "horse_racing_tone1": "🏇🏻", + "horse_racing_tone2": "🏇🏼", + "horse_racing_tone3": "🏇🏽", + "horse_racing_tone4": "🏇🏾", + "horse_racing_tone5": "🏇🏿", + "person_in_lotus_position": "🧘", + "person_in_lotus_position_tone1": "🧘🏻", + "person_in_lotus_position_light_skin_tone": "🧘🏻", + "person_in_lotus_position_tone2": "🧘🏼", + "person_in_lotus_position_medium_light_skin_tone": "🧘🏼", + "person_in_lotus_position_tone3": "🧘🏽", + "person_in_lotus_position_medium_skin_tone": "🧘🏽", + "person_in_lotus_position_tone4": "🧘🏾", + "person_in_lotus_position_medium_dark_skin_tone": "🧘🏾", + "person_in_lotus_position_tone5": "🧘🏿", + "person_in_lotus_position_dark_skin_tone": "🧘🏿", + "woman_in_lotus_position": "🧘‍♀️", + "woman_in_lotus_position_tone1": "🧘🏻‍♀️", + "woman_in_lotus_position_light_skin_tone": "🧘🏻‍♀️", + "woman_in_lotus_position_tone2": "🧘🏼‍♀️", + "woman_in_lotus_position_medium_light_skin_tone": "🧘🏼‍♀️", + "woman_in_lotus_position_tone3": "🧘🏽‍♀️", + "woman_in_lotus_position_medium_skin_tone": "🧘🏽‍♀️", + "woman_in_lotus_position_tone4": "🧘🏾‍♀️", + "woman_in_lotus_position_medium_dark_skin_tone": "🧘🏾‍♀️", + "woman_in_lotus_position_tone5": "🧘🏿‍♀️", + "woman_in_lotus_position_dark_skin_tone": "🧘🏿‍♀️", + "man_in_lotus_position": "🧘‍♂️", + "man_in_lotus_position_tone1": "🧘🏻‍♂️", + "man_in_lotus_position_light_skin_tone": "🧘🏻‍♂️", + "man_in_lotus_position_tone2": "🧘🏼‍♂️", + "man_in_lotus_position_medium_light_skin_tone": "🧘🏼‍♂️", + "man_in_lotus_position_tone3": "🧘🏽‍♂️", + "man_in_lotus_position_medium_skin_tone": "🧘🏽‍♂️", + "man_in_lotus_position_tone4": "🧘🏾‍♂️", + "man_in_lotus_position_medium_dark_skin_tone": "🧘🏾‍♂️", + "man_in_lotus_position_tone5": "🧘🏿‍♂️", + "man_in_lotus_position_dark_skin_tone": "🧘🏿‍♂️", + "person_surfing": "🏄", + "surfer": "🏄", + "person_surfing_tone1": "🏄🏻", + "surfer_tone1": "🏄🏻", + "person_surfing_tone2": "🏄🏼", + "surfer_tone2": "🏄🏼", + "person_surfing_tone3": "🏄🏽", + "surfer_tone3": "🏄🏽", + "person_surfing_tone4": "🏄🏾", + "surfer_tone4": "🏄🏾", + "person_surfing_tone5": "🏄🏿", + "surfer_tone5": "🏄🏿", + "woman_surfing": "🏄‍♀️", + "woman_surfing_tone1": "🏄🏻‍♀️", + "woman_surfing_light_skin_tone": "🏄🏻‍♀️", + "woman_surfing_tone2": "🏄🏼‍♀️", + "woman_surfing_medium_light_skin_tone": "🏄🏼‍♀️", + "woman_surfing_tone3": "🏄🏽‍♀️", + "woman_surfing_medium_skin_tone": "🏄🏽‍♀️", + "woman_surfing_tone4": "🏄🏾‍♀️", + "woman_surfing_medium_dark_skin_tone": "🏄🏾‍♀️", + "woman_surfing_tone5": "🏄🏿‍♀️", + "woman_surfing_dark_skin_tone": "🏄🏿‍♀️", + "man_surfing": "🏄‍♂️", + "man_surfing_tone1": "🏄🏻‍♂️", + "man_surfing_light_skin_tone": "🏄🏻‍♂️", + "man_surfing_tone2": "🏄🏼‍♂️", + "man_surfing_medium_light_skin_tone": "🏄🏼‍♂️", + "man_surfing_tone3": "🏄🏽‍♂️", + "man_surfing_medium_skin_tone": "🏄🏽‍♂️", + "man_surfing_tone4": "🏄🏾‍♂️", + "man_surfing_medium_dark_skin_tone": "🏄🏾‍♂️", + "man_surfing_tone5": "🏄🏿‍♂️", + "man_surfing_dark_skin_tone": "🏄🏿‍♂️", + "person_swimming": "🏊", + "swimmer": "🏊", + "person_swimming_tone1": "🏊🏻", + "swimmer_tone1": "🏊🏻", + "person_swimming_tone2": "🏊🏼", + "swimmer_tone2": "🏊🏼", + "person_swimming_tone3": "🏊🏽", + "swimmer_tone3": "🏊🏽", + "person_swimming_tone4": "🏊🏾", + "swimmer_tone4": "🏊🏾", + "person_swimming_tone5": "🏊🏿", + "swimmer_tone5": "🏊🏿", + "woman_swimming": "🏊‍♀️", + "woman_swimming_tone1": "🏊🏻‍♀️", + "woman_swimming_light_skin_tone": "🏊🏻‍♀️", + "woman_swimming_tone2": "🏊🏼‍♀️", + "woman_swimming_medium_light_skin_tone": "🏊🏼‍♀️", + "woman_swimming_tone3": "🏊🏽‍♀️", + "woman_swimming_medium_skin_tone": "🏊🏽‍♀️", + "woman_swimming_tone4": "🏊🏾‍♀️", + "woman_swimming_medium_dark_skin_tone": "🏊🏾‍♀️", + "woman_swimming_tone5": "🏊🏿‍♀️", + "woman_swimming_dark_skin_tone": "🏊🏿‍♀️", + "man_swimming": "🏊‍♂️", + "man_swimming_tone1": "🏊🏻‍♂️", + "man_swimming_light_skin_tone": "🏊🏻‍♂️", + "man_swimming_tone2": "🏊🏼‍♂️", + "man_swimming_medium_light_skin_tone": "🏊🏼‍♂️", + "man_swimming_tone3": "🏊🏽‍♂️", + "man_swimming_medium_skin_tone": "🏊🏽‍♂️", + "man_swimming_tone4": "🏊🏾‍♂️", + "man_swimming_medium_dark_skin_tone": "🏊🏾‍♂️", + "man_swimming_tone5": "🏊🏿‍♂️", + "man_swimming_dark_skin_tone": "🏊🏿‍♂️", + "person_playing_water_polo": "🤽", + "water_polo": "🤽", + "person_playing_water_polo_tone1": "🤽🏻", + "water_polo_tone1": "🤽🏻", + "person_playing_water_polo_tone2": "🤽🏼", + "water_polo_tone2": "🤽🏼", + "person_playing_water_polo_tone3": "🤽🏽", + "water_polo_tone3": "🤽🏽", + "person_playing_water_polo_tone4": "🤽🏾", + "water_polo_tone4": "🤽🏾", + "person_playing_water_polo_tone5": "🤽🏿", + "water_polo_tone5": "🤽🏿", + "woman_playing_water_polo": "🤽‍♀️", + "woman_playing_water_polo_tone1": "🤽🏻‍♀️", + "woman_playing_water_polo_light_skin_tone": "🤽🏻‍♀️", + "woman_playing_water_polo_tone2": "🤽🏼‍♀️", + "woman_playing_water_polo_medium_light_skin_tone": "🤽🏼‍♀️", + "woman_playing_water_polo_tone3": "🤽🏽‍♀️", + "woman_playing_water_polo_medium_skin_tone": "🤽🏽‍♀️", + "woman_playing_water_polo_tone4": "🤽🏾‍♀️", + "woman_playing_water_polo_medium_dark_skin_tone": "🤽🏾‍♀️", + "woman_playing_water_polo_tone5": "🤽🏿‍♀️", + "woman_playing_water_polo_dark_skin_tone": "🤽🏿‍♀️", + "man_playing_water_polo": "🤽‍♂️", + "man_playing_water_polo_tone1": "🤽🏻‍♂️", + "man_playing_water_polo_light_skin_tone": "🤽🏻‍♂️", + "man_playing_water_polo_tone2": "🤽🏼‍♂️", + "man_playing_water_polo_medium_light_skin_tone": "🤽🏼‍♂️", + "man_playing_water_polo_tone3": "🤽🏽‍♂️", + "man_playing_water_polo_medium_skin_tone": "🤽🏽‍♂️", + "man_playing_water_polo_tone4": "🤽🏾‍♂️", + "man_playing_water_polo_medium_dark_skin_tone": "🤽🏾‍♂️", + "man_playing_water_polo_tone5": "🤽🏿‍♂️", + "man_playing_water_polo_dark_skin_tone": "🤽🏿‍♂️", + "person_rowing_boat": "🚣", + "rowboat": "🚣", + "person_rowing_boat_tone1": "🚣🏻", + "rowboat_tone1": "🚣🏻", + "person_rowing_boat_tone2": "🚣🏼", + "rowboat_tone2": "🚣🏼", + "person_rowing_boat_tone3": "🚣🏽", + "rowboat_tone3": "🚣🏽", + "person_rowing_boat_tone4": "🚣🏾", + "rowboat_tone4": "🚣🏾", + "person_rowing_boat_tone5": "🚣🏿", + "rowboat_tone5": "🚣🏿", + "woman_rowing_boat": "🚣‍♀️", + "woman_rowing_boat_tone1": "🚣🏻‍♀️", + "woman_rowing_boat_light_skin_tone": "🚣🏻‍♀️", + "woman_rowing_boat_tone2": "🚣🏼‍♀️", + "woman_rowing_boat_medium_light_skin_tone": "🚣🏼‍♀️", + "woman_rowing_boat_tone3": "🚣🏽‍♀️", + "woman_rowing_boat_medium_skin_tone": "🚣🏽‍♀️", + "woman_rowing_boat_tone4": "🚣🏾‍♀️", + "woman_rowing_boat_medium_dark_skin_tone": "🚣🏾‍♀️", + "woman_rowing_boat_tone5": "🚣🏿‍♀️", + "woman_rowing_boat_dark_skin_tone": "🚣🏿‍♀️", + "man_rowing_boat": "🚣‍♂️", + "man_rowing_boat_tone1": "🚣🏻‍♂️", + "man_rowing_boat_light_skin_tone": "🚣🏻‍♂️", + "man_rowing_boat_tone2": "🚣🏼‍♂️", + "man_rowing_boat_medium_light_skin_tone": "🚣🏼‍♂️", + "man_rowing_boat_tone3": "🚣🏽‍♂️", + "man_rowing_boat_medium_skin_tone": "🚣🏽‍♂️", + "man_rowing_boat_tone4": "🚣🏾‍♂️", + "man_rowing_boat_medium_dark_skin_tone": "🚣🏾‍♂️", + "man_rowing_boat_tone5": "🚣🏿‍♂️", + "man_rowing_boat_dark_skin_tone": "🚣🏿‍♂️", + "person_climbing": "🧗", + "person_climbing_tone1": "🧗🏻", + "person_climbing_light_skin_tone": "🧗🏻", + "person_climbing_tone2": "🧗🏼", + "person_climbing_medium_light_skin_tone": "🧗🏼", + "person_climbing_tone3": "🧗🏽", + "person_climbing_medium_skin_tone": "🧗🏽", + "person_climbing_tone4": "🧗🏾", + "person_climbing_medium_dark_skin_tone": "🧗🏾", + "person_climbing_tone5": "🧗🏿", + "person_climbing_dark_skin_tone": "🧗🏿", + "woman_climbing": "🧗‍♀️", + "woman_climbing_tone1": "🧗🏻‍♀️", + "woman_climbing_light_skin_tone": "🧗🏻‍♀️", + "woman_climbing_tone2": "🧗🏼‍♀️", + "woman_climbing_medium_light_skin_tone": "🧗🏼‍♀️", + "woman_climbing_tone3": "🧗🏽‍♀️", + "woman_climbing_medium_skin_tone": "🧗🏽‍♀️", + "woman_climbing_tone4": "🧗🏾‍♀️", + "woman_climbing_medium_dark_skin_tone": "🧗🏾‍♀️", + "woman_climbing_tone5": "🧗🏿‍♀️", + "woman_climbing_dark_skin_tone": "🧗🏿‍♀️", + "man_climbing": "🧗‍♂️", + "man_climbing_tone1": "🧗🏻‍♂️", + "man_climbing_light_skin_tone": "🧗🏻‍♂️", + "man_climbing_tone2": "🧗🏼‍♂️", + "man_climbing_medium_light_skin_tone": "🧗🏼‍♂️", + "man_climbing_tone3": "🧗🏽‍♂️", + "man_climbing_medium_skin_tone": "🧗🏽‍♂️", + "man_climbing_tone4": "🧗🏾‍♂️", + "man_climbing_medium_dark_skin_tone": "🧗🏾‍♂️", + "man_climbing_tone5": "🧗🏿‍♂️", + "man_climbing_dark_skin_tone": "🧗🏿‍♂️", + "person_mountain_biking": "🚵", + "mountain_bicyclist": "🚵", + "person_mountain_biking_tone1": "🚵🏻", + "mountain_bicyclist_tone1": "🚵🏻", + "person_mountain_biking_tone2": "🚵🏼", + "mountain_bicyclist_tone2": "🚵🏼", + "person_mountain_biking_tone3": "🚵🏽", + "mountain_bicyclist_tone3": "🚵🏽", + "person_mountain_biking_tone4": "🚵🏾", + "mountain_bicyclist_tone4": "🚵🏾", + "person_mountain_biking_tone5": "🚵🏿", + "mountain_bicyclist_tone5": "🚵🏿", + "woman_mountain_biking": "🚵‍♀️", + "woman_mountain_biking_tone1": "🚵🏻‍♀️", + "woman_mountain_biking_light_skin_tone": "🚵🏻‍♀️", + "woman_mountain_biking_tone2": "🚵🏼‍♀️", + "woman_mountain_biking_medium_light_skin_tone": "🚵🏼‍♀️", + "woman_mountain_biking_tone3": "🚵🏽‍♀️", + "woman_mountain_biking_medium_skin_tone": "🚵🏽‍♀️", + "woman_mountain_biking_tone4": "🚵🏾‍♀️", + "woman_mountain_biking_medium_dark_skin_tone": "🚵🏾‍♀️", + "woman_mountain_biking_tone5": "🚵🏿‍♀️", + "woman_mountain_biking_dark_skin_tone": "🚵🏿‍♀️", + "man_mountain_biking": "🚵‍♂️", + "man_mountain_biking_tone1": "🚵🏻‍♂️", + "man_mountain_biking_light_skin_tone": "🚵🏻‍♂️", + "man_mountain_biking_tone2": "🚵🏼‍♂️", + "man_mountain_biking_medium_light_skin_tone": "🚵🏼‍♂️", + "man_mountain_biking_tone3": "🚵🏽‍♂️", + "man_mountain_biking_medium_skin_tone": "🚵🏽‍♂️", + "man_mountain_biking_tone4": "🚵🏾‍♂️", + "man_mountain_biking_medium_dark_skin_tone": "🚵🏾‍♂️", + "man_mountain_biking_tone5": "🚵🏿‍♂️", + "man_mountain_biking_dark_skin_tone": "🚵🏿‍♂️", + "person_biking": "🚴", + "bicyclist": "🚴", + "person_biking_tone1": "🚴🏻", + "bicyclist_tone1": "🚴🏻", + "person_biking_tone2": "🚴🏼", + "bicyclist_tone2": "🚴🏼", + "person_biking_tone3": "🚴🏽", + "bicyclist_tone3": "🚴🏽", + "person_biking_tone4": "🚴🏾", + "bicyclist_tone4": "🚴🏾", + "person_biking_tone5": "🚴🏿", + "bicyclist_tone5": "🚴🏿", + "woman_biking": "🚴‍♀️", + "woman_biking_tone1": "🚴🏻‍♀️", + "woman_biking_light_skin_tone": "🚴🏻‍♀️", + "woman_biking_tone2": "🚴🏼‍♀️", + "woman_biking_medium_light_skin_tone": "🚴🏼‍♀️", + "woman_biking_tone3": "🚴🏽‍♀️", + "woman_biking_medium_skin_tone": "🚴🏽‍♀️", + "woman_biking_tone4": "🚴🏾‍♀️", + "woman_biking_medium_dark_skin_tone": "🚴🏾‍♀️", + "woman_biking_tone5": "🚴🏿‍♀️", + "woman_biking_dark_skin_tone": "🚴🏿‍♀️", + "man_biking": "🚴‍♂️", + "man_biking_tone1": "🚴🏻‍♂️", + "man_biking_light_skin_tone": "🚴🏻‍♂️", + "man_biking_tone2": "🚴🏼‍♂️", + "man_biking_medium_light_skin_tone": "🚴🏼‍♂️", + "man_biking_tone3": "🚴🏽‍♂️", + "man_biking_medium_skin_tone": "🚴🏽‍♂️", + "man_biking_tone4": "🚴🏾‍♂️", + "man_biking_medium_dark_skin_tone": "🚴🏾‍♂️", + "man_biking_tone5": "🚴🏿‍♂️", + "man_biking_dark_skin_tone": "🚴🏿‍♂️", + "trophy": "🏆", + "first_place": "🥇", + "first_place_medal": "🥇", + "second_place": "🥈", + "second_place_medal": "🥈", + "third_place": "🥉", + "third_place_medal": "🥉", + "medal": "🏅", + "sports_medal": "🏅", + "military_medal": "🎖️", + "rosette": "🏵️", + "reminder_ribbon": "🎗️", + "ticket": "🎫", + "tickets": "🎟️", + "admission_tickets": "🎟️", + "circus_tent": "🎪", + "person_juggling": "🤹", + "juggling": "🤹", + "juggler": "🤹", + "person_juggling_tone1": "🤹🏻", + "juggling_tone1": "🤹🏻", + "juggler_tone1": "🤹🏻", + "person_juggling_tone2": "🤹🏼", + "juggling_tone2": "🤹🏼", + "juggler_tone2": "🤹🏼", + "person_juggling_tone3": "🤹🏽", + "juggling_tone3": "🤹🏽", + "juggler_tone3": "🤹🏽", + "person_juggling_tone4": "🤹🏾", + "juggling_tone4": "🤹🏾", + "juggler_tone4": "🤹🏾", + "person_juggling_tone5": "🤹🏿", + "juggling_tone5": "🤹🏿", + "juggler_tone5": "🤹🏿", + "woman_juggling": "🤹‍♀️", + "woman_juggling_tone1": "🤹🏻‍♀️", + "woman_juggling_light_skin_tone": "🤹🏻‍♀️", + "woman_juggling_tone2": "🤹🏼‍♀️", + "woman_juggling_medium_light_skin_tone": "🤹🏼‍♀️", + "woman_juggling_tone3": "🤹🏽‍♀️", + "woman_juggling_medium_skin_tone": "🤹🏽‍♀️", + "woman_juggling_tone4": "🤹🏾‍♀️", + "woman_juggling_medium_dark_skin_tone": "🤹🏾‍♀️", + "woman_juggling_tone5": "🤹🏿‍♀️", + "woman_juggling_dark_skin_tone": "🤹🏿‍♀️", + "man_juggling": "🤹‍♂️", + "man_juggling_tone1": "🤹🏻‍♂️", + "man_juggling_light_skin_tone": "🤹🏻‍♂️", + "man_juggling_tone2": "🤹🏼‍♂️", + "man_juggling_medium_light_skin_tone": "🤹🏼‍♂️", + "man_juggling_tone3": "🤹🏽‍♂️", + "man_juggling_medium_skin_tone": "🤹🏽‍♂️", + "man_juggling_tone4": "🤹🏾‍♂️", + "man_juggling_medium_dark_skin_tone": "🤹🏾‍♂️", + "man_juggling_tone5": "🤹🏿‍♂️", + "man_juggling_dark_skin_tone": "🤹🏿‍♂️", + "performing_arts": "🎭", + "ballet_shoes": "🩰", + "art": "🎨", + "clapper": "🎬", + "microphone": "🎤", + "headphones": "🎧", + "musical_score": "🎼", + "musical_keyboard": "🎹", + "drum": "🥁", + "drum_with_drumsticks": "🥁", + "long_drum": "🪘", + "saxophone": "🎷", + "trumpet": "🎺", + "guitar": "🎸", + "banjo": "🪕", + "violin": "🎻", + "accordion": "🪗", + "game_die": "🎲", + "chess_pawn": "♟️", + "dart": "🎯", + "bowling": "🎳", + "video_game": "🎮", + "slot_machine": "🎰", + "jigsaw": "🧩" + }, + "travel": { + "red_car": "🚗", + "taxi": "🚕", + "blue_car": "🚙", + "pickup_truck": "🛻", + "bus": "🚌", + "trolleybus": "🚎", + "race_car": "🏎️", + "racing_car": "🏎️", + "police_car": "🚓", + "ambulance": "🚑", + "fire_engine": "🚒", + "minibus": "🚐", + "truck": "🚚", + "articulated_lorry": "🚛", + "tractor": "🚜", + "probing_cane": "🦯", + "manual_wheelchair": "🦽", + "motorized_wheelchair": "🦼", + "scooter": "🛴", + "bike": "🚲", + "motor_scooter": "🛵", + "motorbike": "🛵", + "motorcycle": "🏍️", + "racing_motorcycle": "🏍️", + "auto_rickshaw": "🛺", + "rotating_light": "🚨", + "oncoming_police_car": "🚔", + "oncoming_bus": "🚍", + "oncoming_automobile": "🚘", + "oncoming_taxi": "🚖", + "aerial_tramway": "🚡", + "mountain_cableway": "🚠", + "suspension_railway": "🚟", + "railway_car": "🚃", + "train": "🚋", + "mountain_railway": "🚞", + "monorail": "🚝", + "bullettrain_side": "🚄", + "bullettrain_front": "🚅", + "light_rail": "🚈", + "steam_locomotive": "🚂", + "train2": "🚆", + "metro": "🚇", + "tram": "🚊", + "station": "🚉", + "airplane": "✈️", + "airplane_departure": "🛫", + "airplane_arriving": "🛬", + "airplane_small": "🛩️", + "small_airplane": "🛩️", + "seat": "💺", + "satellite_orbital": "🛰️", + "rocket": "🚀", + "flying_saucer": "🛸", + "helicopter": "🚁", + "canoe": "🛶", + "kayak": "🛶", + "sailboat": "⛵", + "speedboat": "🚤", + "motorboat": "🛥️", + "cruise_ship": "🛳️", + "passenger_ship": "🛳️", + "ferry": "⛴️", + "ship": "🚢", + "anchor": "⚓", + "fuelpump": "⛽", + "construction": "🚧", + "vertical_traffic_light": "🚦", + "traffic_light": "🚥", + "busstop": "🚏", + "map": "🗺️", + "world_map": "🗺️", + "moyai": "🗿", + "statue_of_liberty": "🗽", + "tokyo_tower": "🗼", + "european_castle": "🏰", + "japanese_castle": "🏯", + "stadium": "🏟️", + "ferris_wheel": "🎡", + "roller_coaster": "🎢", + "carousel_horse": "🎠", + "fountain": "⛲", + "beach_umbrella": "⛱️", + "umbrella_on_ground": "⛱️", + "beach": "🏖️", + "beach_with_umbrella": "🏖️", + "island": "🏝️", + "desert_island": "🏝️", + "desert": "🏜️", + "volcano": "🌋", + "mountain": "⛰️", + "mountain_snow": "🏔️", + "snow_capped_mountain": "🏔️", + "mount_fuji": "🗻", + "camping": "🏕️", + "tent": "⛺", + "house": "🏠", + "house_with_garden": "🏡", + "homes": "🏘️", + "house_buildings": "🏘️", + "house_abandoned": "🏚️", + "derelict_house_building": "🏚️", + "hut": "🛖", + "construction_site": "🏗️", + "building_construction": "🏗️", + "factory": "🏭", + "office": "🏢", + "department_store": "🏬", + "post_office": "🏣", + "european_post_office": "🏤", + "hospital": "🏥", + "bank": "🏦", + "hotel": "🏨", + "convenience_store": "🏪", + "school": "🏫", + "love_hotel": "🏩", + "wedding": "💒", + "classical_building": "🏛️", + "church": "⛪", + "mosque": "🕌", + "synagogue": "🕍", + "hindu_temple": "🛕", + "kaaba": "🕋", + "shinto_shrine": "⛩️", + "railway_track": "🛤️", + "railroad_track": "🛤️", + "motorway": "🛣️", + "japan": "🗾", + "rice_scene": "🎑", + "park": "🏞️", + "national_park": "🏞️", + "sunrise": "🌅", + "sunrise_over_mountains": "🌄", + "stars": "🌠", + "sparkler": "🎇", + "fireworks": "🎆", + "city_sunset": "🌇", + "city_sunrise": "🌇", + "city_dusk": "🌆", + "cityscape": "🏙️", + "night_with_stars": "🌃", + "milky_way": "🌌", + "bridge_at_night": "🌉", + "foggy": "🌁" + }, + "objects": { + "watch": "⌚", + "mobile_phone": "📱", + "iphone": "📱", + "calling": "📲", + "computer": "💻", + "keyboard": "⌨️", + "desktop": "🖥️", + "desktop_computer": "🖥️", + "printer": "🖨️", + "mouse_three_button": "🖱️", + "three_button_mouse": "🖱️", + "trackball": "🖲️", + "joystick": "🕹️", + "compression": "🗜️", + "minidisc": "💽", + "floppy_disk": "💾", + "cd": "💿", + "dvd": "📀", + "vhs": "📼", + "camera": "📷", + "camera_with_flash": "📸", + "video_camera": "📹", + "movie_camera": "🎥", + "projector": "📽️", + "film_projector": "📽️", + "film_frames": "🎞️", + "telephone_receiver": "📞", + "telephone": "☎️", + "pager": "📟", + "fax": "📠", + "tv": "📺", + "radio": "📻", + "microphone2": "🎙️", + "studio_microphone": "🎙️", + "level_slider": "🎚️", + "control_knobs": "🎛️", + "compass": "🧭", + "stopwatch": "⏱️", + "timer": "⏲️", + "timer_clock": "⏲️", + "alarm_clock": "⏰", + "clock": "🕰️", + "mantlepiece_clock": "🕰️", + "hourglass": "⌛", + "hourglass_flowing_sand": "⏳", + "satellite": "📡", + "battery": "🔋", + "electric_plug": "🔌", + "bulb": "💡", + "flashlight": "🔦", + "candle": "🕯️", + "diya_lamp": "🪔", + "fire_extinguisher": "🧯", + "oil": "🛢️", + "oil_drum": "🛢️", + "money_with_wings": "💸", + "dollar": "💵", + "yen": "💴", + "euro": "💶", + "pound": "💷", + "coin": "🪙", + "moneybag": "💰", + "credit_card": "💳", + "gem": "💎", + "scales": "⚖️", + "ladder": "🪜", + "toolbox": "🧰", + "screwdriver": "🪛", + "wrench": "🔧", + "hammer": "🔨", + "hammer_pick": "⚒️", + "hammer_and_pick": "⚒️", + "tools": "🛠️", + "hammer_and_wrench": "🛠️", + "pick": "⛏️", + "nut_and_bolt": "🔩", + "gear": "⚙️", + "bricks": "🧱", + "chains": "⛓️", + "hook": "🪝", + "knot": "🪢", + "magnet": "🧲", + "gun": "🔫", + "bomb": "💣", + "firecracker": "🧨", + "axe": "🪓", + "carpentry_saw": "🪚", + "knife": "🔪", + "dagger": "🗡️", + "dagger_knife": "🗡️", + "crossed_swords": "⚔️", + "shield": "🛡️", + "smoking": "🚬", + "coffin": "⚰️", + "headstone": "🪦", + "urn": "⚱️", + "funeral_urn": "⚱️", + "amphora": "🏺", + "magic_wand": "🪄", + "crystal_ball": "🔮", + "prayer_beads": "📿", + "nazar_amulet": "🧿", + "barber": "💈", + "alembic": "⚗️", + "telescope": "🔭", + "microscope": "🔬", + "hole": "🕳️", + "window": "🪟", + "adhesive_bandage": "🩹", + "stethoscope": "🩺", + "pill": "💊", + "syringe": "💉", + "drop_of_blood": "🩸", + "dna": "🧬", + "microbe": "🦠", + "petri_dish": "🧫", + "test_tube": "🧪", + "thermometer": "🌡️", + "mouse_trap": "🪤", + "broom": "🧹", + "basket": "🧺", + "sewing_needle": "🪡", + "roll_of_paper": "🧻", + "toilet": "🚽", + "plunger": "🪠", + "bucket": "🪣", + "potable_water": "🚰", + "shower": "🚿", + "bathtub": "🛁", + "bath": "🛀", + "bath_tone1": "🛀🏻", + "bath_tone2": "🛀🏼", + "bath_tone3": "🛀🏽", + "bath_tone4": "🛀🏾", + "bath_tone5": "🛀🏿", + "toothbrush": "🪥", + "soap": "🧼", + "razor": "🪒", + "sponge": "🧽", + "squeeze_bottle": "🧴", + "bellhop": "🛎️", + "bellhop_bell": "🛎️", + "key": "🔑", + "key2": "🗝️", + "old_key": "🗝️", + "door": "🚪", + "chair": "🪑", + "mirror": "🪞", + "couch": "🛋️", + "couch_and_lamp": "🛋️", + "bed": "🛏️", + "sleeping_accommodation": "🛌", + "person_in_bed_tone1": "🛌🏻", + "person_in_bed_light_skin_tone": "🛌🏻", + "person_in_bed_tone2": "🛌🏼", + "person_in_bed_medium_light_skin_tone": "🛌🏼", + "person_in_bed_tone3": "🛌🏽", + "person_in_bed_medium_skin_tone": "🛌🏽", + "person_in_bed_tone4": "🛌🏾", + "person_in_bed_medium_dark_skin_tone": "🛌🏾", + "person_in_bed_tone5": "🛌🏿", + "person_in_bed_dark_skin_tone": "🛌🏿", + "teddy_bear": "🧸", + "frame_photo": "🖼️", + "frame_with_picture": "🖼️", + "shopping_bags": "🛍️", + "shopping_cart": "🛒", + "shopping_trolley": "🛒", + "gift": "🎁", + "balloon": "🎈", + "flags": "🎏", + "ribbon": "🎀", + "confetti_ball": "🎊", + "tada": "🎉", + "piñata": "🪅", + "nesting_dolls": "🪆", + "dolls": "🎎", + "izakaya_lantern": "🏮", + "wind_chime": "🎐", + "red_envelope": "🧧", + "envelope": "✉️", + "envelope_with_arrow": "📩", + "incoming_envelope": "📨", + "e_mail": "📧", + "email": "📧", + "love_letter": "💌", + "inbox_tray": "📥", + "outbox_tray": "📤", + "package": "📦", + "label": "🏷️", + "mailbox_closed": "📪", + "mailbox": "📫", + "mailbox_with_mail": "📬", + "mailbox_with_no_mail": "📭", + "postbox": "📮", + "postal_horn": "📯", + "placard": "🪧", + "scroll": "📜", + "page_with_curl": "📃", + "page_facing_up": "📄", + "bookmark_tabs": "📑", + "receipt": "🧾", + "bar_chart": "📊", + "chart_with_upwards_trend": "📈", + "chart_with_downwards_trend": "📉", + "notepad_spiral": "🗒️", + "spiral_note_pad": "🗒️", + "calendar_spiral": "🗓️", + "spiral_calendar_pad": "🗓️", + "calendar": "📆", + "date": "📅", + "wastebasket": "🗑️", + "card_index": "📇", + "card_box": "🗃️", + "card_file_box": "🗃️", + "ballot_box": "🗳️", + "ballot_box_with_ballot": "🗳️", + "file_cabinet": "🗄️", + "clipboard": "📋", + "file_folder": "📁", + "open_file_folder": "📂", + "dividers": "🗂️", + "card_index_dividers": "🗂️", + "newspaper2": "🗞️", + "rolled_up_newspaper": "🗞️", + "newspaper": "📰", + "notebook": "📓", + "notebook_with_decorative_cover": "📔", + "ledger": "📒", + "closed_book": "📕", + "green_book": "📗", + "blue_book": "📘", + "orange_book": "📙", + "books": "📚", + "book": "📖", + "bookmark": "🔖", + "safety_pin": "🧷", + "link": "🔗", + "paperclip": "📎", + "paperclips": "🖇️", + "linked_paperclips": "🖇️", + "triangular_ruler": "📐", + "straight_ruler": "📏", + "abacus": "🧮", + "pushpin": "📌", + "round_pushpin": "📍", + "scissors": "✂️", + "pen_ballpoint": "🖊️", + "lower_left_ballpoint_pen": "🖊️", + "pen_fountain": "🖋️", + "lower_left_fountain_pen": "🖋️", + "black_nib": "✒️", + "paintbrush": "🖌️", + "lower_left_paintbrush": "🖌️", + "crayon": "🖍️", + "lower_left_crayon": "🖍️", + "pencil": "📝", + "memo": "📝", + "pencil2": "✏️", + "mag": "🔍", + "mag_right": "🔎", + "lock_with_ink_pen": "🔏", + "closed_lock_with_key": "🔐", + "lock": "🔒", + "unlock": "🔓" + }, + "symbols": { + "100": "💯", + "1234": "🔢", + "heart": "❤️", + "orange_heart": "🧡", + "yellow_heart": "💛", + "green_heart": "💚", + "blue_heart": "💙", + "purple_heart": "💜", + "black_heart": "🖤", + "brown_heart": "🤎", + "white_heart": "🤍", + "broken_heart": "💔", + "heart_exclamation": "❣️", + "heavy_heart_exclamation_mark_ornament": "❣️", + "two_hearts": "💕", + "revolving_hearts": "💞", + "heartbeat": "💓", + "heartpulse": "💗", + "sparkling_heart": "💖", + "cupid": "💘", + "gift_heart": "💝", + "mending_heart": "❤️‍🩹", + "heart_on_fire": "❤️‍🔥", + "heart_decoration": "💟", + "peace": "☮️", + "peace_symbol": "☮️", + "cross": "✝️", + "latin_cross": "✝️", + "star_and_crescent": "☪️", + "om_symbol": "🕉️", + "wheel_of_dharma": "☸️", + "star_of_david": "✡️", + "six_pointed_star": "🔯", + "menorah": "🕎", + "yin_yang": "☯️", + "orthodox_cross": "☦️", + "place_of_worship": "🛐", + "worship_symbol": "🛐", + "ophiuchus": "⛎", + "aries": "♈", + "taurus": "♉", + "gemini": "♊", + "cancer": "♋", + "leo": "♌", + "virgo": "♍", + "libra": "♎", + "scorpius": "♏", + "sagittarius": "♐", + "capricorn": "♑", + "aquarius": "♒", + "pisces": "♓", + "id": "🆔", + "atom": "⚛️", + "atom_symbol": "⚛️", + "accept": "🉑", + "radioactive": "☢️", + "radioactive_sign": "☢️", + "biohazard": "☣️", + "biohazard_sign": "☣️", + "mobile_phone_off": "📴", + "vibration_mode": "📳", + "u6709": "🈶", + "u7121": "🈚", + "u7533": "🈸", + "u55b6": "🈺", + "u6708": "🈷️", + "eight_pointed_black_star": "✴️", + "vs": "🆚", + "white_flower": "💮", + "ideograph_advantage": "🉐", + "secret": "㊙️", + "congratulations": "㊗️", + "u5408": "🈴", + "u6e80": "🈵", + "u5272": "🈹", + "u7981": "🈲", + "a": "🅰️", + "b": "🅱️", + "ab": "🆎", + "cl": "🆑", + "o2": "🅾️", + "sos": "🆘", + "x": "❌", + "o": "⭕", + "octagonal_sign": "🛑", + "stop_sign": "🛑", + "no_entry": "⛔", + "name_badge": "📛", + "no_entry_sign": "🚫", + "anger": "💢", + "hotsprings": "♨️", + "no_pedestrians": "🚷", + "do_not_litter": "🚯", + "no_bicycles": "🚳", + "non_potable_water": "🚱", + "underage": "🔞", + "no_mobile_phones": "📵", + "no_smoking": "🚭", + "exclamation": "❗", + "grey_exclamation": "❕", + "question": "❓", + "grey_question": "❔", + "bangbang": "‼️", + "interrobang": "⁉️", + "low_brightness": "🔅", + "high_brightness": "🔆", + "part_alternation_mark": "〽️", + "warning": "⚠️", + "children_crossing": "🚸", + "trident": "🔱", + "fleur_de_lis": "⚜️", + "beginner": "🔰", + "recycle": "♻️", + "white_check_mark": "✅", + "u6307": "🈯", + "chart": "💹", + "sparkle": "❇️", + "eight_spoked_asterisk": "✳️", + "negative_squared_cross_mark": "❎", + "globe_with_meridians": "🌐", + "diamond_shape_with_a_dot_inside": "💠", + "m": "Ⓜ️", + "cyclone": "🌀", + "zzz": "💤", + "atm": "🏧", + "wc": "🚾", + "wheelchair": "♿", + "parking": "🅿️", + "u7a7a": "🈳", + "sa": "🈂️", + "passport_control": "🛂", + "customs": "🛃", + "baggage_claim": "🛄", + "left_luggage": "🛅", + "elevator": "🛗", + "mens": "🚹", + "womens": "🚺", + "baby_symbol": "🚼", + "restroom": "🚻", + "put_litter_in_its_place": "🚮", + "cinema": "🎦", + "signal_strength": "📶", + "koko": "🈁", + "symbols": "🔣", + "information_source": "ℹ️", + "abc": "🔤", + "abcd": "🔡", + "capital_abcd": "🔠", + "ng": "🆖", + "ok": "🆗", + "up": "🆙", + "cool": "🆒", + "new": "🆕", + "free": "🆓", + "zero": "0️⃣", + "one": "1️⃣", + "two": "2️⃣", + "three": "3️⃣", + "four": "4️⃣", + "five": "5️⃣", + "six": "6️⃣", + "seven": "7️⃣", + "eight": "8️⃣", + "nine": "9️⃣", + "keycap_ten": "🔟", + "hash": "#️⃣", + "asterisk": "*️⃣", + "keycap_asterisk": "*️⃣", + "eject": "⏏️", + "eject_symbol": "⏏️", + "arrow_forward": "▶️", + "pause_button": "⏸️", + "double_vertical_bar": "⏸️", + "play_pause": "⏯️", + "stop_button": "⏹️", + "record_button": "⏺️", + "track_next": "⏭️", + "next_track": "⏭️", + "track_previous": "⏮️", + "previous_track": "⏮️", + "fast_forward": "⏩", + "rewind": "⏪", + "arrow_double_up": "⏫", + "arrow_double_down": "⏬", + "arrow_backward": "◀️", + "arrow_up_small": "🔼", + "arrow_down_small": "🔽", + "arrow_right": "➡️", + "arrow_left": "⬅️", + "arrow_up": "⬆️", + "arrow_down": "⬇️", + "arrow_upper_right": "↗️", + "arrow_lower_right": "↘️", + "arrow_lower_left": "↙️", + "arrow_upper_left": "↖️", + "arrow_up_down": "↕️", + "left_right_arrow": "↔️", + "arrow_right_hook": "↪️", + "leftwards_arrow_with_hook": "↩️", + "arrow_heading_up": "⤴️", + "arrow_heading_down": "⤵️", + "twisted_rightwards_arrows": "🔀", + "repeat": "🔁", + "repeat_one": "🔂", + "arrows_counterclockwise": "🔄", + "arrows_clockwise": "🔃", + "musical_note": "🎵", + "notes": "🎶", + "heavy_plus_sign": "➕", + "heavy_minus_sign": "➖", + "heavy_division_sign": "➗", + "heavy_multiplication_x": "✖️", + "infinity": "♾️", + "heavy_dollar_sign": "💲", + "currency_exchange": "💱", + "tm": "™️", + "copyright": "©️", + "registered": "®️", + "wavy_dash": "〰️", + "curly_loop": "➰", + "loop": "➿", + "end": "🔚", + "back": "🔙", + "on": "🔛", + "top": "🔝", + "soon": "🔜", + "heavy_check_mark": "✔️", + "ballot_box_with_check": "☑️", + "radio_button": "🔘", + "white_circle": "⚪", + "black_circle": "⚫", + "red_circle": "🔴", + "blue_circle": "🔵", + "brown_circle": "🟤", + "purple_circle": "🟣", + "green_circle": "🟢", + "yellow_circle": "🟡", + "orange_circle": "🟠", + "small_red_triangle": "🔺", + "small_red_triangle_down": "🔻", + "small_orange_diamond": "🔸", + "small_blue_diamond": "🔹", + "large_orange_diamond": "🔶", + "large_blue_diamond": "🔷", + "white_square_button": "🔳", + "black_square_button": "🔲", + "black_small_square": "▪️", + "white_small_square": "▫️", + "black_medium_small_square": "◾", + "white_medium_small_square": "◽", + "black_medium_square": "◼️", + "white_medium_square": "◻️", + "black_large_square": "⬛", + "white_large_square": "⬜", + "orange_square": "🟧", + "blue_square": "🟦", + "red_square": "🟥", + "brown_square": "🟫", + "purple_square": "🟪", + "green_square": "🟩", + "yellow_square": "🟨", + "speaker": "🔈", + "mute": "🔇", + "sound": "🔉", + "loud_sound": "🔊", + "bell": "🔔", + "no_bell": "🔕", + "mega": "📣", + "loudspeaker": "📢", + "speech_left": "🗨️", + "left_speech_bubble": "🗨️", + "eye_in_speech_bubble": "👁‍🗨", + "speech_balloon": "💬", + "thought_balloon": "💭", + "anger_right": "🗯️", + "right_anger_bubble": "🗯️", + "spades": "♠️", + "clubs": "♣️", + "hearts": "♥️", + "diamonds": "♦️", + "black_joker": "🃏", + "flower_playing_cards": "🎴", + "mahjong": "🀄", + "clock1": "🕐", + "clock2": "🕑", + "clock3": "🕒", + "clock4": "🕓", + "clock5": "🕔", + "clock6": "🕕", + "clock7": "🕖", + "clock8": "🕗", + "clock9": "🕘", + "clock10": "🕙", + "clock11": "🕚", + "clock12": "🕛", + "clock130": "🕜", + "clock230": "🕝", + "clock330": "🕞", + "clock430": "🕟", + "clock530": "🕠", + "clock630": "🕡", + "clock730": "🕢", + "clock830": "🕣", + "clock930": "🕤", + "clock1030": "🕥", + "clock1130": "🕦", + "clock1230": "🕧", + "female_sign": "♀️", + "male_sign": "♂️", + "transgender_symbol": "⚧", + "medical_symbol": "⚕️", + "regional_indicator_z": "🇿", + "regional_indicator_y": "🇾", + "regional_indicator_x": "🇽", + "regional_indicator_w": "🇼", + "regional_indicator_v": "🇻", + "regional_indicator_u": "🇺", + "regional_indicator_t": "🇹", + "regional_indicator_s": "🇸", + "regional_indicator_r": "🇷", + "regional_indicator_q": "🇶", + "regional_indicator_p": "🇵", + "regional_indicator_o": "🇴", + "regional_indicator_n": "🇳", + "regional_indicator_m": "🇲", + "regional_indicator_l": "🇱", + "regional_indicator_k": "🇰", + "regional_indicator_j": "🇯", + "regional_indicator_i": "🇮", + "regional_indicator_h": "🇭", + "regional_indicator_g": "🇬", + "regional_indicator_f": "🇫", + "regional_indicator_e": "🇪", + "regional_indicator_d": "🇩", + "regional_indicator_c": "🇨", + "regional_indicator_b": "🇧", + "regional_indicator_a": "🇦" + }, + "flags": { + "flag_white": "🏳️", + "flag_black": "🏴", + "checkered_flag": "🏁", + "triangular_flag_on_post": "🚩", + "rainbow_flag": "🏳️‍🌈", + "gay_pride_flag": "🏳️‍🌈", + "transgender_flag": "🏳️‍⚧️", + "pirate_flag": "🏴‍☠️", + "flag_af": "🇦🇫", + "flag_ax": "🇦🇽", + "flag_al": "🇦🇱", + "flag_dz": "🇩🇿", + "flag_as": "🇦🇸", + "flag_ad": "🇦🇩", + "flag_ao": "🇦🇴", + "flag_ai": "🇦🇮", + "flag_aq": "🇦🇶", + "flag_ag": "🇦🇬", + "flag_ar": "🇦🇷", + "flag_am": "🇦🇲", + "flag_aw": "🇦🇼", + "flag_au": "🇦🇺", + "flag_at": "🇦🇹", + "flag_az": "🇦🇿", + "flag_bs": "🇧🇸", + "flag_bh": "🇧🇭", + "flag_bd": "🇧🇩", + "flag_bb": "🇧🇧", + "flag_by": "🇧🇾", + "flag_be": "🇧🇪", + "flag_bz": "🇧🇿", + "flag_bj": "🇧🇯", + "flag_bm": "🇧🇲", + "flag_bt": "🇧🇹", + "flag_bo": "🇧🇴", + "flag_ba": "🇧🇦", + "flag_bw": "🇧🇼", + "flag_br": "🇧🇷", + "flag_io": "🇮🇴", + "flag_vg": "🇻🇬", + "flag_bn": "🇧🇳", + "flag_bg": "🇧🇬", + "flag_bf": "🇧🇫", + "flag_bi": "🇧🇮", + "flag_kh": "🇰🇭", + "flag_cm": "🇨🇲", + "flag_ca": "🇨🇦", + "flag_ic": "🇮🇨", + "flag_cv": "🇨🇻", + "flag_bq": "🇧🇶", + "flag_ky": "🇰🇾", + "flag_cf": "🇨🇫", + "flag_td": "🇹🇩", + "flag_cl": "🇨🇱", + "flag_cn": "🇨🇳", + "flag_cx": "🇨🇽", + "flag_cc": "🇨🇨", + "flag_co": "🇨🇴", + "flag_km": "🇰🇲", + "flag_cg": "🇨🇬", + "flag_cd": "🇨🇩", + "flag_ck": "🇨🇰", + "flag_cr": "🇨🇷", + "flag_ci": "🇨🇮", + "flag_hr": "🇭🇷", + "flag_cu": "🇨🇺", + "flag_cw": "🇨🇼", + "flag_cy": "🇨🇾", + "flag_cz": "🇨🇿", + "flag_dk": "🇩🇰", + "flag_dj": "🇩🇯", + "flag_dm": "🇩🇲", + "flag_do": "🇩🇴", + "flag_ec": "🇪🇨", + "flag_eg": "🇪🇬", + "flag_sv": "🇸🇻", + "flag_gq": "🇬🇶", + "flag_er": "🇪🇷", + "flag_ee": "🇪🇪", + "flag_et": "🇪🇹", + "flag_eu": "🇪🇺", + "flag_fk": "🇫🇰", + "flag_fo": "🇫🇴", + "flag_fj": "🇫🇯", + "flag_fi": "🇫🇮", + "flag_fr": "🇫🇷", + "flag_gf": "🇬🇫", + "flag_pf": "🇵🇫", + "flag_tf": "🇹🇫", + "flag_ga": "🇬🇦", + "flag_gm": "🇬🇲", + "flag_ge": "🇬🇪", + "flag_de": "🇩🇪", + "flag_gh": "🇬🇭", + "flag_gi": "🇬🇮", + "flag_gr": "🇬🇷", + "flag_gl": "🇬🇱", + "flag_gd": "🇬🇩", + "flag_gp": "🇬🇵", + "flag_gu": "🇬🇺", + "flag_gt": "🇬🇹", + "flag_gg": "🇬🇬", + "flag_gn": "🇬🇳", + "flag_gw": "🇬🇼", + "flag_gy": "🇬🇾", + "flag_ht": "🇭🇹", + "flag_hn": "🇭🇳", + "flag_hk": "🇭🇰", + "flag_hu": "🇭🇺", + "flag_is": "🇮🇸", + "flag_in": "🇮🇳", + "flag_id": "🇮🇩", + "flag_ir": "🇮🇷", + "flag_iq": "🇮🇶", + "flag_ie": "🇮🇪", + "flag_im": "🇮🇲", + "flag_il": "🇮🇱", + "flag_it": "🇮🇹", + "flag_jm": "🇯🇲", + "flag_jp": "🇯🇵", + "crossed_flags": "🎌", + "flag_je": "🇯🇪", + "flag_jo": "🇯🇴", + "flag_kz": "🇰🇿", + "flag_ke": "🇰🇪", + "flag_ki": "🇰🇮", + "flag_xk": "🇽🇰", + "flag_kw": "🇰🇼", + "flag_kg": "🇰🇬", + "flag_la": "🇱🇦", + "flag_lv": "🇱🇻", + "flag_lb": "🇱🇧", + "flag_ls": "🇱🇸", + "flag_lr": "🇱🇷", + "flag_ly": "🇱🇾", + "flag_li": "🇱🇮", + "flag_lt": "🇱🇹", + "flag_lu": "🇱🇺", + "flag_mo": "🇲🇴", + "flag_mk": "🇲🇰", + "flag_mg": "🇲🇬", + "flag_mw": "🇲🇼", + "flag_my": "🇲🇾", + "flag_mv": "🇲🇻", + "flag_ml": "🇲🇱", + "flag_mt": "🇲🇹", + "flag_mh": "🇲🇭", + "flag_mq": "🇲🇶", + "flag_mr": "🇲🇷", + "flag_mu": "🇲🇺", + "flag_yt": "🇾🇹", + "flag_mx": "🇲🇽", + "flag_fm": "🇫🇲", + "flag_md": "🇲🇩", + "flag_mc": "🇲🇨", + "flag_mn": "🇲🇳", + "flag_me": "🇲🇪", + "flag_ms": "🇲🇸", + "flag_ma": "🇲🇦", + "flag_mz": "🇲🇿", + "flag_mm": "🇲🇲", + "flag_na": "🇳🇦", + "flag_nr": "🇳🇷", + "flag_np": "🇳🇵", + "flag_nl": "🇳🇱", + "flag_nc": "🇳🇨", + "flag_nz": "🇳🇿", + "flag_ni": "🇳🇮", + "flag_ne": "🇳🇪", + "flag_ng": "🇳🇬", + "flag_nu": "🇳🇺", + "flag_nf": "🇳🇫", + "flag_kp": "🇰🇵", + "flag_mp": "🇲🇵", + "flag_no": "🇳🇴", + "flag_om": "🇴🇲", + "flag_pk": "🇵🇰", + "flag_pw": "🇵🇼", + "flag_ps": "🇵🇸", + "flag_pa": "🇵🇦", + "flag_pg": "🇵🇬", + "flag_py": "🇵🇾", + "flag_pe": "🇵🇪", + "flag_ph": "🇵🇭", + "flag_pn": "🇵🇳", + "flag_pl": "🇵🇱", + "flag_pt": "🇵🇹", + "flag_pr": "🇵🇷", + "flag_qa": "🇶🇦", + "flag_re": "🇷🇪", + "flag_ro": "🇷🇴", + "flag_ru": "🇷🇺", + "flag_rw": "🇷🇼", + "flag_ws": "🇼🇸", + "flag_sm": "🇸🇲", + "flag_st": "🇸🇹", + "flag_sa": "🇸🇦", + "flag_sn": "🇸🇳", + "flag_rs": "🇷🇸", + "flag_sc": "🇸🇨", + "flag_sl": "🇸🇱", + "flag_sg": "🇸🇬", + "flag_sx": "🇸🇽", + "flag_sk": "🇸🇰", + "flag_si": "🇸🇮", + "flag_gs": "🇬🇸", + "flag_sb": "🇸🇧", + "flag_so": "🇸🇴", + "flag_za": "🇿🇦", + "flag_kr": "🇰🇷", + "flag_ss": "🇸🇸", + "flag_es": "🇪🇸", + "flag_lk": "🇱🇰", + "flag_bl": "🇧🇱", + "flag_sh": "🇸🇭", + "flag_kn": "🇰🇳", + "flag_lc": "🇱🇨", + "flag_pm": "🇵🇲", + "flag_vc": "🇻🇨", + "flag_sd": "🇸🇩", + "flag_sr": "🇸🇷", + "flag_sz": "🇸🇿", + "flag_se": "🇸🇪", + "flag_ch": "🇨🇭", + "flag_sy": "🇸🇾", + "flag_tw": "🇹🇼", + "flag_tj": "🇹🇯", + "flag_tz": "🇹🇿", + "flag_th": "🇹🇭", + "flag_tl": "🇹🇱", + "flag_tg": "🇹🇬", + "flag_tk": "🇹🇰", + "flag_to": "🇹🇴", + "flag_tt": "🇹🇹", + "flag_tn": "🇹🇳", + "flag_tr": "🇹🇷", + "flag_tm": "🇹🇲", + "flag_tc": "🇹🇨", + "flag_vi": "🇻🇮", + "flag_tv": "🇹🇻", + "flag_ug": "🇺🇬", + "flag_ua": "🇺🇦", + "flag_ae": "🇦🇪", + "flag_gb": "🇬🇧", + "england": "🏴󠁧󠁢󠁥󠁮󠁧󠁿", + "scotland": "🏴󠁧󠁢󠁳󠁣󠁴󠁿", + "wales": "🏴󠁧󠁢󠁷󠁬󠁳󠁿", + "flag_us": "🇺🇸", + "flag_uy": "🇺🇾", + "flag_uz": "🇺🇿", + "flag_vu": "🇻🇺", + "flag_va": "🇻🇦", + "flag_ve": "🇻🇪", + "flag_vn": "🇻🇳", + "flag_wf": "🇼🇫", + "flag_eh": "🇪🇭", + "flag_ye": "🇾🇪", + "flag_zm": "🇿🇲", + "flag_zw": "🇿🇼", + "flag_ac": "🇦🇨", + "flag_bv": "🇧🇻", + "flag_cp": "🇨🇵", + "flag_ea": "🇪🇦", + "flag_dg": "🇩🇬", + "flag_hm": "🇭🇲", + "flag_mf": "🇲🇫", + "flag_sj": "🇸🇯", + "flag_ta": "🇹🇦", + "flag_um": "🇺🇲", + "united_nations": "🇺🇳" + } +} diff --git a/emojiinfo/emojiinfo.py b/emojiinfo/emojiinfo.py index 8fc249a..646c107 100644 --- a/emojiinfo/emojiinfo.py +++ b/emojiinfo/emojiinfo.py @@ -9,6 +9,8 @@ from redbot.core import commands from redbot.core.bot import Red from redbot.core.utils.chat_formatting import bold, humanize_list +from .model import PartialEmoji + class EmojiInfo(commands.Cog): """Retrieve information about emojis.""" @@ -56,7 +58,7 @@ class EmojiInfo(commands.Cog): """Retrieve information about an emoji.""" await ctx.defer(ephemeral=ephemeral) - emoji: discord.PartialEmoji = discord.PartialEmoji.from_str(value=emoji) + emoji: PartialEmoji = PartialEmoji.from_str(self, value=emoji) if emoji.is_unicode_emoji(): try: @@ -70,14 +72,19 @@ class EmojiInfo(commands.Cog): if emoji.id: emoji_id = f"{bold('ID:')} `{emoji.id}`\n" markdown = f"`<{'a' if emoji.animated else ''}:{emoji.name}:{emoji.id}>`" + name = f"{bold('Name:')} {emoji.name}\n" + aliases = "" else: emoji_id = "" markdown = f"`{emoji}`" + name = f"{bold('Name:')} {emoji.aliases.pop(0)}\n" + aliases = f"{bold('Aliases:')} {', '.join(emoji.aliases)}\n" if emoji.aliases else "" string: str = ( - f"{bold('Name:')} {emoji.name}\n" + f"{name}" f"{emoji_id}" f"{bold('Native:')} {emoji.is_unicode_emoji()}\n" + f"{aliases}" f"{bold('Animated:')} {emoji.animated}\n" f"{bold('Markdown:')} {markdown}\n" f"{bold('URL:')} [Click Here]({emoji_url})" diff --git a/emojiinfo/model.py b/emojiinfo/model.py new file mode 100644 index 0000000..80b8504 --- /dev/null +++ b/emojiinfo/model.py @@ -0,0 +1,88 @@ +import json + +import discord +from redbot.core import commands, data_manager + + +class PartialEmoji(discord.PartialEmoji): + """Represents a "partial" emoji. Subclasses `discord.PartialEmoji` + + .. container:: operations + + .. describe:: x == y + + Checks if two emoji are the same. + + .. describe:: x != y + + Checks if two emoji are not the same. + + .. describe:: hash(x) + + Return the emoji's hash. + + .. describe:: str(x) + + Returns the emoji rendered for discord. + + Attributes + ----------- + name: Optional[:class:`str`] + The custom emoji name, if applicable, or the unicode codepoint + of the non-custom emoji. This can be ``None`` if the emoji + got deleted (e.g. removing a reaction with a deleted emoji). + animated: :class:`bool` + Whether the emoji is animated or not. + id: Optional[:class:`int`] + The ID of the custom emoji, if applicable. + group: Optional[:class:`str`] + The group name of the emoji if it is a native emoji. + """ + + def __init__(self, *, name: str, animated: bool = False, id: int | None = None, group: str | None = None, aliases: list | None = None) -> None: + super().__init__(name=name, animated=animated, id=id) + self.group = group + self.aliases = aliases + + @classmethod + def from_str(cls, coginstance: commands.Cog, value: str) -> "PartialEmoji": + """Converts a Discord string representation of an emoji to a :class:`PartialEmoji`. + + The formats accepted are: + + - ``a:name:id`` + - ```` + - ``name:id`` + - ``<:name:id>`` + + If the format does not match then it is assumed to be a unicode emoji. + + .. versionadded:: 2.0 + + Parameters + ------------ + value: :class:`str` + The string representation of an emoji. + + Returns + -------- + :class:`PartialEmoji` + The partial emoji from this string. + """ + match = cls._CUSTOM_EMOJI_RE.match(value) + if match is not None: + groups = match.groupdict() + animated = bool(groups['animated']) + emoji_id = int(groups['id']) + name = groups['name'] + return cls(name=name, animated=animated, id=emoji_id) + + emojis: dict = json.load(data_manager.bundled_data_path(coginstance) / "emojis.json") + emoji_aliases = [] + for dict_name, group in emojis.items: + for key, value in group.items: + if value == name: + emoji_group = dict_name + if key not in emoji_aliases: + emoji_aliases.append(key) + return cls(name=name, animated=animated, id=emoji_id, group=emoji_group, aliases=emoji_aliases) From ce595e50da1dd5ca5f43aa435fb47e689980e281 Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Wed, 8 May 2024 15:36:17 -0400 Subject: [PATCH 16/95] fix(emojiinfo): open the emojis.json file before attempting to read from it --- emojiinfo/model.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/emojiinfo/model.py b/emojiinfo/model.py index 80b8504..7f43a4b 100644 --- a/emojiinfo/model.py +++ b/emojiinfo/model.py @@ -77,7 +77,9 @@ class PartialEmoji(discord.PartialEmoji): name = groups['name'] return cls(name=name, animated=animated, id=emoji_id) - emojis: dict = json.load(data_manager.bundled_data_path(coginstance) / "emojis.json") + path: data_manager.Path = data_manager.bundled_data_path(coginstance) / "emojis.json" + with open(path, "r") as file: + emojis: dict = json.load(file) emoji_aliases = [] for dict_name, group in emojis.items: for key, value in group.items: From 4bf3e85df26b2e731b1a55ae5d38764dec0f68a5 Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Wed, 8 May 2024 15:37:20 -0400 Subject: [PATCH 17/95] fix(emojiinfo): fixed a syntax error --- emojiinfo/model.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/emojiinfo/model.py b/emojiinfo/model.py index 7f43a4b..4fe1658 100644 --- a/emojiinfo/model.py +++ b/emojiinfo/model.py @@ -81,8 +81,8 @@ class PartialEmoji(discord.PartialEmoji): with open(path, "r") as file: emojis: dict = json.load(file) emoji_aliases = [] - for dict_name, group in emojis.items: - for key, value in group.items: + for dict_name, group in emojis.items(): + for key, value in group.items(): if value == name: emoji_group = dict_name if key not in emoji_aliases: From 2b5a00f51283f300de15152b7ce4d1619360fc98 Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Wed, 8 May 2024 15:38:51 -0400 Subject: [PATCH 18/95] fix(emojiinfo): fixed an unboundlocal error --- emojiinfo/model.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/emojiinfo/model.py b/emojiinfo/model.py index 4fe1658..6660e46 100644 --- a/emojiinfo/model.py +++ b/emojiinfo/model.py @@ -82,9 +82,9 @@ class PartialEmoji(discord.PartialEmoji): emojis: dict = json.load(file) emoji_aliases = [] for dict_name, group in emojis.items(): - for key, value in group.items(): - if value == name: + for k, v in group.items(): + if v == value: emoji_group = dict_name - if key not in emoji_aliases: - emoji_aliases.append(key) - return cls(name=name, animated=animated, id=emoji_id, group=emoji_group, aliases=emoji_aliases) + if k not in emoji_aliases: + emoji_aliases.append(k) + return cls(name=value, animated=animated, id=emoji_id, group=emoji_group, aliases=emoji_aliases) From bc9bc539670c7ebd6de4493b05916a6f69c8a669 Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Wed, 8 May 2024 15:39:51 -0400 Subject: [PATCH 19/95] fix(emojiinfo): fixed another unboundlocal error --- emojiinfo/model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emojiinfo/model.py b/emojiinfo/model.py index 6660e46..b3c3449 100644 --- a/emojiinfo/model.py +++ b/emojiinfo/model.py @@ -87,4 +87,4 @@ class PartialEmoji(discord.PartialEmoji): emoji_group = dict_name if k not in emoji_aliases: emoji_aliases.append(k) - return cls(name=value, animated=animated, id=emoji_id, group=emoji_group, aliases=emoji_aliases) + return cls(name=value, animated=False, id=None, group=emoji_group, aliases=emoji_aliases) From d65d04fa7a8ed7e987ec8e8bfb7edc76806193c9 Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Wed, 8 May 2024 15:40:58 -0400 Subject: [PATCH 20/95] fix(emojiinfo): added group to the emojiinfo string --- emojiinfo/emojiinfo.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/emojiinfo/emojiinfo.py b/emojiinfo/emojiinfo.py index 646c107..1b0e640 100644 --- a/emojiinfo/emojiinfo.py +++ b/emojiinfo/emojiinfo.py @@ -74,16 +74,19 @@ class EmojiInfo(commands.Cog): markdown = f"`<{'a' if emoji.animated else ''}:{emoji.name}:{emoji.id}>`" name = f"{bold('Name:')} {emoji.name}\n" aliases = "" + group = "" else: emoji_id = "" markdown = f"`{emoji}`" name = f"{bold('Name:')} {emoji.aliases.pop(0)}\n" aliases = f"{bold('Aliases:')} {', '.join(emoji.aliases)}\n" if emoji.aliases else "" + group = f"{bold('Group:')} {emoji.group}\n" string: str = ( f"{name}" f"{emoji_id}" f"{bold('Native:')} {emoji.is_unicode_emoji()}\n" + f"{group}" f"{aliases}" f"{bold('Animated:')} {emoji.animated}\n" f"{bold('Markdown:')} {markdown}\n" From aa6e0d7590adc7977eef893c71ec8d97167e600b Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Wed, 8 May 2024 15:48:18 -0400 Subject: [PATCH 21/95] fix(emojiinfo): added descriptions to the application command parameters --- emojiinfo/emojiinfo.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/emojiinfo/emojiinfo.py b/emojiinfo/emojiinfo.py index 1b0e640..156b1d0 100644 --- a/emojiinfo/emojiinfo.py +++ b/emojiinfo/emojiinfo.py @@ -5,7 +5,7 @@ import aiohttp import discord from colorthief import ColorThief from red_commons.logging import RedTraceLogger, getLogger -from redbot.core import commands +from redbot.core import app_commands, commands from redbot.core.bot import Red from redbot.core.utils.chat_formatting import bold, humanize_list @@ -17,7 +17,7 @@ class EmojiInfo(commands.Cog): __author__: list[str] = ["SeaswimmerTheFsh"] __version__: str = "1.0.0" - __documentation__: str = "https://seacogs.coastalcommits.com/emoji/" + __documentation__: str = "https://seacogs.coastalcommits.com/emojiinfo/" def __init__(self, bot: Red) -> None: super().__init__() @@ -54,6 +54,10 @@ class EmojiInfo(commands.Cog): return color @commands.hybrid_command(name="emoji") + @app_commands.describe( + emoji="What emoji would you like to get information on?", + ephemeral="Would you like the response to be hidden?" + ) async def emoji(self, ctx: commands.Context, emoji: str, ephemeral: bool = False) -> None: """Retrieve information about an emoji.""" await ctx.defer(ephemeral=ephemeral) From 8f6afe754d257088aeabd5c697d902cd188b7a6f Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Wed, 8 May 2024 15:49:19 -0400 Subject: [PATCH 22/95] docs(emojiinfo): added documentation --- .docs/emojiinfo.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .docs/emojiinfo.md diff --git a/.docs/emojiinfo.md b/.docs/emojiinfo.md new file mode 100644 index 0000000..ec9897c --- /dev/null +++ b/.docs/emojiinfo.md @@ -0,0 +1,19 @@ +# EmojiInfo + +EmojiInfo allows you to nerdify other people's text. + +## Installation + +```bash +[p]repo add seacogs https://www.coastalcommits.com/SeaswimmerTheFsh/SeaCogs +[p]cog install seacogs emojiinfo +[p]cog load emojiinfo +``` + +## Commands + +### emoji + +- Usage: `[p]emoji [ephemeral]` + +Retrieve information about the provided emoji. If `ephemeral` is provided and the command is used as a slash command, the response will be sent as an ephemeral message. From ce5390893832bfee1bff2b42a9165d52f782797e Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Wed, 8 May 2024 15:58:26 -0400 Subject: [PATCH 23/95] fix(emojiinfo): seperated the slash command from the normal command --- emojiinfo/emojiinfo.py | 59 +++++++++++++++++++++++++++++------------- 1 file changed, 41 insertions(+), 18 deletions(-) diff --git a/emojiinfo/emojiinfo.py b/emojiinfo/emojiinfo.py index 156b1d0..df30008 100644 --- a/emojiinfo/emojiinfo.py +++ b/emojiinfo/emojiinfo.py @@ -53,23 +53,12 @@ class EmojiInfo(commands.Cog): color = discord.Color.from_rgb(*dominant_color) return color - @commands.hybrid_command(name="emoji") - @app_commands.describe( - emoji="What emoji would you like to get information on?", - ephemeral="Would you like the response to be hidden?" - ) - async def emoji(self, ctx: commands.Context, emoji: str, ephemeral: bool = False) -> None: - """Retrieve information about an emoji.""" - await ctx.defer(ephemeral=ephemeral) - - emoji: PartialEmoji = PartialEmoji.from_str(self, value=emoji) - + async def get_emoji_info(self, emoji: PartialEmoji) -> tuple[str, str]: if emoji.is_unicode_emoji(): try: emoji_url = await self.fetch_twemoji(unicode_emoji=emoji.name) - except Exception: - await ctx.send("Please provide a valid emoji!", ephemeral=ephemeral) - return + except Exception as e: + raise e else: emoji_url = emoji.url @@ -86,7 +75,7 @@ class EmojiInfo(commands.Cog): aliases = f"{bold('Aliases:')} {', '.join(emoji.aliases)}\n" if emoji.aliases else "" group = f"{bold('Group:')} {emoji.group}\n" - string: str = ( + return ( f"{name}" f"{emoji_id}" f"{bold('Native:')} {emoji.is_unicode_emoji()}\n" @@ -95,12 +84,46 @@ class EmojiInfo(commands.Cog): f"{bold('Animated:')} {emoji.animated}\n" f"{bold('Markdown:')} {markdown}\n" f"{bold('URL:')} [Click Here]({emoji_url})" - ) + ), emoji_url + + @app_commands.command(name="emoji") + @app_commands.describe( + emoji="What emoji would you like to get information on?", + ephemeral="Would you like the response to be hidden?" + ) + async def emoji_slash(self, interaction: discord.Interaction, emoji: str, ephemeral: bool) -> None: + """Retrieve information about an emoji.""" + interaction.response.defer(ephemeral=ephemeral) + + emoji: PartialEmoji = PartialEmoji.from_str(self, value=emoji) + + try: + string, emoji_url, = await self.get_emoji_info(emoji) + except Exception: + return await interaction.followup.send("Please provide a valid emoji!") + + if await self.bot.embed_requested(channel=interaction.channel): + embed = embed = discord.Embed(title="Emoji Information", description=string, color = await self.fetch_primary_color(emoji_url) or await self.bot.get_embed_color(interaction.channel)) + embed.set_thumbnail(url=emoji_url) + + await interaction.followup.send(embed=embed) + else: + await interaction.followup.send(content=string) + + @commands.command(name="emoji") + async def emoji(self, ctx: commands.Context, *, emoji: str) -> None: + """Retrieve information about an emoji.""" + emoji: PartialEmoji = PartialEmoji.from_str(self, value=emoji) + + try: + string, emoji_url, = await self.get_emoji_info(emoji) + except Exception: + return await ctx.send("Please provide a valid emoji!") if await ctx.embed_requested(): embed = embed = discord.Embed(title="Emoji Information", description=string, color = await self.fetch_primary_color(emoji_url) or await ctx.embed_color) embed.set_thumbnail(url=emoji_url) - await ctx.send(embed=embed, ephemeral=ephemeral) + await ctx.send(embed=embed) else: - await ctx.send(content=string, ephemeral=ephemeral) + await ctx.send(content=string) From 66df7664a5c4aaf853eb9096590e0a6bf30039ef Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Wed, 8 May 2024 15:59:10 -0400 Subject: [PATCH 24/95] fix(emojiinfo): awaited a coroutine --- emojiinfo/emojiinfo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emojiinfo/emojiinfo.py b/emojiinfo/emojiinfo.py index df30008..9511ac0 100644 --- a/emojiinfo/emojiinfo.py +++ b/emojiinfo/emojiinfo.py @@ -93,7 +93,7 @@ class EmojiInfo(commands.Cog): ) async def emoji_slash(self, interaction: discord.Interaction, emoji: str, ephemeral: bool) -> None: """Retrieve information about an emoji.""" - interaction.response.defer(ephemeral=ephemeral) + await interaction.response.defer(ephemeral=ephemeral) emoji: PartialEmoji = PartialEmoji.from_str(self, value=emoji) From d126f1e6d34678da93f346506ffa85eb424dfa6e Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Wed, 8 May 2024 16:00:36 -0400 Subject: [PATCH 25/95] fix(emojiinfo): made the ephemeral argument optional in the slash command --- emojiinfo/emojiinfo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emojiinfo/emojiinfo.py b/emojiinfo/emojiinfo.py index 9511ac0..f327eb1 100644 --- a/emojiinfo/emojiinfo.py +++ b/emojiinfo/emojiinfo.py @@ -91,7 +91,7 @@ class EmojiInfo(commands.Cog): emoji="What emoji would you like to get information on?", ephemeral="Would you like the response to be hidden?" ) - async def emoji_slash(self, interaction: discord.Interaction, emoji: str, ephemeral: bool) -> None: + async def emoji_slash(self, interaction: discord.Interaction, emoji: str, ephemeral: bool = False) -> None: """Retrieve information about an emoji.""" await interaction.response.defer(ephemeral=ephemeral) From e59503829f11a02fc0c5fe5072992b4f3a63e1a6 Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Wed, 8 May 2024 16:02:56 -0400 Subject: [PATCH 26/95] fix(emojiinfo): add the PartialEmoji.from_str call to the try and except blocks --- emojiinfo/emojiinfo.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/emojiinfo/emojiinfo.py b/emojiinfo/emojiinfo.py index f327eb1..f3a520b 100644 --- a/emojiinfo/emojiinfo.py +++ b/emojiinfo/emojiinfo.py @@ -57,7 +57,7 @@ class EmojiInfo(commands.Cog): if emoji.is_unicode_emoji(): try: emoji_url = await self.fetch_twemoji(unicode_emoji=emoji.name) - except Exception as e: + except IndexError as e: raise e else: emoji_url = emoji.url @@ -95,11 +95,10 @@ class EmojiInfo(commands.Cog): """Retrieve information about an emoji.""" await interaction.response.defer(ephemeral=ephemeral) - emoji: PartialEmoji = PartialEmoji.from_str(self, value=emoji) - try: + emoji: PartialEmoji = PartialEmoji.from_str(self, value=emoji) string, emoji_url, = await self.get_emoji_info(emoji) - except Exception: + except (IndexError, UnboundLocalError): return await interaction.followup.send("Please provide a valid emoji!") if await self.bot.embed_requested(channel=interaction.channel): @@ -113,11 +112,10 @@ class EmojiInfo(commands.Cog): @commands.command(name="emoji") async def emoji(self, ctx: commands.Context, *, emoji: str) -> None: """Retrieve information about an emoji.""" - emoji: PartialEmoji = PartialEmoji.from_str(self, value=emoji) - try: + emoji: PartialEmoji = PartialEmoji.from_str(self, value=emoji) string, emoji_url, = await self.get_emoji_info(emoji) - except Exception: + except (IndexError, UnboundLocalError): return await ctx.send("Please provide a valid emoji!") if await ctx.embed_requested(): From e1bfa79cb938d124ed656c93b88cc93c5d930b87 Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Wed, 8 May 2024 16:06:22 -0400 Subject: [PATCH 27/95] fix(emojiinfo): pylint fixes --- emojiinfo/model.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/emojiinfo/model.py b/emojiinfo/model.py index b3c3449..af457d1 100644 --- a/emojiinfo/model.py +++ b/emojiinfo/model.py @@ -39,7 +39,7 @@ class PartialEmoji(discord.PartialEmoji): The group name of the emoji if it is a native emoji. """ - def __init__(self, *, name: str, animated: bool = False, id: int | None = None, group: str | None = None, aliases: list | None = None) -> None: + def __init__(self, *, name: str, animated: bool = False, id: int | None = None, group: str | None = None, aliases: list | None = None) -> None: # pylint: disable=redefined-builtin super().__init__(name=name, animated=animated, id=id) self.group = group self.aliases = aliases @@ -78,7 +78,7 @@ class PartialEmoji(discord.PartialEmoji): return cls(name=name, animated=animated, id=emoji_id) path: data_manager.Path = data_manager.bundled_data_path(coginstance) / "emojis.json" - with open(path, "r") as file: + with open(path, "r", encoding="UTF-8") as file: emojis: dict = json.load(file) emoji_aliases = [] for dict_name, group in emojis.items(): From fb34593707707ba6c3588dcd25c86f620535b989 Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Wed, 8 May 2024 16:10:34 -0400 Subject: [PATCH 28/95] docs(emojiinfo): made docs visible on the navigation header --- mkdocs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/mkdocs.yml b/mkdocs.yml index c769609..2777b5f 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -18,6 +18,7 @@ nav: - Configuration: aurora/configuration.md - Bible: bible.md - Backup: backup.md + - EmojiInfo: emojiinfo.md - Nerdify: nerdify.md - Pterodactyl: - pterodactyl/index.md From 09ab8aa69d98c7fb5cc5f916723cdc865ebeb8d0 Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Wed, 8 May 2024 16:11:09 -0400 Subject: [PATCH 29/95] docs(emojiinfo): changed a string --- .docs/emojiinfo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.docs/emojiinfo.md b/.docs/emojiinfo.md index ec9897c..1473e59 100644 --- a/.docs/emojiinfo.md +++ b/.docs/emojiinfo.md @@ -1,6 +1,6 @@ # EmojiInfo -EmojiInfo allows you to nerdify other people's text. +EmojiInfo allows you to retrieve information about an emoji. ## Installation From 7bd9531b5811140ec0f1dd274b7e971a0fa9dcf0 Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Mon, 13 May 2024 19:26:13 -0400 Subject: [PATCH 30/95] feat(seautils): added the cog --- seautils/__init__.py | 5 +++++ seautils/info.json | 12 ++++++++++++ seautils/seautils.py | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+) create mode 100644 seautils/__init__.py create mode 100644 seautils/info.json create mode 100644 seautils/seautils.py diff --git a/seautils/__init__.py b/seautils/__init__.py new file mode 100644 index 0000000..dd217b4 --- /dev/null +++ b/seautils/__init__.py @@ -0,0 +1,5 @@ +from .seautils import SeaUtils + + +async def setup(bot): + await bot.add_cog(SeaUtils(bot)) diff --git a/seautils/info.json b/seautils/info.json new file mode 100644 index 0000000..f331eac --- /dev/null +++ b/seautils/info.json @@ -0,0 +1,12 @@ +{ + "author" : ["SeaswimmerTheFsh (seasw.)"], + "install_msg" : "Thank you for installing SeaUtils!\nYou can find the source code of this cog [here](https://coastalcommits.com/SeaswimmerTheFsh/SeaCogs).", + "name" : "SeaUtils", + "short" : "A collection of useful utilities.", + "description" : "A collection of useful utilities.", + "end_user_data_statement" : "This cog does not store end user data.", + "hidden": true, + "disabled": false, + "min_bot_version": "3.5.0", + "min_python_version": [3, 8, 0] +} diff --git a/seautils/seautils.py b/seautils/seautils.py new file mode 100644 index 0000000..c42fc0e --- /dev/null +++ b/seautils/seautils.py @@ -0,0 +1,42 @@ +# _____ _ +# / ____| (_) +# | (___ ___ __ _ _____ ___ _ __ ___ _ __ ___ ___ _ __ +# \___ \ / _ \/ _` / __\ \ /\ / / | '_ ` _ \| '_ ` _ \ / _ \ '__| +# ____) | __/ (_| \__ \\ V V /| | | | | | | | | | | | __/ | +# |_____/ \___|\__,_|___/ \_/\_/ |_|_| |_| |_|_| |_| |_|\___|_| + +import inspect + +from redbot.core import commands +from redbot.core.bot import Red +from redbot.core.utils import chat_formatting as cf + + +class SeaUtils(commands.Cog): + """A collection of random utilities.""" + + __author__ = ["SeaswimmerTheFsh"] + __version__ = "1.0.0" + + def __init__(self, bot: Red): + self.bot = bot + + def format_help_for_context(self, ctx: commands.Context) -> str: + pre_processed = super().format_help_for_context(ctx) or "" + n = "\n" if "\n\n" not in pre_processed else "" + text = [ + f"{pre_processed}{n}", + f"Cog Version: **{self.__version__}**", + f"Author: {cf.humanize_list(self.__author__)}" + ] + return "\n".join(text) + + @commands.command(aliases=["source"]) + @commands.is_owner() + async def showcode(self, ctx: commands.Context, *, command: str): + """Show the code for a particular command.""" + try: + content = cf.pagify(inspect.getsource(self.bot.get_command(command).callback)) + await ctx.send_interactive(content, box_lang='py') + except OSError: + await ctx.send("Command not found.") From 516c0feeccfbcece8fbb13f34560f1093d0f689d Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Mon, 13 May 2024 20:17:00 -0400 Subject: [PATCH 31/95] fix(seautils): catch the attributeerror --- seautils/seautils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index c42fc0e..367ff3d 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -38,5 +38,5 @@ class SeaUtils(commands.Cog): try: content = cf.pagify(inspect.getsource(self.bot.get_command(command).callback)) await ctx.send_interactive(content, box_lang='py') - except OSError: + except (OSError, AttributeError): await ctx.send("Command not found.") From 59848fe85701f959ed337c6c94adee34db3700f4 Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Mon, 13 May 2024 20:22:13 -0400 Subject: [PATCH 32/95] misc(seautils): added more aliases to showcode --- seautils/seautils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 367ff3d..c59d089 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -31,7 +31,7 @@ class SeaUtils(commands.Cog): ] return "\n".join(text) - @commands.command(aliases=["source"]) + @commands.command(aliases=["source", "src", "code", "showsource"]) @commands.is_owner() async def showcode(self, ctx: commands.Context, *, command: str): """Show the code for a particular command.""" From bb1aca83dd58f240864d8ebfc5c481ba5fb8b531 Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Mon, 13 May 2024 21:09:02 -0400 Subject: [PATCH 33/95] feat(seautils): added some more functionality to showcode --- seautils/seautils.py | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index c59d089..374d28e 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -7,9 +7,11 @@ import inspect +from discord import Embed from redbot.core import commands from redbot.core.bot import Red from redbot.core.utils import chat_formatting as cf +from redbot.core.utils.views import SimpleMenu class SeaUtils(commands.Cog): @@ -36,7 +38,21 @@ class SeaUtils(commands.Cog): async def showcode(self, ctx: commands.Context, *, command: str): """Show the code for a particular command.""" try: - content = cf.pagify(inspect.getsource(self.bot.get_command(command).callback)) - await ctx.send_interactive(content, box_lang='py') + temp_content = [] + content = [] + for page in cf.pagify( + text=inspect.getsource(self.bot.get_command(command).callback), + escape_mass_mentions=True, + page_length = 1977 + ): + temp_content.append(cf.box(page, lang='py')) + + max_i = len(temp_content) + i = 1 + for page in temp_content: + content.append(f"**Page {i}/{max_i}**\n{page}") + i += 1 + await SimpleMenu(content, disable_after_timeout=True, timeout=180).start(ctx) except (OSError, AttributeError): - await ctx.send("Command not found.") + embed = Embed(title="Command not found!", color=await ctx.embed_color()) + await ctx.send(embed=embed, reference=ctx.message.to_reference(fail_if_not_exists=False)) From 84d2728d3af54d430f99d3dd70ef5f26d836a1b5 Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Mon, 13 May 2024 21:11:15 -0400 Subject: [PATCH 34/95] misc(seautils): optimized showcode --- seautils/seautils.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 374d28e..b9f9ef8 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -38,19 +38,16 @@ class SeaUtils(commands.Cog): async def showcode(self, ctx: commands.Context, *, command: str): """Show the code for a particular command.""" try: - temp_content = [] - content = [] - for page in cf.pagify( + temp_content = cf.pagify( text=inspect.getsource(self.bot.get_command(command).callback), escape_mass_mentions=True, page_length = 1977 - ): - temp_content.append(cf.box(page, lang='py')) - + ) + content = [] max_i = len(temp_content) i = 1 for page in temp_content: - content.append(f"**Page {i}/{max_i}**\n{page}") + content.append(f"**Page {i}/{max_i}**\n{cf.box(page, lang='py')}") i += 1 await SimpleMenu(content, disable_after_timeout=True, timeout=180).start(ctx) except (OSError, AttributeError): From 059badaa9bc78525d62194c91106cec8e3d0e43b Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Mon, 13 May 2024 21:12:51 -0400 Subject: [PATCH 35/95] fix(seautils): use length_hint --- seautils/seautils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index b9f9ef8..66d877a 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -6,6 +6,7 @@ # |_____/ \___|\__,_|___/ \_/\_/ |_|_| |_| |_|_| |_| |_|\___|_| import inspect +import operator from discord import Embed from redbot.core import commands @@ -44,7 +45,7 @@ class SeaUtils(commands.Cog): page_length = 1977 ) content = [] - max_i = len(temp_content) + max_i = operator.length_hint(temp_content) i = 1 for page in temp_content: content.append(f"**Page {i}/{max_i}**\n{cf.box(page, lang='py')}") From 2dcbcb0a59cc86d12a48e973d11f581d3255447f Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Mon, 13 May 2024 21:14:15 -0400 Subject: [PATCH 36/95] fix(seautils): use ctx.embed_requested() --- seautils/seautils.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 66d877a..e4468ca 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -50,7 +50,10 @@ class SeaUtils(commands.Cog): for page in temp_content: content.append(f"**Page {i}/{max_i}**\n{cf.box(page, lang='py')}") i += 1 - await SimpleMenu(content, disable_after_timeout=True, timeout=180).start(ctx) + await SimpleMenu(pages=content, disable_after_timeout=True, timeout=180).start(ctx) except (OSError, AttributeError): - embed = Embed(title="Command not found!", color=await ctx.embed_color()) - await ctx.send(embed=embed, reference=ctx.message.to_reference(fail_if_not_exists=False)) + if ctx.embed_requested(): + embed = Embed(title="Command not found!", color=await ctx.embed_color()) + await ctx.send(embed=embed, reference=ctx.message.to_reference(fail_if_not_exists=False)) + else: + await ctx.send(content="Command not found!", reference=ctx.message.to_reference(fail_if_not_exists=False)) From 511659878899e1cff8ed19b845ed16fd46420633 Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Fri, 17 May 2024 00:12:40 -0400 Subject: [PATCH 37/95] feat(seautils): add support for cogs and slash commands --- seautils/seautils.py | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index e4468ca..897baf5 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -7,10 +7,14 @@ import inspect import operator +from functools import partial, partialmethod +from typing import Any -from discord import Embed +from discord import Embed, app_commands +from discord.utils import CachedSlotProperty, cached_property from redbot.core import commands from redbot.core.bot import Red +from redbot.core.dev_commands import cleanup_code from redbot.core.utils import chat_formatting as cf from redbot.core.utils.views import SimpleMenu @@ -34,13 +38,34 @@ class SeaUtils(commands.Cog): ] return "\n".join(text) + def format_src(self, ctx: commands.Context, obj: Any) -> str: + """A large portion of this code is repurposed from Zephyrkul's RTFS cog. + https://github.com/Zephyrkul/FluffyCogs/blob/master/rtfs/rtfs.py""" + obj = inspect.unwrap(obj) + src: Any = getattr(obj, "__func__", obj) + if isinstance(obj, (commands.Command, app_commands.Command)): + src = obj.callback + elif isinstance(obj, (partial, partialmethod)): + src = obj.func + elif isinstance(obj, property): + src = obj.fget + elif isinstance(obj, (cached_property, CachedSlotProperty)): + src = obj.function + return inspect.getsource(src) + @commands.command(aliases=["source", "src", "code", "showsource"]) @commands.is_owner() - async def showcode(self, ctx: commands.Context, *, command: str): - """Show the code for a particular command.""" + async def showcode(self, ctx: commands.Context, *, object: str): + """Show the code for a particular object.""" try: + if object.startswith("/") and (obj := ctx.bot.tree.get_command(object[1:])): + text = self.format_src(ctx, obj) + elif obj := ctx.bot.get_cog(object): + text = self.format_src(ctx, type(obj)) + elif obj:= ctx.bot.get_command(object): + text = self.format_src(ctx, obj) temp_content = cf.pagify( - text=inspect.getsource(self.bot.get_command(command).callback), + text=cleanup_code(text), escape_mass_mentions=True, page_length = 1977 ) @@ -53,7 +78,7 @@ class SeaUtils(commands.Cog): await SimpleMenu(pages=content, disable_after_timeout=True, timeout=180).start(ctx) except (OSError, AttributeError): if ctx.embed_requested(): - embed = Embed(title="Command not found!", color=await ctx.embed_color()) + embed = Embed(title="Object not found!", color=await ctx.embed_color()) await ctx.send(embed=embed, reference=ctx.message.to_reference(fail_if_not_exists=False)) else: - await ctx.send(content="Command not found!", reference=ctx.message.to_reference(fail_if_not_exists=False)) + await ctx.send(content="Object not found!", reference=ctx.message.to_reference(fail_if_not_exists=False)) From 7019b9ffe5ad87ef0876b66189ba29409bba534d Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Fri, 17 May 2024 00:14:33 -0400 Subject: [PATCH 38/95] fix(seautils): catch an UnboundLocalError --- seautils/seautils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 897baf5..3bdf8b4 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -76,7 +76,7 @@ class SeaUtils(commands.Cog): content.append(f"**Page {i}/{max_i}**\n{cf.box(page, lang='py')}") i += 1 await SimpleMenu(pages=content, disable_after_timeout=True, timeout=180).start(ctx) - except (OSError, AttributeError): + except (OSError, AttributeError, UnboundLocalError): if ctx.embed_requested(): embed = Embed(title="Object not found!", color=await ctx.embed_color()) await ctx.send(embed=embed, reference=ctx.message.to_reference(fail_if_not_exists=False)) From d556ee3704f9a62d0c340eccee69efc3be3b7f61 Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Fri, 17 May 2024 00:20:00 -0400 Subject: [PATCH 39/95] fix(seautils): minor syntax change --- seautils/seautils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 3bdf8b4..6790627 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -62,7 +62,7 @@ class SeaUtils(commands.Cog): text = self.format_src(ctx, obj) elif obj := ctx.bot.get_cog(object): text = self.format_src(ctx, type(obj)) - elif obj:= ctx.bot.get_command(object): + elif obj := ctx.bot.get_command(object): text = self.format_src(ctx, obj) temp_content = cf.pagify( text=cleanup_code(text), From 3fd91d977630f53e62f08f8a89d37ab8d82c95c0 Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Fri, 17 May 2024 00:44:19 -0400 Subject: [PATCH 40/95] misc(emojiinfo): default slash command to ephemeral true --- emojiinfo/emojiinfo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emojiinfo/emojiinfo.py b/emojiinfo/emojiinfo.py index f3a520b..e6cbc99 100644 --- a/emojiinfo/emojiinfo.py +++ b/emojiinfo/emojiinfo.py @@ -91,7 +91,7 @@ class EmojiInfo(commands.Cog): emoji="What emoji would you like to get information on?", ephemeral="Would you like the response to be hidden?" ) - async def emoji_slash(self, interaction: discord.Interaction, emoji: str, ephemeral: bool = False) -> None: + async def emoji_slash(self, interaction: discord.Interaction, emoji: str, ephemeral: bool = True) -> None: """Retrieve information about an emoji.""" await interaction.response.defer(ephemeral=ephemeral) From d8758cfb1d4dc534867e2d055b222753917263ef Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Fri, 17 May 2024 00:46:25 -0400 Subject: [PATCH 41/95] misc(emojiinfo): verbosity --- emojiinfo/emojiinfo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emojiinfo/emojiinfo.py b/emojiinfo/emojiinfo.py index e6cbc99..8ec2a45 100644 --- a/emojiinfo/emojiinfo.py +++ b/emojiinfo/emojiinfo.py @@ -62,7 +62,7 @@ class EmojiInfo(commands.Cog): else: emoji_url = emoji.url - if emoji.id: + if emoji.id is not None: emoji_id = f"{bold('ID:')} `{emoji.id}`\n" markdown = f"`<{'a' if emoji.animated else ''}:{emoji.name}:{emoji.id}>`" name = f"{bold('Name:')} {emoji.name}\n" From c9a47603a7d777ca86c28f5225b16877249876b3 Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Fri, 17 May 2024 00:48:14 -0400 Subject: [PATCH 42/95] fix(emojiinfo): add a debug logging call --- emojiinfo/emojiinfo.py | 1 + 1 file changed, 1 insertion(+) diff --git a/emojiinfo/emojiinfo.py b/emojiinfo/emojiinfo.py index 8ec2a45..e464485 100644 --- a/emojiinfo/emojiinfo.py +++ b/emojiinfo/emojiinfo.py @@ -98,6 +98,7 @@ class EmojiInfo(commands.Cog): try: emoji: PartialEmoji = PartialEmoji.from_str(self, value=emoji) string, emoji_url, = await self.get_emoji_info(emoji) + self.logger.verbose(f"Emoji:\n{string}") except (IndexError, UnboundLocalError): return await interaction.followup.send("Please provide a valid emoji!") From d95c9b32555c5f4f37e1b3b31e8a475097a48a56 Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Fri, 17 May 2024 00:57:30 -0400 Subject: [PATCH 43/95] fix(emojiinfo): oops lmao --- emojiinfo/emojiinfo.py | 1 + 1 file changed, 1 insertion(+) diff --git a/emojiinfo/emojiinfo.py b/emojiinfo/emojiinfo.py index e464485..7413e6e 100644 --- a/emojiinfo/emojiinfo.py +++ b/emojiinfo/emojiinfo.py @@ -116,6 +116,7 @@ class EmojiInfo(commands.Cog): try: emoji: PartialEmoji = PartialEmoji.from_str(self, value=emoji) string, emoji_url, = await self.get_emoji_info(emoji) + self.logger.verbose(f"Emoji:\n{string}") except (IndexError, UnboundLocalError): return await ctx.send("Please provide a valid emoji!") From 7ed836a1cd8c82160823ca69a7260454e2fb1d63 Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Sun, 19 May 2024 00:18:48 -0400 Subject: [PATCH 44/95] fix(seautils): pylint fixes --- seautils/seautils.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 6790627..c575f6b 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -38,7 +38,7 @@ class SeaUtils(commands.Cog): ] return "\n".join(text) - def format_src(self, ctx: commands.Context, obj: Any) -> str: + def format_src(self, obj: Any) -> str: """A large portion of this code is repurposed from Zephyrkul's RTFS cog. https://github.com/Zephyrkul/FluffyCogs/blob/master/rtfs/rtfs.py""" obj = inspect.unwrap(obj) @@ -55,15 +55,15 @@ class SeaUtils(commands.Cog): @commands.command(aliases=["source", "src", "code", "showsource"]) @commands.is_owner() - async def showcode(self, ctx: commands.Context, *, object: str): + async def showcode(self, ctx: commands.Context, *, object: str): # pylint: disable=redefined-builtin """Show the code for a particular object.""" try: if object.startswith("/") and (obj := ctx.bot.tree.get_command(object[1:])): - text = self.format_src(ctx, obj) + text = self.format_src(obj) elif obj := ctx.bot.get_cog(object): - text = self.format_src(ctx, type(obj)) + text = self.format_src(type(obj)) elif obj := ctx.bot.get_command(object): - text = self.format_src(ctx, obj) + text = self.format_src(obj) temp_content = cf.pagify( text=cleanup_code(text), escape_mass_mentions=True, From 1405dae49e5ed8b66d7d483b4550350557bc3ef3 Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Mon, 20 May 2024 20:59:01 -0400 Subject: [PATCH 45/95] fix(aurora): add roles to evidenceformat --- aurora/aurora.py | 20 +++++--------------- aurora/utilities/factory.py | 4 ++++ 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/aurora/aurora.py b/aurora/aurora.py index 15a9b2f..563a82c 100644 --- a/aurora/aurora.py +++ b/aurora/aurora.py @@ -19,8 +19,7 @@ from redbot.core import app_commands, commands, data_manager from redbot.core.app_commands import Choice from redbot.core.bot import Red from redbot.core.commands.converter import parse_relativedelta, parse_timedelta -from redbot.core.utils.chat_formatting import (box, error, humanize_list, - humanize_timedelta, warning) +from redbot.core.utils.chat_formatting import box, error, humanize_list, humanize_timedelta, warning from aurora.importers.aurora import ImportAuroraView from aurora.importers.galacticbot import ImportGalacticBotView @@ -29,19 +28,10 @@ from aurora.menus.guild import Guild from aurora.menus.immune import Immune from aurora.menus.overrides import Overrides from aurora.utilities.config import config, register_config -from aurora.utilities.database import (connect, create_guild_table, fetch_case, - mysql_log) -from aurora.utilities.factory import (addrole_embed, case_factory, - changes_factory, evidenceformat_factory, - guild_embed, immune_embed, - message_factory, overrides_embed) +from aurora.utilities.database import connect, create_guild_table, fetch_case, mysql_log +from aurora.utilities.factory import addrole_embed, case_factory, changes_factory, evidenceformat_factory, guild_embed, immune_embed, message_factory, overrides_embed from aurora.utilities.logger import logger -from aurora.utilities.utils import (check_moddable, check_permissions, - convert_timedelta_to_str, - fetch_channel_dict, fetch_user_dict, - generate_dict, get_footer_image, log, - send_evidenceformat, - timedelta_from_relativedelta) +from aurora.utilities.utils import check_moddable, check_permissions, convert_timedelta_to_str, fetch_channel_dict, fetch_user_dict, generate_dict, get_footer_image, log, send_evidenceformat, timedelta_from_relativedelta class Aurora(commands.Cog): @@ -50,7 +40,7 @@ class Aurora(commands.Cog): This cog stores all of its data in an SQLite database.""" __author__ = ["SeaswimmerTheFsh"] - __version__ = "2.1.2" + __version__ = "2.1.3" __documentation__ = "https://seacogs.coastalcommits.com/aurora/" async def red_delete_data_for_user(self, *, requester, user_id: int): diff --git a/aurora/utilities/factory.py b/aurora/utilities/factory.py index d7f4eb7..0d8a8cd 100644 --- a/aurora/utilities/factory.py +++ b/aurora/utilities/factory.py @@ -381,6 +381,10 @@ async def evidenceformat_factory(interaction: Interaction, case_dict: dict) -> s content = f"Case: {case_dict['moderation_id']:,} ({str.title(case_dict['moderation_type'])})\nTarget: {target_name} ({target_user['id']})\nModerator: {moderator_name} ({moderator_user['id']})" + if case_dict["role_id"] != "0": + role = interaction.guild.get_role(int(case_dict["role_id"])) + content += "\nRole: " + (role.name if role is not None else case_dict["role_id"]) + if case_dict["duration"] != "NULL": hours, minutes, seconds = map(int, case_dict["duration"].split(":")) td = timedelta(hours=hours, minutes=minutes, seconds=seconds) From ee9b62db5b8dc1aef4e6e5a198c84c546d724363 Mon Sep 17 00:00:00 2001 From: Sea Date: Thu, 23 May 2024 18:00:56 +0000 Subject: [PATCH 46/95] misc(repo): add index_name key to info.json --- info.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/info.json b/info.json index 04f29ab..816e30b 100644 --- a/info.json +++ b/info.json @@ -3,7 +3,7 @@ "SeaswimmerTheFsh (seasw.)" ], "install_msg": "Thanks for installing my repo!\n\nIf you have any issues with any of the cogs, please create an issue [here](https://coastalcommits.com/SeaswimmerTheFsh/SeaCogs/issues) or join my [Discord Server](https://discord.gg/eMUMe77Yb8 ).", - "name": "SeaCogs", + "index_name": "sea-cogs", "short": "Various cogs for Red, by SeaswimmerTheFsh (seasw.)", "description": "Various cogs for Red, by SeaswimmerTheFsh (seasw.)" } From e9c062afa951bef99b46c371f77652a92252e7d4 Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 16:22:22 -0400 Subject: [PATCH 47/95] feat(seautils): added dig command --- seautils/seautils.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/seautils/seautils.py b/seautils/seautils.py index c575f6b..d2c42b3 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -5,6 +5,7 @@ # ____) | __/ (_| \__ \\ V V /| | | | | | | | | | | | __/ | # |_____/ \___|\__,_|___/ \_/\_/ |_|_| |_| |_|_| |_| |_|\___|_| +import asyncio import inspect import operator from functools import partial, partialmethod @@ -82,3 +83,22 @@ class SeaUtils(commands.Cog): await ctx.send(embed=embed, reference=ctx.message.to_reference(fail_if_not_exists=False)) else: await ctx.send(content="Object not found!", reference=ctx.message.to_reference(fail_if_not_exists=False)) + + @commands.command(name='dig', aliases=['dnslookup', 'nslookup']) + @commands.is_owner() + async def dig(self, ctx: commands.Context, name: str, type: str | None = 'A', server: str | None = None, port: int = 53) -> None: + """Retrieve DNS information for a domain.""" + command_opts: list[str | int] = ['dig'] + if server: + command_opts.extend(['@', server]) + command_opts.extend([name, type]) + if port != 53: + command_opts.extend(['-p', port]) + command_opts.extend(['+yaml']) + + process = await asyncio.create_subprocess_exec(*command_opts, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE) + stdout, stderr = await process.communicate() + if stderr: + await ctx.send(content=cf.box(text=stderr.decode())) + else: + await ctx.send(content=cf.box(text=stdout.decode(), lang='yaml')) From 8867cc627f8c107f99fbcbace6a0ebcbd2e7b2ba Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 16:33:15 -0400 Subject: [PATCH 48/95] feat(seautils): add an embed to the dig command --- seautils/seautils.py | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index d2c42b3..15362a7 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -8,9 +8,11 @@ import asyncio import inspect import operator +from datetime import datetime from functools import partial, partialmethod from typing import Any +import yaml from discord import Embed, app_commands from discord.utils import CachedSlotProperty, cached_property from redbot.core import commands @@ -99,6 +101,31 @@ class SeaUtils(commands.Cog): process = await asyncio.create_subprocess_exec(*command_opts, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE) stdout, stderr = await process.communicate() if stderr: - await ctx.send(content=cf.box(text=stderr.decode())) + await ctx.maybe_send_embed(content= "An error was encountered!\n" + cf.box(text=stderr.decode())) else: - await ctx.send(content=cf.box(text=stdout.decode(), lang='yaml')) + data = yaml.safe_load(stdout.decode()) + message_data = data[0]['message'] + response_data = message_data['response_message_data'] + timestamp = datetime.fromisoformat(message_data['response_time'].replace('Z', '+00:00')) + if ctx.embed_requested(): + embed = Embed( + title="DNS Query Result", + description=f"Query for {response_data['QUESTION_SECTION'][0]}", + color=await ctx.embed_color(), + timestamp=timestamp + ) + embed.add_field(name="Response Address", value=message_data['response_address'], inline=True) + embed.add_field(name="Response Port", value=message_data['response_port'], inline=True) + embed.add_field(name="Query Address", value=message_data['query_address'], inline=True) + embed.add_field(name="Query Port", value=message_data['query_port'], inline=True) + embed.add_field(name="Status", value=response_data['status'], inline=True) + embed.add_field(name="Flags", value=response_data['flags'], inline=True) + + question_section = "\n".join(response_data['QUESTION_SECTION']) + embed.add_field(name="Question Section", value=f"```{question_section}```", inline=False) + + answer_section = "\n".join(response_data['ANSWER_SECTION']) + embed.add_field(name="Answer Section", value=f"```{answer_section}```", inline=False) + await ctx.send(embed=embed) + else: + await ctx.send(content=cf.box(text=stdout, lang='yaml')) From 93f358cfad1e00fe2084a2a585c344fc46bda464 Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 17:46:14 -0400 Subject: [PATCH 49/95] fix(seautils): fixed timestamp --- seautils/seautils.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 15362a7..6eaafa7 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -8,7 +8,6 @@ import asyncio import inspect import operator -from datetime import datetime from functools import partial, partialmethod from typing import Any @@ -106,13 +105,12 @@ class SeaUtils(commands.Cog): data = yaml.safe_load(stdout.decode()) message_data = data[0]['message'] response_data = message_data['response_message_data'] - timestamp = datetime.fromisoformat(message_data['response_time'].replace('Z', '+00:00')) if ctx.embed_requested(): embed = Embed( title="DNS Query Result", description=f"Query for {response_data['QUESTION_SECTION'][0]}", color=await ctx.embed_color(), - timestamp=timestamp + timestamp=message_data['response_time'] ) embed.add_field(name="Response Address", value=message_data['response_address'], inline=True) embed.add_field(name="Response Port", value=message_data['response_port'], inline=True) From aa7e347a95a7993e5fee8f4797ae8d78eabc8412 Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 17:48:00 -0400 Subject: [PATCH 50/95] fix(seautils): fix a keyerror --- seautils/seautils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 6eaafa7..198a748 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -108,7 +108,6 @@ class SeaUtils(commands.Cog): if ctx.embed_requested(): embed = Embed( title="DNS Query Result", - description=f"Query for {response_data['QUESTION_SECTION'][0]}", color=await ctx.embed_color(), timestamp=message_data['response_time'] ) @@ -122,8 +121,9 @@ class SeaUtils(commands.Cog): question_section = "\n".join(response_data['QUESTION_SECTION']) embed.add_field(name="Question Section", value=f"```{question_section}```", inline=False) - answer_section = "\n".join(response_data['ANSWER_SECTION']) - embed.add_field(name="Answer Section", value=f"```{answer_section}```", inline=False) + if 'ANSWER_SECTION' in response_data: + answer_section = "\n".join(response_data['ANSWER_SECTION']) + embed.add_field(name="Answer Section", value=f"```{answer_section}```", inline=False) await ctx.send(embed=embed) else: await ctx.send(content=cf.box(text=stdout, lang='yaml')) From 028cae9e99e2d60ccaa26d87bd1ad19f1f7fdf4b Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 17:53:58 -0400 Subject: [PATCH 51/95] feat(seautils): improve error code handling --- seautils/seautils.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 198a748..c884d08 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -12,7 +12,7 @@ from functools import partial, partialmethod from typing import Any import yaml -from discord import Embed, app_commands +from discord import Color, Embed, app_commands from discord.utils import CachedSlotProperty, cached_property from redbot.core import commands from redbot.core.bot import Red @@ -103,8 +103,8 @@ class SeaUtils(commands.Cog): await ctx.maybe_send_embed(content= "An error was encountered!\n" + cf.box(text=stderr.decode())) else: data = yaml.safe_load(stdout.decode()) - message_data = data[0]['message'] - response_data = message_data['response_message_data'] + message_data: dict = data[0]['message'] + response_data: dict = message_data['response_message_data'] if ctx.embed_requested(): embed = Embed( title="DNS Query Result", @@ -118,12 +118,23 @@ class SeaUtils(commands.Cog): embed.add_field(name="Status", value=response_data['status'], inline=True) embed.add_field(name="Flags", value=response_data['flags'], inline=True) + match response_data.get('status'): + case 'FORMERR', 'SERVFAIL', 'NXDOMAIN', 'NOTIMP', 'REFUSED': + embed.colour = Color.red() + embed.description = "Dig query did not return `NOERROR` status." + case _: + embed.colour = await ctx.embed_color() + question_section = "\n".join(response_data['QUESTION_SECTION']) embed.add_field(name="Question Section", value=f"```{question_section}```", inline=False) if 'ANSWER_SECTION' in response_data: answer_section = "\n".join(response_data['ANSWER_SECTION']) embed.add_field(name="Answer Section", value=f"```{answer_section}```", inline=False) + + if 'AUTHORITY_SECTION' in response_data: + authority_section = "\n".join(response_data['AUTHORITY_SECTION']) + embed.add_field(name="Authority Section", value=f"```{authority_section}```", inline=False) await ctx.send(embed=embed) else: await ctx.send(content=cf.box(text=stdout, lang='yaml')) From 8b68cb7530ab59d494f62952efb38589b762dca7 Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 17:54:46 -0400 Subject: [PATCH 52/95] fix(seautils): don't use match and case --- seautils/seautils.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index c884d08..cf29811 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -118,12 +118,9 @@ class SeaUtils(commands.Cog): embed.add_field(name="Status", value=response_data['status'], inline=True) embed.add_field(name="Flags", value=response_data['flags'], inline=True) - match response_data.get('status'): - case 'FORMERR', 'SERVFAIL', 'NXDOMAIN', 'NOTIMP', 'REFUSED': - embed.colour = Color.red() - embed.description = "Dig query did not return `NOERROR` status." - case _: - embed.colour = await ctx.embed_color() + if response_data.get('status') != 'NOERROR': + embed.colour = Color.red() + embed.description = "Dig query did not return `NOERROR` status." question_section = "\n".join(response_data['QUESTION_SECTION']) embed.add_field(name="Question Section", value=f"```{question_section}```", inline=False) From 7a2ee0a655c005a89cbde8b14903469e4e9585dc Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 17:57:10 -0400 Subject: [PATCH 53/95] misc(seautils): added an error symbol to the failed dns query result message --- seautils/seautils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index cf29811..ad22a84 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -120,7 +120,7 @@ class SeaUtils(commands.Cog): if response_data.get('status') != 'NOERROR': embed.colour = Color.red() - embed.description = "Dig query did not return `NOERROR` status." + embed.description = cf.error("Dig query did not return `NOERROR` status.") question_section = "\n".join(response_data['QUESTION_SECTION']) embed.add_field(name="Question Section", value=f"```{question_section}```", inline=False) From d44424224584b5cfba84869dd3481b1aaafca8ec Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 18:01:35 -0400 Subject: [PATCH 54/95] fix(seautils): catch the error that is raised if dig is not installed on the system --- seautils/seautils.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index ad22a84..e68f3f3 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -8,6 +8,7 @@ import asyncio import inspect import operator +from asyncio.subprocess import Process from functools import partial, partialmethod from typing import Any @@ -97,8 +98,13 @@ class SeaUtils(commands.Cog): command_opts.extend(['-p', port]) command_opts.extend(['+yaml']) - process = await asyncio.create_subprocess_exec(*command_opts, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE) - stdout, stderr = await process.communicate() + try: + process: Process = await asyncio.create_subprocess_exec(*command_opts, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE) + stdout, stderr = await process.communicate() + except (FileNotFoundError): + await ctx.maybe_send_embed(content="The `dig` command is not installed on this system.") + return + if stderr: await ctx.maybe_send_embed(content= "An error was encountered!\n" + cf.box(text=stderr.decode())) else: From 091f4fe36d2171b7ac29f7ce565977f78e177f5c Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 18:02:17 -0400 Subject: [PATCH 55/95] fix(seautils): fixed maybe_send_message --- seautils/seautils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index e68f3f3..3a15c05 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -102,11 +102,11 @@ class SeaUtils(commands.Cog): process: Process = await asyncio.create_subprocess_exec(*command_opts, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE) stdout, stderr = await process.communicate() except (FileNotFoundError): - await ctx.maybe_send_embed(content="The `dig` command is not installed on this system.") + await ctx.maybe_send_embed(message="The `dig` command is not installed on this system.") return if stderr: - await ctx.maybe_send_embed(content= "An error was encountered!\n" + cf.box(text=stderr.decode())) + await ctx.maybe_send_embed(message="An error was encountered!\n" + cf.box(text=stderr.decode())) else: data = yaml.safe_load(stdout.decode()) message_data: dict = data[0]['message'] From 25fdf7b402e35712b64fb86a7cc21d84a7149342 Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 18:31:38 -0400 Subject: [PATCH 56/95] feat(seautils): default to nslookup if dig is not present --- seautils/seautils.py | 94 ++++++++++++++++++++++++++------------------ 1 file changed, 55 insertions(+), 39 deletions(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 3a15c05..8ef8e1f 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -101,43 +101,59 @@ class SeaUtils(commands.Cog): try: process: Process = await asyncio.create_subprocess_exec(*command_opts, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE) stdout, stderr = await process.communicate() - except (FileNotFoundError): - await ctx.maybe_send_embed(message="The `dig` command is not installed on this system.") - return - - if stderr: - await ctx.maybe_send_embed(message="An error was encountered!\n" + cf.box(text=stderr.decode())) - else: - data = yaml.safe_load(stdout.decode()) - message_data: dict = data[0]['message'] - response_data: dict = message_data['response_message_data'] - if ctx.embed_requested(): - embed = Embed( - title="DNS Query Result", - color=await ctx.embed_color(), - timestamp=message_data['response_time'] - ) - embed.add_field(name="Response Address", value=message_data['response_address'], inline=True) - embed.add_field(name="Response Port", value=message_data['response_port'], inline=True) - embed.add_field(name="Query Address", value=message_data['query_address'], inline=True) - embed.add_field(name="Query Port", value=message_data['query_port'], inline=True) - embed.add_field(name="Status", value=response_data['status'], inline=True) - embed.add_field(name="Flags", value=response_data['flags'], inline=True) - - if response_data.get('status') != 'NOERROR': - embed.colour = Color.red() - embed.description = cf.error("Dig query did not return `NOERROR` status.") - - question_section = "\n".join(response_data['QUESTION_SECTION']) - embed.add_field(name="Question Section", value=f"```{question_section}```", inline=False) - - if 'ANSWER_SECTION' in response_data: - answer_section = "\n".join(response_data['ANSWER_SECTION']) - embed.add_field(name="Answer Section", value=f"```{answer_section}```", inline=False) - - if 'AUTHORITY_SECTION' in response_data: - authority_section = "\n".join(response_data['AUTHORITY_SECTION']) - embed.add_field(name="Authority Section", value=f"```{authority_section}```", inline=False) - await ctx.send(embed=embed) + if stderr: + await ctx.maybe_send_embed(message="An error was encountered!\n" + cf.box(text=stderr.decode())) else: - await ctx.send(content=cf.box(text=stdout, lang='yaml')) + data = yaml.safe_load(stdout.decode()) + message_data: dict = data[0]['message'] + response_data: dict = message_data['response_message_data'] + if ctx.embed_requested(): + embed = Embed( + title="DNS Query Result", + color=await ctx.embed_color(), + timestamp=message_data['response_time'] + ) + embed.add_field(name="Response Address", value=message_data['response_address'], inline=True) + embed.add_field(name="Response Port", value=message_data['response_port'], inline=True) + embed.add_field(name="Query Address", value=message_data['query_address'], inline=True) + embed.add_field(name="Query Port", value=message_data['query_port'], inline=True) + embed.add_field(name="Status", value=response_data['status'], inline=True) + embed.add_field(name="Flags", value=response_data['flags'], inline=True) + + if response_data.get('status') != 'NOERROR': + embed.colour = Color.red() + embed.description = cf.error("Dig query did not return `NOERROR` status.") + + question_section = "\n".join(response_data['QUESTION_SECTION']) + embed.add_field(name="Question Section", value=f"```{question_section}```", inline=False) + + if 'ANSWER_SECTION' in response_data: + answer_section = "\n".join(response_data['ANSWER_SECTION']) + embed.add_field(name="Answer Section", value=f"```{answer_section}```", inline=False) + + if 'AUTHORITY_SECTION' in response_data: + authority_section = "\n".join(response_data['AUTHORITY_SECTION']) + embed.add_field(name="Authority Section", value=f"```{authority_section}```", inline=False) + await ctx.send(embed=embed) + else: + await ctx.send(content=cf.box(text=stdout, lang='yaml')) + except (FileNotFoundError): + try: + ns_process = await asyncio.create_subprocess_exec('nslookup', name, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE) + ns_stdout, ns_stderr = await ns_process.communicate() + if ns_stderr: + await ctx.maybe_send_embed(message="An error was encountered!\n" + cf.box(text=ns_stderr.decode())) + else: + warning = cf.warning("`dig` is not installed! Defaulting to `nslookup`.\nThis command provides more information when `dig` is installed on the system.\n") + if await ctx.embed_requested(): + embed = Embed( + title="DNS Query Result", + color=await ctx.embed_color(), + timestamp=ctx.message.created_at + ) + embed.description = warning + cf.box(text=ns_stdout.decode()) + await ctx.send(embed=embed) + else: + await ctx.send(content= warning + cf.box(text=ns_stdout.decode())) + except (FileNotFoundError): + await ctx.maybe_send_embed(message=cf.error("Neither `dig` nor `nslookup` are installed on the system. Unable to resolve DNS query.")) From 7d51814a288b21a059a9ac8c98136887c161eb5f Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 18:35:17 -0400 Subject: [PATCH 57/95] misc(seautils): purposefully breaking dig so i can test nslookup fallback --- seautils/seautils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 8ef8e1f..005a0b1 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -90,7 +90,7 @@ class SeaUtils(commands.Cog): @commands.is_owner() async def dig(self, ctx: commands.Context, name: str, type: str | None = 'A', server: str | None = None, port: int = 53) -> None: """Retrieve DNS information for a domain.""" - command_opts: list[str | int] = ['dig'] + command_opts: list[str | int] = ['digsss'] if server: command_opts.extend(['@', server]) command_opts.extend([name, type]) From 5ffc42480abdb4dfaf7efc9e3e12a3ec33a419dd Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 18:40:43 -0400 Subject: [PATCH 58/95] fix(seautils): revert breaking dig --- seautils/seautils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 005a0b1..8ef8e1f 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -90,7 +90,7 @@ class SeaUtils(commands.Cog): @commands.is_owner() async def dig(self, ctx: commands.Context, name: str, type: str | None = 'A', server: str | None = None, port: int = 53) -> None: """Retrieve DNS information for a domain.""" - command_opts: list[str | int] = ['digsss'] + command_opts: list[str | int] = ['dig'] if server: command_opts.extend(['@', server]) command_opts.extend([name, type]) From 29bb64b35c194f08f548057e39df023e5ef199c8 Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 18:42:42 -0400 Subject: [PATCH 59/95] fix(seautils): query ANY instead of A records --- seautils/seautils.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 8ef8e1f..c7e732f 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -88,15 +88,12 @@ class SeaUtils(commands.Cog): @commands.command(name='dig', aliases=['dnslookup', 'nslookup']) @commands.is_owner() - async def dig(self, ctx: commands.Context, name: str, type: str | None = 'A', server: str | None = None, port: int = 53) -> None: + async def dig(self, ctx: commands.Context, name: str, type: str | None = 'ANY', server: str | None = None, port: int = 53) -> None: """Retrieve DNS information for a domain.""" command_opts: list[str | int] = ['dig'] if server: command_opts.extend(['@', server]) - command_opts.extend([name, type]) - if port != 53: - command_opts.extend(['-p', port]) - command_opts.extend(['+yaml']) + command_opts.extend([name, type, '-p', port, '+yaml']) try: process: Process = await asyncio.create_subprocess_exec(*command_opts, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE) From 54491cb9c9d19c492718c7c95dccb42d69de8d49 Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 18:44:01 -0400 Subject: [PATCH 60/95] fix(seautils): convert port number to a string --- seautils/seautils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index c7e732f..85df38e 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -93,7 +93,7 @@ class SeaUtils(commands.Cog): command_opts: list[str | int] = ['dig'] if server: command_opts.extend(['@', server]) - command_opts.extend([name, type, '-p', port, '+yaml']) + command_opts.extend([name, type, '-p', str(port), '+yaml']) try: process: Process = await asyncio.create_subprocess_exec(*command_opts, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE) From b27a3ee7788fb89ea571a73aecf2380189303d81 Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 18:46:32 -0400 Subject: [PATCH 61/95] fix(seautils): fall back to the embed description if answer_section is too long --- seautils/seautils.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 85df38e..ce9c64e 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -126,7 +126,10 @@ class SeaUtils(commands.Cog): if 'ANSWER_SECTION' in response_data: answer_section = "\n".join(response_data['ANSWER_SECTION']) - embed.add_field(name="Answer Section", value=f"```{answer_section}```", inline=False) + if len(answer_section) > 1024: + embed.description = answer_section + else: + embed.add_field(name="Answer Section", value=f"```{answer_section}```", inline=False) if 'AUTHORITY_SECTION' in response_data: authority_section = "\n".join(response_data['AUTHORITY_SECTION']) From fb468ee63e19e8f1dc7b8050a46eb05705ff2e0b Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 18:55:09 -0400 Subject: [PATCH 62/95] fix(seautils): retrieve A, AAAA, and CNAME records by default (& docstring changes) --- seautils/seautils.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index ce9c64e..1feb77a 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -88,12 +88,19 @@ class SeaUtils(commands.Cog): @commands.command(name='dig', aliases=['dnslookup', 'nslookup']) @commands.is_owner() - async def dig(self, ctx: commands.Context, name: str, type: str | None = 'ANY', server: str | None = None, port: int = 53) -> None: - """Retrieve DNS information for a domain.""" + async def dig(self, ctx: commands.Context, name: str, type: str | None = None, server: str | None = None, port: int = 53) -> None: + """Retrieve DNS information for a domain. + + Uses `dig` to perform a DNS query. Will fall back to `nslookup` if `dig` is not installed on the system. + `nslookup` does not provide as much information as `dig`, so only the `name` parameter will be used if `nslookup` is used. + Will return the A, AAAA, and CNAME records for a domain by default. You can specify a different record type with the `type` parameter.""" command_opts: list[str | int] = ['dig'] + query_types = [type] if type else ['A', 'AAAA', 'CNAME'] if server: command_opts.extend(['@', server]) - command_opts.extend([name, type, '-p', str(port), '+yaml']) + for query_type in query_types: + command_opts.extend([name, query_type]) + command_opts.extend(['-p', str(port), '+yaml']) try: process: Process = await asyncio.create_subprocess_exec(*command_opts, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE) From 8608e6a34e3aa7517ef713ab9a53b690019a9d56 Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 19:06:11 -0400 Subject: [PATCH 63/95] fix(seautils): fixed only the first A response being used --- seautils/seautils.py | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 1feb77a..2d44336 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -128,19 +128,33 @@ class SeaUtils(commands.Cog): embed.colour = Color.red() embed.description = cf.error("Dig query did not return `NOERROR` status.") - question_section = "\n".join(response_data['QUESTION_SECTION']) - embed.add_field(name="Question Section", value=f"```{question_section}```", inline=False) + questions = [] + answers = [] + authorities = [] + for m in data: + response = m['message']['response_message_data'] + if 'QUESTION_SECTION' in response: + for question in response['QUESTION_SECTION']: + questions.append(question) + if 'ANSWER_SECTION' in response: + for answer in response['ANSWER_SECTION']: + answers.append(answer) + if 'AUTHORITY_SECTION' in response: + for authority in response['AUTHORITY_SECTION']: + authorities.append(authority) - if 'ANSWER_SECTION' in response_data: - answer_section = "\n".join(response_data['ANSWER_SECTION']) - if len(answer_section) > 1024: - embed.description = answer_section - else: - embed.add_field(name="Answer Section", value=f"```{answer_section}```", inline=False) + question_section = "\n".join(questions) + embed.add_field(name="Question Section", value=f"{cf.box(question_section)}", inline=False) - if 'AUTHORITY_SECTION' in response_data: - authority_section = "\n".join(response_data['AUTHORITY_SECTION']) - embed.add_field(name="Authority Section", value=f"```{authority_section}```", inline=False) + answer_section = "\n".join(answers) + if len(answer_section) > 1024: + embed.description = cf.warning("Answer section is too long to fit within embed field, falling back to description.") + cf.box(answer_section) + else: + embed.add_field(name="Answer Section", value=f"{cf.box(answer_section)}", inline=False) + + if authorities: + authority_section = "\n".join(authorities) + embed.add_field(name="Authority Section", value=f"{cf.box(authority_section)}", inline=False) await ctx.send(embed=embed) else: await ctx.send(content=cf.box(text=stdout, lang='yaml')) From cb6ddabb4dfe506d959386d27762131cfbf23456 Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 19:10:15 -0400 Subject: [PATCH 64/95] fix(seautils): prevent duplicates in dig --- seautils/seautils.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 2d44336..dedb4e3 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -135,13 +135,18 @@ class SeaUtils(commands.Cog): response = m['message']['response_message_data'] if 'QUESTION_SECTION' in response: for question in response['QUESTION_SECTION']: - questions.append(question) + if question not in questions: + questions.append(question) + if 'ANSWER_SECTION' in response: for answer in response['ANSWER_SECTION']: - answers.append(answer) + if answer not in answers: + answers.append(answer) + if 'AUTHORITY_SECTION' in response: for authority in response['AUTHORITY_SECTION']: - authorities.append(authority) + if authority not in authorities: + authorities.append(authority) question_section = "\n".join(questions) embed.add_field(name="Question Section", value=f"{cf.box(question_section)}", inline=False) From 7f46d6accc65d4597d0324c7cb86f358d3a38f7b Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 19:25:01 -0400 Subject: [PATCH 65/95] fix(seautils): fixed empty answer section --- seautils/seautils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index dedb4e3..69b80d0 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -157,7 +157,7 @@ class SeaUtils(commands.Cog): else: embed.add_field(name="Answer Section", value=f"{cf.box(answer_section)}", inline=False) - if authorities: + if not len(authorities) == 0: authority_section = "\n".join(authorities) embed.add_field(name="Authority Section", value=f"{cf.box(authority_section)}", inline=False) await ctx.send(embed=embed) From 50094b85fc7b322e35ac418fb277065cca1fe8f9 Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 19:26:07 -0400 Subject: [PATCH 66/95] fix(seautils): fixed the wrong thing lmao --- seautils/seautils.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 69b80d0..8b87a70 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -148,16 +148,18 @@ class SeaUtils(commands.Cog): if authority not in authorities: authorities.append(authority) - question_section = "\n".join(questions) - embed.add_field(name="Question Section", value=f"{cf.box(question_section)}", inline=False) + if questions: + question_section = "\n".join(questions) + embed.add_field(name="Question Section", value=f"{cf.box(question_section)}", inline=False) - answer_section = "\n".join(answers) - if len(answer_section) > 1024: - embed.description = cf.warning("Answer section is too long to fit within embed field, falling back to description.") + cf.box(answer_section) - else: - embed.add_field(name="Answer Section", value=f"{cf.box(answer_section)}", inline=False) + if answers: + answer_section = "\n".join(answers) + if len(answer_section) > 1024: + embed.description = cf.warning("Answer section is too long to fit within embed field, falling back to description.") + cf.box(answer_section) + else: + embed.add_field(name="Answer Section", value=f"{cf.box(answer_section)}", inline=False) - if not len(authorities) == 0: + if authorities: authority_section = "\n".join(authorities) embed.add_field(name="Authority Section", value=f"{cf.box(authority_section)}", inline=False) await ctx.send(embed=embed) From 2886d5e80d5b8bf7aec20220461a13436eeac3a6 Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 19:29:26 -0400 Subject: [PATCH 67/95] feat(seautils): use prolog syntax highlighting for dig results --- seautils/seautils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 8b87a70..da87b3a 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -150,18 +150,18 @@ class SeaUtils(commands.Cog): if questions: question_section = "\n".join(questions) - embed.add_field(name="Question Section", value=f"{cf.box(question_section)}", inline=False) + embed.add_field(name="Question Section", value=f"{cf.box(text=question_section, lang='prolog')}", inline=False) if answers: answer_section = "\n".join(answers) if len(answer_section) > 1024: embed.description = cf.warning("Answer section is too long to fit within embed field, falling back to description.") + cf.box(answer_section) else: - embed.add_field(name="Answer Section", value=f"{cf.box(answer_section)}", inline=False) + embed.add_field(name="Answer Section", value=f"{cf.box(text=answer_section, lang='prolog')}", inline=False) if authorities: authority_section = "\n".join(authorities) - embed.add_field(name="Authority Section", value=f"{cf.box(authority_section)}", inline=False) + embed.add_field(name="Authority Section", value=f"{cf.box(text=authority_section, lang='prolog')}", inline=False) await ctx.send(embed=embed) else: await ctx.send(content=cf.box(text=stdout, lang='yaml')) From a641cae640b31ada70a8248a28d2d9c00e229337 Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 20:20:21 -0400 Subject: [PATCH 68/95] feat(seautils): add `[p]rfc` command --- poetry.lock | 34 +++++++++++++++++++++++++++++++++- pyproject.toml | 1 + seautils/info.json | 3 ++- seautils/seautils.py | 31 +++++++++++++++++++++++++++++++ 4 files changed, 67 insertions(+), 2 deletions(-) diff --git a/poetry.lock b/poetry.lock index 50be601..d30b1f7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -228,6 +228,27 @@ files = [ [package.extras] dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] +[[package]] +name = "beautifulsoup4" +version = "4.12.3" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] +html5lib = ["html5lib"] +lxml = ["lxml"] + [[package]] name = "brotli" version = "1.1.0" @@ -2111,6 +2132,17 @@ files = [ {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, ] +[[package]] +name = "soupsieve" +version = "2.5" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.8" +files = [ + {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, + {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, +] + [[package]] name = "tinycss2" version = "1.2.1" @@ -2451,4 +2483,4 @@ multidict = ">=4.0" [metadata] lock-version = "2.0" python-versions = ">=3.11,<3.12" -content-hash = "0ac382e0399d9c23c5f89a0ffeb3aae056dc8b28e864b22f815c0e3eb34175bd" +content-hash = "55119c37c690ab197058ad091cb31bdf7c1c51ae62947e0026f4cddb423093d3" diff --git a/pyproject.toml b/pyproject.toml index 245364d..a2afb43 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,6 +15,7 @@ websockets = "^12.0" pillow = "^10.3.0" numpy = "^1.26.4" colorthief = "^0.2.1" +beautifulsoup4 = "^4.12.3" [tool.poetry.group.dev] optional = true diff --git a/seautils/info.json b/seautils/info.json index f331eac..8e93f9d 100644 --- a/seautils/info.json +++ b/seautils/info.json @@ -8,5 +8,6 @@ "hidden": true, "disabled": false, "min_bot_version": "3.5.0", - "min_python_version": [3, 8, 0] + "min_python_version": [3, 8, 0], + "requirements": ["beautifulsoup4"] } diff --git a/seautils/seautils.py b/seautils/seautils.py index da87b3a..389ea71 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -12,7 +12,9 @@ from asyncio.subprocess import Process from functools import partial, partialmethod from typing import Any +import aiohttp import yaml +from bs4 import BeautifulSoup from discord import Color, Embed, app_commands from discord.utils import CachedSlotProperty, cached_property from redbot.core import commands @@ -185,3 +187,32 @@ class SeaUtils(commands.Cog): await ctx.send(content= warning + cf.box(text=ns_stdout.decode())) except (FileNotFoundError): await ctx.maybe_send_embed(message=cf.error("Neither `dig` nor `nslookup` are installed on the system. Unable to resolve DNS query.")) + + async def get_results(self, ctx: commands.Context, soup: BeautifulSoup) -> list: + pre_tags = soup.find_all('pre') + content = [] + for pre_tag in pre_tags: + if await ctx.embed_requested(): + embed = Embed( + title="RFC Document", + description=pre_tag.text, + color=await ctx.embed_color() + ) + content.append(embed) + else: + content.append(pre_tag.text) + return content + + @commands.command() + async def rfc(self, ctx: commands.Context, number: int) -> None: + """Retrieve the text of an RFC document.""" + url = f"https://www.rfc-editor.org/rfc/rfc{number}.html" + async with aiohttp.ClientSession() as session: + async with session.get(url=url) as response: + if response.status == 200: + html = await response.text() + soup = BeautifulSoup(html, 'html.parser') + content = await self.get_results(ctx, soup) + await SimpleMenu(pages=content, disable_after_timeout=True, timeout=300).start(ctx) + else: + await ctx.maybe_send_embed(content=cf.error(f"An error occurred while fetching RFC {number}. Status code: {response.status}.")) From 28246121a6ae55aa1000fc5354d8fd80b143b0aa Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 20:29:39 -0400 Subject: [PATCH 69/95] feat(seautils): use markdownify to convert rfc html documents to markdown --- poetry.lock | 17 ++++++++++++++++- pyproject.toml | 1 + seautils/info.json | 2 +- seautils/seautils.py | 32 ++++++++++++++++---------------- 4 files changed, 34 insertions(+), 18 deletions(-) diff --git a/poetry.lock b/poetry.lock index d30b1f7..017d640 100644 --- a/poetry.lock +++ b/poetry.lock @@ -911,6 +911,21 @@ profiling = ["gprof2dot"] rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] +[[package]] +name = "markdownify" +version = "0.12.1" +description = "Convert HTML to markdown." +optional = false +python-versions = "*" +files = [ + {file = "markdownify-0.12.1-py3-none-any.whl", hash = "sha256:a3805abd8166dbb7b27783c5599d91f54f10d79894b2621404d85b333c7ce561"}, + {file = "markdownify-0.12.1.tar.gz", hash = "sha256:1fb08c618b30e0ee7a31a39b998f44a18fb28ab254f55f4af06b6d35a2179e27"}, +] + +[package.dependencies] +beautifulsoup4 = ">=4.9,<5" +six = ">=1.15,<2" + [[package]] name = "markupsafe" version = "2.1.5" @@ -2483,4 +2498,4 @@ multidict = ">=4.0" [metadata] lock-version = "2.0" python-versions = ">=3.11,<3.12" -content-hash = "55119c37c690ab197058ad091cb31bdf7c1c51ae62947e0026f4cddb423093d3" +content-hash = "229d7fd39618cf708f3cd5409dde2e6e25b822e4f936e14b3ade9800bf00daab" diff --git a/pyproject.toml b/pyproject.toml index a2afb43..872ccdf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,6 +16,7 @@ pillow = "^10.3.0" numpy = "^1.26.4" colorthief = "^0.2.1" beautifulsoup4 = "^4.12.3" +markdownify = "^0.12.1" [tool.poetry.group.dev] optional = true diff --git a/seautils/info.json b/seautils/info.json index 8e93f9d..7356137 100644 --- a/seautils/info.json +++ b/seautils/info.json @@ -9,5 +9,5 @@ "disabled": false, "min_bot_version": "3.5.0", "min_python_version": [3, 8, 0], - "requirements": ["beautifulsoup4"] + "requirements": ["beautifulsoup4", "markdownify"] } diff --git a/seautils/seautils.py b/seautils/seautils.py index 389ea71..a32d02c 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -17,6 +17,7 @@ import yaml from bs4 import BeautifulSoup from discord import Color, Embed, app_commands from discord.utils import CachedSlotProperty, cached_property +from markdownify import MarkdownConverter from redbot.core import commands from redbot.core.bot import Red from redbot.core.dev_commands import cleanup_code @@ -24,6 +25,9 @@ from redbot.core.utils import chat_formatting as cf from redbot.core.utils.views import SimpleMenu +def md(soup: BeautifulSoup, **options) -> Any | str: + return MarkdownConverter(**options).convert_soup(soup) + class SeaUtils(commands.Cog): """A collection of random utilities.""" @@ -188,21 +192,6 @@ class SeaUtils(commands.Cog): except (FileNotFoundError): await ctx.maybe_send_embed(message=cf.error("Neither `dig` nor `nslookup` are installed on the system. Unable to resolve DNS query.")) - async def get_results(self, ctx: commands.Context, soup: BeautifulSoup) -> list: - pre_tags = soup.find_all('pre') - content = [] - for pre_tag in pre_tags: - if await ctx.embed_requested(): - embed = Embed( - title="RFC Document", - description=pre_tag.text, - color=await ctx.embed_color() - ) - content.append(embed) - else: - content.append(pre_tag.text) - return content - @commands.command() async def rfc(self, ctx: commands.Context, number: int) -> None: """Retrieve the text of an RFC document.""" @@ -212,7 +201,18 @@ class SeaUtils(commands.Cog): if response.status == 200: html = await response.text() soup = BeautifulSoup(html, 'html.parser') - content = await self.get_results(ctx, soup) + pre_tags = soup.find_all('pre') + content = [] + for pre_tag in pre_tags: + if await ctx.embed_requested(): + embed = Embed( + title="RFC Document", + description=md(pre_tag), + color=await ctx.embed_color() + ) + content.append(embed) + else: + content.append(md(pre_tag)) await SimpleMenu(pages=content, disable_after_timeout=True, timeout=300).start(ctx) else: await ctx.maybe_send_embed(content=cf.error(f"An error occurred while fetching RFC {number}. Status code: {response.status}.")) From 99cd13ccf114179f4a188018223cd57435330a76 Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 20:35:25 -0400 Subject: [PATCH 70/95] feat(seautils): add correct formatting for masked links --- seautils/seautils.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index a32d02c..9200927 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -8,6 +8,7 @@ import asyncio import inspect import operator +import re from asyncio.subprocess import Process from functools import partial, partialmethod from typing import Any @@ -28,6 +29,9 @@ from redbot.core.utils.views import SimpleMenu def md(soup: BeautifulSoup, **options) -> Any | str: return MarkdownConverter(**options).convert_soup(soup) +def convert_rfc_references(text: str): + return re.sub(r"\(RFC\s(\d+)\)", r"(https://www.rfc-editor.org/rfc/rfc\1.html)", text) + class SeaUtils(commands.Cog): """A collection of random utilities.""" @@ -204,15 +208,16 @@ class SeaUtils(commands.Cog): pre_tags = soup.find_all('pre') content = [] for pre_tag in pre_tags: + text = convert_rfc_references(md(pre_tag)) if await ctx.embed_requested(): embed = Embed( title="RFC Document", - description=md(pre_tag), + description=text, color=await ctx.embed_color() ) content.append(embed) else: - content.append(md(pre_tag)) + content.append(text) await SimpleMenu(pages=content, disable_after_timeout=True, timeout=300).start(ctx) else: await ctx.maybe_send_embed(content=cf.error(f"An error occurred while fetching RFC {number}. Status code: {response.status}.")) From c4ef2a7d4b32024fe56abcdb5d78d1fe9cce0cbe Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 20:38:39 -0400 Subject: [PATCH 71/95] fix(seautils): fixed some broken regex --- seautils/seautils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 9200927..ac71d1c 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -30,7 +30,7 @@ def md(soup: BeautifulSoup, **options) -> Any | str: return MarkdownConverter(**options).convert_soup(soup) def convert_rfc_references(text: str): - return re.sub(r"\(RFC\s(\d+)\)", r"(https://www.rfc-editor.org/rfc/rfc\1.html)", text) + return re.sub(r"\(\.rfc\s(\d+)", r"(https://www.rfc-editor.org/rfc/rfc\1.html", text) class SeaUtils(commands.Cog): """A collection of random utilities.""" From 29b6a2141a6f0bf6e143025ee10cc3e16346c561 Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 20:39:19 -0400 Subject: [PATCH 72/95] fix(seautils): actually actually fixed incorrect regex --- seautils/seautils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index ac71d1c..51a896f 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -30,7 +30,7 @@ def md(soup: BeautifulSoup, **options) -> Any | str: return MarkdownConverter(**options).convert_soup(soup) def convert_rfc_references(text: str): - return re.sub(r"\(\.rfc\s(\d+)", r"(https://www.rfc-editor.org/rfc/rfc\1.html", text) + return re.sub(r"\(\.\/rfc\s(\d+)", r"(https://www.rfc-editor.org/rfc/rfc\1.html", text) class SeaUtils(commands.Cog): """A collection of random utilities.""" From 0ed96babdbf0be6b69b9ef9aea03d579e209ba7e Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 20:40:48 -0400 Subject: [PATCH 73/95] fix(seautils): ACTUALLY fixed broken regex --- seautils/seautils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 51a896f..f6943d1 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -30,7 +30,7 @@ def md(soup: BeautifulSoup, **options) -> Any | str: return MarkdownConverter(**options).convert_soup(soup) def convert_rfc_references(text: str): - return re.sub(r"\(\.\/rfc\s(\d+)", r"(https://www.rfc-editor.org/rfc/rfc\1.html", text) + return re.sub(r"\(\.\/rfc(\d+)", r"(https://www.rfc-editor.org/rfc/rfc\1.html", text) class SeaUtils(commands.Cog): """A collection of random utilities.""" From 42e209b54755768443605c71987069cd6278681d Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 21:10:28 -0400 Subject: [PATCH 74/95] misc(seautils): include the number of the rfc document in the embed --- seautils/seautils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index f6943d1..146384f 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -211,7 +211,7 @@ class SeaUtils(commands.Cog): text = convert_rfc_references(md(pre_tag)) if await ctx.embed_requested(): embed = Embed( - title="RFC Document", + title=f"RFC Document {number}", description=text, color=await ctx.embed_color() ) From 8d3f5c1d5facc078854894ae2fdd4bcd20c5d00a Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 21:16:10 -0400 Subject: [PATCH 75/95] fix(seautils): fix table of contents in rfc documents --- seautils/seautils.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 146384f..649a875 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -29,8 +29,10 @@ from redbot.core.utils.views import SimpleMenu def md(soup: BeautifulSoup, **options) -> Any | str: return MarkdownConverter(**options).convert_soup(soup) -def convert_rfc_references(text: str): - return re.sub(r"\(\.\/rfc(\d+)", r"(https://www.rfc-editor.org/rfc/rfc\1.html", text) +def convert_rfc_references(text: str, number: int) -> str: + one = re.sub(r"\(\.\/rfc(\d+)", r"(https://www.rfc-editor.org/rfc/rfc\1.html", text) + two = re.sub(r"\((#(?:section|page)-\d+)\)", f"https://www.rfc-editor.org/rfc/rfc{number}.html\1", one) + return two class SeaUtils(commands.Cog): """A collection of random utilities.""" From 0ea80075f6cc2b55a76fc80fa688271c85611bd6 Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 21:16:45 -0400 Subject: [PATCH 76/95] fix(seautils): fixed a missing argument --- seautils/seautils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 649a875..5ef5dda 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -210,7 +210,7 @@ class SeaUtils(commands.Cog): pre_tags = soup.find_all('pre') content = [] for pre_tag in pre_tags: - text = convert_rfc_references(md(pre_tag)) + text = convert_rfc_references(md(pre_tag), number) if await ctx.embed_requested(): embed = Embed( title=f"RFC Document {number}", From ae8d0d5db4f7c3dac6513742991b3d942b6ebf61 Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 21:17:29 -0400 Subject: [PATCH 77/95] fix(seautils): added missing () --- seautils/seautils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 5ef5dda..638a01e 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -31,7 +31,7 @@ def md(soup: BeautifulSoup, **options) -> Any | str: def convert_rfc_references(text: str, number: int) -> str: one = re.sub(r"\(\.\/rfc(\d+)", r"(https://www.rfc-editor.org/rfc/rfc\1.html", text) - two = re.sub(r"\((#(?:section|page)-\d+)\)", f"https://www.rfc-editor.org/rfc/rfc{number}.html\1", one) + two = re.sub(r"\((#(?:section|page)-\d+)\)", f"(https://www.rfc-editor.org/rfc/rfc{number}.html\1)", one) return two class SeaUtils(commands.Cog): From ac5d4df36b357a32edf75db721ba9b7839170d43 Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 21:18:49 -0400 Subject: [PATCH 78/95] fix(seautils): fixed broken regex --- seautils/seautils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 638a01e..4db4bfc 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -31,7 +31,7 @@ def md(soup: BeautifulSoup, **options) -> Any | str: def convert_rfc_references(text: str, number: int) -> str: one = re.sub(r"\(\.\/rfc(\d+)", r"(https://www.rfc-editor.org/rfc/rfc\1.html", text) - two = re.sub(r"\((#(?:section|page)-\d+)\)", f"(https://www.rfc-editor.org/rfc/rfc{number}.html\1)", one) + two = re.sub(r"\((#(?:section|page)-\d+(?:.\d+)?)\)", f"(https://www.rfc-editor.org/rfc/rfc{number}.html\1)", one) return two class SeaUtils(commands.Cog): From 861a03719bd8dd01db153f55fa5bf47c3a423b92 Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 21:22:30 -0400 Subject: [PATCH 79/95] fix(seautils): added a bad solution to a stupid problem --- seautils/seautils.py | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 4db4bfc..fd6f25b 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -211,15 +211,35 @@ class SeaUtils(commands.Cog): content = [] for pre_tag in pre_tags: text = convert_rfc_references(md(pre_tag), number) - if await ctx.embed_requested(): - embed = Embed( - title=f"RFC Document {number}", - description=text, - color=await ctx.embed_color() - ) - content.append(embed) + if len(text) > 4096: + text1 = text[:4096] + text2 = text[4096:] + if await ctx.embed_requested(): + embed = Embed( + title=f"RFC Document {number}", + description=text1, + color=await ctx.embed_color() + ) + content.append(embed) + embed2 = Embed( + title=f"RFC Document {number}", + description=text2, + color=await ctx.embed_color() + ) + content.append(embed2) + else: + content.append(text1) + content.append(text2) else: - content.append(text) + if await ctx.embed_requested(): + embed = Embed( + title=f"RFC Document {number}", + description=text, + color=await ctx.embed_color() + ) + content.append(embed) + else: + content.append(text) await SimpleMenu(pages=content, disable_after_timeout=True, timeout=300).start(ctx) else: await ctx.maybe_send_embed(content=cf.error(f"An error occurred while fetching RFC {number}. Status code: {response.status}.")) From 2d895d16c9eaba1c56313a591f77859f7eb8d707 Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 21:54:48 -0400 Subject: [PATCH 80/95] fix(seautils): fixed body error --- seautils/seautils.py | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index fd6f25b..6b2618a 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -208,28 +208,21 @@ class SeaUtils(commands.Cog): html = await response.text() soup = BeautifulSoup(html, 'html.parser') pre_tags = soup.find_all('pre') - content = [] + content: list[Embed | str] = [] for pre_tag in pre_tags: text = convert_rfc_references(md(pre_tag), number) if len(text) > 4096: - text1 = text[:4096] - text2 = text[4096:] - if await ctx.embed_requested(): - embed = Embed( - title=f"RFC Document {number}", - description=text1, - color=await ctx.embed_color() - ) - content.append(embed) - embed2 = Embed( - title=f"RFC Document {number}", - description=text2, - color=await ctx.embed_color() - ) - content.append(embed2) - else: - content.append(text1) - content.append(text2) + pagified_text = cf.pagify(text, delims=["\n\n"], page_length=4096) + for page in pagified_text: + if await ctx.embed_requested(): + embed = Embed( + title=f"RFC Document {number}", + description=page, + color=await ctx.embed_color() + ) + content.append(embed) + else: + content.append(page) else: if await ctx.embed_requested(): embed = Embed( @@ -240,6 +233,9 @@ class SeaUtils(commands.Cog): content.append(embed) else: content.append(text) + if await ctx.embed_requested(): + for embed in content: + embed.set_footer(text=f"Page {content.index(embed) + 1}/{len(content)}") await SimpleMenu(pages=content, disable_after_timeout=True, timeout=300).start(ctx) else: await ctx.maybe_send_embed(content=cf.error(f"An error occurred while fetching RFC {number}. Status code: {response.status}.")) From b9f0dbf98a5272d81e39c8c62788ccc47cda36dc Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 21:56:43 -0400 Subject: [PATCH 81/95] fix(seautils): removed big gap at the bottom of rfc embeds --- seautils/seautils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 6b2618a..b37bdd6 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -32,7 +32,8 @@ def md(soup: BeautifulSoup, **options) -> Any | str: def convert_rfc_references(text: str, number: int) -> str: one = re.sub(r"\(\.\/rfc(\d+)", r"(https://www.rfc-editor.org/rfc/rfc\1.html", text) two = re.sub(r"\((#(?:section|page)-\d+(?:.\d+)?)\)", f"(https://www.rfc-editor.org/rfc/rfc{number}.html\1)", one) - return two + three: str = re.sub(r"\n{3,}", "\n\n", two) + return three class SeaUtils(commands.Cog): """A collection of random utilities.""" From 58245c621cfdc71cdab576de3177fb23b8019894 Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 21:58:20 -0400 Subject: [PATCH 82/95] misc(seautils): changed a function name --- seautils/seautils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index b37bdd6..06e704e 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -29,7 +29,7 @@ from redbot.core.utils.views import SimpleMenu def md(soup: BeautifulSoup, **options) -> Any | str: return MarkdownConverter(**options).convert_soup(soup) -def convert_rfc_references(text: str, number: int) -> str: +def format_rfx_text(text: str, number: int) -> str: one = re.sub(r"\(\.\/rfc(\d+)", r"(https://www.rfc-editor.org/rfc/rfc\1.html", text) two = re.sub(r"\((#(?:section|page)-\d+(?:.\d+)?)\)", f"(https://www.rfc-editor.org/rfc/rfc{number}.html\1)", one) three: str = re.sub(r"\n{3,}", "\n\n", two) @@ -211,7 +211,7 @@ class SeaUtils(commands.Cog): pre_tags = soup.find_all('pre') content: list[Embed | str] = [] for pre_tag in pre_tags: - text = convert_rfc_references(md(pre_tag), number) + text = format_rfx_text(md(pre_tag), number) if len(text) > 4096: pagified_text = cf.pagify(text, delims=["\n\n"], page_length=4096) for page in pagified_text: From 069ea800db9c71dd684290cadc52b81fe3e1c859 Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 22:02:42 -0400 Subject: [PATCH 83/95] feat(seautils): added a detailed docstring to the rfc command --- seautils/seautils.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 06e704e..3281583 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -201,7 +201,18 @@ class SeaUtils(commands.Cog): @commands.command() async def rfc(self, ctx: commands.Context, number: int) -> None: - """Retrieve the text of an RFC document.""" + """Retrieve the text of an RFC document. + + This command uses the [RFC Editor website](https://www.rfc-editor.org/) to fetch the text of an RFC document. + `number` refers to the number of the RFC document you wish to retrieve. + Modified excerpt from the RFC Editor website: + >>> The RFC Series (ISSN 2070-1721) contains technical and organizational documents about the Internet, + including the specifications and policy documents produced by five streams: + - [Internet Engineering Task Force](https://www.ietf.org/) + - [Internet Research Task Force](https://www.irtf.org/) + - [Internet Architecture Board](https://www.iab.org/) + - [Independent Submissions](https://www.rfc-editor.org/independent) + - [Editorial](https://www.rfc-editor.org/info/rfc9280)""" url = f"https://www.rfc-editor.org/rfc/rfc{number}.html" async with aiohttp.ClientSession() as session: async with session.get(url=url) as response: From 7207cd374721fbb99a89831521a5666c8798097e Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 22:09:56 -0400 Subject: [PATCH 84/95] misc(seautils): improved the rfc docstring --- seautils/seautils.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 3281583..2084062 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -205,14 +205,10 @@ class SeaUtils(commands.Cog): This command uses the [RFC Editor website](https://www.rfc-editor.org/) to fetch the text of an RFC document. `number` refers to the number of the RFC document you wish to retrieve. - Modified excerpt from the RFC Editor website: - >>> The RFC Series (ISSN 2070-1721) contains technical and organizational documents about the Internet, - including the specifications and policy documents produced by five streams: - - [Internet Engineering Task Force](https://www.ietf.org/) - - [Internet Research Task Force](https://www.irtf.org/) - - [Internet Architecture Board](https://www.iab.org/) - - [Independent Submissions](https://www.rfc-editor.org/independent) - - [Editorial](https://www.rfc-editor.org/info/rfc9280)""" + Modified excerpt from [Wikipedia](https://en.wikipedia.org/wiki/Request_for_Comments): + >>> A Request for Comments (RFC) is a publication in a series from the principal technical development and standards-setting bodies for the [Internet](https://en.wikipedia.org/wiki/Internet), most prominently the [Internet Engineering Task Force](https://en.wikipedia.org/wiki/Internet_Engineering_Task_Force). + An RFC is authored by individuals or groups of engineers and [computer scientists](https://en.wikipedia.org/wiki/Computer_scientist) in the form of a [memorandum](https://en.wikipedia.org/wiki/Memorandum) describing methods, behaviors, research, or innovations applicable to the working of the Internet and Internet-connected systems. + It is submitted either for [peer review](https://en.wikipedia.org/wiki/Peer_review) or to convey new concepts, information, or, occasionally, engineering humor.""" # noqa: E501 url = f"https://www.rfc-editor.org/rfc/rfc{number}.html" async with aiohttp.ClientSession() as session: async with session.get(url=url) as response: From 4f25e3d0f3bfae987d4a5424dc745be1bd8964ed Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 22:11:11 -0400 Subject: [PATCH 85/95] fix(seautils): removed some text from the rfc docstring --- seautils/seautils.py | 1 - 1 file changed, 1 deletion(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 2084062..30f7d12 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -204,7 +204,6 @@ class SeaUtils(commands.Cog): """Retrieve the text of an RFC document. This command uses the [RFC Editor website](https://www.rfc-editor.org/) to fetch the text of an RFC document. - `number` refers to the number of the RFC document you wish to retrieve. Modified excerpt from [Wikipedia](https://en.wikipedia.org/wiki/Request_for_Comments): >>> A Request for Comments (RFC) is a publication in a series from the principal technical development and standards-setting bodies for the [Internet](https://en.wikipedia.org/wiki/Internet), most prominently the [Internet Engineering Task Force](https://en.wikipedia.org/wiki/Internet_Engineering_Task_Force). An RFC is authored by individuals or groups of engineers and [computer scientists](https://en.wikipedia.org/wiki/Computer_scientist) in the form of a [memorandum](https://en.wikipedia.org/wiki/Memorandum) describing methods, behaviors, research, or innovations applicable to the working of the Internet and Internet-connected systems. From dfabac55f510a72ff7dd64c49485a1467a551b5a Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 22:13:18 -0400 Subject: [PATCH 86/95] misc(seautils): hopefully fixed `[p]rfc`'s help from overflowing into a second page --- seautils/seautils.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 30f7d12..73bcfae 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -204,10 +204,7 @@ class SeaUtils(commands.Cog): """Retrieve the text of an RFC document. This command uses the [RFC Editor website](https://www.rfc-editor.org/) to fetch the text of an RFC document. - Modified excerpt from [Wikipedia](https://en.wikipedia.org/wiki/Request_for_Comments): - >>> A Request for Comments (RFC) is a publication in a series from the principal technical development and standards-setting bodies for the [Internet](https://en.wikipedia.org/wiki/Internet), most prominently the [Internet Engineering Task Force](https://en.wikipedia.org/wiki/Internet_Engineering_Task_Force). - An RFC is authored by individuals or groups of engineers and [computer scientists](https://en.wikipedia.org/wiki/Computer_scientist) in the form of a [memorandum](https://en.wikipedia.org/wiki/Memorandum) describing methods, behaviors, research, or innovations applicable to the working of the Internet and Internet-connected systems. - It is submitted either for [peer review](https://en.wikipedia.org/wiki/Peer_review) or to convey new concepts, information, or, occasionally, engineering humor.""" # noqa: E501 + > A [Request for Comments (RFC)](https://en.wikipedia.org/wiki/Request_for_Comments) is a publication in a series from the principal technical development and standards-setting bodies for the [Internet](https://en.wikipedia.org/wiki/Internet), most prominently the [Internet Engineering Task Force](https://en.wikipedia.org/wiki/Internet_Engineering_Task_Force). An RFC is authored by individuals or groups of engineers and [computer scientists](https://en.wikipedia.org/wiki/Computer_scientist) in the form of a [memorandum](https://en.wikipedia.org/wiki/Memorandum) describing methods, behaviors, research, or innovations applicable to the working of the Internet and Internet-connected systems. It is submitted either for [peer review](https://en.wikipedia.org/wiki/Peer_review) or to convey new concepts, information, or, occasionally, engineering humor.""" # noqa: E501 url = f"https://www.rfc-editor.org/rfc/rfc{number}.html" async with aiohttp.ClientSession() as session: async with session.get(url=url) as response: From 8f492cd93776ce07f10e1b7a60c6c3624d620353 Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 22:14:35 -0400 Subject: [PATCH 87/95] fix(seautils): hopefully actually fixed the docstring --- seautils/seautils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 73bcfae..09f451b 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -204,7 +204,7 @@ class SeaUtils(commands.Cog): """Retrieve the text of an RFC document. This command uses the [RFC Editor website](https://www.rfc-editor.org/) to fetch the text of an RFC document. - > A [Request for Comments (RFC)](https://en.wikipedia.org/wiki/Request_for_Comments) is a publication in a series from the principal technical development and standards-setting bodies for the [Internet](https://en.wikipedia.org/wiki/Internet), most prominently the [Internet Engineering Task Force](https://en.wikipedia.org/wiki/Internet_Engineering_Task_Force). An RFC is authored by individuals or groups of engineers and [computer scientists](https://en.wikipedia.org/wiki/Computer_scientist) in the form of a [memorandum](https://en.wikipedia.org/wiki/Memorandum) describing methods, behaviors, research, or innovations applicable to the working of the Internet and Internet-connected systems. It is submitted either for [peer review](https://en.wikipedia.org/wiki/Peer_review) or to convey new concepts, information, or, occasionally, engineering humor.""" # noqa: E501 + A [Request for Comments (RFC)](https://en.wikipedia.org/wiki/Request_for_Comments) is a publication in a series from the principal technical development and standards-setting bodies for the [Internet](https://en.wikipedia.org/wiki/Internet), most prominently the [Internet Engineering Task Force](https://en.wikipedia.org/wiki/Internet_Engineering_Task_Force). An RFC is authored by individuals or groups of engineers and [computer scientists](https://en.wikipedia.org/wiki/Computer_scientist) in the form of a [memorandum](https://en.wikipedia.org/wiki/Memorandum) describing methods, behaviors, research, or innovations applicable to the working of the Internet and Internet-connected systems. It is submitted either for [peer review](https://en.wikipedia.org/wiki/Peer_review) or to convey new concepts, information, or, occasionally, engineering humor.""" # noqa: E501 url = f"https://www.rfc-editor.org/rfc/rfc{number}.html" async with aiohttp.ClientSession() as session: async with session.get(url=url) as response: From 5b23f2f0fbd0cd10faa349e195cdad3391de7e6b Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 22:17:20 -0400 Subject: [PATCH 88/95] feat(seautils): add the url of the rfc document being retrieved to the embed --- seautils/seautils.py | 1 + 1 file changed, 1 insertion(+) diff --git a/seautils/seautils.py b/seautils/seautils.py index 09f451b..cd8a3dd 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -221,6 +221,7 @@ class SeaUtils(commands.Cog): if await ctx.embed_requested(): embed = Embed( title=f"RFC Document {number}", + url=url, description=page, color=await ctx.embed_color() ) From f51329524ce08e79ead3e9d8889918c523a5a983 Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 22:19:09 -0400 Subject: [PATCH 89/95] fix(seautils): oops lmao --- seautils/seautils.py | 1 + 1 file changed, 1 insertion(+) diff --git a/seautils/seautils.py b/seautils/seautils.py index cd8a3dd..b3c9480 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -232,6 +232,7 @@ class SeaUtils(commands.Cog): if await ctx.embed_requested(): embed = Embed( title=f"RFC Document {number}", + url=url, description=text, color=await ctx.embed_color() ) From 037a26deb0c7c63a0bcce710c1eb5f87f39cc553 Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 22:20:51 -0400 Subject: [PATCH 90/95] misc(seautils): switch to datatracker.ietf.org links for publicly facing urls --- seautils/seautils.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index b3c9480..c4ff3d8 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -206,6 +206,7 @@ class SeaUtils(commands.Cog): This command uses the [RFC Editor website](https://www.rfc-editor.org/) to fetch the text of an RFC document. A [Request for Comments (RFC)](https://en.wikipedia.org/wiki/Request_for_Comments) is a publication in a series from the principal technical development and standards-setting bodies for the [Internet](https://en.wikipedia.org/wiki/Internet), most prominently the [Internet Engineering Task Force](https://en.wikipedia.org/wiki/Internet_Engineering_Task_Force). An RFC is authored by individuals or groups of engineers and [computer scientists](https://en.wikipedia.org/wiki/Computer_scientist) in the form of a [memorandum](https://en.wikipedia.org/wiki/Memorandum) describing methods, behaviors, research, or innovations applicable to the working of the Internet and Internet-connected systems. It is submitted either for [peer review](https://en.wikipedia.org/wiki/Peer_review) or to convey new concepts, information, or, occasionally, engineering humor.""" # noqa: E501 url = f"https://www.rfc-editor.org/rfc/rfc{number}.html" + datatracker_url = f"https://datatracker.ietf.org/doc/rfc{number}" async with aiohttp.ClientSession() as session: async with session.get(url=url) as response: if response.status == 200: @@ -221,7 +222,7 @@ class SeaUtils(commands.Cog): if await ctx.embed_requested(): embed = Embed( title=f"RFC Document {number}", - url=url, + url=datatracker_url, description=page, color=await ctx.embed_color() ) @@ -232,7 +233,7 @@ class SeaUtils(commands.Cog): if await ctx.embed_requested(): embed = Embed( title=f"RFC Document {number}", - url=url, + url=datatracker_url, description=text, color=await ctx.embed_color() ) From 545106d496f9f07a74209bc8755a0c88eeceed3e Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Tue, 28 May 2024 22:25:47 -0400 Subject: [PATCH 91/95] fix(seautils): fixed a typo in a function name --- seautils/seautils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index c4ff3d8..76cc789 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -29,7 +29,7 @@ from redbot.core.utils.views import SimpleMenu def md(soup: BeautifulSoup, **options) -> Any | str: return MarkdownConverter(**options).convert_soup(soup) -def format_rfx_text(text: str, number: int) -> str: +def format_rfc_text(text: str, number: int) -> str: one = re.sub(r"\(\.\/rfc(\d+)", r"(https://www.rfc-editor.org/rfc/rfc\1.html", text) two = re.sub(r"\((#(?:section|page)-\d+(?:.\d+)?)\)", f"(https://www.rfc-editor.org/rfc/rfc{number}.html\1)", one) three: str = re.sub(r"\n{3,}", "\n\n", two) @@ -215,7 +215,7 @@ class SeaUtils(commands.Cog): pre_tags = soup.find_all('pre') content: list[Embed | str] = [] for pre_tag in pre_tags: - text = format_rfx_text(md(pre_tag), number) + text = format_rfc_text(md(pre_tag), number) if len(text) > 4096: pagified_text = cf.pagify(text, delims=["\n\n"], page_length=4096) for page in pagified_text: From 46f189a297e9abed28831fa95537e033e27abdc1 Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Thu, 30 May 2024 11:02:22 -0400 Subject: [PATCH 92/95] fix(seautils): pylint fix --- .forgejo/workflows/config/.pylintrc | 3 ++- seautils/seautils.py | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.forgejo/workflows/config/.pylintrc b/.forgejo/workflows/config/.pylintrc index 2dd59c9..94010af 100644 --- a/.forgejo/workflows/config/.pylintrc +++ b/.forgejo/workflows/config/.pylintrc @@ -18,4 +18,5 @@ import-self, relative-beyond-top-level, too-many-instance-attributes, - duplicate-code + duplicate-code, + too-many-nested-blocks diff --git a/seautils/seautils.py b/seautils/seautils.py index 76cc789..56bc5d8 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -101,14 +101,14 @@ class SeaUtils(commands.Cog): @commands.command(name='dig', aliases=['dnslookup', 'nslookup']) @commands.is_owner() - async def dig(self, ctx: commands.Context, name: str, type: str | None = None, server: str | None = None, port: int = 53) -> None: + async def dig(self, ctx: commands.Context, name: str, record_type: str | None = None, server: str | None = None, port: int = 53) -> None: """Retrieve DNS information for a domain. Uses `dig` to perform a DNS query. Will fall back to `nslookup` if `dig` is not installed on the system. `nslookup` does not provide as much information as `dig`, so only the `name` parameter will be used if `nslookup` is used. Will return the A, AAAA, and CNAME records for a domain by default. You can specify a different record type with the `type` parameter.""" command_opts: list[str | int] = ['dig'] - query_types = [type] if type else ['A', 'AAAA', 'CNAME'] + query_types: list[str] = [record_type] if record_type else ['A', 'AAAA', 'CNAME'] if server: command_opts.extend(['@', server]) for query_type in query_types: From c06db07f0821a2f391c5b6208fa7ef9f3dd266e2 Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Sat, 1 Jun 2024 15:02:08 -0400 Subject: [PATCH 93/95] misc(seautils): bunch of miscellaneous changes --- seautils/seautils.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 56bc5d8..7a4040c 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -30,8 +30,8 @@ def md(soup: BeautifulSoup, **options) -> Any | str: return MarkdownConverter(**options).convert_soup(soup) def format_rfc_text(text: str, number: int) -> str: - one = re.sub(r"\(\.\/rfc(\d+)", r"(https://www.rfc-editor.org/rfc/rfc\1.html", text) - two = re.sub(r"\((#(?:section|page)-\d+(?:.\d+)?)\)", f"(https://www.rfc-editor.org/rfc/rfc{number}.html\1)", one) + one: str = re.sub(r"\(\.\/rfc(\d+)", r"(https://www.rfc-editor.org/rfc/rfc\1.html", text) + two: str = re.sub(r"\((#(?:section|page)-\d+(?:.\d+)?)\)", f"(https://www.rfc-editor.org/rfc/rfc{number}.html\1)", one) three: str = re.sub(r"\n{3,}", "\n\n", two) return three @@ -41,23 +41,23 @@ class SeaUtils(commands.Cog): __author__ = ["SeaswimmerTheFsh"] __version__ = "1.0.0" - def __init__(self, bot: Red): + def __init__(self, bot: Red) -> None: self.bot = bot def format_help_for_context(self, ctx: commands.Context) -> str: - pre_processed = super().format_help_for_context(ctx) or "" + pre_processed = super().format_help_for_context(ctx=ctx) or "" n = "\n" if "\n\n" not in pre_processed else "" text = [ f"{pre_processed}{n}", f"Cog Version: **{self.__version__}**", - f"Author: {cf.humanize_list(self.__author__)}" + f"Author: {cf.humanize_list(items=self.__author__)}" ] return "\n".join(text) def format_src(self, obj: Any) -> str: """A large portion of this code is repurposed from Zephyrkul's RTFS cog. https://github.com/Zephyrkul/FluffyCogs/blob/master/rtfs/rtfs.py""" - obj = inspect.unwrap(obj) + obj = inspect.unwrap(func=obj) src: Any = getattr(obj, "__func__", obj) if isinstance(obj, (commands.Command, app_commands.Command)): src = obj.callback @@ -67,11 +67,11 @@ class SeaUtils(commands.Cog): src = obj.fget elif isinstance(obj, (cached_property, CachedSlotProperty)): src = obj.function - return inspect.getsource(src) + return inspect.getsource(object=src) @commands.command(aliases=["source", "src", "code", "showsource"]) @commands.is_owner() - async def showcode(self, ctx: commands.Context, *, object: str): # pylint: disable=redefined-builtin + async def showcode(self, ctx: commands.Context, *, object: str) -> None: # pylint: disable=redefined-builtin """Show the code for a particular object.""" try: if object.startswith("/") and (obj := ctx.bot.tree.get_command(object[1:])): @@ -195,7 +195,7 @@ class SeaUtils(commands.Cog): embed.description = warning + cf.box(text=ns_stdout.decode()) await ctx.send(embed=embed) else: - await ctx.send(content= warning + cf.box(text=ns_stdout.decode())) + await ctx.send(content = warning + cf.box(text=ns_stdout.decode())) except (FileNotFoundError): await ctx.maybe_send_embed(message=cf.error("Neither `dig` nor `nslookup` are installed on the system. Unable to resolve DNS query.")) From 66b933569be682381744fc67d82723a505e6519b Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Sat, 1 Jun 2024 15:03:23 -0400 Subject: [PATCH 94/95] misc(seautils): soup --- seautils/seautils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seautils/seautils.py b/seautils/seautils.py index 7a4040c..304fd70 100644 --- a/seautils/seautils.py +++ b/seautils/seautils.py @@ -27,7 +27,7 @@ from redbot.core.utils.views import SimpleMenu def md(soup: BeautifulSoup, **options) -> Any | str: - return MarkdownConverter(**options).convert_soup(soup) + return MarkdownConverter(**options).convert_soup(soup=soup) def format_rfc_text(text: str, number: int) -> str: one: str = re.sub(r"\(\.\/rfc(\d+)", r"(https://www.rfc-editor.org/rfc/rfc\1.html", text) From 2ac1dacd19af043ab643b325f83707328dc0273d Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Mon, 3 Jun 2024 01:10:00 -0400 Subject: [PATCH 95/95] fix(backup): added another error type caught by backup import, in the case where you didn't reply to a message or upload a file --- backup/backup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backup/backup.py b/backup/backup.py index 7fe9b4d..6202e3a 100644 --- a/backup/backup.py +++ b/backup/backup.py @@ -100,7 +100,7 @@ class Backup(commands.Cog): except (json.JSONDecodeError, IndexError): try: export = json.loads(await ctx.message.reference.resolved.attachments[0].read()) - except (json.JSONDecodeError, IndexError): + except (json.JSONDecodeError, IndexError, AttributeError): await ctx.send(error("Please provide a valid JSON export file.")) return