Browse Source

Merge pull request #8159 from open-webui/dev

0.5.3
Timothy Jaeryang Baek 4 months ago
parent
commit
4bc9904b3c
100 changed files with 9128 additions and 330 deletions
  1. 20 0
      CHANGELOG.md
  2. 8 0
      README.md
  3. 8 0
      backend/open_webui/env.py
  4. 70 0
      backend/open_webui/migrations/versions/3781e22d8b01_update_message_table.py
  5. 6 2
      backend/open_webui/models/channels.py
  6. 9 0
      backend/open_webui/models/chats.py
  7. 143 7
      backend/open_webui/models/messages.py
  8. 4 1
      backend/open_webui/retrieval/utils.py
  9. 329 13
      backend/open_webui/routers/channels.py
  10. 1 1
      backend/open_webui/routers/files.py
  11. 4 8
      backend/open_webui/routers/knowledge.py
  12. 5 1
      backend/open_webui/routers/retrieval.py
  13. 29 0
      backend/open_webui/socket/main.py
  14. 3 1
      backend/open_webui/storage/provider.py
  15. 5 0
      backend/open_webui/utils/chat.py
  16. 71 40
      backend/open_webui/utils/middleware.py
  17. 4 0
      backend/open_webui/utils/payload.py
  18. 2 2
      backend/open_webui/utils/response.py
  19. 9 2
      package-lock.json
  20. 3 2
      package.json
  21. 122 0
      src/lib/apis/channels/index.ts
  22. 145 48
      src/lib/components/channel/Channel.svelte
  23. 29 72
      src/lib/components/channel/MessageInput.svelte
  24. 82 5
      src/lib/components/channel/Messages.svelte
  25. 146 18
      src/lib/components/channel/Messages/Message.svelte
  26. 1 1
      src/lib/components/channel/Messages/Message/ProfilePreview.svelte
  27. 166 0
      src/lib/components/channel/Messages/Message/ReactionPicker.svelte
  28. 204 0
      src/lib/components/channel/Thread.svelte
  29. 38 6
      src/lib/components/chat/Chat.svelte
  30. 1 1
      src/lib/components/chat/MessageInput.svelte
  31. 12 3
      src/lib/components/chat/Messages/RateComment.svelte
  32. 6 0
      src/lib/components/chat/Settings/About.svelte
  33. 1 1
      src/lib/components/common/Drawer.svelte
  34. 22 2
      src/lib/components/common/SVGPanZoom.svelte
  35. 19 0
      src/lib/components/icons/ChatBubbleOvalEllipsis.svelte
  36. 19 0
      src/lib/components/icons/FaceSmile.svelte
  37. 9 0
      src/lib/components/icons/Reset.svelte
  38. 5054 0
      src/lib/emoji-groups.json
  39. 1905 0
      src/lib/emoji-shortcodes.json
  40. 6 0
      src/lib/i18n/locales/ar-BH/translation.json
  41. 6 0
      src/lib/i18n/locales/bg-BG/translation.json
  42. 6 0
      src/lib/i18n/locales/bn-BD/translation.json
  43. 6 0
      src/lib/i18n/locales/ca-ES/translation.json
  44. 6 0
      src/lib/i18n/locales/ceb-PH/translation.json
  45. 6 0
      src/lib/i18n/locales/cs-CZ/translation.json
  46. 6 0
      src/lib/i18n/locales/da-DK/translation.json
  47. 6 0
      src/lib/i18n/locales/de-DE/translation.json
  48. 6 0
      src/lib/i18n/locales/dg-DG/translation.json
  49. 6 0
      src/lib/i18n/locales/el-GR/translation.json
  50. 6 0
      src/lib/i18n/locales/en-GB/translation.json
  51. 6 0
      src/lib/i18n/locales/en-US/translation.json
  52. 6 0
      src/lib/i18n/locales/es-ES/translation.json
  53. 6 0
      src/lib/i18n/locales/eu-ES/translation.json
  54. 6 0
      src/lib/i18n/locales/fa-IR/translation.json
  55. 6 0
      src/lib/i18n/locales/fi-FI/translation.json
  56. 6 0
      src/lib/i18n/locales/fr-CA/translation.json
  57. 54 48
      src/lib/i18n/locales/fr-FR/translation.json
  58. 6 0
      src/lib/i18n/locales/he-IL/translation.json
  59. 6 0
      src/lib/i18n/locales/hi-IN/translation.json
  60. 6 0
      src/lib/i18n/locales/hr-HR/translation.json
  61. 6 0
      src/lib/i18n/locales/hu-HU/translation.json
  62. 6 0
      src/lib/i18n/locales/id-ID/translation.json
  63. 6 0
      src/lib/i18n/locales/ie-GA/translation.json
  64. 6 0
      src/lib/i18n/locales/it-IT/translation.json
  65. 23 17
      src/lib/i18n/locales/ja-JP/translation.json
  66. 6 0
      src/lib/i18n/locales/ka-GE/translation.json
  67. 6 0
      src/lib/i18n/locales/ko-KR/translation.json
  68. 6 0
      src/lib/i18n/locales/lt-LT/translation.json
  69. 6 0
      src/lib/i18n/locales/ms-MY/translation.json
  70. 6 0
      src/lib/i18n/locales/nb-NO/translation.json
  71. 6 0
      src/lib/i18n/locales/nl-NL/translation.json
  72. 6 0
      src/lib/i18n/locales/pa-IN/translation.json
  73. 6 0
      src/lib/i18n/locales/pl-PL/translation.json
  74. 6 0
      src/lib/i18n/locales/pt-BR/translation.json
  75. 6 0
      src/lib/i18n/locales/pt-PT/translation.json
  76. 6 0
      src/lib/i18n/locales/ro-RO/translation.json
  77. 6 0
      src/lib/i18n/locales/ru-RU/translation.json
  78. 6 0
      src/lib/i18n/locales/sk-SK/translation.json
  79. 6 0
      src/lib/i18n/locales/sr-RS/translation.json
  80. 6 0
      src/lib/i18n/locales/sv-SE/translation.json
  81. 6 0
      src/lib/i18n/locales/th-TH/translation.json
  82. 6 0
      src/lib/i18n/locales/tk-TW/translation.json
  83. 6 0
      src/lib/i18n/locales/tr-TR/translation.json
  84. 6 0
      src/lib/i18n/locales/uk-UA/translation.json
  85. 6 0
      src/lib/i18n/locales/ur-PK/translation.json
  86. 6 0
      src/lib/i18n/locales/vi-VN/translation.json
  87. 6 0
      src/lib/i18n/locales/zh-CN/translation.json
  88. 33 27
      src/lib/i18n/locales/zh-TW/translation.json
  89. 17 1
      src/lib/stores/index.ts
  90. 1 0
      static/assets/emojis/0023-fe0f-20e3.svg
  91. 1 0
      static/assets/emojis/002a-fe0f-20e3.svg
  92. 1 0
      static/assets/emojis/0030-fe0f-20e3.svg
  93. 1 0
      static/assets/emojis/0031-fe0f-20e3.svg
  94. 1 0
      static/assets/emojis/0032-fe0f-20e3.svg
  95. 1 0
      static/assets/emojis/0033-fe0f-20e3.svg
  96. 1 0
      static/assets/emojis/0034-fe0f-20e3.svg
  97. 1 0
      static/assets/emojis/0035-fe0f-20e3.svg
  98. 1 0
      static/assets/emojis/0036-fe0f-20e3.svg
  99. 1 0
      static/assets/emojis/0037-fe0f-20e3.svg
  100. 1 0
      static/assets/emojis/0038-fe0f-20e3.svg

+ 20 - 0
CHANGELOG.md

@@ -5,6 +5,26 @@ All notable changes to this project will be documented in this file.
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
+## [0.5.3] - 2024-12-31
+
+### Added
+
+- **💬 Channel Reactions with Built-In Emoji Picker**: Easily express yourself in channel threads and messages with reactions, featuring an intuitive built-in emoji picker for seamless selection.
+- **🧵 Threads for Channels**: Organize discussions within channels by creating threads, improving clarity and fostering focused conversations.
+- **🔄 Reset Button for SVG Pan/Zoom**: Added a handy reset button to SVG Pan/Zoom, allowing users to quickly return diagrams or visuals to their default state without hassle.
+- **⚡ Realtime Chat Save Environment Variable**: Introduced the ENABLE_REALTIME_CHAT_SAVE environment variable. Choose between faster responses by disabling realtime chat saving or ensuring chunk-by-chunk data persistency for critical operations.
+- **🌍 Translation Enhancements**: Updated and refined translations across multiple languages, providing a smoother experience for international users.
+- **📚 Improved Documentation**: Expanded documentation on functions, including clearer guidance on function plugins and detailed instructions for migrating to v0.5. This ensures users can adapt and harness new updates more effectively. (https://docs.openwebui.com/features/plugin/)
+
+### Fixed
+
+- **🛠️ Ollama Parameters Respected**: Resolved an issue where input parameters for Ollama were being ignored, ensuring precise and consistent model behavior.
+- **🔧 Function Plugin Outlet Hook Reliability**: Fixed a bug causing issues with 'event_emitter' and outlet hooks in filter function plugins, guaranteeing smoother operation within custom extensions.
+- **🖋️ Weird Custom Status Descriptions**: Adjusted the formatting and functionality for custom user statuses, ensuring they display correctly and intuitively.
+- **🔗 Restored API Functionality**: Fixed a critical issue where APIs were not operational for certain configurations, ensuring uninterrupted access.
+- **⏳ Custom Pipe Function Completion**: Resolved an issue where chats using specific custom pipe function plugins weren’t finishing properly, restoring consistent chat workflows.
+- **✅ General Stability Enhancements**: Implemented various under-the-hood improvements to boost overall reliability, ensuring smoother and more consistent performance across the WebUI.
+
 ## [0.5.2] - 2024-12-26
 
 ### Added

+ 8 - 0
README.md

@@ -185,6 +185,14 @@ If you want to try out the latest bleeding-edge features and are okay with occas
 docker run -d -p 3000:8080 -v open-webui:/app/backend/data --name open-webui --add-host=host.docker.internal:host-gateway --restart always ghcr.io/open-webui/open-webui:dev
 ```
 
+### Offline Mode
+
+If you are running Open WebUI in an offline environment, you can set the `HF_HUB_OFFLINE` environment variable to `1` to prevent attempts to download models from the internet.
+
+```bash
+export HF_HUB_OFFLINE=1
+```
+
 ## What's Next? 🌟
 
 Discover upcoming features on our roadmap in the [Open WebUI Documentation](https://docs.openwebui.com/roadmap/).

+ 8 - 0
backend/open_webui/env.py

@@ -311,6 +311,11 @@ RESET_CONFIG_ON_START = (
     os.environ.get("RESET_CONFIG_ON_START", "False").lower() == "true"
 )
 
+
+ENABLE_REALTIME_CHAT_SAVE = (
+    os.environ.get("ENABLE_REALTIME_CHAT_SAVE", "True").lower() == "true"
+)
+
 ####################################
 # REDIS
 ####################################
@@ -392,3 +397,6 @@ else:
 ####################################
 
 OFFLINE_MODE = os.environ.get("OFFLINE_MODE", "false").lower() == "true"
+
+if OFFLINE_MODE:
+    os.environ["HF_HUB_OFFLINE"] = "1"

+ 70 - 0
backend/open_webui/migrations/versions/3781e22d8b01_update_message_table.py

@@ -0,0 +1,70 @@
+"""Update message & channel tables
+
+Revision ID: 3781e22d8b01
+Revises: 7826ab40b532
+Create Date: 2024-12-30 03:00:00.000000
+
+"""
+
+from alembic import op
+import sqlalchemy as sa
+
+revision = "3781e22d8b01"
+down_revision = "7826ab40b532"
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+    # Add 'type' column to the 'channel' table
+    op.add_column(
+        "channel",
+        sa.Column(
+            "type",
+            sa.Text(),
+            nullable=True,
+        ),
+    )
+
+    # Add 'parent_id' column to the 'message' table for threads
+    op.add_column(
+        "message",
+        sa.Column("parent_id", sa.Text(), nullable=True),
+    )
+
+    op.create_table(
+        "message_reaction",
+        sa.Column(
+            "id", sa.Text(), nullable=False, primary_key=True, unique=True
+        ),  # Unique reaction ID
+        sa.Column("user_id", sa.Text(), nullable=False),  # User who reacted
+        sa.Column(
+            "message_id", sa.Text(), nullable=False
+        ),  # Message that was reacted to
+        sa.Column(
+            "name", sa.Text(), nullable=False
+        ),  # Reaction name (e.g. "thumbs_up")
+        sa.Column(
+            "created_at", sa.BigInteger(), nullable=True
+        ),  # Timestamp of when the reaction was added
+    )
+
+    op.create_table(
+        "channel_member",
+        sa.Column(
+            "id", sa.Text(), nullable=False, primary_key=True, unique=True
+        ),  # Record ID for the membership row
+        sa.Column("channel_id", sa.Text(), nullable=False),  # Associated channel
+        sa.Column("user_id", sa.Text(), nullable=False),  # Associated user
+        sa.Column(
+            "created_at", sa.BigInteger(), nullable=True
+        ),  # Timestamp of when the user joined the channel
+    )
+
+
+def downgrade():
+    # Revert 'type' column addition to the 'channel' table
+    op.drop_column("channel", "type")
+    op.drop_column("message", "parent_id")
+    op.drop_table("message_reaction")
+    op.drop_table("channel_member")

+ 6 - 2
backend/open_webui/models/channels.py

@@ -21,6 +21,7 @@ class Channel(Base):
 
     id = Column(Text, primary_key=True)
     user_id = Column(Text)
+    type = Column(Text, nullable=True)
 
     name = Column(Text)
     description = Column(Text, nullable=True)
@@ -38,9 +39,11 @@ class ChannelModel(BaseModel):
 
     id: str
     user_id: str
-    description: Optional[str] = None
+    type: Optional[str] = None
 
     name: str
+    description: Optional[str] = None
+
     data: Optional[dict] = None
     meta: Optional[dict] = None
     access_control: Optional[dict] = None
@@ -64,12 +67,13 @@ class ChannelForm(BaseModel):
 
 class ChannelTable:
     def insert_new_channel(
-        self, form_data: ChannelForm, user_id: str
+        self, type: Optional[str], form_data: ChannelForm, user_id: str
     ) -> Optional[ChannelModel]:
         with get_db() as db:
             channel = ChannelModel(
                 **{
                     **form_data.model_dump(),
+                    "type": type,
                     "name": form_data.name.lower(),
                     "id": str(uuid.uuid4()),
                     "user_id": user_id,

+ 9 - 0
backend/open_webui/models/chats.py

@@ -212,6 +212,15 @@ class ChatTable:
 
         return chat.chat.get("history", {}).get("messages", {}) or {}
 
+    def get_message_by_id_and_message_id(
+        self, id: str, message_id: str
+    ) -> Optional[dict]:
+        chat = self.get_chat_by_id(id)
+        if chat is None:
+            return None
+
+        return chat.chat.get("history", {}).get("messages", {}).get(message_id, {})
+
     def upsert_message_to_chat_by_id_and_message_id(
         self, id: str, message_id: str, message: dict
     ) -> Optional[ChatModel]:

+ 143 - 7
backend/open_webui/models/messages.py

@@ -17,6 +17,25 @@ from sqlalchemy.sql import exists
 ####################
 
 
+class MessageReaction(Base):
+    __tablename__ = "message_reaction"
+    id = Column(Text, primary_key=True)
+    user_id = Column(Text)
+    message_id = Column(Text)
+    name = Column(Text)
+    created_at = Column(BigInteger)
+
+
+class MessageReactionModel(BaseModel):
+    model_config = ConfigDict(from_attributes=True)
+
+    id: str
+    user_id: str
+    message_id: str
+    name: str
+    created_at: int  # timestamp in epoch
+
+
 class Message(Base):
     __tablename__ = "message"
     id = Column(Text, primary_key=True)
@@ -24,6 +43,8 @@ class Message(Base):
     user_id = Column(Text)
     channel_id = Column(Text, nullable=True)
 
+    parent_id = Column(Text, nullable=True)
+
     content = Column(Text)
     data = Column(JSON, nullable=True)
     meta = Column(JSON, nullable=True)
@@ -39,6 +60,8 @@ class MessageModel(BaseModel):
     user_id: str
     channel_id: Optional[str] = None
 
+    parent_id: Optional[str] = None
+
     content: str
     data: Optional[dict] = None
     meta: Optional[dict] = None
@@ -54,10 +77,23 @@ class MessageModel(BaseModel):
 
 class MessageForm(BaseModel):
     content: str
+    parent_id: Optional[str] = None
     data: Optional[dict] = None
     meta: Optional[dict] = None
 
 
+class Reactions(BaseModel):
+    name: str
+    user_ids: list[str]
+    count: int
+
+
+class MessageResponse(MessageModel):
+    latest_reply_at: Optional[int]
+    reply_count: int
+    reactions: list[Reactions]
+
+
 class MessageTable:
     def insert_new_message(
         self, form_data: MessageForm, channel_id: str, user_id: str
@@ -71,6 +107,7 @@ class MessageTable:
                     "id": id,
                     "user_id": user_id,
                     "channel_id": channel_id,
+                    "parent_id": form_data.parent_id,
                     "content": form_data.content,
                     "data": form_data.data,
                     "meta": form_data.meta,
@@ -85,10 +122,40 @@ class MessageTable:
             db.refresh(result)
             return MessageModel.model_validate(result) if result else None
 
-    def get_message_by_id(self, id: str) -> Optional[MessageModel]:
+    def get_message_by_id(self, id: str) -> Optional[MessageResponse]:
         with get_db() as db:
             message = db.get(Message, id)
-            return MessageModel.model_validate(message) if message else None
+            if not message:
+                return None
+
+            reactions = self.get_reactions_by_message_id(id)
+            replies = self.get_replies_by_message_id(id)
+
+            return MessageResponse(
+                **{
+                    **MessageModel.model_validate(message).model_dump(),
+                    "latest_reply_at": replies[0].created_at if replies else None,
+                    "reply_count": len(replies),
+                    "reactions": reactions,
+                }
+            )
+
+    def get_replies_by_message_id(self, id: str) -> list[MessageModel]:
+        with get_db() as db:
+            all_messages = (
+                db.query(Message)
+                .filter_by(parent_id=id)
+                .order_by(Message.created_at.desc())
+                .all()
+            )
+            return [MessageModel.model_validate(message) for message in all_messages]
+
+    def get_reply_user_ids_by_message_id(self, id: str) -> list[str]:
+        with get_db() as db:
+            return [
+                message.user_id
+                for message in db.query(Message).filter_by(parent_id=id).all()
+            ]
 
     def get_messages_by_channel_id(
         self, channel_id: str, skip: int = 0, limit: int = 50
@@ -96,7 +163,7 @@ class MessageTable:
         with get_db() as db:
             all_messages = (
                 db.query(Message)
-                .filter_by(channel_id=channel_id)
+                .filter_by(channel_id=channel_id, parent_id=None)
                 .order_by(Message.created_at.desc())
                 .offset(skip)
                 .limit(limit)
@@ -104,19 +171,27 @@ class MessageTable:
             )
             return [MessageModel.model_validate(message) for message in all_messages]
 
-    def get_messages_by_user_id(
-        self, user_id: str, skip: int = 0, limit: int = 50
+    def get_messages_by_parent_id(
+        self, channel_id: str, parent_id: str, skip: int = 0, limit: int = 50
     ) -> list[MessageModel]:
         with get_db() as db:
+            message = db.get(Message, parent_id)
+
+            if not message:
+                return []
+
             all_messages = (
                 db.query(Message)
-                .filter_by(user_id=user_id)
+                .filter_by(channel_id=channel_id, parent_id=parent_id)
                 .order_by(Message.created_at.desc())
                 .offset(skip)
                 .limit(limit)
                 .all()
             )
-            return [MessageModel.model_validate(message) for message in all_messages]
+
+            return [
+                MessageModel.model_validate(message) for message in all_messages
+            ] + [MessageModel.model_validate(message)]
 
     def update_message_by_id(
         self, id: str, form_data: MessageForm
@@ -131,9 +206,70 @@ class MessageTable:
             db.refresh(message)
             return MessageModel.model_validate(message) if message else None
 
+    def add_reaction_to_message(
+        self, id: str, user_id: str, name: str
+    ) -> Optional[MessageReactionModel]:
+        with get_db() as db:
+            reaction_id = str(uuid.uuid4())
+            reaction = MessageReactionModel(
+                id=reaction_id,
+                user_id=user_id,
+                message_id=id,
+                name=name,
+                created_at=int(time.time_ns()),
+            )
+            result = MessageReaction(**reaction.model_dump())
+            db.add(result)
+            db.commit()
+            db.refresh(result)
+            return MessageReactionModel.model_validate(result) if result else None
+
+    def get_reactions_by_message_id(self, id: str) -> list[Reactions]:
+        with get_db() as db:
+            all_reactions = db.query(MessageReaction).filter_by(message_id=id).all()
+
+            reactions = {}
+            for reaction in all_reactions:
+                if reaction.name not in reactions:
+                    reactions[reaction.name] = {
+                        "name": reaction.name,
+                        "user_ids": [],
+                        "count": 0,
+                    }
+                reactions[reaction.name]["user_ids"].append(reaction.user_id)
+                reactions[reaction.name]["count"] += 1
+
+            return [Reactions(**reaction) for reaction in reactions.values()]
+
+    def remove_reaction_by_id_and_user_id_and_name(
+        self, id: str, user_id: str, name: str
+    ) -> bool:
+        with get_db() as db:
+            db.query(MessageReaction).filter_by(
+                message_id=id, user_id=user_id, name=name
+            ).delete()
+            db.commit()
+            return True
+
+    def delete_reactions_by_id(self, id: str) -> bool:
+        with get_db() as db:
+            db.query(MessageReaction).filter_by(message_id=id).delete()
+            db.commit()
+            return True
+
+    def delete_replies_by_id(self, id: str) -> bool:
+        with get_db() as db:
+            db.query(Message).filter_by(parent_id=id).delete()
+            db.commit()
+            return True
+
     def delete_message_by_id(self, id: str) -> bool:
         with get_db() as db:
             db.query(Message).filter_by(id=id).delete()
+
+            # Delete all reactions to this message
+            db.query(MessageReaction).filter_by(message_id=id).delete()
+
             db.commit()
             return True
 

+ 4 - 1
backend/open_webui/retrieval/utils.py

@@ -14,7 +14,7 @@ from langchain_core.documents import Document
 from open_webui.retrieval.vector.connector import VECTOR_DB_CLIENT
 from open_webui.utils.misc import get_last_user_message
 
-from open_webui.env import SRC_LOG_LEVELS
+from open_webui.env import SRC_LOG_LEVELS, OFFLINE_MODE
 
 log = logging.getLogger(__name__)
 log.setLevel(SRC_LOG_LEVELS["RAG"])
@@ -375,6 +375,9 @@ def get_model_path(model: str, update_model: bool = False):
 
     local_files_only = not update_model
 
+    if OFFLINE_MODE:
+        local_files_only = True
+
     snapshot_kwargs = {
         "cache_dir": cache_dir,
         "local_files_only": local_files_only,

+ 329 - 13
backend/open_webui/routers/channels.py

@@ -11,7 +11,12 @@ from open_webui.socket.main import sio, get_user_ids_from_room
 from open_webui.models.users import Users, UserNameResponse
 
 from open_webui.models.channels import Channels, ChannelModel, ChannelForm
-from open_webui.models.messages import Messages, MessageModel, MessageForm
+from open_webui.models.messages import (
+    Messages,
+    MessageModel,
+    MessageResponse,
+    MessageForm,
+)
 
 
 from open_webui.config import ENABLE_ADMIN_CHAT_ACCESS, ENABLE_ADMIN_EXPORT
@@ -49,7 +54,7 @@ async def get_channels(user=Depends(get_verified_user)):
 @router.post("/create", response_model=Optional[ChannelModel])
 async def create_new_channel(form_data: ChannelForm, user=Depends(get_admin_user)):
     try:
-        channel = Channels.insert_new_channel(form_data, user.id)
+        channel = Channels.insert_new_channel(None, form_data, user.id)
         return ChannelModel(**channel.model_dump())
     except Exception as e:
         log.exception(e)
@@ -134,11 +139,11 @@ async def delete_channel_by_id(id: str, user=Depends(get_admin_user)):
 ############################
 
 
-class MessageUserModel(MessageModel):
+class MessageUserResponse(MessageResponse):
     user: UserNameResponse
 
 
-@router.get("/{id}/messages", response_model=list[MessageUserModel])
+@router.get("/{id}/messages", response_model=list[MessageUserResponse])
 async def get_channel_messages(
     id: str, skip: int = 0, limit: int = 50, user=Depends(get_verified_user)
 ):
@@ -164,10 +169,16 @@ async def get_channel_messages(
             user = Users.get_user_by_id(message.user_id)
             users[message.user_id] = user
 
+        replies = Messages.get_replies_by_message_id(message.id)
+        latest_reply_at = replies[0].created_at if replies else None
+
         messages.append(
-            MessageUserModel(
+            MessageUserResponse(
                 **{
                     **message.model_dump(),
+                    "reply_count": len(replies),
+                    "latest_reply_at": latest_reply_at,
+                    "reactions": Messages.get_reactions_by_message_id(message.id),
                     "user": UserNameResponse(**users[message.user_id].model_dump()),
                 }
             )
@@ -236,10 +247,17 @@ async def post_new_message(
                 "message_id": message.id,
                 "data": {
                     "type": "message",
-                    "data": {
-                        **message.model_dump(),
-                        "user": UserNameResponse(**user.model_dump()).model_dump(),
-                    },
+                    "data": MessageUserResponse(
+                        **{
+                            **message.model_dump(),
+                            "reply_count": 0,
+                            "latest_reply_at": None,
+                            "reactions": Messages.get_reactions_by_message_id(
+                                message.id
+                            ),
+                            "user": UserNameResponse(**user.model_dump()),
+                        }
+                    ).model_dump(),
                 },
                 "user": UserNameResponse(**user.model_dump()).model_dump(),
                 "channel": channel.model_dump(),
@@ -251,6 +269,35 @@ async def post_new_message(
                 to=f"channel:{channel.id}",
             )
 
+            if message.parent_id:
+                # If this message is a reply, emit to the parent message as well
+                parent_message = Messages.get_message_by_id(message.parent_id)
+
+                if parent_message:
+                    await sio.emit(
+                        "channel-events",
+                        {
+                            "channel_id": channel.id,
+                            "message_id": parent_message.id,
+                            "data": {
+                                "type": "message:reply",
+                                "data": MessageUserResponse(
+                                    **{
+                                        **parent_message.model_dump(),
+                                        "user": UserNameResponse(
+                                            **Users.get_user_by_id(
+                                                parent_message.user_id
+                                            ).model_dump()
+                                        ),
+                                    }
+                                ).model_dump(),
+                            },
+                            "user": UserNameResponse(**user.model_dump()).model_dump(),
+                            "channel": channel.model_dump(),
+                        },
+                        to=f"channel:{channel.id}",
+                    )
+
             active_user_ids = get_user_ids_from_room(f"channel:{channel.id}")
 
             background_tasks.add_task(
@@ -269,6 +316,101 @@ async def post_new_message(
         )
 
 
+############################
+# GetChannelMessage
+############################
+
+
+@router.get("/{id}/messages/{message_id}", response_model=Optional[MessageUserResponse])
+async def get_channel_message(
+    id: str, message_id: str, user=Depends(get_verified_user)
+):
+    channel = Channels.get_channel_by_id(id)
+    if not channel:
+        raise HTTPException(
+            status_code=status.HTTP_404_NOT_FOUND, detail=ERROR_MESSAGES.NOT_FOUND
+        )
+
+    if user.role != "admin" and not has_access(
+        user.id, type="read", access_control=channel.access_control
+    ):
+        raise HTTPException(
+            status_code=status.HTTP_403_FORBIDDEN, detail=ERROR_MESSAGES.DEFAULT()
+        )
+
+    message = Messages.get_message_by_id(message_id)
+    if not message:
+        raise HTTPException(
+            status_code=status.HTTP_404_NOT_FOUND, detail=ERROR_MESSAGES.NOT_FOUND
+        )
+
+    if message.channel_id != id:
+        raise HTTPException(
+            status_code=status.HTTP_400_BAD_REQUEST, detail=ERROR_MESSAGES.DEFAULT()
+        )
+
+    return MessageUserResponse(
+        **{
+            **message.model_dump(),
+            "user": UserNameResponse(
+                **Users.get_user_by_id(message.user_id).model_dump()
+            ),
+        }
+    )
+
+
+############################
+# GetChannelThreadMessages
+############################
+
+
+@router.get(
+    "/{id}/messages/{message_id}/thread", response_model=list[MessageUserResponse]
+)
+async def get_channel_thread_messages(
+    id: str,
+    message_id: str,
+    skip: int = 0,
+    limit: int = 50,
+    user=Depends(get_verified_user),
+):
+    channel = Channels.get_channel_by_id(id)
+    if not channel:
+        raise HTTPException(
+            status_code=status.HTTP_404_NOT_FOUND, detail=ERROR_MESSAGES.NOT_FOUND
+        )
+
+    if user.role != "admin" and not has_access(
+        user.id, type="read", access_control=channel.access_control
+    ):
+        raise HTTPException(
+            status_code=status.HTTP_403_FORBIDDEN, detail=ERROR_MESSAGES.DEFAULT()
+        )
+
+    message_list = Messages.get_messages_by_parent_id(id, message_id, skip, limit)
+    users = {}
+
+    messages = []
+    for message in message_list:
+        if message.user_id not in users:
+            user = Users.get_user_by_id(message.user_id)
+            users[message.user_id] = user
+
+        messages.append(
+            MessageUserResponse(
+                **{
+                    **message.model_dump(),
+                    "reply_count": 0,
+                    "latest_reply_at": None,
+                    "reactions": Messages.get_reactions_by_message_id(message.id),
+                    "user": UserNameResponse(**users[message.user_id].model_dump()),
+                }
+            )
+        )
+
+    return messages
+
+
 ############################
 # UpdateMessageById
 ############################
@@ -306,6 +448,8 @@ async def update_message_by_id(
 
     try:
         message = Messages.update_message_by_id(message_id, form_data)
+        message = Messages.get_message_by_id(message_id)
+
         if message:
             await sio.emit(
                 "channel-events",
@@ -314,10 +458,14 @@ async def update_message_by_id(
                     "message_id": message.id,
                     "data": {
                         "type": "message:update",
-                        "data": {
-                            **message.model_dump(),
-                            "user": UserNameResponse(**user.model_dump()).model_dump(),
-                        },
+                        "data": MessageUserResponse(
+                            **{
+                                **message.model_dump(),
+                                "user": UserNameResponse(
+                                    **user.model_dump()
+                                ).model_dump(),
+                            }
+                        ).model_dump(),
                     },
                     "user": UserNameResponse(**user.model_dump()).model_dump(),
                     "channel": channel.model_dump(),
@@ -333,6 +481,145 @@ async def update_message_by_id(
         )
 
 
+############################
+# AddReactionToMessage
+############################
+
+
+class ReactionForm(BaseModel):
+    name: str
+
+
+@router.post("/{id}/messages/{message_id}/reactions/add", response_model=bool)
+async def add_reaction_to_message(
+    id: str, message_id: str, form_data: ReactionForm, user=Depends(get_verified_user)
+):
+    channel = Channels.get_channel_by_id(id)
+    if not channel:
+        raise HTTPException(
+            status_code=status.HTTP_404_NOT_FOUND, detail=ERROR_MESSAGES.NOT_FOUND
+        )
+
+    if user.role != "admin" and not has_access(
+        user.id, type="read", access_control=channel.access_control
+    ):
+        raise HTTPException(
+            status_code=status.HTTP_403_FORBIDDEN, detail=ERROR_MESSAGES.DEFAULT()
+        )
+
+    message = Messages.get_message_by_id(message_id)
+    if not message:
+        raise HTTPException(
+            status_code=status.HTTP_404_NOT_FOUND, detail=ERROR_MESSAGES.NOT_FOUND
+        )
+
+    if message.channel_id != id:
+        raise HTTPException(
+            status_code=status.HTTP_400_BAD_REQUEST, detail=ERROR_MESSAGES.DEFAULT()
+        )
+
+    try:
+        Messages.add_reaction_to_message(message_id, user.id, form_data.name)
+        message = Messages.get_message_by_id(message_id)
+
+        await sio.emit(
+            "channel-events",
+            {
+                "channel_id": channel.id,
+                "message_id": message.id,
+                "data": {
+                    "type": "message:reaction:add",
+                    "data": {
+                        **message.model_dump(),
+                        "user": UserNameResponse(
+                            **Users.get_user_by_id(message.user_id).model_dump()
+                        ).model_dump(),
+                        "name": form_data.name,
+                    },
+                },
+                "user": UserNameResponse(**user.model_dump()).model_dump(),
+                "channel": channel.model_dump(),
+            },
+            to=f"channel:{channel.id}",
+        )
+
+        return True
+    except Exception as e:
+        log.exception(e)
+        raise HTTPException(
+            status_code=status.HTTP_400_BAD_REQUEST, detail=ERROR_MESSAGES.DEFAULT()
+        )
+
+
+############################
+# RemoveReactionById
+############################
+
+
+@router.post("/{id}/messages/{message_id}/reactions/remove", response_model=bool)
+async def remove_reaction_by_id_and_user_id_and_name(
+    id: str, message_id: str, form_data: ReactionForm, user=Depends(get_verified_user)
+):
+    channel = Channels.get_channel_by_id(id)
+    if not channel:
+        raise HTTPException(
+            status_code=status.HTTP_404_NOT_FOUND, detail=ERROR_MESSAGES.NOT_FOUND
+        )
+
+    if user.role != "admin" and not has_access(
+        user.id, type="read", access_control=channel.access_control
+    ):
+        raise HTTPException(
+            status_code=status.HTTP_403_FORBIDDEN, detail=ERROR_MESSAGES.DEFAULT()
+        )
+
+    message = Messages.get_message_by_id(message_id)
+    if not message:
+        raise HTTPException(
+            status_code=status.HTTP_404_NOT_FOUND, detail=ERROR_MESSAGES.NOT_FOUND
+        )
+
+    if message.channel_id != id:
+        raise HTTPException(
+            status_code=status.HTTP_400_BAD_REQUEST, detail=ERROR_MESSAGES.DEFAULT()
+        )
+
+    try:
+        Messages.remove_reaction_by_id_and_user_id_and_name(
+            message_id, user.id, form_data.name
+        )
+
+        message = Messages.get_message_by_id(message_id)
+
+        await sio.emit(
+            "channel-events",
+            {
+                "channel_id": channel.id,
+                "message_id": message.id,
+                "data": {
+                    "type": "message:reaction:remove",
+                    "data": {
+                        **message.model_dump(),
+                        "user": UserNameResponse(
+                            **Users.get_user_by_id(message.user_id).model_dump()
+                        ).model_dump(),
+                        "name": form_data.name,
+                    },
+                },
+                "user": UserNameResponse(**user.model_dump()).model_dump(),
+                "channel": channel.model_dump(),
+            },
+            to=f"channel:{channel.id}",
+        )
+
+        return True
+    except Exception as e:
+        log.exception(e)
+        raise HTTPException(
+            status_code=status.HTTP_400_BAD_REQUEST, detail=ERROR_MESSAGES.DEFAULT()
+        )
+
+
 ############################
 # DeleteMessageById
 ############################
@@ -386,6 +673,35 @@ async def delete_message_by_id(
             to=f"channel:{channel.id}",
         )
 
+        if message.parent_id:
+            # If this message is a reply, emit to the parent message as well
+            parent_message = Messages.get_message_by_id(message.parent_id)
+
+            if parent_message:
+                await sio.emit(
+                    "channel-events",
+                    {
+                        "channel_id": channel.id,
+                        "message_id": parent_message.id,
+                        "data": {
+                            "type": "message:reply",
+                            "data": MessageUserResponse(
+                                **{
+                                    **parent_message.model_dump(),
+                                    "user": UserNameResponse(
+                                        **Users.get_user_by_id(
+                                            parent_message.user_id
+                                        ).model_dump()
+                                    ),
+                                }
+                            ).model_dump(),
+                        },
+                        "user": UserNameResponse(**user.model_dump()).model_dump(),
+                        "channel": channel.model_dump(),
+                    },
+                    to=f"channel:{channel.id}",
+                )
+
         return True
     except Exception as e:
         log.exception(e)

+ 1 - 1
backend/open_webui/routers/files.py

@@ -348,7 +348,7 @@ async def delete_file_by_id(id: str, user=Depends(get_verified_user)):
         result = Files.delete_file_by_id(id)
         if result:
             try:
-                Storage.delete_file(file.filename)
+                Storage.delete_file(file.path)
             except Exception as e:
                 log.exception(e)
                 log.error(f"Error deleting files")

+ 4 - 8
backend/open_webui/routers/knowledge.py

@@ -419,13 +419,6 @@ def remove_file_from_knowledge_by_id(
         collection_name=knowledge.id, filter={"file_id": form_data.file_id}
     )
 
-    result = VECTOR_DB_CLIENT.query(
-        collection_name=knowledge.id,
-        filter={"file_id": form_data.file_id},
-    )
-
-    Files.delete_file_by_id(form_data.file_id)
-
     if knowledge:
         data = knowledge.data or {}
         file_ids = data.get("file_ids", [])
@@ -527,6 +520,7 @@ async def reset_knowledge_by_id(id: str, user=Depends(get_verified_user)):
 
 @router.post("/{id}/files/batch/add", response_model=Optional[KnowledgeFilesResponse])
 def add_files_to_knowledge_batch(
+    request: Request,
     id: str,
     form_data: list[KnowledgeFileIdForm],
     user=Depends(get_verified_user),
@@ -562,7 +556,9 @@ def add_files_to_knowledge_batch(
     # Process files
     try:
         result = process_files_batch(
-            BatchProcessFilesForm(files=files, collection_name=id)
+            request=request,
+            form_data=BatchProcessFilesForm(files=files, collection_name=id),
+            user=user,
         )
     except Exception as e:
         log.error(

+ 5 - 1
backend/open_webui/routers/retrieval.py

@@ -1458,6 +1458,7 @@ class BatchProcessFilesResponse(BaseModel):
 
 @router.post("/process/files/batch")
 def process_files_batch(
+    request: Request,
     form_data: BatchProcessFilesForm,
     user=Depends(get_verified_user),
 ) -> BatchProcessFilesResponse:
@@ -1504,7 +1505,10 @@ def process_files_batch(
     if all_docs:
         try:
             save_docs_to_vector_db(
-                docs=all_docs, collection_name=collection_name, add=True
+                request=request,
+                docs=all_docs,
+                collection_name=collection_name,
+                add=True,
             )
 
             # Update all files with collection name

+ 29 - 0
backend/open_webui/socket/main.py

@@ -237,6 +237,7 @@ async def channel_events(sid, data):
             "channel-events",
             {
                 "channel_id": data["channel_id"],
+                "message_id": data.get("message_id", None),
                 "data": event_data,
                 "user": UserNameResponse(**SESSION_POOL[sid]).model_dump(),
             },
@@ -292,6 +293,34 @@ def get_event_emitter(request_info):
                 event_data.get("data", {}),
             )
 
+        if "type" in event_data and event_data["type"] == "message":
+            message = Chats.get_message_by_id_and_message_id(
+                request_info["chat_id"],
+                request_info["message_id"],
+            )
+
+            content = message.get("content", "")
+            content += event_data.get("data", {}).get("content", "")
+
+            Chats.upsert_message_to_chat_by_id_and_message_id(
+                request_info["chat_id"],
+                request_info["message_id"],
+                {
+                    "content": content,
+                },
+            )
+
+        if "type" in event_data and event_data["type"] == "replace":
+            content = event_data.get("data", {}).get("content", "")
+
+            Chats.upsert_message_to_chat_by_id_and_message_id(
+                request_info["chat_id"],
+                request_info["message_id"],
+                {
+                    "content": content,
+                },
+            )
+
     return __event_emitter__
 
 

+ 3 - 1
backend/open_webui/storage/provider.py

@@ -147,8 +147,10 @@ class StorageProvider:
             return self._get_file_from_s3(file_path)
         return self._get_file_from_local(file_path)
 
-    def delete_file(self, filename: str) -> None:
+    def delete_file(self, file_path: str) -> None:
         """Deletes a file either from S3 or the local file system."""
+        filename = file_path.split("/")[-1]
+
         if self.storage_provider == "s3":
             self._delete_from_s3(filename)
 

+ 5 - 0
backend/open_webui/utils/chat.py

@@ -157,6 +157,9 @@ async def generate_chat_completion(
         )
 
 
+chat_completion = generate_chat_completion
+
+
 async def chat_completed(request: Request, form_data: dict, user: Any):
     if not request.app.state.MODELS:
         await get_all_models(request)
@@ -179,6 +182,7 @@ async def chat_completed(request: Request, form_data: dict, user: Any):
             "chat_id": data["chat_id"],
             "message_id": data["id"],
             "session_id": data["session_id"],
+            "user_id": user.id,
         }
     )
 
@@ -187,6 +191,7 @@ async def chat_completed(request: Request, form_data: dict, user: Any):
             "chat_id": data["chat_id"],
             "message_id": data["id"],
             "session_id": data["session_id"],
+            "user_id": user.id,
         }
     )
 

+ 71 - 40
backend/open_webui/utils/middleware.py

@@ -23,7 +23,7 @@ from open_webui.models.users import Users
 from open_webui.socket.main import (
     get_event_call,
     get_event_emitter,
-    get_user_id_from_session_pool,
+    get_active_status_by_user_id,
 )
 from open_webui.routers.tasks import (
     generate_queries,
@@ -65,6 +65,7 @@ from open_webui.env import (
     SRC_LOG_LEVELS,
     GLOBAL_LOG_LEVEL,
     BYPASS_MODEL_ACCESS_CONTROL,
+    ENABLE_REALTIME_CHAT_SAVE,
 )
 from open_webui.constants import TASKS
 
@@ -560,7 +561,6 @@ def apply_params_to_form_data(form_data, model):
 
         if "frequency_penalty" in params:
             form_data["frequency_penalty"] = params["frequency_penalty"]
-
     return form_data
 
 
@@ -750,7 +750,7 @@ async def process_chat_response(
 ):
     async def background_tasks_handler():
         message_map = Chats.get_messages_by_chat_id(metadata["chat_id"])
-        message = message_map.get(metadata["message_id"])
+        message = message_map.get(metadata["message_id"]) if message_map else None
 
         if message:
             messages = get_message_list(message_map, message.get("id"))
@@ -896,7 +896,7 @@ async def process_chat_response(
                     )
 
                     # Send a webhook notification if the user is not active
-                    if get_user_id_from_session_pool(metadata["session_id"]) is None:
+                    if get_active_status_by_user_id(user.id) is None:
                         webhook_url = Users.get_user_webhook_url_by_id(user.id)
                         if webhook_url:
                             post_webhook(
@@ -928,6 +928,11 @@ async def process_chat_response(
 
         # Handle as a background task
         async def post_response_handler(response, events):
+            message = Chats.get_message_by_id_and_message_id(
+                metadata["chat_id"], metadata["message_id"]
+            )
+            content = message.get("content", "") if message else ""
+
             try:
                 for event in events:
                     await event_emitter(
@@ -946,9 +951,6 @@ async def process_chat_response(
                         },
                     )
 
-                assistant_message = get_last_assistant_message(form_data["messages"])
-                content = assistant_message if assistant_message else ""
-
                 async for line in response.body_iterator:
                     line = line.decode("utf-8") if isinstance(line, bytes) else line
                     data = line
@@ -977,7 +979,6 @@ async def process_chat_response(
                             )
 
                         else:
-
                             value = (
                                 data.get("choices", [])[0]
                                 .get("delta", {})
@@ -987,55 +988,85 @@ async def process_chat_response(
                             if value:
                                 content = f"{content}{value}"
 
-                                # Save message in the database
-                                Chats.upsert_message_to_chat_by_id_and_message_id(
-                                    metadata["chat_id"],
-                                    metadata["message_id"],
-                                    {
+                                if ENABLE_REALTIME_CHAT_SAVE:
+                                    # Save message in the database
+                                    Chats.upsert_message_to_chat_by_id_and_message_id(
+                                        metadata["chat_id"],
+                                        metadata["message_id"],
+                                        {
+                                            "content": content,
+                                        },
+                                    )
+                                else:
+                                    data = {
                                         "content": content,
-                                    },
-                                )
+                                    }
+
+                        await event_emitter(
+                            {
+                                "type": "chat:completion",
+                                "data": data,
+                            }
+                        )
 
                     except Exception as e:
                         done = "data: [DONE]" in line
-                        title = Chats.get_chat_title_by_id(metadata["chat_id"])
 
                         if done:
-                            data = {"done": True, "content": content, "title": title}
-
-                            # Send a webhook notification if the user is not active
-                            if (
-                                get_user_id_from_session_pool(metadata["session_id"])
-                                is None
-                            ):
-                                webhook_url = Users.get_user_webhook_url_by_id(user.id)
-                                if webhook_url:
-                                    post_webhook(
-                                        webhook_url,
-                                        f"{title} - {request.app.state.config.WEBUI_URL}/c/{metadata['chat_id']}\n\n{content}",
-                                        {
-                                            "action": "chat",
-                                            "message": content,
-                                            "title": title,
-                                            "url": f"{request.app.state.config.WEBUI_URL}/c/{metadata['chat_id']}",
-                                        },
-                                    )
-
+                            pass
                         else:
                             continue
 
-                    await event_emitter(
+                title = Chats.get_chat_title_by_id(metadata["chat_id"])
+                data = {"done": True, "content": content, "title": title}
+
+                if not ENABLE_REALTIME_CHAT_SAVE:
+                    # Save message in the database
+                    Chats.upsert_message_to_chat_by_id_and_message_id(
+                        metadata["chat_id"],
+                        metadata["message_id"],
                         {
-                            "type": "chat:completion",
-                            "data": data,
-                        }
+                            "content": content,
+                        },
                     )
 
+                # Send a webhook notification if the user is not active
+                if get_active_status_by_user_id(user.id) is None:
+                    webhook_url = Users.get_user_webhook_url_by_id(user.id)
+                    if webhook_url:
+                        post_webhook(
+                            webhook_url,
+                            f"{title} - {request.app.state.config.WEBUI_URL}/c/{metadata['chat_id']}\n\n{content}",
+                            {
+                                "action": "chat",
+                                "message": content,
+                                "title": title,
+                                "url": f"{request.app.state.config.WEBUI_URL}/c/{metadata['chat_id']}",
+                            },
+                        )
+
+                await event_emitter(
+                    {
+                        "type": "chat:completion",
+                        "data": data,
+                    }
+                )
+
                 await background_tasks_handler()
             except asyncio.CancelledError:
                 print("Task was cancelled!")
                 await event_emitter({"type": "task-cancelled"})
 
+                if not ENABLE_REALTIME_CHAT_SAVE:
+                    # Save message in the database
+                    Chats.upsert_message_to_chat_by_id_and_message_id(
+                        metadata["chat_id"],
+                        metadata["message_id"],
+                        {
+                            "content": content,
+                        },
+                    )
+
             if response.background is not None:
                 await response.background()
 

+ 4 - 0
backend/open_webui/utils/payload.py

@@ -160,6 +160,10 @@ def convert_payload_openai_to_ollama(openai_payload: dict) -> dict:
     # If there are advanced parameters in the payload, format them in Ollama's options field
     ollama_options = {}
 
+    if openai_payload.get("options"):
+        ollama_payload["options"] = openai_payload["options"]
+        ollama_options = openai_payload["options"]
+
     # Handle parameters which map directly
     for param in ["temperature", "top_p", "seed"]:
         if param in openai_payload:

+ 2 - 2
backend/open_webui/utils/response.py

@@ -29,7 +29,7 @@ async def convert_streaming_response_ollama_to_openai(ollama_streaming_response)
                         (
                             (
                                 data.get("eval_count", 0)
-                                / ((data.get("eval_duration", 0) / 1_000_000))
+                                / ((data.get("eval_duration", 0) / 10_000_000))
                             )
                             * 100
                         ),
@@ -43,7 +43,7 @@ async def convert_streaming_response_ollama_to_openai(ollama_streaming_response)
                         (
                             (
                                 data.get("prompt_eval_count", 0)
-                                / ((data.get("prompt_eval_duration", 0) / 1_000_000))
+                                / ((data.get("prompt_eval_duration", 0) / 10_000_000))
                             )
                             * 100
                         ),

+ 9 - 2
package-lock.json

@@ -1,12 +1,12 @@
 {
 	"name": "open-webui",
-	"version": "0.5.2",
+	"version": "0.5.3",
 	"lockfileVersion": 3,
 	"requires": true,
 	"packages": {
 		"": {
 			"name": "open-webui",
-			"version": "0.5.2",
+			"version": "0.5.3",
 			"dependencies": {
 				"@codemirror/lang-javascript": "^6.2.2",
 				"@codemirror/lang-python": "^6.1.6",
@@ -16,6 +16,7 @@
 				"@mediapipe/tasks-vision": "^0.10.17",
 				"@pyscript/core": "^0.4.32",
 				"@sveltejs/adapter-node": "^2.0.0",
+				"@sveltejs/svelte-virtual-list": "^3.0.1",
 				"@tiptap/core": "^2.10.0",
 				"@tiptap/extension-code-block-lowlight": "^2.10.0",
 				"@tiptap/extension-highlight": "^2.10.0",
@@ -2291,6 +2292,12 @@
 				"vite": "^5.0.3 || ^6.0.0"
 			}
 		},
+		"node_modules/@sveltejs/svelte-virtual-list": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/@sveltejs/svelte-virtual-list/-/svelte-virtual-list-3.0.1.tgz",
+			"integrity": "sha512-aF9TptS7NKKS7/TqpsxQBSDJ9Q0XBYzBehCeIC5DzdMEgrJZpIYao9LRLnyyo6SVodpapm2B7FE/Lj+FSA5/SQ==",
+			"license": "LIL"
+		},
 		"node_modules/@sveltejs/vite-plugin-svelte": {
 			"version": "3.1.1",
 			"resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.1.1.tgz",

+ 3 - 2
package.json

@@ -1,6 +1,6 @@
 {
 	"name": "open-webui",
-	"version": "0.5.2",
+	"version": "0.5.3",
 	"private": true,
 	"scripts": {
 		"dev": "npm run pyodide:fetch && vite dev --host",
@@ -50,7 +50,6 @@
 	"type": "module",
 	"dependencies": {
 		"@codemirror/lang-javascript": "^6.2.2",
-		"codemirror-lang-hcl": "^0.0.0-beta.2",
 		"@codemirror/lang-python": "^6.1.6",
 		"@codemirror/language-data": "^6.5.1",
 		"@codemirror/theme-one-dark": "^6.1.2",
@@ -58,6 +57,7 @@
 		"@mediapipe/tasks-vision": "^0.10.17",
 		"@pyscript/core": "^0.4.32",
 		"@sveltejs/adapter-node": "^2.0.0",
+		"@sveltejs/svelte-virtual-list": "^3.0.1",
 		"@tiptap/core": "^2.10.0",
 		"@tiptap/extension-code-block-lowlight": "^2.10.0",
 		"@tiptap/extension-highlight": "^2.10.0",
@@ -69,6 +69,7 @@
 		"async": "^3.2.5",
 		"bits-ui": "^0.19.7",
 		"codemirror": "^6.0.1",
+		"codemirror-lang-hcl": "^0.0.0-beta.2",
 		"crc-32": "^1.2.2",
 		"dayjs": "^1.11.10",
 		"dompurify": "^3.1.6",

+ 122 - 0
src/lib/apis/channels/index.ts

@@ -1,4 +1,5 @@
 import { WEBUI_API_BASE_URL } from '$lib/constants';
+import { t } from 'i18next';
 
 type ChannelForm = {
 	name: string;
@@ -207,7 +208,48 @@ export const getChannelMessages = async (
 	return res;
 };
 
+export const getChannelThreadMessages = async (
+	token: string = '',
+	channel_id: string,
+	message_id: string,
+	skip: number = 0,
+	limit: number = 50
+) => {
+	let error = null;
+
+	const res = await fetch(
+		`${WEBUI_API_BASE_URL}/channels/${channel_id}/messages/${message_id}/thread?skip=${skip}&limit=${limit}`,
+		{
+			method: 'GET',
+			headers: {
+				Accept: 'application/json',
+				'Content-Type': 'application/json',
+				authorization: `Bearer ${token}`
+			}
+		}
+	)
+		.then(async (res) => {
+			if (!res.ok) throw await res.json();
+			return res.json();
+		})
+		.then((json) => {
+			return json;
+		})
+		.catch((err) => {
+			error = err.detail;
+			console.log(err);
+			return null;
+		});
+
+	if (error) {
+		throw error;
+	}
+
+	return res;
+};
+
 type MessageForm = {
+	parent_id?: string;
 	content: string;
 	data?: object;
 	meta?: object;
@@ -285,6 +327,86 @@ export const updateMessage = async (
 	return res;
 };
 
+export const addReaction = async (
+	token: string = '',
+	channel_id: string,
+	message_id: string,
+	name: string
+) => {
+	let error = null;
+
+	const res = await fetch(
+		`${WEBUI_API_BASE_URL}/channels/${channel_id}/messages/${message_id}/reactions/add`,
+		{
+			method: 'POST',
+			headers: {
+				Accept: 'application/json',
+				'Content-Type': 'application/json',
+				authorization: `Bearer ${token}`
+			},
+			body: JSON.stringify({ name })
+		}
+	)
+		.then(async (res) => {
+			if (!res.ok) throw await res.json();
+			return res.json();
+		})
+		.then((json) => {
+			return json;
+		})
+		.catch((err) => {
+			error = err.detail;
+			console.log(err);
+			return null;
+		});
+
+	if (error) {
+		throw error;
+	}
+
+	return res;
+};
+
+export const removeReaction = async (
+	token: string = '',
+	channel_id: string,
+	message_id: string,
+	name: string
+) => {
+	let error = null;
+
+	const res = await fetch(
+		`${WEBUI_API_BASE_URL}/channels/${channel_id}/messages/${message_id}/reactions/remove`,
+		{
+			method: 'POST',
+			headers: {
+				Accept: 'application/json',
+				'Content-Type': 'application/json',
+				authorization: `Bearer ${token}`
+			},
+			body: JSON.stringify({ name })
+		}
+	)
+		.then(async (res) => {
+			if (!res.ok) throw await res.json();
+			return res.json();
+		})
+		.then((json) => {
+			return json;
+		})
+		.catch((err) => {
+			error = err.detail;
+			console.log(err);
+			return null;
+		});
+
+	if (error) {
+		throw error;
+	}
+
+	return res;
+};
+
 export const deleteMessage = async (token: string = '', channel_id: string, message_id: string) => {
 	let error = null;
 

+ 145 - 48
src/lib/components/channel/Channel.svelte

@@ -1,14 +1,19 @@
 <script lang="ts">
 	import { toast } from 'svelte-sonner';
+	import { Pane, PaneGroup, PaneResizer } from 'paneforge';
+
 	import { onDestroy, onMount, tick } from 'svelte';
+	import { goto } from '$app/navigation';
 
 	import { chatId, showSidebar, socket, user } from '$lib/stores';
 	import { getChannelById, getChannelMessages, sendMessage } from '$lib/apis/channels';
 
 	import Messages from './Messages.svelte';
 	import MessageInput from './MessageInput.svelte';
-	import { goto } from '$app/navigation';
 	import Navbar from './Navbar.svelte';
+	import Drawer from '../common/Drawer.svelte';
+	import EllipsisVertical from '../icons/EllipsisVertical.svelte';
+	import Thread from './Thread.svelte';
 
 	export let id = '';
 
@@ -20,6 +25,8 @@
 	let channel = null;
 	let messages = null;
 
+	let threadId = null;
+
 	let typingUsers = [];
 	let typingUsersTimeout = {};
 
@@ -28,13 +35,19 @@
 	}
 
 	const scrollToBottom = () => {
-		messagesContainerElement.scrollTop = messagesContainerElement.scrollHeight;
+		if (messagesContainerElement) {
+			messagesContainerElement.scrollTop = messagesContainerElement.scrollHeight;
+		}
 	};
 
 	const initHandler = async () => {
 		top = false;
 		messages = null;
 		channel = null;
+		threadId = null;
+
+		typingUsers = [];
+		typingUsersTimeout = {};
 
 		channel = await getChannelById(localStorage.token, id).catch((error) => {
 			return null;
@@ -44,7 +57,7 @@
 			messages = await getChannelMessages(localStorage.token, id, 0);
 
 			if (messages) {
-				messagesContainerElement.scrollTop = messagesContainerElement.scrollHeight;
+				scrollToBottom();
 
 				if (messages.length < 50) {
 					top = true;
@@ -56,35 +69,43 @@
 	};
 
 	const channelEventHandler = async (event) => {
-		console.log(event);
-
 		if (event.channel_id === id) {
 			const type = event?.data?.type ?? null;
 			const data = event?.data?.data ?? null;
 
 			if (type === 'message') {
-				console.log('message', data);
-				messages = [data, ...messages];
+				if ((data?.parent_id ?? null) === null) {
+					messages = [data, ...messages];
 
-				if (typingUsers.find((user) => user.id === event.user.id)) {
-					typingUsers = typingUsers.filter((user) => user.id !== event.user.id);
-				}
+					if (typingUsers.find((user) => user.id === event.user.id)) {
+						typingUsers = typingUsers.filter((user) => user.id !== event.user.id);
+					}
 
-				await tick();
-				if (scrollEnd) {
-					messagesContainerElement.scrollTop = messagesContainerElement.scrollHeight;
+					await tick();
+					if (scrollEnd) {
+						scrollToBottom();
+					}
 				}
 			} else if (type === 'message:update') {
-				console.log('message:update', data);
 				const idx = messages.findIndex((message) => message.id === data.id);
 
 				if (idx !== -1) {
 					messages[idx] = data;
 				}
 			} else if (type === 'message:delete') {
-				console.log('message:delete', data);
 				messages = messages.filter((message) => message.id !== data.id);
-			} else if (type === 'typing') {
+			} else if (type === 'message:reply') {
+				const idx = messages.findIndex((message) => message.id === data.id);
+
+				if (idx !== -1) {
+					messages[idx] = data;
+				}
+			} else if (type.includes('message:reaction')) {
+				const idx = messages.findIndex((message) => message.id === data.id);
+				if (idx !== -1) {
+					messages[idx] = data;
+				}
+			} else if (type === 'typing' && event.message_id === null) {
 				if (event.user.id === $user.id) {
 					return;
 				}
@@ -134,6 +155,7 @@
 	const onChange = async () => {
 		$socket?.emit('channel-events', {
 			channel_id: id,
+			message_id: null,
 			data: {
 				type: 'typing',
 				data: {
@@ -143,16 +165,32 @@
 		});
 	};
 
+	let mediaQuery;
+	let largeScreen = false;
+
 	onMount(() => {
 		if ($chatId) {
 			chatId.set('');
 		}
 
 		$socket?.on('channel-events', channelEventHandler);
+
+		mediaQuery = window.matchMedia('(min-width: 1024px)');
+
+		const handleMediaQuery = async (e) => {
+			if (e.matches) {
+				largeScreen = true;
+			} else {
+				largeScreen = false;
+			}
+		};
+
+		mediaQuery.addEventListener('change', handleMediaQuery);
+		handleMediaQuery(mediaQuery);
 	});
 
 	onDestroy(() => {
-		// $socket?.off('channel-events', channelEventHandler);
+		$socket?.off('channel-events', channelEventHandler);
 	});
 </script>
 
@@ -166,40 +204,99 @@
 		: ''} w-full max-w-full flex flex-col"
 	id="channel-container"
 >
-	<Navbar {channel} />
-
-	<div class="flex-1 overflow-y-auto">
-		{#if channel}
-			<div
-				class=" pb-2.5 max-w-full z-10 scrollbar-hidden w-full h-full pt-6 flex-1 flex flex-col-reverse overflow-auto"
-				id="messages-container"
-				bind:this={messagesContainerElement}
-				on:scroll={(e) => {
-					scrollEnd = Math.abs(messagesContainerElement.scrollTop) <= 50;
-				}}
+	<PaneGroup direction="horizontal" class="w-full h-full">
+		<Pane defaultSize={50} minSize={50} class="h-full flex flex-col w-full relative">
+			<Navbar {channel} />
+
+			<div class="flex-1 overflow-y-auto">
+				{#if channel}
+					<div
+						class=" pb-2.5 max-w-full z-10 scrollbar-hidden w-full h-full pt-6 flex-1 flex flex-col-reverse overflow-auto"
+						id="messages-container"
+						bind:this={messagesContainerElement}
+						on:scroll={(e) => {
+							scrollEnd = Math.abs(messagesContainerElement.scrollTop) <= 50;
+						}}
+					>
+						{#key id}
+							<Messages
+								{channel}
+								{messages}
+								{top}
+								onThread={(id) => {
+									threadId = id;
+								}}
+								onLoad={async () => {
+									const newMessages = await getChannelMessages(
+										localStorage.token,
+										id,
+										messages.length
+									);
+
+									messages = [...messages, ...newMessages];
+
+									if (newMessages.length < 50) {
+										top = true;
+										return;
+									}
+								}}
+							/>
+						{/key}
+					</div>
+				{/if}
+			</div>
+
+			<div class=" pb-[1rem]">
+				<MessageInput
+					id="root"
+					{typingUsers}
+					{onChange}
+					onSubmit={submitHandler}
+					{scrollToBottom}
+					{scrollEnd}
+				/>
+			</div>
+		</Pane>
+
+		{#if !largeScreen}
+			{#if threadId !== null}
+				<Drawer
+					show={threadId !== null}
+					on:close={() => {
+						threadId = null;
+					}}
+				>
+					<div class=" {threadId !== null ? ' h-screen  w-screen' : 'px-6 py-4'} h-full">
+						<Thread
+							{threadId}
+							{channel}
+							onClose={() => {
+								threadId = null;
+							}}
+						/>
+					</div>
+				</Drawer>
+			{/if}
+		{:else if threadId !== null}
+			<PaneResizer
+				class="relative flex w-[3px] items-center justify-center bg-background group bg-gray-50 dark:bg-gray-850"
 			>
-				{#key id}
-					<Messages
+				<div class="z-10 flex h-7 w-5 items-center justify-center rounded-sm">
+					<EllipsisVertical className="size-4 invisible group-hover:visible" />
+				</div>
+			</PaneResizer>
+
+			<Pane defaultSize={50} minSize={30} class="h-full w-full">
+				<div class="h-full w-full shadow-xl">
+					<Thread
+						{threadId}
 						{channel}
-						{messages}
-						{top}
-						onLoad={async () => {
-							const newMessages = await getChannelMessages(localStorage.token, id, messages.length);
-
-							messages = [...messages, ...newMessages];
-
-							if (newMessages.length < 50) {
-								top = true;
-								return;
-							}
+						onClose={() => {
+							threadId = null;
 						}}
 					/>
-				{/key}
-			</div>
+				</div>
+			</Pane>
 		{/if}
-	</div>
-
-	<div class=" pb-[1rem]">
-		<MessageInput {typingUsers} {onChange} onSubmit={submitHandler} {scrollToBottom} {scrollEnd} />
-	</div>
+	</PaneGroup>
 </div>

+ 29 - 72
src/lib/components/channel/MessageInput.svelte

@@ -23,6 +23,8 @@
 	export let placeholder = $i18n.t('Send a Message');
 	export let transparentBackground = false;
 
+	export let id = null;
+
 	let draggedOver = false;
 
 	let recording = false;
@@ -37,7 +39,7 @@
 	export let onSubmit: Function;
 	export let onChange: Function;
 	export let scrollEnd = true;
-	export let scrollToBottom: Function;
+	export let scrollToBottom: Function = () => {};
 
 	const screenCaptureHandler = async () => {
 		try {
@@ -257,7 +259,7 @@
 
 		await tick();
 
-		const chatInputElement = document.getElementById('chat-input');
+		const chatInputElement = document.getElementById(`chat-input-${id}`);
 		chatInputElement?.focus();
 	};
 
@@ -267,7 +269,7 @@
 
 	onMount(async () => {
 		window.setTimeout(() => {
-			const chatInput = document.getElementById('chat-input');
+			const chatInput = document.getElementById(`chat-input-${id}`);
 			chatInput?.focus();
 		}, 0);
 
@@ -313,7 +315,7 @@
 		filesInputElement.value = '';
 	}}
 />
-<div class="{transparentBackground ? 'bg-transparent' : 'bg-white dark:bg-gray-900'} ">
+<div class="bg-transparent">
 	<div
 		class="{($settings?.widescreenMode ?? null)
 			? 'max-w-full'
@@ -351,10 +353,10 @@
 				</div>
 
 				<div class="relative">
-					<div class=" -mt-5 bg-gradient-to-t from-white dark:from-gray-900">
+					<div class=" -mt-5">
 						{#if typingUsers.length > 0}
 							<div class=" text-xs px-4 mb-1">
-								<span class=" font-medium text-black dark:text-white">
+								<span class=" font-normal text-black dark:text-white">
 									{typingUsers.map((user) => user.name).join(', ')}
 								</span>
 								{$i18n.t('is typing...')}
@@ -373,7 +375,7 @@
 						recording = false;
 
 						await tick();
-						document.getElementById('chat-input')?.focus();
+						document.getElementById(`chat-input-${id}`)?.focus();
 					}}
 					on:confirm={async (e) => {
 						const { text, filename } = e.detail;
@@ -381,7 +383,7 @@
 						recording = false;
 
 						await tick();
-						document.getElementById('chat-input')?.focus();
+						document.getElementById(`chat-input-${id}`)?.focus();
 					}}
 				/>
 			{:else}
@@ -392,7 +394,7 @@
 					}}
 				>
 					<div
-						class="flex-1 flex flex-col relative w-full rounded-3xl px-1 bg-gray-50 dark:bg-gray-400/5 dark:text-gray-100"
+						class="flex-1 flex flex-col relative w-full rounded-3xl px-1 bg-gray-600/5 dark:bg-gray-400/5 dark:text-gray-100"
 						dir={$settings?.chatDirection ?? 'LTR'}
 					>
 						{#if files.length > 0}
@@ -478,61 +480,21 @@
 								</InputMenu>
 							</div>
 
-							{#if $settings?.richTextInput ?? true}
-								<div
-									class="scrollbar-hidden text-left bg-transparent dark:text-gray-100 outline-none w-full py-2.5 px-1 rounded-xl resize-none h-fit max-h-80 overflow-auto"
-								>
-									<RichTextInput
-										bind:value={content}
-										id="chat-input"
-										messageInput={true}
-										shiftEnter={!$mobile ||
-											!(
-												'ontouchstart' in window ||
-												navigator.maxTouchPoints > 0 ||
-												navigator.msMaxTouchPoints > 0
-											)}
-										{placeholder}
-										largeTextAsFile={$settings?.largeTextAsFile ?? false}
-										on:keydown={async (e) => {
-											e = e.detail.event;
-											const isCtrlPressed = e.ctrlKey || e.metaKey; // metaKey is for Cmd key on Mac
-											if (
-												!$mobile ||
-												!(
-													'ontouchstart' in window ||
-													navigator.maxTouchPoints > 0 ||
-													navigator.msMaxTouchPoints > 0
-												)
-											) {
-												// Prevent Enter key from creating a new line
-												// Uses keyCode '13' for Enter key for chinese/japanese keyboards
-												if (e.keyCode === 13 && !e.shiftKey) {
-													e.preventDefault();
-												}
-
-												// Submit the content when Enter key is pressed
-												if (content !== '' && e.keyCode === 13 && !e.shiftKey) {
-													submitHandler();
-												}
-											}
-
-											if (e.key === 'Escape') {
-												console.log('Escape');
-											}
-										}}
-										on:paste={async (e) => {
-											e = e.detail.event;
-											console.log(e);
-										}}
-									/>
-								</div>
-							{:else}
-								<textarea
-									id="chat-input"
-									class="scrollbar-hidden bg-transparent dark:text-gray-100 outline-none w-full py-3 px-1 rounded-xl resize-none h-[48px]"
-									{placeholder}
+							<div
+								class="scrollbar-hidden text-left bg-transparent dark:text-gray-100 outline-none w-full py-2.5 px-1 rounded-xl resize-none h-fit max-h-80 overflow-auto"
+							>
+								<RichTextInput
 									bind:value={content}
+									id={`chat-input-${id}`}
+									messageInput={true}
+									shiftEnter={!$mobile ||
+										!(
+											'ontouchstart' in window ||
+											navigator.maxTouchPoints > 0 ||
+											navigator.msMaxTouchPoints > 0
+										)}
+									{placeholder}
+									largeTextAsFile={$settings?.largeTextAsFile ?? false}
 									on:keydown={async (e) => {
 										e = e.detail.event;
 										const isCtrlPressed = e.ctrlKey || e.metaKey; // metaKey is for Cmd key on Mac
@@ -560,17 +522,12 @@
 											console.log('Escape');
 										}
 									}}
-									rows="1"
-									on:input={async (e) => {
-										e.target.style.height = '';
-										e.target.style.height = Math.min(e.target.scrollHeight, 320) + 'px';
-									}}
-									on:focus={async (e) => {
-										e.target.style.height = '';
-										e.target.style.height = Math.min(e.target.scrollHeight, 320) + 'px';
+									on:paste={async (e) => {
+										e = e.detail.event;
+										console.log(e);
 									}}
 								/>
-							{/if}
+							</div>
 
 							<div class="self-end mb-1.5 flex space-x-1 mr-1">
 								{#if content === ''}

+ 82 - 5
src/lib/components/channel/Messages.svelte

@@ -11,20 +11,23 @@
 	dayjs.extend(isYesterday);
 	import { tick, getContext, onMount, createEventDispatcher } from 'svelte';
 
-	import { settings } from '$lib/stores';
+	import { settings, user } from '$lib/stores';
 
 	import Message from './Messages/Message.svelte';
 	import Loader from '../common/Loader.svelte';
 	import Spinner from '../common/Spinner.svelte';
-	import { deleteMessage, updateMessage } from '$lib/apis/channels';
+	import { addReaction, deleteMessage, removeReaction, updateMessage } from '$lib/apis/channels';
 
 	const i18n = getContext('i18n');
 
+	export let id = null;
 	export let channel = null;
 	export let messages = [];
 	export let top = false;
+	export let thread = false;
 
 	export let onLoad: Function = () => {};
+	export let onThread: Function = () => {};
 
 	let messagesLoading = false;
 
@@ -59,14 +62,14 @@
 					<div class=" ">Loading...</div>
 				</div>
 			</Loader>
-		{:else}
+		{:else if !thread}
 			<div
 				class="px-5
 			
 			{($settings?.widescreenMode ?? null) ? 'max-w-full' : 'max-w-5xl'} mx-auto"
 			>
 				{#if channel}
-					<div class="flex flex-col gap-1.5 py-5">
+					<div class="flex flex-col gap-1.5 pb-5 pt-10">
 						<div class="text-2xl font-medium capitalize">{channel.name}</div>
 
 						<div class=" text-gray-500">
@@ -88,12 +91,15 @@
 			</div>
 		{/if}
 
-		{#each messageList as message, messageIdx (message.id)}
+		{#each messageList as message, messageIdx (id ? `${id}-${message.id}` : message.id)}
 			<Message
 				{message}
+				{thread}
 				showUserProfile={messageIdx === 0 ||
 					messageList.at(messageIdx - 1)?.user_id !== message.user_id}
 				onDelete={() => {
+					messages = messages.filter((m) => m.id !== message.id);
+
 					const res = deleteMessage(localStorage.token, message.channel_id, message.id).catch(
 						(error) => {
 							toast.error(error);
@@ -102,6 +108,13 @@
 					);
 				}}
 				onEdit={(content) => {
+					messages = messages.map((m) => {
+						if (m.id === message.id) {
+							m.content = content;
+						}
+						return m;
+					});
+
 					const res = updateMessage(localStorage.token, message.channel_id, message.id, {
 						content: content
 					}).catch((error) => {
@@ -109,6 +122,70 @@
 						return null;
 					});
 				}}
+				onThread={(id) => {
+					onThread(id);
+				}}
+				onReaction={(name) => {
+					if (
+						(message?.reactions ?? [])
+							.find((reaction) => reaction.name === name)
+							?.user_ids?.includes($user.id) ??
+						false
+					) {
+						messages = messages.map((m) => {
+							if (m.id === message.id) {
+								const reaction = m.reactions.find((reaction) => reaction.name === name);
+
+								if (reaction) {
+									reaction.user_ids = reaction.user_ids.filter((id) => id !== $user.id);
+									reaction.count = reaction.user_ids.length;
+
+									if (reaction.count === 0) {
+										m.reactions = m.reactions.filter((r) => r.name !== name);
+									}
+								}
+							}
+							return m;
+						});
+
+						const res = removeReaction(
+							localStorage.token,
+							message.channel_id,
+							message.id,
+							name
+						).catch((error) => {
+							toast.error(error);
+							return null;
+						});
+					} else {
+						messages = messages.map((m) => {
+							if (m.id === message.id) {
+								if (m.reactions) {
+									const reaction = m.reactions.find((reaction) => reaction.name === name);
+
+									if (reaction) {
+										reaction.user_ids.push($user.id);
+										reaction.count = reaction.user_ids.length;
+									} else {
+										m.reactions.push({
+											name: name,
+											user_ids: [$user.id],
+											count: 1
+										});
+									}
+								}
+							}
+							return m;
+						});
+
+						const res = addReaction(localStorage.token, message.channel_id, message.id, name).catch(
+							(error) => {
+								toast.error(error);
+								return null;
+							}
+						);
+					}
+				}}
 			/>
 		{/each}
 

+ 146 - 18
src/lib/components/channel/Messages/Message.svelte

@@ -8,10 +8,10 @@
 	dayjs.extend(isToday);
 	dayjs.extend(isYesterday);
 
-	import { getContext } from 'svelte';
+	import { getContext, onMount } from 'svelte';
 	const i18n = getContext<Writable<i18nType>>('i18n');
 
-	import { settings, user } from '$lib/stores';
+	import { settings, user, shortCodesToEmojis } from '$lib/stores';
 
 	import { WEBUI_BASE_URL } from '$lib/constants';
 
@@ -26,12 +26,21 @@
 	import Image from '$lib/components/common/Image.svelte';
 	import FileItem from '$lib/components/common/FileItem.svelte';
 	import ProfilePreview from './Message/ProfilePreview.svelte';
+	import ChatBubbleOvalEllipsis from '$lib/components/icons/ChatBubbleOvalEllipsis.svelte';
+	import FaceSmile from '$lib/components/icons/FaceSmile.svelte';
+	import ReactionPicker from './Message/ReactionPicker.svelte';
+	import ChevronRight from '$lib/components/icons/ChevronRight.svelte';
 
 	export let message;
 	export let showUserProfile = true;
+	export let thread = false;
 
 	export let onDelete: Function = () => {};
 	export let onEdit: Function = () => {};
+	export let onThread: Function = () => {};
+	export let onReaction: Function = () => {};
+
+	let showButtons = false;
 
 	let edit = false;
 	let editedContent = null;
@@ -66,29 +75,69 @@
 			? 'pt-1.5 pb-0.5'
 			: ''} w-full {($settings?.widescreenMode ?? null)
 			? 'max-w-full'
-			: 'max-w-5xl'} mx-auto group hover:bg-gray-500/5 transition relative"
+			: 'max-w-5xl'} mx-auto group hover:bg-gray-300/5 dark:hover:bg-gray-700/5 transition relative"
 	>
-		{#if (message.user_id === $user.id || $user.role === 'admin') && !edit}
-			<div class=" absolute invisible group-hover:visible right-1 -top-2 z-30">
+		{#if !edit}
+			<div
+				class=" absolute {showButtons ? '' : 'invisible group-hover:visible'} right-1 -top-2 z-10"
+			>
 				<div
 					class="flex gap-1 rounded-lg bg-white dark:bg-gray-850 shadow-md p-0.5 border border-gray-100 dark:border-gray-800"
 				>
-					<button
-						class="hover:bg-gray-100 dark:hover:bg-gray-800 transition rounded-lg p-1"
-						on:click={() => {
-							edit = true;
-							editedContent = message.content;
+					<ReactionPicker
+						onClose={() => (showButtons = false)}
+						onSubmit={(name) => {
+							showButtons = false;
+							onReaction(name);
 						}}
 					>
-						<Pencil />
-					</button>
+						<Tooltip content={$i18n.t('Add Reaction')}>
+							<button
+								class="hover:bg-gray-100 dark:hover:bg-gray-800 transition rounded-lg p-1"
+								on:click={() => {
+									showButtons = true;
+								}}
+							>
+								<FaceSmile />
+							</button>
+						</Tooltip>
+					</ReactionPicker>
 
-					<button
-						class="hover:bg-gray-100 dark:hover:bg-gray-800 transition rounded-lg p-1"
-						on:click={() => (showDeleteConfirmDialog = true)}
-					>
-						<GarbageBin />
-					</button>
+					{#if !thread}
+						<Tooltip content={$i18n.t('Reply in Thread')}>
+							<button
+								class="hover:bg-gray-100 dark:hover:bg-gray-800 transition rounded-lg p-1"
+								on:click={() => {
+									onThread(message.id);
+								}}
+							>
+								<ChatBubbleOvalEllipsis />
+							</button>
+						</Tooltip>
+					{/if}
+
+					{#if message.user_id === $user.id || $user.role === 'admin'}
+						<Tooltip content={$i18n.t('Edit')}>
+							<button
+								class="hover:bg-gray-100 dark:hover:bg-gray-800 transition rounded-lg p-1"
+								on:click={() => {
+									edit = true;
+									editedContent = message.content;
+								}}
+							>
+								<Pencil />
+							</button>
+						</Tooltip>
+
+						<Tooltip content={$i18n.t('Delete')}>
+							<button
+								class="hover:bg-gray-100 dark:hover:bg-gray-800 transition rounded-lg p-1"
+								on:click={() => (showDeleteConfirmDialog = true)}
+							>
+								<GarbageBin />
+							</button>
+						</Tooltip>
+					{/if}
 				</div>
 			</div>
 		{/if}
@@ -222,6 +271,85 @@
 								>(edited)</span
 							>{/if}
 					</div>
+
+					{#if (message?.reactions ?? []).length > 0}
+						<div>
+							<div class="flex items-center flex-wrap gap-y-1.5 gap-1 mt-1 mb-2">
+								{#each message.reactions as reaction}
+									<Tooltip content={`:${reaction.name}:`}>
+										<button
+											class="flex items-center gap-1.5 transition rounded-xl px-2 py-1 cursor-pointer {reaction.user_ids.includes(
+												$user.id
+											)
+												? ' bg-blue-300/10 outline outline-blue-500/50 outline-1'
+												: 'bg-gray-300/10 dark:bg-gray-500/10 hover:outline hover:outline-gray-700/30 dark:hover:outline-gray-300/30 hover:outline-1'}"
+											on:click={() => {
+												onReaction(reaction.name);
+											}}
+										>
+											{#if $shortCodesToEmojis[reaction.name]}
+												<img
+													src="/assets/emojis/{$shortCodesToEmojis[
+														reaction.name
+													].toLowerCase()}.svg"
+													alt={reaction.name}
+													class=" size-4"
+													loading="lazy"
+												/>
+											{:else}
+												<div>
+													{reaction.name}
+												</div>
+											{/if}
+
+											{#if reaction.user_ids.length > 0}
+												<div class="text-xs font-medium text-gray-500 dark:text-gray-400">
+													{reaction.user_ids?.length}
+												</div>
+											{/if}
+										</button>
+									</Tooltip>
+								{/each}
+
+								<ReactionPicker
+									onSubmit={(name) => {
+										onReaction(name);
+									}}
+								>
+									<Tooltip content={$i18n.t('Add Reaction')}>
+										<div
+											class="flex items-center gap-1.5 bg-gray-500/10 hover:outline hover:outline-gray-700/30 dark:hover:outline-gray-300/30 hover:outline-1 transition rounded-xl px-1 py-1 cursor-pointer text-gray-500 dark:text-gray-400"
+										>
+											<FaceSmile />
+										</div>
+									</Tooltip>
+								</ReactionPicker>
+							</div>
+						</div>
+					{/if}
+
+					{#if !thread && message.reply_count > 0}
+						<div class="flex items-center gap-1.5 -mt-0.5 mb-1.5">
+							<button
+								class="flex items-center text-xs py-1 text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300 transition"
+								on:click={() => {
+									onThread(message.id);
+								}}
+							>
+								<span class="font-medium mr-1">
+									{$i18n.t('{{COUNT}} Replies', { COUNT: message.reply_count })}</span
+								><span>
+									{' - '}{$i18n.t('Last reply')}
+									{dayjs.unix(message.latest_reply_at / 1000000000).fromNow()}</span
+								>
+
+								<span class="ml-1">
+									<ChevronRight className="size-2.5" strokeWidth="3" />
+								</span>
+								<!-- {$i18n.t('View Replies')} -->
+							</button>
+						</div>
+					{/if}
 				{/if}
 			</div>
 		</div>

+ 1 - 1
src/lib/components/channel/Messages/Message/ProfilePreview.svelte

@@ -29,7 +29,7 @@
 
 	<slot name="content">
 		<DropdownMenu.Content
-			class="w-full max-w-[200px] rounded-lg z-50 bg-white dark:bg-black dark:text-white shadow-lg"
+			class="max-w-full w-[240px] rounded-lg z-[9999] bg-white dark:bg-black dark:text-white shadow-lg"
 			sideOffset={8}
 			{side}
 			{align}

+ 166 - 0
src/lib/components/channel/Messages/Message/ReactionPicker.svelte

@@ -0,0 +1,166 @@
+<script lang="ts">
+	import { DropdownMenu } from 'bits-ui';
+	import { flyAndScale } from '$lib/utils/transitions';
+	import emojiGroups from '$lib/emoji-groups.json';
+	import emojiShortCodes from '$lib/emoji-shortcodes.json';
+	import Tooltip from '$lib/components/common/Tooltip.svelte';
+	import VirtualList from '@sveltejs/svelte-virtual-list';
+
+	export let onClose = () => {};
+	export let onSubmit = (name) => {};
+	export let side = 'top';
+	export let align = 'start';
+	export let user = null;
+
+	let show = false;
+	let emojis = emojiShortCodes;
+	let search = '';
+	let flattenedEmojis = [];
+	let emojiRows = [];
+
+	// Reactive statement to filter the emojis based on search query
+	$: {
+		if (search) {
+			emojis = Object.keys(emojiShortCodes).reduce((acc, key) => {
+				if (key.includes(search)) {
+					acc[key] = emojiShortCodes[key];
+				} else {
+					if (Array.isArray(emojiShortCodes[key])) {
+						const filtered = emojiShortCodes[key].filter((emoji) => emoji.includes(search));
+						if (filtered.length) {
+							acc[key] = filtered;
+						}
+					} else {
+						if (emojiShortCodes[key].includes(search)) {
+							acc[key] = emojiShortCodes[key];
+						}
+					}
+				}
+				return acc;
+			}, {});
+		} else {
+			emojis = emojiShortCodes;
+		}
+	}
+	// Flatten emoji groups and group them into rows of 8 for virtual scrolling
+	$: {
+		flattenedEmojis = [];
+		Object.keys(emojiGroups).forEach((group) => {
+			const groupEmojis = emojiGroups[group].filter((emoji) => emojis[emoji]);
+			if (groupEmojis.length > 0) {
+				flattenedEmojis.push({ type: 'group', label: group });
+				flattenedEmojis.push(
+					...groupEmojis.map((emoji) => ({
+						type: 'emoji',
+						name: emoji,
+						shortCodes:
+							typeof emojiShortCodes[emoji] === 'string'
+								? [emojiShortCodes[emoji]]
+								: emojiShortCodes[emoji]
+					}))
+				);
+			}
+		});
+		// Group emojis into rows of 6
+		emojiRows = [];
+		let currentRow = [];
+		flattenedEmojis.forEach((item) => {
+			if (item.type === 'emoji') {
+				currentRow.push(item);
+				if (currentRow.length === 7) {
+					emojiRows.push(currentRow);
+					currentRow = [];
+				}
+			} else if (item.type === 'group') {
+				if (currentRow.length > 0) {
+					emojiRows.push(currentRow); // Push the remaining row
+					currentRow = [];
+				}
+				emojiRows.push([item]); // Add the group label as a separate row
+			}
+		});
+		if (currentRow.length > 0) {
+			emojiRows.push(currentRow); // Push the final row
+		}
+	}
+	const ROW_HEIGHT = 48; // Approximate height for a row with multiple emojis
+	// Handle emoji selection
+	function selectEmoji(emoji) {
+		const selectedCode = emoji.shortCodes[0];
+		onSubmit(selectedCode);
+		show = false;
+	}
+</script>
+
+<DropdownMenu.Root
+	bind:open={show}
+	closeFocus={false}
+	onOpenChange={(state) => {
+		if (!state) {
+			search = '';
+			onClose();
+		}
+	}}
+	typeahead={false}
+>
+	<DropdownMenu.Trigger>
+		<slot />
+	</DropdownMenu.Trigger>
+	<DropdownMenu.Content
+		class="max-w-full w-80 bg-gray-50 dark:bg-gray-850 rounded-lg z-[9999] shadow-lg dark:text-white"
+		sideOffset={8}
+		{side}
+		{align}
+		transition={flyAndScale}
+	>
+		<div class="mb-1 px-3 pt-2 pb-2">
+			<input
+				type="text"
+				class="w-full text-sm bg-transparent outline-none"
+				placeholder="Search all emojis"
+				bind:value={search}
+			/>
+		</div>
+		<!-- Virtualized Emoji List -->
+		<div class="w-full flex justify-start h-96 overflow-y-auto px-3 pb-3 text-sm">
+			{#if emojiRows.length === 0}
+				<div class="text-center text-xs text-gray-500 dark:text-gray-400">No results</div>
+			{:else}
+				<div class="w-full flex ml-2">
+					<VirtualList rowHeight={ROW_HEIGHT} items={emojiRows} height={384} let:item>
+						<div class="w-full">
+							{#if item.length === 1 && item[0].type === 'group'}
+								<!-- Render group header -->
+								<div class="text-xs font-medium mb-2 text-gray-500 dark:text-gray-400">
+									{item[0].label}
+								</div>
+							{:else}
+								<!-- Render emojis in a row -->
+								<div class="flex items-center gap-2 w-full">
+									{#each item as emojiItem}
+										<Tooltip
+											content={emojiItem.shortCodes.map((code) => `:${code}:`).join(', ')}
+											placement="top"
+										>
+											<button
+												class="p-1.5 rounded-lg cursor-pointer hover:bg-gray-200 dark:hover:bg-gray-700 transition"
+												on:click={() => selectEmoji(emojiItem)}
+											>
+												<img
+													src="/assets/emojis/{emojiItem.name.toLowerCase()}.svg"
+													alt={emojiItem.name}
+													class="size-5"
+													loading="lazy"
+												/>
+											</button>
+										</Tooltip>
+									{/each}
+								</div>
+							{/if}
+						</div>
+					</VirtualList>
+				</div>
+			{/if}
+		</div>
+	</DropdownMenu.Content>
+</DropdownMenu.Root>

+ 204 - 0
src/lib/components/channel/Thread.svelte

@@ -0,0 +1,204 @@
+<script lang="ts">
+	import { goto } from '$app/navigation';
+
+	import { socket, user } from '$lib/stores';
+
+	import { getChannelThreadMessages, sendMessage } from '$lib/apis/channels';
+
+	import XMark from '$lib/components/icons/XMark.svelte';
+	import MessageInput from './MessageInput.svelte';
+	import Messages from './Messages.svelte';
+	import { onDestroy, onMount, tick } from 'svelte';
+	import { toast } from 'svelte-sonner';
+
+	export let threadId = null;
+	export let channel = null;
+
+	export let onClose = () => {};
+
+	let messages = null;
+	let top = false;
+
+	let typingUsers = [];
+	let typingUsersTimeout = {};
+
+	let messagesContainerElement = null;
+
+	$: if (threadId) {
+		initHandler();
+	}
+
+	const scrollToBottom = () => {
+		messagesContainerElement.scrollTop = messagesContainerElement.scrollHeight;
+	};
+
+	const initHandler = async () => {
+		messages = null;
+		top = false;
+
+		typingUsers = [];
+		typingUsersTimeout = {};
+
+		if (channel) {
+			messages = await getChannelThreadMessages(localStorage.token, channel.id, threadId);
+
+			if (messages.length < 50) {
+				top = true;
+			}
+
+			await tick();
+			scrollToBottom();
+		} else {
+			goto('/');
+		}
+	};
+
+	const channelEventHandler = async (event) => {
+		console.log(event);
+		if (event.channel_id === channel.id) {
+			const type = event?.data?.type ?? null;
+			const data = event?.data?.data ?? null;
+
+			if (type === 'message') {
+				if ((data?.parent_id ?? null) === threadId) {
+					if (messages) {
+						messages = [data, ...messages];
+
+						if (typingUsers.find((user) => user.id === event.user.id)) {
+							typingUsers = typingUsers.filter((user) => user.id !== event.user.id);
+						}
+					}
+				}
+			} else if (type === 'message:update') {
+				if (messages) {
+					const idx = messages.findIndex((message) => message.id === data.id);
+
+					if (idx !== -1) {
+						messages[idx] = data;
+					}
+				}
+			} else if (type === 'message:delete') {
+				if (messages) {
+					messages = messages.filter((message) => message.id !== data.id);
+				}
+			} else if (type.includes('message:reaction')) {
+				if (messages) {
+					const idx = messages.findIndex((message) => message.id === data.id);
+					if (idx !== -1) {
+						messages[idx] = data;
+					}
+				}
+			} else if (type === 'typing' && event.message_id === threadId) {
+				if (event.user.id === $user.id) {
+					return;
+				}
+
+				typingUsers = data.typing
+					? [
+							...typingUsers,
+							...(typingUsers.find((user) => user.id === event.user.id)
+								? []
+								: [
+										{
+											id: event.user.id,
+											name: event.user.name
+										}
+									])
+						]
+					: typingUsers.filter((user) => user.id !== event.user.id);
+
+				if (typingUsersTimeout[event.user.id]) {
+					clearTimeout(typingUsersTimeout[event.user.id]);
+				}
+
+				typingUsersTimeout[event.user.id] = setTimeout(() => {
+					typingUsers = typingUsers.filter((user) => user.id !== event.user.id);
+				}, 5000);
+			}
+		}
+	};
+
+	const submitHandler = async ({ content, data }) => {
+		if (!content) {
+			return;
+		}
+
+		const res = await sendMessage(localStorage.token, channel.id, {
+			parent_id: threadId,
+			content: content,
+			data: data
+		}).catch((error) => {
+			toast.error(error);
+			return null;
+		});
+	};
+
+	const onChange = async () => {
+		$socket?.emit('channel-events', {
+			channel_id: channel.id,
+			message_id: threadId,
+			data: {
+				type: 'typing',
+				data: {
+					typing: true
+				}
+			}
+		});
+	};
+
+	onMount(() => {
+		$socket?.on('channel-events', channelEventHandler);
+	});
+
+	onDestroy(() => {
+		$socket?.off('channel-events', channelEventHandler);
+	});
+</script>
+
+{#if channel}
+	<div class="flex flex-col w-full h-full bg-gray-50 dark:bg-gray-850">
+		<div class="flex items-center justify-between px-3.5 pt-3">
+			<div class=" font-medium text-lg">Thread</div>
+
+			<div>
+				<button
+					class="text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-300 p-2"
+					on:click={() => {
+						onClose();
+					}}
+				>
+					<XMark />
+				</button>
+			</div>
+		</div>
+
+		<div class=" max-h-full w-full overflow-y-auto pt-3" bind:this={messagesContainerElement}>
+			<Messages
+				id={threadId}
+				{channel}
+				{messages}
+				{top}
+				thread={true}
+				onLoad={async () => {
+					const newMessages = await getChannelThreadMessages(
+						localStorage.token,
+						channel.id,
+						threadId,
+						messages.length
+					);
+
+					messages = [...messages, ...newMessages];
+
+					if (newMessages.length < 50) {
+						top = true;
+						return;
+					}
+				}}
+			/>
+
+			<div class=" pb-[1rem]">
+				<MessageInput id={threadId} {typingUsers} {onChange} onSubmit={submitHandler} />
+			</div>
+		</div>
+	</div>
+{/if}

+ 38 - 6
src/lib/components/chat/Chat.svelte

@@ -427,7 +427,7 @@
 	onDestroy(() => {
 		chatIdUnsubscriber?.();
 		window.removeEventListener('message', onMessageHandler);
-		// $socket?.off('chat-events');
+		$socket?.off('chat-events', chatEventHandler);
 	});
 
 	// File upload functions
@@ -836,7 +836,7 @@
 			return null;
 		});
 
-		if (res !== null) {
+		if (res !== null && res.messages) {
 			// Update chat history with the new messages
 			for (const message of res.messages) {
 				history.messages[message.id] = {
@@ -890,7 +890,7 @@
 			return null;
 		});
 
-		if (res !== null) {
+		if (res !== null && res.messages) {
 			// Update chat history with the new messages
 			for (const message of res.messages) {
 				history.messages[message.id] = {
@@ -1053,7 +1053,7 @@
 	};
 
 	const chatCompletionEventHandler = async (data, message, chatId) => {
-		const { id, done, choices, sources, selected_model_id, error, usage } = data;
+		const { id, done, choices, content, sources, selected_model_id, error, usage } = data;
 
 		if (error) {
 			await handleOpenAIError(error, message);
@@ -1105,6 +1105,38 @@
 			}
 		}
 
+		if (content) {
+			// REALTIME_CHAT_SAVE is disabled
+			message.content = content;
+
+			if (navigator.vibrate && ($settings?.hapticFeedback ?? false)) {
+				navigator.vibrate(5);
+			}
+
+			// Emit chat event for TTS
+			const messageContentParts = getMessageContentParts(
+				message.content,
+				$config?.audio?.tts?.split_on ?? 'punctuation'
+			);
+			messageContentParts.pop();
+
+			// dispatch only last sentence and make sure it hasn't been dispatched before
+			if (
+				messageContentParts.length > 0 &&
+				messageContentParts[messageContentParts.length - 1] !== message.lastSentence
+			) {
+				message.lastSentence = messageContentParts[messageContentParts.length - 1];
+				eventTarget.dispatchEvent(
+					new CustomEvent('chat', {
+						detail: {
+							id: message.id,
+							content: messageContentParts[messageContentParts.length - 1]
+						}
+					})
+				);
+			}
+		}
+
 		if (selected_model_id) {
 			message.selectedModelId = selected_model_id;
 			message.arena = true;
@@ -1114,6 +1146,8 @@
 			message.usage = usage;
 		}
 
+		history.messages[message.id] = message;
+
 		if (done) {
 			message.done = true;
 
@@ -1158,8 +1192,6 @@
 			await chatCompletedHandler(chatId, message.model, message.id, createMessagesList(message.id));
 		}
 
-		history.messages[message.id] = message;
-
 		console.log(data);
 		if (autoScroll) {
 			scrollToBottom();

+ 1 - 1
src/lib/components/chat/MessageInput.svelte

@@ -544,7 +544,7 @@
 							}}
 						>
 							<div
-								class="flex-1 flex flex-col relative w-full rounded-3xl px-1 bg-gray-50 dark:bg-gray-400/5 dark:text-gray-100"
+								class="flex-1 flex flex-col relative w-full rounded-3xl px-1 bg-gray-600/5 dark:bg-gray-400/5 dark:text-gray-100"
 								dir={$settings?.chatDirection ?? 'LTR'}
 							>
 								{#if files.length > 0}

+ 12 - 3
src/lib/components/chat/Messages/RateComment.svelte

@@ -52,12 +52,21 @@
 	}
 
 	const init = () => {
-		selectedReason = message?.annotation?.reason ?? '';
-		comment = message?.annotation?.comment ?? '';
+		if (!selectedReason) {
+			selectedReason = message?.annotation?.reason ?? '';
+		}
+
+		if (!comment) {
+			comment = message?.annotation?.comment ?? '';
+		}
+
 		tags = (message?.annotation?.tags ?? []).map((tag) => ({
 			name: tag
 		}));
-		detailedRating = message?.annotation?.details?.rating ?? null;
+
+		if (!detailedRating) {
+			detailedRating = message?.annotation?.details?.rating ?? null;
+		}
 	};
 
 	onMount(() => {

+ 6 - 0
src/lib/components/chat/Settings/About.svelte

@@ -106,6 +106,12 @@
 
 		<hr class=" dark:border-gray-850" />
 
+		<div class="mt-2 text-xs text-gray-400 dark:text-gray-500">
+			Emoji graphics provided by
+			<a href="https://github.com/jdecked/twemoji" target="_blank">Twemoji</a>, licensed under
+			<a href="https://creativecommons.org/licenses/by/4.0/" target="_blank">CC-BY 4.0</a>.
+		</div>
+
 		<div class="flex space-x-1">
 			<a href="https://discord.gg/5rJgQTnV4s" target="_blank">
 				<img

+ 1 - 1
src/lib/components/common/Drawer.svelte

@@ -57,7 +57,7 @@
 
 <div
 	bind:this={modalElement}
-	class="modal fixed right-0 left-0 bottom-0 bg-black/60 w-full h-screen max-h-[100dvh] flex justify-center z-[9999] overflow-hidden overscroll-contain"
+	class="modal fixed right-0 left-0 bottom-0 bg-black/60 w-full h-screen max-h-[100dvh] flex justify-center z-[999] overflow-hidden overscroll-contain"
 	in:fly={{ y: 100, duration: 100 }}
 	on:mousedown={() => {
 		show = false;

+ 22 - 2
src/lib/components/common/SVGPanZoom.svelte

@@ -2,7 +2,7 @@
 	import { onMount, getContext } from 'svelte';
 	const i18n = getContext('i18n');
 
-	import panzoom from 'panzoom';
+	import panzoom, { type PanZoom } from 'panzoom';
 
 	import DOMPurify from 'dompurify';
 	import DocumentDuplicate from '../icons/DocumentDuplicate.svelte';
@@ -10,12 +10,13 @@
 	import { toast } from 'svelte-sonner';
 	import Tooltip from './Tooltip.svelte';
 	import Clipboard from '../icons/Clipboard.svelte';
+	import Reset from '../icons/Reset.svelte';
 
 	export let className = '';
 	export let svg = '';
 	export let content = '';
 
-	let instance;
+	let instance: PanZoom;
 
 	let sceneParentElement: HTMLElement;
 	let sceneElement: HTMLElement;
@@ -28,6 +29,12 @@
 			zoomSpeed: 0.065
 		});
 	}
+	function resetPanZoomViewport() {
+		console.log('Reset View');
+		instance.moveTo(0, 0);
+		instance.zoomAbs(0, 0, 1);
+		console.log(instance.getTransform());
+	}
 </script>
 
 <div bind:this={sceneParentElement} class="relative {className}">
@@ -49,5 +56,18 @@
 				</button>
 			</Tooltip>
 		</div>
+		<div class=" absolute top-1 right-10">
+			<Tooltip content={$i18n.t('Reset view')}>
+				<button
+					class="p-1.5 rounded-lg border border-gray-100 dark:border-none dark:bg-gray-850 hover:bg-gray-50 dark:hover:bg-gray-800 transition"
+					on:click={() => {
+						resetPanZoomViewport();
+						toast.success($i18n.t('Reset view'));
+					}}
+				>
+					<Reset className=" size-4" />
+				</button>
+			</Tooltip>
+		</div>
 	{/if}
 </div>

+ 19 - 0
src/lib/components/icons/ChatBubbleOvalEllipsis.svelte

@@ -0,0 +1,19 @@
+<script lang="ts">
+	export let className = 'size-4';
+	export let strokeWidth = '1.5';
+</script>
+
+<svg
+	xmlns="http://www.w3.org/2000/svg"
+	fill="none"
+	viewBox="0 0 24 24"
+	stroke-width={strokeWidth}
+	stroke="currentColor"
+	class={className}
+>
+	<path
+		stroke-linecap="round"
+		stroke-linejoin="round"
+		d="M8.625 12a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0H8.25m4.125 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0H12m4.125 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0h-.375M21 12c0 4.556-4.03 8.25-9 8.25a9.764 9.764 0 0 1-2.555-.337A5.972 5.972 0 0 1 5.41 20.97a5.969 5.969 0 0 1-.474-.065 4.48 4.48 0 0 0 .978-2.025c.09-.457-.133-.901-.467-1.226C3.93 16.178 3 14.189 3 12c0-4.556 4.03-8.25 9-8.25s9 3.694 9 8.25Z"
+	/>
+</svg>

+ 19 - 0
src/lib/components/icons/FaceSmile.svelte

@@ -0,0 +1,19 @@
+<script lang="ts">
+	export let className = 'size-4';
+	export let strokeWidth = '1.5';
+</script>
+
+<svg
+	xmlns="http://www.w3.org/2000/svg"
+	fill="none"
+	viewBox="0 0 24 24"
+	stroke-width={strokeWidth}
+	stroke="currentColor"
+	class={className}
+>
+	<path
+		stroke-linecap="round"
+		stroke-linejoin="round"
+		d="M15.182 15.182a4.5 4.5 0 0 1-6.364 0M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0ZM9.75 9.75c0 .414-.168.75-.375.75S9 10.164 9 9.75 9.168 9 9.375 9s.375.336.375.75Zm-.375 0h.008v.015h-.008V9.75Zm5.625 0c0 .414-.168.75-.375.75s-.375-.336-.375-.75.168-.75.375-.75.375.336.375.75Zm-.375 0h.008v.015h-.008V9.75Z"
+	/>
+</svg>

+ 9 - 0
src/lib/components/icons/Reset.svelte

@@ -0,0 +1,9 @@
+<script lang="ts">
+	export let className = 'size-4';
+</script>
+
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor" class={className}>
+	<path
+		d="M463.5 224l8.5 0c13.3 0 24-10.7 24-24l0-128c0-9.7-5.8-18.5-14.8-22.2s-19.3-1.7-26.2 5.2L413.4 96.6c-87.6-86.5-228.7-86.2-315.8 1c-87.5 87.5-87.5 229.3 0 316.8s229.3 87.5 316.8 0c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0c-62.5 62.5-163.8 62.5-226.3 0s-62.5-163.8 0-226.3c62.2-62.2 162.7-62.5 225.3-1L327 183c-6.9 6.9-8.9 17.2-5.2 26.2s12.5 14.8 22.2 14.8l119.5 0z"
+	/>
+</svg>

+ 5054 - 0
src/lib/emoji-groups.json

@@ -0,0 +1,5054 @@
+{
+	"Smileys & Emotion": [
+		"1F600",
+		"1F603",
+		"1F604",
+		"1F601",
+		"1F606",
+		"1F605",
+		"1F923",
+		"1F602",
+		"1F642",
+		"1F643",
+		"1FAE0",
+		"1F609",
+		"1F60A",
+		"1F607",
+		"1F970",
+		"1F60D",
+		"1F929",
+		"1F618",
+		"1F617",
+		"263A-FE0F",
+		"263A",
+		"1F61A",
+		"1F619",
+		"1F972",
+		"1F60B",
+		"1F61B",
+		"1F61C",
+		"1F92A",
+		"1F61D",
+		"1F911",
+		"1F917",
+		"1F92D",
+		"1FAE2",
+		"1FAE3",
+		"1F92B",
+		"1F914",
+		"1FAE1",
+		"1F910",
+		"1F928",
+		"1F610",
+		"1F611",
+		"1F636",
+		"1FAE5",
+		"1F636-200D-1F32B-FE0F",
+		"1F636-200D-1F32B",
+		"1F60F",
+		"1F612",
+		"1F644",
+		"1F62C",
+		"1F62E-200D-1F4A8",
+		"1F925",
+		"1FAE8",
+		"1F642-200D-2194-FE0F",
+		"1F642-200D-2194",
+		"1F642-200D-2195-FE0F",
+		"1F642-200D-2195",
+		"1F60C",
+		"1F614",
+		"1F62A",
+		"1F924",
+		"1F634",
+		"1FAE9",
+		"1F637",
+		"1F912",
+		"1F915",
+		"1F922",
+		"1F92E",
+		"1F927",
+		"1F975",
+		"1F976",
+		"1F974",
+		"1F635",
+		"1F635-200D-1F4AB",
+		"1F92F",
+		"1F920",
+		"1F973",
+		"1F978",
+		"1F60E",
+		"1F913",
+		"1F9D0",
+		"1F615",
+		"1FAE4",
+		"1F61F",
+		"1F641",
+		"2639-FE0F",
+		"2639",
+		"1F62E",
+		"1F62F",
+		"1F632",
+		"1F633",
+		"1F97A",
+		"1F979",
+		"1F626",
+		"1F627",
+		"1F628",
+		"1F630",
+		"1F625",
+		"1F622",
+		"1F62D",
+		"1F631",
+		"1F616",
+		"1F623",
+		"1F61E",
+		"1F613",
+		"1F629",
+		"1F62B",
+		"1F971",
+		"1F624",
+		"1F621",
+		"1F620",
+		"1F92C",
+		"1F608",
+		"1F47F",
+		"1F480",
+		"2620-FE0F",
+		"2620",
+		"1F4A9",
+		"1F921",
+		"1F479",
+		"1F47A",
+		"1F47B",
+		"1F47D",
+		"1F47E",
+		"1F916",
+		"1F63A",
+		"1F638",
+		"1F639",
+		"1F63B",
+		"1F63C",
+		"1F63D",
+		"1F640",
+		"1F63F",
+		"1F63E",
+		"1F648",
+		"1F649",
+		"1F64A",
+		"1F48C",
+		"1F498",
+		"1F49D",
+		"1F496",
+		"1F497",
+		"1F493",
+		"1F49E",
+		"1F495",
+		"1F49F",
+		"2763-FE0F",
+		"2763",
+		"1F494",
+		"2764-FE0F-200D-1F525",
+		"2764-200D-1F525",
+		"2764-FE0F-200D-1FA79",
+		"2764-200D-1FA79",
+		"2764-FE0F",
+		"2764",
+		"1FA77",
+		"1F9E1",
+		"1F49B",
+		"1F49A",
+		"1F499",
+		"1FA75",
+		"1F49C",
+		"1F90E",
+		"1F5A4",
+		"1FA76",
+		"1F90D",
+		"1F48B",
+		"1F4AF",
+		"1F4A2",
+		"1F4A5",
+		"1F4AB",
+		"1F4A6",
+		"1F4A8",
+		"1F573-FE0F",
+		"1F573",
+		"1F4AC",
+		"1F441-FE0F-200D-1F5E8-FE0F",
+		"1F441-200D-1F5E8-FE0F",
+		"1F441-FE0F-200D-1F5E8",
+		"1F441-200D-1F5E8",
+		"1F5E8-FE0F",
+		"1F5E8",
+		"1F5EF-FE0F",
+		"1F5EF",
+		"1F4AD",
+		"1F4A4"
+	],
+	"People & Body": [
+		"1F44B",
+		"1F44B-1F3FB",
+		"1F44B-1F3FC",
+		"1F44B-1F3FD",
+		"1F44B-1F3FE",
+		"1F44B-1F3FF",
+		"1F91A",
+		"1F91A-1F3FB",
+		"1F91A-1F3FC",
+		"1F91A-1F3FD",
+		"1F91A-1F3FE",
+		"1F91A-1F3FF",
+		"1F590-FE0F",
+		"1F590",
+		"1F590-1F3FB",
+		"1F590-1F3FC",
+		"1F590-1F3FD",
+		"1F590-1F3FE",
+		"1F590-1F3FF",
+		"270B",
+		"270B-1F3FB",
+		"270B-1F3FC",
+		"270B-1F3FD",
+		"270B-1F3FE",
+		"270B-1F3FF",
+		"1F596",
+		"1F596-1F3FB",
+		"1F596-1F3FC",
+		"1F596-1F3FD",
+		"1F596-1F3FE",
+		"1F596-1F3FF",
+		"1FAF1",
+		"1FAF1-1F3FB",
+		"1FAF1-1F3FC",
+		"1FAF1-1F3FD",
+		"1FAF1-1F3FE",
+		"1FAF1-1F3FF",
+		"1FAF2",
+		"1FAF2-1F3FB",
+		"1FAF2-1F3FC",
+		"1FAF2-1F3FD",
+		"1FAF2-1F3FE",
+		"1FAF2-1F3FF",
+		"1FAF3",
+		"1FAF3-1F3FB",
+		"1FAF3-1F3FC",
+		"1FAF3-1F3FD",
+		"1FAF3-1F3FE",
+		"1FAF3-1F3FF",
+		"1FAF4",
+		"1FAF4-1F3FB",
+		"1FAF4-1F3FC",
+		"1FAF4-1F3FD",
+		"1FAF4-1F3FE",
+		"1FAF4-1F3FF",
+		"1FAF7",
+		"1FAF7-1F3FB",
+		"1FAF7-1F3FC",
+		"1FAF7-1F3FD",
+		"1FAF7-1F3FE",
+		"1FAF7-1F3FF",
+		"1FAF8",
+		"1FAF8-1F3FB",
+		"1FAF8-1F3FC",
+		"1FAF8-1F3FD",
+		"1FAF8-1F3FE",
+		"1FAF8-1F3FF",
+		"1F44C",
+		"1F44C-1F3FB",
+		"1F44C-1F3FC",
+		"1F44C-1F3FD",
+		"1F44C-1F3FE",
+		"1F44C-1F3FF",
+		"1F90C",
+		"1F90C-1F3FB",
+		"1F90C-1F3FC",
+		"1F90C-1F3FD",
+		"1F90C-1F3FE",
+		"1F90C-1F3FF",
+		"1F90F",
+		"1F90F-1F3FB",
+		"1F90F-1F3FC",
+		"1F90F-1F3FD",
+		"1F90F-1F3FE",
+		"1F90F-1F3FF",
+		"270C-FE0F",
+		"270C",
+		"270C-1F3FB",
+		"270C-1F3FC",
+		"270C-1F3FD",
+		"270C-1F3FE",
+		"270C-1F3FF",
+		"1F91E",
+		"1F91E-1F3FB",
+		"1F91E-1F3FC",
+		"1F91E-1F3FD",
+		"1F91E-1F3FE",
+		"1F91E-1F3FF",
+		"1FAF0",
+		"1FAF0-1F3FB",
+		"1FAF0-1F3FC",
+		"1FAF0-1F3FD",
+		"1FAF0-1F3FE",
+		"1FAF0-1F3FF",
+		"1F91F",
+		"1F91F-1F3FB",
+		"1F91F-1F3FC",
+		"1F91F-1F3FD",
+		"1F91F-1F3FE",
+		"1F91F-1F3FF",
+		"1F918",
+		"1F918-1F3FB",
+		"1F918-1F3FC",
+		"1F918-1F3FD",
+		"1F918-1F3FE",
+		"1F918-1F3FF",
+		"1F919",
+		"1F919-1F3FB",
+		"1F919-1F3FC",
+		"1F919-1F3FD",
+		"1F919-1F3FE",
+		"1F919-1F3FF",
+		"1F448",
+		"1F448-1F3FB",
+		"1F448-1F3FC",
+		"1F448-1F3FD",
+		"1F448-1F3FE",
+		"1F448-1F3FF",
+		"1F449",
+		"1F449-1F3FB",
+		"1F449-1F3FC",
+		"1F449-1F3FD",
+		"1F449-1F3FE",
+		"1F449-1F3FF",
+		"1F446",
+		"1F446-1F3FB",
+		"1F446-1F3FC",
+		"1F446-1F3FD",
+		"1F446-1F3FE",
+		"1F446-1F3FF",
+		"1F595",
+		"1F595-1F3FB",
+		"1F595-1F3FC",
+		"1F595-1F3FD",
+		"1F595-1F3FE",
+		"1F595-1F3FF",
+		"1F447",
+		"1F447-1F3FB",
+		"1F447-1F3FC",
+		"1F447-1F3FD",
+		"1F447-1F3FE",
+		"1F447-1F3FF",
+		"261D-FE0F",
+		"261D",
+		"261D-1F3FB",
+		"261D-1F3FC",
+		"261D-1F3FD",
+		"261D-1F3FE",
+		"261D-1F3FF",
+		"1FAF5",
+		"1FAF5-1F3FB",
+		"1FAF5-1F3FC",
+		"1FAF5-1F3FD",
+		"1FAF5-1F3FE",
+		"1FAF5-1F3FF",
+		"1F44D",
+		"1F44D-1F3FB",
+		"1F44D-1F3FC",
+		"1F44D-1F3FD",
+		"1F44D-1F3FE",
+		"1F44D-1F3FF",
+		"1F44E",
+		"1F44E-1F3FB",
+		"1F44E-1F3FC",
+		"1F44E-1F3FD",
+		"1F44E-1F3FE",
+		"1F44E-1F3FF",
+		"270A",
+		"270A-1F3FB",
+		"270A-1F3FC",
+		"270A-1F3FD",
+		"270A-1F3FE",
+		"270A-1F3FF",
+		"1F44A",
+		"1F44A-1F3FB",
+		"1F44A-1F3FC",
+		"1F44A-1F3FD",
+		"1F44A-1F3FE",
+		"1F44A-1F3FF",
+		"1F91B",
+		"1F91B-1F3FB",
+		"1F91B-1F3FC",
+		"1F91B-1F3FD",
+		"1F91B-1F3FE",
+		"1F91B-1F3FF",
+		"1F91C",
+		"1F91C-1F3FB",
+		"1F91C-1F3FC",
+		"1F91C-1F3FD",
+		"1F91C-1F3FE",
+		"1F91C-1F3FF",
+		"1F44F",
+		"1F44F-1F3FB",
+		"1F44F-1F3FC",
+		"1F44F-1F3FD",
+		"1F44F-1F3FE",
+		"1F44F-1F3FF",
+		"1F64C",
+		"1F64C-1F3FB",
+		"1F64C-1F3FC",
+		"1F64C-1F3FD",
+		"1F64C-1F3FE",
+		"1F64C-1F3FF",
+		"1FAF6",
+		"1FAF6-1F3FB",
+		"1FAF6-1F3FC",
+		"1FAF6-1F3FD",
+		"1FAF6-1F3FE",
+		"1FAF6-1F3FF",
+		"1F450",
+		"1F450-1F3FB",
+		"1F450-1F3FC",
+		"1F450-1F3FD",
+		"1F450-1F3FE",
+		"1F450-1F3FF",
+		"1F932",
+		"1F932-1F3FB",
+		"1F932-1F3FC",
+		"1F932-1F3FD",
+		"1F932-1F3FE",
+		"1F932-1F3FF",
+		"1F91D",
+		"1F91D-1F3FB",
+		"1F91D-1F3FC",
+		"1F91D-1F3FD",
+		"1F91D-1F3FE",
+		"1F91D-1F3FF",
+		"1FAF1-1F3FB-200D-1FAF2-1F3FC",
+		"1FAF1-1F3FB-200D-1FAF2-1F3FD",
+		"1FAF1-1F3FB-200D-1FAF2-1F3FE",
+		"1FAF1-1F3FB-200D-1FAF2-1F3FF",
+		"1FAF1-1F3FC-200D-1FAF2-1F3FB",
+		"1FAF1-1F3FC-200D-1FAF2-1F3FD",
+		"1FAF1-1F3FC-200D-1FAF2-1F3FE",
+		"1FAF1-1F3FC-200D-1FAF2-1F3FF",
+		"1FAF1-1F3FD-200D-1FAF2-1F3FB",
+		"1FAF1-1F3FD-200D-1FAF2-1F3FC",
+		"1FAF1-1F3FD-200D-1FAF2-1F3FE",
+		"1FAF1-1F3FD-200D-1FAF2-1F3FF",
+		"1FAF1-1F3FE-200D-1FAF2-1F3FB",
+		"1FAF1-1F3FE-200D-1FAF2-1F3FC",
+		"1FAF1-1F3FE-200D-1FAF2-1F3FD",
+		"1FAF1-1F3FE-200D-1FAF2-1F3FF",
+		"1FAF1-1F3FF-200D-1FAF2-1F3FB",
+		"1FAF1-1F3FF-200D-1FAF2-1F3FC",
+		"1FAF1-1F3FF-200D-1FAF2-1F3FD",
+		"1FAF1-1F3FF-200D-1FAF2-1F3FE",
+		"1F64F",
+		"1F64F-1F3FB",
+		"1F64F-1F3FC",
+		"1F64F-1F3FD",
+		"1F64F-1F3FE",
+		"1F64F-1F3FF",
+		"270D-FE0F",
+		"270D",
+		"270D-1F3FB",
+		"270D-1F3FC",
+		"270D-1F3FD",
+		"270D-1F3FE",
+		"270D-1F3FF",
+		"1F485",
+		"1F485-1F3FB",
+		"1F485-1F3FC",
+		"1F485-1F3FD",
+		"1F485-1F3FE",
+		"1F485-1F3FF",
+		"1F933",
+		"1F933-1F3FB",
+		"1F933-1F3FC",
+		"1F933-1F3FD",
+		"1F933-1F3FE",
+		"1F933-1F3FF",
+		"1F4AA",
+		"1F4AA-1F3FB",
+		"1F4AA-1F3FC",
+		"1F4AA-1F3FD",
+		"1F4AA-1F3FE",
+		"1F4AA-1F3FF",
+		"1F9BE",
+		"1F9BF",
+		"1F9B5",
+		"1F9B5-1F3FB",
+		"1F9B5-1F3FC",
+		"1F9B5-1F3FD",
+		"1F9B5-1F3FE",
+		"1F9B5-1F3FF",
+		"1F9B6",
+		"1F9B6-1F3FB",
+		"1F9B6-1F3FC",
+		"1F9B6-1F3FD",
+		"1F9B6-1F3FE",
+		"1F9B6-1F3FF",
+		"1F442",
+		"1F442-1F3FB",
+		"1F442-1F3FC",
+		"1F442-1F3FD",
+		"1F442-1F3FE",
+		"1F442-1F3FF",
+		"1F9BB",
+		"1F9BB-1F3FB",
+		"1F9BB-1F3FC",
+		"1F9BB-1F3FD",
+		"1F9BB-1F3FE",
+		"1F9BB-1F3FF",
+		"1F443",
+		"1F443-1F3FB",
+		"1F443-1F3FC",
+		"1F443-1F3FD",
+		"1F443-1F3FE",
+		"1F443-1F3FF",
+		"1F9E0",
+		"1FAC0",
+		"1FAC1",
+		"1F9B7",
+		"1F9B4",
+		"1F440",
+		"1F441-FE0F",
+		"1F441",
+		"1F445",
+		"1F444",
+		"1FAE6",
+		"1F476",
+		"1F476-1F3FB",
+		"1F476-1F3FC",
+		"1F476-1F3FD",
+		"1F476-1F3FE",
+		"1F476-1F3FF",
+		"1F9D2",
+		"1F9D2-1F3FB",
+		"1F9D2-1F3FC",
+		"1F9D2-1F3FD",
+		"1F9D2-1F3FE",
+		"1F9D2-1F3FF",
+		"1F466",
+		"1F466-1F3FB",
+		"1F466-1F3FC",
+		"1F466-1F3FD",
+		"1F466-1F3FE",
+		"1F466-1F3FF",
+		"1F467",
+		"1F467-1F3FB",
+		"1F467-1F3FC",
+		"1F467-1F3FD",
+		"1F467-1F3FE",
+		"1F467-1F3FF",
+		"1F9D1",
+		"1F9D1-1F3FB",
+		"1F9D1-1F3FC",
+		"1F9D1-1F3FD",
+		"1F9D1-1F3FE",
+		"1F9D1-1F3FF",
+		"1F471",
+		"1F471-1F3FB",
+		"1F471-1F3FC",
+		"1F471-1F3FD",
+		"1F471-1F3FE",
+		"1F471-1F3FF",
+		"1F468",
+		"1F468-1F3FB",
+		"1F468-1F3FC",
+		"1F468-1F3FD",
+		"1F468-1F3FE",
+		"1F468-1F3FF",
+		"1F9D4",
+		"1F9D4-1F3FB",
+		"1F9D4-1F3FC",
+		"1F9D4-1F3FD",
+		"1F9D4-1F3FE",
+		"1F9D4-1F3FF",
+		"1F9D4-200D-2642-FE0F",
+		"1F9D4-200D-2642",
+		"1F9D4-1F3FB-200D-2642-FE0F",
+		"1F9D4-1F3FB-200D-2642",
+		"1F9D4-1F3FC-200D-2642-FE0F",
+		"1F9D4-1F3FC-200D-2642",
+		"1F9D4-1F3FD-200D-2642-FE0F",
+		"1F9D4-1F3FD-200D-2642",
+		"1F9D4-1F3FE-200D-2642-FE0F",
+		"1F9D4-1F3FE-200D-2642",
+		"1F9D4-1F3FF-200D-2642-FE0F",
+		"1F9D4-1F3FF-200D-2642",
+		"1F9D4-200D-2640-FE0F",
+		"1F9D4-200D-2640",
+		"1F9D4-1F3FB-200D-2640-FE0F",
+		"1F9D4-1F3FB-200D-2640",
+		"1F9D4-1F3FC-200D-2640-FE0F",
+		"1F9D4-1F3FC-200D-2640",
+		"1F9D4-1F3FD-200D-2640-FE0F",
+		"1F9D4-1F3FD-200D-2640",
+		"1F9D4-1F3FE-200D-2640-FE0F",
+		"1F9D4-1F3FE-200D-2640",
+		"1F9D4-1F3FF-200D-2640-FE0F",
+		"1F9D4-1F3FF-200D-2640",
+		"1F468-200D-1F9B0",
+		"1F468-1F3FB-200D-1F9B0",
+		"1F468-1F3FC-200D-1F9B0",
+		"1F468-1F3FD-200D-1F9B0",
+		"1F468-1F3FE-200D-1F9B0",
+		"1F468-1F3FF-200D-1F9B0",
+		"1F468-200D-1F9B1",
+		"1F468-1F3FB-200D-1F9B1",
+		"1F468-1F3FC-200D-1F9B1",
+		"1F468-1F3FD-200D-1F9B1",
+		"1F468-1F3FE-200D-1F9B1",
+		"1F468-1F3FF-200D-1F9B1",
+		"1F468-200D-1F9B3",
+		"1F468-1F3FB-200D-1F9B3",
+		"1F468-1F3FC-200D-1F9B3",
+		"1F468-1F3FD-200D-1F9B3",
+		"1F468-1F3FE-200D-1F9B3",
+		"1F468-1F3FF-200D-1F9B3",
+		"1F468-200D-1F9B2",
+		"1F468-1F3FB-200D-1F9B2",
+		"1F468-1F3FC-200D-1F9B2",
+		"1F468-1F3FD-200D-1F9B2",
+		"1F468-1F3FE-200D-1F9B2",
+		"1F468-1F3FF-200D-1F9B2",
+		"1F469",
+		"1F469-1F3FB",
+		"1F469-1F3FC",
+		"1F469-1F3FD",
+		"1F469-1F3FE",
+		"1F469-1F3FF",
+		"1F469-200D-1F9B0",
+		"1F469-1F3FB-200D-1F9B0",
+		"1F469-1F3FC-200D-1F9B0",
+		"1F469-1F3FD-200D-1F9B0",
+		"1F469-1F3FE-200D-1F9B0",
+		"1F469-1F3FF-200D-1F9B0",
+		"1F9D1-200D-1F9B0",
+		"1F9D1-1F3FB-200D-1F9B0",
+		"1F9D1-1F3FC-200D-1F9B0",
+		"1F9D1-1F3FD-200D-1F9B0",
+		"1F9D1-1F3FE-200D-1F9B0",
+		"1F9D1-1F3FF-200D-1F9B0",
+		"1F469-200D-1F9B1",
+		"1F469-1F3FB-200D-1F9B1",
+		"1F469-1F3FC-200D-1F9B1",
+		"1F469-1F3FD-200D-1F9B1",
+		"1F469-1F3FE-200D-1F9B1",
+		"1F469-1F3FF-200D-1F9B1",
+		"1F9D1-200D-1F9B1",
+		"1F9D1-1F3FB-200D-1F9B1",
+		"1F9D1-1F3FC-200D-1F9B1",
+		"1F9D1-1F3FD-200D-1F9B1",
+		"1F9D1-1F3FE-200D-1F9B1",
+		"1F9D1-1F3FF-200D-1F9B1",
+		"1F469-200D-1F9B3",
+		"1F469-1F3FB-200D-1F9B3",
+		"1F469-1F3FC-200D-1F9B3",
+		"1F469-1F3FD-200D-1F9B3",
+		"1F469-1F3FE-200D-1F9B3",
+		"1F469-1F3FF-200D-1F9B3",
+		"1F9D1-200D-1F9B3",
+		"1F9D1-1F3FB-200D-1F9B3",
+		"1F9D1-1F3FC-200D-1F9B3",
+		"1F9D1-1F3FD-200D-1F9B3",
+		"1F9D1-1F3FE-200D-1F9B3",
+		"1F9D1-1F3FF-200D-1F9B3",
+		"1F469-200D-1F9B2",
+		"1F469-1F3FB-200D-1F9B2",
+		"1F469-1F3FC-200D-1F9B2",
+		"1F469-1F3FD-200D-1F9B2",
+		"1F469-1F3FE-200D-1F9B2",
+		"1F469-1F3FF-200D-1F9B2",
+		"1F9D1-200D-1F9B2",
+		"1F9D1-1F3FB-200D-1F9B2",
+		"1F9D1-1F3FC-200D-1F9B2",
+		"1F9D1-1F3FD-200D-1F9B2",
+		"1F9D1-1F3FE-200D-1F9B2",
+		"1F9D1-1F3FF-200D-1F9B2",
+		"1F471-200D-2640-FE0F",
+		"1F471-200D-2640",
+		"1F471-1F3FB-200D-2640-FE0F",
+		"1F471-1F3FB-200D-2640",
+		"1F471-1F3FC-200D-2640-FE0F",
+		"1F471-1F3FC-200D-2640",
+		"1F471-1F3FD-200D-2640-FE0F",
+		"1F471-1F3FD-200D-2640",
+		"1F471-1F3FE-200D-2640-FE0F",
+		"1F471-1F3FE-200D-2640",
+		"1F471-1F3FF-200D-2640-FE0F",
+		"1F471-1F3FF-200D-2640",
+		"1F471-200D-2642-FE0F",
+		"1F471-200D-2642",
+		"1F471-1F3FB-200D-2642-FE0F",
+		"1F471-1F3FB-200D-2642",
+		"1F471-1F3FC-200D-2642-FE0F",
+		"1F471-1F3FC-200D-2642",
+		"1F471-1F3FD-200D-2642-FE0F",
+		"1F471-1F3FD-200D-2642",
+		"1F471-1F3FE-200D-2642-FE0F",
+		"1F471-1F3FE-200D-2642",
+		"1F471-1F3FF-200D-2642-FE0F",
+		"1F471-1F3FF-200D-2642",
+		"1F9D3",
+		"1F9D3-1F3FB",
+		"1F9D3-1F3FC",
+		"1F9D3-1F3FD",
+		"1F9D3-1F3FE",
+		"1F9D3-1F3FF",
+		"1F474",
+		"1F474-1F3FB",
+		"1F474-1F3FC",
+		"1F474-1F3FD",
+		"1F474-1F3FE",
+		"1F474-1F3FF",
+		"1F475",
+		"1F475-1F3FB",
+		"1F475-1F3FC",
+		"1F475-1F3FD",
+		"1F475-1F3FE",
+		"1F475-1F3FF",
+		"1F64D",
+		"1F64D-1F3FB",
+		"1F64D-1F3FC",
+		"1F64D-1F3FD",
+		"1F64D-1F3FE",
+		"1F64D-1F3FF",
+		"1F64D-200D-2642-FE0F",
+		"1F64D-200D-2642",
+		"1F64D-1F3FB-200D-2642-FE0F",
+		"1F64D-1F3FB-200D-2642",
+		"1F64D-1F3FC-200D-2642-FE0F",
+		"1F64D-1F3FC-200D-2642",
+		"1F64D-1F3FD-200D-2642-FE0F",
+		"1F64D-1F3FD-200D-2642",
+		"1F64D-1F3FE-200D-2642-FE0F",
+		"1F64D-1F3FE-200D-2642",
+		"1F64D-1F3FF-200D-2642-FE0F",
+		"1F64D-1F3FF-200D-2642",
+		"1F64D-200D-2640-FE0F",
+		"1F64D-200D-2640",
+		"1F64D-1F3FB-200D-2640-FE0F",
+		"1F64D-1F3FB-200D-2640",
+		"1F64D-1F3FC-200D-2640-FE0F",
+		"1F64D-1F3FC-200D-2640",
+		"1F64D-1F3FD-200D-2640-FE0F",
+		"1F64D-1F3FD-200D-2640",
+		"1F64D-1F3FE-200D-2640-FE0F",
+		"1F64D-1F3FE-200D-2640",
+		"1F64D-1F3FF-200D-2640-FE0F",
+		"1F64D-1F3FF-200D-2640",
+		"1F64E",
+		"1F64E-1F3FB",
+		"1F64E-1F3FC",
+		"1F64E-1F3FD",
+		"1F64E-1F3FE",
+		"1F64E-1F3FF",
+		"1F64E-200D-2642-FE0F",
+		"1F64E-200D-2642",
+		"1F64E-1F3FB-200D-2642-FE0F",
+		"1F64E-1F3FB-200D-2642",
+		"1F64E-1F3FC-200D-2642-FE0F",
+		"1F64E-1F3FC-200D-2642",
+		"1F64E-1F3FD-200D-2642-FE0F",
+		"1F64E-1F3FD-200D-2642",
+		"1F64E-1F3FE-200D-2642-FE0F",
+		"1F64E-1F3FE-200D-2642",
+		"1F64E-1F3FF-200D-2642-FE0F",
+		"1F64E-1F3FF-200D-2642",
+		"1F64E-200D-2640-FE0F",
+		"1F64E-200D-2640",
+		"1F64E-1F3FB-200D-2640-FE0F",
+		"1F64E-1F3FB-200D-2640",
+		"1F64E-1F3FC-200D-2640-FE0F",
+		"1F64E-1F3FC-200D-2640",
+		"1F64E-1F3FD-200D-2640-FE0F",
+		"1F64E-1F3FD-200D-2640",
+		"1F64E-1F3FE-200D-2640-FE0F",
+		"1F64E-1F3FE-200D-2640",
+		"1F64E-1F3FF-200D-2640-FE0F",
+		"1F64E-1F3FF-200D-2640",
+		"1F645",
+		"1F645-1F3FB",
+		"1F645-1F3FC",
+		"1F645-1F3FD",
+		"1F645-1F3FE",
+		"1F645-1F3FF",
+		"1F645-200D-2642-FE0F",
+		"1F645-200D-2642",
+		"1F645-1F3FB-200D-2642-FE0F",
+		"1F645-1F3FB-200D-2642",
+		"1F645-1F3FC-200D-2642-FE0F",
+		"1F645-1F3FC-200D-2642",
+		"1F645-1F3FD-200D-2642-FE0F",
+		"1F645-1F3FD-200D-2642",
+		"1F645-1F3FE-200D-2642-FE0F",
+		"1F645-1F3FE-200D-2642",
+		"1F645-1F3FF-200D-2642-FE0F",
+		"1F645-1F3FF-200D-2642",
+		"1F645-200D-2640-FE0F",
+		"1F645-200D-2640",
+		"1F645-1F3FB-200D-2640-FE0F",
+		"1F645-1F3FB-200D-2640",
+		"1F645-1F3FC-200D-2640-FE0F",
+		"1F645-1F3FC-200D-2640",
+		"1F645-1F3FD-200D-2640-FE0F",
+		"1F645-1F3FD-200D-2640",
+		"1F645-1F3FE-200D-2640-FE0F",
+		"1F645-1F3FE-200D-2640",
+		"1F645-1F3FF-200D-2640-FE0F",
+		"1F645-1F3FF-200D-2640",
+		"1F646",
+		"1F646-1F3FB",
+		"1F646-1F3FC",
+		"1F646-1F3FD",
+		"1F646-1F3FE",
+		"1F646-1F3FF",
+		"1F646-200D-2642-FE0F",
+		"1F646-200D-2642",
+		"1F646-1F3FB-200D-2642-FE0F",
+		"1F646-1F3FB-200D-2642",
+		"1F646-1F3FC-200D-2642-FE0F",
+		"1F646-1F3FC-200D-2642",
+		"1F646-1F3FD-200D-2642-FE0F",
+		"1F646-1F3FD-200D-2642",
+		"1F646-1F3FE-200D-2642-FE0F",
+		"1F646-1F3FE-200D-2642",
+		"1F646-1F3FF-200D-2642-FE0F",
+		"1F646-1F3FF-200D-2642",
+		"1F646-200D-2640-FE0F",
+		"1F646-200D-2640",
+		"1F646-1F3FB-200D-2640-FE0F",
+		"1F646-1F3FB-200D-2640",
+		"1F646-1F3FC-200D-2640-FE0F",
+		"1F646-1F3FC-200D-2640",
+		"1F646-1F3FD-200D-2640-FE0F",
+		"1F646-1F3FD-200D-2640",
+		"1F646-1F3FE-200D-2640-FE0F",
+		"1F646-1F3FE-200D-2640",
+		"1F646-1F3FF-200D-2640-FE0F",
+		"1F646-1F3FF-200D-2640",
+		"1F481",
+		"1F481-1F3FB",
+		"1F481-1F3FC",
+		"1F481-1F3FD",
+		"1F481-1F3FE",
+		"1F481-1F3FF",
+		"1F481-200D-2642-FE0F",
+		"1F481-200D-2642",
+		"1F481-1F3FB-200D-2642-FE0F",
+		"1F481-1F3FB-200D-2642",
+		"1F481-1F3FC-200D-2642-FE0F",
+		"1F481-1F3FC-200D-2642",
+		"1F481-1F3FD-200D-2642-FE0F",
+		"1F481-1F3FD-200D-2642",
+		"1F481-1F3FE-200D-2642-FE0F",
+		"1F481-1F3FE-200D-2642",
+		"1F481-1F3FF-200D-2642-FE0F",
+		"1F481-1F3FF-200D-2642",
+		"1F481-200D-2640-FE0F",
+		"1F481-200D-2640",
+		"1F481-1F3FB-200D-2640-FE0F",
+		"1F481-1F3FB-200D-2640",
+		"1F481-1F3FC-200D-2640-FE0F",
+		"1F481-1F3FC-200D-2640",
+		"1F481-1F3FD-200D-2640-FE0F",
+		"1F481-1F3FD-200D-2640",
+		"1F481-1F3FE-200D-2640-FE0F",
+		"1F481-1F3FE-200D-2640",
+		"1F481-1F3FF-200D-2640-FE0F",
+		"1F481-1F3FF-200D-2640",
+		"1F64B",
+		"1F64B-1F3FB",
+		"1F64B-1F3FC",
+		"1F64B-1F3FD",
+		"1F64B-1F3FE",
+		"1F64B-1F3FF",
+		"1F64B-200D-2642-FE0F",
+		"1F64B-200D-2642",
+		"1F64B-1F3FB-200D-2642-FE0F",
+		"1F64B-1F3FB-200D-2642",
+		"1F64B-1F3FC-200D-2642-FE0F",
+		"1F64B-1F3FC-200D-2642",
+		"1F64B-1F3FD-200D-2642-FE0F",
+		"1F64B-1F3FD-200D-2642",
+		"1F64B-1F3FE-200D-2642-FE0F",
+		"1F64B-1F3FE-200D-2642",
+		"1F64B-1F3FF-200D-2642-FE0F",
+		"1F64B-1F3FF-200D-2642",
+		"1F64B-200D-2640-FE0F",
+		"1F64B-200D-2640",
+		"1F64B-1F3FB-200D-2640-FE0F",
+		"1F64B-1F3FB-200D-2640",
+		"1F64B-1F3FC-200D-2640-FE0F",
+		"1F64B-1F3FC-200D-2640",
+		"1F64B-1F3FD-200D-2640-FE0F",
+		"1F64B-1F3FD-200D-2640",
+		"1F64B-1F3FE-200D-2640-FE0F",
+		"1F64B-1F3FE-200D-2640",
+		"1F64B-1F3FF-200D-2640-FE0F",
+		"1F64B-1F3FF-200D-2640",
+		"1F9CF",
+		"1F9CF-1F3FB",
+		"1F9CF-1F3FC",
+		"1F9CF-1F3FD",
+		"1F9CF-1F3FE",
+		"1F9CF-1F3FF",
+		"1F9CF-200D-2642-FE0F",
+		"1F9CF-200D-2642",
+		"1F9CF-1F3FB-200D-2642-FE0F",
+		"1F9CF-1F3FB-200D-2642",
+		"1F9CF-1F3FC-200D-2642-FE0F",
+		"1F9CF-1F3FC-200D-2642",
+		"1F9CF-1F3FD-200D-2642-FE0F",
+		"1F9CF-1F3FD-200D-2642",
+		"1F9CF-1F3FE-200D-2642-FE0F",
+		"1F9CF-1F3FE-200D-2642",
+		"1F9CF-1F3FF-200D-2642-FE0F",
+		"1F9CF-1F3FF-200D-2642",
+		"1F9CF-200D-2640-FE0F",
+		"1F9CF-200D-2640",
+		"1F9CF-1F3FB-200D-2640-FE0F",
+		"1F9CF-1F3FB-200D-2640",
+		"1F9CF-1F3FC-200D-2640-FE0F",
+		"1F9CF-1F3FC-200D-2640",
+		"1F9CF-1F3FD-200D-2640-FE0F",
+		"1F9CF-1F3FD-200D-2640",
+		"1F9CF-1F3FE-200D-2640-FE0F",
+		"1F9CF-1F3FE-200D-2640",
+		"1F9CF-1F3FF-200D-2640-FE0F",
+		"1F9CF-1F3FF-200D-2640",
+		"1F647",
+		"1F647-1F3FB",
+		"1F647-1F3FC",
+		"1F647-1F3FD",
+		"1F647-1F3FE",
+		"1F647-1F3FF",
+		"1F647-200D-2642-FE0F",
+		"1F647-200D-2642",
+		"1F647-1F3FB-200D-2642-FE0F",
+		"1F647-1F3FB-200D-2642",
+		"1F647-1F3FC-200D-2642-FE0F",
+		"1F647-1F3FC-200D-2642",
+		"1F647-1F3FD-200D-2642-FE0F",
+		"1F647-1F3FD-200D-2642",
+		"1F647-1F3FE-200D-2642-FE0F",
+		"1F647-1F3FE-200D-2642",
+		"1F647-1F3FF-200D-2642-FE0F",
+		"1F647-1F3FF-200D-2642",
+		"1F647-200D-2640-FE0F",
+		"1F647-200D-2640",
+		"1F647-1F3FB-200D-2640-FE0F",
+		"1F647-1F3FB-200D-2640",
+		"1F647-1F3FC-200D-2640-FE0F",
+		"1F647-1F3FC-200D-2640",
+		"1F647-1F3FD-200D-2640-FE0F",
+		"1F647-1F3FD-200D-2640",
+		"1F647-1F3FE-200D-2640-FE0F",
+		"1F647-1F3FE-200D-2640",
+		"1F647-1F3FF-200D-2640-FE0F",
+		"1F647-1F3FF-200D-2640",
+		"1F926",
+		"1F926-1F3FB",
+		"1F926-1F3FC",
+		"1F926-1F3FD",
+		"1F926-1F3FE",
+		"1F926-1F3FF",
+		"1F926-200D-2642-FE0F",
+		"1F926-200D-2642",
+		"1F926-1F3FB-200D-2642-FE0F",
+		"1F926-1F3FB-200D-2642",
+		"1F926-1F3FC-200D-2642-FE0F",
+		"1F926-1F3FC-200D-2642",
+		"1F926-1F3FD-200D-2642-FE0F",
+		"1F926-1F3FD-200D-2642",
+		"1F926-1F3FE-200D-2642-FE0F",
+		"1F926-1F3FE-200D-2642",
+		"1F926-1F3FF-200D-2642-FE0F",
+		"1F926-1F3FF-200D-2642",
+		"1F926-200D-2640-FE0F",
+		"1F926-200D-2640",
+		"1F926-1F3FB-200D-2640-FE0F",
+		"1F926-1F3FB-200D-2640",
+		"1F926-1F3FC-200D-2640-FE0F",
+		"1F926-1F3FC-200D-2640",
+		"1F926-1F3FD-200D-2640-FE0F",
+		"1F926-1F3FD-200D-2640",
+		"1F926-1F3FE-200D-2640-FE0F",
+		"1F926-1F3FE-200D-2640",
+		"1F926-1F3FF-200D-2640-FE0F",
+		"1F926-1F3FF-200D-2640",
+		"1F937",
+		"1F937-1F3FB",
+		"1F937-1F3FC",
+		"1F937-1F3FD",
+		"1F937-1F3FE",
+		"1F937-1F3FF",
+		"1F937-200D-2642-FE0F",
+		"1F937-200D-2642",
+		"1F937-1F3FB-200D-2642-FE0F",
+		"1F937-1F3FB-200D-2642",
+		"1F937-1F3FC-200D-2642-FE0F",
+		"1F937-1F3FC-200D-2642",
+		"1F937-1F3FD-200D-2642-FE0F",
+		"1F937-1F3FD-200D-2642",
+		"1F937-1F3FE-200D-2642-FE0F",
+		"1F937-1F3FE-200D-2642",
+		"1F937-1F3FF-200D-2642-FE0F",
+		"1F937-1F3FF-200D-2642",
+		"1F937-200D-2640-FE0F",
+		"1F937-200D-2640",
+		"1F937-1F3FB-200D-2640-FE0F",
+		"1F937-1F3FB-200D-2640",
+		"1F937-1F3FC-200D-2640-FE0F",
+		"1F937-1F3FC-200D-2640",
+		"1F937-1F3FD-200D-2640-FE0F",
+		"1F937-1F3FD-200D-2640",
+		"1F937-1F3FE-200D-2640-FE0F",
+		"1F937-1F3FE-200D-2640",
+		"1F937-1F3FF-200D-2640-FE0F",
+		"1F937-1F3FF-200D-2640",
+		"1F9D1-200D-2695-FE0F",
+		"1F9D1-200D-2695",
+		"1F9D1-1F3FB-200D-2695-FE0F",
+		"1F9D1-1F3FB-200D-2695",
+		"1F9D1-1F3FC-200D-2695-FE0F",
+		"1F9D1-1F3FC-200D-2695",
+		"1F9D1-1F3FD-200D-2695-FE0F",
+		"1F9D1-1F3FD-200D-2695",
+		"1F9D1-1F3FE-200D-2695-FE0F",
+		"1F9D1-1F3FE-200D-2695",
+		"1F9D1-1F3FF-200D-2695-FE0F",
+		"1F9D1-1F3FF-200D-2695",
+		"1F468-200D-2695-FE0F",
+		"1F468-200D-2695",
+		"1F468-1F3FB-200D-2695-FE0F",
+		"1F468-1F3FB-200D-2695",
+		"1F468-1F3FC-200D-2695-FE0F",
+		"1F468-1F3FC-200D-2695",
+		"1F468-1F3FD-200D-2695-FE0F",
+		"1F468-1F3FD-200D-2695",
+		"1F468-1F3FE-200D-2695-FE0F",
+		"1F468-1F3FE-200D-2695",
+		"1F468-1F3FF-200D-2695-FE0F",
+		"1F468-1F3FF-200D-2695",
+		"1F469-200D-2695-FE0F",
+		"1F469-200D-2695",
+		"1F469-1F3FB-200D-2695-FE0F",
+		"1F469-1F3FB-200D-2695",
+		"1F469-1F3FC-200D-2695-FE0F",
+		"1F469-1F3FC-200D-2695",
+		"1F469-1F3FD-200D-2695-FE0F",
+		"1F469-1F3FD-200D-2695",
+		"1F469-1F3FE-200D-2695-FE0F",
+		"1F469-1F3FE-200D-2695",
+		"1F469-1F3FF-200D-2695-FE0F",
+		"1F469-1F3FF-200D-2695",
+		"1F9D1-200D-1F393",
+		"1F9D1-1F3FB-200D-1F393",
+		"1F9D1-1F3FC-200D-1F393",
+		"1F9D1-1F3FD-200D-1F393",
+		"1F9D1-1F3FE-200D-1F393",
+		"1F9D1-1F3FF-200D-1F393",
+		"1F468-200D-1F393",
+		"1F468-1F3FB-200D-1F393",
+		"1F468-1F3FC-200D-1F393",
+		"1F468-1F3FD-200D-1F393",
+		"1F468-1F3FE-200D-1F393",
+		"1F468-1F3FF-200D-1F393",
+		"1F469-200D-1F393",
+		"1F469-1F3FB-200D-1F393",
+		"1F469-1F3FC-200D-1F393",
+		"1F469-1F3FD-200D-1F393",
+		"1F469-1F3FE-200D-1F393",
+		"1F469-1F3FF-200D-1F393",
+		"1F9D1-200D-1F3EB",
+		"1F9D1-1F3FB-200D-1F3EB",
+		"1F9D1-1F3FC-200D-1F3EB",
+		"1F9D1-1F3FD-200D-1F3EB",
+		"1F9D1-1F3FE-200D-1F3EB",
+		"1F9D1-1F3FF-200D-1F3EB",
+		"1F468-200D-1F3EB",
+		"1F468-1F3FB-200D-1F3EB",
+		"1F468-1F3FC-200D-1F3EB",
+		"1F468-1F3FD-200D-1F3EB",
+		"1F468-1F3FE-200D-1F3EB",
+		"1F468-1F3FF-200D-1F3EB",
+		"1F469-200D-1F3EB",
+		"1F469-1F3FB-200D-1F3EB",
+		"1F469-1F3FC-200D-1F3EB",
+		"1F469-1F3FD-200D-1F3EB",
+		"1F469-1F3FE-200D-1F3EB",
+		"1F469-1F3FF-200D-1F3EB",
+		"1F9D1-200D-2696-FE0F",
+		"1F9D1-200D-2696",
+		"1F9D1-1F3FB-200D-2696-FE0F",
+		"1F9D1-1F3FB-200D-2696",
+		"1F9D1-1F3FC-200D-2696-FE0F",
+		"1F9D1-1F3FC-200D-2696",
+		"1F9D1-1F3FD-200D-2696-FE0F",
+		"1F9D1-1F3FD-200D-2696",
+		"1F9D1-1F3FE-200D-2696-FE0F",
+		"1F9D1-1F3FE-200D-2696",
+		"1F9D1-1F3FF-200D-2696-FE0F",
+		"1F9D1-1F3FF-200D-2696",
+		"1F468-200D-2696-FE0F",
+		"1F468-200D-2696",
+		"1F468-1F3FB-200D-2696-FE0F",
+		"1F468-1F3FB-200D-2696",
+		"1F468-1F3FC-200D-2696-FE0F",
+		"1F468-1F3FC-200D-2696",
+		"1F468-1F3FD-200D-2696-FE0F",
+		"1F468-1F3FD-200D-2696",
+		"1F468-1F3FE-200D-2696-FE0F",
+		"1F468-1F3FE-200D-2696",
+		"1F468-1F3FF-200D-2696-FE0F",
+		"1F468-1F3FF-200D-2696",
+		"1F469-200D-2696-FE0F",
+		"1F469-200D-2696",
+		"1F469-1F3FB-200D-2696-FE0F",
+		"1F469-1F3FB-200D-2696",
+		"1F469-1F3FC-200D-2696-FE0F",
+		"1F469-1F3FC-200D-2696",
+		"1F469-1F3FD-200D-2696-FE0F",
+		"1F469-1F3FD-200D-2696",
+		"1F469-1F3FE-200D-2696-FE0F",
+		"1F469-1F3FE-200D-2696",
+		"1F469-1F3FF-200D-2696-FE0F",
+		"1F469-1F3FF-200D-2696",
+		"1F9D1-200D-1F33E",
+		"1F9D1-1F3FB-200D-1F33E",
+		"1F9D1-1F3FC-200D-1F33E",
+		"1F9D1-1F3FD-200D-1F33E",
+		"1F9D1-1F3FE-200D-1F33E",
+		"1F9D1-1F3FF-200D-1F33E",
+		"1F468-200D-1F33E",
+		"1F468-1F3FB-200D-1F33E",
+		"1F468-1F3FC-200D-1F33E",
+		"1F468-1F3FD-200D-1F33E",
+		"1F468-1F3FE-200D-1F33E",
+		"1F468-1F3FF-200D-1F33E",
+		"1F469-200D-1F33E",
+		"1F469-1F3FB-200D-1F33E",
+		"1F469-1F3FC-200D-1F33E",
+		"1F469-1F3FD-200D-1F33E",
+		"1F469-1F3FE-200D-1F33E",
+		"1F469-1F3FF-200D-1F33E",
+		"1F9D1-200D-1F373",
+		"1F9D1-1F3FB-200D-1F373",
+		"1F9D1-1F3FC-200D-1F373",
+		"1F9D1-1F3FD-200D-1F373",
+		"1F9D1-1F3FE-200D-1F373",
+		"1F9D1-1F3FF-200D-1F373",
+		"1F468-200D-1F373",
+		"1F468-1F3FB-200D-1F373",
+		"1F468-1F3FC-200D-1F373",
+		"1F468-1F3FD-200D-1F373",
+		"1F468-1F3FE-200D-1F373",
+		"1F468-1F3FF-200D-1F373",
+		"1F469-200D-1F373",
+		"1F469-1F3FB-200D-1F373",
+		"1F469-1F3FC-200D-1F373",
+		"1F469-1F3FD-200D-1F373",
+		"1F469-1F3FE-200D-1F373",
+		"1F469-1F3FF-200D-1F373",
+		"1F9D1-200D-1F527",
+		"1F9D1-1F3FB-200D-1F527",
+		"1F9D1-1F3FC-200D-1F527",
+		"1F9D1-1F3FD-200D-1F527",
+		"1F9D1-1F3FE-200D-1F527",
+		"1F9D1-1F3FF-200D-1F527",
+		"1F468-200D-1F527",
+		"1F468-1F3FB-200D-1F527",
+		"1F468-1F3FC-200D-1F527",
+		"1F468-1F3FD-200D-1F527",
+		"1F468-1F3FE-200D-1F527",
+		"1F468-1F3FF-200D-1F527",
+		"1F469-200D-1F527",
+		"1F469-1F3FB-200D-1F527",
+		"1F469-1F3FC-200D-1F527",
+		"1F469-1F3FD-200D-1F527",
+		"1F469-1F3FE-200D-1F527",
+		"1F469-1F3FF-200D-1F527",
+		"1F9D1-200D-1F3ED",
+		"1F9D1-1F3FB-200D-1F3ED",
+		"1F9D1-1F3FC-200D-1F3ED",
+		"1F9D1-1F3FD-200D-1F3ED",
+		"1F9D1-1F3FE-200D-1F3ED",
+		"1F9D1-1F3FF-200D-1F3ED",
+		"1F468-200D-1F3ED",
+		"1F468-1F3FB-200D-1F3ED",
+		"1F468-1F3FC-200D-1F3ED",
+		"1F468-1F3FD-200D-1F3ED",
+		"1F468-1F3FE-200D-1F3ED",
+		"1F468-1F3FF-200D-1F3ED",
+		"1F469-200D-1F3ED",
+		"1F469-1F3FB-200D-1F3ED",
+		"1F469-1F3FC-200D-1F3ED",
+		"1F469-1F3FD-200D-1F3ED",
+		"1F469-1F3FE-200D-1F3ED",
+		"1F469-1F3FF-200D-1F3ED",
+		"1F9D1-200D-1F4BC",
+		"1F9D1-1F3FB-200D-1F4BC",
+		"1F9D1-1F3FC-200D-1F4BC",
+		"1F9D1-1F3FD-200D-1F4BC",
+		"1F9D1-1F3FE-200D-1F4BC",
+		"1F9D1-1F3FF-200D-1F4BC",
+		"1F468-200D-1F4BC",
+		"1F468-1F3FB-200D-1F4BC",
+		"1F468-1F3FC-200D-1F4BC",
+		"1F468-1F3FD-200D-1F4BC",
+		"1F468-1F3FE-200D-1F4BC",
+		"1F468-1F3FF-200D-1F4BC",
+		"1F469-200D-1F4BC",
+		"1F469-1F3FB-200D-1F4BC",
+		"1F469-1F3FC-200D-1F4BC",
+		"1F469-1F3FD-200D-1F4BC",
+		"1F469-1F3FE-200D-1F4BC",
+		"1F469-1F3FF-200D-1F4BC",
+		"1F9D1-200D-1F52C",
+		"1F9D1-1F3FB-200D-1F52C",
+		"1F9D1-1F3FC-200D-1F52C",
+		"1F9D1-1F3FD-200D-1F52C",
+		"1F9D1-1F3FE-200D-1F52C",
+		"1F9D1-1F3FF-200D-1F52C",
+		"1F468-200D-1F52C",
+		"1F468-1F3FB-200D-1F52C",
+		"1F468-1F3FC-200D-1F52C",
+		"1F468-1F3FD-200D-1F52C",
+		"1F468-1F3FE-200D-1F52C",
+		"1F468-1F3FF-200D-1F52C",
+		"1F469-200D-1F52C",
+		"1F469-1F3FB-200D-1F52C",
+		"1F469-1F3FC-200D-1F52C",
+		"1F469-1F3FD-200D-1F52C",
+		"1F469-1F3FE-200D-1F52C",
+		"1F469-1F3FF-200D-1F52C",
+		"1F9D1-200D-1F4BB",
+		"1F9D1-1F3FB-200D-1F4BB",
+		"1F9D1-1F3FC-200D-1F4BB",
+		"1F9D1-1F3FD-200D-1F4BB",
+		"1F9D1-1F3FE-200D-1F4BB",
+		"1F9D1-1F3FF-200D-1F4BB",
+		"1F468-200D-1F4BB",
+		"1F468-1F3FB-200D-1F4BB",
+		"1F468-1F3FC-200D-1F4BB",
+		"1F468-1F3FD-200D-1F4BB",
+		"1F468-1F3FE-200D-1F4BB",
+		"1F468-1F3FF-200D-1F4BB",
+		"1F469-200D-1F4BB",
+		"1F469-1F3FB-200D-1F4BB",
+		"1F469-1F3FC-200D-1F4BB",
+		"1F469-1F3FD-200D-1F4BB",
+		"1F469-1F3FE-200D-1F4BB",
+		"1F469-1F3FF-200D-1F4BB",
+		"1F9D1-200D-1F3A4",
+		"1F9D1-1F3FB-200D-1F3A4",
+		"1F9D1-1F3FC-200D-1F3A4",
+		"1F9D1-1F3FD-200D-1F3A4",
+		"1F9D1-1F3FE-200D-1F3A4",
+		"1F9D1-1F3FF-200D-1F3A4",
+		"1F468-200D-1F3A4",
+		"1F468-1F3FB-200D-1F3A4",
+		"1F468-1F3FC-200D-1F3A4",
+		"1F468-1F3FD-200D-1F3A4",
+		"1F468-1F3FE-200D-1F3A4",
+		"1F468-1F3FF-200D-1F3A4",
+		"1F469-200D-1F3A4",
+		"1F469-1F3FB-200D-1F3A4",
+		"1F469-1F3FC-200D-1F3A4",
+		"1F469-1F3FD-200D-1F3A4",
+		"1F469-1F3FE-200D-1F3A4",
+		"1F469-1F3FF-200D-1F3A4",
+		"1F9D1-200D-1F3A8",
+		"1F9D1-1F3FB-200D-1F3A8",
+		"1F9D1-1F3FC-200D-1F3A8",
+		"1F9D1-1F3FD-200D-1F3A8",
+		"1F9D1-1F3FE-200D-1F3A8",
+		"1F9D1-1F3FF-200D-1F3A8",
+		"1F468-200D-1F3A8",
+		"1F468-1F3FB-200D-1F3A8",
+		"1F468-1F3FC-200D-1F3A8",
+		"1F468-1F3FD-200D-1F3A8",
+		"1F468-1F3FE-200D-1F3A8",
+		"1F468-1F3FF-200D-1F3A8",
+		"1F469-200D-1F3A8",
+		"1F469-1F3FB-200D-1F3A8",
+		"1F469-1F3FC-200D-1F3A8",
+		"1F469-1F3FD-200D-1F3A8",
+		"1F469-1F3FE-200D-1F3A8",
+		"1F469-1F3FF-200D-1F3A8",
+		"1F9D1-200D-2708-FE0F",
+		"1F9D1-200D-2708",
+		"1F9D1-1F3FB-200D-2708-FE0F",
+		"1F9D1-1F3FB-200D-2708",
+		"1F9D1-1F3FC-200D-2708-FE0F",
+		"1F9D1-1F3FC-200D-2708",
+		"1F9D1-1F3FD-200D-2708-FE0F",
+		"1F9D1-1F3FD-200D-2708",
+		"1F9D1-1F3FE-200D-2708-FE0F",
+		"1F9D1-1F3FE-200D-2708",
+		"1F9D1-1F3FF-200D-2708-FE0F",
+		"1F9D1-1F3FF-200D-2708",
+		"1F468-200D-2708-FE0F",
+		"1F468-200D-2708",
+		"1F468-1F3FB-200D-2708-FE0F",
+		"1F468-1F3FB-200D-2708",
+		"1F468-1F3FC-200D-2708-FE0F",
+		"1F468-1F3FC-200D-2708",
+		"1F468-1F3FD-200D-2708-FE0F",
+		"1F468-1F3FD-200D-2708",
+		"1F468-1F3FE-200D-2708-FE0F",
+		"1F468-1F3FE-200D-2708",
+		"1F468-1F3FF-200D-2708-FE0F",
+		"1F468-1F3FF-200D-2708",
+		"1F469-200D-2708-FE0F",
+		"1F469-200D-2708",
+		"1F469-1F3FB-200D-2708-FE0F",
+		"1F469-1F3FB-200D-2708",
+		"1F469-1F3FC-200D-2708-FE0F",
+		"1F469-1F3FC-200D-2708",
+		"1F469-1F3FD-200D-2708-FE0F",
+		"1F469-1F3FD-200D-2708",
+		"1F469-1F3FE-200D-2708-FE0F",
+		"1F469-1F3FE-200D-2708",
+		"1F469-1F3FF-200D-2708-FE0F",
+		"1F469-1F3FF-200D-2708",
+		"1F9D1-200D-1F680",
+		"1F9D1-1F3FB-200D-1F680",
+		"1F9D1-1F3FC-200D-1F680",
+		"1F9D1-1F3FD-200D-1F680",
+		"1F9D1-1F3FE-200D-1F680",
+		"1F9D1-1F3FF-200D-1F680",
+		"1F468-200D-1F680",
+		"1F468-1F3FB-200D-1F680",
+		"1F468-1F3FC-200D-1F680",
+		"1F468-1F3FD-200D-1F680",
+		"1F468-1F3FE-200D-1F680",
+		"1F468-1F3FF-200D-1F680",
+		"1F469-200D-1F680",
+		"1F469-1F3FB-200D-1F680",
+		"1F469-1F3FC-200D-1F680",
+		"1F469-1F3FD-200D-1F680",
+		"1F469-1F3FE-200D-1F680",
+		"1F469-1F3FF-200D-1F680",
+		"1F9D1-200D-1F692",
+		"1F9D1-1F3FB-200D-1F692",
+		"1F9D1-1F3FC-200D-1F692",
+		"1F9D1-1F3FD-200D-1F692",
+		"1F9D1-1F3FE-200D-1F692",
+		"1F9D1-1F3FF-200D-1F692",
+		"1F468-200D-1F692",
+		"1F468-1F3FB-200D-1F692",
+		"1F468-1F3FC-200D-1F692",
+		"1F468-1F3FD-200D-1F692",
+		"1F468-1F3FE-200D-1F692",
+		"1F468-1F3FF-200D-1F692",
+		"1F469-200D-1F692",
+		"1F469-1F3FB-200D-1F692",
+		"1F469-1F3FC-200D-1F692",
+		"1F469-1F3FD-200D-1F692",
+		"1F469-1F3FE-200D-1F692",
+		"1F469-1F3FF-200D-1F692",
+		"1F46E",
+		"1F46E-1F3FB",
+		"1F46E-1F3FC",
+		"1F46E-1F3FD",
+		"1F46E-1F3FE",
+		"1F46E-1F3FF",
+		"1F46E-200D-2642-FE0F",
+		"1F46E-200D-2642",
+		"1F46E-1F3FB-200D-2642-FE0F",
+		"1F46E-1F3FB-200D-2642",
+		"1F46E-1F3FC-200D-2642-FE0F",
+		"1F46E-1F3FC-200D-2642",
+		"1F46E-1F3FD-200D-2642-FE0F",
+		"1F46E-1F3FD-200D-2642",
+		"1F46E-1F3FE-200D-2642-FE0F",
+		"1F46E-1F3FE-200D-2642",
+		"1F46E-1F3FF-200D-2642-FE0F",
+		"1F46E-1F3FF-200D-2642",
+		"1F46E-200D-2640-FE0F",
+		"1F46E-200D-2640",
+		"1F46E-1F3FB-200D-2640-FE0F",
+		"1F46E-1F3FB-200D-2640",
+		"1F46E-1F3FC-200D-2640-FE0F",
+		"1F46E-1F3FC-200D-2640",
+		"1F46E-1F3FD-200D-2640-FE0F",
+		"1F46E-1F3FD-200D-2640",
+		"1F46E-1F3FE-200D-2640-FE0F",
+		"1F46E-1F3FE-200D-2640",
+		"1F46E-1F3FF-200D-2640-FE0F",
+		"1F46E-1F3FF-200D-2640",
+		"1F575-FE0F",
+		"1F575",
+		"1F575-1F3FB",
+		"1F575-1F3FC",
+		"1F575-1F3FD",
+		"1F575-1F3FE",
+		"1F575-1F3FF",
+		"1F575-FE0F-200D-2642-FE0F",
+		"1F575-200D-2642-FE0F",
+		"1F575-FE0F-200D-2642",
+		"1F575-200D-2642",
+		"1F575-1F3FB-200D-2642-FE0F",
+		"1F575-1F3FB-200D-2642",
+		"1F575-1F3FC-200D-2642-FE0F",
+		"1F575-1F3FC-200D-2642",
+		"1F575-1F3FD-200D-2642-FE0F",
+		"1F575-1F3FD-200D-2642",
+		"1F575-1F3FE-200D-2642-FE0F",
+		"1F575-1F3FE-200D-2642",
+		"1F575-1F3FF-200D-2642-FE0F",
+		"1F575-1F3FF-200D-2642",
+		"1F575-FE0F-200D-2640-FE0F",
+		"1F575-200D-2640-FE0F",
+		"1F575-FE0F-200D-2640",
+		"1F575-200D-2640",
+		"1F575-1F3FB-200D-2640-FE0F",
+		"1F575-1F3FB-200D-2640",
+		"1F575-1F3FC-200D-2640-FE0F",
+		"1F575-1F3FC-200D-2640",
+		"1F575-1F3FD-200D-2640-FE0F",
+		"1F575-1F3FD-200D-2640",
+		"1F575-1F3FE-200D-2640-FE0F",
+		"1F575-1F3FE-200D-2640",
+		"1F575-1F3FF-200D-2640-FE0F",
+		"1F575-1F3FF-200D-2640",
+		"1F482",
+		"1F482-1F3FB",
+		"1F482-1F3FC",
+		"1F482-1F3FD",
+		"1F482-1F3FE",
+		"1F482-1F3FF",
+		"1F482-200D-2642-FE0F",
+		"1F482-200D-2642",
+		"1F482-1F3FB-200D-2642-FE0F",
+		"1F482-1F3FB-200D-2642",
+		"1F482-1F3FC-200D-2642-FE0F",
+		"1F482-1F3FC-200D-2642",
+		"1F482-1F3FD-200D-2642-FE0F",
+		"1F482-1F3FD-200D-2642",
+		"1F482-1F3FE-200D-2642-FE0F",
+		"1F482-1F3FE-200D-2642",
+		"1F482-1F3FF-200D-2642-FE0F",
+		"1F482-1F3FF-200D-2642",
+		"1F482-200D-2640-FE0F",
+		"1F482-200D-2640",
+		"1F482-1F3FB-200D-2640-FE0F",
+		"1F482-1F3FB-200D-2640",
+		"1F482-1F3FC-200D-2640-FE0F",
+		"1F482-1F3FC-200D-2640",
+		"1F482-1F3FD-200D-2640-FE0F",
+		"1F482-1F3FD-200D-2640",
+		"1F482-1F3FE-200D-2640-FE0F",
+		"1F482-1F3FE-200D-2640",
+		"1F482-1F3FF-200D-2640-FE0F",
+		"1F482-1F3FF-200D-2640",
+		"1F977",
+		"1F977-1F3FB",
+		"1F977-1F3FC",
+		"1F977-1F3FD",
+		"1F977-1F3FE",
+		"1F977-1F3FF",
+		"1F477",
+		"1F477-1F3FB",
+		"1F477-1F3FC",
+		"1F477-1F3FD",
+		"1F477-1F3FE",
+		"1F477-1F3FF",
+		"1F477-200D-2642-FE0F",
+		"1F477-200D-2642",
+		"1F477-1F3FB-200D-2642-FE0F",
+		"1F477-1F3FB-200D-2642",
+		"1F477-1F3FC-200D-2642-FE0F",
+		"1F477-1F3FC-200D-2642",
+		"1F477-1F3FD-200D-2642-FE0F",
+		"1F477-1F3FD-200D-2642",
+		"1F477-1F3FE-200D-2642-FE0F",
+		"1F477-1F3FE-200D-2642",
+		"1F477-1F3FF-200D-2642-FE0F",
+		"1F477-1F3FF-200D-2642",
+		"1F477-200D-2640-FE0F",
+		"1F477-200D-2640",
+		"1F477-1F3FB-200D-2640-FE0F",
+		"1F477-1F3FB-200D-2640",
+		"1F477-1F3FC-200D-2640-FE0F",
+		"1F477-1F3FC-200D-2640",
+		"1F477-1F3FD-200D-2640-FE0F",
+		"1F477-1F3FD-200D-2640",
+		"1F477-1F3FE-200D-2640-FE0F",
+		"1F477-1F3FE-200D-2640",
+		"1F477-1F3FF-200D-2640-FE0F",
+		"1F477-1F3FF-200D-2640",
+		"1FAC5",
+		"1FAC5-1F3FB",
+		"1FAC5-1F3FC",
+		"1FAC5-1F3FD",
+		"1FAC5-1F3FE",
+		"1FAC5-1F3FF",
+		"1F934",
+		"1F934-1F3FB",
+		"1F934-1F3FC",
+		"1F934-1F3FD",
+		"1F934-1F3FE",
+		"1F934-1F3FF",
+		"1F478",
+		"1F478-1F3FB",
+		"1F478-1F3FC",
+		"1F478-1F3FD",
+		"1F478-1F3FE",
+		"1F478-1F3FF",
+		"1F473",
+		"1F473-1F3FB",
+		"1F473-1F3FC",
+		"1F473-1F3FD",
+		"1F473-1F3FE",
+		"1F473-1F3FF",
+		"1F473-200D-2642-FE0F",
+		"1F473-200D-2642",
+		"1F473-1F3FB-200D-2642-FE0F",
+		"1F473-1F3FB-200D-2642",
+		"1F473-1F3FC-200D-2642-FE0F",
+		"1F473-1F3FC-200D-2642",
+		"1F473-1F3FD-200D-2642-FE0F",
+		"1F473-1F3FD-200D-2642",
+		"1F473-1F3FE-200D-2642-FE0F",
+		"1F473-1F3FE-200D-2642",
+		"1F473-1F3FF-200D-2642-FE0F",
+		"1F473-1F3FF-200D-2642",
+		"1F473-200D-2640-FE0F",
+		"1F473-200D-2640",
+		"1F473-1F3FB-200D-2640-FE0F",
+		"1F473-1F3FB-200D-2640",
+		"1F473-1F3FC-200D-2640-FE0F",
+		"1F473-1F3FC-200D-2640",
+		"1F473-1F3FD-200D-2640-FE0F",
+		"1F473-1F3FD-200D-2640",
+		"1F473-1F3FE-200D-2640-FE0F",
+		"1F473-1F3FE-200D-2640",
+		"1F473-1F3FF-200D-2640-FE0F",
+		"1F473-1F3FF-200D-2640",
+		"1F472",
+		"1F472-1F3FB",
+		"1F472-1F3FC",
+		"1F472-1F3FD",
+		"1F472-1F3FE",
+		"1F472-1F3FF",
+		"1F9D5",
+		"1F9D5-1F3FB",
+		"1F9D5-1F3FC",
+		"1F9D5-1F3FD",
+		"1F9D5-1F3FE",
+		"1F9D5-1F3FF",
+		"1F935",
+		"1F935-1F3FB",
+		"1F935-1F3FC",
+		"1F935-1F3FD",
+		"1F935-1F3FE",
+		"1F935-1F3FF",
+		"1F935-200D-2642-FE0F",
+		"1F935-200D-2642",
+		"1F935-1F3FB-200D-2642-FE0F",
+		"1F935-1F3FB-200D-2642",
+		"1F935-1F3FC-200D-2642-FE0F",
+		"1F935-1F3FC-200D-2642",
+		"1F935-1F3FD-200D-2642-FE0F",
+		"1F935-1F3FD-200D-2642",
+		"1F935-1F3FE-200D-2642-FE0F",
+		"1F935-1F3FE-200D-2642",
+		"1F935-1F3FF-200D-2642-FE0F",
+		"1F935-1F3FF-200D-2642",
+		"1F935-200D-2640-FE0F",
+		"1F935-200D-2640",
+		"1F935-1F3FB-200D-2640-FE0F",
+		"1F935-1F3FB-200D-2640",
+		"1F935-1F3FC-200D-2640-FE0F",
+		"1F935-1F3FC-200D-2640",
+		"1F935-1F3FD-200D-2640-FE0F",
+		"1F935-1F3FD-200D-2640",
+		"1F935-1F3FE-200D-2640-FE0F",
+		"1F935-1F3FE-200D-2640",
+		"1F935-1F3FF-200D-2640-FE0F",
+		"1F935-1F3FF-200D-2640",
+		"1F470",
+		"1F470-1F3FB",
+		"1F470-1F3FC",
+		"1F470-1F3FD",
+		"1F470-1F3FE",
+		"1F470-1F3FF",
+		"1F470-200D-2642-FE0F",
+		"1F470-200D-2642",
+		"1F470-1F3FB-200D-2642-FE0F",
+		"1F470-1F3FB-200D-2642",
+		"1F470-1F3FC-200D-2642-FE0F",
+		"1F470-1F3FC-200D-2642",
+		"1F470-1F3FD-200D-2642-FE0F",
+		"1F470-1F3FD-200D-2642",
+		"1F470-1F3FE-200D-2642-FE0F",
+		"1F470-1F3FE-200D-2642",
+		"1F470-1F3FF-200D-2642-FE0F",
+		"1F470-1F3FF-200D-2642",
+		"1F470-200D-2640-FE0F",
+		"1F470-200D-2640",
+		"1F470-1F3FB-200D-2640-FE0F",
+		"1F470-1F3FB-200D-2640",
+		"1F470-1F3FC-200D-2640-FE0F",
+		"1F470-1F3FC-200D-2640",
+		"1F470-1F3FD-200D-2640-FE0F",
+		"1F470-1F3FD-200D-2640",
+		"1F470-1F3FE-200D-2640-FE0F",
+		"1F470-1F3FE-200D-2640",
+		"1F470-1F3FF-200D-2640-FE0F",
+		"1F470-1F3FF-200D-2640",
+		"1F930",
+		"1F930-1F3FB",
+		"1F930-1F3FC",
+		"1F930-1F3FD",
+		"1F930-1F3FE",
+		"1F930-1F3FF",
+		"1FAC3",
+		"1FAC3-1F3FB",
+		"1FAC3-1F3FC",
+		"1FAC3-1F3FD",
+		"1FAC3-1F3FE",
+		"1FAC3-1F3FF",
+		"1FAC4",
+		"1FAC4-1F3FB",
+		"1FAC4-1F3FC",
+		"1FAC4-1F3FD",
+		"1FAC4-1F3FE",
+		"1FAC4-1F3FF",
+		"1F931",
+		"1F931-1F3FB",
+		"1F931-1F3FC",
+		"1F931-1F3FD",
+		"1F931-1F3FE",
+		"1F931-1F3FF",
+		"1F469-200D-1F37C",
+		"1F469-1F3FB-200D-1F37C",
+		"1F469-1F3FC-200D-1F37C",
+		"1F469-1F3FD-200D-1F37C",
+		"1F469-1F3FE-200D-1F37C",
+		"1F469-1F3FF-200D-1F37C",
+		"1F468-200D-1F37C",
+		"1F468-1F3FB-200D-1F37C",
+		"1F468-1F3FC-200D-1F37C",
+		"1F468-1F3FD-200D-1F37C",
+		"1F468-1F3FE-200D-1F37C",
+		"1F468-1F3FF-200D-1F37C",
+		"1F9D1-200D-1F37C",
+		"1F9D1-1F3FB-200D-1F37C",
+		"1F9D1-1F3FC-200D-1F37C",
+		"1F9D1-1F3FD-200D-1F37C",
+		"1F9D1-1F3FE-200D-1F37C",
+		"1F9D1-1F3FF-200D-1F37C",
+		"1F47C",
+		"1F47C-1F3FB",
+		"1F47C-1F3FC",
+		"1F47C-1F3FD",
+		"1F47C-1F3FE",
+		"1F47C-1F3FF",
+		"1F385",
+		"1F385-1F3FB",
+		"1F385-1F3FC",
+		"1F385-1F3FD",
+		"1F385-1F3FE",
+		"1F385-1F3FF",
+		"1F936",
+		"1F936-1F3FB",
+		"1F936-1F3FC",
+		"1F936-1F3FD",
+		"1F936-1F3FE",
+		"1F936-1F3FF",
+		"1F9D1-200D-1F384",
+		"1F9D1-1F3FB-200D-1F384",
+		"1F9D1-1F3FC-200D-1F384",
+		"1F9D1-1F3FD-200D-1F384",
+		"1F9D1-1F3FE-200D-1F384",
+		"1F9D1-1F3FF-200D-1F384",
+		"1F9B8",
+		"1F9B8-1F3FB",
+		"1F9B8-1F3FC",
+		"1F9B8-1F3FD",
+		"1F9B8-1F3FE",
+		"1F9B8-1F3FF",
+		"1F9B8-200D-2642-FE0F",
+		"1F9B8-200D-2642",
+		"1F9B8-1F3FB-200D-2642-FE0F",
+		"1F9B8-1F3FB-200D-2642",
+		"1F9B8-1F3FC-200D-2642-FE0F",
+		"1F9B8-1F3FC-200D-2642",
+		"1F9B8-1F3FD-200D-2642-FE0F",
+		"1F9B8-1F3FD-200D-2642",
+		"1F9B8-1F3FE-200D-2642-FE0F",
+		"1F9B8-1F3FE-200D-2642",
+		"1F9B8-1F3FF-200D-2642-FE0F",
+		"1F9B8-1F3FF-200D-2642",
+		"1F9B8-200D-2640-FE0F",
+		"1F9B8-200D-2640",
+		"1F9B8-1F3FB-200D-2640-FE0F",
+		"1F9B8-1F3FB-200D-2640",
+		"1F9B8-1F3FC-200D-2640-FE0F",
+		"1F9B8-1F3FC-200D-2640",
+		"1F9B8-1F3FD-200D-2640-FE0F",
+		"1F9B8-1F3FD-200D-2640",
+		"1F9B8-1F3FE-200D-2640-FE0F",
+		"1F9B8-1F3FE-200D-2640",
+		"1F9B8-1F3FF-200D-2640-FE0F",
+		"1F9B8-1F3FF-200D-2640",
+		"1F9B9",
+		"1F9B9-1F3FB",
+		"1F9B9-1F3FC",
+		"1F9B9-1F3FD",
+		"1F9B9-1F3FE",
+		"1F9B9-1F3FF",
+		"1F9B9-200D-2642-FE0F",
+		"1F9B9-200D-2642",
+		"1F9B9-1F3FB-200D-2642-FE0F",
+		"1F9B9-1F3FB-200D-2642",
+		"1F9B9-1F3FC-200D-2642-FE0F",
+		"1F9B9-1F3FC-200D-2642",
+		"1F9B9-1F3FD-200D-2642-FE0F",
+		"1F9B9-1F3FD-200D-2642",
+		"1F9B9-1F3FE-200D-2642-FE0F",
+		"1F9B9-1F3FE-200D-2642",
+		"1F9B9-1F3FF-200D-2642-FE0F",
+		"1F9B9-1F3FF-200D-2642",
+		"1F9B9-200D-2640-FE0F",
+		"1F9B9-200D-2640",
+		"1F9B9-1F3FB-200D-2640-FE0F",
+		"1F9B9-1F3FB-200D-2640",
+		"1F9B9-1F3FC-200D-2640-FE0F",
+		"1F9B9-1F3FC-200D-2640",
+		"1F9B9-1F3FD-200D-2640-FE0F",
+		"1F9B9-1F3FD-200D-2640",
+		"1F9B9-1F3FE-200D-2640-FE0F",
+		"1F9B9-1F3FE-200D-2640",
+		"1F9B9-1F3FF-200D-2640-FE0F",
+		"1F9B9-1F3FF-200D-2640",
+		"1F9D9",
+		"1F9D9-1F3FB",
+		"1F9D9-1F3FC",
+		"1F9D9-1F3FD",
+		"1F9D9-1F3FE",
+		"1F9D9-1F3FF",
+		"1F9D9-200D-2642-FE0F",
+		"1F9D9-200D-2642",
+		"1F9D9-1F3FB-200D-2642-FE0F",
+		"1F9D9-1F3FB-200D-2642",
+		"1F9D9-1F3FC-200D-2642-FE0F",
+		"1F9D9-1F3FC-200D-2642",
+		"1F9D9-1F3FD-200D-2642-FE0F",
+		"1F9D9-1F3FD-200D-2642",
+		"1F9D9-1F3FE-200D-2642-FE0F",
+		"1F9D9-1F3FE-200D-2642",
+		"1F9D9-1F3FF-200D-2642-FE0F",
+		"1F9D9-1F3FF-200D-2642",
+		"1F9D9-200D-2640-FE0F",
+		"1F9D9-200D-2640",
+		"1F9D9-1F3FB-200D-2640-FE0F",
+		"1F9D9-1F3FB-200D-2640",
+		"1F9D9-1F3FC-200D-2640-FE0F",
+		"1F9D9-1F3FC-200D-2640",
+		"1F9D9-1F3FD-200D-2640-FE0F",
+		"1F9D9-1F3FD-200D-2640",
+		"1F9D9-1F3FE-200D-2640-FE0F",
+		"1F9D9-1F3FE-200D-2640",
+		"1F9D9-1F3FF-200D-2640-FE0F",
+		"1F9D9-1F3FF-200D-2640",
+		"1F9DA",
+		"1F9DA-1F3FB",
+		"1F9DA-1F3FC",
+		"1F9DA-1F3FD",
+		"1F9DA-1F3FE",
+		"1F9DA-1F3FF",
+		"1F9DA-200D-2642-FE0F",
+		"1F9DA-200D-2642",
+		"1F9DA-1F3FB-200D-2642-FE0F",
+		"1F9DA-1F3FB-200D-2642",
+		"1F9DA-1F3FC-200D-2642-FE0F",
+		"1F9DA-1F3FC-200D-2642",
+		"1F9DA-1F3FD-200D-2642-FE0F",
+		"1F9DA-1F3FD-200D-2642",
+		"1F9DA-1F3FE-200D-2642-FE0F",
+		"1F9DA-1F3FE-200D-2642",
+		"1F9DA-1F3FF-200D-2642-FE0F",
+		"1F9DA-1F3FF-200D-2642",
+		"1F9DA-200D-2640-FE0F",
+		"1F9DA-200D-2640",
+		"1F9DA-1F3FB-200D-2640-FE0F",
+		"1F9DA-1F3FB-200D-2640",
+		"1F9DA-1F3FC-200D-2640-FE0F",
+		"1F9DA-1F3FC-200D-2640",
+		"1F9DA-1F3FD-200D-2640-FE0F",
+		"1F9DA-1F3FD-200D-2640",
+		"1F9DA-1F3FE-200D-2640-FE0F",
+		"1F9DA-1F3FE-200D-2640",
+		"1F9DA-1F3FF-200D-2640-FE0F",
+		"1F9DA-1F3FF-200D-2640",
+		"1F9DB",
+		"1F9DB-1F3FB",
+		"1F9DB-1F3FC",
+		"1F9DB-1F3FD",
+		"1F9DB-1F3FE",
+		"1F9DB-1F3FF",
+		"1F9DB-200D-2642-FE0F",
+		"1F9DB-200D-2642",
+		"1F9DB-1F3FB-200D-2642-FE0F",
+		"1F9DB-1F3FB-200D-2642",
+		"1F9DB-1F3FC-200D-2642-FE0F",
+		"1F9DB-1F3FC-200D-2642",
+		"1F9DB-1F3FD-200D-2642-FE0F",
+		"1F9DB-1F3FD-200D-2642",
+		"1F9DB-1F3FE-200D-2642-FE0F",
+		"1F9DB-1F3FE-200D-2642",
+		"1F9DB-1F3FF-200D-2642-FE0F",
+		"1F9DB-1F3FF-200D-2642",
+		"1F9DB-200D-2640-FE0F",
+		"1F9DB-200D-2640",
+		"1F9DB-1F3FB-200D-2640-FE0F",
+		"1F9DB-1F3FB-200D-2640",
+		"1F9DB-1F3FC-200D-2640-FE0F",
+		"1F9DB-1F3FC-200D-2640",
+		"1F9DB-1F3FD-200D-2640-FE0F",
+		"1F9DB-1F3FD-200D-2640",
+		"1F9DB-1F3FE-200D-2640-FE0F",
+		"1F9DB-1F3FE-200D-2640",
+		"1F9DB-1F3FF-200D-2640-FE0F",
+		"1F9DB-1F3FF-200D-2640",
+		"1F9DC",
+		"1F9DC-1F3FB",
+		"1F9DC-1F3FC",
+		"1F9DC-1F3FD",
+		"1F9DC-1F3FE",
+		"1F9DC-1F3FF",
+		"1F9DC-200D-2642-FE0F",
+		"1F9DC-200D-2642",
+		"1F9DC-1F3FB-200D-2642-FE0F",
+		"1F9DC-1F3FB-200D-2642",
+		"1F9DC-1F3FC-200D-2642-FE0F",
+		"1F9DC-1F3FC-200D-2642",
+		"1F9DC-1F3FD-200D-2642-FE0F",
+		"1F9DC-1F3FD-200D-2642",
+		"1F9DC-1F3FE-200D-2642-FE0F",
+		"1F9DC-1F3FE-200D-2642",
+		"1F9DC-1F3FF-200D-2642-FE0F",
+		"1F9DC-1F3FF-200D-2642",
+		"1F9DC-200D-2640-FE0F",
+		"1F9DC-200D-2640",
+		"1F9DC-1F3FB-200D-2640-FE0F",
+		"1F9DC-1F3FB-200D-2640",
+		"1F9DC-1F3FC-200D-2640-FE0F",
+		"1F9DC-1F3FC-200D-2640",
+		"1F9DC-1F3FD-200D-2640-FE0F",
+		"1F9DC-1F3FD-200D-2640",
+		"1F9DC-1F3FE-200D-2640-FE0F",
+		"1F9DC-1F3FE-200D-2640",
+		"1F9DC-1F3FF-200D-2640-FE0F",
+		"1F9DC-1F3FF-200D-2640",
+		"1F9DD",
+		"1F9DD-1F3FB",
+		"1F9DD-1F3FC",
+		"1F9DD-1F3FD",
+		"1F9DD-1F3FE",
+		"1F9DD-1F3FF",
+		"1F9DD-200D-2642-FE0F",
+		"1F9DD-200D-2642",
+		"1F9DD-1F3FB-200D-2642-FE0F",
+		"1F9DD-1F3FB-200D-2642",
+		"1F9DD-1F3FC-200D-2642-FE0F",
+		"1F9DD-1F3FC-200D-2642",
+		"1F9DD-1F3FD-200D-2642-FE0F",
+		"1F9DD-1F3FD-200D-2642",
+		"1F9DD-1F3FE-200D-2642-FE0F",
+		"1F9DD-1F3FE-200D-2642",
+		"1F9DD-1F3FF-200D-2642-FE0F",
+		"1F9DD-1F3FF-200D-2642",
+		"1F9DD-200D-2640-FE0F",
+		"1F9DD-200D-2640",
+		"1F9DD-1F3FB-200D-2640-FE0F",
+		"1F9DD-1F3FB-200D-2640",
+		"1F9DD-1F3FC-200D-2640-FE0F",
+		"1F9DD-1F3FC-200D-2640",
+		"1F9DD-1F3FD-200D-2640-FE0F",
+		"1F9DD-1F3FD-200D-2640",
+		"1F9DD-1F3FE-200D-2640-FE0F",
+		"1F9DD-1F3FE-200D-2640",
+		"1F9DD-1F3FF-200D-2640-FE0F",
+		"1F9DD-1F3FF-200D-2640",
+		"1F9DE",
+		"1F9DE-200D-2642-FE0F",
+		"1F9DE-200D-2642",
+		"1F9DE-200D-2640-FE0F",
+		"1F9DE-200D-2640",
+		"1F9DF",
+		"1F9DF-200D-2642-FE0F",
+		"1F9DF-200D-2642",
+		"1F9DF-200D-2640-FE0F",
+		"1F9DF-200D-2640",
+		"1F9CC",
+		"1F486",
+		"1F486-1F3FB",
+		"1F486-1F3FC",
+		"1F486-1F3FD",
+		"1F486-1F3FE",
+		"1F486-1F3FF",
+		"1F486-200D-2642-FE0F",
+		"1F486-200D-2642",
+		"1F486-1F3FB-200D-2642-FE0F",
+		"1F486-1F3FB-200D-2642",
+		"1F486-1F3FC-200D-2642-FE0F",
+		"1F486-1F3FC-200D-2642",
+		"1F486-1F3FD-200D-2642-FE0F",
+		"1F486-1F3FD-200D-2642",
+		"1F486-1F3FE-200D-2642-FE0F",
+		"1F486-1F3FE-200D-2642",
+		"1F486-1F3FF-200D-2642-FE0F",
+		"1F486-1F3FF-200D-2642",
+		"1F486-200D-2640-FE0F",
+		"1F486-200D-2640",
+		"1F486-1F3FB-200D-2640-FE0F",
+		"1F486-1F3FB-200D-2640",
+		"1F486-1F3FC-200D-2640-FE0F",
+		"1F486-1F3FC-200D-2640",
+		"1F486-1F3FD-200D-2640-FE0F",
+		"1F486-1F3FD-200D-2640",
+		"1F486-1F3FE-200D-2640-FE0F",
+		"1F486-1F3FE-200D-2640",
+		"1F486-1F3FF-200D-2640-FE0F",
+		"1F486-1F3FF-200D-2640",
+		"1F487",
+		"1F487-1F3FB",
+		"1F487-1F3FC",
+		"1F487-1F3FD",
+		"1F487-1F3FE",
+		"1F487-1F3FF",
+		"1F487-200D-2642-FE0F",
+		"1F487-200D-2642",
+		"1F487-1F3FB-200D-2642-FE0F",
+		"1F487-1F3FB-200D-2642",
+		"1F487-1F3FC-200D-2642-FE0F",
+		"1F487-1F3FC-200D-2642",
+		"1F487-1F3FD-200D-2642-FE0F",
+		"1F487-1F3FD-200D-2642",
+		"1F487-1F3FE-200D-2642-FE0F",
+		"1F487-1F3FE-200D-2642",
+		"1F487-1F3FF-200D-2642-FE0F",
+		"1F487-1F3FF-200D-2642",
+		"1F487-200D-2640-FE0F",
+		"1F487-200D-2640",
+		"1F487-1F3FB-200D-2640-FE0F",
+		"1F487-1F3FB-200D-2640",
+		"1F487-1F3FC-200D-2640-FE0F",
+		"1F487-1F3FC-200D-2640",
+		"1F487-1F3FD-200D-2640-FE0F",
+		"1F487-1F3FD-200D-2640",
+		"1F487-1F3FE-200D-2640-FE0F",
+		"1F487-1F3FE-200D-2640",
+		"1F487-1F3FF-200D-2640-FE0F",
+		"1F487-1F3FF-200D-2640",
+		"1F6B6",
+		"1F6B6-1F3FB",
+		"1F6B6-1F3FC",
+		"1F6B6-1F3FD",
+		"1F6B6-1F3FE",
+		"1F6B6-1F3FF",
+		"1F6B6-200D-2642-FE0F",
+		"1F6B6-200D-2642",
+		"1F6B6-1F3FB-200D-2642-FE0F",
+		"1F6B6-1F3FB-200D-2642",
+		"1F6B6-1F3FC-200D-2642-FE0F",
+		"1F6B6-1F3FC-200D-2642",
+		"1F6B6-1F3FD-200D-2642-FE0F",
+		"1F6B6-1F3FD-200D-2642",
+		"1F6B6-1F3FE-200D-2642-FE0F",
+		"1F6B6-1F3FE-200D-2642",
+		"1F6B6-1F3FF-200D-2642-FE0F",
+		"1F6B6-1F3FF-200D-2642",
+		"1F6B6-200D-2640-FE0F",
+		"1F6B6-200D-2640",
+		"1F6B6-1F3FB-200D-2640-FE0F",
+		"1F6B6-1F3FB-200D-2640",
+		"1F6B6-1F3FC-200D-2640-FE0F",
+		"1F6B6-1F3FC-200D-2640",
+		"1F6B6-1F3FD-200D-2640-FE0F",
+		"1F6B6-1F3FD-200D-2640",
+		"1F6B6-1F3FE-200D-2640-FE0F",
+		"1F6B6-1F3FE-200D-2640",
+		"1F6B6-1F3FF-200D-2640-FE0F",
+		"1F6B6-1F3FF-200D-2640",
+		"1F6B6-200D-27A1-FE0F",
+		"1F6B6-200D-27A1",
+		"1F6B6-1F3FB-200D-27A1-FE0F",
+		"1F6B6-1F3FB-200D-27A1",
+		"1F6B6-1F3FC-200D-27A1-FE0F",
+		"1F6B6-1F3FC-200D-27A1",
+		"1F6B6-1F3FD-200D-27A1-FE0F",
+		"1F6B6-1F3FD-200D-27A1",
+		"1F6B6-1F3FE-200D-27A1-FE0F",
+		"1F6B6-1F3FE-200D-27A1",
+		"1F6B6-1F3FF-200D-27A1-FE0F",
+		"1F6B6-1F3FF-200D-27A1",
+		"1F6B6-200D-2640-FE0F-200D-27A1-FE0F",
+		"1F6B6-200D-2640-200D-27A1-FE0F",
+		"1F6B6-200D-2640-FE0F-200D-27A1",
+		"1F6B6-200D-2640-200D-27A1",
+		"1F6B6-1F3FB-200D-2640-FE0F-200D-27A1-FE0F",
+		"1F6B6-1F3FB-200D-2640-200D-27A1-FE0F",
+		"1F6B6-1F3FB-200D-2640-FE0F-200D-27A1",
+		"1F6B6-1F3FB-200D-2640-200D-27A1",
+		"1F6B6-1F3FC-200D-2640-FE0F-200D-27A1-FE0F",
+		"1F6B6-1F3FC-200D-2640-200D-27A1-FE0F",
+		"1F6B6-1F3FC-200D-2640-FE0F-200D-27A1",
+		"1F6B6-1F3FC-200D-2640-200D-27A1",
+		"1F6B6-1F3FD-200D-2640-FE0F-200D-27A1-FE0F",
+		"1F6B6-1F3FD-200D-2640-200D-27A1-FE0F",
+		"1F6B6-1F3FD-200D-2640-FE0F-200D-27A1",
+		"1F6B6-1F3FD-200D-2640-200D-27A1",
+		"1F6B6-1F3FE-200D-2640-FE0F-200D-27A1-FE0F",
+		"1F6B6-1F3FE-200D-2640-200D-27A1-FE0F",
+		"1F6B6-1F3FE-200D-2640-FE0F-200D-27A1",
+		"1F6B6-1F3FE-200D-2640-200D-27A1",
+		"1F6B6-1F3FF-200D-2640-FE0F-200D-27A1-FE0F",
+		"1F6B6-1F3FF-200D-2640-200D-27A1-FE0F",
+		"1F6B6-1F3FF-200D-2640-FE0F-200D-27A1",
+		"1F6B6-1F3FF-200D-2640-200D-27A1",
+		"1F6B6-200D-2642-FE0F-200D-27A1-FE0F",
+		"1F6B6-200D-2642-200D-27A1-FE0F",
+		"1F6B6-200D-2642-FE0F-200D-27A1",
+		"1F6B6-200D-2642-200D-27A1",
+		"1F6B6-1F3FB-200D-2642-FE0F-200D-27A1-FE0F",
+		"1F6B6-1F3FB-200D-2642-200D-27A1-FE0F",
+		"1F6B6-1F3FB-200D-2642-FE0F-200D-27A1",
+		"1F6B6-1F3FB-200D-2642-200D-27A1",
+		"1F6B6-1F3FC-200D-2642-FE0F-200D-27A1-FE0F",
+		"1F6B6-1F3FC-200D-2642-200D-27A1-FE0F",
+		"1F6B6-1F3FC-200D-2642-FE0F-200D-27A1",
+		"1F6B6-1F3FC-200D-2642-200D-27A1",
+		"1F6B6-1F3FD-200D-2642-FE0F-200D-27A1-FE0F",
+		"1F6B6-1F3FD-200D-2642-200D-27A1-FE0F",
+		"1F6B6-1F3FD-200D-2642-FE0F-200D-27A1",
+		"1F6B6-1F3FD-200D-2642-200D-27A1",
+		"1F6B6-1F3FE-200D-2642-FE0F-200D-27A1-FE0F",
+		"1F6B6-1F3FE-200D-2642-200D-27A1-FE0F",
+		"1F6B6-1F3FE-200D-2642-FE0F-200D-27A1",
+		"1F6B6-1F3FE-200D-2642-200D-27A1",
+		"1F6B6-1F3FF-200D-2642-FE0F-200D-27A1-FE0F",
+		"1F6B6-1F3FF-200D-2642-200D-27A1-FE0F",
+		"1F6B6-1F3FF-200D-2642-FE0F-200D-27A1",
+		"1F6B6-1F3FF-200D-2642-200D-27A1",
+		"1F9CD",
+		"1F9CD-1F3FB",
+		"1F9CD-1F3FC",
+		"1F9CD-1F3FD",
+		"1F9CD-1F3FE",
+		"1F9CD-1F3FF",
+		"1F9CD-200D-2642-FE0F",
+		"1F9CD-200D-2642",
+		"1F9CD-1F3FB-200D-2642-FE0F",
+		"1F9CD-1F3FB-200D-2642",
+		"1F9CD-1F3FC-200D-2642-FE0F",
+		"1F9CD-1F3FC-200D-2642",
+		"1F9CD-1F3FD-200D-2642-FE0F",
+		"1F9CD-1F3FD-200D-2642",
+		"1F9CD-1F3FE-200D-2642-FE0F",
+		"1F9CD-1F3FE-200D-2642",
+		"1F9CD-1F3FF-200D-2642-FE0F",
+		"1F9CD-1F3FF-200D-2642",
+		"1F9CD-200D-2640-FE0F",
+		"1F9CD-200D-2640",
+		"1F9CD-1F3FB-200D-2640-FE0F",
+		"1F9CD-1F3FB-200D-2640",
+		"1F9CD-1F3FC-200D-2640-FE0F",
+		"1F9CD-1F3FC-200D-2640",
+		"1F9CD-1F3FD-200D-2640-FE0F",
+		"1F9CD-1F3FD-200D-2640",
+		"1F9CD-1F3FE-200D-2640-FE0F",
+		"1F9CD-1F3FE-200D-2640",
+		"1F9CD-1F3FF-200D-2640-FE0F",
+		"1F9CD-1F3FF-200D-2640",
+		"1F9CE",
+		"1F9CE-1F3FB",
+		"1F9CE-1F3FC",
+		"1F9CE-1F3FD",
+		"1F9CE-1F3FE",
+		"1F9CE-1F3FF",
+		"1F9CE-200D-2642-FE0F",
+		"1F9CE-200D-2642",
+		"1F9CE-1F3FB-200D-2642-FE0F",
+		"1F9CE-1F3FB-200D-2642",
+		"1F9CE-1F3FC-200D-2642-FE0F",
+		"1F9CE-1F3FC-200D-2642",
+		"1F9CE-1F3FD-200D-2642-FE0F",
+		"1F9CE-1F3FD-200D-2642",
+		"1F9CE-1F3FE-200D-2642-FE0F",
+		"1F9CE-1F3FE-200D-2642",
+		"1F9CE-1F3FF-200D-2642-FE0F",
+		"1F9CE-1F3FF-200D-2642",
+		"1F9CE-200D-2640-FE0F",
+		"1F9CE-200D-2640",
+		"1F9CE-1F3FB-200D-2640-FE0F",
+		"1F9CE-1F3FB-200D-2640",
+		"1F9CE-1F3FC-200D-2640-FE0F",
+		"1F9CE-1F3FC-200D-2640",
+		"1F9CE-1F3FD-200D-2640-FE0F",
+		"1F9CE-1F3FD-200D-2640",
+		"1F9CE-1F3FE-200D-2640-FE0F",
+		"1F9CE-1F3FE-200D-2640",
+		"1F9CE-1F3FF-200D-2640-FE0F",
+		"1F9CE-1F3FF-200D-2640",
+		"1F9CE-200D-27A1-FE0F",
+		"1F9CE-200D-27A1",
+		"1F9CE-1F3FB-200D-27A1-FE0F",
+		"1F9CE-1F3FB-200D-27A1",
+		"1F9CE-1F3FC-200D-27A1-FE0F",
+		"1F9CE-1F3FC-200D-27A1",
+		"1F9CE-1F3FD-200D-27A1-FE0F",
+		"1F9CE-1F3FD-200D-27A1",
+		"1F9CE-1F3FE-200D-27A1-FE0F",
+		"1F9CE-1F3FE-200D-27A1",
+		"1F9CE-1F3FF-200D-27A1-FE0F",
+		"1F9CE-1F3FF-200D-27A1",
+		"1F9CE-200D-2640-FE0F-200D-27A1-FE0F",
+		"1F9CE-200D-2640-200D-27A1-FE0F",
+		"1F9CE-200D-2640-FE0F-200D-27A1",
+		"1F9CE-200D-2640-200D-27A1",
+		"1F9CE-1F3FB-200D-2640-FE0F-200D-27A1-FE0F",
+		"1F9CE-1F3FB-200D-2640-200D-27A1-FE0F",
+		"1F9CE-1F3FB-200D-2640-FE0F-200D-27A1",
+		"1F9CE-1F3FB-200D-2640-200D-27A1",
+		"1F9CE-1F3FC-200D-2640-FE0F-200D-27A1-FE0F",
+		"1F9CE-1F3FC-200D-2640-200D-27A1-FE0F",
+		"1F9CE-1F3FC-200D-2640-FE0F-200D-27A1",
+		"1F9CE-1F3FC-200D-2640-200D-27A1",
+		"1F9CE-1F3FD-200D-2640-FE0F-200D-27A1-FE0F",
+		"1F9CE-1F3FD-200D-2640-200D-27A1-FE0F",
+		"1F9CE-1F3FD-200D-2640-FE0F-200D-27A1",
+		"1F9CE-1F3FD-200D-2640-200D-27A1",
+		"1F9CE-1F3FE-200D-2640-FE0F-200D-27A1-FE0F",
+		"1F9CE-1F3FE-200D-2640-200D-27A1-FE0F",
+		"1F9CE-1F3FE-200D-2640-FE0F-200D-27A1",
+		"1F9CE-1F3FE-200D-2640-200D-27A1",
+		"1F9CE-1F3FF-200D-2640-FE0F-200D-27A1-FE0F",
+		"1F9CE-1F3FF-200D-2640-200D-27A1-FE0F",
+		"1F9CE-1F3FF-200D-2640-FE0F-200D-27A1",
+		"1F9CE-1F3FF-200D-2640-200D-27A1",
+		"1F9CE-200D-2642-FE0F-200D-27A1-FE0F",
+		"1F9CE-200D-2642-200D-27A1-FE0F",
+		"1F9CE-200D-2642-FE0F-200D-27A1",
+		"1F9CE-200D-2642-200D-27A1",
+		"1F9CE-1F3FB-200D-2642-FE0F-200D-27A1-FE0F",
+		"1F9CE-1F3FB-200D-2642-200D-27A1-FE0F",
+		"1F9CE-1F3FB-200D-2642-FE0F-200D-27A1",
+		"1F9CE-1F3FB-200D-2642-200D-27A1",
+		"1F9CE-1F3FC-200D-2642-FE0F-200D-27A1-FE0F",
+		"1F9CE-1F3FC-200D-2642-200D-27A1-FE0F",
+		"1F9CE-1F3FC-200D-2642-FE0F-200D-27A1",
+		"1F9CE-1F3FC-200D-2642-200D-27A1",
+		"1F9CE-1F3FD-200D-2642-FE0F-200D-27A1-FE0F",
+		"1F9CE-1F3FD-200D-2642-200D-27A1-FE0F",
+		"1F9CE-1F3FD-200D-2642-FE0F-200D-27A1",
+		"1F9CE-1F3FD-200D-2642-200D-27A1",
+		"1F9CE-1F3FE-200D-2642-FE0F-200D-27A1-FE0F",
+		"1F9CE-1F3FE-200D-2642-200D-27A1-FE0F",
+		"1F9CE-1F3FE-200D-2642-FE0F-200D-27A1",
+		"1F9CE-1F3FE-200D-2642-200D-27A1",
+		"1F9CE-1F3FF-200D-2642-FE0F-200D-27A1-FE0F",
+		"1F9CE-1F3FF-200D-2642-200D-27A1-FE0F",
+		"1F9CE-1F3FF-200D-2642-FE0F-200D-27A1",
+		"1F9CE-1F3FF-200D-2642-200D-27A1",
+		"1F9D1-200D-1F9AF",
+		"1F9D1-1F3FB-200D-1F9AF",
+		"1F9D1-1F3FC-200D-1F9AF",
+		"1F9D1-1F3FD-200D-1F9AF",
+		"1F9D1-1F3FE-200D-1F9AF",
+		"1F9D1-1F3FF-200D-1F9AF",
+		"1F9D1-200D-1F9AF-200D-27A1-FE0F",
+		"1F9D1-200D-1F9AF-200D-27A1",
+		"1F9D1-1F3FB-200D-1F9AF-200D-27A1-FE0F",
+		"1F9D1-1F3FB-200D-1F9AF-200D-27A1",
+		"1F9D1-1F3FC-200D-1F9AF-200D-27A1-FE0F",
+		"1F9D1-1F3FC-200D-1F9AF-200D-27A1",
+		"1F9D1-1F3FD-200D-1F9AF-200D-27A1-FE0F",
+		"1F9D1-1F3FD-200D-1F9AF-200D-27A1",
+		"1F9D1-1F3FE-200D-1F9AF-200D-27A1-FE0F",
+		"1F9D1-1F3FE-200D-1F9AF-200D-27A1",
+		"1F9D1-1F3FF-200D-1F9AF-200D-27A1-FE0F",
+		"1F9D1-1F3FF-200D-1F9AF-200D-27A1",
+		"1F468-200D-1F9AF",
+		"1F468-1F3FB-200D-1F9AF",
+		"1F468-1F3FC-200D-1F9AF",
+		"1F468-1F3FD-200D-1F9AF",
+		"1F468-1F3FE-200D-1F9AF",
+		"1F468-1F3FF-200D-1F9AF",
+		"1F468-200D-1F9AF-200D-27A1-FE0F",
+		"1F468-200D-1F9AF-200D-27A1",
+		"1F468-1F3FB-200D-1F9AF-200D-27A1-FE0F",
+		"1F468-1F3FB-200D-1F9AF-200D-27A1",
+		"1F468-1F3FC-200D-1F9AF-200D-27A1-FE0F",
+		"1F468-1F3FC-200D-1F9AF-200D-27A1",
+		"1F468-1F3FD-200D-1F9AF-200D-27A1-FE0F",
+		"1F468-1F3FD-200D-1F9AF-200D-27A1",
+		"1F468-1F3FE-200D-1F9AF-200D-27A1-FE0F",
+		"1F468-1F3FE-200D-1F9AF-200D-27A1",
+		"1F468-1F3FF-200D-1F9AF-200D-27A1-FE0F",
+		"1F468-1F3FF-200D-1F9AF-200D-27A1",
+		"1F469-200D-1F9AF",
+		"1F469-1F3FB-200D-1F9AF",
+		"1F469-1F3FC-200D-1F9AF",
+		"1F469-1F3FD-200D-1F9AF",
+		"1F469-1F3FE-200D-1F9AF",
+		"1F469-1F3FF-200D-1F9AF",
+		"1F469-200D-1F9AF-200D-27A1-FE0F",
+		"1F469-200D-1F9AF-200D-27A1",
+		"1F469-1F3FB-200D-1F9AF-200D-27A1-FE0F",
+		"1F469-1F3FB-200D-1F9AF-200D-27A1",
+		"1F469-1F3FC-200D-1F9AF-200D-27A1-FE0F",
+		"1F469-1F3FC-200D-1F9AF-200D-27A1",
+		"1F469-1F3FD-200D-1F9AF-200D-27A1-FE0F",
+		"1F469-1F3FD-200D-1F9AF-200D-27A1",
+		"1F469-1F3FE-200D-1F9AF-200D-27A1-FE0F",
+		"1F469-1F3FE-200D-1F9AF-200D-27A1",
+		"1F469-1F3FF-200D-1F9AF-200D-27A1-FE0F",
+		"1F469-1F3FF-200D-1F9AF-200D-27A1",
+		"1F9D1-200D-1F9BC",
+		"1F9D1-1F3FB-200D-1F9BC",
+		"1F9D1-1F3FC-200D-1F9BC",
+		"1F9D1-1F3FD-200D-1F9BC",
+		"1F9D1-1F3FE-200D-1F9BC",
+		"1F9D1-1F3FF-200D-1F9BC",
+		"1F9D1-200D-1F9BC-200D-27A1-FE0F",
+		"1F9D1-200D-1F9BC-200D-27A1",
+		"1F9D1-1F3FB-200D-1F9BC-200D-27A1-FE0F",
+		"1F9D1-1F3FB-200D-1F9BC-200D-27A1",
+		"1F9D1-1F3FC-200D-1F9BC-200D-27A1-FE0F",
+		"1F9D1-1F3FC-200D-1F9BC-200D-27A1",
+		"1F9D1-1F3FD-200D-1F9BC-200D-27A1-FE0F",
+		"1F9D1-1F3FD-200D-1F9BC-200D-27A1",
+		"1F9D1-1F3FE-200D-1F9BC-200D-27A1-FE0F",
+		"1F9D1-1F3FE-200D-1F9BC-200D-27A1",
+		"1F9D1-1F3FF-200D-1F9BC-200D-27A1-FE0F",
+		"1F9D1-1F3FF-200D-1F9BC-200D-27A1",
+		"1F468-200D-1F9BC",
+		"1F468-1F3FB-200D-1F9BC",
+		"1F468-1F3FC-200D-1F9BC",
+		"1F468-1F3FD-200D-1F9BC",
+		"1F468-1F3FE-200D-1F9BC",
+		"1F468-1F3FF-200D-1F9BC",
+		"1F468-200D-1F9BC-200D-27A1-FE0F",
+		"1F468-200D-1F9BC-200D-27A1",
+		"1F468-1F3FB-200D-1F9BC-200D-27A1-FE0F",
+		"1F468-1F3FB-200D-1F9BC-200D-27A1",
+		"1F468-1F3FC-200D-1F9BC-200D-27A1-FE0F",
+		"1F468-1F3FC-200D-1F9BC-200D-27A1",
+		"1F468-1F3FD-200D-1F9BC-200D-27A1-FE0F",
+		"1F468-1F3FD-200D-1F9BC-200D-27A1",
+		"1F468-1F3FE-200D-1F9BC-200D-27A1-FE0F",
+		"1F468-1F3FE-200D-1F9BC-200D-27A1",
+		"1F468-1F3FF-200D-1F9BC-200D-27A1-FE0F",
+		"1F468-1F3FF-200D-1F9BC-200D-27A1",
+		"1F469-200D-1F9BC",
+		"1F469-1F3FB-200D-1F9BC",
+		"1F469-1F3FC-200D-1F9BC",
+		"1F469-1F3FD-200D-1F9BC",
+		"1F469-1F3FE-200D-1F9BC",
+		"1F469-1F3FF-200D-1F9BC",
+		"1F469-200D-1F9BC-200D-27A1-FE0F",
+		"1F469-200D-1F9BC-200D-27A1",
+		"1F469-1F3FB-200D-1F9BC-200D-27A1-FE0F",
+		"1F469-1F3FB-200D-1F9BC-200D-27A1",
+		"1F469-1F3FC-200D-1F9BC-200D-27A1-FE0F",
+		"1F469-1F3FC-200D-1F9BC-200D-27A1",
+		"1F469-1F3FD-200D-1F9BC-200D-27A1-FE0F",
+		"1F469-1F3FD-200D-1F9BC-200D-27A1",
+		"1F469-1F3FE-200D-1F9BC-200D-27A1-FE0F",
+		"1F469-1F3FE-200D-1F9BC-200D-27A1",
+		"1F469-1F3FF-200D-1F9BC-200D-27A1-FE0F",
+		"1F469-1F3FF-200D-1F9BC-200D-27A1",
+		"1F9D1-200D-1F9BD",
+		"1F9D1-1F3FB-200D-1F9BD",
+		"1F9D1-1F3FC-200D-1F9BD",
+		"1F9D1-1F3FD-200D-1F9BD",
+		"1F9D1-1F3FE-200D-1F9BD",
+		"1F9D1-1F3FF-200D-1F9BD",
+		"1F9D1-200D-1F9BD-200D-27A1-FE0F",
+		"1F9D1-200D-1F9BD-200D-27A1",
+		"1F9D1-1F3FB-200D-1F9BD-200D-27A1-FE0F",
+		"1F9D1-1F3FB-200D-1F9BD-200D-27A1",
+		"1F9D1-1F3FC-200D-1F9BD-200D-27A1-FE0F",
+		"1F9D1-1F3FC-200D-1F9BD-200D-27A1",
+		"1F9D1-1F3FD-200D-1F9BD-200D-27A1-FE0F",
+		"1F9D1-1F3FD-200D-1F9BD-200D-27A1",
+		"1F9D1-1F3FE-200D-1F9BD-200D-27A1-FE0F",
+		"1F9D1-1F3FE-200D-1F9BD-200D-27A1",
+		"1F9D1-1F3FF-200D-1F9BD-200D-27A1-FE0F",
+		"1F9D1-1F3FF-200D-1F9BD-200D-27A1",
+		"1F468-200D-1F9BD",
+		"1F468-1F3FB-200D-1F9BD",
+		"1F468-1F3FC-200D-1F9BD",
+		"1F468-1F3FD-200D-1F9BD",
+		"1F468-1F3FE-200D-1F9BD",
+		"1F468-1F3FF-200D-1F9BD",
+		"1F468-200D-1F9BD-200D-27A1-FE0F",
+		"1F468-200D-1F9BD-200D-27A1",
+		"1F468-1F3FB-200D-1F9BD-200D-27A1-FE0F",
+		"1F468-1F3FB-200D-1F9BD-200D-27A1",
+		"1F468-1F3FC-200D-1F9BD-200D-27A1-FE0F",
+		"1F468-1F3FC-200D-1F9BD-200D-27A1",
+		"1F468-1F3FD-200D-1F9BD-200D-27A1-FE0F",
+		"1F468-1F3FD-200D-1F9BD-200D-27A1",
+		"1F468-1F3FE-200D-1F9BD-200D-27A1-FE0F",
+		"1F468-1F3FE-200D-1F9BD-200D-27A1",
+		"1F468-1F3FF-200D-1F9BD-200D-27A1-FE0F",
+		"1F468-1F3FF-200D-1F9BD-200D-27A1",
+		"1F469-200D-1F9BD",
+		"1F469-1F3FB-200D-1F9BD",
+		"1F469-1F3FC-200D-1F9BD",
+		"1F469-1F3FD-200D-1F9BD",
+		"1F469-1F3FE-200D-1F9BD",
+		"1F469-1F3FF-200D-1F9BD",
+		"1F469-200D-1F9BD-200D-27A1-FE0F",
+		"1F469-200D-1F9BD-200D-27A1",
+		"1F469-1F3FB-200D-1F9BD-200D-27A1-FE0F",
+		"1F469-1F3FB-200D-1F9BD-200D-27A1",
+		"1F469-1F3FC-200D-1F9BD-200D-27A1-FE0F",
+		"1F469-1F3FC-200D-1F9BD-200D-27A1",
+		"1F469-1F3FD-200D-1F9BD-200D-27A1-FE0F",
+		"1F469-1F3FD-200D-1F9BD-200D-27A1",
+		"1F469-1F3FE-200D-1F9BD-200D-27A1-FE0F",
+		"1F469-1F3FE-200D-1F9BD-200D-27A1",
+		"1F469-1F3FF-200D-1F9BD-200D-27A1-FE0F",
+		"1F469-1F3FF-200D-1F9BD-200D-27A1",
+		"1F3C3",
+		"1F3C3-1F3FB",
+		"1F3C3-1F3FC",
+		"1F3C3-1F3FD",
+		"1F3C3-1F3FE",
+		"1F3C3-1F3FF",
+		"1F3C3-200D-2642-FE0F",
+		"1F3C3-200D-2642",
+		"1F3C3-1F3FB-200D-2642-FE0F",
+		"1F3C3-1F3FB-200D-2642",
+		"1F3C3-1F3FC-200D-2642-FE0F",
+		"1F3C3-1F3FC-200D-2642",
+		"1F3C3-1F3FD-200D-2642-FE0F",
+		"1F3C3-1F3FD-200D-2642",
+		"1F3C3-1F3FE-200D-2642-FE0F",
+		"1F3C3-1F3FE-200D-2642",
+		"1F3C3-1F3FF-200D-2642-FE0F",
+		"1F3C3-1F3FF-200D-2642",
+		"1F3C3-200D-2640-FE0F",
+		"1F3C3-200D-2640",
+		"1F3C3-1F3FB-200D-2640-FE0F",
+		"1F3C3-1F3FB-200D-2640",
+		"1F3C3-1F3FC-200D-2640-FE0F",
+		"1F3C3-1F3FC-200D-2640",
+		"1F3C3-1F3FD-200D-2640-FE0F",
+		"1F3C3-1F3FD-200D-2640",
+		"1F3C3-1F3FE-200D-2640-FE0F",
+		"1F3C3-1F3FE-200D-2640",
+		"1F3C3-1F3FF-200D-2640-FE0F",
+		"1F3C3-1F3FF-200D-2640",
+		"1F3C3-200D-27A1-FE0F",
+		"1F3C3-200D-27A1",
+		"1F3C3-1F3FB-200D-27A1-FE0F",
+		"1F3C3-1F3FB-200D-27A1",
+		"1F3C3-1F3FC-200D-27A1-FE0F",
+		"1F3C3-1F3FC-200D-27A1",
+		"1F3C3-1F3FD-200D-27A1-FE0F",
+		"1F3C3-1F3FD-200D-27A1",
+		"1F3C3-1F3FE-200D-27A1-FE0F",
+		"1F3C3-1F3FE-200D-27A1",
+		"1F3C3-1F3FF-200D-27A1-FE0F",
+		"1F3C3-1F3FF-200D-27A1",
+		"1F3C3-200D-2640-FE0F-200D-27A1-FE0F",
+		"1F3C3-200D-2640-200D-27A1-FE0F",
+		"1F3C3-200D-2640-FE0F-200D-27A1",
+		"1F3C3-200D-2640-200D-27A1",
+		"1F3C3-1F3FB-200D-2640-FE0F-200D-27A1-FE0F",
+		"1F3C3-1F3FB-200D-2640-200D-27A1-FE0F",
+		"1F3C3-1F3FB-200D-2640-FE0F-200D-27A1",
+		"1F3C3-1F3FB-200D-2640-200D-27A1",
+		"1F3C3-1F3FC-200D-2640-FE0F-200D-27A1-FE0F",
+		"1F3C3-1F3FC-200D-2640-200D-27A1-FE0F",
+		"1F3C3-1F3FC-200D-2640-FE0F-200D-27A1",
+		"1F3C3-1F3FC-200D-2640-200D-27A1",
+		"1F3C3-1F3FD-200D-2640-FE0F-200D-27A1-FE0F",
+		"1F3C3-1F3FD-200D-2640-200D-27A1-FE0F",
+		"1F3C3-1F3FD-200D-2640-FE0F-200D-27A1",
+		"1F3C3-1F3FD-200D-2640-200D-27A1",
+		"1F3C3-1F3FE-200D-2640-FE0F-200D-27A1-FE0F",
+		"1F3C3-1F3FE-200D-2640-200D-27A1-FE0F",
+		"1F3C3-1F3FE-200D-2640-FE0F-200D-27A1",
+		"1F3C3-1F3FE-200D-2640-200D-27A1",
+		"1F3C3-1F3FF-200D-2640-FE0F-200D-27A1-FE0F",
+		"1F3C3-1F3FF-200D-2640-200D-27A1-FE0F",
+		"1F3C3-1F3FF-200D-2640-FE0F-200D-27A1",
+		"1F3C3-1F3FF-200D-2640-200D-27A1",
+		"1F3C3-200D-2642-FE0F-200D-27A1-FE0F",
+		"1F3C3-200D-2642-200D-27A1-FE0F",
+		"1F3C3-200D-2642-FE0F-200D-27A1",
+		"1F3C3-200D-2642-200D-27A1",
+		"1F3C3-1F3FB-200D-2642-FE0F-200D-27A1-FE0F",
+		"1F3C3-1F3FB-200D-2642-200D-27A1-FE0F",
+		"1F3C3-1F3FB-200D-2642-FE0F-200D-27A1",
+		"1F3C3-1F3FB-200D-2642-200D-27A1",
+		"1F3C3-1F3FC-200D-2642-FE0F-200D-27A1-FE0F",
+		"1F3C3-1F3FC-200D-2642-200D-27A1-FE0F",
+		"1F3C3-1F3FC-200D-2642-FE0F-200D-27A1",
+		"1F3C3-1F3FC-200D-2642-200D-27A1",
+		"1F3C3-1F3FD-200D-2642-FE0F-200D-27A1-FE0F",
+		"1F3C3-1F3FD-200D-2642-200D-27A1-FE0F",
+		"1F3C3-1F3FD-200D-2642-FE0F-200D-27A1",
+		"1F3C3-1F3FD-200D-2642-200D-27A1",
+		"1F3C3-1F3FE-200D-2642-FE0F-200D-27A1-FE0F",
+		"1F3C3-1F3FE-200D-2642-200D-27A1-FE0F",
+		"1F3C3-1F3FE-200D-2642-FE0F-200D-27A1",
+		"1F3C3-1F3FE-200D-2642-200D-27A1",
+		"1F3C3-1F3FF-200D-2642-FE0F-200D-27A1-FE0F",
+		"1F3C3-1F3FF-200D-2642-200D-27A1-FE0F",
+		"1F3C3-1F3FF-200D-2642-FE0F-200D-27A1",
+		"1F3C3-1F3FF-200D-2642-200D-27A1",
+		"1F483",
+		"1F483-1F3FB",
+		"1F483-1F3FC",
+		"1F483-1F3FD",
+		"1F483-1F3FE",
+		"1F483-1F3FF",
+		"1F57A",
+		"1F57A-1F3FB",
+		"1F57A-1F3FC",
+		"1F57A-1F3FD",
+		"1F57A-1F3FE",
+		"1F57A-1F3FF",
+		"1F574-FE0F",
+		"1F574",
+		"1F574-1F3FB",
+		"1F574-1F3FC",
+		"1F574-1F3FD",
+		"1F574-1F3FE",
+		"1F574-1F3FF",
+		"1F46F",
+		"1F46F-200D-2642-FE0F",
+		"1F46F-200D-2642",
+		"1F46F-200D-2640-FE0F",
+		"1F46F-200D-2640",
+		"1F9D6",
+		"1F9D6-1F3FB",
+		"1F9D6-1F3FC",
+		"1F9D6-1F3FD",
+		"1F9D6-1F3FE",
+		"1F9D6-1F3FF",
+		"1F9D6-200D-2642-FE0F",
+		"1F9D6-200D-2642",
+		"1F9D6-1F3FB-200D-2642-FE0F",
+		"1F9D6-1F3FB-200D-2642",
+		"1F9D6-1F3FC-200D-2642-FE0F",
+		"1F9D6-1F3FC-200D-2642",
+		"1F9D6-1F3FD-200D-2642-FE0F",
+		"1F9D6-1F3FD-200D-2642",
+		"1F9D6-1F3FE-200D-2642-FE0F",
+		"1F9D6-1F3FE-200D-2642",
+		"1F9D6-1F3FF-200D-2642-FE0F",
+		"1F9D6-1F3FF-200D-2642",
+		"1F9D6-200D-2640-FE0F",
+		"1F9D6-200D-2640",
+		"1F9D6-1F3FB-200D-2640-FE0F",
+		"1F9D6-1F3FB-200D-2640",
+		"1F9D6-1F3FC-200D-2640-FE0F",
+		"1F9D6-1F3FC-200D-2640",
+		"1F9D6-1F3FD-200D-2640-FE0F",
+		"1F9D6-1F3FD-200D-2640",
+		"1F9D6-1F3FE-200D-2640-FE0F",
+		"1F9D6-1F3FE-200D-2640",
+		"1F9D6-1F3FF-200D-2640-FE0F",
+		"1F9D6-1F3FF-200D-2640",
+		"1F9D7",
+		"1F9D7-1F3FB",
+		"1F9D7-1F3FC",
+		"1F9D7-1F3FD",
+		"1F9D7-1F3FE",
+		"1F9D7-1F3FF",
+		"1F9D7-200D-2642-FE0F",
+		"1F9D7-200D-2642",
+		"1F9D7-1F3FB-200D-2642-FE0F",
+		"1F9D7-1F3FB-200D-2642",
+		"1F9D7-1F3FC-200D-2642-FE0F",
+		"1F9D7-1F3FC-200D-2642",
+		"1F9D7-1F3FD-200D-2642-FE0F",
+		"1F9D7-1F3FD-200D-2642",
+		"1F9D7-1F3FE-200D-2642-FE0F",
+		"1F9D7-1F3FE-200D-2642",
+		"1F9D7-1F3FF-200D-2642-FE0F",
+		"1F9D7-1F3FF-200D-2642",
+		"1F9D7-200D-2640-FE0F",
+		"1F9D7-200D-2640",
+		"1F9D7-1F3FB-200D-2640-FE0F",
+		"1F9D7-1F3FB-200D-2640",
+		"1F9D7-1F3FC-200D-2640-FE0F",
+		"1F9D7-1F3FC-200D-2640",
+		"1F9D7-1F3FD-200D-2640-FE0F",
+		"1F9D7-1F3FD-200D-2640",
+		"1F9D7-1F3FE-200D-2640-FE0F",
+		"1F9D7-1F3FE-200D-2640",
+		"1F9D7-1F3FF-200D-2640-FE0F",
+		"1F9D7-1F3FF-200D-2640",
+		"1F93A",
+		"1F3C7",
+		"1F3C7-1F3FB",
+		"1F3C7-1F3FC",
+		"1F3C7-1F3FD",
+		"1F3C7-1F3FE",
+		"1F3C7-1F3FF",
+		"26F7-FE0F",
+		"26F7",
+		"1F3C2",
+		"1F3C2-1F3FB",
+		"1F3C2-1F3FC",
+		"1F3C2-1F3FD",
+		"1F3C2-1F3FE",
+		"1F3C2-1F3FF",
+		"1F3CC-FE0F",
+		"1F3CC",
+		"1F3CC-1F3FB",
+		"1F3CC-1F3FC",
+		"1F3CC-1F3FD",
+		"1F3CC-1F3FE",
+		"1F3CC-1F3FF",
+		"1F3CC-FE0F-200D-2642-FE0F",
+		"1F3CC-200D-2642-FE0F",
+		"1F3CC-FE0F-200D-2642",
+		"1F3CC-200D-2642",
+		"1F3CC-1F3FB-200D-2642-FE0F",
+		"1F3CC-1F3FB-200D-2642",
+		"1F3CC-1F3FC-200D-2642-FE0F",
+		"1F3CC-1F3FC-200D-2642",
+		"1F3CC-1F3FD-200D-2642-FE0F",
+		"1F3CC-1F3FD-200D-2642",
+		"1F3CC-1F3FE-200D-2642-FE0F",
+		"1F3CC-1F3FE-200D-2642",
+		"1F3CC-1F3FF-200D-2642-FE0F",
+		"1F3CC-1F3FF-200D-2642",
+		"1F3CC-FE0F-200D-2640-FE0F",
+		"1F3CC-200D-2640-FE0F",
+		"1F3CC-FE0F-200D-2640",
+		"1F3CC-200D-2640",
+		"1F3CC-1F3FB-200D-2640-FE0F",
+		"1F3CC-1F3FB-200D-2640",
+		"1F3CC-1F3FC-200D-2640-FE0F",
+		"1F3CC-1F3FC-200D-2640",
+		"1F3CC-1F3FD-200D-2640-FE0F",
+		"1F3CC-1F3FD-200D-2640",
+		"1F3CC-1F3FE-200D-2640-FE0F",
+		"1F3CC-1F3FE-200D-2640",
+		"1F3CC-1F3FF-200D-2640-FE0F",
+		"1F3CC-1F3FF-200D-2640",
+		"1F3C4",
+		"1F3C4-1F3FB",
+		"1F3C4-1F3FC",
+		"1F3C4-1F3FD",
+		"1F3C4-1F3FE",
+		"1F3C4-1F3FF",
+		"1F3C4-200D-2642-FE0F",
+		"1F3C4-200D-2642",
+		"1F3C4-1F3FB-200D-2642-FE0F",
+		"1F3C4-1F3FB-200D-2642",
+		"1F3C4-1F3FC-200D-2642-FE0F",
+		"1F3C4-1F3FC-200D-2642",
+		"1F3C4-1F3FD-200D-2642-FE0F",
+		"1F3C4-1F3FD-200D-2642",
+		"1F3C4-1F3FE-200D-2642-FE0F",
+		"1F3C4-1F3FE-200D-2642",
+		"1F3C4-1F3FF-200D-2642-FE0F",
+		"1F3C4-1F3FF-200D-2642",
+		"1F3C4-200D-2640-FE0F",
+		"1F3C4-200D-2640",
+		"1F3C4-1F3FB-200D-2640-FE0F",
+		"1F3C4-1F3FB-200D-2640",
+		"1F3C4-1F3FC-200D-2640-FE0F",
+		"1F3C4-1F3FC-200D-2640",
+		"1F3C4-1F3FD-200D-2640-FE0F",
+		"1F3C4-1F3FD-200D-2640",
+		"1F3C4-1F3FE-200D-2640-FE0F",
+		"1F3C4-1F3FE-200D-2640",
+		"1F3C4-1F3FF-200D-2640-FE0F",
+		"1F3C4-1F3FF-200D-2640",
+		"1F6A3",
+		"1F6A3-1F3FB",
+		"1F6A3-1F3FC",
+		"1F6A3-1F3FD",
+		"1F6A3-1F3FE",
+		"1F6A3-1F3FF",
+		"1F6A3-200D-2642-FE0F",
+		"1F6A3-200D-2642",
+		"1F6A3-1F3FB-200D-2642-FE0F",
+		"1F6A3-1F3FB-200D-2642",
+		"1F6A3-1F3FC-200D-2642-FE0F",
+		"1F6A3-1F3FC-200D-2642",
+		"1F6A3-1F3FD-200D-2642-FE0F",
+		"1F6A3-1F3FD-200D-2642",
+		"1F6A3-1F3FE-200D-2642-FE0F",
+		"1F6A3-1F3FE-200D-2642",
+		"1F6A3-1F3FF-200D-2642-FE0F",
+		"1F6A3-1F3FF-200D-2642",
+		"1F6A3-200D-2640-FE0F",
+		"1F6A3-200D-2640",
+		"1F6A3-1F3FB-200D-2640-FE0F",
+		"1F6A3-1F3FB-200D-2640",
+		"1F6A3-1F3FC-200D-2640-FE0F",
+		"1F6A3-1F3FC-200D-2640",
+		"1F6A3-1F3FD-200D-2640-FE0F",
+		"1F6A3-1F3FD-200D-2640",
+		"1F6A3-1F3FE-200D-2640-FE0F",
+		"1F6A3-1F3FE-200D-2640",
+		"1F6A3-1F3FF-200D-2640-FE0F",
+		"1F6A3-1F3FF-200D-2640",
+		"1F3CA",
+		"1F3CA-1F3FB",
+		"1F3CA-1F3FC",
+		"1F3CA-1F3FD",
+		"1F3CA-1F3FE",
+		"1F3CA-1F3FF",
+		"1F3CA-200D-2642-FE0F",
+		"1F3CA-200D-2642",
+		"1F3CA-1F3FB-200D-2642-FE0F",
+		"1F3CA-1F3FB-200D-2642",
+		"1F3CA-1F3FC-200D-2642-FE0F",
+		"1F3CA-1F3FC-200D-2642",
+		"1F3CA-1F3FD-200D-2642-FE0F",
+		"1F3CA-1F3FD-200D-2642",
+		"1F3CA-1F3FE-200D-2642-FE0F",
+		"1F3CA-1F3FE-200D-2642",
+		"1F3CA-1F3FF-200D-2642-FE0F",
+		"1F3CA-1F3FF-200D-2642",
+		"1F3CA-200D-2640-FE0F",
+		"1F3CA-200D-2640",
+		"1F3CA-1F3FB-200D-2640-FE0F",
+		"1F3CA-1F3FB-200D-2640",
+		"1F3CA-1F3FC-200D-2640-FE0F",
+		"1F3CA-1F3FC-200D-2640",
+		"1F3CA-1F3FD-200D-2640-FE0F",
+		"1F3CA-1F3FD-200D-2640",
+		"1F3CA-1F3FE-200D-2640-FE0F",
+		"1F3CA-1F3FE-200D-2640",
+		"1F3CA-1F3FF-200D-2640-FE0F",
+		"1F3CA-1F3FF-200D-2640",
+		"26F9-FE0F",
+		"26F9",
+		"26F9-1F3FB",
+		"26F9-1F3FC",
+		"26F9-1F3FD",
+		"26F9-1F3FE",
+		"26F9-1F3FF",
+		"26F9-FE0F-200D-2642-FE0F",
+		"26F9-200D-2642-FE0F",
+		"26F9-FE0F-200D-2642",
+		"26F9-200D-2642",
+		"26F9-1F3FB-200D-2642-FE0F",
+		"26F9-1F3FB-200D-2642",
+		"26F9-1F3FC-200D-2642-FE0F",
+		"26F9-1F3FC-200D-2642",
+		"26F9-1F3FD-200D-2642-FE0F",
+		"26F9-1F3FD-200D-2642",
+		"26F9-1F3FE-200D-2642-FE0F",
+		"26F9-1F3FE-200D-2642",
+		"26F9-1F3FF-200D-2642-FE0F",
+		"26F9-1F3FF-200D-2642",
+		"26F9-FE0F-200D-2640-FE0F",
+		"26F9-200D-2640-FE0F",
+		"26F9-FE0F-200D-2640",
+		"26F9-200D-2640",
+		"26F9-1F3FB-200D-2640-FE0F",
+		"26F9-1F3FB-200D-2640",
+		"26F9-1F3FC-200D-2640-FE0F",
+		"26F9-1F3FC-200D-2640",
+		"26F9-1F3FD-200D-2640-FE0F",
+		"26F9-1F3FD-200D-2640",
+		"26F9-1F3FE-200D-2640-FE0F",
+		"26F9-1F3FE-200D-2640",
+		"26F9-1F3FF-200D-2640-FE0F",
+		"26F9-1F3FF-200D-2640",
+		"1F3CB-FE0F",
+		"1F3CB",
+		"1F3CB-1F3FB",
+		"1F3CB-1F3FC",
+		"1F3CB-1F3FD",
+		"1F3CB-1F3FE",
+		"1F3CB-1F3FF",
+		"1F3CB-FE0F-200D-2642-FE0F",
+		"1F3CB-200D-2642-FE0F",
+		"1F3CB-FE0F-200D-2642",
+		"1F3CB-200D-2642",
+		"1F3CB-1F3FB-200D-2642-FE0F",
+		"1F3CB-1F3FB-200D-2642",
+		"1F3CB-1F3FC-200D-2642-FE0F",
+		"1F3CB-1F3FC-200D-2642",
+		"1F3CB-1F3FD-200D-2642-FE0F",
+		"1F3CB-1F3FD-200D-2642",
+		"1F3CB-1F3FE-200D-2642-FE0F",
+		"1F3CB-1F3FE-200D-2642",
+		"1F3CB-1F3FF-200D-2642-FE0F",
+		"1F3CB-1F3FF-200D-2642",
+		"1F3CB-FE0F-200D-2640-FE0F",
+		"1F3CB-200D-2640-FE0F",
+		"1F3CB-FE0F-200D-2640",
+		"1F3CB-200D-2640",
+		"1F3CB-1F3FB-200D-2640-FE0F",
+		"1F3CB-1F3FB-200D-2640",
+		"1F3CB-1F3FC-200D-2640-FE0F",
+		"1F3CB-1F3FC-200D-2640",
+		"1F3CB-1F3FD-200D-2640-FE0F",
+		"1F3CB-1F3FD-200D-2640",
+		"1F3CB-1F3FE-200D-2640-FE0F",
+		"1F3CB-1F3FE-200D-2640",
+		"1F3CB-1F3FF-200D-2640-FE0F",
+		"1F3CB-1F3FF-200D-2640",
+		"1F6B4",
+		"1F6B4-1F3FB",
+		"1F6B4-1F3FC",
+		"1F6B4-1F3FD",
+		"1F6B4-1F3FE",
+		"1F6B4-1F3FF",
+		"1F6B4-200D-2642-FE0F",
+		"1F6B4-200D-2642",
+		"1F6B4-1F3FB-200D-2642-FE0F",
+		"1F6B4-1F3FB-200D-2642",
+		"1F6B4-1F3FC-200D-2642-FE0F",
+		"1F6B4-1F3FC-200D-2642",
+		"1F6B4-1F3FD-200D-2642-FE0F",
+		"1F6B4-1F3FD-200D-2642",
+		"1F6B4-1F3FE-200D-2642-FE0F",
+		"1F6B4-1F3FE-200D-2642",
+		"1F6B4-1F3FF-200D-2642-FE0F",
+		"1F6B4-1F3FF-200D-2642",
+		"1F6B4-200D-2640-FE0F",
+		"1F6B4-200D-2640",
+		"1F6B4-1F3FB-200D-2640-FE0F",
+		"1F6B4-1F3FB-200D-2640",
+		"1F6B4-1F3FC-200D-2640-FE0F",
+		"1F6B4-1F3FC-200D-2640",
+		"1F6B4-1F3FD-200D-2640-FE0F",
+		"1F6B4-1F3FD-200D-2640",
+		"1F6B4-1F3FE-200D-2640-FE0F",
+		"1F6B4-1F3FE-200D-2640",
+		"1F6B4-1F3FF-200D-2640-FE0F",
+		"1F6B4-1F3FF-200D-2640",
+		"1F6B5",
+		"1F6B5-1F3FB",
+		"1F6B5-1F3FC",
+		"1F6B5-1F3FD",
+		"1F6B5-1F3FE",
+		"1F6B5-1F3FF",
+		"1F6B5-200D-2642-FE0F",
+		"1F6B5-200D-2642",
+		"1F6B5-1F3FB-200D-2642-FE0F",
+		"1F6B5-1F3FB-200D-2642",
+		"1F6B5-1F3FC-200D-2642-FE0F",
+		"1F6B5-1F3FC-200D-2642",
+		"1F6B5-1F3FD-200D-2642-FE0F",
+		"1F6B5-1F3FD-200D-2642",
+		"1F6B5-1F3FE-200D-2642-FE0F",
+		"1F6B5-1F3FE-200D-2642",
+		"1F6B5-1F3FF-200D-2642-FE0F",
+		"1F6B5-1F3FF-200D-2642",
+		"1F6B5-200D-2640-FE0F",
+		"1F6B5-200D-2640",
+		"1F6B5-1F3FB-200D-2640-FE0F",
+		"1F6B5-1F3FB-200D-2640",
+		"1F6B5-1F3FC-200D-2640-FE0F",
+		"1F6B5-1F3FC-200D-2640",
+		"1F6B5-1F3FD-200D-2640-FE0F",
+		"1F6B5-1F3FD-200D-2640",
+		"1F6B5-1F3FE-200D-2640-FE0F",
+		"1F6B5-1F3FE-200D-2640",
+		"1F6B5-1F3FF-200D-2640-FE0F",
+		"1F6B5-1F3FF-200D-2640",
+		"1F938",
+		"1F938-1F3FB",
+		"1F938-1F3FC",
+		"1F938-1F3FD",
+		"1F938-1F3FE",
+		"1F938-1F3FF",
+		"1F938-200D-2642-FE0F",
+		"1F938-200D-2642",
+		"1F938-1F3FB-200D-2642-FE0F",
+		"1F938-1F3FB-200D-2642",
+		"1F938-1F3FC-200D-2642-FE0F",
+		"1F938-1F3FC-200D-2642",
+		"1F938-1F3FD-200D-2642-FE0F",
+		"1F938-1F3FD-200D-2642",
+		"1F938-1F3FE-200D-2642-FE0F",
+		"1F938-1F3FE-200D-2642",
+		"1F938-1F3FF-200D-2642-FE0F",
+		"1F938-1F3FF-200D-2642",
+		"1F938-200D-2640-FE0F",
+		"1F938-200D-2640",
+		"1F938-1F3FB-200D-2640-FE0F",
+		"1F938-1F3FB-200D-2640",
+		"1F938-1F3FC-200D-2640-FE0F",
+		"1F938-1F3FC-200D-2640",
+		"1F938-1F3FD-200D-2640-FE0F",
+		"1F938-1F3FD-200D-2640",
+		"1F938-1F3FE-200D-2640-FE0F",
+		"1F938-1F3FE-200D-2640",
+		"1F938-1F3FF-200D-2640-FE0F",
+		"1F938-1F3FF-200D-2640",
+		"1F93C",
+		"1F93C-200D-2642-FE0F",
+		"1F93C-200D-2642",
+		"1F93C-200D-2640-FE0F",
+		"1F93C-200D-2640",
+		"1F93D",
+		"1F93D-1F3FB",
+		"1F93D-1F3FC",
+		"1F93D-1F3FD",
+		"1F93D-1F3FE",
+		"1F93D-1F3FF",
+		"1F93D-200D-2642-FE0F",
+		"1F93D-200D-2642",
+		"1F93D-1F3FB-200D-2642-FE0F",
+		"1F93D-1F3FB-200D-2642",
+		"1F93D-1F3FC-200D-2642-FE0F",
+		"1F93D-1F3FC-200D-2642",
+		"1F93D-1F3FD-200D-2642-FE0F",
+		"1F93D-1F3FD-200D-2642",
+		"1F93D-1F3FE-200D-2642-FE0F",
+		"1F93D-1F3FE-200D-2642",
+		"1F93D-1F3FF-200D-2642-FE0F",
+		"1F93D-1F3FF-200D-2642",
+		"1F93D-200D-2640-FE0F",
+		"1F93D-200D-2640",
+		"1F93D-1F3FB-200D-2640-FE0F",
+		"1F93D-1F3FB-200D-2640",
+		"1F93D-1F3FC-200D-2640-FE0F",
+		"1F93D-1F3FC-200D-2640",
+		"1F93D-1F3FD-200D-2640-FE0F",
+		"1F93D-1F3FD-200D-2640",
+		"1F93D-1F3FE-200D-2640-FE0F",
+		"1F93D-1F3FE-200D-2640",
+		"1F93D-1F3FF-200D-2640-FE0F",
+		"1F93D-1F3FF-200D-2640",
+		"1F93E",
+		"1F93E-1F3FB",
+		"1F93E-1F3FC",
+		"1F93E-1F3FD",
+		"1F93E-1F3FE",
+		"1F93E-1F3FF",
+		"1F93E-200D-2642-FE0F",
+		"1F93E-200D-2642",
+		"1F93E-1F3FB-200D-2642-FE0F",
+		"1F93E-1F3FB-200D-2642",
+		"1F93E-1F3FC-200D-2642-FE0F",
+		"1F93E-1F3FC-200D-2642",
+		"1F93E-1F3FD-200D-2642-FE0F",
+		"1F93E-1F3FD-200D-2642",
+		"1F93E-1F3FE-200D-2642-FE0F",
+		"1F93E-1F3FE-200D-2642",
+		"1F93E-1F3FF-200D-2642-FE0F",
+		"1F93E-1F3FF-200D-2642",
+		"1F93E-200D-2640-FE0F",
+		"1F93E-200D-2640",
+		"1F93E-1F3FB-200D-2640-FE0F",
+		"1F93E-1F3FB-200D-2640",
+		"1F93E-1F3FC-200D-2640-FE0F",
+		"1F93E-1F3FC-200D-2640",
+		"1F93E-1F3FD-200D-2640-FE0F",
+		"1F93E-1F3FD-200D-2640",
+		"1F93E-1F3FE-200D-2640-FE0F",
+		"1F93E-1F3FE-200D-2640",
+		"1F93E-1F3FF-200D-2640-FE0F",
+		"1F93E-1F3FF-200D-2640",
+		"1F939",
+		"1F939-1F3FB",
+		"1F939-1F3FC",
+		"1F939-1F3FD",
+		"1F939-1F3FE",
+		"1F939-1F3FF",
+		"1F939-200D-2642-FE0F",
+		"1F939-200D-2642",
+		"1F939-1F3FB-200D-2642-FE0F",
+		"1F939-1F3FB-200D-2642",
+		"1F939-1F3FC-200D-2642-FE0F",
+		"1F939-1F3FC-200D-2642",
+		"1F939-1F3FD-200D-2642-FE0F",
+		"1F939-1F3FD-200D-2642",
+		"1F939-1F3FE-200D-2642-FE0F",
+		"1F939-1F3FE-200D-2642",
+		"1F939-1F3FF-200D-2642-FE0F",
+		"1F939-1F3FF-200D-2642",
+		"1F939-200D-2640-FE0F",
+		"1F939-200D-2640",
+		"1F939-1F3FB-200D-2640-FE0F",
+		"1F939-1F3FB-200D-2640",
+		"1F939-1F3FC-200D-2640-FE0F",
+		"1F939-1F3FC-200D-2640",
+		"1F939-1F3FD-200D-2640-FE0F",
+		"1F939-1F3FD-200D-2640",
+		"1F939-1F3FE-200D-2640-FE0F",
+		"1F939-1F3FE-200D-2640",
+		"1F939-1F3FF-200D-2640-FE0F",
+		"1F939-1F3FF-200D-2640",
+		"1F9D8",
+		"1F9D8-1F3FB",
+		"1F9D8-1F3FC",
+		"1F9D8-1F3FD",
+		"1F9D8-1F3FE",
+		"1F9D8-1F3FF",
+		"1F9D8-200D-2642-FE0F",
+		"1F9D8-200D-2642",
+		"1F9D8-1F3FB-200D-2642-FE0F",
+		"1F9D8-1F3FB-200D-2642",
+		"1F9D8-1F3FC-200D-2642-FE0F",
+		"1F9D8-1F3FC-200D-2642",
+		"1F9D8-1F3FD-200D-2642-FE0F",
+		"1F9D8-1F3FD-200D-2642",
+		"1F9D8-1F3FE-200D-2642-FE0F",
+		"1F9D8-1F3FE-200D-2642",
+		"1F9D8-1F3FF-200D-2642-FE0F",
+		"1F9D8-1F3FF-200D-2642",
+		"1F9D8-200D-2640-FE0F",
+		"1F9D8-200D-2640",
+		"1F9D8-1F3FB-200D-2640-FE0F",
+		"1F9D8-1F3FB-200D-2640",
+		"1F9D8-1F3FC-200D-2640-FE0F",
+		"1F9D8-1F3FC-200D-2640",
+		"1F9D8-1F3FD-200D-2640-FE0F",
+		"1F9D8-1F3FD-200D-2640",
+		"1F9D8-1F3FE-200D-2640-FE0F",
+		"1F9D8-1F3FE-200D-2640",
+		"1F9D8-1F3FF-200D-2640-FE0F",
+		"1F9D8-1F3FF-200D-2640",
+		"1F6C0",
+		"1F6C0-1F3FB",
+		"1F6C0-1F3FC",
+		"1F6C0-1F3FD",
+		"1F6C0-1F3FE",
+		"1F6C0-1F3FF",
+		"1F6CC",
+		"1F6CC-1F3FB",
+		"1F6CC-1F3FC",
+		"1F6CC-1F3FD",
+		"1F6CC-1F3FE",
+		"1F6CC-1F3FF",
+		"1F9D1-200D-1F91D-200D-1F9D1",
+		"1F9D1-1F3FB-200D-1F91D-200D-1F9D1-1F3FB",
+		"1F9D1-1F3FB-200D-1F91D-200D-1F9D1-1F3FC",
+		"1F9D1-1F3FB-200D-1F91D-200D-1F9D1-1F3FD",
+		"1F9D1-1F3FB-200D-1F91D-200D-1F9D1-1F3FE",
+		"1F9D1-1F3FB-200D-1F91D-200D-1F9D1-1F3FF",
+		"1F9D1-1F3FC-200D-1F91D-200D-1F9D1-1F3FB",
+		"1F9D1-1F3FC-200D-1F91D-200D-1F9D1-1F3FC",
+		"1F9D1-1F3FC-200D-1F91D-200D-1F9D1-1F3FD",
+		"1F9D1-1F3FC-200D-1F91D-200D-1F9D1-1F3FE",
+		"1F9D1-1F3FC-200D-1F91D-200D-1F9D1-1F3FF",
+		"1F9D1-1F3FD-200D-1F91D-200D-1F9D1-1F3FB",
+		"1F9D1-1F3FD-200D-1F91D-200D-1F9D1-1F3FC",
+		"1F9D1-1F3FD-200D-1F91D-200D-1F9D1-1F3FD",
+		"1F9D1-1F3FD-200D-1F91D-200D-1F9D1-1F3FE",
+		"1F9D1-1F3FD-200D-1F91D-200D-1F9D1-1F3FF",
+		"1F9D1-1F3FE-200D-1F91D-200D-1F9D1-1F3FB",
+		"1F9D1-1F3FE-200D-1F91D-200D-1F9D1-1F3FC",
+		"1F9D1-1F3FE-200D-1F91D-200D-1F9D1-1F3FD",
+		"1F9D1-1F3FE-200D-1F91D-200D-1F9D1-1F3FE",
+		"1F9D1-1F3FE-200D-1F91D-200D-1F9D1-1F3FF",
+		"1F9D1-1F3FF-200D-1F91D-200D-1F9D1-1F3FB",
+		"1F9D1-1F3FF-200D-1F91D-200D-1F9D1-1F3FC",
+		"1F9D1-1F3FF-200D-1F91D-200D-1F9D1-1F3FD",
+		"1F9D1-1F3FF-200D-1F91D-200D-1F9D1-1F3FE",
+		"1F9D1-1F3FF-200D-1F91D-200D-1F9D1-1F3FF",
+		"1F46D",
+		"1F46D-1F3FB",
+		"1F469-1F3FB-200D-1F91D-200D-1F469-1F3FC",
+		"1F469-1F3FB-200D-1F91D-200D-1F469-1F3FD",
+		"1F469-1F3FB-200D-1F91D-200D-1F469-1F3FE",
+		"1F469-1F3FB-200D-1F91D-200D-1F469-1F3FF",
+		"1F469-1F3FC-200D-1F91D-200D-1F469-1F3FB",
+		"1F46D-1F3FC",
+		"1F469-1F3FC-200D-1F91D-200D-1F469-1F3FD",
+		"1F469-1F3FC-200D-1F91D-200D-1F469-1F3FE",
+		"1F469-1F3FC-200D-1F91D-200D-1F469-1F3FF",
+		"1F469-1F3FD-200D-1F91D-200D-1F469-1F3FB",
+		"1F469-1F3FD-200D-1F91D-200D-1F469-1F3FC",
+		"1F46D-1F3FD",
+		"1F469-1F3FD-200D-1F91D-200D-1F469-1F3FE",
+		"1F469-1F3FD-200D-1F91D-200D-1F469-1F3FF",
+		"1F469-1F3FE-200D-1F91D-200D-1F469-1F3FB",
+		"1F469-1F3FE-200D-1F91D-200D-1F469-1F3FC",
+		"1F469-1F3FE-200D-1F91D-200D-1F469-1F3FD",
+		"1F46D-1F3FE",
+		"1F469-1F3FE-200D-1F91D-200D-1F469-1F3FF",
+		"1F469-1F3FF-200D-1F91D-200D-1F469-1F3FB",
+		"1F469-1F3FF-200D-1F91D-200D-1F469-1F3FC",
+		"1F469-1F3FF-200D-1F91D-200D-1F469-1F3FD",
+		"1F469-1F3FF-200D-1F91D-200D-1F469-1F3FE",
+		"1F46D-1F3FF",
+		"1F46B",
+		"1F46B-1F3FB",
+		"1F469-1F3FB-200D-1F91D-200D-1F468-1F3FC",
+		"1F469-1F3FB-200D-1F91D-200D-1F468-1F3FD",
+		"1F469-1F3FB-200D-1F91D-200D-1F468-1F3FE",
+		"1F469-1F3FB-200D-1F91D-200D-1F468-1F3FF",
+		"1F469-1F3FC-200D-1F91D-200D-1F468-1F3FB",
+		"1F46B-1F3FC",
+		"1F469-1F3FC-200D-1F91D-200D-1F468-1F3FD",
+		"1F469-1F3FC-200D-1F91D-200D-1F468-1F3FE",
+		"1F469-1F3FC-200D-1F91D-200D-1F468-1F3FF",
+		"1F469-1F3FD-200D-1F91D-200D-1F468-1F3FB",
+		"1F469-1F3FD-200D-1F91D-200D-1F468-1F3FC",
+		"1F46B-1F3FD",
+		"1F469-1F3FD-200D-1F91D-200D-1F468-1F3FE",
+		"1F469-1F3FD-200D-1F91D-200D-1F468-1F3FF",
+		"1F469-1F3FE-200D-1F91D-200D-1F468-1F3FB",
+		"1F469-1F3FE-200D-1F91D-200D-1F468-1F3FC",
+		"1F469-1F3FE-200D-1F91D-200D-1F468-1F3FD",
+		"1F46B-1F3FE",
+		"1F469-1F3FE-200D-1F91D-200D-1F468-1F3FF",
+		"1F469-1F3FF-200D-1F91D-200D-1F468-1F3FB",
+		"1F469-1F3FF-200D-1F91D-200D-1F468-1F3FC",
+		"1F469-1F3FF-200D-1F91D-200D-1F468-1F3FD",
+		"1F469-1F3FF-200D-1F91D-200D-1F468-1F3FE",
+		"1F46B-1F3FF",
+		"1F46C",
+		"1F46C-1F3FB",
+		"1F468-1F3FB-200D-1F91D-200D-1F468-1F3FC",
+		"1F468-1F3FB-200D-1F91D-200D-1F468-1F3FD",
+		"1F468-1F3FB-200D-1F91D-200D-1F468-1F3FE",
+		"1F468-1F3FB-200D-1F91D-200D-1F468-1F3FF",
+		"1F468-1F3FC-200D-1F91D-200D-1F468-1F3FB",
+		"1F46C-1F3FC",
+		"1F468-1F3FC-200D-1F91D-200D-1F468-1F3FD",
+		"1F468-1F3FC-200D-1F91D-200D-1F468-1F3FE",
+		"1F468-1F3FC-200D-1F91D-200D-1F468-1F3FF",
+		"1F468-1F3FD-200D-1F91D-200D-1F468-1F3FB",
+		"1F468-1F3FD-200D-1F91D-200D-1F468-1F3FC",
+		"1F46C-1F3FD",
+		"1F468-1F3FD-200D-1F91D-200D-1F468-1F3FE",
+		"1F468-1F3FD-200D-1F91D-200D-1F468-1F3FF",
+		"1F468-1F3FE-200D-1F91D-200D-1F468-1F3FB",
+		"1F468-1F3FE-200D-1F91D-200D-1F468-1F3FC",
+		"1F468-1F3FE-200D-1F91D-200D-1F468-1F3FD",
+		"1F46C-1F3FE",
+		"1F468-1F3FE-200D-1F91D-200D-1F468-1F3FF",
+		"1F468-1F3FF-200D-1F91D-200D-1F468-1F3FB",
+		"1F468-1F3FF-200D-1F91D-200D-1F468-1F3FC",
+		"1F468-1F3FF-200D-1F91D-200D-1F468-1F3FD",
+		"1F468-1F3FF-200D-1F91D-200D-1F468-1F3FE",
+		"1F46C-1F3FF",
+		"1F48F",
+		"1F48F-1F3FB",
+		"1F48F-1F3FC",
+		"1F48F-1F3FD",
+		"1F48F-1F3FE",
+		"1F48F-1F3FF",
+		"1F9D1-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FC",
+		"1F9D1-1F3FB-200D-2764-200D-1F48B-200D-1F9D1-1F3FC",
+		"1F9D1-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FD",
+		"1F9D1-1F3FB-200D-2764-200D-1F48B-200D-1F9D1-1F3FD",
+		"1F9D1-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FE",
+		"1F9D1-1F3FB-200D-2764-200D-1F48B-200D-1F9D1-1F3FE",
+		"1F9D1-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FF",
+		"1F9D1-1F3FB-200D-2764-200D-1F48B-200D-1F9D1-1F3FF",
+		"1F9D1-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FB",
+		"1F9D1-1F3FC-200D-2764-200D-1F48B-200D-1F9D1-1F3FB",
+		"1F9D1-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FD",
+		"1F9D1-1F3FC-200D-2764-200D-1F48B-200D-1F9D1-1F3FD",
+		"1F9D1-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FE",
+		"1F9D1-1F3FC-200D-2764-200D-1F48B-200D-1F9D1-1F3FE",
+		"1F9D1-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FF",
+		"1F9D1-1F3FC-200D-2764-200D-1F48B-200D-1F9D1-1F3FF",
+		"1F9D1-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FB",
+		"1F9D1-1F3FD-200D-2764-200D-1F48B-200D-1F9D1-1F3FB",
+		"1F9D1-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FC",
+		"1F9D1-1F3FD-200D-2764-200D-1F48B-200D-1F9D1-1F3FC",
+		"1F9D1-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FE",
+		"1F9D1-1F3FD-200D-2764-200D-1F48B-200D-1F9D1-1F3FE",
+		"1F9D1-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FF",
+		"1F9D1-1F3FD-200D-2764-200D-1F48B-200D-1F9D1-1F3FF",
+		"1F9D1-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FB",
+		"1F9D1-1F3FE-200D-2764-200D-1F48B-200D-1F9D1-1F3FB",
+		"1F9D1-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FC",
+		"1F9D1-1F3FE-200D-2764-200D-1F48B-200D-1F9D1-1F3FC",
+		"1F9D1-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FD",
+		"1F9D1-1F3FE-200D-2764-200D-1F48B-200D-1F9D1-1F3FD",
+		"1F9D1-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FF",
+		"1F9D1-1F3FE-200D-2764-200D-1F48B-200D-1F9D1-1F3FF",
+		"1F9D1-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FB",
+		"1F9D1-1F3FF-200D-2764-200D-1F48B-200D-1F9D1-1F3FB",
+		"1F9D1-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FC",
+		"1F9D1-1F3FF-200D-2764-200D-1F48B-200D-1F9D1-1F3FC",
+		"1F9D1-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FD",
+		"1F9D1-1F3FF-200D-2764-200D-1F48B-200D-1F9D1-1F3FD",
+		"1F9D1-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FE",
+		"1F9D1-1F3FF-200D-2764-200D-1F48B-200D-1F9D1-1F3FE",
+		"1F469-200D-2764-FE0F-200D-1F48B-200D-1F468",
+		"1F469-200D-2764-200D-1F48B-200D-1F468",
+		"1F469-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FB",
+		"1F469-1F3FB-200D-2764-200D-1F48B-200D-1F468-1F3FB",
+		"1F469-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FC",
+		"1F469-1F3FB-200D-2764-200D-1F48B-200D-1F468-1F3FC",
+		"1F469-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FD",
+		"1F469-1F3FB-200D-2764-200D-1F48B-200D-1F468-1F3FD",
+		"1F469-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FE",
+		"1F469-1F3FB-200D-2764-200D-1F48B-200D-1F468-1F3FE",
+		"1F469-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FF",
+		"1F469-1F3FB-200D-2764-200D-1F48B-200D-1F468-1F3FF",
+		"1F469-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FB",
+		"1F469-1F3FC-200D-2764-200D-1F48B-200D-1F468-1F3FB",
+		"1F469-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FC",
+		"1F469-1F3FC-200D-2764-200D-1F48B-200D-1F468-1F3FC",
+		"1F469-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FD",
+		"1F469-1F3FC-200D-2764-200D-1F48B-200D-1F468-1F3FD",
+		"1F469-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FE",
+		"1F469-1F3FC-200D-2764-200D-1F48B-200D-1F468-1F3FE",
+		"1F469-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FF",
+		"1F469-1F3FC-200D-2764-200D-1F48B-200D-1F468-1F3FF",
+		"1F469-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FB",
+		"1F469-1F3FD-200D-2764-200D-1F48B-200D-1F468-1F3FB",
+		"1F469-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FC",
+		"1F469-1F3FD-200D-2764-200D-1F48B-200D-1F468-1F3FC",
+		"1F469-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FD",
+		"1F469-1F3FD-200D-2764-200D-1F48B-200D-1F468-1F3FD",
+		"1F469-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FE",
+		"1F469-1F3FD-200D-2764-200D-1F48B-200D-1F468-1F3FE",
+		"1F469-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FF",
+		"1F469-1F3FD-200D-2764-200D-1F48B-200D-1F468-1F3FF",
+		"1F469-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FB",
+		"1F469-1F3FE-200D-2764-200D-1F48B-200D-1F468-1F3FB",
+		"1F469-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FC",
+		"1F469-1F3FE-200D-2764-200D-1F48B-200D-1F468-1F3FC",
+		"1F469-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FD",
+		"1F469-1F3FE-200D-2764-200D-1F48B-200D-1F468-1F3FD",
+		"1F469-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FE",
+		"1F469-1F3FE-200D-2764-200D-1F48B-200D-1F468-1F3FE",
+		"1F469-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FF",
+		"1F469-1F3FE-200D-2764-200D-1F48B-200D-1F468-1F3FF",
+		"1F469-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FB",
+		"1F469-1F3FF-200D-2764-200D-1F48B-200D-1F468-1F3FB",
+		"1F469-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FC",
+		"1F469-1F3FF-200D-2764-200D-1F48B-200D-1F468-1F3FC",
+		"1F469-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FD",
+		"1F469-1F3FF-200D-2764-200D-1F48B-200D-1F468-1F3FD",
+		"1F469-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FE",
+		"1F469-1F3FF-200D-2764-200D-1F48B-200D-1F468-1F3FE",
+		"1F469-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FF",
+		"1F469-1F3FF-200D-2764-200D-1F48B-200D-1F468-1F3FF",
+		"1F468-200D-2764-FE0F-200D-1F48B-200D-1F468",
+		"1F468-200D-2764-200D-1F48B-200D-1F468",
+		"1F468-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FB",
+		"1F468-1F3FB-200D-2764-200D-1F48B-200D-1F468-1F3FB",
+		"1F468-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FC",
+		"1F468-1F3FB-200D-2764-200D-1F48B-200D-1F468-1F3FC",
+		"1F468-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FD",
+		"1F468-1F3FB-200D-2764-200D-1F48B-200D-1F468-1F3FD",
+		"1F468-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FE",
+		"1F468-1F3FB-200D-2764-200D-1F48B-200D-1F468-1F3FE",
+		"1F468-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FF",
+		"1F468-1F3FB-200D-2764-200D-1F48B-200D-1F468-1F3FF",
+		"1F468-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FB",
+		"1F468-1F3FC-200D-2764-200D-1F48B-200D-1F468-1F3FB",
+		"1F468-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FC",
+		"1F468-1F3FC-200D-2764-200D-1F48B-200D-1F468-1F3FC",
+		"1F468-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FD",
+		"1F468-1F3FC-200D-2764-200D-1F48B-200D-1F468-1F3FD",
+		"1F468-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FE",
+		"1F468-1F3FC-200D-2764-200D-1F48B-200D-1F468-1F3FE",
+		"1F468-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FF",
+		"1F468-1F3FC-200D-2764-200D-1F48B-200D-1F468-1F3FF",
+		"1F468-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FB",
+		"1F468-1F3FD-200D-2764-200D-1F48B-200D-1F468-1F3FB",
+		"1F468-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FC",
+		"1F468-1F3FD-200D-2764-200D-1F48B-200D-1F468-1F3FC",
+		"1F468-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FD",
+		"1F468-1F3FD-200D-2764-200D-1F48B-200D-1F468-1F3FD",
+		"1F468-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FE",
+		"1F468-1F3FD-200D-2764-200D-1F48B-200D-1F468-1F3FE",
+		"1F468-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FF",
+		"1F468-1F3FD-200D-2764-200D-1F48B-200D-1F468-1F3FF",
+		"1F468-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FB",
+		"1F468-1F3FE-200D-2764-200D-1F48B-200D-1F468-1F3FB",
+		"1F468-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FC",
+		"1F468-1F3FE-200D-2764-200D-1F48B-200D-1F468-1F3FC",
+		"1F468-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FD",
+		"1F468-1F3FE-200D-2764-200D-1F48B-200D-1F468-1F3FD",
+		"1F468-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FE",
+		"1F468-1F3FE-200D-2764-200D-1F48B-200D-1F468-1F3FE",
+		"1F468-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FF",
+		"1F468-1F3FE-200D-2764-200D-1F48B-200D-1F468-1F3FF",
+		"1F468-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FB",
+		"1F468-1F3FF-200D-2764-200D-1F48B-200D-1F468-1F3FB",
+		"1F468-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FC",
+		"1F468-1F3FF-200D-2764-200D-1F48B-200D-1F468-1F3FC",
+		"1F468-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FD",
+		"1F468-1F3FF-200D-2764-200D-1F48B-200D-1F468-1F3FD",
+		"1F468-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FE",
+		"1F468-1F3FF-200D-2764-200D-1F48B-200D-1F468-1F3FE",
+		"1F468-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FF",
+		"1F468-1F3FF-200D-2764-200D-1F48B-200D-1F468-1F3FF",
+		"1F469-200D-2764-FE0F-200D-1F48B-200D-1F469",
+		"1F469-200D-2764-200D-1F48B-200D-1F469",
+		"1F469-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FB",
+		"1F469-1F3FB-200D-2764-200D-1F48B-200D-1F469-1F3FB",
+		"1F469-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FC",
+		"1F469-1F3FB-200D-2764-200D-1F48B-200D-1F469-1F3FC",
+		"1F469-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FD",
+		"1F469-1F3FB-200D-2764-200D-1F48B-200D-1F469-1F3FD",
+		"1F469-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FE",
+		"1F469-1F3FB-200D-2764-200D-1F48B-200D-1F469-1F3FE",
+		"1F469-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FF",
+		"1F469-1F3FB-200D-2764-200D-1F48B-200D-1F469-1F3FF",
+		"1F469-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FB",
+		"1F469-1F3FC-200D-2764-200D-1F48B-200D-1F469-1F3FB",
+		"1F469-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FC",
+		"1F469-1F3FC-200D-2764-200D-1F48B-200D-1F469-1F3FC",
+		"1F469-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FD",
+		"1F469-1F3FC-200D-2764-200D-1F48B-200D-1F469-1F3FD",
+		"1F469-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FE",
+		"1F469-1F3FC-200D-2764-200D-1F48B-200D-1F469-1F3FE",
+		"1F469-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FF",
+		"1F469-1F3FC-200D-2764-200D-1F48B-200D-1F469-1F3FF",
+		"1F469-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FB",
+		"1F469-1F3FD-200D-2764-200D-1F48B-200D-1F469-1F3FB",
+		"1F469-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FC",
+		"1F469-1F3FD-200D-2764-200D-1F48B-200D-1F469-1F3FC",
+		"1F469-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FD",
+		"1F469-1F3FD-200D-2764-200D-1F48B-200D-1F469-1F3FD",
+		"1F469-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FE",
+		"1F469-1F3FD-200D-2764-200D-1F48B-200D-1F469-1F3FE",
+		"1F469-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FF",
+		"1F469-1F3FD-200D-2764-200D-1F48B-200D-1F469-1F3FF",
+		"1F469-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FB",
+		"1F469-1F3FE-200D-2764-200D-1F48B-200D-1F469-1F3FB",
+		"1F469-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FC",
+		"1F469-1F3FE-200D-2764-200D-1F48B-200D-1F469-1F3FC",
+		"1F469-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FD",
+		"1F469-1F3FE-200D-2764-200D-1F48B-200D-1F469-1F3FD",
+		"1F469-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FE",
+		"1F469-1F3FE-200D-2764-200D-1F48B-200D-1F469-1F3FE",
+		"1F469-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FF",
+		"1F469-1F3FE-200D-2764-200D-1F48B-200D-1F469-1F3FF",
+		"1F469-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FB",
+		"1F469-1F3FF-200D-2764-200D-1F48B-200D-1F469-1F3FB",
+		"1F469-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FC",
+		"1F469-1F3FF-200D-2764-200D-1F48B-200D-1F469-1F3FC",
+		"1F469-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FD",
+		"1F469-1F3FF-200D-2764-200D-1F48B-200D-1F469-1F3FD",
+		"1F469-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FE",
+		"1F469-1F3FF-200D-2764-200D-1F48B-200D-1F469-1F3FE",
+		"1F469-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FF",
+		"1F469-1F3FF-200D-2764-200D-1F48B-200D-1F469-1F3FF",
+		"1F491",
+		"1F491-1F3FB",
+		"1F491-1F3FC",
+		"1F491-1F3FD",
+		"1F491-1F3FE",
+		"1F491-1F3FF",
+		"1F9D1-1F3FB-200D-2764-FE0F-200D-1F9D1-1F3FC",
+		"1F9D1-1F3FB-200D-2764-200D-1F9D1-1F3FC",
+		"1F9D1-1F3FB-200D-2764-FE0F-200D-1F9D1-1F3FD",
+		"1F9D1-1F3FB-200D-2764-200D-1F9D1-1F3FD",
+		"1F9D1-1F3FB-200D-2764-FE0F-200D-1F9D1-1F3FE",
+		"1F9D1-1F3FB-200D-2764-200D-1F9D1-1F3FE",
+		"1F9D1-1F3FB-200D-2764-FE0F-200D-1F9D1-1F3FF",
+		"1F9D1-1F3FB-200D-2764-200D-1F9D1-1F3FF",
+		"1F9D1-1F3FC-200D-2764-FE0F-200D-1F9D1-1F3FB",
+		"1F9D1-1F3FC-200D-2764-200D-1F9D1-1F3FB",
+		"1F9D1-1F3FC-200D-2764-FE0F-200D-1F9D1-1F3FD",
+		"1F9D1-1F3FC-200D-2764-200D-1F9D1-1F3FD",
+		"1F9D1-1F3FC-200D-2764-FE0F-200D-1F9D1-1F3FE",
+		"1F9D1-1F3FC-200D-2764-200D-1F9D1-1F3FE",
+		"1F9D1-1F3FC-200D-2764-FE0F-200D-1F9D1-1F3FF",
+		"1F9D1-1F3FC-200D-2764-200D-1F9D1-1F3FF",
+		"1F9D1-1F3FD-200D-2764-FE0F-200D-1F9D1-1F3FB",
+		"1F9D1-1F3FD-200D-2764-200D-1F9D1-1F3FB",
+		"1F9D1-1F3FD-200D-2764-FE0F-200D-1F9D1-1F3FC",
+		"1F9D1-1F3FD-200D-2764-200D-1F9D1-1F3FC",
+		"1F9D1-1F3FD-200D-2764-FE0F-200D-1F9D1-1F3FE",
+		"1F9D1-1F3FD-200D-2764-200D-1F9D1-1F3FE",
+		"1F9D1-1F3FD-200D-2764-FE0F-200D-1F9D1-1F3FF",
+		"1F9D1-1F3FD-200D-2764-200D-1F9D1-1F3FF",
+		"1F9D1-1F3FE-200D-2764-FE0F-200D-1F9D1-1F3FB",
+		"1F9D1-1F3FE-200D-2764-200D-1F9D1-1F3FB",
+		"1F9D1-1F3FE-200D-2764-FE0F-200D-1F9D1-1F3FC",
+		"1F9D1-1F3FE-200D-2764-200D-1F9D1-1F3FC",
+		"1F9D1-1F3FE-200D-2764-FE0F-200D-1F9D1-1F3FD",
+		"1F9D1-1F3FE-200D-2764-200D-1F9D1-1F3FD",
+		"1F9D1-1F3FE-200D-2764-FE0F-200D-1F9D1-1F3FF",
+		"1F9D1-1F3FE-200D-2764-200D-1F9D1-1F3FF",
+		"1F9D1-1F3FF-200D-2764-FE0F-200D-1F9D1-1F3FB",
+		"1F9D1-1F3FF-200D-2764-200D-1F9D1-1F3FB",
+		"1F9D1-1F3FF-200D-2764-FE0F-200D-1F9D1-1F3FC",
+		"1F9D1-1F3FF-200D-2764-200D-1F9D1-1F3FC",
+		"1F9D1-1F3FF-200D-2764-FE0F-200D-1F9D1-1F3FD",
+		"1F9D1-1F3FF-200D-2764-200D-1F9D1-1F3FD",
+		"1F9D1-1F3FF-200D-2764-FE0F-200D-1F9D1-1F3FE",
+		"1F9D1-1F3FF-200D-2764-200D-1F9D1-1F3FE",
+		"1F469-200D-2764-FE0F-200D-1F468",
+		"1F469-200D-2764-200D-1F468",
+		"1F469-1F3FB-200D-2764-FE0F-200D-1F468-1F3FB",
+		"1F469-1F3FB-200D-2764-200D-1F468-1F3FB",
+		"1F469-1F3FB-200D-2764-FE0F-200D-1F468-1F3FC",
+		"1F469-1F3FB-200D-2764-200D-1F468-1F3FC",
+		"1F469-1F3FB-200D-2764-FE0F-200D-1F468-1F3FD",
+		"1F469-1F3FB-200D-2764-200D-1F468-1F3FD",
+		"1F469-1F3FB-200D-2764-FE0F-200D-1F468-1F3FE",
+		"1F469-1F3FB-200D-2764-200D-1F468-1F3FE",
+		"1F469-1F3FB-200D-2764-FE0F-200D-1F468-1F3FF",
+		"1F469-1F3FB-200D-2764-200D-1F468-1F3FF",
+		"1F469-1F3FC-200D-2764-FE0F-200D-1F468-1F3FB",
+		"1F469-1F3FC-200D-2764-200D-1F468-1F3FB",
+		"1F469-1F3FC-200D-2764-FE0F-200D-1F468-1F3FC",
+		"1F469-1F3FC-200D-2764-200D-1F468-1F3FC",
+		"1F469-1F3FC-200D-2764-FE0F-200D-1F468-1F3FD",
+		"1F469-1F3FC-200D-2764-200D-1F468-1F3FD",
+		"1F469-1F3FC-200D-2764-FE0F-200D-1F468-1F3FE",
+		"1F469-1F3FC-200D-2764-200D-1F468-1F3FE",
+		"1F469-1F3FC-200D-2764-FE0F-200D-1F468-1F3FF",
+		"1F469-1F3FC-200D-2764-200D-1F468-1F3FF",
+		"1F469-1F3FD-200D-2764-FE0F-200D-1F468-1F3FB",
+		"1F469-1F3FD-200D-2764-200D-1F468-1F3FB",
+		"1F469-1F3FD-200D-2764-FE0F-200D-1F468-1F3FC",
+		"1F469-1F3FD-200D-2764-200D-1F468-1F3FC",
+		"1F469-1F3FD-200D-2764-FE0F-200D-1F468-1F3FD",
+		"1F469-1F3FD-200D-2764-200D-1F468-1F3FD",
+		"1F469-1F3FD-200D-2764-FE0F-200D-1F468-1F3FE",
+		"1F469-1F3FD-200D-2764-200D-1F468-1F3FE",
+		"1F469-1F3FD-200D-2764-FE0F-200D-1F468-1F3FF",
+		"1F469-1F3FD-200D-2764-200D-1F468-1F3FF",
+		"1F469-1F3FE-200D-2764-FE0F-200D-1F468-1F3FB",
+		"1F469-1F3FE-200D-2764-200D-1F468-1F3FB",
+		"1F469-1F3FE-200D-2764-FE0F-200D-1F468-1F3FC",
+		"1F469-1F3FE-200D-2764-200D-1F468-1F3FC",
+		"1F469-1F3FE-200D-2764-FE0F-200D-1F468-1F3FD",
+		"1F469-1F3FE-200D-2764-200D-1F468-1F3FD",
+		"1F469-1F3FE-200D-2764-FE0F-200D-1F468-1F3FE",
+		"1F469-1F3FE-200D-2764-200D-1F468-1F3FE",
+		"1F469-1F3FE-200D-2764-FE0F-200D-1F468-1F3FF",
+		"1F469-1F3FE-200D-2764-200D-1F468-1F3FF",
+		"1F469-1F3FF-200D-2764-FE0F-200D-1F468-1F3FB",
+		"1F469-1F3FF-200D-2764-200D-1F468-1F3FB",
+		"1F469-1F3FF-200D-2764-FE0F-200D-1F468-1F3FC",
+		"1F469-1F3FF-200D-2764-200D-1F468-1F3FC",
+		"1F469-1F3FF-200D-2764-FE0F-200D-1F468-1F3FD",
+		"1F469-1F3FF-200D-2764-200D-1F468-1F3FD",
+		"1F469-1F3FF-200D-2764-FE0F-200D-1F468-1F3FE",
+		"1F469-1F3FF-200D-2764-200D-1F468-1F3FE",
+		"1F469-1F3FF-200D-2764-FE0F-200D-1F468-1F3FF",
+		"1F469-1F3FF-200D-2764-200D-1F468-1F3FF",
+		"1F468-200D-2764-FE0F-200D-1F468",
+		"1F468-200D-2764-200D-1F468",
+		"1F468-1F3FB-200D-2764-FE0F-200D-1F468-1F3FB",
+		"1F468-1F3FB-200D-2764-200D-1F468-1F3FB",
+		"1F468-1F3FB-200D-2764-FE0F-200D-1F468-1F3FC",
+		"1F468-1F3FB-200D-2764-200D-1F468-1F3FC",
+		"1F468-1F3FB-200D-2764-FE0F-200D-1F468-1F3FD",
+		"1F468-1F3FB-200D-2764-200D-1F468-1F3FD",
+		"1F468-1F3FB-200D-2764-FE0F-200D-1F468-1F3FE",
+		"1F468-1F3FB-200D-2764-200D-1F468-1F3FE",
+		"1F468-1F3FB-200D-2764-FE0F-200D-1F468-1F3FF",
+		"1F468-1F3FB-200D-2764-200D-1F468-1F3FF",
+		"1F468-1F3FC-200D-2764-FE0F-200D-1F468-1F3FB",
+		"1F468-1F3FC-200D-2764-200D-1F468-1F3FB",
+		"1F468-1F3FC-200D-2764-FE0F-200D-1F468-1F3FC",
+		"1F468-1F3FC-200D-2764-200D-1F468-1F3FC",
+		"1F468-1F3FC-200D-2764-FE0F-200D-1F468-1F3FD",
+		"1F468-1F3FC-200D-2764-200D-1F468-1F3FD",
+		"1F468-1F3FC-200D-2764-FE0F-200D-1F468-1F3FE",
+		"1F468-1F3FC-200D-2764-200D-1F468-1F3FE",
+		"1F468-1F3FC-200D-2764-FE0F-200D-1F468-1F3FF",
+		"1F468-1F3FC-200D-2764-200D-1F468-1F3FF",
+		"1F468-1F3FD-200D-2764-FE0F-200D-1F468-1F3FB",
+		"1F468-1F3FD-200D-2764-200D-1F468-1F3FB",
+		"1F468-1F3FD-200D-2764-FE0F-200D-1F468-1F3FC",
+		"1F468-1F3FD-200D-2764-200D-1F468-1F3FC",
+		"1F468-1F3FD-200D-2764-FE0F-200D-1F468-1F3FD",
+		"1F468-1F3FD-200D-2764-200D-1F468-1F3FD",
+		"1F468-1F3FD-200D-2764-FE0F-200D-1F468-1F3FE",
+		"1F468-1F3FD-200D-2764-200D-1F468-1F3FE",
+		"1F468-1F3FD-200D-2764-FE0F-200D-1F468-1F3FF",
+		"1F468-1F3FD-200D-2764-200D-1F468-1F3FF",
+		"1F468-1F3FE-200D-2764-FE0F-200D-1F468-1F3FB",
+		"1F468-1F3FE-200D-2764-200D-1F468-1F3FB",
+		"1F468-1F3FE-200D-2764-FE0F-200D-1F468-1F3FC",
+		"1F468-1F3FE-200D-2764-200D-1F468-1F3FC",
+		"1F468-1F3FE-200D-2764-FE0F-200D-1F468-1F3FD",
+		"1F468-1F3FE-200D-2764-200D-1F468-1F3FD",
+		"1F468-1F3FE-200D-2764-FE0F-200D-1F468-1F3FE",
+		"1F468-1F3FE-200D-2764-200D-1F468-1F3FE",
+		"1F468-1F3FE-200D-2764-FE0F-200D-1F468-1F3FF",
+		"1F468-1F3FE-200D-2764-200D-1F468-1F3FF",
+		"1F468-1F3FF-200D-2764-FE0F-200D-1F468-1F3FB",
+		"1F468-1F3FF-200D-2764-200D-1F468-1F3FB",
+		"1F468-1F3FF-200D-2764-FE0F-200D-1F468-1F3FC",
+		"1F468-1F3FF-200D-2764-200D-1F468-1F3FC",
+		"1F468-1F3FF-200D-2764-FE0F-200D-1F468-1F3FD",
+		"1F468-1F3FF-200D-2764-200D-1F468-1F3FD",
+		"1F468-1F3FF-200D-2764-FE0F-200D-1F468-1F3FE",
+		"1F468-1F3FF-200D-2764-200D-1F468-1F3FE",
+		"1F468-1F3FF-200D-2764-FE0F-200D-1F468-1F3FF",
+		"1F468-1F3FF-200D-2764-200D-1F468-1F3FF",
+		"1F469-200D-2764-FE0F-200D-1F469",
+		"1F469-200D-2764-200D-1F469",
+		"1F469-1F3FB-200D-2764-FE0F-200D-1F469-1F3FB",
+		"1F469-1F3FB-200D-2764-200D-1F469-1F3FB",
+		"1F469-1F3FB-200D-2764-FE0F-200D-1F469-1F3FC",
+		"1F469-1F3FB-200D-2764-200D-1F469-1F3FC",
+		"1F469-1F3FB-200D-2764-FE0F-200D-1F469-1F3FD",
+		"1F469-1F3FB-200D-2764-200D-1F469-1F3FD",
+		"1F469-1F3FB-200D-2764-FE0F-200D-1F469-1F3FE",
+		"1F469-1F3FB-200D-2764-200D-1F469-1F3FE",
+		"1F469-1F3FB-200D-2764-FE0F-200D-1F469-1F3FF",
+		"1F469-1F3FB-200D-2764-200D-1F469-1F3FF",
+		"1F469-1F3FC-200D-2764-FE0F-200D-1F469-1F3FB",
+		"1F469-1F3FC-200D-2764-200D-1F469-1F3FB",
+		"1F469-1F3FC-200D-2764-FE0F-200D-1F469-1F3FC",
+		"1F469-1F3FC-200D-2764-200D-1F469-1F3FC",
+		"1F469-1F3FC-200D-2764-FE0F-200D-1F469-1F3FD",
+		"1F469-1F3FC-200D-2764-200D-1F469-1F3FD",
+		"1F469-1F3FC-200D-2764-FE0F-200D-1F469-1F3FE",
+		"1F469-1F3FC-200D-2764-200D-1F469-1F3FE",
+		"1F469-1F3FC-200D-2764-FE0F-200D-1F469-1F3FF",
+		"1F469-1F3FC-200D-2764-200D-1F469-1F3FF",
+		"1F469-1F3FD-200D-2764-FE0F-200D-1F469-1F3FB",
+		"1F469-1F3FD-200D-2764-200D-1F469-1F3FB",
+		"1F469-1F3FD-200D-2764-FE0F-200D-1F469-1F3FC",
+		"1F469-1F3FD-200D-2764-200D-1F469-1F3FC",
+		"1F469-1F3FD-200D-2764-FE0F-200D-1F469-1F3FD",
+		"1F469-1F3FD-200D-2764-200D-1F469-1F3FD",
+		"1F469-1F3FD-200D-2764-FE0F-200D-1F469-1F3FE",
+		"1F469-1F3FD-200D-2764-200D-1F469-1F3FE",
+		"1F469-1F3FD-200D-2764-FE0F-200D-1F469-1F3FF",
+		"1F469-1F3FD-200D-2764-200D-1F469-1F3FF",
+		"1F469-1F3FE-200D-2764-FE0F-200D-1F469-1F3FB",
+		"1F469-1F3FE-200D-2764-200D-1F469-1F3FB",
+		"1F469-1F3FE-200D-2764-FE0F-200D-1F469-1F3FC",
+		"1F469-1F3FE-200D-2764-200D-1F469-1F3FC",
+		"1F469-1F3FE-200D-2764-FE0F-200D-1F469-1F3FD",
+		"1F469-1F3FE-200D-2764-200D-1F469-1F3FD",
+		"1F469-1F3FE-200D-2764-FE0F-200D-1F469-1F3FE",
+		"1F469-1F3FE-200D-2764-200D-1F469-1F3FE",
+		"1F469-1F3FE-200D-2764-FE0F-200D-1F469-1F3FF",
+		"1F469-1F3FE-200D-2764-200D-1F469-1F3FF",
+		"1F469-1F3FF-200D-2764-FE0F-200D-1F469-1F3FB",
+		"1F469-1F3FF-200D-2764-200D-1F469-1F3FB",
+		"1F469-1F3FF-200D-2764-FE0F-200D-1F469-1F3FC",
+		"1F469-1F3FF-200D-2764-200D-1F469-1F3FC",
+		"1F469-1F3FF-200D-2764-FE0F-200D-1F469-1F3FD",
+		"1F469-1F3FF-200D-2764-200D-1F469-1F3FD",
+		"1F469-1F3FF-200D-2764-FE0F-200D-1F469-1F3FE",
+		"1F469-1F3FF-200D-2764-200D-1F469-1F3FE",
+		"1F469-1F3FF-200D-2764-FE0F-200D-1F469-1F3FF",
+		"1F469-1F3FF-200D-2764-200D-1F469-1F3FF",
+		"1F468-200D-1F469-200D-1F466",
+		"1F468-200D-1F469-200D-1F467",
+		"1F468-200D-1F469-200D-1F467-200D-1F466",
+		"1F468-200D-1F469-200D-1F466-200D-1F466",
+		"1F468-200D-1F469-200D-1F467-200D-1F467",
+		"1F468-200D-1F468-200D-1F466",
+		"1F468-200D-1F468-200D-1F467",
+		"1F468-200D-1F468-200D-1F467-200D-1F466",
+		"1F468-200D-1F468-200D-1F466-200D-1F466",
+		"1F468-200D-1F468-200D-1F467-200D-1F467",
+		"1F469-200D-1F469-200D-1F466",
+		"1F469-200D-1F469-200D-1F467",
+		"1F469-200D-1F469-200D-1F467-200D-1F466",
+		"1F469-200D-1F469-200D-1F466-200D-1F466",
+		"1F469-200D-1F469-200D-1F467-200D-1F467",
+		"1F468-200D-1F466",
+		"1F468-200D-1F466-200D-1F466",
+		"1F468-200D-1F467",
+		"1F468-200D-1F467-200D-1F466",
+		"1F468-200D-1F467-200D-1F467",
+		"1F469-200D-1F466",
+		"1F469-200D-1F466-200D-1F466",
+		"1F469-200D-1F467",
+		"1F469-200D-1F467-200D-1F466",
+		"1F469-200D-1F467-200D-1F467",
+		"1F5E3-FE0F",
+		"1F5E3",
+		"1F464",
+		"1F465",
+		"1FAC2",
+		"1F46A",
+		"1F9D1-200D-1F9D1-200D-1F9D2",
+		"1F9D1-200D-1F9D1-200D-1F9D2-200D-1F9D2",
+		"1F9D1-200D-1F9D2",
+		"1F9D1-200D-1F9D2-200D-1F9D2",
+		"1F463",
+		"1FAC6"
+	],
+	"Component": ["1F3FB", "1F3FC", "1F3FD", "1F3FE", "1F3FF", "1F9B0", "1F9B1", "1F9B3", "1F9B2"],
+	"Animals & Nature": [
+		"1F435",
+		"1F412",
+		"1F98D",
+		"1F9A7",
+		"1F436",
+		"1F415",
+		"1F9AE",
+		"1F415-200D-1F9BA",
+		"1F429",
+		"1F43A",
+		"1F98A",
+		"1F99D",
+		"1F431",
+		"1F408",
+		"1F408-200D-2B1B",
+		"1F981",
+		"1F42F",
+		"1F405",
+		"1F406",
+		"1F434",
+		"1FACE",
+		"1FACF",
+		"1F40E",
+		"1F984",
+		"1F993",
+		"1F98C",
+		"1F9AC",
+		"1F42E",
+		"1F402",
+		"1F403",
+		"1F404",
+		"1F437",
+		"1F416",
+		"1F417",
+		"1F43D",
+		"1F40F",
+		"1F411",
+		"1F410",
+		"1F42A",
+		"1F42B",
+		"1F999",
+		"1F992",
+		"1F418",
+		"1F9A3",
+		"1F98F",
+		"1F99B",
+		"1F42D",
+		"1F401",
+		"1F400",
+		"1F439",
+		"1F430",
+		"1F407",
+		"1F43F-FE0F",
+		"1F43F",
+		"1F9AB",
+		"1F994",
+		"1F987",
+		"1F43B",
+		"1F43B-200D-2744-FE0F",
+		"1F43B-200D-2744",
+		"1F428",
+		"1F43C",
+		"1F9A5",
+		"1F9A6",
+		"1F9A8",
+		"1F998",
+		"1F9A1",
+		"1F43E",
+		"1F983",
+		"1F414",
+		"1F413",
+		"1F423",
+		"1F424",
+		"1F425",
+		"1F426",
+		"1F427",
+		"1F54A-FE0F",
+		"1F54A",
+		"1F985",
+		"1F986",
+		"1F9A2",
+		"1F989",
+		"1F9A4",
+		"1FAB6",
+		"1F9A9",
+		"1F99A",
+		"1F99C",
+		"1FABD",
+		"1F426-200D-2B1B",
+		"1FABF",
+		"1F426-200D-1F525",
+		"1F438",
+		"1F40A",
+		"1F422",
+		"1F98E",
+		"1F40D",
+		"1F432",
+		"1F409",
+		"1F995",
+		"1F996",
+		"1F433",
+		"1F40B",
+		"1F42C",
+		"1F9AD",
+		"1F41F",
+		"1F420",
+		"1F421",
+		"1F988",
+		"1F419",
+		"1F41A",
+		"1FAB8",
+		"1FABC",
+		"1F980",
+		"1F99E",
+		"1F990",
+		"1F991",
+		"1F9AA",
+		"1F40C",
+		"1F98B",
+		"1F41B",
+		"1F41C",
+		"1F41D",
+		"1FAB2",
+		"1F41E",
+		"1F997",
+		"1FAB3",
+		"1F577-FE0F",
+		"1F577",
+		"1F578-FE0F",
+		"1F578",
+		"1F982",
+		"1F99F",
+		"1FAB0",
+		"1FAB1",
+		"1F9A0",
+		"1F490",
+		"1F338",
+		"1F4AE",
+		"1FAB7",
+		"1F3F5-FE0F",
+		"1F3F5",
+		"1F339",
+		"1F940",
+		"1F33A",
+		"1F33B",
+		"1F33C",
+		"1F337",
+		"1FABB",
+		"1F331",
+		"1FAB4",
+		"1F332",
+		"1F333",
+		"1F334",
+		"1F335",
+		"1F33E",
+		"1F33F",
+		"2618-FE0F",
+		"2618",
+		"1F340",
+		"1F341",
+		"1F342",
+		"1F343",
+		"1FAB9",
+		"1FABA",
+		"1F344",
+		"1FABE"
+	],
+	"Food & Drink": [
+		"1F347",
+		"1F348",
+		"1F349",
+		"1F34A",
+		"1F34B",
+		"1F34B-200D-1F7E9",
+		"1F34C",
+		"1F34D",
+		"1F96D",
+		"1F34E",
+		"1F34F",
+		"1F350",
+		"1F351",
+		"1F352",
+		"1F353",
+		"1FAD0",
+		"1F95D",
+		"1F345",
+		"1FAD2",
+		"1F965",
+		"1F951",
+		"1F346",
+		"1F954",
+		"1F955",
+		"1F33D",
+		"1F336-FE0F",
+		"1F336",
+		"1FAD1",
+		"1F952",
+		"1F96C",
+		"1F966",
+		"1F9C4",
+		"1F9C5",
+		"1F95C",
+		"1FAD8",
+		"1F330",
+		"1FADA",
+		"1FADB",
+		"1F344-200D-1F7EB",
+		"1FADC",
+		"1F35E",
+		"1F950",
+		"1F956",
+		"1FAD3",
+		"1F968",
+		"1F96F",
+		"1F95E",
+		"1F9C7",
+		"1F9C0",
+		"1F356",
+		"1F357",
+		"1F969",
+		"1F953",
+		"1F354",
+		"1F35F",
+		"1F355",
+		"1F32D",
+		"1F96A",
+		"1F32E",
+		"1F32F",
+		"1FAD4",
+		"1F959",
+		"1F9C6",
+		"1F95A",
+		"1F373",
+		"1F958",
+		"1F372",
+		"1FAD5",
+		"1F963",
+		"1F957",
+		"1F37F",
+		"1F9C8",
+		"1F9C2",
+		"1F96B",
+		"1F371",
+		"1F358",
+		"1F359",
+		"1F35A",
+		"1F35B",
+		"1F35C",
+		"1F35D",
+		"1F360",
+		"1F362",
+		"1F363",
+		"1F364",
+		"1F365",
+		"1F96E",
+		"1F361",
+		"1F95F",
+		"1F960",
+		"1F961",
+		"1F366",
+		"1F367",
+		"1F368",
+		"1F369",
+		"1F36A",
+		"1F382",
+		"1F370",
+		"1F9C1",
+		"1F967",
+		"1F36B",
+		"1F36C",
+		"1F36D",
+		"1F36E",
+		"1F36F",
+		"1F37C",
+		"1F95B",
+		"2615",
+		"1FAD6",
+		"1F375",
+		"1F376",
+		"1F37E",
+		"1F377",
+		"1F378",
+		"1F379",
+		"1F37A",
+		"1F37B",
+		"1F942",
+		"1F943",
+		"1FAD7",
+		"1F964",
+		"1F9CB",
+		"1F9C3",
+		"1F9C9",
+		"1F9CA",
+		"1F962",
+		"1F37D-FE0F",
+		"1F37D",
+		"1F374",
+		"1F944",
+		"1F52A",
+		"1FAD9",
+		"1F3FA"
+	],
+	"Travel & Places": [
+		"1F30D",
+		"1F30E",
+		"1F30F",
+		"1F310",
+		"1F5FA-FE0F",
+		"1F5FA",
+		"1F5FE",
+		"1F9ED",
+		"1F3D4-FE0F",
+		"1F3D4",
+		"26F0-FE0F",
+		"26F0",
+		"1F30B",
+		"1F5FB",
+		"1F3D5-FE0F",
+		"1F3D5",
+		"1F3D6-FE0F",
+		"1F3D6",
+		"1F3DC-FE0F",
+		"1F3DC",
+		"1F3DD-FE0F",
+		"1F3DD",
+		"1F3DE-FE0F",
+		"1F3DE",
+		"1F3DF-FE0F",
+		"1F3DF",
+		"1F3DB-FE0F",
+		"1F3DB",
+		"1F3D7-FE0F",
+		"1F3D7",
+		"1F9F1",
+		"1FAA8",
+		"1FAB5",
+		"1F6D6",
+		"1F3D8-FE0F",
+		"1F3D8",
+		"1F3DA-FE0F",
+		"1F3DA",
+		"1F3E0",
+		"1F3E1",
+		"1F3E2",
+		"1F3E3",
+		"1F3E4",
+		"1F3E5",
+		"1F3E6",
+		"1F3E8",
+		"1F3E9",
+		"1F3EA",
+		"1F3EB",
+		"1F3EC",
+		"1F3ED",
+		"1F3EF",
+		"1F3F0",
+		"1F492",
+		"1F5FC",
+		"1F5FD",
+		"26EA",
+		"1F54C",
+		"1F6D5",
+		"1F54D",
+		"26E9-FE0F",
+		"26E9",
+		"1F54B",
+		"26F2",
+		"26FA",
+		"1F301",
+		"1F303",
+		"1F3D9-FE0F",
+		"1F3D9",
+		"1F304",
+		"1F305",
+		"1F306",
+		"1F307",
+		"1F309",
+		"2668-FE0F",
+		"2668",
+		"1F3A0",
+		"1F6DD",
+		"1F3A1",
+		"1F3A2",
+		"1F488",
+		"1F3AA",
+		"1F682",
+		"1F683",
+		"1F684",
+		"1F685",
+		"1F686",
+		"1F687",
+		"1F688",
+		"1F689",
+		"1F68A",
+		"1F69D",
+		"1F69E",
+		"1F68B",
+		"1F68C",
+		"1F68D",
+		"1F68E",
+		"1F690",
+		"1F691",
+		"1F692",
+		"1F693",
+		"1F694",
+		"1F695",
+		"1F696",
+		"1F697",
+		"1F698",
+		"1F699",
+		"1F6FB",
+		"1F69A",
+		"1F69B",
+		"1F69C",
+		"1F3CE-FE0F",
+		"1F3CE",
+		"1F3CD-FE0F",
+		"1F3CD",
+		"1F6F5",
+		"1F9BD",
+		"1F9BC",
+		"1F6FA",
+		"1F6B2",
+		"1F6F4",
+		"1F6F9",
+		"1F6FC",
+		"1F68F",
+		"1F6E3-FE0F",
+		"1F6E3",
+		"1F6E4-FE0F",
+		"1F6E4",
+		"1F6E2-FE0F",
+		"1F6E2",
+		"26FD",
+		"1F6DE",
+		"1F6A8",
+		"1F6A5",
+		"1F6A6",
+		"1F6D1",
+		"1F6A7",
+		"2693",
+		"1F6DF",
+		"26F5",
+		"1F6F6",
+		"1F6A4",
+		"1F6F3-FE0F",
+		"1F6F3",
+		"26F4-FE0F",
+		"26F4",
+		"1F6E5-FE0F",
+		"1F6E5",
+		"1F6A2",
+		"2708-FE0F",
+		"2708",
+		"1F6E9-FE0F",
+		"1F6E9",
+		"1F6EB",
+		"1F6EC",
+		"1FA82",
+		"1F4BA",
+		"1F681",
+		"1F69F",
+		"1F6A0",
+		"1F6A1",
+		"1F6F0-FE0F",
+		"1F6F0",
+		"1F680",
+		"1F6F8",
+		"1F6CE-FE0F",
+		"1F6CE",
+		"1F9F3",
+		"231B",
+		"23F3",
+		"231A",
+		"23F0",
+		"23F1-FE0F",
+		"23F1",
+		"23F2-FE0F",
+		"23F2",
+		"1F570-FE0F",
+		"1F570",
+		"1F55B",
+		"1F567",
+		"1F550",
+		"1F55C",
+		"1F551",
+		"1F55D",
+		"1F552",
+		"1F55E",
+		"1F553",
+		"1F55F",
+		"1F554",
+		"1F560",
+		"1F555",
+		"1F561",
+		"1F556",
+		"1F562",
+		"1F557",
+		"1F563",
+		"1F558",
+		"1F564",
+		"1F559",
+		"1F565",
+		"1F55A",
+		"1F566",
+		"1F311",
+		"1F312",
+		"1F313",
+		"1F314",
+		"1F315",
+		"1F316",
+		"1F317",
+		"1F318",
+		"1F319",
+		"1F31A",
+		"1F31B",
+		"1F31C",
+		"1F321-FE0F",
+		"1F321",
+		"2600-FE0F",
+		"2600",
+		"1F31D",
+		"1F31E",
+		"1FA90",
+		"2B50",
+		"1F31F",
+		"1F320",
+		"1F30C",
+		"2601-FE0F",
+		"2601",
+		"26C5",
+		"26C8-FE0F",
+		"26C8",
+		"1F324-FE0F",
+		"1F324",
+		"1F325-FE0F",
+		"1F325",
+		"1F326-FE0F",
+		"1F326",
+		"1F327-FE0F",
+		"1F327",
+		"1F328-FE0F",
+		"1F328",
+		"1F329-FE0F",
+		"1F329",
+		"1F32A-FE0F",
+		"1F32A",
+		"1F32B-FE0F",
+		"1F32B",
+		"1F32C-FE0F",
+		"1F32C",
+		"1F300",
+		"1F308",
+		"1F302",
+		"2602-FE0F",
+		"2602",
+		"2614",
+		"26F1-FE0F",
+		"26F1",
+		"26A1",
+		"2744-FE0F",
+		"2744",
+		"2603-FE0F",
+		"2603",
+		"26C4",
+		"2604-FE0F",
+		"2604",
+		"1F525",
+		"1F4A7",
+		"1F30A"
+	],
+	"Activities": [
+		"1F383",
+		"1F384",
+		"1F386",
+		"1F387",
+		"1F9E8",
+		"2728",
+		"1F388",
+		"1F389",
+		"1F38A",
+		"1F38B",
+		"1F38D",
+		"1F38E",
+		"1F38F",
+		"1F390",
+		"1F391",
+		"1F9E7",
+		"1F380",
+		"1F381",
+		"1F397-FE0F",
+		"1F397",
+		"1F39F-FE0F",
+		"1F39F",
+		"1F3AB",
+		"1F396-FE0F",
+		"1F396",
+		"1F3C6",
+		"1F3C5",
+		"1F947",
+		"1F948",
+		"1F949",
+		"26BD",
+		"26BE",
+		"1F94E",
+		"1F3C0",
+		"1F3D0",
+		"1F3C8",
+		"1F3C9",
+		"1F3BE",
+		"1F94F",
+		"1F3B3",
+		"1F3CF",
+		"1F3D1",
+		"1F3D2",
+		"1F94D",
+		"1F3D3",
+		"1F3F8",
+		"1F94A",
+		"1F94B",
+		"1F945",
+		"26F3",
+		"26F8-FE0F",
+		"26F8",
+		"1F3A3",
+		"1F93F",
+		"1F3BD",
+		"1F3BF",
+		"1F6F7",
+		"1F94C",
+		"1F3AF",
+		"1FA80",
+		"1FA81",
+		"1F52B",
+		"1F3B1",
+		"1F52E",
+		"1FA84",
+		"1F3AE",
+		"1F579-FE0F",
+		"1F579",
+		"1F3B0",
+		"1F3B2",
+		"1F9E9",
+		"1F9F8",
+		"1FA85",
+		"1FAA9",
+		"1FA86",
+		"2660-FE0F",
+		"2660",
+		"2665-FE0F",
+		"2665",
+		"2666-FE0F",
+		"2666",
+		"2663-FE0F",
+		"2663",
+		"265F-FE0F",
+		"265F",
+		"1F0CF",
+		"1F004",
+		"1F3B4",
+		"1F3AD",
+		"1F5BC-FE0F",
+		"1F5BC",
+		"1F3A8",
+		"1F9F5",
+		"1FAA1",
+		"1F9F6",
+		"1FAA2"
+	],
+	"Objects": [
+		"1F453",
+		"1F576-FE0F",
+		"1F576",
+		"1F97D",
+		"1F97C",
+		"1F9BA",
+		"1F454",
+		"1F455",
+		"1F456",
+		"1F9E3",
+		"1F9E4",
+		"1F9E5",
+		"1F9E6",
+		"1F457",
+		"1F458",
+		"1F97B",
+		"1FA71",
+		"1FA72",
+		"1FA73",
+		"1F459",
+		"1F45A",
+		"1FAAD",
+		"1F45B",
+		"1F45C",
+		"1F45D",
+		"1F6CD-FE0F",
+		"1F6CD",
+		"1F392",
+		"1FA74",
+		"1F45E",
+		"1F45F",
+		"1F97E",
+		"1F97F",
+		"1F460",
+		"1F461",
+		"1FA70",
+		"1F462",
+		"1FAAE",
+		"1F451",
+		"1F452",
+		"1F3A9",
+		"1F393",
+		"1F9E2",
+		"1FA96",
+		"26D1-FE0F",
+		"26D1",
+		"1F4FF",
+		"1F484",
+		"1F48D",
+		"1F48E",
+		"1F507",
+		"1F508",
+		"1F509",
+		"1F50A",
+		"1F4E2",
+		"1F4E3",
+		"1F4EF",
+		"1F514",
+		"1F515",
+		"1F3BC",
+		"1F3B5",
+		"1F3B6",
+		"1F399-FE0F",
+		"1F399",
+		"1F39A-FE0F",
+		"1F39A",
+		"1F39B-FE0F",
+		"1F39B",
+		"1F3A4",
+		"1F3A7",
+		"1F4FB",
+		"1F3B7",
+		"1FA97",
+		"1F3B8",
+		"1F3B9",
+		"1F3BA",
+		"1F3BB",
+		"1FA95",
+		"1F941",
+		"1FA98",
+		"1FA87",
+		"1FA88",
+		"1FA89",
+		"1F4F1",
+		"1F4F2",
+		"260E-FE0F",
+		"260E",
+		"1F4DE",
+		"1F4DF",
+		"1F4E0",
+		"1F50B",
+		"1FAAB",
+		"1F50C",
+		"1F4BB",
+		"1F5A5-FE0F",
+		"1F5A5",
+		"1F5A8-FE0F",
+		"1F5A8",
+		"2328-FE0F",
+		"2328",
+		"1F5B1-FE0F",
+		"1F5B1",
+		"1F5B2-FE0F",
+		"1F5B2",
+		"1F4BD",
+		"1F4BE",
+		"1F4BF",
+		"1F4C0",
+		"1F9EE",
+		"1F3A5",
+		"1F39E-FE0F",
+		"1F39E",
+		"1F4FD-FE0F",
+		"1F4FD",
+		"1F3AC",
+		"1F4FA",
+		"1F4F7",
+		"1F4F8",
+		"1F4F9",
+		"1F4FC",
+		"1F50D",
+		"1F50E",
+		"1F56F-FE0F",
+		"1F56F",
+		"1F4A1",
+		"1F526",
+		"1F3EE",
+		"1FA94",
+		"1F4D4",
+		"1F4D5",
+		"1F4D6",
+		"1F4D7",
+		"1F4D8",
+		"1F4D9",
+		"1F4DA",
+		"1F4D3",
+		"1F4D2",
+		"1F4C3",
+		"1F4DC",
+		"1F4C4",
+		"1F4F0",
+		"1F5DE-FE0F",
+		"1F5DE",
+		"1F4D1",
+		"1F516",
+		"1F3F7-FE0F",
+		"1F3F7",
+		"1F4B0",
+		"1FA99",
+		"1F4B4",
+		"1F4B5",
+		"1F4B6",
+		"1F4B7",
+		"1F4B8",
+		"1F4B3",
+		"1F9FE",
+		"1F4B9",
+		"2709-FE0F",
+		"2709",
+		"1F4E7",
+		"1F4E8",
+		"1F4E9",
+		"1F4E4",
+		"1F4E5",
+		"1F4E6",
+		"1F4EB",
+		"1F4EA",
+		"1F4EC",
+		"1F4ED",
+		"1F4EE",
+		"1F5F3-FE0F",
+		"1F5F3",
+		"270F-FE0F",
+		"270F",
+		"2712-FE0F",
+		"2712",
+		"1F58B-FE0F",
+		"1F58B",
+		"1F58A-FE0F",
+		"1F58A",
+		"1F58C-FE0F",
+		"1F58C",
+		"1F58D-FE0F",
+		"1F58D",
+		"1F4DD",
+		"1F4BC",
+		"1F4C1",
+		"1F4C2",
+		"1F5C2-FE0F",
+		"1F5C2",
+		"1F4C5",
+		"1F4C6",
+		"1F5D2-FE0F",
+		"1F5D2",
+		"1F5D3-FE0F",
+		"1F5D3",
+		"1F4C7",
+		"1F4C8",
+		"1F4C9",
+		"1F4CA",
+		"1F4CB",
+		"1F4CC",
+		"1F4CD",
+		"1F4CE",
+		"1F587-FE0F",
+		"1F587",
+		"1F4CF",
+		"1F4D0",
+		"2702-FE0F",
+		"2702",
+		"1F5C3-FE0F",
+		"1F5C3",
+		"1F5C4-FE0F",
+		"1F5C4",
+		"1F5D1-FE0F",
+		"1F5D1",
+		"1F512",
+		"1F513",
+		"1F50F",
+		"1F510",
+		"1F511",
+		"1F5DD-FE0F",
+		"1F5DD",
+		"1F528",
+		"1FA93",
+		"26CF-FE0F",
+		"26CF",
+		"2692-FE0F",
+		"2692",
+		"1F6E0-FE0F",
+		"1F6E0",
+		"1F5E1-FE0F",
+		"1F5E1",
+		"2694-FE0F",
+		"2694",
+		"1F4A3",
+		"1FA83",
+		"1F3F9",
+		"1F6E1-FE0F",
+		"1F6E1",
+		"1FA9A",
+		"1F527",
+		"1FA9B",
+		"1F529",
+		"2699-FE0F",
+		"2699",
+		"1F5DC-FE0F",
+		"1F5DC",
+		"2696-FE0F",
+		"2696",
+		"1F9AF",
+		"1F517",
+		"26D3-FE0F-200D-1F4A5",
+		"26D3-200D-1F4A5",
+		"26D3-FE0F",
+		"26D3",
+		"1FA9D",
+		"1F9F0",
+		"1F9F2",
+		"1FA9C",
+		"1FA8F",
+		"2697-FE0F",
+		"2697",
+		"1F9EA",
+		"1F9EB",
+		"1F9EC",
+		"1F52C",
+		"1F52D",
+		"1F4E1",
+		"1F489",
+		"1FA78",
+		"1F48A",
+		"1FA79",
+		"1FA7C",
+		"1FA7A",
+		"1FA7B",
+		"1F6AA",
+		"1F6D7",
+		"1FA9E",
+		"1FA9F",
+		"1F6CF-FE0F",
+		"1F6CF",
+		"1F6CB-FE0F",
+		"1F6CB",
+		"1FA91",
+		"1F6BD",
+		"1FAA0",
+		"1F6BF",
+		"1F6C1",
+		"1FAA4",
+		"1FA92",
+		"1F9F4",
+		"1F9F7",
+		"1F9F9",
+		"1F9FA",
+		"1F9FB",
+		"1FAA3",
+		"1F9FC",
+		"1FAE7",
+		"1FAA5",
+		"1F9FD",
+		"1F9EF",
+		"1F6D2",
+		"1F6AC",
+		"26B0-FE0F",
+		"26B0",
+		"1FAA6",
+		"26B1-FE0F",
+		"26B1",
+		"1F9FF",
+		"1FAAC",
+		"1F5FF",
+		"1FAA7",
+		"1FAAA"
+	],
+	"Symbols": [
+		"1F3E7",
+		"1F6AE",
+		"1F6B0",
+		"267F",
+		"1F6B9",
+		"1F6BA",
+		"1F6BB",
+		"1F6BC",
+		"1F6BE",
+		"1F6C2",
+		"1F6C3",
+		"1F6C4",
+		"1F6C5",
+		"26A0-FE0F",
+		"26A0",
+		"1F6B8",
+		"26D4",
+		"1F6AB",
+		"1F6B3",
+		"1F6AD",
+		"1F6AF",
+		"1F6B1",
+		"1F6B7",
+		"1F4F5",
+		"1F51E",
+		"2622-FE0F",
+		"2622",
+		"2623-FE0F",
+		"2623",
+		"2B06-FE0F",
+		"2B06",
+		"2197-FE0F",
+		"2197",
+		"27A1-FE0F",
+		"27A1",
+		"2198-FE0F",
+		"2198",
+		"2B07-FE0F",
+		"2B07",
+		"2199-FE0F",
+		"2199",
+		"2B05-FE0F",
+		"2B05",
+		"2196-FE0F",
+		"2196",
+		"2195-FE0F",
+		"2195",
+		"2194-FE0F",
+		"2194",
+		"21A9-FE0F",
+		"21A9",
+		"21AA-FE0F",
+		"21AA",
+		"2934-FE0F",
+		"2934",
+		"2935-FE0F",
+		"2935",
+		"1F503",
+		"1F504",
+		"1F519",
+		"1F51A",
+		"1F51B",
+		"1F51C",
+		"1F51D",
+		"1F6D0",
+		"269B-FE0F",
+		"269B",
+		"1F549-FE0F",
+		"1F549",
+		"2721-FE0F",
+		"2721",
+		"2638-FE0F",
+		"2638",
+		"262F-FE0F",
+		"262F",
+		"271D-FE0F",
+		"271D",
+		"2626-FE0F",
+		"2626",
+		"262A-FE0F",
+		"262A",
+		"262E-FE0F",
+		"262E",
+		"1F54E",
+		"1F52F",
+		"1FAAF",
+		"2648",
+		"2649",
+		"264A",
+		"264B",
+		"264C",
+		"264D",
+		"264E",
+		"264F",
+		"2650",
+		"2651",
+		"2652",
+		"2653",
+		"26CE",
+		"1F500",
+		"1F501",
+		"1F502",
+		"25B6-FE0F",
+		"25B6",
+		"23E9",
+		"23ED-FE0F",
+		"23ED",
+		"23EF-FE0F",
+		"23EF",
+		"25C0-FE0F",
+		"25C0",
+		"23EA",
+		"23EE-FE0F",
+		"23EE",
+		"1F53C",
+		"23EB",
+		"1F53D",
+		"23EC",
+		"23F8-FE0F",
+		"23F8",
+		"23F9-FE0F",
+		"23F9",
+		"23FA-FE0F",
+		"23FA",
+		"23CF-FE0F",
+		"23CF",
+		"1F3A6",
+		"1F505",
+		"1F506",
+		"1F4F6",
+		"1F6DC",
+		"1F4F3",
+		"1F4F4",
+		"2640-FE0F",
+		"2640",
+		"2642-FE0F",
+		"2642",
+		"26A7-FE0F",
+		"26A7",
+		"2716-FE0F",
+		"2716",
+		"2795",
+		"2796",
+		"2797",
+		"1F7F0",
+		"267E-FE0F",
+		"267E",
+		"203C-FE0F",
+		"203C",
+		"2049-FE0F",
+		"2049",
+		"2753",
+		"2754",
+		"2755",
+		"2757",
+		"3030-FE0F",
+		"3030",
+		"1F4B1",
+		"1F4B2",
+		"2695-FE0F",
+		"2695",
+		"267B-FE0F",
+		"267B",
+		"269C-FE0F",
+		"269C",
+		"1F531",
+		"1F4DB",
+		"1F530",
+		"2B55",
+		"2705",
+		"2611-FE0F",
+		"2611",
+		"2714-FE0F",
+		"2714",
+		"274C",
+		"274E",
+		"27B0",
+		"27BF",
+		"303D-FE0F",
+		"303D",
+		"2733-FE0F",
+		"2733",
+		"2734-FE0F",
+		"2734",
+		"2747-FE0F",
+		"2747",
+		"00A9-FE0F",
+		"00A9",
+		"00AE-FE0F",
+		"00AE",
+		"2122-FE0F",
+		"2122",
+		"1FADF",
+		"0023-FE0F-20E3",
+		"0023-20E3",
+		"002A-FE0F-20E3",
+		"002A-20E3",
+		"0030-FE0F-20E3",
+		"0030-20E3",
+		"0031-FE0F-20E3",
+		"0031-20E3",
+		"0032-FE0F-20E3",
+		"0032-20E3",
+		"0033-FE0F-20E3",
+		"0033-20E3",
+		"0034-FE0F-20E3",
+		"0034-20E3",
+		"0035-FE0F-20E3",
+		"0035-20E3",
+		"0036-FE0F-20E3",
+		"0036-20E3",
+		"0037-FE0F-20E3",
+		"0037-20E3",
+		"0038-FE0F-20E3",
+		"0038-20E3",
+		"0039-FE0F-20E3",
+		"0039-20E3",
+		"1F51F",
+		"1F520",
+		"1F521",
+		"1F522",
+		"1F523",
+		"1F524",
+		"1F170-FE0F",
+		"1F170",
+		"1F18E",
+		"1F171-FE0F",
+		"1F171",
+		"1F191",
+		"1F192",
+		"1F193",
+		"2139-FE0F",
+		"2139",
+		"1F194",
+		"24C2-FE0F",
+		"24C2",
+		"1F195",
+		"1F196",
+		"1F17E-FE0F",
+		"1F17E",
+		"1F197",
+		"1F17F-FE0F",
+		"1F17F",
+		"1F198",
+		"1F199",
+		"1F19A",
+		"1F201",
+		"1F202-FE0F",
+		"1F202",
+		"1F237-FE0F",
+		"1F237",
+		"1F236",
+		"1F22F",
+		"1F250",
+		"1F239",
+		"1F21A",
+		"1F232",
+		"1F251",
+		"1F238",
+		"1F234",
+		"1F233",
+		"3297-FE0F",
+		"3297",
+		"3299-FE0F",
+		"3299",
+		"1F23A",
+		"1F235",
+		"1F534",
+		"1F7E0",
+		"1F7E1",
+		"1F7E2",
+		"1F535",
+		"1F7E3",
+		"1F7E4",
+		"26AB",
+		"26AA",
+		"1F7E5",
+		"1F7E7",
+		"1F7E8",
+		"1F7E9",
+		"1F7E6",
+		"1F7EA",
+		"1F7EB",
+		"2B1B",
+		"2B1C",
+		"25FC-FE0F",
+		"25FC",
+		"25FB-FE0F",
+		"25FB",
+		"25FE",
+		"25FD",
+		"25AA-FE0F",
+		"25AA",
+		"25AB-FE0F",
+		"25AB",
+		"1F536",
+		"1F537",
+		"1F538",
+		"1F539",
+		"1F53A",
+		"1F53B",
+		"1F4A0",
+		"1F518",
+		"1F533",
+		"1F532"
+	],
+	"Flags": [
+		"1F3C1",
+		"1F6A9",
+		"1F38C",
+		"1F3F4",
+		"1F3F3-FE0F",
+		"1F3F3",
+		"1F3F3-FE0F-200D-1F308",
+		"1F3F3-200D-1F308",
+		"1F3F3-FE0F-200D-26A7-FE0F",
+		"1F3F3-200D-26A7-FE0F",
+		"1F3F3-FE0F-200D-26A7",
+		"1F3F3-200D-26A7",
+		"1F3F4-200D-2620-FE0F",
+		"1F3F4-200D-2620",
+		"1F1E6-1F1E8",
+		"1F1E6-1F1E9",
+		"1F1E6-1F1EA",
+		"1F1E6-1F1EB",
+		"1F1E6-1F1EC",
+		"1F1E6-1F1EE",
+		"1F1E6-1F1F1",
+		"1F1E6-1F1F2",
+		"1F1E6-1F1F4",
+		"1F1E6-1F1F6",
+		"1F1E6-1F1F7",
+		"1F1E6-1F1F8",
+		"1F1E6-1F1F9",
+		"1F1E6-1F1FA",
+		"1F1E6-1F1FC",
+		"1F1E6-1F1FD",
+		"1F1E6-1F1FF",
+		"1F1E7-1F1E6",
+		"1F1E7-1F1E7",
+		"1F1E7-1F1E9",
+		"1F1E7-1F1EA",
+		"1F1E7-1F1EB",
+		"1F1E7-1F1EC",
+		"1F1E7-1F1ED",
+		"1F1E7-1F1EE",
+		"1F1E7-1F1EF",
+		"1F1E7-1F1F1",
+		"1F1E7-1F1F2",
+		"1F1E7-1F1F3",
+		"1F1E7-1F1F4",
+		"1F1E7-1F1F6",
+		"1F1E7-1F1F7",
+		"1F1E7-1F1F8",
+		"1F1E7-1F1F9",
+		"1F1E7-1F1FB",
+		"1F1E7-1F1FC",
+		"1F1E7-1F1FE",
+		"1F1E7-1F1FF",
+		"1F1E8-1F1E6",
+		"1F1E8-1F1E8",
+		"1F1E8-1F1E9",
+		"1F1E8-1F1EB",
+		"1F1E8-1F1EC",
+		"1F1E8-1F1ED",
+		"1F1E8-1F1EE",
+		"1F1E8-1F1F0",
+		"1F1E8-1F1F1",
+		"1F1E8-1F1F2",
+		"1F1E8-1F1F3",
+		"1F1E8-1F1F4",
+		"1F1E8-1F1F5",
+		"1F1E8-1F1F6",
+		"1F1E8-1F1F7",
+		"1F1E8-1F1FA",
+		"1F1E8-1F1FB",
+		"1F1E8-1F1FC",
+		"1F1E8-1F1FD",
+		"1F1E8-1F1FE",
+		"1F1E8-1F1FF",
+		"1F1E9-1F1EA",
+		"1F1E9-1F1EC",
+		"1F1E9-1F1EF",
+		"1F1E9-1F1F0",
+		"1F1E9-1F1F2",
+		"1F1E9-1F1F4",
+		"1F1E9-1F1FF",
+		"1F1EA-1F1E6",
+		"1F1EA-1F1E8",
+		"1F1EA-1F1EA",
+		"1F1EA-1F1EC",
+		"1F1EA-1F1ED",
+		"1F1EA-1F1F7",
+		"1F1EA-1F1F8",
+		"1F1EA-1F1F9",
+		"1F1EA-1F1FA",
+		"1F1EB-1F1EE",
+		"1F1EB-1F1EF",
+		"1F1EB-1F1F0",
+		"1F1EB-1F1F2",
+		"1F1EB-1F1F4",
+		"1F1EB-1F1F7",
+		"1F1EC-1F1E6",
+		"1F1EC-1F1E7",
+		"1F1EC-1F1E9",
+		"1F1EC-1F1EA",
+		"1F1EC-1F1EB",
+		"1F1EC-1F1EC",
+		"1F1EC-1F1ED",
+		"1F1EC-1F1EE",
+		"1F1EC-1F1F1",
+		"1F1EC-1F1F2",
+		"1F1EC-1F1F3",
+		"1F1EC-1F1F5",
+		"1F1EC-1F1F6",
+		"1F1EC-1F1F7",
+		"1F1EC-1F1F8",
+		"1F1EC-1F1F9",
+		"1F1EC-1F1FA",
+		"1F1EC-1F1FC",
+		"1F1EC-1F1FE",
+		"1F1ED-1F1F0",
+		"1F1ED-1F1F2",
+		"1F1ED-1F1F3",
+		"1F1ED-1F1F7",
+		"1F1ED-1F1F9",
+		"1F1ED-1F1FA",
+		"1F1EE-1F1E8",
+		"1F1EE-1F1E9",
+		"1F1EE-1F1EA",
+		"1F1EE-1F1F1",
+		"1F1EE-1F1F2",
+		"1F1EE-1F1F3",
+		"1F1EE-1F1F4",
+		"1F1EE-1F1F6",
+		"1F1EE-1F1F7",
+		"1F1EE-1F1F8",
+		"1F1EE-1F1F9",
+		"1F1EF-1F1EA",
+		"1F1EF-1F1F2",
+		"1F1EF-1F1F4",
+		"1F1EF-1F1F5",
+		"1F1F0-1F1EA",
+		"1F1F0-1F1EC",
+		"1F1F0-1F1ED",
+		"1F1F0-1F1EE",
+		"1F1F0-1F1F2",
+		"1F1F0-1F1F3",
+		"1F1F0-1F1F5",
+		"1F1F0-1F1F7",
+		"1F1F0-1F1FC",
+		"1F1F0-1F1FE",
+		"1F1F0-1F1FF",
+		"1F1F1-1F1E6",
+		"1F1F1-1F1E7",
+		"1F1F1-1F1E8",
+		"1F1F1-1F1EE",
+		"1F1F1-1F1F0",
+		"1F1F1-1F1F7",
+		"1F1F1-1F1F8",
+		"1F1F1-1F1F9",
+		"1F1F1-1F1FA",
+		"1F1F1-1F1FB",
+		"1F1F1-1F1FE",
+		"1F1F2-1F1E6",
+		"1F1F2-1F1E8",
+		"1F1F2-1F1E9",
+		"1F1F2-1F1EA",
+		"1F1F2-1F1EB",
+		"1F1F2-1F1EC",
+		"1F1F2-1F1ED",
+		"1F1F2-1F1F0",
+		"1F1F2-1F1F1",
+		"1F1F2-1F1F2",
+		"1F1F2-1F1F3",
+		"1F1F2-1F1F4",
+		"1F1F2-1F1F5",
+		"1F1F2-1F1F6",
+		"1F1F2-1F1F7",
+		"1F1F2-1F1F8",
+		"1F1F2-1F1F9",
+		"1F1F2-1F1FA",
+		"1F1F2-1F1FB",
+		"1F1F2-1F1FC",
+		"1F1F2-1F1FD",
+		"1F1F2-1F1FE",
+		"1F1F2-1F1FF",
+		"1F1F3-1F1E6",
+		"1F1F3-1F1E8",
+		"1F1F3-1F1EA",
+		"1F1F3-1F1EB",
+		"1F1F3-1F1EC",
+		"1F1F3-1F1EE",
+		"1F1F3-1F1F1",
+		"1F1F3-1F1F4",
+		"1F1F3-1F1F5",
+		"1F1F3-1F1F7",
+		"1F1F3-1F1FA",
+		"1F1F3-1F1FF",
+		"1F1F4-1F1F2",
+		"1F1F5-1F1E6",
+		"1F1F5-1F1EA",
+		"1F1F5-1F1EB",
+		"1F1F5-1F1EC",
+		"1F1F5-1F1ED",
+		"1F1F5-1F1F0",
+		"1F1F5-1F1F1",
+		"1F1F5-1F1F2",
+		"1F1F5-1F1F3",
+		"1F1F5-1F1F7",
+		"1F1F5-1F1F8",
+		"1F1F5-1F1F9",
+		"1F1F5-1F1FC",
+		"1F1F5-1F1FE",
+		"1F1F6-1F1E6",
+		"1F1F7-1F1EA",
+		"1F1F7-1F1F4",
+		"1F1F7-1F1F8",
+		"1F1F7-1F1FA",
+		"1F1F7-1F1FC",
+		"1F1F8-1F1E6",
+		"1F1F8-1F1E7",
+		"1F1F8-1F1E8",
+		"1F1F8-1F1E9",
+		"1F1F8-1F1EA",
+		"1F1F8-1F1EC",
+		"1F1F8-1F1ED",
+		"1F1F8-1F1EE",
+		"1F1F8-1F1EF",
+		"1F1F8-1F1F0",
+		"1F1F8-1F1F1",
+		"1F1F8-1F1F2",
+		"1F1F8-1F1F3",
+		"1F1F8-1F1F4",
+		"1F1F8-1F1F7",
+		"1F1F8-1F1F8",
+		"1F1F8-1F1F9",
+		"1F1F8-1F1FB",
+		"1F1F8-1F1FD",
+		"1F1F8-1F1FE",
+		"1F1F8-1F1FF",
+		"1F1F9-1F1E6",
+		"1F1F9-1F1E8",
+		"1F1F9-1F1E9",
+		"1F1F9-1F1EB",
+		"1F1F9-1F1EC",
+		"1F1F9-1F1ED",
+		"1F1F9-1F1EF",
+		"1F1F9-1F1F0",
+		"1F1F9-1F1F1",
+		"1F1F9-1F1F2",
+		"1F1F9-1F1F3",
+		"1F1F9-1F1F4",
+		"1F1F9-1F1F7",
+		"1F1F9-1F1F9",
+		"1F1F9-1F1FB",
+		"1F1F9-1F1FC",
+		"1F1F9-1F1FF",
+		"1F1FA-1F1E6",
+		"1F1FA-1F1EC",
+		"1F1FA-1F1F2",
+		"1F1FA-1F1F3",
+		"1F1FA-1F1F8",
+		"1F1FA-1F1FE",
+		"1F1FA-1F1FF",
+		"1F1FB-1F1E6",
+		"1F1FB-1F1E8",
+		"1F1FB-1F1EA",
+		"1F1FB-1F1EC",
+		"1F1FB-1F1EE",
+		"1F1FB-1F1F3",
+		"1F1FB-1F1FA",
+		"1F1FC-1F1EB",
+		"1F1FC-1F1F8",
+		"1F1FD-1F1F0",
+		"1F1FE-1F1EA",
+		"1F1FE-1F1F9",
+		"1F1FF-1F1E6",
+		"1F1FF-1F1F2",
+		"1F1FF-1F1FC",
+		"1F3F4-E0067-E0062-E0065-E006E-E0067-E007F",
+		"1F3F4-E0067-E0062-E0073-E0063-E0074-E007F",
+		"1F3F4-E0067-E0062-E0077-E006C-E0073-E007F"
+	]
+}

+ 1905 - 0
src/lib/emoji-shortcodes.json

@@ -0,0 +1,1905 @@
+{
+	"2049": "interrobang",
+	"2122": "tm",
+	"2139": "information_source",
+	"2194": "left_right_arrow",
+	"2195": "arrow_up_down",
+	"2196": "arrow_upper_left",
+	"2197": "arrow_upper_right",
+	"2198": "arrow_lower_right",
+	"2199": "arrow_lower_left",
+	"2328": "keyboard",
+	"2600": "sunny",
+	"2601": "cloud",
+	"2602": "umbrella",
+	"2603": "snowman",
+	"2604": "comet",
+	"2611": "ballot_box_with_check",
+	"2614": "umbrella_with_rain_drops",
+	"2615": "coffee",
+	"2618": "shamrock",
+	"2620": "skull_and_crossbones",
+	"2622": "radioactive_sign",
+	"2623": "biohazard_sign",
+	"2626": "orthodox_cross",
+	"2638": "wheel_of_dharma",
+	"2639": "white_frowning_face",
+	"2640": "female_sign",
+	"2642": "male_sign",
+	"2648": "aries",
+	"2649": "taurus",
+	"2650": "sagittarius",
+	"2651": "capricorn",
+	"2652": "aquarius",
+	"2653": "pisces",
+	"2660": "spades",
+	"2663": "clubs",
+	"2665": "hearts",
+	"2666": "diamonds",
+	"2668": "hotsprings",
+	"2692": "hammer_and_pick",
+	"2693": "anchor",
+	"2694": "crossed_swords",
+	"2695": ["medical_symbol", "staff_of_aesculapius"],
+	"2696": "scales",
+	"2697": "alembic",
+	"2699": "gear",
+	"2702": "scissors",
+	"2705": "white_check_mark",
+	"2708": "airplane",
+	"2709": ["email", "envelope"],
+	"2712": "black_nib",
+	"2714": "heavy_check_mark",
+	"2716": "heavy_multiplication_x",
+	"2721": "star_of_david",
+	"2728": "sparkles",
+	"2733": "eight_spoked_asterisk",
+	"2734": "eight_pointed_black_star",
+	"2744": "snowflake",
+	"2747": "sparkle",
+	"2753": "question",
+	"2754": "grey_question",
+	"2755": "grey_exclamation",
+	"2757": ["exclamation", "heavy_exclamation_mark"],
+	"2763": "heavy_heart_exclamation_mark_ornament",
+	"2764": "heart",
+	"2795": "heavy_plus_sign",
+	"2796": "heavy_minus_sign",
+	"2797": "heavy_division_sign",
+	"2934": "arrow_heading_up",
+	"2935": "arrow_heading_down",
+	"3030": "wavy_dash",
+	"3297": "congratulations",
+	"3299": "secret",
+	"0023-FE0F-20E3": "hash",
+	"002A-FE0F-20E3": "keycap_star",
+	"0030-FE0F-20E3": "zero",
+	"0031-FE0F-20E3": "one",
+	"0032-FE0F-20E3": "two",
+	"0033-FE0F-20E3": "three",
+	"0034-FE0F-20E3": "four",
+	"0035-FE0F-20E3": "five",
+	"0036-FE0F-20E3": "six",
+	"0037-FE0F-20E3": "seven",
+	"0038-FE0F-20E3": "eight",
+	"0039-FE0F-20E3": "nine",
+	"00A9": "copyright",
+	"00AE": "registered",
+	"1F004": "mahjong",
+	"1F0CF": "black_joker",
+	"1F170": "a",
+	"1F171": "b",
+	"1F17E": "o2",
+	"1F17F": "parking",
+	"1F18E": "ab",
+	"1F191": "cl",
+	"1F192": "cool",
+	"1F193": "free",
+	"1F194": "id",
+	"1F195": "new",
+	"1F196": "ng",
+	"1F197": "ok",
+	"1F198": "sos",
+	"1F199": "up",
+	"1F19A": "vs",
+	"1F1E6-1F1E8": "flag-ac",
+	"1F1E6-1F1E9": "flag-ad",
+	"1F1E6-1F1EA": "flag-ae",
+	"1F1E6-1F1EB": "flag-af",
+	"1F1E6-1F1EC": "flag-ag",
+	"1F1E6-1F1EE": "flag-ai",
+	"1F1E6-1F1F1": "flag-al",
+	"1F1E6-1F1F2": "flag-am",
+	"1F1E6-1F1F4": "flag-ao",
+	"1F1E6-1F1F6": "flag-aq",
+	"1F1E6-1F1F7": "flag-ar",
+	"1F1E6-1F1F8": "flag-as",
+	"1F1E6-1F1F9": "flag-at",
+	"1F1E6-1F1FA": "flag-au",
+	"1F1E6-1F1FC": "flag-aw",
+	"1F1E6-1F1FD": "flag-ax",
+	"1F1E6-1F1FF": "flag-az",
+	"1F1E7-1F1E6": "flag-ba",
+	"1F1E7-1F1E7": "flag-bb",
+	"1F1E7-1F1E9": "flag-bd",
+	"1F1E7-1F1EA": "flag-be",
+	"1F1E7-1F1EB": "flag-bf",
+	"1F1E7-1F1EC": "flag-bg",
+	"1F1E7-1F1ED": "flag-bh",
+	"1F1E7-1F1EE": "flag-bi",
+	"1F1E7-1F1EF": "flag-bj",
+	"1F1E7-1F1F1": "flag-bl",
+	"1F1E7-1F1F2": "flag-bm",
+	"1F1E7-1F1F3": "flag-bn",
+	"1F1E7-1F1F4": "flag-bo",
+	"1F1E7-1F1F6": "flag-bq",
+	"1F1E7-1F1F7": "flag-br",
+	"1F1E7-1F1F8": "flag-bs",
+	"1F1E7-1F1F9": "flag-bt",
+	"1F1E7-1F1FB": "flag-bv",
+	"1F1E7-1F1FC": "flag-bw",
+	"1F1E7-1F1FE": "flag-by",
+	"1F1E7-1F1FF": "flag-bz",
+	"1F1E8-1F1E6": "flag-ca",
+	"1F1E8-1F1E8": "flag-cc",
+	"1F1E8-1F1E9": "flag-cd",
+	"1F1E8-1F1EB": "flag-cf",
+	"1F1E8-1F1EC": "flag-cg",
+	"1F1E8-1F1ED": "flag-ch",
+	"1F1E8-1F1EE": "flag-ci",
+	"1F1E8-1F1F0": "flag-ck",
+	"1F1E8-1F1F1": "flag-cl",
+	"1F1E8-1F1F2": "flag-cm",
+	"1F1E8-1F1F3": ["cn", "flag-cn"],
+	"1F1E8-1F1F4": "flag-co",
+	"1F1E8-1F1F5": "flag-cp",
+	"1F1E8-1F1F7": "flag-cr",
+	"1F1E8-1F1FA": "flag-cu",
+	"1F1E8-1F1FB": "flag-cv",
+	"1F1E8-1F1FC": "flag-cw",
+	"1F1E8-1F1FD": "flag-cx",
+	"1F1E8-1F1FE": "flag-cy",
+	"1F1E8-1F1FF": "flag-cz",
+	"1F1E9-1F1EA": ["de", "flag-de"],
+	"1F1E9-1F1EC": "flag-dg",
+	"1F1E9-1F1EF": "flag-dj",
+	"1F1E9-1F1F0": "flag-dk",
+	"1F1E9-1F1F2": "flag-dm",
+	"1F1E9-1F1F4": "flag-do",
+	"1F1E9-1F1FF": "flag-dz",
+	"1F1EA-1F1E6": "flag-ea",
+	"1F1EA-1F1E8": "flag-ec",
+	"1F1EA-1F1EA": "flag-ee",
+	"1F1EA-1F1EC": "flag-eg",
+	"1F1EA-1F1ED": "flag-eh",
+	"1F1EA-1F1F7": "flag-er",
+	"1F1EA-1F1F8": ["es", "flag-es"],
+	"1F1EA-1F1F9": "flag-et",
+	"1F1EA-1F1FA": "flag-eu",
+	"1F1EB-1F1EE": "flag-fi",
+	"1F1EB-1F1EF": "flag-fj",
+	"1F1EB-1F1F0": "flag-fk",
+	"1F1EB-1F1F2": "flag-fm",
+	"1F1EB-1F1F4": "flag-fo",
+	"1F1EB-1F1F7": ["fr", "flag-fr"],
+	"1F1EC-1F1E6": "flag-ga",
+	"1F1EC-1F1E7": ["gb", "uk", "flag-gb"],
+	"1F1EC-1F1E9": "flag-gd",
+	"1F1EC-1F1EA": "flag-ge",
+	"1F1EC-1F1EB": "flag-gf",
+	"1F1EC-1F1EC": "flag-gg",
+	"1F1EC-1F1ED": "flag-gh",
+	"1F1EC-1F1EE": "flag-gi",
+	"1F1EC-1F1F1": "flag-gl",
+	"1F1EC-1F1F2": "flag-gm",
+	"1F1EC-1F1F3": "flag-gn",
+	"1F1EC-1F1F5": "flag-gp",
+	"1F1EC-1F1F6": "flag-gq",
+	"1F1EC-1F1F7": "flag-gr",
+	"1F1EC-1F1F8": "flag-gs",
+	"1F1EC-1F1F9": "flag-gt",
+	"1F1EC-1F1FA": "flag-gu",
+	"1F1EC-1F1FC": "flag-gw",
+	"1F1EC-1F1FE": "flag-gy",
+	"1F1ED-1F1F0": "flag-hk",
+	"1F1ED-1F1F2": "flag-hm",
+	"1F1ED-1F1F3": "flag-hn",
+	"1F1ED-1F1F7": "flag-hr",
+	"1F1ED-1F1F9": "flag-ht",
+	"1F1ED-1F1FA": "flag-hu",
+	"1F1EE-1F1E8": "flag-ic",
+	"1F1EE-1F1E9": "flag-id",
+	"1F1EE-1F1EA": "flag-ie",
+	"1F1EE-1F1F1": "flag-il",
+	"1F1EE-1F1F2": "flag-im",
+	"1F1EE-1F1F3": "flag-in",
+	"1F1EE-1F1F4": "flag-io",
+	"1F1EE-1F1F6": "flag-iq",
+	"1F1EE-1F1F7": "flag-ir",
+	"1F1EE-1F1F8": "flag-is",
+	"1F1EE-1F1F9": ["it", "flag-it"],
+	"1F1EF-1F1EA": "flag-je",
+	"1F1EF-1F1F2": "flag-jm",
+	"1F1EF-1F1F4": "flag-jo",
+	"1F1EF-1F1F5": ["jp", "flag-jp"],
+	"1F1F0-1F1EA": "flag-ke",
+	"1F1F0-1F1EC": "flag-kg",
+	"1F1F0-1F1ED": "flag-kh",
+	"1F1F0-1F1EE": "flag-ki",
+	"1F1F0-1F1F2": "flag-km",
+	"1F1F0-1F1F3": "flag-kn",
+	"1F1F0-1F1F5": "flag-kp",
+	"1F1F0-1F1F7": ["kr", "flag-kr"],
+	"1F1F0-1F1FC": "flag-kw",
+	"1F1F0-1F1FE": "flag-ky",
+	"1F1F0-1F1FF": "flag-kz",
+	"1F1F1-1F1E6": "flag-la",
+	"1F1F1-1F1E7": "flag-lb",
+	"1F1F1-1F1E8": "flag-lc",
+	"1F1F1-1F1EE": "flag-li",
+	"1F1F1-1F1F0": "flag-lk",
+	"1F1F1-1F1F7": "flag-lr",
+	"1F1F1-1F1F8": "flag-ls",
+	"1F1F1-1F1F9": "flag-lt",
+	"1F1F1-1F1FA": "flag-lu",
+	"1F1F1-1F1FB": "flag-lv",
+	"1F1F1-1F1FE": "flag-ly",
+	"1F1F2-1F1E6": "flag-ma",
+	"1F1F2-1F1E8": "flag-mc",
+	"1F1F2-1F1E9": "flag-md",
+	"1F1F2-1F1EA": "flag-me",
+	"1F1F2-1F1EB": "flag-mf",
+	"1F1F2-1F1EC": "flag-mg",
+	"1F1F2-1F1ED": "flag-mh",
+	"1F1F2-1F1F0": "flag-mk",
+	"1F1F2-1F1F1": "flag-ml",
+	"1F1F2-1F1F2": "flag-mm",
+	"1F1F2-1F1F3": "flag-mn",
+	"1F1F2-1F1F4": "flag-mo",
+	"1F1F2-1F1F5": "flag-mp",
+	"1F1F2-1F1F6": "flag-mq",
+	"1F1F2-1F1F7": "flag-mr",
+	"1F1F2-1F1F8": "flag-ms",
+	"1F1F2-1F1F9": "flag-mt",
+	"1F1F2-1F1FA": "flag-mu",
+	"1F1F2-1F1FB": "flag-mv",
+	"1F1F2-1F1FC": "flag-mw",
+	"1F1F2-1F1FD": "flag-mx",
+	"1F1F2-1F1FE": "flag-my",
+	"1F1F2-1F1FF": "flag-mz",
+	"1F1F3-1F1E6": "flag-na",
+	"1F1F3-1F1E8": "flag-nc",
+	"1F1F3-1F1EA": "flag-ne",
+	"1F1F3-1F1EB": "flag-nf",
+	"1F1F3-1F1EC": "flag-ng",
+	"1F1F3-1F1EE": "flag-ni",
+	"1F1F3-1F1F1": "flag-nl",
+	"1F1F3-1F1F4": "flag-no",
+	"1F1F3-1F1F5": "flag-np",
+	"1F1F3-1F1F7": "flag-nr",
+	"1F1F3-1F1FA": "flag-nu",
+	"1F1F3-1F1FF": "flag-nz",
+	"1F1F4-1F1F2": "flag-om",
+	"1F1F5-1F1E6": "flag-pa",
+	"1F1F5-1F1EA": "flag-pe",
+	"1F1F5-1F1EB": "flag-pf",
+	"1F1F5-1F1EC": "flag-pg",
+	"1F1F5-1F1ED": "flag-ph",
+	"1F1F5-1F1F0": "flag-pk",
+	"1F1F5-1F1F1": "flag-pl",
+	"1F1F5-1F1F2": "flag-pm",
+	"1F1F5-1F1F3": "flag-pn",
+	"1F1F5-1F1F7": "flag-pr",
+	"1F1F5-1F1F8": "flag-ps",
+	"1F1F5-1F1F9": "flag-pt",
+	"1F1F5-1F1FC": "flag-pw",
+	"1F1F5-1F1FE": "flag-py",
+	"1F1F6-1F1E6": "flag-qa",
+	"1F1F7-1F1EA": "flag-re",
+	"1F1F7-1F1F4": "flag-ro",
+	"1F1F7-1F1F8": "flag-rs",
+	"1F1F7-1F1FA": ["ru", "flag-ru"],
+	"1F1F7-1F1FC": "flag-rw",
+	"1F1F8-1F1E6": "flag-sa",
+	"1F1F8-1F1E7": "flag-sb",
+	"1F1F8-1F1E8": "flag-sc",
+	"1F1F8-1F1E9": "flag-sd",
+	"1F1F8-1F1EA": "flag-se",
+	"1F1F8-1F1EC": "flag-sg",
+	"1F1F8-1F1ED": "flag-sh",
+	"1F1F8-1F1EE": "flag-si",
+	"1F1F8-1F1EF": "flag-sj",
+	"1F1F8-1F1F0": "flag-sk",
+	"1F1F8-1F1F1": "flag-sl",
+	"1F1F8-1F1F2": "flag-sm",
+	"1F1F8-1F1F3": "flag-sn",
+	"1F1F8-1F1F4": "flag-so",
+	"1F1F8-1F1F7": "flag-sr",
+	"1F1F8-1F1F8": "flag-ss",
+	"1F1F8-1F1F9": "flag-st",
+	"1F1F8-1F1FB": "flag-sv",
+	"1F1F8-1F1FD": "flag-sx",
+	"1F1F8-1F1FE": "flag-sy",
+	"1F1F8-1F1FF": "flag-sz",
+	"1F1F9-1F1E6": "flag-ta",
+	"1F1F9-1F1E8": "flag-tc",
+	"1F1F9-1F1E9": "flag-td",
+	"1F1F9-1F1EB": "flag-tf",
+	"1F1F9-1F1EC": "flag-tg",
+	"1F1F9-1F1ED": "flag-th",
+	"1F1F9-1F1EF": "flag-tj",
+	"1F1F9-1F1F0": "flag-tk",
+	"1F1F9-1F1F1": "flag-tl",
+	"1F1F9-1F1F2": "flag-tm",
+	"1F1F9-1F1F3": "flag-tn",
+	"1F1F9-1F1F4": "flag-to",
+	"1F1F9-1F1F7": "flag-tr",
+	"1F1F9-1F1F9": "flag-tt",
+	"1F1F9-1F1FB": "flag-tv",
+	"1F1F9-1F1FC": "flag-tw",
+	"1F1F9-1F1FF": "flag-tz",
+	"1F1FA-1F1E6": "flag-ua",
+	"1F1FA-1F1EC": "flag-ug",
+	"1F1FA-1F1F2": "flag-um",
+	"1F1FA-1F1F3": "flag-un",
+	"1F1FA-1F1F8": ["us", "flag-us"],
+	"1F1FA-1F1FE": "flag-uy",
+	"1F1FA-1F1FF": "flag-uz",
+	"1F1FB-1F1E6": "flag-va",
+	"1F1FB-1F1E8": "flag-vc",
+	"1F1FB-1F1EA": "flag-ve",
+	"1F1FB-1F1EC": "flag-vg",
+	"1F1FB-1F1EE": "flag-vi",
+	"1F1FB-1F1F3": "flag-vn",
+	"1F1FB-1F1FA": "flag-vu",
+	"1F1FC-1F1EB": "flag-wf",
+	"1F1FC-1F1F8": "flag-ws",
+	"1F1FD-1F1F0": "flag-xk",
+	"1F1FE-1F1EA": "flag-ye",
+	"1F1FE-1F1F9": "flag-yt",
+	"1F1FF-1F1E6": "flag-za",
+	"1F1FF-1F1F2": "flag-zm",
+	"1F1FF-1F1FC": "flag-zw",
+	"1F201": "koko",
+	"1F202": "sa",
+	"1F21A": "u7121",
+	"1F22F": "u6307",
+	"1F232": "u7981",
+	"1F233": "u7a7a",
+	"1F234": "u5408",
+	"1F235": "u6e80",
+	"1F236": "u6709",
+	"1F237": "u6708",
+	"1F238": "u7533",
+	"1F239": "u5272",
+	"1F23A": "u55b6",
+	"1F250": "ideograph_advantage",
+	"1F251": "accept",
+	"1F300": "cyclone",
+	"1F301": "foggy",
+	"1F302": "closed_umbrella",
+	"1F303": "night_with_stars",
+	"1F304": "sunrise_over_mountains",
+	"1F305": "sunrise",
+	"1F306": "city_sunset",
+	"1F307": "city_sunrise",
+	"1F308": "rainbow",
+	"1F309": "bridge_at_night",
+	"1F30A": "ocean",
+	"1F30B": "volcano",
+	"1F30C": "milky_way",
+	"1F30D": "earth_africa",
+	"1F30E": "earth_americas",
+	"1F30F": "earth_asia",
+	"1F310": "globe_with_meridians",
+	"1F311": "new_moon",
+	"1F312": "waxing_crescent_moon",
+	"1F313": "first_quarter_moon",
+	"1F314": ["moon", "waxing_gibbous_moon"],
+	"1F315": "full_moon",
+	"1F316": "waning_gibbous_moon",
+	"1F317": "last_quarter_moon",
+	"1F318": "waning_crescent_moon",
+	"1F319": "crescent_moon",
+	"1F31A": "new_moon_with_face",
+	"1F31B": "first_quarter_moon_with_face",
+	"1F31C": "last_quarter_moon_with_face",
+	"1F31D": "full_moon_with_face",
+	"1F31E": "sun_with_face",
+	"1F31F": "star2",
+	"1F320": "stars",
+	"1F321": "thermometer",
+	"1F324": ["mostly_sunny", "sun_small_cloud"],
+	"1F325": ["barely_sunny", "sun_behind_cloud"],
+	"1F326": ["partly_sunny_rain", "sun_behind_rain_cloud"],
+	"1F327": "rain_cloud",
+	"1F328": "snow_cloud",
+	"1F329": ["lightning", "lightning_cloud"],
+	"1F32A": ["tornado", "tornado_cloud"],
+	"1F32B": "fog",
+	"1F32C": "wind_blowing_face",
+	"1F32D": "hotdog",
+	"1F32E": "taco",
+	"1F32F": "burrito",
+	"1F330": "chestnut",
+	"1F331": "seedling",
+	"1F332": "evergreen_tree",
+	"1F333": "deciduous_tree",
+	"1F334": "palm_tree",
+	"1F335": "cactus",
+	"1F336": "hot_pepper",
+	"1F337": "tulip",
+	"1F338": "cherry_blossom",
+	"1F339": "rose",
+	"1F33A": "hibiscus",
+	"1F33B": "sunflower",
+	"1F33C": "blossom",
+	"1F33D": "corn",
+	"1F33E": "ear_of_rice",
+	"1F33F": "herb",
+	"1F340": "four_leaf_clover",
+	"1F341": "maple_leaf",
+	"1F342": "fallen_leaf",
+	"1F343": "leaves",
+	"1F344-200D-1F7EB": "brown_mushroom",
+	"1F344": "mushroom",
+	"1F345": "tomato",
+	"1F346": "eggplant",
+	"1F347": "grapes",
+	"1F348": "melon",
+	"1F349": "watermelon",
+	"1F34A": "tangerine",
+	"1F34B-200D-1F7E9": "lime",
+	"1F34B": "lemon",
+	"1F34C": "banana",
+	"1F34D": "pineapple",
+	"1F34E": "apple",
+	"1F34F": "green_apple",
+	"1F350": "pear",
+	"1F351": "peach",
+	"1F352": "cherries",
+	"1F353": "strawberry",
+	"1F354": "hamburger",
+	"1F355": "pizza",
+	"1F356": "meat_on_bone",
+	"1F357": "poultry_leg",
+	"1F358": "rice_cracker",
+	"1F359": "rice_ball",
+	"1F35A": "rice",
+	"1F35B": "curry",
+	"1F35C": "ramen",
+	"1F35D": "spaghetti",
+	"1F35E": "bread",
+	"1F35F": "fries",
+	"1F360": "sweet_potato",
+	"1F361": "dango",
+	"1F362": "oden",
+	"1F363": "sushi",
+	"1F364": "fried_shrimp",
+	"1F365": "fish_cake",
+	"1F366": "icecream",
+	"1F367": "shaved_ice",
+	"1F368": "ice_cream",
+	"1F369": "doughnut",
+	"1F36A": "cookie",
+	"1F36B": "chocolate_bar",
+	"1F36C": "candy",
+	"1F36D": "lollipop",
+	"1F36E": "custard",
+	"1F36F": "honey_pot",
+	"1F370": "cake",
+	"1F371": "bento",
+	"1F372": "stew",
+	"1F373": ["fried_egg", "cooking"],
+	"1F374": "fork_and_knife",
+	"1F375": "tea",
+	"1F376": "sake",
+	"1F377": "wine_glass",
+	"1F378": "cocktail",
+	"1F379": "tropical_drink",
+	"1F37A": "beer",
+	"1F37B": "beers",
+	"1F37C": "baby_bottle",
+	"1F37D": "knife_fork_plate",
+	"1F37E": "champagne",
+	"1F37F": "popcorn",
+	"1F380": "ribbon",
+	"1F381": "gift",
+	"1F382": "birthday",
+	"1F383": "jack_o_lantern",
+	"1F384": "christmas_tree",
+	"1F385": "santa",
+	"1F386": "fireworks",
+	"1F387": "sparkler",
+	"1F388": "balloon",
+	"1F389": "tada",
+	"1F38A": "confetti_ball",
+	"1F38B": "tanabata_tree",
+	"1F38C": "crossed_flags",
+	"1F38D": "bamboo",
+	"1F38E": "dolls",
+	"1F38F": "flags",
+	"1F390": "wind_chime",
+	"1F391": "rice_scene",
+	"1F392": "school_satchel",
+	"1F393": "mortar_board",
+	"1F396": "medal",
+	"1F397": "reminder_ribbon",
+	"1F399": "studio_microphone",
+	"1F39A": "level_slider",
+	"1F39B": "control_knobs",
+	"1F39E": "film_frames",
+	"1F39F": "admission_tickets",
+	"1F3A0": "carousel_horse",
+	"1F3A1": "ferris_wheel",
+	"1F3A2": "roller_coaster",
+	"1F3A3": "fishing_pole_and_fish",
+	"1F3A4": "microphone",
+	"1F3A5": "movie_camera",
+	"1F3A6": "cinema",
+	"1F3A7": "headphones",
+	"1F3A8": "art",
+	"1F3A9": "tophat",
+	"1F3AA": "circus_tent",
+	"1F3AB": "ticket",
+	"1F3AC": "clapper",
+	"1F3AD": "performing_arts",
+	"1F3AE": "video_game",
+	"1F3AF": "dart",
+	"1F3B0": "slot_machine",
+	"1F3B1": "8ball",
+	"1F3B2": "game_die",
+	"1F3B3": "bowling",
+	"1F3B4": "flower_playing_cards",
+	"1F3B5": "musical_note",
+	"1F3B6": "notes",
+	"1F3B7": "saxophone",
+	"1F3B8": "guitar",
+	"1F3B9": "musical_keyboard",
+	"1F3BA": "trumpet",
+	"1F3BB": "violin",
+	"1F3BC": "musical_score",
+	"1F3BD": "running_shirt_with_sash",
+	"1F3BE": "tennis",
+	"1F3BF": "ski",
+	"1F3C0": "basketball",
+	"1F3C1": "checkered_flag",
+	"1F3C2": "snowboarder",
+	"1F3C3-200D-2640-FE0F": "woman-running",
+	"1F3C3-200D-2640-FE0F-200D-27A1-FE0F": "woman_running_facing_right",
+	"1F3C3-200D-2642-FE0F": "man-running",
+	"1F3C3-200D-2642-FE0F-200D-27A1-FE0F": "man_running_facing_right",
+	"1F3C3-200D-27A1-FE0F": "person_running_facing_right",
+	"1F3C3": ["runner", "running"],
+	"1F3C4-200D-2640-FE0F": "woman-surfing",
+	"1F3C4-200D-2642-FE0F": "man-surfing",
+	"1F3C4": "surfer",
+	"1F3C5": "sports_medal",
+	"1F3C6": "trophy",
+	"1F3C7": "horse_racing",
+	"1F3C8": "football",
+	"1F3C9": "rugby_football",
+	"1F3CA-200D-2640-FE0F": "woman-swimming",
+	"1F3CA-200D-2642-FE0F": "man-swimming",
+	"1F3CA": "swimmer",
+	"1F3CB-FE0F-200D-2640-FE0F": "woman-lifting-weights",
+	"1F3CB-FE0F-200D-2642-FE0F": "man-lifting-weights",
+	"1F3CB": "weight_lifter",
+	"1F3CC-FE0F-200D-2640-FE0F": "woman-golfing",
+	"1F3CC-FE0F-200D-2642-FE0F": "man-golfing",
+	"1F3CC": "golfer",
+	"1F3CD": "racing_motorcycle",
+	"1F3CE": "racing_car",
+	"1F3CF": "cricket_bat_and_ball",
+	"1F3D0": "volleyball",
+	"1F3D1": "field_hockey_stick_and_ball",
+	"1F3D2": "ice_hockey_stick_and_puck",
+	"1F3D3": "table_tennis_paddle_and_ball",
+	"1F3D4": "snow_capped_mountain",
+	"1F3D5": "camping",
+	"1F3D6": "beach_with_umbrella",
+	"1F3D7": "building_construction",
+	"1F3D8": "house_buildings",
+	"1F3D9": "cityscape",
+	"1F3DA": "derelict_house_building",
+	"1F3DB": "classical_building",
+	"1F3DC": "desert",
+	"1F3DD": "desert_island",
+	"1F3DE": "national_park",
+	"1F3DF": "stadium",
+	"1F3E0": "house",
+	"1F3E1": "house_with_garden",
+	"1F3E2": "office",
+	"1F3E3": "post_office",
+	"1F3E4": "european_post_office",
+	"1F3E5": "hospital",
+	"1F3E6": "bank",
+	"1F3E7": "atm",
+	"1F3E8": "hotel",
+	"1F3E9": "love_hotel",
+	"1F3EA": "convenience_store",
+	"1F3EB": "school",
+	"1F3EC": "department_store",
+	"1F3ED": "factory",
+	"1F3EE": ["izakaya_lantern", "lantern"],
+	"1F3EF": "japanese_castle",
+	"1F3F0": "european_castle",
+	"1F3F3-FE0F-200D-1F308": "rainbow-flag",
+	"1F3F3-FE0F-200D-26A7-FE0F": "transgender_flag",
+	"1F3F3": "waving_white_flag",
+	"1F3F4-200D-2620-FE0F": "pirate_flag",
+	"1F3F4-E0067-E0062-E0065-E006E-E0067-E007F": "flag-england",
+	"1F3F4-E0067-E0062-E0073-E0063-E0074-E007F": "flag-scotland",
+	"1F3F4-E0067-E0062-E0077-E006C-E0073-E007F": "flag-wales",
+	"1F3F4": "waving_black_flag",
+	"1F3F5": "rosette",
+	"1F3F7": "label",
+	"1F3F8": "badminton_racquet_and_shuttlecock",
+	"1F3F9": "bow_and_arrow",
+	"1F3FA": "amphora",
+	"1F3FB": "skin-tone-2",
+	"1F3FC": "skin-tone-3",
+	"1F3FD": "skin-tone-4",
+	"1F3FE": "skin-tone-5",
+	"1F3FF": "skin-tone-6",
+	"1F400": "rat",
+	"1F401": "mouse2",
+	"1F402": "ox",
+	"1F403": "water_buffalo",
+	"1F404": "cow2",
+	"1F405": "tiger2",
+	"1F406": "leopard",
+	"1F407": "rabbit2",
+	"1F408-200D-2B1B": "black_cat",
+	"1F408": "cat2",
+	"1F409": "dragon",
+	"1F40A": "crocodile",
+	"1F40B": "whale2",
+	"1F40C": "snail",
+	"1F40D": "snake",
+	"1F40E": "racehorse",
+	"1F40F": "ram",
+	"1F410": "goat",
+	"1F411": "sheep",
+	"1F412": "monkey",
+	"1F413": "rooster",
+	"1F414": "chicken",
+	"1F415-200D-1F9BA": "service_dog",
+	"1F415": "dog2",
+	"1F416": "pig2",
+	"1F417": "boar",
+	"1F418": "elephant",
+	"1F419": "octopus",
+	"1F41A": "shell",
+	"1F41B": "bug",
+	"1F41C": "ant",
+	"1F41D": ["bee", "honeybee"],
+	"1F41E": ["ladybug", "lady_beetle"],
+	"1F41F": "fish",
+	"1F420": "tropical_fish",
+	"1F421": "blowfish",
+	"1F422": "turtle",
+	"1F423": "hatching_chick",
+	"1F424": "baby_chick",
+	"1F425": "hatched_chick",
+	"1F426-200D-1F525": "phoenix",
+	"1F426-200D-2B1B": "black_bird",
+	"1F426": "bird",
+	"1F427": "penguin",
+	"1F428": "koala",
+	"1F429": "poodle",
+	"1F42A": "dromedary_camel",
+	"1F42B": "camel",
+	"1F42C": ["dolphin", "flipper"],
+	"1F42D": "mouse",
+	"1F42E": "cow",
+	"1F42F": "tiger",
+	"1F430": "rabbit",
+	"1F431": "cat",
+	"1F432": "dragon_face",
+	"1F433": "whale",
+	"1F434": "horse",
+	"1F435": "monkey_face",
+	"1F436": "dog",
+	"1F437": "pig",
+	"1F438": "frog",
+	"1F439": "hamster",
+	"1F43A": "wolf",
+	"1F43B-200D-2744-FE0F": "polar_bear",
+	"1F43B": "bear",
+	"1F43C": "panda_face",
+	"1F43D": "pig_nose",
+	"1F43E": ["feet", "paw_prints"],
+	"1F43F": "chipmunk",
+	"1F440": "eyes",
+	"1F441-FE0F-200D-1F5E8-FE0F": "eye-in-speech-bubble",
+	"1F441": "eye",
+	"1F442": "ear",
+	"1F443": "nose",
+	"1F444": "lips",
+	"1F445": "tongue",
+	"1F446": "point_up_2",
+	"1F447": "point_down",
+	"1F448": "point_left",
+	"1F449": "point_right",
+	"1F44A": ["facepunch", "punch"],
+	"1F44B": "wave",
+	"1F44C": "ok_hand",
+	"1F44D": ["+1", "thumbsup"],
+	"1F44E": ["-1", "thumbsdown"],
+	"1F44F": "clap",
+	"1F450": "open_hands",
+	"1F451": "crown",
+	"1F452": "womans_hat",
+	"1F453": "eyeglasses",
+	"1F454": "necktie",
+	"1F455": ["shirt", "tshirt"],
+	"1F456": "jeans",
+	"1F457": "dress",
+	"1F458": "kimono",
+	"1F459": "bikini",
+	"1F45A": "womans_clothes",
+	"1F45B": "purse",
+	"1F45C": "handbag",
+	"1F45D": "pouch",
+	"1F45E": ["mans_shoe", "shoe"],
+	"1F45F": "athletic_shoe",
+	"1F460": "high_heel",
+	"1F461": "sandal",
+	"1F462": "boot",
+	"1F463": "footprints",
+	"1F464": "bust_in_silhouette",
+	"1F465": "busts_in_silhouette",
+	"1F466": "boy",
+	"1F467": "girl",
+	"1F468-200D-1F33E": "male-farmer",
+	"1F468-200D-1F373": "male-cook",
+	"1F468-200D-1F37C": "man_feeding_baby",
+	"1F468-200D-1F393": "male-student",
+	"1F468-200D-1F3A4": "male-singer",
+	"1F468-200D-1F3A8": "male-artist",
+	"1F468-200D-1F3EB": "male-teacher",
+	"1F468-200D-1F3ED": "male-factory-worker",
+	"1F468-200D-1F466-200D-1F466": "man-boy-boy",
+	"1F468-200D-1F466": "man-boy",
+	"1F468-200D-1F467-200D-1F466": "man-girl-boy",
+	"1F468-200D-1F467-200D-1F467": "man-girl-girl",
+	"1F468-200D-1F467": "man-girl",
+	"1F468-200D-1F468-200D-1F466": "man-man-boy",
+	"1F468-200D-1F468-200D-1F466-200D-1F466": "man-man-boy-boy",
+	"1F468-200D-1F468-200D-1F467": "man-man-girl",
+	"1F468-200D-1F468-200D-1F467-200D-1F466": "man-man-girl-boy",
+	"1F468-200D-1F468-200D-1F467-200D-1F467": "man-man-girl-girl",
+	"1F468-200D-1F469-200D-1F466": "man-woman-boy",
+	"1F468-200D-1F469-200D-1F466-200D-1F466": "man-woman-boy-boy",
+	"1F468-200D-1F469-200D-1F467": "man-woman-girl",
+	"1F468-200D-1F469-200D-1F467-200D-1F466": "man-woman-girl-boy",
+	"1F468-200D-1F469-200D-1F467-200D-1F467": "man-woman-girl-girl",
+	"1F468-200D-1F4BB": "male-technologist",
+	"1F468-200D-1F4BC": "male-office-worker",
+	"1F468-200D-1F527": "male-mechanic",
+	"1F468-200D-1F52C": "male-scientist",
+	"1F468-200D-1F680": "male-astronaut",
+	"1F468-200D-1F692": "male-firefighter",
+	"1F468-200D-1F9AF-200D-27A1-FE0F": "man_with_white_cane_facing_right",
+	"1F468-200D-1F9AF": "man_with_probing_cane",
+	"1F468-200D-1F9B0": "red_haired_man",
+	"1F468-200D-1F9B1": "curly_haired_man",
+	"1F468-200D-1F9B2": "bald_man",
+	"1F468-200D-1F9B3": "white_haired_man",
+	"1F468-200D-1F9BC-200D-27A1-FE0F": "man_in_motorized_wheelchair_facing_right",
+	"1F468-200D-1F9BC": "man_in_motorized_wheelchair",
+	"1F468-200D-1F9BD-200D-27A1-FE0F": "man_in_manual_wheelchair_facing_right",
+	"1F468-200D-1F9BD": "man_in_manual_wheelchair",
+	"1F468-200D-2695-FE0F": "male-doctor",
+	"1F468-200D-2696-FE0F": "male-judge",
+	"1F468-200D-2708-FE0F": "male-pilot",
+	"1F468-200D-2764-FE0F-200D-1F468": "man-heart-man",
+	"1F468-200D-2764-FE0F-200D-1F48B-200D-1F468": "man-kiss-man",
+	"1F468": "man",
+	"1F469-200D-1F33E": "female-farmer",
+	"1F469-200D-1F373": "female-cook",
+	"1F469-200D-1F37C": "woman_feeding_baby",
+	"1F469-200D-1F393": "female-student",
+	"1F469-200D-1F3A4": "female-singer",
+	"1F469-200D-1F3A8": "female-artist",
+	"1F469-200D-1F3EB": "female-teacher",
+	"1F469-200D-1F3ED": "female-factory-worker",
+	"1F469-200D-1F466-200D-1F466": "woman-boy-boy",
+	"1F469-200D-1F466": "woman-boy",
+	"1F469-200D-1F467-200D-1F466": "woman-girl-boy",
+	"1F469-200D-1F467-200D-1F467": "woman-girl-girl",
+	"1F469-200D-1F467": "woman-girl",
+	"1F469-200D-1F469-200D-1F466": "woman-woman-boy",
+	"1F469-200D-1F469-200D-1F466-200D-1F466": "woman-woman-boy-boy",
+	"1F469-200D-1F469-200D-1F467": "woman-woman-girl",
+	"1F469-200D-1F469-200D-1F467-200D-1F466": "woman-woman-girl-boy",
+	"1F469-200D-1F469-200D-1F467-200D-1F467": "woman-woman-girl-girl",
+	"1F469-200D-1F4BB": "female-technologist",
+	"1F469-200D-1F4BC": "female-office-worker",
+	"1F469-200D-1F527": "female-mechanic",
+	"1F469-200D-1F52C": "female-scientist",
+	"1F469-200D-1F680": "female-astronaut",
+	"1F469-200D-1F692": "female-firefighter",
+	"1F469-200D-1F9AF-200D-27A1-FE0F": "woman_with_white_cane_facing_right",
+	"1F469-200D-1F9AF": "woman_with_probing_cane",
+	"1F469-200D-1F9B0": "red_haired_woman",
+	"1F469-200D-1F9B1": "curly_haired_woman",
+	"1F469-200D-1F9B2": "bald_woman",
+	"1F469-200D-1F9B3": "white_haired_woman",
+	"1F469-200D-1F9BC-200D-27A1-FE0F": "woman_in_motorized_wheelchair_facing_right",
+	"1F469-200D-1F9BC": "woman_in_motorized_wheelchair",
+	"1F469-200D-1F9BD-200D-27A1-FE0F": "woman_in_manual_wheelchair_facing_right",
+	"1F469-200D-1F9BD": "woman_in_manual_wheelchair",
+	"1F469-200D-2695-FE0F": "female-doctor",
+	"1F469-200D-2696-FE0F": "female-judge",
+	"1F469-200D-2708-FE0F": "female-pilot",
+	"1F469-200D-2764-FE0F-200D-1F468": "woman-heart-man",
+	"1F469-200D-2764-FE0F-200D-1F469": "woman-heart-woman",
+	"1F469-200D-2764-FE0F-200D-1F48B-200D-1F468": "woman-kiss-man",
+	"1F469-200D-2764-FE0F-200D-1F48B-200D-1F469": "woman-kiss-woman",
+	"1F469": "woman",
+	"1F46A": "family",
+	"1F46B": ["man_and_woman_holding_hands", "woman_and_man_holding_hands", "couple"],
+	"1F46C": ["two_men_holding_hands", "men_holding_hands"],
+	"1F46D": ["two_women_holding_hands", "women_holding_hands"],
+	"1F46E-200D-2640-FE0F": "female-police-officer",
+	"1F46E-200D-2642-FE0F": "male-police-officer",
+	"1F46E": "cop",
+	"1F46F-200D-2640-FE0F": ["women-with-bunny-ears-partying", "woman-with-bunny-ears-partying"],
+	"1F46F-200D-2642-FE0F": ["men-with-bunny-ears-partying", "man-with-bunny-ears-partying"],
+	"1F46F": "dancers",
+	"1F470-200D-2640-FE0F": "woman_with_veil",
+	"1F470-200D-2642-FE0F": "man_with_veil",
+	"1F470": "bride_with_veil",
+	"1F471-200D-2640-FE0F": "blond-haired-woman",
+	"1F471-200D-2642-FE0F": "blond-haired-man",
+	"1F471": "person_with_blond_hair",
+	"1F472": "man_with_gua_pi_mao",
+	"1F473-200D-2640-FE0F": "woman-wearing-turban",
+	"1F473-200D-2642-FE0F": "man-wearing-turban",
+	"1F473": "man_with_turban",
+	"1F474": "older_man",
+	"1F475": "older_woman",
+	"1F476": "baby",
+	"1F477-200D-2640-FE0F": "female-construction-worker",
+	"1F477-200D-2642-FE0F": "male-construction-worker",
+	"1F477": "construction_worker",
+	"1F478": "princess",
+	"1F479": "japanese_ogre",
+	"1F47A": "japanese_goblin",
+	"1F47B": "ghost",
+	"1F47C": "angel",
+	"1F47D": "alien",
+	"1F47E": "space_invader",
+	"1F47F": "imp",
+	"1F480": "skull",
+	"1F481-200D-2640-FE0F": "woman-tipping-hand",
+	"1F481-200D-2642-FE0F": "man-tipping-hand",
+	"1F481": "information_desk_person",
+	"1F482-200D-2640-FE0F": "female-guard",
+	"1F482-200D-2642-FE0F": "male-guard",
+	"1F482": "guardsman",
+	"1F483": "dancer",
+	"1F484": "lipstick",
+	"1F485": "nail_care",
+	"1F486-200D-2640-FE0F": "woman-getting-massage",
+	"1F486-200D-2642-FE0F": "man-getting-massage",
+	"1F486": "massage",
+	"1F487-200D-2640-FE0F": "woman-getting-haircut",
+	"1F487-200D-2642-FE0F": "man-getting-haircut",
+	"1F487": "haircut",
+	"1F488": "barber",
+	"1F489": "syringe",
+	"1F48A": "pill",
+	"1F48B": "kiss",
+	"1F48C": "love_letter",
+	"1F48D": "ring",
+	"1F48E": "gem",
+	"1F48F": "couplekiss",
+	"1F490": "bouquet",
+	"1F491": "couple_with_heart",
+	"1F492": "wedding",
+	"1F493": "heartbeat",
+	"1F494": "broken_heart",
+	"1F495": "two_hearts",
+	"1F496": "sparkling_heart",
+	"1F497": "heartpulse",
+	"1F498": "cupid",
+	"1F499": "blue_heart",
+	"1F49A": "green_heart",
+	"1F49B": "yellow_heart",
+	"1F49C": "purple_heart",
+	"1F49D": "gift_heart",
+	"1F49E": "revolving_hearts",
+	"1F49F": "heart_decoration",
+	"1F4A0": "diamond_shape_with_a_dot_inside",
+	"1F4A1": "bulb",
+	"1F4A2": "anger",
+	"1F4A3": "bomb",
+	"1F4A4": "zzz",
+	"1F4A5": ["boom", "collision"],
+	"1F4A6": "sweat_drops",
+	"1F4A7": "droplet",
+	"1F4A8": "dash",
+	"1F4A9": ["hankey", "poop", "shit"],
+	"1F4AA": "muscle",
+	"1F4AB": "dizzy",
+	"1F4AC": "speech_balloon",
+	"1F4AD": "thought_balloon",
+	"1F4AE": "white_flower",
+	"1F4AF": "100",
+	"1F4B0": "moneybag",
+	"1F4B1": "currency_exchange",
+	"1F4B2": "heavy_dollar_sign",
+	"1F4B3": "credit_card",
+	"1F4B4": "yen",
+	"1F4B5": "dollar",
+	"1F4B6": "euro",
+	"1F4B7": "pound",
+	"1F4B8": "money_with_wings",
+	"1F4B9": "chart",
+	"1F4BA": "seat",
+	"1F4BB": "computer",
+	"1F4BC": "briefcase",
+	"1F4BD": "minidisc",
+	"1F4BE": "floppy_disk",
+	"1F4BF": "cd",
+	"1F4C0": "dvd",
+	"1F4C1": "file_folder",
+	"1F4C2": "open_file_folder",
+	"1F4C3": "page_with_curl",
+	"1F4C4": "page_facing_up",
+	"1F4C5": "date",
+	"1F4C6": "calendar",
+	"1F4C7": "card_index",
+	"1F4C8": "chart_with_upwards_trend",
+	"1F4C9": "chart_with_downwards_trend",
+	"1F4CA": "bar_chart",
+	"1F4CB": "clipboard",
+	"1F4CC": "pushpin",
+	"1F4CD": "round_pushpin",
+	"1F4CE": "paperclip",
+	"1F4CF": "straight_ruler",
+	"1F4D0": "triangular_ruler",
+	"1F4D1": "bookmark_tabs",
+	"1F4D2": "ledger",
+	"1F4D3": "notebook",
+	"1F4D4": "notebook_with_decorative_cover",
+	"1F4D5": "closed_book",
+	"1F4D6": ["book", "open_book"],
+	"1F4D7": "green_book",
+	"1F4D8": "blue_book",
+	"1F4D9": "orange_book",
+	"1F4DA": "books",
+	"1F4DB": "name_badge",
+	"1F4DC": "scroll",
+	"1F4DD": ["memo", "pencil"],
+	"1F4DE": "telephone_receiver",
+	"1F4DF": "pager",
+	"1F4E0": "fax",
+	"1F4E1": "satellite_antenna",
+	"1F4E2": "loudspeaker",
+	"1F4E3": "mega",
+	"1F4E4": "outbox_tray",
+	"1F4E5": "inbox_tray",
+	"1F4E6": "package",
+	"1F4E7": "e-mail",
+	"1F4E8": "incoming_envelope",
+	"1F4E9": "envelope_with_arrow",
+	"1F4EA": "mailbox_closed",
+	"1F4EB": "mailbox",
+	"1F4EC": "mailbox_with_mail",
+	"1F4ED": "mailbox_with_no_mail",
+	"1F4EE": "postbox",
+	"1F4EF": "postal_horn",
+	"1F4F0": "newspaper",
+	"1F4F1": "iphone",
+	"1F4F2": "calling",
+	"1F4F3": "vibration_mode",
+	"1F4F4": "mobile_phone_off",
+	"1F4F5": "no_mobile_phones",
+	"1F4F6": "signal_strength",
+	"1F4F7": "camera",
+	"1F4F8": "camera_with_flash",
+	"1F4F9": "video_camera",
+	"1F4FA": "tv",
+	"1F4FB": "radio",
+	"1F4FC": "vhs",
+	"1F4FD": "film_projector",
+	"1F4FF": "prayer_beads",
+	"1F500": "twisted_rightwards_arrows",
+	"1F501": "repeat",
+	"1F502": "repeat_one",
+	"1F503": "arrows_clockwise",
+	"1F504": "arrows_counterclockwise",
+	"1F505": "low_brightness",
+	"1F506": "high_brightness",
+	"1F507": "mute",
+	"1F508": "speaker",
+	"1F509": "sound",
+	"1F50A": "loud_sound",
+	"1F50B": "battery",
+	"1F50C": "electric_plug",
+	"1F50D": "mag",
+	"1F50E": "mag_right",
+	"1F50F": "lock_with_ink_pen",
+	"1F510": "closed_lock_with_key",
+	"1F511": "key",
+	"1F512": "lock",
+	"1F513": "unlock",
+	"1F514": "bell",
+	"1F515": "no_bell",
+	"1F516": "bookmark",
+	"1F517": "link",
+	"1F518": "radio_button",
+	"1F519": "back",
+	"1F51A": "end",
+	"1F51B": "on",
+	"1F51C": "soon",
+	"1F51D": "top",
+	"1F51E": "underage",
+	"1F51F": "keycap_ten",
+	"1F520": "capital_abcd",
+	"1F521": "abcd",
+	"1F522": "1234",
+	"1F523": "symbols",
+	"1F524": "abc",
+	"1F525": "fire",
+	"1F526": "flashlight",
+	"1F527": "wrench",
+	"1F528": "hammer",
+	"1F529": "nut_and_bolt",
+	"1F52A": ["hocho", "knife"],
+	"1F52B": "gun",
+	"1F52C": "microscope",
+	"1F52D": "telescope",
+	"1F52E": "crystal_ball",
+	"1F52F": "six_pointed_star",
+	"1F530": "beginner",
+	"1F531": "trident",
+	"1F532": "black_square_button",
+	"1F533": "white_square_button",
+	"1F534": "red_circle",
+	"1F535": "large_blue_circle",
+	"1F536": "large_orange_diamond",
+	"1F537": "large_blue_diamond",
+	"1F538": "small_orange_diamond",
+	"1F539": "small_blue_diamond",
+	"1F53A": "small_red_triangle",
+	"1F53B": "small_red_triangle_down",
+	"1F53C": "arrow_up_small",
+	"1F53D": "arrow_down_small",
+	"1F549": "om_symbol",
+	"1F54A": "dove_of_peace",
+	"1F54B": "kaaba",
+	"1F54C": "mosque",
+	"1F54D": "synagogue",
+	"1F54E": "menorah_with_nine_branches",
+	"1F550": "clock1",
+	"1F551": "clock2",
+	"1F552": "clock3",
+	"1F553": "clock4",
+	"1F554": "clock5",
+	"1F555": "clock6",
+	"1F556": "clock7",
+	"1F557": "clock8",
+	"1F558": "clock9",
+	"1F559": "clock10",
+	"1F55A": "clock11",
+	"1F55B": "clock12",
+	"1F55C": "clock130",
+	"1F55D": "clock230",
+	"1F55E": "clock330",
+	"1F55F": "clock430",
+	"1F560": "clock530",
+	"1F561": "clock630",
+	"1F562": "clock730",
+	"1F563": "clock830",
+	"1F564": "clock930",
+	"1F565": "clock1030",
+	"1F566": "clock1130",
+	"1F567": "clock1230",
+	"1F56F": "candle",
+	"1F570": "mantelpiece_clock",
+	"1F573": "hole",
+	"1F574": "man_in_business_suit_levitating",
+	"1F575-FE0F-200D-2640-FE0F": "female-detective",
+	"1F575-FE0F-200D-2642-FE0F": "male-detective",
+	"1F575": "sleuth_or_spy",
+	"1F576": "dark_sunglasses",
+	"1F577": "spider",
+	"1F578": "spider_web",
+	"1F579": "joystick",
+	"1F57A": "man_dancing",
+	"1F587": "linked_paperclips",
+	"1F58A": "lower_left_ballpoint_pen",
+	"1F58B": "lower_left_fountain_pen",
+	"1F58C": "lower_left_paintbrush",
+	"1F58D": "lower_left_crayon",
+	"1F590": "raised_hand_with_fingers_splayed",
+	"1F595": ["middle_finger", "reversed_hand_with_middle_finger_extended"],
+	"1F596": "spock-hand",
+	"1F5A4": "black_heart",
+	"1F5A5": "desktop_computer",
+	"1F5A8": "printer",
+	"1F5B1": "three_button_mouse",
+	"1F5B2": "trackball",
+	"1F5BC": "frame_with_picture",
+	"1F5C2": "card_index_dividers",
+	"1F5C3": "card_file_box",
+	"1F5C4": "file_cabinet",
+	"1F5D1": "wastebasket",
+	"1F5D2": "spiral_note_pad",
+	"1F5D3": "spiral_calendar_pad",
+	"1F5DC": "compression",
+	"1F5DD": "old_key",
+	"1F5DE": "rolled_up_newspaper",
+	"1F5E1": "dagger_knife",
+	"1F5E3": "speaking_head_in_silhouette",
+	"1F5E8": "left_speech_bubble",
+	"1F5EF": "right_anger_bubble",
+	"1F5F3": "ballot_box_with_ballot",
+	"1F5FA": "world_map",
+	"1F5FB": "mount_fuji",
+	"1F5FC": "tokyo_tower",
+	"1F5FD": "statue_of_liberty",
+	"1F5FE": "japan",
+	"1F5FF": "moyai",
+	"1F600": "grinning",
+	"1F601": "grin",
+	"1F602": "joy",
+	"1F603": "smiley",
+	"1F604": "smile",
+	"1F605": "sweat_smile",
+	"1F606": ["laughing", "satisfied"],
+	"1F607": "innocent",
+	"1F608": "smiling_imp",
+	"1F609": "wink",
+	"1F60A": "blush",
+	"1F60B": "yum",
+	"1F60C": "relieved",
+	"1F60D": "heart_eyes",
+	"1F60E": "sunglasses",
+	"1F60F": "smirk",
+	"1F610": "neutral_face",
+	"1F611": "expressionless",
+	"1F612": "unamused",
+	"1F613": "sweat",
+	"1F614": "pensive",
+	"1F615": "confused",
+	"1F616": "confounded",
+	"1F617": "kissing",
+	"1F618": "kissing_heart",
+	"1F619": "kissing_smiling_eyes",
+	"1F61A": "kissing_closed_eyes",
+	"1F61B": "stuck_out_tongue",
+	"1F61C": "stuck_out_tongue_winking_eye",
+	"1F61D": "stuck_out_tongue_closed_eyes",
+	"1F61E": "disappointed",
+	"1F61F": "worried",
+	"1F620": "angry",
+	"1F621": "rage",
+	"1F622": "cry",
+	"1F623": "persevere",
+	"1F624": "triumph",
+	"1F625": "disappointed_relieved",
+	"1F626": "frowning",
+	"1F627": "anguished",
+	"1F628": "fearful",
+	"1F629": "weary",
+	"1F62A": "sleepy",
+	"1F62B": "tired_face",
+	"1F62C": "grimacing",
+	"1F62D": "sob",
+	"1F62E-200D-1F4A8": "face_exhaling",
+	"1F62E": "open_mouth",
+	"1F62F": "hushed",
+	"1F630": "cold_sweat",
+	"1F631": "scream",
+	"1F632": "astonished",
+	"1F633": "flushed",
+	"1F634": "sleeping",
+	"1F635-200D-1F4AB": "face_with_spiral_eyes",
+	"1F635": "dizzy_face",
+	"1F636-200D-1F32B-FE0F": "face_in_clouds",
+	"1F636": "no_mouth",
+	"1F637": "mask",
+	"1F638": "smile_cat",
+	"1F639": "joy_cat",
+	"1F63A": "smiley_cat",
+	"1F63B": "heart_eyes_cat",
+	"1F63C": "smirk_cat",
+	"1F63D": "kissing_cat",
+	"1F63E": "pouting_cat",
+	"1F63F": "crying_cat_face",
+	"1F640": "scream_cat",
+	"1F641": "slightly_frowning_face",
+	"1F642-200D-2194-FE0F": "head_shaking_horizontally",
+	"1F642-200D-2195-FE0F": "head_shaking_vertically",
+	"1F642": "slightly_smiling_face",
+	"1F643": "upside_down_face",
+	"1F644": "face_with_rolling_eyes",
+	"1F645-200D-2640-FE0F": "woman-gesturing-no",
+	"1F645-200D-2642-FE0F": "man-gesturing-no",
+	"1F645": "no_good",
+	"1F646-200D-2640-FE0F": "woman-gesturing-ok",
+	"1F646-200D-2642-FE0F": "man-gesturing-ok",
+	"1F646": "ok_woman",
+	"1F647-200D-2640-FE0F": "woman-bowing",
+	"1F647-200D-2642-FE0F": "man-bowing",
+	"1F647": "bow",
+	"1F648": "see_no_evil",
+	"1F649": "hear_no_evil",
+	"1F64A": "speak_no_evil",
+	"1F64B-200D-2640-FE0F": "woman-raising-hand",
+	"1F64B-200D-2642-FE0F": "man-raising-hand",
+	"1F64B": "raising_hand",
+	"1F64C": "raised_hands",
+	"1F64D-200D-2640-FE0F": "woman-frowning",
+	"1F64D-200D-2642-FE0F": "man-frowning",
+	"1F64D": "person_frowning",
+	"1F64E-200D-2640-FE0F": "woman-pouting",
+	"1F64E-200D-2642-FE0F": "man-pouting",
+	"1F64E": "person_with_pouting_face",
+	"1F64F": "pray",
+	"1F680": "rocket",
+	"1F681": "helicopter",
+	"1F682": "steam_locomotive",
+	"1F683": "railway_car",
+	"1F684": "bullettrain_side",
+	"1F685": "bullettrain_front",
+	"1F686": "train2",
+	"1F687": "metro",
+	"1F688": "light_rail",
+	"1F689": "station",
+	"1F68A": "tram",
+	"1F68B": "train",
+	"1F68C": "bus",
+	"1F68D": "oncoming_bus",
+	"1F68E": "trolleybus",
+	"1F68F": "busstop",
+	"1F690": "minibus",
+	"1F691": "ambulance",
+	"1F692": "fire_engine",
+	"1F693": "police_car",
+	"1F694": "oncoming_police_car",
+	"1F695": "taxi",
+	"1F696": "oncoming_taxi",
+	"1F697": ["car", "red_car"],
+	"1F698": "oncoming_automobile",
+	"1F699": "blue_car",
+	"1F69A": "truck",
+	"1F69B": "articulated_lorry",
+	"1F69C": "tractor",
+	"1F69D": "monorail",
+	"1F69E": "mountain_railway",
+	"1F69F": "suspension_railway",
+	"1F6A0": "mountain_cableway",
+	"1F6A1": "aerial_tramway",
+	"1F6A2": "ship",
+	"1F6A3-200D-2640-FE0F": "woman-rowing-boat",
+	"1F6A3-200D-2642-FE0F": "man-rowing-boat",
+	"1F6A3": "rowboat",
+	"1F6A4": "speedboat",
+	"1F6A5": "traffic_light",
+	"1F6A6": "vertical_traffic_light",
+	"1F6A7": "construction",
+	"1F6A8": "rotating_light",
+	"1F6A9": "triangular_flag_on_post",
+	"1F6AA": "door",
+	"1F6AB": "no_entry_sign",
+	"1F6AC": "smoking",
+	"1F6AD": "no_smoking",
+	"1F6AE": "put_litter_in_its_place",
+	"1F6AF": "do_not_litter",
+	"1F6B0": "potable_water",
+	"1F6B1": "non-potable_water",
+	"1F6B2": "bike",
+	"1F6B3": "no_bicycles",
+	"1F6B4-200D-2640-FE0F": "woman-biking",
+	"1F6B4-200D-2642-FE0F": "man-biking",
+	"1F6B4": "bicyclist",
+	"1F6B5-200D-2640-FE0F": "woman-mountain-biking",
+	"1F6B5-200D-2642-FE0F": "man-mountain-biking",
+	"1F6B5": "mountain_bicyclist",
+	"1F6B6-200D-2640-FE0F": "woman-walking",
+	"1F6B6-200D-2640-FE0F-200D-27A1-FE0F": "woman_walking_facing_right",
+	"1F6B6-200D-2642-FE0F": "man-walking",
+	"1F6B6-200D-2642-FE0F-200D-27A1-FE0F": "man_walking_facing_right",
+	"1F6B6-200D-27A1-FE0F": "person_walking_facing_right",
+	"1F6B6": "walking",
+	"1F6B7": "no_pedestrians",
+	"1F6B8": "children_crossing",
+	"1F6B9": "mens",
+	"1F6BA": "womens",
+	"1F6BB": "restroom",
+	"1F6BC": "baby_symbol",
+	"1F6BD": "toilet",
+	"1F6BE": "wc",
+	"1F6BF": "shower",
+	"1F6C0": "bath",
+	"1F6C1": "bathtub",
+	"1F6C2": "passport_control",
+	"1F6C3": "customs",
+	"1F6C4": "baggage_claim",
+	"1F6C5": "left_luggage",
+	"1F6CB": "couch_and_lamp",
+	"1F6CC": "sleeping_accommodation",
+	"1F6CD": "shopping_bags",
+	"1F6CE": "bellhop_bell",
+	"1F6CF": "bed",
+	"1F6D0": "place_of_worship",
+	"1F6D1": "octagonal_sign",
+	"1F6D2": "shopping_trolley",
+	"1F6D5": "hindu_temple",
+	"1F6D6": "hut",
+	"1F6D7": "elevator",
+	"1F6DC": "wireless",
+	"1F6DD": "playground_slide",
+	"1F6DE": "wheel",
+	"1F6DF": "ring_buoy",
+	"1F6E0": "hammer_and_wrench",
+	"1F6E1": "shield",
+	"1F6E2": "oil_drum",
+	"1F6E3": "motorway",
+	"1F6E4": "railway_track",
+	"1F6E5": "motor_boat",
+	"1F6E9": "small_airplane",
+	"1F6EB": "airplane_departure",
+	"1F6EC": "airplane_arriving",
+	"1F6F0": "satellite",
+	"1F6F3": "passenger_ship",
+	"1F6F4": "scooter",
+	"1F6F5": "motor_scooter",
+	"1F6F6": "canoe",
+	"1F6F7": "sled",
+	"1F6F8": "flying_saucer",
+	"1F6F9": "skateboard",
+	"1F6FA": "auto_rickshaw",
+	"1F6FB": "pickup_truck",
+	"1F6FC": "roller_skate",
+	"1F7E0": "large_orange_circle",
+	"1F7E1": "large_yellow_circle",
+	"1F7E2": "large_green_circle",
+	"1F7E3": "large_purple_circle",
+	"1F7E4": "large_brown_circle",
+	"1F7E5": "large_red_square",
+	"1F7E6": "large_blue_square",
+	"1F7E7": "large_orange_square",
+	"1F7E8": "large_yellow_square",
+	"1F7E9": "large_green_square",
+	"1F7EA": "large_purple_square",
+	"1F7EB": "large_brown_square",
+	"1F7F0": "heavy_equals_sign",
+	"1F90C": "pinched_fingers",
+	"1F90D": "white_heart",
+	"1F90E": "brown_heart",
+	"1F90F": "pinching_hand",
+	"1F910": "zipper_mouth_face",
+	"1F911": "money_mouth_face",
+	"1F912": "face_with_thermometer",
+	"1F913": "nerd_face",
+	"1F914": "thinking_face",
+	"1F915": "face_with_head_bandage",
+	"1F916": "robot_face",
+	"1F917": "hugging_face",
+	"1F918": ["the_horns", "sign_of_the_horns"],
+	"1F919": "call_me_hand",
+	"1F91A": "raised_back_of_hand",
+	"1F91B": "left-facing_fist",
+	"1F91C": "right-facing_fist",
+	"1F91D": "handshake",
+	"1F91E": ["crossed_fingers", "hand_with_index_and_middle_fingers_crossed"],
+	"1F91F": "i_love_you_hand_sign",
+	"1F920": "face_with_cowboy_hat",
+	"1F921": "clown_face",
+	"1F922": "nauseated_face",
+	"1F923": "rolling_on_the_floor_laughing",
+	"1F924": "drooling_face",
+	"1F925": "lying_face",
+	"1F926-200D-2640-FE0F": "woman-facepalming",
+	"1F926-200D-2642-FE0F": "man-facepalming",
+	"1F926": "face_palm",
+	"1F927": "sneezing_face",
+	"1F928": ["face_with_raised_eyebrow", "face_with_one_eyebrow_raised"],
+	"1F929": ["star-struck", "grinning_face_with_star_eyes"],
+	"1F92A": ["zany_face", "grinning_face_with_one_large_and_one_small_eye"],
+	"1F92B": ["shushing_face", "face_with_finger_covering_closed_lips"],
+	"1F92C": ["face_with_symbols_on_mouth", "serious_face_with_symbols_covering_mouth"],
+	"1F92D": ["face_with_hand_over_mouth", "smiling_face_with_smiling_eyes_and_hand_covering_mouth"],
+	"1F92E": ["face_vomiting", "face_with_open_mouth_vomiting"],
+	"1F92F": ["exploding_head", "shocked_face_with_exploding_head"],
+	"1F930": "pregnant_woman",
+	"1F931": "breast-feeding",
+	"1F932": "palms_up_together",
+	"1F933": "selfie",
+	"1F934": "prince",
+	"1F935-200D-2640-FE0F": "woman_in_tuxedo",
+	"1F935-200D-2642-FE0F": "man_in_tuxedo",
+	"1F935": "person_in_tuxedo",
+	"1F936": ["mrs_claus", "mother_christmas"],
+	"1F937-200D-2640-FE0F": "woman-shrugging",
+	"1F937-200D-2642-FE0F": "man-shrugging",
+	"1F937": "shrug",
+	"1F938-200D-2640-FE0F": "woman-cartwheeling",
+	"1F938-200D-2642-FE0F": "man-cartwheeling",
+	"1F938": "person_doing_cartwheel",
+	"1F939-200D-2640-FE0F": "woman-juggling",
+	"1F939-200D-2642-FE0F": "man-juggling",
+	"1F939": "juggling",
+	"1F93A": "fencer",
+	"1F93C-200D-2640-FE0F": "woman-wrestling",
+	"1F93C-200D-2642-FE0F": "man-wrestling",
+	"1F93C": "wrestlers",
+	"1F93D-200D-2640-FE0F": "woman-playing-water-polo",
+	"1F93D-200D-2642-FE0F": "man-playing-water-polo",
+	"1F93D": "water_polo",
+	"1F93E-200D-2640-FE0F": "woman-playing-handball",
+	"1F93E-200D-2642-FE0F": "man-playing-handball",
+	"1F93E": "handball",
+	"1F93F": "diving_mask",
+	"1F940": "wilted_flower",
+	"1F941": "drum_with_drumsticks",
+	"1F942": "clinking_glasses",
+	"1F943": "tumbler_glass",
+	"1F944": "spoon",
+	"1F945": "goal_net",
+	"1F947": "first_place_medal",
+	"1F948": "second_place_medal",
+	"1F949": "third_place_medal",
+	"1F94A": "boxing_glove",
+	"1F94B": "martial_arts_uniform",
+	"1F94C": "curling_stone",
+	"1F94D": "lacrosse",
+	"1F94E": "softball",
+	"1F94F": "flying_disc",
+	"1F950": "croissant",
+	"1F951": "avocado",
+	"1F952": "cucumber",
+	"1F953": "bacon",
+	"1F954": "potato",
+	"1F955": "carrot",
+	"1F956": "baguette_bread",
+	"1F957": "green_salad",
+	"1F958": "shallow_pan_of_food",
+	"1F959": "stuffed_flatbread",
+	"1F95A": "egg",
+	"1F95B": "glass_of_milk",
+	"1F95C": "peanuts",
+	"1F95D": "kiwifruit",
+	"1F95E": "pancakes",
+	"1F95F": "dumpling",
+	"1F960": "fortune_cookie",
+	"1F961": "takeout_box",
+	"1F962": "chopsticks",
+	"1F963": "bowl_with_spoon",
+	"1F964": "cup_with_straw",
+	"1F965": "coconut",
+	"1F966": "broccoli",
+	"1F967": "pie",
+	"1F968": "pretzel",
+	"1F969": "cut_of_meat",
+	"1F96A": "sandwich",
+	"1F96B": "canned_food",
+	"1F96C": "leafy_green",
+	"1F96D": "mango",
+	"1F96E": "moon_cake",
+	"1F96F": "bagel",
+	"1F970": "smiling_face_with_3_hearts",
+	"1F971": "yawning_face",
+	"1F972": "smiling_face_with_tear",
+	"1F973": "partying_face",
+	"1F974": "woozy_face",
+	"1F975": "hot_face",
+	"1F976": "cold_face",
+	"1F977": "ninja",
+	"1F978": "disguised_face",
+	"1F979": "face_holding_back_tears",
+	"1F97A": "pleading_face",
+	"1F97B": "sari",
+	"1F97C": "lab_coat",
+	"1F97D": "goggles",
+	"1F97E": "hiking_boot",
+	"1F97F": "womans_flat_shoe",
+	"1F980": "crab",
+	"1F981": "lion_face",
+	"1F982": "scorpion",
+	"1F983": "turkey",
+	"1F984": "unicorn_face",
+	"1F985": "eagle",
+	"1F986": "duck",
+	"1F987": "bat",
+	"1F988": "shark",
+	"1F989": "owl",
+	"1F98A": "fox_face",
+	"1F98B": "butterfly",
+	"1F98C": "deer",
+	"1F98D": "gorilla",
+	"1F98E": "lizard",
+	"1F98F": "rhinoceros",
+	"1F990": "shrimp",
+	"1F991": "squid",
+	"1F992": "giraffe_face",
+	"1F993": "zebra_face",
+	"1F994": "hedgehog",
+	"1F995": "sauropod",
+	"1F996": "t-rex",
+	"1F997": "cricket",
+	"1F998": "kangaroo",
+	"1F999": "llama",
+	"1F99A": "peacock",
+	"1F99B": "hippopotamus",
+	"1F99C": "parrot",
+	"1F99D": "raccoon",
+	"1F99E": "lobster",
+	"1F99F": "mosquito",
+	"1F9A0": "microbe",
+	"1F9A1": "badger",
+	"1F9A2": "swan",
+	"1F9A3": "mammoth",
+	"1F9A4": "dodo",
+	"1F9A5": "sloth",
+	"1F9A6": "otter",
+	"1F9A7": "orangutan",
+	"1F9A8": "skunk",
+	"1F9A9": "flamingo",
+	"1F9AA": "oyster",
+	"1F9AB": "beaver",
+	"1F9AC": "bison",
+	"1F9AD": "seal",
+	"1F9AE": "guide_dog",
+	"1F9AF": "probing_cane",
+	"1F9B4": "bone",
+	"1F9B5": "leg",
+	"1F9B6": "foot",
+	"1F9B7": "tooth",
+	"1F9B8-200D-2640-FE0F": "female_superhero",
+	"1F9B8-200D-2642-FE0F": "male_superhero",
+	"1F9B8": "superhero",
+	"1F9B9-200D-2640-FE0F": "female_supervillain",
+	"1F9B9-200D-2642-FE0F": "male_supervillain",
+	"1F9B9": "supervillain",
+	"1F9BA": "safety_vest",
+	"1F9BB": "ear_with_hearing_aid",
+	"1F9BC": "motorized_wheelchair",
+	"1F9BD": "manual_wheelchair",
+	"1F9BE": "mechanical_arm",
+	"1F9BF": "mechanical_leg",
+	"1F9C0": "cheese_wedge",
+	"1F9C1": "cupcake",
+	"1F9C2": "salt",
+	"1F9C3": "beverage_box",
+	"1F9C4": "garlic",
+	"1F9C5": "onion",
+	"1F9C6": "falafel",
+	"1F9C7": "waffle",
+	"1F9C8": "butter",
+	"1F9C9": "mate_drink",
+	"1F9CA": "ice_cube",
+	"1F9CB": "bubble_tea",
+	"1F9CC": "troll",
+	"1F9CD-200D-2640-FE0F": "woman_standing",
+	"1F9CD-200D-2642-FE0F": "man_standing",
+	"1F9CD": "standing_person",
+	"1F9CE-200D-2640-FE0F": "woman_kneeling",
+	"1F9CE-200D-2640-FE0F-200D-27A1-FE0F": "woman_kneeling_facing_right",
+	"1F9CE-200D-2642-FE0F": "man_kneeling",
+	"1F9CE-200D-2642-FE0F-200D-27A1-FE0F": "man_kneeling_facing_right",
+	"1F9CE-200D-27A1-FE0F": "person_kneeling_facing_right",
+	"1F9CE": "kneeling_person",
+	"1F9CF-200D-2640-FE0F": "deaf_woman",
+	"1F9CF-200D-2642-FE0F": "deaf_man",
+	"1F9CF": "deaf_person",
+	"1F9D0": "face_with_monocle",
+	"1F9D1-200D-1F33E": "farmer",
+	"1F9D1-200D-1F373": "cook",
+	"1F9D1-200D-1F37C": "person_feeding_baby",
+	"1F9D1-200D-1F384": "mx_claus",
+	"1F9D1-200D-1F393": "student",
+	"1F9D1-200D-1F3A4": "singer",
+	"1F9D1-200D-1F3A8": "artist",
+	"1F9D1-200D-1F3EB": "teacher",
+	"1F9D1-200D-1F3ED": "factory_worker",
+	"1F9D1-200D-1F4BB": "technologist",
+	"1F9D1-200D-1F4BC": "office_worker",
+	"1F9D1-200D-1F527": "mechanic",
+	"1F9D1-200D-1F52C": "scientist",
+	"1F9D1-200D-1F680": "astronaut",
+	"1F9D1-200D-1F692": "firefighter",
+	"1F9D1-200D-1F91D-200D-1F9D1": "people_holding_hands",
+	"1F9D1-200D-1F9AF-200D-27A1-FE0F": "person_with_white_cane_facing_right",
+	"1F9D1-200D-1F9AF": "person_with_probing_cane",
+	"1F9D1-200D-1F9B0": "red_haired_person",
+	"1F9D1-200D-1F9B1": "curly_haired_person",
+	"1F9D1-200D-1F9B2": "bald_person",
+	"1F9D1-200D-1F9B3": "white_haired_person",
+	"1F9D1-200D-1F9BC-200D-27A1-FE0F": "person_in_motorized_wheelchair_facing_right",
+	"1F9D1-200D-1F9BC": "person_in_motorized_wheelchair",
+	"1F9D1-200D-1F9BD-200D-27A1-FE0F": "person_in_manual_wheelchair_facing_right",
+	"1F9D1-200D-1F9BD": "person_in_manual_wheelchair",
+	"1F9D1-200D-1F9D1-200D-1F9D2": "family_adult_adult_child",
+	"1F9D1-200D-1F9D1-200D-1F9D2-200D-1F9D2": "family_adult_adult_child_child",
+	"1F9D1-200D-1F9D2-200D-1F9D2": "family_adult_child_child",
+	"1F9D1-200D-1F9D2": "family_adult_child",
+	"1F9D1-200D-2695-FE0F": "health_worker",
+	"1F9D1-200D-2696-FE0F": "judge",
+	"1F9D1-200D-2708-FE0F": "pilot",
+	"1F9D1": "adult",
+	"1F9D2": "child",
+	"1F9D3": "older_adult",
+	"1F9D4-200D-2640-FE0F": "woman_with_beard",
+	"1F9D4-200D-2642-FE0F": "man_with_beard",
+	"1F9D4": "bearded_person",
+	"1F9D5": "person_with_headscarf",
+	"1F9D6-200D-2640-FE0F": "woman_in_steamy_room",
+	"1F9D6-200D-2642-FE0F": "man_in_steamy_room",
+	"1F9D6": "person_in_steamy_room",
+	"1F9D7-200D-2640-FE0F": "woman_climbing",
+	"1F9D7-200D-2642-FE0F": "man_climbing",
+	"1F9D7": "person_climbing",
+	"1F9D8-200D-2640-FE0F": "woman_in_lotus_position",
+	"1F9D8-200D-2642-FE0F": "man_in_lotus_position",
+	"1F9D8": "person_in_lotus_position",
+	"1F9D9-200D-2640-FE0F": "female_mage",
+	"1F9D9-200D-2642-FE0F": "male_mage",
+	"1F9D9": "mage",
+	"1F9DA-200D-2640-FE0F": "female_fairy",
+	"1F9DA-200D-2642-FE0F": "male_fairy",
+	"1F9DA": "fairy",
+	"1F9DB-200D-2640-FE0F": "female_vampire",
+	"1F9DB-200D-2642-FE0F": "male_vampire",
+	"1F9DB": "vampire",
+	"1F9DC-200D-2640-FE0F": "mermaid",
+	"1F9DC-200D-2642-FE0F": "merman",
+	"1F9DC": "merperson",
+	"1F9DD-200D-2640-FE0F": "female_elf",
+	"1F9DD-200D-2642-FE0F": "male_elf",
+	"1F9DD": "elf",
+	"1F9DE-200D-2640-FE0F": "female_genie",
+	"1F9DE-200D-2642-FE0F": "male_genie",
+	"1F9DE": "genie",
+	"1F9DF-200D-2640-FE0F": "female_zombie",
+	"1F9DF-200D-2642-FE0F": "male_zombie",
+	"1F9DF": "zombie",
+	"1F9E0": "brain",
+	"1F9E1": "orange_heart",
+	"1F9E2": "billed_cap",
+	"1F9E3": "scarf",
+	"1F9E4": "gloves",
+	"1F9E5": "coat",
+	"1F9E6": "socks",
+	"1F9E7": "red_envelope",
+	"1F9E8": "firecracker",
+	"1F9E9": "jigsaw",
+	"1F9EA": "test_tube",
+	"1F9EB": "petri_dish",
+	"1F9EC": "dna",
+	"1F9ED": "compass",
+	"1F9EE": "abacus",
+	"1F9EF": "fire_extinguisher",
+	"1F9F0": "toolbox",
+	"1F9F1": "bricks",
+	"1F9F2": "magnet",
+	"1F9F3": "luggage",
+	"1F9F4": "lotion_bottle",
+	"1F9F5": "thread",
+	"1F9F6": "yarn",
+	"1F9F7": "safety_pin",
+	"1F9F8": "teddy_bear",
+	"1F9F9": "broom",
+	"1F9FA": "basket",
+	"1F9FB": "roll_of_paper",
+	"1F9FC": "soap",
+	"1F9FD": "sponge",
+	"1F9FE": "receipt",
+	"1F9FF": "nazar_amulet",
+	"1FA70": "ballet_shoes",
+	"1FA71": "one-piece_swimsuit",
+	"1FA72": "briefs",
+	"1FA73": "shorts",
+	"1FA74": "thong_sandal",
+	"1FA75": "light_blue_heart",
+	"1FA76": "grey_heart",
+	"1FA77": "pink_heart",
+	"1FA78": "drop_of_blood",
+	"1FA79": "adhesive_bandage",
+	"1FA7A": "stethoscope",
+	"1FA7B": "x-ray",
+	"1FA7C": "crutch",
+	"1FA80": "yo-yo",
+	"1FA81": "kite",
+	"1FA82": "parachute",
+	"1FA83": "boomerang",
+	"1FA84": "magic_wand",
+	"1FA85": "pinata",
+	"1FA86": "nesting_dolls",
+	"1FA87": "maracas",
+	"1FA88": "flute",
+	"1FA90": "ringed_planet",
+	"1FA91": "chair",
+	"1FA92": "razor",
+	"1FA93": "axe",
+	"1FA94": "diya_lamp",
+	"1FA95": "banjo",
+	"1FA96": "military_helmet",
+	"1FA97": "accordion",
+	"1FA98": "long_drum",
+	"1FA99": "coin",
+	"1FA9A": "carpentry_saw",
+	"1FA9B": "screwdriver",
+	"1FA9C": "ladder",
+	"1FA9D": "hook",
+	"1FA9E": "mirror",
+	"1FA9F": "window",
+	"1FAA0": "plunger",
+	"1FAA1": "sewing_needle",
+	"1FAA2": "knot",
+	"1FAA3": "bucket",
+	"1FAA4": "mouse_trap",
+	"1FAA5": "toothbrush",
+	"1FAA6": "headstone",
+	"1FAA7": "placard",
+	"1FAA8": "rock",
+	"1FAA9": "mirror_ball",
+	"1FAAA": "identification_card",
+	"1FAAB": "low_battery",
+	"1FAAC": "hamsa",
+	"1FAAD": "folding_hand_fan",
+	"1FAAE": "hair_pick",
+	"1FAAF": "khanda",
+	"1FAB0": "fly",
+	"1FAB1": "worm",
+	"1FAB2": "beetle",
+	"1FAB3": "cockroach",
+	"1FAB4": "potted_plant",
+	"1FAB5": "wood",
+	"1FAB6": "feather",
+	"1FAB7": "lotus",
+	"1FAB8": "coral",
+	"1FAB9": "empty_nest",
+	"1FABA": "nest_with_eggs",
+	"1FABB": "hyacinth",
+	"1FABC": "jellyfish",
+	"1FABD": "wing",
+	"1FABF": "goose",
+	"1FAC0": "anatomical_heart",
+	"1FAC1": "lungs",
+	"1FAC2": "people_hugging",
+	"1FAC3": "pregnant_man",
+	"1FAC4": "pregnant_person",
+	"1FAC5": "person_with_crown",
+	"1FACE": "moose",
+	"1FACF": "donkey",
+	"1FAD0": "blueberries",
+	"1FAD1": "bell_pepper",
+	"1FAD2": "olive",
+	"1FAD3": "flatbread",
+	"1FAD4": "tamale",
+	"1FAD5": "fondue",
+	"1FAD6": "teapot",
+	"1FAD7": "pouring_liquid",
+	"1FAD8": "beans",
+	"1FAD9": "jar",
+	"1FADA": "ginger_root",
+	"1FADB": "pea_pod",
+	"1FAE0": "melting_face",
+	"1FAE1": "saluting_face",
+	"1FAE2": "face_with_open_eyes_and_hand_over_mouth",
+	"1FAE3": "face_with_peeking_eye",
+	"1FAE4": "face_with_diagonal_mouth",
+	"1FAE5": "dotted_line_face",
+	"1FAE6": "biting_lip",
+	"1FAE7": "bubbles",
+	"1FAE8": "shaking_face",
+	"1FAF0": "hand_with_index_finger_and_thumb_crossed",
+	"1FAF1": "rightwards_hand",
+	"1FAF2": "leftwards_hand",
+	"1FAF3": "palm_down_hand",
+	"1FAF4": "palm_up_hand",
+	"1FAF5": "index_pointing_at_the_viewer",
+	"1FAF6": "heart_hands",
+	"1FAF7": "leftwards_pushing_hand",
+	"1FAF8": "rightwards_pushing_hand",
+	"203C": "bangbang",
+	"21A9": "leftwards_arrow_with_hook",
+	"21AA": "arrow_right_hook",
+	"231A": "watch",
+	"231B": "hourglass",
+	"23CF": "eject",
+	"23E9": "fast_forward",
+	"23EA": "rewind",
+	"23EB": "arrow_double_up",
+	"23EC": "arrow_double_down",
+	"23ED": "black_right_pointing_double_triangle_with_vertical_bar",
+	"23EE": "black_left_pointing_double_triangle_with_vertical_bar",
+	"23EF": "black_right_pointing_triangle_with_double_vertical_bar",
+	"23F0": "alarm_clock",
+	"23F1": "stopwatch",
+	"23F2": "timer_clock",
+	"23F3": "hourglass_flowing_sand",
+	"23F8": "double_vertical_bar",
+	"23F9": "black_square_for_stop",
+	"23FA": "black_circle_for_record",
+	"24C2": "m",
+	"25AA": "black_small_square",
+	"25AB": "white_small_square",
+	"25B6": "arrow_forward",
+	"25C0": "arrow_backward",
+	"25FB": "white_medium_square",
+	"25FC": "black_medium_square",
+	"25FD": "white_medium_small_square",
+	"25FE": "black_medium_small_square",
+	"260E": ["phone", "telephone"],
+	"261D": "point_up",
+	"262A": "star_and_crescent",
+	"262E": "peace_symbol",
+	"262F": "yin_yang",
+	"263A": "relaxed",
+	"264A": "gemini",
+	"264B": "cancer",
+	"264C": "leo",
+	"264D": "virgo",
+	"264E": "libra",
+	"264F": "scorpius",
+	"265F": "chess_pawn",
+	"267B": "recycle",
+	"267E": "infinity",
+	"267F": "wheelchair",
+	"269B": "atom_symbol",
+	"269C": "fleur_de_lis",
+	"26A0": "warning",
+	"26A1": "zap",
+	"26A7": "transgender_symbol",
+	"26AA": "white_circle",
+	"26AB": "black_circle",
+	"26B0": "coffin",
+	"26B1": "funeral_urn",
+	"26BD": "soccer",
+	"26BE": "baseball",
+	"26C4": "snowman_without_snow",
+	"26C5": "partly_sunny",
+	"26C8": "thunder_cloud_and_rain",
+	"26CE": "ophiuchus",
+	"26CF": "pick",
+	"26D1": "helmet_with_white_cross",
+	"26D3-FE0F-200D-1F4A5": "broken_chain",
+	"26D3": "chains",
+	"26D4": "no_entry",
+	"26E9": "shinto_shrine",
+	"26EA": "church",
+	"26F0": "mountain",
+	"26F1": "umbrella_on_ground",
+	"26F2": "fountain",
+	"26F3": "golf",
+	"26F4": "ferry",
+	"26F5": ["boat", "sailboat"],
+	"26F7": "skier",
+	"26F8": "ice_skate",
+	"26F9-FE0F-200D-2640-FE0F": "woman-bouncing-ball",
+	"26F9-FE0F-200D-2642-FE0F": "man-bouncing-ball",
+	"26F9": "person_with_ball",
+	"26FA": "tent",
+	"26FD": "fuelpump",
+	"270A": "fist",
+	"270B": ["hand", "raised_hand"],
+	"270C": "v",
+	"270D": "writing_hand",
+	"270F": "pencil2",
+	"271D": "latin_cross",
+	"274C": "x",
+	"274E": "negative_squared_cross_mark",
+	"2764-FE0F-200D-1F525": "heart_on_fire",
+	"2764-FE0F-200D-1FA79": "mending_heart",
+	"27A1": "arrow_right",
+	"27B0": "curly_loop",
+	"27BF": "loop",
+	"2B05": "arrow_left",
+	"2B06": "arrow_up",
+	"2B07": "arrow_down",
+	"2B1B": "black_large_square",
+	"2B1C": "white_large_square",
+	"2B50": "star",
+	"2B55": "o",
+	"303D": "part_alternation_mark"
+}

+ 6 - 0
src/lib/i18n/locales/ar-BH/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "( `sh webui.sh --api`مثال)",
 	"(latest)": "(الأخير)",
 	"{{ models }}": "{{ نماذج }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "دردشات {{user}}",
 	"{{webUIName}} Backend Required": "{{webUIName}} مطلوب",
 	"*Prompt node ID(s) are required for image generation": "",
@@ -34,6 +35,7 @@
 	"Add Group": "",
 	"Add Memory": "إضافة ذكرايات",
 	"Add Model": "اضافة موديل",
+	"Add Reaction": "",
 	"Add Tag": "",
 	"Add Tags": "اضافة تاق",
 	"Add text content": "",
@@ -534,6 +536,7 @@
 	"Language": "اللغة",
 	"Last Active": "آخر نشاط",
 	"Last Modified": "",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "",
@@ -739,6 +742,7 @@
 	"Rename": "إعادة تسمية",
 	"Reorder Models": "",
 	"Repeat Last N": "N كرر آخر",
+	"Reply in Thread": "",
 	"Request Mode": "وضع الطلب",
 	"Reranking Model": "إعادة تقييم النموذج",
 	"Reranking model disabled": "تم تعطيل نموذج إعادة الترتيب",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "",
 	"Reset Vector Storage/Knowledge": "",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
 	"Result": "",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "متغير لاستبدالها بمحتوى الحافظة.",
 	"Version": "إصدار",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "",
 	"Voice Input": "",

+ 6 - 0
src/lib/i18n/locales/bg-BG/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(например `sh webui.sh --api`)",
 	"(latest)": "(последна)",
 	"{{ models }}": "{{ модели }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "{{user}}'s чатове",
 	"{{webUIName}} Backend Required": "{{webUIName}} Изисква се Бекенд",
 	"*Prompt node ID(s) are required for image generation": "",
@@ -34,6 +35,7 @@
 	"Add Group": "",
 	"Add Memory": "Добавяне на Памет",
 	"Add Model": "Добавяне на Модел",
+	"Add Reaction": "",
 	"Add Tag": "",
 	"Add Tags": "добавяне на тагове",
 	"Add text content": "",
@@ -534,6 +536,7 @@
 	"Language": "Език",
 	"Last Active": "Последни активни",
 	"Last Modified": "",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "",
@@ -739,6 +742,7 @@
 	"Rename": "Преименуване",
 	"Reorder Models": "",
 	"Repeat Last N": "Repeat Last N",
+	"Reply in Thread": "",
 	"Request Mode": "Request Mode",
 	"Reranking Model": "Reranking Model",
 	"Reranking model disabled": "Reranking model disabled",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "",
 	"Reset Vector Storage/Knowledge": "",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
 	"Result": "",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "променливи да се заменят съдържанието от клипборд.",
 	"Version": "Версия",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "",
 	"Voice Input": "",

+ 6 - 0
src/lib/i18n/locales/bn-BD/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(যেমন `sh webui.sh --api`)",
 	"(latest)": "(সর্বশেষ)",
 	"{{ models }}": "{{ মডেল}}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "{{user}}র চ্যাটস",
 	"{{webUIName}} Backend Required": "{{webUIName}} ব্যাকএন্ড আবশ্যক",
 	"*Prompt node ID(s) are required for image generation": "",
@@ -34,6 +35,7 @@
 	"Add Group": "",
 	"Add Memory": "মেমোরি যোগ করুন",
 	"Add Model": "মডেল যোগ করুন",
+	"Add Reaction": "",
 	"Add Tag": "",
 	"Add Tags": "ট্যাগ যোগ করুন",
 	"Add text content": "",
@@ -534,6 +536,7 @@
 	"Language": "ভাষা",
 	"Last Active": "সর্বশেষ সক্রিয়",
 	"Last Modified": "",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "",
@@ -739,6 +742,7 @@
 	"Rename": "রেনেম",
 	"Reorder Models": "",
 	"Repeat Last N": "রিপিট Last N",
+	"Reply in Thread": "",
 	"Request Mode": "রিকোয়েস্ট মোড",
 	"Reranking Model": "রির্যাক্টিং মডেল",
 	"Reranking model disabled": "রির্যাক্টিং মডেল নিষ্ক্রিয় করা",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "",
 	"Reset Vector Storage/Knowledge": "",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
 	"Result": "",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "ক্লিপবোর্ডের কন্টেন্ট দিয়ে যেই ভেরিয়েবল রিপ্লেস করা যাবে।",
 	"Version": "ভার্সন",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "",
 	"Voice Input": "",

+ 6 - 0
src/lib/i18n/locales/ca-ES/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(p. ex. `sh webui.sh --api`)",
 	"(latest)": "(últim)",
 	"{{ models }}": "{{ models }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "Els xats de {{user}}",
 	"{{webUIName}} Backend Required": "El Backend de {{webUIName}} és necessari",
 	"*Prompt node ID(s) are required for image generation": "*Els identificadors de nodes d'indicacions són necessaris per a la generació d'imatges",
@@ -34,6 +35,7 @@
 	"Add Group": "Afegir grup",
 	"Add Memory": "Afegir memòria",
 	"Add Model": "Afegir un model",
+	"Add Reaction": "",
 	"Add Tag": "Afegir etiqueta",
 	"Add Tags": "Afegir etiquetes",
 	"Add text content": "Afegir contingut de text",
@@ -534,6 +536,7 @@
 	"Language": "Idioma",
 	"Last Active": "Activitat recent",
 	"Last Modified": "Modificació",
+	"Last reply": "",
 	"LDAP": "LDAP",
 	"LDAP server updated": "Servidor LDAP actualitzat",
 	"Leaderboard": "Tauler de classificació",
@@ -739,6 +742,7 @@
 	"Rename": "Canviar el nom",
 	"Reorder Models": "Reordenar els models",
 	"Repeat Last N": "Repeteix els darrers N",
+	"Reply in Thread": "",
 	"Request Mode": "Mode de sol·licitud",
 	"Reranking Model": "Model de reavaluació",
 	"Reranking model disabled": "Model de reavaluació desactivat",
@@ -747,6 +751,7 @@
 	"Reset All Models": "Restablir tots els models",
 	"Reset Upload Directory": "Restableix el directori de pujades",
 	"Reset Vector Storage/Knowledge": "Restableix el Repositori de vectors/Coneixement",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Les notifications de resposta no es poden activar perquè els permisos del lloc web han estat rebutjats. Comprova les preferències del navegador per donar l'accés necessari.",
 	"Response splitting": "Divisió de la resposta",
 	"Result": "Resultat",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "variable per tenir-les reemplaçades amb el contingut del porta-retalls.",
 	"Version": "Versió",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Versió {{selectedVersion}} de {{totalVersions}}",
+	"View Replies": "",
 	"Visibility": "Visibilitat",
 	"Voice": "Veu",
 	"Voice Input": "Entrada de veu",

+ 6 - 0
src/lib/i18n/locales/ceb-PH/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(pananglitan `sh webui.sh --api`)",
 	"(latest)": "",
 	"{{ models }}": "",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "",
 	"{{webUIName}} Backend Required": "Backend {{webUIName}} gikinahanglan",
 	"*Prompt node ID(s) are required for image generation": "",
@@ -34,6 +35,7 @@
 	"Add Group": "",
 	"Add Memory": "",
 	"Add Model": "",
+	"Add Reaction": "",
 	"Add Tag": "",
 	"Add Tags": "idugang ang mga tag",
 	"Add text content": "",
@@ -534,6 +536,7 @@
 	"Language": "Pinulongan",
 	"Last Active": "",
 	"Last Modified": "",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "",
@@ -739,6 +742,7 @@
 	"Rename": "",
 	"Reorder Models": "",
 	"Repeat Last N": "Balika ang katapusang N",
+	"Reply in Thread": "",
 	"Request Mode": "Query mode",
 	"Reranking Model": "",
 	"Reranking model disabled": "",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "",
 	"Reset Vector Storage/Knowledge": "",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
 	"Result": "",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "variable aron pulihan kini sa mga sulud sa clipboard.",
 	"Version": "Bersyon",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "",
 	"Voice Input": "",

+ 6 - 0
src/lib/i18n/locales/cs-CZ/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(např. `sh webui.sh --api`)",
 	"(latest)": "Nejnovější",
 	"{{ models }}": "{{ models }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "{{user}}'s konverzace",
 	"{{webUIName}} Backend Required": "Požadován {{webUIName}} Backend",
 	"*Prompt node ID(s) are required for image generation": "*Jsou vyžadovány IDs pro prompt node pro generování obrázků",
@@ -34,6 +35,7 @@
 	"Add Group": "Přidat skupinu",
 	"Add Memory": "Přidat paměť",
 	"Add Model": "Přidat model",
+	"Add Reaction": "",
 	"Add Tag": "Přidat štítek",
 	"Add Tags": "Přidat štítky",
 	"Add text content": "Přidejte textový obsah",
@@ -534,6 +536,7 @@
 	"Language": "Jazyk",
 	"Last Active": "Naposledy aktivní",
 	"Last Modified": "Poslední změna",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "Žebříček",
@@ -739,6 +742,7 @@
 	"Rename": "Přejmenovat",
 	"Reorder Models": "",
 	"Repeat Last N": "Opakovat posledních N",
+	"Reply in Thread": "",
 	"Request Mode": "Režim žádosti",
 	"Reranking Model": "Model pro přehodnocení pořadí",
 	"Reranking model disabled": "Přeřazovací model je deaktivován",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "Resetovat adresář nahrávání",
 	"Reset Vector Storage/Knowledge": "Resetování úložiště vektorů/znalostí",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Oznámení o odpovědích nelze aktivovat, protože oprávnění webu byla zamítnuta. Navštivte nastavení svého prohlížeče a udělte potřebný přístup.",
 	"Response splitting": "Rozdělení odpovědi",
 	"Result": "Výsledek",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "proměnnou, aby byl jejich obsah nahrazen obsahem schránky.",
 	"Version": "Verze",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Verze {{selectedVersion}} z {{totalVersions}}",
+	"View Replies": "",
 	"Visibility": "Viditelnost",
 	"Voice": "Hlas",
 	"Voice Input": "Hlasový vstup",

+ 6 - 0
src/lib/i18n/locales/da-DK/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(f.eks. `sh webui.sh --api`)",
 	"(latest)": "(seneste)",
 	"{{ models }}": "{{ modeller }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "{{user}}s chats",
 	"{{webUIName}} Backend Required": "{{webUIName}} Backend kræves",
 	"*Prompt node ID(s) are required for image generation": "*Prompt node ID(s) er påkrævet for at kunne generere billeder",
@@ -34,6 +35,7 @@
 	"Add Group": "",
 	"Add Memory": "Tilføj hukommelse",
 	"Add Model": "Tilføj model",
+	"Add Reaction": "",
 	"Add Tag": "Tilføj tag",
 	"Add Tags": "Tilføj tags",
 	"Add text content": "Tilføj tekst",
@@ -534,6 +536,7 @@
 	"Language": "Sprog",
 	"Last Active": "Sidst aktiv",
 	"Last Modified": "Sidst ændret",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "",
@@ -739,6 +742,7 @@
 	"Rename": "Omdøb",
 	"Reorder Models": "",
 	"Repeat Last N": "Gentag sidste N",
+	"Reply in Thread": "",
 	"Request Mode": "Forespørgselstilstand",
 	"Reranking Model": "Omarrangeringsmodel",
 	"Reranking model disabled": "Omarrangeringsmodel deaktiveret",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "Nulstil uploadmappe",
 	"Reset Vector Storage/Knowledge": "",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Svarnotifikationer kan ikke aktiveres, da webstedets tilladelser er blevet nægtet. Besøg dine browserindstillinger for at give den nødvendige adgang.",
 	"Response splitting": "Svaropdeling",
 	"Result": "",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "variabel for at få dem erstattet med indholdet af udklipsholderen.",
 	"Version": "Version",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Version {{selectedVersion}} af {{totalVersions}}",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "Stemme",
 	"Voice Input": "",

+ 6 - 0
src/lib/i18n/locales/de-DE/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(z. B. `sh webui.sh --api`)",
 	"(latest)": "(neueste)",
 	"{{ models }}": "{{ Modelle }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "{{user}}s Unterhaltungen",
 	"{{webUIName}} Backend Required": "{{webUIName}}-Backend erforderlich",
 	"*Prompt node ID(s) are required for image generation": "*Prompt-Node-ID(s) sind für die Bildgenerierung erforderlich",
@@ -34,6 +35,7 @@
 	"Add Group": "Gruppe hinzufügen",
 	"Add Memory": "Erinnerung hinzufügen",
 	"Add Model": "Modell hinzufügen",
+	"Add Reaction": "",
 	"Add Tag": "Tag hinzufügen",
 	"Add Tags": "Tags hinzufügen",
 	"Add text content": "Textinhalt hinzufügen",
@@ -534,6 +536,7 @@
 	"Language": "Sprache",
 	"Last Active": "Zuletzt aktiv",
 	"Last Modified": "Zuletzt bearbeitet",
+	"Last reply": "",
 	"LDAP": "LDAP",
 	"LDAP server updated": "LDAP-Server aktualisiert",
 	"Leaderboard": "Bestenliste",
@@ -739,6 +742,7 @@
 	"Rename": "Umbenennen",
 	"Reorder Models": "",
 	"Repeat Last N": "Wiederhole die letzten N",
+	"Reply in Thread": "",
 	"Request Mode": "Anforderungsmodus",
 	"Reranking Model": "Reranking-Modell",
 	"Reranking model disabled": "Reranking-Modell deaktiviert",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "Upload-Verzeichnis zurücksetzen",
 	"Reset Vector Storage/Knowledge": "Vektorspeicher/Wissen zurücksetzen",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Benachrichtigungen können nicht aktiviert werden, da die Website-Berechtigungen abgelehnt wurden. Bitte besuchen Sie Ihre Browser-Einstellungen, um den erforderlichen Zugriff zu gewähren.",
 	"Response splitting": "Antwortaufteilung",
 	"Result": "Ergebnis",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "Variable, um den Inhalt der Zwischenablage beim Nutzen des Prompts zu ersetzen.",
 	"Version": "Version",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Version {{selectedVersion}} von {{totalVersions}}",
+	"View Replies": "",
 	"Visibility": "Sichtbarkeit",
 	"Voice": "Stimme",
 	"Voice Input": "Spracheingabe",

+ 6 - 0
src/lib/i18n/locales/dg-DG/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(such e.g. `sh webui.sh --api`)",
 	"(latest)": "(much latest)",
 	"{{ models }}": "",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "",
 	"{{webUIName}} Backend Required": "{{webUIName}} Backend Much Required",
 	"*Prompt node ID(s) are required for image generation": "",
@@ -34,6 +35,7 @@
 	"Add Group": "",
 	"Add Memory": "",
 	"Add Model": "",
+	"Add Reaction": "",
 	"Add Tag": "",
 	"Add Tags": "",
 	"Add text content": "",
@@ -534,6 +536,7 @@
 	"Language": "Doge Speak",
 	"Last Active": "",
 	"Last Modified": "",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "",
@@ -739,6 +742,7 @@
 	"Rename": "",
 	"Reorder Models": "",
 	"Repeat Last N": "Repeat Last N",
+	"Reply in Thread": "",
 	"Request Mode": "Request Bark",
 	"Reranking Model": "",
 	"Reranking model disabled": "",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "",
 	"Reset Vector Storage/Knowledge": "",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
 	"Result": "",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "variable to have them replaced with clipboard content. Very replace.",
 	"Version": "Version much version",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "",
 	"Voice Input": "",

+ 6 - 0
src/lib/i18n/locales/el-GR/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(π.χ. `sh webui.sh --api`)",
 	"(latest)": "(τελευταίο)",
 	"{{ models }}": "{{ models }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "Συνομιλίες του {{user}}",
 	"{{webUIName}} Backend Required": "{{webUIName}} Απαιτείται Backend",
 	"*Prompt node ID(s) are required for image generation": "*Τα αναγνωριστικά κόμβου Prompt απαιτούνται για τη δημιουργία εικόνων",
@@ -34,6 +35,7 @@
 	"Add Group": "Προσθήκη Ομάδας",
 	"Add Memory": "Προσθήκη Μνήμης",
 	"Add Model": "Προσθήκη Μοντέλου",
+	"Add Reaction": "",
 	"Add Tag": "Προσθήκη Ετικέτας",
 	"Add Tags": "Προσθήκη Ετικετών",
 	"Add text content": "Προσθήκη κειμένου",
@@ -534,6 +536,7 @@
 	"Language": "Γλώσσα",
 	"Last Active": "Τελευταία Ενεργή",
 	"Last Modified": "Τελευταία Τροποποίηση",
+	"Last reply": "",
 	"LDAP": "LDAP",
 	"LDAP server updated": "Ο διακομιστής LDAP ενημερώθηκε",
 	"Leaderboard": "Κατάταξη",
@@ -739,6 +742,7 @@
 	"Rename": "Μετονομασία",
 	"Reorder Models": "Επαναταξινόμηση Μοντέλων",
 	"Repeat Last N": "Επανάληψη Τελευταίων N",
+	"Reply in Thread": "",
 	"Request Mode": "Λειτουργία Αιτήματος",
 	"Reranking Model": "Μοντέλο Επαναταξινόμησης",
 	"Reranking model disabled": "Το μοντέλο επαναταξινόμησης απενεργοποιήθηκε",
@@ -747,6 +751,7 @@
 	"Reset All Models": "Επαναφορά Όλων των Μοντέλων",
 	"Reset Upload Directory": "Επαναφορά Καταλόγου Ανεβάσματος",
 	"Reset Vector Storage/Knowledge": "Επαναφορά Αποθήκευσης Διανυσμάτων/Γνώσης",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Οι ειδοποιήσεις απάντησης δεν μπορούν να ενεργοποιηθούν καθώς οι άδειες του ιστότοπου έχουν αρνηθεί. Παρακαλώ επισκεφτείτε τις ρυθμίσεις του περιηγητή σας για να δώσετε την απαραίτητη πρόσβαση.",
 	"Response splitting": "Διαχωρισμός απάντησης",
 	"Result": "Αποτέλεσμα",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "μεταβλητή να αντικατασταθούν με το περιεχόμενο του πρόχειρου.",
 	"Version": "Έκδοση",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Έκδοση {{selectedVersion}} από {{totalVersions}}",
+	"View Replies": "",
 	"Visibility": "Ορατότητα",
 	"Voice": "Φωνή",
 	"Voice Input": "Εισαγωγή Φωνής",

+ 6 - 0
src/lib/i18n/locales/en-GB/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "",
 	"(latest)": "",
 	"{{ models }}": "",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "",
 	"{{webUIName}} Backend Required": "",
 	"*Prompt node ID(s) are required for image generation": "",
@@ -34,6 +35,7 @@
 	"Add Group": "",
 	"Add Memory": "",
 	"Add Model": "",
+	"Add Reaction": "",
 	"Add Tag": "",
 	"Add Tags": "",
 	"Add text content": "",
@@ -534,6 +536,7 @@
 	"Language": "",
 	"Last Active": "",
 	"Last Modified": "",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "",
@@ -739,6 +742,7 @@
 	"Rename": "",
 	"Reorder Models": "",
 	"Repeat Last N": "",
+	"Reply in Thread": "",
 	"Request Mode": "",
 	"Reranking Model": "",
 	"Reranking model disabled": "",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "",
 	"Reset Vector Storage/Knowledge": "",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
 	"Result": "",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "",
 	"Version": "",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "",
 	"Voice Input": "",

+ 6 - 0
src/lib/i18n/locales/en-US/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "",
 	"(latest)": "",
 	"{{ models }}": "",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "",
 	"{{webUIName}} Backend Required": "",
 	"*Prompt node ID(s) are required for image generation": "",
@@ -34,6 +35,7 @@
 	"Add Group": "",
 	"Add Memory": "",
 	"Add Model": "",
+	"Add Reaction": "",
 	"Add Tag": "",
 	"Add Tags": "",
 	"Add text content": "",
@@ -534,6 +536,7 @@
 	"Language": "",
 	"Last Active": "",
 	"Last Modified": "",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "",
@@ -739,6 +742,7 @@
 	"Rename": "",
 	"Reorder Models": "",
 	"Repeat Last N": "",
+	"Reply in Thread": "",
 	"Request Mode": "",
 	"Reranking Model": "",
 	"Reranking model disabled": "",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "",
 	"Reset Vector Storage/Knowledge": "",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
 	"Result": "",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "",
 	"Version": "",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "",
 	"Voice Input": "",

+ 6 - 0
src/lib/i18n/locales/es-ES/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(p.ej. `sh webui.sh --api`)",
 	"(latest)": "(latest)",
 	"{{ models }}": "{{ models }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "Chats de {{user}}",
 	"{{webUIName}} Backend Required": "{{webUIName}} Servidor Requerido",
 	"*Prompt node ID(s) are required for image generation": "Los ID de nodo son requeridos para la generación de imágenes",
@@ -34,6 +35,7 @@
 	"Add Group": "",
 	"Add Memory": "Agregar Memoria",
 	"Add Model": "Agregar Modelo",
+	"Add Reaction": "",
 	"Add Tag": "Agregar etiqueta",
 	"Add Tags": "agregar etiquetas",
 	"Add text content": "Añade contenido de texto",
@@ -534,6 +536,7 @@
 	"Language": "Lenguaje",
 	"Last Active": "Última Actividad",
 	"Last Modified": "Modificado por última vez",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "",
@@ -739,6 +742,7 @@
 	"Rename": "Renombrar",
 	"Reorder Models": "",
 	"Repeat Last N": "Repetir las últimas N",
+	"Reply in Thread": "",
 	"Request Mode": "Modo de petición",
 	"Reranking Model": "Modelo de reranking",
 	"Reranking model disabled": "Modelo de reranking deshabilitado",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "Reiniciar Directorio de carga",
 	"Reset Vector Storage/Knowledge": "",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Las notificaciones de respuesta no pueden activarse debido a que los permisos del sitio web han sido denegados. Por favor, visite las configuraciones de su navegador para otorgar el acceso necesario.",
 	"Response splitting": "División de respuestas",
 	"Result": "",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "variable para reemplazarlos con el contenido del portapapeles.",
 	"Version": "Versión",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Versión {{selectedVersion}} de {{totalVersions}}",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "Voz",
 	"Voice Input": "",

+ 6 - 0
src/lib/i18n/locales/eu-ES/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(adib. `sh webui.sh --api`)",
 	"(latest)": "(azkena)",
 	"{{ models }}": "{{ models }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "{{user}}-ren Txatak",
 	"{{webUIName}} Backend Required": "{{webUIName}} Backend-a Beharrezkoa",
 	"*Prompt node ID(s) are required for image generation": "Prompt nodoaren IDa(k) beharrezkoak dira irudiak sortzeko",
@@ -34,6 +35,7 @@
 	"Add Group": "Gehitu Taldea",
 	"Add Memory": "Gehitu Memoria",
 	"Add Model": "Gehitu Eredua",
+	"Add Reaction": "",
 	"Add Tag": "Gehitu Etiketa",
 	"Add Tags": "Gehitu Etiketak",
 	"Add text content": "Gehitu testu edukia",
@@ -534,6 +536,7 @@
 	"Language": "Hizkuntza",
 	"Last Active": "Azken Aktibitatea",
 	"Last Modified": "Azken Aldaketa",
+	"Last reply": "",
 	"LDAP": "LDAP",
 	"LDAP server updated": "LDAP zerbitzaria eguneratu da",
 	"Leaderboard": "Sailkapena",
@@ -739,6 +742,7 @@
 	"Rename": "Berrizendatu",
 	"Reorder Models": "Berrantolatu modeloak",
 	"Repeat Last N": "Errepikatu azken N",
+	"Reply in Thread": "",
 	"Request Mode": "Eskaera modua",
 	"Reranking Model": "Berrantolatze modeloa",
 	"Reranking model disabled": "Berrantolatze modeloa desgaituta",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "Berrezarri karga direktorioa",
 	"Reset Vector Storage/Knowledge": "Berrezarri bektore biltegia/ezagutza",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Erantzunen jakinarazpenak ezin dira aktibatu webgunearen baimenak ukatu direlako. Mesedez, bisitatu zure nabigatzailearen ezarpenak beharrezko sarbidea emateko.",
 	"Response splitting": "Erantzun banaketa",
 	"Result": "Emaitza",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "aldagaia arbeleko edukiarekin ordezkatzeko.",
 	"Version": "Bertsioa",
 	"Version {{selectedVersion}} of {{totalVersions}}": "{{totalVersions}}-tik {{selectedVersion}}. bertsioa",
+	"View Replies": "",
 	"Visibility": "Ikusgarritasuna",
 	"Voice": "Ahotsa",
 	"Voice Input": "Ahots sarrera",

+ 6 - 0
src/lib/i18n/locales/fa-IR/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(e.g. `sh webui.sh --api`)",
 	"(latest)": "(آخرین)",
 	"{{ models }}": "{{ models }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "{{user}} گفتگوهای",
 	"{{webUIName}} Backend Required": "بکند {{webUIName}} نیاز است.",
 	"*Prompt node ID(s) are required for image generation": "",
@@ -34,6 +35,7 @@
 	"Add Group": "",
 	"Add Memory": "افزودن حافظه",
 	"Add Model": "افزودن مدل",
+	"Add Reaction": "",
 	"Add Tag": "افزودن برچسب",
 	"Add Tags": "افزودن برچسب\u200cها",
 	"Add text content": "افزودن محتوای متنی",
@@ -534,6 +536,7 @@
 	"Language": "زبان",
 	"Last Active": "آخرین فعال",
 	"Last Modified": "",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "",
@@ -739,6 +742,7 @@
 	"Rename": "تغییر نام",
 	"Reorder Models": "",
 	"Repeat Last N": "Repeat Last N",
+	"Reply in Thread": "",
 	"Request Mode": "حالت درخواست",
 	"Reranking Model": "مدل ری\u200cشناسی مجدد غیرفعال است",
 	"Reranking model disabled": "مدل ری\u200cشناسی مجدد غیرفعال است",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "",
 	"Reset Vector Storage/Knowledge": "",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
 	"Result": "نتیجه",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "متغیر برای جایگزینی آنها با محتوای بریده\u200cدان.",
 	"Version": "نسخه",
 	"Version {{selectedVersion}} of {{totalVersions}}": "نسخهٔ {{selectedVersion}} از {{totalVersions}}",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "صوت",
 	"Voice Input": "ورودی صوتی",

+ 6 - 0
src/lib/i18n/locales/fi-FI/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(esim. `sh webui.sh --api`)",
 	"(latest)": "(uusin)",
 	"{{ models }}": "{{ mallit }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "{{user}}:n keskustelut",
 	"{{webUIName}} Backend Required": "{{webUIName}}-backend vaaditaan",
 	"*Prompt node ID(s) are required for image generation": "Kuvan luomiseen vaaditaan kehote-solmun ID(t)",
@@ -34,6 +35,7 @@
 	"Add Group": "Lisää ryhmä",
 	"Add Memory": "Lisää muistia",
 	"Add Model": "Lisää malli",
+	"Add Reaction": "",
 	"Add Tag": "Lisää tagi",
 	"Add Tags": "Lisää tageja",
 	"Add text content": "Lisää tekstisisältöä",
@@ -534,6 +536,7 @@
 	"Language": "Kieli",
 	"Last Active": "Viimeksi aktiivinen",
 	"Last Modified": "Viimeksi muokattu",
+	"Last reply": "",
 	"LDAP": "LDAP",
 	"LDAP server updated": "LDAP-palvelin päivitetty",
 	"Leaderboard": "Tulosluettelo",
@@ -739,6 +742,7 @@
 	"Rename": "Nimeä uudelleen",
 	"Reorder Models": "Uudelleenjärjestä malleja",
 	"Repeat Last N": "Toista viimeiset N",
+	"Reply in Thread": "",
 	"Request Mode": "Pyyntötila",
 	"Reranking Model": "Uudelleenpisteytymismalli",
 	"Reranking model disabled": "Uudelleenpisteytymismalli poistettu käytöstä",
@@ -747,6 +751,7 @@
 	"Reset All Models": "Palauta kaikki mallit",
 	"Reset Upload Directory": "Palauta latauspolku",
 	"Reset Vector Storage/Knowledge": "Tyhjennä vektoritallennukset/tietämys",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Vastausilmoituksia ei voida ottaa käyttöön, koska verkkosivuston käyttöoikeudet on evätty. Myönnä tarvittavat käyttöoikeudet selaimesi asetuksista.",
 	"Response splitting": "Vastauksen jakaminen",
 	"Result": "Tulos",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "muuttuja korvataan leikepöydän sisällöllä.",
 	"Version": "Versio",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Versio {{selectedVersion}} / {{totalVersions}}",
+	"View Replies": "",
 	"Visibility": "Näkyvyys",
 	"Voice": "Ääni",
 	"Voice Input": "Äänitulolaitteen käyttö",

+ 6 - 0
src/lib/i18n/locales/fr-CA/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(par exemple `sh webui.sh --api`)",
 	"(latest)": "(dernier)",
 	"{{ models }}": "{{ modèles }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "Discussions de {{user}}",
 	"{{webUIName}} Backend Required": "Backend {{webUIName}} requis",
 	"*Prompt node ID(s) are required for image generation": "",
@@ -34,6 +35,7 @@
 	"Add Group": "",
 	"Add Memory": "Ajouter de la mémoire",
 	"Add Model": "Ajouter un modèle",
+	"Add Reaction": "",
 	"Add Tag": "",
 	"Add Tags": "Ajouter des balises",
 	"Add text content": "",
@@ -534,6 +536,7 @@
 	"Language": "Langue",
 	"Last Active": "Dernière activité",
 	"Last Modified": "Dernière modification",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "",
@@ -739,6 +742,7 @@
 	"Rename": "Renommer",
 	"Reorder Models": "",
 	"Repeat Last N": "Répéter les N derniers",
+	"Reply in Thread": "",
 	"Request Mode": "Mode de Requête",
 	"Reranking Model": "Modèle de ré-ranking",
 	"Reranking model disabled": "Modèle de ré-ranking désactivé",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "Répertoire de téléchargement réinitialisé",
 	"Reset Vector Storage/Knowledge": "",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Les notifications de réponse ne peuvent pas être activées car les autorisations du site web ont été refusées. Veuillez visiter les paramètres de votre navigateur pour accorder l'accès nécessaire.",
 	"Response splitting": "Fractionnement de la réponse",
 	"Result": "",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "variable pour qu'elles soient remplacées par le contenu du presse-papiers.",
 	"Version": "Version améliorée",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "Voix",
 	"Voice Input": "",

+ 54 - 48
src/lib/i18n/locales/fr-FR/translation.json

@@ -1,10 +1,11 @@
 {
-	"-1 for no limit, or a positive integer for a specific limit": "",
+	"-1 for no limit, or a positive integer for a specific limit": "-1 pour aucune limite, ou un entier positif pour une limite spécifique",
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": " 's', 'm', 'h', 'd', 'w' ou '-1' pour une durée illimitée.",
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(par ex. `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(par exemple `sh webui.sh --api`)",
 	"(latest)": "(dernière version)",
 	"{{ models }}": "{{ models }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "Conversations de {{user}}",
 	"{{webUIName}} Backend Required": "Backend {{webUIName}} requis",
 	"*Prompt node ID(s) are required for image generation": "*Les ID de noeud du prompt sont nécessaires pour la génération d’images",
@@ -34,6 +35,7 @@
 	"Add Group": "Ajouter un groupe",
 	"Add Memory": "Ajouter de la mémoire",
 	"Add Model": "Ajouter un modèle",
+	"Add Reaction": "",
 	"Add Tag": "Ajouter un tag",
 	"Add Tags": "Ajouter des tags",
 	"Add text content": "Ajouter du contenu textuel",
@@ -57,7 +59,7 @@
 	"Allow Temporary Chat": "Autoriser le chat éphémère",
 	"Allow User Location": "Autoriser l'emplacement de l'utilisateur",
 	"Allow Voice Interruption in Call": "Autoriser l'interruption vocale pendant un appel",
-	"Allowed Endpoints": "",
+	"Allowed Endpoints": "Points de terminaison autorisés",
 	"Already have an account?": "Avez-vous déjà un compte ?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "Alternative au top_p, visant à assurer un équilibre entre qualité et variété. Le paramètre p représente la probabilité minimale pour qu'un token soit pris en compte, par rapport à la probabilité du token le plus probable. Par exemple, avec p=0.05 et le token le plus probable ayant une probabilité de 0.9, les logits ayant une valeur inférieure à 0.045 sont filtrés. (Par défaut : 0.0)",
 	"Amazing": "Incroyable",
@@ -68,7 +70,7 @@
 	"API Base URL": "URL de base de l'API",
 	"API Key": "Clé d'API",
 	"API Key created.": "Clé d'API générée.",
-	"API Key Endpoint Restrictions": "",
+	"API Key Endpoint Restrictions": "Restrictions des points de terminaison de la clé API",
 	"API keys": "Clés d'API",
 	"Application DN": "DN de l'application",
 	"Application DN Password": "Mot de passe DN de l'application",
@@ -78,8 +80,8 @@
 	"Archive All Chats": "Archiver toutes les conversations",
 	"Archived Chats": "Conversations archivées",
 	"archived-chat-export": "exportation de conversation archivée",
-	"Are you sure you want to delete this channel?": "",
-	"Are you sure you want to delete this message?": "",
+	"Are you sure you want to delete this channel?": "Êtes-vous sûr de vouloir supprimer ce canal ?",
+	"Are you sure you want to delete this message?": "Êtes-vous sûr de vouloir supprimer ce message ?",
 	"Are you sure you want to unarchive all archived chats?": "Êtes-vous sûr de vouloir désarchiver toutes les conversations archivées?",
 	"Are you sure?": "Êtes-vous certain ?",
 	"Arena Models": "Modèles d'arène",
@@ -94,8 +96,8 @@
 	"Authenticate": "Authentifier",
 	"Auto-Copy Response to Clipboard": "Copie automatique de la réponse vers le presse-papiers",
 	"Auto-playback response": "Lire automatiquement la réponse",
-	"Autocomplete Generation": "",
-	"Autocomplete Generation Input Max Length": "",
+	"Autocomplete Generation": "Génération des suggestions",
+	"Autocomplete Generation Input Max Length": "Longueur maximale pour la génération des suggestions",
 	"Automatic1111": "Automatic1111",
 	"AUTOMATIC1111 Api Auth String": "AUTOMATIC1111 Chaîne d'authentification de l'API",
 	"AUTOMATIC1111 Base URL": "URL de base AUTOMATIC1111",
@@ -112,7 +114,7 @@
 	"Batch Size (num_batch)": "Batch Size (num_batch)",
 	"before": "avant",
 	"Being lazy": "Être fainéant",
-	"Beta": "",
+	"Beta": "Bêta",
 	"Bing Search V7 Endpoint": "Point de terminaison Bing Search V7",
 	"Bing Search V7 Subscription Key": "Clé d'abonnement Bing Search V7",
 	"Brave Search API Key": "Clé API Brave Search",
@@ -123,13 +125,13 @@
 	"Camera": "Appareil photo",
 	"Cancel": "Annuler",
 	"Capabilities": "Capacités",
-	"Capture": "",
+	"Capture": "Prise de vue",
 	"Certificate Path": "Chemin du certificat",
 	"Change Password": "Changer le mot de passe",
-	"Channel Name": "",
-	"Channels": "",
+	"Channel Name": "Nom du canal",
+	"Channels": "Canaux",
 	"Character": "Caractère",
-	"Character limit for autocomplete generation input": "",
+	"Character limit for autocomplete generation input": "Limite de caractères pour la génération des suggestions",
 	"Chart new frontiers": "Tracer de nouvelles frontières",
 	"Chat": "Chat",
 	"Chat Background Image": "Image d'arrière-plan de la fenêtre de chat",
@@ -170,7 +172,7 @@
 	"Collection": "Collection",
 	"Color": "Couleur",
 	"ComfyUI": "ComfyUI",
-	"ComfyUI API Key": "",
+	"ComfyUI API Key": "Clé API ComfyUI",
 	"ComfyUI Base URL": "URL de base ComfyUI",
 	"ComfyUI Base URL is required.": "L'URL de base ComfyUI est requise.",
 	"ComfyUI Workflow": "Flux de travaux de ComfyUI",
@@ -183,7 +185,7 @@
 	"Confirm": "Confirmer",
 	"Confirm Password": "Confirmer le mot de passe",
 	"Confirm your action": "Confirmer votre action",
-	"Confirm your new password": "",
+	"Confirm your new password": "Confirmer votre nouveau mot de passe",
 	"Connections": "Connexions",
 	"Contact Admin for WebUI Access": "Contacter l'administrateur pour obtenir l'accès à WebUI",
 	"Content": "Contenu",
@@ -210,7 +212,7 @@
 	"Create a model": "Créer un modèle",
 	"Create Account": "Créer un compte",
 	"Create Admin Account": "Créer un compte administrateur",
-	"Create Channel": "",
+	"Create Channel": "Créer un canal",
 	"Create Group": "Créer un groupe",
 	"Create Knowledge": "Créer une connaissance",
 	"Create new key": "Créer une nouvelle clé",
@@ -246,7 +248,7 @@
 	"Delete chat?": "Supprimer la conversation ?",
 	"Delete folder?": "Supprimer le dossier ?",
 	"Delete function?": "Supprimer la fonction ?",
-	"Delete Message": "",
+	"Delete Message": "Supprimer le message",
 	"Delete prompt?": "Supprimer le prompt ?",
 	"delete this link": "supprimer ce lien",
 	"Delete tool?": "Effacer l'outil ?",
@@ -299,7 +301,7 @@
 	"e.g. Tools for performing various operations": "par ex. Outils pour effectuer diverses opérations",
 	"Edit": "Modifier",
 	"Edit Arena Model": "Modifier le modèle d'arène",
-	"Edit Channel": "",
+	"Edit Channel": "Modifier le canal",
 	"Edit Connection": "Modifier la connexion",
 	"Edit Default Permissions": "Modifier les autorisations par défaut",
 	"Edit Memory": "Modifier la mémoire",
@@ -312,10 +314,10 @@
 	"Embedding Model": "Modèle d'embedding",
 	"Embedding Model Engine": "Moteur de modèle d'embedding",
 	"Embedding model set to \"{{embedding_model}}\"": "Modèle d'embedding défini sur « {{embedding_model}} »",
-	"Enable API Key": "",
-	"Enable autocomplete generation for chat messages": "",
+	"Enable API Key": "Activer la clé API",
+	"Enable autocomplete generation for chat messages": "Activer la génération des suggestions pour les messages",
 	"Enable Community Sharing": "Activer le partage communautaire",
-	"Enable Google Drive": "",
+	"Enable Google Drive": "Activer Google Drive",
 	"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "Activer le verrouillage de la mémoire (mlock) pour empêcher les données du modèle d'être échangées de la RAM. Cette option verrouille l'ensemble de pages de travail du modèle en RAM, garantissant qu'elles ne seront pas échangées vers le disque. Cela peut aider à maintenir les performances en évitant les défauts de page et en assurant un accès rapide aux données.",
 	"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "Activer le mappage de la mémoire (mmap) pour charger les données du modèle. Cette option permet au système d'utiliser le stockage disque comme une extension de la RAM en traitant les fichiers disque comme s'ils étaient en RAM. Cela peut améliorer les performances du modèle en permettant un accès plus rapide aux données. Cependant, cela peut ne pas fonctionner correctement avec tous les systèmes et peut consommer une quantité significative d'espace disque.",
 	"Enable Message Rating": "Activer l'évaluation des messages",
@@ -343,13 +345,13 @@
 	"Enter Google PSE Engine Id": "Entrez l'identifiant du moteur Google PSE",
 	"Enter Image Size (e.g. 512x512)": "Entrez la taille de l'image (par ex. 512x512)",
 	"Enter Jina API Key": "Entrez la clé API Jina",
-	"Enter Kagi Search API Key": "",
+	"Enter Kagi Search API Key": "Entrez la clé API Kagi Search",
 	"Enter language codes": "Entrez les codes de langue",
 	"Enter Model ID": "Entrez l'ID du modèle",
 	"Enter model tag (e.g. {{modelTag}})": "Entrez le tag du modèle (par ex. {{modelTag}})",
 	"Enter Mojeek Search API Key": "Entrez la clé API Mojeek",
 	"Enter Number of Steps (e.g. 50)": "Entrez le nombre d'étapes (par ex. 50)",
-	"Enter proxy URL (e.g. https://user:password@host:port)": "",
+	"Enter proxy URL (e.g. https://user:password@host:port)": "Entrez l'URL du proxy (par ex. https://use:password@host:port)",
 	"Enter Sampler (e.g. Euler a)": "Entrez le sampler (par ex. Euler a)",
 	"Enter Scheduler (e.g. Karras)": "Entrez le planificateur (par ex. Karras)",
 	"Enter Score": "Entrez votre score",
@@ -366,24 +368,24 @@
 	"Enter stop sequence": "Entrez la séquence d'arrêt",
 	"Enter system prompt": "Entrez le prompt système",
 	"Enter Tavily API Key": "Entrez la clé API Tavily",
-	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
+	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Entrez l'URL publique de votre WebUI. Cette URL sera utilisée pour générer des liens dans les notifications.",
 	"Enter Tika Server URL": "Entrez l'URL du serveur Tika",
 	"Enter Top K": "Entrez les Top K",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Entrez l'URL (par ex. {http://127.0.0.1:7860/})",
 	"Enter URL (e.g. http://localhost:11434)": "Entrez l'URL (par ex. http://localhost:11434)",
-	"Enter your current password": "",
+	"Enter your current password": "Entrez votre mot de passe actuel",
 	"Enter Your Email": "Entrez votre adresse e-mail",
 	"Enter Your Full Name": "Entrez votre nom complet",
 	"Enter your message": "Entrez votre message",
-	"Enter your new password": "",
+	"Enter your new password": "Entrez votre nouveau mot de passe",
 	"Enter Your Password": "Entrez votre mot de passe",
 	"Enter Your Role": "Entrez votre rôle",
 	"Enter Your Username": "Entrez votre nom d'utilisateur",
-	"Enter your webhook URL": "",
+	"Enter your webhook URL": "Entrez l'URL de votre webhook",
 	"Error": "Erreur",
 	"ERROR": "ERREUR",
-	"Error accessing Google Drive: {{error}}": "",
-	"Error uploading file: {{error}}": "",
+	"Error accessing Google Drive: {{error}}": "Erreur d'accès à Google Drive : {{error}}",
+	"Error uploading file: {{error}}": "Erreur de téléversement du fichier : {{error}}",
 	"Evaluations": "Évaluations",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "Exemple: (&(objectClass=inetOrgPerson)(uid=%s))",
 	"Example: ALL": "Exemple: TOUS",
@@ -422,7 +424,7 @@
 	"File not found.": "Fichier introuvable.",
 	"File removed successfully.": "Fichier supprimé avec succès.",
 	"File size should not exceed {{maxSize}} MB.": "La taille du fichier ne doit pas dépasser {{maxSize}} Mo.",
-	"File uploaded successfully": "",
+	"File uploaded successfully": "Fichier téléversé avec succès",
 	"Files": "Fichiers",
 	"Filter is now globally disabled": "Le filtre est maintenant désactivé globalement",
 	"Filter is now globally enabled": "Le filtre est désormais activé globalement",
@@ -460,7 +462,7 @@
 	"Get started with {{WEBUI_NAME}}": "Commencez avec {{WEBUI_NAME}}",
 	"Global": "Mondial",
 	"Good Response": "Bonne réponse",
-	"Google Drive": "",
+	"Google Drive": "Google Drive",
 	"Google PSE API Key": "Clé API Google PSE",
 	"Google PSE Engine Id": "ID du moteur de recherche PSE de Google",
 	"Group created successfully": "Groupe créé avec succès",
@@ -485,10 +487,10 @@
 	"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "Je reconnais avoir lu et compris les implications de mes actions. Je suis conscient des risques associés à l'exécution d'un code arbitraire et j'ai vérifié la fiabilité de la source.",
 	"ID": "ID",
 	"Ignite curiosity": "Éveiller la curiosité",
-	"Image Compression": "",
+	"Image Compression": "Compression d'image",
 	"Image Generation (Experimental)": "Génération d'images (expérimental)",
 	"Image Generation Engine": "Moteur de génération d'images",
-	"Image Max Compression Size": "",
+	"Image Max Compression Size": "Taille maximale de compression d'image",
 	"Image Settings": "Paramètres de génération d'images",
 	"Images": "Images",
 	"Import Chats": "Importer les conversations",
@@ -509,7 +511,7 @@
 	"Interface": "Interface utilisateur",
 	"Invalid file format.": "Format de fichier non valide.",
 	"Invalid Tag": "Tag non valide",
-	"is typing...": "",
+	"is typing...": "est en train d'écrire...",
 	"January": "Janvier",
 	"Jina API Key": "Clé API Jina",
 	"join our Discord for help.": "Rejoignez notre Discord pour obtenir de l'aide.",
@@ -519,7 +521,7 @@
 	"June": "Juin",
 	"JWT Expiration": "Expiration du token JWT",
 	"JWT Token": "Token JWT",
-	"Kagi Search API Key": "",
+	"Kagi Search API Key": "Clé API Kagi Search",
 	"Keep Alive": "Temps de maintien connecté",
 	"Key": "Clé",
 	"Keyboard shortcuts": "Raccourcis clavier",
@@ -534,6 +536,7 @@
 	"Language": "Langue",
 	"Last Active": "Dernière activité",
 	"Last Modified": "Dernière modification",
+	"Last reply": "",
 	"LDAP": "LDAP",
 	"LDAP server updated": "Serveur LDAP mis à jour",
 	"Leaderboard": "Classement",
@@ -608,9 +611,9 @@
 	"Name": "Nom d'utilisateur",
 	"Name your knowledge base": "Nommez votre base de connaissances",
 	"New Chat": "Nouvelle conversation",
-	"New folder": "",
+	"New folder": "Nouveau dossier",
 	"New Password": "Nouveau mot de passe",
-	"new-channel": "",
+	"new-channel": "nouveau-canal",
 	"No content found": "Aucun contenu trouvé",
 	"No content to speak": "Rien à signaler",
 	"No distance available": "Aucune distance disponible",
@@ -633,8 +636,8 @@
 	"Not helpful": "Pas utile",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Note : Si vous définissez un score minimum, seuls les documents ayant un score supérieur ou égal à ce score minimum seront retournés par la recherche.",
 	"Notes": "Notes",
-	"Notification Sound": "",
-	"Notification Webhook": "",
+	"Notification Sound": "Son de notification",
+	"Notification Webhook": "Webhook de notification",
 	"Notifications": "Notifications",
 	"November": "Novembre",
 	"num_gpu (Ollama)": "num_gpu (Ollama)",
@@ -700,7 +703,7 @@
 	"Please carefully review the following warnings:": "Veuillez lire attentivement les avertissements suivants :",
 	"Please enter a prompt": "Veuillez saisir un prompt",
 	"Please fill in all fields.": "Veuillez remplir tous les champs.",
-	"Please select a model first.": "",
+	"Please select a model first.": "Veuillez d'abord sélectionner un modèle.",
 	"Please select a reason": "Veuillez sélectionner une raison",
 	"Port": "Port",
 	"Positive attitude": "Attitude positive",
@@ -716,7 +719,7 @@
 	"Prompt updated successfully": "Prompt mis à jour avec succès",
 	"Prompts": "Prompts",
 	"Prompts Access": "Accès aux prompts",
-	"Proxy URL": "",
+	"Proxy URL": "URL du proxy",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Récupérer « {{searchValue}} » depuis Ollama.com",
 	"Pull a model from Ollama.com": "Télécharger un modèle depuis Ollama.com",
 	"Query Generation Prompt": "Prompt de génération de requête",
@@ -739,6 +742,7 @@
 	"Rename": "Renommer",
 	"Reorder Models": "Réorganiser les modèles",
 	"Repeat Last N": "Répéter les N derniers",
+	"Reply in Thread": "",
 	"Request Mode": "Mode de requête",
 	"Reranking Model": "Modèle de ré-ranking",
 	"Reranking model disabled": "Modèle de ré-ranking désactivé",
@@ -747,10 +751,11 @@
 	"Reset All Models": "Réinitialiser tous les modèles",
 	"Reset Upload Directory": "Réinitialiser le répertoire de téléchargement",
 	"Reset Vector Storage/Knowledge": "Réinitialiser le stockage vectoriel/connaissances",
+	"Reset view": "Réinitialiser la vue",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Les notifications de réponse ne peuvent pas être activées car les autorisations du site web ont été refusées. Veuillez vérifier les paramètres de votre navigateur pour accorder l'accès nécessaire.",
 	"Response splitting": "Fractionnement de la réponse",
 	"Result": "Résultat",
-	"Retrieval Query Generation": "",
+	"Retrieval Query Generation": "Génération de requête de RAG",
 	"Rich Text Input for Chat": "Saisie de texte enrichi pour le chat",
 	"RK": "Rang",
 	"Role": "Rôle",
@@ -784,7 +789,7 @@
 	"Search Tools": "Rechercher des outils",
 	"SearchApi API Key": "Clé API SearchApi",
 	"SearchApi Engine": "Moteur de recherche SearchApi",
-	"Searched {{count}} sites": "",
+	"Searched {{count}} sites": "{{count}} sites recherchés",
 	"Searching \"{{searchQuery}}\"": "Recherche de « {{searchQuery}} »",
 	"Searching Knowledge for \"{{searchQuery}}\"": "Recherche des connaissances pour « {{searchQuery}} »",
 	"Searxng Query URL": "URL de recherche Searxng",
@@ -852,7 +857,7 @@
 	"Sign up": "Inscrivez-vous",
 	"Sign up to {{WEBUI_NAME}}": "Inscrivez-vous à {{WEBUI_NAME}}",
 	"Signing in to {{WEBUI_NAME}}": "Connexion à {{WEBUI_NAME}}",
-	"sk-1234": "",
+	"sk-1234": "sk-1234",
 	"Source": "Source",
 	"Speech Playback Speed": "Vitesse de lecture de la parole",
 	"Speech recognition error: {{error}}": "Erreur de reconnaissance vocale\u00a0: {{error}}",
@@ -872,7 +877,7 @@
 	"System": "Système",
 	"System Instructions": "Instructions système",
 	"System Prompt": "Prompt système",
-	"Tags Generation": "",
+	"Tags Generation": "Génération de tags",
 	"Tags Generation Prompt": "Prompt de génération de tags",
 	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "L'échantillonnage sans queue est utilisé pour réduire l'impact des tokens moins probables dans la sortie. Une valeur plus élevée (par exemple 2.0) réduira davantage l'impact, tandis qu'une valeur de 1.0 désactive ce paramètre. (par défaut : 1)",
 	"Tap to interrupt": "Appuyez pour interrompre",
@@ -925,7 +930,7 @@
 	"To access the GGUF models available for downloading,": "Pour accéder aux modèles GGUF disponibles,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Pour accéder à l'interface Web, veuillez contacter l'administrateur. Les administrateurs peuvent gérer les statuts des utilisateurs depuis le panneau d'administration.",
 	"To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "Pour attacher une base de connaissances ici, ajoutez-les d'abord à l'espace de travail « Connaissances ».",
-	"To learn more about available endpoints, visit our documentation.": "",
+	"To learn more about available endpoints, visit our documentation.": "Pour en savoir plus sur les points de terminaison disponibles, consultez notre documentation.",
 	"To protect your privacy, only ratings, model IDs, tags, and metadata are shared from your feedback—your chat logs remain private and are not included.": "Pour protéger votre confidentialité, seules les notes, les identifiants de modèle, les tags et les métadonnées de vos commentaires sont partagés. Vos journaux de discussion restent privés et ne sont pas inclus.",
 	"To select actions here, add them to the \"Functions\" workspace first.": "Pour sélectionner des actions ici, ajoutez-les d'abord à l'espace de travail « Fonctions ».",
 	"To select filters here, add them to the \"Functions\" workspace first.": "Pour sélectionner des filtres ici, ajoutez-les d'abord à l'espace de travail « Fonctions ». ",
@@ -958,7 +963,7 @@
 	"TTS Voice": "Voix de Text-to-Speech",
 	"Type": "Type",
 	"Type Hugging Face Resolve (Download) URL": "Entrez l'URL de Téléchargement Hugging Face Resolve",
-	"Uh-oh! There was an issue with the response.": "",
+	"Uh-oh! There was an issue with the response.": "Oh! Un problème est survenu avec la réponse.",
 	"UI": "UI",
 	"Unarchive All": "Désarchiver tout",
 	"Unarchive All Archived Chats": "Désarchiver toutes les conversations archivées",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "variable pour qu'elles soient remplacées par le contenu du presse-papiers.",
 	"Version": "version:",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Version {{selectedVersion}} de {{totalVersions}}",
+	"View Replies": "",
 	"Visibility": "Visibilité",
 	"Voice": "Voix",
 	"Voice Input": "Saisie vocale",
@@ -1016,10 +1022,10 @@
 	"Web Loader Settings": "Paramètres du Web Loader",
 	"Web Search": "Recherche Web",
 	"Web Search Engine": "Moteur de recherche Web",
-	"Web Search Query Generation": "",
+	"Web Search Query Generation": "Génération de requête de recherche Web",
 	"Webhook URL": "URL du webhook",
 	"WebUI Settings": "Paramètres de WebUI",
-	"WebUI URL": "",
+	"WebUI URL": "URL de WebUI",
 	"WebUI will make requests to \"{{url}}/api/chat\"": "WebUI fera des requêtes à \"{{url}}/api/chat\"",
 	"WebUI will make requests to \"{{url}}/chat/completions\"": "WebUI fera des requêtes à \"{{url}}/chat/completions\"",
 	"What are you trying to achieve?": "Que cherchez-vous à accomplir ?",

+ 6 - 0
src/lib/i18n/locales/he-IL/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(למשל `sh webui.sh --api`)",
 	"(latest)": "(האחרון)",
 	"{{ models }}": "{{ דגמים }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "צ'אטים של {{user}}",
 	"{{webUIName}} Backend Required": "נדרש Backend של {{webUIName}}",
 	"*Prompt node ID(s) are required for image generation": "",
@@ -34,6 +35,7 @@
 	"Add Group": "",
 	"Add Memory": "הוסף זיכרון",
 	"Add Model": "הוסף מודל",
+	"Add Reaction": "",
 	"Add Tag": "",
 	"Add Tags": "הוסף תגים",
 	"Add text content": "",
@@ -534,6 +536,7 @@
 	"Language": "שפה",
 	"Last Active": "פעיל לאחרונה",
 	"Last Modified": "",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "",
@@ -739,6 +742,7 @@
 	"Rename": "שנה שם",
 	"Reorder Models": "",
 	"Repeat Last N": "חזור על ה-N האחרונים",
+	"Reply in Thread": "",
 	"Request Mode": "מצב בקשה",
 	"Reranking Model": "מודל דירוג מחדש",
 	"Reranking model disabled": "מודל דירוג מחדש מושבת",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "",
 	"Reset Vector Storage/Knowledge": "",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
 	"Result": "",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "משתנה להחליפו ב- clipboard תוכן.",
 	"Version": "גרסה",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "",
 	"Voice Input": "",

+ 6 - 0
src/lib/i18n/locales/hi-IN/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(e.g. `sh webui.sh --api`)",
 	"(latest)": "(latest)",
 	"{{ models }}": "{{ मॉडल }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "{{user}} की चैट",
 	"{{webUIName}} Backend Required": "{{webUIName}} बैकएंड आवश्यक",
 	"*Prompt node ID(s) are required for image generation": "",
@@ -34,6 +35,7 @@
 	"Add Group": "",
 	"Add Memory": "मेमोरी जोड़ें",
 	"Add Model": "मॉडल जोड़ें",
+	"Add Reaction": "",
 	"Add Tag": "",
 	"Add Tags": "टैगों को जोड़ें",
 	"Add text content": "",
@@ -534,6 +536,7 @@
 	"Language": "भाषा",
 	"Last Active": "पिछली बार सक्रिय",
 	"Last Modified": "",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "",
@@ -739,6 +742,7 @@
 	"Rename": "नाम बदलें",
 	"Reorder Models": "",
 	"Repeat Last N": "अंतिम N दोहराएँ",
+	"Reply in Thread": "",
 	"Request Mode": "अनुरोध मोड",
 	"Reranking Model": "रीरैकिंग मोड",
 	"Reranking model disabled": "पुनर्रैंकिंग मॉडल अक्षम किया गया",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "",
 	"Reset Vector Storage/Knowledge": "",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
 	"Result": "",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "उन्हें क्लिपबोर्ड सामग्री से बदलने के लिए वेरिएबल।",
 	"Version": "संस्करण",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "",
 	"Voice Input": "",

+ 6 - 0
src/lib/i18n/locales/hr-HR/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(npr. `sh webui.sh --api`)",
 	"(latest)": "(najnovije)",
 	"{{ models }}": "{{ modeli }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "Razgovori korisnika {{user}}",
 	"{{webUIName}} Backend Required": "{{webUIName}} Backend je potreban",
 	"*Prompt node ID(s) are required for image generation": "",
@@ -34,6 +35,7 @@
 	"Add Group": "",
 	"Add Memory": "Dodaj memoriju",
 	"Add Model": "Dodaj model",
+	"Add Reaction": "",
 	"Add Tag": "",
 	"Add Tags": "Dodaj oznake",
 	"Add text content": "",
@@ -534,6 +536,7 @@
 	"Language": "Jezik",
 	"Last Active": "Zadnja aktivnost",
 	"Last Modified": "",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "",
@@ -739,6 +742,7 @@
 	"Rename": "Preimenuj",
 	"Reorder Models": "",
 	"Repeat Last N": "Ponovi zadnjih N",
+	"Reply in Thread": "",
 	"Request Mode": "Način zahtjeva",
 	"Reranking Model": "Model za ponovno rangiranje",
 	"Reranking model disabled": "Model za ponovno rangiranje onemogućen",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "Poništi upload direktorij",
 	"Reset Vector Storage/Knowledge": "",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
 	"Result": "",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "varijabla za zamjenu sadržajem međuspremnika.",
 	"Version": "Verzija",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "",
 	"Voice Input": "",

+ 6 - 0
src/lib/i18n/locales/hu-HU/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(pl. `sh webui.sh --api`)",
 	"(latest)": "(legújabb)",
 	"{{ models }}": "{{ modellek }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "{{user}} beszélgetései",
 	"{{webUIName}} Backend Required": "{{webUIName}} Backend szükséges",
 	"*Prompt node ID(s) are required for image generation": "*Prompt node ID(k) szükségesek a képgeneráláshoz",
@@ -34,6 +35,7 @@
 	"Add Group": "",
 	"Add Memory": "Memória hozzáadása",
 	"Add Model": "Modell hozzáadása",
+	"Add Reaction": "",
 	"Add Tag": "Címke hozzáadása",
 	"Add Tags": "Címkék hozzáadása",
 	"Add text content": "Szöveges tartalom hozzáadása",
@@ -534,6 +536,7 @@
 	"Language": "Nyelv",
 	"Last Active": "Utoljára aktív",
 	"Last Modified": "Utoljára módosítva",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "Ranglista",
@@ -739,6 +742,7 @@
 	"Rename": "Átnevezés",
 	"Reorder Models": "",
 	"Repeat Last N": "Utolsó N ismétlése",
+	"Reply in Thread": "",
 	"Request Mode": "Kérési mód",
 	"Reranking Model": "Újrarangsoroló modell",
 	"Reranking model disabled": "Újrarangsoroló modell letiltva",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "Feltöltési könyvtár visszaállítása",
 	"Reset Vector Storage/Knowledge": "Vektor tárhely/tudásbázis visszaállítása",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "A válasz értesítések nem aktiválhatók, mert a weboldal engedélyei meg lettek tagadva. Kérjük, látogasson el a böngésző beállításaihoz a szükséges hozzáférés megadásához.",
 	"Response splitting": "Válasz felosztás",
 	"Result": "Eredmény",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "változó, hogy a vágólap tartalmával helyettesítse őket.",
 	"Version": "Verzió",
 	"Version {{selectedVersion}} of {{totalVersions}}": "{{selectedVersion}}. verzió a {{totalVersions}}-ból",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "Hang",
 	"Voice Input": "Hangbevitel",

+ 6 - 0
src/lib/i18n/locales/id-ID/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(contoh: `sh webui.sh --api`)",
 	"(latest)": "(terbaru)",
 	"{{ models }}": "{{ models }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "Obrolan {{user}}",
 	"{{webUIName}} Backend Required": "{{webUIName}} Diperlukan Backend",
 	"*Prompt node ID(s) are required for image generation": "",
@@ -34,6 +35,7 @@
 	"Add Group": "",
 	"Add Memory": "Menambahkan Memori",
 	"Add Model": "Tambahkan Model",
+	"Add Reaction": "",
 	"Add Tag": "",
 	"Add Tags": "Tambahkan Tag",
 	"Add text content": "",
@@ -534,6 +536,7 @@
 	"Language": "Bahasa",
 	"Last Active": "Terakhir Aktif",
 	"Last Modified": "Terakhir Dimodifikasi",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "",
@@ -739,6 +742,7 @@
 	"Rename": "Ganti nama",
 	"Reorder Models": "",
 	"Repeat Last N": "Ulangi N Terakhir",
+	"Reply in Thread": "",
 	"Request Mode": "Mode Permintaan",
 	"Reranking Model": "Model Pemeringkatan Ulang",
 	"Reranking model disabled": "Model pemeringkatan ulang dinonaktifkan",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "Setel Ulang Direktori Unggahan",
 	"Reset Vector Storage/Knowledge": "",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Notifikasi respons tidak dapat diaktifkan karena izin situs web telah ditolak. Silakan kunjungi pengaturan browser Anda untuk memberikan akses yang diperlukan.",
 	"Response splitting": "",
 	"Result": "",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "variabel untuk diganti dengan konten papan klip.",
 	"Version": "Versi",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "Suara",
 	"Voice Input": "",

+ 6 - 0
src/lib/i18n/locales/ie-GA/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(m.sh. `sh webui.sh --api`)",
 	"(latest)": "(is déanaí)",
 	"{{ models }}": "{{models}}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "Comhráite {{user}}",
 	"{{webUIName}} Backend Required": "{{webUIName}} Ceoldeireadh Riachtanach",
 	"*Prompt node ID(s) are required for image generation": "* Tá ID nód pras ag teastáil chun íomhá a ghiniúint",
@@ -34,6 +35,7 @@
 	"Add Group": "Cuir Grúpa leis",
 	"Add Memory": "Cuir Cuimhne",
 	"Add Model": "Cuir múnla leis",
+	"Add Reaction": "",
 	"Add Tag": "Cuir Clib leis",
 	"Add Tags": "Cuir Clibeanna leis",
 	"Add text content": "Cuir ábhar téacs leis",
@@ -534,6 +536,7 @@
 	"Language": "Teanga",
 	"Last Active": "Gníomhach Deiridh",
 	"Last Modified": "Athraithe Deiridh",
+	"Last reply": "",
 	"LDAP": "LDAP",
 	"LDAP server updated": "Nuashonraíodh freastalaí LDAP",
 	"Leaderboard": "An Clár Ceannairí",
@@ -739,6 +742,7 @@
 	"Rename": "Athainmnigh",
 	"Reorder Models": "",
 	"Repeat Last N": "Déan an N deireanach arís",
+	"Reply in Thread": "",
 	"Request Mode": "Mód Iarratais",
 	"Reranking Model": "Múnla Athrangú",
 	"Reranking model disabled": "Samhail athrangú faoi mhíchumas",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "Athshocraigh Eolaire Uas",
 	"Reset Vector Storage/Knowledge": "Athshocraigh Stóráil/Eolas Veicteoir",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Ní féidir fógraí freagartha a ghníomhachtú toisc gur diúltaíodh ceadanna an tsuímh Ghréasáin. Tabhair cuairt ar do shocruithe brabhsálaí chun an rochtain riachtanach a dheonú.",
 	"Response splitting": "Scoilt freagartha",
 	"Result": "Toradh",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "athróg chun ábhar gearrthaisce a chur in ionad iad.",
 	"Version": "Leagan",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Leagan {{selectedVersion}} de {{totalVersions}}",
+	"View Replies": "",
 	"Visibility": "Infheictheacht",
 	"Voice": "Guth",
 	"Voice Input": "Ionchur Gutha",

+ 6 - 0
src/lib/i18n/locales/it-IT/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(p.e. `sh webui.sh --api`)",
 	"(latest)": "(ultima)",
 	"{{ models }}": "{{ modelli }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "{{user}} Chat",
 	"{{webUIName}} Backend Required": "{{webUIName}} Backend richiesto",
 	"*Prompt node ID(s) are required for image generation": "",
@@ -34,6 +35,7 @@
 	"Add Group": "",
 	"Add Memory": "Aggiungi memoria",
 	"Add Model": "Aggiungi modello",
+	"Add Reaction": "",
 	"Add Tag": "",
 	"Add Tags": "Aggiungi tag",
 	"Add text content": "",
@@ -534,6 +536,7 @@
 	"Language": "Lingua",
 	"Last Active": "Ultima attività",
 	"Last Modified": "",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "",
@@ -739,6 +742,7 @@
 	"Rename": "Rinomina",
 	"Reorder Models": "",
 	"Repeat Last N": "Ripeti ultimi N",
+	"Reply in Thread": "",
 	"Request Mode": "Modalità richiesta",
 	"Reranking Model": "Modello di riclassificazione",
 	"Reranking model disabled": "Modello di riclassificazione disabilitato",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "",
 	"Reset Vector Storage/Knowledge": "",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
 	"Result": "",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "variabile per farli sostituire con il contenuto degli appunti.",
 	"Version": "Versione",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "",
 	"Voice Input": "",

+ 23 - 17
src/lib/i18n/locales/ja-JP/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(例: `sh webui.sh --api`)",
 	"(latest)": "(最新)",
 	"{{ models }}": "{{ モデル }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "{{user}} のチャット",
 	"{{webUIName}} Backend Required": "{{webUIName}} バックエンドが必要です",
 	"*Prompt node ID(s) are required for image generation": "",
@@ -34,6 +35,7 @@
 	"Add Group": "",
 	"Add Memory": "メモリを追加",
 	"Add Model": "モデルを追加",
+	"Add Reaction": "",
 	"Add Tag": "タグを追加",
 	"Add Tags": "タグを追加",
 	"Add text content": "コンテンツを追加",
@@ -138,7 +140,7 @@
 	"Chat direction": "チャットの方向",
 	"Chat Overview": "チャット概要",
 	"Chat Permissions": "",
-	"Chat Tags Auto-Generation": "",
+	"Chat Tags Auto-Generation": "チャットタグの自動生成",
 	"Chats": "チャット",
 	"Check Again": "再確認",
 	"Check for updates": "アップデートを確認",
@@ -181,7 +183,7 @@
 	"Configure": "",
 	"Configure Models": "",
 	"Confirm": "確認",
-	"Confirm Password": "パスワード確認",
+	"Confirm Password": "パスワード確認",
 	"Confirm your action": "あなたのアクションの確認",
 	"Confirm your new password": "",
 	"Connections": "接続",
@@ -212,7 +214,7 @@
 	"Create Admin Account": "",
 	"Create Channel": "",
 	"Create Group": "",
-	"Create Knowledge": "知識データ作成",
+	"Create Knowledge": "ナレッジベース作成",
 	"Create new key": "新しいキーを作成",
 	"Create new secret key": "新しいシークレットキーを作成",
 	"Created at": "作成日時",
@@ -315,7 +317,7 @@
 	"Enable API Key": "",
 	"Enable autocomplete generation for chat messages": "",
 	"Enable Community Sharing": "コミュニティ共有を有効にする",
-	"Enable Google Drive": "",
+	"Enable Google Drive": "Google Driveの有効化",
 	"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
 	"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
 	"Enable Message Rating": "メッセージ評価を有効にする",
@@ -523,17 +525,18 @@
 	"Keep Alive": "キープアライブ",
 	"Key": "",
 	"Keyboard shortcuts": "キーボードショートカット",
-	"Knowledge": "知識",
+	"Knowledge": "ナレッジベース",
 	"Knowledge Access": "",
-	"Knowledge created successfully.": "知識の作成に成功しました",
-	"Knowledge deleted successfully.": "知識の削除に成功しました",
-	"Knowledge reset successfully.": "知識のリセットに成功しました",
-	"Knowledge updated successfully": "知識のアップデートに成功しました",
+	"Knowledge created successfully.": "ナレッジベースの作成に成功しました",
+	"Knowledge deleted successfully.": "ナレッジベースの削除に成功しました",
+	"Knowledge reset successfully.": "ナレッジベースのリセットに成功しました",
+	"Knowledge updated successfully": "ナレッジベースのアップデートに成功しました",
 	"Label": "",
 	"Landing Page Mode": "ランディングページモード",
 	"Language": "言語",
 	"Last Active": "最終アクティブ",
 	"Last Modified": "",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "",
@@ -619,7 +622,7 @@
 	"No files found.": "",
 	"No groups with access, add a group to grant access": "",
 	"No HTML, CSS, or JavaScript content found.": "",
-	"No knowledge found": "知識が見つかりません",
+	"No knowledge found": "ナレッジベースが見つかりません",
 	"No model IDs": "",
 	"No models found": "",
 	"No models selected": "",
@@ -633,7 +636,7 @@
 	"Not helpful": "",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "注意:最小スコアを設定した場合、検索は最小スコア以上のスコアを持つドキュメントのみを返します。",
 	"Notes": "",
-	"Notification Sound": "",
+	"Notification Sound": "通知音",
 	"Notification Webhook": "",
 	"Notifications": "デスクトップ通知",
 	"November": "11月",
@@ -739,6 +742,7 @@
 	"Rename": "名前を変更",
 	"Reorder Models": "",
 	"Repeat Last N": "最後の N を繰り返す",
+	"Reply in Thread": "",
 	"Request Mode": "リクエストモード",
 	"Reranking Model": "モデルの再ランキング",
 	"Reranking model disabled": "再ランキングモデルが無効です",
@@ -746,7 +750,8 @@
 	"Reset": "",
 	"Reset All Models": "",
 	"Reset Upload Directory": "アップロードディレクトリをリセット",
-	"Reset Vector Storage/Knowledge": "",
+	"Reset Vector Storage/Knowledge": "ベクターストレージとナレッジべーうをリセット",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "応答の分割",
 	"Result": "",
@@ -775,7 +780,7 @@
 	"Search Filters": "",
 	"search for tags": "",
 	"Search Functions": "Functionの検索",
-	"Search Knowledge": "知識の検索",
+	"Search Knowledge": "ナレッジベースの検索",
 	"Search Models": "モデル検索",
 	"Search options": "",
 	"Search Prompts": "プロンプトを検索",
@@ -800,7 +805,7 @@
 	"Select a pipeline url": "パイプラインの URL を選択する",
 	"Select a tool": "ツールの選択",
 	"Select Engine": "エンジンの選択",
-	"Select Knowledge": "知識の選択",
+	"Select Knowledge": "ナレッジベースの選択",
 	"Select model": "モデルを選択",
 	"Select only one model to call": "",
 	"Selected model(s) do not support image inputs": "一部のモデルは画像入力をサポートしていません",
@@ -854,7 +859,7 @@
 	"Signing in to {{WEBUI_NAME}}": "",
 	"sk-1234": "",
 	"Source": "ソース",
-	"Speech Playback Speed": "",
+	"Speech Playback Speed": "音声の再生速度",
 	"Speech recognition error: {{error}}": "音声認識エラー: {{error}}",
 	"Speech-to-Text Engine": "音声テキスト変換エンジン",
 	"Stop": "",
@@ -944,7 +949,7 @@
 	"Tool imported successfully": "",
 	"Tool Name": "",
 	"Tool updated successfully": "",
-	"Tools": "",
+	"Tools": "ツール",
 	"Tools Access": "",
 	"Tools are a function calling system with arbitrary code execution": "",
 	"Tools have a function calling system that allows arbitrary code execution": "",
@@ -983,7 +988,7 @@
 	"Upload Progress": "アップロードの進行状況",
 	"URL": "",
 	"URL Mode": "URL モード",
-	"Use '#' in the prompt input to load and include your knowledge.": "#を入力すると知識データを参照することが出来ます。",
+	"Use '#' in the prompt input to load and include your knowledge.": "#を入力するとナレッジベースを参照することが出来ます。",
 	"Use Gravatar": "Gravatar を使用する",
 	"Use groups to group your users and assign permissions.": "",
 	"Use Initials": "初期値を使用する",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "クリップボードの内容に置き換える変数。",
 	"Version": "バージョン",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "ボイス",
 	"Voice Input": "",

+ 6 - 0
src/lib/i18n/locales/ka-GE/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(მაგ. `sh webui.sh --api`)",
 	"(latest)": "(უახლესი)",
 	"{{ models }}": "{{ models }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "{{user}}-ის ჩათები",
 	"{{webUIName}} Backend Required": "{{webUIName}} საჭიროა ბექენდი",
 	"*Prompt node ID(s) are required for image generation": "",
@@ -34,6 +35,7 @@
 	"Add Group": "",
 	"Add Memory": "მემორიის დამატება",
 	"Add Model": "მოდელის დამატება",
+	"Add Reaction": "",
 	"Add Tag": "",
 	"Add Tags": "ტეგების დამატება",
 	"Add text content": "",
@@ -534,6 +536,7 @@
 	"Language": "ენა",
 	"Last Active": "ბოლო აქტიური",
 	"Last Modified": "",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "",
@@ -739,6 +742,7 @@
 	"Rename": "პოპულარობის რაოდენობა",
 	"Reorder Models": "",
 	"Repeat Last N": "გაიმეორეთ ბოლო N",
+	"Reply in Thread": "",
 	"Request Mode": "მოთხოვნის რეჟიმი",
 	"Reranking Model": "რექვექტირება",
 	"Reranking model disabled": "რექვექტირება არაა ჩართული",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "",
 	"Reset Vector Storage/Knowledge": "",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
 	"Result": "",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "ცვლადი, რომ შეცვალოს ისინი ბუფერში შიგთავსით.",
 	"Version": "ვერსია",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "",
 	"Voice Input": "",

+ 6 - 0
src/lib/i18n/locales/ko-KR/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(예: `sh webui.sh --api`)",
 	"(latest)": "(최근)",
 	"{{ models }}": "{{ models }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "{{user}}의 채팅",
 	"{{webUIName}} Backend Required": "{{webUIName}} 백엔드가 필요합니다.",
 	"*Prompt node ID(s) are required for image generation": "사진 생성을 위해 프롬포트 노드 ID가 필요합니다",
@@ -34,6 +35,7 @@
 	"Add Group": "",
 	"Add Memory": "메모리 추가",
 	"Add Model": "모델 추가",
+	"Add Reaction": "",
 	"Add Tag": "태그 추가",
 	"Add Tags": "태그 추가",
 	"Add text content": "글 추가",
@@ -534,6 +536,7 @@
 	"Language": "언어",
 	"Last Active": "최근 활동",
 	"Last Modified": "마지막 수정",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "리더보드",
@@ -739,6 +742,7 @@
 	"Rename": "이름 변경",
 	"Reorder Models": "",
 	"Repeat Last N": "마지막 N 반복",
+	"Reply in Thread": "",
 	"Request Mode": "요청 모드",
 	"Reranking Model": "Reranking 모델",
 	"Reranking model disabled": "Reranking 모델 비활성화",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "업로드 디렉토리 초기화",
 	"Reset Vector Storage/Knowledge": "벡터 저장 공간/지식 기반 초기화",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "웹사이트 권환과 같이 응답 알림이 활성화될 수 없습니다. 필요한 접근을 사용하기 위해 브라우져 설정을 확인 부탁드립니다.",
 	"Response splitting": "응답 나누기",
 	"Result": "결과",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "변수를 사용하여 클립보드 내용으로 바꾸세요.",
 	"Version": "버전",
 	"Version {{selectedVersion}} of {{totalVersions}}": "버전 {{totalVersions}}의 {{selectedVersion}}",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "음성",
 	"Voice Input": "음성 입력",

+ 6 - 0
src/lib/i18n/locales/lt-LT/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(pvz. `sh webui.sh --api`)",
 	"(latest)": "(naujausias)",
 	"{{ models }}": "{{ models }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "{{user}} susirašinėjimai",
 	"{{webUIName}} Backend Required": "{{webUIName}} būtinas serveris",
 	"*Prompt node ID(s) are required for image generation": "",
@@ -34,6 +35,7 @@
 	"Add Group": "",
 	"Add Memory": "Pridėti atminį",
 	"Add Model": "Pridėti modelį",
+	"Add Reaction": "",
 	"Add Tag": "Pridėti žymą",
 	"Add Tags": "Pridėti žymas",
 	"Add text content": "",
@@ -534,6 +536,7 @@
 	"Language": "Kalba",
 	"Last Active": "Paskutinį kartą aktyvus",
 	"Last Modified": "Paskutinis pakeitimas",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "",
@@ -739,6 +742,7 @@
 	"Rename": "Pervadinti",
 	"Reorder Models": "",
 	"Repeat Last N": "Pakartoti paskutinius N",
+	"Reply in Thread": "",
 	"Request Mode": "Užklausos rėžimas",
 	"Reranking Model": "Reranking modelis",
 	"Reranking model disabled": "Reranking modelis neleidžiamas",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "Atkurti įkėlimų direktoiją",
 	"Reset Vector Storage/Knowledge": "",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Naršyklė neleidžia siųsti pranešimų",
 	"Response splitting": "",
 	"Result": "",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "kintamoji pakeičiama kopijuoklės turiniu.",
 	"Version": "Versija",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "Balsas",
 	"Voice Input": "",

+ 6 - 0
src/lib/i18n/locales/ms-MY/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(contoh `sh webui.sh --api`)",
 	"(latest)": "(terkini)",
 	"{{ models }}": "{{ models }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "Perbualan {{user}}",
 	"{{webUIName}} Backend Required": "{{webUIName}} Backend diperlukan",
 	"*Prompt node ID(s) are required for image generation": "",
@@ -34,6 +35,7 @@
 	"Add Group": "",
 	"Add Memory": "Tambah Memori",
 	"Add Model": "Tambah Model",
+	"Add Reaction": "",
 	"Add Tag": "Tambah Tag",
 	"Add Tags": "Tambah Tag",
 	"Add text content": "",
@@ -534,6 +536,7 @@
 	"Language": "Bahasa",
 	"Last Active": "Dilihat aktif terakhir pada",
 	"Last Modified": "Kemaskini terakhir pada",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "",
@@ -739,6 +742,7 @@
 	"Rename": "Namakan Semula",
 	"Reorder Models": "",
 	"Repeat Last N": "Ulang N Terakhir",
+	"Reply in Thread": "",
 	"Request Mode": "Mod Permintaan",
 	"Reranking Model": "Model 'Reranking'",
 	"Reranking model disabled": "Model 'Reranking' dilumpuhkan",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "Tetapkan Semula Direktori Muat Naik",
 	"Reset Vector Storage/Knowledge": "",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Pemberitahuan respons tidak boleh diaktifkan kerana kebenaran tapak web tidak diberi. Sila lawati tetapan pelayar web anda untuk memberikan akses yang diperlukan.",
 	"Response splitting": "",
 	"Result": "",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "pembolehubah untuk ia digantikan dengan kandungan papan klip.",
 	"Version": "Versi",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "Suara",
 	"Voice Input": "",

+ 6 - 0
src/lib/i18n/locales/nb-NO/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(f.eks. `sh webui.sh --api`)",
 	"(latest)": "(siste)",
 	"{{ models }}": "{{ modeller }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "{{user}} sine samtaler",
 	"{{webUIName}} Backend Required": "Backend til {{webUIName}} kreves",
 	"*Prompt node ID(s) are required for image generation": "Node-ID-er for ledetekst kreves for generering av bilder",
@@ -34,6 +35,7 @@
 	"Add Group": "Legg til gruppe",
 	"Add Memory": "Legg til minne",
 	"Add Model": "Legg til modell",
+	"Add Reaction": "",
 	"Add Tag": "Legg til etikett",
 	"Add Tags": "Legg til etiketter",
 	"Add text content": "Legg til tekstinnhold",
@@ -534,6 +536,7 @@
 	"Language": "Språk",
 	"Last Active": "Sist aktiv",
 	"Last Modified": "Sist endret",
+	"Last reply": "",
 	"LDAP": "LDAP",
 	"LDAP server updated": "LDAP-server oppdatert",
 	"Leaderboard": "Ledertavle",
@@ -739,6 +742,7 @@
 	"Rename": "Gi nytt navn",
 	"Reorder Models": "Sorter modeller på nytt",
 	"Repeat Last N": "Gjenta siste N",
+	"Reply in Thread": "",
 	"Request Mode": "Forespørselsmodus",
 	"Reranking Model": "Omrangeringsmodell",
 	"Reranking model disabled": "Omrangeringsmodell deaktivert",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "Tilbakestill opplastingskatalog",
 	"Reset Vector Storage/Knowledge": "Tilbakestill Vector-lagring/kunnskap",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Svar-varsler kan ikke aktiveres fordi tilgang til nettstedet er nektet. Gå til nettleserinnstillingene dine for å gi den nødvendige tilgangen.",
 	"Response splitting": "Oppdeling av svar",
 	"Result": "Resultat",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "variabel for å erstatte dem med utklippstavleinnhold.",
 	"Version": "Versjon",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Version {{selectedVersion}} av {{totalVersions}}",
+	"View Replies": "",
 	"Visibility": "Synlighet",
 	"Voice": "Stemme",
 	"Voice Input": "Taleinndata",

+ 6 - 0
src/lib/i18n/locales/nl-NL/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(bv. `sh webui.sh --api`)",
 	"(latest)": "(nieuwste)",
 	"{{ models }}": "{{ modellen }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "{{user}}'s chats",
 	"{{webUIName}} Backend Required": "{{webUIName}} Backend Verplicht",
 	"*Prompt node ID(s) are required for image generation": "*Prompt node ID('s) zijn vereist voor het genereren van afbeeldingen",
@@ -34,6 +35,7 @@
 	"Add Group": "Voeg groep toe",
 	"Add Memory": "Voeg geheugen toe",
 	"Add Model": "Voeg model toe",
+	"Add Reaction": "",
 	"Add Tag": "Voeg tag toe",
 	"Add Tags": "Voeg tags toe",
 	"Add text content": "Voeg tekstinhoud toe",
@@ -534,6 +536,7 @@
 	"Language": "Taal",
 	"Last Active": "Laatst Actief",
 	"Last Modified": "Laatst aangepast",
+	"Last reply": "",
 	"LDAP": "LDAP",
 	"LDAP server updated": "LDAP-server bijgewerkt",
 	"Leaderboard": "Klassement",
@@ -739,6 +742,7 @@
 	"Rename": "Hernoemen",
 	"Reorder Models": "Herschik modellen",
 	"Repeat Last N": "Herhaal Laatste N",
+	"Reply in Thread": "",
 	"Request Mode": "Request Modus",
 	"Reranking Model": "Reranking Model",
 	"Reranking model disabled": "Reranking model uitgeschakeld",
@@ -747,6 +751,7 @@
 	"Reset All Models": "Herstel alle modellen",
 	"Reset Upload Directory": "Herstel Uploadmap",
 	"Reset Vector Storage/Knowledge": "Herstel Vectoropslag/-kennis",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Antwoordmeldingen kunnen niet worden geactiveerd omdat de rechten voor de website zijn geweigerd. Ga naar de instellingen van uw browser om de benodigde toegang te verlenen.",
 	"Response splitting": "Antwoord splitsing",
 	"Result": "Resultaat",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "variabele om ze te laten vervangen door klembord inhoud.",
 	"Version": "Versie",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Versie {{selectedVersion}} van {{totalVersions}}",
+	"View Replies": "",
 	"Visibility": "Zichtbaarheid",
 	"Voice": "Stem",
 	"Voice Input": "Steminvoer",

+ 6 - 0
src/lib/i18n/locales/pa-IN/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(ਉਦਾਹਰਣ ਦੇ ਤੌਰ ਤੇ `sh webui.sh --api`)",
 	"(latest)": "(ਤਾਜ਼ਾ)",
 	"{{ models }}": "{{ ਮਾਡਲ }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "{{user}} ਦੀਆਂ ਗੱਲਾਂ",
 	"{{webUIName}} Backend Required": "{{webUIName}} ਬੈਕਐਂਡ ਲੋੜੀਂਦਾ ਹੈ",
 	"*Prompt node ID(s) are required for image generation": "",
@@ -34,6 +35,7 @@
 	"Add Group": "",
 	"Add Memory": "ਮਿਹਾਨ ਸ਼ਾਮਲ ਕਰੋ",
 	"Add Model": "ਮਾਡਲ ਸ਼ਾਮਲ ਕਰੋ",
+	"Add Reaction": "",
 	"Add Tag": "",
 	"Add Tags": "ਟੈਗ ਸ਼ਾਮਲ ਕਰੋ",
 	"Add text content": "",
@@ -534,6 +536,7 @@
 	"Language": "ਭਾਸ਼ਾ",
 	"Last Active": "ਆਖਰੀ ਸਰਗਰਮ",
 	"Last Modified": "",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "",
@@ -739,6 +742,7 @@
 	"Rename": "ਨਾਮ ਬਦਲੋ",
 	"Reorder Models": "",
 	"Repeat Last N": "ਆਖਰੀ N ਨੂੰ ਦੁਹਰਾਓ",
+	"Reply in Thread": "",
 	"Request Mode": "ਬੇਨਤੀ ਮੋਡ",
 	"Reranking Model": "ਮਾਡਲ ਮੁੜ ਰੈਂਕਿੰਗ",
 	"Reranking model disabled": "ਮਾਡਲ ਮੁੜ ਰੈਂਕਿੰਗ ਅਯੋਗ ਕੀਤਾ ਗਿਆ",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "",
 	"Reset Vector Storage/Knowledge": "",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
 	"Result": "",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "ਕਲਿੱਪਬੋਰਡ ਸਮੱਗਰੀ ਨਾਲ ਬਦਲਣ ਲਈ ਵੈਰੀਏਬਲ।",
 	"Version": "ਵਰਜਨ",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "",
 	"Voice Input": "",

+ 6 - 0
src/lib/i18n/locales/pl-PL/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(np. `sh webui.sh --api`)",
 	"(latest)": "(najnowszy)",
 	"{{ models }}": "{{ modele }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "{{user}} - czaty",
 	"{{webUIName}} Backend Required": "Backend {{webUIName}} wymagane",
 	"*Prompt node ID(s) are required for image generation": "",
@@ -34,6 +35,7 @@
 	"Add Group": "",
 	"Add Memory": "Dodaj pamięć",
 	"Add Model": "Dodaj model",
+	"Add Reaction": "",
 	"Add Tag": "",
 	"Add Tags": "Dodaj tagi",
 	"Add text content": "",
@@ -534,6 +536,7 @@
 	"Language": "Język",
 	"Last Active": "Ostatnio aktywny",
 	"Last Modified": "",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "",
@@ -739,6 +742,7 @@
 	"Rename": "ZMień nazwę",
 	"Reorder Models": "",
 	"Repeat Last N": "Powtórz ostatnie N",
+	"Reply in Thread": "",
 	"Request Mode": "Tryb żądania",
 	"Reranking Model": "Zmiana rankingu modelu",
 	"Reranking model disabled": "Zmiana rankingu modelu zablokowana",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "",
 	"Reset Vector Storage/Knowledge": "",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
 	"Result": "",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "zmienna która zostanie zastąpiona zawartością schowka.",
 	"Version": "Wersja",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "",
 	"Voice Input": "",

+ 6 - 0
src/lib/i18n/locales/pt-BR/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(por exemplo, `sh webui.sh --api`)",
 	"(latest)": "(último)",
 	"{{ models }}": "{{ models }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "Chats de {{user}}",
 	"{{webUIName}} Backend Required": "Backend {{webUIName}} necessário",
 	"*Prompt node ID(s) are required for image generation": "*Prompt node ID(s) são obrigatórios para gerar imagens",
@@ -34,6 +35,7 @@
 	"Add Group": "Adicionar Grupo",
 	"Add Memory": "Adicionar Memória",
 	"Add Model": "Adicionar Modelo",
+	"Add Reaction": "",
 	"Add Tag": "Adicionar Tag",
 	"Add Tags": "Adicionar Tags",
 	"Add text content": "Adicionar conteúdo de texto",
@@ -534,6 +536,7 @@
 	"Language": "Idioma",
 	"Last Active": "Última Atividade",
 	"Last Modified": "Última Modificação",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "Servidor LDAP atualizado",
 	"Leaderboard": "Tabela de classificação",
@@ -739,6 +742,7 @@
 	"Rename": "Renomear",
 	"Reorder Models": "",
 	"Repeat Last N": "Repetir Último N",
+	"Reply in Thread": "",
 	"Request Mode": "Modo de Solicitação",
 	"Reranking Model": "Modelo de Reclassificação",
 	"Reranking model disabled": "Modelo de Reclassificação desativado",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "Redefinir Diretório de Upload",
 	"Reset Vector Storage/Knowledge": "Redefinir Armazenamento de Vetores/Conhecimento",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Notificações de resposta não podem ser ativadas pois as permissões do site foram negadas. Por favor, visite as configurações do seu navegador para conceder o acesso necessário.",
 	"Response splitting": "Divisão da Resposta",
 	"Result": "Resultado",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "variável para ser substituída pelo conteúdo da área de transferência.",
 	"Version": "Versão",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Versão {{selectedVersion}} de {{totalVersions}}",
+	"View Replies": "",
 	"Visibility": "Visibilidade",
 	"Voice": "Voz",
 	"Voice Input": "Entrada de voz",

+ 6 - 0
src/lib/i18n/locales/pt-PT/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(por exemplo, `sh webui.sh --api`)",
 	"(latest)": "(mais recente)",
 	"{{ models }}": "{{ modelos }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "{{user}}'s Chats",
 	"{{webUIName}} Backend Required": "{{webUIName}} Backend Necessário",
 	"*Prompt node ID(s) are required for image generation": "",
@@ -34,6 +35,7 @@
 	"Add Group": "",
 	"Add Memory": "Adicionar memória",
 	"Add Model": "Adicionar modelo",
+	"Add Reaction": "",
 	"Add Tag": "",
 	"Add Tags": "adicionar tags",
 	"Add text content": "",
@@ -534,6 +536,7 @@
 	"Language": "Idioma",
 	"Last Active": "Último Ativo",
 	"Last Modified": "",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "",
@@ -739,6 +742,7 @@
 	"Rename": "Renomear",
 	"Reorder Models": "",
 	"Repeat Last N": "Repetir Últimos N",
+	"Reply in Thread": "",
 	"Request Mode": "Modo de Pedido",
 	"Reranking Model": "Modelo de Reranking",
 	"Reranking model disabled": "Modelo de Reranking desativado",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "Limpar Pasta de Carregamento",
 	"Reset Vector Storage/Knowledge": "",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
 	"Result": "",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "variável para que sejam substituídos pelo conteúdo da área de transferência.",
 	"Version": "Versão",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "",
 	"Voice Input": "",

+ 6 - 0
src/lib/i18n/locales/ro-RO/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(de ex. `sh webui.sh --api`)",
 	"(latest)": "(ultimul)",
 	"{{ models }}": "{{ modele }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "Conversațiile lui {{user}}",
 	"{{webUIName}} Backend Required": "Este necesar backend-ul {{webUIName}}",
 	"*Prompt node ID(s) are required for image generation": "*Sunt necesare ID-urile nodurilor de solicitare pentru generarea imaginii*",
@@ -34,6 +35,7 @@
 	"Add Group": "",
 	"Add Memory": "Adaugă Memorie",
 	"Add Model": "Adaugă Model",
+	"Add Reaction": "",
 	"Add Tag": "Adaugă Etichetă",
 	"Add Tags": "Adaugă Etichete",
 	"Add text content": "Adăugați conținut textual",
@@ -534,6 +536,7 @@
 	"Language": "Limbă",
 	"Last Active": "Ultima Activitate",
 	"Last Modified": "Ultima Modificare",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "Tabel de clasament",
@@ -739,6 +742,7 @@
 	"Rename": "Redenumește",
 	"Reorder Models": "",
 	"Repeat Last N": "Repetă Ultimele N",
+	"Reply in Thread": "",
 	"Request Mode": "Mod de Cerere",
 	"Reranking Model": "Model de Rearanjare",
 	"Reranking model disabled": "Modelul de Rearanjare este dezactivat",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "Resetează Directorul de Încărcare",
 	"Reset Vector Storage/Knowledge": "Resetarea Stocării/Vectoului de Cunoștințe",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Notificările de răspuns nu pot fi activate deoarece permisiunile site-ului au fost refuzate. Vă rugăm să vizitați setările browserului pentru a acorda accesul necesar.",
 	"Response splitting": "Împărțirea răspunsurilor",
 	"Result": "Rezultat",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "variabilă pentru a fi înlocuite cu conținutul clipboard-ului.",
 	"Version": "Versiune",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Versiunea {{selectedVersion}} din {{totalVersions}}",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "Voce",
 	"Voice Input": "Intrare vocală",

+ 6 - 0
src/lib/i18n/locales/ru-RU/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(например, `sh webui.sh --api`)",
 	"(latest)": "(последняя)",
 	"{{ models }}": "{{ модели }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "Чаты {{user}}'а",
 	"{{webUIName}} Backend Required": "Необходимо подключение к серверу {{webUIName}}",
 	"*Prompt node ID(s) are required for image generation": "ID узлов промптов обязательны для генерации изображения",
@@ -34,6 +35,7 @@
 	"Add Group": "Добавить группу",
 	"Add Memory": "Добавить воспоминание",
 	"Add Model": "Добавить модель",
+	"Add Reaction": "",
 	"Add Tag": "Добавить тег",
 	"Add Tags": "Добавить теги",
 	"Add text content": "",
@@ -534,6 +536,7 @@
 	"Language": "Язык",
 	"Last Active": "Последний Активный",
 	"Last Modified": "Последнее Изменение",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "LDAP сервер обновлен",
 	"Leaderboard": "Таблица Лидеров",
@@ -739,6 +742,7 @@
 	"Rename": "Переименовать",
 	"Reorder Models": "",
 	"Repeat Last N": "Повторить последние N",
+	"Reply in Thread": "",
 	"Request Mode": "Режим запроса",
 	"Reranking Model": "Модель реранжирования",
 	"Reranking model disabled": "Модель реранжирования отключена",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "Сбросить каталог загрузок",
 	"Reset Vector Storage/Knowledge": "",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Уведомления об ответах не могут быть активированы, поскольку доступ к веб-сайту был заблокирован. Пожалуйста, перейдите к настройкам своего браузера, чтобы предоставить необходимый доступ.",
 	"Response splitting": "Разделение ответов",
 	"Result": "",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "переменную, чтобы заменить их содержимым буфера обмена.",
 	"Version": "Версия",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
+	"View Replies": "",
 	"Visibility": "Видимость",
 	"Voice": "Голос",
 	"Voice Input": "",

+ 6 - 0
src/lib/i18n/locales/sk-SK/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(napr. `sh webui.sh --api`)",
 	"(latest)": "Najnovšie",
 	"{{ models }}": "{{ models }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "{{user}}'s konverzácie",
 	"{{webUIName}} Backend Required": "Vyžaduje sa {{webUIName}} Backend",
 	"*Prompt node ID(s) are required for image generation": "*Sú potrebné IDs pre prompt node na generovanie obrázkov",
@@ -34,6 +35,7 @@
 	"Add Group": "Pridať skupinu",
 	"Add Memory": "Pridať pamäť",
 	"Add Model": "Pridať model",
+	"Add Reaction": "",
 	"Add Tag": "Pridať štítok",
 	"Add Tags": "Pridať štítky",
 	"Add text content": "Pridajte textový obsah",
@@ -534,6 +536,7 @@
 	"Language": "Jazyk",
 	"Last Active": "Naposledy aktívny",
 	"Last Modified": "Posledná zmena",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "Rebríček",
@@ -739,6 +742,7 @@
 	"Rename": "Premenovať",
 	"Reorder Models": "",
 	"Repeat Last N": "Opakovať posledných N",
+	"Reply in Thread": "",
 	"Request Mode": "Režim žiadosti",
 	"Reranking Model": "Model na prehodnotenie poradia",
 	"Reranking model disabled": "Model na prehodnotenie poradia je deaktivovaný",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "Resetovať adresár nahrávania",
 	"Reset Vector Storage/Knowledge": "Resetovanie úložiska vektorov/znalostí",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Oznámenia o odpovediach nie je možné aktivovať, pretože povolenia webu boli zamietnuté. Navštívte nastavenia svojho prehliadača a povoľte potrebný prístup.",
 	"Response splitting": "Rozdelenie odpovede",
 	"Result": "Výsledok",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "premennú, aby bol ich obsah nahradený obsahom schránky.",
 	"Version": "Verzia",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Verzia {{selectedVersion}} z {{totalVersions}}",
+	"View Replies": "",
 	"Visibility": "Viditeľnosť",
 	"Voice": "Hlas",
 	"Voice Input": "Hlasový vstup",

+ 6 - 0
src/lib/i18n/locales/sr-RS/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(нпр. `sh webui.sh --api`)",
 	"(latest)": "(најновије)",
 	"{{ models }}": "{{ модели }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "Ћаскања корисника {{user}}",
 	"{{webUIName}} Backend Required": "Захтева се {{webUIName}} позадинац",
 	"*Prompt node ID(s) are required for image generation": "",
@@ -34,6 +35,7 @@
 	"Add Group": "Додај групу",
 	"Add Memory": "Додај меморију",
 	"Add Model": "Додај модел",
+	"Add Reaction": "",
 	"Add Tag": "Додај ознаку",
 	"Add Tags": "Додај ознаке",
 	"Add text content": "Додај садржај текста",
@@ -534,6 +536,7 @@
 	"Language": "Језик",
 	"Last Active": "Последња активност",
 	"Last Modified": "",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "Ранг листа",
@@ -739,6 +742,7 @@
 	"Rename": "Преименуј",
 	"Reorder Models": "",
 	"Repeat Last N": "Понови последњих N",
+	"Reply in Thread": "",
 	"Request Mode": "Режим захтева",
 	"Reranking Model": "Модел поновног рангирања",
 	"Reranking model disabled": "Модел поновног рангирања онемогућен",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "",
 	"Reset Vector Storage/Knowledge": "",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
 	"Result": "",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "променљива за замену са садржајем оставе.",
 	"Version": "Издање",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "",
 	"Voice Input": "",

+ 6 - 0
src/lib/i18n/locales/sv-SE/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(t.ex. `sh webui.sh --api`)",
 	"(latest)": "(senaste)",
 	"{{ models }}": "{{ modeller }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "{{user}}s Chats",
 	"{{webUIName}} Backend Required": "{{webUIName}} Backend krävs",
 	"*Prompt node ID(s) are required for image generation": "",
@@ -34,6 +35,7 @@
 	"Add Group": "",
 	"Add Memory": "Lägg till minne",
 	"Add Model": "Lägg till modell",
+	"Add Reaction": "",
 	"Add Tag": "",
 	"Add Tags": "Lägg till taggar",
 	"Add text content": "",
@@ -534,6 +536,7 @@
 	"Language": "Språk",
 	"Last Active": "Senast aktiv",
 	"Last Modified": "",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "",
@@ -739,6 +742,7 @@
 	"Rename": "Byt namn",
 	"Reorder Models": "",
 	"Repeat Last N": "Upprepa senaste N",
+	"Reply in Thread": "",
 	"Request Mode": "Frågeläge",
 	"Reranking Model": "Reranking modell",
 	"Reranking model disabled": "Reranking modell inaktiverad",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "Återställ uppladdningskatalog",
 	"Reset Vector Storage/Knowledge": "",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
 	"Result": "",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "variabel för att få dem ersatta med urklippsinnehåll.",
 	"Version": "Version",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "",
 	"Voice Input": "",

+ 6 - 0
src/lib/i18n/locales/th-TH/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(เช่น `sh webui.sh --api`)",
 	"(latest)": "(ล่าสุด)",
 	"{{ models }}": "{{ models }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "การสนทนาของ {{user}}",
 	"{{webUIName}} Backend Required": "ต้องการ Backend ของ {{webUIName}}",
 	"*Prompt node ID(s) are required for image generation": "",
@@ -34,6 +35,7 @@
 	"Add Group": "",
 	"Add Memory": "เพิ่มความจำ",
 	"Add Model": "เพิ่มโมเดล",
+	"Add Reaction": "",
 	"Add Tag": "",
 	"Add Tags": "เพิ่มแท็ก",
 	"Add text content": "",
@@ -534,6 +536,7 @@
 	"Language": "ภาษา",
 	"Last Active": "ใช้งานล่าสุด",
 	"Last Modified": "แก้ไขล่าสุด",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "",
@@ -739,6 +742,7 @@
 	"Rename": "เปลี่ยนชื่อ",
 	"Reorder Models": "",
 	"Repeat Last N": "ทำซ้ำครั้งล่าสุด N",
+	"Reply in Thread": "",
 	"Request Mode": "โหมดคำขอ",
 	"Reranking Model": "จัดอันดับใหม่โมเดล",
 	"Reranking model disabled": "ปิดการใช้งานโมเดลการจัดอันดับใหม่",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "รีเซ็ตไดเร็กทอรีการอัปโหลด",
 	"Reset Vector Storage/Knowledge": "",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "ไม่สามารถเปิดการแจ้งเตือนการตอบสนองได้เนื่องจากเว็บไซต์ปฏิเสธ กรุณาเข้าการตั้งค่าเบราว์เซอร์ของคุณเพื่อให้สิทธิ์การเข้าถึงที่จำเป็น",
 	"Response splitting": "",
 	"Result": "",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "ตัวแปรเพื่อให้แทนที่ด้วยเนื้อหาคลิปบอร์ด",
 	"Version": "เวอร์ชัน",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "เสียง",
 	"Voice Input": "",

+ 6 - 0
src/lib/i18n/locales/tk-TW/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "",
 	"(latest)": "",
 	"{{ models }}": "",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "",
 	"{{webUIName}} Backend Required": "",
 	"*Prompt node ID(s) are required for image generation": "",
@@ -34,6 +35,7 @@
 	"Add Group": "",
 	"Add Memory": "",
 	"Add Model": "",
+	"Add Reaction": "",
 	"Add Tag": "",
 	"Add Tags": "",
 	"Add text content": "",
@@ -534,6 +536,7 @@
 	"Language": "",
 	"Last Active": "",
 	"Last Modified": "",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "",
@@ -739,6 +742,7 @@
 	"Rename": "",
 	"Reorder Models": "",
 	"Repeat Last N": "",
+	"Reply in Thread": "",
 	"Request Mode": "",
 	"Reranking Model": "",
 	"Reranking model disabled": "",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "",
 	"Reset Vector Storage/Knowledge": "",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
 	"Result": "",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "",
 	"Version": "",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "",
 	"Voice Input": "",

+ 6 - 0
src/lib/i18n/locales/tr-TR/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(örn. `sh webui.sh --api`)",
 	"(latest)": "(en son)",
 	"{{ models }}": "{{ models }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "{{user}}'ın Sohbetleri",
 	"{{webUIName}} Backend Required": "{{webUIName}} Arka-uç Gerekli",
 	"*Prompt node ID(s) are required for image generation": "*Görüntü oluşturma için düğüm kimlikleri gereklidir",
@@ -34,6 +35,7 @@
 	"Add Group": "",
 	"Add Memory": "Bellek Ekle",
 	"Add Model": "Model Ekle",
+	"Add Reaction": "",
 	"Add Tag": "Etiket Ekle",
 	"Add Tags": "Etiketler Ekle",
 	"Add text content": "Metin içeriği ekleme",
@@ -534,6 +536,7 @@
 	"Language": "Dil",
 	"Last Active": "Son Aktivite",
 	"Last Modified": "Son Düzenleme",
+	"Last reply": "",
 	"LDAP": "LDAP",
 	"LDAP server updated": "LDAP sunucusu güncellendi",
 	"Leaderboard": "Liderlik Tablosu",
@@ -739,6 +742,7 @@
 	"Rename": "Yeniden Adlandır",
 	"Reorder Models": "",
 	"Repeat Last N": "Son N'yi Tekrar Et",
+	"Reply in Thread": "",
 	"Request Mode": "İstek Modu",
 	"Reranking Model": "Yeniden Sıralama Modeli",
 	"Reranking model disabled": "Yeniden sıralama modeli devre dışı bırakıldı",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "Yükleme Dizinini Sıfırla",
 	"Reset Vector Storage/Knowledge": "",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Web sitesi izinleri reddedildiğinden yanıt bildirimleri etkinleştirilemiyor. Gerekli erişimi sağlamak için lütfen tarayıcı ayarlarınızı ziyaret edin.",
 	"Response splitting": "Yanıt bölme",
 	"Result": "",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "panodaki içerikle değiştirilmesi için değişken.",
 	"Version": "Sürüm",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "Ses",
 	"Voice Input": "",

+ 6 - 0
src/lib/i18n/locales/uk-UA/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(e.g. `sh webui.sh --api`)",
 	"(latest)": "(остання)",
 	"{{ models }}": "{{ models }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "Чати {{user}}а",
 	"{{webUIName}} Backend Required": "Необхідно підключення бекенду {{webUIName}}",
 	"*Prompt node ID(s) are required for image generation": "*Для генерації зображення потрібно вказати ідентифікатор(и) вузла(ів)",
@@ -34,6 +35,7 @@
 	"Add Group": "Додати групу",
 	"Add Memory": "Додати пам'ять",
 	"Add Model": "Додати модель",
+	"Add Reaction": "",
 	"Add Tag": "Додати тег",
 	"Add Tags": "Додати теги",
 	"Add text content": "Додати текстовий вміст",
@@ -534,6 +536,7 @@
 	"Language": "Мова",
 	"Last Active": "Остання активність",
 	"Last Modified": "Востаннє змінено",
+	"Last reply": "",
 	"LDAP": "LDAP",
 	"LDAP server updated": "Сервер LDAP оновлено",
 	"Leaderboard": "Таблиця лідерів",
@@ -739,6 +742,7 @@
 	"Rename": "Перейменувати",
 	"Reorder Models": "Переставити моделі",
 	"Repeat Last N": "Повторити останні N",
+	"Reply in Thread": "",
 	"Request Mode": "Режим запиту",
 	"Reranking Model": "Модель переранжування",
 	"Reranking model disabled": "Модель переранжування вимкнена",
@@ -747,6 +751,7 @@
 	"Reset All Models": "Скинути всі моделі",
 	"Reset Upload Directory": "Скинути каталог завантажень",
 	"Reset Vector Storage/Knowledge": "Скинути векторне сховище/Знання",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Сповіщення про відповіді не можуть бути активовані, оскільки вам було відмовлено в доступі до веб-сайту. Будь ласка, відвідайте налаштування вашого браузера, щоб надати необхідний доступ.",
 	"Response splitting": "Розбиття відповіді",
 	"Result": "Результат",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "змінна, щоб замінити їх вмістом буфера обміну.",
 	"Version": "Версія",
 	"Version {{selectedVersion}} of {{totalVersions}}": "Версія {{selectedVersion}} з {{totalVersions}}",
+	"View Replies": "",
 	"Visibility": "Видимість",
 	"Voice": "Голос",
 	"Voice Input": "Голосове введення",

+ 6 - 0
src/lib/i18n/locales/ur-PK/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(مثال کے طور پر: `sh webui.sh --api`)",
 	"(latest)": "(تازہ ترین)",
 	"{{ models }}": "{{ ماڈلز }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "{{ صارف }} کی بات چیت",
 	"{{webUIName}} Backend Required": "{{webUIName}} بیک اینڈ درکار ہے",
 	"*Prompt node ID(s) are required for image generation": "تصویر کی تخلیق کے لیے *پرومپٹ نوڈ آئی ڈی(ز) کی ضرورت ہے",
@@ -34,6 +35,7 @@
 	"Add Group": "",
 	"Add Memory": "میموری شامل کریں",
 	"Add Model": "ماڈل شامل کریں",
+	"Add Reaction": "",
 	"Add Tag": "ٹیگ شامل کریں",
 	"Add Tags": "ٹیگز شامل کریں",
 	"Add text content": "متن کا مواد شامل کریں",
@@ -534,6 +536,7 @@
 	"Language": "زبان",
 	"Last Active": "آخری سرگرمی",
 	"Last Modified": "آخری ترمیم",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "لیڈر بورڈ",
@@ -739,6 +742,7 @@
 	"Rename": "تبدیل نام کریں",
 	"Reorder Models": "",
 	"Repeat Last N": "آخری این (N)",
+	"Reply in Thread": "",
 	"Request Mode": "درخواست کا موڈ",
 	"Reranking Model": "دوبارہ درجہ بندی کا ماڈل",
 	"Reranking model disabled": "دوبارہ درجہ بندی کا ماڈل غیر فعال کر دیا گیا",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "اپلوڈ ڈائریکٹری کو ری سیٹ کریں",
 	"Reset Vector Storage/Knowledge": "ویكٹر اسٹوریج/علم کو ری سیٹ کریں",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "جواب کی اطلاعات کو فعال نہیں کیا جا سکتا کیونکہ ویب سائٹ کی اجازتیں مسترد کر دی گئی ہیں براہ کرم اپنے براؤزر کی سیٹنگز پر جائیں تاکہ ضروری رسائی کی اجازت دے سکیں",
 	"Response splitting": "جواب کو تقسیم کرنا",
 	"Result": "نتیجہ",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "انہیں کلپ بورڈ کے مواد سے تبدیل کرنے کے لیے متغیر",
 	"Version": "ورژن",
 	"Version {{selectedVersion}} of {{totalVersions}}": "ورژن {{selectedVersion}} کا {{totalVersions}} میں سے",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "آواز",
 	"Voice Input": "آواز داخل کریں",

+ 6 - 0
src/lib/i18n/locales/vi-VN/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(vd: `sh webui.sh --api`)",
 	"(latest)": "(mới nhất)",
 	"{{ models }}": "{{ mô hình }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "{{user}}'s Chats",
 	"{{webUIName}} Backend Required": "{{webUIName}} Yêu cầu Backend",
 	"*Prompt node ID(s) are required for image generation": "",
@@ -34,6 +35,7 @@
 	"Add Group": "",
 	"Add Memory": "Thêm bộ nhớ",
 	"Add Model": "Thêm model",
+	"Add Reaction": "",
 	"Add Tag": "Thêm thẻ",
 	"Add Tags": "thêm thẻ",
 	"Add text content": "",
@@ -534,6 +536,7 @@
 	"Language": "Ngôn ngữ",
 	"Last Active": "Truy cập gần nhất",
 	"Last Modified": "Lần sửa gần nhất",
+	"Last reply": "",
 	"LDAP": "",
 	"LDAP server updated": "",
 	"Leaderboard": "",
@@ -739,6 +742,7 @@
 	"Rename": "Đổi tên",
 	"Reorder Models": "",
 	"Repeat Last N": "Repeat Last N",
+	"Reply in Thread": "",
 	"Request Mode": "Request Mode",
 	"Reranking Model": "Reranking Model",
 	"Reranking model disabled": "Reranking model disabled",
@@ -747,6 +751,7 @@
 	"Reset All Models": "",
 	"Reset Upload Directory": "Xóa toàn bộ thư mục Upload",
 	"Reset Vector Storage/Knowledge": "",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Không thể kích hoạt thông báo vì trang web không cấp quyền. Vui lòng truy cập cài đặt trình duyệt của bạn để cấp quyền cần thiết.",
 	"Response splitting": "",
 	"Result": "",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "biến để có chúng được thay thế bằng nội dung clipboard.",
 	"Version": "Version",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
+	"View Replies": "",
 	"Visibility": "",
 	"Voice": "Giọng nói",
 	"Voice Input": "",

+ 6 - 0
src/lib/i18n/locales/zh-CN/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(例如 `sh webui.sh --api`)",
 	"(latest)": "(最新版)",
 	"{{ models }}": "{{ models }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "{{user}} 的对话记录",
 	"{{webUIName}} Backend Required": "{{webUIName}} 需要后端服务",
 	"*Prompt node ID(s) are required for image generation": "*图片生成需要 Prompt node ID",
@@ -34,6 +35,7 @@
 	"Add Group": "添加权限组",
 	"Add Memory": "添加记忆",
 	"Add Model": "添加模型",
+	"Add Reaction": "",
 	"Add Tag": "添加标签",
 	"Add Tags": "添加标签",
 	"Add text content": "添加文本内容",
@@ -534,6 +536,7 @@
 	"Language": "语言",
 	"Last Active": "最后在线时间",
 	"Last Modified": "最后修改时间",
+	"Last reply": "",
 	"LDAP": "LDAP",
 	"LDAP server updated": "LDAP 服务器已更新",
 	"Leaderboard": "排行榜",
@@ -739,6 +742,7 @@
 	"Rename": "重命名",
 	"Reorder Models": "重新排序模型",
 	"Repeat Last N": "重复最后 N 次",
+	"Reply in Thread": "",
 	"Request Mode": "请求模式",
 	"Reranking Model": "重排模型",
 	"Reranking model disabled": "重排模型已禁用",
@@ -747,6 +751,7 @@
 	"Reset All Models": "重置所有模型",
 	"Reset Upload Directory": "重置上传目录",
 	"Reset Vector Storage/Knowledge": "重置向量存储/知识",
+	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "无法激活回复时发送通知。请检查浏览器设置,并授予必要的访问权限。",
 	"Response splitting": "拆分回复",
 	"Result": "结果",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "变量将被剪贴板内容替换。",
 	"Version": "版本",
 	"Version {{selectedVersion}} of {{totalVersions}}": "版本 {{selectedVersion}}/{{totalVersions}}",
+	"View Replies": "",
 	"Visibility": "可见性",
 	"Voice": "语音",
 	"Voice Input": "语音输入",

+ 33 - 27
src/lib/i18n/locales/zh-TW/translation.json

@@ -5,6 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(例如 `sh webui.sh --api`)",
 	"(latest)": "(最新版)",
 	"{{ models }}": "{{ models }}",
+	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "{{user}} 的對話",
 	"{{webUIName}} Backend Required": "需要 {{webUIName}} 後端",
 	"*Prompt node ID(s) are required for image generation": "* 圖片生成需要提示詞節點 ID",
@@ -34,6 +35,7 @@
 	"Add Group": "新增群組",
 	"Add Memory": "新增記憶",
 	"Add Model": "新增模型",
+	"Add Reaction": "",
 	"Add Tag": "新增標籤",
 	"Add Tags": "新增標籤",
 	"Add text content": "新增文字內容",
@@ -57,7 +59,7 @@
 	"Allow Temporary Chat": "允許暫時對話",
 	"Allow User Location": "允許使用者位置",
 	"Allow Voice Interruption in Call": "允許在通話中打斷語音",
-	"Allowed Endpoints": "",
+	"Allowed Endpoints": "允許的端點",
 	"Already have an account?": "已經有帳號了嗎?",
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "作為 top_p 的替代方案,旨在確保質量和多樣性的平衡。相對於最可能的 token 機率而言,參數 p 代表一個 token 被考慮在内的最低機率。例如,當 p=0.05 且最可能的 token 機率為 0.9 時,數值低於 0.045 的對數機率會被過濾掉。(預設值:0.0)",
 	"Amazing": "很棒",
@@ -68,7 +70,7 @@
 	"API Base URL": "API 基礎 URL",
 	"API Key": "API 金鑰",
 	"API Key created.": "API 金鑰已建立。",
-	"API Key Endpoint Restrictions": "",
+	"API Key Endpoint Restrictions": "API 金鑰端點限制",
 	"API keys": "API 金鑰",
 	"Application DN": "應用程式 DN",
 	"Application DN Password": "應用程式 DN 密碼",
@@ -78,8 +80,8 @@
 	"Archive All Chats": "封存所有對話紀錄",
 	"Archived Chats": "封存的對話紀錄",
 	"archived-chat-export": "archived-chat-export",
-	"Are you sure you want to delete this channel?": "",
-	"Are you sure you want to delete this message?": "",
+	"Are you sure you want to delete this channel?": "您確定要刪除此頻道嗎?",
+	"Are you sure you want to delete this message?": "您確定要刪除此訊息嗎?",
 	"Are you sure you want to unarchive all archived chats?": "您確定要解除封存所有封存的對話記錄嗎?",
 	"Are you sure?": "您確定嗎?",
 	"Arena Models": "競技模型",
@@ -112,7 +114,7 @@
 	"Batch Size (num_batch)": "批次大小(num_batch)",
 	"before": "之前",
 	"Being lazy": "懶惰模式",
-	"Beta": "",
+	"Beta": "測試",
 	"Bing Search V7 Endpoint": "Bing 搜尋 V7 端點",
 	"Bing Search V7 Subscription Key": "Bing 搜尋 V7 訂閱金鑰",
 	"Brave Search API Key": "Brave 搜尋 API 金鑰",
@@ -126,8 +128,8 @@
 	"Capture": "擷取",
 	"Certificate Path": "憑證路徑",
 	"Change Password": "修改密碼",
-	"Channel Name": "",
-	"Channels": "",
+	"Channel Name": "頻道名稱",
+	"Channels": "頻道",
 	"Character": "角色",
 	"Character limit for autocomplete generation input": "自動完成產生輸入的字元限制",
 	"Chart new frontiers": "探索新領域",
@@ -183,7 +185,7 @@
 	"Confirm": "確認",
 	"Confirm Password": "確認密碼",
 	"Confirm your action": "確認您的操作",
-	"Confirm your new password": "",
+	"Confirm your new password": "確認您的新密碼",
 	"Connections": "連線",
 	"Contact Admin for WebUI Access": "請聯絡管理員以取得 WebUI 存取權限",
 	"Content": "內容",
@@ -210,7 +212,7 @@
 	"Create a model": "建立模型",
 	"Create Account": "建立帳號",
 	"Create Admin Account": "建立管理員賬號",
-	"Create Channel": "",
+	"Create Channel": "建立頻道",
 	"Create Group": "建立群組",
 	"Create Knowledge": "建立知識",
 	"Create new key": "建立新的金鑰",
@@ -246,7 +248,7 @@
 	"Delete chat?": "刪除對話紀錄?",
 	"Delete folder?": "刪除資料夾?",
 	"Delete function?": "刪除函式?",
-	"Delete Message": "",
+	"Delete Message": "刪除訊息?",
 	"Delete prompt?": "刪除提示詞?",
 	"delete this link": "刪除此連結",
 	"Delete tool?": "刪除工具?",
@@ -299,7 +301,7 @@
 	"e.g. Tools for performing various operations": "例如:用於執行各種操作的工具",
 	"Edit": "編輯",
 	"Edit Arena Model": "編輯競技模型",
-	"Edit Channel": "",
+	"Edit Channel": "編輯頻道",
 	"Edit Connection": "編輯連線",
 	"Edit Default Permissions": "編輯預設權限",
 	"Edit Memory": "編輯記憶",
@@ -312,7 +314,7 @@
 	"Embedding Model": "嵌入模型",
 	"Embedding Model Engine": "嵌入模型引擎",
 	"Embedding model set to \"{{embedding_model}}\"": "嵌入模型已設定為 \"{{embedding_model}}\"",
-	"Enable API Key": "",
+	"Enable API Key": "啟用 API 金鑰",
 	"Enable autocomplete generation for chat messages": "啟用聊天訊息的自動完成生成",
 	"Enable Community Sharing": "啟用社群分享",
 	"Enable Google Drive": "啟用 Google Drive",
@@ -366,20 +368,20 @@
 	"Enter stop sequence": "輸入停止序列",
 	"Enter system prompt": "輸入系統提示詞",
 	"Enter Tavily API Key": "輸入 Tavily API 金鑰",
-	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
+	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "請輸入您 WebUI 的公開 URL。此 URL 將用於在通知中產生連結。",
 	"Enter Tika Server URL": "輸入 Tika 伺服器 URL",
 	"Enter Top K": "輸入 Top K 值",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "輸入 URL(例如:http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "輸入 URL(例如:http://localhost:11434)",
-	"Enter your current password": "",
+	"Enter your current password": "輸入您的當前密碼",
 	"Enter Your Email": "輸入您的電子郵件",
 	"Enter Your Full Name": "輸入您的全名",
 	"Enter your message": "輸入您的訊息",
-	"Enter your new password": "",
+	"Enter your new password": "輸入您的新密碼",
 	"Enter Your Password": "輸入您的密碼",
 	"Enter Your Role": "輸入您的角色",
 	"Enter Your Username": "輸入您的使用者名稱",
-	"Enter your webhook URL": "",
+	"Enter your webhook URL": "輸入您的 webhook URL",
 	"Error": "錯誤",
 	"ERROR": "錯誤",
 	"Error accessing Google Drive: {{error}}": "存取 Google Drive 時發生錯誤:{{error}}",
@@ -485,10 +487,10 @@
 	"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "我確認已閱讀並理解我的操作所帶來的影響。我了解執行任意程式碼的相關風險,並已驗證來源的可信度。",
 	"ID": "ID",
 	"Ignite curiosity": "點燃好奇心",
-	"Image Compression": "",
+	"Image Compression": "圖片壓縮",
 	"Image Generation (Experimental)": "圖片生成(實驗性功能)",
 	"Image Generation Engine": "圖片生成引擎",
-	"Image Max Compression Size": "",
+	"Image Max Compression Size": "圖片最大壓縮大小",
 	"Image Settings": "圖片設定",
 	"Images": "圖片",
 	"Import Chats": "匯入對話紀錄",
@@ -509,7 +511,7 @@
 	"Interface": "介面",
 	"Invalid file format.": "無效檔案格式。",
 	"Invalid Tag": "無效標籤",
-	"is typing...": "",
+	"is typing...": "正在輸入……",
 	"January": "1 月",
 	"Jina API Key": "Jina API 金鑰",
 	"join our Discord for help.": "加入我們的 Discord 以尋求協助。",
@@ -534,6 +536,7 @@
 	"Language": "語言",
 	"Last Active": "上次活動時間",
 	"Last Modified": "上次修改時間",
+	"Last reply": "",
 	"LDAP": "LDAP",
 	"LDAP server updated": "LDAP 伺服器已更新",
 	"Leaderboard": "排行榜",
@@ -608,9 +611,9 @@
 	"Name": "名稱",
 	"Name your knowledge base": "命名您的知識庫",
 	"New Chat": "新增對話",
-	"New folder": "",
+	"New folder": "新增資料夾",
 	"New Password": "新密碼",
-	"new-channel": "",
+	"new-channel": "new-channel",
 	"No content found": "找不到內容",
 	"No content to speak": "無可朗讀的內容",
 	"No distance available": "無可用距離",
@@ -633,8 +636,8 @@
 	"Not helpful": "沒有幫助",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "注意:如果您設定了最低分數,則搜尋只會回傳分數大於或等於最低分數的文件。",
 	"Notes": "注意",
-	"Notification Sound": "",
-	"Notification Webhook": "",
+	"Notification Sound": "通知聲音",
+	"Notification Webhook": "通知 Webhook",
 	"Notifications": "通知",
 	"November": "11 月",
 	"num_gpu (Ollama)": "num_gpu (Ollama)",
@@ -739,6 +742,7 @@
 	"Rename": "重新命名",
 	"Reorder Models": "重新排序模型",
 	"Repeat Last N": "重複最後 N 個",
+	"Reply in Thread": "",
 	"Request Mode": "請求模式",
 	"Reranking Model": "重新排序模型",
 	"Reranking model disabled": "已停用重新排序模型",
@@ -747,6 +751,7 @@
 	"Reset All Models": "重設所有模型",
 	"Reset Upload Directory": "重設上傳目錄",
 	"Reset Vector Storage/Knowledge": "重設向量儲存或知識",
+	"Reset view": "重設視圖",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "無法啟用回應通知,因為網站權限已遭拒。請前往瀏覽器設定以授予必要存取權限。",
 	"Response splitting": "回應分割",
 	"Result": "結果",
@@ -784,7 +789,7 @@
 	"Search Tools": "搜尋工具",
 	"SearchApi API Key": "SearchApi API 金鑰",
 	"SearchApi Engine": "SearchApi 引擎",
-	"Searched {{count}} sites": "",
+	"Searched {{count}} sites": "搜尋到 {{count}} 個站點",
 	"Searching \"{{searchQuery}}\"": "正在搜尋「{{searchQuery}}」",
 	"Searching Knowledge for \"{{searchQuery}}\"": "正在搜尋知識庫中的「{{searchQuery}}」",
 	"Searxng Query URL": "Searxng 查詢 URL",
@@ -924,8 +929,8 @@
 	"To access the available model names for downloading,": "若要存取可供下載的模型名稱,",
 	"To access the GGUF models available for downloading,": "若要存取可供下載的 GGUF 模型,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "若要存取 WebUI,請聯絡管理員。管理員可以從管理面板管理使用者狀態。",
-	"To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "要在此處附加知識庫,請先將它們新增到「知識」工作區。",
-	"To learn more about available endpoints, visit our documentation.": "",
+	"To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "要在此處附加知識庫,請先將它們新增到「知識」工作區。",
+	"To learn more about available endpoints, visit our documentation.": "若要進一步了解可用的端點,請參閱我們的文件。",
 	"To protect your privacy, only ratings, model IDs, tags, and metadata are shared from your feedback—your chat logs remain private and are not included.": "為了保護您的隱私,只會分享您回饋中的評分、模型 ID、標籤和中繼資料 —— 您的對話紀錄仍然是私密的,不會被包含在內。",
 	"To select actions here, add them to the \"Functions\" workspace first.": "若要在此選擇動作,請先將它們新增到「函式」工作區。",
 	"To select filters here, add them to the \"Functions\" workspace first.": "若要在此選擇篩選器,請先將它們新增到「函式」工作區。",
@@ -1004,6 +1009,7 @@
 	"variable to have them replaced with clipboard content.": "變數,以便將其替換為剪貼簿內容。",
 	"Version": "版本",
 	"Version {{selectedVersion}} of {{totalVersions}}": "第 {{selectedVersion}} 版,共 {{totalVersions}} 版",
+	"View Replies": "",
 	"Visibility": "可見性",
 	"Voice": "語音",
 	"Voice Input": "語音輸入",
@@ -1019,7 +1025,7 @@
 	"Web Search Query Generation": "網頁搜尋查詢生成",
 	"Webhook URL": "Webhook URL",
 	"WebUI Settings": "WebUI 設定",
-	"WebUI URL": "",
+	"WebUI URL": "WebUI URL",
 	"WebUI will make requests to \"{{url}}/api/chat\"": "WebUI 將向 \"{{url}}/api/chat\" 發送請求",
 	"WebUI will make requests to \"{{url}}/chat/completions\"": "WebUI 將向 \"{{url}}/chat/completions\" 發送請求",
 	"What are you trying to achieve?": "您正在試圖完成什麽?",

+ 17 - 1
src/lib/stores/index.ts

@@ -1,9 +1,11 @@
 import { APP_NAME } from '$lib/constants';
 import { type Writable, writable } from 'svelte/store';
-import type { GlobalModelConfig, ModelConfig } from '$lib/apis';
+import type { ModelConfig } from '$lib/apis';
 import type { Banner } from '$lib/types';
 import type { Socket } from 'socket.io-client';
 
+import emojiShortCodes from '$lib/emoji-shortcodes.json';
+
 // Backend
 export const WEBUI_NAME = writable(APP_NAME);
 export const config: Writable<Config | undefined> = writable(undefined);
@@ -20,6 +22,20 @@ export const USAGE_POOL: Writable<null | string[]> = writable(null);
 
 export const theme = writable('system');
 
+export const shortCodesToEmojis = writable(
+	Object.entries(emojiShortCodes).reduce((acc, [key, value]) => {
+		if (typeof value === 'string') {
+			acc[value] = key;
+		} else {
+			for (const v of value) {
+				acc[v] = key;
+			}
+		}
+
+		return acc;
+	}, {})
+);
+
 export const chatId = writable('');
 export const chatTitle = writable('');
 

+ 1 - 0
static/assets/emojis/0023-fe0f-20e3.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#3B88C3" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/><path fill="#FFF" d="M13.785 16.194h-2.667c-1.024 0-1.488-.744-1.488-1.488s.465-1.488 1.488-1.488h3.101l.682-4.992c.155-1.116.62-1.488 1.55-1.488.744 0 1.426.496 1.426 1.24 0 .465 0 .248-.062.744l-.62 4.496h2.976l.683-4.992c.155-1.116.62-1.488 1.55-1.488.744 0 1.427.496 1.427 1.24 0 .465 0 .248-.062.744l-.621 4.496h2.667c1.023 0 1.487.744 1.487 1.488s-.465 1.488-1.487 1.488h-3.101l-.496 3.535h2.666c1.023 0 1.488.744 1.488 1.488s-.465 1.488-1.488 1.488h-3.1l-.683 4.991c-.155 1.117-.62 1.488-1.55 1.488-.745 0-1.427-.496-1.427-1.24 0-.465 0-.248.062-.744l.62-4.495h-2.977l-.682 4.991c-.155 1.117-.62 1.488-1.55 1.488-.744 0-1.426-.496-1.426-1.24 0-.465 0-.248.062-.744l.62-4.495h-2.666c-1.023 0-1.488-.744-1.488-1.488s.465-1.488 1.488-1.488h3.101l.497-3.535zm2.511 3.535h2.946l.496-3.535h-2.946l-.496 3.535z"/></svg>

+ 1 - 0
static/assets/emojis/002a-fe0f-20e3.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#3B88C3" d="M32 0H4C1.791 0 0 1.791 0 4v28c0 2.209 1.791 4 4 4h28c2.209 0 4-1.791 4-4V4c0-2.209-1.791-4-4-4z"/><path fill="#FFF" d="M19 7h-2c-.552 0-1 .448-1 1v20c0 .553.448 1 1 1h2c.553 0 1-.447 1-1V8c0-.552-.447-1-1-1z"/><path fill="#FFF" d="M26.617 11.09l1.105 1.667c.305.46.179 1.081-.281 1.386L10.769 25.191c-.461.305-1.081.179-1.386-.281l-1.105-1.667c-.305-.461-.18-1.081.281-1.386L25.231 10.81c.461-.306 1.081-.18 1.386.28z"/><path fill="#FFF" d="M9.383 11.09l-1.105 1.667c-.305.46-.179 1.081.281 1.386L25.231 25.19c.461.305 1.081.179 1.386-.281l1.105-1.667c.305-.461.18-1.081-.281-1.386L10.769 10.809c-.461-.305-1.081-.179-1.386.281z"/></svg>

+ 1 - 0
static/assets/emojis/0030-fe0f-20e3.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#3B88C3" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/><path fill="#FFF" d="M9.785 17.962c0-5.054 1.954-11.41 8.216-11.41 6.264 0 8.217 6.356 8.217 11.41s-1.953 11.41-8.217 11.41c-6.262 0-8.216-6.356-8.216-11.41zm11.596 0c0-2.356-.217-7.193-3.379-7.193s-3.379 4.837-3.379 7.193c0 2.201.217 7.193 3.379 7.193s3.379-4.992 3.379-7.193z"/></svg>

+ 1 - 0
static/assets/emojis/0031-fe0f-20e3.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#3B88C3" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/><path fill="#FFF" d="M16.462 11.175h-1.829c-1.488 0-2.108-1.085-2.108-2.139 0-1.085.775-2.14 2.108-2.14h4.402c1.334 0 2.078.961 2.078 2.201V26.74c0 1.551-.992 2.418-2.326 2.418-1.333 0-2.325-.867-2.325-2.418V11.175z"/></svg>

+ 1 - 0
static/assets/emojis/0032-fe0f-20e3.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#3B88C3" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/><path fill="#FFF" d="M23.086 24.907c1.365 0 2.42.62 2.42 2.046 0 1.427-1.055 2.047-2.233 2.047H12.917c-1.364 0-2.418-.62-2.418-2.047 0-.65.403-1.209.713-1.581 2.573-3.069 5.364-5.86 7.721-9.271.558-.806 1.085-1.768 1.085-2.884 0-1.271-.961-2.387-2.233-2.387-3.566 0-1.86 5.023-4.837 5.023-1.488 0-2.264-1.054-2.264-2.264 0-3.906 3.473-7.038 7.287-7.038 3.815 0 6.883 2.512 6.883 6.449 0 4.309-4.805 8.589-7.441 11.906h5.673z"/></svg>

+ 1 - 0
static/assets/emojis/0033-fe0f-20e3.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#3B88C3" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/><path fill="#FFF" d="M24.109 12.226c0 1.954-.836 3.659-2.542 4.744 2.232 1.024 3.782 3.101 3.782 5.55 0 3.721-3.41 6.853-7.813 6.853-4.589 0-7.441-3.38-7.441-5.829 0-1.209 1.272-2.077 2.388-2.077 2.108 0 1.612 3.628 5.116 3.628 1.612 0 2.915-1.24 2.915-2.884 0-4.341-5.272-1.147-5.272-4.806 0-3.255 4.402-1.054 4.402-4.496 0-1.179-.836-2.078-2.232-2.078-2.945 0-2.542 3.038-4.651 3.038-1.271 0-2.015-1.147-2.015-2.294 0-2.418 3.317-5.023 6.759-5.023 4.466 0 6.604 3.256 6.604 5.674z"/></svg>

+ 1 - 0
static/assets/emojis/0034-fe0f-20e3.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#3B88C3" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/><path fill="#FFF" d="M10.769 24.132c-1.519 0-2.17-1.022-2.17-1.829 0-.682.248-1.055.434-1.364L15.979 8.35c.682-1.24 1.55-1.798 3.162-1.798 1.799 0 3.566 1.147 3.566 3.969v9.519h.527c1.209 0 2.17.807 2.17 2.047 0 1.24-.961 2.046-2.17 2.046h-.527v2.636c0 1.644-.651 2.418-2.232 2.418-1.581 0-2.233-.774-2.233-2.418v-2.636h-7.473zm7.473-12.743h-.062l-4.186 8.65h4.248v-8.65z"/></svg>

+ 1 - 0
static/assets/emojis/0035-fe0f-20e3.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#3B88C3" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/><path fill="#FFF" d="M16.389 14.489c.744-.155 1.551-.31 2.326-.31 3.752 0 6.418 2.977 6.418 6.604 0 5.178-2.851 8.589-8.216 8.589-2.201 0-6.821-1.427-6.821-4.155 0-1.147.961-2.107 2.108-2.107 1.24 0 2.729 1.984 4.806 1.984 2.17 0 3.288-2.109 3.288-4.062 0-1.86-1.055-3.131-2.977-3.131-1.799 0-2.078 1.023-3.659 1.023-1.209 0-1.829-.93-1.829-1.457 0-.403.062-.713.093-1.054l.774-6.544c.341-2.418.93-2.945 2.418-2.945h7.472c1.428 0 2.264.837 2.264 1.953 0 2.14-1.611 2.326-2.17 2.326h-5.829l-.466 3.286z"/></svg>

+ 1 - 0
static/assets/emojis/0036-fe0f-20e3.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#3B88C3" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/><path fill="#FFF" d="M10.219 21.683c0-4.682 4.744-11.255 7.875-14.17.248-.248.62-.496.992-.744.341-.217.683-.217.931-.217.867 0 2.201 1.147 2.201 2.264 0 .434-.279.806-.651 1.271-1.24 1.519-3.255 3.503-4.279 4.961l.062.062c.558-.248 1.271-.372 1.954-.372 3.721 0 6.479 3.287 6.479 6.945 0 4.03-3.194 7.69-7.783 7.69-4.773-.001-7.781-3.566-7.781-7.69zm4.837 0c0 1.736 1.085 3.225 2.945 3.225 1.768 0 2.946-1.427 2.946-3.225 0-1.643-.992-3.225-2.946-3.225-1.767 0-2.945 1.396-2.945 3.225z"/></svg>

+ 1 - 0
static/assets/emojis/0037-fe0f-20e3.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#3B88C3" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/><path fill="#FFF" d="M20.357 11.203H12.42c-1.674 0-2.294-1.085-2.294-2.139 0-1.085.589-2.14 2.294-2.14h11.224c1.582 0 2.233 1.426 2.233 2.232 0 .62-.341 1.271-.713 2.046l-7.69 15.627c-.868 1.736-1.209 2.355-2.604 2.355-1.705 0-2.574-1.302-2.574-2.201 0-.372.093-.65.311-1.085l7.75-14.695z"/></svg>

+ 1 - 0
static/assets/emojis/0038-fe0f-20e3.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#3B88C3" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/><path fill="#FFF" d="M10.343 22.303c0-2.48 1.364-4.309 3.317-5.364-1.457-1.054-2.356-2.48-2.356-4.434 0-3.628 3.008-5.953 6.697-5.953 3.596 0 6.729 2.294 6.729 5.953 0 1.736-.869 3.473-2.389 4.434 2.109 1.055 3.318 2.977 3.318 5.364 0 4.31-3.504 7.069-7.659 7.069-4.277 0-7.657-2.915-7.657-7.069zm4.837-.311c0 1.582.93 3.102 2.821 3.102 1.768 0 2.822-1.52 2.822-3.102 0-1.953-1.116-3.1-2.822-3.1-1.797 0-2.821 1.364-2.821 3.1zm.589-8.991c0 1.395.807 2.356 2.232 2.356 1.426 0 2.264-.961 2.264-2.356 0-1.333-.807-2.357-2.264-2.357-1.457 0-2.232 1.024-2.232 2.357z"/></svg>

Some files were not shown because too many files changed in this diff