Full Code of S4NKALP/Modus for AI

macos 2cc287da64ac cached
111 files
1.5 MB
374.1k tokens
1436 symbols
1 requests
Download .txt
Showing preview only (1,583K chars total). Download the full file or copy to clipboard to get everything.
Repository: S4NKALP/Modus
Branch: macos
Commit: 2cc287da64ac
Files: 111
Total size: 1.5 MB

Directory structure:
gitextract_evifj196/

├── .gitignore
├── LICENSE
├── README.md
├── config/
│   ├── assets/
│   │   ├── config.json
│   │   ├── emoji.json
│   │   └── launcher.json
│   ├── data.py
│   ├── hypr/
│   │   └── modus.conf
│   └── matugen/
│       └── templates/
│           ├── hyprland-colors.conf
│           └── macos.css
├── debug_memory.py
├── install.sh
├── lock.py
├── main.css
├── main.py
├── modules/
│   ├── about.py
│   ├── controlcenter/
│   │   ├── battery.py
│   │   ├── bluetooth.py
│   │   ├── expanded_player.py
│   │   ├── main.py
│   │   ├── nightlight.py
│   │   ├── per_app_volume.py
│   │   ├── player.py
│   │   └── wifi.py
│   ├── corners.py
│   ├── dock.py
│   ├── launcher/
│   │   ├── __init__.py
│   │   ├── main.py
│   │   ├── plugin_base.py
│   │   ├── plugin_manager.py
│   │   ├── plugins/
│   │   │   ├── __init__.py
│   │   │   ├── applications.py
│   │   │   ├── bash_scripts.py
│   │   │   ├── bookmarks.py
│   │   │   ├── caffeine.py
│   │   │   ├── calculator.py
│   │   │   ├── clipboard.py
│   │   │   ├── emoji.py
│   │   │   ├── otp.py
│   │   │   ├── password.py
│   │   │   ├── power.py
│   │   │   ├── reminders.py
│   │   │   ├── screencapture.py
│   │   │   ├── system.py
│   │   │   ├── tmux.py
│   │   │   ├── wallpaper.py
│   │   │   └── websearch.py
│   │   ├── result.py
│   │   ├── result_item.py
│   │   └── trigger_config.py
│   ├── notification/
│   │   ├── notification.py
│   │   ├── notification_center.py
│   │   └── unified_cache.py
│   ├── osd.py
│   ├── panel/
│   │   ├── components/
│   │   │   ├── enhanced_system_tray.py
│   │   │   ├── indicators.py
│   │   │   ├── menubar.py
│   │   │   └── recording_indicator.py
│   │   └── main.py
│   ├── switcher.py
│   ├── todo/
│   │   ├── __init__.py
│   │   └── todo_widget.py
│   └── widget.py
├── requirements.txt
├── scripts/
│   ├── gamemode.sh
│   ├── hyprpicker.sh
│   └── screen-capture.sh
├── services/
│   ├── __init__.py
│   ├── auth.py
│   ├── battery.py
│   ├── brightness.py
│   ├── custom_notification.py
│   ├── modus.py
│   ├── mpris.py
│   ├── network.py
│   └── todo.py
├── styles/
│   ├── about.css
│   ├── battery-widget.css
│   ├── colors.css
│   ├── controlcenter.css
│   ├── dock.css
│   ├── dropdown.css
│   ├── launcher.css
│   ├── lock.css
│   ├── notification-center.css
│   ├── notification.css
│   ├── osd.css
│   ├── panel.css
│   ├── player.css
│   ├── switcher.css
│   ├── todo.css
│   ├── tray.css
│   └── widgets.css
├── utils/
│   ├── __init__.py
│   ├── animator.py
│   ├── app_name_resolver.py
│   ├── conversion.py
│   ├── functions.py
│   ├── icon_resolver.py
│   ├── inhibit.py
│   ├── monitors.py
│   ├── occlusion.py
│   └── roam.py
└── widgets/
    ├── circle_image.py
    ├── custom_image.py
    ├── customrevealer.py
    ├── dropdown.py
    ├── mousecapture.py
    ├── popup_window.py
    ├── wayland.py
    └── wifi_password_dialog.py

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================

**/__pycache__/
*.pyc
*.pyo
*.pyd
# config/assets/config.json
config/assets/dock.json
config/assets/accounts.json
config/assets/passwords.json
config/assets/bookmarks.json
# config/hypr/modus.conf
config/hypr/colors.conf
fabric/**
fabric/
# styles/colors.css
.aider*
.venv/*
.venv/

AGENTS.md


================================================
FILE: LICENSE
================================================

                    GNU GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU General Public License is a free, copyleft license for
software and other kinds of works.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.  We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors.  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights.  Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received.  You must make sure that they, too, receive
or can get the source code.  And you must show them these terms so they
know their rights.

  Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.

  For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software.  For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.

  Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so.  This is fundamentally incompatible with the aim of
protecting users' freedom to change the software.  The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable.  Therefore, we
have designed this version of the GPL to prohibit the practice for those
products.  If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.

  Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary.  To prevent this, the GPL assures that
patents cannot be used to render the program non-free.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Use with the GNU Affero General Public License.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

  If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:

    <program>  Copyright (C) <year>  <name of author>
    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".

  You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.

  The GNU General Public License does not permit incorporating your program
into proprietary programs.  If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library.  If this is what you want to do, use the GNU Lesser General
Public License instead of this License.  But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.


================================================
FILE: README.md
================================================
<p align="center">
  <img src="assets/modus.png" height="200" alt="Logo">
</p>

<p align="center">
  <sub><sup><img src="https://raw.githubusercontent.com/Tarikul-Islam-Anik/Telegram-Animated-Emojis/main/Activity/Sparkles.webp" alt="Sparkles" width="25" height="25"/></sup></sub>
  <a href="https://github.com/hyprwm/Hyprland">
    <img src="https://img.shields.io/badge/A%20hackable%20shell%20for-Hyprland-0092CD?style=for-the-badge&logo=linux&color=0092CD&logoColor=D9E0EE&labelColor=000000" alt="A hackable shell for Hyprland">
  </a>
  <a href="https://github.com/Fabric-Development/fabric/">
    <img src="https://img.shields.io/badge/Powered%20by-Fabric-FAFAFA?style=for-the-badge&logo=python&color=FAFAFA&logoColor=D9E0EE&labelColor=000000" alt="Powered by Fabric">
  <sub><sup><img src="https://raw.githubusercontent.com/Tarikul-Islam-Anik/Telegram-Animated-Emojis/main/Activity/Sparkles.webp" alt="Sparkles" width="25" height="25"/></sup></sub>
  </a>
  </p>

<div align="center">

[![GitHub stars](https://img.shields.io/github/stars/S4NKALP/Modus?style=for-the-badge&logo=github&color=FFB686&logoColor=D9E0EE&labelColor=292324)](https://github.com/S4NKALP/Modus/stargazers)
[![Hyprland](https://img.shields.io/badge/Made%20for-Hyprland-pink?style=for-the-badge&logo=linux&logoColor=D9E0EE&labelColor=292324&color=C6A0F6)](https://hyprland.org/)
[![Maintained](https://img.shields.io/badge/Maintained-Yes-blue?style=for-the-badge&logo=linux&logoColor=D9E0EE&labelColor=292324&color=3362E1)]()
[![Discord](https://dcbadge.limes.pink/api/server/https://discord.gg/tRFxkbQ3Zq)](https://discord.gg/tRFxkbQ3Zq)

</div>

<br>

<figure>
  <h2>Home Screen:</h2>
  <img src="assets/screenshots/home.png" alt="fabric">
  <br/>
  <h2>Lock Screen:</h2>
    <img src="assets/screenshots/lock.png" alt="fabric">
</figure>
<br>


## Installation 

> [!CAUTION]
> - You need a working installation of hyprland and knowledge of how it works
> - There may not be all packages in your system install them accordingly

```bash
git clone https://github.com/S4NKALP/Modus ~/.config/Modus
cd ~/.config/Modus
./install.sh
```

> [!TIP]
> ## Post Installation
> - Install recommended [Icon theme](https://github.com/vinceliuice/MacTahoe-icon-theme) , [GTK theme](https://github.com/vinceliuice/MacTahoe-gtk-theme) and [Cursor Theme](https://github.com/vinceliuice/MacTahoe-icon-theme/tree/main/cursors) <br>
> - Check `config/hypr/modus.conf` edit it according to your device and copy it to your hyprland config
> - For Lock Screen Bind keys to `python lock.py`

<h2><sub><img src="https://raw.githubusercontent.com/Tarikul-Islam-Anik/Animated-Fluent-Emojis/master/Emojis/Travel%20and%20places/Rocket.png" alt="Rocket" width="25" height="25" /></sub> Todo</h2>

## Manual Installation (WIP)

```bash
paru -S glace-git gtk-session-lock python-pyotp python-pillow python-ijson python-setproctitle apple-fonts cinnamon-desktop --needed
git clone https://github.com/S4NKALP/Modus ~/.config/Modus
cd ~/.config/Modus
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
pip install --no-deps git+https://github.com/Fabric-Development/fabric.git
```

- [x] Launcher
- [x] Lock Screen
- [x] Dock
- [x] Notification
- [x] Control Center
- [x] Music Player
- [x] Desktop Widgets
- [x] New Launcher (like Spotlight)
- [ ] Settings
- [x] ~~Magnifier hover effect on Dock~~
- [x] ~~New Application Switcher~~
- [x] Panel Widget
- [x] MacOS like Widget
- [x] Expandable Notification Centre
- [ ] Installation Script
- [ ] Proper Documentation
- [ ] Pomodoro Timer Widget
- [x] To-do List Widget

## Bug Fixes (the bug found till now)

- [x] WiFi
- [x] wifi off button looks bigger
- [x] Metadata Changes delay in Media Player
- [x] Active Window Title showing `Unknown` when no active window
- [x] Notification Escape Char Issue

## Team

- [SANKALP](https://github.com/S4NKALP/)
- [tr1x_em](https://github.com/tr1xem)

## Special Thanks

A big thank you to the following people for their incredible help with code and creative ideas. Your help made a real difference!

- [darsh](https://github.com/its-darsh): for creating Fabric, which made everything possible.
- [gummy bear album](https://github.com/muhchaudhary): for sharing fantastic code snippets that saved me time and effort.
- [axenide](https://github.com/Axenide): for the amazing config that not only inspired parts of mine but also provided some gems I couldn’t resist borrowing.
- [E3nviction](https://github.com/E3nviction/): for code snippets and ideas that were incredibly helpful.

I truly appreciate your support


================================================
FILE: config/assets/config.json
================================================
{
  "wallpapers_dir": "~/Pictures/Wallpapers/",
  "dock_position": "Bottom",
  "terminal_command": "kitty -e",
  "dock_enabled": true,
  "dock_auto_hide": true,
  "dock_always_occluded": false,
  "dock_icon_size": 52,
  "window_switcher_items_per_row": 10,
  "hide_special_workspace": true,
  "dock_hide_special_workspace_apps": true,
  "dock_preview_apps": false,
  "notification_timeout": "5s",
  "notification_ignored_apps": ["Hyprshot"],
  "notification_limited_apps_history": ["Spotify"]
}


================================================
FILE: config/assets/emoji.json
================================================
{
  "😀": {
    "name": "grinning face",
    "slug": "grinning_face",
    "group": "Smileys & Emotion",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "😃": {
    "name": "grinning face with big eyes",
    "slug": "grinning_face_with_big_eyes",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😄": {
    "name": "grinning face with smiling eyes",
    "slug": "grinning_face_with_smiling_eyes",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😁": {
    "name": "beaming face with smiling eyes",
    "slug": "beaming_face_with_smiling_eyes",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😆": {
    "name": "grinning squinting face",
    "slug": "grinning_squinting_face",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😅": {
    "name": "grinning face with sweat",
    "slug": "grinning_face_with_sweat",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🤣": {
    "name": "rolling on the floor laughing",
    "slug": "rolling_on_the_floor_laughing",
    "group": "Smileys & Emotion",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": false
  },
  "😂": {
    "name": "face with tears of joy",
    "slug": "face_with_tears_of_joy",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🙂": {
    "name": "slightly smiling face",
    "slug": "slightly_smiling_face",
    "group": "Smileys & Emotion",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🙃": {
    "name": "upside-down face",
    "slug": "upside_down_face",
    "group": "Smileys & Emotion",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🫠": {
    "name": "melting face",
    "slug": "melting_face",
    "group": "Smileys & Emotion",
    "emoji_version": "14.0",
    "unicode_version": "14.0",
    "skin_tone_support": false
  },
  "😉": {
    "name": "winking face",
    "slug": "winking_face",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😊": {
    "name": "smiling face with smiling eyes",
    "slug": "smiling_face_with_smiling_eyes",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😇": {
    "name": "smiling face with halo",
    "slug": "smiling_face_with_halo",
    "group": "Smileys & Emotion",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🥰": {
    "name": "smiling face with hearts",
    "slug": "smiling_face_with_hearts",
    "group": "Smileys & Emotion",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": false
  },
  "😍": {
    "name": "smiling face with heart-eyes",
    "slug": "smiling_face_with_heart_eyes",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🤩": {
    "name": "star-struck",
    "slug": "star_struck",
    "group": "Smileys & Emotion",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": false
  },
  "😘": {
    "name": "face blowing a kiss",
    "slug": "face_blowing_a_kiss",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😗": {
    "name": "kissing face",
    "slug": "kissing_face",
    "group": "Smileys & Emotion",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "☺️": {
    "name": "smiling face",
    "slug": "smiling_face",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😚": {
    "name": "kissing face with closed eyes",
    "slug": "kissing_face_with_closed_eyes",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😙": {
    "name": "kissing face with smiling eyes",
    "slug": "kissing_face_with_smiling_eyes",
    "group": "Smileys & Emotion",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🥲": {
    "name": "smiling face with tear",
    "slug": "smiling_face_with_tear",
    "group": "Smileys & Emotion",
    "emoji_version": "13.0",
    "unicode_version": "13.0",
    "skin_tone_support": false
  },
  "😋": {
    "name": "face savoring food",
    "slug": "face_savoring_food",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😛": {
    "name": "face with tongue",
    "slug": "face_with_tongue",
    "group": "Smileys & Emotion",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "😜": {
    "name": "winking face with tongue",
    "slug": "winking_face_with_tongue",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🤪": {
    "name": "zany face",
    "slug": "zany_face",
    "group": "Smileys & Emotion",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": false
  },
  "😝": {
    "name": "squinting face with tongue",
    "slug": "squinting_face_with_tongue",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🤑": {
    "name": "money-mouth face",
    "slug": "money_mouth_face",
    "group": "Smileys & Emotion",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🤗": {
    "name": "smiling face with open hands",
    "slug": "smiling_face_with_open_hands",
    "group": "Smileys & Emotion",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🤭": {
    "name": "face with hand over mouth",
    "slug": "face_with_hand_over_mouth",
    "group": "Smileys & Emotion",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": false
  },
  "🫢": {
    "name": "face with open eyes and hand over mouth",
    "slug": "face_with_open_eyes_and_hand_over_mouth",
    "group": "Smileys & Emotion",
    "emoji_version": "14.0",
    "unicode_version": "14.0",
    "skin_tone_support": false
  },
  "🫣": {
    "name": "face with peeking eye",
    "slug": "face_with_peeking_eye",
    "group": "Smileys & Emotion",
    "emoji_version": "14.0",
    "unicode_version": "14.0",
    "skin_tone_support": false
  },
  "🤫": {
    "name": "shushing face",
    "slug": "shushing_face",
    "group": "Smileys & Emotion",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": false
  },
  "🤔": {
    "name": "thinking face",
    "slug": "thinking_face",
    "group": "Smileys & Emotion",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🫡": {
    "name": "saluting face",
    "slug": "saluting_face",
    "group": "Smileys & Emotion",
    "emoji_version": "14.0",
    "unicode_version": "14.0",
    "skin_tone_support": false
  },
  "🤐": {
    "name": "zipper-mouth face",
    "slug": "zipper_mouth_face",
    "group": "Smileys & Emotion",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🤨": {
    "name": "face with raised eyebrow",
    "slug": "face_with_raised_eyebrow",
    "group": "Smileys & Emotion",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": false
  },
  "😐": {
    "name": "neutral face",
    "slug": "neutral_face",
    "group": "Smileys & Emotion",
    "emoji_version": "0.7",
    "unicode_version": "0.7",
    "skin_tone_support": false
  },
  "😑": {
    "name": "expressionless face",
    "slug": "expressionless_face",
    "group": "Smileys & Emotion",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "😶": {
    "name": "face without mouth",
    "slug": "face_without_mouth",
    "group": "Smileys & Emotion",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🫥": {
    "name": "dotted line face",
    "slug": "dotted_line_face",
    "group": "Smileys & Emotion",
    "emoji_version": "14.0",
    "unicode_version": "14.0",
    "skin_tone_support": false
  },
  "😶‍🌫️": {
    "name": "face in clouds",
    "slug": "face_in_clouds",
    "group": "Smileys & Emotion",
    "emoji_version": "13.1",
    "unicode_version": "13.1",
    "skin_tone_support": false
  },
  "😏": {
    "name": "smirking face",
    "slug": "smirking_face",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😒": {
    "name": "unamused face",
    "slug": "unamused_face",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🙄": {
    "name": "face with rolling eyes",
    "slug": "face_with_rolling_eyes",
    "group": "Smileys & Emotion",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "😬": {
    "name": "grimacing face",
    "slug": "grimacing_face",
    "group": "Smileys & Emotion",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "😮‍💨": {
    "name": "face exhaling",
    "slug": "face_exhaling",
    "group": "Smileys & Emotion",
    "emoji_version": "13.1",
    "unicode_version": "13.1",
    "skin_tone_support": false
  },
  "🤥": {
    "name": "lying face",
    "slug": "lying_face",
    "group": "Smileys & Emotion",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": false
  },
  "🫨": {
    "name": "shaking face",
    "slug": "shaking_face",
    "group": "Smileys & Emotion",
    "emoji_version": "15.0",
    "unicode_version": "15.0",
    "skin_tone_support": false
  },
  "🙂‍↔️": {
    "name": "head shaking horizontally",
    "slug": "head_shaking_horizontally",
    "group": "Smileys & Emotion",
    "emoji_version": "15.1",
    "unicode_version": "15.1",
    "skin_tone_support": false
  },
  "🙂‍↕️": {
    "name": "head shaking vertically",
    "slug": "head_shaking_vertically",
    "group": "Smileys & Emotion",
    "emoji_version": "15.1",
    "unicode_version": "15.1",
    "skin_tone_support": false
  },
  "😌": {
    "name": "relieved face",
    "slug": "relieved_face",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😔": {
    "name": "pensive face",
    "slug": "pensive_face",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😪": {
    "name": "sleepy face",
    "slug": "sleepy_face",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🤤": {
    "name": "drooling face",
    "slug": "drooling_face",
    "group": "Smileys & Emotion",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": false
  },
  "😴": {
    "name": "sleeping face",
    "slug": "sleeping_face",
    "group": "Smileys & Emotion",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "😷": {
    "name": "face with medical mask",
    "slug": "face_with_medical_mask",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🤒": {
    "name": "face with thermometer",
    "slug": "face_with_thermometer",
    "group": "Smileys & Emotion",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🤕": {
    "name": "face with head-bandage",
    "slug": "face_with_head_bandage",
    "group": "Smileys & Emotion",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🤢": {
    "name": "nauseated face",
    "slug": "nauseated_face",
    "group": "Smileys & Emotion",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": false
  },
  "🤮": {
    "name": "face vomiting",
    "slug": "face_vomiting",
    "group": "Smileys & Emotion",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": false
  },
  "🤧": {
    "name": "sneezing face",
    "slug": "sneezing_face",
    "group": "Smileys & Emotion",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": false
  },
  "🥵": {
    "name": "hot face",
    "slug": "hot_face",
    "group": "Smileys & Emotion",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": false
  },
  "🥶": {
    "name": "cold face",
    "slug": "cold_face",
    "group": "Smileys & Emotion",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": false
  },
  "🥴": {
    "name": "woozy face",
    "slug": "woozy_face",
    "group": "Smileys & Emotion",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": false
  },
  "😵": {
    "name": "face with crossed-out eyes",
    "slug": "face_with_crossed_out_eyes",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😵‍💫": {
    "name": "face with spiral eyes",
    "slug": "face_with_spiral_eyes",
    "group": "Smileys & Emotion",
    "emoji_version": "13.1",
    "unicode_version": "13.1",
    "skin_tone_support": false
  },
  "🤯": {
    "name": "exploding head",
    "slug": "exploding_head",
    "group": "Smileys & Emotion",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": false
  },
  "🤠": {
    "name": "cowboy hat face",
    "slug": "cowboy_hat_face",
    "group": "Smileys & Emotion",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": false
  },
  "🥳": {
    "name": "partying face",
    "slug": "partying_face",
    "group": "Smileys & Emotion",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": false
  },
  "🥸": {
    "name": "disguised face",
    "slug": "disguised_face",
    "group": "Smileys & Emotion",
    "emoji_version": "13.0",
    "unicode_version": "13.0",
    "skin_tone_support": false
  },
  "😎": {
    "name": "smiling face with sunglasses",
    "slug": "smiling_face_with_sunglasses",
    "group": "Smileys & Emotion",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🤓": {
    "name": "nerd face",
    "slug": "nerd_face",
    "group": "Smileys & Emotion",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🧐": {
    "name": "face with monocle",
    "slug": "face_with_monocle",
    "group": "Smileys & Emotion",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": false
  },
  "😕": {
    "name": "confused face",
    "slug": "confused_face",
    "group": "Smileys & Emotion",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🫤": {
    "name": "face with diagonal mouth",
    "slug": "face_with_diagonal_mouth",
    "group": "Smileys & Emotion",
    "emoji_version": "14.0",
    "unicode_version": "14.0",
    "skin_tone_support": false
  },
  "😟": {
    "name": "worried face",
    "slug": "worried_face",
    "group": "Smileys & Emotion",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🙁": {
    "name": "slightly frowning face",
    "slug": "slightly_frowning_face",
    "group": "Smileys & Emotion",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "☹️": {
    "name": "frowning face",
    "slug": "frowning_face",
    "group": "Smileys & Emotion",
    "emoji_version": "0.7",
    "unicode_version": "0.7",
    "skin_tone_support": false
  },
  "😮": {
    "name": "face with open mouth",
    "slug": "face_with_open_mouth",
    "group": "Smileys & Emotion",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "😯": {
    "name": "hushed face",
    "slug": "hushed_face",
    "group": "Smileys & Emotion",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "😲": {
    "name": "astonished face",
    "slug": "astonished_face",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😳": {
    "name": "flushed face",
    "slug": "flushed_face",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🥺": {
    "name": "pleading face",
    "slug": "pleading_face",
    "group": "Smileys & Emotion",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": false
  },
  "🥹": {
    "name": "face holding back tears",
    "slug": "face_holding_back_tears",
    "group": "Smileys & Emotion",
    "emoji_version": "14.0",
    "unicode_version": "14.0",
    "skin_tone_support": false
  },
  "😦": {
    "name": "frowning face with open mouth",
    "slug": "frowning_face_with_open_mouth",
    "group": "Smileys & Emotion",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "😧": {
    "name": "anguished face",
    "slug": "anguished_face",
    "group": "Smileys & Emotion",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "😨": {
    "name": "fearful face",
    "slug": "fearful_face",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😰": {
    "name": "anxious face with sweat",
    "slug": "anxious_face_with_sweat",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😥": {
    "name": "sad but relieved face",
    "slug": "sad_but_relieved_face",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😢": {
    "name": "crying face",
    "slug": "crying_face",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😭": {
    "name": "loudly crying face",
    "slug": "loudly_crying_face",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😱": {
    "name": "face screaming in fear",
    "slug": "face_screaming_in_fear",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😖": {
    "name": "confounded face",
    "slug": "confounded_face",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😣": {
    "name": "persevering face",
    "slug": "persevering_face",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😞": {
    "name": "disappointed face",
    "slug": "disappointed_face",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😓": {
    "name": "downcast face with sweat",
    "slug": "downcast_face_with_sweat",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😩": {
    "name": "weary face",
    "slug": "weary_face",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😫": {
    "name": "tired face",
    "slug": "tired_face",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🥱": {
    "name": "yawning face",
    "slug": "yawning_face",
    "group": "Smileys & Emotion",
    "emoji_version": "12.0",
    "unicode_version": "12.0",
    "skin_tone_support": false
  },
  "😤": {
    "name": "face with steam from nose",
    "slug": "face_with_steam_from_nose",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😡": {
    "name": "enraged face",
    "slug": "enraged_face",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😠": {
    "name": "angry face",
    "slug": "angry_face",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🤬": {
    "name": "face with symbols on mouth",
    "slug": "face_with_symbols_on_mouth",
    "group": "Smileys & Emotion",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": false
  },
  "😈": {
    "name": "smiling face with horns",
    "slug": "smiling_face_with_horns",
    "group": "Smileys & Emotion",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "👿": {
    "name": "angry face with horns",
    "slug": "angry_face_with_horns",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "💀": {
    "name": "skull",
    "slug": "skull",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "☠️": {
    "name": "skull and crossbones",
    "slug": "skull_and_crossbones",
    "group": "Smileys & Emotion",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "💩": {
    "name": "pile of poo",
    "slug": "pile_of_poo",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🤡": {
    "name": "clown face",
    "slug": "clown_face",
    "group": "Smileys & Emotion",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": false
  },
  "👹": {
    "name": "ogre",
    "slug": "ogre",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "👺": {
    "name": "goblin",
    "slug": "goblin",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "👻": {
    "name": "ghost",
    "slug": "ghost",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "👽": {
    "name": "alien",
    "slug": "alien",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "👾": {
    "name": "alien monster",
    "slug": "alien_monster",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🤖": {
    "name": "robot",
    "slug": "robot",
    "group": "Smileys & Emotion",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "😺": {
    "name": "grinning cat",
    "slug": "grinning_cat",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😸": {
    "name": "grinning cat with smiling eyes",
    "slug": "grinning_cat_with_smiling_eyes",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😹": {
    "name": "cat with tears of joy",
    "slug": "cat_with_tears_of_joy",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😻": {
    "name": "smiling cat with heart-eyes",
    "slug": "smiling_cat_with_heart_eyes",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😼": {
    "name": "cat with wry smile",
    "slug": "cat_with_wry_smile",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😽": {
    "name": "kissing cat",
    "slug": "kissing_cat",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🙀": {
    "name": "weary cat",
    "slug": "weary_cat",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😿": {
    "name": "crying cat",
    "slug": "crying_cat",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "😾": {
    "name": "pouting cat",
    "slug": "pouting_cat",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🙈": {
    "name": "see-no-evil monkey",
    "slug": "see_no_evil_monkey",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🙉": {
    "name": "hear-no-evil monkey",
    "slug": "hear_no_evil_monkey",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🙊": {
    "name": "speak-no-evil monkey",
    "slug": "speak_no_evil_monkey",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "💌": {
    "name": "love letter",
    "slug": "love_letter",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "💘": {
    "name": "heart with arrow",
    "slug": "heart_with_arrow",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "💝": {
    "name": "heart with ribbon",
    "slug": "heart_with_ribbon",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "💖": {
    "name": "sparkling heart",
    "slug": "sparkling_heart",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "💗": {
    "name": "growing heart",
    "slug": "growing_heart",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "💓": {
    "name": "beating heart",
    "slug": "beating_heart",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "💞": {
    "name": "revolving hearts",
    "slug": "revolving_hearts",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "💕": {
    "name": "two hearts",
    "slug": "two_hearts",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "💟": {
    "name": "heart decoration",
    "slug": "heart_decoration",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "❣️": {
    "name": "heart exclamation",
    "slug": "heart_exclamation",
    "group": "Smileys & Emotion",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "💔": {
    "name": "broken heart",
    "slug": "broken_heart",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "❤️‍🔥": {
    "name": "heart on fire",
    "slug": "heart_on_fire",
    "group": "Smileys & Emotion",
    "emoji_version": "13.1",
    "unicode_version": "13.1",
    "skin_tone_support": false
  },
  "❤️‍🩹": {
    "name": "mending heart",
    "slug": "mending_heart",
    "group": "Smileys & Emotion",
    "emoji_version": "13.1",
    "unicode_version": "13.1",
    "skin_tone_support": false
  },
  "❤️": {
    "name": "red heart",
    "slug": "red_heart",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🩷": {
    "name": "pink heart",
    "slug": "pink_heart",
    "group": "Smileys & Emotion",
    "emoji_version": "15.0",
    "unicode_version": "15.0",
    "skin_tone_support": false
  },
  "🧡": {
    "name": "orange heart",
    "slug": "orange_heart",
    "group": "Smileys & Emotion",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": false
  },
  "💛": {
    "name": "yellow heart",
    "slug": "yellow_heart",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "💚": {
    "name": "green heart",
    "slug": "green_heart",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "💙": {
    "name": "blue heart",
    "slug": "blue_heart",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🩵": {
    "name": "light blue heart",
    "slug": "light_blue_heart",
    "group": "Smileys & Emotion",
    "emoji_version": "15.0",
    "unicode_version": "15.0",
    "skin_tone_support": false
  },
  "💜": {
    "name": "purple heart",
    "slug": "purple_heart",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🤎": {
    "name": "brown heart",
    "slug": "brown_heart",
    "group": "Smileys & Emotion",
    "emoji_version": "12.0",
    "unicode_version": "12.0",
    "skin_tone_support": false
  },
  "🖤": {
    "name": "black heart",
    "slug": "black_heart",
    "group": "Smileys & Emotion",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": false
  },
  "🩶": {
    "name": "grey heart",
    "slug": "grey_heart",
    "group": "Smileys & Emotion",
    "emoji_version": "15.0",
    "unicode_version": "15.0",
    "skin_tone_support": false
  },
  "🤍": {
    "name": "white heart",
    "slug": "white_heart",
    "group": "Smileys & Emotion",
    "emoji_version": "12.0",
    "unicode_version": "12.0",
    "skin_tone_support": false
  },
  "💋": {
    "name": "kiss mark",
    "slug": "kiss_mark",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "💯": {
    "name": "hundred points",
    "slug": "hundred_points",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "💢": {
    "name": "anger symbol",
    "slug": "anger_symbol",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "💥": {
    "name": "collision",
    "slug": "collision",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "💫": {
    "name": "dizzy",
    "slug": "dizzy",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "💦": {
    "name": "sweat droplets",
    "slug": "sweat_droplets",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "💨": {
    "name": "dashing away",
    "slug": "dashing_away",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🕳️": {
    "name": "hole",
    "slug": "hole",
    "group": "Smileys & Emotion",
    "emoji_version": "0.7",
    "unicode_version": "0.7",
    "skin_tone_support": false
  },
  "💬": {
    "name": "speech balloon",
    "slug": "speech_balloon",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "👁️‍🗨️": {
    "name": "eye in speech bubble",
    "slug": "eye_in_speech_bubble",
    "group": "Smileys & Emotion",
    "emoji_version": "2.0",
    "unicode_version": "2.0",
    "skin_tone_support": false
  },
  "🗨️": {
    "name": "left speech bubble",
    "slug": "left_speech_bubble",
    "group": "Smileys & Emotion",
    "emoji_version": "2.0",
    "unicode_version": "2.0",
    "skin_tone_support": false
  },
  "🗯️": {
    "name": "right anger bubble",
    "slug": "right_anger_bubble",
    "group": "Smileys & Emotion",
    "emoji_version": "0.7",
    "unicode_version": "0.7",
    "skin_tone_support": false
  },
  "💭": {
    "name": "thought balloon",
    "slug": "thought_balloon",
    "group": "Smileys & Emotion",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "💤": {
    "name": "ZZZ",
    "slug": "zzz",
    "group": "Smileys & Emotion",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "👋": {
    "name": "waving hand",
    "slug": "waving_hand",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🤚": {
    "name": "raised back of hand",
    "slug": "raised_back_of_hand",
    "group": "People & Body",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "3.0"
  },
  "🖐️": {
    "name": "hand with fingers splayed",
    "slug": "hand_with_fingers_splayed",
    "group": "People & Body",
    "emoji_version": "0.7",
    "unicode_version": "0.7",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "✋": {
    "name": "raised hand",
    "slug": "raised_hand",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🖖": {
    "name": "vulcan salute",
    "slug": "vulcan_salute",
    "group": "People & Body",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🫱": {
    "name": "rightwards hand",
    "slug": "rightwards_hand",
    "group": "People & Body",
    "emoji_version": "14.0",
    "unicode_version": "14.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "14.0"
  },
  "🫲": {
    "name": "leftwards hand",
    "slug": "leftwards_hand",
    "group": "People & Body",
    "emoji_version": "14.0",
    "unicode_version": "14.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "14.0"
  },
  "🫳": {
    "name": "palm down hand",
    "slug": "palm_down_hand",
    "group": "People & Body",
    "emoji_version": "14.0",
    "unicode_version": "14.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "14.0"
  },
  "🫴": {
    "name": "palm up hand",
    "slug": "palm_up_hand",
    "group": "People & Body",
    "emoji_version": "14.0",
    "unicode_version": "14.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "14.0"
  },
  "🫷": {
    "name": "leftwards pushing hand",
    "slug": "leftwards_pushing_hand",
    "group": "People & Body",
    "emoji_version": "15.0",
    "unicode_version": "15.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "15.0"
  },
  "🫸": {
    "name": "rightwards pushing hand",
    "slug": "rightwards_pushing_hand",
    "group": "People & Body",
    "emoji_version": "15.0",
    "unicode_version": "15.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "15.0"
  },
  "👌": {
    "name": "OK hand",
    "slug": "ok_hand",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🤌": {
    "name": "pinched fingers",
    "slug": "pinched_fingers",
    "group": "People & Body",
    "emoji_version": "13.0",
    "unicode_version": "13.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "13.0"
  },
  "🤏": {
    "name": "pinching hand",
    "slug": "pinching_hand",
    "group": "People & Body",
    "emoji_version": "12.0",
    "unicode_version": "12.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.0"
  },
  "✌️": {
    "name": "victory hand",
    "slug": "victory_hand",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🤞": {
    "name": "crossed fingers",
    "slug": "crossed_fingers",
    "group": "People & Body",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "3.0"
  },
  "🫰": {
    "name": "hand with index finger and thumb crossed",
    "slug": "hand_with_index_finger_and_thumb_crossed",
    "group": "People & Body",
    "emoji_version": "14.0",
    "unicode_version": "14.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "14.0"
  },
  "🤟": {
    "name": "love-you gesture",
    "slug": "love_you_gesture",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "5.0"
  },
  "🤘": {
    "name": "sign of the horns",
    "slug": "sign_of_the_horns",
    "group": "People & Body",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🤙": {
    "name": "call me hand",
    "slug": "call_me_hand",
    "group": "People & Body",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "3.0"
  },
  "👈": {
    "name": "backhand index pointing left",
    "slug": "backhand_index_pointing_left",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "👉": {
    "name": "backhand index pointing right",
    "slug": "backhand_index_pointing_right",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "👆": {
    "name": "backhand index pointing up",
    "slug": "backhand_index_pointing_up",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🖕": {
    "name": "middle finger",
    "slug": "middle_finger",
    "group": "People & Body",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "👇": {
    "name": "backhand index pointing down",
    "slug": "backhand_index_pointing_down",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "☝️": {
    "name": "index pointing up",
    "slug": "index_pointing_up",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🫵": {
    "name": "index pointing at the viewer",
    "slug": "index_pointing_at_the_viewer",
    "group": "People & Body",
    "emoji_version": "14.0",
    "unicode_version": "14.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "14.0"
  },
  "👍": {
    "name": "thumbs up",
    "slug": "thumbs_up",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "👎": {
    "name": "thumbs down",
    "slug": "thumbs_down",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "✊": {
    "name": "raised fist",
    "slug": "raised_fist",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "👊": {
    "name": "oncoming fist",
    "slug": "oncoming_fist",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🤛": {
    "name": "left-facing fist",
    "slug": "left_facing_fist",
    "group": "People & Body",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "3.0"
  },
  "🤜": {
    "name": "right-facing fist",
    "slug": "right_facing_fist",
    "group": "People & Body",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "3.0"
  },
  "👏": {
    "name": "clapping hands",
    "slug": "clapping_hands",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🙌": {
    "name": "raising hands",
    "slug": "raising_hands",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🫶": {
    "name": "heart hands",
    "slug": "heart_hands",
    "group": "People & Body",
    "emoji_version": "14.0",
    "unicode_version": "14.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "14.0"
  },
  "👐": {
    "name": "open hands",
    "slug": "open_hands",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🤲": {
    "name": "palms up together",
    "slug": "palms_up_together",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "5.0"
  },
  "🤝": {
    "name": "handshake",
    "slug": "handshake",
    "group": "People & Body",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "14.0"
  },
  "🙏": {
    "name": "folded hands",
    "slug": "folded_hands",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "✍️": {
    "name": "writing hand",
    "slug": "writing_hand",
    "group": "People & Body",
    "emoji_version": "0.7",
    "unicode_version": "0.7",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "💅": {
    "name": "nail polish",
    "slug": "nail_polish",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🤳": {
    "name": "selfie",
    "slug": "selfie",
    "group": "People & Body",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "3.0"
  },
  "💪": {
    "name": "flexed biceps",
    "slug": "flexed_biceps",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🦾": {
    "name": "mechanical arm",
    "slug": "mechanical_arm",
    "group": "People & Body",
    "emoji_version": "12.0",
    "unicode_version": "12.0",
    "skin_tone_support": false
  },
  "🦿": {
    "name": "mechanical leg",
    "slug": "mechanical_leg",
    "group": "People & Body",
    "emoji_version": "12.0",
    "unicode_version": "12.0",
    "skin_tone_support": false
  },
  "🦵": {
    "name": "leg",
    "slug": "leg",
    "group": "People & Body",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "11.0"
  },
  "🦶": {
    "name": "foot",
    "slug": "foot",
    "group": "People & Body",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "11.0"
  },
  "👂": {
    "name": "ear",
    "slug": "ear",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🦻": {
    "name": "ear with hearing aid",
    "slug": "ear_with_hearing_aid",
    "group": "People & Body",
    "emoji_version": "12.0",
    "unicode_version": "12.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.0"
  },
  "👃": {
    "name": "nose",
    "slug": "nose",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🧠": {
    "name": "brain",
    "slug": "brain",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": false
  },
  "🫀": {
    "name": "anatomical heart",
    "slug": "anatomical_heart",
    "group": "People & Body",
    "emoji_version": "13.0",
    "unicode_version": "13.0",
    "skin_tone_support": false
  },
  "🫁": {
    "name": "lungs",
    "slug": "lungs",
    "group": "People & Body",
    "emoji_version": "13.0",
    "unicode_version": "13.0",
    "skin_tone_support": false
  },
  "🦷": {
    "name": "tooth",
    "slug": "tooth",
    "group": "People & Body",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": false
  },
  "🦴": {
    "name": "bone",
    "slug": "bone",
    "group": "People & Body",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": false
  },
  "👀": {
    "name": "eyes",
    "slug": "eyes",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "👁️": {
    "name": "eye",
    "slug": "eye",
    "group": "People & Body",
    "emoji_version": "0.7",
    "unicode_version": "0.7",
    "skin_tone_support": false
  },
  "👅": {
    "name": "tongue",
    "slug": "tongue",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "👄": {
    "name": "mouth",
    "slug": "mouth",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🫦": {
    "name": "biting lip",
    "slug": "biting_lip",
    "group": "People & Body",
    "emoji_version": "14.0",
    "unicode_version": "14.0",
    "skin_tone_support": false
  },
  "👶": {
    "name": "baby",
    "slug": "baby",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🧒": {
    "name": "child",
    "slug": "child",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "5.0"
  },
  "👦": {
    "name": "boy",
    "slug": "boy",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "👧": {
    "name": "girl",
    "slug": "girl",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🧑": {
    "name": "person",
    "slug": "person",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "5.0"
  },
  "👱": {
    "name": "person blond hair",
    "slug": "person_blond_hair",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "👨": {
    "name": "man",
    "slug": "man",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🧔": {
    "name": "person beard",
    "slug": "person_beard",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "5.0"
  },
  "🧔‍♂️": {
    "name": "man beard",
    "slug": "man_beard",
    "group": "People & Body",
    "emoji_version": "13.1",
    "unicode_version": "13.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "13.1"
  },
  "🧔‍♀️": {
    "name": "woman beard",
    "slug": "woman_beard",
    "group": "People & Body",
    "emoji_version": "13.1",
    "unicode_version": "13.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "13.1"
  },
  "👨‍🦰": {
    "name": "man red hair",
    "slug": "man_red_hair",
    "group": "People & Body",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "11.0"
  },
  "👨‍🦱": {
    "name": "man curly hair",
    "slug": "man_curly_hair",
    "group": "People & Body",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "11.0"
  },
  "👨‍🦳": {
    "name": "man white hair",
    "slug": "man_white_hair",
    "group": "People & Body",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "11.0"
  },
  "👨‍🦲": {
    "name": "man bald",
    "slug": "man_bald",
    "group": "People & Body",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "11.0"
  },
  "👩": {
    "name": "woman",
    "slug": "woman",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "👩‍🦰": {
    "name": "woman red hair",
    "slug": "woman_red_hair",
    "group": "People & Body",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "11.0"
  },
  "🧑‍🦰": {
    "name": "person red hair",
    "slug": "person_red_hair",
    "group": "People & Body",
    "emoji_version": "12.1",
    "unicode_version": "12.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.1"
  },
  "👩‍🦱": {
    "name": "woman curly hair",
    "slug": "woman_curly_hair",
    "group": "People & Body",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "11.0"
  },
  "🧑‍🦱": {
    "name": "person curly hair",
    "slug": "person_curly_hair",
    "group": "People & Body",
    "emoji_version": "12.1",
    "unicode_version": "12.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.1"
  },
  "👩‍🦳": {
    "name": "woman white hair",
    "slug": "woman_white_hair",
    "group": "People & Body",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "11.0"
  },
  "🧑‍🦳": {
    "name": "person white hair",
    "slug": "person_white_hair",
    "group": "People & Body",
    "emoji_version": "12.1",
    "unicode_version": "12.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.1"
  },
  "👩‍🦲": {
    "name": "woman bald",
    "slug": "woman_bald",
    "group": "People & Body",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "11.0"
  },
  "🧑‍🦲": {
    "name": "person bald",
    "slug": "person_bald",
    "group": "People & Body",
    "emoji_version": "12.1",
    "unicode_version": "12.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.1"
  },
  "👱‍♀️": {
    "name": "woman blond hair",
    "slug": "woman_blond_hair",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "👱‍♂️": {
    "name": "man blond hair",
    "slug": "man_blond_hair",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🧓": {
    "name": "older person",
    "slug": "older_person",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "5.0"
  },
  "👴": {
    "name": "old man",
    "slug": "old_man",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "👵": {
    "name": "old woman",
    "slug": "old_woman",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🙍": {
    "name": "person frowning",
    "slug": "person_frowning",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🙍‍♂️": {
    "name": "man frowning",
    "slug": "man_frowning",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🙍‍♀️": {
    "name": "woman frowning",
    "slug": "woman_frowning",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🙎": {
    "name": "person pouting",
    "slug": "person_pouting",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🙎‍♂️": {
    "name": "man pouting",
    "slug": "man_pouting",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🙎‍♀️": {
    "name": "woman pouting",
    "slug": "woman_pouting",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🙅": {
    "name": "person gesturing NO",
    "slug": "person_gesturing_no",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🙅‍♂️": {
    "name": "man gesturing NO",
    "slug": "man_gesturing_no",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🙅‍♀️": {
    "name": "woman gesturing NO",
    "slug": "woman_gesturing_no",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🙆": {
    "name": "person gesturing OK",
    "slug": "person_gesturing_ok",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🙆‍♂️": {
    "name": "man gesturing OK",
    "slug": "man_gesturing_ok",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🙆‍♀️": {
    "name": "woman gesturing OK",
    "slug": "woman_gesturing_ok",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "💁": {
    "name": "person tipping hand",
    "slug": "person_tipping_hand",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "💁‍♂️": {
    "name": "man tipping hand",
    "slug": "man_tipping_hand",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "💁‍♀️": {
    "name": "woman tipping hand",
    "slug": "woman_tipping_hand",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🙋": {
    "name": "person raising hand",
    "slug": "person_raising_hand",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🙋‍♂️": {
    "name": "man raising hand",
    "slug": "man_raising_hand",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🙋‍♀️": {
    "name": "woman raising hand",
    "slug": "woman_raising_hand",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🧏": {
    "name": "deaf person",
    "slug": "deaf_person",
    "group": "People & Body",
    "emoji_version": "12.0",
    "unicode_version": "12.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.0"
  },
  "🧏‍♂️": {
    "name": "deaf man",
    "slug": "deaf_man",
    "group": "People & Body",
    "emoji_version": "12.0",
    "unicode_version": "12.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.0"
  },
  "🧏‍♀️": {
    "name": "deaf woman",
    "slug": "deaf_woman",
    "group": "People & Body",
    "emoji_version": "12.0",
    "unicode_version": "12.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.0"
  },
  "🙇": {
    "name": "person bowing",
    "slug": "person_bowing",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🙇‍♂️": {
    "name": "man bowing",
    "slug": "man_bowing",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🙇‍♀️": {
    "name": "woman bowing",
    "slug": "woman_bowing",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🤦": {
    "name": "person facepalming",
    "slug": "person_facepalming",
    "group": "People & Body",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "3.0"
  },
  "🤦‍♂️": {
    "name": "man facepalming",
    "slug": "man_facepalming",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🤦‍♀️": {
    "name": "woman facepalming",
    "slug": "woman_facepalming",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🤷": {
    "name": "person shrugging",
    "slug": "person_shrugging",
    "group": "People & Body",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "3.0"
  },
  "🤷‍♂️": {
    "name": "man shrugging",
    "slug": "man_shrugging",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🤷‍♀️": {
    "name": "woman shrugging",
    "slug": "woman_shrugging",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🧑‍⚕️": {
    "name": "health worker",
    "slug": "health_worker",
    "group": "People & Body",
    "emoji_version": "12.1",
    "unicode_version": "12.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.1"
  },
  "👨‍⚕️": {
    "name": "man health worker",
    "slug": "man_health_worker",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "👩‍⚕️": {
    "name": "woman health worker",
    "slug": "woman_health_worker",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🧑‍🎓": {
    "name": "student",
    "slug": "student",
    "group": "People & Body",
    "emoji_version": "12.1",
    "unicode_version": "12.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.1"
  },
  "👨‍🎓": {
    "name": "man student",
    "slug": "man_student",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "👩‍🎓": {
    "name": "woman student",
    "slug": "woman_student",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🧑‍🏫": {
    "name": "teacher",
    "slug": "teacher",
    "group": "People & Body",
    "emoji_version": "12.1",
    "unicode_version": "12.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.1"
  },
  "👨‍🏫": {
    "name": "man teacher",
    "slug": "man_teacher",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "👩‍🏫": {
    "name": "woman teacher",
    "slug": "woman_teacher",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🧑‍⚖️": {
    "name": "judge",
    "slug": "judge",
    "group": "People & Body",
    "emoji_version": "12.1",
    "unicode_version": "12.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.1"
  },
  "👨‍⚖️": {
    "name": "man judge",
    "slug": "man_judge",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "👩‍⚖️": {
    "name": "woman judge",
    "slug": "woman_judge",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🧑‍🌾": {
    "name": "farmer",
    "slug": "farmer",
    "group": "People & Body",
    "emoji_version": "12.1",
    "unicode_version": "12.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.1"
  },
  "👨‍🌾": {
    "name": "man farmer",
    "slug": "man_farmer",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "👩‍🌾": {
    "name": "woman farmer",
    "slug": "woman_farmer",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🧑‍🍳": {
    "name": "cook",
    "slug": "cook",
    "group": "People & Body",
    "emoji_version": "12.1",
    "unicode_version": "12.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.1"
  },
  "👨‍🍳": {
    "name": "man cook",
    "slug": "man_cook",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "👩‍🍳": {
    "name": "woman cook",
    "slug": "woman_cook",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🧑‍🔧": {
    "name": "mechanic",
    "slug": "mechanic",
    "group": "People & Body",
    "emoji_version": "12.1",
    "unicode_version": "12.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.1"
  },
  "👨‍🔧": {
    "name": "man mechanic",
    "slug": "man_mechanic",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "👩‍🔧": {
    "name": "woman mechanic",
    "slug": "woman_mechanic",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🧑‍🏭": {
    "name": "factory worker",
    "slug": "factory_worker",
    "group": "People & Body",
    "emoji_version": "12.1",
    "unicode_version": "12.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.1"
  },
  "👨‍🏭": {
    "name": "man factory worker",
    "slug": "man_factory_worker",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "👩‍🏭": {
    "name": "woman factory worker",
    "slug": "woman_factory_worker",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🧑‍💼": {
    "name": "office worker",
    "slug": "office_worker",
    "group": "People & Body",
    "emoji_version": "12.1",
    "unicode_version": "12.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.1"
  },
  "👨‍💼": {
    "name": "man office worker",
    "slug": "man_office_worker",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "👩‍💼": {
    "name": "woman office worker",
    "slug": "woman_office_worker",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🧑‍🔬": {
    "name": "scientist",
    "slug": "scientist",
    "group": "People & Body",
    "emoji_version": "12.1",
    "unicode_version": "12.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.1"
  },
  "👨‍🔬": {
    "name": "man scientist",
    "slug": "man_scientist",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "👩‍🔬": {
    "name": "woman scientist",
    "slug": "woman_scientist",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🧑‍💻": {
    "name": "technologist",
    "slug": "technologist",
    "group": "People & Body",
    "emoji_version": "12.1",
    "unicode_version": "12.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.1"
  },
  "👨‍💻": {
    "name": "man technologist",
    "slug": "man_technologist",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "👩‍💻": {
    "name": "woman technologist",
    "slug": "woman_technologist",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🧑‍🎤": {
    "name": "singer",
    "slug": "singer",
    "group": "People & Body",
    "emoji_version": "12.1",
    "unicode_version": "12.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.1"
  },
  "👨‍🎤": {
    "name": "man singer",
    "slug": "man_singer",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "👩‍🎤": {
    "name": "woman singer",
    "slug": "woman_singer",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🧑‍🎨": {
    "name": "artist",
    "slug": "artist",
    "group": "People & Body",
    "emoji_version": "12.1",
    "unicode_version": "12.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.1"
  },
  "👨‍🎨": {
    "name": "man artist",
    "slug": "man_artist",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "👩‍🎨": {
    "name": "woman artist",
    "slug": "woman_artist",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🧑‍✈️": {
    "name": "pilot",
    "slug": "pilot",
    "group": "People & Body",
    "emoji_version": "12.1",
    "unicode_version": "12.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.1"
  },
  "👨‍✈️": {
    "name": "man pilot",
    "slug": "man_pilot",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "👩‍✈️": {
    "name": "woman pilot",
    "slug": "woman_pilot",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🧑‍🚀": {
    "name": "astronaut",
    "slug": "astronaut",
    "group": "People & Body",
    "emoji_version": "12.1",
    "unicode_version": "12.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.1"
  },
  "👨‍🚀": {
    "name": "man astronaut",
    "slug": "man_astronaut",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "👩‍🚀": {
    "name": "woman astronaut",
    "slug": "woman_astronaut",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🧑‍🚒": {
    "name": "firefighter",
    "slug": "firefighter",
    "group": "People & Body",
    "emoji_version": "12.1",
    "unicode_version": "12.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.1"
  },
  "👨‍🚒": {
    "name": "man firefighter",
    "slug": "man_firefighter",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "👩‍🚒": {
    "name": "woman firefighter",
    "slug": "woman_firefighter",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "👮": {
    "name": "police officer",
    "slug": "police_officer",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "👮‍♂️": {
    "name": "man police officer",
    "slug": "man_police_officer",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "👮‍♀️": {
    "name": "woman police officer",
    "slug": "woman_police_officer",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🕵️": {
    "name": "detective",
    "slug": "detective",
    "group": "People & Body",
    "emoji_version": "0.7",
    "unicode_version": "0.7",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "2.0"
  },
  "🕵️‍♂️": {
    "name": "man detective",
    "slug": "man_detective",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🕵️‍♀️": {
    "name": "woman detective",
    "slug": "woman_detective",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "💂": {
    "name": "guard",
    "slug": "guard",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "💂‍♂️": {
    "name": "man guard",
    "slug": "man_guard",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "💂‍♀️": {
    "name": "woman guard",
    "slug": "woman_guard",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🥷": {
    "name": "ninja",
    "slug": "ninja",
    "group": "People & Body",
    "emoji_version": "13.0",
    "unicode_version": "13.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "13.0"
  },
  "👷": {
    "name": "construction worker",
    "slug": "construction_worker",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "👷‍♂️": {
    "name": "man construction worker",
    "slug": "man_construction_worker",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "👷‍♀️": {
    "name": "woman construction worker",
    "slug": "woman_construction_worker",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🫅": {
    "name": "person with crown",
    "slug": "person_with_crown",
    "group": "People & Body",
    "emoji_version": "14.0",
    "unicode_version": "14.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "14.0"
  },
  "🤴": {
    "name": "prince",
    "slug": "prince",
    "group": "People & Body",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "3.0"
  },
  "👸": {
    "name": "princess",
    "slug": "princess",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "👳": {
    "name": "person wearing turban",
    "slug": "person_wearing_turban",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "👳‍♂️": {
    "name": "man wearing turban",
    "slug": "man_wearing_turban",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "👳‍♀️": {
    "name": "woman wearing turban",
    "slug": "woman_wearing_turban",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "👲": {
    "name": "person with skullcap",
    "slug": "person_with_skullcap",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🧕": {
    "name": "woman with headscarf",
    "slug": "woman_with_headscarf",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "5.0"
  },
  "🤵": {
    "name": "person in tuxedo",
    "slug": "person_in_tuxedo",
    "group": "People & Body",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "3.0"
  },
  "🤵‍♂️": {
    "name": "man in tuxedo",
    "slug": "man_in_tuxedo",
    "group": "People & Body",
    "emoji_version": "13.0",
    "unicode_version": "13.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "13.0"
  },
  "🤵‍♀️": {
    "name": "woman in tuxedo",
    "slug": "woman_in_tuxedo",
    "group": "People & Body",
    "emoji_version": "13.0",
    "unicode_version": "13.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "13.0"
  },
  "👰": {
    "name": "person with veil",
    "slug": "person_with_veil",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "👰‍♂️": {
    "name": "man with veil",
    "slug": "man_with_veil",
    "group": "People & Body",
    "emoji_version": "13.0",
    "unicode_version": "13.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "13.0"
  },
  "👰‍♀️": {
    "name": "woman with veil",
    "slug": "woman_with_veil",
    "group": "People & Body",
    "emoji_version": "13.0",
    "unicode_version": "13.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "13.0"
  },
  "🤰": {
    "name": "pregnant woman",
    "slug": "pregnant_woman",
    "group": "People & Body",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "3.0"
  },
  "🫃": {
    "name": "pregnant man",
    "slug": "pregnant_man",
    "group": "People & Body",
    "emoji_version": "14.0",
    "unicode_version": "14.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "14.0"
  },
  "🫄": {
    "name": "pregnant person",
    "slug": "pregnant_person",
    "group": "People & Body",
    "emoji_version": "14.0",
    "unicode_version": "14.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "14.0"
  },
  "🤱": {
    "name": "breast-feeding",
    "slug": "breast_feeding",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "5.0"
  },
  "👩‍🍼": {
    "name": "woman feeding baby",
    "slug": "woman_feeding_baby",
    "group": "People & Body",
    "emoji_version": "13.0",
    "unicode_version": "13.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "13.0"
  },
  "👨‍🍼": {
    "name": "man feeding baby",
    "slug": "man_feeding_baby",
    "group": "People & Body",
    "emoji_version": "13.0",
    "unicode_version": "13.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "13.0"
  },
  "🧑‍🍼": {
    "name": "person feeding baby",
    "slug": "person_feeding_baby",
    "group": "People & Body",
    "emoji_version": "13.0",
    "unicode_version": "13.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "13.0"
  },
  "👼": {
    "name": "baby angel",
    "slug": "baby_angel",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🎅": {
    "name": "Santa Claus",
    "slug": "santa_claus",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🤶": {
    "name": "Mrs. Claus",
    "slug": "mrs_claus",
    "group": "People & Body",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "3.0"
  },
  "🧑‍🎄": {
    "name": "mx claus",
    "slug": "mx_claus",
    "group": "People & Body",
    "emoji_version": "13.0",
    "unicode_version": "13.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "13.0"
  },
  "🦸": {
    "name": "superhero",
    "slug": "superhero",
    "group": "People & Body",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "11.0"
  },
  "🦸‍♂️": {
    "name": "man superhero",
    "slug": "man_superhero",
    "group": "People & Body",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "11.0"
  },
  "🦸‍♀️": {
    "name": "woman superhero",
    "slug": "woman_superhero",
    "group": "People & Body",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "11.0"
  },
  "🦹": {
    "name": "supervillain",
    "slug": "supervillain",
    "group": "People & Body",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "11.0"
  },
  "🦹‍♂️": {
    "name": "man supervillain",
    "slug": "man_supervillain",
    "group": "People & Body",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "11.0"
  },
  "🦹‍♀️": {
    "name": "woman supervillain",
    "slug": "woman_supervillain",
    "group": "People & Body",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "11.0"
  },
  "🧙": {
    "name": "mage",
    "slug": "mage",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "5.0"
  },
  "🧙‍♂️": {
    "name": "man mage",
    "slug": "man_mage",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "5.0"
  },
  "🧙‍♀️": {
    "name": "woman mage",
    "slug": "woman_mage",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "5.0"
  },
  "🧚": {
    "name": "fairy",
    "slug": "fairy",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "5.0"
  },
  "🧚‍♂️": {
    "name": "man fairy",
    "slug": "man_fairy",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "5.0"
  },
  "🧚‍♀️": {
    "name": "woman fairy",
    "slug": "woman_fairy",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "5.0"
  },
  "🧛": {
    "name": "vampire",
    "slug": "vampire",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "5.0"
  },
  "🧛‍♂️": {
    "name": "man vampire",
    "slug": "man_vampire",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "5.0"
  },
  "🧛‍♀️": {
    "name": "woman vampire",
    "slug": "woman_vampire",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "5.0"
  },
  "🧜": {
    "name": "merperson",
    "slug": "merperson",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "5.0"
  },
  "🧜‍♂️": {
    "name": "merman",
    "slug": "merman",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "5.0"
  },
  "🧜‍♀️": {
    "name": "mermaid",
    "slug": "mermaid",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "5.0"
  },
  "🧝": {
    "name": "elf",
    "slug": "elf",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "5.0"
  },
  "🧝‍♂️": {
    "name": "man elf",
    "slug": "man_elf",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "5.0"
  },
  "🧝‍♀️": {
    "name": "woman elf",
    "slug": "woman_elf",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "5.0"
  },
  "🧞": {
    "name": "genie",
    "slug": "genie",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": false
  },
  "🧞‍♂️": {
    "name": "man genie",
    "slug": "man_genie",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": false
  },
  "🧞‍♀️": {
    "name": "woman genie",
    "slug": "woman_genie",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": false
  },
  "🧟": {
    "name": "zombie",
    "slug": "zombie",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": false
  },
  "🧟‍♂️": {
    "name": "man zombie",
    "slug": "man_zombie",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": false
  },
  "🧟‍♀️": {
    "name": "woman zombie",
    "slug": "woman_zombie",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": false
  },
  "🧌": {
    "name": "troll",
    "slug": "troll",
    "group": "People & Body",
    "emoji_version": "14.0",
    "unicode_version": "14.0",
    "skin_tone_support": false
  },
  "💆": {
    "name": "person getting massage",
    "slug": "person_getting_massage",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "💆‍♂️": {
    "name": "man getting massage",
    "slug": "man_getting_massage",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "💆‍♀️": {
    "name": "woman getting massage",
    "slug": "woman_getting_massage",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "💇": {
    "name": "person getting haircut",
    "slug": "person_getting_haircut",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "💇‍♂️": {
    "name": "man getting haircut",
    "slug": "man_getting_haircut",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "💇‍♀️": {
    "name": "woman getting haircut",
    "slug": "woman_getting_haircut",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🚶": {
    "name": "person walking",
    "slug": "person_walking",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🚶‍♂️": {
    "name": "man walking",
    "slug": "man_walking",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🚶‍♀️": {
    "name": "woman walking",
    "slug": "woman_walking",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🚶‍➡️": {
    "name": "person walking facing right",
    "slug": "person_walking_facing_right",
    "group": "People & Body",
    "emoji_version": "15.1",
    "unicode_version": "15.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "15.1"
  },
  "🚶‍♀️‍➡️": {
    "name": "woman walking facing right",
    "slug": "woman_walking_facing_right",
    "group": "People & Body",
    "emoji_version": "15.1",
    "unicode_version": "15.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "15.1"
  },
  "🚶‍♂️‍➡️": {
    "name": "man walking facing right",
    "slug": "man_walking_facing_right",
    "group": "People & Body",
    "emoji_version": "15.1",
    "unicode_version": "15.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "15.1"
  },
  "🧍": {
    "name": "person standing",
    "slug": "person_standing",
    "group": "People & Body",
    "emoji_version": "12.0",
    "unicode_version": "12.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.0"
  },
  "🧍‍♂️": {
    "name": "man standing",
    "slug": "man_standing",
    "group": "People & Body",
    "emoji_version": "12.0",
    "unicode_version": "12.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.0"
  },
  "🧍‍♀️": {
    "name": "woman standing",
    "slug": "woman_standing",
    "group": "People & Body",
    "emoji_version": "12.0",
    "unicode_version": "12.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.0"
  },
  "🧎": {
    "name": "person kneeling",
    "slug": "person_kneeling",
    "group": "People & Body",
    "emoji_version": "12.0",
    "unicode_version": "12.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.0"
  },
  "🧎‍♂️": {
    "name": "man kneeling",
    "slug": "man_kneeling",
    "group": "People & Body",
    "emoji_version": "12.0",
    "unicode_version": "12.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.0"
  },
  "🧎‍♀️": {
    "name": "woman kneeling",
    "slug": "woman_kneeling",
    "group": "People & Body",
    "emoji_version": "12.0",
    "unicode_version": "12.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.0"
  },
  "🧎‍➡️": {
    "name": "person kneeling facing right",
    "slug": "person_kneeling_facing_right",
    "group": "People & Body",
    "emoji_version": "15.1",
    "unicode_version": "15.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "15.1"
  },
  "🧎‍♀️‍➡️": {
    "name": "woman kneeling facing right",
    "slug": "woman_kneeling_facing_right",
    "group": "People & Body",
    "emoji_version": "15.1",
    "unicode_version": "15.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "15.1"
  },
  "🧎‍♂️‍➡️": {
    "name": "man kneeling facing right",
    "slug": "man_kneeling_facing_right",
    "group": "People & Body",
    "emoji_version": "15.1",
    "unicode_version": "15.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "15.1"
  },
  "🧑‍🦯": {
    "name": "person with white cane",
    "slug": "person_with_white_cane",
    "group": "People & Body",
    "emoji_version": "12.1",
    "unicode_version": "12.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.1"
  },
  "🧑‍🦯‍➡️": {
    "name": "person with white cane facing right",
    "slug": "person_with_white_cane_facing_right",
    "group": "People & Body",
    "emoji_version": "15.1",
    "unicode_version": "15.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "15.1"
  },
  "👨‍🦯": {
    "name": "man with white cane",
    "slug": "man_with_white_cane",
    "group": "People & Body",
    "emoji_version": "12.0",
    "unicode_version": "12.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.0"
  },
  "👨‍🦯‍➡️": {
    "name": "man with white cane facing right",
    "slug": "man_with_white_cane_facing_right",
    "group": "People & Body",
    "emoji_version": "15.1",
    "unicode_version": "15.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "15.1"
  },
  "👩‍🦯": {
    "name": "woman with white cane",
    "slug": "woman_with_white_cane",
    "group": "People & Body",
    "emoji_version": "12.0",
    "unicode_version": "12.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.0"
  },
  "👩‍🦯‍➡️": {
    "name": "woman with white cane facing right",
    "slug": "woman_with_white_cane_facing_right",
    "group": "People & Body",
    "emoji_version": "15.1",
    "unicode_version": "15.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "15.1"
  },
  "🧑‍🦼": {
    "name": "person in motorized wheelchair",
    "slug": "person_in_motorized_wheelchair",
    "group": "People & Body",
    "emoji_version": "12.1",
    "unicode_version": "12.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.1"
  },
  "🧑‍🦼‍➡️": {
    "name": "person in motorized wheelchair facing right",
    "slug": "person_in_motorized_wheelchair_facing_right",
    "group": "People & Body",
    "emoji_version": "15.1",
    "unicode_version": "15.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "15.1"
  },
  "👨‍🦼": {
    "name": "man in motorized wheelchair",
    "slug": "man_in_motorized_wheelchair",
    "group": "People & Body",
    "emoji_version": "12.0",
    "unicode_version": "12.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.0"
  },
  "👨‍🦼‍➡️": {
    "name": "man in motorized wheelchair facing right",
    "slug": "man_in_motorized_wheelchair_facing_right",
    "group": "People & Body",
    "emoji_version": "15.1",
    "unicode_version": "15.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "15.1"
  },
  "👩‍🦼": {
    "name": "woman in motorized wheelchair",
    "slug": "woman_in_motorized_wheelchair",
    "group": "People & Body",
    "emoji_version": "12.0",
    "unicode_version": "12.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.0"
  },
  "👩‍🦼‍➡️": {
    "name": "woman in motorized wheelchair facing right",
    "slug": "woman_in_motorized_wheelchair_facing_right",
    "group": "People & Body",
    "emoji_version": "15.1",
    "unicode_version": "15.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "15.1"
  },
  "🧑‍🦽": {
    "name": "person in manual wheelchair",
    "slug": "person_in_manual_wheelchair",
    "group": "People & Body",
    "emoji_version": "12.1",
    "unicode_version": "12.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.1"
  },
  "🧑‍🦽‍➡️": {
    "name": "person in manual wheelchair facing right",
    "slug": "person_in_manual_wheelchair_facing_right",
    "group": "People & Body",
    "emoji_version": "15.1",
    "unicode_version": "15.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "15.1"
  },
  "👨‍🦽": {
    "name": "man in manual wheelchair",
    "slug": "man_in_manual_wheelchair",
    "group": "People & Body",
    "emoji_version": "12.0",
    "unicode_version": "12.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.0"
  },
  "👨‍🦽‍➡️": {
    "name": "man in manual wheelchair facing right",
    "slug": "man_in_manual_wheelchair_facing_right",
    "group": "People & Body",
    "emoji_version": "15.1",
    "unicode_version": "15.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "15.1"
  },
  "👩‍🦽": {
    "name": "woman in manual wheelchair",
    "slug": "woman_in_manual_wheelchair",
    "group": "People & Body",
    "emoji_version": "12.0",
    "unicode_version": "12.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.0"
  },
  "👩‍🦽‍➡️": {
    "name": "woman in manual wheelchair facing right",
    "slug": "woman_in_manual_wheelchair_facing_right",
    "group": "People & Body",
    "emoji_version": "15.1",
    "unicode_version": "15.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "15.1"
  },
  "🏃": {
    "name": "person running",
    "slug": "person_running",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🏃‍♂️": {
    "name": "man running",
    "slug": "man_running",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🏃‍♀️": {
    "name": "woman running",
    "slug": "woman_running",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🏃‍➡️": {
    "name": "person running facing right",
    "slug": "person_running_facing_right",
    "group": "People & Body",
    "emoji_version": "15.1",
    "unicode_version": "15.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "15.1"
  },
  "🏃‍♀️‍➡️": {
    "name": "woman running facing right",
    "slug": "woman_running_facing_right",
    "group": "People & Body",
    "emoji_version": "15.1",
    "unicode_version": "15.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "15.1"
  },
  "🏃‍♂️‍➡️": {
    "name": "man running facing right",
    "slug": "man_running_facing_right",
    "group": "People & Body",
    "emoji_version": "15.1",
    "unicode_version": "15.1",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "15.1"
  },
  "💃": {
    "name": "woman dancing",
    "slug": "woman_dancing",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🕺": {
    "name": "man dancing",
    "slug": "man_dancing",
    "group": "People & Body",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "3.0"
  },
  "🕴️": {
    "name": "person in suit levitating",
    "slug": "person_in_suit_levitating",
    "group": "People & Body",
    "emoji_version": "0.7",
    "unicode_version": "0.7",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "👯": {
    "name": "people with bunny ears",
    "slug": "people_with_bunny_ears",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "👯‍♂️": {
    "name": "men with bunny ears",
    "slug": "men_with_bunny_ears",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": false
  },
  "👯‍♀️": {
    "name": "women with bunny ears",
    "slug": "women_with_bunny_ears",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": false
  },
  "🧖": {
    "name": "person in steamy room",
    "slug": "person_in_steamy_room",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "5.0"
  },
  "🧖‍♂️": {
    "name": "man in steamy room",
    "slug": "man_in_steamy_room",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "5.0"
  },
  "🧖‍♀️": {
    "name": "woman in steamy room",
    "slug": "woman_in_steamy_room",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "5.0"
  },
  "🧗": {
    "name": "person climbing",
    "slug": "person_climbing",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "5.0"
  },
  "🧗‍♂️": {
    "name": "man climbing",
    "slug": "man_climbing",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "5.0"
  },
  "🧗‍♀️": {
    "name": "woman climbing",
    "slug": "woman_climbing",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "5.0"
  },
  "🤺": {
    "name": "person fencing",
    "slug": "person_fencing",
    "group": "People & Body",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": false
  },
  "🏇": {
    "name": "horse racing",
    "slug": "horse_racing",
    "group": "People & Body",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "⛷️": {
    "name": "skier",
    "slug": "skier",
    "group": "People & Body",
    "emoji_version": "0.7",
    "unicode_version": "0.7",
    "skin_tone_support": false
  },
  "🏂": {
    "name": "snowboarder",
    "slug": "snowboarder",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🏌️": {
    "name": "person golfing",
    "slug": "person_golfing",
    "group": "People & Body",
    "emoji_version": "0.7",
    "unicode_version": "0.7",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🏌️‍♂️": {
    "name": "man golfing",
    "slug": "man_golfing",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🏌️‍♀️": {
    "name": "woman golfing",
    "slug": "woman_golfing",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🏄": {
    "name": "person surfing",
    "slug": "person_surfing",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🏄‍♂️": {
    "name": "man surfing",
    "slug": "man_surfing",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🏄‍♀️": {
    "name": "woman surfing",
    "slug": "woman_surfing",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🚣": {
    "name": "person rowing boat",
    "slug": "person_rowing_boat",
    "group": "People & Body",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🚣‍♂️": {
    "name": "man rowing boat",
    "slug": "man_rowing_boat",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🚣‍♀️": {
    "name": "woman rowing boat",
    "slug": "woman_rowing_boat",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🏊": {
    "name": "person swimming",
    "slug": "person_swimming",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🏊‍♂️": {
    "name": "man swimming",
    "slug": "man_swimming",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🏊‍♀️": {
    "name": "woman swimming",
    "slug": "woman_swimming",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "⛹️": {
    "name": "person bouncing ball",
    "slug": "person_bouncing_ball",
    "group": "People & Body",
    "emoji_version": "0.7",
    "unicode_version": "0.7",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "2.0"
  },
  "⛹️‍♂️": {
    "name": "man bouncing ball",
    "slug": "man_bouncing_ball",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "⛹️‍♀️": {
    "name": "woman bouncing ball",
    "slug": "woman_bouncing_ball",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🏋️": {
    "name": "person lifting weights",
    "slug": "person_lifting_weights",
    "group": "People & Body",
    "emoji_version": "0.7",
    "unicode_version": "0.7",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "2.0"
  },
  "🏋️‍♂️": {
    "name": "man lifting weights",
    "slug": "man_lifting_weights",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🏋️‍♀️": {
    "name": "woman lifting weights",
    "slug": "woman_lifting_weights",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🚴": {
    "name": "person biking",
    "slug": "person_biking",
    "group": "People & Body",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🚴‍♂️": {
    "name": "man biking",
    "slug": "man_biking",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🚴‍♀️": {
    "name": "woman biking",
    "slug": "woman_biking",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🚵": {
    "name": "person mountain biking",
    "slug": "person_mountain_biking",
    "group": "People & Body",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🚵‍♂️": {
    "name": "man mountain biking",
    "slug": "man_mountain_biking",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🚵‍♀️": {
    "name": "woman mountain biking",
    "slug": "woman_mountain_biking",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🤸": {
    "name": "person cartwheeling",
    "slug": "person_cartwheeling",
    "group": "People & Body",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "3.0"
  },
  "🤸‍♂️": {
    "name": "man cartwheeling",
    "slug": "man_cartwheeling",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🤸‍♀️": {
    "name": "woman cartwheeling",
    "slug": "woman_cartwheeling",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🤼": {
    "name": "people wrestling",
    "slug": "people_wrestling",
    "group": "People & Body",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": false
  },
  "🤼‍♂️": {
    "name": "men wrestling",
    "slug": "men_wrestling",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": false
  },
  "🤼‍♀️": {
    "name": "women wrestling",
    "slug": "women_wrestling",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": false
  },
  "🤽": {
    "name": "person playing water polo",
    "slug": "person_playing_water_polo",
    "group": "People & Body",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "3.0"
  },
  "🤽‍♂️": {
    "name": "man playing water polo",
    "slug": "man_playing_water_polo",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🤽‍♀️": {
    "name": "woman playing water polo",
    "slug": "woman_playing_water_polo",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🤾": {
    "name": "person playing handball",
    "slug": "person_playing_handball",
    "group": "People & Body",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "3.0"
  },
  "🤾‍♂️": {
    "name": "man playing handball",
    "slug": "man_playing_handball",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🤾‍♀️": {
    "name": "woman playing handball",
    "slug": "woman_playing_handball",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🤹": {
    "name": "person juggling",
    "slug": "person_juggling",
    "group": "People & Body",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "3.0"
  },
  "🤹‍♂️": {
    "name": "man juggling",
    "slug": "man_juggling",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🤹‍♀️": {
    "name": "woman juggling",
    "slug": "woman_juggling",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🧘": {
    "name": "person in lotus position",
    "slug": "person_in_lotus_position",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "5.0"
  },
  "🧘‍♂️": {
    "name": "man in lotus position",
    "slug": "man_in_lotus_position",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "5.0"
  },
  "🧘‍♀️": {
    "name": "woman in lotus position",
    "slug": "woman_in_lotus_position",
    "group": "People & Body",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "5.0"
  },
  "🛀": {
    "name": "person taking bath",
    "slug": "person_taking_bath",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "1.0"
  },
  "🛌": {
    "name": "person in bed",
    "slug": "person_in_bed",
    "group": "People & Body",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "4.0"
  },
  "🧑‍🤝‍🧑": {
    "name": "people holding hands",
    "slug": "people_holding_hands",
    "group": "People & Body",
    "emoji_version": "12.0",
    "unicode_version": "12.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.0"
  },
  "👭": {
    "name": "women holding hands",
    "slug": "women_holding_hands",
    "group": "People & Body",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.0"
  },
  "👫": {
    "name": "woman and man holding hands",
    "slug": "woman_and_man_holding_hands",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.0"
  },
  "👬": {
    "name": "men holding hands",
    "slug": "men_holding_hands",
    "group": "People & Body",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "12.0"
  },
  "💏": {
    "name": "kiss",
    "slug": "kiss",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "13.1"
  },
  "👩‍❤️‍💋‍👨": {
    "name": "kiss woman, man",
    "slug": "kiss_woman_man",
    "group": "People & Body",
    "emoji_version": "2.0",
    "unicode_version": "2.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "13.1"
  },
  "👨‍❤️‍💋‍👨": {
    "name": "kiss man, man",
    "slug": "kiss_man_man",
    "group": "People & Body",
    "emoji_version": "2.0",
    "unicode_version": "2.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "13.1"
  },
  "👩‍❤️‍💋‍👩": {
    "name": "kiss woman, woman",
    "slug": "kiss_woman_woman",
    "group": "People & Body",
    "emoji_version": "2.0",
    "unicode_version": "2.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "13.1"
  },
  "💑": {
    "name": "couple with heart",
    "slug": "couple_with_heart",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "13.1"
  },
  "👩‍❤️‍👨": {
    "name": "couple with heart woman, man",
    "slug": "couple_with_heart_woman_man",
    "group": "People & Body",
    "emoji_version": "2.0",
    "unicode_version": "2.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "13.1"
  },
  "👨‍❤️‍👨": {
    "name": "couple with heart man, man",
    "slug": "couple_with_heart_man_man",
    "group": "People & Body",
    "emoji_version": "2.0",
    "unicode_version": "2.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "13.1"
  },
  "👩‍❤️‍👩": {
    "name": "couple with heart woman, woman",
    "slug": "couple_with_heart_woman_woman",
    "group": "People & Body",
    "emoji_version": "2.0",
    "unicode_version": "2.0",
    "skin_tone_support": true,
    "skin_tone_support_unicode_version": "13.1"
  },
  "👨‍👩‍👦": {
    "name": "family man, woman, boy",
    "slug": "family_man_woman_boy",
    "group": "People & Body",
    "emoji_version": "2.0",
    "unicode_version": "2.0",
    "skin_tone_support": false
  },
  "👨‍👩‍👧": {
    "name": "family man, woman, girl",
    "slug": "family_man_woman_girl",
    "group": "People & Body",
    "emoji_version": "2.0",
    "unicode_version": "2.0",
    "skin_tone_support": false
  },
  "👨‍👩‍👧‍👦": {
    "name": "family man, woman, girl, boy",
    "slug": "family_man_woman_girl_boy",
    "group": "People & Body",
    "emoji_version": "2.0",
    "unicode_version": "2.0",
    "skin_tone_support": false
  },
  "👨‍👩‍👦‍👦": {
    "name": "family man, woman, boy, boy",
    "slug": "family_man_woman_boy_boy",
    "group": "People & Body",
    "emoji_version": "2.0",
    "unicode_version": "2.0",
    "skin_tone_support": false
  },
  "👨‍👩‍👧‍👧": {
    "name": "family man, woman, girl, girl",
    "slug": "family_man_woman_girl_girl",
    "group": "People & Body",
    "emoji_version": "2.0",
    "unicode_version": "2.0",
    "skin_tone_support": false
  },
  "👨‍👨‍👦": {
    "name": "family man, man, boy",
    "slug": "family_man_man_boy",
    "group": "People & Body",
    "emoji_version": "2.0",
    "unicode_version": "2.0",
    "skin_tone_support": false
  },
  "👨‍👨‍👧": {
    "name": "family man, man, girl",
    "slug": "family_man_man_girl",
    "group": "People & Body",
    "emoji_version": "2.0",
    "unicode_version": "2.0",
    "skin_tone_support": false
  },
  "👨‍👨‍👧‍👦": {
    "name": "family man, man, girl, boy",
    "slug": "family_man_man_girl_boy",
    "group": "People & Body",
    "emoji_version": "2.0",
    "unicode_version": "2.0",
    "skin_tone_support": false
  },
  "👨‍👨‍👦‍👦": {
    "name": "family man, man, boy, boy",
    "slug": "family_man_man_boy_boy",
    "group": "People & Body",
    "emoji_version": "2.0",
    "unicode_version": "2.0",
    "skin_tone_support": false
  },
  "👨‍👨‍👧‍👧": {
    "name": "family man, man, girl, girl",
    "slug": "family_man_man_girl_girl",
    "group": "People & Body",
    "emoji_version": "2.0",
    "unicode_version": "2.0",
    "skin_tone_support": false
  },
  "👩‍👩‍👦": {
    "name": "family woman, woman, boy",
    "slug": "family_woman_woman_boy",
    "group": "People & Body",
    "emoji_version": "2.0",
    "unicode_version": "2.0",
    "skin_tone_support": false
  },
  "👩‍👩‍👧": {
    "name": "family woman, woman, girl",
    "slug": "family_woman_woman_girl",
    "group": "People & Body",
    "emoji_version": "2.0",
    "unicode_version": "2.0",
    "skin_tone_support": false
  },
  "👩‍👩‍👧‍👦": {
    "name": "family woman, woman, girl, boy",
    "slug": "family_woman_woman_girl_boy",
    "group": "People & Body",
    "emoji_version": "2.0",
    "unicode_version": "2.0",
    "skin_tone_support": false
  },
  "👩‍👩‍👦‍👦": {
    "name": "family woman, woman, boy, boy",
    "slug": "family_woman_woman_boy_boy",
    "group": "People & Body",
    "emoji_version": "2.0",
    "unicode_version": "2.0",
    "skin_tone_support": false
  },
  "👩‍👩‍👧‍👧": {
    "name": "family woman, woman, girl, girl",
    "slug": "family_woman_woman_girl_girl",
    "group": "People & Body",
    "emoji_version": "2.0",
    "unicode_version": "2.0",
    "skin_tone_support": false
  },
  "👨‍👦": {
    "name": "family man, boy",
    "slug": "family_man_boy",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": false
  },
  "👨‍👦‍👦": {
    "name": "family man, boy, boy",
    "slug": "family_man_boy_boy",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": false
  },
  "👨‍👧": {
    "name": "family man, girl",
    "slug": "family_man_girl",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": false
  },
  "👨‍👧‍👦": {
    "name": "family man, girl, boy",
    "slug": "family_man_girl_boy",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": false
  },
  "👨‍👧‍👧": {
    "name": "family man, girl, girl",
    "slug": "family_man_girl_girl",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": false
  },
  "👩‍👦": {
    "name": "family woman, boy",
    "slug": "family_woman_boy",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": false
  },
  "👩‍👦‍👦": {
    "name": "family woman, boy, boy",
    "slug": "family_woman_boy_boy",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": false
  },
  "👩‍👧": {
    "name": "family woman, girl",
    "slug": "family_woman_girl",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": false
  },
  "👩‍👧‍👦": {
    "name": "family woman, girl, boy",
    "slug": "family_woman_girl_boy",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": false
  },
  "👩‍👧‍👧": {
    "name": "family woman, girl, girl",
    "slug": "family_woman_girl_girl",
    "group": "People & Body",
    "emoji_version": "4.0",
    "unicode_version": "4.0",
    "skin_tone_support": false
  },
  "🗣️": {
    "name": "speaking head",
    "slug": "speaking_head",
    "group": "People & Body",
    "emoji_version": "0.7",
    "unicode_version": "0.7",
    "skin_tone_support": false
  },
  "👤": {
    "name": "bust in silhouette",
    "slug": "bust_in_silhouette",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "👥": {
    "name": "busts in silhouette",
    "slug": "busts_in_silhouette",
    "group": "People & Body",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🫂": {
    "name": "people hugging",
    "slug": "people_hugging",
    "group": "People & Body",
    "emoji_version": "13.0",
    "unicode_version": "13.0",
    "skin_tone_support": false
  },
  "👪": {
    "name": "family",
    "slug": "family",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🧑‍🧑‍🧒": {
    "name": "family adult, adult, child",
    "slug": "family_adult_adult_child",
    "group": "People & Body",
    "emoji_version": "15.1",
    "unicode_version": "15.1",
    "skin_tone_support": false
  },
  "🧑‍🧑‍🧒‍🧒": {
    "name": "family adult, adult, child, child",
    "slug": "family_adult_adult_child_child",
    "group": "People & Body",
    "emoji_version": "15.1",
    "unicode_version": "15.1",
    "skin_tone_support": false
  },
  "🧑‍🧒": {
    "name": "family adult, child",
    "slug": "family_adult_child",
    "group": "People & Body",
    "emoji_version": "15.1",
    "unicode_version": "15.1",
    "skin_tone_support": false
  },
  "🧑‍🧒‍🧒": {
    "name": "family adult, child, child",
    "slug": "family_adult_child_child",
    "group": "People & Body",
    "emoji_version": "15.1",
    "unicode_version": "15.1",
    "skin_tone_support": false
  },
  "👣": {
    "name": "footprints",
    "slug": "footprints",
    "group": "People & Body",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🐵": {
    "name": "monkey face",
    "slug": "monkey_face",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🐒": {
    "name": "monkey",
    "slug": "monkey",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🦍": {
    "name": "gorilla",
    "slug": "gorilla",
    "group": "Animals & Nature",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": false
  },
  "🦧": {
    "name": "orangutan",
    "slug": "orangutan",
    "group": "Animals & Nature",
    "emoji_version": "12.0",
    "unicode_version": "12.0",
    "skin_tone_support": false
  },
  "🐶": {
    "name": "dog face",
    "slug": "dog_face",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🐕": {
    "name": "dog",
    "slug": "dog",
    "group": "Animals & Nature",
    "emoji_version": "0.7",
    "unicode_version": "0.7",
    "skin_tone_support": false
  },
  "🦮": {
    "name": "guide dog",
    "slug": "guide_dog",
    "group": "Animals & Nature",
    "emoji_version": "12.0",
    "unicode_version": "12.0",
    "skin_tone_support": false
  },
  "🐕‍🦺": {
    "name": "service dog",
    "slug": "service_dog",
    "group": "Animals & Nature",
    "emoji_version": "12.0",
    "unicode_version": "12.0",
    "skin_tone_support": false
  },
  "🐩": {
    "name": "poodle",
    "slug": "poodle",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🐺": {
    "name": "wolf",
    "slug": "wolf",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🦊": {
    "name": "fox",
    "slug": "fox",
    "group": "Animals & Nature",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": false
  },
  "🦝": {
    "name": "raccoon",
    "slug": "raccoon",
    "group": "Animals & Nature",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": false
  },
  "🐱": {
    "name": "cat face",
    "slug": "cat_face",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🐈": {
    "name": "cat",
    "slug": "cat",
    "group": "Animals & Nature",
    "emoji_version": "0.7",
    "unicode_version": "0.7",
    "skin_tone_support": false
  },
  "🐈‍⬛": {
    "name": "black cat",
    "slug": "black_cat",
    "group": "Animals & Nature",
    "emoji_version": "13.0",
    "unicode_version": "13.0",
    "skin_tone_support": false
  },
  "🦁": {
    "name": "lion",
    "slug": "lion",
    "group": "Animals & Nature",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🐯": {
    "name": "tiger face",
    "slug": "tiger_face",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🐅": {
    "name": "tiger",
    "slug": "tiger",
    "group": "Animals & Nature",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🐆": {
    "name": "leopard",
    "slug": "leopard",
    "group": "Animals & Nature",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🐴": {
    "name": "horse face",
    "slug": "horse_face",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🫎": {
    "name": "moose",
    "slug": "moose",
    "group": "Animals & Nature",
    "emoji_version": "15.0",
    "unicode_version": "15.0",
    "skin_tone_support": false
  },
  "🫏": {
    "name": "donkey",
    "slug": "donkey",
    "group": "Animals & Nature",
    "emoji_version": "15.0",
    "unicode_version": "15.0",
    "skin_tone_support": false
  },
  "🐎": {
    "name": "horse",
    "slug": "horse",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🦄": {
    "name": "unicorn",
    "slug": "unicorn",
    "group": "Animals & Nature",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🦓": {
    "name": "zebra",
    "slug": "zebra",
    "group": "Animals & Nature",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": false
  },
  "🦌": {
    "name": "deer",
    "slug": "deer",
    "group": "Animals & Nature",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": false
  },
  "🦬": {
    "name": "bison",
    "slug": "bison",
    "group": "Animals & Nature",
    "emoji_version": "13.0",
    "unicode_version": "13.0",
    "skin_tone_support": false
  },
  "🐮": {
    "name": "cow face",
    "slug": "cow_face",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🐂": {
    "name": "ox",
    "slug": "ox",
    "group": "Animals & Nature",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🐃": {
    "name": "water buffalo",
    "slug": "water_buffalo",
    "group": "Animals & Nature",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🐄": {
    "name": "cow",
    "slug": "cow",
    "group": "Animals & Nature",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🐷": {
    "name": "pig face",
    "slug": "pig_face",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🐖": {
    "name": "pig",
    "slug": "pig",
    "group": "Animals & Nature",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🐗": {
    "name": "boar",
    "slug": "boar",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🐽": {
    "name": "pig nose",
    "slug": "pig_nose",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🐏": {
    "name": "ram",
    "slug": "ram",
    "group": "Animals & Nature",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🐑": {
    "name": "ewe",
    "slug": "ewe",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🐐": {
    "name": "goat",
    "slug": "goat",
    "group": "Animals & Nature",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🐪": {
    "name": "camel",
    "slug": "camel",
    "group": "Animals & Nature",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🐫": {
    "name": "two-hump camel",
    "slug": "two_hump_camel",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🦙": {
    "name": "llama",
    "slug": "llama",
    "group": "Animals & Nature",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": false
  },
  "🦒": {
    "name": "giraffe",
    "slug": "giraffe",
    "group": "Animals & Nature",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": false
  },
  "🐘": {
    "name": "elephant",
    "slug": "elephant",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🦣": {
    "name": "mammoth",
    "slug": "mammoth",
    "group": "Animals & Nature",
    "emoji_version": "13.0",
    "unicode_version": "13.0",
    "skin_tone_support": false
  },
  "🦏": {
    "name": "rhinoceros",
    "slug": "rhinoceros",
    "group": "Animals & Nature",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": false
  },
  "🦛": {
    "name": "hippopotamus",
    "slug": "hippopotamus",
    "group": "Animals & Nature",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": false
  },
  "🐭": {
    "name": "mouse face",
    "slug": "mouse_face",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🐁": {
    "name": "mouse",
    "slug": "mouse",
    "group": "Animals & Nature",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🐀": {
    "name": "rat",
    "slug": "rat",
    "group": "Animals & Nature",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🐹": {
    "name": "hamster",
    "slug": "hamster",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🐰": {
    "name": "rabbit face",
    "slug": "rabbit_face",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🐇": {
    "name": "rabbit",
    "slug": "rabbit",
    "group": "Animals & Nature",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🐿️": {
    "name": "chipmunk",
    "slug": "chipmunk",
    "group": "Animals & Nature",
    "emoji_version": "0.7",
    "unicode_version": "0.7",
    "skin_tone_support": false
  },
  "🦫": {
    "name": "beaver",
    "slug": "beaver",
    "group": "Animals & Nature",
    "emoji_version": "13.0",
    "unicode_version": "13.0",
    "skin_tone_support": false
  },
  "🦔": {
    "name": "hedgehog",
    "slug": "hedgehog",
    "group": "Animals & Nature",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": false
  },
  "🦇": {
    "name": "bat",
    "slug": "bat",
    "group": "Animals & Nature",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": false
  },
  "🐻": {
    "name": "bear",
    "slug": "bear",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🐻‍❄️": {
    "name": "polar bear",
    "slug": "polar_bear",
    "group": "Animals & Nature",
    "emoji_version": "13.0",
    "unicode_version": "13.0",
    "skin_tone_support": false
  },
  "🐨": {
    "name": "koala",
    "slug": "koala",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🐼": {
    "name": "panda",
    "slug": "panda",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🦥": {
    "name": "sloth",
    "slug": "sloth",
    "group": "Animals & Nature",
    "emoji_version": "12.0",
    "unicode_version": "12.0",
    "skin_tone_support": false
  },
  "🦦": {
    "name": "otter",
    "slug": "otter",
    "group": "Animals & Nature",
    "emoji_version": "12.0",
    "unicode_version": "12.0",
    "skin_tone_support": false
  },
  "🦨": {
    "name": "skunk",
    "slug": "skunk",
    "group": "Animals & Nature",
    "emoji_version": "12.0",
    "unicode_version": "12.0",
    "skin_tone_support": false
  },
  "🦘": {
    "name": "kangaroo",
    "slug": "kangaroo",
    "group": "Animals & Nature",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": false
  },
  "🦡": {
    "name": "badger",
    "slug": "badger",
    "group": "Animals & Nature",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": false
  },
  "🐾": {
    "name": "paw prints",
    "slug": "paw_prints",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🦃": {
    "name": "turkey",
    "slug": "turkey",
    "group": "Animals & Nature",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🐔": {
    "name": "chicken",
    "slug": "chicken",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🐓": {
    "name": "rooster",
    "slug": "rooster",
    "group": "Animals & Nature",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🐣": {
    "name": "hatching chick",
    "slug": "hatching_chick",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🐤": {
    "name": "baby chick",
    "slug": "baby_chick",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🐥": {
    "name": "front-facing baby chick",
    "slug": "front_facing_baby_chick",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🐦": {
    "name": "bird",
    "slug": "bird",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🐧": {
    "name": "penguin",
    "slug": "penguin",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🕊️": {
    "name": "dove",
    "slug": "dove",
    "group": "Animals & Nature",
    "emoji_version": "0.7",
    "unicode_version": "0.7",
    "skin_tone_support": false
  },
  "🦅": {
    "name": "eagle",
    "slug": "eagle",
    "group": "Animals & Nature",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": false
  },
  "🦆": {
    "name": "duck",
    "slug": "duck",
    "group": "Animals & Nature",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": false
  },
  "🦢": {
    "name": "swan",
    "slug": "swan",
    "group": "Animals & Nature",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": false
  },
  "🦉": {
    "name": "owl",
    "slug": "owl",
    "group": "Animals & Nature",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": false
  },
  "🦤": {
    "name": "dodo",
    "slug": "dodo",
    "group": "Animals & Nature",
    "emoji_version": "13.0",
    "unicode_version": "13.0",
    "skin_tone_support": false
  },
  "🪶": {
    "name": "feather",
    "slug": "feather",
    "group": "Animals & Nature",
    "emoji_version": "13.0",
    "unicode_version": "13.0",
    "skin_tone_support": false
  },
  "🦩": {
    "name": "flamingo",
    "slug": "flamingo",
    "group": "Animals & Nature",
    "emoji_version": "12.0",
    "unicode_version": "12.0",
    "skin_tone_support": false
  },
  "🦚": {
    "name": "peacock",
    "slug": "peacock",
    "group": "Animals & Nature",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": false
  },
  "🦜": {
    "name": "parrot",
    "slug": "parrot",
    "group": "Animals & Nature",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": false
  },
  "🪽": {
    "name": "wing",
    "slug": "wing",
    "group": "Animals & Nature",
    "emoji_version": "15.0",
    "unicode_version": "15.0",
    "skin_tone_support": false
  },
  "🐦‍⬛": {
    "name": "black bird",
    "slug": "black_bird",
    "group": "Animals & Nature",
    "emoji_version": "15.0",
    "unicode_version": "15.0",
    "skin_tone_support": false
  },
  "🪿": {
    "name": "goose",
    "slug": "goose",
    "group": "Animals & Nature",
    "emoji_version": "15.0",
    "unicode_version": "15.0",
    "skin_tone_support": false
  },
  "🐦‍🔥": {
    "name": "phoenix",
    "slug": "phoenix",
    "group": "Animals & Nature",
    "emoji_version": "15.1",
    "unicode_version": "15.1",
    "skin_tone_support": false
  },
  "🐸": {
    "name": "frog",
    "slug": "frog",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🐊": {
    "name": "crocodile",
    "slug": "crocodile",
    "group": "Animals & Nature",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🐢": {
    "name": "turtle",
    "slug": "turtle",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🦎": {
    "name": "lizard",
    "slug": "lizard",
    "group": "Animals & Nature",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": false
  },
  "🐍": {
    "name": "snake",
    "slug": "snake",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🐲": {
    "name": "dragon face",
    "slug": "dragon_face",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🐉": {
    "name": "dragon",
    "slug": "dragon",
    "group": "Animals & Nature",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🦕": {
    "name": "sauropod",
    "slug": "sauropod",
    "group": "Animals & Nature",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": false
  },
  "🦖": {
    "name": "T-Rex",
    "slug": "t_rex",
    "group": "Animals & Nature",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": false
  },
  "🐳": {
    "name": "spouting whale",
    "slug": "spouting_whale",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🐋": {
    "name": "whale",
    "slug": "whale",
    "group": "Animals & Nature",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🐬": {
    "name": "dolphin",
    "slug": "dolphin",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🦭": {
    "name": "seal",
    "slug": "seal",
    "group": "Animals & Nature",
    "emoji_version": "13.0",
    "unicode_version": "13.0",
    "skin_tone_support": false
  },
  "🐟": {
    "name": "fish",
    "slug": "fish",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🐠": {
    "name": "tropical fish",
    "slug": "tropical_fish",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🐡": {
    "name": "blowfish",
    "slug": "blowfish",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🦈": {
    "name": "shark",
    "slug": "shark",
    "group": "Animals & Nature",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": false
  },
  "🐙": {
    "name": "octopus",
    "slug": "octopus",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🐚": {
    "name": "spiral shell",
    "slug": "spiral_shell",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🪸": {
    "name": "coral",
    "slug": "coral",
    "group": "Animals & Nature",
    "emoji_version": "14.0",
    "unicode_version": "14.0",
    "skin_tone_support": false
  },
  "🪼": {
    "name": "jellyfish",
    "slug": "jellyfish",
    "group": "Animals & Nature",
    "emoji_version": "15.0",
    "unicode_version": "15.0",
    "skin_tone_support": false
  },
  "🐌": {
    "name": "snail",
    "slug": "snail",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🦋": {
    "name": "butterfly",
    "slug": "butterfly",
    "group": "Animals & Nature",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": false
  },
  "🐛": {
    "name": "bug",
    "slug": "bug",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🐜": {
    "name": "ant",
    "slug": "ant",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🐝": {
    "name": "honeybee",
    "slug": "honeybee",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🪲": {
    "name": "beetle",
    "slug": "beetle",
    "group": "Animals & Nature",
    "emoji_version": "13.0",
    "unicode_version": "13.0",
    "skin_tone_support": false
  },
  "🐞": {
    "name": "lady beetle",
    "slug": "lady_beetle",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🦗": {
    "name": "cricket",
    "slug": "cricket",
    "group": "Animals & Nature",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": false
  },
  "🪳": {
    "name": "cockroach",
    "slug": "cockroach",
    "group": "Animals & Nature",
    "emoji_version": "13.0",
    "unicode_version": "13.0",
    "skin_tone_support": false
  },
  "🕷️": {
    "name": "spider",
    "slug": "spider",
    "group": "Animals & Nature",
    "emoji_version": "0.7",
    "unicode_version": "0.7",
    "skin_tone_support": false
  },
  "🕸️": {
    "name": "spider web",
    "slug": "spider_web",
    "group": "Animals & Nature",
    "emoji_version": "0.7",
    "unicode_version": "0.7",
    "skin_tone_support": false
  },
  "🦂": {
    "name": "scorpion",
    "slug": "scorpion",
    "group": "Animals & Nature",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🦟": {
    "name": "mosquito",
    "slug": "mosquito",
    "group": "Animals & Nature",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": false
  },
  "🪰": {
    "name": "fly",
    "slug": "fly",
    "group": "Animals & Nature",
    "emoji_version": "13.0",
    "unicode_version": "13.0",
    "skin_tone_support": false
  },
  "🪱": {
    "name": "worm",
    "slug": "worm",
    "group": "Animals & Nature",
    "emoji_version": "13.0",
    "unicode_version": "13.0",
    "skin_tone_support": false
  },
  "🦠": {
    "name": "microbe",
    "slug": "microbe",
    "group": "Animals & Nature",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": false
  },
  "💐": {
    "name": "bouquet",
    "slug": "bouquet",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🌸": {
    "name": "cherry blossom",
    "slug": "cherry_blossom",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "💮": {
    "name": "white flower",
    "slug": "white_flower",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🪷": {
    "name": "lotus",
    "slug": "lotus",
    "group": "Animals & Nature",
    "emoji_version": "14.0",
    "unicode_version": "14.0",
    "skin_tone_support": false
  },
  "🏵️": {
    "name": "rosette",
    "slug": "rosette",
    "group": "Animals & Nature",
    "emoji_version": "0.7",
    "unicode_version": "0.7",
    "skin_tone_support": false
  },
  "🌹": {
    "name": "rose",
    "slug": "rose",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🥀": {
    "name": "wilted flower",
    "slug": "wilted_flower",
    "group": "Animals & Nature",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": false
  },
  "🌺": {
    "name": "hibiscus",
    "slug": "hibiscus",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🌻": {
    "name": "sunflower",
    "slug": "sunflower",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🌼": {
    "name": "blossom",
    "slug": "blossom",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🌷": {
    "name": "tulip",
    "slug": "tulip",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🪻": {
    "name": "hyacinth",
    "slug": "hyacinth",
    "group": "Animals & Nature",
    "emoji_version": "15.0",
    "unicode_version": "15.0",
    "skin_tone_support": false
  },
  "🌱": {
    "name": "seedling",
    "slug": "seedling",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🪴": {
    "name": "potted plant",
    "slug": "potted_plant",
    "group": "Animals & Nature",
    "emoji_version": "13.0",
    "unicode_version": "13.0",
    "skin_tone_support": false
  },
  "🌲": {
    "name": "evergreen tree",
    "slug": "evergreen_tree",
    "group": "Animals & Nature",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🌳": {
    "name": "deciduous tree",
    "slug": "deciduous_tree",
    "group": "Animals & Nature",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🌴": {
    "name": "palm tree",
    "slug": "palm_tree",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🌵": {
    "name": "cactus",
    "slug": "cactus",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🌾": {
    "name": "sheaf of rice",
    "slug": "sheaf_of_rice",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🌿": {
    "name": "herb",
    "slug": "herb",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "☘️": {
    "name": "shamrock",
    "slug": "shamrock",
    "group": "Animals & Nature",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🍀": {
    "name": "four leaf clover",
    "slug": "four_leaf_clover",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🍁": {
    "name": "maple leaf",
    "slug": "maple_leaf",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🍂": {
    "name": "fallen leaf",
    "slug": "fallen_leaf",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🍃": {
    "name": "leaf fluttering in wind",
    "slug": "leaf_fluttering_in_wind",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🪹": {
    "name": "empty nest",
    "slug": "empty_nest",
    "group": "Animals & Nature",
    "emoji_version": "14.0",
    "unicode_version": "14.0",
    "skin_tone_support": false
  },
  "🪺": {
    "name": "nest with eggs",
    "slug": "nest_with_eggs",
    "group": "Animals & Nature",
    "emoji_version": "14.0",
    "unicode_version": "14.0",
    "skin_tone_support": false
  },
  "🍄": {
    "name": "mushroom",
    "slug": "mushroom",
    "group": "Animals & Nature",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🍇": {
    "name": "grapes",
    "slug": "grapes",
    "group": "Food & Drink",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🍈": {
    "name": "melon",
    "slug": "melon",
    "group": "Food & Drink",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🍉": {
    "name": "watermelon",
    "slug": "watermelon",
    "group": "Food & Drink",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🍊": {
    "name": "tangerine",
    "slug": "tangerine",
    "group": "Food & Drink",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🍋": {
    "name": "lemon",
    "slug": "lemon",
    "group": "Food & Drink",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🍋‍🟩": {
    "name": "lime",
    "slug": "lime",
    "group": "Food & Drink",
    "emoji_version": "15.1",
    "unicode_version": "15.1",
    "skin_tone_support": false
  },
  "🍌": {
    "name": "banana",
    "slug": "banana",
    "group": "Food & Drink",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🍍": {
    "name": "pineapple",
    "slug": "pineapple",
    "group": "Food & Drink",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🥭": {
    "name": "mango",
    "slug": "mango",
    "group": "Food & Drink",
    "emoji_version": "11.0",
    "unicode_version": "11.0",
    "skin_tone_support": false
  },
  "🍎": {
    "name": "red apple",
    "slug": "red_apple",
    "group": "Food & Drink",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🍏": {
    "name": "green apple",
    "slug": "green_apple",
    "group": "Food & Drink",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🍐": {
    "name": "pear",
    "slug": "pear",
    "group": "Food & Drink",
    "emoji_version": "1.0",
    "unicode_version": "1.0",
    "skin_tone_support": false
  },
  "🍑": {
    "name": "peach",
    "slug": "peach",
    "group": "Food & Drink",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🍒": {
    "name": "cherries",
    "slug": "cherries",
    "group": "Food & Drink",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🍓": {
    "name": "strawberry",
    "slug": "strawberry",
    "group": "Food & Drink",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🫐": {
    "name": "blueberries",
    "slug": "blueberries",
    "group": "Food & Drink",
    "emoji_version": "13.0",
    "unicode_version": "13.0",
    "skin_tone_support": false
  },
  "🥝": {
    "name": "kiwi fruit",
    "slug": "kiwi_fruit",
    "group": "Food & Drink",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": false
  },
  "🍅": {
    "name": "tomato",
    "slug": "tomato",
    "group": "Food & Drink",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🫒": {
    "name": "olive",
    "slug": "olive",
    "group": "Food & Drink",
    "emoji_version": "13.0",
    "unicode_version": "13.0",
    "skin_tone_support": false
  },
  "🥥": {
    "name": "coconut",
    "slug": "coconut",
    "group": "Food & Drink",
    "emoji_version": "5.0",
    "unicode_version": "5.0",
    "skin_tone_support": false
  },
  "🥑": {
    "name": "avocado",
    "slug": "avocado",
    "group": "Food & Drink",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": false
  },
  "🍆": {
    "name": "eggplant",
    "slug": "eggplant",
    "group": "Food & Drink",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🥔": {
    "name": "potato",
    "slug": "potato",
    "group": "Food & Drink",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": false
  },
  "🥕": {
    "name": "carrot",
    "slug": "carrot",
    "group": "Food & Drink",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": false
  },
  "🌽": {
    "name": "ear of corn",
    "slug": "ear_of_corn",
    "group": "Food & Drink",
    "emoji_version": "0.6",
    "unicode_version": "0.6",
    "skin_tone_support": false
  },
  "🌶️": {
    "name": "hot pepper",
    "slug": "hot_pepper",
    "group": "Food & Drink",
    "emoji_version": "0.7",
    "unicode_version": "0.7",
    "skin_tone_support": false
  },
  "🫑": {
    "name": "bell pepper",
    "slug": "bell_pepper",
    "group": "Food & Drink",
    "emoji_version": "13.0",
    "unicode_version": "13.0",
    "skin_tone_support": false
  },
  "🥒": {
    "name": "cucumber",
    "slug": "cucumber",
    "group": "Food & Drink",
    "emoji_version": "3.0",
    "unicode_version": "3.0",
    "skin_tone_support": false
  },
  "🥬": {
    "name": "leafy green",
    "slug": "leafy_green",
    "group": "Food & Drink",
    "emoji_v
Download .txt
gitextract_evifj196/

├── .gitignore
├── LICENSE
├── README.md
├── config/
│   ├── assets/
│   │   ├── config.json
│   │   ├── emoji.json
│   │   └── launcher.json
│   ├── data.py
│   ├── hypr/
│   │   └── modus.conf
│   └── matugen/
│       └── templates/
│           ├── hyprland-colors.conf
│           └── macos.css
├── debug_memory.py
├── install.sh
├── lock.py
├── main.css
├── main.py
├── modules/
│   ├── about.py
│   ├── controlcenter/
│   │   ├── battery.py
│   │   ├── bluetooth.py
│   │   ├── expanded_player.py
│   │   ├── main.py
│   │   ├── nightlight.py
│   │   ├── per_app_volume.py
│   │   ├── player.py
│   │   └── wifi.py
│   ├── corners.py
│   ├── dock.py
│   ├── launcher/
│   │   ├── __init__.py
│   │   ├── main.py
│   │   ├── plugin_base.py
│   │   ├── plugin_manager.py
│   │   ├── plugins/
│   │   │   ├── __init__.py
│   │   │   ├── applications.py
│   │   │   ├── bash_scripts.py
│   │   │   ├── bookmarks.py
│   │   │   ├── caffeine.py
│   │   │   ├── calculator.py
│   │   │   ├── clipboard.py
│   │   │   ├── emoji.py
│   │   │   ├── otp.py
│   │   │   ├── password.py
│   │   │   ├── power.py
│   │   │   ├── reminders.py
│   │   │   ├── screencapture.py
│   │   │   ├── system.py
│   │   │   ├── tmux.py
│   │   │   ├── wallpaper.py
│   │   │   └── websearch.py
│   │   ├── result.py
│   │   ├── result_item.py
│   │   └── trigger_config.py
│   ├── notification/
│   │   ├── notification.py
│   │   ├── notification_center.py
│   │   └── unified_cache.py
│   ├── osd.py
│   ├── panel/
│   │   ├── components/
│   │   │   ├── enhanced_system_tray.py
│   │   │   ├── indicators.py
│   │   │   ├── menubar.py
│   │   │   └── recording_indicator.py
│   │   └── main.py
│   ├── switcher.py
│   ├── todo/
│   │   ├── __init__.py
│   │   └── todo_widget.py
│   └── widget.py
├── requirements.txt
├── scripts/
│   ├── gamemode.sh
│   ├── hyprpicker.sh
│   └── screen-capture.sh
├── services/
│   ├── __init__.py
│   ├── auth.py
│   ├── battery.py
│   ├── brightness.py
│   ├── custom_notification.py
│   ├── modus.py
│   ├── mpris.py
│   ├── network.py
│   └── todo.py
├── styles/
│   ├── about.css
│   ├── battery-widget.css
│   ├── colors.css
│   ├── controlcenter.css
│   ├── dock.css
│   ├── dropdown.css
│   ├── launcher.css
│   ├── lock.css
│   ├── notification-center.css
│   ├── notification.css
│   ├── osd.css
│   ├── panel.css
│   ├── player.css
│   ├── switcher.css
│   ├── todo.css
│   ├── tray.css
│   └── widgets.css
├── utils/
│   ├── __init__.py
│   ├── animator.py
│   ├── app_name_resolver.py
│   ├── conversion.py
│   ├── functions.py
│   ├── icon_resolver.py
│   ├── inhibit.py
│   ├── monitors.py
│   ├── occlusion.py
│   └── roam.py
└── widgets/
    ├── circle_image.py
    ├── custom_image.py
    ├── customrevealer.py
    ├── dropdown.py
    ├── mousecapture.py
    ├── popup_window.py
    ├── wayland.py
    └── wifi_password_dialog.py
Download .txt
SYMBOL INDEX (1436 symbols across 73 files)

FILE: config/data.py
  function parse_timeout_string (line 14) | def parse_timeout_string(timeout_str):
  function load_config (line 62) | def load_config():

FILE: debug_memory.py
  class MemoryMonitor (line 15) | class MemoryMonitor:
    method __init__ (line 18) | def __init__(self):
    method get_memory_usage (line 25) | def get_memory_usage(self):
    method get_memory_details (line 29) | def get_memory_details(self):
    method set_baseline (line 41) | def set_baseline(self, label="Baseline"):
    method log_memory_change (line 47) | def log_memory_change(self, label="Memory Check", force_gc=True):
    method log_memory_spike (line 72) | def log_memory_spike(self, threshold_mb=10):
    method start_continuous_monitoring (line 84) | def start_continuous_monitoring(self, interval_seconds=2):
    method stop_continuous_monitoring (line 106) | def stop_continuous_monitoring(self):
  function set_memory_baseline (line 119) | def set_memory_baseline(label="Baseline"):
  function log_memory (line 124) | def log_memory(label="Memory Check"):
  function start_memory_monitoring (line 129) | def start_memory_monitoring():
  function stop_memory_monitoring (line 134) | def stop_memory_monitoring():
  function check_memory_spike (line 139) | def check_memory_spike():
  function test_memory_monitor (line 147) | def test_memory_monitor():

FILE: lock.py
  class IndicatorBox (line 36) | class IndicatorBox(Box):
    method __init__ (line 37) | def __init__(self, *args, **kwargs):
  class ContentBox (line 51) | class ContentBox(CenterBox):
    method __init__ (line 52) | def __init__(self, on_activate, *args, **kwargs):
  class LockScreen (line 137) | class LockScreen(Window):
    method __init__ (line 138) | def __init__(self, lock: GtkSessionLock.Lock):
    method _on_keypress (line 159) | def _on_keypress(self, widget, event):
    method _start_hide_timer (line 177) | def _start_hide_timer(self):
    method _restart_hide_timer (line 182) | def _restart_hide_timer(self):
    method _stop_hide_timer (line 185) | def _stop_hide_timer(self):
    method _hide_entry (line 190) | def _hide_entry(self):
    method on_activate (line 196) | def on_activate(self, entry: Entry, *args):
  function initialize (line 206) | def initialize():
  function set_css (line 226) | def set_css():

FILE: main.py
  function set_css (line 58) | def set_css():

FILE: modules/about.py
  function read_dmi (line 16) | def read_dmi(field):
  function get_gpu_name (line 24) | def get_gpu_name():
  function get_executable_path (line 53) | def get_executable_path(exec_string):
  function get_app_info (line 88) | def get_app_info(wmclass):
  class AboutApp (line 217) | class AboutApp(Gtk.Window):
    method __init__ (line 218) | def __init__(self, app_name="Unknown Application", wmclass=""):
    method setup_ui (line 233) | def setup_ui(self):
    method toggle (line 402) | def toggle(self, b):
  class About (line 409) | class About(Gtk.Window):
    method __init__ (line 410) | def __init__(self):
    method open_more_info (line 529) | def open_more_info(self, button):
    method toggle (line 533) | def toggle(self, b):

FILE: modules/controlcenter/battery.py
  class EnergyModeButton (line 17) | class EnergyModeButton(Box):
    method __init__ (line 18) | def __init__(
    method on_clicked (line 69) | def on_clicked(self, *args):
    method _reset_icon_state (line 78) | def _reset_icon_state(self):
    method update_state (line 81) | def update_state(self):
  class GameModeButton (line 89) | class GameModeButton(Box):
    method __init__ (line 90) | def __init__(self, parent, **kwargs):
    method on_clicked (line 125) | def on_clicked(self, *args):
    method _reset_icon_state (line 136) | def _reset_icon_state(self):
    method update_state (line 139) | def update_state(self):
  class BatteryControl (line 159) | class BatteryControl(Box):
    method __init__ (line 160) | def __init__(self, parent, **kwargs):
    method open_battery_settings (line 274) | def open_battery_settings(self, *args):
    method create_energy_mode_buttons (line 278) | def create_energy_mode_buttons(self):
    method update_energy_mode_buttons (line 334) | def update_energy_mode_buttons(self):
    method create_game_mode_button (line 338) | def create_game_mode_button(self):
    method update_battery_info (line 347) | def update_battery_info(self):
    method on_battery_changed (line 389) | def on_battery_changed(self, *args):
    method on_profile_changed (line 392) | def on_profile_changed(self, service, new_profile):

FILE: modules/controlcenter/bluetooth.py
  function set_bluetooth_enabled_with_fallback (line 24) | def set_bluetooth_enabled_with_fallback(client, enabled: bool):
  class BluetoothDeviceSlot (line 45) | class BluetoothDeviceSlot(CenterBox):
    method __init__ (line 46) | def __init__(self, device: BluetoothDevice, **kwargs):
    method on_button_enter (line 105) | def on_button_enter(self, widget, event):
    method on_button_leave (line 108) | def on_button_leave(self, widget, event):
    method toggle_connecting (line 111) | def toggle_connecting(self):
    method on_changed (line 115) | def on_changed(self, *_):
  class BluetoothConnections (line 181) | class BluetoothConnections(Box):
    method __init__ (line 182) | def __init__(
    method toggle_other_devices (line 330) | def toggle_other_devices(self, *_):
    method open_bluetooth_settings (line 348) | def open_bluetooth_settings(self, *_):
    method update_scan_label (line 359) | def update_scan_label(self):
    method update_devices (line 371) | def update_devices(self, *_):
    method start_device_monitoring (line 460) | def start_device_monitoring(self):
    method stop_device_monitoring (line 466) | def stop_device_monitoring(self):
    method periodic_device_refresh (line 472) | def periodic_device_refresh(self):
    method force_device_refresh (line 493) | def force_device_refresh(self):
    method on_client_changed (line 505) | def on_client_changed(self, *_):
    method on_destroy (line 510) | def on_destroy(self, widget):
    method close_bluetooth (line 522) | def close_bluetooth(self):
    method setup_pull_to_refresh (line 527) | def setup_pull_to_refresh(self):
    method on_scroll_event (line 555) | def on_scroll_event(self, widget, event):
    method on_button_press (line 566) | def on_button_press(self, widget, event):
    method on_button_release (line 573) | def on_button_release(self, widget, event):
    method on_motion_notify (line 587) | def on_motion_notify(self, widget, event):
    method on_device_added (line 610) | def on_device_added(self, client: BluetoothClient, address: str):

FILE: modules/controlcenter/expanded_player.py
  function get_shared_mpris_manager (line 40) | def get_shared_mpris_manager():
  function cleanup_artwork_cache (line 48) | def cleanup_artwork_cache():
  function cleanup_old_cache_files (line 59) | def cleanup_old_cache_files():
  function get_artwork_cached (line 86) | def get_artwork_cached(url: str) -> Optional[str]:
  class EmbeddedExpandedPlayer (line 141) | class EmbeddedExpandedPlayer(Box):
    method __init__ (line 144) | def __init__(self, control_center, **kwargs):
    method _on_back_clicked (line 190) | def _on_back_clicked(self, *_):
    method refresh (line 197) | def refresh(self):
    method destroy (line 202) | def destroy(self):
    method _periodic_cleanup (line 253) | def _periodic_cleanup(self):
  class PlayerBoxStack (line 277) | class PlayerBoxStack(Box):
    method __init__ (line 280) | def __init__(self, mpris_manager: MprisPlayerManager, **kwargs):
    method _periodic_cleanup (line 333) | def _periodic_cleanup(self):
    method destroy (line 370) | def destroy(self):
    method _create_no_media_box (line 422) | def _create_no_media_box(self):
    method on_player_clicked (line 519) | def on_player_clicked(self, type):
    method on_player_clicked_by_index (line 544) | def on_player_clicked_by_index(self, index):
    method on_new_player (line 565) | def on_new_player(self, mpris_manager, player):
    method on_lost_player (line 595) | def on_lost_player(self, mpris_manager, player_name):
    method make_new_player_button (line 642) | def make_new_player_button(self, player_box):
    method _update_all_player_buttons (line 672) | def _update_all_player_buttons(self):
  class PlayerBox (line 689) | class PlayerBox(Box):
    method __init__ (line 692) | def __init__(self, player: MprisPlayer, player_stack=None, **kwargs):
    method destroy (line 1001) | def destroy(self):
    method __del__ (line 1046) | def __del__(self):
    method update_buttons (line 1053) | def update_buttons(self, player_buttons, show_buttons):
    method length_str (line 1101) | def length_str(self, length):
    method _on_metadata (line 1118) | def _on_metadata(self, *_):
    method _cleanup_temp_files (line 1142) | def _cleanup_temp_files(self):
    method _on_player_exit (line 1152) | def _on_player_exit(self, _, value):
    method _on_player_next (line 1157) | def _on_player_next(self, *_):
    method _on_player_prev (line 1160) | def _on_player_prev(self, *_):
    method _on_playback_change (line 1163) | def _on_playback_change(self, player, status):
    method _update_image (line 1176) | def _update_image(self, image_path):
    method _set_image (line 1184) | def _set_image(self, *_):
    method _download_and_set_artwork (line 1216) | def _download_and_set_artwork(self, arturl):
    method _move_seekbar (line 1286) | def _move_seekbar(self, *_):
    method _on_seek_start (line 1312) | def _on_seek_start(self, widget, event):
    method _on_seek_end (line 1317) | def _on_seek_end(self, widget, event):
    method _on_scale_value_changed (line 1322) | def _on_scale_value_changed(self, scale: Scale):
    method _on_scale_move (line 1341) | def _on_scale_move(self, scale: Scale, event, pos: int):
  class Thing (line 1351) | class Thing(Box):
    method __init__ (line 1352) | def __init__(self, **kwargs):
  class ExpandedPlayer (line 1369) | class ExpandedPlayer(Window):
    method __init__ (line 1370) | def __init__(self, **kwargs):
    method destroy (line 1382) | def destroy(self):
    method _init_mousecapture (line 1393) | def _init_mousecapture(self, mousecapture):
    method hide_controlcenter (line 1396) | def hide_controlcenter(self, *_):

FILE: modules/controlcenter/main.py
  class ModusControlCenter (line 34) | class ModusControlCenter(Window):
    method __init__ (line 35) | def __init__(self, **kwargs):
    method _on_visibility_changed (line 529) | def _on_visibility_changed(self, widget, param):
    method _cleanup_when_hidden (line 534) | def _cleanup_when_hidden(self):
    method _ensure_music_widget (line 579) | def _ensure_music_widget(self):
    method _ensure_bluetooth_widgets (line 595) | def _ensure_bluetooth_widgets(self):
    method _ensure_wifi_widgets (line 626) | def _ensure_wifi_widgets(self):
    method _ensure_per_app_volume_widgets (line 642) | def _ensure_per_app_volume_widgets(self):
    method _ensure_expanded_player_widgets (line 661) | def _ensure_expanded_player_widgets(self):
    method _check_initial_states (line 680) | def _check_initial_states(self):
    method _update_initial_labels (line 696) | def _update_initial_labels(self):
    method set_dont_disturb (line 699) | def set_dont_disturb(self, *_):
    method toggle_flight_mode (line 711) | def toggle_flight_mode(self, *_):
    method toggle_caffeine (line 744) | def toggle_caffeine(self, *_):
    method set_volume (line 777) | def set_volume(self, _, __, volume):
    method set_brightness (line 782) | def set_brightness(self, _, __, brightness):
    method brightness_changed (line 788) | def brightness_changed(self, _, brightness_value):
    method on_volume_scroll (line 801) | def on_volume_scroll(self, widget, event):
    method on_brightness_scroll (line 814) | def on_brightness_scroll(self, widget, event):
    method toggle_bluetooth (line 827) | def toggle_bluetooth(self, *_):
    method on_network_ready (line 840) | def on_network_ready(self, *_):
    method update_wifi_icon (line 847) | def update_wifi_icon(self, *_):
    method toggle_wifi (line 861) | def toggle_wifi(self, *_):
    method set_children (line 873) | def set_children(self, children):
    method open_bluetooth (line 876) | def open_bluetooth(self, *_):
    method open_wifi (line 881) | def open_wifi(self, *_):
    method close_bluetooth (line 886) | def close_bluetooth(self, *_):
    method close_wifi (line 893) | def close_wifi(self, *_):
    method open_per_app_volume (line 900) | def open_per_app_volume(self, *_):
    method close_per_app_volume (line 918) | def close_per_app_volume(self, *_):
    method open_expanded_player (line 925) | def open_expanded_player(self, *_):
    method close_expanded_player (line 933) | def close_expanded_player(self, *_):
    method _crossfade_to_view (line 937) | def _crossfade_to_view(self, view_name):
    method _set_mousecapture (line 949) | def _set_mousecapture(self, visible: bool):
    method volume_changed (line 961) | def volume_changed(
    method wlan_changed (line 972) | def wlan_changed(self, _, wlan):
    method bluetooth_changed (line 997) | def bluetooth_changed(self, _, bluetooth):
    method audio_changed (line 1020) | def audio_changed(self, *_):
    method dnd_changed (line 1023) | def dnd_changed(self, _, dnd_state):
    method _init_mousecapture (line 1034) | def _init_mousecapture(self, mousecapture):
    method hide_controlcenter (line 1037) | def hide_controlcenter(self, *_):
    method destroy (line 1041) | def destroy(self):

FILE: modules/controlcenter/nightlight.py
  class NightLightControl (line 15) | class NightLightControl:
    method __init__ (line 18) | def __init__(self):
    method _check_initial_state (line 22) | def _check_initial_state(self):
    method toggle (line 33) | def toggle(self):
    method set_temperature (line 51) | def set_temperature(self, temperature: int):
  function create_night_light_widget (line 69) | def create_night_light_widget(control_center):

FILE: modules/controlcenter/per_app_volume.py
  class PerAppVolumeControl (line 17) | class PerAppVolumeControl(Box):
    method __init__ (line 20) | def __init__(self, control_center, **kwargs):
    method _auto_refresh (line 84) | def _auto_refresh(self):
    method _go_back (line 89) | def _go_back(self, *_):
    method _get_app_icon (line 93) | def _get_app_icon(self, app):
    method _format_app_name (line 144) | def _format_app_name(self, name):
    method _populate_apps (line 170) | def _populate_apps(self):
    method _show_no_apps_message (line 205) | def _show_no_apps_message(self):
    method _create_app_control (line 215) | def _create_app_control(self, app):
    method _set_app_volume (line 287) | def _set_app_volume(self, app, volume_value):
    method _on_stream_changed (line 311) | def _on_stream_changed(self, *_):
    method refresh (line 315) | def refresh(self):
    method destroy (line 319) | def destroy(self):

FILE: modules/controlcenter/player.py
  function cleanup_old_cache_files (line 30) | def cleanup_old_cache_files():
  class PlayerBoxStack (line 84) | class PlayerBoxStack(Box):
    method __init__ (line 87) | def __init__(
    method destroy (line 137) | def destroy(self):
    method _periodic_cleanup (line 165) | def _periodic_cleanup(self):
    method _create_no_media_box (line 203) | def _create_no_media_box(self):
    method _find_playing_player_index (line 302) | def _find_playing_player_index(self):
    method _switch_to_playing_player (line 313) | def _switch_to_playing_player(self):
    method on_player_playback_changed (line 324) | def on_player_playback_changed(self, player_box, status):
    method on_player_clicked (line 340) | def on_player_clicked(self, type):
    method on_player_clicked_by_index (line 370) | def on_player_clicked_by_index(self, index):
    method on_new_player (line 391) | def on_new_player(self, mpris_manager, player):
    method on_lost_player (line 430) | def on_lost_player(self, mpris_manager, player_name):
    method make_new_player_button (line 480) | def make_new_player_button(self, player_box):
    method _update_all_player_buttons (line 510) | def _update_all_player_buttons(self):
  class PlayerBox (line 527) | class PlayerBox(Box):
    method __init__ (line 530) | def __init__(
    method destroy (line 754) | def destroy(self):
    method __del__ (line 772) | def __del__(self):
    method _on_prev_button_click (line 779) | def _on_prev_button_click(self, *_):
    method _on_outer_box_clicked (line 790) | def _on_outer_box_clicked(self, *_):
    method update_buttons (line 804) | def update_buttons(self, player_buttons, show_buttons):
    method _on_metadata (line 808) | def _on_metadata(self, *_):
    method _cleanup_temp_files (line 811) | def _cleanup_temp_files(self):
    method _on_player_exit (line 821) | def _on_player_exit(self, _, value):
    method _on_player_next (line 826) | def _on_player_next(self, *_):
    method _on_player_prev (line 829) | def _on_player_prev(self, *_):
    method _on_playback_change (line 832) | def _on_playback_change(self, player, status):
    method _update_image (line 850) | def _update_image(self, image_path):
    method _set_image (line 858) | def _set_image(self, *_):
    method _download_and_set_artwork (line 884) | def _download_and_set_artwork(self, arturl):
    method close_bluetooth (line 953) | def close_bluetooth(self, *args):

FILE: modules/controlcenter/wifi.py
  class WifiNetworkSlot (line 22) | class WifiNetworkSlot(Box):
    method __init__ (line 23) | def __init__(self, access_point, wifi_service, parent=None, **kwargs):
    method toggle_connecting (line 100) | def toggle_connecting(self):
    method _reset_disconnect_state (line 151) | def _reset_disconnect_state(self):
    method _reset_connect_state (line 159) | def _reset_connect_state(self):
    method on_changed (line 167) | def on_changed(self, *_):
    method _show_password_dialog (line 180) | def _show_password_dialog(self):
    method _on_password_connect (line 198) | def _on_password_connect(self, ssid, password):
    method _show_connection_error (line 244) | def _show_connection_error(self, message="Incorrect password. Please t...
    method _on_password_cancel (line 250) | def _on_password_cancel(self):
  class WifiConnections (line 256) | class WifiConnections(Box):
    method __init__ (line 257) | def __init__(self, parent, show_back_button=True, **kwargs):
    method toggle_other_networks (line 376) | def toggle_other_networks(self, *_):
    method on_network_ready (line 389) | def on_network_ready(self, *_):
    method on_toggle_changed (line 408) | def on_toggle_changed(self, toggle_button, *_):
    method on_wifi_enabled_changed (line 414) | def on_wifi_enabled_changed(self, *_):
    method open_network_settings (line 419) | def open_network_settings(self, *_):
    method update_networks (line 430) | def update_networks(self, *_):
    method _is_saved_network (line 528) | def _is_saved_network(self, access_point):
    method refresh_network_states (line 567) | def refresh_network_states(self, *_):
    method start_network_monitoring (line 579) | def start_network_monitoring(self):
    method stop_network_monitoring (line 585) | def stop_network_monitoring(self):
    method periodic_network_refresh (line 591) | def periodic_network_refresh(self):
    method force_network_refresh (line 610) | def force_network_refresh(self):
    method setup_pull_to_refresh (line 621) | def setup_pull_to_refresh(self):
    method on_scroll_event (line 649) | def on_scroll_event(self, widget, event):
    method on_button_press (line 661) | def on_button_press(self, widget, event):
    method on_button_release (line 668) | def on_button_release(self, widget, event):
    method on_motion_notify (line 683) | def on_motion_notify(self, widget, event):
    method on_destroy (line 700) | def on_destroy(self, widget):
    method close_wifi (line 712) | def close_wifi(self):

FILE: modules/corners.py
  class MyCorner (line 6) | class MyCorner(Box):
    method __init__ (line 7) | def __init__(self, corner):
  class Corners (line 22) | class Corners(Window):
    method __init__ (line 23) | def __init__(self):

FILE: modules/dock.py
  class AppBar (line 28) | class AppBar(Box):
    method __init__ (line 29) | def __init__(self, parent: Window):
    method setup_app_monitoring (line 69) | def setup_app_monitoring(self):
    method _populate_pinned_apps (line 80) | def _populate_pinned_apps(self):
    method _create_pinned_button (line 98) | def _create_pinned_button(self, app_data, desktop_apps):
    method _create_trash_button (line 152) | def _create_trash_button(self):
    method _find_desktop_app_from_data (line 188) | def _find_desktop_app_from_data(self, app_data: dict, desktop_apps):
    method _find_desktop_app_by_id (line 215) | def _find_desktop_app_by_id(self, app_id: str, desktop_apps):
    method show_menu (line 236) | def show_menu(self, app_id: str, client=None, instance_address=None):
    method _close_running_app (line 266) | def _close_running_app(self, instance_address):
    method _handle_pinned_app_click (line 274) | def _handle_pinned_app_click(self, event, app_data):
    method _handle_trash_click (line 285) | def _handle_trash_click(self, event):
    method _handle_item_hovered (line 312) | def _handle_item_hovered(self, item, pinned=False):
    method _handle_item_unhovered (line 332) | def _handle_item_unhovered(self, item, pinned=False):
    method _get_app_identifier (line 352) | def _get_app_identifier(self, app_data):
    method _launch_app_data (line 357) | def _launch_app_data(self, app_data):
    method _launch_app (line 374) | def _launch_app(self, app):
    method _launch_app_from_data (line 385) | def _launch_app_from_data(self, app_data):
    method _pin_app (line 404) | def _pin_app(self, app_class: str):
    method _unpin_app (line 437) | def _unpin_app(self, app_identifier: str):
    method _matches_app_identifier (line 453) | def _matches_app_identifier(self, pinned_app, app_identifier):
    method get_clients (line 468) | def get_clients(self):
    method get_focused_window (line 478) | def get_focused_window(self):
    method update_dock_apps (line 488) | def update_dock_apps(self):
    method _update_pinned_apps_state (line 526) | def _update_pinned_apps_state(self, clients):
    method _cleanup_removed_instances (line 545) | def _cleanup_removed_instances(self, current_instance_ids):
    method create_instance_button (line 568) | def create_instance_button(self, instance_address, client, app_class):
    method _get_workspace_id (line 640) | def _get_workspace_id(self, client):
    method _is_special_workspace_id (line 648) | def _is_special_workspace_id(self, ws_id):
    method _should_show_app_instance (line 651) | def _should_show_app_instance(self, client):
    method update_instance_button (line 661) | def update_instance_button(self, instance_address, client, app_class):
    method handle_instance_click (line 700) | def handle_instance_click(self, button_widget, event):
    method _is_app_pinned (line 722) | def _is_app_pinned(self, app_class: str) -> bool:
    method _update_separator_visibility (line 728) | def _update_separator_visibility(self):
  class Dock (line 737) | class Dock(Window):
    method __init__ (line 738) | def __init__(self):
    method on_hover_enter (line 776) | def on_hover_enter(self):
    method on_hover_leave (line 784) | def on_hover_leave(self):
    method _get_anchor_from_position (line 791) | def _get_anchor_from_position(self):
    method _get_transition_type (line 799) | def _get_transition_type(self):
    method _get_occlusion_position (line 807) | def _get_occlusion_position(self):
    method setup_occlusion_monitoring (line 815) | def setup_occlusion_monitoring(self):

FILE: modules/launcher/main.py
  class Launcher (line 26) | class Launcher(Window):
    method __init__ (line 37) | def __init__(self, **kwargs):
    method show_launcher (line 148) | def show_launcher(self, trigger_keyword: str = None, external: bool = ...
    method _position_cursor_at_end (line 231) | def _position_cursor_at_end(self, text_length: Optional[int] = None) -...
    method _add_space_to_trigger (line 247) | def _add_space_to_trigger(self, trigger_word: str) -> None:
    method close_launcher (line 272) | def close_launcher(self):
    method _on_search_changed (line 282) | def _on_search_changed(self, entry):
    method _perform_search (line 334) | def _perform_search(self, query: str) -> bool:
    method _extract_query_after_trigger (line 462) | def _extract_query_after_trigger(self, query: str, trigger: str) -> str:
    method _show_available_triggers (line 497) | def _show_available_triggers(self):
    method _detect_trigger (line 504) | def _detect_trigger(self, query: str) -> Tuple[Optional[object], str]:
    method _get_applications_plugin (line 525) | def _get_applications_plugin(self):
    method _get_trigger_suggestions (line 535) | def _get_trigger_suggestions(self, query: str) -> List[Result]:
    method _create_trigger_result (line 579) | def _create_trigger_result(self, trigger_clean: str, max_examples: int...
    method _activate_trigger (line 595) | def _activate_trigger(self, trigger: str):
    method _execute_external_command (line 634) | def _execute_external_command(self, command_string: str):
    method _update_results_display (line 712) | def _update_results_display(self):
    method _update_input_action_text (line 753) | def _update_input_action_text(self):
    method _clear_results (line 788) | def _clear_results(self):
    method _handle_escape_key (line 796) | def _handle_escape_key(self) -> bool:
    method _handle_backspace_key (line 813) | def _handle_backspace_key(self) -> bool:
    method _on_key_press (line 874) | def _on_key_press(self, _widget, event):
    method _custom_widget_has_entry (line 1019) | def _custom_widget_has_entry(self, widget):
    method _find_focused_entry_in_widget (line 1033) | def _find_focused_entry_in_widget(self, widget):
    method _find_password_entry_widget (line 1056) | def _find_password_entry_widget(self):
    method _on_entry_activate (line 1072) | def _on_entry_activate(self, _entry):
    method _on_result_clicked (line 1076) | def _on_result_clicked(self, _result_item, index):
    method _on_result_hovered (line 1083) | def _on_result_hovered(self, index):
    method _on_mouse_activity (line 1092) | def _on_mouse_activity(self, widget, event):
    method _should_allow_mouse_interaction (line 1109) | def _should_allow_mouse_interaction(self):
    method _is_mouse_over_results (line 1131) | def _is_mouse_over_results(self):
    method _update_selection (line 1136) | def _update_selection(self):
    method _update_selection_visual_only (line 1164) | def _update_selection_visual_only(self):
    method _scroll_to_widget (line 1182) | def _scroll_to_widget(self, widget):
    method _ensure_selected_visible (line 1239) | def _ensure_selected_visible(self):
    method _cycle_focus_forward (line 1272) | def _cycle_focus_forward(self):
    method _cycle_focus_backward (line 1279) | def _cycle_focus_backward(self):
    method _focus_search_entry_without_selection (line 1285) | def _focus_search_entry_without_selection(self):
    method _navigate_results_forward (line 1331) | def _navigate_results_forward(self):
    method _navigate_results_backward (line 1342) | def _navigate_results_backward(self):
    method _activate_selected (line 1353) | def _activate_selected(self):

FILE: modules/launcher/plugin_base.py
  class PluginBase (line 7) | class PluginBase(ABC):
    method __init__ (line 13) | def __init__(self):
    method initialize (line 22) | def initialize(self):
    method cleanup (line 30) | def cleanup(self):
    method query (line 38) | def query(self, query_string: str) -> List[Result]:
    method get_triggers (line 50) | def get_triggers(self) -> List[str]:
    method set_triggers (line 60) | def set_triggers(self, triggers: List[str]):
    method handles_query (line 69) | def handles_query(self, query_string: str) -> bool:
    method get_active_trigger (line 91) | def get_active_trigger(self, query_string: str) -> str:
    method query_triggered (line 128) | def query_triggered(self, query_string: str, trigger: str) -> List[Res...
    method get_config (line 144) | def get_config(self) -> dict:
    method set_config (line 159) | def set_config(self, config: dict):
    method __str__ (line 168) | def __str__(self):
    method __repr__ (line 171) | def __repr__(self):

FILE: modules/launcher/plugin_manager.py
  class PluginManager (line 9) | class PluginManager:
    method __init__ (line 14) | def __init__(self):
    method _load_builtin_plugins (line 28) | def _load_builtin_plugins(self):
    method _load_external_plugins (line 40) | def _load_external_plugins(self):
    method _load_plugin_from_file (line 45) | def _load_plugin_from_file(self, plugins_dir: str, plugin_name: str):
    method _activate_default_plugins (line 77) | def _activate_default_plugins(self):
    method activate_plugin (line 101) | def activate_plugin(self, plugin_name: str) -> bool:
    method deactivate_plugin (line 128) | def deactivate_plugin(self, plugin_name: str) -> bool:
    method get_active_plugins (line 149) | def get_active_plugins(self) -> List[PluginBase]:
    method get_plugin_names (line 155) | def get_plugin_names(self) -> List[str]:
    method get_active_plugin_names (line 159) | def get_active_plugin_names(self) -> List[str]:
    method reload_plugin (line 163) | def reload_plugin(self, plugin_name: str) -> bool:

FILE: modules/launcher/plugins/applications.py
  class ApplicationsPlugin (line 13) | class ApplicationsPlugin(PluginBase):
    method __init__ (line 14) | def __init__(self):
    method initialize (line 19) | def initialize(self):
    method cleanup (line 22) | def cleanup(self):
    method _pin_application (line 25) | def _pin_application(self, app):
    method query (line 55) | def query(self, query_string: str) -> List[Result]:
    method _calculate_relevance (line 92) | def _calculate_relevance(self, app, query: str) -> float:
    method _fuzzy_match (line 135) | def _fuzzy_match(self, query: str, text: str) -> bool:
    method _launch_application (line 144) | def _launch_application(self, app: DesktopApp):
    method _get_all_applications (line 155) | def _get_all_applications(self) -> List[Result]:

FILE: modules/launcher/plugins/bash_scripts.py
  class BashScriptsPlugin (line 13) | class BashScriptsPlugin(PluginBase):
    method __init__ (line 18) | def __init__(self):
    method initialize (line 43) | def initialize(self):
    method cleanup (line 49) | def cleanup(self):
    method _load_scripts_cache (line 56) | def _load_scripts_cache(self):
    method _save_scripts_cache (line 73) | def _save_scripts_cache(self):
    method _start_background_cache_update (line 86) | def _start_background_cache_update(self):
    method _build_scripts_cache_background (line 102) | def _build_scripts_cache_background(self):
    method _scan_directory_for_scripts (line 132) | def _scan_directory_for_scripts(self, directory: str, cache: Dict):
    method _is_script_file (line 164) | def _is_script_file(self, file_path: str) -> bool:
    method _get_script_description (line 186) | def _get_script_description(self, script_path: str) -> str:
    method query (line 205) | def query(self, query_string: str) -> List[Result]:
    method _list_all_scripts (line 227) | def _list_all_scripts(self) -> List[Result]:
    method _search_scripts (line 252) | def _search_scripts(self, query: str) -> List[Result]:
    method _create_script_result (line 305) | def _create_script_result(
    method _create_script_results_with_args (line 350) | def _create_script_results_with_args(
    method _create_script_action (line 393) | def _create_script_action(self, script_name: str, script_info: Dict):
    method _create_script_action_with_args (line 401) | def _create_script_action_with_args(
    method _execute_script (line 414) | def _execute_script(self, script_name: str, script_info: Dict):

FILE: modules/launcher/plugins/bookmarks.py
  class BookmarkManager (line 16) | class BookmarkManager:
    method __init__ (line 19) | def __init__(self, storage_file: Path):
    method _get_favicon_url (line 27) | def _get_favicon_url(self, url: str) -> str:
    method _extract_domain (line 35) | def _extract_domain(self, url: str) -> str:
    method _normalize_url (line 47) | def _normalize_url(self, url: str) -> str:
    method _load_bookmarks (line 57) | def _load_bookmarks(self):
    method get_bookmarks (line 82) | def get_bookmarks(self) -> List[Dict]:
    method _save_bookmarks_unlocked (line 87) | def _save_bookmarks_unlocked(self):
    method _save_bookmarks (line 103) | def _save_bookmarks(self):
    method add_bookmark (line 108) | def add_bookmark(
    method remove_bookmark (line 141) | def remove_bookmark(self, identifier: str) -> bool:
    method update_access_time (line 166) | def update_access_time(self, url: str):
    method get_bookmark_count (line 177) | def get_bookmark_count(self) -> int:
  class BookmarksPlugin (line 182) | class BookmarksPlugin(PluginBase):
    method __init__ (line 188) | def __init__(self):
    method initialize (line 209) | def initialize(self):
    method cleanup (line 214) | def cleanup(self):
    method query (line 220) | def query(self, query_string: str) -> List[Result]:
    method _search_bookmarks (line 261) | def _search_bookmarks(self, query: str) -> List[Result]:
    method _get_recent_bookmarks (line 291) | def _get_recent_bookmarks(self) -> List[Result]:
    method _handle_add_command (line 329) | def _handle_add_command(self, args: str) -> List[Result]:
    method _handle_remove_command (line 429) | def _handle_remove_command(self, identifier: str) -> List[Result]:
    method _show_remove_help (line 487) | def _show_remove_help(self) -> List[Result]:
    method _add_bookmark_action (line 548) | def _add_bookmark_action(self, title: str, url: str, description: str ...
    method _remove_bookmark_action (line 561) | def _remove_bookmark_action(self, identifier: str):
    method _remove_bookmark_with_reset (line 574) | def _remove_bookmark_with_reset(self, identifier: str):
    method _calculate_relevance (line 587) | def _calculate_relevance(self, bookmark: Dict, query: str) -> float:
    method _create_bookmark_result (line 623) | def _create_bookmark_result(
    method _extract_domain (line 677) | def _extract_domain(self, url: str) -> str:
    method _open_bookmark (line 689) | def _open_bookmark(self, url: str):
    method _setup_launcher_hooks (line 702) | def _setup_launcher_hooks(self):
    method _cleanup_launcher_hooks (line 719) | def _cleanup_launcher_hooks(self):
    method _reset_to_trigger (line 726) | def _reset_to_trigger(self):
    method _force_launcher_refresh (line 762) | def _force_launcher_refresh(self):

FILE: modules/launcher/plugins/caffeine.py
  class CaffeinePlugin (line 16) | class CaffeinePlugin(PluginBase):
    method __init__ (line 21) | def __init__(self):
    method initialize (line 38) | def initialize(self):
    method cleanup (line 42) | def cleanup(self):
    method _create_inhibit_action (line 46) | def _create_inhibit_action(self, duration: str):
    method _parse_duration_to_seconds (line 85) | def _parse_duration_to_seconds(self, duration_str: str) -> int:
    method _schedule_expiration_notification (line 101) | def _schedule_expiration_notification(self, duration: str, duration_te...
    method _is_valid_duration (line 118) | def _is_valid_duration(self, query: str) -> bool:
    method _get_default_action (line 128) | def _get_default_action(self, query: str):
    method query (line 134) | def query(self, query_string: str) -> List[Result]:

FILE: modules/launcher/plugins/calculator.py
  class CalculatorPlugin (line 12) | class CalculatorPlugin(PluginBase):
    method __init__ (line 17) | def __init__(self):
    method initialize (line 59) | def initialize(self):
    method _cleanup_cache (line 63) | def _cleanup_cache(self):
    method query (line 70) | def query(self, query: str) -> List[Result]:
    method _format_cache_age (line 140) | def _format_cache_age(self, age_seconds: float) -> str:
    method _copy_to_clipboard (line 149) | def _copy_to_clipboard(self, text: str):
    method cleanup (line 160) | def cleanup(self):

FILE: modules/launcher/plugins/clipboard.py
  class ClipboardPlugin (line 16) | class ClipboardPlugin(PluginBase):
    method __init__ (line 17) | def __init__(self):
    method initialize (line 45) | def initialize(self):
    method cleanup (line 58) | def cleanup(self):
    method invalidate_cache (line 78) | def invalidate_cache(self):
    method _force_launcher_refresh (line 85) | def _force_launcher_refresh(self):
    method _load_clipboard_items_cached (line 136) | def _load_clipboard_items_cached(self) -> List[str]:
    method _load_clipboard_items (line 184) | def _load_clipboard_items(self) -> List[str]:
    method _create_pixbuf_from_bytes (line 188) | def _create_pixbuf_from_bytes(
    method _is_image_data (line 213) | def _is_image_data(self, content: str) -> bool:
    method _get_text_preview (line 226) | def _get_text_preview(self, content: str) -> str:
    method _load_image_preview_cached (line 232) | def _load_image_preview_cached(self, item_id: str) -> Optional[GdkPixb...
    method _load_image_preview_async (line 256) | def _load_image_preview_async(self, item_id: str) -> Optional[GdkPixbu...
    method query (line 260) | def query(self, query_string: str) -> List[Result]:
    method _copy_to_clipboard (line 409) | def _copy_to_clipboard(self, entry_id: str):

FILE: modules/launcher/plugins/emoji.py
  class EmojiPlugin (line 14) | class EmojiPlugin(PluginBase):
    method __init__ (line 19) | def __init__(self):
    method initialize (line 32) | def initialize(self):
    method cleanup (line 38) | def cleanup(self):
    method _load_emoji_data (line 42) | def _load_emoji_data(self):
    method _load_recent_emojis (line 53) | def _load_recent_emojis(self):
    method _save_recent_emojis (line 69) | def _save_recent_emojis(self):
    method _add_to_recent (line 80) | def _add_to_recent(self, emoji: str):
    method _copy_to_clipboard (line 97) | def _copy_to_clipboard(self, emoji: str):
    method query (line 117) | def query(self, query_string: str) -> List[Result]:
    method _create_emoji_result (line 170) | def _create_emoji_result(self, emoji: str, info: Dict, relevance: floa...

FILE: modules/launcher/plugins/otp.py
  class OTPPlugin (line 20) | class OTPPlugin(PluginBase):
    method __init__ (line 23) | def __init__(self):
    method initialize (line 38) | def initialize(self):
    method cleanup (line 45) | def cleanup(self):
    method _load_secrets (line 51) | def _load_secrets(self):
    method _save_secrets (line 63) | def _save_secrets(self):
    method _ensure_config_file (line 72) | def _ensure_config_file(self):
    method _start_refresh_thread (line 79) | def _start_refresh_thread(self):
    method _selective_force_refresh (line 97) | def _selective_force_refresh(self):
    method _update_existing_result_labels (line 133) | def _update_existing_result_labels(self, results_box):
    method _update_result_item_content (line 150) | def _update_result_item_content(self, result_item, time_display):
    method _find_and_update_title_label (line 179) | def _find_and_update_title_label(self, result_item, new_title):
    method _find_and_update_subtitle_label (line 196) | def _find_and_update_subtitle_label(self, result_item, new_markup):
    method _copy_to_clipboard (line 216) | def _copy_to_clipboard(self, text: str):
    method _trigger_refresh (line 230) | def _trigger_refresh(self):
    method _remove_account_and_refresh (line 282) | def _remove_account_and_refresh(self, account_name: str):
    method _generate_totp (line 295) | def _generate_totp(self, secret: str) -> Optional[str]:
    method _get_time_remaining_with_blink (line 299) | def _get_time_remaining_with_blink(self) -> str:
    method query (line 303) | def query(self, query_string: str) -> List[Result]:
    method _handle_direct_add (line 348) | def _handle_direct_add(self, account_name: str, secret_or_uri: str) ->...
    method _list_otp_codes (line 382) | def _list_otp_codes(self) -> List[Result]:
    method _search_accounts (line 459) | def _search_accounts(self, query: str) -> List[Result]:
    method _handle_add_command (line 527) | def _handle_add_command(self, account_name: str) -> List[Result]:
    method _handle_qr_command (line 585) | def _handle_qr_command(self, account_name: str) -> List[Result]:
    method _scan_qr_and_add_account (line 623) | def _scan_qr_and_add_account(self, account_name: str):
    method _scan_qr_async (line 635) | def _scan_qr_async(self, account_name: str):
    method _handle_remove_command (line 648) | def _handle_remove_command(self, account_name: str) -> List[Result]:
    method _handle_base32_secret (line 769) | def _handle_base32_secret(self, account_name: str, secret: str) -> Lis...
    method _handle_otpauth_uri (line 809) | def _handle_otpauth_uri(self, account_name: str, uri: str) -> List[Res...

FILE: modules/launcher/plugins/password.py
  class PasswordManager (line 15) | class PasswordManager:
    method __init__ (line 18) | def __init__(self, storage_file: Path):
    method _simple_encrypt (line 26) | def _simple_encrypt(self, text: str, key: str = "modus_pass") -> str:
    method _simple_decrypt (line 39) | def _simple_decrypt(self, encrypted_text: str, key: str = "modus_pass"...
    method _load_passwords (line 56) | def _load_passwords(self):
    method _save_passwords (line 78) | def _save_passwords(self):
    method add_password (line 95) | def add_password(self, name: str, password: str, description: str = ""...
    method get_password (line 111) | def get_password(self, name: str, update_access_time: bool = True) -> ...
    method remove_password (line 132) | def remove_password(self, name: str) -> bool:
    method list_passwords (line 140) | def list_passwords(self) -> List[str]:
    method get_password_info (line 146) | def get_password_info(self, name: str) -> Optional[Dict]:
  class PasswordPlugin (line 155) | class PasswordPlugin(PluginBase):
    method __init__ (line 161) | def __init__(self):
    method initialize (line 183) | def initialize(self):
    method cleanup (line 188) | def cleanup(self):
    method query (line 195) | def query(self, query_string: str) -> List[Result]:
    method _list_all_passwords (line 233) | def _list_all_passwords(self) -> List[Result]:
    method _handle_add_command (line 302) | def _handle_add_command(self, query_string: str) -> List[Result]:
    method _handle_remove_command (line 358) | def _handle_remove_command(self, query_string: str) -> List[Result]:
    method _search_passwords (line 406) | def _search_passwords(self, query: str) -> List[Result]:
    method _add_password_action (line 480) | def _add_password_action(
    method _remove_password_action (line 507) | def _remove_password_action(self, name: str):
    method _copy_password_to_clipboard (line 534) | def _copy_password_to_clipboard(self, name: str):
    method _reveal_password (line 578) | def _reveal_password(self, name: str):
    method _hide_password (line 593) | def _hide_password(self, name: str):
    method _hide_all_passwords (line 597) | def _hide_all_passwords(self):
    method _setup_launcher_hooks (line 604) | def _setup_launcher_hooks(self):
    method _cleanup_launcher_hooks (line 625) | def _cleanup_launcher_hooks(self):
    method _wrapped_close_launcher (line 635) | def _wrapped_close_launcher(self):
    method _toggle_password_visibility (line 643) | def _toggle_password_visibility(self, name: str):
    method _force_launcher_refresh (line 666) | def _force_launcher_refresh(self):

FILE: modules/launcher/plugins/power.py
  class PowerPlugin (line 8) | class PowerPlugin(PluginBase):
    method __init__ (line 13) | def __init__(self):
    method initialize (line 45) | def initialize(self):
    method cleanup (line 49) | def cleanup(self):
    method query (line 53) | def query(self, query_string: str) -> List[Result]:
    method shutdown (line 88) | def shutdown(self, *args) -> None:
    method restart (line 91) | def restart(self, *args) -> None:
    method lock (line 94) | def lock(self, *args) -> None:
    method suspend (line 97) | def suspend(self, *args) -> None:
    method logout (line 100) | def logout(self, *args) -> None:

FILE: modules/launcher/plugins/reminders.py
  class Reminder (line 11) | class Reminder:
    method __init__ (line 16) | def __init__(
    method cancel (line 29) | def cancel(self):
    method get_time_remaining (line 34) | def get_time_remaining(self) -> str:
    method get_target_time_str (line 54) | def get_target_time_str(self) -> str:
  class RemindersPlugin (line 59) | class RemindersPlugin(PluginBase):
    method __init__ (line 64) | def __init__(self):
    method initialize (line 81) | def initialize(self):
    method cleanup (line 85) | def cleanup(self):
    method _send_notification (line 92) | def _send_notification(self, title: str, message: str):
    method _parse_time_input (line 102) | def _parse_time_input(self, time_str: str) -> Optional[datetime]:
    method _create_reminder (line 167) | def _create_reminder(self, time_str: str, message: str) -> Optional[Re...
    method _trigger_reminder (line 193) | def _trigger_reminder(self, reminder_id: int, message: str):
    method _cancel_reminder (line 202) | def _cancel_reminder(self, reminder_id: Optional[int] = None) -> int:
    method _format_time_remaining (line 218) | def _format_time_remaining(self, total_seconds: float) -> str:
    method _create_and_confirm_reminder (line 233) | def _create_and_confirm_reminder(self, time_str: str, message: str):
    method query (line 246) | def query(self, query_string: str) -> List[Result]:

FILE: modules/launcher/plugins/screencapture.py
  class ScreencapturePlugin (line 9) | class ScreencapturePlugin(PluginBase):
    method __init__ (line 14) | def __init__(self):
    method initialize (line 20) | def initialize(self):
    method cleanup (line 24) | def cleanup(self):
    method get_commands (line 28) | def get_commands(self):
    method _run_script (line 88) | def _run_script(self, *args):
    method _run_script_with_file (line 95) | def _run_script_with_file(self, format_type: str, file_path: str):
    method _is_recording (line 102) | def _is_recording(self):
    method _get_command_result (line 112) | def _get_command_result(self, command: str) -> Result:
    method query (line 432) | def query(self, query_string: str) -> List[Result]:

FILE: modules/launcher/plugins/system.py
  class SystemPlugin (line 14) | class SystemPlugin(PluginBase):
    method __init__ (line 19) | def __init__(self):
    method initialize (line 36) | def initialize(self):
    method cleanup (line 42) | def cleanup(self):
    method _load_bin_cache (line 49) | def _load_bin_cache(self):
    method _save_bin_cache (line 66) | def _save_bin_cache(self):
    method _start_background_cache_update (line 83) | def _start_background_cache_update(self):
    method _build_bin_cache_background (line 99) | def _build_bin_cache_background(self):
    method query (line 135) | def query(self, query_string: str) -> List[Result]:
    method _create_action (line 223) | def _create_action(self, command: Union[str, List[str]]):
    method _execute_command (line 231) | def _execute_command(self, command: Union[str, List[str]]):

FILE: modules/launcher/plugins/tmux.py
  class TmuxPlugin (line 12) | class TmuxPlugin(PluginBase):
    method __init__ (line 17) | def __init__(self):
    method initialize (line 35) | def initialize(self):
    method cleanup (line 40) | def cleanup(self):
    method _start_refresh_thread (line 47) | def _start_refresh_thread(self):
    method _refresh_sessions_background (line 55) | def _refresh_sessions_background(self):
    method _get_tmux_sessions (line 75) | def _get_tmux_sessions(self):
    method query (line 97) | def query(self, query_string: str) -> List[Result]:
    method _create_attach_session_result (line 164) | def _create_attach_session_result(self, session_name: str) -> Result:
    method _create_new_session_result (line 175) | def _create_new_session_result(self, session_name: str = "") -> Result:
    method _create_kill_session_result (line 189) | def _create_kill_session_result(self, session_name: str) -> Result:
    method _create_rename_session_result (line 200) | def _create_rename_session_result(self, old_name: str, new_name: str) ...
    method _attach_to_session (line 211) | def _attach_to_session(self, session_name: str):
    method _create_session (line 222) | def _create_session(self, session_name: str = ""):
    method _kill_session (line 255) | def _kill_session(self, session_name: str):
    method _rename_session (line 270) | def _rename_session(self, old_name: str, new_name: str):
    method _get_terminal_command (line 290) | def _get_terminal_command(self, cmd: str) -> str:

FILE: modules/launcher/plugins/wallpaper.py
  class WallpaperPlugin (line 21) | class WallpaperPlugin(PluginBase):
    method __init__ (line 26) | def __init__(self):
    method initialize (line 44) | def initialize(self):
    method cleanup (line 52) | def cleanup(self):
    method _load_wallpapers (line 56) | def _load_wallpapers(self):
    method _is_image (line 68) | def _is_image(self, filename: str) -> bool:
    method _get_matugen_state (line 74) | def _get_matugen_state(self) -> bool:
    method _set_matugen_state (line 90) | def _set_matugen_state(self, enabled: bool):
    method _clear_launcher_query (line 123) | def _clear_launcher_query(self):
    method _get_cache_path (line 170) | def _get_cache_path(self, filename: str) -> str:
    method _create_thumbnail (line 175) | def _create_thumbnail(self, filename: str) -> str:
    method _start_background_thumbnail_creation (line 192) | def _start_background_thumbnail_creation(self):
    method _get_thumbnail_fast (line 228) | def _get_thumbnail_fast(self, filename: str) -> Optional[GdkPixbuf.Pix...
    method _set_wallpaper (line 277) | def _set_wallpaper(self, filename: str, scheme: str = None):
    method _set_random_wallpaper (line 302) | def _set_random_wallpaper(self):
    method _hsl_to_rgb_hex (line 317) | def _hsl_to_rgb_hex(self, h: float, s: float = 1.0, l: float = 0.5) ->...
    method _is_valid_hex_color (line 325) | def _is_valid_hex_color(self, hex_color: str) -> bool:
    method _get_current_scheme (line 331) | def _get_current_scheme(self) -> str:
    method _set_current_scheme (line 344) | def _set_current_scheme(self, scheme: str):
    method _apply_hex_color (line 408) | def _apply_hex_color(self, hex_color: str, scheme: str = None):
    method _apply_hex_color_direct (line 418) | def _apply_hex_color_direct(self, hex_color: str, scheme: str = None):
    method _generate_random_hex_color (line 435) | def _generate_random_hex_color(self) -> str:
    method _get_status_indicators (line 440) | def _get_status_indicators(self) -> tuple:
    method query (line 457) | def query(self, query_string: str) -> List[Result]:

FILE: modules/launcher/plugins/websearch.py
  class WebSearchPlugin (line 9) | class WebSearchPlugin(PluginBase):
    method __init__ (line 14) | def __init__(self):
    method initialize (line 75) | def initialize(self):
    method get_active_trigger (line 85) | def get_active_trigger(self, query_string: str) -> str:
    method cleanup (line 92) | def cleanup(self):
    method query (line 96) | def query(self, query_string: str) -> List[Result]:
    method _parse_engine_query (line 137) | def _parse_engine_query(self, query: str) -> tuple[str, str]:
    method _is_url (line 149) | def _is_url(self, text: str) -> bool:
    method _create_url_result (line 156) | def _create_url_result(self, url: str) -> Result:
    method _open_url (line 175) | def _open_url(self, url: str):
    method _get_search_engine_list (line 184) | def _get_search_engine_list(self) -> List[Result]:
    method _create_search_result (line 202) | def _create_search_result(self, engine_id: str, query: str) -> Result:
    method _create_engine_info_result (line 216) | def _create_engine_info_result(self, engine_id: str) -> Result:
    method _perform_search (line 230) | def _perform_search(self, engine_id: str, query: str):
    method _show_engine_help (line 253) | def _show_engine_help(self, engine_id: str):

FILE: modules/launcher/result.py
  class Result (line 8) | class Result:
    method activate (line 32) | def activate(self):
    method __post_init__ (line 39) | def __post_init__(self):
    method __str__ (line 48) | def __str__(self):
    method __repr__ (line 51) | def __repr__(self):

FILE: modules/launcher/result_item.py
  class ResultItem (line 12) | class ResultItem(EventBox):
    method clicked (line 19) | def clicked(self, index: int) -> None:
    method hovered (line 24) | def hovered(self, index: int) -> None:
    method __init__ (line 28) | def __init__(
    method _setup_ui (line 48) | def _setup_ui(self):
    method set_selected (line 134) | def set_selected(self, selected: bool):
    method get_selected (line 143) | def get_selected(self) -> bool:
    method _on_button_press (line 147) | def _on_button_press(self, widget, event):
    method _on_enter (line 154) | def _on_enter(self, widget, event):
    method _on_leave (line 160) | def _on_leave(self, widget, event):

FILE: modules/launcher/trigger_config.py
  class TriggerConfig (line 8) | class TriggerConfig:
    method __init__ (line 9) | def __init__(self, config_path: str = None):
    method get_trigger_examples (line 36) | def get_trigger_examples(self, trigger: str) -> List[str]:
    method get_trigger_icon (line 45) | def get_trigger_icon(self, trigger: str) -> str:
    method get_trigger_description (line 51) | def get_trigger_description(self, trigger: str) -> str:
    method get_all_triggers (line 56) | def get_all_triggers(self) -> Dict[str, Dict[str, Any]]:

FILE: modules/notification/notification.py
  function ensure_notification_cache_dirs (line 51) | def ensure_notification_cache_dirs():
  function cleanup_old_cache_files (line 56) | def cleanup_old_cache_files():
  function get_unified_cache_key (line 79) | def get_unified_cache_key(source_data, size=None, app_name=None):
  function save_pixbuf_to_cache (line 114) | def save_pixbuf_to_cache(pixbuf, cache_key, cache_dir):
  function get_cached_pixbuf (line 132) | def get_cached_pixbuf(cache_key, fallback_size=(48, 48), cache_dir=None):
  function cache_notification_icon (line 150) | def cache_notification_icon(source, size=(48, 48), app_name=None):
  function load_and_cache_local_icon (line 205) | def load_and_cache_local_icon(file_path, cache_key, size):
  function load_and_cache_theme_icon (line 220) | def load_and_cache_theme_icon(icon_name, cache_key, size):
  function get_fallback_notification_icon (line 227) | def get_fallback_notification_icon(size=(48, 48)):
  function get_notification_image_cache_key (line 245) | def get_notification_image_cache_key(notification_id, image_pixbuf):
  function cache_notification_image (line 271) | def cache_notification_image(notification_id, image_pixbuf, size=(64, 64)):
  function get_cached_notification_image (line 302) | def get_cached_notification_image(cache_key):
  function cleanup_notification_image_cache (line 313) | def cleanup_notification_image_cache(cache_key=None):
  function cleanup_notification_specific_caches (line 338) | def cleanup_notification_specific_caches(
  function cleanup_all_notification_caches (line 362) | def cleanup_all_notification_caches():
  function verify_cache_persistence (line 385) | def verify_cache_persistence():
  function migrate_persistent_notifications (line 435) | def migrate_persistent_notifications():
  function preload_notification_assets (line 488) | def preload_notification_assets(notification):
  function smooth_revealer_animation (line 511) | def smooth_revealer_animation(revealer: SlideRevealer, duration: int = 2...
  class ActionButton (line 516) | class ActionButton(Button):
    method __init__ (line 517) | def __init__(
    method on_clicked (line 543) | def on_clicked(self, *_):
  class NotificationWidget (line 550) | class NotificationWidget(Box):
    method __init__ (line 551) | def __init__(
    method create_header (line 590) | def create_header(self, notification):
    method create_content (line 641) | def create_content(self, notification):
    method _on_enter_notify (line 708) | def _on_enter_notify(self, widget, event):
    method _on_leave_notify (line 715) | def _on_leave_notify(self, widget, event):
    method get_pixbuf (line 722) | def get_pixbuf(self, icon_path, width, height):
    method _get_notification_pixbuf (line 750) | def _get_notification_pixbuf(self, notification):
    method create_action_buttons (line 782) | def create_action_buttons(self, notification):
    method start_timeout (line 793) | def start_timeout(self):
    method stop_timeout (line 797) | def stop_timeout(self):
    method close_notification (line 802) | def close_notification(self):
    method pause_timeout (line 807) | def pause_timeout(self):
    method resume_timeout (line 810) | def resume_timeout(self):
    method _manual_close (line 814) | def _manual_close(self):
    method destroy (line 818) | def destroy(self):
    method set_pointer_cursor (line 834) | def set_pointer_cursor(self, widget, cursor_name):
    method hover_button (line 840) | def hover_button(self, button):
    method unhover_button (line 844) | def unhover_button(self, button):
  class NotificationRevealer (line 849) | class NotificationRevealer(SlideRevealer):
    method __init__ (line 850) | def __init__(
    method _ease_out_cubic (line 907) | def _ease_out_cubic(self, t):
    method _ease_out_quart (line 911) | def _ease_out_quart(self, t):
    method _apply_transform (line 915) | def _apply_transform(self, offset_x, opacity, scale):
    method _animate_dismiss (line 944) | def _animate_dismiss(self, start_offset):
    method _calculate_drag_velocity (line 985) | def _calculate_drag_velocity(self, current_x):
    method _on_animation_complete (line 997) | def _on_animation_complete(self, is_hiding=False):
    method on_resolved (line 1006) | def on_resolved(
    method destroy (line 1039) | def destroy(self):
  class NotificationState (line 1046) | class NotificationState:
  class ModusNoti (line 1053) | class ModusNoti(Window):
    method __init__ (line 1054) | def __init__(self):
    method on_new_notification (line 1089) | def on_new_notification(self, fabric_notif, id):
    method _process_notification_queue_debounced (line 1128) | def _process_notification_queue_debounced(self):
    method _process_notification_queue (line 1134) | def _process_notification_queue(self):
    method _start_smooth_transition (line 1152) | def _start_smooth_transition(self):
    method _show_next_notification (line 1167) | def _show_next_notification(self):
    method _on_notification_finished (line 1216) | def _on_notification_finished(self, notification_box):
    method show_next_notification (line 1246) | def show_next_notification(self):
    method on_notification_finished (line 1250) | def on_notification_finished(self, notification_box):
    method clear_notification_queue (line 1254) | def clear_notification_queue(self):
    method get_queue_length (line 1280) | def get_queue_length(self):

FILE: modules/notification/notification_center.py
  class ExpandableNotificationGroup (line 32) | class ExpandableNotificationGroup(Box):
    method __init__ (line 33) | def __init__(self, app_name, notifications, **kwargs):
    method create_collapsed_state (line 52) | def create_collapsed_state(self):
    method _get_notification_pixbuf_for_group (line 166) | def _get_notification_pixbuf_for_group(self, cached_notification):
    method create_expanded_state (line 228) | def create_expanded_state(self):
    method on_clicked (line 315) | def on_clicked(self, widget, event):
    method expand (line 322) | def expand(self, *args):
    method collapse (line 338) | def collapse(self, *args):
    method _show_collapsed_midway (line 356) | def _show_collapsed_midway(self):
    method _complete_collapse (line 362) | def _complete_collapse(self):
    method close_all (line 366) | def close_all(self, *args):
    method _close_single_notification (line 396) | def _close_single_notification(self, notification):
    method _close_single_notification_and_stop_propagation (line 425) | def _close_single_notification_and_stop_propagation(self, notification):
  class NotificationCenterWidget (line 451) | class NotificationCenterWidget(NotificationWidget):
    method __init__ (line 452) | def __init__(self, notification, **kwargs):
    method _get_notification_pixbuf (line 464) | def _get_notification_pixbuf(self, notification):
    method create_content (line 517) | def create_content(self, notification):
    method create_action_buttons (line 592) | def create_action_buttons(self, notification):
    method _on_close_clicked (line 595) | def _on_close_clicked(self, *args):
    method start_timeout (line 621) | def start_timeout(self):
    method stop_timeout (line 625) | def stop_timeout(self):
    method close_notification (line 629) | def close_notification(self):
  class NotificationCenter (line 633) | class NotificationCenter(Window):
    method __init__ (line 634) | def __init__(self):
    method _rebuild_notification_groups (line 705) | def _rebuild_notification_groups(self):
    method on_notification_added (line 757) | def on_notification_added(self, service, cached_notification):
    method _refresh_group_widget (line 820) | def _refresh_group_widget(self, group_widget):
    method on_notification_removed (line 834) | def on_notification_removed(self, service, cached_notification):
    method on_clear_all (line 871) | def on_clear_all(self, service):
    method on_count_changed (line 885) | def on_count_changed(self, service, count=None):
    method clear_all_notifications (line 895) | def clear_all_notifications(self, *_):
    method _on_escape_pressed (line 906) | def _on_escape_pressed(self, *_):
    method _init_mousecapture (line 910) | def _init_mousecapture(self, mousecapture):
    method _set_mousecapture (line 913) | def _set_mousecapture(self, visible):
    method _on_destroy (line 921) | def _on_destroy(self, *_):

FILE: modules/notification/unified_cache.py
  function ensure_cache_dir (line 16) | def ensure_cache_dir():
  function get_unified_cache_key (line 21) | def get_unified_cache_key(source_data, size=None, app_name=None):
  function save_to_cache (line 52) | def save_to_cache(pixbuf, cache_key, size=None):
  function get_from_cache (line 77) | def get_from_cache(cache_key, size=None):
  function cleanup_cache (line 94) | def cleanup_cache(cache_key=None):
  function cleanup_old_cache_files (line 121) | def cleanup_old_cache_files():
  function verify_cache_persistence (line 144) | def verify_cache_persistence():
  function get_fallback_icon (line 175) | def get_fallback_icon(size=(48, 48)):

FILE: modules/osd.py
  class AnimatedScale (line 18) | class AnimatedScale(Scale):
    method __init__ (line 19) | def __init__(self, **kwargs):
    method animate_value (line 23) | def animate_value(self, value: float):
  class BrightnessOSDContainer (line 39) | class BrightnessOSDContainer(Box):
    method __init__ (line 40) | def __init__(self, **kwargs):
    method update_brightness (line 68) | def update_brightness(self) -> None:
    method get_svg (line 74) | def get_svg(self, value):
    method on_brightness_changed (line 78) | def on_brightness_changed(self, _sender: any, value: float, *_args) ->...
    method _normalize_brightness (line 89) | def _normalize_brightness(self, brightness: float) -> float:
  class AudioOSDContainer (line 93) | class AudioOSDContainer(Box):
    method __init__ (line 98) | def __init__(self, **kwargs):
    method _connect_speaker_signals (line 137) | def _connect_speaker_signals(self):
    method on_speaker_stream_changed (line 143) | def on_speaker_stream_changed(self, *_):
    method get_svg (line 167) | def get_svg(self, value):
    method sync_with_audio (line 171) | def sync_with_audio(self):
    method on_volume_changed (line 186) | def on_volume_changed(self, *_):
    method update_volume_display (line 194) | def update_volume_display(self, volume=None):
    method on_audio_speaker_changed (line 225) | def on_audio_speaker_changed(self, *_):
    method on_speaker_changed (line 229) | def on_speaker_changed(self, *_):
    method update_volume (line 233) | def update_volume(self, *_):
  class MicrophoneOSDContainer (line 244) | class MicrophoneOSDContainer(Box):
    method __init__ (line 249) | def __init__(self, **kwargs):
    method _connect_microphone_signals (line 284) | def _connect_microphone_signals(self):
    method on_microphone_stream_changed (line 290) | def on_microphone_stream_changed(self, *_):
    method get_svg (line 314) | def get_svg(self, value):
    method sync_with_audio (line 318) | def sync_with_audio(self):
    method on_volume_changed (line 333) | def on_volume_changed(self, *_):
    method update_volume_display (line 341) | def update_volume_display(self, volume=None):
    method on_audio_microphone_changed (line 374) | def on_audio_microphone_changed(self, *_):
    method on_microphone_changed (line 378) | def on_microphone_changed(self, *_):
    method update_volume (line 382) | def update_volume(self, *_):
  class OSD (line 393) | class OSD(Window):
    method __init__ (line 394) | def __init__(self, **kwargs):
    method show_audio (line 435) | def show_audio(self, *_):
    method show_brightness (line 439) | def show_brightness(self, *_):
    method show_microphone (line 443) | def show_microphone(self, *_):
    method show_box (line 447) | def show_box(self, box_to_show: Literal["audio", "brightness", "microp...
    method start_hide_timer (line 458) | def start_hide_timer(self):
    method reset_inactivity_timer (line 461) | def reset_inactivity_timer(self):
    method check_inactivity (line 464) | def check_inactivity(self):

FILE: modules/panel/components/enhanced_system_tray.py
  function patched_do_update_properties (line 17) | def patched_do_update_properties(self, *_):
  function _try_load_icon_from_path (line 56) | def _try_load_icon_from_path(self, icon_path):
  function _set_tooltip (line 142) | def _set_tooltip(self):
  function apply_enhanced_system_tray (line 151) | def apply_enhanced_system_tray():

FILE: modules/panel/components/indicators.py
  class BluetoothIndicator (line 19) | class BluetoothIndicator(Box):
    method __init__ (line 20) | def __init__(self, show_window=True, **kwargs):
    method update_state (line 72) | def update_state(self):
    method on_bluetooth_changed (line 110) | def on_bluetooth_changed(self, service, new_bluetooth_state):
    method on_bluetooth_direct_changed (line 113) | def on_bluetooth_direct_changed(self, *args):
    method on_device_added (line 117) | def on_device_added(self, _, address):
    method on_device_removed (line 121) | def on_device_removed(self, _, address):
    method update_modus_service_bluetooth_state (line 125) | def update_modus_service_bluetooth_state(self):
    method on_bluetooth_clicked (line 146) | def on_bluetooth_clicked(self, *args):
    method close_bluetooth (line 151) | def close_bluetooth(self, *args):
    method hide_controlcenter (line 156) | def hide_controlcenter(self, *args):
  class NetworkIndicator (line 162) | class NetworkIndicator(Box):
    method __init__ (line 163) | def __init__(self, show_window=True, **kwargs):
    method on_wlan_changed (line 220) | def on_wlan_changed(self, service, new_wlan_state):
    method on_wifi_device_added (line 223) | def on_wifi_device_added(self, *args):
    method on_ethernet_device_added (line 232) | def on_ethernet_device_added(self, *args):
    method on_network_direct_changed (line 241) | def on_network_direct_changed(self, *args):
    method on_network_changed (line 245) | def on_network_changed(self, *args):
    method update_modus_service_wlan_state (line 249) | def update_modus_service_wlan_state(self):
    method update_state (line 279) | def update_state(self):
    method on_wifi_clicked (line 323) | def on_wifi_clicked(self, *args):
    method close_wifi (line 328) | def close_wifi(self, *args):
    method hide_controlcenter (line 333) | def hide_controlcenter(self, *args):
  class BatteryIndicator (line 339) | class BatteryIndicator(Box):
    method __init__ (line 340) | def __init__(self, show_window=True, **kwargs):
    method on_battery_changed (line 396) | def on_battery_changed(self, service, new_battery_state):
    method on_battery_direct_changed (line 399) | def on_battery_direct_changed(self, *args):
    method update_modus_service_battery_state (line 403) | def update_modus_service_battery_state(self):
    method get_battery_tooltip (line 423) | def get_battery_tooltip(self, percentage, state):
    method update_state (line 440) | def update_state(self):
    method on_battery_clicked (line 464) | def on_battery_clicked(self, *args):
    method close_battery (line 469) | def close_battery(self, *args):
    method hide_controlcenter (line 474) | def hide_controlcenter(self, *args):

FILE: modules/panel/components/menubar.py
  function show_about_app (line 19) | def show_about_app():
  function dropdown_option (line 57) | def dropdown_option(
  class SystemDropdown (line 104) | class SystemDropdown(ModusDropdown):
    method __init__ (line 105) | def __init__(self, parent, **kwargs):
  class MenuBarDropdowns (line 132) | class MenuBarDropdowns:
    method __init__ (line 133) | def __init__(self, parent):
    method _on_title_button_clicked (line 310) | def _on_title_button_clicked(self, _):
    method _on_active_app_changed (line 341) | def _on_active_app_changed(self, _, value):
    method hide_dropdowns (line 346) | def hide_dropdowns(self, *_):
    method changed_dropdown (line 356) | def changed_dropdown(self, _, dropdown_id):
  class MenuBar (line 379) | class MenuBar(Box):
    method __init__ (line 382) | def __init__(self, parent_window=None, **kwargs):
    method show_system_dropdown (line 403) | def show_system_dropdown(self, imac_button):

FILE: modules/panel/components/recording_indicator.py
  class RecordingIndicator (line 13) | class RecordingIndicator(Button):
    method __init__ (line 14) | def __init__(self, **kwargs):
    method on_button_press (line 56) | def on_button_press(self, *args):
    method is_recorder_running (line 60) | def is_recorder_running(self):
    method check_recording_status (line 78) | def check_recording_status(self):
    method update_timer_display (line 110) | def update_timer_display(self):
    method cleanup_recording_state (line 130) | def cleanup_recording_state(self):
    method get_recording_start_time (line 137) | def get_recording_start_time(self):
    method on_stop_recording (line 168) | def on_stop_recording(self, *args):
    method _verify_recording_stopped (line 192) | def _verify_recording_stopped(self):
    method _delayed_init (line 216) | def _delayed_init(self):
    method destroy (line 227) | def destroy(self):

FILE: modules/panel/main.py
  class Panel (line 33) | class Panel(Window):
    method __init__ (line 34) | def __init__(self, **kwargs):
    method search_apps (line 196) | def search_apps(self):
    method toggle_tray (line 199) | def toggle_tray(self, *_):
    method on_dnd_changed (line 212) | def on_dnd_changed(self, _, dnd_state):
    method on_notification_count_changed (line 216) | def on_notification_count_changed(self, service, *args):
    method on_notification_icon_clicked (line 220) | def on_notification_icon_clicked(self, *args):
    method on_datetime_clicked (line 228) | def on_datetime_clicked(self, *args):
    method update_notification_icon (line 232) | def update_notification_icon(self):

FILE: modules/switcher.py
  class ApplicationSwitcher (line 20) | class ApplicationSwitcher(Window):
    method __init__ (line 21) | def __init__(self, **kwargs):
    method show_switcher (line 81) | def show_switcher(self) -> None:
    method hide_switcher (line 90) | def hide_switcher(self) -> None:
    method _on_glace_client_added (line 94) | def _on_glace_client_added(self, _, client):
    method _on_glace_client_removed (line 104) | def _on_glace_client_removed(self, _, client):
    method _find_glace_client_for_window (line 113) | def _find_glace_client_for_window(self, window):
    method create_preview_for_window (line 149) | def create_preview_for_window(self, window):
    method _set_fallback_icon (line 186) | def _set_fallback_icon(self, image_widget, window):
    method _is_special_workspace (line 196) | def _is_special_workspace(self, client):
    method update_windows (line 199) | def update_windows(self) -> None:
    method on_key_press (line 297) | def on_key_press(self, _, event):
    method on_key_release (line 354) | def on_key_release(self, _, event):
    method update_selection (line 368) | def update_selection(self):
    method activate_selected (line 377) | def activate_selected(self):
    method grab_keyboard (line 390) | def grab_keyboard(self):
    method ungrab_keyboard (line 399) | def ungrab_keyboard(self):

FILE: modules/todo/todo_widget.py
  class TodoItem (line 21) | class TodoItem(Box):
    method __init__ (line 24) | def __init__(self, todo_data, todo_list_widget, **kwargs):
    method _build_ui (line 39) | def _build_ui(self):
    method _toggle_completion (line 155) | def _toggle_completion(self, *_):
    method _cycle_priority (line 159) | def _cycle_priority(self, *_):
    method _start_edit (line 166) | def _start_edit(self, *_):
    method _save_edit (line 180) | def _save_edit(self, *_):
    method _cancel_edit (line 191) | def _cancel_edit(self):
    method _delete_todo (line 200) | def _delete_todo(self, *_):
    method update_from_data (line 204) | def update_from_data(self, todo_data):
  class TodoListWidget (line 238) | class TodoListWidget(Window):
    method __init__ (line 241) | def __init__(self, **kwargs):
    method _build_ui (line 264) | def _build_ui(self):
    method _add_todo (line 363) | def _add_todo(self, *_):
    method _clear_completed (line 370) | def _clear_completed(self, *_):
    method _on_todo_event (line 374) | def _on_todo_event(self, event_type, data=None):
    method _refresh_todos (line 389) | def _refresh_todos(self, *_):
    method _update_stats (line 420) | def _update_stats(self):
    method set_visible (line 426) | def set_visible(self, visible):
    method hide_todo_list (line 430) | def hide_todo_list(self, *_):
    method _init_mousecapture (line 436) | def _init_mousecapture(self, mousecapture):
    method destroy (line 440) | def destroy(self):
  class TodoListCapture (line 448) | class TodoListCapture(MouseCapture):
    method __init__ (line 451) | def __init__(self, **kwargs):

FILE: modules/widget.py
  function get_location (line 160) | def get_location() -> str:
  function get_coordinates (line 179) | def get_coordinates(city: str) -> Optional[Tuple[float, float]]:
  function get_weather_data (line 210) | def get_weather_data(lat: float, lon: float) -> Optional[Dict[str, Any]]:
  function format_weather_data (line 231) | def format_weather_data(weather_data: Dict[str, Any], city: str) -> List...
  function get_weather (line 257) | def get_weather(callback):
  function update_weather (line 299) | def update_weather(widget):
  function update_widget (line 310) | def update_widget(widget, weather_info):
  class Weather (line 317) | class Weather(Box):
    method __init__ (line 320) | def __init__(self, parent, **kwargs):
    method _create_labels (line 341) | def _create_labels(self):
    method _layout_labels (line 362) | def _layout_labels(self):
    method update_labels (line 374) | def update_labels(self, weather_info: List[str]):
  class WeatherContainer (line 400) | class WeatherContainer(Box):
    method __init__ (line 403) | def __init__(self, **kwargs):
  class Date (line 417) | class Date(Box):
    method __init__ (line 420) | def __init__(self, **kwargs):
  class DateContainer (line 450) | class DateContainer(Box):
    method __init__ (line 453) | def __init__(self, **kwargs):
  class Calendar (line 466) | class Calendar(Box):
    method __init__ (line 469) | def __init__(self, **kwargs):
    method _update_current_date (line 496) | def _update_current_date(self):
    method _create_header (line 503) | def _create_header(self):
    method _create_days_header (line 512) | def _create_days_header(self):
    method _create_calendar_grid (line 533) | def _create_calendar_grid(self):
    method update_calendar_if_needed (line 538) | def update_calendar_if_needed(self) -> bool:
    method update_calendar (line 551) | def update_calendar(self):
  class CalendarContainer (line 601) | class CalendarContainer(Box):
    method __init__ (line 604) | def __init__(self, **kwargs):
  class SystemInfoBase (line 617) | class SystemInfoBase(Box):
    method create_progress_bar (line 621) | def create_progress_bar(name: str = "progress-bar", size: int = 80, **...
    method __init__ (line 633) | def __init__(self, name: str, **kwargs):
    method start_updates (line 692) | def start_updates(self):
    method create_info_line (line 696) | def create_info_line(
    method update (line 718) | def update(self) -> bool:
  class RamInfo (line 723) | class RamInfo(SystemInfoBase):
    method __init__ (line 726) | def __init__(self, **kwargs):
    method update (line 740) | def update(self) -> bool:
  class CpuInfo (line 765) | class CpuInfo(SystemInfoBase):
    method __init__ (line 768) | def __init__(self, **kwargs):
    method get_cpu_temp (line 789) | def get_cpu_temp(self) -> Optional[float]:
    method update (line 813) | def update(self) -> bool:
  class Deskwidgets (line 836) | class Deskwidgets(Window):
    method __init__ (line 841) | def __init__(self, **kwargs):

FILE: services/auth.py
  function get_otp_file_path (line 16) | def get_otp_file_path():
  function capture_selected_area (line 33) | def capture_selected_area(filename="/tmp/screenshot.png"):
  function read_and_save_to_json (line 59) | def read_and_save_to_json():
  function CodeOTP (line 156) | def CodeOTP(uri):
  function generate_totp (line 169) | def generate_totp(secret: str) -> str:
  function get_time_remaining (line 178) | def get_time_remaining() -> int:
  function get_time_remaining_with_blink (line 183) | def get_time_remaining_with_blink() -> str:
  function validate_base32_secret (line 195) | def validate_base32_secret(secret: str) -> dict:
  function parse_otpauth_uri (line 231) | def parse_otpauth_uri(uri: str, account_name: str = "") -> dict:
  function scan_qr_and_add_account (line 272) | def scan_qr_and_add_account(account_name: str, secrets_file_path: str) -...

FILE: services/battery.py
  class Battery (line 18) | class Battery(Service):
    method seconds_to_hours_minutes (line 20) | def seconds_to_hours_minutes(seconds):
    method get_battery_icon_level (line 26) | def get_battery_icon_level(percentage):
    method get_battery_icon_file (line 50) | def get_battery_icon_file(percentage, is_charging, base_path=""):
    method get_profile_display_name (line 57) | def get_profile_display_name(profile: str) -> str:
    method changed (line 71) | def changed(self) -> None: ...
    method profile_changed (line 74) | def profile_changed(self, value: str) -> None: ...
    method percentage (line 77) | def percentage(self):
    method temperature (line 85) | def temperature(self):
    method time_to_empty (line 95) | def time_to_empty(self):
    method time_to_full (line 103) | def time_to_full(self):
    method icon_name (line 109) | def icon_name(self):
    method state (line 115) | def state(self):
    method capacity (line 130) | def capacity(self):
    method is_present (line 136) | def is_present(self):
    method power_profile (line 142) | def power_profile(self):
    method available_profiles (line 151) | def available_profiles(self):
    method change_power_profile (line 167) | def change_power_profile(self, profile: str) -> bool:
    method __init__ (line 195) | def __init__(self):
    method _update_psutil_battery (line 234) | def _update_psutil_battery(self):
    method _handle_profile_props_changed (line 243) | def _handle_profile_props_changed(self, changed):
    method handle_battery_change (line 250) | def handle_battery_change(self, iface, changed, invalidated):

FILE: services/brightness.py
  function exec_brightnessctl_async (line 10) | def exec_brightnessctl_async(args: str):
  class Brightness (line 23) | class Brightness(Service):
    method get_initial (line 29) | def get_initial():
    method screen (line 36) | def screen(self, value: int) -> None:
    method __init__ (line 40) | def __init__(self, **kwargs):
    method do_read_max_brightness (line 66) | def do_read_max_brightness(self, path: str) -> int:
    method screen_brightness (line 75) | def screen_brightness(self) -> int:
    method screen_brightness (line 85) | def screen_brightness(self, value: int):

FILE: services/custom_notification.py
  class CachedNotification (line 30) | class CachedNotification(Service):
    method create_from_dict (line 32) | def create_from_dict(cls, data, **kwargs):
    method removed_from_cache (line 47) | def removed_from_cache(self) -> None: ...
    method cache_id (line 50) | def cache_id(self) -> int:
    method app_name (line 54) | def app_name(self) -> str:
    method app_icon (line 58) | def app_icon(self) -> str:
    method summary (line 62) | def summary(self) -> str:
    method body (line 66) | def body(self) -> str:
    method id (line 70) | def id(self) -> int:
    method replaces_id (line 74) | def replaces_id(self) -> int:
    method urgency (line 78) | def urgency(self) -> int:
    method actions (line 82) | def actions(self) -> list[NotificationAction]:
    method image_pixmap (line 86) | def image_pixmap(self) -> NotificationImagePixmap:
    method image_file (line 90) | def image_file(self) -> str:
    method image_pixbuf (line 94) | def image_pixbuf(self) -> GdkPixbuf.Pixbuf | None:
    method serialized (line 110) | def serialized(self) -> dict:
    method __init__ (line 171) | def __init__(self, notification: Notification, cache_id: int, **kwargs):
    method remove_from_cache (line 178) | def remove_from_cache(self):
  class CachedNotifications (line 182) | class CachedNotifications(Notifications):
    method clear_all (line 186) | def clear_all(self) -> None:
    method cached_notification_added (line 191) | def cached_notification_added(self, notification: CachedNotification) ...
    method cached_notification_removed (line 196) | def cached_notification_removed(self, notification: CachedNotification...
    method cached_notifications (line 201) | def cached_notifications(self) -> List[CachedNotification]:
    method count (line 206) | def count(self) -> int:
    method dont_disturb (line 211) | def dont_disturb(self) -> bool:
    method set_dont_disturb (line 215) | def set_dont_disturb(self, value: bool):
    method __init__ (line 220) | def __init__(self, **kwargs):
    method load_cached_notifications (line 236) | def load_cached_notifications(self) -> dict[int, CachedNotification]:
    method cache_notifications (line 266) | def cache_notifications(self) -> None:
    method clear_all_cached_notifications (line 277) | def clear_all_cached_notifications(self):
    method on_notification_added (line 297) | def on_notification_added(self, service, notification_id: int) -> None:
    method remove_cached_notification (line 433) | def remove_cached_notification(self, notification_id: int):
    method toggle_dnd (line 461) | def toggle_dnd(self):

FILE: services/modus.py
  class ModusService (line 12) | class ModusService(Service):
    method bluetooth_changed (line 14) | def bluetooth_changed(self, new_bluetooth: str) -> None: ...
    method volume_changed (line 17) | def volume_changed(self, new_volume: int) -> None: ...
    method wlan_changed (line 20) | def wlan_changed(self, new_wlan: str) -> None: ...
    method battery_changed (line 23) | def battery_changed(self, new_battery: str) -> None: ...
    method dock_apps_changed (line 26) | def dock_apps_changed(self, new_dock_apps: str) -> None: ...
    method dont_disturb_changed (line 29) | def dont_disturb_changed(self, value: bool) -> None: ...
    method current_active_app_name_changed (line 32) | def current_active_app_name_changed(self, value: str) -> None: ...
    method current_workspace_changed (line 35) | def current_workspace_changed(self, value: str) -> None: ...
    method music_changed (line 38) | def music_changed(self, value: str) -> None: ...
    method current_dropdown_changed (line 41) | def current_dropdown_changed(self, value: str) -> None: ...
    method dropdowns_hide_changed (line 44) | def dropdowns_hide_changed(self, value: bool) -> None: ...
    method dock_width_changed (line 47) | def dock_width_changed(self, value: int) -> None: ...
    method dock_height_changed (line 50) | def dock_height_changed(self, value: int) -> None: ...
    method dock_hidden_changed (line 53) | def dock_hidden_changed(self, value: bool) -> None: ...
    method show_notificationcenter_changed (line 56) | def show_notificationcenter_changed(self, value: bool) -> None: ...
    method notification_count_changed (line 59) | def notification_count_changed(self, value: int) -> None: ...
    method current_active_app_name (line 62) | def current_active_app_name(self) -> str:
    method current_workspace (line 66) | def current_workspace(self) -> str:
    method bluetooth (line 70) | def bluetooth(self) -> str:
    method wlan (line 74) | def wlan(self) -> str:
    method battery (line 78) | def battery(self) -> str:
    method volume (line 82) | def volume(self) -> int:
    method dock_apps (line 86) | def dock_apps(self) -> str:
    method dont_disturb (line 90) | def dont_disturb(self) -> bool:
    method music (line 94) | def music(self) -> str:
    method current_dropdown (line 98) | def current_dropdown(self) -> str:
    method dropdowns_hide (line 102) | def dropdowns_hide(self) -> bool:
    method dock_width (line 106) | def dock_width(self) -> int:
    method dock_height (line 110) | def dock_height(self) -> int:
    method dock_hidden (line 114) | def dock_hidden(self) -> bool:
    method show_notificationcenter (line 118) | def show_notificationcenter(self) -> bool:
    method current_active_app_name (line 122) | def current_active_app_name(self, value: str):
    method current_workspace (line 128) | def current_workspace(self, value: str):
    method volume (line 134) | def volume(self, value: int):
    method wlan (line 140) | def wlan(self, value: str):
    method battery (line 146) | def battery(self, value: str):
    method bluetooth (line 152) | def bluetooth(self, value: str):
    method dock_apps (line 158) | def dock_apps(self, value: str):
    method dont_disturb (line 164) | def dont_disturb(self, value: bool):
    method music (line 170) | def music(self, value: str):
    method current_dropdown (line 176) | def current_dropdown(self, value: str):
    method dropdowns_hide (line 182) | def dropdowns_hide(self, value: bool):
    method dock_width (line 188) | def dock_width(self, value: int):
    method dock_height (line 194) | def dock_height(self, value: int):
    method dock_hidden (line 200) | def dock_hidden(self, value: bool):
    method show_notificationcenter (line 206) | def show_notificationcenter(self, value: bool):
    method sc (line 211) | def sc(self, signal_name: str, callback: callable, def_value="..."):
    method __init__ (line 225) | def __init__(self):
    method _setup_workspace_monitoring (line 248) | def _setup_workspace_monitoring(self):
    method _setup_active_window_monitoring (line 269) | def _setup_active_window_monitoring(self):
    method _update_active_window (line 285) | def _update_active_window(self):
    method _on_workspace_changed (line 321) | def _on_workspace_changed(self, obj, signal):
    method remove_notification (line 329) | def remove_notification(self, id: int):
    method clear_all_notifications (line 333) | def clear_all_notifications(self):
    method get_cached_notifications (line 337) | def get_cached_notifications(self):
    method get_deserialized_with_ids (line 340) | def get_deserialized_with_ids(self):
    method notification_count (line 347) | def notification_count(self) -> int:
    method toggle_dnd (line 350) | def toggle_dnd(self):

FILE: services/mpris.py
  class PlayerctlImportError (line 13) | class PlayerctlImportError(ImportError):
    method __init__ (line 14) | def __init__(self, *args):
  class MprisPlayer (line 28) | class MprisPlayer(Service):
    method exit (line 32) | def exit(self, value: bool) -> bool: ...
    method changed (line 35) | def changed(self) -> None: ...
    method __init__ (line 37) | def __init__(
    method update_status (line 61) | def update_status(self):
    method update_status_once (line 84) | def update_status_once(self):
    method notifier (line 93) | def notifier(self, name: str, args=None):
    method on_player_exit (line 101) | def on_player_exit(self, player):
    method toggle_shuffle (line 109) | def toggle_shuffle(self, *_):
    method play_pause (line 115) | def play_pause(self, *_):
    method next (line 119) | def next(self, *_):
    method previous (line 123) | def previous(self, *_):
    method player_name (line 129) | def player_name(self) -> int:
    method position (line 133) | def position(self) -> int:
    method position (line 137) | def position(self, new_pos: int):
    method metadata (line 141) | def metadata(self) -> dict:
    method arturl (line 145) | def arturl(self) -> str | None:
    method length (line 151) | def length(self) -> str | None:
    method artist (line 157) | def artist(self) -> str:
    method album (line 164) | def album(self) -> str:
    method title (line 168) | def title(self):
    method shuffle (line 172) | def shuffle(self) -> bool:
    method shuffle (line 176) | def shuffle(self, do_shuffle: bool):
    method playback_status (line 181) | def playback_status(self) -> str:
    method loop_status (line 190) | def loop_status(self) -> str:
    method loop_status (line 200) | def loop_status(self, status: str):
    method can_go_next (line 209) | def can_go_next(self) -> bool:
    method can_go_previous (line 213) | def can_go_previous(self) -> bool:
    method can_seek (line 217) | def can_seek(self) -> bool:
    method can_pause (line 221) | def can_pause(self) -> bool:
    method can_shuffle (line 225) | def can_shuffle(self) -> bool:
    method can_loop (line 233) | def can_loop(self) -> bool:
  class MprisPlayerManager (line 241) | class MprisPlayerManager(Service):
    method player_appeared (line 245) | def player_appeared(self, player: Playerctl.Player) -> Playerctl.Playe...
    method player_vanished (line 248) | def player_vanished(self, player_name: str) -> str: ...
    method __init__ (line 250) | def __init__(
    method destroy (line 272) | def destroy(self):
    method on_name_appeared (line 286) | def on_name_appeared(self, manager, player_name: Playerctl.PlayerName):
    method on_name_vanished (line 292) | def on_name_vanished(self, manager, player_name: Playerctl.PlayerName):
    method add_players (line 296) | def add_players(self):
    method players (line 302) | def players(self):

FILE: services/network.py
  class NetworkClient (line 11) | class NetworkClient(Service):
    method wifi_device_added (line 15) | def wifi_device_added(self) -> None: ...
    method ethernet_device_added (line 18) | def ethernet_device_added(self) -> None: ...
    method wifi_device_removed (line 21) | def wifi_device_removed(self) -> None: ...
    method ethernet_device_removed (line 24) | def ethernet_device_removed(self) -> None: ...
    method changed (line 27) | def changed(self) -> None: ...
    method connections (line 30) | def connections(self) -> Optional[list]:
    method wifi_device (line 35) | def wifi_device(self) -> Optional[object]:
    method ethernet_device (line 40) | def ethernet_device(self) -> Optional[object]:
    method primary_connection (line 45) | def primary_connection(self) -> Optional[str]:
    method active_connection (line 50) | def active_connection(self) -> Optional[str]:
    method state (line 55) | def state(self) -> str:
    method connectivity (line 66) | def connectivity(self) -> str:
    method devices (line 77) | def devices(self) -> Optional[list]:
    method hostname (line 82) | def hostname(self) -> Optional[str]:
    method networking_enabled (line 87) | def networking_enabled(self) -> bool:
    method networking_enabled (line 94) | def networking_enabled(self, value: bool):
    method wireless_enabled (line 100) | def wireless_enabled(self) -> bool:
    method wireless_enabled (line 105) | def wireless_enabled(self, value: bool):
    method __init__ (line 110) | def __init__(self, **kwargs):
    method on_client_ready (line 122) | def on_client_ready(self, source, result):
    method do_get_raw_devices (line 163) | def do_get_raw_devices(self) -> list[NM.Device]:
    method on_device_added (line 170) | def on_device_added(self, device):
    method on_device_removed (line 182) | def on_device_removed(self, device):
    method toggle_network (line 193) | def toggle_network(self):
    method deactivate_connection (line 197) | def deactivate_connection(self, connection):
    method notifier (line 201) | def notifier(self, name):
  class AccessPoint (line 206) | class AccessPoint(Service):
    method changed (line 210) | def changed(self) -> None: ...
    method device (line 213) | def device(self) -> object:
    method strength (line 217) | def strength(self) -> int:
    method frequency (line 221) | def frequency(self) -> int:
    method bssid (line 225) | def bssid(self) -> str:
    method hw_address (line 229) | def hw_address(self) -> str:
    method ssid (line 233) | def ssid(self) -> str:
    method icon (line 238) | def icon(self) -> str:
    method requires_password (line 251) | def requires_password(self) -> bool:
    method is_active (line 268) | def is_active(self) -> bool:
    method __init__ (line 273) | def __init__(self, device: "Wifi", ap: NM.AccessPoint, **kwargs):
    method notifier (line 284) | def notifier(self, name: str, *args):
  class Wifi (line 290) | class Wifi(Service):
    method changed (line 294) | def changed(self) -> None: ...
    method ap_added (line 297) | def ap_added(self, ap: AccessPoint) -> None: ...
    method ap_removed (line 300) | def ap_removed(self, ap: AccessPoint) -> None: ...
    method client (line 303) | def client(self) -> NetworkClient:
    method wireless_enabled (line 308) | def wireless_enabled(self) -> bool:
    method wireless_enabled (line 313) | def wireless_enabled(self, value: bool):
    method access_points (line 317) | def access_points(self) -> list[AccessPoint]:
    method active_access_point (line 323) | def active_access_point(self) -> Optional[AccessPoint]:
    method __init__ (line 326) | def __init__(self, client: NetworkClient, device: NM.DeviceWifi, **kwa...
    method on_state_changed (line 354) | def on_state_changed(self, state):
    method do_get_access_points (line 357) | def do_get_access_points(self):
    method on_access_point_added (line 360) | def on_access_point_added(self, ap):
    method on_access_point_removed (line 374) | def on_access_point_removed(self, ap):
    method on_access_point_activated (line 387) | def on_access_point_activated(self):
    method disconnect_wifi (line 400) | def disconnect_wifi(self):
    method scan (line 406) | def scan(self):
    method toggle_wifi (line 416) | def toggle_wifi(self):
    method connect_to_wifi (line 420) | def connect_to_wifi(self, ap: AccessPoint, password: str = None, callb...
    method notifier (line 575) | def notifier(self, name: str, *args):
  class Ethernet (line 581) | class Ethernet(Service):
    method changed (line 585) | def changed(self) -> None: ...
    method enabled (line 588) | def enabled(self) -> bool: ...
    method speed (line 591) | def speed(self) -> str:
    method state (line 596) | def state(self) -> str:
    method internet (line 602) | def internet(self) -> str:
    method iface (line 612) | def iface(self) -> str:
    method icon_name (line 616) | def icon_name(self) -> str:
    method __init__ (line 624) | def __init__(self, client: NM.Client, device: NM.DeviceEthernet, **kwa...
    method on_network_state_changed (line 636) | def on_network_state_changed(self):
    method update_active_connection (line 644) | def update_active_connection(self):
    method get_network_stats (line 653) | def get_network_stats(self):

FILE: services/todo.py
  class TodoService (line 14) | class TodoService(Service):
    method __init__ (line 17) | def __init__(self):
    method add_callback (line 24) | def add_callback(self, callback):
    method remove_callback (line 28) | def remove_callback(self, callback):
    method _notify_callbacks (line 33) | def _notify_callbacks(self, event_type, data=None):
    method _get_todos_file_path (line 41) | def _get_todos_file_path(self):
    method _load_todos (line 47) | def _load_todos(self):
    method _save_todos (line 59) | def _save_todos(self):
    method todos (line 68) | def todos(self):
    method add_todo (line 72) | def add_todo(self, text: str, priority: str = "medium") -> dict:
    method delete_todo (line 88) | def delete_todo(self, todo_id: str) -> bool:
    method toggle_todo (line 99) | def toggle_todo(self, todo_id: str) -> bool:
    method edit_todo (line 111) | def edit_todo(self, todo_id: str, new_text: str) -> bool:
    method set_priority (line 123) | def set_priority(self, todo_id: str, priority: str) -> bool:
    method get_todo (line 138) | def get_todo(self, todo_id: str) -> dict | None:
    method clear_completed (line 145) | def clear_completed(self):
    method get_stats (line 153) | def get_stats(self) -> dict:

FILE: utils/animator.py
  class Animator (line 8) | class Animator(Service):
    method finished (line 10) | def finished(self) -> None: ...
    method bezier_curve (line 13) | def bezier_curve(self) -> tuple[float, float, float, float]:
    method bezier_curve (line 17) | def bezier_curve(self, value: tuple[float, float, float, float]):
    method value (line 22) | def value(self):
    method value (line 26) | def value(self, value: float):
    method max_value (line 31) | def max_value(self):
    method max_value (line 35) | def max_value(self, value: float):
    method min_value (line 40) | def min_value(self):
    method min_value (line 44) | def min_value(self, value: float):
    method playing (line 49) | def playing(self):
    method playing (line 53) | def playing(self, value: bool):
    method repeat (line 58) | def repeat(self):
    method repeat (line 62) | def repeat(self, value: bool):
    method __init__ (line 66) | def __init__(
    method do_get_time_now (line 97) | def do_get_time_now(self):
    method do_lerp (line 100) | def do_lerp(self, start: float, end: float, time: float) -> float:
    method do_interpolate_cubic_bezier (line 103) | def do_interpolate_cubic_bezier(self, time: float) -> float:
    method do_ease (line 112) | def do_ease(self, time: float) -> float:
    method do_update_value (line 117) | def do_update_value(self, delta_time: float):
    method do_handle_tick (line 140) | def do_handle_tick(self, *_):
    method do_remove_tick_handlers (line 145) | def do_remove_tick_handlers(self):
    method play (line 154) | def play(self):
    method pause (line 171) | def pause(self):
    method stop (line 175) | def stop(self):

FILE: utils/app_name_resolver.py
  class AppName (line 5) | class AppName:
    method __init__ (line 6) | def __init__(self, path="/usr/share/applications"):
    method get_app_name (line 10) | def get_app_name(self, wmclass, format_=False):
    method get_app_exec (line 28) | def get_app_exec(self, wmclass, format_=False):
    method get_desktop_file (line 46) | def get_desktop_file(self, wmclass):
    method format_app_name (line 53) | def format_app_name(self, title, wmclass, update=False):
  function format_window (line 80) | def format_window(title, wmclass):

FILE: utils/conversion.py
  class CurrencyCache (line 9) | class CurrencyCache:
    method __init__ (line 12) | def __init__(self):
    method get_rate (line 23) | def get_rate(self, from_code: str, to_code: str) -> Optional[Tuple[flo...
    method _fetch_rates_background (line 78) | def _fetch_rates_background(self, from_code: str):
    method cleanup (line 103) | def cleanup(self):
  class Units (line 115) | class Units:
    method __init__ (line 116) | def __init__(self):
  class Conversion (line 423) | class Conversion:
    method __init__ (line 424) | def __init__(self):
    method convert (line 428) | def convert(self, value: float, from_type: str, to_type: str):
    method _convert_currency_fast (line 498) | def _convert_currency_fast(
    method _convert_currency_via_floatrates (line 511) | def _convert_currency_via_floatrates(
    method parse_input_and_convert (line 541) | def parse_input_and_convert(self, input: str):
    method clean_type (line 579) | def clean_type(self, type: str) -> str:
    method cleanup (line 596) | def cleanup(self):
    method get_currency_cache_info (line 600) | def get_currency_cache_info(

FILE: utils/functions.py
  function thread (line 12) | def thread(target, *args, **kwargs) -> threading.Thread:
  function run_in_thread (line 22) | def run_in_thread(func):
  function write_json_file (line 34) | def write_json_file(data: Dict, path: str):
  function read_json_file (line 42) | def read_json_file(file_path: str) -> Optional[List]:
  function get_wifi_icon_for_strength (line 55) | def get_wifi_icon_for_strength(strength: int) -> str:
  function get_wifi_connecting_icon (line 86) | def get_wifi_connecting_icon() -> str:
  function is_special_workspace_id (line 104) | def is_special_workspace_id(ws_id) -> bool:
  function is_special_workspace (line 118) | def is_special_workspace(client: dict) -> bool:
  function escape_markup_text (line 139) | def escape_markup_text(text: str) -> str:

FILE: utils/icon_resolver.py
  class IconResolver (line 18) | class IconResolver:
    method __init__ (line 19) | def __init__(
    method get_icon_name (line 34) | def get_icon_name(self, app_id: str):
    method get_icon_pixbuf (line 44) | def get_icon_pixbuf(self, app_id: str, size: int = 16):
    method _store_new_icon (line 65) | def _store_new_icon(self, app_id: str, icon: str):
    method _get_icon_from_desktop_file (line 70) | def _get_icon_from_desktop_file(self, desktop_file_path: str):
    method _get_desktop_file (line 78) | def _get_desktop_file(self, app_id: str) -> str | None:
    method _compositor_find_icon (line 95) | def _compositor_find_icon(self, app_id: str):

FILE: utils/inhibit.py
  class GlobalRegistry (line 23) | class GlobalRegistry:
  function parse_duration (line 28) | def parse_duration(duration_str: str) -> int:
  function kill_existing_inhibit_processes (line 49) | def kill_existing_inhibit_processes():
  function handle_registry_global (line 82) | def handle_registry_global(
  function main (line 96) | def main() -> None:

FILE: utils/monitors.py
  function ttl_lru_cache (line 12) | def ttl_lru_cache(seconds_to_live: int, maxsize: int = 128):
  class HyprlandWithMonitors (line 25) | class HyprlandWithMonitors(Hyprland):
    method get_default (line 31) | def get_default():
    method __init__ (line 37) | def __init__(self, commands_only: bool = False, **kwargs):
    method get_all_monitors (line 42) | def get_all_monitors(self) -> Dict:
    method get_gdk_monitor_id_from_name (line 46) | def get_gdk_monitor_id_from_name(self, plug_name: str) -> int | None:
    method get_gdk_monitor_id (line 52) | def get_gdk_monitor_id(self, hyprland_id: int) -> int | None:
    method get_current_gdk_monitor_id (line 58) | def get_current_gdk_monitor_id(self) -> int | None:

FILE: utils/occlusion.py
  function get_current_workspace (line 7) | def get_current_workspace():
  function get_screen_dimensions (line 26) | def get_screen_dimensions():
  function check_occlusion (line 62) | def check_occlusion(occlusion_region, workspace=None):

FILE: widgets/circle_image.py
  class CircleImage (line 13) | class CircleImage(Gtk.DrawingArea, Widget):
    method angle (line 17) | def angle(self) -> int:
    method angle (line 21) | def angle(self, value: int):
    method __init__ (line 25) | def __init__(
    method _process_image (line 76) | def _process_image(self, pixbuf: GdkPixbuf.Pixbuf) -> GdkPixbuf.Pixbuf:
    method on_draw (line 92) | def on_draw(self, widget: "CircleImage", ctx: cairo.Context):
    method set_image_from_file (line 106) | def set_image_from_file(self, new_image_file: str):
    method set_image_from_pixbuf (line 114) | def set_image_from_pixbuf(self, pixbuf: GdkPixbuf.Pixbuf):
    method set_image_size (line 121) | def set_image_size(self, size: int):

FILE: widgets/custom_image.py
  class CustomImage (line 10) | class CustomImage(Image):
    method do_render_rectangle (line 11) | def do_render_rectangle(
    method do_draw (line 25) | def do_draw(self, cr: cairo.Context):

FILE: widgets/customrevealer.py
  class AnimationManager (line 10) | class AnimationManager:
    method get_instance (line 17) | def get_instance(cls):
    method add_widget (line 22) | def add_widget(self, widget):
    method remove_widget (line 29) | def remove_widget(self, widget):
    method _animate_all (line 38) | def _animate_all(self):
    method get_active_widget_count (line 67) | def get_active_widget_count(self):
    method _get_optimal_interval (line 71) | def _get_optimal_interval(self):
    method _start_timer (line 76) | def _start_timer(self):
    method _adjust_frame_rate (line 80) | def _adjust_frame_rate(self):
  class MacOSEasing (line 85) | class MacOSEasing:
    method ease_out_expo (line 89) | def ease_out_expo(t):
    method ease_in_out_quart (line 94) | def ease_in_out_quart(t):
    method ease_out_back (line 99) | def ease_out_back(t):
    method ease_out_cubic_bezier (line 106) | def ease_out_cubic_bezier(t):
    method ease_in_cubic (line 112) | def ease_in_cubic(t):
    method ease_out_quint (line 117) | def ease_out_quint(t):
  class SlideRevealer (line 122) | class SlideRevealer(Gtk.Overlay):
    method __init__ (line 123) | def __init__(self, child: Gtk.Widget, direction="right", duration=350,...
    method _on_size_allocate (line 152) | def _on_size_allocate(self, _widget, allocation):
    method set_reveal_child (line 161) | def set_reveal_child(self, reveal: bool):
    method reveal (line 167) | def reveal(self):
    method hide (line 182) | def hide(self):
    method _start_animation (line 188) | def _start_animation(self, show: bool):
    method _calculate_position (line 217) | def _calculate_position(self):
    method _apply_position (line 243) | def _apply_position(self):
    method _get_container_for_redraw (line 253) | def _get_container_for_redraw(self):
    method _get_dimensions (line 256) | def _get_dimensions(self):
    method _get_offscreen_pos_cached (line 263) | def _get_offscreen_pos_cached(self):
    method _get_position_at_progress_cached (line 275) | def _get_position_at_progress_cached(self, progress):
    method set_slide_direction (line 299) | def set_slide_direction(self, direction):
    method is_revealed (line 302) | def is_revealed(self):
    method is_animating (line 305) | def is_animating(self):
    method get_child_revealed (line 308) | def get_child_revealed(self):
    method stop_animation (line 311) | def stop_animation(self):
    method destroy (line 318) | def destroy(self):

FILE: widgets/dropdown.py
  function dropdown_divider (line 10) | def dropdown_divider(comment):
  class ModusDropdown (line 20) | class ModusDropdown(PopupWindow):
    method __init__ (line 21) | def __init__(self, dropdown_children=None, dropdown_id=None, **kwargs):
    method toggle_dropdown (line 57) | def toggle_dropdown(self, button, parent=None):
    method _init_mousecapture (line 61) | def _init_mousecapture(self, mousecapture):
    method hide_dropdown (line 65) | def hide_dropdown(self, widget, event):
    method hide_via_mousecapture (line 71) | def hide_via_mousecapture(self):
    method _set_mousecapture (line 76) | def _set_mousecapture(self, visible: bool) -> None:
    method on_cursor_enter (line 84) | def on_cursor_enter(self, *_):
    method on_cursor_leave (line 87) | def on_cursor_leave(self, *_):

FILE: widgets/mousecapture.py
  class MouseCapture (line 12) | class MouseCapture(Window):
    method __init__ (line 15) | def __init__(self, layer: str, child_window: Window, **kwargs):
    method on_draw (line 55) | def on_draw(self, _widget, cr):
    method on_overlay_click (line 62) | def on_overlay_click(self, _widget, event):
    method show_child_window (line 98) | def show_child_window(self, widget: Widget = None, event: Any = None) ...
    method hide_child_window (line 101) | def hide_child_window(self, widget: Widget = None, event: Any = None) ...
    method set_child_window_visible (line 104) | def set_child_window_visible(self, visible: bool) -> None:
    method toggle_mousecapture (line 115) | def toggle_mousecapture(self, *_) -> None:
  class DropDownMouseCapture (line 122) | class DropDownMouseCapture(MouseCapture):
    method __init__ (line 125) | def __init__(self, *args, **kwargs):
    method hide_child_window (line 129) | def hide_child_window(self, widget: Widget = None, event: Any = None) ...
    method dropdowns_hide_changed (line 137) | def dropdowns_hide_changed(self, widget: Widget = None, event: Any = N...

FILE: widgets/popup_window.py
  class PopupWindow (line 11) | class PopupWindow(WaylandWindow):
    method __init__ (line 14) | def __init__(
    method get_coords_for_widget (line 34) | def get_coords_for_widget(self, widget: Gtk.Widget) -> tuple[int, int]:
    method set_pointing_to (line 44) | def set_pointing_to(self, widget: Gtk.Widget | None):
    method do_update_handlers (line 51) | def do_update_handlers(self, *_):
    method do_handle_size_allocate (line 68) | def do_handle_size_allocate(self, *_):
    method do_calculate_edges (line 71) | def do_calculate_edges(self):
    method do_reposition (line 104) | def do_reposition(self, move_axe: str):

FILE: widgets/wayland.py
  class WaylandWindowExclusivity (line 26) | class WaylandWindowExclusivity(Enum):
  class Layer (line 32) | class Layer(GObject.GEnum):
  class KeyboardMode (line 40) | class KeyboardMode(GObject.GEnum):
  class Edge (line 47) | class Edge(GObject.GEnum):
  class WaylandWindow (line 55) | class WaylandWindow(Window):
    method layer (line 61) | def layer(self) -> Layer:  # type: ignore
    method layer (line 65) | def layer(
    method monitor (line 73) | def monitor(self) -> int:
    method monitor (line 83) | def monitor(self, monitor: int | Gdk.Monitor) -> bool:
    method exclusivity (line 94) | def exclusivity(self) -> WaylandWindowExclusivity:
    method exclusivity (line 98) | def exclusivity(
    method pass_through (line 114) | def pass_through(self) -> bool:
    method pass_through (line 118) | def pass_through(self, pass_through: bool = False):
    method keyboard_mode (line 130) | def keyboard_mode(self) -> KeyboardMode:
    method keyboard_mode (line 134) | def keyboard_mode(
    method anchor (line 152) | def anchor(self):
    method anchor (line 165) | def anchor(self, value: str | Iterable[Edge]) -> None:
    method margin (line 189) | def margin(self) -> tuple[int, ...]:
    method margin (line 201) | def margin(self, value: str | Iterable[int]) -> None:
    method keyboard_mode (line 207) | def keyboard_mode(self):
    method keyboard_mode (line 214) | def keyboard_mode(
    method __init__ (line 227) | def __init__(
    method steal_input (line 306) | def steal_input(self) -> None:
    method return_input (line 309) | def return_input(self) -> None:
    method show (line 313) | def show(self) -> None:
    method show_all (line 317) | def show_all(self) -> None:
    method do_handle_post_show_request (line 321) | def do_handle_post_show_request(self) -> None:
    method extract_anchor_values (line 330) | def extract_anchor_values(string: str) -> tuple[str, ...]:
    method extract_edges_from_string (line 345) | def extract_edges_from_string(string: str) -> dict["Edge", bool]:
    method extract_margin (line 355) | def extract_margin(input: str | Iterable[int]) -> dict["Edge", int]:

FILE: widgets/wifi_password_dialog.py
  class WiFiPasswordDialog (line 17) | class WiFiPasswordDialog(Window):
    method __init__ (line 18) | def __init__(
    method _create_dialog_content (line 49) | def _create_dialog_content(self):
    method _on_password_changed (line 165) | def _on_password_changed(self, entry):
    method _update_join_button_state (line 168) | def _update_join_button_state(self):
    method _on_show_password_clicked (line 179) | def _on_show_password_clicked(self, *args):
    method _on_key_press (line 188) | def _on_key_press(self, widget, event):
    method _on_visibility_changed (line 200) | def _on_visibility_changed(self, widget, *args):
    method _on_cancel_clicked (line 205) | def _on_cancel_clicked(self, *args):
    method _on_join_clicked (line 212) | def _on_join_clicked(self, *args):
    method _connection_timeout (line 233) | def _connection_timeout(self):
    method show_dialog (line 240) | def show_dialog(self):
    method show_error (line 260) | def show_error(self, message="Incorrect password. Please try again."):
    method _focus_and_select_password (line 278) | def _focus_and_select_password(self):
    method get_password (line 286) | def get_password(self):
    method destroy_dialog (line 289) | def destroy_dialog(self):
Condensed preview — 111 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,687K chars).
[
  {
    "path": ".gitignore",
    "chars": 294,
    "preview": "\n**/__pycache__/\n*.pyc\n*.pyo\n*.pyd\n# config/assets/config.json\nconfig/assets/dock.json\nconfig/assets/accounts.json\nconfi"
  },
  {
    "path": "LICENSE",
    "chars": 35150,
    "preview": "\n                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free"
  },
  {
    "path": "README.md",
    "chars": 4580,
    "preview": "<p align=\"center\">\n  <img src=\"assets/modus.png\" height=\"200\" alt=\"Logo\">\n</p>\n\n<p align=\"center\">\n  <sub><sup><img src="
  },
  {
    "path": "config/assets/config.json",
    "chars": 495,
    "preview": "{\n  \"wallpapers_dir\": \"~/Pictures/Wallpapers/\",\n  \"dock_position\": \"Bottom\",\n  \"terminal_command\": \"kitty -e\",\n  \"dock_e"
  },
  {
    "path": "config/assets/emoji.json",
    "chars": 375421,
    "preview": "{\n  \"😀\": {\n    \"name\": \"grinning face\",\n    \"slug\": \"grinning_face\",\n    \"group\": \"Smileys & Emotion\",\n    \"emoji_versio"
  },
  {
    "path": "config/assets/launcher.json",
    "chars": 2416,
    "preview": "{\n\t\"launcher_config\": {\n\t\t\"em\": {\n\t\t\t\"icon\": \"emoji-people-symbolic\",\n\t\t\t\"description\": \"Emoji - Search and copy emojis\""
  },
  {
    "path": "config/data.py",
    "chars": 3656,
    "preview": "import json\nimport os\n\nimport gi\nfrom fabric.utils.helpers import get_relative_path\nfrom gi.repository import Gdk, GLib\n"
  },
  {
    "path": "config/hypr/modus.conf",
    "chars": 1803,
    "preview": "#  exec-once\nexec-once = uwsm app -- python ~/.config/Modus/main.py\nexec = pgrep -x \"hypridle\" > /dev/null || uwsm app -"
  },
  {
    "path": "config/matugen/templates/hyprland-colors.conf",
    "chars": 1357,
    "preview": "$wallpaper = {{image}}\n$background = {{colors.background.default.hex_stripped}}\n$foreground = {{colors.on_background.def"
  },
  {
    "path": "config/matugen/templates/macos.css",
    "chars": 1565,
    "preview": ":vars {\n  --foreground: {{colors.on_background.default.hex}};\n  --background: {{colors.background.default.hex}};\n  --cur"
  },
  {
    "path": "debug_memory.py",
    "chars": 4856,
    "preview": "#!/usr/bin/env python3\n\"\"\"\nReal-time memory monitor for debugging expanded player memory leaks.\nThis module provides fun"
  },
  {
    "path": "install.sh",
    "chars": 9322,
    "preview": "#!/bin/bash\n\n#  ███╗   ███╗ ██████╗ ██████╗ ██╗   ██╗███████╗\n#  ████╗ ████║██╔═══██╗██╔══██╗██║   ██║██╔════╝\n#  ██╔███"
  },
  {
    "path": "lock.py",
    "chars": 7311,
    "preview": "from widgets.circle_image import CircleImage as Image\nfrom modules.panel.components.indicators import (\n    BatteryIndic"
  },
  {
    "path": "main.css",
    "chars": 872,
    "preview": "@import url(\"./styles/colors.css\");\n@import url(\"./styles/panel.css\");\n@import url(\"./styles/dock.css\");\n@import url(\"./"
  },
  {
    "path": "main.py",
    "chars": 1637,
    "preview": "import setproctitle\nfrom fabric import Application\nfrom fabric.utils import get_relative_path, monitor_file\nfrom loguru "
  },
  {
    "path": "modules/about.py",
    "chars": 18171,
    "preview": "import re\nimport subprocess\nimport os\n\nimport gi\n\ngi.require_version(\"GdkPixbuf\", \"2.0\")\ngi.require_version(\"Gtk\", \"3.0\""
  },
  {
    "path": "modules/controlcenter/battery.py",
    "chars": 13486,
    "preview": "import subprocess\n\nfrom fabric.utils import get_relative_path\nfrom fabric.widgets.box import Box\nfrom fabric.widgets.but"
  },
  {
    "path": "modules/controlcenter/bluetooth.py",
    "chars": 23672,
    "preview": "import subprocess\n\nimport gi\nfrom fabric.bluetooth import BluetoothClient, BluetoothDevice\nfrom fabric.utils import get_"
  },
  {
    "path": "modules/controlcenter/expanded_player.py",
    "chars": 49560,
    "preview": "# Standard library imports\nimport os\nimport re\nimport tempfile\nimport urllib.parse\nimport urllib.request\nimport threadin"
  },
  {
    "path": "modules/controlcenter/main.py",
    "chars": 40528,
    "preview": "import subprocess\n\nfrom fabric.utils import idle_add\nfrom fabric.utils.helpers import (\n    get_relative_path,\n)\nfrom fa"
  },
  {
    "path": "modules/controlcenter/nightlight.py",
    "chars": 4866,
    "preview": "# Standard library imports\nimport subprocess\n\n# Fabric imports\nfrom fabric.utils.helpers import get_relative_path\nfrom f"
  },
  {
    "path": "modules/controlcenter/per_app_volume.py",
    "chars": 11101,
    "preview": "# Standard library imports\nfrom gi.repository import GLib\n\n# Fabric imports\nfrom fabric.widgets.box import Box\nfrom fabr"
  },
  {
    "path": "modules/controlcenter/player.py",
    "chars": 33074,
    "preview": "import os\nimport re\nimport tempfile\nimport urllib.parse\nimport urllib.request\nfrom typing import List\nimport threading\n\n"
  },
  {
    "path": "modules/controlcenter/wifi.py",
    "chars": 28094,
    "preview": "from widgets.wifi_password_dialog import WiFiPasswordDialog\nfrom services.network import NetworkClient\nfrom fabric.widge"
  },
  {
    "path": "modules/corners.py",
    "chars": 1880,
    "preview": "from fabric.widgets.box import Box\nfrom fabric.widgets.shapes import Corner\nfrom widgets.wayland import WaylandWindow as"
  },
  {
    "path": "modules/dock.py",
    "chars": 31965,
    "preview": "import json\nimport os\nimport re\nimport subprocess\n\nfrom fabric.utils.helpers import get_desktop_applications, get_relati"
  },
  {
    "path": "modules/launcher/__init__.py",
    "chars": 159,
    "preview": "\"\"\"\nPlugin-based launcher module for Fabric.\nSimilar to Albert Launcher with extensible plugin system.\n\"\"\"\n\nfrom .main i"
  },
  {
    "path": "modules/launcher/main.py",
    "chars": 56242,
    "preview": "from typing import List, Optional, Tuple\n\nfrom gi.repository import Gdk, GLib\n\nfrom fabric.core.service import Property\n"
  },
  {
    "path": "modules/launcher/plugin_base.py",
    "chars": 4794,
    "preview": "from abc import ABC, abstractmethod\nfrom typing import List\n\nfrom modules.launcher.result import Result\n\n\nclass PluginBa"
  },
  {
    "path": "modules/launcher/plugin_manager.py",
    "chars": 5765,
    "preview": "import importlib\nimport importlib.util\nimport os\nfrom typing import Dict, List, Type\n\nfrom modules.launcher.plugin_base "
  },
  {
    "path": "modules/launcher/plugins/__init__.py",
    "chars": 43,
    "preview": "\"\"\"\nBuilt-in plugins for the launcher.\n\"\"\"\n"
  },
  {
    "path": "modules/launcher/plugins/applications.py",
    "chars": 6363,
    "preview": "import json\nimport re\nfrom typing import List\nimport subprocess\n\nfrom fabric.utils import DesktopApp\nfrom fabric.utils.h"
  },
  {
    "path": "modules/launcher/plugins/bash_scripts.py",
    "chars": 16089,
    "preview": "import json\nimport os\nimport threading\nimport time\nfrom typing import Dict, List\n\nimport config.data as data\nfrom fabric"
  },
  {
    "path": "modules/launcher/plugins/bookmarks.py",
    "chars": 28660,
    "preview": "import json\nimport subprocess\nimport threading\nimport time\nfrom pathlib import Path\nfrom typing import Dict, List, Optio"
  },
  {
    "path": "modules/launcher/plugins/caffeine.py",
    "chars": 7704,
    "preview": "import subprocess\nfrom threading import Timer\nfrom typing import List\n\nimport gi\n\nimport config.data as data\nfrom fabric"
  },
  {
    "path": "modules/launcher/plugins/calculator.py",
    "chars": 5785,
    "preview": "import math\nimport re\nimport subprocess\nimport time\nfrom typing import List\n\nfrom modules.launcher.plugin_base import Pl"
  },
  {
    "path": "modules/launcher/plugins/clipboard.py",
    "chars": 17834,
    "preview": "import os\nimport subprocess\nimport sys\nimport tempfile\nimport threading\nimport time\nfrom concurrent.futures import Threa"
  },
  {
    "path": "modules/launcher/plugins/emoji.py",
    "chars": 6947,
    "preview": "import json\nimport os\nimport subprocess\nimport time\nfrom collections import OrderedDict\nfrom typing import Dict, List\n\ni"
  },
  {
    "path": "modules/launcher/plugins/otp.py",
    "chars": 33920,
    "preview": "import json\nimport subprocess\nimport threading\nimport time\nfrom pathlib import Path\nfrom typing import Dict, List, Optio"
  },
  {
    "path": "modules/launcher/plugins/password.py",
    "chars": 25748,
    "preview": "import base64\nimport json\nimport subprocess\nimport threading\nimport time\nfrom datetime import datetime\nfrom pathlib impo"
  },
  {
    "path": "modules/launcher/plugins/power.py",
    "chars": 3416,
    "preview": "from typing import List\n\nfrom fabric.utils import exec_shell_command_async\nfrom modules.launcher.plugin_base import Plug"
  },
  {
    "path": "modules/launcher/plugins/reminders.py",
    "chars": 16921,
    "preview": "import re\nimport subprocess\nimport threading\nfrom datetime import datetime, timedelta\nfrom typing import Dict, List, Opt"
  },
  {
    "path": "modules/launcher/plugins/screencapture.py",
    "chars": 29468,
    "preview": "import subprocess\nfrom typing import List\n\nfrom fabric.utils import get_relative_path\nfrom modules.launcher.plugin_base "
  },
  {
    "path": "modules/launcher/plugins/system.py",
    "chars": 8793,
    "preview": "import json\nimport os\nimport shlex\nimport threading\nimport time\nfrom typing import List, Set, Union\n\nimport config.data "
  },
  {
    "path": "modules/launcher/plugins/tmux.py",
    "chars": 12812,
    "preview": "import subprocess\nimport threading\nimport time\nfrom typing import List\n\nimport config.data as data\nfrom fabric.utils imp"
  },
  {
    "path": "modules/launcher/plugins/wallpaper.py",
    "chars": 42861,
    "preview": "import colorsys\nimport hashlib\nimport json\nimport os\nimport random\nimport re\nimport threading\nimport time\nfrom typing im"
  },
  {
    "path": "modules/launcher/plugins/websearch.py",
    "chars": 9814,
    "preview": "import subprocess\nimport urllib.parse\nfrom typing import List\n\nfrom modules.launcher.plugin_base import PluginBase\nfrom "
  },
  {
    "path": "modules/launcher/result.py",
    "chars": 1409,
    "preview": "from dataclasses import dataclass\nfrom typing import Any, Callable, Optional\n\nfrom gi.repository import GdkPixbuf, Gtk\n\n"
  },
  {
    "path": "modules/launcher/result_item.py",
    "chars": 4878,
    "preview": "import gi\nfrom fabric.core.service import Signal\nfrom fabric.widgets.box import Box\nfrom fabric.widgets.eventbox import "
  },
  {
    "path": "modules/launcher/trigger_config.py",
    "chars": 2042,
    "preview": "import json\nimport os\nfrom typing import Any, Dict, List\n\nfrom fabric.utils import get_relative_path\n\n\nclass TriggerConf"
  },
  {
    "path": "modules/notification/notification.py",
    "chars": 48438,
    "preview": "import os\nimport hashlib\nimport time\nimport uuid\n\nfrom fabric.utils import get_relative_path\nfrom gi.repository import G"
  },
  {
    "path": "modules/notification/notification_center.py",
    "chars": 37153,
    "preview": "from collections import defaultdict\nimport time\n\nfrom fabric.widgets.box import Box\nfrom fabric.widgets.button import Bu"
  },
  {
    "path": "modules/notification/unified_cache.py",
    "chars": 7157,
    "preview": "import os\nimport hashlib\nimport time\nimport uuid\n\nfrom fabric.utils import get_relative_path\nfrom gi.repository import G"
  },
  {
    "path": "modules/osd.py",
    "chars": 15661,
    "preview": "import math\nimport time\nfrom typing import ClassVar, Literal\n\nfrom gi.repository import GLib, GObject\n\nfrom fabric.audio"
  },
  {
    "path": "modules/panel/components/enhanced_system_tray.py",
    "chars": 6159,
    "preview": "\"\"\"\nEnhanced System Tray Icon Handling\n\nThis module provides enhanced icon loading capabilities for system tray items,\ni"
  },
  {
    "path": "modules/panel/components/indicators.py",
    "chars": 18170,
    "preview": "from fabric.bluetooth import BluetoothClient\nfrom fabric.utils import get_relative_path\nfrom fabric.widgets.box import B"
  },
  {
    "path": "modules/panel/components/menubar.py",
    "chars": 16240,
    "preview": "import json\nimport os\nimport subprocess\n\nfrom fabric.hyprland.widgets import HyprlandActiveWindow as ActiveWindow\nfrom f"
  },
  {
    "path": "modules/panel/components/recording_indicator.py",
    "chars": 7772,
    "preview": "import os\nimport subprocess\nimport time\n\nfrom fabric.utils import get_relative_path\nfrom fabric.widgets.box import Box\nf"
  },
  {
    "path": "modules/panel/main.py",
    "chars": 8605,
    "preview": "from fabric.hyprland.widgets import HyprlandWorkspaces, WorkspaceButton\nfrom fabric.system_tray.widgets import SystemTra"
  },
  {
    "path": "modules/switcher.py",
    "chars": 14265,
    "preview": "import json\n\nimport gi\nfrom gi.repository import Gdk, Glace\n\nimport config.data as data\nfrom fabric.hyprland.widgets imp"
  },
  {
    "path": "modules/todo/__init__.py",
    "chars": 13,
    "preview": "# Todo module"
  },
  {
    "path": "modules/todo/todo_widget.py",
    "chars": 14131,
    "preview": "# Standard library imports\nfrom datetime import datetime\n\n# Fabric imports\nfrom fabric.utils import get_relative_path\nfr"
  },
  {
    "path": "modules/widget.py",
    "chars": 28236,
    "preview": "# Standard library imports\nimport psutil\nimport requests\nimport urllib.parse\nimport datetime\nimport time\nimport subproce"
  },
  {
    "path": "requirements.txt",
    "chars": 272,
    "preview": "certifi==2025.8.3\ncharset-normalizer==3.4.2\nclick==8.2.1\nidna==3.10\nloguru==0.7.3\npillow==12.2.0\npsutil==7.0.0\npycairo=="
  },
  {
    "path": "scripts/gamemode.sh",
    "chars": 870,
    "preview": "#!/usr/bin/env sh\n\n# Check if animations are disabled (game mode is active)\ncheck_gamemode() {\n\tHYPRGAMEMODE=$(hyprctl g"
  },
  {
    "path": "scripts/hyprpicker.sh",
    "chars": 1466,
    "preview": "#!/bin/bash\n\npick_rgb() {\n\n\t# Execute hyprpicker with RGB format and save the output to a variable\n\thyprpicker -a -n -f "
  },
  {
    "path": "scripts/screen-capture.sh",
    "chars": 20132,
    "preview": "#!/bin/env bash\n\n# Script name\nSCRIPT_NAME=$(basename \"$0\")\n\n# Function to display usage\nusage() {\n\tcat <<EOF\nUsage: $SC"
  },
  {
    "path": "services/__init__.py",
    "chars": 90,
    "preview": "\"\"\"\nModus services package.\nContains background services and utilities for the shell.\n\"\"\"\n"
  },
  {
    "path": "services/auth.py",
    "chars": 11441,
    "preview": "import json\nimport os\nimport subprocess\nimport time\nfrom datetime import datetime\nfrom pathlib import Path\nfrom urllib.p"
  },
  {
    "path": "services/battery.py",
    "chars": 8739,
    "preview": "import psutil\nfrom gi.repository import GLib\nfrom pydbus import SystemBus\n\nfrom fabric.core import Property, Service, Si"
  },
  {
    "path": "services/brightness.py",
    "chars": 3385,
    "preview": "import os\n\nfrom gi.repository import GLib\nfrom loguru import logger\n\nfrom fabric.core.service import Property, Service, "
  },
  {
    "path": "services/custom_notification.py",
    "chars": 19266,
    "preview": "# Standard library imports\nimport json\nimport os\nimport time\nfrom typing import List\n\n# Fabric imports\nimport gi\n\ngi.req"
  },
  {
    "path": "services/modus.py",
    "chars": 11632,
    "preview": "import json\n\nfrom fabric.core.service import Property, Service, Signal\nfrom fabric.hyprland.service import Hyprland\nfrom"
  },
  {
    "path": "services/mpris.py",
    "chars": 9877,
    "preview": "# Standard library imports\nimport contextlib\n\nimport gi\n\n# Fabric imports\nfrom fabric.core.service import Property, Serv"
  },
  {
    "path": "services/network.py",
    "chars": 24663,
    "preview": "from gi.repository import NM, GLib\nimport gi\nfrom typing import List, Optional\nfrom fabric.core.service import Property,"
  },
  {
    "path": "services/todo.py",
    "chars": 5737,
    "preview": "# Standard library imports\nimport json\nimport uuid\nfrom datetime import datetime\nfrom pathlib import Path\n\n# Fabric impo"
  },
  {
    "path": "styles/about.css",
    "chars": 1291,
    "preview": "#about-menu {\n  background-color: alpha(#000, 0.34);\n\n  box-shadow:\n    inset 0 -0.5px 0 0.5px alpha(#555, 0.7),\n    ins"
  },
  {
    "path": "styles/battery-widget.css",
    "chars": 2738,
    "preview": "#battery-widget {\n  background: rgba(0, 0, 0, 0);\n  padding-left: 5px;\n  padding-right: 5px;\n}\n.battery-main-title {\n  f"
  },
  {
    "path": "styles/colors.css",
    "chars": 701,
    "preview": ":vars {\n  --foreground: #e4e1e9;\n  --background: #131318;\n  --cursor: #e4e1e9;\n  --primary: #bec2ff;\n  --on-primary: #26"
  },
  {
    "path": "styles/controlcenter.css",
    "chars": 19138,
    "preview": ".title {\n  font-size: 16px;\n  font-family: \"SF Pro Rounded\";\n  font-weight: bold;\n}\n#control-center-menu {\n  background-"
  },
  {
    "path": "styles/dock.css",
    "chars": 2039,
    "preview": "#dock {\n  background-color: alpha(#fff, 0.07);\n  padding: 4px 4px;\n  margin: 4px 4px;\n  border: none;\n  border-radius: 1"
  },
  {
    "path": "styles/dropdown.css",
    "chars": 1064,
    "preview": "#dropdown-menu {\n  background-color: transparent;\n\n  border-radius: 0.75rem;\n  margin: 0;\n}\n\n#dropdown-options {\n  backg"
  },
  {
    "path": "styles/launcher.css",
    "chars": 4150,
    "preview": "#launcher {\n  background-color: alpha(#000, 0.3);\n  padding: 0;\n  border-radius: 12px;\n  min-width: 640px;\n  border: 1px"
  },
  {
    "path": "styles/lock.css",
    "chars": 1129,
    "preview": "#lockscreen-bg {\n  background-size: cover;\n}\n#indicator-box {\n  margin-right: 10px;\n  margin-top: 4px;\n}\n#container-box "
  },
  {
    "path": "styles/notification-center.css",
    "chars": 6223,
    "preview": "#noti-center-box {\n  background-color: transparent;\n\n  /* border: 1px solid alpha(#111, 0.3); */\n  border-radius: 20px;\n"
  },
  {
    "path": "styles/notification.css",
    "chars": 1535,
    "preview": "#notification {\n  padding: 10px;\n  background-color: alpha(#fff, 0.03);\n  border-radius: 8px;\n  margin-top: 10px;\n  marg"
  },
  {
    "path": "styles/osd.css",
    "chars": 731,
    "preview": "#osd {\n  background-color: alpha(#fff, 0.09);\n  padding: 12px 20px;\n  margin: 70px;\n  min-height: 200px;\n  border-radius"
  },
  {
    "path": "styles/panel.css",
    "chars": 2420,
    "preview": "#panel {\n  background-color: alpha(#fff, 0.07);\n\n  /* border-bottom: 1px solid alpha(#010101, 0.025); */\n  margin-top: -"
  },
  {
    "path": "styles/player.css",
    "chars": 3261,
    "preview": "#player-stack-button {\n  border-radius: 5px;\n  min-width: 7px;\n  min-height: 7px;\n  margin: 10px 3px;\n}\n\n#button-box-c {"
  },
  {
    "path": "styles/switcher.css",
    "chars": 598,
    "preview": "#application-switcher-container {\n  background: var(--shadow);\n  border-radius: 16px;\n}\n\n#application-switcher-view {\n  "
  },
  {
    "path": "styles/todo.css",
    "chars": 4951,
    "preview": "/* Todo List Styles - matching control center design */\n\n#todo-list-window {\n  /* background-color: alpha(#fff, 0.05); *"
  },
  {
    "path": "styles/tray.css",
    "chars": 794,
    "preview": "tooltip {\n  border: #474747 solid 1px;\n  border-radius: 0.75rem;\n  background-color: alpha(#fff, 0.05);\n}\n\n@keyframes to"
  },
  {
    "path": "styles/widgets.css",
    "chars": 3507,
    "preview": "/* Weather Widget CSS */\n#weather-container {\n  background: linear-gradient(to bottom, #202020, #141414);\n  margin: 5px "
  },
  {
    "path": "utils/__init__.py",
    "chars": 90,
    "preview": "\"\"\"\nModus services package.\nContains background services and utilities for the shell.\n\"\"\"\n"
  },
  {
    "path": "utils/animator.py",
    "chars": 4844,
    "preview": "from typing import cast\n\nfrom gi.repository import GLib, Gtk\n\nfrom fabric import Property, Service, Signal\n\n\nclass Anima"
  },
  {
    "path": "utils/app_name_resolver.py",
    "chars": 2857,
    "preview": "import os\nfrom utils.roam import modus_service\n\n\nclass AppName:\n    def __init__(self, path=\"/usr/share/applications\"):\n"
  },
  {
    "path": "utils/conversion.py",
    "chars": 20801,
    "preview": "import threading\nimport time\nfrom concurrent.futures import ThreadPoolExecutor\nfrom typing import Dict, Optional, Tuple\n"
  },
  {
    "path": "utils/functions.py",
    "chars": 4257,
    "preview": "import html\nimport json\nimport os\nimport threading\nfrom typing import Dict, List, Optional\n\nfrom loguru import logger\n\n#"
  },
  {
    "path": "utils/icon_resolver.py",
    "chars": 3989,
    "preview": "import json\nimport os\nimport re\n\nimport gi\n\ngi.require_version(\"Gtk\", \"3.0\")\nfrom gi.repository import GLib, Gtk\nfrom lo"
  },
  {
    "path": "utils/inhibit.py",
    "chars": 5999,
    "preview": "# From https://github.com/stwa/wayland-idle-inhibitor\n# License: WTFPL Version 2\n\nimport argparse\nimport os\nimport subpr"
  },
  {
    "path": "utils/monitors.py",
    "chars": 1996,
    "preview": "import json\nimport warnings\nfrom typing import Dict\nimport time\nfrom fabric.hyprland import Hyprland\nfrom gi.repository "
  },
  {
    "path": "utils/occlusion.py",
    "chars": 4852,
    "preview": "import json\nimport subprocess\n\nimport config.data as data\n\n\ndef get_current_workspace():\n    \"\"\"\n    Get the current wor"
  },
  {
    "path": "utils/roam.py",
    "chars": 1122,
    "preview": "from loguru import logger\n\nfrom fabric.audio import Audio\n\nfrom services.modus import ModusService, notification_service"
  },
  {
    "path": "widgets/circle_image.py",
    "chars": 4320,
    "preview": "import math\nfrom typing import Literal\n\nimport cairo\nimport gi\nfrom fabric.core.service import Property\nfrom fabric.widg"
  },
  {
    "path": "widgets/custom_image.py",
    "chars": 1180,
    "preview": "import math\nfrom typing import cast\n\nimport cairo\nfrom gi.repository import Gtk\n\nfrom fabric.widgets.image import Image\n"
  },
  {
    "path": "widgets/customrevealer.py",
    "chars": 10782,
    "preview": "from gi.repository import GLib, Gtk\nimport gi\nimport math\n\ngi.require_version(\"Gtk\", \"3.0\")\n\n# TODO: UsE BETTER APPROACH"
  },
  {
    "path": "widgets/dropdown.py",
    "chars": 2932,
    "preview": "from fabric.widgets.box import Box\nfrom fabric.widgets.centerbox import CenterBox\nfrom fabric.widgets.eventbox import Ev"
  },
  {
    "path": "widgets/mousecapture.py",
    "chars": 5268,
    "preview": "from typing import Any\n\nimport cairo\nfrom gi.repository import GLib, GtkLayerShell  # type: ignore\n\nfrom fabric.widgets."
  },
  {
    "path": "widgets/popup_window.py",
    "chars": 7050,
    "preview": "import contextlib\nimport gi  # type: ignore\nfrom gi.repository import Gdk, Gtk, GtkLayerShell  # type: ignore\n\nfrom widg"
  },
  {
    "path": "widgets/wayland.py",
    "chars": 11441,
    "preview": "import re\nfrom collections.abc import Iterable\nfrom enum import Enum\nfrom typing import Literal, cast\n\nimport cairo\nimpo"
  },
  {
    "path": "widgets/wifi_password_dialog.py",
    "chars": 8999,
    "preview": "import gi\nfrom gi.repository import Gdk, GLib\n\nfrom fabric.widgets.box import Box\nfrom fabric.widgets.button import Butt"
  }
]

About this extraction

This page contains the full source code of the S4NKALP/Modus GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 111 files (1.5 MB), approximately 374.1k tokens, and a symbol index with 1436 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!