pax_global_header00006660000000000000000000000064151422212330014505gustar00rootroot0000000000000052 comment=5306dbd9892c93f7cbb146e327375f305ebdacd6 Refine-0.7.1/000077500000000000000000000000001514222123300127225ustar00rootroot00000000000000Refine-0.7.1/.gitignore000066400000000000000000000000761514222123300147150ustar00rootroot00000000000000/subprojects/blueprint-compiler .flatpak-builder .buildconfig Refine-0.7.1/.gitlab-ci.yml000066400000000000000000000003231514222123300153540ustar00rootroot00000000000000image: python:3.12 include: 'https://gitlab.gnome.org/GNOME/citemplates/raw/master/flatpak/flatpak_ci_initiative.yml' pre-commit: script: - pip install pre-commit --quiet - pre-commit run --all-files Refine-0.7.1/.pre-commit-config.yaml000066400000000000000000000015061514222123300172050ustar00rootroot00000000000000# See https://pre-commit.com for more information # See https://pre-commit.com/hooks.html for more hooks repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v6.0.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer - id: check-yaml - id: check-xml - id: check-json - id: check-docstring-first - id: pretty-format-json args: ["--autofix", "--no-sort-keys", "--indent", "4"] - id: check-added-large-files - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.14.4 hooks: - id: ruff-check args: [ "--fix" ] - id: ruff-format - repo: https://github.com/pre-commit/mirrors-mypy rev: v1.18.2 hooks: - id: mypy args: ["--pretty", "--strict"] additional_dependencies: ["pygobject-stubs"] Refine-0.7.1/.well-known/000077500000000000000000000000001514222123300150755ustar00rootroot00000000000000Refine-0.7.1/.well-known/funding-manifest-urls000066400000000000000000000000371514222123300212410ustar00rootroot00000000000000https://tesk.page/funding.json Refine-0.7.1/COPYING000066400000000000000000001045171514222123300137650ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. 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. Copyright (C) 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 . 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: Copyright (C) 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 . 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 . Refine-0.7.1/README.md000066400000000000000000000036111514222123300142020ustar00rootroot00000000000000
# Refine Tweak various aspects of GNOME
## Contributing This project follows the [GNOME Code of Conduct](https://wiki.gnome.org/Foundation/CodeOfConduct). ## Development ### Flatpak Add the [GNOME Nightly](https://wiki.gnome.org/Apps/Nightly) repository: **System** ```bash flatpak remote-add --if-not-exists gnome-nightly https://nightly.gnome.org/gnome-nightly.flatpakrepo ``` **User** ```bash flatpak remote-add --if-not-exists --user gnome-nightly https://nightly.gnome.org/gnome-nightly.flatpakrepo ``` #### GNOME Builder The recommended method is to use GNOME Builder: 1. Install [GNOME Builder](https://apps.gnome.org/app/org.gnome.Builder/) from Flathub 2. Open Builder and select "Clone Repository…" 3. Clone `https://gitlab.gnome.org/TheEvilSkeleton/Refine.git` (or your fork) 4. Press "Run Project" (▶) at the top, or `Ctrl`+`Shift`+`[Spacebar]`. #### Flatpak Builder 1. Install [`org.flatpak.Builder`](https://github.com/flathub/org.flatpak.Builder) from Flathub ```bash flatpak install org.flatpak.Builder ``` 2. Clone the repository (or your fork) ```bash git clone https://gitlab.gnome.org/TheEvilSkeleton/Refine.git ``` 3. To build, run the following in a terminal from the root of the repository: ```bash flatpak run org.flatpak.Builder --force-clean --install --user build-dir build-aux/page.tesk.Refine.Devel.json ``` 4. To launch Refine, run: ```bash flatpak run page.tesk.Refine.Devel ``` ### Meson You can build and install on your host system by directly using the Meson buildsystem: 1. Install `blueprint-compiler` 2. Run the following commands (with `/usr` prefix): ```bash meson --prefix=/usr build ninja -C build sudo ninja -C build install ``` Refine-0.7.1/build-aux/000077500000000000000000000000001514222123300146145ustar00rootroot00000000000000Refine-0.7.1/build-aux/dconf-override.patch000066400000000000000000000015571514222123300205530ustar00rootroot00000000000000diff --git a/engine/dconf-engine-source-user.c b/engine/dconf-engine-source-user.c index 1657875..e4f8786 100644 --- a/engine/dconf-engine-source-user.c +++ b/engine/dconf-engine-source-user.c @@ -39,11 +39,17 @@ dconf_engine_source_user_open_gvdb (const gchar *name) { GvdbTable *table; gchar *filename; + const gchar *override; + + override = g_getenv ("DCONF_USER_CONFIG_DIR"); + if (override == NULL) + filename = g_build_filename (g_get_user_config_dir (), "dconf", name, NULL); + else + filename = g_build_filename (g_get_home_dir (), override, name, NULL); /* This can fail in the normal case of the user not having any * settings. That's OK and it shouldn't be considered as an error. */ - filename = g_build_filename (g_get_user_config_dir (), "dconf", name, NULL); table = gvdb_table_new (filename, FALSE, NULL); g_free (filename); Refine-0.7.1/build-aux/page.tesk.Refine.Devel.json000066400000000000000000000050261514222123300216400ustar00rootroot00000000000000{ "id": "page.tesk.Refine.Devel", "runtime": "org.gnome.Platform", "runtime-version": "master", "sdk": "org.gnome.Sdk", "command": "refine", "finish-args": [ "--share=ipc", "--socket=fallback-x11", "--socket=wayland", "--talk-name=ca.desrt.dconf", "--talk-name=org.freedesktop.Flatpak", "--filesystem=xdg-run/dconf", "--filesystem=xdg-config/dconf", "--filesystem=host-os:ro", "--env=GIO_EXTRA_MODULES=/app/lib/gio/modules/", "--device=dri" ], "cleanup": [ "/include", "/lib/pkgconfig", "/man", "/share/doc", "/share/gtk-doc", "/share/man", "/share/pkgconfig", "*.la", "*.a" ], "modules": [ { "name": "libportal", "buildsystem": "meson", "config-opts": [ "-Dtests=false", "-Dbackend-gtk3=disabled", "-Dbackend-gtk4=enabled", "-Dbackend-qt5=disabled", "-Ddocs=false" ], "sources": [ { "type": "archive", "url": "https://github.com/flatpak/libportal/releases/download/0.9.1/libportal-0.9.1.tar.xz", "sha256": "de801ee349ed3c255a9af3c01b1a401fab5b3fc1c35eb2fd7dfb35d4b8194d7f" } ] }, { "name": "dconf", "buildsystem": "meson", "config-opts": [ "-Dbash_completion=false", "-Dman=false" ], "cleanup": [ "/include", "/lib/pkgconfig", "/libexec", "/share/dbus-1" ], "sources": [ { "type": "archive", "url": "https://download.gnome.org/sources/dconf/0.49/dconf-0.49.0.tar.xz", "sha256": "16a47e49a58156dbb96578e1708325299e4c19eea9be128d5bd12fd0963d6c36" }, { "type": "patch", "path": "dconf-override.patch" } ] }, { "name": "refine", "builddir": true, "buildsystem": "meson", "config-opts": [ "-Dprofile=development" ], "sources": [ { "type": "dir", "path": "../" } ] } ] } Refine-0.7.1/data/000077500000000000000000000000001514222123300136335ustar00rootroot00000000000000Refine-0.7.1/data/data.gresource.xml.in000066400000000000000000000030461514222123300176730ustar00rootroot00000000000000 @app_id@.metainfo.xml icons/hicolor/symbolic/actions/larger-brush-symbolic.svg icons/hicolor/symbolic/actions/overlapping-windows-symbolic.svg icons/hicolor/symbolic/actions/org.gnome.Settings-power-symbolic.svg icons/hicolor/symbolic/actions/org.gnome.Settings-sound-symbolic.svg icons/hicolor/symbolic/actions/org.gnome.Settings-wellbeing-symbolic.svg icons/hicolor/symbolic/actions/info-outline-symbolic.svg icons/hicolor/scalable/apps/com.usebottles.bottles.svg icons/hicolor/scalable/apps/io.gitlab.theevilskeleton.Upscaler.svg Refine-0.7.1/data/icons/000077500000000000000000000000001514222123300147465ustar00rootroot00000000000000Refine-0.7.1/data/icons/hicolor/000077500000000000000000000000001514222123300164055ustar00rootroot00000000000000Refine-0.7.1/data/icons/hicolor/scalable/000077500000000000000000000000001514222123300201535ustar00rootroot00000000000000Refine-0.7.1/data/icons/hicolor/scalable/apps/000077500000000000000000000000001514222123300211165ustar00rootroot00000000000000Refine-0.7.1/data/icons/hicolor/scalable/apps/com.usebottles.bottles.svg000066400000000000000000000202371514222123300262640ustar00rootroot00000000000000 Refine-0.7.1/data/icons/hicolor/scalable/apps/io.gitlab.theevilskeleton.Upscaler.svg000066400000000000000000000103441514222123300304720ustar00rootroot00000000000000 Refine-0.7.1/data/icons/hicolor/scalable/apps/page.tesk.Refine.Devel.svg000066400000000000000000000221671514222123300257750ustar00rootroot00000000000000 Refine-0.7.1/data/icons/hicolor/scalable/apps/page.tesk.Refine.svg000066400000000000000000000072721514222123300247370ustar00rootroot00000000000000 Refine-0.7.1/data/icons/hicolor/symbolic/000077500000000000000000000000001514222123300202265ustar00rootroot00000000000000Refine-0.7.1/data/icons/hicolor/symbolic/actions/000077500000000000000000000000001514222123300216665ustar00rootroot00000000000000Refine-0.7.1/data/icons/hicolor/symbolic/actions/info-outline-symbolic.svg000066400000000000000000000014551514222123300266430ustar00rootroot00000000000000 Refine-0.7.1/data/icons/hicolor/symbolic/actions/larger-brush-symbolic.svg000066400000000000000000000015471514222123300266320ustar00rootroot00000000000000 Refine-0.7.1/data/icons/hicolor/symbolic/actions/org.gnome.Settings-power-symbolic.svg000066400000000000000000000016431514222123300310560ustar00rootroot00000000000000 Refine-0.7.1/data/icons/hicolor/symbolic/actions/org.gnome.Settings-sound-symbolic.svg000066400000000000000000000030471514222123300310520ustar00rootroot00000000000000 Refine-0.7.1/data/icons/hicolor/symbolic/actions/org.gnome.Settings-wellbeing-symbolic.svg000066400000000000000000000026431514222123300316730ustar00rootroot00000000000000 Refine-0.7.1/data/icons/hicolor/symbolic/actions/overlapping-windows-symbolic.svg000066400000000000000000000013101514222123300302370ustar00rootroot00000000000000 Refine-0.7.1/data/icons/hicolor/symbolic/apps/000077500000000000000000000000001514222123300211715ustar00rootroot00000000000000Refine-0.7.1/data/icons/hicolor/symbolic/apps/page.tesk.Refine-emblem.png000066400000000000000000000057631514222123300262410ustar00rootroot00000000000000PNG  IHDR\rfsRGBcICP i;2 IDATxo齔[ R.2.2.rD"ɢ1:7M6eٲ9sy榢e&WKTR( r)zz/(yy?+ -*nC#cp18F#cp18F#cp18F#cp18F#cp18F#cp18F#cp18F#cp18F#cp%[(X]tx*O֥sj4Zϊ4EzӍQ(%-z;Em#<)ڴBڋ筧J9t>qW@4Gh߇5+b=>5/n}O^ 7@ mZ=WZψQU3\ QiXψ;DHcGt>݅3C['ĭC{DXO['[OHx xj.@y`=!18F#cp18Fc#cp18Fǒē*ۿC'ܩc:ZZOs)JRZFwzW!;xr7!Зhid:ZT7@ߘ:OL/A-ZpS)?T!7[O ,4G a9yϏj=%p sjkŸӲ)Nl^3'j#O+=+zN-Ƃ'x'OJƂ'Po=%PemmmZUQ~z k3G3e3HXh=1~"\@Ҷ5ozbV.iR1_gJ5GgsOmSC] XC]a}~z:} {usX_k=F ZZ"`o18F㚀 %G]0By%7O:(5=CI`e-jjץs:{NRO`?鐓QScg]9$)lgeK|$IpVwG7,SS+ٝ4eރ2nf_]4n3NݺZjg82Y1gId 8G#'kVɶ֓\#F;q ?zlvS=`V''0;4zanUvZ_(5cc,NѼ~œ }wk fc=#p FjֽYpАg}5MUʹ Nq3oGz F{iBzV&}z ;u3gčaߜ93\ 10z 'XψIdv.( 4h4qg xxFp3Pٝnw;vQ DYV~H DY_rXOHx rrYOHx AվG,%-zBJM˰HcD٥s](;wu]((?h=!nqEEVAnh#QvHjXψ;5UgTqGUwo=#l_Qb1@b`KuVkK>*\n=5UqcU# F6,]ڋ3Fl= #ͅ3oTw 7@ l[ZM+:{gud9n}9kmi~ҝSlSl4Ox*)6[yppX 'ZO0>iY`SׯYO]{ZO0>y'H̹@M'H߁'s~*=8 edW@SR5|(9o@ͼ[|"EZF;=3H)zCjo=#e#'U[g n6|W B!{)}j?W( i険gԳ)zR3 lg5bmSp]4b\?;{jVY%۵nB;t>8ONm-\ %N]ե{z~^_C@18F#cp18F#cp18F#cp18F#cp18F#cp18F#cp18F#cp18F#cp_qIENDB`Refine-0.7.1/data/icons/hicolor/symbolic/apps/page.tesk.Refine-emblem.svg000066400000000000000000000045571514222123300262540ustar00rootroot00000000000000 Refine-0.7.1/data/icons/hicolor/symbolic/apps/page.tesk.Refine-symbolic.svg000066400000000000000000000031311514222123300266170ustar00rootroot00000000000000 Refine-0.7.1/data/icons/hicolor/symbolic/apps/page.tesk.Refine.Devel-symbolic.svg000066400000000000000000000031311514222123300276550ustar00rootroot00000000000000 Refine-0.7.1/data/icons/meson.build000066400000000000000000000005301514222123300171060ustar00rootroot00000000000000scalable_dir = 'hicolor' / 'scalable' / 'apps' install_data( scalable_dir / app_id + '.' + 'svg', install_dir: get_option('datadir') / 'icons' / scalable_dir ) symbolic_dir = 'hicolor' / 'symbolic' / 'apps' install_data( symbolic_dir / ('@0@-symbolic.svg').format(app_id), install_dir: get_option('datadir') / 'icons' / symbolic_dir ) Refine-0.7.1/data/meson.build000066400000000000000000000043451514222123300160030ustar00rootroot00000000000000conf = configuration_data() conf.set('app_id', app_id) conf.set('app_name', app_name) conf.set('developer_id', developer_id) conf.set('exec', get_option('exec_name_as_base_id') ? base_id : meson.project_name()) desktop_file = i18n.merge_file( input: configure_file( input: base_id + '.' + 'desktop.in.in', output: base_id + '.' + 'desktop.in', configuration: conf ), output: app_id + '.desktop', type: 'desktop', po_dir: '../po', install: true, install_dir: join_paths(get_option('datadir'), 'applications') ) desktop_utils = find_program('desktop-file-validate', required: false) if desktop_utils.found() test('Validate desktop file', desktop_utils, args: [desktop_file]) endif pkgdatadir = get_option('prefix') / get_option('datadir') / meson.project_name() appstream_file = i18n.merge_file( input: configure_file( input: base_id + '.' + 'metainfo.xml.in.in', output: base_id + '.' + 'metainfo.xml.in', configuration: conf ), output: app_id + '.' + 'metainfo.xml', po_dir: '../po', install: true, install_dir: get_option('datadir') / 'metainfo' ) gnome.compile_resources('data', configure_file( input: 'data.gresource.xml.in', output: 'data.gresource.xml', configuration: conf ), gresource_bundle: true, install: true, install_dir: pkgdatadir, dependencies: [appstream_file] ) appstreamcli = find_program('appstreamcli', required: false, disabler: true) test('Validate appstream file', appstreamcli, args: ['validate', '--no-net', '--explain', appstream_file]) install_data('page.tesk.Refine.gschema.xml', install_dir: get_option('datadir') / 'glib-2.0' / 'schemas' ) compile_schemas = find_program('glib-compile-schemas', required: false, disabler: true) test('Validate schema file', compile_schemas, args: ['--strict', '--dry-run', meson.current_source_dir()]) service_conf = configuration_data() service_conf.set('bindir', get_option('prefix') / get_option('bindir')) service_conf.set('exec', get_option('exec_name_as_base_id') ? base_id : meson.project_name()) configure_file( input: 'page.tesk.Refine.service.in', output: 'page.tesk.Refine.service', configuration: service_conf, install_dir: get_option('datadir') / 'dbus-1' / 'services' ) subdir('icons') Refine-0.7.1/data/page.tesk.Refine.desktop.in.in000066400000000000000000000003141514222123300213260ustar00rootroot00000000000000[Desktop Entry] Name=Refine Comment=Tweak various aspects of GNOME Exec=@exec@ Icon=@app_id@ Terminal=false Type=Application Categories=GTK;GNOME;Utility; Keywords=tweaks;tweak;toggle; StartupNotify=true Refine-0.7.1/data/page.tesk.Refine.gschema.xml000066400000000000000000000002371514222123300210550ustar00rootroot00000000000000 Refine-0.7.1/data/page.tesk.Refine.metainfo.xml.in.in000066400000000000000000000222551514222123300222660ustar00rootroot00000000000000 @app_id@ CC-BY-SA-4.0 GPL-3.0-or-later Refine Tweak various aspects of GNOME

Refine helps discover advanced and experimental features in GNOME.

Hari Rana (TheEvilSkeleton) offline-only 360 #c8dbf4 #2d5a91 pointing keyboard touch https://gitlab.gnome.org/TheEvilSkeleton/Refine/-/raw/main/data/screenshots/1.png Appearance Page https://gitlab.gnome.org/TheEvilSkeleton/Refine/-/raw/main/data/screenshots/2.png Shell & Compositor Page https://tesk.page/refine https://gitlab.gnome.org/TheEvilSkeleton/Refine https://gitlab.gnome.org/TheEvilSkeleton/Refine/-/issues https://dir.floss.fund/view/funding/@tesk.page https://gitlab.gnome.org/TheEvilSkeleton/Refine https://gitlab.gnome.org/TheEvilSkeleton/Refine/-/tree/main/po https://matrix.to/#/#refine:gnome.org https://matrix.to/#/#refine:gnome.org refine @app_id@.desktop
  • Update Georgian and Chinese translation
  • Add hidden options for Digital Wellbeing
  • Fix bug that showed duplicate theme names
  • Fix “FileExistsError” bug
  • Exclude content from the Flatpak runtime
  • Update Chinese translation
  • Add warning style class to experimental features
  • Remove experimental toggle for kms-modifiers, as it is not associated with NVIDIA
  • Remove shortcut window
  • Permanently show reset buttons
  • Update Turkish translation
  • Rows containing a switch announce the current state and role
  • Switches inside rows are no longer focusable with a keyboard
  • Alphabetize “Experimental Features” group
  • Add toggle for showing power buttons in lock screen
  • Remove shortcut window
  • Permanently show reset buttons
  • Add Indonesian translation
  • Add Arabic translation
  • Update Persian translation
  • Add Norwegian Bokmål translation
  • Update Brazilian Portuguese translation
  • Add Japanese translation
  • Add Georgian translation
  • Add Ukrainian translation
  • Update French translation
  • Update French translation
  • Update Italian translation
  • Add options to configure the window button layout, as well as exposing maximize and minimize buttons
  • Rename “Middle Click Paste” to “Middle Click to Paste Text”, with subtitle
  • Re-add Document font option
  • Update translation strings
  • Add French translation
  • Add Persian translation
  • Add Italian translation
  • Add Polish translation
  • Add Spanish Spain translation
  • Add German translation
  • Ignore errors when opening the about dialog
  • Add Portuguese Brazil translation
  • Update Chinese translation
  • Add Turkish translation
  • Add Russian translation
  • Add Chinese translation
  • Add font hinting and font antialiasing options
  • Add background options
  • Add window header bar options
  • Add resize with secondary clicks toggle
  • Add window focus mode options
  • Add automatically raise on hover toggle
  • Rename “Middle Click Paste” to “Middle Click to Paste Text”
  • Rename “Legacy Themes” to “GTK 3/4 Theme” and clarify exceptions
  • Set up translation
  • Display warning page on unsupported environments
  • Fix bug where launching Refine in a collapsed window would automatically open the Appearance page

Add legacy theme preference

  • Update screenshots
  • Improve wording of certain features
  • Remove Document Font setting
  • Exit on non GNOME desktops

Initial release

Refine-0.7.1/data/page.tesk.Refine.service.in000066400000000000000000000001221514222123300207050ustar00rootroot00000000000000[D-BUS Service] Name=page.tesk.Refine Exec=@bindir@/@exec@ --gapplication-service Refine-0.7.1/data/screenshots/000077500000000000000000000000001514222123300161735ustar00rootroot00000000000000Refine-0.7.1/data/screenshots/1.png000066400000000000000000004100311514222123300170400ustar00rootroot00000000000000PNG  IHDR47sBIT|dtEXtSoftwaregnome-screenshot>&tEXtCreation TimeSun 12 Jan 2025 13:13:57l䒿 IDATxwu?f)ВJPy X~aOTQ!VJ@J("&HBdKvwɰ3;3;33|><2~;Yv5'Q:@%UP4TmF#)#Їz~~RD$T!rp]FؕH.#9JB_ZspVQz3s[~__j=8>6\}f½Z kO!/zU/<`dWKab-<GV^JV[%¿Z k L}~yj?|V;TCTڔ~)G(X`' SkRO& 5DU[zr^0RjB! d=S }zU AP CU/Apӽg8¼b!eHSaf7﹑(U9ڮPs dU}bbV> 6I j\BY~zX Q~S(&QA_5+GPըs v| ةZʬ3[Sl\CJ5GAQZUf- /J]Uk ʨ0{W}54m5Lsjjej#))4Rr#!)iMԔOTeV+= ԀǪ֬c¡0AfCL#Ԏr';l 5t3;,GY] ѩVR5pP pJS23,5ĬPoFjYjXl 5H34ZYq\'_;](^P\[)՗[5Px 3JrAf%+h+_q]Z.B"S(Bܐq9.r\[3Y9CΡV_r\)5Y±jHTj͗Yɪ̡TccJ@q1k-j5שUVd@ %H,wYLfUk 5!H\= 23w\9 W,_[9pB#oO)C"+,4Ĭ'#yH < \al|5)P [rkSbr^J^V@-)gcoJ6ZS '.C !f)׵y<`([ppWk 53~0\AfBJUkBU'TR-T[*} 7l 5&p]JVeV2,ǰWL?•ZX@t f=Wk 57 ^r11-0<=P(B: 8zU-Ve%,:= +G0VHc*4,GYjM0 5jWJUpm@yRXj8ض6:gp:U %,*Af)m&[y} hV;0f5+hbfRY !hI`4IP+33p\pUk 5+l4+#),G9sd˩@%:d;`/׶|!d1/W)Ԭ500WY sBkRI:cUвQLZqF]9ZÞJ>brTed`픣ʲRh}PjQ媶,t'򄉥C,Ǽj 4Gz32l)Af$bRo}1{U!e̵=sB\Wȹk%, 3 C JakG TH7!bsdS2z3+]kb_WU Z`Tr2۾Tg{\B3žJf3]Yl|VYJ_0\d Bo])f95k=h #=fB\ηO!qܓP ,u%3-&wnf H 3K,D > m;W; 3AWgv F󵝭l OsuɵPsFCTX/af!Af~UIX_谶ʷhTbðB.2~)hֱJ_0s(sPfdbRPN ̶>[YHYPcocr#,Hj:3_ņC 23 0VHgZ!gKzVlu`) 9+ #wlsPs(ŴQ*faf29˶>۶be$߷Pi_T+4&X\rTk 5H F{o|U  V=9,mg~oHZ5lu~)$,Zs(B:0Rj/tbZfKd 1""x?x¤IаcDLhhI&YuW^mݶ]>EDg__Kgi{{+Vs}+h_dAf32-۾͵ۿK%Ь3s헫p8̡֥_<蓍M%ɉY@hPN{^~yw7vie 6s5UifmP9e!gTe>ӦLޭ<苾֮]o?]`'r֬Y7ʬ6l8\f%hbծά03\ffSϜ6eʔeVcI/F,&ۛ'~7_l̬̬PSfЃjٖ@e(M{uz&M:'Jؘ^{t߹ ͖Ud22("+2l:6߾iŇ1.H, q"7g"lUise>67' MYdz.N;tskVNfEf2B6 J 9Թ3ffn/%77f!fWZsCD߮d>M&mA7f!|\Ji.2)CjYC 3 3b(򗿼k 3jhmmpGGe'xf9͕{fHJ!Ḱ QL.UQXI 5l 3󅛉hv;\LmLQ3""&OT0$wmC&b*fjq\afd3W٘f&LTYCCô#8+Oef +)BRQ~H0T9XrزD7Caf|H^d29%ldMjAooc?q4Y/r̛74v1f#er*:}sHj՚넙@-jll|/|Y Id6jϥY=Ьqm/fLlafd_b7#v a&PZ[[?xW`IP32+d]!2jUw=ЬJ akyf曻so&$ƌ{B@Em_:sg=1Hy2Bg[.+/H?sgf@2Tj67okիܖLm3Ԛ ?~m7clk2f_B̷_!sim TƖRk9sL\$BcD4,^ԧ@=inGFQWQ0Zff%K?@*Q9#\oT~Ԅ}lنݤ63Թ4Ez ǍIy33DŽܖET23:ؘs=/Wm|U֗Psz 4keա],$S22gF,jYqh֢r3g{d;& W_}~[LN577_lYHYJ.?@\0yB6=;" PN:c6>L ,f|pdL^=R^[J`vlD74773:[- )r|Fu6U@7`6gKDod+}s3» $d2'zzz#d2"D$MMMD56&wq]wu/oBrd$}'"">ɦXʨ r\` ~!f8gVA{e+1c]EO~rԩg M vڈ~ %H&36DOOhjj126ډ.cz]ѻ1PLnwru'}yGFٗqqcdl*UXB2-G.u|l*9'O|`X2,9鎞X=Z[FkkkMTm{FތJ,tߡM-Ь*εnIiԸ}2Y%QM!q1nܸ2_ &쒑eY&BוBZC-,bJۑ*-_u\N0,L===n!-[hoo c„Ty̦2̶)!6`A`՗|FmSz7bqo^Ά ԰Xa3_k׾]]]v rE,sd-C5\͢ZY \pŞ{@Ug2l,_@舶*E[[[ttt ĤvYhRHY숟C=79SYO/j}ɼ?|-#֯__njXΗd+rg=O{W3iooOL,YtGktttƝw\paj>͊ F+:-Z㏍}ٻj}Iɾv7 "hLѐXfnX2H @r2eSIU=_⦛n.h-">[hj̏.ɀ0s6Gsssӟ-{J\{u]v%/[olٲhnn3K;n/{_on޼̈NAW׆!x\DDlOK̙sP~qߋ!""nյa8J 1&X^J ؤ̚5+9898f> vBrܸ~%KD2'z""1vqLjx󛏉w9s8_se D7pCqw {Fd2==%rW~G}.| 3KӝlF*d{\v+pWv*4/P39=n۴uK,sV,^dj_o{?K.O[6m%'?z~^ziu{}qyN-|8昣;0s&+El G;;~X~s_|L;߄ K:wwwwdP BRTlQ=Th6Qrm/v=Ԅv!/Uj>3[dϾ?(o9;q|n=ֶ====%g}n,Xhw}O|kyޒ]j PDRcThO%nb*5UkRz9sXdiDDlذ!Vz)5$lGk,X -[6l3gN;G}T7.m;+~ߧ/v!|1Gnj_?=#f> ֶ.~v1â7.| XreL2%vy8#c„ y{2 _ߣ)vim#oej_i#â97tK<;sbvƢEb;#"㎍iӶe˖5\O?LtttĶnG}T̙sϩm]|-ƪU/Ŕ)Sb]vf>qk֬_{^U^-"vۘ5q!sr-~EDĉK,;+Wmgώ׽nqK.SX|cݺu1cvm#k[.c^<#vnb=vc9jt!d̟ X-"fFz!1k볶1 QOOiE o}[3~E_߫Eo==8o ? '}/BfdC实TY&9UPBݯO!&O4`Ǎ7ޔ~$""~_Ǚgt`j۝ws: R{G̘1=֬Y?'@-}ҤI1iҤ3,p_/[שּׁ瞋s9/{챴 .3> 'JB⨣#|S\rɥ7<7gyRϘ1=ν-,3m?8S=9a@O<(~GDcqe?I}XCǵ1⬳? IDAT9ٽ_7cʕic^G??68㴴/0sϋ{/38;m&m+SSSq5i}ӟ׽nThC=?ew#N;:6z'c|xwWW6mZ3Kk_Fe~Wo?>mP3fdkgK>o9^eBr6 mf=N駟>뮻`#>ONJ+rr;.yB._~9o_G1v؜19-zso*`/R[[[cΜ""bbwz:"".| V^SNޗ՜ۺJ|ɹ߯~bŊ㢋.~y?F[ۺ8쯧M4)|AϸO~YSNdwGDDcc"k_2}46&⬳̹ߝwwywڶp1oxH[re\tũiӦiKαbq?Lw1/Oq衇DDDk8CGC;Cl-믿1#"bѢ]}?{0s̘1cƌIMᄈbԩ1if1g1c2eJ+שׂ}wܱn^SN׿~jG{<;;Ժ8]v9=6mZ+OϦUuѬUPrQW@)՗z9T6{ 5cwܱ7nٲey+#"=q駦wyK OĊϧj9C5.1c/O/7<|뭷7yNj9sإn1-ZZ>3SrED^zx?GDm.&wjK#<2mG15iD--({8W^n%-h|?>cÆWÿ hFD̙sp|իWL$2&N8 '+qV@&xSL?hnnE̳V y<hŋ/ZqYg<ݤ OfCCà_3b,+|ǀ}Lu֙036~Yt㾾ʔ)qif:h׌!?AsyY}u !CQξ3:zf=6lxb_blnnٳgu1՟˗Ů˗?}c^| h_ 6ˋ$x'ǟ{ҪGKjs9?D,Z8V\W 6ͅree3cFz{.֮}my}ֱY M"tBvqyN 37})kSf___\toy˛K>gהI2~˙5]Xc3R+_hѢ8虜q8餓b) oA5fLˠTRccmmmi_?7| ߑLEDy݃w-s 4s>}z*\~}ǸqlcZ/]w5-kVK˘ 6/~˸ߧ ;m6q}Vz).1wm!\)_5kҖڪaq`J$K4c^w/iw{aıǾ׈̜%WZAd hᦶxx衇naĥ ??ัcӿ2`HL;CY^N---i6q-j kEҥKc틟ӾT &M*:l#"bƌ:`sg8㌳⡇J>}z^1s7n\\xEE7^x!>Ok1};vl`ʥ5ofJ0555F@uE7o~syisf644g>sz sSY9~Sgw(@3Z[-r:唏]w]]]+/}ߴiߠ~O>jXZNӦMKH$SHd1|uBM_d)|46lȺ3-{mv^XD"iӢ!ό}+6wia{Oq駦??/?M 3>>d‹΋U3gnD"O,d29*:hTZ(oǙxYfUlJV]rߪj4XK_-f-O|Oں /(zzzxg9?x@q2GUoJ0?]zi|ܼ?_Jd=Ư~{X^K477GDɓbwKm[tYBǟH[x{-b7vxÖ1cƤͱ /ĕW^5q^g62T/:x0|[gyFj^cԾטZxj/5`ܸ'OiՉ˖-GA_j^SO=#׿}aÆ駟͉''ON-~O i+q-KȭpMMMqoȻ>o>5|ό/"~øKS[[[?{^\:8C߾;~El?Y?-"&NVmmm_lիfDw)O1~hooO2f9pq/q忈'D[ۺǖˉ'Sxͩp:L//a-oysl%^gZZDO&ҼMozcIn26*] PB4 GudkEuuu b뭷os=oذ!-[/bjڻS?,(7sg[.yfIY&*/\yd3K0[n{{KKK?Xp9昣Zm/O~<Ǝ~ժU3K-b\R-Hmg}{֯_}}}ǔ{5`030H$쳿>`Șô/,HfFu4lsݐԨZBnb֬Yc(q6cɒۧqߎson-xonݺhhh6,bwYq h-K;6m3I2&mۦo;|GĜ9ǕW^so<3MMM1eʔ>}Z̞=;=tΠmpYꥴj#83ذaCjݳ>mm~cƌ<xXfm?>oV|CY^_;x衇[o_|1u%wq8?[".|0Vx.6l莱cOw1;CqƩᄈWu*zcw|ñ뮻Ƙ1-bŊH].kjjK.(~n˟d7f=8b̘1nݺ]v%-<|SLzl>}z|{ߍo~G,Y$}ӎ񶷽u*:hH4DkشkYkH$=uf+Mk.*w2Akؖq"}2e[Vbr߶~2iUV?#I2'擡!g׮]o?*F/RcƌoKmA۸Ҧ^{YTtww!L&o뫉d444 \gmd^Vs~b)d̘}7^ވHn|ߦm}'m8rdl$e{ǹ^lm/rjƪ Mp@ZcXu^jc(!p2JyL\"qZ]kܸZ6~y 5}'079Pƍ"PSSs7ݨU2!hffjք k4h7_ԪhV(JSSSL8` #qj-YN 4+7x`jiikrRnd3jV&~ 5 _oqLDlj,/7FDêUUk׮Y@[[[tvvrˢ쌶ɓv(X~}U0~hmmӼoDEDoD$7>N/,7(ٖc㾑/c]˷_6[ F\o@ĉcĉ%1v;vlPOZ[[#HD[ۺ*Q 1qZ,Z F&@kiiXn}t9c„#qLj94Օ*;4MMM1y7n\7n\L<LN ƍcǎ,H :65- &H$b:.:kÐmjj126 E ?&H4DkkkF2鉞H&{#LFΆWD1)UcRuu%hiijwe4i(㘿HYMf 4kl*GSU d5u@ ԬZ 40j2@B @EȘ*D ,&P@h5K ,&P@h @@F&P@h5K ,&P@h5K Ԭh6TP!#>  &P@h5K ,&P@h5K ,4T4U ===vFhlLDccc455Esss466V[%Ф$]]]= ==]]"")ZZZ&CaÆ舞jw`T3fLPVM~v7觧7ر-1~jwl,Lƺu / P:;7&LD(O:)H26a&@H& @dݺu#==nݺjwdM~zu'֯__nDI^6lήjw! 6TC&$jwY3&9uuu7`鍮.@}hF?z%$v7(Uu&YuwwW @=hUOLv 4ʰ#@=hUoo]l@v 4%j@YMf 4%j@YMf5U0\z{{{߀mW]۪  ===q߉?*}`pMjJOOOrܘ7o~,_<:;I'}(󆙇vHvک%JhR3V^7g'8?A38=K>v 6Vf/<0sPMj--cy0ۃկ;|^*ÐԄy-t8Sb)Eyp~aqE"_7qWǞ{G_e˖??~|PKԄ˟M[jG}t?|L>=+WGKnD{{{xꩧ-&Of͊}-˗ǜ9cժUq=s=6l:9(~O<+W';>1uԜ$xѿ IDAT>/bJ[lՖ1cƌ8%6mk""⩧mQtvv̙3cK]dI,^dx饗bI1mڴc-6z7o~lV>{Gwww<_5ko3gΌ9sAŋǺub6:fϞ[meY-Me+ڗR~qtЁ=qw{>̒8;.hooOk?~6뮸cٻ訪ϴz & ]*E ^]^_{W^Q):"7/ ^ LLY9gso&0白wFF~y[9shذt}tפI_];C 8~9ߔQ{uE=|>;aÆϭH}UVkyڷohkuM= ǟ(<]VJJZnf͚*&&F6Mڵ딒}-5ik{տ:vBոqcl6׈WI:~ۯ M%&&j5ҬYUv :Y0aBս{7lBڽ{V\G[?yOϝO.SjѢ?ׯ :tH6lT\\*{m8hոq.ŋOkӦի֫WO[^G޽Լy\֭{QQԜ9s5c,= <7ߨanp闛g֭[%KuVn͝WӦzj2j}t͛7__zPQQQC#F<^4f̳_Oر֝=K\r:uf͚y}]zWc.M:M_sc``Ə@eW^UzzNwq[{|a͜9SNtjk=QPP Sym8OOV/_!IׯG{p"[5Cϧ<5 >|t,I7oVia![ppx1EDDHfΜ֞~A* nE5tӍSrrrq&ƍ{ 3%~2jIҾ}J}<3V]6Zjy 3%)((Hwq$);;GǏyG)I:uT%IwhmۦB-)6tGٯu*F>~|rr6oS4dȐrt_[jY'.yfb?$I6]V'++K۷ϯԵNNW{QV͛7wՔZ#Òt-\SS$IǏ't:ua;v\Ӻu\6Mݛd>|XQvvjUEnwۿk߮M |m3*(((P۷.l߆iiiڼyk{٣C%I-n( @Zl@3==Ckxm[l$)$$m⒓KvٲR8%}?{9-\nhϩȮ]f;СzU%33S'֣=B4lx2\lYSym8@ѳjlB?#Zpc .*IZn5&Ǐ/?))Y?@҉Qŧ1-iΜ^o޼E6m$x0Ν;m6yuz5k֔|d2^'kGN:Ĩ]~YG-qp!Є_0zٱjѢf5vRbٴl IR߾}="W]k[k̘gv:)11QK.Ә1c:uj+(:ӧ;_Pvv7n{V|2Q 4yTMΝ-[TRR,5o/}z|{wkuWNNBBBDm۶U~}=~3g? թSGM45\:hʔڷoGI?f̘RrrըQ#Wҥ˴xbEDDk2\ yhoN!!!^/bo̙}+>>^yyyS5j~颋zTk ٤|^yUYsw~%ogf(ѧcc>Kn$R6I%'ڵ\#2gr}3S`jݺx5~~#Wm6[AjIp*딦"ߧ*D_ZZ$i\Py.__^Ŷ?*U%ls8^^J>6c,I1))e$9NO]rrJzXVeffJ+ul6+""+bboFZZ$i\*/vmϝ;KZ`"!^YeYl諼<.b_UO6g奭yJ+ЩʨsU Fh5btY$$$D!!!UVl_~?s< TNN]%!8C/_-[Sv&M㣴| JNNcz՗ԠA*3//O/c̚5G<6>d2f'0il6g6mΩyA0e瞻մiNRRRg^nnݪ¯9N?Mxe6_PeFqvxuwsrrtjRẕ{S]}>cJ?&LiӦj|pMȐ$˯?vVV>vkݺ&N ׾yumoݺ:Ryػw/}=z\Xƫ sbTw *ƿgonVUK,smcpo߾}p5Wmikuםna$pM(~ԦyJʵ::FZn#Եqk:84QPY, b1 Jc֮7=}gr!>>^?K5Tx©sofh}Zц ]FQqqN@R\”zPC&Uws]t4klIfӔ)S5eTծ][aJJJVff .֭[ܵk~we0)ѠTTԫEL r1 g&Y~"ӣԈ*((mRRۯLIԒ%˪׹trNSJNNq 3[h^x?Th4*""B˯r^2l ]6lP1͚5u;do]DD[uxX,;uW_k:r RLLԻw/ۧ,###ԩSڵ3Ajղծ][XJ۷oWbbRRRd0Tn]5nH\sχ}CU\_ɻ]ގ1xi+POb}%6I2&%lRᨄPPP\?a6*9_ZZ$i*9j57pH5[@$${WgWmg菊}U>%ۜ%)@+*U%J P@@󕟟/V%9b1+00P] 25!T%$Y4qJnvYVl6v* 8`0d2d2l6bd2UwYpZhJL&n1E oh[&E oh[&E oh[&E oh[&E oh[&E oNK .@4j%%u@a%gS߂3>5@EBLO*mM"cLG @YNN+[{fQ_M CDp8O+[h41:`834HyLusVl?g_Ycid Wh-$N/MCV֊+c%%%+''ǭOPPԩVZw^ݻfjLYQvNNtxgMʯ(,H F 'LvFNשh 5?UUYsw~23xWPOb}%6I2&%lR ~M0Qq5ԃ>޽{l&Ij4K9'd:p8de;\e1dL*zGd7d2d2h4bl.__^Ŷcg,o8J+,q+f͚kܹߺXDORa:n;>Ƿ…?Jj׮MYAK,ոq)''ǵСCZf~+&&]WVz6l?6]r: UhhH *h4Veg(;;[yy lpCM&PnK^_bb^h~gږ-jӦMҥKѬYsNk]gDnQW^yq&MꭷިoiVSSS]!AUn]3$pv*;̴NETDDVpBCCd4 5EL"""38KP~~$jřܶ*788mTj۷oڵ733Ks)(mڻ9rSVi; p*,,0LppBp8UPP qhd$ISL+Wٳ(;;[_OqqNsugÇOm۷o ?PVp8dp( j>  *)gQթSǵvf:u [k.ZJ={7==C~;_FQwq^}r]jjuںuRRRXKy_nkѢ_%Iݺ]uݴi^z999Zl9ǏbVZjٲ.|OcN^FǎSDDZl.]:vz)33S)n5~Gݻ{N[ntqFիWO=ztW֭}r*+..Nmڜρ}v 4vܥkرcRyVnxLQܱcǵ| :tHv]͚5UΝբEs,_B0Tk ٬MK/Vttt5ٳG;vTB1%%%)**R 6T ͦuk˖?;x<6o;NIvl6vj׎2RVKdd$&I'n"锘D' Izǫ W }2e."Μ9K0ǚn:pGO}ݣ믿VUƽ'IzW|??PK.S޽Ӧ}9s*''-Z4ĉ]V)0avܥg[믧kڴ/QL?[SNjԨuEEEiРSZZV^-[ á!Cp]_e˖kʕIZv+N>^O<^zEJHHƍo>/O'(00kHJJO<OފS``; 6(22k(xmFݻwWTT?%Kȑ#?;EEEny^zEԮ];~;ծ][V\lz'uݻwQF:vSt1-[B6+թSX =zrrr=/R˖-UPP͛hƍ̬g_œfl:@$9[v{AN'4j!Cs4u۷/g*??__ƍyll6 '|\ [Z~~}.|)c+tjΜ!$} 8p@͛7כo(W۰a7/&k/ԧO2-3fIzoM[йN?Xiiijݺ^zQC_|1Y3fÇ7u=wWy ~_?5jȣOnn_{q۾;M=6nܨFC Qxi_~E>Czu!M4Y_|(. .-ZxoĈ4vڶm&NL_>t?RNNZl^zmjoQ7nU!δ٬r8슊U3+""\)٬2MeP?!@5h?ڒ`BL&~lMT^==ԓna$EDDNi>u`رCKLLt#F<fJwuիYBuw/..N/_+Wd45fh)F>y$i֬9JIImۮ_,Izx 3%\k4**#̔=RY 7\fJR&5zi߻GFFz 3}%IYYYJHHpk%ڱcFƎuٮ](]t8Nv]v]Ffpv ht(~_s&Pjժ*;Y|D_OWAAL 4(֮]/I^Ur$i}˫grBݺudX$I_~RSmV|5С$itg_~YWo>M0q{S~~~S֮]'IZ4*j\//ԩZn]ׯﳭYWZӶmuYs ֬Y3߰aT7k9:w.(}ؓTDp.wGpb%()g?0|0}ׯ/ӱcϿb`q6MG GIaߡCjժe<bhȐ5wڼynNuM^M]vUÆރCIkΛ7F#&$+wMgі-*44Tbcc5idM>C}+9X$//O>f^U%IqqJ׼y WY $VdRHHe+}VZjӦ͊p,eggl6[ߢstnjiY@9j,g \&P6Mi4e4}0kYV]s^ȑ#ODkǔڷz Uhp˜͜9[ZrV\)ÇߠA_XhJO(o p, &effj={䓏j>}T^RGVOk.oF{ Q׭[̾ե{і3giٲeJNN)9@q%)>ħ+$f3kbp22r8r82%!(ථ -H;@_͛Mx].88Xiii^U+^gTyRV։sۿmvrsskZZRƍ\|C^r@ivMNSAV~Aʒnd$ʉ@!!駟kY!CQ:-Vvm)//OR.עîGkgZ+J2ڵkMÇ'h͚%4hzPTQFQ^ؽʦdLKKs=.$ 5R#СCVAA?._Q^MtQԳ8%$$H7nOAA7RjjkPʢښ4iܸnݺN7iXGu- fU8Btg(3h621Rgy>%''mdOv"#ko o0\2R ܂& JF K/ο}vW[.'FO:}54+~F۷%%%Iz*֭\zMSRl6L&uխhԣGV{MJOO9NբElӪU%I-[pp^{M֛6m*IZj;8s4c!.6{NpN;{> 'KQK11neV+́Ĕdu ԓO>CO?rnذ믧{_ T-YfE6ͣjjeMF_֪߭j߾$of;$i)wK.c_bbRPC\YV=i)17.oM:|{(O?a\}Sz>bӦM^7JOOWddj`WXTiI_ ZEVU|UqӕEUfgp3'97U_jݺT\%- U޽4jH |YW08u4kڴi222o>͘1KӲѣzW]uT mۦ,߿_?F| t>Ԛ5kuQYV9N9rT3NɅ# Oii0<.Ţ=(͝kKl+W3*qܳ>B:U'B5kǞ+c׈ѣ֝wq. EnjyF˗Pjj?%K_ݻ}йs'GpOzg^W_~YTCE_&i}ֶmjS!!'Gs[,wy)Sj:vrrrgM~x5h@C^+IZf}kL]Nq)6tHb@:pǀN+(\ ұ&R޽'_MW_}ڴ9Bٿ,X趯WUVz魷ц dR-YԣW\#Gx=~РZz,Y-[nXd2d=*>>^`ht#F믿9 >ф (44T&IRڜ^;SlB=6J}4A Q|M6mӘ1Oh4סC駟g5>τoMyy7[ٳW/Gvin^FOPBB##k)-t=6JZ~V\+Wbl6+77W*ya2WIpprss5s,ךEfx>]}U=c5qkO5qnM6Ց#G|y=w)''G {=_{Ţk֭Uh<]pJLLRnn=/ҨQ#cCVz_wnݺlTPPbcc5`@=(EE|>GU~~7Sm۶튎tUll *%%UÇߠOR^^BCCս{w=SׯsGEEiKVZjݺnO~zTL&y5kdp(&&Z}OjΝj֬Yϳ;vqu}Q~Et8N|fts @E:k FY,`?1S^y啉s_׶mǾTG{O%ӰFm}J>6,%6I2&%lR [@x-=z+SȬ+\W\\\߿_/т UPPj3 zԳ?BVtEST6.{W_R/l .vy1Rw-ܤp8N _M&Ij4Kk%* 2vrsseդI>@i{ra&h4d2MYf,]$9$ : :l;m}%"|%Øy* ν;1:w{[kf?,?,ns6Ta\Y>TOX=]N5 tU1\ 3Q953C1,zoҽsJ`-ܬ{サJk11Gw>9;;iAVm'O&(<|իI"""g^edda@u"ݝ?^WщqJHH<==Ν;j*֛bTX:EETZZU-G[TrrrdI*UKN: 6)99YW.Tzu٧={C5jS jlW%Kd2OM6$Wm=.?'-֬YsUmյk#""uP~6رSFQNNN\u:6mb mڴIqq?lկ__7Tn!w>}÷ɓڵk$PfM-͛7SF *m 73g 3%l6+**JQQQe`pTJTZ5^p#L&mܸY&gg27*"~xxmj*E̓jҤԩ4~Dox+4tܹt|{5ּym-_BSWiig/X ը᫷zC;w*r]VV&M,gggCӦ}_~U&gŸ,#G5q;ڷo14uիG@i,^|aZC..Ѳe+^r͛hlu~9 P\\\kF&M,IrwwW}/*##SXL&3)?`6mVX u7oTo9H)I+VԼy?eV…jjq^^yHҘ1,㕵1Ed2)==]銏Wڵp͈@v@Ν;'IjݺeEcq=SWjU5ig֬W_Ku QHHyyyٳJHHЮ]-< Ï5Omۨ]RкuxZ=7F6Vwy1rrrO+"\\H++==FLRR{nNJ rrrRRR֮]ձc*f#o\t颰uZt%͟^>PfYS׮]@Z&2 Ν/X7 4l h-odڶm#IrsիV^^BBϯ||ڶmرiZ,$`/s{qPPժg6thќPhO[Th-KK;,:t\\gf͙3OSO\S۳g~q+/ZA!Iرĉ8Mz%OOcEDGOE,_JN%[ // ş^٪UKխ[ת [X8&M\O?!٬AhܸRJzBg'|ZZGGGK6l$dm$LH///%''kŊU6Ͱu޽{YpvvִiQ@K^FbckE>f0)w]v뮻ر/{j4lWufaFQ11G԰a5'G p3...ZKa}4U:uvDev\Ѹ?UfY/f*ɓ'Gٳ4kwz16j׮^|v$EFFJfZrrzE.Vhr_U|s\J҈ 4%i[믿h4j߾jҖu2 :u}I># z7o$j+O^ر÷**`jw VT> .kd4u1ɓ'Uv-n"u7%*ڴ)>Yeϙ3gϧ8gΜ0bCk֬eO={GCׯ'Iڵk-[Q [rrrܫv"-~l $ ~0@ppc۶m#oIڶnݦرZj͛JV\eo۶JOϐ:tDq50;cWt]y쁯5͊IeQjݺ /fNilfh<<5xh%y\\u=wj޼mv vtnݺSW9*I2`OVZѣ1/9O(55Uƍח_T^=ԱcGofPlnnVf4&&Νɓ'%I5,U A?i9iK[AMO4h@W'gٞEXvvԩD9sFYYY T_){ļxfArIKI1^7MoNlݺM}zĘ1WgϑhڵaZ6L^=4\z򗉕ӕի_qW_M(6fϞٳM}֓O>:u\-gΜѦM-Ǔ'kBC['Nt!t-u-?C:uj֬)ɤ5kI{$zkt1EGvafg߾ml -\HwQ^^^, {zqCM㬬2B pQW9e5juLj`ЈjcNmڴ9C> &iMzݷ-KI{fg\2ߋ.R j􏕐pJoPx6oչsx\Z_}5C͚5-=KZر*UTlu6HVZc_lP??>ESOj;cNխ[U&IT.qf-_R5ԁQJLLTjԱcqM&^M\ZԥKgiJRʕ׳tR]PR oo @wmCu9}w5jdξvK*999Sԩ$:#mذQ˗ս{7IRވ1:~6,~㒤ڵk]v6gIԪUSw}Neg(4t>c?^S|ٳ-=f z}/__Siigifq$FT233uQu\ʭwt]whjf 8@7nʕ4rSٙzVV+WA|v\5k֔PP2FŇn.ծf룦MUjԨ3gh׮V_ժU+`4n۷ӤIoE&Y3f|;W3f|[)66V'g>-_R]ч2d\]]gի(99Y rjҫ:XzujÆSvvL&Nĉ$9::Z-0rӪZL&}vfRG(-vޣI&㏧Kx1rH5r(8eY)33SVNy}27$ p ۿ_IRVV֬Yk9?pj֬$/fW)<|RSSutc~[K?r f;ٳgkӦ$)%ŨQ;vҹs甘zg,}|WmHۯO>LO')11*5,-[xyyoƍY$TSݮBIzkիWO?UG͚]vppYW_GԩS||Ǝ}uJI19%vܥXZ1 gɫ_~>>c?~stuuѳώ[:׭[={*srmV?IcǾt1"233%I+YfTfrrrd6Uz.Le˖rsӕ\nݺj֬^ڷo[d͛sJLLTzz222=n+=zL>>8VkSSS:ujkA~^yxxX̌L իWW]voU%5jm dRJJΞ='IRϞhҤ ѣYyyyڳgԩ=oog߾հaC 98H99̔6 Կ=Bo/.mժ%I-Z4}S뜜!G oJ*:t\\\ti={NAuwߩPN{\ڵQӦMlޣz:q"NժUS=-VnnׯRKa={PڵxZ%9Au{G#FnE ߪWwurrr;w]pc3],ªUCBB4zsqΜ9iӦkMs+VҰaC˭`6NG(!!A'O|}}vڪCruu.77WVo6-yyyeWVV-MtqyzzqF޻2fY ߦCh4*33SUٳj֬QƥfDڵ[wuy. p h.=z4a$y{{石 4=Z.5uk֬t"m]RJzIjݺUTY=ޚx˹ڽ{k&Lە6mڬYӑ#Gu9SƽVn_4bCrpp&BFFqi>>>VmڴI&+$///zk?KJNN։q ߪUtלdҔ)U\\:v{T5jÚ9hBCIN=Ѓ Ig*=q\\\4w:v7n\l6kyp!u%77W/ѪUtQeff~H*UWC dXVZ  +5͞,۾}"{V^M~<'N>KZ1cСC.{Mzp*(曱 u̙37nK=Fff"##P$yyykʼn$J-z#$yxxi1TYxYYY5;IRvmKfABnnno'||MfjV^]r Rϟ?7C:wի`uоD8͛ԩSV5jmهZrssly{{y楾+"ggg=5HMMƍtpTZ5+$*W\uoPVV#٬mݺ]Z4hݻ[- 6)&&F-ZE_#I[ '''w%ܷomP`P͚5չsͤLHHJLLԙ3g.OOOl\-[,or :{]rL%KB QʭScթSG[$\&L/wwRc-R̺uKF|Ξ=[Gڷog9s*:RSӴ| f}^_~UNNN~{ /{qqq_-Ѷmۋ=K޽[h4X7n*5pͯQFF>#d{?;C#G>m*/j9ޱcva9nذa@,>|X~ڵkiʔcNK~i(M\VZeuѣ+6+Ι3g4mt cŊU$ԩu1YVu=wg[Jl~U:uj+--M۷О={}T}{Esύֱc* @FQ7o{ǟd2ۆӳ/[n/TM233-df4vKW^gxaƌ/믋$I-[PVTJe ؤ$?k̘5dK\\\Ԯ];5i,OO=z2t .1UuQըQ#={V7o֡C5rssӋ/)>'N<͛GƍtyM^z 4ȵ'NИ1/h4Zj 骆 ;vȑ# ]{髯>wl6kwm6Ojڴe4]vS%~ 矋н{{xT//v!= JHHPժU隆\5.q!ucVǥ 3%[?UyrroW_S\\bbbhOվ};uYݺxG܃׷~siǎڲ%\;wn޼u1jʔ}]5[͟zwv--[jǎZf$a@=C-̳Fϝ;gsCE~}vn6Çc4q$koԽ{7ö|g:wkQΖј=V˚>?Ԋ+dRs]_~y ju?~?oV={,2KOgh4*(&N|K6ɤYՏ?.P\\͛,111ڶm$UV-/ʖ?&d 4GzVz,Yٳg1c׀ٹ`|.^3))𲪥 3 2==c]ZjofjgTV-׭[Csz뭉9rٱ^0?huЪ嗅~*̔$=լYSڲ%LϷ4~%C%ݻiΥ_l6w^EL凱ot9͝[rwug0S4hI<<<Ëh0OY^]>w 3%~z;e)Y?ê}Mڶm ^}uUXP?]H,E) 59;;i&wym :02M؅!δiӋ7 '''y3{Mnխ[G 6Go+ 4׼خ]{#OOOk׶[l!]٫{}grvvV>-AoWVVkNNҙ3gJ|'[]^~{Oԭ[$)""Dָq#IRZZl^%;~>S|۴imFo$ufZ`VcNN~7-vVpu,B~yrifmڴBk6mMꩧPTAZrL&Ν5j\rTVMFǏ$_+Yi ޥ$۷l o~4i%P?ӎ;/g˽+T@&I͛7[{VZU_d2ٜ+IժUUbbJ6nH;w*<߀>00@nnnPlleOf͚i&< i ۩]۫*&!C u ر/G[; ~.UY3>lK+oX&I]vQ߾}$I;w+>ݻwW^{c vة 6(P,⢺u(..^;w*Sgj.hzu%ҮzxW!'%Y|-c /lKݺum;;;kw4kw ]T-]KCe0Զm=ЃWmcYT M'''$Kw3ҥZxz .[o^Au-,٦Mk@QQQ3%M|}},!-Dcǎi߾jѢyjTlѴ4\2g\77bكsKjժiuMFHiKff嚋UZUG?m۶kڶm}m߾CGҰaC9Wk@vK|. ʕsD]VhѢk$)%%5jHKvQ2nyHI1JH}}=jԨѣTre{ xOI_o +Rϯ l\\%Cո8IR͚5/;j;s&[󫯓'OZn-dRBBt*W={g2ڻwi:qΩOL}Vʕ]Zyv4aW4l"Pa5UcǎJG5/ۿڶm ~dҢE+*00@;vTDDT{n2eƏ\s̘, tƍo~}zg`0俞Fg2fZI/_c_ٖiٿQVm~ڲ%\7oQB©"38 Y\9::]vAZ3V=L&]WL&SmW~JQ |JR9q™l6_oHu {-y١C{hqay~L.ŘvҬY3IҊ+uA}6mb@b+O^mKqѢ;e4h www 4Ptih{r.\Hǎzhx-o;wy~yJMM`m rrr4}*rhԷ~'I{* Tό+ <<.􏉉)ծpu0Cwww[,aԕ:}:ܹbJk.jܸjԨ!(11Q7n+''Guј1g^|qzj3G=W;wرczS…RNNU$<<oNjՔL&g͐$( {JR˖-nz-ZK2rqqQ͚5ʥ~h_ϿPʕhY6O[{`/jܸfgذ9ڱco ~eeƍ{MoN>O?L~\\\m_֭[iqF-_B]v-t"00@3fLg}kÔŋ{MTK{jʔskV}\\\c;o777edd觟觟X999'СCl^C*33KHh„i֬Em۶>~#Ϯ4͖ˮ8+g{r~z˥~@ u_~VM-Ue=zy)m7)..^NRrrUvmխ[GPǎlQz5nZʟmY  mmF3g~E6lԱc:*WjѢcs ׳knIfխ[Wّ?\]]fϯRS% g6mYfjy ߦǏ+;;[NNNj֬zꩁE4qx͜LWfo|@WudΞ=+gggy{{G[V(00f_|1CsӺutIfyxxm6z+ U\Ek.OI%oSΝ5јʕ+u>~5i\z晧ԥKg/ڷo o> $GxHZӧ*777լYS;vwesW5h)(_5lXn cƖg]ōU~56 3POdž /|(ɐSeoW5j.q5mh򖗗'GG CI{ϫjժ<<˓`(}fL&]|]/#}X̅\OqΕ/ lM?899w')(qI&TxQaN~lqttTj*֎|]K{^'{wqq'|KCr*QFFO s9899iذ6lhEk%g-Mv%g&1edݽK4&Q%pXr"`4-Mv@"`4-Mv@"`4-MCǎر؊.:Mv@"`4-Mv@"`4-Mv@"`4-Mv@"`4-Mv@"`*p9s$5jH^^]34ygկ }.劘.יӧy@YYYRtttE: MܡC駟%IFT+$>=JUV)ϝ;+Ѩ̬rZo5{\nJJs| IRJ$I+նmIRjP}Ѣ_),l]T{d; wF ֮ SZYy{{W^$m۶]III]ZjɒVoՆ *>؇$8`;̬Q÷BkpcYI >}zkʔ*''G˗UtyAM62W_}檌SO'*c;LW34 ?ټy$iРZt$IZlYW䓏'+q 3 3\]E|I]#G*33S h={j*^knm޼E d0TvmuU͚5-'UZT@@iu:gϯ5k];_={iϞ=:y2AiiiPԩԯ nK,deFb}nqj͚:pΞ='___oV]v?""RE[nߎ;e4=n)+Wմi5OOЦMVոqCuR{SLyzzX7<|N<]vK~7oFZUӓO>.I6Sf3Ϝ9S$̔$٬(EEEi|Q*Sj,&d65g<͘rrr8믿,P&'wSXغ"|LvP 6Eڎ9Ѿ}}nS^z\xfh9׳g8+;;G˖lpyϞ=G+rhԤI%I߿o>9=EeddJ.I~6z7d2嗟IiӵbJgجyzqEHIZbI-[ 4.\UV[,Cƌe5 5|6̔ÇcdSzzڵk+007!MdҘ1/i͒nBԴi|||xZ{UDDd7bccO+99EիWWϞ((Mчkn͛7[*Uym ߦ:ujuVjڴ222eKvإ-[[okƌOKJJsύ֩S֐!@NNNJJJҡCڵk:vl_=("""sD4pୖ+WV.]NK.dx l6~zڵ(99YkքYfaֹs'U^]Z~@s˖pKNjֲ~FLfyyym6$7JZo)$[iii8m۶kHA%zBBK b9ww[Y_ʢZf+==]-Z4'n27S7nVժURt X)99EM6ԩSTfMKdg}A5k9bk1!=rtt{Ͽ7|ڰau /_JN%[ //rx5p 3[juZWaaԤIp듓3d65h=={>":::o^ߵa&L& >3!+V 4 VOݻe gggM5 zkꫯ+6.\/k $QLX=͛Hc5: IDATO/uA[u~ee5r&a?(}4ls+'ѨG)==rɓ]{j7C ^))FX- u96l$uٻ(Lz@B @(!4HG׵aUl  VDXE\ׂz@z %@*!@zf?If&H5<9M, s9(MP4+3//>pvvVPPRO.syf={jŊU<6P"<|23rӧ+Wdj}{$i̘{l%<߭[W5lXM6cNefSϞmz2v]YYjРBCWMnNhR5T6$̴Pe5͊Trr$___uYfYg$^jfh\8 IjڴՒ9u$YY^۶m顬laVRӰaC$I#GrjBYnvՒJLLRjjrssˋUrʻLMLJfbYj~ժU :tr.==Ph\RR$I._75h͛+2/Jۚ5k>Xg֭ iE7Ҹq* J kKjjnf99Y|e@366V&SQw >TG)11Q2LZ~5hIҰaC~SN5$Im)7|y%eDNeggkݺ rqqр7i7hyx+::FG9dVc޽GfIrs/sEjPff>V(ϯe0d/z{7@:֯_yyՓ$}'ήT.*??_o˥?$sjRu֕*Y (_fg6lmo'Iڰax?:r$ҲPNN֭۠O>'SU #??_˗$ >LFc>*:t$)77Wo1b:vl/ICgϞUrr~=ēǰaClY%Nv"IJOO?]JJJRx&7w)֭$3#%'())LY51*,zǻC[lաCByzzTC2\FSqqөS5aS2 [23Yvۭ)rc(''GGjΝ;_g׽q&۷_;-眝UPP`9n"P/4 /<|233%IFtok/s򕖾A3KSL׾}fZYLFԢENÇѼyK\տ6K ^-i7j-[\w)}tPPg;bJw@ ,Ԃ %IM[zUj6W$oooNhS+ƪy[.PF]+ֵ%&O~ ;+999 t)Yfs/fY2ͪ_߫F9{6Sq hÇãXFgf`7o>}zU.ttrrR>խ[g(--]rssUpp[{N}QٳW@@zH߈?y$BB:GRPPF )?@999nzS%L@f:IRN׿-'Vly^n]z(*99YΝhTӦ=N UttwۼG'/// 4my% ռy3=#Z04idee]dP˖-ԯ__?jٲ/_gLLrrrնmxc_ur(իWOfYFAճgBC{Xj`ٳgkqq*,,߬`PӦMծ]Z Off \\\d4d0e0dy^Zm7ޘ'\GԱ윫HeTFUsp=,iF; ڔn,X=/}$ɘ[6"%KwhXӥ8EAI&Y&S MʒTCma2*Vi5_eaapd2IGGrjپuq] Ը5՘XNQFS`@RtdTXh.~486:.yr셤Ø&YX=9.LbY*gϞ՜9su6թSGFC=xo޼Es~,IzI y*vj2TQQ8rX9B pL>>| @q9= ڰ!\yyyJOOעEhѿ*~?dWf\M yyyzma/,o zͷ[@@ g65kڿ)))6 3VT뮻u]w+??5=4>d7^R ­LѨɓ_P~}Kc6Qҙ3g gggOݻwShht5@gϞ2@ #ЄC[{˜kժNmu/ԣ>;C̵|3GϿ*<|kh8qBw:*77j=kkٚ3gVZmuϿPPP@פ#4{%''WO>;Iaa=0hBOe 钂 o@͚5SXXO5iXQQ'4}k+ ep>8V3gCݻwSS4u:s&O>9QNNNcG 5cccy=Iԯ__yzdlLh-ZfÇkq޲eKI+TPP`u=??_/]=CX4K/RRRU٬9sV[ pz*,xɒ73qjjLf~}5eʋzͷTXX( 5%iZE-ZUVaÆӧڶmFaÆWRRl٪k)??_zIeƸ駟u}:uJ:JAAAJMM;7 TXX^zOVur(8p@1zũzբE #q/3g5~D=ú秘-YҪP;h¡/w)55Ur.&# Ѩ3,jΜ9K2dpm<==¶;vիkuW魷҆ ڰ!ܪȑ#4q6:tmۦ µw^M\...rrrC޽OOܹs={Uݻi׮ mpx?T[u`ud24Lz~V{M&L#eV+11QiiiT&MԴiF=CYf_iŊ:}z /,өSFw^3fY-~}/uE/Ѳe =-[ؼ~mRHHG}BݻW.\PzNwqz Ӈ~SNWxpmsԔ*7VejW~Q[} 6?gsPMRmΗ?vdLIIۭ kM2MwﱺE~2$iZ(,,,(((}?l6l6h-u5z-kUԒ͒ldTBd2yf5V/p 112)''F' F EIO`҇}.$$?M6ͥKeyɏJ=\ƵT^s/ÅI5`WզMյ;~Д)/^q`X+  C]$5<==oϾ?Vuם8p\\\4wǒgt*r9,9˒Ēǒrlbً&:`&E ahpX&E ahpX&E ahpXsMpHKKZ34.԰ .t @ M@"48,M@"48,M@"48,M@"48,M@"48,M@Zh>]e@#48,M5l-2d6m\\!CF/R.sM///_;w#tQ#?5jH͚5ՠAԺL[cǎ_}{ڵk+I˯pF;ߠn~7oѺu$IߨobcaCNVLLRSԸqch!CnV.+]&J8V>\]]*sIyyճ5j+44T=z59IWvvw{zK[թS  777cާ>Bo+*^qzNO]U>u'NPtt4a¸K6k&3uD<<_k„q ===XZTI=3:nf+ݿ]1b0S Ə_xT^^ ٧jڴW^xN>>>eh\8+WKƍ{Lm۶*iedd}`͙<==^%Y>]afZWjy4hOTQ'-XPԺu+sOMS$MSԦM>իW#IjѢ=w#Urݻhoi^JGqf%$$SAAտjذEj˖mڹw+ ڵk}؝EEE7Rzu7Z~AAշo2{jڽ{դI.ߩ$k:}:ZԶm[u}`@VPP#}%j$5aSOPU~jߑ#)I۷vڷoT@ܹ>5Lf45hP2\_7neii|0W>n64ut~5kT2Mݻ[/ɻjj_رJNNњ5kڸG?Us~Tv:믿VZڭ>`˜7 z Yh\Îԅ YΝor<'ӧլYS}G{jŊU={rrr4x0GD*;;GAݻwpY֙3=N׷2oR׮]SN_Ӆ 4c,|GD'gJTӦղe ҷ~vڼIRHHeJHHвe+y>ג%+--]נAQFQ{SxF>|D/8U}#}`_}uorvvwY:d޽|J}j֬Ձ@byc]vvv㸹UjqB~Y=zL'̕ŗ>8}"+!!A'NTZZ\\\G3.oZbgZn|t)--M|0G|U~OϟרQ#4}2aر'+"bf̘`y{*@~䑇uRii2fMY6l$i6k@V:̬Zi&HoIKѸ&N i̘{t̓H;w9sj{o}M&+Ufaa^~5]G}X!!ژ͎kRe-[Jkw-[Ot m֭k۷>_:(-((ۮ~} ku6vS#װmX^SvfyzzVkmrH%%%룏>і-3kx%F,Fz JJJߕYTv*ZnM SݧFASLV^^eee?f}Qůz̆{;h7.gl~'mzk@뫶mر_cװ˲PRR,Y_M>z'~;ߠu!:t]{$;k,{pgg2*\Q̔WOzݭng>3jܸQ=}?UQWOhh<}k߾ܹSMdk.rqqQ~~.&RSSuD$M6Rƚ.Ef͐$i)Z`+y*UhUg-[l6Cm駟)&&V*óݻm۶.5\K^yyՓ${ef::uh$I[nol?o2d⫚.咘.Lrr>\5]ZׁNB4kLM.\Ҝ9iɒ>|wFd0X]^{H_z^^^zǔ%͛:th_a?٬S_QffBC{覛iӦo$///So~IҘ1ՀegUܬ37>>ޚ4)L:tD{^x9uEחyaFխ[WÆ :{aZZ11>5޽GWh(Ѩ|>|DWSOM...5R'p|'NDi,Ǔ&=U*sPNNnw5|Z`tٳߕ<T,99E &u_fk%$ 4Fg}Z 6JR&5gz p&MzN_~򰥝;w^mw)"b""vm;]<յ]fhh[>Dg$^$(;;K95hjٚ1-ED?~Q.0d*@w^۷O ߒ%K?Y;wn}[T .h˖:|BB:tIp`L5Zڍ@:Һu+}:p֭۠;w*!!QrqqV ԶmuU#F ڵФR۷o/Ol٢vڵ;җ_~-Io4mKrrr˫>dl ڵKqq :s&Ayynf͚)$7~qqqJJJfM ҹsܶR;t蠺uim=,᭻u/[Bty{7P֭ԯ_?9ܪofԣGwn,hFjڴ>x-[_~Uօ t95mTڵCj+JwwwWNN/_y]ݺuUx&yyy|Og$*$FjcHIfkN5ZPQum+>ʟ3ڹf(צsc6r;I2k*)#h-kUT\#&LfL*,4)++K&Sa Qfrss~Ѷ?Z K- FfYrvvI8|qZFS,___M8^o1SFA˖T%+w<z@O>9JjnfYGDU6O?ڳgM2Fj^>-9SRRt0Q#ht2d4d0e0 Ccե$GsƱqɣlM&Mt RQ#, /WWkŊU mۮW^y]iiie/XP[R\\U LIl&//_&=Iҥ71##CS,ɬy󊾨yN|VZlutӬHIZjt KWk֬Z^$=S񮴆VUq]a$8efV%PYYYR||4i֭[$p"p;t谢NJFf9_N[o+* ,Y~OfY͛7S>ժUKip,z SuYmڴf}{%TqcֵlڴE&Y>>֭$]k׮SaajW:tv]Sxrssow}i撝k׮׋/NUtt.ƌR?OGiϞ;4y6VW WrCM"AAujY^FFN*(U'G VJr% Inn+m~.\R>}\]]<}6MI>|~ЁԹs'˵BohԻ#ӉQ:֭[y۶m$ |sKW7TϞءȣv])GK 5 3`EFG`0(88X~~ hBeddԩʲOHHP&S+YyN6{T>%I+Wdj}{$i̘{l%<߭[W5l+IڴiSk;vTf9ΝoPHHIkʴ۹weeeA ^W6mf:uU!%a5? .lVddShl'''K#4:s&P0CudقYfLIRRRvޣ= 򕐐 Ij&j0:t/N6mĉOX4lIȑ#ta\2Pe`dmiyyy:~\Ae.6S0Ӿgj_.gggjBKOϸ1.[ںux̷.geXLE!e2|P-^=Dd2i rvv֠A$IÆ ?N:OXB𢙝9tw>^vWjȸqM~ẙUw٠A2ǹ9W4څ@ukٲ%d{!wwwm7n,IZf&O~^..EK֩R)jժeҩS(>>A6m]wݡ]v+==C$[{i˖mZrڴ ґ#JJJz -3dԩӵzZIR޽ԵkgGu_|~[qYuW#PY>8V,&afUjpj+M׭f[/Wv՚:u23im&IRF:uJaaSaÆjڴi][v#F ז-۴zM82;srrr*v͚uZz y_}TW:B *77W3/Pĉ+ 432.1f=RkءCuR4r~rss-a0,2ˌO[ *^f$ةl[A...02  wEGc3 jݻH U8IRnn^U}jJE33DKP2 U2^AANLFc>*:t$)77Wo1b:vl/ICgϞUrr~=ēǰaC%I_xv%JK0e_Һv"IJOO?]JJJRx&7w)֭$3#%'())LY51*,zǻC[lաCByzzTC2oTff$iԨw}-e._`0wfiʔڷo֬Y5k֖ۨZc!7sIf޽{ۻӋ+&=J gyt\Ձ9U*I%k<[gla0@BI$ݝN^}JML!Å0&061t:]QeٹsΟb=Ўdu5|$&.(+''G$קFܹsZh#r8&ucczz*,,PJJJe{$C=233ǭ,$YV@=`je [ϗL ùƕ>w]YY6mZ|@*um*..:yۯ۷_z˸ϞTQQ577+#}UvefNSnn+J:;lҴ솺֕>:uJ-ܢ믋@h\֮]#ۭ_~EGu]9ɲqm%:9-]$H+X&;]+V,Ov1zW@12UnɒŽcTڪKvq!ٶ"ƎPaa:kkt)UWרM~_ٚ7onq˖_TSS-Io~钤Ӓ%+Զ67 |R]{k׫SeeRaaV^ŋEIwI] uR~.]nQA-ŋuA(33Ss7oRzzu!_Vww5|mt㘻b uƌ"mr[|۶uY}q5664MiٲZzըݲ,̙jhhP[[br]{Zfs2G>r СCUUU-áoܠŋ y,G{PjjjVvvf͚͛7NZZGSmm:::dMsgkMXzkm:t.\VjM*((POWŋ%joo۝3f[nVNNv6Gr^Y;Y޶vkӝwXB͚ZrE>|DuuujoPVV-[UVWwE|WΜ9OХKod+//Ok׮ѪU+㖧URmm[BmذA1ߋF}RGUcct}]繶N:uvv(??_- 7\h8מlgt)ycT^^f͚nQiiiQˇcV瘝:;=ɎϿ>G{Յ %)\V 47oizUQQ%׫-^P7n- A +Ir6=o$̜<|>577tE=7[~%I===[>/w]]^z̙3ܬRjժmVyy@UUU IDjjjUYY _٪oЩSTVV뮻V{PmP99٪ױcT^^O}c27TV+%˗/̙3v҇{#i8~YLӡLM>]]]]oP}^롇vDS55պxDG)0eV8XK[EEZpu)]tI,9sV;waH3g̙3ӣ={^[l677LgϞ$hjllRii˵y&;v\ٳب>܈r ܹ\.?v효2;wN55Zl=CQ9w'˲ٳgNCޓZh{$)=ݭ3g񨮮NwƘc9sVoG>74z?A%%emQEyyN<7#˲d:;;"z뭽r8>HջPI%=t ߻$Jқoc>i*(ȗV]]tBoO3gΈX'tjkkS^^233U__SNT;vAatPe^wXO<"0u\4r===a[ %;;Kw}ΝiǣW^yM:p`ς`|GzOD硇v[,}ODײ,Nwh˖"Zm^pQwSNkΜ91ǵ;y ;4gIv̮ ׮&eӥ^xQ555ڻm޼I].;sϫIGׯ=|D˖- .--kҥKtZE pܭ D0osQeeex$f+w٧Ei *,,PwwwVc~N=C3gvxޑ#G{oG>&.{)өG "=h5PjjxSȐzC={ɓ'w;ZlnD8~vܭ .okkV?ԹscgΜuuڻ{>yJߝgi׮CnG>Yf_a^x%=zLVx补EwIz;wA:yKs΍j*I'pZeff o+??O;vlWff~ڵ[_СCiMqe8מ~cI̙:v옊t)++x===z]kn=bT-(('>H}H>[~}5$^%;ЊeKKU[['Nj͚k]W.uttWwK7XVXfJ5 /cY+Wiq@C~qr:r:JInmynp#ZaffNM7mzoLI?8=iui,=--M˗/.@6\/I\۷ߧB![S=zLZ0S֭N3gTUUZ[*3sZT8*Hq8̔$á-[n|s[6Nn -X0_TUUuԨŋByglm3wCy6fʼlRٶ9xwdYv!aڴF\\|hUڼyS8ٻٶ[o Wq[3g ǵ׮8 q$w;2Mp)Iھ>䨹YN655Uw Ԩlr XӧOʕ+"999ڸiMK/_zg?JKKlRmܸa͑zo'Ro XVXiPGGG3g 07&_hE[[G16֕-Z.߯9;z_NNZbt{~=ԯc. ^oP,QF9O統1 = KAA0d }+4lFcx\>@*ܭ%INgʈС:p$[*,,TaaNz/j7 Pa?*--t##2%%EEEEϓRZZ*++ZN/%nVVVg!yy}c.]Dܹ:}jjjt!>|X˖-՝wn4/9wY7oؤ<]|YA%OT4aJMu{DK{`8?phOcpZ׿y!& &U"==-!7~r m[n CrssUSSf͘1=2 aW#Gu-YD۶ݡԾ /_?9uvzVμ\UUui }8\.ff<.]tI3g7.GjnU*//׹siM:s vtCC--Ͳm;4=|><F80Lٶ;:2k⦦(YwPء}e140"eeRo( v}0q,O8s~ss땙%;}TcN 8$~npCD ~96heݱcznwV^[H*+V[h:{|>.^,c>t*;;[>OΝ9}4RRR5Ν /pvj )p~^$*/w x6tZy?Q4}zQ=suD!@L CcՅ\Ri\Li d>}FgΜݭ_,-l'eYϻƍFnEt۶QRr\*--Ց#GNB-333H9X\mmڷ]|^^j{Smm]ļv8p0_CC}Nnq㈷iS݃!X=#5kff/_& hꊘ;wNZ|ـI/8cּy4k֬yYYYR`2ɍ.g r\իh"8pP%%%zg5o\jjjTU Bcl2>}FWcc22JKK ]zWU\ƛUmms*--^q<}]ڷoN>-éy(Tظq {UYY`k,y6Z2g`lr^|eUUU^999 47oޤ|>n[7nԍ7nUlRy<8pP.]ҥK$?Xw^xQ`V\"[Vuuux^ffVDkE4fۙ>}nyfΜ2X]^^fϞJ\bDcLc~!@Ǐpj2  C{ッGD%%%2MSڲ17۶ݡ h߾x.\7}awћkp%󚑑O1[xDgΜ$9)Zhn}222a۶;`,XmPF;zo\͕|Wu`<ϐW5Idmkc-7nCuN33,3o2_;$ MGC ,*.LZMm;<Ͳ,ٶ@ ۭh,+sg'c5]G1ӣ18==^('';fЩRzzڈn)#=q,K͕91>ڶy>eff:^WW:::e۶2GO=wUUU'xwjiiUNNRRR{:u~!͝;7TgGyyyr:GP~eMˌtqD}^ߑVٶAo?m[ۿkY6|~ ~lVJJʈz%\jBSZ._i:.4p8dFlaD/=\i\$YVvסߊӡ,3p=`}Ř7p;-/јta-4Ts8Dff23UjѝEcN2  &---aiM|60tќ&UUUiƌfJRNN}veddm58VNScDl#9#^4M| {{D@,$eept4 ~y<]WP4O~L3xo t0#h h$X+ CYqdYdF=}2@`2 Ði =I׳\½69+ @` 5J3DiRkk[R Wkkd}=6 l)%!hAfCir0 ӓUar4M#>%0< f_aF \!:;=jhh3 :@$g 0!۶SoiVX,!6t:eےU}}~& AZ[*PJKN3*)v8H rdYʋ!voFzjiiUOO etTaY-#2p0 9怞~;ý IDATDx w`G Jp Bir:JMMa[-SQy0TjjNL3Xg1 8hH`ײW5MSeCM>p8p8&+?F\mUZZjҎݣfy>CNC))n 3^fh$aH* ͳ,K%M@>O~O55ur:M*==hH"˲խfLSr:Mf5f(~Af ?5m`iYVbc,K8~,Vcc,KrRVZZhm˲,~uwS 99𘘦'sda&{ MNpȲlٶ%ðe NI1t ~%}__ƵoKÐS#;\ouߺ}a%a&0r`P3XQ imZk:dltr:mv'ٶdۖdڶ-O3D#\2 fpپy0/[ohhCM x&B-6{ٽ2Mǀ֘M' dphD ]QedTfG 0Bi+/#M 0TkM)Z 6# }PW4KBLZ\*wt9{Yf C 0AZSnBa ToXlx-4@-4#Ȁ4"`Zk*FiFD([hZ8D,_ 9a`<2CM0<Ia"ZV*Hg+T-85`O`t*%)0bhLXAf'W% (;;KI++\JJrӣֶ}@.K 7T 5#dڶ@ +˲rCײL*(W{{GDp[k_IkM`S0B-0~@= r"`1MSYr u}?q C Mq2X0ӯYL%`222MSmm閔*32alM`4LKYYY\!Bu6H&0F 6TXcjؚ6-0+Lzz,+^ Ô9 &0| @Ceʲ,\)HZYȐ˕q/`}S@ Ab;*)eY  ,egg%`dgg)zzCM 4MuX7dYrseW +i͖e 2;"b.@%?@PZfp5HKKmm[q[hg4A֙~OPVVfR&VVV,+ 84 D 0F=QiYJJ P ir\^F<.Kig 4H de_i63JeeeF#?^&4hn ȶd $Ajjl[ޟd 4``0JIJ˲%Yr:2M4M9NIVɶ{ ,Ї;j e۶ӒV.|i ##cB3ݬ+Im_ M MQ~2o˲dYIL&{,+ U~BkN@̋ m?i}$b8 ucۖ$[a$H  n>MU~}`T4׳ծ05t5 &@ MT~r<˿mG?OmWնmh۶{] Vͦ Z 6g p% .g'ImW^D=/"ehWKK{Ѩ/JUVVY***ԢE uϛr|>L~϶%Hv)Ʌ@`3kkk/Hl؁ {%IsGss~K/"1,hMR+%ep*G 0*( g+77G-ڵ6}+_'d6mQ7oRaaRؤ;}^*jzŗ%Irrl0V^W==^y^>YV@m'ܡdL!!3E.K.\do '~`2!+%SrKϫ䒖/_GL*wO(5եZ~]eeYohUU~I}cGGOWT/4Sm['Z8+q:rvr4G RSSrdcx>Ka$MP`<1=zؔMM~֮Teffv'X &Z$-Y8QVkk똃́M`S{ݣTegg0*p"@\{6-YxЖڳM+hڲ6-]D.]҉tMUTT4Μ9{Zn[-ԭެe/]P'NϿ I*--bxEƍ/;;[aȶmQ^^\.WԽW$&FOzCf5Z:ڵuƛoԭޢk]T_Uggּynݵu/^G~߇=/ZpX~O'utt_~!=CZpfeeG>CSii$;nW~~$)%%%okΝ/Uڿ]I pr9_:::lmٲEgREE^y5UTT=ϴtmեYVt(? iiiJOOWjK)))r82MSdY|>zzRwww8ܜfOW*((Pzzz`40*{ӟ З%=أ?W:xа3Oi>'OVMMM_y]uUff~ib}k_qر]u*߯g}wZxnynMVnAAСFE-vZ'NԚ5D-k?8|QGG#ן mСַY?AG 1C`t:iӦpݞi2MS)))rQ PGG#zj˲UWWd.۶~_t]ۢLIJOO7k{Qa$ IҹsM}3OitxD?/xazׯܹs$I+24֙? /G}/0 :uZU>5di5weggfp8s(??_iFSM}}] c@ Syy$'>w9+%[l$jE_埵k+ן-lVjjp*}Bھa$˲"WTTr:{FP77o{./Vaa$dT y^⇙e)3sΝ̄7++SsQf4Y5eC͆yr#/4 -X0XcЍW 2cvر]G/~7|BUUU+iӦx~Yo;%IzrG[{3] >]UU=H13C&mVAAABLTAA\T5440TaY4cƌd(h$}Puʂ3srr s*r}ݫ'z*--޽t=wx{֛g[z]PwGӣ||jj yٺ0dZ3gLYYr:i;JfOWCŶ)t: E  >"5fNדO7e'GhJCО=oiϞ/˥SN"B 9M_C.jQV[[{uVei֬fn͜9CUU2MsʵlkkWzzҒ]#@ +.'vse-\0EwEE={*+8xFM^:>~VJur3I ,ouL>Ro~eڶ 3Cn UWW/0"1S!lmm%-Ux^.ő$Y5xTSS+I7onavv+kknUٮzI'tQmx"3-ezt2Iv1&F,###/\.p<Kk1yg]ƶm}[Θe ..4o>jnnц 7h֬17MG}STVV悔} f4͈zH4͘ad5ۇɂ.g"/􊲳w-*,,r[s.y<]~qz-Z`k;_>k0 |>=/Iy*--ך5]R_%4nݵڸqfϞ3+++K*)*--$}IK,Qss7Zt/k.f̘oQoHR8 eΜ῟~_7|^eggKr/gO~Z_ֆill[oմit]F|LnuwDehTU$Z0X-PMMMuam{vAݣ&(@*C.xayyy_?~CuuO,ZP%%T,]D?~_kڿ@xK/=3]Q˖-ٳ{ޏ۝|q=ǣ晦I}J}s_{ylmr[}/X0_]#Gꩧ֯~/_Yx_===C55W^}TIҪU+ 4Iζmy#˲jʈo?{w%WyywoUW"uko O IDAT$$@ `v$O2o^7d#gϙd'o6!&,,HB j[^TQ]UU]]9Nuݭt>32uw%A&zGڙm);;+E);;Kmɶ`C3u h a??Wii/_2uuueuu??QIIIV^{璤;nLsc<\.׼lr6t]H_H[U__K.3lw??Ւ%SVtؤO?=&IҗKuq ͵ڶ-# p8Q˜4-@4z+jllRccڕkWkѢE.^Z*//ӛoBTVVH-ˊMLQffXYk9jgŋibTEEy vM3MΎ=4ǜ56}!0axtcYVeOw@ @1Ⱦ2Mzߣl1CM\&iB[NM!luܠu }hFΌ=s^JM&ֺ^4H#.+wh===)4m>uK/MHffdfH2-כRz,|2q]HG%9ɐahe;jivw09jwt: ܜАak?hd9^4k6'';E0MXdؗ2AnwJ9Gi5`I 4[d*+ ߮\N_^wߗH:;;5<<2edd8MkddDTIIIH20uww)vɓڸq㜅}}:y0s,(WVVV N ϥoף~Q_r\)-/ :::$I .HuQ?_~En;EnjmmzWtG. `Vbegg'5҉'þ{<4ƂRqqj03К5S] )%IM'wcRȶ%ۖ[CZ-]DK,i&.eYjhhT}}Gj_fZ4M y@q nyٗiJ*//׍mcA#dzQ7nʕ+UZ𮳳KW\ȨNGD5ÛMڙeee)o@40ԜЍ7/0%Kw*;;;lA9ZZZVaat;{,ҵkU[{^Paanec㌟8һᄃ +tБ#Un[YYYZ|oߦ?=А'8ovݨ?ZedTP OMMMjjjw֭wvwڵjllTUUU]zU׮]C=[nYl;SmmXP^Wz뭷ؤjmmWt 0Lٶa1uuyIRAA/^.544Q?Vm>}ɧ"-]DzNEEaɓt!9-XPRБ#ʕzgtnF7؏B8XGJvҥ+zTY0l$0LLLe?| 9$)++[ 5886>uvvj׮{æw%s[(򩴴TEEEjooׅ TWwMו6O2Ή}_o+)##Cxtu]~=rdzmڢEjmm3wP nwuY~Y%050Я< M8l qm˯O9SAAn\W3O*ljjjɓ۫竽]gϞյk/?٩_~U*--Պ+dY>իڼyS\)Z'0&􇈖e0,Y%gH.\m*--SIIrs >"z>>|XǏu޲2}koD߯}wG֞=jÆḁ`jTGG<`h?lٶnnwG#! Cr:2 Si@3dޣ7U23]*))Y&ܞpSȈ&T4yӖ-nK͛TYYfLYYYZn 2mM2_5Lpsݓ_XXo!]TT۷Jc(&CEE.]:ڵkrJ|f=ԓc]Ȉjjjf<討Dzšֺ vTQQ.02u<֌7oW~~gY<$0':ls:zxP[{>.קC>i:c_ )LEEEr:{\ey^yޘ맯O;^233*_NV4*B f[m:*T7Yω}c5&<K&q"M2iU]][vwkppP^݉UV֙wj~mt6mVNN߯^y/5kVkepΝUkk=cǎ ^iMFm/?ҥKPEEJK}deek̆@toC999… ǽ@P1U88BjF*//krlh˙N_%͡) G& WsniygzNL\Sm3dS} &r${];3"-XPEѣGZf2QII~k:su9sFz/NMSmSА400`IͿ`ߏf3՜Nrr37"9 hxxxҋ@ h}\.vv ztU>|D&zhnhmZ|Y>~F.]իgσaM544^`˟LqqZ[[vpYdx=ܭ-[6P0 SG k2TZ0JJȉgR  _xxZiLU<}MYᢢ"i?]ۚY̳ٴl2$_MfD%뜘T]bSƲ{ e.·>9nM}>zג.]6qBe\nooXY'6)|azWAG|λz''J1P 3Ч|VVJJJ4<XY-Ƈ`}.^$I3_ii Tk ޘV8<}*f 500]9SN7}oPOOOԚ.\Y ٷ~5]sb"r/+-|9m޼)''6fb=H0Um91hяDdnhʕLIq-|sPԚ/^$-XPB9NXB ,PYy*mKY?:jjW>R ̮]0 ?^j O[np5VTÒ֭[rt5?^pO666 m[G|,qtȲi5+I[oܞ;Wa|>|i/Ս75 } =*;lXssNbI|MƳm^v]mms``PO|8`XkkkЏ0/a&t@ M\eBqX~(WNNzzzҢ-_lB~=O^Paa-Z|\.uuur8ڰaCp<}ڷ}}!]tYK.Uaa"өG¤e^nШry<׫y ,P}}|m-[TrKo4%%%-:zSΜ9 hpУi}gneTnu,ֲeKb]FO/5k(??Or괾^ԪU+UTT.]Z'Iڳ #oǎШv?i5*++a֕+W㏩q2{2U<>ʫ|^|K+WV _}}}vVX;$\Y ̙z׵z*-\@YYYZnM@%{ܬ^60c IDATxQ˖-S^^nhS}}gσIYvZ;W>:.(++[[lrݯܖDΉEr2vw;*,,]wmgtE\.kÆ1}áݻ/N:-YDiI^VۦPׯٳg֮]\uttqzp6UUUY/V`qmZ^^RuvvQWVFS]9i:~VVVVZZZبw߮ꫯjɒ%*,,TNNt& K7VC3r:BL@`_p۶Zt>nܸ˗M󙦩bm߾Mk֬0iu;w.l܂ t=;'4Q{뭷BTKKZZZ &v ?իWuUI/_{ToiߐmnnV[[& 45VsD~$вeKef;IϩsX\_ڳڷ=kY'3gMn"f҉'\.mذ^zb~\g|/TZzu0LI6}/i߾Р{=2MS9=#2;`y0faz]~C w߯ow@: )ɲ6gCh)-0/arZtG.hQE3c3" ƌ!QD l~oo0˲d۶|>XSYOK,JQiٶn|ܠQlVAA~~b}Ȩ󕓓WY-ROO^t&_0/gu2MSyySN(q#۶T\\<'71+|U,9Ѷmy<`^iunegg Ļm|>d'-<-233'.&۴WS>mKȲ,jtԫҒID ~(???z@*~0Ahhhi:=#LBŶ$ɒ{ޭ(ρwEe?i"+ʸL6M8H0,ݮ97z㕝W6  MxԀܜ5TJRH㌌`rK`effNdnP3YWp86{t|?.f{BMt*s[9'5Xs\`3q8 Csy>c4io7ڦi(u|.K%%;J 7$<}b >nmddDOUvv65ѮE'Cg<\f H~J‡_eMyW֕+Wue-[LEE2M:;;'G ꡇj02Sò}hx@` G9O…K=6<++K_#Znm^rkԟrZtG.Lm#ʸafqF4!Ә#?;$]5JB'χnII)Ӗm۲,Kmɲ,jxxXOeǣ+4UVVʅlkii-i@|^$UW+}}}Uff222d Ðic54ڜ˕I%7n[Q>!wॐwEL9Ύ_QE.gib:ODڅIzhhR@sz"]@Ӳ,Y%'#éʊVKK|>t:df0 G#Мrx".LN3@ 0Mň;"ˊUp?<2^ׅ"&G 0 !F0t8 (xH^=r8 edt:'-:^'@`B Ӕ,pH>=va#G*++iҐeY3$_3p0 9fDM/^2$#g1vAir:̔aR}}i`ppP caL9N?d:$&&@ ~ i4MY 55PffFGG)W%%L/ ˭QCNCn3C[e^fh$aH]iNjY%kƧQyjmmiXY4E @ Y%gHn[^%ӔNSc1fj~53M$ 0 5- ^-R)N'wTeS%\QVVhm˲,y^ k``p6$r:M9r:>1MOf|a&@,I6P3eٲmKa0a7IYc^;|;V`2~-}0$ÔК+ 3ĥBMMӔl;P[!ðdFHie mɶ-i,ȴm[^#8!?ޔa(NiBLPH9>wf %SxkB-6džc2MGDmƇf[h896$0a6d ex91$G 0&fȋ#rj]kiTD9U|E>܈l֜،lh?F.gab#S֔›UHެl  45OsbbI D2ћpF6/+L i4jk*M 4  +7×&^C3Na6c]P6? /Z31ZL 4DښVr cbп&flq!%a&0;4d5M(7f&7y- Ss *M44`S9χ sds@ lNWQN03"›%sHMy&Yg̬9ZC 0M֬,595/G p 73X4-Mi@@"4-Mi@@"4-Mi@@"4-Mi@@"4-Mi@@"4-Mi@@"4-Mi@@"4-Mi@@"4-Mi@@"4-Mi@@"4-Mi@@"4-Mi@@"4-Mi@@"4-g y_S5˕}fL@"c55'o5Ovv6&>40ǣ?o޼IO<񥔖 7M㎍˝t+s{].&@ ž?իR] -.B MyQjkv+++K/Ν;t=wǜg?g (77W_$;WQ.WVZ]ղeKzoKUT?ˏ֯u5ݸѦ~Xzl٬%K'i`#^^xEG?hظG?տϵu?0~jkk$-YD:tði}W??}=3ᣣ^?Z;vh???ihh(o+ر]Ŵnn)dY֤ӘfxO>OӧL:ߧo7 ŋczߘFFF?֪UyIo2?K1CP۶mM;p!Ho}wB̂}hѢ*]|U{aI?a֭[[o]<<Op~W$)#éo[/rr~;_YXy]_\.بӧhS|~h37j:Z>wV__4VSi׮{c.a熆F=ܿ .\Ȉ\.No',|o}s²ohSGGg?~2l͛7'O`ffNcCFI_z*}υ Ïb.s%aa$-YX߿+ٲ,566&To|-$<|~PC žGUUUNcFsjy疨w._u,?sn靴hƍ$?o2 C+y&ڵKw޹9)vwhUӞ;sh?*elۖ$]6<~O.]m[W\Օ+W+[??ӊ˓hr`),, 7e`韯`62'?ޣ ֞wOI~ 0D^<},YX~z,8֭w&, ~>|{O>OaAVN [ndh /gc}ۿ#O,yyyh /J|>LӔeY'eYz۫IR~~s)\^YYnmì 54n۠tc~UVV6keza,˒$>$S _mmmaaf^^/rssg_ 0ǖ/_͛7?d']զMD~xXMMMzպuk# 2m۽HpႨTUU5//o4.K??P}}LTu [Vq;}a?^6uttjttT%%Z`vOO>ϯwR/劵6]dhQE3c3" ƌ!誑ltwwK-[ N^WNyfp`r26I$w+g;s]Qi"+ʸL6M@'H0&gn")Xd4-Mi@@"4-Mi@@"4-Mi@@"4-Mi@@"4-Mi@@"4-Mi@@".fm۩.i0T41fIp @b?lH 5/ B/ &<OI @ ,C 7E b -i7+;ٵvd`i(EdVer7+`fT1jgls@ L'ȴm;ˌo87XYddÆaCh!&&04daecO|,[mɶ%۶&LO?g㣪Lv$; YWuvjU[X"Bʎ; ɞ̜s~$2$̄G3s= s~Ȧa4 NgCCm>%:&dZ,Ki4-Oxț3673ur?߯-9a4t:egiZfk&teYrM[eyS a8e pض-˲eY\.jk],Sev0 9A rl~ڬ٘.aI/?ݺuSHH 8۠ IDATNNC:v d&43_2ga\nnٶ-0` N2 Caa Ryy' Rpp`P8s牯 /8GZb>tVe+::Ja~n"dU[[#)TAAQ {k@hi)::0 Dw2J&p4:ةLӴ԰ٍ0 Lxx,TEEpr:!ڏ :ЩL˲rɲ,[n~;ݺuSHH׽ bOMu_R$˲dnLRLL?ILLLj`6h{ 4:˲N4|Qq\,[qq12 ~BfbdYM#|.@hmY34-ݦLRPSaa @W gLMSm:CS,= D pvdYZ8dY&Yj/*-Ki2MSa($$'$$Dax4g 4o/+Om3;.*::A2 @ͺ\l[ wYBCCejG`7*s 8 ͗i|]+-˖d)((H_tEa(((Hp@m^BS,; 5ˇie۶V0{M`#8Q fC]ٶд 2v 8C-s˲dY$[NUYYC 4nݦ/\)өd%&&(/֬Y3um*(%q: &tmGׇ͛hJH$M8A'N /C|x۶mݻ5x ͘1]AAvkm6 _}:/??_eee>}`),,Lη}B 6L3gNoq݋.CW^^3%ݧE>ڵ4lPuӖyHk׮SbbkUUUyEZ|5k $n-^D5i3w@KpfǏ 3%)-$۶{Z\.YN:u'̔(όݻw-}MiiiWڿ-%%E+{*??_Ïh޼9spu]ёu6V{|^_8|5?fh֧sI毝͒d3g}T۶~$۶dY,˔iZeݻ=fZ*,,TQ rl\.*88H1112`JJJeuCCCvURR"0uw<p3Gf0i02 Cp8px_㤐$Y̆GnQ>7ɣif7;_>ښV=~&.LbMSƞ0S 3D0S _خp2((HIIIJHH sdt.i̙ŋ3Z@)SSOEc 6&hӦMmjZsj]&x@E :BMk"&hNPZ4@C tS"MiM6Umj>ēZ|_k14@6sizZA `hNm ͙3Wiz9N=Ѓ~ @ VFaa;wL¯SXG}Ekkm:&t3@t*@B : L!?OFg/ӯ}=pk@D tMA._MM֯ߨ5k*+눊e۶RRR#Fh)wrg{MMJKKUQQyVױ,K .Җ-[5k 9r)o?>@G .M.vwU%-̔$}Go~vnV?T`۶b?,IرhW_GKn[{"w@F Ej_ꫯHRRue5lPvPڰaݧ]7hӦ͊ѝwrڪU߮%%zWmm9k-Lөyj~ A TWW?Txx?YnlŞ:OeӦzԯ__VlܸI/'m۶C;C/'+%I&MPPPVXy^k_y9L#~gt`BCC֠AOyN||y '?@noޥ}MQ áS=|[C ?&&C tM={jE{NLtNIQbbk >9ηTWWo}n ~'顇Ԕ)W$&o$o>ַ>񪪪fӱcS޽5p`M|yToѶdI|mz'~FO{bb- 6jΜ*,,j1Q}h\٫ I#j0-]LijҤӧTVV]hMڹsfz 9Λo-ILIݻΆ:9;|M>LI竢BFlfJR=?IҢE-h\qeeez/zpV}"##[m?ݳg[c%jWmmmƌ8W$]w5?~$)??_gX1@Œ8Ç_䙨ӁuxT[[O?]$Ir]g4TnTZZ*!uZÇt1Z_~rZ-uuu͕$} gynn4.`<߰aNrc~ںuWXhoߡz[V[UU>ѣٲ,[zZ^Ip h\CZswOZT,#QFRI҄ j̘Q8[-ݫW/{)=z***|!IF?TYYY Q骫;oY7w^?5߿_'Խ{t]wjK/j}r:^j؋%I8gٳ5\-m޼E%%%***VbbiӦjƌi-7=ԱcJJJm\666VQ/G۷_>eM$&&Faaadr;4ёu6V{|^_8|5?fh֧sI毝͒dv+oJKK%I}w)m7HmɲlY)ӴTUU%2ջw/{*.K}eY2|ٸfglѣ2 """t2 !ÐQb;4BB/dI2GkGx&j֧y|hk>N[}Z tN080S(;uv3N E `hX&E `hX&E `hX&E `hX&E `hX&E v IDAT `hXA.(..w @ MI||K~VYYN&E `hX&E `hX&E `hX&E `hX&E `hX&h!+눲 4 s?RvvF+_AmP^=:5a&4M[[nSEEEΩզM_42M@0MSolWM6 &@cN٧F[l?M.bѲ,S֭oƍTWWI&۶]vE 6TYYYڽ{ƍD1-TUUi˖mJM~jUmu6<Y$_$۹b-Y.l ЦM}LuuuՀ +j]]֭۠c*,,Thh4bp 9ǎj-:~***pT=5y${?]Çkt`*+=zhI߲,>ݻPeeer:СC4fC [^ǏWQQBBAi̘Q-]֬Y\(&&՚.4]a0a-Zuga&ݮٙVǪ',TvvBBŪjSNN?n+0tꔗ{_ dY aF9rTwqkOLԽ{JJJta>|XÇӌӽٽ{>|{=U*))՞=4eyyǕ[L񊊊RAAvܩÇk֬u%K2dNEGG)%%E*((TAJee׿>痙yHD5R^=U[[h;vL|P5JNNRzzsNeff[StV]~&ٳWƍS||R۶mWϞ=էOo:ʕChڴYEEE䓅:~VZ3<ƌi:t',--/ǵ}5ײ,}*/Д)Wj̘ўhɒ ܹKzСCe-[ ~JJJ~MM>kKLLw ckkkhb:tHK.wۿΫB}GҁfVVV>ih֬is*//zg6o|]z}fXRKumoٱ&@p84q⥲m[k׮j[nLӭ;3?@;wV\\fΜDlBBfͺAah]*..iq~JJ 5 366V^:NjX&-[DÆ 3%i2JIҪU=O8:EEE3%),,w y, u]nSVV8C 3%)))Q_"I~?VU.fJRPPN̛7oQyyƎ+̔/HݻwױctĉV@gG 8@IIIڷo $Iڱcz"8klIFbiX5d+?xP&%/<4zH :DݺEBhD_~B'NePPF.5L6CeN 6cdgH}C<"&M>֬YnN֭e)IKŶ'11Q{9C53=mbc}_p(11A*..Vdd ̙ӵdڼy6oޢx 0@FPdddjԸ:}%%*((PTT""['""\#F UWM$kQژoIzOYYG$IǏ 3dFic*Iaaa iy-5Wt˖ p"fΜ}jMvU4hbbbURRWxmkŊU:qF25v2 vڭݻx(# Y/kKI$EE5G>ZIyzj*I#ٶ֬Y+I-QFHV\YqcÇ뫯6|?:bcc{Z8NM:E'ڶmV>dN=zTJHHФI[TtfZ}bرSݻFgB֠A=甖_wĨgϞRHHg>9N1:iuQ4`@”lEDD+:gȐ:tVXGj9rD$uθqh߾*))oA)!!^555:v,Wi[n$EFFjʔ+T+VԧODJǎ*((H^ ^FO>[Ijʔ+Ny &N[߾}t]w/)77W[Kukr:vK/$XR999ɑ$EGGkƌ>|W04j(ښ3Zis4ѤxNIFaaf5,4,۷K XOmGmKe˲L*Y޽{s4M+,,2NQhh)WWWRm+::Jaaa>/˶-,KeeerJHaSeY:qnԾm[eeeUTT"""NٿTuu.EEEg(gz$I= M4%u#RY@S +uPlSr: Sa_j?_㤐$Y̆GnQ>۞iN>Ymv壭8mi-9g"$fh8N%%%녆(%%~zaa;k iLLڻը88w/М9se0p]eÏx>c45g\I괡&D7ez_ymmb{쿵p" 4 3NzAu6mjPӲ,͝;P48 K[ah92 v!#.M@u]믿epK裏3xq]s~+ &M@Rzz]F5@S ,@wȺZ}k:ᣭ16G>͟M͎7do$۶[yTZZ*I۷K XOmGmKe˲L*Y޽{^[|~0#{0RtӍzLV)|R=Hˠy9گ=-p*""BN!p0r8 9;4BB/dI2GkGx&j֧y|hk>N[}Z tN0g;ga$UW(3|㎻^n]BLMk  @XgjӴiS5oO[^/yfg6sizZdS\yjΜ^K:N͛7W3gN?񫪪aFuawyO7|1CShm9sxqY+Bׯ ||Vcwg zAch2ԔH?:vBEiΝ)Skm:K l֧~LM>MÆ wILMPi?yyyg5ޅ.#c}aOǦcIRppG-))ՁT]]8 Z^eee^zjNΠ􄮾ZYgҔmۺƛ_37yվK.ONEEE׊KϪB-~1bxرS/Gm'0x ȳt~y/׭yEݫ^'4 CQ7/??_>~dYVO3gNO?d$GqcTVVjٲ/oOYYG<ǝNns#&fhtޟPCr񍯫G*((…RPn]yG~,egW-Vl=]yڲe9Çԯ_67NS'OjG /+p8ҳN3/՚5Ny_=%˲MrBBURRW_}Mos4g\U׿~ZW(UI}.>6o"I4i~km[;vϿ={*#c.hns^eʔ+h{~맕o=] a&u1C _TAA$'KWDDzp(/w]r4~%+Wlo9~Z4ebϤ>c^(Z͛+ԧOgQ _뜏>D555r8zg5stqqOuM{κ֬[^vV^#p;oӅ.^ `/=!oΨ0s„Ku?=5*Lkc&L-^!Iu7iD͘1M[l;V+VҞ={UQQ}GQ&~fPjБ &lX<<۩ȝboXNwJQ,.EJHٝlMv|ޯW^3lv!3y'Fw+Vj͚>PT;v)mH;͙3We:4nܑ2M}xes9B۷wSI >Lz$i]zwv:u^vs.}vϧ fv=X߾{OQ5zh}ך3s񏧇۴iV^NԿ?}ՂjVX]~֭['קnݺ(?K4kÕZ6?D6lP˖-4t52kѣz5kj9:؁᯿ц]h\.&L8S\p<{ի /0 ]wz mWPUyyyݻW?s˯ȶm-Yg:5+Vjn: o]j:t(I:sklwܱ6mڴIz^x\.N?4]z$\—>f\.v<65hyg$0 9qqm?}MUa'CΜ;Fn['κ7xKӧ?3ӣ>ᔿw$n$]w՚:!J^y5]x:ԓtyiӦM~^x%=#A!m_Pyw4ھ/䢘aC[hYnvdYz?#|t)'.UVVV틋w8m ׋/}ݣqSό$s֬YŋHmڴZ/硇XODٶo[^Wr?}w m{uϩԪUKnUTTȶ$8:ǣK.Hg}f/1\jjUkdO^ <~]ڹst频#G褓NT޽Rݴr=f&@o}cFzt}H2224t`iF?BV_ϿHӦ==zD…sNw*''G+ڲen͛7_ Ԙ15w<-^D}6[f͎ucO{n7-X=t-] 3N۝W^yU{KC[Xw$tꔧ-]viǎRe(.8 aÆjΜ5W:Üu@s̘Z,K\3Y|$)''GCw-TA6濵jj=Č{|~{n:uQGSF[}WooԩܾcheYΝN8.߿_'I7i"󟷵hbmF%Ioe?:^{IN;I}_Yb$vSyMt7jH͘QaB 4OMXI]Vti_KS$ 4Pw}:uOtM`&=3r\)..W\?.]:sէOoM< y:ᄓUX]s΋42ԢE9l|/tm7;st^S>֭رj޽{ =ܯ^{#%<$?_փ>"INġ֜9kϝ@d[eee 4_~'<uU;$r IDAT?_…#+.۞瞛#{Tv? u5Ogi߿_Ķ@kN={n@3HرF=dv#I.R$mߒTPP)S$ _C N5TYXX|.GVm<Mr CuaLh"'7@/ȲUuȢG}\e}zB)I7]}Re\Lԩ,5't< r(ACnܸ1b?3r*{@sQQm?&0ܹFR6l<OmKJg!I9r&O6$8r\_/Q}7yնnv~:ud|f И1+_g+"G?3٦N}P;vԐ!cI[۷iڴgOoo{VX=zh{,t/m[o%2 C\p^FfԨzjƌf&@sNy]zmذ8a™1L<aC&u>$kժK!u뢅XÊl۩SLӌ(tQSaa~a$i㏵k.I_rI lҤe,rXS۶Vvyol>@HYRG_;u,p:i=?K}е^}n^iӞs=3?%gE}=sI?jРn!h‚6S8 БGI]dIݎhCk?nwHWG{$ΝlQY?k)??_Y/// wrs!y`` ~2,r²X&KYY?_ gWIoFG{G}ve~ԩ/2)*<^}up}7 h4֭[9KJz?op׹sc$kȞ{ޡ9s>?,Ӷm4`@u]Կj_o_ 6ĭ܃&x<1b%\hng 6[:sݻW_k>z_Ӧ=m۶˯…Z [襗%I<@sϝ5iM&m۶hÂ&*0tmч ֪UU;w5Uv|OzKA!g<5=0jwʐL ܲe/)3gT9p|ɶzjKk2\u5xz'ԱcW衇תkG2+5Qq:wرC+V~Zl!%˳N-j͙a=z~]1cN&={uw̡"4eYf͚ ?sQq3^Zl3?̙Eٶmgsn(С&MX矫WK|"i9i)/_ {qэ7^_@Y%@4w<͛,˒iּ]Ν%IEEE+k֬$;ԡч8af>{WMNt2YںkOm%3_~PgхY,5eIv<'0$ճƁ$yq㦴4-7:aiVW]u Hu&@w챿ܹ}{>}ugH3f'߭ Iҁԙ3sx11{}, VZZZgĈPEE9ddBAO>Tk֬ƍյkרvxADSW;vv~qlt5jdRnc[P |#I6`m ;t i7lب{Ot%k_AA1|~Y}gN804MᇏUNy-z5b0D+//O?ki}vLI߿履~Z_Աu/JK I:S𼥛6m eW-ZdO?ex2B:昣#B>nϗT^^!I:ckվgf̘CK!h < jժ^#`4~ q|wNy%iРurrZkdYv7|ީ={1ԧ+Wg$ 4P'_K H77IҦMhҤiӦM!ut5kuS~.ϒkoQYYY 7,IҥsyM:_{:+++K-Zd'<`vV_3cz%IGyݫNm'ٟݻOޒ-ZXtac/''Gcƌ$zםl4uC7 Ii*˕&)˲dn:j!)邳Lf#й瞭-[N9>|uז-[`ڽD*2ڰcT[ÏxqaO?ԬYz)SniCd.ZX?BH٪U%I۶ˮY7d`yq٭[W vjx-m^C=D-Zdkڟi&M|m=ߤIjٲ5uC9C >\. q֭zk33vZz-1useW<,0hii.҈mLYڵKhw/UA6{T5d`uQ۶mgүn$ {!?[o'}zh޼!G!PǶm O%$GfbҤرzQ9LgK.(> hyzWCwѭޤؿގ#mۦ9s>,b]֭7^7D'κTVǗ'xD7xfϞKie!u>P~3c}Jgf1?BsNn7ߪdOue髯Dҹs'=S[hb^FWkJIڼysc!e:,{^9̲<h4#4n1}-YTjժ Wvw{0t%Ռk먑#G)+++Æ,ǣ֭C:օ^ IիWȺ?Lݺus+߿_HC=D۷WCsrrmuY׻wog]"PΝ;_;W_-PaaZh=B5_^x$)77rnhF-΅*IZԩoGO֭g{n:4jȸjy_xvܥ};f|f8p_Mx|>0[6t稢"בYN.]-///nnݺg7|Yhժ*))QNN{ƍ;"[]5HҀ=4kU~HDȜvW=m#ʺ23:#Ns3Vd~!NMϞ=RݔmNeY,[gDSRZjnݺ%$d.hB.)t4 ?20 #&x76wOA,IGъl-yGA ^Qօ'^XNMk#¤`&@=q(@ktG PNJ8;rd#g`\+jƝ4}۶eph$z&49mW>PHXaa,j6aYs n#g)  $o @-D1J˿[Y@ZAt h$Es 0dL%Ю]{R4&  ‘_42Ruay4h,˒[^yspj=P@C 'tLI)Mu@ T]#\3 G d*w[rdRQQQ[R(Bjh$Q H`> %4eYS>ИYhF3K F 4U''&P-жm)jHA&& &@-EI霜.!׫= P2%%{zekф_[&G dwWBNT222d dYV eY*((a̠:ц@a4sidYm Q\.M 2hA䰳Fc^;2MԞ={T\#%x#Ӭ)wd]KB T!'AKi0 kT7$%*..ax<2MS銸N@f $@ ɢҬv0̐P`&M%*(fT 7w&PT73 CmXPӮzU\CEEABO—@;s'(///S݀ƈ@KZ~Cq̤)U}w/>6mrյkiՇK\.WJ22Ngyzi)m@, dϵh:K'5@iƌ۱cG{n|M%KBe˖ {}Z,_~uz[n=ܧ%KM7MiNzܣGwLj@?n*xGH=GQrϷe˖f:˓&]\@sԢE$«_~E6leYN@tƏ?N#Њ+5ku^^T7 _h&&MjĪ@裏׀-KR={)[zne/)!L04qE8T7Zfa5էO}2ͪ?YW\)ϗvB C۰a>c2ܹS]kaQ׮]CΘ~e3[Nݻc9Z-[sN뒤~j1|?K}|oNGu`e?Ѽy__UffzN8F]hݺN?4IڵgukuСCկ_ߐ>{CFG_͛={hԧOڴ;Fh4)۶+'RyyShbIҴi袋?N/=rl۶ԦMܹt8 ғONK/+o|I 4U9fajӦMDݻw;)$IӧkJ#GYc=s6mr{_VxA7| [lM7ݪ[R>ze0p:Ï?y;ޤIկ_ߐt'|_~un-\(/W^x|*//"Ðt5M 7ܤz$$ VVV~ToS~Ϲ}{xAgyǎ뮻6mruSQoʕqFgy}VVVVHMp^D_< IDAT˯O?YX_<)jh'I[nյN֎;"謳΍3 3u^Wac۷K|i~С$sւ8fHGuF@$Ii[oVNy#Fuzi!m9ԓ篓_|NQ۶UTT Gs%ό駟Ն Uo{=y<͙3Wty^YW< Èٖl 4P}ƍ_8;4}_'lOYo~stR}|ܹ+{=lۖ{ۆxj<ؓ!Ag6oQݵn:ڵ+@ |>U^zGtի5q_aL͛O*[nAgy6}**@3g~ /аa;#QeŊ駟trINשV69 9 Ф,]6o,'GUtڷo,^&d}^^gy֭2NgCFi„CƆrꩧ҈>҃mD^;!$s!u?_pQȐ;!(ѣ;lLMqHԩj}i2M3j6ˢE#ޗ0S eDM'|_|Y+VoX?vzzwE7|CaYI'UW]u]{ /)333Y^إKgmݺUBuօ,:$>22<1_71nܑu>ߗiÆ@ ȄG[lowp,okDyUuIhiLE={$-[.g.̙VZދx6Jk"Ǒ0~_D dggGqq:tp+#{v1bxׯzQg>]v-]vvVյk׸^}`w0pɖ@O~~Ou]]ܹS_~|:κ䒉5kJKKǟ!CB39mk=B,]:G%}M1d`edd83fիx?v6o,Ijٲڶm{ǵbʨeeݾ}{_::3)ީz!eÇ Y~ꩧU^^ӻw_pϧ>8>8W!˲'6p@cCT7֭[s'8>O\}LUTT8mi/#+i9u]W󰼼B7psD%I}Y~ǵe|>mٲ%iyg(//Y^v^~:Fu7mEg-^De97C՘1K^ϿHf?'|/*>8m1ܹ}kRF*Ť9h&L8Kf?Iuͷ[oW~~[TݺuoT?L>|Qt988?_*ćzDW_}ek|PjJv$-XƏ?UiCzrYYY4inGs20t3VIIT9/NQ~~JK`^o'##C'^o)[jڄǑlBtӭNYMCqr\ztqaNeYڰa֯_ܰaV^-IڹsFgv+.s ԣGwgf͚:W_!;8˲eZރs ,jԇBtYO>oPHyyy֮]͛uwΜ!=iҤr\Q{<첿);;;zq$G/rz̔Ǔu@=4Öd$P BV4xAr~~ڵkoSN9I-ZY֭[]4h_5J]K}]uY]{8OTnnOǣɓӓONsF!u8 0@ӧ+Wj˖>}zU^zsVVV̺(ݵkV^2m5mjeڹs Pnn:j:䐑! iGM=?=Zx٣mjذuYR߾{ic}Ob&L8y_,^eeeر>x>L=ē3h+c8$H.튶X^kxׇ?1օoo7Ͱ.IFAABUΥ@u$I={HuSPCmEl=SyޤR}Bs9_?\ԱcGοS:@cdX$Yϭ;Ve ^VP=X}xbW/D ЄAY)`~>d 3 i͚r~}S*Κi姟V0X:EeeeN7N FҢE5`@uM9ڼW-ZH;wr~a:#RV@véz:Y+--/eYZG-[cz5\ ɒI!g/'}<[jo>96xqsd-ھߨ<68˂ z d.$N! Izhvڥ_-[xջw/uMNdX$Yϭ;s;蹂.xYqg}z屶U/5AC6MЪU+1<4_5 fuY 4k'Yݏ ȆR@@"lZl}̑41fɝe Ь=>HR-hH[A@s 4piXs 4S%fh 8f}2]M#ЌL;j _,"WIu.hH[飦{2~.y K Ь^:|Xl %?I%ڐ9lxLMS|ܩn@ ْ&h͜m'1d_Gd3](5@3L6Zyl?4'̒7"L{ῼD/Dkۺ\xMhֿdVz^lӓ3-V>Bʆ4@>+}aM`ϲ,Wr JMBLOj2|p3=XUX]K;>/Rs 4k{<&cX_(eZ@ ' -T +\;< %L5>֎.Q} 91h6NGs!i$*މeY"";5s4CkIZe2&f 62V^FmbfEE.k쎝 $dڶ,>kV@S+kA8lZF 1 6ScǎЇ,˖m[mɶ̣ @Adp i h\.WzCiȶCj6UV-|md\ 5uD0 +^h:=c|!?ȴdY|>|> / ɼV|kK!UTT0L\\.LtfjL2eiDzc*(_ W\i۔6﫺}1Ū܌R^7'xhT>7<^vI2 X՚Iz4y,K^O>We9Rff222d. mY-򩢢Bee,TV)-5،z_h}QeL_]hEYh(hj(c=.Lix'#zhVMMtͨu˿v݇0tX^ޘ!eCմlROsar \222Ԣ TN c5vzm[alݺ(amz^&kY$Qs"V亡WչG裙')Syy$iv*++03MSYYj׮rrZK2TVV >ֈLHz $hU]2u%s}P5[;^x7E>|Y ;<m`gY7}{>/O !gGr|,˧eff 1eee*.!t2x`֬[jyUe 6Ç+hYQ j6Vgh*ruEMoɒ֡F֤[sq}iӦj\PWafpƫRy^edաC{LLu^sy:@o~򱺌$XmDG=j 4Gim ixtI2 f[Z Wmz}*++m[jٲZlٽDwa̔ Ioͺz_h}qeH_XvXoM+JkSaʖ KY_x`h"/kFP Շ^ʲ,nݚ0Fejݺ,RYf`t: z.NOhو5]_ k f}K/&c.*IYr+ w޾>&U]Y*//ejժ%a&MLvvZj)˲U^^."Ԭ=wqqL$ZhYڔT4$ϣkfh?̥^f_얧,aC 3-fz^eddm6)k+_۷Bn[Gi2f--_oFܙ/k2wfNaaeeD_E/@J6 ٽ{[m^! )TfJe糔f#ϪeYmE ڵ럕afޙF 0y7D&dua,Nut4P$/۲n TTTȲlm+O124նm,M < vGj׮E_Rqʔ`hYuYOM^_zUu6ڝ0_ Ca0MDZ۫zhZz},.ee1o&AVVnWeOMlۊCSL²ǟ89F ޙ&Dˤ/9df\n@ 4y4=O~9Wmc>_`2d BM@ii$MT7ъ;\>Om۶՘ uvURR<CӶmҌ²^׿; kJEY(励.nQ1]IK@3Vx c <>h;7lΎ61 Ьs^CL?|>UTT4Mq\*))eYr\2 )|:z7 3wf!e 5oCM㭏fX-cF؏1om+:O/BǎO߳g/DoMjǶzjVTdRfffR 33SkvO[V,_d!VK4`:wjSY߿d/D:R1}ㅚ>Ivo1sLxM" ,OJZ]ۻUK54 q >E  ل@ Y-1x<{o37:ꮮ|@9;_kKÇC~WkKt?o>+rXA9ˌjr|MNVS 7vS ƿܚ_߾{?}/SlfzoRh3ξŋ_~ǟJaxb6V&VrχHi)^fKy=^S"!_?џ~@ *4_n7ћ.\Thޝxo_?.B̛H%f03wW͔0Am*ͩJʱ6[Ti<6V|B9.ڿV駟W?y7rX @>]!Tm8܆psspss~w+jpss~ ѣG:q칗K) 1Ƕݻ:3fn b[)hq0S0Z6=pÇ~O;oƟ(nooa4 4_Vbo7{wwnnn/wn'www%42X{&pX"a0sOɹkڞ>yx5s`U}. ?ԗw/\*5`ޒPlq\cRr,a>6:.-VhMc*ͱ۹έ% ax}c scbΚ*O]ۧ©J̩a53DgԹ7u5mj.WimgCp&9W枧9fyamb{fs=ck{fJ1v9\ RU*\cחԦ|`45X/A=͔yL}ñS1%{?&O3l!pmJ00 aRNad؜)af]l1qbmS,!QUss k&7 5c!TX`92&YN;7T8 +//lEaf27e̍J3v04V_ 6S3kOM2=IDATOsƶVqƪ2cT\άLAO-fRlj΍y5s. 0SBթul>Xs\궳s!幹㷃?uTfj~%L4w=B͹-gᱹ5,bM= {XZř[}mJ9<;u SNm;~HufAA6k;_3w 6c{fl=%ki(!ykcSB%[έ'<%MAZUa$#k*ܜ[TM@3u㩁Xf̹̱mj;ܩSkIY\>K 4ZfrR[ՆA yjmꖲk]cw;&emEHf;֜-ioGƻr=j:s*͹{5/Mm';w~j=sspo@UVcǧSΧTenN 3ϵO鳔@{Ui̵u9ul/.6%\lm[/fMH75ȌjsiU8YbafJ%3CGOMU6XP3OjsjݩnɭgccJ*H RḆvs`rjc󌝏鷄@{)ҜꓺPsԹu uZ9CnIlng 3{7={Wi.9k:P[]m\v@rïorP2%:מ2Κsktf#4۪R3gsck~8R/#UK5Ve=D=K CfeVsk[{A\e9䒪̔KƌQLԹ%N=rMfO)inX5m%ۻ.f6hwTdfH 7SK= )Jot{کK9v|ͳ-{ 30>CUvKBPs-ӦDz{TiVc- E17e=Ga h;~+Sli%JU%YZ&x;^:Ȝd5m8Kz/7-{{/{ ! kwM93e K)ឋ:C3), 6SΧ]] `j%S텙h;Gnkgfs6Ka PCP[Wd0lB͔♙Kݫ%[YK K=㲧04CCa-]lkir" /s֒8dۮ |t038yS}\J. 7sڍ; G[\R 9զTes3 ;k`TkX-5S-.i;/,pjm 2Sk[sU9s k9վdv}zP**q s^Y@{}5ۮc Xw>m**1nl5[nu03uBh ݲZ3wpsjkYǨ%xrK*KSzs* ^GS}JVW掿f.`?aZq}Z3:Z 5d=Ӓs˔zVfgnέ K},fV,pgW: +`-df6DVBͱ+ 7cݏPbjRl҄\ -Ԝ77K *t9O(AѸK-۹ /7ݿnmq>_+[1_BZ5׌үT-@JXGa)jO8AM\Kf:S+V:KKG ͼ#՚[v!kIжu9׷̣l )MOcgq:b-GafgE鎺VKrղX,w[oZyM1\;q܃P--10c¤|G^ZYz,%giV2;[ff-suk-,5zRc{Y{f *,NU w5ܻ[r 5|H3)39G4N5\#rsu87ո#YwQ&x)ky3*k@= #k kYGӄPrM׮@{xG/utA贍k-dM(z ִ.S۵-+֕tAڮq]+8-¹Z*:Km=] \zM[~b055+}zZk 5#tjZZaj{P\Gj{Ys`Xں#9N׾ղK5 vղZ1uI0sV+JH:#CKCKkR8Z$KkGkZ0z%OIkj9ly@իZ[_N;Y#`jCS zk@-g9Fg 9'8jY~nY~f {ܽhe\7Z"[uk@/ k”>^dvF7/pN J9A׹^2OBuNwU̓lj'<1a @m"5+b^Xʽ&d%7RBL(}L` -%xb3M 8{#dwB%j ._%M+6g$;BHg-  kx7IENDB`Refine-0.7.1/data/screenshots/2.png000066400000000000000000006551351514222123300170610ustar00rootroot00000000000000PNG  IHDR47sBIT|dtEXtSoftwaregnome-screenshot>&tEXtCreation TimeSun 12 Jan 2025 13:16:230S IDATxwuw}atX  (b?=w6xv9+'r]QQ9EDQWųHuY-,!NIz>>|g;;W@ڱ$@G;! R6 " p`O$" $G ?| p2D&ў ԋ6LdHi"P撨#r` .ja9$Si{ } Y!i`(%ȌG?0xyឃ`3"%X/T&qR15z\B4Bd2c5#D 'J9ZQ~'H'Aa֠/~RrP% `'ViO_\CXTk1[ULǿ|FOf !H 3a^H *S5 Fd< 1 3T9JfT f@PcTe&*ȌW= @Ep/՚Ipf3dbr?`F' 6 5Rf;4"4}g~ғYhiiDIp2dFb&j(Zo@:I&f|"U͹z~{ Ռ ܢ ghZ3I /af<$# 2c7O_fuxWP3 FIebPl؈c-3rFZ}~\=}A"%jXVeFRiDX /Ve+42ČyvO҅WFf"xWkjz aQAQ!f5P @,҈Pڄnlj&wz>bY ӈakCmN?@袭`4* dl&s&f54:ȌEiİ >6c5l`P3 afUVG`sX(U+Ԑ҈`3՚qD /xb]`h mG霡:$0sIMUAf4mZy"} HgF_dHH#M5jhd 34*4"LJTHg0EZLQf5 5c,ÕT 32# 1 %kɈy@h4{ !9Q&fH&pCC!Af 眡0jRRI?upFlrpP ?FKP3]ÞX^wafpЈhL~;Ujkt}0ʨjPt 6#4b^xi H&wk!f(Uև6a!eísP.s:O- " 0If(֦ @"E2D}|k7(8%L!%{Lsdu]χJP#=H_ UNjNufΏMIi2:03"4*3 ߱s嫪3:N(aX(Օ+_uFTk=$L!fF:羞d߹ B ,]ú`c6B?GpB@&L2jmUfP4P/ tAg}D F} [׎P3% %lJJP Up@WaX(.@4`3BM$03fF2eaf(Af(!f(Dv BWJP3}/>j!#Vg:FafA@fmTqV#Jdnu`4| 9/ #}`v 7Ԍ3cD@3 bLv, w]R BV %h~FTkj&T = 4ge*PLKݶ`գ꿧@'0^!U][7:yB 6é֌P3 j`@30WP wY_:"I?p.ƍ`X:Ij*Yrv{k${Hڵk 98$U;*s8kkm+++Wnٲ1c|?~rv7=L{a<櫭_-$0_;3# 2׹SN=Wfdd` |4`Z={vO765ҌЏf 39說!g2׬YwsӦMm:$9H2IRqqDw)۴UV۳g9u<5} 9o>`jrY R-LtuY@sezAe77m:jL%,MZm}s1q M2eO]8\[%=Gz/ t l N9T>Xp%ξU 7r2VX5Yf M@$IDnwhj_#@DRNNrrre'ZZN:jE{ݿˮ\]HG4{'?m/IQ#G;nM49@RUUuٕv@6UTT*//Wyyyԩe!é m$F-4C 6)333XL*++UYY4??O?< 6ꑍ8|,o{e }YF gHVikkե$1,fi߾ C9 (331qSVVv|IsfZOH|ͣ, V}I۔'/b8?_m\Dqn`bWYٞ8lTVG9=S &_YZ"|a 38f=WUn_ ITUU|-REEEDˁ|_itcfIt"Ro]8[ ߿afx?/6_ w]mޓ΁f =^(; ͦ}}l삿4= ' ~{D"@ٷ"Asf[\G4%?Jh&Jo"_IJOJ UVVf;nePeeeNT|-C@9=^ ؞={{njJsG 8(>}Z\sJt7Rnn֤X=}b"YDuh`eҡ|psx}4U\׿^?\~/^-Z+.WfMgՖ-[u59/B z}\4v#>}zO?ߟ(ŢK/D=zHtdȟ$9TUU D"W(ԋ4U4/ԯ" 9C 2Ù0Դi_je~7nH[V֭Խ{weggǴ?۴nzmTUU՚7oy]6mڬ1ci֮]ٳhӦڼyJKKլY3]:唾:dXpUVǹ\]opÁÝ&%%%jjmڴI͛7Wǎź t!Dul_֬YEO?*++SƍբEZn}OQGHQVGzGt@M4It)ݡDw#dUU˗ӘXznsx,ˀ*a؉dp+50 O?kڴ/Cj[XX/Lg=H_kf6jHRG7ǹm_ Djz5cLvmx-i„wvӚ Nb>V^^^O+ %42ӵՖ1Bi3͟ISRRgyV˖-wݻW~:ŹܵkW5R-[Pmm6lؠ,um sZhÏnaL m۶I0sez1^o=ݮ?Pǎ/<Co^}uTUUb>3$B픙)&IT,[&Nй|2,- _gu$PۍG=sںu$/l54]E*&bM \NjUP0={*//Wdٴmvmٲ_}5]=z9e׭[vT˖-$Iԩ$3juoTTTofh?ۧ#FdjRڽ{JJvΝ;5hЙ s=X5r?t!ݴ|ozǵcIU{.77W;wVǎԦM۷OZj֬YOﯜ(hѢFwyWt9?۾}9@vl񗤝;KCC͒%顇QMMj=v{xM@ӬbF:D-&LnQ֭[NG?+W9M:@sn˭Zjj4t iӾRIIsW+77gky4fV89'nV?6lPEEEDլӦ}fsY喛ɸsΰcq@qDwvNF woT>俔SN9٭ݢEGs;_ÆэrD|WbЬ|Qmw=` ;vԃtvΚ5kU[[ky<[,߻-r0S:u8̜6mRTu\m߾8777sOMM{yu}z~LI***RQQQE!n˵z1;ws݂Ïz=/mC`tv. Q IDATBb2Th'7w8Tk"ilB:׺u륺?(M_~YsjÆQԹs'~?̛7_k֬դIu[?nn 8tiZ{'|\s.$sNdjɒ7jΝjڴtaÆnky%ھ}222չsGzY,RIy>m۶r\ͦ iEڱcZl]謳 :_n̙pbm۶Mҥ8pZ<+?߽eee?G]acʔnU}s='>׫լYxڶmլYSu]-|Yb̙'Iׯ9̙O?L:W5`i v]~D/֭ԴiSuUg9P7:OyyIqc9Z{ѧ~_~YRO9眥Bڸqz~uvޭ\kV'G}tA ,۵cNeeeqj۶=y[h{﫢BԤIOtcڴ/5s,ڸqT7!W޽{5} }*))bQQQ; tٳ8G:~֭83f~jUnԿ|fZ/ߋkkkceݡ,=^W\/(}g%L'4H:36X,jwee^x?nsHҏ?$Iz [u ͛ӿ:֜9s5g\G6mZk2s_h;7nX7ֳ>kyw'{Gy͛7oOjٲen,Y"I ~0H^]t8_zUlwpJ |V^ѨQ7pMz衇Ͽ_h$騣zUqq"lY9wdy~lzz79[Mz:^{ڴi 5bZb~o^VG8׽9T jӦM>͙3g'Vii׶iӾԸq{qcϫE1byyy8p =P IzW\gyE}^#`PDε2- 7<4:lx=#YV[nu.r!^xСӖ-[gΝ1եKY٣oO ܶXB>\ҥt]7^h,zӧ $c=F;ctӭ:C5p:>ܹSXՖ-[u=k6&UWW~-ܦ U^^'X,:soJrr[mh8;̰Og#j3)XRsv-мy n_; 7]rmJJvF裏WF|>nYtZM0ޫڳVÆ{%o]_,+s?IRAAC~aDliftӭz4h~Mƍ{31Q%1 PjzVjz2*̔}B 0p1Unf$RʼnV[[p8g^zW~/z[ .8_gq`"l6vƎ}V>;VEkҤjϞ=?mٶmD|]yyy:ձcl٢ŋq"P^^ޛnphlsrrt5CtǨR|f̘)Յƽn.<=YsNmiVZ3yrH=TNa-\عm׮Rv]c< 3srr4t :UQQ>iӾ|uM7,OW\qغw^@]vQMӘ1ôuN8߯_;}ɧ:A~Gu׼y3uQ***?VɸaF5<ڵl٪8?g>;A_vڪwվ}{r}Wc]^{Swq>;-lԨ>{ڶmUhڴ/}4zz3gr 3O;T]tԢE UUUi׮]ZZCA3ft{uٿAXTsjjР3uajJ?=>}N{Y @FWBMWF21Me:f4)ȋz0뮻!h;kn 68答s=[rsK.r8Ρ`ul٪m褓褓(//O/s/L; n_|55oܹ3cK)_hŊCOy0s{*--?(I1c&&@ 瞻TXX{kxNIڶm~.b zCy0'N|WEEEɓ?գOkw[QGPI.}$IӦ}@s)zɧ}n4xYoC\T]peup!CС?]s>dT=Xc6mT{Q^Sk;nùNF\嗥A;osYg; 5'M g۶nCW^Tq%ovV~͙3W"InSpX,=w) wWڵӐ!Wws5 ֠Agzw8z1X,z'Ի6_oe~_Sv~dee[s9[ 4Pyy9ՙSi޼,WY?t  ÙOst`k 7|?OÆkܹ*8/^m?my1ꥻs=-̔OBƍܶϚ5I:S뺮D3HlxPM0^C\z|~k?mhPߏO|ܴiq^8ຝ;w~[aV\իW; 8-̬w9ѣ%9sAAWX @8,6͙3WG?g<>ܰw'Wh&_oCxU_ι瞭[o64aD96=پyқo~jR%%%?^OY۷ow[޲e9zh0%0J۶m4t :ZZsմi_zOsԩsy_bQ֭.TTTmw v.?um۶-oڴ)s۱c'7oL/&N@~8I4mڗȑ#/͛|TF7y6m궼~xظq<={DS^ǻaFl"si>e3[nm~l,+I'q]n-Ijzczj?=s\>}zk34} 5lPGC}V9BcaR8gݏPaasꆕ[uyaƠtfZ}u3fy}9wC 8otBA d.˞߮3uc2 4P J2b}j߾$iŊz9͚5GVfM3x &22 SSյkuE\3Dgѣv~ɒ 4;޽Niy~0.\w=СvUWה)IuêiG}M<Źϙg z\kV6Ț͝;_?辞<-**۶m۶nUff6liiݺ;=E Cӵim8}wnozᅗܾo>-XP ,s=x5km:Má h`45#@s֬zy7t=jl6=n9uZH 7]tQw3fJu饗uw{9Qn]USH999r.SR=sFuXQ_2vzE4q⇒%KӕWQy>=Y'+s}S{:> &M-ڵo[ϊYaWsmVzd3J!7vөS?…bJpF ĐryvmZV5l=+!Sl9=IEv >l Yf웙 uj9Wz>,}tOvZ#OX> }5RVvZaMIsnߐjӦs*ժ[o9!Oc_lZtTPP^{CeVLYr룏ݶmwV۵k,gt2vë\z:v,\P?4'׾JRqz~hzsN^mڴi뮻F]wjjjϿhO%bhz^O??vUUnӛtXi.xW=CW^y-@3qLŬUf[Bo]f  atF}߲lnzr7RMMM\ zWn_Mh?4aDm޼%`>m[wv:^(; tv>lW믿V0ڵs!Կin&NP7|nw?1йsyӦ|}=3>hs$u^Rn]]vqkomnכos[w%;;[wFv7uMyyyn˥}ҥ_|1Mk֬j7~>x}k~pU|\?̬1 :C~G}#mMLShq:.nՉ6lЇ~zcq.o۶M7t.]-^֬YGK/U&M3gҨQԶmݻW_}pTH^3gر/J>:Z&OSЛo裏&wyڏ+-D*%iϞ=i^Îz9k8p- ?w[۳>7xK;wn׺uǓ]nxi/Jrզ~D]vFzXk͛7_={gy:6tYC\_S^K/"4IZ~{n[e?7رO;ƍ뫪_Ͽ_ffϦjR]uooŭ5і,NK|s[ӦMی su Üڵt#|aÆ>ugь35cL15k*~.jٲw?BK.$m߾CW_} jjaÆj9}3)Ǿ^CNNl&)a?Sf^NNvLjpv -CщeHp1`@~_tkӲe =:#hÆ ڱc ,t4}O?qܙڵ8y'0nWQQC W  N;U&e M^X ɵo^={t.m{M7%YQQu֫cb纮]g34c -_'ŢFPGS'x =hnn[6mںmvޮ} >ҩS''iѢZvMuV:uI gZCjZ`_͛7kmڹs222ԺukiZ={K.X 4:NNN۔ f=Pegm|!'ф 5o|^FUUUTfԶmx ׯ׾wu;/iӦa=~&u}w뢋wUhӦMUAACuQ04y9^x9=hU |j/F֭מ={$Ijٲ:w>QFz3>/,Uyy222Բe pB/]uՕ^C+,l_3##ӭMN}['pH{תQFOqFlj׮N?}z^_St17Ҽy yfl65h@v :okEZ`֬Y]Jg޺xZK.KԳQ^]wU>V\A'NиqԦMմiuI͛;wҫ?H_~9]VVuuձcN92_JرuI&aZDw%$yyZ{i+M|7;%H;6>{xl\,kݲe[:6,%%?H2}o&h vl6eddMrW 9[VV&Ğnb1ffn b!f|N7oެ/Թ ӕW^.9f)33ֆ\%k nWinN.,j֬ivutݓQ+^_666r߲<ճ뱿1-SXfЄ7|L"Uz~G0%3^kIշh_3?q?Fsf 3E%VTYYgs} sI"L$D~~23ś,'fEM߸i5lqo_Ԅ#LR0S$""""א'QumS&jY 4"f3?h1bck3׭`„&N0N'pDDDDDDDuV5Lm[D-&Y=1bfϞ6m4x_* |cƍwy ` شi3m@399v=prr2[=DDd퍕(w"""""""Z 2;&Q`I!99EycL4i"ϣXz?bM&V4?yϞ8qYk"""O)IeٰDDDDDDDwSYcmdd2]hi,dItg1$P^^0SPۃ(\ øqc1y9r|}DII^ ?Q;rNP(pa-***@U[)ST*DQ$$@DGAd@R& r\^AA$C2$j~ 4ܹp5IIt-xc6bc0g[CX8߱|8} a򈈨dE* * /ϏY&$""""""j4=2Ed*2\\. Itg1ФVEP 3zs= FX/}Ǝ`|P(:G}Q 05t(P*UPEQ\䰵5AAY9""""""L$QTAPBQTAUP*r&Mg'je0Skسg/`lj'Ǐ 2suDDtSE( ܾ]* ww7֐=GDDDDDDd2wwWRPTj+>e?5{hRr`dFᡇz"" DQDǎѽ{`ш?/"==FƩSЫWOt ǥKPTT 42y$$' $$NNNѣ1HKKCEE||!88]|.\cʂ um۶&EOAJJ 23PTTooot۷o~.]}60lPa^ ."33 pwwC1lPxzz=Rāh׮ BSę3gO϶GpHyJJJ .\Dqq1\Ѯ];];fDdL$APBTB$'X[[V""""""""lagg BRT*+++X[[A&A$jF 4UIIIw;ZKSw:Nl X[[CP 2~I^z˗aÆ"(h8֬zmv #F[o gg'}:t;w<_QlܸO>y)l+**_?sppoƍo{ktmڴY/#$$8;vҥpԟնm[G[qDZŌg6zn˗ ̜6lh^___ЫWOO`ٲOp-u_} ~!72)MmYYY J([[[JDDDDDDD***PXXyu~PY5U $j<Ԫ׻%RxRRRƍ-wpp!#MZǎ%رa̘Ѹ(,,ĩSqEb֬Yd7:t~ii7,FdffbΜ -//ǬYwww?  gΜg}Q1eʃz&%]@^^ѵkxzBDZZbbb%Kbժh/_kL8;;sNP(+Wz'lllGcPTT 6&M4z"X1bDz[[[\x Azz:>C]...o޼֭$I=}o{"99Э[fDdɔ$ * E666pvveNDDDDDDDm۶Aqq{\뭉j[h]sg!%طo?W[7z(ƍ| ؋;oɩsIشi3֯߀tڵ?>>}<zDʰt2L2zm޼)))ҥ .]wݺiڵe6|Zn >æĬYk׮G-0Zwqq1***a„pC2aРڵ_|o` &kXN8 uv ?>(z=zmrf*QQq(ٙa&Q+gggP*cIwnݺb]Qq(..Fe^DFEZmy≿JKKnh zh*ŋzN> Bwww 8VVVӧ7Ј9MMWQQav{vdڮv7ĉӧջ;}me/̬(pqqj%""""""coomYPpYt ~++|yT*qQm8{ۨcuV3ƍt7xtsDû[na׮&Ͽ2F$!33yy(//GllnRmk7&''iGII JKKkT'%%7d漶Ddu*SC#L""""""DQ2TVVB& 1މj2?Əɓ03??{g׹MdddM{{{yyyGvt MUuG;nuIIIعg;FW99ضm;=;v5\]]]s\["2LQPTBEXlѝJ Jd6zSO&QYfCm[#"5X99n)(0>ȑhF$T}]UsIIq}r>W~knZ$K.F 3QRT*Rhpn^"""""""{ ++RwO7j0$2@,BΝtA|/0{FCͦʕ"ϡx۷0aB8zZ:t-Aqq1?/77 бcmrrrj͛6m<_/// :tHŷ߮$Ixɿgn;;kOQ^^c :gddk.ڮ)זM?~ՂMBQjL"""""""wwWAP@(ָ? `ITMzf\\<[aa-rK.!990~:> Q&͂xzz]w`h\˵"##ݺu[>`@l߾(wgyNZIItUΘ1 PTTTԩho\С*DwٔkKDSs_"JT*VVrqL""""""{JR X[ IؽQ=Kd"<$tGգGL4Eo@quðaCMkjɥKOV~ xɿ cZӦM.?qnϧzRoлwo[ua}899mSboo;oSIOOoqLl}vjʵ%"awR(tC^ѽR'Ъ~cI /D-vݻcJ%"#ս%ǎ[O׌= PQQXmΜ9Yf#&&xWQPPooo600s羋͛ĉɁ aʔ1nZ0?֬Y;~BLL,RRRQZZ GGGw gM4q\vEB~6a 0V}+W ~&Ƙ-֯߀sBNN\\\ЩSG?&M!\.m۶A~ht}XX(M6ʕkHIIAyy9ЩSGGpfDd9$jYBI:[lmm!IBgpLY?ԾX0Ⱥd5|,Tk#X^'M~7]LϷ>CڮZ;w@|gO5Rlpז%|ҩ!?smC;4rΝ]ūU`5sgpv9A/f+;;=d2LU]c!kll4%wsswyBѦ:0~jkc*iư0wWS(++kж0?f':vpj˭a&4=mBFshωa&3pTJH{{;EDDDDDDDgooTJ޽BI`;drrr/l2sUlQ4ԹݽlmmP\Wjd]j׫fVW\\իm {c>E 5K/x"""""""j$ u7'Y0$vf'm_DDDU}Ta|A'"U .`!gɢ.ѴHzyCDDDDDԺ:wdRRP+pD@yi<شFoODD #jo\4D ڶmۤ}8::ѱj""=uէ>,M"S8Q3jDDDDDDD:vo^@5c 2@ ?1ޙDDDDDDDT?+_^DC莪z7DDDDDD.g)pF%.e*@V e"n+%LY E6: 5['$ 4oJZҹJO,ǑK(TF$\!PBNU1={٣Yl d2sVCdh"ʱx^:42dx /A6> w>"27DDDDDDDDDDD 9Rz OUtZ>wF`mIDf@ZZ IDATێFjM5eUMe.Ԅ&|eS.f q›Y,M""";hQ󺜥=p!CaRN7T_e"LI޺ێ̍ {Ww`IDDDDDDDDDDԊD_?\ Cjay<-vC :F[g6RDn<2*q*6L1e}5/d(0,~v-{DhIxoWhIR:@gL/gMl8 kk="X?*SHRؔ`j+${{<@;~Dt0$""""""""""j/navţ+/g9 r3Ayk"L4j{a7 {jb """"""""""]R`ϭ1̔I$?Ӥ0G9W|0#$I59Z|D0$""""""""""| jsfV'{ɶc '[O;{ 5&@I%Y q!.$H0+ӔG9鞐$$Iw="hYveԟ$))t/abLDn;^-V5DDDDDDDDDDDj͑"sPOe!9m0Skt{̹.X Cz)i1$"""""""""fuTTƙV+"*]F4afxYꯩ0mf֔i0uܚiH*7[mDp 4$Y4/ BC'֚"""yƢEK]R⇚49+%2az<eag%m/M ؞Pl]۷o#!⑒|Hoook޽{cܸ1pr2ߧi?СC]Z ÏllhwJee%-[ԩy:9{/={4]vs_Ξ >>E WWW|%%(((ۜ G`޼PTe2YKjΥWZxLa$/8ٚ?ieC2 i^*qFv5wDT 4!J۷? ?WvK.ٯbƌP!11w 8r$;vlk{@IIIx23`eU[k׮cugݺ HK'x\ANN.rrrgyΈjc,̔x7ZWk?ђDfB3;zXa`gs3m36#-_ H:ܟX>61u'x 4xwqiGg@CT"778~$.^Tq-IE|w֭K|,[dRZTHH0.^r; omYY?{~QA0tknq}4qa X`ƌeZ#,9TMU 7eÃlH 2L Kx3$1$p 4xWp57fc!Mn FvҪMطƍǙ3jTN3;v,@3&& B'O!MnQoO>7#ڴiLgCDDDDDDDbaǤIZ[ku9KBU=ZCULHտ=4'K&q}I22]Q,[8DbMDDDDw W^ [t֭sbC۶@ر㵶=|g׷= *Ph͠av܉a&08sÒT=4@?Gx^\I IWJ51$"""]p{xgѽ{K{ n]fZL&CHH0 1._ճ2zxwœ9s <7gS_5СøpKA (hxjHKKh۶ # E@ǎ0pu'ώ;mwF:N<L)S&h\z ;:v술iWs$""ˡCG Lh~7o[ФÇCMA.MuIγ@mGMP׮jh\ 2I=fD8DDDDw1Q:u g^[c/;70kK[WQQ f5kGvv;u +VDAAP ut м}6-[_8=UDQ7|UgÆ -***pX@S;1u={ǧ222e4ЌW{e0Kt;iDTM}-p |6lD.HOO(J|X~DQM۷7>0Rڵ;ݿ⫯Vmuvlݺ 4cOet;AZ9iٲafs*/k׮ڵغu;O_`UVΟח0X\ԵLrKDvoߟuEׯ1|VVVx (̙ضmtbbpqqƨQ!+vvv8> D 55 رE/(:A`Οnnnխwww;NYY9}v:<<<ѭ[7:',* =Zc?֬Y B///tn2 s'OBnn/^+h̹ 6(,,Dtt@ر] M;ssc!<<1`@:뵵Сqh K0ȑ@@x͈<ٳ_5F;fpp㆛mkQkǎXl9$IBǎ4~ǡCGt=bMQ(9E$& 7n,zr9s 'p_x≧0! qz2k(GQQQ[[[vk:NĉxT*ѽ{CJ]Ya&Quv\+fAXVV5zY m-oLrHR0S]A^^ヮDdYê:lÞ=_}9z[7m#4if~ApHî] zTN2f[kt^}e 4~M@uڵ/L'SO=Z7/Wah\v۷ܹs0l^-\\\#GgxI GcM.c1صAELxxx ??4hjcÔ`=y3]tpssC}uCCՁfzM\tY/+(( 56:Ƽ ??_~5$I¤I0w;^ 6Ͽ4y 1<ܰl1p~8.\ruo[]ڌg}Q3 $%]#Jq굻r*ǹL&رct˷lRaÆ/>ϙo&yҬر\%|;VZ|5NEY-tܿmmꞚ\*lf]nnPK^^^.?}k/`K)&Be6DG_ԭ&MDbbԵnvt{#)?633 /^ўyV\v))ܹMn.^ ddkn]om?F``DG"9Y'clr( $$98w.^ӧ7DQn*ѣ1q^^C&aܸ1zfO}ƨQ:t0\DDDb޼gfW^y ono–ηYH@n Nُ*XeCeKDhŪ-Ǐ0-"%%UVxj]:ښ֡C?aŊ6l(ڵuۄ aزe.],x{{CE:tVVV;v4 << +VDrr \{-i(?~nԨ`|w(**… ѳgwfP0?>}z و:g}/_Annlmm1xT7n܀(xzz6j`˫;u 7aذ!ѣѺ@3*$IBXX(d2r9B}O8xh $IB߾ cGO>_|דq9MUl~:"""Psz333EVhVs+&攜[{,A=&4ך,M"""'tǵk/7:ދ~{|AUU˖=kpE+GZ |"|絶o DGGƩS֭9..^>|(bcu .";;...2d#v}='cƌ6zٱزe.ЌS"ذ!f ^99:Շnܾ]np\0#::$A&Hͺ?۷XpwԨ/!&&'NS5kb[\\|DDDt-Դ1^j*Ҳ$c}.èr;{XfKDhL>%x՗=v7:<*Faagg _z 'sf}s[xx֯߀<úk~r~ GDA ޙcƌuĮ]qX{Q:u 8xmfbb23ۗ9xyyoFrrAS) Ҕ1cFyyyp"qo={ ;v@Z 9cGرckݣGw=wbÆMذa#RRRnz̞jϟNBe˖7)LH8]vMuozB6Y^'ۚ"N\+=wkD2MDDDt6iaF]צּ߿o6nܬ56(& >!W_}AAgUm })o/[[n֯Kh8pj,o"N]-O25kMtbIDDDtÒ%A.C$X(O?$ .~}4A|vAAп?upzrX/tGym,Xd8 ]99 '''v=ZI܄ .٩Qj :vvvP(3u}Z_&z~jTV*УGz?y<k׮cF\rW^3.(h8t|2hR+P(г}& ш0nVkDu={~߸pYZ{$""".<<^^^ܹ4x:HIG^.㡇4sŖ'>inG.ƀ&Y/vrx&Qk@0h@,\lmm z5yd:?~y3g#.ʕz9رFjɒqzBٳbg Lk[cQTTTdddd2̝QZZz7oCVVUhTVVÇ`ݺ wΆƇ·\._s[xx Ea"C^}{QaccCJK\u9cHyzgjM=^sEBq"''^|qr97xɿc׮HNN[ϿÐd3-o!!#aoo/ !8:u=ԩ#z DeBS;4t}}v:?&8pGzGQ3 {={~1:҄)11=:o^ 3f<?wb3K&i4w~Xveը}pz"LC:?Abydddb&{d2$&Gn]ulll嗟a⏑pvƮ]acc Cճ >A7.~'OB̟n)1\s?| ,^7ncŊϰbgprr\.GaSVVV>Q8::6{ x{Xfm&L7߬膂iapwwí[@zU7jTn=}{:߿/ڴi<@Hz[L&R<={F Ν;܄:t sb IDAT>}| bɒ xyybyիZ0jT; 3NIh^o۷7hS^^8( ]p ITꞇ#6uYԾX6Ⱥd5|,Tk#X^'Hdⴉ{buܥXS%I|$B% *2J7T%R(MFTT M=WKv7[k*аR EPQT&v"""ŋ>>> SK-~9"ocՏH$IQITA/`þfӱ+.2dKr,z-z:-wxZ  L&h:RX PiKR0XjQMuRad]TaqaRDDDDDwTSCfՒ4%ԲВk#""LjAسsa1Bݒ{idI2H2LL&2bhgw$`Wl:ԤN hYDTy{Iez?S;tL7wZ A}8t=t_ԫ>ҽ3qhY!~1$HV-Tr9dբ %_ ZL!~v 0ZDDDDDDDDDDDpWc)SL襩dV):Pv$ܺHkiBLm]=|lF&dIԚ0$""""""""""ppepjCjxm4T^GIwaѶz FЄ2MfZ DDDDDDDDDDD.0wU4z;j{B{Gʪ )KO7ko 0eiK;ؚ^=@8w&QkdenvXەoR4Hގ5 I5uQ%m Q6Eޠ#gRML+MYwLApw0bIDDDDDDDDDDJnz9 j kSƊ_.cn <0;zvp_[[uF=dibs+pFN\[izjzj9m衶n0cIDDD}GU%nΤ ^C"bCtX`[]]A("N#C M2#ɘ!3! y?ϓ'3{̍ysH&}oxGcN4`b !b9 f0bL{O(34 4444shf 2"rsQ)""""""""""ri¢kߝ\ñ `0b ,f,l fCNi0X5ȴ`'Դ M 3sN\V`03SDnN 4EDDDDDDDDDDnRB|5e=1g&CN|363rlM3& ]z`0̊OMs}7:ׯci,ݝ\n͜(ш93-``:?K3_>0i0`muݸs%Y"S 4a6ٹ3;8~81qwwF4iҘ=ӣGwu_o3Y{$'O..C!'4Xr!'ȴ`YUřM=ғ6uܬ1Wߓ)ٳYfs…B륧Jhh(7nvm?ƍK6]iSەV/er2WO5e #/4ł`ɉ;ـWͅ&\i[Ǎ&>.0SD~hJfXX`atr>x??~- M|\zy9!gg?{#ݼw =4ѬL[M)ז,J?c<^ 8 `7, 3EhJ,XhsŅCЯ__4Myzz:_`Ӧ*222eK|O-=/(| ͫ)uz"X,fϞlSO=I˖- 4oތgcS>{dee% r?sӧ\Cnh*>EI34\ڷo?O>wrr7ߠI6v >`03OӵkkYx4i2\|^͟Ξ=NJ?pCi֬iHOOg֬X,-**~Z3gϏnk]w݉k0L%ӓONͭ˃tHII)Pu(yd% $d:hJ}}DGG[/Yئ~z ~˖-۱#ͨ(~w W+X7W@l@jjXhh(vb_]~׮]GZZZ5~؛>)[M)N:eO֋ضm@SvBll,ӣGw||嘝ڵԩuDD\LJ/ʶm '22TBƍر+:^ʕ+T\ƍѾ};W^kݝ$bbbm'йszGسg/F|||ڵ3M6u&(h' 4hЀ͛٭sE= +t 'N$$d7W\ܟf͚ҩSGr%wJvv6ף]v4jawA~}!w]DDDLzӧ7ժU+tgΜDD\!::Uk.EoEVVwCY޽{].rS{晧Ïx)e=ba!J,XDn.'KIKK_ExԩӼL.\Plyw4L[ß_~Y֭ѣ@sѢ2RSSoԨ!g*p<##O>ի(dܸ'㎡%ZzyfDEECcXX~#s#&&ڵ6b{#}HPe .bAL4OςrI^OX@355O>u-V~uP3))>_l)31  C/ӧʪUgu-_|={(ۺu~O;f777$<2n9@XX8oN8Q/PR%mEDDDDDDDDD)ДZ׮]XdqYFzիpYmN^+sgg*R[l?/YYYԩS.]:[gBLL,fĉRoY¢E_C{Թs'VJRRQ>|n@4&O… Z*Ac61bxշomNPPs#$dgϞ%'M@ J>.]g'>>ʕ+ӽ{5$""}p9V^fΜYy版͍={РA\r%{e7t.]EtܙUɖ-[ cŊZՋQrx7x -[ҪUKWΩS IJJ &?,C iӧ]6ZFymvȢEQF :u:TTn4nܘL8Ⱦ}HJJ*XDDDDDDDDDDFHV#F ~d¯ Y`%ߓAS5LIIO>#++Spuu'&&;eϞ=lܸ9\2$, ? G}!,~Dž hذ!ժU{=||,sg\vjg}RwGѴibu#}Ӵix5Yfw-|{쟥>9sA xW]v:iiiۿ[tѣxطoˈ#To:ݻ.z3^'44yӻwoYc4jԨ@&g8r(gl~, ~4nܘ7xfi}3uj8f,x><<Rqeff{9֠AxrfdϞFMZ`_O! KHll\ȑlܸ _|n 8kjժLWWWƏ K;wLu0ujβ\Ҧn7q 99͛p F#ӧOl TDDDDDDDDDDJM2VJ w{~2334h E/$dw}@y8{p%9j֬ _md2QjU3FiӦ5ϟ/, ˬYoookx9f͚ٳ(yJCHnuZ~y2M&"K*onM}Zկ_z^rX >-Ӿ};N8Yկ_ݻr_9]%ȍ%gEʁ#Wr%֭[ϠAr%իR^eee ӪUK BC/ѤIRpqqaĈa,[2j#tԉ.]:ѡCgO?plĈ+E?PϼyY;~i9NNN֙yyWpvvwp4]x Zaxxxŋҥsرc%䄧' dee&M.]r;PbccINN&%%ZeS7k""""""""""R)RTT#aE|7חŋd21|0K_FvvNHTwuQj&{z{{?@PPAAAyٿ0/Y>Huh<}̙3_ éQŪW;\JtqٚLb]՜СuO˗Y[0?]vf͜YF.]:v]o}nSf0lʖ-[ 2d0&M~~eV<Ȕ)ٔDvvvqK.q%{h006|ru&h IDATy|G1k̚*TɉDݛ;GyIƍӓY\ƫf{*6oތi^htWfʜ9_պ_GO?-̙lْӧzyj׮͸qcYDDDmUx>dسg/AA; ډ ΤA#Gދs* --_jS63cǎaذ; {٧أjo=[wqqu>|TSDDDDDDDDDDͩ/諨ջVCc;Uvu{{eE2SO)_ZLll,]v["/{y^~y5#7>>ߏi^4mԺ%/xyUᙞhחΝ;1}43C} )))$''3u&0''vz͚4iB~}HHH$##zM*Tk.ǏJ*T\riƎC͋u9{jբGTVmܹmڴ&!!xL&4jԈɳ>MʕѼy3:vHTT4iiiE@@7&OO?ŋTV}hwլYl3YYY$%%?eʔTAÆ ڵñ9rjժѱcڔ*bc9xb qqq$A ܹ3/^ht''#FS`Sfq@vwKw|cahUW1W?7SеڔxI0Vns_~_~-vSϔj7b)󧤤XݻXDDDDDDDʂsY@DDDDzgΜeɒϧLyJ**&wf3C :D|W\rz=zT)蒓'==TMOO#>>"dG:tCЍF^ʕpa|}k1fcĿT{:uji̥bX٬"""""""eM-bJm[3b2Avvu]~#=:tٳceh;v'NCݏs+3w<8{3f|̟K<c˗LTT4QQlܸGyHDDDDDDDCKΊb23M]wwwV^[˗̬Ysغu[f3fa֬9>}F}INNfo/fߐ{.njj*w>߲ef6/_&4RzXoH۶mDDDDDDDdhblJbb޼sٳk]w͛ώ;Yw޼̛7gϕʸoF}= Eo~BBG=zZRh;vb2?jBB{+ΝP55A-_Iv]HI)* @߾}pqqlv톲NJJ* ..r/sCs3kѢ9ի{kBnٲq㞠vm?6m\h@3 kl/"""""""%@SDDDMppNp3d *UHn]XfMe;XGbccY׮;OMk_0›`.;{Qfǎ M~}شi a={rfCDDDDDDD"lL&YYYdggmv`ɈθTÒol6S?-Z4`~l۶#Gqb(u Cxx8`ŊlZުUK7n{դ[VXIZZyށxyy)>Bxx8QTVuңG>>>EGcNI˖-θ/99-[qqkmw= #G9{ |sM)_| 1k+F|}}#)Lbb7o$%%SF :vlO@@kMMMcΝ\FXX8ԭ[&MѣGw C({|ϘfK> ٻw?IIҤIcL&-&**ÇЦMmTFݻؔG3#t;0PoϗΝ;i"$$}C͚5iܸ}ގ5lڴ .b2w^YEqElFhh(TM=fu7cn:tnqq߿&MPn.]޽0 1mΙ3g  33s _ZEF(Д뒑AFF&SVYEDobMVV68憛[YOn^ :zw^ib͚uxv˖-gÆټ;<5>">>Z4m:hnذZȉ'͍G}qpxM)))̜>VnۛUV 5z1 ~MjjZ]RFu.O0m,[Gr׎Aa|1bG?66?lݺ@_2b0^xY<==3,0tѢ4l؀˗/mG}ºuvZW_kθ]!vͼfo=e"<<7 4hݺU^C P0##z*U0yDrQ믿J۶m^bog_ 0g<:wx&++9s`"fM٢Eжmkx50h4O+8r( {Ŋ|, ~Mn)}6m? "vFu~J*׼N5)Д$---dd"=="[ѣ8{Pݺucmfҥ?Zw߽M6>$''lr8jժǗ/sIҶm|||pss 69;WddO<10ӧ77͍wQZU34g͚wԩMBBu]Bx7:׷o5k‰?S`^'x٤y.^OL 66*Uлw M6!,,=>}+|" ˘9}, u!  '66͛ripgMdggӽ{u^ݛD=Ξ={9rS%K.?pssKNl۶]B xM~xlܸ)S*&o̞=KlBBo.+WW@Zj;Gcݺ\ /L ^~yk׮m6t؞5kڵٽ{o7L<9ho>nݒ4oh7lPuby)L c00a<>˗GFS7oرԩS;Z~gqhќ{fY^g}…_sb(_}I۴O?b0d ^~yM9~X-?]\\hܸ7nfڴx1e˖C麊"0'۶ 4aaZN?"""""""E"3$&&*)3HLL,ܠHrkf[ իeV0Ӄ)SrŸdޘy:3^fȣر[=rX1n ļym, g7nLݲe+0ƌ{Fzjz6\bbbl|ŗR<2qmr}NΝ.'\R={s^mޜl^=mVZSM6۴ٵk74iҸ9?Lr.;K>ș>w.~_^3|]]]hѢ۷Y|sӰa/8k֑}5kָfݺurI._tf5Ga֬YDze9xՓ9s撘'hٲuvf@@W iӦ5k$22M6>©S͍N:eϓhzyy: 0Ź !]v&((m۶[M6cX0?''' ҥ?~km, m۶fM۟>}z{O>ܹ:G YԨQѣ._,""""""ML)"rKOWWײ~[m]BsvK̓ކ :y\\JաC0yRSӨ^ݛ{-Z4:7->>ᆎoߎnݺYX-LrT8Y7--  ?Aż^zU֯@n]i׮-͚5ۻ*T`ܯ5(7oF͚5"88&мv,;ۇ%K;wڵF{/1L%y˹(fs@PP0۷aX0 lذ1СYGv"55OO|{ W@N8Ɏ;ٳg **/k3\*WT[M){㈈'--M-.o^)ڵyWILLb`z c{wHMM# +vř+WϟX.]tCX&NGp.֭ۧX}ԯ_˗ìK:b6 ˙33/G͚5qww'==ӥKb_dž X~#? C3OϞ=ȑoF#={vw&/Q݄k(7r^߿. $d7qqTUeUՓ[0ab!ذa}vb۶턅k޺uɉ];[ 4ϱcǟ޻uo@n@e/Xr,U^=:\kN{smmQ:QQj8ehc40-|ҴbѰaNڵ4hzaaLz[;4Sى.4mu\iscWk[-'#CK͊]鷮_͙Yw;[l#5vս8utFk訮u6 ux655?''Ow^n?r=b2߳g}Mx>={Z`3Z$&&qE#puuU,bKxx)))|.^ eΜ̜NNN³G0jԣ Ο@\\_:￯s9>>ƺr@@z""""r(1 ~w2 7gb~AxB6Nf̂(-b1m&w%g.~U""rs2Lprkغu :zncq6mn֬YˡCYh1-vm?~yM?= {'!!3޴1b3f K/MGǐ~‡~bGÆ tý4O4wu6n݆ ٥*T`pv''==%KSuڶm͛og2߻_rlذLYsuС&pvvQgxߗ?Mbb"S``Ԩy|6]kooobbb Ys6ooo> "#꫅|B:m۶ӤKμ+HHHw[N͚5xWiժñӫW k!Āgg2d0GEFPNL&5$rrx.3rk"BoيoEfkǁLƲ+c{Us}m#wS^?,FB%뫨ջVCc;Uvu{{eE2SMppvk&ߌhյHu>4r&głbd2aXR_: 6кuKd允yF#w1J*aX0 ץsNt&4X"w9l3CפIc:u@֭VC $!!dRSSZ*-Z4W/IIIV-zxx0t`j]aDbbԯ_!C1}x{WIHH0|6ljΝ jՂ;鵳X,8p??_nիW/_h%222i֬ݙkNNNt}ۈ'66Ʉ+͚5ayi'YbE +QQQ$%%c4]ۏ{{3^KN\JhѢM޽{Kdd)ѣGw#s1ׯ_`椻;=r% j֬AVzF;v??_1 dggӰaFU>/:~~H&&&vw !99hpwwqFS>OIIIuxf͚2p`#=='''ԩͰaCy]j*U"" ~~>:8Ih)i4!HrͯHrCh046?>Q+ C4AAAAAazz0@H@7j0bE;?d JH6ih'>B4AAAAAa:AFvsМ^^l7if{ug{Yc[S(PVǘMMAAAAAAvTyУtcJH_0օ),4%ؑ 0")     ̕ 88)IF]؇\<2f.MKP3LKfKS&oQAAAAAAqxN#QJZmMThS:? 0)ǺН^C?~2:;C͕hVkנTC\AAAADxhXCmkEdȐ@&CRs;z_$IB&u1A胈Fcc/EENFggyq{Y     #)FGUaы33мuXέ3jd YCU-zjt$uAH9+ z~̞ x饗1_AAAAJ@666l>[[Y$I9sjkkATHPP 3g䦛fRl՚1+wۗ$PGjZGnn.1ydI#,I99\tBZZtvv@PP QQQ,Ya߶7IxWvݶ{>EAAAAQ 5كeģ9P8-mKԫin7Rd$\f_ ·h BYY3y4KKKs|GTTTڽWXXW_͕{ӧA)Vii+TUU[_8pg)f]p?cgҥxض-Z۷IA ykjZF#* (FףQ*]P*_o"EWI2*iqЦj4455IPPXGQil2vK8~4TVS0xׂ 0.X.- fX7^m_O3FV 22???:::hjjK470eʔ.3ߨfx B^}o_Ҷ n̙3SEISS3 dggŤIMjd?$} ҥK 0xm$O?5EFt?g%l߾mLΧUU9)Μ9ŋY3RF|{y, #r>*]vSSSw<#|]w5Gۍc]1)D@3Mon7^a\MA%u/b4J̛7g) #@ss ^αvY g~jM;c ^xy|)[v: Ҷ^{u9ob۶}I0'7 ʘ>DDDOUUՐsk0eum 0*. |#hZ0dgj7ja0XLǻhh4"5]S#Ѵh$Io+ثB&6Eq6uYjXG!nMg"q[ye2 L")LMK;]摛GxgG-Oyi!J&̛kꢤ#jÏ93e@LAo444raBXƜYח-[\.ŋWjcʔ,\y׫p!:4 $%%-QSSKSS3>>ބ`}~ ǎO=Y6lŮ3^o`׮ݨT*땕U\AMM dr`%}vHΙq(s 0㿶WWWBBYx!!6w,͙sqqkbz ,^Mf+xtL ))^j4_ϢLҒ% [O>%<r;Jtt$K,s\UUڵ .{^Å ͣʅ`}IVV69֢j d$ԁ3#/zp"tZk%%df^64)ŋY3`ʾr[o]L&#-U( -Z`)r }Vghؼ6Za߾ `ݺ56 Xs0TSL9Sގ7QQQ,[f:/555qletvvKll,K,7xiiOtLݺ.J%Ǐ-wR^^Az%p[\ \n17Sl e,9dUt2y|NUe IDATh BYY3y4KKKqww׿-UUՔ7d֬Y̛7 x~{Ζ-w٤Jٺn>_ܹ+_ }nʉWz???{wq~v}|… FmQMJfN: @ll ۶meCAf:-''}!#6j~qq GkxYp>>>~+Lddk7n?VZa˖lhl۶c'8twq;n? ̷yTTTdbz5y晟ܨF>#vjv}k}3m><Fk@6Z-?(VhkA-$\ !a ...ŒONN9gLVV6B.WMhh(SWJIIÇhEN: ]@h4>F@#''b]YYɗ_`&Ok׮QXXȶmwۤ"lhh`ǎtuuH\\F Hqq ACC#Ŕt222h41 ())ﳻ/Q^^J"88*** //;îmhZٳKjqqq!$$NJJJsWtqpqQMXX( ***Xt w_8T*Q\(..ٳoyZ.wwwfWWׯgeآiBm-)2RApp0F:Ο@ii޻ҥ RSOb4%"b553t͑#G2iR8uQPPʕ+1# j#88gXe FZQYYɴilAd2'<<.eʕ} u!n'ۀ6bq~:IRii /pFUUo6:WW7BiiQS^^Nyy9Yf;vhpw (((m۶0i$ukt;v d2$I8p,<<< CS]];}_Q^^+>st%I-{m̑#Ginnbɒv2#2 ,X0?򩮮bkMMTWWmg[KddQVVof6=@NN.r@|}r^`H싞t:ߩ=c2r@<<<n}anFuugކL&G6@* WWWs'''*n)?=֜?6nٳizk׮QRR7q9$Hpp0~~ՑAii)jjjs={Rɜ9Yw޹8pj| |> Dggyt03R(**";;a@3++Ba|@5gM5kMVjRSOt̙m}Ѵ{g466rR{ѣǹ|2ׯ볃C?3gۛv{.ioYCn5d^L@8KZ6^ЌLa9 | nqgߠq3 6m;/;6kOU^OZy~g9#S]fA[ FTZ/GkG7|%˗/ȼzZ4444m(74.7o">> X8(?˃|Fxok &$$X{ۼw%Ν0jqQ:"\:Z?ngXJjjjhjjmd`i_UU{'OFӲlR`&sUo׮]cWWVBl/]@0wlSŇSYYIKKz0﷞\]U$ym6?Bʕ70`[&ERdժbjkv- ֯_g dۑ\vYYYEAAr:su\n0"$$hIIc0WPQQih1 ˌ)tZmG٧Mhh(ӦMY=wj)$I2PZ.3mTBBBnĉVXf}Sْ%6-3g%&&ydjwUlR)/vIaa*---hZ삙ppxi#22.pٳz{Fll JR9L ̷ Oo4bJ˗N}}:Z۷o%%e:r^q9\]]Yzۛo^@VV~ O?Yp=%mmB&g~SSMMMDGG:#wy,L =Nٳv\\\mxO֙RSO"+شi~&hjjN1~&BB?K>~\\,^TUUVm)S⇭ X-٦.]fyx[2w߽>fi |/ĪU+e;wCN}[ |UTTy{@{("+77]>??? ^|%::S¼G?3N rr&u\7^^hOsނa͒D~LL̲_~G}5N:H4 DjGr ZbN6,ɞ銊JOۨ___\\\hmmi-u|dǣS""L]or 4ezؿ 555.cORimp&)=DJJà Qn˹f`Ik=>>>LOdd$6d->S1,ɬ ILLYvΌ@{{{Y.3wѶ(`2M!99SLLG X ٦-KVY,Mgyt\nko%b옃2?ϟk2Z~^1EaDYa\Xv 62%zŋ?.>|֭mTTAÑuz?FyZ{Ι3z\z_ YWHK;\.7hBxxUU\ruHe<դI`NqhO,Jz|uFQQ155\\\xÏ8|(jÇpr93fmL:5ja"3';޷rrr#FBCC#EEEJgg5%^tvv7tQ*v#,w?s#,i黏\fvRJKK`̜9`p&ZK9Һ "''צ}ojjwHDyyee444f_RMrr"[S$ۛbkي .RRaݿFA2M+ZP(-Jr)dffR\\l}ȚW`N9CrrgΜ%77Ϛ1RU.~Z<̥K\A@@SLakǨrxIӶ?իֱtjg qd$V*M777hlM%*+hjjNOSSv+((>pLfJ;9`D@@ j|||hiQS[[˼y@BrreeeYkA틣6:3EC{E_>8yޟ>}:iiα$I"''_yG :FMutvpig~;Z%\U$N|̶ 5SZaJ7k2d2X76h2wҹv0͍DXE=(>|2/gRWW˙\c}[nY?i/%,4jjjvsB``* 777}L}||zICۿ=LQQ1W^WrUٸqM2Q`Z{ÃBs 5;t..*$xm.#(E&!\FsrV+3"LS@ ")8t0'N[JcԩႃF`Xz\4FZFԞ<<IRgz_XRy?%e:dglYYY9drk:ZRFxkSGP0{Q6QM}LLLk j-WůF؟UѠvi l"ud "ά¸P(wO?b20ӱ!ehd}2ay[pxxxBqq ?][eg?SedqoW.g49u4莵G^WW_Ș,]pUO>^o@[474~G`_>5H_;̤>o,i)sr풤WX@\`ݜRMu 77w ȸg(Jd2*++G YMsL]va[hi[e27֖z[@EEn̛7'$+**&??Bi"100`BVLs___t:]j__>׳hZ-3iRMr9yyyÝZzLQП꼳ǣs:,G tjmUee:(`&t d295p5B(++mMN6oGAA!2)S⇵=YQZZ|ԙ#jz30PΞ'ANNz|bcctO3z3ԑ0s 8kTwn?,B9)Gft5Y>Ikf kyqV+kEf.AHD@SFIee>,((૯L,?)/oi5]֓Bqɰ{CG%)t}q j;O<?/ހݝ5kp^˽֭[*prwZׯy[oArAo:Imii?`Ӧև3iy0Aj\n]F0IDVV6G%66mm6墠N IDAThں^?oKFr9s<9 '5s@o}?.*)iz\j$ OϱᛘMMM;vfHĉ'iiiaƌ6iusi+  .l;tuigjA”f011ѸQPPHAA!qqvNMBsawـ&c 5]HztJM=e`Q_3gQ*粵\+;wf;111TTTrr&...G n} nYSJ{{;vV7HM= ŋ[:MM znNe,q)o} #GII 6SqzDFFt$%%b4ؿ 6:C3#/}09{~$wιyh @@9s|>:5FCj)Z-))햛(Ԧa(ypGeLuģeTMPn;r8=n;rlr|2YcM5k5a|)g ݍgNO`;w#aO9~̛7ɓ "00NO}}=iiIM=^',,'x|X xO~F{{?yXhuFgg'W(//g۔ya֟Ko߆NtC憯--j9BJt Rn|'NRSS篹Xx~~~֑ˎ؍x(//'*~~SYYRdΝ뉊wZ[6-s6B+/̤HreeeȒ%[j_|׼^QQQ2+z8ȕ+Wٱc'x{{V =44N:MSS껽W(LϵkM[&))'O؈稤 >}YYTTTc'@CC]zyǟK``a0Yf{BCCL0pkkMMM$&&]57KDDިT*EPgHu9K&vvMNN.5NJí/(LAbۙ5kͱD`` $$$⢤:7/^DYY9uuu|$%%L&Bn}AAC$9ttf~MLL 5uDS($&Nv:˖-}ˋ*3:3b$γ{MKh&..˗RQQ;IMM-vAh}(g))IOOxxxX{O|ԑ0s XWG?0ؗigM4%292 7藺2yt>ʏ߼L0)Δmc&t{$F")L湂L^ A5?߰yQ抇; ey،X.sTW;;B!Q*lpMP+22ӧqu> ɓ'?޺-gǎdf^GG.;o]1'yͷyͷQ\lҶ2寤]̛7o= cbbxos:::9pu|}|/UUܹ;w,RiAogؼT*xFgZlz7]]]|^KhLRR"O?#hFF%cN0$5夫g٠v|{su4V^}׬Ya) LDt@NNyyZ:nӦ 9rbMBBCIJJgQXXHaa! #66M6gveqqq%5YYdffZbtΘ6m*!!!;v @Jt˳///VZɬY3\ΈTUUqiwww̙ҥFMr9t0uCuf^nסhŊz5بP(1#Dk;ٳt̜9߀&vٴ ]:t>222L2ヒӧϒyz\+JMʴiScid2wݵ/rR f9&nZy""";.>~2r0`!˙9s&\~P-[]pxtv{ ⡇$56i.U*WeYfN~~u ooo֭[lqm:t2.]26sw`er=T9\\\{x1K.d!Ę_wyGRioow~Dooo&M ҚdkG6lr=:tbk-[\1PHEb4| puuرeP*]ի}o;09wOxx8UUUL6R mH\'}\Evx-[&d$$d"*o\{ٶ`d;o?F&W5yctfR+| 0;z^:ZGཞ{yOc?˻-#zt50&[#ُ?hx1TWWSWgzhAhha^ٳor~vv}dJ_ڏ?ׯ1mt(3V!-R5޽\ZZpB6n0,g̒j?Qsm{=ϩ$$2%FvFuDe4t:h^GKZ oo~9K$jM<fʑA&r\&y ̮LvtT.N$I B衈캮]~ˮʪXP $@H{ef L f<~WMT*֬y7}ROAXUj*BJeuo,jX?>jb+4U45+]hYHppb-SY_DD){=qw=Ijt9`S$!@ A$h iD]!HӵM&nK 0jg̮7NǓ !kS2$1$""""""'''899Y "ѹyj#F(IlvXk&QW Fgj FgB[hb1)YnHf.} 4?,j5lll,] ]@莽i6jͮ(Q "i)4 =47"Qu9E" 8?VLp;$L1$"B8::Z""""""""Dl0?';;(W["4ue"AfWLBTf4>3Gp[UGcrLM""""""""""Șr*S UމE,D^u'ԨkѠM%9녡 !H蚂V D)d+.2x1WO>f凁&e*SOBNm*tKXuv'uaH&8* @ZD"t&]~mt8::\sZ+Jm۾ VXfr:u*ǎ0fhKCDDDDdqGH 0E&0@?@II .\`Kc !! I?~fQ]] ƒXAP]] [[;Kҫ6TWWҥYscFh܏!&ѕClLQ(**JBqq1RPPFKBDDDDDt9J?_o:&]8BT*W_RL01c:RSOcPKBy{Jex,] %E@ꦘ=@A&ѕ&tvr""\|DXHKa7||-]YFDDDDDg9~Dt`I&I$bT\r"py""""""">$+M2I"0$"H$K@C}狌L壹ȑ]# U*5PPPV899"00A̙< n1"}:::t0eH9r6668q 540f88MM= ZcǠY՟qP(fkEvv+ WW= 'Ʀ.**F~~>kSNA}}PQQ @ F >kDGG\]]0jԨ^k:5j#<|$~!--55FBn\/@EE% <<<0vhd2}u??󯩩 C0tP맫 PXXJbx{{aĈ 33 e?׻kllBJJ FRtN >99(++tvvС8}ۄ akkk*dffǛJYYYBP^r cI&IRwX ""RڿR=#pGyy9D"pig`ƌصk7RQQNJEhh(-Zhtܶ6lX,FAFF0glr6BB#oB^^> fh"??_{~ 45qD /F9ybbbR"8~<5hxxXfYY@&eeeHLLBAA!*++Vug&4_ h41\.ZFnn.1o\i{_*HI9 `ȑC| #BL{13{""""""+ $L}.m~e $ -J%(,,{|b9H$ƙ3gwo42220|0? ̜9NNNocq ޽3 fZZ:`Ԩ~_W~~>:t(Q[[cXfϜßFC.W`y>|b1JJJpp>p0}t 3ڴQDGΆYZ[AA WWW,\ {FNN#5A@JI̙3[WUU#&&EEEp]NHHıcsg* ]m4h 7p='Ry (,,ž=jk<ΝӦMĉ!܂}#;;qWGxx8ƌ www9އ'Ra3fLGdd|WLhC ddd"33hJBvv.뱈\LLH$ɘw].d2)%xrAC" 00QQ3_ _ߡdJ% ƴiSg %K3D"1wlL@1># ɐv555pvv5-]#G}Mgg',^ hnnh{@ZBL&C@@-BCCWWD"`CGGzvp @,ck#b10k ])_"nX'OЀGkY;;;@;;2r2BCG99&uM+BXCb\>8~8 %nFT*-BCG`Ŋis-##%%%ǔ)䰳ŢE hii1O*bT*L&CXH5* 2 1d?b=iԖΎ>%""""""0$z[w.-Nbd8;92t]ױ @dd~'G@.W\^r1j9= A0ztGgB;ڭ'\jj]SSZ读T%\ IDATg?OO7.&fUWW&ԭZUUeE"q-,<极ZFxM7궪ڨbuuuS9ZqƘ|nJ233|%  ڸFz`߾Db455 踞@ 1?vWݨǁK$A t;Wy8v822G?VTT_׀5L8t(Y7X3J@zecc37|X 5666MѡWWWvvvFUUƎ t<m -\k~ntv+lmm5{iWt.St%hnꗝTs1<<###ChfffB x2厁&J.CT{Q*hh79m)R..GXdddb HKoL>tk6'F}}}bŲ V뾞SW(:mTLyeJ# PQQ+aP{- TUU ii鰱-]U';;;d̾.52% 1sMr\$ꄅD"O wwٹ+X-,,25j t@kӭYVV>ieښ3z11v0B/j2=tp} 322Q[[r냈bI2dH|cR!J} GկݡCqIڔJ%Q^^'Oc Lh9//oCF\cc#y 6GGG@h}Gmmmő#G!K0n8`ڡǎ5DHHr9 aԞ_`߸qcreeeZ#(64(kB{{{g"--#.EvG"aoo&dR 2b1?D'00AAÑm۾ĉȥg"//.4icƌFFF3Rٳgoɓȑ2dJKpR9QQwy/Fvv6o1iDA$996m9/܆  յHNNFcc#""&駙Bsgc{ee :::QUUb̟y6a׮?PXXb&y{{aܸ8q{L4ptt@KK JJJhay9P~/h48;;Ğ/ F"D"$&&DDDDDDDW2obhnn暚DDVJTpYh/^C␜| maaa;w|}  Bqqz7`׮?PTT"}!KP__wQjǻچ DJI~[]JR:99gOM, *j&N`HH0VX{Dff&233 RyND$d2@jj*RSSEFNFAA!͝;.8x0IIGtĠ=((kә=; (++?;v,͛>|bϰ_z1DGg!tf\ȺMsȋ>"m=ʹz{q}=- 9/BRco""lR666/L(TW_]zNA 4j---hH% :ԨM@"˨]V 2 &ԄJppﳮZ47vv&F[[<< ԠnP(F* 娨^7ݰu뗨ϐ ptt}uQ[[{{{8::k]*xyyB*5ZTWנJ1ZqǎnNNN((Gss \\\ ^]Ѡ55hjj\\\L>Gz{Џ5ڊrCCC[L>o{ 5耽=<==h_EE%J܌RPVV\nv 444 .#AЯ {{`YO>JLfDDDDDt(,,X,-$1b bD"1D\tKXMg 4گmmW^ݾ>=ۄaqz\3B낰WM+4uih,D&BP l;]J&{}Rҥ ˹_~EXX.E@bsau&{]V* juכ:<%"҉D"H$bH$HRd2QWDtR .'OGZ"""""""@.D7Չp xxxjg\3[DB444"??C /Gp@=F@RvEf$NJ  飈z@2 w}'2PUU8:: FC.[ċ"((.t)W4\ &`Q.Ȫ1$"""+Ll2,j̘і.DDLt DDDDDDD """""""""""""2&Y-DDDDDDDDDDDDDdhbIDDDDDDDDDDDDDV&Y-DDDDDDDDDDDDDdhbIDDDDDDDDDDDDDV&Y-DDDDDDDDDDDDDdhbIDDDDDDDDDDDDDV&Y-DDDDDDDDDDDDDdhՒZ"""+EMMK """"""""p&Y-$"""H\\-]YXssK p&Y-DDDDDDDDDDDDDdhbIDDDDDDDDDDDDDV&Y-DDDDDDDDDDDDDdhbIDDDDDDDDDDDDDV&Y-tI+ŋogCrXv$&&]Z1ФKFcc#xiĢmꫯ{ ^~UTVVoLDDDDDDDDDDDD燁&]::: /_3o[jz+$"""""""""""@ x 8y*M?РJNbb/ ˗߄NKCDDDDDDDDDDD"tD}Ï{`@}bbbLXUƌʁzeee(--T*;1qDDLBtRP__o2hU 3g172s͚՘3gFmYY~J ƍk*M* ؾ{gըk׾+o7С83>W^y ...X`>ₖԠIEhKLDDDDDDDDDDDdQ 4j?[_mڵ>ՆeeXv=4 M_|R`mm-JEڈ-]#3{ 3e2^z 6Ǵ03X|j#"""""""""""V 4*l6wwws0a|yc-a&2d!"""""""""""$pY } 8mۗ PQQ:;;SRQSScƌ0GVc=If=v鉉'W 99F;455w(BCC1_ב$C.sZOMDDDDDDDDDDD@BKKs 3]xx~G>V= \~No@~~Qۧ~,[vD"A[gg'6n|k#嗝=3999ظmL8aaaؾ{cҤXiQVV8p;lFdduם>|Q[:xzz⩧TjvppK/=;555-zN0S;nΝ;QWWL@?pwO-V;ѕ$++|6T ѣaz:rK9t(xj钌@;0 Am@˖]9{]oFC7~Gttt>ض899᭷6`1::""""""1ФRd2 CXXxoO?{FW_mf1@R0lF 8/,,BHHEC ~&GwnnnFQQOASSoqQ|gP(&Lc!P\lSDB }11ۏ+onqcc:?(h4OW_}/c« գ Y8t0f <*TTTBCG`6,hnnFee=zu`IV---ۧO!<<̢5]l#jӈW_]6|w@ju4pnnW}YYEMsnnn.th{}}=zkv9ظ^OС(- ===iӦ@*5_:@FF&ѣ5>A[[-ZAzqq(---#*jfohh1HOOGcc1iL6Ͼ--8|0KPRR!$$3fL7xuw)FdeeC.cԨp_ӦM:rrrqT*J%.ך5 ߯~}^0:ꩱ Dji444 >>>eg98vk4qc`܌(**FYYd2)S"aoϵf@]w݁ؾ훣----xi;f_կ5iMfQQ[ި)33;v 1c:lmNbr]mیa׮?Q{`` N:]e7yىu<9~(((g}Q77h5ye4ަߠOJ:ᑑxgLLW{ |s=̉+,Z]ɓ9d}M3@$ᦛVQQ3lŠ)))Ř9s:`y8t(IIGh4 'N=ϐ yMNLLO0bĿMĺuL~/<ƎcfΘ1||p뭷oOx577cÆعwعsEw믿F~bs2%1uMcc#v iFlxQ\R^xhZ[P\\l_CC#6mz{EKK}F ?kr}={믿C=<(.>Xj^4֯; Š}˖W_d#B[u."""""M* Fv|-5XYg̘5kVcݺVj~6ٳnnn6m*BB777tvvqq?fpyS[k] TWW#!! _|jSL1kYSNW?{ BZZ:~aǠ7< (++<3(,,wmu-1"" :z`1pv6vk׾FY31 O?#oZ?U:TUUCyy\q51lX R)O`I5 7ݴl{\a 7jŗsJ6'N`׮P]]__@;r˖ IXhAGGGQJPT8x /^dȑdtvv'Nw-]MMM5, gggv;t1"jOaϞ(((Owmߗoo6&9rr3&Oz:ǫw@TbB@iilfnm0axL8C!548J...hllDYY?Ir@ڍ7.Guu5o^#̙ X^[gj]:T*Ͽj6ETUUU_{7<<&zg~8z4111^skѢࡇnW_}'NǞ4hdH$n0L:>0>c466w63q$'n*]mmmOtr k֬2ڧ.4W?o4\[n=܏Rl)}a}t_afGRUTTbE( عw7cQ+aѢx챧wo4<3GF2rd(PYYD@tgG:8#22qqohϜ2%r #AU2`;`ҥGMM-moFu^BSSbc"6 <<1ctDEԩNOxmJJJ LscJIB$|(<ªUkPTTw}s1/ #Fl;qw6m_|n^SS `Ѣx3 [~evV LMFppGGϠѳgg]mr4/Ů]QRR'O{^T*koEE% -p9? GwfTS{{{a*@YY9Ǝz H_~5}|{ኈ.M!Q?<̮4c=EEš5!H4 xc#Z{c`o#<<DCpp0fώºuagfȑlmmW_}O=DS=Xib^^^[mۗ7n:::`ܸq7n\#+0پt&L>vvv{{{DDLk ^u-WJIڵ~(T `XM  ***ؤt'{\C\}$'Bkruz^ANN΀?k,OBnn.hζ6A9svz#.>,))EAAD"EE$2ʄbXNNNx]QC]]۱sox }~@Suu>9so_ RRNݯP.4k:UJtdddqUGbb?~A$w?޽駟0)) JF 0***&׮﯆F̙< o!3xzzB&|9 4ZJ@. R׋xɧmF 7\gP 44eafw"*F@5Q-^x{{o9_73"b0XtttܯRۇhϻ|xǟ`Μ(L<&M8p>oSe=ٷ/JI_IIjB@{{;]SěZ'G >>.H  WW1FnT7L&CT,DE͂FAlAl MFss }E|:y`a̙<X,°a;v A^^^ߝѰGhvtt_o碣9(/@uu5۱s.;3v1>c"11 SNѷv֭Z__~z?|.܌GyYP*fG.믿#Gd :u*f̘zBDDDDDtc@ [[[l)P(dɵX|Y̙ L]σ>`4B~ۅ;~aRwEh@\\<;)/ L؃HHHĭ F=">>BGG'r~̙3gsŘ3' sDa˖Oeghkkw}[\ǫЎ2/]8纥]#*[.hVTt~^=qDʠ}QQ3o_ v#M7k5i.IIG1Ao\.uޤ#--]SSw[~:"&A[x_,(@.)C O>>~3fL4DDDDt~7§~dOfώ5טSgp4q!$&Abb믿ahlAh4xPSSkvLS䓏˫5k&bc"99HM=:x#$$dsgcݺ hnnARR]3-î]QPPh0*|/]~עN.f*+0l}z]<{:u ƏP~~o_ 3Ϭ\.Gji ˔)! ~GOGG'ZZZ̮GڛIXZ] Xlڴ$bwynf$'HLLBFFsK .0^{eebaIDDDt]w݁?Eh üys|^^XbVXN6n|x wx\uih^IQHJ(7˶}e;qvMKovM'*r'U,Qb)V zo2zgAt|g3y綹x=ϦW^G._ṟ핟֭[y/a+7n ,7ϦMpG#::fލ֭[KCC#]离rri,[ FBN#9"55V+uuulٲi8rEwbZg7dm۶T|i|ǦQȎ9usÙ3ؾ}۴8UYߛC3b׮Ïh4 ; 5xo%=} _ڋ?++䡇K%)BIlvv;NӅp݌\.XXQtZt:=0wxC!B`4?g?:K? YLL 'wf?8{kΝhhh$..u֌;ݻP^>xUa/g:]Nss<7x;匧0?q`)`y'xr⥠WRSSKTT$/)k2^x30Ǫ&k&:Ϳ/˝6?(ӧOsQ,lLFFbE _WaU?VS:wɔݰae/(+?;u:o pB!͆b6jt:QՅp=SN'Vimmłff !4B!=Ț5/5 ef_7_n(j#* ?oޟ|W_=`Z9vLF|;ߧқ!.ם,_2YY|Emm/@p8~?p8Zݷ!v9a6lX`гyK~'x맾ֶi-w2n7yg?Ϗ2>|r_/>C/s=㷜lM6rxo8N-dAUU?~[su~H&aJJ򌯿~+x'\p^:::yw!_n-܀M._f'?k_}ߴzY$m۶a?n4+_/iַ/~_르'\歷楗gy>f̥:1U o}E`Z;GwF[DCCÄt_<ٳ}vy_ O݁455gDJ !B544D{{;mm}=٘,N~iooghhh$ERrV!B|[/~c;^#bbb8xu\ʗUECrr2K/488Wԩ~.vt)K4v?~?o9qqq [/ .ooa0艍Umְʉl`&5޽ssmڴɯo8'\}}?c|{2eOeTVV%(zA^/_ܹglhK.ׯȑ9rorr m۶Gy+W09Bfx멧̙MXjy<o~?QRR1ܼy7oh4PWWu3OGGⳟ<']XX]_ ɀ{II|񋟟pyQQQG?K_zv^z'/SXX+Wihh^{ݷE ~[yܱ]Bjۋ꟭np;L 1VV#qqqBvL%C-kni4n>@Gǿ !wqݔES{gv;/t{p YJJ Vngվ@ ^{mVex؊j%))+>3<!??EQhpbZIH'??/ |;1m凉t{l/˱v22'ؿ*<~233Պ"==͛75mۆV%R '--ddSOL(+Mtt468|1\.F``96m`ժ\._AFF:v$%%%{uttMvv=8g`ygH`c4q8l6)(Xg=}冧"##y䑇Y$ ˅ᠯH-a}!))oTxqTUb?@bb"v?S/ma+ddwL&cbbxG0 ttt?(,]s=lDCCcٵ>1;4,[ýn9Xlݷo&Vٱc{D188nGUUfÆwMj>tiEEerX~-9990mUXXFUfիW'xooQQQl۶:bǎds};0(BfRge !BxY,-㫏 fN69w5c~pp[ FAף(4F3hi;̵G=oFM3S)̋#zYGBhn@S f4cW,1[ (W9B!~xˁdwS`zvUur ._̻D%Ur\a gTQLLllpvkwjnn橧>W_Lc{u6 ֙%BHnl6{kYGuaO@zh4wsB؄hBUP4`w.2 IDATЯT5=S {ޟ}l0K\ ؃m*&'ñIc#B!%Nd3yF3ths{ͷq,`&xeq.B!a:;;}%G1#""h4jk UU}Ll6;#4F^t5N{{; :[S19k#B!bڜN'o=|7G!544DGGg׼$,6DLL̸7)xʟFEE)?00@__?N7b j!N4B!BLۉ'FղnB!]ixxx`($$$k :dhZ∋a5:::IMMLM!1_#B!b^-g+!Bn3t0SUUL2+6DVV&&S ˹tvvb7*X$)B!bZx=|7G!0f7*$''8܊}TU7 !DB!BiIIIw@rr|7G!cX %fUU%=}ɜkB .6BBB|7E1E)B!bZF#)JFB!2J__Y.k΂^QQQ/r-l;~V|7C1EB!B!B@¨Ԕ9 fzEEE>:B,B!B!B!!LUU%66v}mZ,M|7C1B!B!B!>(ʂ<99 EQ3zPS ! h !B!B! jj-5 .VCfh.䠦jfw34g:@8l1 .ɘu-X]!B, Vłf,gϞ_l2m.,˸%{}^~^X,tuuM-*f-w\/W9xu^y4666<pr\<َwJi8^M!&M!Brycx'HNNfppP.R--,6IAAwGtttt}}}&55g}K%++kZ=y_'77'||!q\X,&ܹ,_?a[cc#MMMA_SNrjb3ڵk0bHHHX;v&^x3wsfݼy[̼K}}=ٲ=l znZY XL 8H@S!B,8ܹ=h0 :::hXجV+>Nʕ+BN;e/NԖeUU5TWW;ݙ3!g2fg8P+E8XwHJJBLh7xJ:. ܤ\>غu :]6.]A?&`ܺUFmm=}} c"55۷0kNzv츗қf``D6oɓ1bxA߳K.SRRڵkNPZz]v&\:n.7oޢ ٌj#&&,6lX7aƑС`-:ypy$&& v)&`y}}}\|PUH,Y–-HKK>Z^}5FO?2UUK7`6w`4IMM{7n*, !!7[~rxrf B֭[;%$$PRR̭[(+͊%A;{z7p歠Ӝ8q646oc6$&&fͪ KTPf8K,Ie];N.^DSSȍ1ncq?㼡3g  5s  .nb!6s>޲e Ɂ> ]ƥKPSS頰{vnsF)oWׇf#22DV^Eqqo`2n׭[yp nݺƍR*+f߾^okkSdgg}=0 mF^{EGG'!==}Ix;|(]lܸ Gòe9lذ>N;g,oٿ!^ovyƠY̕+Winnf6׮`͚U!ݡs)lpCC?̷.u-X$)B!UVvC>Btӗ`ٰXz}ݻwM;r͛O=;a(//z^f˖DGGM׮]ĉShZRINNgQ]]*ܚZ͊d"3s)6 4ͼ{Mz, uuuձr |p;mm<:N%%%UU1;x |3rUNUUc \x):8p DFFa2O=CFFrxwhhh`u3kK[[;͜?AbbtttP^^Nmm ~=vuuqAl6III梪.z{;TۖA~IHH`ٲz/p ƚX$~inn{yT=N5`dmݺ۷9E5eq3-nZrЇW( Ii19r4o|4dڵk褴k׮qF)Y咟r.?IRR"O>stQQQɅ |tx!Z'|;fN~ߪ`]~^U|an޼Efffq|JJ}n===[sF)k֬Mɓ`}˪rv9~Q=Drtq._ѣ^l6޽PP^nGղbE1/_ o7 XK6Ν;Ouu <w:, 9{444z*voFڴj*g/fPWWǩSy䑇}Ӟ:u޽jJlvO?ISS3Nnn.O>x?~$u_sss3o6ǎ ;;ۗ%~:JJ W8w<+Vs=XV^~bccҗ0-..+Wp n* gϞ`0q㆐7(/ %%{׉p8\v}FT`8w|!lڴwutvv9<7w8x xϐ0]OO}tOQn(/p&,YBll}}ݤclݺoZEK~~ބk*mOa؃^9W替Uuι?>MCC#.oj+OLZZo<۩|STT2YUu=558NʺzTU yC=Yz{hkps)l}4? 餧g$qE3k!B$uB!DHvL`&@DDW\ݰa=鴴ݹ޽OGOsǸ*{˔t3<|Ύ3%$$z+JU,@3A?SZZ+Vu:Z~SNvٵ>,EQX$h:#c:;wIggW UVb4Qŷ󔗗vcYV&WǾ}tV$&&̴pݼ!jkk)))Xvׯh4ggd^ #u,46*++ l^t)ׯfR[[{>55ĢBq\o7][nFr\;J:;;ذa݄Lq8;wEc2z={xw_3[efؼy1h~yq~Ǩ]v6m߾+QUgϞr?OlY:N e9V[TWpF)8S EEl:++xGh4TVVnXX,dggM鸝yjطA+(?bcMp8hjj Xݭ_u N;'??VKs墶e˖z*;uu555#5tn\\k׮*\G 1 èk==h4wy'r h H@S!BNbpIz{ƝKz:;>VVV<_Wx^…;e+n7F. w3""$r֡(I(\6x@II11 |yviii`0PTTt䓡hFJ@CnPYUdddK[[koCۡk?Lo@U]\Y◵2͇~Dee%<ЃSj8z=~A$69t#ۧPIgǩl=+&&5kVғew1/gJggV쀱漂U|㙩b>so@kok6sF֩^[muzzz c8{~9s,55~ppQt:=>H@{gZ{nWUUdffIwwu)5vs3Z*>:•+Wr*,_5kV7~4;gxؓ3ɈbU^>N8IMM gΜ%33 q:8N~ oXݎhdxxu>_q4 I ~By=z3{>OjjjX;NjkkiiibahhÉ=^D`ժpvK,ub6Ybńw6{ˑtd *6 g|7?Мutݻ7?,**<֬YIݞ@Ӊ'}ќNOavijj.uf36yE466RQQɶm[a$(ʔ͎'y;c4s]AA'N֗5Z]]X<47Acc#))~ߑ3S\\Huu5u`ieeH|F&:_fvV: v p# ***ʗ *a,_5dXFN0vቊ&!&IB!w1oGz;ƎOYXXe9WpVmmm\pK.QTTȃ'dv@jqq<8pVәjGnL0Q4vp-#7Uގp:jk OZZ K\p!6pI***ٵk'۷=%h'EѢ.T- ncB:;;\x>WDmm7ihhRyLxu/Xsz IDATϣ]:;;"55%K|㬎͊\{DEEn.]7odd$֭ {Sc'"4s{ 9'j4FVE~'o8Ps`6qjk!66{=68qJJJBV>kBΞ=Gmmk׮SnSt=zY-lw{"33FIJJH_"nSQQIfRp\3񝓛^o3kMM ˖n)..KRXX@u'svgΤp#Mh$22Qfmm=qqqSΝi kE0 B,"B!%$ģjfϚ7+ Xc!944ˎ,+=2~hif-,[3kKѐV=Shn7CS!.hHMMOBNp8(/@QHO_22"Yj%{x:+Ǽw_zm>Ah===0 jILL\~cRˈ ""0W0IIIܸQuLiŢ鈋6Aϵp UnVVQW^^Nss }&c-(Bǎ-UYY5yx8rX`IӑSO=F%h a[ :[&rF`ӦSZF17<?^ڵggNCCCcȠ{m|~1;+mtGƍP-nQVvo:GPU;nm#m;ƍ7oPbrNM)RYYMiMEKII$sn޼ɿ:;;NkgZOw`41|׽B)..{*:zzznv,f1靖G :hZVf?a}ǺV_57>oz~x<4L.aÝ@Ӣj@)qYknDps6ƞ6oxifcgϡfm8p`` t.7DEGy9L]+xr8z #eN#u239{7>02ellO/>s]DD99ٴrF)QQQ%8~$A3UJNN6Fcqn@wIINÇz,]Gs)l[Uь(++ l,=wK.=B,LRrV!.{ٳ8q$W\#55(z{{immnlYtWOO// ..Kb20 twwqvZUVa]>|'OQYYEvv6qq ҊNG^Sq:($L&Q [io7׋Fa߾cժߤ`9KA__? nZ<7o¿(,,$))JKK+.{FmݺgqЇ$=} Vȯt\477sk䐔HWW7MM;RRIJJ_ꦶv,XzG˗O9#nu(‰7RSSHNN`3<Cee%$&&ᠪ&,g|ۆFIJJxgZaN:MSS,G/VKar_\oHFP MM!=P[[Kss3k֬ 8VRIHH 3l]L;gu|y>7o-|irii۷+0 $$$*Ms)\h4DFFKOOHjn-׮]cڵsv?kjuhw%;36$ I@S!w-SSU)Q( lݺ%h瘢(YjnݺZZZ;vl(QbE ?~bc;ayR^ /| ***ljuu떠c>}*iii}SNSVvׯ^aJnݺN~=Nmg=L& |\))| ԩTUUqUHArv3u|ZիWQXXȁ;͛e#U<E;* l.L0am!´0"f]5M7Toy4A^5͘iFؿ}ZB!Dc'<~zVݞqTՍpTPUYY!7n7===\* e"Cf``=;Ze;0Lam* 3$ӉbAQbbLv»nZmL1b!>>8vN||l>gnȋ/~yF:'FUfCNnb`01b]2t.v#YΣ*cs``߾j:,zHɏb2w h !B!&\23eLX!B!7;fDD$KfEOOHffT0м7#yL`;kff.&B$M!B!ĤdwB!v'FU!99(,3n7::hzw_PSQ4c[ḧ#qqqDDDwS3LB!B!B!"-v&22*n◡9:d~qT\Ḧ#&nbH@S!B!B!XEE[d2jepp!/Uo60CӻсMeT&`鈊$** 8B2 h !B!B!ر55 DDDffaq:8.T5*cӷQhfjGVEӢ1  ÜC1$){Y{{ΌFX5Ns\'NB Ti\]v_e!XX\ a ) $[E%˪#Ymsi43*Kss3g.rP-%&&(!!Pس hCkYs;+w{u@R/֬޽W/ ">;x^ze8pp'())K/7 s^ B<4iG8Xf UUU˶y.ϧ*%''zUUU-߾}oߩkZK.fUUUir׿t|--RffF?ץbߣ޸>wbG܎PA&S,+2ٳjnn #t !3P{}`BCڢE7СÚ1c`w%7JJJt*;;{ӯre@<@ PA !mԨ5j`w#&۶eY3`6lnq`w{: M.aʮ@2aY uI+%eFYr'UZZJ+++SӦMUjjyȑO۷$]wݜGm֮]e۶N8xjkkuWiذa:w^+IfRBB9ӧKҢOAA5}teff\p.f.&˲˯Jd,ґ#GuAs'tӰYk֬Uaaa6yyyڱc/_Gi{:w\hNY:tpmʴs.ŅeeeڱcOB~_eud>pneeԹ78 r$Ia(m[m[993 4ksbKm~v4nݮmvȲzCk jmmǵgx ͜9#fNg[T􈶥ڼy-[4lWnF $54k]7n\XX\_ ϯ֩S]}UZ"r(z*)):g1_$UVVWeeevg^}#jĈ+XDSPPw}_XwjkkTVv8B[HYO7F~ma!צM[w^IRBB^яޡ,Iaj]ȈhnTccν x 0ݥ#Gr̙3Z={V[nג%ڿ***ɓx >|jkwڷoVZ466ꭷVkkϟ+$k:|8vٕ2p M:qDDWPp,w~~aDə)4{tLjkk+,ٶcZvۯ &h aSYY&MEnPzz<;M6G}Eo'555+g+11QݤӧO>c:u233&*7woߡ &VIz?̙Jnw|>ΪI:- LsSz7Р[oESL[}ݻWSLъ˔,ϧ={j˖mzph„ 6lTYYQYRRsiƌ=>fgw&pѻ{5q%$$4M=ZܲRtǎWQQƌ~0 ֊4o\I߲֯eZZZ`|pJI&45bĈP?5\ed)4` IDAT0 %&&jE;vZZZBCtR57w$鮻̙`#..NǏ'>?԰aBÏ =6Tqp趟mk2MSwug4MM2YK,u2mTIN,U/*;;['ORCCJJJωSrJ9BNCqqq9sΝϠGTVV1c讻 iii;:͘u۶mjllԂdl}QFQ;vcvr?~|Oɺ暫5wٶ'Om{ni޼tbݩc9fhM:%7[g笧CaM7QYWWݻh۔:T]]ca5+GjlȑXC.M>4T 1M3bHYI9rL!ÀF߼ysrٳz=CA19]wݜc-NFFzc -VMMF1cFGlrtWD, ў/V?T]]1cD+3Xn55R--^W9SzM>-vr\7nl_Q.;vtkT4M>-aZh$8|EgC~B?ӽDssxOˢǏWNNy~aoeeUh٬YdkUPP {x"0؆=`(`Y˘awImWUUKnrUUUkԨ]>Occfg/$$8a0t>DW,..ֺu+ T}}}6mJKKuP N$\.j2 C9I^YSxYY=?4blau,lٳ媨P}}uɶc>ܹz !P3՛o*͛7W\sUvՁ>ݻW akRSS4n8Lu8qR^3"E Ν$Źb }{!؏༊CUǀرcQ$''Elڴ)ڰ!W'Nҥ!VG-;tJJJ5fh?~m>zE_gWYguussp())I 8;(tv+>ޥG= 9gB)gΔG !fSSSA`egRQQB#Gerrf+7MDHIIQUUj}`aQmmmwRSz<ۏ >\j?qAJJJرcT\\,V--^k 1c:3ZǎW\KǏҕg\,KJII jő#GnzeddnըQBAݩS NHH:?G>r^{:}VZnHD…k=ɓB-[T:q&NpqaMDǣz ]IHHPbb/hiiԩ}^!` hXL6Utĉ!V1cFkذa*((T]9kҤr:/|ٮtwEӓsDm)33#b]7tƎ0|^ar:UEEv?*))Iww)!!Qyyڴis}>w4M͜9SMM:u dYt.0kV$i׮ݡy:ڼyZZZtus–F^7>7lȕ&~޽O_C41bq成ܹs:{l28d_pݚ0a|V_+˲zUlSNi:tx =zThxQͥ:}4555*7wchy}hRkk6n csΉض?EonnX 2ǎ|ҤM6}>|?)--Mwuvڭ}:uUQQ{?վѣ:z4Oɚ8qB0prFأy0a&OcǎW_ל9jjnnѣ:yuuׅmv0 Сr3&̛7Oٳg+ꫯRFF_0`mٲ%z?ь5l09SÇzǏSaa6n$˲$04nܸ 7~ k(33SaرZpAXK||&LyX 1cvޣB9q0Uy6aӧOM4IPm={СCZjzz/zOiu***һ>!!!ĴiSC!^ìP|xuu^8ۙ3eJHHԲ,UVVJ JNNVzz";UTT_՘1ctݟo@:uDCII2MSCa4a#0Hl.Wܵ,Ivo+coE;թMuve]t&VcȅIC@I D],ߧ1cFqrϟUBBys`Æ\ny%2lӥr8JJJ .?C.L<ź0eE*| :|NgabYV>A4@t0}*-=#?~j rh E@^o&O,CG-xo x@8#0: ;k0I--^Ɉڪ܍mzeۖRRRt)99i 8pP3ciiJm bcY3M>`R穪s^C& V&..NC:r$OjllVVVfʡ ȵ+ȑ#>CN}}hseJ.g},P4(>_,˒i2`KMMՂA\\-[2"X%EivL-q7 C$S{ 2h*߶4 p0$3Ƚ#PؽRM+}Hp> !4eYޖAx^o44@3rYBM 6M>~$j:%7~AxI DC p"I8q:2MC>OMQ0hd{t@&@ :~0v'0TYY)˲YJvOp &hAa2\oc2,ШMG`䦎 2!~G |#4M555nP Wmmd#6uΔNv4I 3Pir\2 Cjhh>ШZ!%4ed@hUjVVVjphhhTeeUX>l@Lᜃam;:v%4dۦNl[jmmQEE|>ԁ>#ua(.%f{?@8M~ 9;^dYC EO^233d ²,UVVYG2p0 9fDx w@W/Psfm4!өx9U\|J A ŠQŧLSr:20 =}I DB =0i,+jۛC~_C jmmWyy\:)!!~^٫4r:s}afQ"KL M>bR4 5,˒d IWkk|V4`Yfdi*..-4C՘aWhfeCM˲B6a˲*˲UUU%˒\8%'')!!8|P4۶eY|>jhhlƔ$CN)3NN#4'i:]= &@IpȲlٶ%ðe =3t> PcЕ༖yiap~ˎoVfG  5*97MS`CaɶA)Ӗm~~hmKmImAm2 \dhzSP81 m_ 1 CBvI M~}N4چ i˶ͶevvLѩ3w夙1l[ u|`(Y#" 2#JLhI`/#4OG0 V]4۫2)nY5hUˍ(fjad;Γyxj4@w՚R0l+ ,/|CӌL, 1-Sl>TlȀ" &YBM̱T[X O MQxfxPf9A&04XjME 6  0J M+l?p] e :_Gkr=C 0Uk*v*2x~6*S 2خuK(& ^!dmڇCbsgZuz@`Ū _XT=m- kCDju 쪝aD k.e}-4$&UfvRٻ;u]њ l_h A= 6|tpy]p5A&0 4*j . A&04.CRu @#&E]hMXWR @>MKd@E `"0dh4 Y,MC&!@E `"0dh4 Y,MC&!@E `"0dh۶ ya vt@", .8_l4.2T^0lu<ބ^wemM``h aɞ G @wڇZslK M!(ETWVes+dfxՙ BzdڶuY}n9XYcWd/ -@"" 3-n֨-/˲eۖl[m+=hs c i #4 9LӐmQ%& :ȴdY~~+^vc&fp Td-*0pr82M344-՚@"D,K>_~OeCqi:dH۶eY,˯Vy,,/'4p8t:b\}@`Ī Vcچ \$'' ] eC8%%Ҫƶ)a,|✡M5G 0Ue0[[}|m[i*5uiJHWBBZ[[u\C(t:s0&&p4H 3g~K۝A+Z\\Ӈ/%l*jMh afy2mۖWKK,˒RJp" ;Wv}p8B՚dR wQ`WRRTL.2iNURRBt5l ʲl(11a .\rrLT]9y͒tG1̭ &@?yi)550KDN^W5 D Ǻ 3~mN [Æ%fpILLeU_ߨ)#|BM瘠 ufZY%+NɃWrŅ |#b##Ѯ;/R$˲[rS`ݩ{PSQMŸ@_uXվBUe+--b\LTZ['9x Dh} ְ0|>~KNC ̛ !!ANR/۶bVhg4ALUWjjʠ Y_>_O4tF pFe.R~~LӔ>rdf@{P #c߬l4mۦ:TjjJ=eR t@vp~ٶ? >>^{v` 8h\C.J߮,[%)_\LӔd+l Ї]|>ٶĄA| a :"b#cVn5(>%V M MMȿ-˒e%r8C0 ز,,+0UM ;hs^_pv3OЮc&& wIp۶$2 cx^+`Y4XkOoM>qerqz@t5LM6g+oӗA08GW˃}- U`(^oYV۶m$}j8 IDATq]m[{Y$}9<~'I{4uٶoj=ԧ?GwxT_0(ZZZ3?6s\oHb|K6lX__$顇Ըq]˥x+ۖ c{ -!C:3.Ω$i̘gC4jĈ+fz?4M=%I(I^ѣ~^ }Ӟr81:t(t<2cz_dMؒmm$h O5,xm߾@sÆ֭ܰ6 ꫯRjj$i„JKj~tbM:vf\^~5'>p_3=G0G{*M~d.P4w\m޼EU|||ׇkvhڶmvH,YZr׿cǎkƌ}ZW;on\2K/_B/~կ}p|߀Lk|]tbm={>ԩ:qߐ$۷O1)((TUU$iEa㕓3L\T^{uxzv]ڵk\~;0\–,Y{1ۭ_Apr͊eUmݺM4jHM4O +ǩY?/h`u>~`YKXvvf̘G 47l(IZ|RRiyڼy֭[O|Qٺ50w`4hݺ ԩS>u x %ݨ'5y$͝{M~~Hϧ-[i=ִiSu7umPKKl٪?ܧ*%&&j Z|F#*(($|MJJJ={tj%1͚jhh̙3zRMG:j-]DÆ >>̙͛3+VNN.\ rС*,h^F{;vLUUzۛb>]֡CG"'5 <˿??V_0w=IRRRR0U_,Izkq<o˲lmҪU_՝ [ ;,s=̏;F]wy+Y^z̈hVVV̙3"u6G?OiZ]n^}oIoTXxL/[}+f_9I#|GC|>= o~+˲/몫f;;vL}s.?*+"͟?W4jn/ bC p[d{I;um߸q,ܹsBAвeKt:i&~maڵGJJJԜ9sΫ_{I4{,M]_22?C_VCCRSStM>M---ڵkoufZ}ߑӸqhB=Jڼy*+T?nrݪզM۷j qys6m"˲k|G?ѫ^9sհa:t6nܬ }K_O#jnyyy *!!A+V,Ӕ)3gʴmv Ǯ]ߖӴiSu-+5rHRRkkydx1}ԛoI=#nҡC5z(yjhhrz'tao\ٳsB_ رc?O}zV[}Y%Kiv_vإ'^%$$h\f̘LUTTjfpUs)?l٦kG3,ߣ X~M7G?~ڱcEsamg~FM>M?†g>;v'z;n? շmݺ]キJwughHNánZ7|[7oeYÅ~ZIRzzzQ_byxNZmf͚o}a?^{]ak޻xZOg?oX\ii\2ey?4n؈nllΫ.ϧ g?^X|rrfz駿޶mG|U:tXÇ3 WZ~Ԭgy{MG?dYͯ{>?3zS_u0.0BvGu44nݺ]MMԶmm 7S'N3%r_VVXX~5mnD3qy]GsϫF#GзtX)In[<y򓟅[!c<+7wL}Iұc#miiնmyHU^^A?ODlPm[VF4mT}{ߕa:w^o@キJ/OQLIJJJkʑ#V~ 3xqIoEg֭[^yy7nn#R'|<"̔[nY'xL~}n:uUWF4j(=#ދF pXd$RǏ-߾}5}dr8zڲekhyi0 -Ztyiذa1Mkkn566i]5W?yGöR^^$顇>srf*v?"I91cƄѼ~{n^W]u|>סe闿|^jIg^555vchvsw(<||~~㶘m:w>f;C\ϟxy^m۶3/_ּysmv]>TE*ə aPrr<|>_غbIҔ)k>/T>JmϢb͘1]dny^}ڴi|6|Njn:U knvyUΘ1=;'Nl뿡'vԺutɰ$M}Ӈ~gO?+Kky9s z_;KƎի?бc5qz=OxO0^#f;+N3gNצM["---:s&PiaCZZZϜ9 4M>dۃ݃`XC'&`Sۯ}f%ZtyVڵK{|JW֪Uk+55傟 _x\;w>{_***֔)re;ML ́s-99gg>-0TTT__mC.Zt,o~[I?ګm"ݔoϵمY2@'Oo\:h\&2335sf`mvhÆ]rM 6jӦ-R[g_Y7nܨ3gbQސeY1{Im!ިQ##;vImP\\-[nŊeJLLPq)M__?~\(_β,^Ft ֍7VcNxzYY!jKJJ zv_~R ^/Iڿ`' =yC32iR)I҉' +8$+_r6ӦMĉz_FZz 6,]bb- a/SJʰnV%Iz뭿h]Q۽k:~# [wmj&=/zCGmo߁ﯳ1OK~lz/{O!…ׇɟYhS*'gFDO>.I?y!><OT]]ګC3zTRR"ǣ-[?߿O[?9xK/kpJ;CC_$9S|-}qϟ?O;7QTss`T˲TTT^xQ~`477+7w~'A=}__U__e&y<G^7멧g_9qiT^^^._ӔrmǞXFڵ[4w\%&&k?䓏Ao o<5\ޝUږw/g%+ 2!@iC!N:i2z;:@[ %!@$NB'ݒ,Yd˖?l)%yc%yY?cKxRmϡ :C-mV̄Z۟jɓp8%HRo w޹>xPh-[>4~Ӄ2)}sn#G?z 111xqE=Xd&8c[P\\4MDDDtb?1`7M>/ <_7|8ykBH0S$`FED76DDDDۿS* |q~ZoWu˗!&&YY~󲳳xmޮ8Y`>7O.?/_~555P*br|@vv|1GJNN/ |{ECCl6;1\lqu{ZeP(H$ַ_|q d~6/ T*'ܹx7kǑ#G18ebb"-[G}d󓔔_Ecc:;BII.]m۶zLw_xj (`˖>1** v#GĉPtp8HKKE~~>oWPw2Rjc-^g X ^}{QG(Bz7ߍ73.\J` ΍>DDDt}L&<ԿTq*̙SD8Nzh4=%jk&$-Zǎ@\\ܘ 3hb\?,WmwzFhQy#Xfce#|. /`'"4؂l֬ܙ.J7U@p.\nX,.dXyoN/@(1#4Av!H& 5'N(ן). bxcr>nn(|XVі Ltd]DDDDtSjnQoE"hd֟}P;A&эhllBDqu8D"Nw{kӲN˶L"n|KDDDDDDDDDjjjoߧG}^OҎaǎo| 3fb M"""""""""0oC]~sZu455#11k֬BE;%z Ұ|R̙S6}Z,VT] 4 W qf?x_@FF:^}Psǎn0Pr]X,X,P@AA>Ǔ$1$""""""""" c55,X0o3ZUV6 8~ĸĵx HIIHKK׀}-&j5, -gItaIDDDDDDDDDt.㔔-V6mڀg1}qݰcnrG? N@RR"~ۗ57PaTWLk+͑L&QXXpID3&Q3Lr|F[JFRR}iDEE-#9vn7~Y;vqqfMcɃh0R)PRR2rd2;] ##cjB3]"""""""""" N.6ffoozax{~hK(*NxCJRRQRR EW~JۖH$P*X`> S;m)( IDATэ&QKHH>niirL&ttچ >K9sBZ+dt Jۂh4]n> 4مgϞr iiچhGG9vx wNg95|lS&8hoO?3$HMIm#)) /P(}'u 5fh`Ѳэ&Q﾿}x?H2!~1픕D"NOCXҩ{oaǎo{hMSڮlDD䔶GD7DDDDDDDDDDaRƛ׽ 2 O?=0m\? 8ΐ3T[f>6Ÿ! 5tgZbbB@(EFF  _ip8&-x؞wy^ Ϝ9ߧ= /))(++EDD"""0{ or`0KZ"!.13Lƶxmxgӟ 6a׮ؼ,]iiJe ė__į~=л,@[[;>;X B1f~[سg/Z}hnnƶm[ ARq`Æucnoǎo{޽|g RmY<F444fn 4nwu'UUWt_ZK." ؿ1k,<.݄zzzgGHXvDDD@BzzLh\hN@EE == dXӋfX! 4j D"22CP>f"&&f l6;RR~ pnn(c_O3]A5x _ĦMPZZ:!""""0DDDD7fTTT ::(J`%}7ܹ/p8_ۼ.CaE}}*+/h4\xcA200ݻ?Bgpq7rrjJu::Tp"T*l6;0{v/_4NU@Ѡۈ8dffbժP(TTV \$chkkɓ/ى4ŋPT4`0tϐun,T*5z=""HIIܹ=oTV^߇fTV^FW$,X0s<6-p9fWV=ZEjj V\R]v2 :;8z""xmw͛FToq:]]~M'6mZ%uj\x :]zzzP(y!/o0T?jkP_ф>DEE"11k]>fC=w^<:66[lgqԡ6 QQHJJ¼ysQZZⷯZ@r#%% wԓ@N'>`7n6|G} Atbw#{g뻱y݈Cuu .]bΜ2rS:;;qyt]0͈EII4zph:& e˖!9Y9lF}cefua6|MSzIIM>_T&t]p]HIIA~~nmQп]NgϞCGjTQPPŋ!""}_Dkk^nDEE!==˖-AZZڸ3h ڊ/B,[ъq{R%>8$ RDgNFcco*u?СèL&CVV&#`XhF- >@η R))):]Ξ=v|k!|Qػw UUUhjjW1 K4XVtuum?ojja 66Ylrp|\.cv].waGgro?:{Coo/hddh4---(/;+(22aXp! Yzc3{Lf3hjjW 233I'dtwwn )))>khllܹ>ۡV1gεhFgf̐iN@EY@bbrssߏf$$$z#G>Guu5d29b JJUVb%>tZ[Xntvj003nw?@W1΂X,F__Zx C bt:ى}>AG 68L"J!Ҋf,Zg~ss Z[[QQQ~fիՈA|`ߏN |ʵwE?~nʄVٳF=>58|'⑙ uuhllºuk1o\`&rߘH٧\'g^aѢ>af(|Ϟ 6bݻbXRRP_߀/6`0 22 iip0M8wēO l6J%vcFSSnKV@&`|tuq\t /_Ann QXXtLހGAL¶m[;eāQWW3g`߾߾LZ-~+6mG[>]ӧ+zjJY~͛mUb2jq̟?ϻ'WO/ر8t0oh}@"]]z!Z[[|۶mE~=Nf<75Zn7>d?>[ .ΫoPUuA۾>onn={qEC N96GLLOtpI?7 ` C*ZF:i%s֨өOW 99{,OhB ;;ۧEVmm>t?N9eS{+ҡ wݵ'v\p>WV^Fuu5JJq睛-f3vރJ̞]4zLIII@Zhjji =:0k ǎGdd$6o{Ln7jjjq0L8x3DDD"'' N3gqABBu{ߘh٧P\'n{C[[͛kE}ӟނ`#<8n?b } ݻZ'Nĝwn#>t? nZK,^ǂ @7ǿfæMf""""9q M"""ܦM<\>|:jǏ ~ZoI6L&Cuǘ1M"Ω~9R||<,AsBB/_ ~…0Xx_ݶPu(-- 31Ԓiٲ:#[8qwܱ'1OLLD(\x Fs <Ӟ8q2˖- T0II1ADM*RW߁(8SoY\\ Jé;V!11*X,@!GH$ 3@P.)^p\y³Y~% dkAS |Xo 1z2 T*5vwBss30o\8v{-_ĵwk׮kbs"c'vv@D"V\9sJvpip&Su">d?QVV eNׅj$&&⮻ٗRĶm[!QUuFKWPZZK\"))SBC~~߼߽n^ 4n999xb 5kkv.Μ PT@VP*0cUkMM-.]@(^ZP#ǵ#Ɏ zYY]PILLonnX,;o:w,p~YY)c߇>|h=V;Q=D"$$$dd#*J'ih%wZ)0d/ш2̉JL2ӢShjj ^oو>ES>'ROr9v>T[9yn47"6vȵ'j5r9JJ7<hIإ]vvj}d>]ƺN=zᮻ G `ܹ„VtkbϛWNxV;玈%"""( ̛7EOO/>p)dgg"33f8N8NOo܎ T>Ep9G!##%(++i5z HT* ae^'_|qjp=w,sh<$''ΧD-nwLeB̟?),hݢu4 Z[ۑ ZW#e9=P75kVcѢEBMM-j5j5N8˗k p8qqqA[bXK`N'ly#ɐ 2 rPT>˛̓-!;m;ZV ׂ0T[p!X' --Yd8sLHURRJ478Zfs/-7>>PTGtt4 ˑҲeu}1z= RSSLdd2<Ѓt| ؄&cӦc>1})6v>T$??2--- yy-JKKp9455͞=}czt1y<H9 _ fzJ'k*III1z=v;Ξ=+-:?poõH_DG}-r mmmr \ {""""  4na"yh40XLHHH$ ظq}[N`ŊXb9Fjjjp8~8Ӽ]^oIIPX|fMz;_v#iFoN4]%110At8Vpn\.$QvZSFAף$$-&3x#UXq̙úo7`Æŋ޽ccJP*MOO=5}xHR䣶Z6l6:PZZgϡEhjjBLLx4ZNAJ3!!~, |Rɚu[`׮=8}(/m:?((L 0 B5M>!PP|8Nԩ h48p_ݘ8&-d2CH$qTV^nMLLyshaO /Mi;-[7Po222Qphjjо&r@T._phBWWbc&dMQ5p8 KՍdSqqv;T*Moqqb157SR選\1t#db`hx  0ű5E"22ұy=P*Je2D"1:;Sqd$-hhhD"Eaqx$$'j:CAk||<jkk.cGLQ׫4"1ղOtN]wm|aX:? UUW^ۍFD"z{ƅ~BqJoH$ZIDDDDh.]D]]}qA@UUTW@&#??;og1rBn?z6mh19K.\>}&|0=n ԩ@ t?t0{ZuTkqxm%z5>pgpXzՄ;Q-h<]Sh4r\o*PQq& >󣢢0k,Tj\T L6ֿ`:1k;o$RNȑp:[yD"D"fCWW26{mH$xO IDATyQ\\F=zo 8vzzz0o<.=^t9F}d Xv KDDDD7.v9KDDDtr88~ 8$'+hh:@$sʕ*.Fzz"##kFkkJKp}̙صk)-`֬\确FZZ*RJFKK }B`f͚H`׮Ղ7Lx`ݺ8t0;">>jR{Ϩ)--Ass3;jv䇯K.A]]=F#zmCLj \.zA%%%z_|qC7s ҤD,_NpJ22a}())&r:LIIIR`& Ia0t9xשԧT'"(`PFEJ,-- ⋓0DNNΘYn-}=444୷QXXXf"??+WZ^|;wbƠMA|25&Srss`ۡVksI#;;II@CC#zzL(,,@{{[oD0Lhll֭['H$̞]c픔ĉ/ "zZ(/T*.f͚2 Cߗ-FWWW6λ˃RɄf\n[Ez1OfNYt f3*+/c=׶{PH$ذa>h/*++ށlCCTz9())Amm-{o AեGkk+}o?{ӉCB__?jjn~w mk-72aDk詧~ &N j >~|~tw Vn8.ƽnFVVHII^ZFkkR>ee~[VTVV"&&sKIIAaa!jhooGcct7 jd%"""tBCRA!==[܋DGG{9s00`NFtttr99NE"JK[Hv VcՅHY:w8Zv+Z---DnnP-Gs(7 C7zжa((GKK ϟhw[cէXTjdggc_s_BX۵p550zP^^०KV Z\1sC7RZz˖ՊNt:::T6|֬YjBFFw{ZVlݺ}| nc``*h4CÁ `u>-$ -T*N7ZZZV z dd42lCF(ˡRۋc&{D"rKoQVVס >]zCD.=t:T*5Fe˽=0X}uZ*mmm(--T* I ՊE!"""=z{mtvvB̟?[lph6"##ى6g{,tN}m[[۠hUV}Vʛo,ĐdEDC?>sϽ@Qcs6Pw~'(\p4Gv;@Sdh2#G?0] X&{LSrݍ(oklB1Dv}}}CMD\DD7;8|~cioX,BD"X,l2М(\k007<zGL  cF>|u&;}2.L +&M""A 4v#DDDDDDtsaycbZ 4ǜ>a&q M""""""""""L"UL__(DDDDDDDDDDDDDDS@M""""""""""""" [ 4(l1$""""""""""""@M""""""""""""" [ 4(l1$""""""""""""@M""""""""""""" [ 4(l1$""""""""""""@M""""""""""""" [ 4(l1$""""""""""""@M""""""""""""" [ 4(l1$""""""""""""%*3]""""""""[hQb M"""$))q@DDDDDDD3@ta M""""""""""""" [ 4(l1$""""""""""""@M""""""""""""" [ 4(l1$""""""""""""@M""""""""""""" [ 4(l1$""""""""""""@M""""""""""""" [ 4(l1$""""""""""""@M""""""""""""" [ 4(l1$""""""""""""@M""""""""""""" [ 4(l1$""""""""""""@M"""" 3]@?6mڌM6s6mڌW_}oy"""""""YHgDDDDt566~'ؘ-t'Ѝ)]fF#L&t\ Ʉu)/~ˀD"RSS"LK<;">>~\= plڴ+V,R@c=}m2QpG~zfPӣY|م!-ShZn܁B^,DDDDDD7DDDD݁"##100O?=p]͎>c EԴ3nʫ;4`?$ \.nmu.g͚;PTT}pءRiPUUN-;soyyB_'"""" Gv6vNN n GK{\%J%Je刈C.t:bIDDDtc5CT{<8wKz$''Oj ^{n@x 4O>BOOs o<6_ս~ӝN'v|ŊX<QlX,Xp:3]I!/n6T*BB-'Mмs'"""w߉ C&pg3]4ERR"C)J7_v`h,٦版fbVEgfo9s?7Ӊ^3:;jX,3]$"F 4n!zOW6o1Xb`3\:c˖k7kf,DDDDD000V.=bl@y#00`CWZ3]"ro~n̚R`hǿ@UU5ڑpݪhhhDBB<֮]p^39 X~-|9sֻ{T*$`Sx u"##=k| azƠ GG{{;0ʕ+]fԩ \pF())ºukGbԩSPP5AQQ!VZ Hξ}޽{Vڵp8طS/Gjjjв|147```)))ڵk|]]=\FNׅD`ժۑt?uEbb֬Y= N'.\YrG]v"qp+FӉ^$$$ 55˖-EqqQfs9X,V䣴˖-Q&TXG ǎGKK+\. dbLkeU8|(Z[ EEEXpfܞ^EFFhZ|)tww#''+V,C||،F#z{~G (?*BO :"11qCD!@w`w{wڵk `;A<=t3OocΜҠ^߅{PVV 4Oo^>V(55_}{:A}}~d2<#xGG \YY)ߞJ׌^Ooqaf_ Ao8r )|aQ[[xobǎΟ˗/7ނ\.Á@mm}  MqVVϼSss ~ӟʕe/uggz\l ~7P\c0Aebz+zRixkU_v⥗^FE"oQQc {L&úukK/>.0$""vtwwfCc"eD" jb轚fCRRrLB w!-- ۶mwYr7ނ#c-O˖-EfffX|ϼ:.zO@!9Y-[E~~R)z=p%,]oݻ_-`UXd1QWW?܃3g;v|:~@II1-GaapgPaT&qmL5zZ>oO JPVV ۍK*;`0wm;xoJ/~5&{?o}977+_"$I4}xp hIя~uMcw߅5kV,?/iTT\ /ܳcԒQXXe˖صkO$IlhSeYƮ]{?:\R ̧}DDDtZ 9οKRd-P(.OEJFTnf r|N$EVVfk6":sWb`DYM6".sc׮=׽}#߯G^^.T"(%%?ٿ|_]ȑ$?`jSNC!%%޺i_~==<#\.o߆/hމ.c0`&ٌE3 ??]%_G[n4ϱLP<0 .kiiA}}CD\g6Ti3g>Boo_xG^֭=аgOyuXl)1IDDtlc3EQDFFO/@JJʨp RRR0}z222 b@t"IDDDt8t0LP*A5 ֮]aϞWqq?Xr'ul!)onnFvvVJQWWqˬYvС# SGrKJ}[zmma2w><#?`70|WC _Ž~-[6_E˯~L^8vދmnhc<ŽN"dV^XII1T*Ԍe˖ٶ~l~!ˮ! < [nvq+UVb;'GY{"""9NfJd-ӣz=LD?LEqejbI4E1IDDDtu\ط@i==8whB`⽹eܥr7|ʔd_Ft:QWWt:8yնH]t 0mڴk0FSS3t0L0;qmZwW_{vlvvv@IA'^z!3vÉv__hw}íނ+Wb!e~!8ΐ/ 6t< a0<Yl)r#VDr4ݵkO@@p=nf8pC!t3EqDDDtzx˛5)2233$DQDff&8Ak$͍D[$"""t:?~?ڵgmMVVIBݻ7… 7<%[sr=oOO?a߾ .9x>먨<Նx _,D뱷3g;(}$IsCy~5d"!##WBu"(-8**._~V x0w2R{f={ϟ˗`r<oT{vW_Guu ~;DnbW/GũSgpifNNj/6m;v/WI&T:Ǣ%Zٳ̧vyPǭ~7>HHۙ&n?+S$]i4墣W~v*ek 014nprܳ?wGvϞr<00`'p-q:'tWvv6aԄUV0te߾(/A_;֮]4MNN0d4N9ǰZmXv5~!111`Dg ._]v'?~=N<(x景㩧ɌszlOh4رaXzUT։nFEY}%I,Κ4 A MȀ&(\RFƜ~v *joo]H_ [ 9\_k. e.O6_QQ!Muy@YYi`&n:,5h9od2رc4x䑇v˶mw@I@}}g^n~mrSfٲ%غu EUUu.j {7>YO_uuLFyzX,|T:Ǣ%=nPSS{r=n,Yvӟŵ"""jf ذa=0':\z/f[B….?33.t&\x 駿2Nd-;L?e@q̠q("-St1_gvKH`65558\BxiP;dڵ|01f=V I2_wZ$%%5z~HShsqg2ɉx OONh j""" !̊p}5Y233 b`f5M&SSQ`@588]CE%Fs[~tb_O~3/ǎϿ'.{ƌ"_g?7={fWT<mXd1෿ԩ302>/vcÆu >m^oW ={f===8tz iUн=,]+b00`Bss :;"jCJJ >xI>}Z8z~n(*̟EOAgg, jjj⋿O|:wj4 HOO0MA4GP[[ ?˗+1cF-ZѺ_||\P|e4KW^yUUվeq-0UV⮻<}g翄/nC-jjj#nT9Ǣ)=n_zO8q= ??)|ATT\Ͽ/LDDDSn fJ̈&'6C3vcADbDDDD7CD"a:nc׮=yU*+_, x_̛Es7v<}韾3~S(/ߏA˻{3_xݢm͚ո;s.;w> J%%Ũoo|ks07{W455 _ DQ@RR:޻`|s}w / /eD[[[>#zwS`{!"-c} 7X0kV zOw߇N/شi#(lp>8uoR}.**ķlмHJJ믿s'( 33zX(-q9mZj/G?)N:7|o6jI[f5֭[{MIDDDS,˰Z!* ))Wjvdt:KG)riZ}ݮQlSD0d[eE:VX`Pwu'23310`Fbb"VXg:x9nw`Yذa]in7**."??6mDVVָi-COO/V 3faug|SDee%f̘[n줤$wp%ZٳgaŊeXEk׮}8AO/ڵo~/HHOOwhljAZZΝ';|yyy0LظqrsssٲhBybRx~7MGYY)zzz!I2f(ҥQTT v;N8R!2Ο@~~֭[p,R$%%hi())(`pݎT'?~QRauXf5f F#l6;v;221o|Săޏ80T:33k֬ƌ?qmmömG|L;wXjoFs%&&ɓ~s6&''cǎ(((b`nF^^V\/|)YqNэÛ߯Utjfee^'d A/ 6c-ʼ "T*DQ ~ +Va,[ |g6hnr3 #s6)'f{qDR1ODD[ pF:, $I$vKZ$vxh&?6vLfMnIiC8]؊vۦ9m. J% 'Q Yt:t=טeeP*c+Wr B1 jBV_lmm(*hPE_`RUKHC塿Rϲg_x?2%.H:23`csïF&N MY3LX L\E;&&W6f"˵?(NHۦ9m fQ8޿lRRb3@T ))1ͩ[Q슍-DDDDDtSzp8HIIl)t8#'a%&&v:jd@h*`@&͛o ض2;(k)"3zKH,KS.Kӻ(1IDDDDD… 4441Znh\n{q4b7aޠfcc3$IB$466Xd@||&D!4n . v.+hn!Iv;Nd7`2҂>d7eJ>ܓݔ k)Bhڀ@ NmmDt52˴Zd7A4DDDDDt:;W 8r(֭[UV۹455GA~~ukӵ$ ݔ+B<ш={>|Slx&MS'Ggu,\~@nnd7"4 """Op0== V ,B! /`HOOJ(`/) 6c7;3.N)KD׆M"""ȕ+,\:]?Q[[ Ovn8J'7l&("Jx^ݸCAMp:;!ˀ, @Ywr% c6I63AMKLQ&Z/V]]3M# {'g.(3/e\\PC/OPQ~̙G-:]?Μm ,=ٙC41C&Ν(. B6X,$&&[pR_Gݎ$ر=`XWW'èL> ׯ Xɓށ>ũ c֬tػw6lXAΜ9\HKKCYY)VXQԌgϡ FZZ:,ŋ]Pww8˅Nǚ5ǎ+lO˗$577/g֎^2RRRP\\˗"..$U RRR0w,YCGHuu8s,-ŋ.CG[[;Ξ=Mm)0Lr0f!)I,[A}7 2}N/^BUU p8t,\s-UUU-!++/ M+2jkPQqzj )(.uք=ΝG{{;'RSS1kV1V^tyYV?~#%%X~4x<ًK#TT\Doo/, 3k׌QGGΟ^h4… 1cFchmm-l@~~^2v܅jQwwΜ=X@II1V\|™3g Vp:#뿲|?tX| f>?3lYpi⊊r*7&ykoqI455b )) ذa}, ?.#>>3f!++kr7߆$ؾ,ro{,c!P۷oCJJ"""35Q쬡k^ WT"1Q \.zbBE(#ffee?4n, WT9sP]]&zOOl6[Ȭ'I =5{v[t#ovb``M"rԄ&̟?~[ `ׇQxhiiAKK J% 2zzzqc{4fPGG{o'l6;P\<:/_FCCyQKj<8p h4 ĉ8y4 --aXЈ4_@`0#A>}tB>0 rrn?~ xGT=w<>Ii݃ӧτݶ#ҥKJ hZ6TTTC}R-| 7,yގ'OappHMMEoo/؄'xZ6`6ܹ 6 C= Sv[T*VԌF,]$`YMhnn$$$4\DRRDDtLJJ !Ù$@$H͎ȲL"11 qqj(J\$rpb1oho>3E f$""" d2qqqᥥG hWBB>Oĉ8q$6n $ |&޺ K,޽| |#mvJ}ɽx7ڊV{=(.雾o6._ "7דUmHJZZعspI_̙30s hkk o#YkntX~VX[Yקb(P\<34Rooz477>d6k ͛gϡ&(b999cfiyʕ+hBhZX6_[lFRRb\.7;ga';.^̝;wq[ I TT\Dee%JqP7LxwQQQYJ|n\|x䑇 VFo[pߍ%7xݸx-Z\pxPP07s8t0eˋK IDAT| .;nǼys瑝ށdoڵسg/x 8q$23p]w"==7j^sy>l6P`EO@! =zF_̿ĭA$A!B@+c* qqj, }hfG9sJ[{Ο^yٳgG 9NN) P’%/f@~~>ϟ 7͝;' ׎ήkX@WTsa 2}1gNYxVV&VZ1Զ3#`|@uuuиjȲ&_0/}:s挠Rƍ>.-5cFQ Bj83vppǏD\\l j喍,>@^^nP @a"%%/ b|yL&,_4 ˖-E^^:::`4].(*cv_0C{v 55z/_$ ~x 31t~*s=G,KؼyS@vRĖ-RPYY5be6+"͛ ZappmmmjkV;noll ;qc=.N͛=i#Ϟ=ٌ=ܒ և-<@{{NoFcc#f̘ `pЉe644 -;l/80mZ>RP(T{^JT#6. ٙ-9Y\3n hN'<7g y"L0kzn/^0s 11 f9h|`RfE>ڙ){A!paP<"1uMzz:a4RBYYi 7A @h22/^рi򃂙2}$2iӦGFFL&/Settt@V=O/e444va֬ΆJFmm]@j}7y@3\_)))PT0L{xo[\oZƌ3 In47mnnDil̙欩$ j {""7͐D~~.5ALj8P8;a wf,t;^"KE XE1jjjrk!kfҦ~`(-A1KPd8Hww|}dZQ_߀n f24~=0ʺ}0ͰtQmۂс===7o8lfBcc#:::`Z18^9."YKmmmxݿARp:ϟ3gPox?n)镟e˖ܹ 8p <\̙SsdNpǬw~_l6Op?jtC h"8ǣaR(HO{}~FT"%%Fվ~9! g֬MHJJ$QV6ee8wP XɞoRTWW  %%~NGffщ,Y$*KDDt󖢕e !! 24CejVY"Ll""""4, t͌3Ra6\==Ub(vb6P2@Iҥ(/q b 9ΛBXZr9jOγgEuZ-)${^l55FFF) @~~>\A8pзOߚ .]]3Dǻ֭[ 8yZ[B7ʕ L&\x1xǣx4OZfMxYX|)DQ v;wEE9sFPܹep\(/e[Mu#KÊoK`&fhݠZ[`2uZR+W]]=7W^:`0p:N':::vyEEEGSSzfb-P+q ޽.]F^^.l6;aQVVP~pĉ_QX8n._PʕJ=z :]?5O_(++Cuu5^-FNN6dYFoo|* s攡Fkk`x rr<Ϊjaq8zz=M_pۏJ̚5+YYȀN/ gφJN׏q-ȑcEAAӐAh48 v_PVVLsdfzΕZGNN6rr}jo@SSS0s19ֹpp뭛P^Fmm ՊN(Juם=qz/g!))=hiiA||9r:1(V0IDDD4&ЛA55٨Fmm6o xQ^===d(eeeɓ'a0LL܂jJK^ YYY8t0}يɸ0(nRSSp=;Atww0{QUU m8z\Bc4`mɓ}AdP(- JRXV8q C 1;v܅w[вjJ9>,}ͥK9u4-Z,++šC188/ZDQĽލhmmŹs„ 6nQqUX8f--hnn WTXl)֮]0J?>,Ν/(\MOOCi,466 Й5k6n\1ɹp͛l)) hmmŬY%JDD!o# 9?#axr-VOh+ܲ"jzC#7rf0bEiG~VaDt""p_EE}ܑS=}xIYv!I,$ɍӧMRkbd2!)))h\.dY*%p`0 55%d6b2`ZQp@ReEbdFĐː$ F. iiiP*~.r  "rN'~Z} qa000qO#nfX6h4 jހ8$%iT*BN'2, , T*Zh"9,0 p:j'Y!">>nlV'? ^8ݯ#^QM^NN~fio9 dNv C2+"""""""" {{#2$ M"""$eiDʼnR( p\ZmׯDDDDDDD4iV\.Dso{@C4#-0kȃM"""(RpR  Id7&$I CDiB%@ hM@ EO_ާ1YzƦ6)M $ DDDD 7TLQa`4LJhblM#3aĽa v c@h dz4Ej h4bNvS(,+F#AZ(EE},"À&Q.;+b@POǠ& bO .7>;)'DDDDS e98 5  (@E(J208Do. ))׻DDDDDDD%Fz# *J2(9\)r$ Ā&9/@D$ŋBЅ t:a0p8Qd! """"""B$`١Px23 %AB!4D2"""(g0tA( P*B!fV+KMV--CLqqqP*Eϵ7)=;vN`$"""OiY'R(B?{Eq5=8zo*RQ+z].非vS~ gGQQTPD4)T) HHݙn2ْBB6z>y$3w̾PSOo:y^9EEEHW}PɍUog+((TVVe;t:r-2=\f)0$!%6Tq*BM60$CxU\\,XtոqcD3-0 (;;[!]r:r\_ 1f*켚&@-*`[W14 cc2 xxe/ÐnbP44e< up^i5$ttt:sb< 3B!eU 5};)4d_vlr:Kz8pP99BK kllKMr8r8߾|ef}JL4@efɍJɜvdjMl6Ci+tt2͒fiRiil6U`h%'%m˶BLMBͲveI &@j7|e@nM6ڱc]NO)??_=o>6zӱjҤWo_$)9Ko> CϮ.՛"}lnfժUJGD۶m$nݚ@zV B<ծ]FDڵ^~e]#/n^Ph@{]tjѢ]QQ{}y^#/WBB,X-[pnk4{pSN ձcJtPfV^jܸ:wOR^=$q`uYŚ7o6o,ݮ.]3ϐkZ11A;={hΜom6sN0z<ѿ_~~,Xի(++[[Rt9Cp8}LOOל9jm*,,PǎuIԷo˾Go8`Y_YK/DM-ieVUz^ŪMԩ;\\ RSS7saF:tHZTN4d`j*~;vВ%KG{-[u:Թs}f\f}ko_Koҥۆ=[۷s˖Z`yԵkW/ KɃ.IZrVZÇcǎ:AJII&עϮ]=ٓ}XIIIj֬zꩾ}qa@]#h@\.^yUI'{W5m嫮R [e;w-ZlŊ3tw?˗O[/kK.H3Z`ٔ1c'&&FC^hrt!@wz7u#t=wi5vڿ?+>h~6vСC6 \7xKÆ]>nIRqW~) TӦMeA~W`&O"~Z+Izt7+^6?/OҦMf͏u]v٥=NgkMu-:u$biӬY3Ki/U4fcZgq^UKYk@O<_ 4UOXwy8Z4٪U '$Iҵ^+~?J+f\^:Lv}{ꩻ=q{ɐY\\q1`o\~,:g}&d/J -]id0'O 4MM֭[7 r֯ߠ'&O{ҤWf͚/)lPl6v6̔]vOUkZUa^ff{4w꥗&rG;aO>S9v_|.uꮻΝ,cccս{7\LmڴIquWfMe۵kWfR{ҡw_xaƎw5?~Ə̈́ տ?E-af~}u שYfZ~&NlI+WgyRRHzd5jOV˖-Ըqc8pP+W҂ ̘."uVR19|~K%*Ͻ{Hx<KK$;-afΝt㍣Ԯ][,m۶][lU׮]<*M(%ƌyX$)77W=jٲn駟oqRI5:WofIϗ$9NMTcǖT7իWK.H4g\<[>ו+\W_}7 מZܰaunVz ˺OP@U٫Siˋ/6'1n%̔hw߽7l(OX ,/vکsM&$$X_5l?{_vp|O||.R˺nft8v.{ذ-111beݎ;USQQQALIg_>|p]t%4!և>}zQJ?K߰Gz-6jhiꫯiٲ>)gӦMU¶8]wݡի+|>= qk;th=dv׮T_빀cl߾ݲO8+-[Z_Zy͛Av?em⼃e>F0w >|X|3f߾ µKi¶ҥ_~b6u4mٲ-`;]PP7_(##CYYY***[oFƾjO]>ێZ%&&ؼ{r\:$}رc-5G PG@YU\.=k,y#W-ÇؠXQQ#ϑr:+nJ?oj۶0hرCT|W;ʲ_SsYkmB]k111Q31*\g]^M zz4@[tY>\]wMUQF!`cbbڞu֙a yO|fogUK=f47'2ׯ?]_PP;wۼysl6hӮ][=52m(yk˽{sy%n*Qa6׭[fX-&%5ycN͜~cAwtte8CyKXwꩃ,aJdPx]ׯ\.y֬/}UMuTfFGG Yy٪uo.K直knk׮[t,j2,@M&Mzҟ~O=)2&&FSLߞ׿j}ڼ5y]{5-WkDH8﨨(K%K5wzQ~~uRq>+WXahٲ:ݰըQeyo*!!!A7x;_Vqqiڰa-[n?99wAA&M4~Jбc߹8q_`,NVZz≧5o^`y$Z3QMo~ޝUVv:th_}r͜y]sU> }]jٲFB~r֬4p:眡!_tZI5z5ilYקOo]~MTZ[o뭷VJJ╙_fS~}ԬY*g$>3z^v ?a.Q׮]CIA]wݣhy^KJ.-/0^'nNF]_U 7\ j_$I99O'Q˖-dٕnZ~jSԩ*!!^}:L},{ッi>f9 O<*{gZ*3_̑\Νs饗&f)))IvMYYٖJA MfÆ8qy/JƌyXnwP=3vnV]A}n˰_ =FC }oY竚\dT>*qck%gywn@a~~-Z\k.|K5aJMݭ]v+SSS}vR=zpL_jN9ebei2 C˗/T{jݺuc]pjݺUλjz-.\hLTvvϲ:uc=Z}&8ڷo}T{?)04cƧD4t? 8w q9s[v7ѪU8K]wz?.KF]?OV\***Vtt4IVtꩃt駅}ϕLer$KMSV߾}z G-m/vkOgjڹsv:v`[qoІ ƍ}v2 M_(I 8)S&W~AJNn:0dy4k4dpc?^g觟*33Sa(!!^Mԣ4hZ(tjꫯkW ëVZ餓iԨv+4չsg-IwN=ufT;vùj׮:uÇ6mTx-\Z;vP||N4MyLejr-Mc#ɐ-m6,}oߏV6WmM@k"$*4waPmyj}U6Zaojr-+]+E bhX";Bm+Ա>XAp}lAU\gVMſ+dZ#Ii8mHڵk[]A8t M6Ԕ#ɐ-m6,}oߏV6WmM@k"$g}wGWBB@0,E bhX"&E bhX"&E bhX"&E bhX"&E b9iwx6 XIfIp @M~ &N 2h40T^p4* N%'P4ꄘT_eemM"`ɪ G @eʆ w]1%M&*܍au#Eae}vULM  U 2M .1cI1\Ya-@"L0K5zeLӐiJigMD$m6lvMtMvMiP},|i0 y^y?,??fM,_٤blv9v9vдTku@:0 y<^y_o;n :` ÔaxU\\bWnlrMz*WY\)R'..NnfaaRllEE+ƐcWmR >M,XU ##4eە/Uo}evb:tl:N\Nl&&PsGI Sg^CUF\.TXX{v%,?Oiz***arJHHbhY(4ѡC{T jM *0+.Lks IDATǫBy^ƪQDLݮF+^ZBb$Pa*11A11Wpbeu!Hib[>M:P0Pbb"a&=UXX(I"e^Q:8L1112 rsTTT$.: &PuLP* 3 Pqq ÐR\\\ԝ8.w'(954jI0 y^y<y5JnQDyFwPSAMn&@-uQFXaqF2ݮƍ0Jd& ߢԂP”Uhxz 9EG3o&r:^BS = E PUgz<2 oJLLaxTJ@EG(Qrzzevz@qݲg U&@->YYhIu&S ϗI&&@1Ͳf2M)**ATTLS?+a 8-ܔ<]i$CNSv;ntJ2J+LӰ|PeF z=2MS11/Pbb-G F P|CǨBdYw}w ԣ(LS*4ML 4j(I Ðax%r8G |7`02j}PL @64K~?7L*ML U#acLӐdfw@=*n@ !u凞%ںurss+Ѐf %ᆉIꩋ!w&MC/z@FY{ >RC+VC[n]U #P39ǂHϴaFIwߩ*wM0I4|e:괟噦PVWԭ\k.(WNNrsZWU̝;O˖--&&FmڴV֭Իwoi_OXcǎ$5iDM$+=}~7%$$kז#鳊$yyZd/^w)++KqqJIIQ޽5dj۶m}w;G^z8:LS@d!'&#:3::Z}$Gteê߷~>\.Kw}gj˖Zp$wL i2ƍtM4bp\ZGFF&N, GC7pTCZZlqGg)LԌjʔ*;;'h k„ui;մiQg0;M֒%Kq&p%CW`Jkkr=M:TvrS3==l=3Gl6w\wLРi޽JO߫̒j̪4GRz^ݻWyyy%uoa'O͚5J=w1=߱y?_7wwƱYW_-e˖ֿTi+={H,Y 6i?%ڻw222UPPVXӀ!TPPLݻWuGav]y=Oڷ/pV{n_A 3}bJٓ={(::J[Q=uDžw-5tYS^^.\To>j۶m.3//_K.iJKۣ"iF]tҩPWʕ{wԹs'}jҤILZZ͛;vft޽{KεrPڵ+ysj˖-޽gKVZ393b}׊y w^}ReeeM68p5jdjɒeZrղe uERi\ZZ/^tedd*..NݻUi8q&-Z٣XuQVgCTYZ˯-_|/qJJJ HV\$ymz8Ս7,437@\pTKKKTǎugoU?u?4'yoU'iCXK,Տ?+&&F:א!gE!TBBRSwkEzԩN:_Ek۶ڳ']EEEJNn6mS86dggC+U (;45DAA )11Ar@B P /@ ܹtUgi_%/[˯he2 #w|JLLkk-j߾~m^xE>\6?4}mGf'زf+F讻nWLLF({KZlQkÏhO=/r޽B=Կr4d`?Q庙1CKG?֭[֭[G}lSO=o.uyU#uݶ};zmO_z.lX}kCH^tŊb] 4k{=өCϪ~ԣ ӧV^~XQQn}L-[<ͫG:keʕ4v8˺駟j 4̙i>ԉ'hnڴY>?-oIuU#~ ;m۴˳m1O{w 4n7hv*pl(**RVV !fɟݟ,ml6[ 5UoB%''vwwBh8@$ 8uIݺu[4gJ`ՙGDIII߿ZhDefײeo;4{9=c!6m,ͦ)%%Eiii:GLLN^Wm(%< 6iUZ~x!TEEE=NIuiYɵ~饗(77W3f|*IJJJҹozMp~$mݺGߛ~h5JMݭ<y%I={PϞ=լY3mڴI ,Tnnx!=úKtYW\1"uܩSjsy31y<mVzZj-[(3s^xa6lب~"qMPԭ[Wq:uꨌ ͙RSwkդI-\J=4FG]vѹU-TTTL[^E󕙙) ʇ3::Z111rrpn/0 y^H~ 5,,,޽{Rg8z4~.m޼E?Nii{*¶mۮm۶=/`?N2Q}( Ћ/i>ԗ_~kJݺu ڏM6o:th_sp\??ܹcЀc޼zs.͘񩮾ʐ駟jYkW|a[ԪUjqٲ5+_R'1\\p~͝;ON;5c߾}zgmOJ%1SW8LrX'ZxIȑWXBANK|3OKۣ'X~ﱺ{4|H-_Bz'>\o>{Csڵ?+..V_ZM6Moim6l$ݮRÇ_Zl֬?dܼy :Ϫp+!,/GԮ][=ģlK5fmzה-k̘1kԨƎN_X:3%v{GK[nl߸俁^N$w$??0nI&jӦ5jTQ35j6mZI&햰ȴ-wI&8p"*nt]90mgv]tAns玥}M.CnkٲʵkUG/ڶm[3u4όj*((_O>n{hn6%KJN=ui߾6mЧ6mJ5qVEהnݺI-U-ȫUUTZ̑Ĕ<ܐ{F*(()pnw!U:grwmF>111`|˖!@^_UΜ6m 86)33tiզMkG*11AmڴVBB hfff00,ą^%KiӦڹsڶ- ׭[ݻv4tU:u6eff('瀊yI:X#H[n޽~j֬+탯4^z?Qzaw-Ptt|TUG{I A;Z+n^^kEzCs:}:գ Zn}pdzuIIe_M*4uUE5+s$8IIIJM]Ί|v]II5w~X;B?`QSG9D ;v{nz-á8\W]5R?ݧ뮻Q'C7@岲UMZ 2˳JIILl6OCaԼy  E!Ç4wQo)<k֬~a91SZyZ?/5 S{/W|p˓+m,-[o_nԈWj4D~iA0=._ 5n܋/.. zWSNNfB3g~!ݮO_rܚGH>+֏kZn6oE>DP:㺅~L˖-rhmڵ+yTFve󈦥U; 3? &_ڵ?kڟ%MVӦ)ak+ cDvv Յ 0 h~bbNI{ߐB"eggq=\xԀN"Yg/ٳ覛F0 ͙S2E4;;G7|~m:suǫsJJJRtt~ڕZg7 C?Ν'I8dSݺuS&Ɋk}DSPP2gfЬJU/\.nо};nSBByJ۟pD==-]\˗вe˕W˗+]#F s~VGZ??~oe{NbvlI&a@(]B^Zr Z%HYƙN؎^֖CbYc9%c,ΐӱyGX,xp&8p@ttt`h.ЍM} ܳE hBCűc'؄M|.[K """=[el6$&& 鏘4 F(֚P>&doO%%jhllBxx8͛u^+W_}9~aOr mرcA/ sv[&>>q+** n#F;痢`YWK.ƌӑ{6믿#G IHVEJJ -[:턄`Xr9$I'xo]8C?j:-Zaaahoo[okGhh_ d2na弍PUeqE%..juz0k VT\GR␙ }wֆƍP^^;xৗkkkL/S$GFX444BgkM mmm 47Ӝr>W\nǏXc Z2~xuԐ1Ab)/thS}SLvvi?|Zw0<ȃE&ӋW'3f؃ {W}ӦMO? tv<{6P=X.vZG{s9?j|;ݿ~W^^ilݺ pkl]uvz= 齋׾M_Ap|g:MNN,E= O_;wУ _"""t:zKL-,, aaax5l= #t: "0$"""U]nv XfU9>$yo4QSS 5ػLwƱ~綼j۾3;v({6_]t:~!SppkC\rwJOkٳGT}vwֽ=[FDD vե^("2ҾEEq9w'Əؼy y^ۏ{6$<}\xhmmETT$n11:tvlom=L^i|VK I IDATkq-xfVEk)&&(z 3=RD(h]aV555hooGRREƛ2eCo~tzTTT`˖n^)ܟ\j zt=gϞws;777c-.;v߉^+N8Fl6X,>}O|E8y6oނ{ ~1tuua̘d\Ʃ桇/|-:zF~CݯM< l6 ݧW_y^{/~\b;jłh^<_>O?%%xw#;Zjc0`0L͆n^xmȡ`hwDOC q?暾[gw߅ݻ[|-[>v#QWW3g6Vo Ǐp ujooNj/_|m޺u7ލ7ŗ_DSS3; …J/56oނ͛@T ,, Z6ܟ-Æ / ~-ϓ뮻FG^o^ &LZ\(,,Baa7/Sz~yC@|[_j0~GG[[~uNk_@o{ 6O>ي&FFeEQڵj/:7nƍ\rOp㍞Hwƍ8xs֭[\ƛ<8r$;vŽܖk#k{8xf3D[,+{=DDD$INf* Qd4%I q5u:T* ~/۶;r[F1M^ӼDcG^ȍ`;""ߥ S$B@f$Π w 11}9=Q(--!(H硬SLvk6m \}-x"$$$:]c$cy~;3f -Znee #âE նFL> =nud2M92ݭ%S'#99ٹLXX֬YQF m0 ZHHH̙3s&ǚ5`0с.z=BCCnX{kh)2e2_h4j$''kVgFrrsz (,,BbbVXЋlsu):믁j P*HO3a |KRbXr"##ݣ tt /Ú5.eYn[1`@HHΝz~Ỳh qqq5k&Lp}X`64 Vbb҂6XVcƌix䑇p9Ǯbw8y211ј3g6ƌ8ޓFtSFVqqqΞ~w݀򐈈s@Omq3ԌZ}-ZGG'Apju BP@91 O?k7=˴ Vmfx4z-+{X@ljG7'" o_d&fjAf:&p6uX,嗷㒡xKhIsMV!p3pmwwu'B@9fk98ѥ$ & 55.Aj<ͷX(((L&B&umx #T*9++ 2h4d"DQ#d+R1 /<:zMcz?0BѰa&m1)a@5}| S{@DDDh49v6$$8Le vCs8y(p7QDDDDDDDDDDDW8Gh4{iDuݱOrL 4DDDDDDDDDDDb1ZgJ juKJ$ن]+MDZ&@(X,VP R9L:Dh{VZ%I 1e2ǚ@h8""""""x`Xw)DDDDggzMmDQtq_?Vp]& QQ.hHix 1%I `[ d# tmhl6Ξ:DM"""""""""""ʴwjxڤab~(1$"""""""""" rgO&?CچAN=5.DDDDDDDDDDDD.Wx釼 XQ`aIDDDDDDDDDD@J~!SP?m8 KXQbIDDDDDDDDDD@T!@@kk+,bYp~(1$"""""""""" JrA@M@kklmm \B\.g Ma&Q  cmmKscIpyfVQ"'DDDDDDDDDDD~;h4=ۃBQ*ݵ@CZ.q(1$"""""""""" PRAr5KKa]*l6JK˝af2L RAR "'DDDDf`0d2", ,<_  u A 0Lwdr; d.|@444W_֭].#XVTUU'Nīcǎ}xQWW?^qt$iH?z=jjj6""">4 g)BMDUU5Zu=նxj,0#wDDDDty|G>bw Xtejظq[!!aK  nCyvtt믏t("..iiΞVCHMN̟?3gk=DDD4|I\m ^o$ $;@ "1i$ iχL&Glz6P"M"""o0\YV455AEƺ<^Y:::сPгblc-//GmfEDDF Z ^N7 &e_sB>پ$ VuAZFXXZ[[[iML$pILd2Yw)j fTwD4 4LwYY]]v`41aa&(J8]5GEE]/ɵY; H Idp }L>FcQEqPklBEEew)s 571[g c 4(/ACC# PD|M E@R!66 A[ee둖 (..d\.hCM׮gufLL J bIDDDD}'P]] фٳgA.INCZm ÐAQ-_SSO!!!=z$ϟu͆EyyRs .}lоWԩ<466 QQHLsxW?@ZZ*&L]]:DD{G-[>A]]-`(*:mInk=yK͊XiS~ܬŗ_Ă "=L?zٳ*7pu8x0`ժݶcXyP*X:@~9JK^Pb޼9v[R׃׽dBAA!ΣPӧyuhnnƍ7EUU5;f-45*DD{=ޮ]fd#(++GWWBBB + b֬>8{RnQ?_0M׿w[*kt:X111e^+#77EhmmR@l|&&&x!"0ctաq0L;s :QQQΞq2}:DDD4tCMu \n`lٳ`QłTVVKQ!˺f>̌9DDDDUEE***  IЈEEE%nuԚlݺzqqHMMAss3Μ9|7t%HHH@BFܹB,Ye]]]㭨Gdd$ƌIFgg'P^^Z/ه'NBEDCѠ (**Ƶ׮ABkuuɓގ(gΜAYY:g$I 6M&۶%V`֭QUURXtzTWנEEvu.fj|A 9|V ɈFƺl` .+++QSS;uuuc>zj! CKK QRRoF$&&upz޽P( ň@uu51<̜99ZZgknl6΋ޮ]9ٌhDDD(--wGhhh3f :|GXxbb܃fO|yO2.מ g]]뼥Er;wQFBբU5HKKuY P(ހr4`uL&3QFBEtvvc B͐u=D 6 z$ 1@ppT*%rGb6 F ]]j[ԽMѹ13݃@ 3EQ@L LoDDDDԧK ;{nkk+>` 둗w&e;X,aXqM7`ԨyǎǾ}c.g+.I{rr˷reڞ=P__ŋa)Ï{^$%%ym搟'N@\\fhg}R|ŗ<s~0ޮ]qjwu'>Ç`…>}gؿ+TUU!+k/_uuss3nݎz|A\+W.GV8 @GO2 i8s,JJbB@-=}OR-[!!.Z,V r Bhk2=/*QQQfbpG&"""opL<%3I{:~:::0}TMԠ Ʉ [u(**¨Q\B9r$N р>bb 2Yfqiv """҂3gzƵ׮qJš5bR544̙|DFF⪫Vt믿(̙j[֏Y._*x;O222e.kjjى #22UU\[BT y1n\.… V q݁^7>..IIIna|ff`Z{tSj ?~ wvU*%.] tp睷!+k EwƇ;bwm_ߓڵ׹|sFhh(WSSbDFFW:Lvv,ŢL&s>Gp1rd""#!!{)or(5d2E[g 3AhWzs?Cj@jjFw  \@KK 'UUUtپ7Zm3t:<(>}ergCoa*+H8q/"""[4JhhpURyܮsdQP5s ,ϟq2!I64GWWR.5`$bׁ uxx: X7<< Z-""W_}Ynj/e.ݾ4_ς 8y~}ut<~g""" l`B2&&#q 2 A4zOsݦ3AP qw)D4,JKVl|z AUW_'p DEEaر4i"BBBzmq}8}-k}lx_QQ--%c Mo( $%Ƅ 2&`x$""q$A ZFgg'ۡ` Inݬs.q:n AA*B"LhѠ1-@wK?o; **y?##c$g森999EffV\l3ECB5: EѲւ0g—Z/Û :u @:u22oĈTWW ())RDRR%JK;XDFB@NN΀9z'F8BɄN)PTJ̛76\;́'"q`B7߈(..Aqq ±bR戈h8EQ$IDhh(a0Յ.f36ݞ}{=M8Nhh4^{!oDDDD4h"QSٳ0fLrS*Ξ()){Y۷3fLǂ\Z4:{tl6뵷<ǥrjHMMցfD6 EEP( IDATȸ2++uu(**Fj455!33rv7kZ}go\TUUyqׁ ߹s7`|L> 'A~455hopN{R@_|2,[uu8q uv?`8FG+LAV(&F&X,&X,Vl-6[7=GLG(\.\RJDW~j!"""A8qrFĉRmvTW_bc=Yf}\9hkkr0bDtGe0>sK0s3gbڴn#m6Ο/ ^Ru>cǎϟGbbKػw]^Z550MHKKRz׽jEuu5T ̘1m{Akk+vW2!& #-455 HLL䊉zh% PdoؿZjVDt>͜9Jeee8vx6Ơh04B6vlsgf(ƍ˄f ^2Ƹqֶ߶Sq?Z$%%!11e^XXڧZ32ٳ%@$ }6dgg٥fr>i?nG|VdddWHNNFuu N<BS GxbZc5MDDDCaE&o;eID-4hЄ`ɒرcۏHJJBxxt:jjj!˱zmxw#G"44JZm3Ν+L&ĉ+V,uuHKKCTT$f3P]]~~^p>QSSwy F}}***+EV *++[1vl*P[[*h4,^2|G^S&aٲ%䓭8u*+4 (Cee%yxz>TUUA/ǍDii)ZZZSBT"22'Np+..Ɓ҂#1zhۉAtt4;Bf-JKK>@7>33yy{AFFBCCގ~@{UUUؽ{/"##X,hZ44[N6%=!++99_?`IHNNBJ,2 K,'l~ѣ!q:"5 QQ lhkkEZZ*BCC^"""?ozNBr 1(P0$"""A5~|g^֢9/44:I&gϞuN||<,.cccp睷c8<;朧T>&*UrcϞ8\T,[E+V,wn+#8X4X:ڵ@dd$t:4{JNNbݨɓZi0Aim7їt|#Gz<&iiE6f0kLѣ缶N!'kL5E]w v؅J?noŧVkpݻx]`z;Bӧ̙3!CvDdddիW趴hADbb"fϞdV'9̙36 'OرPV],3RR[aǎhhhtƚ5mv/F(//wNW(6m*νBQq}ecIDBYmwzwiüD/^/XF5cI{H'""1YrxrdT$I$MfjNfѣVHVLfBQ{]Vף $!,,tvv m{m$"##K/d͆vDGG{\;IP(|jB"(H}Yjc}F2-?z=۝R_z {ٌV(rx@"Iى 5B_'9z}/ןedBKK j5с7x XfV+:;;ѨcFDDDۥ~ 򨬬(ʠhA2niO<)l63_Z<0vZ pa[he#"##ZP rbuF(}=_VM&!66v@Pe=NUT>mk<`^P ._/CI}yOr51ԯRv=ƾL&CxxKDDDË#5dxFD&0v BDDDS@DD&Q—_@jj*v8q¨Q#]& # 2h8aIDDDDDDQ[[r b֬={j#"""""h`͚U.@^?4P --0MF||uoNxh0]]^EE:7޸g]7ƍbIذ97}$`X ͆;wԩ{ɓyhnnhDtt4Gcy;w.Jt$ a*0$"""[w3BCC/\jjʐ3X>#c„,,ZrSN}_!,,lo~&!::\))c MMͨājEM8ǎ>9`<$$jEuu ;z6 0 ƻ1t4)oƌIq!3J:ht:ף0buuNwIDt% Cv܍{/NDD}!&7޺uQ0 Gcc P` #P__r2`DDDD'ٌ?CPPz%Vѣ1g,;),,gP[[FDEEbј?.gCa;waNN.jkkqI-8ax|w%%kږV۷hooGXX&NE"${{^ Zu5$I™3gqaB ---@LLml6EII)jjjֆHJJҥ׈@]]=?V+AnQ455C >>g8NǡCP]]ZL&=i?AP}:|I2ػ~;::4yGUU5vރ XV$$%ܹׯ))cp{̙yC8p x-'&&`X,Enn.XlǖvދvsՁzdFNN;fa4,[c+uuua׮=F]] "##ٳg1'""wށdʞ$i'aaw9D4hQF#~( ,Y/2Ͱle>ΝoT*uuugǶmzm۶@.>ΝV+~K;_|%~sBX<={u7PPPl۶g- /㡇ڵyXMl޼ a,[Ξߐ$  x'.ySQQ5Ξ=6We˖gho //Nq{&d'~rs]XX~f@vv66mF6fϞzC^I;۸D-[K/mW둗g.V]w{;<=իx-㷿<QQQzo2כp]wz 4z/cox|$%SO=I=>믿w #Fģ۶}.GRRM^^466!;{"">>feeسg_=wMv jyHMMAII)bJKpbr>9G9z0

andvaaɓ2ljUJJ&O 7 @䣇&EGRzzڰ 9< ZZZ'z~%IK,8 7c;w m۶C~pãJz{{UUU<uaXm6.}]Czmڱc+t:}N>/~ާϿ IFu(3i=*))mfӵw{*-]]wΗ訠;0Tf;P3xU;w=o٥#GjA0~ KP۷r srrCWOh)JO-@+C Lۭ$=pzy&Imm2 cԔ0&0Nh\D.|rs'0fommJJJШvuttx9Nu==Mr}*..$ES h۶*)) i_ۃ{hvURR*544ˮ;vz;2a\`|otQ=̫ IDATڼrM=o5aBwNÖUTTJxN*Rmmӣ^zYr޽o_UV˖iҤ>MMMC4MS:FaTttdX?mI&@h`Tw{RDccP99\=<UjjY{y5Rkk밽B?>7|gp;wok]v{)c+ިrEyB/9sr加S7Tyyy:rX"R^o>effR---ڱcK3fL'>1mQf8|n[d$lVUWx4B͞6E"&F_[uuٕoUsV~~]w}o[ϼ.--cZ"9lbw{oō?iPijZbfϞ &())Q{Fu#f*}CkU^^̱szoh˖RK/]Bed+!!A__9/\$%}뽥ENSQQjfee*??_eeezOԼ=7oTT- }nԹ!o#Hy{>h=:~N*ҷvz[W;t0#>>^TUU~vs}VVV.I͝0Xiӟx!=jjjGmXm3355U'0 oӖ-[eX}_+V,NNN4G_/Ӧ>_BqM7?SzD***?Et 뇽vs,=u4Em ͦ.[.[&I*/c}_oKE6|HW:/־/ve4􈏏WvveX|>`@g;;7G>rǐ0l'Kvޣ斐jp!+(ȗa}~gkm=CyԼOD0EER䙋5**Jyy}^~ok߾Y~L `3xhp;_ߟF}~w'| v{~ܪѺ{]7 Сê$͞]8>C Ly!m?))Q#Rܑ?mmmzG!W{}.Ztl٪CG?.[m9sƈk}KO~^]F'OVqq^xaEIFYY={bbbӣ_ŋd^ЦMSzz /jŲlJM>o~^tkTX8K&LPNNjjjcNr:4i~!mw=zM7/*..7ߨ<*mݺM'OW_)IK$I-W^_5k uuuرzɧۏeҤR[nի;fm} +.{rbN&+/jC544իWkVAAbccTWWݻjӦjkkbn{>~SZr%&&ȑ/~Ç0 ~o p8яޣ˗iꕚ2@YYٲ٬֯dZCnuw 3n#bT`5S555޿=,Lӌ!h{ӣp`40j~!wgӣq,6m***ΥC.y]v|CQlŗ{l3+C$i<=GT{jj7 =oY'&&Z_uwܜMRRУjjjC Yg:rXm~կ{~M2 CWooHbccz=_q׿r=SBBξr@˗kÆi旵o~}s_٦fTTto-]jkk׾,>3c-[<Ϫ>恆$>?oUVV7w7w]7??_w_њ5#111QxlȲt}; 87z۷oTVV?fO.יEտvO4Muuu 3fKIIVcc)"  |w ocpzg[6e#1$Yz `nIRjjJKL!NL 6UTT*//W_jrtڵkpt_Z[ѡNiΜԧ׿vYZ&ӆ ҄ 9r\r:jkkW\\L)롇Q> 7lPRRLӔaX?Y˖-ҥKCᖗWG3g+ԟnQn[jo>kG+Xѣǔŋ/՜9cwĉպu 5;{v.]:uuuGyy䒅z衯_::: >(m/^Hjmmjܹst"~-YJGUX8KъnWbbNE.у~E_7(0dPzzf̘KY 檮^]],2@VԿwt⦅ѣG5e]qj͚USOO4o<-ZtYukk*+x}oKh޼9Zd幹t ѩvjƌg>/_Iҭw44}46MS xjmjj[>0 sXhob`3\azb(**Jab xyDs }_H2h5oo85rd"+FeA m ,Amd4448ZZZ oS|kV2MnSnK.[]]]r]gB\\.o@2< µxB5{ ӧu$_>cGG/{hŊe|yD߅#f}L3fa,lWץOj5dZ8>B }W0j0M`EGG-mvz($ ۭ&CqaZ7T8C36s)?B^5aل;T޸H"EO{{ళ fJfUbbO@W B=wxcO3h̾pPBB΁{S&0]GGּys}z9N{|KaOoS;4>sGX[ixk#`xk@B=_ߪ MRL555ԩSjjjVlly)===ܥ`uyo 5z`DGG!g>"&`e*++ɓlKo<ɓ'>O}C̺ jfD}j[st 4@BpmnQEE***TWWDĉ] ڼIRjjj {5Aa3 çVH 6SoRbF `Ҥ4),]F4=5nq=3&_"yLO@s3Ҹnokt@ @1se =fs5HD @΄lGu8zS m54 6[c^HErm \,DhS<Xxrs rhAbblI7LU۫o@$" DGGfeŢZZ"fKK,3u 5#;ܴl M"LBB"cuuuK&35gh]" } â.TP0,>z c#940&&Fqq>yBRp*ۭRo90 Sbcc2&pw)_VooeCqbQRROPhX 9UTTDUTTpxjFp N?/iprQinnVcccˈ(.KC?ߐ67U?/USS;^q:ͺd{$v"60~+..fPEE7lSS***eg/fll -ظ;<]uVkjj$鮻Tnp^yU8qR֛]s]{SN{aӴ`|ƞF4M=١UVjٲaEi ۚ"[ii)0tQ-\PIIcZg{{=*_1(?mHII w D pJNNVff}.K 2 CYYYC$&&a+99IC/6 "$Rչ[ZZ$ۥTM8QqqqPmmpsWUU,˰p똦)s`,├^}j4:p.1 5;tY6Yg;399)_<M 5\5侎O(&&Fw}WXX>|X֬Y%K YoU.['OKkשT<'j,m$S6׬Y3p8Ԥs3IQQҗi0twAӦM=zŬ/LOOSOO2MCV)Ӵz@QzzyIj3BMK3cb2@CiΜ.gqݒh޼y~LIք 3Tszzy.LΚ 92M4%ՔdgÇ*?&O$0F&ۭ VPLjޙag8F 2p^|n iƇsi,WVӧOWFwM***fhCFfLEGG !"***o~UVVǡT͘1M˗_&?'諸ZMMJIIV^^VZ!WUUk߾UGG,C|XOG>r0?G+&EUnEǎЕW^N&*--MSC%%%*--u]; ۷d233z"x ²V:pڔ$*))7 LTwgm{Hڴi***,uuUYYJTVVCkmrݲX uvv5t tzTzzRSSU__ǏD1%%% )SU]]6n|^k^̡A?'9NfXn#YGgMMyssJJJu1IRrr&M&B7xOӮC/l*--Uii$)>>П)!!Q&MaPmm-s0 5e"Y,nn:~LTFFShl6nz{{PggZпMû93fE@ú+`|ݖϩV|pH .۫tjҤe￿O;w-[z{qm۶f鮻>L}wwwfܷ}Nj+hѥ+++q ڶmr8z߯l}7x{_Uqq^}5sG?zv[nG?z$)..Nzw;j͚5ZdQG@z7UQQ9sfk~Q6mVmm|s͙3{A!1 x dZ5st>|DO 4?1$<}̙3z~W_z{{]ڵknݮO|c~ێ<8v]9s 5iIǏ/wyWsQBo&I[e˖jJJJRW]Vk>׊˽nOC*))o >4lL[wl٪r=S0aMӧEFbr IDATޓV\+V\G'?ymd=|~Ww֭4mT۷P}}fϞkJQQQRؽqjhhR}}̙[=%{h "`/L͖Ff_i}fߏ)tYeދw_dd2 Ohhdz~7\bb0btg%%%E\'IMMˤIڷo۵d"@/^\UUUU*á!ᙤ!CVWɓ4iO#I'NԢE[>^xMU7ܰfJ}x JMMUss>w7xϷ|cbbt osUWWÇ*--M]wPQe>!srr4w aßYfIK|VGGV^4UTT˷Ŋ^cSNlVYZqqqjhh6 vYr SkyZjپ0k֬9wcbuUk#1w{5glEEEa?G i{X喛|zZ,X\IIITkkwYUU믿fJRBBwg =xʔ!Vv@8MY6l~l|pojwfR20h \pyŸ!@EE$iڴi~M7lgCC$)99Y6[cN TTTHҐlijjTWW >F0dbLl^¢`WH25|RSS{4ZkLL;&OxN:kL͞](t{ZuvvjpX,J2>#--UJ=ޔEEEC.:?na7ljj+{g`ߓ׳bη9TV=@.ed k:}x3l`C233Syy?$Ȍ:Tsef3#AllrrR2@<=A555I{yn^7]Nۯ}+==]3f…󕘘8h}=wةC~o=W'*xH}pnn[2Oc0 ͜9CTII7;yH&LPrrf.o'Nz-*]8s?۫bUUUE]]]r:{O<.4MUTTBS]l{̙34s ]yCvޫ.o~`ߓ";{gѢKUVV ‹R~d͛7OSN 4`4M'(..Njkk--[~G~ng>Nae#GfllR'5Ng/PNIJOOޞ5kL)'tQhڻw gky{x >ꑛ;A&M>O`{ zˆk`j .@ g*. 4kkަE.{MJuvv*!!AOVtt1DEv{RRRݻCf灿vzŗРxeggk„EEEp#bbr ݦݫRo{R$ -pwܦ:}!:U**:[wUX^s`xEÐLPRRݭNuvvtź_jImo`73l6pdM4UUٵ|e2``|-X0_]]v>}ZvGxYBKhU!~hn;`6}+O&M65ZC1ĉyJLLTiinN<%ɢY3P55:yHӦMQCC ep.K7,I[;x <](oSCCV^%K\pX ޽~tڴڻwڽiF>0l]sպTSSڴi>ώ0@xxFO/LŢ8*==]==ǡ^z{]r]zlzn^: **-Jъf~L"ç,UUUi!q?bbbKUYy&Lȑe!W΢ru I҄ 9>{¨nCX87/dNN}f0ÇhECzGn:U$pb1YfRNR^^ϐfԎ;uIW}sj9M>oO:B=BiyrTYYX-]dxZZZ!]I323)Ţ بzr hMSUll_ƑS3p91~˖-QttJJJF&==}&% f̘uuu׷4^64{vn^y5v'NǕٳ K2޾}USS|,KNN$UTTUY3fm߾'@1MS;wV-X`!5G*1¾wEfYUVV *p g-<`]]a=[rhyJ`{*ժ,qx_N%%:p`rkjjoJPޓ$)))Y.Wjkki2sL}w?4rGGry^k5 ?VkO垶"=40jukeVN<|$KUUղlڰCVwPJJ&N$EGGQǎj۷X,Z/u jJOOTCC*+t}5TYY*O@ SYYbccn5CzBU.W?{͘1MQEEvCWPPXh畓#K\suZV]}zM:x+?IaUyy+/h NNNRRRUQQ!م*..Vssf͚԰99}=g;hiyeEEEz]jnnĉywԩ"=zTdEii꫔෭aZ>+pԩZ%$_n&mݺ]e*++SZZ?t }TM:pIxbZbTzۅr'ӧOarA7.[{{ッl﹵h%RIIvޣ  4 M7}X[lUyy5kV0 m۶=``σP{{BCj5ky ۰aN< t,CyyyZ| =˗v8r$댦SS[zooꌌ p!'Cee*--ŋiŊs"<4u@rrp;MBYWm~ _e3, Zgmc:Ơmd444Ӡ13YAgS&雟4rM.\nuuuviIa7\LTKKp]ݮN$ ѡ%$$(111}u4JKKv?S[_ʗv&W#׮Wi****Z].w^ x^z{~jqOݮ64Pσ8yt:ܢ(RRRB{1Nutt(66NI#~\'yv HMC͊Srrtw YrC]]v))iz0AQ^^!ð*>>_ "t E`Q$%~6-?M!g~k:ϲn@/`EąIycX6uB >M_A3 C fhVBn?RfYeԶB}̡S}TT2,Kȯ`ޓ12@X!͡FDp c:O"5мX8Ƴ%Ӊ&håDrq@@"4C3Zݏ Ȇˆ@@"м$"G^r!4#W0[C\4CI "[ &E$O\,&'.4Ef w8Seu@C'j*itͥ.{M~bbmIjJFfM%53'*0Eo78.̀pҡW۵]խp2ӔNSV[]_.MYqn^Lk /# 3M58~4u>Ʊ-GzfOO7>YT{:]:9Zw.KԺ9q>3XnЏ@qlOI~mA癞}z;ILW$kٔ-@hF`{U |V=#ete{-gV^V_Зj]ץfΥ$K H4Ϸ#e l9ji w1; S4nY͏Wv5`C1dڴ0NR]zP{]ͮ 즆vQv[͉;|d$HƸt1\@m?\'5\<=xCMKCTvUHҽ+:jr 5%4) zj^g!#F-d5w>Y N:fi4ݺ=s 3}IRn4A=I'k|8,L<trdۃߕ6a) 0}yΙy&|hCt%ƌ~,cNCvG_j}#nw?=|6r1:'htQihS2{a0ޫ:V=z0;FWf /Icwf42M?s?@9pgkhpܧ,E ův^V7H cfz-?mLahsikk+t׈2 %!,=O4]'6ܒ(l0Fk#eEX?}?7/JK0ܱ4Q7/J[4G[VFOQQn?Wʶ :8ۉ7O\{^?O6LCgg֭[ukϞ.'dnzO1e|<_vzp81DPfh̜[ =x]zӃץ+=v4gv<|;ot͑,r[ 8 3BHiYoNN@~n233;khӦ͒nQ JǞijii$]N::ҢoG5rrrF7;;A̧B\.};=hҤa#X5zͪTee,M>MW]u ]NOuu&=״vcZJGf[_ĘJ1tFEsܡ=Z8)&e"Dk.hmNHïH4/tB` kٮX,|@||RSS$ho/֜95oޜ1ciǎ:rP'?Q'N^ܹhnT_ߠ[{?:FE?ϴif,+))UV?^wĉ?9MÑ<$0S0srMw,~5w,MST+E}jzخeDB*nu+-QoǏ{꩏?|;E?)U^]:Sn﯊ {7k8wC=6nGÞRuLoUcJH1=QT*4솳X\rss} uճ}*GE6l{[Ck֬T"r{QQqI, ewiOuWR=Av/KEiܷ4ax2ϻ%^̜@KII_zƏF{c=֯ߠ7xStXrriΜ۩oS ?t谾kIR׮]վ};v;wڵ_ph̘QՎm6lب<ݻO͚5U5peffVk[ZZ>Wy.D=??_K,$ ~4hzUٻwVZSzzڵkSNǏ Γƍi/sN<,h"9%K>ӦMthZl~NՀM@N?4]rɯǟԙgPvm/QmIo(Iٮ>9J>/oVZ-I=B9j pZjw~[nӆ QxyyVBk֬աCԦ ֭\.>F(INS6nN;v;a8'|Zty# 锤7|[o=sE> /͛IKKĉ;szjէIzgs?#CSr:C[%Q֬YY܌{4Ze .8_u:ՠA}T\3A&<|-]Lcƌhiʔڰac~ڵ=7HYٮ?ѹ?ǎӬYk܏ 7o\s 5{ڻwa-[>{XsXkV+W~gC՞WԹs'rzk&h]ϬP'^˸f7^skEYݯ5;~hWu7t )}} 7ZiƳ\"fU`oP9<_lV4 5 /*%v0a,Y 6[(IjҤN};o6nN?]vmۚ{~xٲ*..VZZZvUw~]yeeW>ۭO?]|_+33Scǎ袱ڸ{[AjӦBcǘ^NL+VT&M_ 'VFF?/R{g֬N맞=OT֙ٮs?ֱc4sR߾;j֬vվ}; _;vdRÏ^>}F}ͷzͷu啗4Fc.]t饿oܥsNAϝyh #Gh%Fifx${:tڶm;w꣏i]W^uj\}U1~oSNM{wQJOOװaCԥKg)/oK5kִZo~}vV*--UNv-YT]wMkeS7o=#[Eevq0$^![n[-o*-3+U<ۯ$aoŦls<ZhC=oY9qowzs:>}. \52e5khJW.v<77OI 4PYY b_?Uyr86lQF CnU&ݪuk=K2h}**:y>ѵN۶y9N5uD=:SR.Kg?_K}4OW]uww^zk ??Jkzɧ5p2?oSԷ)jԨ!['/h[Z~]',RYY:tȮq|֬UPP#ԩSo_}UZjf|@/v;Z{sϽ2;zwԥKgu@ 6Dz 8?\uYfMYYk),,N]wa;5qu:r䈞x=Ȭ#\`G]YW٠nh+RΪ WTjVKɼ6mM3x>Ѳ,-kmڐ}ܡ>4P/.K}TY j6mN U:唊*eV8^U9f(OP`.].Ug-[^fMVկ_OZѣ+׹V,:o|\ԪUˀif2Ie~Ǹ _[V-NʪguXZԩw8aU!3nuQ%6^ }J~}={~\S[^ ןt[0Sիɓ$áӮ]wx 6SE[/k4fz7TZZsߞuk޼{0T֩SGoN_!w#ɽ_XX{p{w0gHRAA{:wYYA~""o&h(xǡ>gt@Hn$l2yHO5nTM>U)))ڰa^y5>ZpxO>YoשN:9jǪ8LeddߡCZŷnjƟΝ;Ђi)4hz裏/ΝD9ReXk>UŞ={U\\lٸ½WZ-:ڊ;+Rsb&޵}>k֬#ߖ  ' r^PeYV4B]vwYDHM2Ui:{ʕ7]]4Hn_}x-IҤI׳ϾzG5m~s0͚JKKjj :Xol޽ORӦMta-[B;\\Frp8tCG٣ڿ=1*NΝ;im?t_j֬ pQV߿O竤D7 I*+YYgF&gUj%% .]:G4pyv}jРahQFꩧC/W3{UۃRfM.Ieχ:u**vssë0hcGk*,,ܹԎ;n׋/> J֯ UV\r)'grssϖzwMvҤSE&Zڈ[\ YGhalԤ= .1cFgJy=o:SABDYn95֐(fE# 4fA=2L]SOСÄ 5H^E>>n ~fó5g\ 2TjҤ8WZ -[n%r1bRRR4bpp"Ol nsR{K/E>Bz]ƍC=?7hV-7;jHåc)..֛os?ֶm??\;w, \Uk][-]\7oѴi3ϙVh޼>KT 4Ynvt~UzAcEX~}]rź‘2n-_R99۵l O%I~[Z|Ejý`)K@'9Kԡ6)g33B"br}s-… * w=3+[;{̟X/7K`CpO2xVViʫR{l$ɓO9o\Ul}zר^r#rZ|n-pO#oG+VTaaׯ95]n&MUEjѢ.xN<ԸqE%e3o <<[A}R-\H4vl+CoTNv矫={KNjҤt뭷kǎ!L=ۯ;X~`ԩ{oҋ/m>V7n/LK|biӦٮVZ3j k5jS=G^=-o4e_4rdroU:|8?1x-=crڵ 8C=zP֭ըQC^Ff=lkJÆ'i:z@}쬐?rr+3yIo߮F&Mhǎ:zppjJ:~rrrtY:Y;w 7NO<} tVV efҞ={l ~:sQr:k.'u :x:v쨳yzkժڶm]rUfggڹ|pw>=rݺktxͻwtViٲKWQQ|};:qB6l;*"32fQc'ҵ- ^3*07{IZ?Vgʠ]8m9jڼ8t,n@;R}yвeˊDCU 9rT3f̔$ |;oDڵp$i94lPg9@\Bvɒr5bDͪ˪ O>Y/\bS'кZ|S$K~S#3kܸ ry;vLX}7ReEQ)@{T?Ʋ.A5ax}4} {_Z>rH8NOUyr`'r8=zaN֭[u6DtpyBƬZZ65ֆ +?}M[nSaa~g+M)\{v$=̳㎻jjk߾'EuU4i%I.__xO>JKK5eTS9Vd֙߿JKKuwKARm֬nۤ+%KV 8{_ ,45;w#F_|Y|Ho?k͚zwt%WhO$IڵgN맳ϮX@dmC3g=}z衴4IwL…C:|[M>CykPaaQLu/{ ATʯ~n-|O9V=ԭ~V땕}+oȘ(dfN|oT]izS&mo|YeFcy'_ylw{ׇ)ѫ׉KzamӦͥd[l }VZ .#өO>Xthϔ]j}4i֭3Ѓ>;ukѢO=pVZ*;;K۷9xKdR]6ݺuW__~M+W~+W֙!h%I7СC3fOk=ӟ*5kB$Ӱ*ׁԽ{7mڴYWk_&NZ]vIc˟UXX/RK.ҥTnԩ"IR tWN:jԨ&O]3fܯݻ/Ƙ={wm2KǎԷꫯ+WP+չVv{68W=ښCn鴻ʟW?/;ӛyYuX?/#Ne)I9҈Cc ybdڵk2dj?Z Venzyh,X$j'z`pyl`7v(h@۫^z~ѩSuivӼ/+JKKt:T-i+~?ClMrQ{<[IDATQGQʹAqƯ<^U6m|eggi+դ?R۶m۷+;;K]4Z噷f͚ WqqT^^LsydeeeTVZS^=Sۯ^NԵT5n_SO j Ǐܥƍ{h̘Q9^ ADJ_VZ>_uPZ)-ա:Hiy}Z Mo@xĥl[QzZխTNPOWh$)GeQYPP 3Er:_9ʟͨƏc5h*++2//zpȑ#wF^zog&44 "l`iJ^`C 4$BP4l ~F]Ueh?PL=4F_Pg$mk}&bIQXh嘑>V.y,=Uty}ye2ȵbJM ' Vh.XcJI77p[ևH M`Y3eX˹|N>>@7oWI'.ԟ Uby|VS;oF;;jk W*ZfegзM(H: Q0efU@{ho_@s7l> ^4p/X(H T{.y \}{/Sk5 Fˁf"4shUiC3ؾc9}`k4}o$>z? f5(   )ޕ2#9̈́Hq5'1U廯e$xf_Q`ofy̌ @mJo1Fow3K' TMj;%kΌDjkf՗F 6.3k<͈$ XT'%\-?hX*@UJ%ՙ6A]M ̴vlLϟKP߼Lh % Ι]v6X},.?} 4xf;~"Ќf> uXCUf$= @,[ja(KК 8} 49ٶF}QiDhdYVTuwyh>V\W3 ia@Bp 6P;K͚9U4$Zw XF՚/ 67BA @Mf~l`hb*H*hpo9\̼5'\qhUZT|ɪNf u uLb%)!Y$˱$`<\:6KkCudnZ}CPo9`'H{PY\YJyUfʌv8iei}f@bUi\5=}${oX3efm DRl蘿6mNZ1/+L3‘a(SoPM>BM3}̶%7oK;{^Z1!Ө]{?PP@&bh9_U]{3fvNvvKj~Fnj`cYf :3L26q04\BlXEV ,3`6 3!BhD 5Ɨp߸jd*.3eCcԶ;f-uf8TPJ~ᆡQ.B xFJ @='s73N$"a00Gf8ǢU| lq EXɪ`l(g{3iL`1{>E@QUfB>` $j@-ko(KFq%eix&TE vܮfsT#[b%+PPp2C}(4{Hh&;>0BMه32}C2DjS-CY6y7jk7 ҂UVspBPp2g@ Q>)w,ekwIiQdO`˭Ib8˻[!J=(WθV2n9j; C wyZهHL03M-Uڅ 5==>CicEpdcQi3бpB`|s؎ovJ3l&vqUA[IhAf3Q[BD5 5"5;N?dx %CpkdyW3í43pS \@BJm5͌niٶ/,jpGdkO 4{P@bli>VCP3VAf8<7-43^Gcpއv n CL01$c'FlWn4ޗxjh\L ӷm$o4՚0S8~F3P2p3vFj @<#" _*+# 7b50kQhTkʐ4pDZyopF34;Q[;:@(YCM 6#ϊ>d`Ue岫 2}fPmb#Yv51bQa7ZQm)Z#`oh/ZfPGJPӷo45C?p3Ce.ć]h#J+BLǒ*3%^xXY] Ď01I03 j3V8K"< >ќ3+{6TB`E @D+ e,L~ X]s4u yn?cqh_,1jF2~V&HnVX̜ߪ6#Lp5%R4hD' 9%JevV3/MpFѨ֌渑 'hvo"Ue ɜd 5=U8x,y03ke`3v2a,yD{ D 2yބBd 5#?qh.;k8I0)tfv걸/p6+xm! 8 O[V@2cAΟp"՚V+~Vgb'U (r񾆱xrvx-=)-{r5 @vXێ.P^ޜvx/0Fb\xQi#^a]BD#BY.4yĻ?H<xo#):E]I;]` iNsI Lckk||Mv> 8+:+Ʋ[xh$B5sťݮY49TtZnI*HalxH ێTbˮ;Z5NbEv :C{v汜[<=Gs90ܒOe~v7; 8eNv?v_R"D2Ox%$Ly&*{H! )DkR"D{?m ~-L&-)I$ȁ`"=@W7>D}I=J@mL_2C}J@2J/Y_W PJ,-;-_my (1nzu',W_UHP@Ɂ1<\7@"! -${P,% ” j+$Cx@mAjg2AW Af-AU;DEYl{!f-F* n2AC ^1Q B CV0{XAR!7 \ }!DD W^b E"hBpx/sJIAxD u-!%`@4@ TYvIENDB`Refine-0.7.1/meson.build000066400000000000000000000015171514222123300150700ustar00rootroot00000000000000project('refine', version: '0.7.1', meson_version: '>= 1.5.0', default_options: [ 'warning_level=2', 'werror=false', ], ) i18n = import('i18n') gnome = import('gnome') app_version = meson.project_version() version_array = app_version.split('.') major = version_array[0] minor = version_array[1] micro = version_array[2] app_name = 'Refine' developer_id = 'page.tesk' base_id = developer_id + '.' + app_name app_id = base_id profile = get_option('profile') if profile == 'development' app_version += '-' + run_command( ['git', 'rev-parse', '--short', 'HEAD'], check: true ).stdout().strip() app_name += ' (Development)' app_id += '.' + 'Devel' endif subdir('data') subdir('refine') subdir('po') gnome.post_install( glib_compile_schemas: true, gtk_update_icon_cache: true, update_desktop_database: true, ) Refine-0.7.1/meson_options.txt000066400000000000000000000004361514222123300163620ustar00rootroot00000000000000option ( 'profile', type: 'combo', choices: [ 'default', 'development' ], value: 'default' ) option ( 'exec_name_as_base_id', type: 'boolean', value: false, description: 'The resulting binary is named as base_id instead of refine' ) Refine-0.7.1/po/000077500000000000000000000000001514222123300133405ustar00rootroot00000000000000Refine-0.7.1/po/LINGUAS000066400000000000000000000001531514222123300143640ustar00rootroot00000000000000# Please keep this file sorted alphabetically. ar de es_ES fa fr id it_IT ja ka nb pl pt_BR ru tr uk zh_CN Refine-0.7.1/po/POTFILES.in000066400000000000000000000011111514222123300151070ustar00rootroot00000000000000# List of source files containing translatable strings. # Please keep this file sorted alphabetically. data/page.tesk.Refine.desktop.in.in data/page.tesk.Refine.gschema.xml data/page.tesk.Refine.metainfo.xml.in.in refine/main.py refine/sections/appearance.blp refine/sections/mouse-touchpad.blp refine/sections/power.blp refine/sections/shell-compositor.blp refine/sections/sound.blp refine/sections/wellbeing.blp refine/widgets/panel-page.blp refine/widgets/reset_button.py refine/widgets/window-buttons-row.blp refine/widgets/window_buttons_row.py refine/window.blp refine/window.py Refine-0.7.1/po/ar.po000066400000000000000000000273571514222123300143200ustar00rootroot00000000000000# Arabic translation for Refine. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the refine package. # Ahmed Najmawi , 2025. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: refine\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-01-03 13:23-0500\n" "PO-Revision-Date: 2025-05-04 16:40+0300\n" "Last-Translator: Ahmed Najmawi \n" "Language-Team: \n" "Language: ar\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.4.4\n" #: data/page.tesk.Refine.desktop.in.in:2 #: data/page.tesk.Refine.metainfo.xml.in.in:7 refine/window.blp:5 msgid "Refine" msgstr "تحسينات" #: data/page.tesk.Refine.desktop.in.in:3 #: data/page.tesk.Refine.metainfo.xml.in.in:8 msgid "Tweak various aspects of GNOME" msgstr "طوِّع نواحٍ متعددة لجنوم" #: data/page.tesk.Refine.desktop.in.in:9 msgid "tweaks;tweak;toggle;" msgstr "تطويعات;تبديل;بدل;refine;" #: data/page.tesk.Refine.metainfo.xml.in.in:10 msgid "Refine helps discover advanced and experimental features in GNOME." msgstr "يساعد «تحسينات» في اكتشاف المزايا المتقدمة والتجريبية لجنوم." #: data/page.tesk.Refine.metainfo.xml.in.in:14 msgid "Hari Rana (TheEvilSkeleton)" msgstr "هاري رانا (TheEvilSkeleton)" #: data/page.tesk.Refine.metainfo.xml.in.in:36 msgid "Appearance Page" msgstr "صفحة المظهر" #: data/page.tesk.Refine.metainfo.xml.in.in:40 #, fuzzy msgid "Shell & Compositor Page" msgstr "صفحة الصدفَّة والمُرَكِّب" #. Translators: Replace "translator-credits" with your name/username, and optionally an email or URL. #: refine/main.py:82 msgid "translator-credits" msgstr "أحمد النجماوي " #: refine/main.py:83 msgid "Copyright © 2024 Hari Rana (TheEvilSkeleton)" msgstr "حقوق النشر © 2024 Hari Rana (TheEvilSkeleton)" # اسم برمجية «قوارير»، https://usebottles.com/ #: refine/main.py:87 msgid "Bottles" msgstr "قوارير" #: refine/main.py:88 msgid "Run Windows software" msgstr "شغِّل برمجيات ويندوز" # WIP until its translation is finalized #: refine/main.py:92 #, fuzzy msgid "Upscaler" msgstr "مُكَبِّر التأطير" # WIP until its translation is finalized #: refine/main.py:93 #, fuzzy msgid "Upscale and enhance images" msgstr "أطِّر وحَسِّن الصوَّر" #: refine/sections/appearance.blp:5 msgid "Appearance" msgstr "المظهر" #: refine/sections/appearance.blp:9 msgid "Themes" msgstr "السِّمات" #: refine/sections/appearance.blp:12 msgid "Cursors" msgstr "المؤشرات" #: refine/sections/appearance.blp:20 msgid "Icons" msgstr "الأيقونات" #: refine/sections/appearance.blp:28 msgid "GTK 3/4 Theme" msgstr "سِمة جتك3\\4" #: refine/sections/appearance.blp:29 msgid "Platform libraries may ignore this option" msgstr "قد تتجاهل مكاتب المنصات هذا الخيار" #: refine/sections/appearance.blp:44 msgid "Light Style" msgstr "الأسلوب الفاتح" #: refine/sections/appearance.blp:45 msgid "Use a light appearance for the shell and supported apps" msgstr "يستخدم مظهرًا فاتحًا للصدفة والتطبيقات المدعومة" #: refine/sections/appearance.blp:53 msgid "Fonts" msgstr "الخطوط" #: refine/sections/appearance.blp:56 msgid "Interface" msgstr "الواجهة" #: refine/sections/appearance.blp:62 msgid "Document" msgstr "المستندات" #: refine/sections/appearance.blp:68 msgid "Monospace" msgstr "ثابت العرض" #: refine/sections/appearance.blp:75 msgid "Text Rendering" msgstr "تصيير النص" #: refine/sections/appearance.blp:78 msgid "Font Hinting" msgstr "تلميح الخط" #: refine/sections/appearance.blp:79 msgid "Adjusts text shapes for better clarity, especially at smaller sizes" msgstr "يضبط أشكال النص لتحسين وضوحيته، وخاصةً في الأحجام الصغيرة" #: refine/sections/appearance.blp:86 msgid "Font Antialiasing" msgstr "إزالة تسنين الخط" #: refine/sections/appearance.blp:87 msgid "Smooths text edges for better clarity by blending colors" msgstr "ينعِّم حواف النص من أجل تحسين الموضوحية عبر مزج الألوان" #: refine/sections/appearance.blp:95 msgid "Background" msgstr "الخلفية" #: refine/sections/appearance.blp:98 msgid "Adjustment" msgstr "الضبط" #: refine/sections/mouse-touchpad.blp:5 msgid "Mouse & Touchpad" msgstr "الفأرة ولوحة اللمس" #: refine/sections/mouse-touchpad.blp:9 msgid "Mouse" msgstr "الفأرة" #: refine/sections/mouse-touchpad.blp:12 msgid "Middle Click to Paste Text" msgstr "النقر الأوسط للصق النص" #: refine/sections/mouse-touchpad.blp:13 msgid "Paste highlighted text, independent of the clipboard" msgstr "الصق النص المبرز، بغض النظر عن الحافظة" #: refine/sections/mouse-touchpad.blp:20 msgid "Window Header Bar Actions" msgstr "إجراءات شريط ترويسة النوافذ" #: refine/sections/mouse-touchpad.blp:23 msgid "Double Click" msgstr "النقر المزدوج" #: refine/sections/mouse-touchpad.blp:36 msgid "Middle Click" msgstr "النقر الأوسط" #: refine/sections/mouse-touchpad.blp:49 msgid "Secondary Click" msgstr "النقر الثانوي" #: refine/sections/power.blp:5 msgid "Power" msgstr "" #: refine/sections/power.blp:10 msgid "Show Power Buttons in Lock Screen" msgstr "" #: refine/sections/shell-compositor.blp:5 msgid "Shell & Compositor" msgstr "الصدفَّة والمُرَكِّب" #: refine/sections/shell-compositor.blp:10 msgid "Center New Windows" msgstr "وسِّط النوافذ الجديدة" #: refine/sections/shell-compositor.blp:16 msgid "Attach Modal Windows" msgstr "أرفق النوافذ المُوَجِّهة" #: refine/sections/shell-compositor.blp:17 msgid "" "Attaches modal windows to their parent window to prevent them from moving " "independently" msgstr "يرفق النوافذ المُوَّجِهة إلى نافذة الأصل لمنعهم من التحرك باستقلالية" #: refine/sections/shell-compositor.blp:23 msgid "Resize With Secondary Clicks" msgstr "أعِد التحجيم بالنقر الثانوي" #: refine/sections/shell-compositor.blp:24 msgid "" "Use Secondary Click instead of Middle Click to resize windows while holding " "the window action key" msgstr "" "يستخدم النقر الثانوي بدلًا من النقر الأوسط لإعادة تحجيم النوافذ أثناء الضغط " "على مفتاح إجراء النوافذ" #: refine/sections/shell-compositor.blp:32 msgid "Window Focus Mode" msgstr "وضع تركيز النافذة" #: refine/sections/shell-compositor.blp:33 msgid "Sets the action that will cause a window to take focus" msgstr "يُعَيِّن الإجراء الذي يؤدي لتركيز النافذة" # المورد الحديث (2008) # عربآيز #: refine/sections/shell-compositor.blp:40 msgid "Automatically Raise on Hover" msgstr "ارفعه آليًا عند الحَوَّمان" #: refine/sections/shell-compositor.blp:41 msgid "Automatically raises the focused window" msgstr "يرفع النافذة المُركَّزة آليًا" #: refine/sections/shell-compositor.blp:48 msgid "Window Button Layout" msgstr "واجهة أزرار النافذة" #: refine/sections/shell-compositor.blp:51 msgid "Header Bar" msgstr "شريط ترويسة النوافذ" #: refine/sections/shell-compositor.blp:64 msgid "Experimental Features" msgstr "الميزات التجريبية" #: refine/sections/shell-compositor.blp:71 msgid "Fractional Scaling Options" msgstr "خيارات التأطير المجتَزَأ" #: refine/sections/shell-compositor.blp:72 #: refine/sections/shell-compositor.blp:80 msgid "These options will appear in Settings" msgstr "ستظهر هذه الخيارات في الإعدادات" #: refine/sections/shell-compositor.blp:79 msgid "Variable Refresh Rate Options" msgstr "خيارات مُعَدَّل التحديث المتغيِّرة" #: refine/sections/shell-compositor.blp:94 msgid "Autoclose Xwayland" msgstr "" #: refine/sections/shell-compositor.blp:102 msgid "Xwayland Native Scaling" msgstr "تأطير Xwayland الأصيل" #: refine/sections/sound.blp:5 msgid "Sound" msgstr "الصَّوت" #: refine/sections/sound.blp:10 msgid "Volume Step" msgstr "عتبة المستوى" #: refine/sections/wellbeing.blp:5 msgid "Wellbeing" msgstr "" #: refine/sections/wellbeing.blp:9 msgid "Eyesight Reminders" msgstr "" #: refine/sections/wellbeing.blp:12 refine/sections/wellbeing.blp:113 msgid "Show Countdown When Break Is Due" msgstr "" #: refine/sections/wellbeing.blp:18 refine/sections/wellbeing.blp:119 msgid "Lock Screen During Break" msgstr "" #: refine/sections/wellbeing.blp:24 refine/sections/wellbeing.blp:125 msgid "Delay (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:25 refine/sections/wellbeing.blp:126 msgid "Amount to delay break if requested" msgstr "" #: refine/sections/wellbeing.blp:53 refine/sections/wellbeing.blp:154 msgid "Break Duration (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:81 refine/sections/wellbeing.blp:182 msgid "Time Between Breaks (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:110 msgid "Movement Reminders" msgstr "" #: refine/widgets/panel-page.blp:6 msgid "Options will be changed after next login" msgstr "سَتُغَيَّر الخيارات بعد الولوج التالي" #: refine/widgets/reset_button.py:34 refine/widgets/window-buttons-row.blp:64 msgid "Reset" msgstr "صَفِّر" #: refine/widgets/window-buttons-row.blp:48 msgid "Hidden" msgstr "مخفي" #: refine/widgets/window_buttons_row.py:95 msgid "Move to _Left Corner" msgstr "حرِّك للزاوية الي_سرى" #: refine/widgets/window_buttons_row.py:99 msgid "Move to _Right Corner" msgstr "حرِّك للزاوية الي_منى" #: refine/widgets/window_buttons_row.py:109 msgid "Move _Left" msgstr "حرِّك للي_سار" #: refine/widgets/window_buttons_row.py:113 msgid "Move _Right" msgstr "حرِّك للي_مين" #: refine/widgets/window_buttons_row.py:116 msgid "_Hide" msgstr "أ_خفِ" #: refine/window.blp:34 refine/window.blp:65 msgid "About Refine" msgstr "عَنْ «تحسينات»" #: refine/window.blp:73 msgid "Unsupported Environment" msgstr "بيئة غير مدعومة" #: refine/window.blp:76 msgid "Accept the Risk and Continue" msgstr "اقبل المخاطرة وتابع" #: refine/window.py:118 msgid "" "Some settings may not work as intended and could lead to undesirable " "behavior." msgstr "قد لا تعمل بعض الإعدادات كما ينبغي وتؤدي لسلوك غير مرغوب." #: refine/window.py:125 msgid "" "Refine only supports versions of GNOME that have not been modified by the " "operating system." msgstr "يدعَم «تحسينات» إصدارات جنوم التي لم يُعَدِّلها نظام التشغيل حصرًا." #: refine/window.py:133 msgid "Refine is only intended to run on the GNOME desktop environment." msgstr "«تحسينات» مصممٌ ليعمل على بيئة سطح المكتب جنوم فقط." # المورد الحديث (2008) #~ msgid "@app_name@" #~ msgstr "تحسينات" #~ msgctxt "shortcut window" #~ msgid "General" #~ msgstr "عامّ" #~ msgctxt "shortcut window" #~ msgid "Show Shortcuts" #~ msgstr "اعرض الاختصارات" #~ msgctxt "shortcut window" #~ msgid "Quit" #~ msgstr "اخرج" #~ msgid "Main Menu" #~ msgstr "القائمة الرئيسة" #~ msgid "_Keyboard Shortcuts" #~ msgstr "ا_ختصارات لوحة المفاتيح" #~ msgid "_About Refine" #~ msgstr "_عَنْ «تحسينات»" Refine-0.7.1/po/de.po000066400000000000000000000246651514222123300143050ustar00rootroot00000000000000# German translation for Refine. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the refine package. # Philipp Kiemle , 2025. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: refine\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-01-03 13:23-0500\n" "PO-Revision-Date: 2025-01-23 18:47+0100\n" "Last-Translator: Philipp Kiemle \n" "Language-Team: \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.5\n" # Name der Anwendung, nicht übersetzen #: data/page.tesk.Refine.desktop.in.in:2 #: data/page.tesk.Refine.metainfo.xml.in.in:7 refine/window.blp:5 msgid "Refine" msgstr "Refine" #: data/page.tesk.Refine.desktop.in.in:3 #: data/page.tesk.Refine.metainfo.xml.in.in:8 msgid "Tweak various aspects of GNOME" msgstr "Verschiedene Aspekte von GNOME anpassen" #: data/page.tesk.Refine.desktop.in.in:9 msgid "tweaks;tweak;toggle;" msgstr "tweaks;tweak;toggle;Anpassungen;Veränderung;" #: data/page.tesk.Refine.metainfo.xml.in.in:10 msgid "Refine helps discover advanced and experimental features in GNOME." msgstr "" "Refine hilft, fortgeschrittene und experimentelle Funktionen von GNOME zu " "entdecken." # Name des Entwicklers #: data/page.tesk.Refine.metainfo.xml.in.in:14 msgid "Hari Rana (TheEvilSkeleton)" msgstr "Hari Rana (TheEvilSkeleton)" #: data/page.tesk.Refine.metainfo.xml.in.in:36 msgid "Appearance Page" msgstr "Erscheinungsbild-Seite" #: data/page.tesk.Refine.metainfo.xml.in.in:40 #, fuzzy msgid "Shell & Compositor Page" msgstr "Shell & Compositor-Seite" #. Translators: Replace "translator-credits" with your name/username, and optionally an email or URL. #: refine/main.py:82 msgid "translator-credits" msgstr "Philipp Kiemle " #: refine/main.py:83 msgid "Copyright © 2024 Hari Rana (TheEvilSkeleton)" msgstr "Copyright © 2024 Hari Rana (TheEvilSkeleton)" # Der Name eines Programms, siehe https://usebottles.com/ #: refine/main.py:87 msgid "Bottles" msgstr "Bottles" #: refine/main.py:88 msgid "Run Windows software" msgstr "Windows-Software ausführen" #: refine/main.py:92 msgid "Upscaler" msgstr "Upscaler" #: refine/main.py:93 msgid "Upscale and enhance images" msgstr "Bilder hochskalieren und verbessern" #: refine/sections/appearance.blp:5 msgid "Appearance" msgstr "Erscheinungsbild" #: refine/sections/appearance.blp:9 msgid "Themes" msgstr "Themen" #: refine/sections/appearance.blp:12 msgid "Cursors" msgstr "Cursor" #: refine/sections/appearance.blp:20 msgid "Icons" msgstr "Symbole" #: refine/sections/appearance.blp:28 msgid "GTK 3/4 Theme" msgstr "GTK 3/4-Thema" #: refine/sections/appearance.blp:29 msgid "Platform libraries may ignore this option" msgstr "Plattformbibliotheken könnten diese Option ignorieren" #: refine/sections/appearance.blp:44 msgid "Light Style" msgstr "Heller Stil" #: refine/sections/appearance.blp:45 msgid "Use a light appearance for the shell and supported apps" msgstr "Ein helles Thema für die Shell und unterstützte Anwendungen verwenden" #: refine/sections/appearance.blp:53 msgid "Fonts" msgstr "Schriftarten" #: refine/sections/appearance.blp:56 msgid "Interface" msgstr "Interface" #: refine/sections/appearance.blp:62 msgid "Document" msgstr "" #: refine/sections/appearance.blp:68 msgid "Monospace" msgstr "Monospace" #: refine/sections/appearance.blp:75 msgid "Text Rendering" msgstr "Text-Rendering" #: refine/sections/appearance.blp:78 msgid "Font Hinting" msgstr "Schriftart-Hinting" #: refine/sections/appearance.blp:79 msgid "Adjusts text shapes for better clarity, especially at smaller sizes" msgstr "" "Verändert Schriftarten für mehr Klarheit, besonders bei kleiner Schriftgröße" #: refine/sections/appearance.blp:86 msgid "Font Antialiasing" msgstr "Schrift-Antialiasing" #: refine/sections/appearance.blp:87 msgid "Smooths text edges for better clarity by blending colors" msgstr "" "Macht Textkanten durch Farbmischung weicher, ermöglicht bessere Lesbarkeit" #: refine/sections/appearance.blp:95 msgid "Background" msgstr "Hintergrund" #: refine/sections/appearance.blp:98 msgid "Adjustment" msgstr "Anpassung" #: refine/sections/mouse-touchpad.blp:5 msgid "Mouse & Touchpad" msgstr "Maus & Tastfeld" #: refine/sections/mouse-touchpad.blp:9 msgid "Mouse" msgstr "Maus" #: refine/sections/mouse-touchpad.blp:12 msgid "Middle Click to Paste Text" msgstr "Mittelklick, um Text einzufügen" #: refine/sections/mouse-touchpad.blp:13 msgid "Paste highlighted text, independent of the clipboard" msgstr "" #: refine/sections/mouse-touchpad.blp:20 msgid "Window Header Bar Actions" msgstr "Aktionen der Fenster-Titelleiste" #: refine/sections/mouse-touchpad.blp:23 msgid "Double Click" msgstr "Doppelklick" #: refine/sections/mouse-touchpad.blp:36 msgid "Middle Click" msgstr "Mittelklick" #: refine/sections/mouse-touchpad.blp:49 msgid "Secondary Click" msgstr "Sekundärer Klick" #: refine/sections/power.blp:5 msgid "Power" msgstr "" #: refine/sections/power.blp:10 msgid "Show Power Buttons in Lock Screen" msgstr "" #: refine/sections/shell-compositor.blp:5 msgid "Shell & Compositor" msgstr "Shell & Compositor" #: refine/sections/shell-compositor.blp:10 msgid "Center New Windows" msgstr "Neue Fenster zentrieren" #: refine/sections/shell-compositor.blp:16 msgid "Attach Modal Windows" msgstr "Modale Fenster anhängen" #: refine/sections/shell-compositor.blp:17 msgid "" "Attaches modal windows to their parent window to prevent them from moving " "independently" msgstr "" "Hängt modale Fenster an ihr übergeordnete Fenster an, um unabhängiges " "Verschieben zu verhindern" #: refine/sections/shell-compositor.blp:23 msgid "Resize With Secondary Clicks" msgstr "Größe mit sekundärem Klick verändern" #: refine/sections/shell-compositor.blp:24 msgid "" "Use Secondary Click instead of Middle Click to resize windows while holding " "the window action key" msgstr "" "Den sekundären statt dem Mittelklick verwenden, um bei gedrückter Fenster-" "Aktionstaste die Fenstergröße zu verändern" #: refine/sections/shell-compositor.blp:32 msgid "Window Focus Mode" msgstr "Fenster-Fokusmodus" #: refine/sections/shell-compositor.blp:33 msgid "Sets the action that will cause a window to take focus" msgstr "Legt die Aktion fest, die ein Fenster in den Fokus bringt" #: refine/sections/shell-compositor.blp:40 msgid "Automatically Raise on Hover" msgstr "Beim Überfahren automatisch hervorholen" #: refine/sections/shell-compositor.blp:41 msgid "Automatically raises the focused window" msgstr "Holt das fokussierte Fenster automatisch in den Vordergrund" #: refine/sections/shell-compositor.blp:48 msgid "Window Button Layout" msgstr "" #: refine/sections/shell-compositor.blp:51 msgid "Header Bar" msgstr "" #: refine/sections/shell-compositor.blp:64 msgid "Experimental Features" msgstr "Experimentelle Funktionen" #: refine/sections/shell-compositor.blp:71 msgid "Fractional Scaling Options" msgstr "Einstellungen zur fraktionierten Skalierung" #: refine/sections/shell-compositor.blp:72 #: refine/sections/shell-compositor.blp:80 msgid "These options will appear in Settings" msgstr "Diese Optionen werden in den Einstellungen erscheinen" #: refine/sections/shell-compositor.blp:79 msgid "Variable Refresh Rate Options" msgstr "Einstellungen zur variablen Aktualisierungsrate" #: refine/sections/shell-compositor.blp:94 msgid "Autoclose Xwayland" msgstr "" #: refine/sections/shell-compositor.blp:102 msgid "Xwayland Native Scaling" msgstr "Native Skalierung unter Xwayland" #: refine/sections/sound.blp:5 msgid "Sound" msgstr "Audio" #: refine/sections/sound.blp:10 msgid "Volume Step" msgstr "Lautstärke-Schritte" #: refine/sections/wellbeing.blp:5 msgid "Wellbeing" msgstr "" #: refine/sections/wellbeing.blp:9 msgid "Eyesight Reminders" msgstr "" #: refine/sections/wellbeing.blp:12 refine/sections/wellbeing.blp:113 msgid "Show Countdown When Break Is Due" msgstr "" #: refine/sections/wellbeing.blp:18 refine/sections/wellbeing.blp:119 msgid "Lock Screen During Break" msgstr "" #: refine/sections/wellbeing.blp:24 refine/sections/wellbeing.blp:125 msgid "Delay (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:25 refine/sections/wellbeing.blp:126 msgid "Amount to delay break if requested" msgstr "" #: refine/sections/wellbeing.blp:53 refine/sections/wellbeing.blp:154 msgid "Break Duration (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:81 refine/sections/wellbeing.blp:182 msgid "Time Between Breaks (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:110 msgid "Movement Reminders" msgstr "" #: refine/widgets/panel-page.blp:6 msgid "Options will be changed after next login" msgstr "Die Einstellungen werden nach dem nächsten Login geändert" #: refine/widgets/reset_button.py:34 refine/widgets/window-buttons-row.blp:64 msgid "Reset" msgstr "Zurücksetzen" #: refine/widgets/window-buttons-row.blp:48 msgid "Hidden" msgstr "" #: refine/widgets/window_buttons_row.py:95 msgid "Move to _Left Corner" msgstr "" #: refine/widgets/window_buttons_row.py:99 msgid "Move to _Right Corner" msgstr "" #: refine/widgets/window_buttons_row.py:109 msgid "Move _Left" msgstr "" #: refine/widgets/window_buttons_row.py:113 msgid "Move _Right" msgstr "" #: refine/widgets/window_buttons_row.py:116 msgid "_Hide" msgstr "" #: refine/window.blp:34 refine/window.blp:65 msgid "About Refine" msgstr "Info zu Refine" #: refine/window.blp:73 msgid "Unsupported Environment" msgstr "Nicht unterstützte Umgebung" #: refine/window.blp:76 msgid "Accept the Risk and Continue" msgstr "Risiko akzemptieren und fortfahren" #: refine/window.py:118 msgid "" "Some settings may not work as intended and could lead to undesirable " "behavior." msgstr "" "Einige Einstellungen könnten nicht wie erwartet funktionieren und zu " "unerwünschtem Verhalten führen." #: refine/window.py:125 msgid "" "Refine only supports versions of GNOME that have not been modified by the " "operating system." msgstr "" "Refine unterstützt nur GNOME-Versionen, die nicht vom Betriebssystem " "verändert wurden." #: refine/window.py:133 msgid "Refine is only intended to run on the GNOME desktop environment." msgstr "Refine ist nur für die GNOME Desktopumgebung vorgesehen." #~ msgid "@app_name@" #~ msgstr "@app_name@" #, fuzzy #~ msgctxt "shortcut window" #~ msgid "Show Shortcuts" #~ msgstr "_Tastenkürzel" #~ msgid "Main Menu" #~ msgstr "Hauptmenü" #~ msgid "_Keyboard Shortcuts" #~ msgstr "_Tastenkürzel" #~ msgid "_About Refine" #~ msgstr "_Info zu Refine" Refine-0.7.1/po/es_ES.po000066400000000000000000000245711514222123300147070ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the refine package. # FIRST AUTHOR , YEAR. # Óscar García Amor , 2025. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: refine\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-01-03 13:23-0500\n" "PO-Revision-Date: 2025-01-22 15:50-0100\n" "Last-Translator: Óscar García Amor \n" "Language-Team: Spanish Spain\n" "Language: es_ES\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: data/page.tesk.Refine.desktop.in.in:2 #: data/page.tesk.Refine.metainfo.xml.in.in:7 refine/window.blp:5 msgid "Refine" msgstr "Refine" #: data/page.tesk.Refine.desktop.in.in:3 #: data/page.tesk.Refine.metainfo.xml.in.in:8 msgid "Tweak various aspects of GNOME" msgstr "Ajuste varios aspectos de GNOME" #: data/page.tesk.Refine.desktop.in.in:9 msgid "tweaks;tweak;toggle;" msgstr "tweaks;tweak;toggle;" #: data/page.tesk.Refine.metainfo.xml.in.in:10 msgid "Refine helps discover advanced and experimental features in GNOME." msgstr "" "Refine ayuda a descubrir características avanzadas y experimentales en GNOME." #: data/page.tesk.Refine.metainfo.xml.in.in:14 msgid "Hari Rana (TheEvilSkeleton)" msgstr "Hari Rana (TheEvilSkeleton)" #: data/page.tesk.Refine.metainfo.xml.in.in:36 msgid "Appearance Page" msgstr "Apariencia" #: data/page.tesk.Refine.metainfo.xml.in.in:40 #, fuzzy msgid "Shell & Compositor Page" msgstr "Shell & Compositor" #. Translators: Replace "translator-credits" with your name/username, and optionally an email or URL. #: refine/main.py:82 msgid "translator-credits" msgstr "Óscar García Amor (https://ogarcia.me)" #: refine/main.py:83 msgid "Copyright © 2024 Hari Rana (TheEvilSkeleton)" msgstr "Copyright © 2024 Hari Rana (TheEvilSkeleton)" #: refine/main.py:87 msgid "Bottles" msgstr "Bottles" #: refine/main.py:88 msgid "Run Windows software" msgstr "Ejecutar software de Windows" #: refine/main.py:92 msgid "Upscaler" msgstr "Realce" #: refine/main.py:93 msgid "Upscale and enhance images" msgstr "Realza y mejora las imágenes" #: refine/sections/appearance.blp:5 msgid "Appearance" msgstr "Apariencia" #: refine/sections/appearance.blp:9 msgid "Themes" msgstr "Temas" #: refine/sections/appearance.blp:12 msgid "Cursors" msgstr "Cursor" #: refine/sections/appearance.blp:20 msgid "Icons" msgstr "Iconos" #: refine/sections/appearance.blp:28 msgid "GTK 3/4 Theme" msgstr "Tema GTK 3/4" #: refine/sections/appearance.blp:29 msgid "Platform libraries may ignore this option" msgstr "Las bibliotecas de plataforma pueden ignorar esta opción" #: refine/sections/appearance.blp:44 msgid "Light Style" msgstr "Estilo Claro" #: refine/sections/appearance.blp:45 msgid "Use a light appearance for the shell and supported apps" msgstr "" "Utiliza una apariencia clara para el shell y las aplicaciones compatibles" #: refine/sections/appearance.blp:53 msgid "Fonts" msgstr "Tipografías" #: refine/sections/appearance.blp:56 msgid "Interface" msgstr "Interfaz" #: refine/sections/appearance.blp:62 msgid "Document" msgstr "" #: refine/sections/appearance.blp:68 msgid "Monospace" msgstr "Monoespaciado" #: refine/sections/appearance.blp:75 msgid "Text Rendering" msgstr "Renderizado de texto" #: refine/sections/appearance.blp:78 msgid "Font Hinting" msgstr "Hinting" #: refine/sections/appearance.blp:79 msgid "Adjusts text shapes for better clarity, especially at smaller sizes" msgstr "" "Ajusta las formas del texto para mejorar la claridad, especialmente en " "tamaños pequeños" #: refine/sections/appearance.blp:86 msgid "Font Antialiasing" msgstr "Suavizado" #: refine/sections/appearance.blp:87 msgid "Smooths text edges for better clarity by blending colors" msgstr "" "Suaviza los bordes del texto para una mayor claridad mezclando los colores" #: refine/sections/appearance.blp:95 msgid "Background" msgstr "Fondo" #: refine/sections/appearance.blp:98 msgid "Adjustment" msgstr "Ajuste" #: refine/sections/mouse-touchpad.blp:5 msgid "Mouse & Touchpad" msgstr "Ratón y panel táctil" #: refine/sections/mouse-touchpad.blp:9 msgid "Mouse" msgstr "Ratón" #: refine/sections/mouse-touchpad.blp:12 msgid "Middle Click to Paste Text" msgstr "Pegar texto al pulsar con el botón central" #: refine/sections/mouse-touchpad.blp:13 msgid "Paste highlighted text, independent of the clipboard" msgstr "" #: refine/sections/mouse-touchpad.blp:20 msgid "Window Header Bar Actions" msgstr "Acciones de la barra de título" #: refine/sections/mouse-touchpad.blp:23 msgid "Double Click" msgstr "Doble pulsación" #: refine/sections/mouse-touchpad.blp:36 msgid "Middle Click" msgstr "Pulsación central" #: refine/sections/mouse-touchpad.blp:49 msgid "Secondary Click" msgstr "Pulsación secundaria" #: refine/sections/power.blp:5 msgid "Power" msgstr "" #: refine/sections/power.blp:10 msgid "Show Power Buttons in Lock Screen" msgstr "" #: refine/sections/shell-compositor.blp:5 msgid "Shell & Compositor" msgstr "Shell & Compositor" #: refine/sections/shell-compositor.blp:10 msgid "Center New Windows" msgstr "Centrar ventanas nuevas" #: refine/sections/shell-compositor.blp:16 msgid "Attach Modal Windows" msgstr "Acoplar diálogos modales" #: refine/sections/shell-compositor.blp:17 msgid "" "Attaches modal windows to their parent window to prevent them from moving " "independently" msgstr "" "Une las ventanas modales a su ventana pradre para evitar que se muevan de " "manera independiente" #: refine/sections/shell-compositor.blp:23 msgid "Resize With Secondary Clicks" msgstr "Redimensionar al pulsar el botón secundario" #: refine/sections/shell-compositor.blp:24 msgid "" "Use Secondary Click instead of Middle Click to resize windows while holding " "the window action key" msgstr "" "Utilice el botón secundario en lugar del central para cambiar el tamaño de " "las ventanas mientras mantiene pulsada la tecla de acción de la ventana" #: refine/sections/shell-compositor.blp:32 msgid "Window Focus Mode" msgstr "Foco de la ventana" #: refine/sections/shell-compositor.blp:33 msgid "Sets the action that will cause a window to take focus" msgstr "Establece la acción que hará que una ventana tome el foco" #: refine/sections/shell-compositor.blp:40 msgid "Automatically Raise on Hover" msgstr "Elevar automáticamente al pasar el ratón por encima" #: refine/sections/shell-compositor.blp:41 msgid "Automatically raises the focused window" msgstr "Eleva automáticamente la ventana al darle foco" #: refine/sections/shell-compositor.blp:48 msgid "Window Button Layout" msgstr "" #: refine/sections/shell-compositor.blp:51 msgid "Header Bar" msgstr "" #: refine/sections/shell-compositor.blp:64 msgid "Experimental Features" msgstr "Características experimentales" #: refine/sections/shell-compositor.blp:71 msgid "Fractional Scaling Options" msgstr "Opciones de escalado fraccional" #: refine/sections/shell-compositor.blp:72 #: refine/sections/shell-compositor.blp:80 msgid "These options will appear in Settings" msgstr "Estas opciones aparecerán en configuración" #: refine/sections/shell-compositor.blp:79 msgid "Variable Refresh Rate Options" msgstr "Opciones de frecuencia de refresco variable" #: refine/sections/shell-compositor.blp:94 msgid "Autoclose Xwayland" msgstr "" #: refine/sections/shell-compositor.blp:102 msgid "Xwayland Native Scaling" msgstr "Escalado nativo de Xwayland" #: refine/sections/sound.blp:5 msgid "Sound" msgstr "Sonido" #: refine/sections/sound.blp:10 msgid "Volume Step" msgstr "Intervalo de aumento o disminución del volumen" #: refine/sections/wellbeing.blp:5 msgid "Wellbeing" msgstr "" #: refine/sections/wellbeing.blp:9 msgid "Eyesight Reminders" msgstr "" #: refine/sections/wellbeing.blp:12 refine/sections/wellbeing.blp:113 msgid "Show Countdown When Break Is Due" msgstr "" #: refine/sections/wellbeing.blp:18 refine/sections/wellbeing.blp:119 msgid "Lock Screen During Break" msgstr "" #: refine/sections/wellbeing.blp:24 refine/sections/wellbeing.blp:125 msgid "Delay (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:25 refine/sections/wellbeing.blp:126 msgid "Amount to delay break if requested" msgstr "" #: refine/sections/wellbeing.blp:53 refine/sections/wellbeing.blp:154 msgid "Break Duration (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:81 refine/sections/wellbeing.blp:182 msgid "Time Between Breaks (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:110 msgid "Movement Reminders" msgstr "" #: refine/widgets/panel-page.blp:6 msgid "Options will be changed after next login" msgstr "Las opciones se modificarán tras el próximo inicio de sesión" #: refine/widgets/reset_button.py:34 refine/widgets/window-buttons-row.blp:64 msgid "Reset" msgstr "Restablecer" #: refine/widgets/window-buttons-row.blp:48 msgid "Hidden" msgstr "" #: refine/widgets/window_buttons_row.py:95 msgid "Move to _Left Corner" msgstr "" #: refine/widgets/window_buttons_row.py:99 msgid "Move to _Right Corner" msgstr "" #: refine/widgets/window_buttons_row.py:109 msgid "Move _Left" msgstr "" #: refine/widgets/window_buttons_row.py:113 msgid "Move _Right" msgstr "" #: refine/widgets/window_buttons_row.py:116 msgid "_Hide" msgstr "" #: refine/window.blp:34 refine/window.blp:65 msgid "About Refine" msgstr "Sobre Refine" #: refine/window.blp:73 msgid "Unsupported Environment" msgstr "Entorno no compatible" #: refine/window.blp:76 msgid "Accept the Risk and Continue" msgstr "Aceptar el riesgo y continuar" #: refine/window.py:118 msgid "" "Some settings may not work as intended and could lead to undesirable " "behavior." msgstr "" "Es posible que algunos ajustes no funcionen según lo previsto y podrían " "provocar comportamientos no deseados." #: refine/window.py:125 msgid "" "Refine only supports versions of GNOME that have not been modified by the " "operating system." msgstr "" "Refine sólo es compatible con versiones de GNOME que no hayan sido " "modificadas por el sistema operativo." #: refine/window.py:133 msgid "Refine is only intended to run on the GNOME desktop environment." msgstr "" "Refine sólo está diseñado para ejecutarse en el entorno de escritorio GNOME." #~ msgid "@app_name@" #~ msgstr "@app_name@" #, fuzzy #~ msgctxt "shortcut window" #~ msgid "Show Shortcuts" #~ msgstr "_Atajos de teclado" #~ msgid "Main Menu" #~ msgstr "Menú principal" #~ msgid "_Keyboard Shortcuts" #~ msgstr "_Atajos de teclado" #~ msgid "_About Refine" #~ msgstr "_Sobre Refine" Refine-0.7.1/po/fa.po000066400000000000000000000272651514222123300143020ustar00rootroot00000000000000# Persian translation of Refine. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the refine package. # Danial Behzadi , 2025. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: refine\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-01-03 13:23-0500\n" "PO-Revision-Date: 2025-04-19 21:02+0330\n" "Last-Translator: Danial Behzadi \n" "Language-Team: \n" "Language: fa_IR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.6\n" #: data/page.tesk.Refine.desktop.in.in:2 #: data/page.tesk.Refine.metainfo.xml.in.in:7 refine/window.blp:5 msgid "Refine" msgstr "اصلاح" #: data/page.tesk.Refine.desktop.in.in:3 #: data/page.tesk.Refine.metainfo.xml.in.in:8 msgid "Tweak various aspects of GNOME" msgstr "سیخونک به جنبه‌های مختلف گنوم" #: data/page.tesk.Refine.desktop.in.in:9 msgid "tweaks;tweak;toggle;" msgstr "tweaks;tweak;toggle;سیخونک;تغییر;" #: data/page.tesk.Refine.metainfo.xml.in.in:10 msgid "Refine helps discover advanced and experimental features in GNOME." msgstr "اصلاح به کشف ویژگی‌های پیش رفته و آزمایشی گنوم کمک می‌کند." #: data/page.tesk.Refine.metainfo.xml.in.in:14 msgid "Hari Rana (TheEvilSkeleton)" msgstr "هاری رعنا (TheEvilSkeleton)" #: data/page.tesk.Refine.metainfo.xml.in.in:36 msgid "Appearance Page" msgstr "صفحهٔ ظاهر" #: data/page.tesk.Refine.metainfo.xml.in.in:40 #, fuzzy msgid "Shell & Compositor Page" msgstr "صفحهٔ پوسته و ترکیب‌بند" #. Translators: Replace "translator-credits" with your name/username, and optionally an email or URL. #: refine/main.py:82 msgid "translator-credits" msgstr "دانیال بهزادی " #: refine/main.py:83 msgid "Copyright © 2024 Hari Rana (TheEvilSkeleton)" msgstr "حق رونوشت © ۲۰۰۴ هاری رعنا (TheEvilSkeleton)" #: refine/main.py:87 msgid "Bottles" msgstr "بطری‌ها" #: refine/main.py:88 msgid "Run Windows software" msgstr "اجرای نرم‌افزارهای ویندوزی" #: refine/main.py:92 msgid "Upscaler" msgstr "مقیاس‌افزا" #: refine/main.py:93 msgid "Upscale and enhance images" msgstr "مقیاس‌افزایی و بالا بردن کیفیت تصاویر" #: refine/sections/appearance.blp:5 msgid "Appearance" msgstr "ظاهر" #: refine/sections/appearance.blp:9 msgid "Themes" msgstr "زمینه‌ها" #: refine/sections/appearance.blp:12 msgid "Cursors" msgstr "نشانگرها" #: refine/sections/appearance.blp:20 msgid "Icons" msgstr "نقشک‌ها" #: refine/sections/appearance.blp:28 msgid "GTK 3/4 Theme" msgstr "زمینه‌های GTK 3/4" #: refine/sections/appearance.blp:29 msgid "Platform libraries may ignore this option" msgstr "ممکن است کتابخانه‌های بن‌سازه‌ای نادیده‌اش بگیرند" #: refine/sections/appearance.blp:44 msgid "Light Style" msgstr "سبک روشن" #: refine/sections/appearance.blp:45 msgid "Use a light appearance for the shell and supported apps" msgstr "استفاده از ظاهری روشن برای پوسته و کاره‌های پشتیبانی شده" #: refine/sections/appearance.blp:53 msgid "Fonts" msgstr "قلم‌ها" #: refine/sections/appearance.blp:56 msgid "Interface" msgstr "میانا" #: refine/sections/appearance.blp:62 msgid "Document" msgstr "سند" #: refine/sections/appearance.blp:68 msgid "Monospace" msgstr "تک‌عرض" #: refine/sections/appearance.blp:75 msgid "Text Rendering" msgstr "پرداخت کردن متن" #: refine/sections/appearance.blp:78 msgid "Font Hinting" msgstr "سرنخ دهی قلم" #: refine/sections/appearance.blp:79 msgid "Adjusts text shapes for better clarity, especially at smaller sizes" msgstr "تغییر شکل متن برای وضوع بهتر به خصوص در اندازه‌های کوچک‌تر" #: refine/sections/appearance.blp:86 msgid "Font Antialiasing" msgstr "خوش‌نما سازی قلم" #: refine/sections/appearance.blp:87 msgid "Smooths text edges for better clarity by blending colors" msgstr "نرم کردن گوشه‌های متن برای وضوح بهتر با آمیختن رنگ‌ها" #: refine/sections/appearance.blp:95 msgid "Background" msgstr "پس‌زمینه" #: refine/sections/appearance.blp:98 msgid "Adjustment" msgstr "تنظیم" #: refine/sections/mouse-touchpad.blp:5 msgid "Mouse & Touchpad" msgstr "موشی و صفحه‌لمسی" #: refine/sections/mouse-touchpad.blp:9 msgid "Mouse" msgstr "موشی" #: refine/sections/mouse-touchpad.blp:12 msgid "Middle Click to Paste Text" msgstr "کلیک وسط برای جایگذاری متن" #: refine/sections/mouse-touchpad.blp:13 msgid "Paste highlighted text, independent of the clipboard" msgstr "جای‌گذاری متن گزیده، فارغ از تخته‌گیره" #: refine/sections/mouse-touchpad.blp:20 msgid "Window Header Bar Actions" msgstr "کنش‌های نوار سرایند پنجره" #: refine/sections/mouse-touchpad.blp:23 msgid "Double Click" msgstr "دوبار کلیک" #: refine/sections/mouse-touchpad.blp:36 msgid "Middle Click" msgstr "کلیک وسط" #: refine/sections/mouse-touchpad.blp:49 msgid "Secondary Click" msgstr "کلیک دوم" #: refine/sections/power.blp:5 msgid "Power" msgstr "" #: refine/sections/power.blp:10 msgid "Show Power Buttons in Lock Screen" msgstr "" #: refine/sections/shell-compositor.blp:5 msgid "Shell & Compositor" msgstr "پوسته و ترکیب‌بند" #: refine/sections/shell-compositor.blp:10 msgid "Center New Windows" msgstr "در مرکز قرار دادن پنجره‌های جدید" #: refine/sections/shell-compositor.blp:16 msgid "Attach Modal Windows" msgstr "پیوست کردن پنجره‌های چسبان" #: refine/sections/shell-compositor.blp:17 msgid "" "Attaches modal windows to their parent window to prevent them from moving " "independently" msgstr "پیوست کردن پنجره‌های چسبان به والدشان برای جلوگیری از جابه‌جایی مستقل" #: refine/sections/shell-compositor.blp:23 msgid "Resize With Secondary Clicks" msgstr "تغییر اندازه با کلیک دوم" #: refine/sections/shell-compositor.blp:24 msgid "" "Use Secondary Click instead of Middle Click to resize windows while holding " "the window action key" msgstr "" "استفاده از کلیک دوم به جای کلیک وسط برای تغییر اندازهٔ پنجره‌ها هنگام نگه " "داشتن کلید کنش پنجره" #: refine/sections/shell-compositor.blp:32 msgid "Window Focus Mode" msgstr "حالت تمرکز پنجره" #: refine/sections/shell-compositor.blp:33 msgid "Sets the action that will cause a window to take focus" msgstr "تنظیم کنش منجر به متمرکز شدن پنجره" #: refine/sections/shell-compositor.blp:40 msgid "Automatically Raise on Hover" msgstr "خیزش خودکار با شناوری" #: refine/sections/shell-compositor.blp:41 msgid "Automatically raises the focused window" msgstr "خیزش خودکار پنجرهٔ متمرکز" #: refine/sections/shell-compositor.blp:48 msgid "Window Button Layout" msgstr "چینش دکمه‌های پنجره" #: refine/sections/shell-compositor.blp:51 msgid "Header Bar" msgstr "نوار سرایند" #: refine/sections/shell-compositor.blp:64 msgid "Experimental Features" msgstr "ویژگی‌های آزمایشی" #: refine/sections/shell-compositor.blp:71 msgid "Fractional Scaling Options" msgstr "گزینه‌های مقیاس کردن اعشاری" #: refine/sections/shell-compositor.blp:72 #: refine/sections/shell-compositor.blp:80 msgid "These options will appear in Settings" msgstr "این گزینه‌ها رد تنظیمات ظاهر خواهند شد" #: refine/sections/shell-compositor.blp:79 msgid "Variable Refresh Rate Options" msgstr "گزینه‌های آهنگ نوسازی متغیّر" #: refine/sections/shell-compositor.blp:94 msgid "Autoclose Xwayland" msgstr "" #: refine/sections/shell-compositor.blp:102 msgid "Xwayland Native Scaling" msgstr "مقیاس کردن بومی اکس‌ویلند" #: refine/sections/sound.blp:5 msgid "Sound" msgstr "صدا" #: refine/sections/sound.blp:10 msgid "Volume Step" msgstr "گام حجم صدا" #: refine/sections/wellbeing.blp:5 msgid "Wellbeing" msgstr "" #: refine/sections/wellbeing.blp:9 msgid "Eyesight Reminders" msgstr "" #: refine/sections/wellbeing.blp:12 refine/sections/wellbeing.blp:113 msgid "Show Countdown When Break Is Due" msgstr "" #: refine/sections/wellbeing.blp:18 refine/sections/wellbeing.blp:119 msgid "Lock Screen During Break" msgstr "" #: refine/sections/wellbeing.blp:24 refine/sections/wellbeing.blp:125 msgid "Delay (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:25 refine/sections/wellbeing.blp:126 msgid "Amount to delay break if requested" msgstr "" #: refine/sections/wellbeing.blp:53 refine/sections/wellbeing.blp:154 msgid "Break Duration (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:81 refine/sections/wellbeing.blp:182 msgid "Time Between Breaks (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:110 msgid "Movement Reminders" msgstr "" #: refine/widgets/panel-page.blp:6 msgid "Options will be changed after next login" msgstr "گزینه‌ها پس از ورود بعدی تغییر خواهند کرد" #: refine/widgets/reset_button.py:34 refine/widgets/window-buttons-row.blp:64 msgid "Reset" msgstr "بازنشانی" #: refine/widgets/window-buttons-row.blp:48 msgid "Hidden" msgstr "نهفته" #: refine/widgets/window_buttons_row.py:95 msgid "Move to _Left Corner" msgstr "جابه‌جایی به گوشهٔ _راست" #: refine/widgets/window_buttons_row.py:99 msgid "Move to _Right Corner" msgstr "جابه‌جایی به گوشهٔ _چپ" #: refine/widgets/window_buttons_row.py:109 msgid "Move _Left" msgstr "جابه‌جایی به _چپ" #: refine/widgets/window_buttons_row.py:113 msgid "Move _Right" msgstr "جابه‌جایی به _راست" #: refine/widgets/window_buttons_row.py:116 msgid "_Hide" msgstr "_نهفتن" #: refine/window.blp:34 refine/window.blp:65 msgid "About Refine" msgstr "دربارهٔ اصلاح" #: refine/window.blp:73 msgid "Unsupported Environment" msgstr "محیط پشتیبانی نشده" #: refine/window.blp:76 msgid "Accept the Risk and Continue" msgstr "پذیرش خطر و ادامه" #: refine/window.py:118 msgid "" "Some settings may not work as intended and could lead to undesirable " "behavior." msgstr "" "ممکن است برخی تنظیمات آن گونه که انتظار می‌رود کار نکنند که می‌تواند منجر به " "رفتار غیردلخواه شود." #: refine/window.py:125 msgid "" "Refine only supports versions of GNOME that have not been modified by the " "operating system." msgstr "" "اصلاح تنها نگارش‌هایی از گنوم را پشتیبانی می‌کند که به دست سیستم‌عامل دستکاری " "نشده باشند." #: refine/window.py:133 msgid "Refine is only intended to run on the GNOME desktop environment." msgstr "اصلاح تنها برای اجرا روی محیط میزکار گنوم طرّاحی شده است." #~ msgid "@app_name@" #~ msgstr "اصلاح" #~ msgctxt "shortcut window" #~ msgid "General" #~ msgstr "عمومی" #~ msgctxt "shortcut window" #~ msgid "Show Shortcuts" #~ msgstr "نمایش میان‌برها" #~ msgctxt "shortcut window" #~ msgid "Quit" #~ msgstr "خروج" #~ msgid "Main Menu" #~ msgstr "فهرست اصلی" #~ msgid "_Keyboard Shortcuts" #~ msgstr "_میان‌برهای صفحه‌کلید" #~ msgid "_About Refine" #~ msgstr "_دربارهٔ اصلاح" Refine-0.7.1/po/fr.po000066400000000000000000000255431514222123300143200ustar00rootroot00000000000000# French translation for Refine. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the refine package. # Utsuro , 2025. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: refine\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-01-03 13:23-0500\n" "PO-Revision-Date: 2025-03-06 21:30+0100\n" "Last-Translator: Utsuro \n" "Language-Team: \n" "Language: fr_FR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.5\n" #: data/page.tesk.Refine.desktop.in.in:2 #: data/page.tesk.Refine.metainfo.xml.in.in:7 refine/window.blp:5 msgid "Refine" msgstr "Refine" #: data/page.tesk.Refine.desktop.in.in:3 #: data/page.tesk.Refine.metainfo.xml.in.in:8 msgid "Tweak various aspects of GNOME" msgstr "Ajuster divers aspects de GNOME" #: data/page.tesk.Refine.desktop.in.in:9 msgid "tweaks;tweak;toggle;" msgstr "tweaks;tweak;toggle;ajustements;ajuster;activer;" #: data/page.tesk.Refine.metainfo.xml.in.in:10 msgid "Refine helps discover advanced and experimental features in GNOME." msgstr "" "Refine facilite la découverte de fonctions avancées et expérimentales de " "GNOME." #: data/page.tesk.Refine.metainfo.xml.in.in:14 msgid "Hari Rana (TheEvilSkeleton)" msgstr "Hari Rana (TheEvilSkeleton)" #: data/page.tesk.Refine.metainfo.xml.in.in:36 msgid "Appearance Page" msgstr "Page « Apparence »" #: data/page.tesk.Refine.metainfo.xml.in.in:40 #, fuzzy msgid "Shell & Compositor Page" msgstr "Page « Shell et compositeur »" #. Translators: Replace "translator-credits" with your name/username, and optionally an email or URL. #: refine/main.py:82 msgid "translator-credits" msgstr "" "Utsuro\n" "Irénée THIRION" #: refine/main.py:83 msgid "Copyright © 2024 Hari Rana (TheEvilSkeleton)" msgstr "Copyright © 2024 Hari Rana (TheEvilSkeleton)" #: refine/main.py:87 msgid "Bottles" msgstr "Bouteilles" #: refine/main.py:88 msgid "Run Windows software" msgstr "Exécuter des logiciels Windows" #: refine/main.py:92 msgid "Upscaler" msgstr "Upscaler" #: refine/main.py:93 msgid "Upscale and enhance images" msgstr "Mettre à l'échelle et améliorer des images" #: refine/sections/appearance.blp:5 msgid "Appearance" msgstr "Apparence" #: refine/sections/appearance.blp:9 msgid "Themes" msgstr "Thèmes" #: refine/sections/appearance.blp:12 msgid "Cursors" msgstr "Curseurs" #: refine/sections/appearance.blp:20 msgid "Icons" msgstr "Icônes" #: refine/sections/appearance.blp:28 msgid "GTK 3/4 Theme" msgstr "Thème GTK 3/4" #: refine/sections/appearance.blp:29 msgid "Platform libraries may ignore this option" msgstr "Les bibliothèques de la plateforme pourraient ignorer cette option" #: refine/sections/appearance.blp:44 msgid "Light Style" msgstr "Thème clair" #: refine/sections/appearance.blp:45 msgid "Use a light appearance for the shell and supported apps" msgstr "" "Définir une apparence claire pour le shell et les applications compatibles" #: refine/sections/appearance.blp:53 msgid "Fonts" msgstr "Polices" #: refine/sections/appearance.blp:56 msgid "Interface" msgstr "Interface" #: refine/sections/appearance.blp:62 msgid "Document" msgstr "Document" #: refine/sections/appearance.blp:68 msgid "Monospace" msgstr "Monospace" #: refine/sections/appearance.blp:75 msgid "Text Rendering" msgstr "Rendu du texte" #: refine/sections/appearance.blp:78 msgid "Font Hinting" msgstr "Optimisations de la police" #: refine/sections/appearance.blp:79 msgid "Adjusts text shapes for better clarity, especially at smaller sizes" msgstr "" "Ajuste la forme du texte pour plus de clarté, particulièrement pour les " "petites tailles" #: refine/sections/appearance.blp:86 msgid "Font Antialiasing" msgstr "Anticrénelage de la police" #: refine/sections/appearance.blp:87 msgid "Smooths text edges for better clarity by blending colors" msgstr "" "Adoucit les bords du texte pour une plus de clarté en mélangeant les couleurs" #: refine/sections/appearance.blp:95 msgid "Background" msgstr "Fond d’écran" #: refine/sections/appearance.blp:98 msgid "Adjustment" msgstr "Ajustement" #: refine/sections/mouse-touchpad.blp:5 msgid "Mouse & Touchpad" msgstr "Souris et pavé tactile" #: refine/sections/mouse-touchpad.blp:9 msgid "Mouse" msgstr "Souris" #: refine/sections/mouse-touchpad.blp:12 msgid "Middle Click to Paste Text" msgstr "Clic du milieu pour coller du texte" #: refine/sections/mouse-touchpad.blp:13 msgid "Paste highlighted text, independent of the clipboard" msgstr "Coller le texte surligné, indépendamment du presse-papiers" #: refine/sections/mouse-touchpad.blp:20 msgid "Window Header Bar Actions" msgstr "Actions dans la barre de titre des fenêtres" #: refine/sections/mouse-touchpad.blp:23 msgid "Double Click" msgstr "Double clic" #: refine/sections/mouse-touchpad.blp:36 msgid "Middle Click" msgstr "Clic du milieu" #: refine/sections/mouse-touchpad.blp:49 msgid "Secondary Click" msgstr "Clic secondaire" #: refine/sections/power.blp:5 msgid "Power" msgstr "" #: refine/sections/power.blp:10 msgid "Show Power Buttons in Lock Screen" msgstr "" #: refine/sections/shell-compositor.blp:5 msgid "Shell & Compositor" msgstr "Shell et compositeur" #: refine/sections/shell-compositor.blp:10 msgid "Center New Windows" msgstr "Centrer les nouvelles fenêtres" #: refine/sections/shell-compositor.blp:16 msgid "Attach Modal Windows" msgstr "Attacher les fenêtres modales" #: refine/sections/shell-compositor.blp:17 msgid "" "Attaches modal windows to their parent window to prevent them from moving " "independently" msgstr "" "Attache les fenêtres modales à leur fenêtre parente pour éviter qu’elles ne " "se déplacent indépendamment" #: refine/sections/shell-compositor.blp:23 msgid "Resize With Secondary Clicks" msgstr "Redimensionner avec les clics secondaires" #: refine/sections/shell-compositor.blp:24 msgid "" "Use Secondary Click instead of Middle Click to resize windows while holding " "the window action key" msgstr "" "Utiliser le clic secondaire au lieu du clic du milieu pour redimensionner " "les fenêtres, en maintenant la touche d’action de la fenêtre enfoncée" #: refine/sections/shell-compositor.blp:32 msgid "Window Focus Mode" msgstr "Mode de focus de la fenêtre" #: refine/sections/shell-compositor.blp:33 msgid "Sets the action that will cause a window to take focus" msgstr "Définit l’action qui permettra à une fenêtre de prendre le focus" #: refine/sections/shell-compositor.blp:40 msgid "Automatically Raise on Hover" msgstr "Élever automatiquement au survol" #: refine/sections/shell-compositor.blp:41 msgid "Automatically raises the focused window" msgstr "Élève automatiquement la fenêtre focalisée" #: refine/sections/shell-compositor.blp:48 msgid "Window Button Layout" msgstr "Disposition des boutons de la fenêtre" #: refine/sections/shell-compositor.blp:51 msgid "Header Bar" msgstr "Barre de titre" #: refine/sections/shell-compositor.blp:64 msgid "Experimental Features" msgstr "Fonctions expérimentales" #: refine/sections/shell-compositor.blp:71 msgid "Fractional Scaling Options" msgstr "Options de mise à l’échelle fractionnaire" #: refine/sections/shell-compositor.blp:72 #: refine/sections/shell-compositor.blp:80 msgid "These options will appear in Settings" msgstr "Ces options apparaîtront dans les Paramètres" #: refine/sections/shell-compositor.blp:79 msgid "Variable Refresh Rate Options" msgstr "Options de taux de rafraîchissement variable" #: refine/sections/shell-compositor.blp:94 msgid "Autoclose Xwayland" msgstr "" #: refine/sections/shell-compositor.blp:102 msgid "Xwayland Native Scaling" msgstr "Mise à l’échelle native Xwayland" #: refine/sections/sound.blp:5 msgid "Sound" msgstr "Son" #: refine/sections/sound.blp:10 msgid "Volume Step" msgstr "Échelons du volume" #: refine/sections/wellbeing.blp:5 msgid "Wellbeing" msgstr "" #: refine/sections/wellbeing.blp:9 msgid "Eyesight Reminders" msgstr "" #: refine/sections/wellbeing.blp:12 refine/sections/wellbeing.blp:113 msgid "Show Countdown When Break Is Due" msgstr "" #: refine/sections/wellbeing.blp:18 refine/sections/wellbeing.blp:119 msgid "Lock Screen During Break" msgstr "" #: refine/sections/wellbeing.blp:24 refine/sections/wellbeing.blp:125 msgid "Delay (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:25 refine/sections/wellbeing.blp:126 msgid "Amount to delay break if requested" msgstr "" #: refine/sections/wellbeing.blp:53 refine/sections/wellbeing.blp:154 msgid "Break Duration (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:81 refine/sections/wellbeing.blp:182 msgid "Time Between Breaks (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:110 msgid "Movement Reminders" msgstr "" #: refine/widgets/panel-page.blp:6 msgid "Options will be changed after next login" msgstr "Les options seront appliquées à la prochaine connexion" #: refine/widgets/reset_button.py:34 refine/widgets/window-buttons-row.blp:64 msgid "Reset" msgstr "Réinitialiser" #: refine/widgets/window-buttons-row.blp:48 msgid "Hidden" msgstr "Masqué" #: refine/widgets/window_buttons_row.py:95 msgid "Move to _Left Corner" msgstr "Déplacer vers le coin _gauche" #: refine/widgets/window_buttons_row.py:99 msgid "Move to _Right Corner" msgstr "Déplacer vers le coin _droit" #: refine/widgets/window_buttons_row.py:109 msgid "Move _Left" msgstr "Déplacer vers la _gauche" #: refine/widgets/window_buttons_row.py:113 msgid "Move _Right" msgstr "Déplacer vers la _droite" #: refine/widgets/window_buttons_row.py:116 msgid "_Hide" msgstr "_Masquer" #: refine/window.blp:34 refine/window.blp:65 msgid "About Refine" msgstr "À propos de Refine" #: refine/window.blp:73 msgid "Unsupported Environment" msgstr "Environnement incompatible" #: refine/window.blp:76 msgid "Accept the Risk and Continue" msgstr "Accepter le risque et continuer" #: refine/window.py:118 msgid "" "Some settings may not work as intended and could lead to undesirable " "behavior." msgstr "" "Certains réglages pourraient ne pas fonctionner comme prévu et entraîner un " "comportement indésirable." #: refine/window.py:125 msgid "" "Refine only supports versions of GNOME that have not been modified by the " "operating system." msgstr "" "Refine prend seulement en charge les versions de GNOME non modifiées par le " "système d’exploitation." #: refine/window.py:133 msgid "Refine is only intended to run on the GNOME desktop environment." msgstr "Refine ne fonctionne que dans l’environnement de bureau GNOME." #~ msgid "@app_name@" #~ msgstr "@app_name@" #~ msgctxt "shortcut window" #~ msgid "General" #~ msgstr "Général" #~ msgctxt "shortcut window" #~ msgid "Show Shortcuts" #~ msgstr "Afficher les raccourcis" #~ msgctxt "shortcut window" #~ msgid "Quit" #~ msgstr "Quitter" #~ msgid "Main Menu" #~ msgstr "Menu principal" #~ msgid "_Keyboard Shortcuts" #~ msgstr "_Raccourcis clavier" #~ msgid "_About Refine" #~ msgstr "À _propos de Refine" Refine-0.7.1/po/id.po000066400000000000000000000250171514222123300143010ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the refine package. # FIRST AUTHOR , YEAR. # Proficiency , 2025. # msgid "" msgstr "" "Project-Id-Version: refine\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-01-03 13:23-0500\n" "PO-Revision-Date: 2025-06-29 00:23+0700\n" "Last-Translator: Proficiency \n" "Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Gtranslator 48.0\n" #: data/page.tesk.Refine.desktop.in.in:2 #: data/page.tesk.Refine.metainfo.xml.in.in:7 refine/window.blp:5 msgid "Refine" msgstr "Refine" #: data/page.tesk.Refine.desktop.in.in:3 #: data/page.tesk.Refine.metainfo.xml.in.in:8 msgid "Tweak various aspects of GNOME" msgstr "Sesuaikan berbagai aspek GNOME" #: data/page.tesk.Refine.desktop.in.in:9 msgid "tweaks;tweak;toggle;" msgstr "sempurnakan;sesuaikan;alihkan" #: data/page.tesk.Refine.metainfo.xml.in.in:10 msgid "Refine helps discover advanced and experimental features in GNOME." msgstr "" "Refine membantu menemukan fitur-fitur canggih dan eksperimental di GNOME" #: data/page.tesk.Refine.metainfo.xml.in.in:14 msgid "Hari Rana (TheEvilSkeleton)" msgstr "Hari Rana (TheEvilSkeleton)" #: data/page.tesk.Refine.metainfo.xml.in.in:36 msgid "Appearance Page" msgstr "Halaman Tampilan" #: data/page.tesk.Refine.metainfo.xml.in.in:40 #, fuzzy msgid "Shell & Compositor Page" msgstr "Halaman Shell & Kompositor" #. Translators: Replace "translator-credits" with your name/username, and optionally an email or URL. #: refine/main.py:82 msgid "translator-credits" msgstr "kredit-penerjemah" #: refine/main.py:83 msgid "Copyright © 2024 Hari Rana (TheEvilSkeleton)" msgstr "Hak Cipta © 2024 Hari Rana (TheEvilSkeleton)" #: refine/main.py:87 msgid "Bottles" msgstr "Bottles" #: refine/main.py:88 msgid "Run Windows software" msgstr "Jalankan perangkat lunak Windows" #: refine/main.py:92 msgid "Upscaler" msgstr "Upscaler" #: refine/main.py:93 msgid "Upscale and enhance images" msgstr "Meningkatkan resolusi dan menyempurnakan gambar" #: refine/sections/appearance.blp:5 msgid "Appearance" msgstr "Tampilan" #: refine/sections/appearance.blp:9 msgid "Themes" msgstr "Tema" #: refine/sections/appearance.blp:12 msgid "Cursors" msgstr "Kursor" #: refine/sections/appearance.blp:20 msgid "Icons" msgstr "Ikon" #: refine/sections/appearance.blp:28 msgid "GTK 3/4 Theme" msgstr "Tema GTK 3/4" #: refine/sections/appearance.blp:29 msgid "Platform libraries may ignore this option" msgstr "Pustaka platform mungkin mengabaikan opsi ini" #: refine/sections/appearance.blp:44 msgid "Light Style" msgstr "Mode Terang" #: refine/sections/appearance.blp:45 msgid "Use a light appearance for the shell and supported apps" msgstr "Gunakan tampilan terang untuk shell dan aplikasi yang didukung" #: refine/sections/appearance.blp:53 msgid "Fonts" msgstr "Font" #: refine/sections/appearance.blp:56 msgid "Interface" msgstr "Antarmuka" #: refine/sections/appearance.blp:62 msgid "Document" msgstr "Dokumen" #: refine/sections/appearance.blp:68 msgid "Monospace" msgstr "Monospace" #: refine/sections/appearance.blp:75 msgid "Text Rendering" msgstr "Render Teks" #: refine/sections/appearance.blp:78 msgid "Font Hinting" msgstr "Font Hinting" #: refine/sections/appearance.blp:79 msgid "Adjusts text shapes for better clarity, especially at smaller sizes" msgstr "" "Mengatur bentuk teks untuk kejelasan yang lebih baik, terutama pada ukuran " "yang lebih kecil" #: refine/sections/appearance.blp:86 msgid "Font Antialiasing" msgstr "Antialiasing Font" #: refine/sections/appearance.blp:87 msgid "Smooths text edges for better clarity by blending colors" msgstr "" "Menghaluskan tepi teks untuk kejelasan yang lebih baik dengan memadukan warna" #: refine/sections/appearance.blp:95 msgid "Background" msgstr "Latar Belakang" #: refine/sections/appearance.blp:98 msgid "Adjustment" msgstr "Penyesuaian" #: refine/sections/mouse-touchpad.blp:5 msgid "Mouse & Touchpad" msgstr "Mouse & Panel Sentuh" #: refine/sections/mouse-touchpad.blp:9 msgid "Mouse" msgstr "Mouse" #: refine/sections/mouse-touchpad.blp:12 msgid "Middle Click to Paste Text" msgstr "Klik Tengah untuk Menempel Teks" #: refine/sections/mouse-touchpad.blp:13 msgid "Paste highlighted text, independent of the clipboard" msgstr "Tempel Teks yang Disorot, Independen dari clipboard" #: refine/sections/mouse-touchpad.blp:20 msgid "Window Header Bar Actions" msgstr "Window Header Bar " #: refine/sections/mouse-touchpad.blp:23 msgid "Double Click" msgstr "Klik Ganda" #: refine/sections/mouse-touchpad.blp:36 msgid "Middle Click" msgstr "Klik Tengah" #: refine/sections/mouse-touchpad.blp:49 msgid "Secondary Click" msgstr "Klik Sekunder" #: refine/sections/power.blp:5 msgid "Power" msgstr "" #: refine/sections/power.blp:10 msgid "Show Power Buttons in Lock Screen" msgstr "" #: refine/sections/shell-compositor.blp:5 msgid "Shell & Compositor" msgstr "Shell & Kompositor" #: refine/sections/shell-compositor.blp:10 msgid "Center New Windows" msgstr "Tampilkan Jendela Baru ditengah" #: refine/sections/shell-compositor.blp:16 msgid "Attach Modal Windows" msgstr "Tempel Jendela Modal" #: refine/sections/shell-compositor.blp:17 msgid "" "Attaches modal windows to their parent window to prevent them from moving " "independently" msgstr "" "Menempelkan jendela modal ke jendela induknya untuk mencegahnya bergerak " "secara independen." #: refine/sections/shell-compositor.blp:23 msgid "Resize With Secondary Clicks" msgstr "Ubah Ukuran dengan Klik Sekunder" #: refine/sections/shell-compositor.blp:24 msgid "" "Use Secondary Click instead of Middle Click to resize windows while holding " "the window action key" msgstr "" "Gunakan Klik Sekunder daripada Klik Tengah untuk mengubah ukuran jendela " "sambil menahan tombol aksi jendela" #: refine/sections/shell-compositor.blp:32 msgid "Window Focus Mode" msgstr "Mode Fokus Jendela" #: refine/sections/shell-compositor.blp:33 msgid "Sets the action that will cause a window to take focus" msgstr "Mengatur tindakan yang akan menyebabkan jendela mendapatkan fokus" #: refine/sections/shell-compositor.blp:40 msgid "Automatically Raise on Hover" msgstr "Angkat Otomatis saat Hover" #: refine/sections/shell-compositor.blp:41 msgid "Automatically raises the focused window" msgstr "Secara otomatis mengangkat jendela yang sedang difokuskan" #: refine/sections/shell-compositor.blp:48 msgid "Window Button Layout" msgstr "Tata Letak Tombol Jendela" #: refine/sections/shell-compositor.blp:51 msgid "Header Bar" msgstr "Bilah Header" #: refine/sections/shell-compositor.blp:64 msgid "Experimental Features" msgstr "Fitur Eksperimental" #: refine/sections/shell-compositor.blp:71 msgid "Fractional Scaling Options" msgstr "Opsi Fractional Scaling" #: refine/sections/shell-compositor.blp:72 #: refine/sections/shell-compositor.blp:80 msgid "These options will appear in Settings" msgstr "Opsi ini akan muncul di Pengaturan" #: refine/sections/shell-compositor.blp:79 msgid "Variable Refresh Rate Options" msgstr "Opsi Variable Refresh Rate" #: refine/sections/shell-compositor.blp:94 msgid "Autoclose Xwayland" msgstr "" #: refine/sections/shell-compositor.blp:102 msgid "Xwayland Native Scaling" msgstr "Penskalaan Asli Xwayland" #: refine/sections/sound.blp:5 msgid "Sound" msgstr "Suara" #: refine/sections/sound.blp:10 msgid "Volume Step" msgstr "Langkah Volume" #: refine/sections/wellbeing.blp:5 msgid "Wellbeing" msgstr "" #: refine/sections/wellbeing.blp:9 msgid "Eyesight Reminders" msgstr "" #: refine/sections/wellbeing.blp:12 refine/sections/wellbeing.blp:113 msgid "Show Countdown When Break Is Due" msgstr "" #: refine/sections/wellbeing.blp:18 refine/sections/wellbeing.blp:119 msgid "Lock Screen During Break" msgstr "" #: refine/sections/wellbeing.blp:24 refine/sections/wellbeing.blp:125 msgid "Delay (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:25 refine/sections/wellbeing.blp:126 msgid "Amount to delay break if requested" msgstr "" #: refine/sections/wellbeing.blp:53 refine/sections/wellbeing.blp:154 msgid "Break Duration (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:81 refine/sections/wellbeing.blp:182 msgid "Time Between Breaks (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:110 msgid "Movement Reminders" msgstr "" #: refine/widgets/panel-page.blp:6 msgid "Options will be changed after next login" msgstr "Opsi akan diubah setelah login berikutnya" #: refine/widgets/reset_button.py:34 refine/widgets/window-buttons-row.blp:64 msgid "Reset" msgstr "Setel Ulang" #: refine/widgets/window-buttons-row.blp:48 msgid "Hidden" msgstr "Tersembunyi" #: refine/widgets/window_buttons_row.py:95 msgid "Move to _Left Corner" msgstr "Pindah ke _Pojok Kiri" #: refine/widgets/window_buttons_row.py:99 msgid "Move to _Right Corner" msgstr "Pindah ke _Pojok Kanan" #: refine/widgets/window_buttons_row.py:109 msgid "Move _Left" msgstr "Pindah _Ke Kiri" #: refine/widgets/window_buttons_row.py:113 msgid "Move _Right" msgstr "Pindah _Ke Kanan" #: refine/widgets/window_buttons_row.py:116 msgid "_Hide" msgstr "_Sembunyikan" #: refine/window.blp:34 refine/window.blp:65 msgid "About Refine" msgstr "Tentang Refine" #: refine/window.blp:73 msgid "Unsupported Environment" msgstr "Lingkungan Tidak Didukung" #: refine/window.blp:76 msgid "Accept the Risk and Continue" msgstr "Terima Risiko dan Lanjutkan" #: refine/window.py:118 msgid "" "Some settings may not work as intended and could lead to undesirable " "behavior." msgstr "" "Beberapa pengaturan mungkin tidak berfungsi seperti yang diharapkan dan " "dapat menyebabkan perilaku yang tidak diinginkan." #: refine/window.py:125 msgid "" "Refine only supports versions of GNOME that have not been modified by the " "operating system." msgstr "" "Refine hanya mendukung versi GNOME yang belum dimodifikasi oleh sistem " "operasi." #: refine/window.py:133 msgid "Refine is only intended to run on the GNOME desktop environment." msgstr "Refine hanya dimaksudkan untuk berjalan di lingkungan desktop GNOME." #~ msgid "@app_name@" #~ msgstr "@app_name@" #~ msgctxt "shortcut window" #~ msgid "General" #~ msgstr "Umum" #~ msgctxt "shortcut window" #~ msgid "Show Shortcuts" #~ msgstr "Tampilkan Pintasan" #~ msgctxt "shortcut window" #~ msgid "Quit" #~ msgstr "Keluar" #~ msgid "Main Menu" #~ msgstr "Menu Utama" #~ msgid "_Keyboard Shortcuts" #~ msgstr "_Pintasan Keyboard" #~ msgid "_About Refine" #~ msgstr "_Tentang Refine" Refine-0.7.1/po/it_IT.po000066400000000000000000000250061514222123300147130ustar00rootroot00000000000000# Italian translation for Refine. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the refine package. # Sebastiano D'Angelo , 2025. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: refine\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-01-03 13:23-0500\n" "PO-Revision-Date: 2025-03-06 16:58+0100\n" "Last-Translator: Sebastiano D'Angelo \n" "Language-Team: \n" "Language: it_IT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: data/page.tesk.Refine.desktop.in.in:2 #: data/page.tesk.Refine.metainfo.xml.in.in:7 refine/window.blp:5 msgid "Refine" msgstr "Refine" #: data/page.tesk.Refine.desktop.in.in:3 #: data/page.tesk.Refine.metainfo.xml.in.in:8 msgid "Tweak various aspects of GNOME" msgstr "Personalizza vari aspetti di GNOME" #: data/page.tesk.Refine.desktop.in.in:9 msgid "tweaks;tweak;toggle;" msgstr "tweaks;tweak;toggle;" #: data/page.tesk.Refine.metainfo.xml.in.in:10 msgid "Refine helps discover advanced and experimental features in GNOME." msgstr "Refine aiuta a scoprire funzioni avanzate e sperimentali in GNOME." #: data/page.tesk.Refine.metainfo.xml.in.in:14 msgid "Hari Rana (TheEvilSkeleton)" msgstr "Hari Rana (TheEvilSkeleton)" #: data/page.tesk.Refine.metainfo.xml.in.in:36 msgid "Appearance Page" msgstr "Aspetto" #: data/page.tesk.Refine.metainfo.xml.in.in:40 #, fuzzy msgid "Shell & Compositor Page" msgstr "Shell e Compositor" #. Translators: Replace "translator-credits" with your name/username, and optionally an email or URL. #: refine/main.py:82 msgid "translator-credits" msgstr "Sebastiano D'Angelo (NostalgicKitsune)" #: refine/main.py:83 msgid "Copyright © 2024 Hari Rana (TheEvilSkeleton)" msgstr "Copyright © 2024 Hari Rana (TheEvilSkeleton)" #: refine/main.py:87 msgid "Bottles" msgstr "Bottles" #: refine/main.py:88 msgid "Run Windows software" msgstr "Avvia software per Windows" #: refine/main.py:92 msgid "Upscaler" msgstr "Upscaler" #: refine/main.py:93 msgid "Upscale and enhance images" msgstr "Aumenta e migliora immagini" #: refine/sections/appearance.blp:5 msgid "Appearance" msgstr "Aspetto" #: refine/sections/appearance.blp:9 msgid "Themes" msgstr "Stile" #: refine/sections/appearance.blp:12 msgid "Cursors" msgstr "Cursore" #: refine/sections/appearance.blp:20 msgid "Icons" msgstr "Icone" #: refine/sections/appearance.blp:28 msgid "GTK 3/4 Theme" msgstr "Tema GTK3/4" #: refine/sections/appearance.blp:29 msgid "Platform libraries may ignore this option" msgstr "Le librerie della piattaforma possono ignorare questa opzione" #: refine/sections/appearance.blp:44 msgid "Light Style" msgstr "Stile chiaro" #: refine/sections/appearance.blp:45 msgid "Use a light appearance for the shell and supported apps" msgstr "Utilizza uno stile chiaro per la shell e applicazioni supportate" #: refine/sections/appearance.blp:53 msgid "Fonts" msgstr "Tipi di carattere" #: refine/sections/appearance.blp:56 msgid "Interface" msgstr "Interfaccia" #: refine/sections/appearance.blp:62 msgid "Document" msgstr "Documenti" #: refine/sections/appearance.blp:68 msgid "Monospace" msgstr "Spaziatura fissa" #: refine/sections/appearance.blp:75 msgid "Text Rendering" msgstr "Rendering" #: refine/sections/appearance.blp:78 msgid "Font Hinting" msgstr "Hinting" #: refine/sections/appearance.blp:79 msgid "Adjusts text shapes for better clarity, especially at smaller sizes" msgstr "" "Regola le forme del testo per una migliore chiarezza, soprattutto nelle " "dimensioni più piccole" #: refine/sections/appearance.blp:86 msgid "Font Antialiasing" msgstr "Antialiasing" #: refine/sections/appearance.blp:87 msgid "Smooths text edges for better clarity by blending colors" msgstr "" "Smussa i bordi del testo per una migliore chiarezza, mescolando i colori" #: refine/sections/appearance.blp:95 msgid "Background" msgstr "Sfondo" #: refine/sections/appearance.blp:98 msgid "Adjustment" msgstr "Regolazione" #: refine/sections/mouse-touchpad.blp:5 msgid "Mouse & Touchpad" msgstr "Mouse e Touchpad" #: refine/sections/mouse-touchpad.blp:9 msgid "Mouse" msgstr "Mouse" #: refine/sections/mouse-touchpad.blp:12 msgid "Middle Click to Paste Text" msgstr "Clic centrale per incollare testo" #: refine/sections/mouse-touchpad.blp:13 msgid "Paste highlighted text, independent of the clipboard" msgstr "Incolla testo evidenziato, indipendentemente dagli appunti" #: refine/sections/mouse-touchpad.blp:20 msgid "Window Header Bar Actions" msgstr "Azioni barra del titolo" #: refine/sections/mouse-touchpad.blp:23 msgid "Double Click" msgstr "Doppio clic" #: refine/sections/mouse-touchpad.blp:36 msgid "Middle Click" msgstr "Clic centrale" #: refine/sections/mouse-touchpad.blp:49 msgid "Secondary Click" msgstr "Clic secondario" #: refine/sections/power.blp:5 msgid "Power" msgstr "" #: refine/sections/power.blp:10 msgid "Show Power Buttons in Lock Screen" msgstr "" #: refine/sections/shell-compositor.blp:5 msgid "Shell & Compositor" msgstr "Shell e Compositor" #: refine/sections/shell-compositor.blp:10 msgid "Center New Windows" msgstr "Accentra nuove finestre" #: refine/sections/shell-compositor.blp:16 msgid "Attach Modal Windows" msgstr "Allega finestre modali" #: refine/sections/shell-compositor.blp:17 msgid "" "Attaches modal windows to their parent window to prevent them from moving " "independently" msgstr "" "Allega le finestre modali alla finestra parente per impedire che si muovano " "in modo indipendente" #: refine/sections/shell-compositor.blp:23 msgid "Resize With Secondary Clicks" msgstr "Ridimensiona con clic secondario" #: refine/sections/shell-compositor.blp:24 msgid "" "Use Secondary Click instead of Middle Click to resize windows while holding " "the window action key" msgstr "" "Usa il clic secondario anziché il clic centrale per ridimensionare finestre " "tenendo premuto il tasto azione della finestra" #: refine/sections/shell-compositor.blp:32 msgid "Window Focus Mode" msgstr "Modalità sul focus della finestra" #: refine/sections/shell-compositor.blp:33 msgid "Sets the action that will cause a window to take focus" msgstr "Imposta l'azione che focalizza la finestra" #: refine/sections/shell-compositor.blp:40 msgid "Automatically Raise on Hover" msgstr "Alza automaticamente al passaggio" #: refine/sections/shell-compositor.blp:41 msgid "Automatically raises the focused window" msgstr "Solleva automaticamente la finestra focalizzata" #: refine/sections/shell-compositor.blp:48 msgid "Window Button Layout" msgstr "Disposizione pulsanti finestra" #: refine/sections/shell-compositor.blp:51 msgid "Header Bar" msgstr "Barra del titolo" #: refine/sections/shell-compositor.blp:64 msgid "Experimental Features" msgstr "Funzioni sperimentali" #: refine/sections/shell-compositor.blp:71 msgid "Fractional Scaling Options" msgstr "Opzioni fattore di scala" #: refine/sections/shell-compositor.blp:72 #: refine/sections/shell-compositor.blp:80 msgid "These options will appear in Settings" msgstr "Queste opzioni appariranno nelle Impostazioni" #: refine/sections/shell-compositor.blp:79 msgid "Variable Refresh Rate Options" msgstr "Opzioni refresh rate variabile" #: refine/sections/shell-compositor.blp:94 msgid "Autoclose Xwayland" msgstr "" #: refine/sections/shell-compositor.blp:102 msgid "Xwayland Native Scaling" msgstr "Scaling nativo Xwayland" #: refine/sections/sound.blp:5 msgid "Sound" msgstr "Suoni" #: refine/sections/sound.blp:10 msgid "Volume Step" msgstr "Passaggio del volume" #: refine/sections/wellbeing.blp:5 msgid "Wellbeing" msgstr "" #: refine/sections/wellbeing.blp:9 msgid "Eyesight Reminders" msgstr "" #: refine/sections/wellbeing.blp:12 refine/sections/wellbeing.blp:113 msgid "Show Countdown When Break Is Due" msgstr "" #: refine/sections/wellbeing.blp:18 refine/sections/wellbeing.blp:119 msgid "Lock Screen During Break" msgstr "" #: refine/sections/wellbeing.blp:24 refine/sections/wellbeing.blp:125 msgid "Delay (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:25 refine/sections/wellbeing.blp:126 msgid "Amount to delay break if requested" msgstr "" #: refine/sections/wellbeing.blp:53 refine/sections/wellbeing.blp:154 msgid "Break Duration (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:81 refine/sections/wellbeing.blp:182 msgid "Time Between Breaks (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:110 msgid "Movement Reminders" msgstr "" #: refine/widgets/panel-page.blp:6 msgid "Options will be changed after next login" msgstr "Le opzioni verranno applicate al prossimo login" #: refine/widgets/reset_button.py:34 refine/widgets/window-buttons-row.blp:64 msgid "Reset" msgstr "Ripristina" #: refine/widgets/window-buttons-row.blp:48 msgid "Hidden" msgstr "Nascosto" #: refine/widgets/window_buttons_row.py:95 msgid "Move to _Left Corner" msgstr "Sposta _nell'angolo sinistro" #: refine/widgets/window_buttons_row.py:99 msgid "Move to _Right Corner" msgstr "Sposta _nell'angolo destro" #: refine/widgets/window_buttons_row.py:109 msgid "Move _Left" msgstr "Sposta a _sinistra" #: refine/widgets/window_buttons_row.py:113 msgid "Move _Right" msgstr "Sposta a _destra" #: refine/widgets/window_buttons_row.py:116 msgid "_Hide" msgstr "_Nascondi" #: refine/window.blp:34 refine/window.blp:65 msgid "About Refine" msgstr "Informazioni su Refine" #: refine/window.blp:73 msgid "Unsupported Environment" msgstr "Ambiente non supportato" #: refine/window.blp:76 msgid "Accept the Risk and Continue" msgstr "Accetto il rischio e continua" #: refine/window.py:118 msgid "" "Some settings may not work as intended and could lead to undesirable " "behavior." msgstr "" "Alcune impostazioni potrebbero non funzionare come previsto e potrebbero " "portare a comportamenti indesiderati." #: refine/window.py:125 msgid "" "Refine only supports versions of GNOME that have not been modified by the " "operating system." msgstr "" "Refine supporta solo le versioni di GNOME che non sono state modificate dal " "sistema operativo." #: refine/window.py:133 msgid "Refine is only intended to run on the GNOME desktop environment." msgstr "" "Refine è concepito solo per essere eseguito sull'ambiente desktop GNOME." #~ msgid "@app_name@" #~ msgstr "@app_name@" #~ msgctxt "shortcut window" #~ msgid "General" #~ msgstr "Generale" #, fuzzy #~ msgctxt "shortcut window" #~ msgid "Show Shortcuts" #~ msgstr "Scorciatoie da tastiera" #~ msgctxt "shortcut window" #~ msgid "Quit" #~ msgstr "Esci" #~ msgid "Main Menu" #~ msgstr "Menù principale" #~ msgid "_Keyboard Shortcuts" #~ msgstr "_Scorciatoie da tastiera" #~ msgid "_About Refine" #~ msgstr "_Informazioni su Refine" Refine-0.7.1/po/ja.po000066400000000000000000000264541514222123300143050ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the refine package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: refine\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-01-03 13:23-0500\n" "PO-Revision-Date: 2025-03-12 16:55+0900\n" "Last-Translator: Gnuey56 \n" "Language-Team: \n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.5\n" #: data/page.tesk.Refine.desktop.in.in:2 #: data/page.tesk.Refine.metainfo.xml.in.in:7 refine/window.blp:5 msgid "Refine" msgstr "Refine" #: data/page.tesk.Refine.desktop.in.in:3 #: data/page.tesk.Refine.metainfo.xml.in.in:8 msgid "Tweak various aspects of GNOME" msgstr "GNOME の様々な動作を調整" #: data/page.tesk.Refine.desktop.in.in:9 msgid "tweaks;tweak;toggle;" msgstr "tweaks;tweak;toggle;" #: data/page.tesk.Refine.metainfo.xml.in.in:10 msgid "Refine helps discover advanced and experimental features in GNOME." msgstr "Refine は GNOME の詳細な機能や実験的な機能を見つけるのを助けます。" #: data/page.tesk.Refine.metainfo.xml.in.in:14 msgid "Hari Rana (TheEvilSkeleton)" msgstr "Hari Rana (TheEvilSkeleton)" #: data/page.tesk.Refine.metainfo.xml.in.in:36 msgid "Appearance Page" msgstr "「外観」のページ" #: data/page.tesk.Refine.metainfo.xml.in.in:40 #, fuzzy msgid "Shell & Compositor Page" msgstr "「Shell とコンポジター」のページ" #. Translators: Replace "translator-credits" with your name/username, and optionally an email or URL. #: refine/main.py:82 msgid "translator-credits" msgstr "Gnuey56" #: refine/main.py:83 msgid "Copyright © 2024 Hari Rana (TheEvilSkeleton)" msgstr "Copyright © 2024 Hari Rana (TheEvilSkeleton)" #: refine/main.py:87 msgid "Bottles" msgstr "Bottles" #: refine/main.py:88 msgid "Run Windows software" msgstr "Windows のソフトウェアを実行します" #: refine/main.py:92 msgid "Upscaler" msgstr "Upscaler" #: refine/main.py:93 msgid "Upscale and enhance images" msgstr "画像を高画質化" #: refine/sections/appearance.blp:5 msgid "Appearance" msgstr "外観" #: refine/sections/appearance.blp:9 msgid "Themes" msgstr "テーマ" #: refine/sections/appearance.blp:12 msgid "Cursors" msgstr "カーソル" #: refine/sections/appearance.blp:20 msgid "Icons" msgstr "アイコン" #: refine/sections/appearance.blp:28 msgid "GTK 3/4 Theme" msgstr "GTK 3/4 テーマ" #: refine/sections/appearance.blp:29 msgid "Platform libraries may ignore this option" msgstr "プラットフォームのライブラリはこのオプションを無視するかもしれません" #: refine/sections/appearance.blp:44 msgid "Light Style" msgstr "明るいスタイル" #: refine/sections/appearance.blp:45 msgid "Use a light appearance for the shell and supported apps" msgstr "Shell とサポートされているアプリで明るい外観を使用するようにします" #: refine/sections/appearance.blp:53 msgid "Fonts" msgstr "フォント" #: refine/sections/appearance.blp:56 msgid "Interface" msgstr "インターフェース" #: refine/sections/appearance.blp:62 msgid "Document" msgstr "ドキュメント" #: refine/sections/appearance.blp:68 msgid "Monospace" msgstr "等幅フォント" #: refine/sections/appearance.blp:75 msgid "Text Rendering" msgstr "テキストレンダリング" #: refine/sections/appearance.blp:78 msgid "Font Hinting" msgstr "フォントヒンティング" #: refine/sections/appearance.blp:79 msgid "Adjusts text shapes for better clarity, especially at smaller sizes" msgstr "特に小さいサイズのときに、テキストの形を調整して視認性を向上させます" #: refine/sections/appearance.blp:86 msgid "Font Antialiasing" msgstr "フォントアンチエイリアス" #: refine/sections/appearance.blp:87 msgid "Smooths text edges for better clarity by blending colors" msgstr "色の混合によってテキストの輪郭を滑らかにすることで視認性を向上させます" #: refine/sections/appearance.blp:95 msgid "Background" msgstr "背景" #: refine/sections/appearance.blp:98 msgid "Adjustment" msgstr "調整" #: refine/sections/mouse-touchpad.blp:5 msgid "Mouse & Touchpad" msgstr "マウスとタッチパッド" #: refine/sections/mouse-touchpad.blp:9 msgid "Mouse" msgstr "マウス" #: refine/sections/mouse-touchpad.blp:12 msgid "Middle Click to Paste Text" msgstr "中クリックしてテキストをペースト" #: refine/sections/mouse-touchpad.blp:13 msgid "Paste highlighted text, independent of the clipboard" msgstr "クリップボードとは別に、選択されたテキストをペーストします" #: refine/sections/mouse-touchpad.blp:20 msgid "Window Header Bar Actions" msgstr "ウィンドウヘッダーバーの挙動" #: refine/sections/mouse-touchpad.blp:23 msgid "Double Click" msgstr "ダブルクリック" #: refine/sections/mouse-touchpad.blp:36 msgid "Middle Click" msgstr "中クリック" #: refine/sections/mouse-touchpad.blp:49 msgid "Secondary Click" msgstr "右クリック" #: refine/sections/power.blp:5 msgid "Power" msgstr "" #: refine/sections/power.blp:10 msgid "Show Power Buttons in Lock Screen" msgstr "" #: refine/sections/shell-compositor.blp:5 msgid "Shell & Compositor" msgstr "Shell とコンポジター" #: refine/sections/shell-compositor.blp:10 msgid "Center New Windows" msgstr "新しいウィンドウを中央に配置する" #: refine/sections/shell-compositor.blp:16 msgid "Attach Modal Windows" msgstr "モーダルウィンドウを結びつける" #: refine/sections/shell-compositor.blp:17 msgid "" "Attaches modal windows to their parent window to prevent them from moving " "independently" msgstr "" "モーダルウィンドウが独立して動くのを防ぐために親ウィンドウとモーダルウィンド" "ウを結びつけます" #: refine/sections/shell-compositor.blp:23 msgid "Resize With Secondary Clicks" msgstr "右クリックでリサイズ" #: refine/sections/shell-compositor.blp:24 msgid "" "Use Secondary Click instead of Middle Click to resize windows while holding " "the window action key" msgstr "" "ウィンドウ操作キーを押しながらウィンドウをリサイズするとき、中クリックの代わ" "りに右クリックを使用するようにします" #: refine/sections/shell-compositor.blp:32 msgid "Window Focus Mode" msgstr "ウィンドウフォーカスのモード" #: refine/sections/shell-compositor.blp:33 msgid "Sets the action that will cause a window to take focus" msgstr "ウィンドウへフォーカスするときのアクションを設定します" #: refine/sections/shell-compositor.blp:40 msgid "Automatically Raise on Hover" msgstr "ホバー時に自動的に前面に表示" #: refine/sections/shell-compositor.blp:41 msgid "Automatically raises the focused window" msgstr "フォーカスしたウィンドウを自動的に前面に表示します" #: refine/sections/shell-compositor.blp:48 msgid "Window Button Layout" msgstr "ウィンドウボタンのレイアウト" #: refine/sections/shell-compositor.blp:51 msgid "Header Bar" msgstr "ヘッダーバー" #: refine/sections/shell-compositor.blp:64 msgid "Experimental Features" msgstr "実験的な機能" #: refine/sections/shell-compositor.blp:71 msgid "Fractional Scaling Options" msgstr "分数スケーリングのオプション" #: refine/sections/shell-compositor.blp:72 #: refine/sections/shell-compositor.blp:80 msgid "These options will appear in Settings" msgstr "オプションは「設定」で表示されます" #: refine/sections/shell-compositor.blp:79 msgid "Variable Refresh Rate Options" msgstr "任意で設定可能なリフレッシュレートのオプション" #: refine/sections/shell-compositor.blp:94 msgid "Autoclose Xwayland" msgstr "" #: refine/sections/shell-compositor.blp:102 msgid "Xwayland Native Scaling" msgstr "Xwayland のネイティブスケーリング" #: refine/sections/sound.blp:5 msgid "Sound" msgstr "サウンド" #: refine/sections/sound.blp:10 msgid "Volume Step" msgstr "音量の変化量" #: refine/sections/wellbeing.blp:5 msgid "Wellbeing" msgstr "" #: refine/sections/wellbeing.blp:9 msgid "Eyesight Reminders" msgstr "" #: refine/sections/wellbeing.blp:12 refine/sections/wellbeing.blp:113 msgid "Show Countdown When Break Is Due" msgstr "" #: refine/sections/wellbeing.blp:18 refine/sections/wellbeing.blp:119 msgid "Lock Screen During Break" msgstr "" #: refine/sections/wellbeing.blp:24 refine/sections/wellbeing.blp:125 msgid "Delay (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:25 refine/sections/wellbeing.blp:126 msgid "Amount to delay break if requested" msgstr "" #: refine/sections/wellbeing.blp:53 refine/sections/wellbeing.blp:154 msgid "Break Duration (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:81 refine/sections/wellbeing.blp:182 msgid "Time Between Breaks (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:110 msgid "Movement Reminders" msgstr "" #: refine/widgets/panel-page.blp:6 msgid "Options will be changed after next login" msgstr "オプションは次のログイン時に変更されます" #: refine/widgets/reset_button.py:34 refine/widgets/window-buttons-row.blp:64 msgid "Reset" msgstr "リセット" #: refine/widgets/window-buttons-row.blp:48 msgid "Hidden" msgstr "表示されないボタン" #: refine/widgets/window_buttons_row.py:95 msgid "Move to _Left Corner" msgstr "左コーナーへ移動 (_L)" #: refine/widgets/window_buttons_row.py:99 msgid "Move to _Right Corner" msgstr "右コーナーへ移動 (_R)" #: refine/widgets/window_buttons_row.py:109 msgid "Move _Left" msgstr "左へ移動 (_L)" #: refine/widgets/window_buttons_row.py:113 msgid "Move _Right" msgstr "右へ移動 (_R)" #: refine/widgets/window_buttons_row.py:116 msgid "_Hide" msgstr "隠す (_H)" #: refine/window.blp:34 refine/window.blp:65 msgid "About Refine" msgstr "Refine について" #: refine/window.blp:73 msgid "Unsupported Environment" msgstr "サポートされていない環境" #: refine/window.blp:76 msgid "Accept the Risk and Continue" msgstr "リスクを承知で続行" #: refine/window.py:118 msgid "" "Some settings may not work as intended and could lead to undesirable " "behavior." msgstr "" "いくつかの設定は予想外の動きをしたり、望ましくない動作を引き起こす可能性があ" "ります。" #: refine/window.py:125 msgid "" "Refine only supports versions of GNOME that have not been modified by the " "operating system." msgstr "" "Refine は、オペレーティングシステムによって改変されていない GNOME のみをサ" "ポートしています。" #: refine/window.py:133 msgid "Refine is only intended to run on the GNOME desktop environment." msgstr "Refine は、GNOME デスクトップ環境以外での実行を想定していません。" #~ msgid "@app_name@" #~ msgstr "@app_name@" #~ msgctxt "shortcut window" #~ msgid "General" #~ msgstr "一般" #~ msgctxt "shortcut window" #~ msgid "Show Shortcuts" #~ msgstr "ショートカットを表示" #~ msgctxt "shortcut window" #~ msgid "Quit" #~ msgstr "終了" #~ msgid "Main Menu" #~ msgstr "メインメニュー" #~ msgid "_Keyboard Shortcuts" #~ msgstr "キーボードショートカット (_K)" #~ msgid "_About Refine" #~ msgstr "Refine について (_A)" Refine-0.7.1/po/ka.po000066400000000000000000000361271514222123300143040ustar00rootroot00000000000000# Georgian translation for Refine. # Copyright (C) 2024 Hari Rana # This file is distributed under the same license as the refine package. # Temuri Doghonadze , 2025. # msgid "" msgstr "" "Project-Id-Version: refine\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-01-03 13:23-0500\n" "PO-Revision-Date: 2026-01-25 19:17+0400\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian <(nothing)>\n" "Language: ka\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.8\n" #: data/page.tesk.Refine.desktop.in.in:2 #: data/page.tesk.Refine.metainfo.xml.in.in:7 refine/window.blp:5 msgid "Refine" msgstr "Refine" #: data/page.tesk.Refine.desktop.in.in:3 #: data/page.tesk.Refine.metainfo.xml.in.in:8 msgid "Tweak various aspects of GNOME" msgstr "მოირგეთ GNOME-ის სხვადასხვა ასპექტი" #: data/page.tesk.Refine.desktop.in.in:9 msgid "tweaks;tweak;toggle;" msgstr "tweaks;tweak;toggle;გადართვა;შესწორება;" #: data/page.tesk.Refine.metainfo.xml.in.in:10 msgid "Refine helps discover advanced and experimental features in GNOME." msgstr "" "Refine დაგეხმარებათ აღმოაჩინოთ GNOME-ის დამატებითი და ექსპერიმენტალური " "ფუნქციები." #: data/page.tesk.Refine.metainfo.xml.in.in:14 msgid "Hari Rana (TheEvilSkeleton)" msgstr "ჰარი რანა (TheEvilSkeleton)" #: data/page.tesk.Refine.metainfo.xml.in.in:36 msgid "Appearance Page" msgstr "გარეგნობის გვერდი" #: data/page.tesk.Refine.metainfo.xml.in.in:40 #, fuzzy msgid "Shell & Compositor Page" msgstr "გარსის & კომპოზიტორის გვერდი" #. Translators: Replace "translator-credits" with your name/username, and optionally an email or URL. #: refine/main.py:82 msgid "translator-credits" msgstr "თემური დოღონაძე" #: refine/main.py:83 msgid "Copyright © 2024 Hari Rana (TheEvilSkeleton)" msgstr "© 2024 ჰარი რანა (TheEvilSkeleton). ყველა უფლება დაცულია" #: refine/main.py:87 msgid "Bottles" msgstr "Bottles" #: refine/main.py:88 msgid "Run Windows software" msgstr "Windows-ის პროგრამების გაშვება" #: refine/main.py:92 msgid "Upscaler" msgstr "Upscaler" #: refine/main.py:93 msgid "Upscale and enhance images" msgstr "გამოსახულებების მასშტაბის გაზრდა და გაუმჯობესება" #: refine/sections/appearance.blp:5 msgid "Appearance" msgstr "გარეგნობა" #: refine/sections/appearance.blp:9 msgid "Themes" msgstr "თემები" #: refine/sections/appearance.blp:12 msgid "Cursors" msgstr "კურსორები" #: refine/sections/appearance.blp:20 msgid "Icons" msgstr "ხატულები" #: refine/sections/appearance.blp:28 msgid "GTK 3/4 Theme" msgstr "GTK 3/4-ის თემა" #: refine/sections/appearance.blp:29 msgid "Platform libraries may ignore this option" msgstr "შესაძლოა პლატფორმის ბიბლიოთეკებმა ეს პარამეტრი არ გაითვალისწინონ" #: refine/sections/appearance.blp:44 msgid "Light Style" msgstr "ღია სტილი" #: refine/sections/appearance.blp:45 msgid "Use a light appearance for the shell and supported apps" msgstr "გამოიყენე ღია გარეგნობა გარსისა და მხარდაჭერილი აპებისთვის" #: refine/sections/appearance.blp:53 msgid "Fonts" msgstr "ფონტები" #: refine/sections/appearance.blp:56 msgid "Interface" msgstr "ინტერფეისი" #: refine/sections/appearance.blp:62 msgid "Document" msgstr "დოკუმენტი" #: refine/sections/appearance.blp:68 msgid "Monospace" msgstr "ერთსიგანიანი" #: refine/sections/appearance.blp:75 msgid "Text Rendering" msgstr "ტექსტის გამოსახვა" #: refine/sections/appearance.blp:78 msgid "Font Hinting" msgstr "ფონტის მომრგვალება" #: refine/sections/appearance.blp:79 msgid "Adjusts text shapes for better clarity, especially at smaller sizes" msgstr "" "ასწორებს ტექსტის მოხაზულობას უკეთესი ხილვადობისთვის, განსაკუთრებით პატარა " "ზომებისთვის" #: refine/sections/appearance.blp:86 msgid "Font Antialiasing" msgstr "ფონტის მოგლუვება" #: refine/sections/appearance.blp:87 msgid "Smooths text edges for better clarity by blending colors" msgstr "აგლუვებს ტექსტის წიბოებს უკეთესი ხილვადობისთვის ფერების შერწყმით" #: refine/sections/appearance.blp:95 msgid "Background" msgstr "ფონი" #: refine/sections/appearance.blp:98 msgid "Adjustment" msgstr "მორგება" #: refine/sections/mouse-touchpad.blp:5 msgid "Mouse & Touchpad" msgstr "თაგუნა & თაჩპედი" #: refine/sections/mouse-touchpad.blp:9 msgid "Mouse" msgstr "თაგუნა" #: refine/sections/mouse-touchpad.blp:12 msgid "Middle Click to Paste Text" msgstr "შუა წკაპი ტექსტის ჩასასმელად" #: refine/sections/mouse-touchpad.blp:13 msgid "Paste highlighted text, independent of the clipboard" msgstr "მონიშნული ტექსტის ჩასმა ბუფერისგან დამოუკიდებლად" #: refine/sections/mouse-touchpad.blp:20 msgid "Window Header Bar Actions" msgstr "ფანჯრის სათაურის ზოლის ქმედებები" #: refine/sections/mouse-touchpad.blp:23 msgid "Double Click" msgstr "ორმაგი წკაპი" #: refine/sections/mouse-touchpad.blp:36 msgid "Middle Click" msgstr "შუა-წკაპი" #: refine/sections/mouse-touchpad.blp:49 #, fuzzy msgid "Secondary Click" msgstr "მეორადი წკაპი" #: refine/sections/power.blp:5 msgid "Power" msgstr "კვება" #: refine/sections/power.blp:10 msgid "Show Power Buttons in Lock Screen" msgstr "გამოაჩინე კვების ღილაკი დაბლოკილ ეკრანზე" #: refine/sections/shell-compositor.blp:5 msgid "Shell & Compositor" msgstr "გარსი & კომპოზიტორი" #: refine/sections/shell-compositor.blp:10 msgid "Center New Windows" msgstr "ახალი ფანჯრის ცენტრში მოთავსება" #: refine/sections/shell-compositor.blp:16 msgid "Attach Modal Windows" msgstr "მოდალური ფანჯრების მიმაგრება" #: refine/sections/shell-compositor.blp:17 msgid "" "Attaches modal windows to their parent window to prevent them from moving " "independently" msgstr "" "მიამაგრებს მოდალურ ფანჯრებს მათ მშობელ ფანჯარას მათი დამოუკიდებელი გადატანის " "თავიდან ასაცილებლად" #: refine/sections/shell-compositor.blp:23 msgid "Resize With Secondary Clicks" msgstr "ზომების შეცვლა მეორადი წკაპებით" #: refine/sections/shell-compositor.blp:24 msgid "" "Use Secondary Click instead of Middle Click to resize windows while holding " "the window action key" msgstr "" "მეორადი წკაპის გამოყენება შუა წკაპის მაგიერ ფანჯრის ზომების შესაცვლელად " "ფანჯრის ქმედების ღილაკის დაწოლასთან ერთად" #: refine/sections/shell-compositor.blp:32 msgid "Window Focus Mode" msgstr "ფანჯრის ფოკუსის რეჟიმი" #: refine/sections/shell-compositor.blp:33 msgid "Sets the action that will cause a window to take focus" msgstr "აყენებს ქმედებას, რომელიც აიძულებს ფანჯარას, ფოკუსი მიიღოს" #: refine/sections/shell-compositor.blp:40 msgid "Automatically Raise on Hover" msgstr "ავტომატურად ამოწევა თაგუნას ზედ გაჩერებისას" #: refine/sections/shell-compositor.blp:41 msgid "Automatically raises the focused window" msgstr "ფოკუსის მქონე ფანჯრის ავტომატური ამოწევა" #: refine/sections/shell-compositor.blp:48 msgid "Window Button Layout" msgstr "ფანჯრის ღილაკის განლაგება" #: refine/sections/shell-compositor.blp:51 msgid "Header Bar" msgstr "ზედა მენიუ" #: refine/sections/shell-compositor.blp:64 msgid "Experimental Features" msgstr "ექსპერიმენტული ფუნქციები" #: refine/sections/shell-compositor.blp:71 msgid "Fractional Scaling Options" msgstr "ნაწილობრივი მასშტაბის მორგება" #: refine/sections/shell-compositor.blp:72 #: refine/sections/shell-compositor.blp:80 msgid "These options will appear in Settings" msgstr "ეს პარამეტრები მორგების ფანჯარაში გამოჩნდება" #: refine/sections/shell-compositor.blp:79 #, fuzzy msgid "Variable Refresh Rate Options" msgstr "ცვლადი განახლების სიხშირის მორგება" #: refine/sections/shell-compositor.blp:94 msgid "Autoclose Xwayland" msgstr "Xwayland-ის ავტომატურად დახურვა" #: refine/sections/shell-compositor.blp:102 msgid "Xwayland Native Scaling" msgstr "Xwayland-ის საკუთარი მასშტაბირება" #: refine/sections/sound.blp:5 msgid "Sound" msgstr "ხმა" #: refine/sections/sound.blp:10 msgid "Volume Step" msgstr "ხმის ბიჯი" #: refine/sections/wellbeing.blp:5 msgid "Wellbeing" msgstr "კეთილდღეობა" #: refine/sections/wellbeing.blp:9 msgid "Eyesight Reminders" msgstr "მხედველობის შეხსენებები" #: refine/sections/wellbeing.blp:12 refine/sections/wellbeing.blp:113 msgid "Show Countdown When Break Is Due" msgstr "შესვენებამდე აჩვენე უკუთვლა" #: refine/sections/wellbeing.blp:18 refine/sections/wellbeing.blp:119 msgid "Lock Screen During Break" msgstr "შესვენებისას დაბლოკე ეკრანი" #: refine/sections/wellbeing.blp:24 refine/sections/wellbeing.blp:125 #, fuzzy msgid "Delay (Seconds)" msgstr "შეფერხება (წამებში)" #: refine/sections/wellbeing.blp:25 refine/sections/wellbeing.blp:126 #, fuzzy msgid "Amount to delay break if requested" msgstr "მოთხოვნის შემთხვევაში, შეფერხების დრო" #: refine/sections/wellbeing.blp:53 refine/sections/wellbeing.blp:154 msgid "Break Duration (Seconds)" msgstr "შესვენების დრო (წამებში)" #: refine/sections/wellbeing.blp:81 refine/sections/wellbeing.blp:182 msgid "Time Between Breaks (Seconds)" msgstr "შესვენებებს შორის დრო (წამებში)" #: refine/sections/wellbeing.blp:110 msgid "Movement Reminders" msgstr "მოძრაობის შეხსენებები" #: refine/widgets/panel-page.blp:6 msgid "Options will be changed after next login" msgstr "პარამეტრები სისტემაში შემდეგი შესვლის შემდეგ შეიცვლება" #: refine/widgets/reset_button.py:34 refine/widgets/window-buttons-row.blp:64 msgid "Reset" msgstr "ჩამოყრა" #: refine/widgets/window-buttons-row.blp:48 msgid "Hidden" msgstr "დამალული" #: refine/widgets/window_buttons_row.py:95 msgid "Move to _Left Corner" msgstr "გადატანა _მარცხენა კუთხეში" #: refine/widgets/window_buttons_row.py:99 msgid "Move to _Right Corner" msgstr "გადატანა მ_არჯვენა კუთხეში" #: refine/widgets/window_buttons_row.py:109 msgid "Move _Left" msgstr "_მარცხნივ გაწევა" #: refine/widgets/window_buttons_row.py:113 msgid "Move _Right" msgstr "მარჯვნივ _გაწევა" #: refine/widgets/window_buttons_row.py:116 msgid "_Hide" msgstr "_დამალვა" #: refine/window.blp:34 refine/window.blp:65 msgid "About Refine" msgstr "Refine-ის შესახებ" #: refine/window.blp:73 msgid "Unsupported Environment" msgstr "მხარდაუჭერელი გარემო" #: refine/window.blp:76 #, fuzzy msgid "Accept the Risk and Continue" msgstr "რისკის მიღება და გაგრძელება" #: refine/window.py:118 msgid "" "Some settings may not work as intended and could lead to undesirable " "behavior." msgstr "" "ზოგიერთმა პარამეტრმა შეიძლება არ იმუშაოს ისე როგორც გსურთ და გამოიწვიოს " "არასასურველი შედეგი." #: refine/window.py:125 msgid "" "Refine only supports versions of GNOME that have not been modified by the " "operating system." msgstr "" "Refine მხარს უჭერს მხოლოდ GNOME-ის იმ ვერსიებს, რომლებიც ოპერაციული სისტემის " "მიერ არ არიან მოდიფიცირებულნი." #: refine/window.py:133 #, fuzzy msgid "Refine is only intended to run on the GNOME desktop environment." msgstr "" "Refine განკუთვნილია, მხოლოდ, GNOME სამუშაო მაგიდის გარემოში გასაშვებად." #~ msgid "@app_name@" #~ msgstr "@app_name@" #~ msgctxt "shortcut window" #~ msgid "General" #~ msgstr "ზოგადი" #~ msgctxt "shortcut window" #~ msgid "Show Shortcuts" #~ msgstr "მალსახმობების ჩვენება" #~ msgctxt "shortcut window" #~ msgid "Quit" #~ msgstr "გასვლა" #~ msgid "Main Menu" #~ msgstr "მთავარი მენიუ" #~ msgid "_Keyboard Shortcuts" #~ msgstr "_კლავიატურის მალსახმობები" #~ msgid "_About Refine" #~ msgstr "Refine-ის შეს_ახებ"Refine-0.7.1/po/meson.build000066400000000000000000000000471514222123300155030ustar00rootroot00000000000000i18n.gettext('refine', preset: 'glib') Refine-0.7.1/po/nb.po000066400000000000000000000247251514222123300143110ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the refine package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: refine\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-01-03 13:23-0500\n" "PO-Revision-Date: 2025-04-12 14:37+0200\n" "Last-Translator: Sunniva Løvstad \n" "Language-Team: \n" "Language: nb\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.6\n" #: data/page.tesk.Refine.desktop.in.in:2 #: data/page.tesk.Refine.metainfo.xml.in.in:7 refine/window.blp:5 msgid "Refine" msgstr "Refine" #: data/page.tesk.Refine.desktop.in.in:3 #: data/page.tesk.Refine.metainfo.xml.in.in:8 msgid "Tweak various aspects of GNOME" msgstr "Juster diverse aspekter av GNOME-skrivebordsmiljøet" #: data/page.tesk.Refine.desktop.in.in:9 msgid "tweaks;tweak;toggle;" msgstr "foredle;juster;veksle;veksel;tweaks;konfigurasjonsendringer;" #: data/page.tesk.Refine.metainfo.xml.in.in:10 msgid "Refine helps discover advanced and experimental features in GNOME." msgstr "" "Refine hjelper med å oppdage avanserte og eksperimentelle funksjoner i GNOME." #: data/page.tesk.Refine.metainfo.xml.in.in:14 msgid "Hari Rana (TheEvilSkeleton)" msgstr "Hari Rana (TheEvilSkeleton)" #: data/page.tesk.Refine.metainfo.xml.in.in:36 msgid "Appearance Page" msgstr "Utseendessiden" #: data/page.tesk.Refine.metainfo.xml.in.in:40 #, fuzzy msgid "Shell & Compositor Page" msgstr "Skall- og kompositorsiden" #. Translators: Replace "translator-credits" with your name/username, and optionally an email or URL. #: refine/main.py:82 msgid "translator-credits" msgstr "Sunniva Løvstad " #: refine/main.py:83 msgid "Copyright © 2024 Hari Rana (TheEvilSkeleton)" msgstr "Opphavsrett © 2024 Hari Rana (TheEvilSkeleton)" #: refine/main.py:87 msgid "Bottles" msgstr "Flasker" #: refine/main.py:88 msgid "Run Windows software" msgstr "Kjør Windows-programvare" #: refine/main.py:92 msgid "Upscaler" msgstr "Upscaler" #: refine/main.py:93 msgid "Upscale and enhance images" msgstr "Oppskaler og forbedre bilder" #: refine/sections/appearance.blp:5 msgid "Appearance" msgstr "Utseende" #: refine/sections/appearance.blp:9 msgid "Themes" msgstr "Temaer" #: refine/sections/appearance.blp:12 msgid "Cursors" msgstr "Muspekere" #: refine/sections/appearance.blp:20 msgid "Icons" msgstr "Ikoner" #: refine/sections/appearance.blp:28 msgid "GTK 3/4 Theme" msgstr "GTK 3/4-temaet" #: refine/sections/appearance.blp:29 msgid "Platform libraries may ignore this option" msgstr "Plattformbiblioteker kan ignorere dette valget" #: refine/sections/appearance.blp:44 msgid "Light Style" msgstr "Lys drakt" #: refine/sections/appearance.blp:45 msgid "Use a light appearance for the shell and supported apps" msgstr "Bruk en lys drakt for skallet og støttede apper" #: refine/sections/appearance.blp:53 msgid "Fonts" msgstr "Skrifttyper" #: refine/sections/appearance.blp:56 msgid "Interface" msgstr "Brukergrensesnitt" #: refine/sections/appearance.blp:62 msgid "Document" msgstr "Dokument" #: refine/sections/appearance.blp:68 msgid "Monospace" msgstr "Fast bredde" #: refine/sections/appearance.blp:75 msgid "Text Rendering" msgstr "Tekstgjengivelse" #: refine/sections/appearance.blp:78 msgid "Font Hinting" msgstr "Skrifttypehinting" #: refine/sections/appearance.blp:79 msgid "Adjusts text shapes for better clarity, especially at smaller sizes" msgstr "" "Justerer tekstformer for forbedret klarhet, særlig ved mindre tekststørrelser" #: refine/sections/appearance.blp:86 msgid "Font Antialiasing" msgstr "Skrifttypekantutjevning" #: refine/sections/appearance.blp:87 msgid "Smooths text edges for better clarity by blending colors" msgstr "Utjevner tekstkanter for forbedret klarhet ved å blande farger" #: refine/sections/appearance.blp:95 msgid "Background" msgstr "Bakgrunn" #: refine/sections/appearance.blp:98 msgid "Adjustment" msgstr "Justering" #: refine/sections/mouse-touchpad.blp:5 msgid "Mouse & Touchpad" msgstr "Mus og styreflate" #: refine/sections/mouse-touchpad.blp:9 msgid "Mouse" msgstr "Mus" #: refine/sections/mouse-touchpad.blp:12 msgid "Middle Click to Paste Text" msgstr "Mellomtrykk for å lime inn tekst" #: refine/sections/mouse-touchpad.blp:13 msgid "Paste highlighted text, independent of the clipboard" msgstr "Lim inn valgt tekst uavhengig av utklippstavlen" #: refine/sections/mouse-touchpad.blp:20 msgid "Window Header Bar Actions" msgstr "Vindushovedfeltsaksjoner" #: refine/sections/mouse-touchpad.blp:23 msgid "Double Click" msgstr "Dobbelttrykk" #: refine/sections/mouse-touchpad.blp:36 msgid "Middle Click" msgstr "Mellomtrykk" #: refine/sections/mouse-touchpad.blp:49 msgid "Secondary Click" msgstr "Sekundærtrykk" #: refine/sections/power.blp:5 msgid "Power" msgstr "" #: refine/sections/power.blp:10 msgid "Show Power Buttons in Lock Screen" msgstr "" #: refine/sections/shell-compositor.blp:5 msgid "Shell & Compositor" msgstr "Skall og kompositor" #: refine/sections/shell-compositor.blp:10 msgid "Center New Windows" msgstr "Sentrer nye vinduer" #: refine/sections/shell-compositor.blp:16 msgid "Attach Modal Windows" msgstr "Tilføy modale vinduer" #: refine/sections/shell-compositor.blp:17 msgid "" "Attaches modal windows to their parent window to prevent them from moving " "independently" msgstr "" "Tilføyer modale vinduer til foreldervinduene deres for å hindre dem fra å " "bevege seg uavhengig" #: refine/sections/shell-compositor.blp:23 msgid "Resize With Secondary Clicks" msgstr "Endre størrelse med sekundærtrykk" #: refine/sections/shell-compositor.blp:24 msgid "" "Use Secondary Click instead of Middle Click to resize windows while holding " "the window action key" msgstr "" "Bruk sekundærtrykk i stedet for mellomtrykk for å endre størrelsen på " "vinduer mens vinduhandlingstasten er holdt inne" #: refine/sections/shell-compositor.blp:32 msgid "Window Focus Mode" msgstr "Vindufokusmodus" #: refine/sections/shell-compositor.blp:33 msgid "Sets the action that will cause a window to take focus" msgstr "Stiller inn handlingen som forårsaker at et vindu får fokusen" #: refine/sections/shell-compositor.blp:40 msgid "Automatically Raise on Hover" msgstr "Fokus automatisk ved overholding av muspeker" #: refine/sections/shell-compositor.blp:41 msgid "Automatically raises the focused window" msgstr "Fokuserer automatisk vinduet som muspekeren holdes over" #: refine/sections/shell-compositor.blp:48 msgid "Window Button Layout" msgstr "Vindusknappoppsett" #: refine/sections/shell-compositor.blp:51 msgid "Header Bar" msgstr "Hovedfelt" #: refine/sections/shell-compositor.blp:64 msgid "Experimental Features" msgstr "Eksperimentelle funksjoner" #: refine/sections/shell-compositor.blp:71 msgid "Fractional Scaling Options" msgstr "Valg for fraksjonert skalering" #: refine/sections/shell-compositor.blp:72 #: refine/sections/shell-compositor.blp:80 msgid "These options will appear in Settings" msgstr "Disse valgene skal dukke opp i Innstillinger" #: refine/sections/shell-compositor.blp:79 msgid "Variable Refresh Rate Options" msgstr "Valg for skiftende oppdateringsfrekvens" #: refine/sections/shell-compositor.blp:94 msgid "Autoclose Xwayland" msgstr "" #: refine/sections/shell-compositor.blp:102 msgid "Xwayland Native Scaling" msgstr "Innebygget fraksjonert skalering for XWayland" #: refine/sections/sound.blp:5 msgid "Sound" msgstr "Lyd" #: refine/sections/sound.blp:10 msgid "Volume Step" msgstr "Volumtrinn" #: refine/sections/wellbeing.blp:5 msgid "Wellbeing" msgstr "" #: refine/sections/wellbeing.blp:9 msgid "Eyesight Reminders" msgstr "" #: refine/sections/wellbeing.blp:12 refine/sections/wellbeing.blp:113 msgid "Show Countdown When Break Is Due" msgstr "" #: refine/sections/wellbeing.blp:18 refine/sections/wellbeing.blp:119 msgid "Lock Screen During Break" msgstr "" #: refine/sections/wellbeing.blp:24 refine/sections/wellbeing.blp:125 msgid "Delay (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:25 refine/sections/wellbeing.blp:126 msgid "Amount to delay break if requested" msgstr "" #: refine/sections/wellbeing.blp:53 refine/sections/wellbeing.blp:154 msgid "Break Duration (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:81 refine/sections/wellbeing.blp:182 msgid "Time Between Breaks (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:110 msgid "Movement Reminders" msgstr "" #: refine/widgets/panel-page.blp:6 msgid "Options will be changed after next login" msgstr "Valgene skal endres etter neste innlogging" #: refine/widgets/reset_button.py:34 refine/widgets/window-buttons-row.blp:64 msgid "Reset" msgstr "Tilbakestill" #: refine/widgets/window-buttons-row.blp:48 msgid "Hidden" msgstr "Skjult" #: refine/widgets/window_buttons_row.py:95 msgid "Move to _Left Corner" msgstr "Flytt til _venstre hjørne" #: refine/widgets/window_buttons_row.py:99 msgid "Move to _Right Corner" msgstr "Flytt til _høyre hjørne" #: refine/widgets/window_buttons_row.py:109 msgid "Move _Left" msgstr "Flytt til _venstre" #: refine/widgets/window_buttons_row.py:113 msgid "Move _Right" msgstr "Flytt til _høyre" #: refine/widgets/window_buttons_row.py:116 msgid "_Hide" msgstr "_Skjul" #: refine/window.blp:34 refine/window.blp:65 msgid "About Refine" msgstr "Om refine" #: refine/window.blp:73 msgid "Unsupported Environment" msgstr "Ustøttet miljø" #: refine/window.blp:76 msgid "Accept the Risk and Continue" msgstr "Godta risikoen og fortsett" #: refine/window.py:118 msgid "" "Some settings may not work as intended and could lead to undesirable " "behavior." msgstr "" "Det kan hende at noen innstillinger ikke funger slik som de burde. Dette kan " "føre til uønskt oppførsel." #: refine/window.py:125 msgid "" "Refine only supports versions of GNOME that have not been modified by the " "operating system." msgstr "" "Refine støtter kun utgaver av GNOME som ikke har blitt endret av " "operativsystemet." #: refine/window.py:133 msgid "Refine is only intended to run on the GNOME desktop environment." msgstr "Refine er ment kun for GNOME-skrivebordsmiljøet." #~ msgid "@app_name@" #~ msgstr "Refine" #~ msgctxt "shortcut window" #~ msgid "General" #~ msgstr "Generelt" #~ msgctxt "shortcut window" #~ msgid "Show Shortcuts" #~ msgstr "Vis tastatursnarveier" #~ msgctxt "shortcut window" #~ msgid "Quit" #~ msgstr "Avslutt" #~ msgid "Main Menu" #~ msgstr "Hovedmeny" #~ msgid "_Keyboard Shortcuts" #~ msgstr "_Tastatursnarveier" #~ msgid "_About Refine" #~ msgstr "_Om Refine" Refine-0.7.1/po/pl.po000066400000000000000000000240771514222123300143250ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the refine package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: refine\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-01-03 13:23-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Dominik Baran\n" "Language-Team: LANGUAGE \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: data/page.tesk.Refine.desktop.in.in:2 #: data/page.tesk.Refine.metainfo.xml.in.in:7 refine/window.blp:5 msgid "Refine" msgstr "Dostosuj" #: data/page.tesk.Refine.desktop.in.in:3 #: data/page.tesk.Refine.metainfo.xml.in.in:8 msgid "Tweak various aspects of GNOME" msgstr "Dostosuj wiele elementów GNOME" #: data/page.tesk.Refine.desktop.in.in:9 msgid "tweaks;tweak;toggle;" msgstr "opcje:opcja:przełącznik" #: data/page.tesk.Refine.metainfo.xml.in.in:10 msgid "Refine helps discover advanced and experimental features in GNOME." msgstr "Dostosuj zaawansowane i eksperymentalne funkcje GNOME" #: data/page.tesk.Refine.metainfo.xml.in.in:14 msgid "Hari Rana (TheEvilSkeleton)" msgstr "Hari Rana (TheEvilSkeleton)" #: data/page.tesk.Refine.metainfo.xml.in.in:36 msgid "Appearance Page" msgstr "Wygląd" #: data/page.tesk.Refine.metainfo.xml.in.in:40 #, fuzzy msgid "Shell & Compositor Page" msgstr "Pulpit & Kompozytor" #. Translators: Replace "translator-credits" with your name/username, and optionally an email or URL. #: refine/main.py:82 msgid "translator-credits" msgstr "Dominik Baram" #: refine/main.py:83 msgid "Copyright © 2024 Hari Rana (TheEvilSkeleton)" msgstr "Prawa autorskie © 2024 Hari Rana (TheEvilSkeleton)" #: refine/main.py:87 msgid "Bottles" msgstr "Butelki" #: refine/main.py:88 msgid "Run Windows software" msgstr "Uruchamiaj aplikacje dla Windows" #: refine/main.py:92 msgid "Upscaler" msgstr "Skaluj" #: refine/main.py:93 msgid "Upscale and enhance images" msgstr "Skaluj i polepsz jakość obrazów" #: refine/sections/appearance.blp:5 msgid "Appearance" msgstr "Wygląd" #: refine/sections/appearance.blp:9 msgid "Themes" msgstr "Motywy" #: refine/sections/appearance.blp:12 msgid "Cursors" msgstr "Kursory" #: refine/sections/appearance.blp:20 msgid "Icons" msgstr "Ikony" #: refine/sections/appearance.blp:28 msgid "GTK 3/4 Theme" msgstr "Motyw GTK 3/4" #: refine/sections/appearance.blp:29 msgid "Platform libraries may ignore this option" msgstr "Aplikacje używające bibliotek platform mogą ignorować tę opcję" #: refine/sections/appearance.blp:44 msgid "Light Style" msgstr "Tryb jasny" #: refine/sections/appearance.blp:45 msgid "Use a light appearance for the shell and supported apps" msgstr "Używaj trybu jasnego dla pulpitu i wspieranych aplikacji" #: refine/sections/appearance.blp:53 msgid "Fonts" msgstr "Czcionki" #: refine/sections/appearance.blp:56 msgid "Interface" msgstr "Interfejs" #: refine/sections/appearance.blp:62 msgid "Document" msgstr "" #: refine/sections/appearance.blp:68 msgid "Monospace" msgstr "Terminal" #: refine/sections/appearance.blp:75 msgid "Text Rendering" msgstr "Wyświetlanie tekstu" #: refine/sections/appearance.blp:78 msgid "Font Hinting" msgstr "Wyświetlanie czcionek" #: refine/sections/appearance.blp:79 msgid "Adjusts text shapes for better clarity, especially at smaller sizes" msgstr "" "Dostosowuje kształt tekstu dla lepszej czytelności, szczególnie w mniejszych " "rozmiarach" #: refine/sections/appearance.blp:86 msgid "Font Antialiasing" msgstr "Wygładzanie czcionek" #: refine/sections/appearance.blp:87 msgid "Smooths text edges for better clarity by blending colors" msgstr "Wygładza krawędzie tekstu dla lepszej czytelności, mieszając kolory" #: refine/sections/appearance.blp:95 msgid "Background" msgstr "Tło" #: refine/sections/appearance.blp:98 msgid "Adjustment" msgstr "Dostosowanie" #: refine/sections/mouse-touchpad.blp:5 msgid "Mouse & Touchpad" msgstr "Mysz i gładzik" #: refine/sections/mouse-touchpad.blp:9 msgid "Mouse" msgstr "Mysz" #: refine/sections/mouse-touchpad.blp:12 msgid "Middle Click to Paste Text" msgstr "Środkowy przycisk wkleja tekst" #: refine/sections/mouse-touchpad.blp:13 msgid "Paste highlighted text, independent of the clipboard" msgstr "" #: refine/sections/mouse-touchpad.blp:20 msgid "Window Header Bar Actions" msgstr "Akcje paska tytułu okien" #: refine/sections/mouse-touchpad.blp:23 msgid "Double Click" msgstr "Podwójne kliknięcie" #: refine/sections/mouse-touchpad.blp:36 msgid "Middle Click" msgstr "Środkowe kliknięcie" #: refine/sections/mouse-touchpad.blp:49 msgid "Secondary Click" msgstr "Drugi przycisk" #: refine/sections/power.blp:5 msgid "Power" msgstr "" #: refine/sections/power.blp:10 msgid "Show Power Buttons in Lock Screen" msgstr "" #: refine/sections/shell-compositor.blp:5 msgid "Shell & Compositor" msgstr "Pulpit i Kompozytor" #: refine/sections/shell-compositor.blp:10 msgid "Center New Windows" msgstr "Otwieraj nowe okna na środku" #: refine/sections/shell-compositor.blp:16 msgid "Attach Modal Windows" msgstr "Doczepiaj dialogi okien" #: refine/sections/shell-compositor.blp:17 msgid "" "Attaches modal windows to their parent window to prevent them from moving " "independently" msgstr "Dialogi okien są przyczepione do nich, aby nie mogły się same poruszać" #: refine/sections/shell-compositor.blp:23 msgid "Resize With Secondary Clicks" msgstr "Zmień rozmiar klikając drugim przyciskiem" #: refine/sections/shell-compositor.blp:24 msgid "" "Use Secondary Click instead of Middle Click to resize windows while holding " "the window action key" msgstr "" "Użyj drugiego przycisku zamiast środkowego aby zmieniać rozmiar okien " "trzymając klawisz akcji okien" #: refine/sections/shell-compositor.blp:32 msgid "Window Focus Mode" msgstr "Tryb aktywacji okien" #: refine/sections/shell-compositor.blp:33 msgid "Sets the action that will cause a window to take focus" msgstr "Ustawia akcję która powoduje że okno zostaje aktywowane" #: refine/sections/shell-compositor.blp:40 msgid "Automatically Raise on Hover" msgstr "Automatyczie aktywuj po najechaniu" #: refine/sections/shell-compositor.blp:41 msgid "Automatically raises the focused window" msgstr "Automatycznie podnosi aktywne okno" #: refine/sections/shell-compositor.blp:48 msgid "Window Button Layout" msgstr "" #: refine/sections/shell-compositor.blp:51 msgid "Header Bar" msgstr "" #: refine/sections/shell-compositor.blp:64 msgid "Experimental Features" msgstr "Funkcje eksperymentalne" #: refine/sections/shell-compositor.blp:71 msgid "Fractional Scaling Options" msgstr "Opcje skalowania z przecinkiem " #: refine/sections/shell-compositor.blp:72 #: refine/sections/shell-compositor.blp:80 msgid "These options will appear in Settings" msgstr "Te opcje pojawią się w Ustawieniach" #: refine/sections/shell-compositor.blp:79 msgid "Variable Refresh Rate Options" msgstr "Opcje zmiennej częstotliwości odświeżania ekranu" #: refine/sections/shell-compositor.blp:94 msgid "Autoclose Xwayland" msgstr "" #: refine/sections/shell-compositor.blp:102 msgid "Xwayland Native Scaling" msgstr "Aplikacje używające XWayland skalują się niezależnie" #: refine/sections/sound.blp:5 msgid "Sound" msgstr "Dźwięk" #: refine/sections/sound.blp:10 msgid "Volume Step" msgstr "Odstęp między poziomami dźwięku" #: refine/sections/wellbeing.blp:5 msgid "Wellbeing" msgstr "" #: refine/sections/wellbeing.blp:9 msgid "Eyesight Reminders" msgstr "" #: refine/sections/wellbeing.blp:12 refine/sections/wellbeing.blp:113 msgid "Show Countdown When Break Is Due" msgstr "" #: refine/sections/wellbeing.blp:18 refine/sections/wellbeing.blp:119 msgid "Lock Screen During Break" msgstr "" #: refine/sections/wellbeing.blp:24 refine/sections/wellbeing.blp:125 msgid "Delay (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:25 refine/sections/wellbeing.blp:126 msgid "Amount to delay break if requested" msgstr "" #: refine/sections/wellbeing.blp:53 refine/sections/wellbeing.blp:154 msgid "Break Duration (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:81 refine/sections/wellbeing.blp:182 msgid "Time Between Breaks (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:110 msgid "Movement Reminders" msgstr "" #: refine/widgets/panel-page.blp:6 msgid "Options will be changed after next login" msgstr "Opcje zostaną zmienione po ponownym zalogowaniu" #: refine/widgets/reset_button.py:34 refine/widgets/window-buttons-row.blp:64 msgid "Reset" msgstr "Resetuj" #: refine/widgets/window-buttons-row.blp:48 msgid "Hidden" msgstr "" #: refine/widgets/window_buttons_row.py:95 msgid "Move to _Left Corner" msgstr "" #: refine/widgets/window_buttons_row.py:99 msgid "Move to _Right Corner" msgstr "" #: refine/widgets/window_buttons_row.py:109 msgid "Move _Left" msgstr "" #: refine/widgets/window_buttons_row.py:113 msgid "Move _Right" msgstr "" #: refine/widgets/window_buttons_row.py:116 msgid "_Hide" msgstr "" #: refine/window.blp:34 refine/window.blp:65 msgid "About Refine" msgstr "O Dostosuj" #: refine/window.blp:73 msgid "Unsupported Environment" msgstr "Niewspierany pulpit" #: refine/window.blp:76 msgid "Accept the Risk and Continue" msgstr "Zaakceptuj ryzyko i kontynuuj" #: refine/window.py:118 msgid "" "Some settings may not work as intended and could lead to undesirable " "behavior." msgstr "" "Niektóre ustawienia mogą nie działać poprawnie i powodować niechciane efekty." #: refine/window.py:125 msgid "" "Refine only supports versions of GNOME that have not been modified by the " "operating system." msgstr "" "Dostosuj wspiera tylko wersje GNOME które nie zostały zmodyfikowane przez " "system operacyjny." #: refine/window.py:133 msgid "Refine is only intended to run on the GNOME desktop environment." msgstr "Dostosuj działa tylko na pulpicie GNOME." #~ msgid "@app_name@" #~ msgstr "@app_name@" #, fuzzy #~ msgctxt "shortcut window" #~ msgid "Show Shortcuts" #~ msgstr "_Skróty klawiszowe" #~ msgid "Main Menu" #~ msgstr "Menu Główne" #~ msgid "_Keyboard Shortcuts" #~ msgstr "_Skróty klawiszowe" #~ msgid "_About Refine" #~ msgstr "_O Dostosuj" Refine-0.7.1/po/pt_BR.po000066400000000000000000000251151514222123300147120ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the refine package. # FIRST AUTHOR , YEAR. # Ciro Mota , 2025. # Álvaro Burns <>, 2025. # msgid "" msgstr "" "Project-Id-Version: refine\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-01-03 13:23-0500\n" "PO-Revision-Date: 2025-03-30 08:37-0300\n" "Last-Translator: Álvaro Burns <>\n" "Language-Team: Brazilian Portuguese\n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Gtranslator 48.0\n" #: data/page.tesk.Refine.desktop.in.in:2 #: data/page.tesk.Refine.metainfo.xml.in.in:7 refine/window.blp:5 msgid "Refine" msgstr "Refine" #: data/page.tesk.Refine.desktop.in.in:3 #: data/page.tesk.Refine.metainfo.xml.in.in:8 msgid "Tweak various aspects of GNOME" msgstr "Ajuste vários aspectos do GNOME" #: data/page.tesk.Refine.desktop.in.in:9 msgid "tweaks;tweak;toggle;" msgstr "tweaks;tweak;toggle;" #: data/page.tesk.Refine.metainfo.xml.in.in:10 msgid "Refine helps discover advanced and experimental features in GNOME." msgstr "Refine ajuda a descobrir recursos avançados e experimentais no GNOME." #: data/page.tesk.Refine.metainfo.xml.in.in:14 msgid "Hari Rana (TheEvilSkeleton)" msgstr "Hari Rana (TheEvilSkeleton)" #: data/page.tesk.Refine.metainfo.xml.in.in:36 msgid "Appearance Page" msgstr "Aparência" #: data/page.tesk.Refine.metainfo.xml.in.in:40 #, fuzzy msgid "Shell & Compositor Page" msgstr "Shell & Compositor" #. Translators: Replace "translator-credits" with your name/username, and optionally an email or URL. #: refine/main.py:82 msgid "translator-credits" msgstr "Ciro Mota" #: refine/main.py:83 msgid "Copyright © 2024 Hari Rana (TheEvilSkeleton)" msgstr "Copyright © 2024 Hari Rana (TheEvilSkeleton)" #: refine/main.py:87 msgid "Bottles" msgstr "Bottles" #: refine/main.py:88 msgid "Run Windows software" msgstr "Executar software do Windows" #: refine/main.py:92 msgid "Upscaler" msgstr "Upscaler" #: refine/main.py:93 msgid "Upscale and enhance images" msgstr "Melhore e aprimore imagens" #: refine/sections/appearance.blp:5 msgid "Appearance" msgstr "Aparência" #: refine/sections/appearance.blp:9 msgid "Themes" msgstr "Temas" #: refine/sections/appearance.blp:12 msgid "Cursors" msgstr "Cursor" #: refine/sections/appearance.blp:20 msgid "Icons" msgstr "Ícones" #: refine/sections/appearance.blp:28 msgid "GTK 3/4 Theme" msgstr "Tema GTK 3/4" #: refine/sections/appearance.blp:29 msgid "Platform libraries may ignore this option" msgstr "Bibliotecas de plataforma podem ignorar esta opção" #: refine/sections/appearance.blp:44 msgid "Light Style" msgstr "Estilo Claro" #: refine/sections/appearance.blp:45 msgid "Use a light appearance for the shell and supported apps" msgstr "Use um estilo Claro para o shell e aplicativos suportados" #: refine/sections/appearance.blp:53 msgid "Fonts" msgstr "Fontes" #: refine/sections/appearance.blp:56 msgid "Interface" msgstr "Interface" #: refine/sections/appearance.blp:62 msgid "Document" msgstr "Documento" #: refine/sections/appearance.blp:68 msgid "Monospace" msgstr "Monospace" #: refine/sections/appearance.blp:75 msgid "Text Rendering" msgstr "Renderização de texto" #: refine/sections/appearance.blp:78 msgid "Font Hinting" msgstr "Font Hinting" #: refine/sections/appearance.blp:79 msgid "Adjusts text shapes for better clarity, especially at smaller sizes" msgstr "" "Ajusta as formas do texto para maior clareza, especialmente em tamanhos " "menores" #: refine/sections/appearance.blp:86 msgid "Font Antialiasing" msgstr "Suavização de Fonte" #: refine/sections/appearance.blp:87 msgid "Smooths text edges for better clarity by blending colors" msgstr "Suaviza as bordas do texto para maior clareza misturando cores" #: refine/sections/appearance.blp:95 msgid "Background" msgstr "Plano de Fundo" #: refine/sections/appearance.blp:98 msgid "Adjustment" msgstr "Ajuste" #: refine/sections/mouse-touchpad.blp:5 msgid "Mouse & Touchpad" msgstr "Mouse & Touchpad" #: refine/sections/mouse-touchpad.blp:9 msgid "Mouse" msgstr "Mouse" #: refine/sections/mouse-touchpad.blp:12 msgid "Middle Click to Paste Text" msgstr "Clique com o botão do meio para colar um texto" #: refine/sections/mouse-touchpad.blp:13 msgid "Paste highlighted text, independent of the clipboard" msgstr "Cole o texto selecionado, independente da área de transferência" #: refine/sections/mouse-touchpad.blp:20 msgid "Window Header Bar Actions" msgstr "Ações da barra de título" #: refine/sections/mouse-touchpad.blp:23 msgid "Double Click" msgstr "Duplo clique" #: refine/sections/mouse-touchpad.blp:36 msgid "Middle Click" msgstr "Clique no botão do meio" #: refine/sections/mouse-touchpad.blp:49 msgid "Secondary Click" msgstr "Clique secundário" #: refine/sections/power.blp:5 msgid "Power" msgstr "" #: refine/sections/power.blp:10 msgid "Show Power Buttons in Lock Screen" msgstr "" #: refine/sections/shell-compositor.blp:5 msgid "Shell & Compositor" msgstr "Shell & Compositor" #: refine/sections/shell-compositor.blp:10 msgid "Center New Windows" msgstr "Centralizar novas janelas" #: refine/sections/shell-compositor.blp:16 msgid "Attach Modal Windows" msgstr "Anexar diálogos modais" #: refine/sections/shell-compositor.blp:17 msgid "" "Attaches modal windows to their parent window to prevent them from moving " "independently" msgstr "" "Anexa janelas modais à janela pai para evitar que elas se movam de forma " "independente" #: refine/sections/shell-compositor.blp:23 msgid "Resize With Secondary Clicks" msgstr "Redimensionar com clique secundário" #: refine/sections/shell-compositor.blp:24 msgid "" "Use Secondary Click instead of Middle Click to resize windows while holding " "the window action key" msgstr "" "Use o Clique Secundário em vez do clique do meio para redimensionar as " "janelas enquanto segura a 'tecla de modificação da janela'" #: refine/sections/shell-compositor.blp:32 msgid "Window Focus Mode" msgstr "Foco da janela" #: refine/sections/shell-compositor.blp:33 msgid "Sets the action that will cause a window to take focus" msgstr "Define a ação que fará com que uma janela tenha foco" #: refine/sections/shell-compositor.blp:40 msgid "Automatically Raise on Hover" msgstr "Aumentar automaticamente ao passar o mouse" #: refine/sections/shell-compositor.blp:41 msgid "Automatically raises the focused window" msgstr "Aumenta automaticamente a janela focada" #: refine/sections/shell-compositor.blp:48 msgid "Window Button Layout" msgstr "Layout dos botões da janela" #: refine/sections/shell-compositor.blp:51 msgid "Header Bar" msgstr "Cabeçalho" #: refine/sections/shell-compositor.blp:64 msgid "Experimental Features" msgstr "Recursos experimentais" #: refine/sections/shell-compositor.blp:71 msgid "Fractional Scaling Options" msgstr "Opções de Fractional Scaling" #: refine/sections/shell-compositor.blp:72 #: refine/sections/shell-compositor.blp:80 msgid "These options will appear in Settings" msgstr "Essas opções aparecerão em configurações" #: refine/sections/shell-compositor.blp:79 msgid "Variable Refresh Rate Options" msgstr "Opções de taxa de atualização variável" #: refine/sections/shell-compositor.blp:94 msgid "Autoclose Xwayland" msgstr "" #: refine/sections/shell-compositor.blp:102 msgid "Xwayland Native Scaling" msgstr "Escala nativa Xwayland" #: refine/sections/sound.blp:5 msgid "Sound" msgstr "Som" #: refine/sections/sound.blp:10 msgid "Volume Step" msgstr "Incremento de volume" #: refine/sections/wellbeing.blp:5 msgid "Wellbeing" msgstr "" #: refine/sections/wellbeing.blp:9 msgid "Eyesight Reminders" msgstr "" #: refine/sections/wellbeing.blp:12 refine/sections/wellbeing.blp:113 msgid "Show Countdown When Break Is Due" msgstr "" #: refine/sections/wellbeing.blp:18 refine/sections/wellbeing.blp:119 msgid "Lock Screen During Break" msgstr "" #: refine/sections/wellbeing.blp:24 refine/sections/wellbeing.blp:125 msgid "Delay (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:25 refine/sections/wellbeing.blp:126 msgid "Amount to delay break if requested" msgstr "" #: refine/sections/wellbeing.blp:53 refine/sections/wellbeing.blp:154 msgid "Break Duration (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:81 refine/sections/wellbeing.blp:182 msgid "Time Between Breaks (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:110 msgid "Movement Reminders" msgstr "" #: refine/widgets/panel-page.blp:6 msgid "Options will be changed after next login" msgstr "As opções serão alteradas após o próximo login" #: refine/widgets/reset_button.py:34 refine/widgets/window-buttons-row.blp:64 msgid "Reset" msgstr "Redefinir" #: refine/widgets/window-buttons-row.blp:48 msgid "Hidden" msgstr "Oculto" #: refine/widgets/window_buttons_row.py:95 msgid "Move to _Left Corner" msgstr "Mover para o _Canto Esquerdo" #: refine/widgets/window_buttons_row.py:99 msgid "Move to _Right Corner" msgstr "Mover para o _Canto Direito" #: refine/widgets/window_buttons_row.py:109 msgid "Move _Left" msgstr "Mover para a _Esquerda" #: refine/widgets/window_buttons_row.py:113 msgid "Move _Right" msgstr "Mover para a _Direita" #: refine/widgets/window_buttons_row.py:116 msgid "_Hide" msgstr "_Ocultar" #: refine/window.blp:34 refine/window.blp:65 msgid "About Refine" msgstr "Sobre Refine" #: refine/window.blp:73 msgid "Unsupported Environment" msgstr "Ambiente não suportado" #: refine/window.blp:76 msgid "Accept the Risk and Continue" msgstr "Aceitar o risco e continuar" #: refine/window.py:118 msgid "" "Some settings may not work as intended and could lead to undesirable " "behavior." msgstr "" "Algumas configurações podem não funcionar como esperado e podem levar a um " "comportamento indesejável." #: refine/window.py:125 msgid "" "Refine only supports versions of GNOME that have not been modified by the " "operating system." msgstr "" "Refine suporta apenas versões do GNOME que não foram modificadas pelo " "sistema operacional." #: refine/window.py:133 msgid "Refine is only intended to run on the GNOME desktop environment." msgstr "" "O Refine foi projetado para ser executado apenas no ambiente desktop GNOME." #~ msgid "@app_name@" #~ msgstr "@app_name@" #~ msgctxt "shortcut window" #~ msgid "General" #~ msgstr "Geral" #~ msgctxt "shortcut window" #~ msgid "Show Shortcuts" #~ msgstr "Atalhos de teclado" #~ msgctxt "shortcut window" #~ msgid "Quit" #~ msgstr "Sair" #~ msgid "Main Menu" #~ msgstr "Menu principal" #~ msgid "_Keyboard Shortcuts" #~ msgstr "_Atalhos de teclado" #~ msgid "_About Refine" #~ msgstr "_Sobre Refine" Refine-0.7.1/po/refine.pot000066400000000000000000000176221514222123300153440ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the refine package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: refine\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-01-03 13:23-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: data/page.tesk.Refine.desktop.in.in:2 #: data/page.tesk.Refine.metainfo.xml.in.in:7 refine/window.blp:5 msgid "Refine" msgstr "" #: data/page.tesk.Refine.desktop.in.in:3 #: data/page.tesk.Refine.metainfo.xml.in.in:8 msgid "Tweak various aspects of GNOME" msgstr "" #: data/page.tesk.Refine.desktop.in.in:9 msgid "tweaks;tweak;toggle;" msgstr "" #: data/page.tesk.Refine.metainfo.xml.in.in:10 msgid "Refine helps discover advanced and experimental features in GNOME." msgstr "" #: data/page.tesk.Refine.metainfo.xml.in.in:14 msgid "Hari Rana (TheEvilSkeleton)" msgstr "" #: data/page.tesk.Refine.metainfo.xml.in.in:36 msgid "Appearance Page" msgstr "" #: data/page.tesk.Refine.metainfo.xml.in.in:40 msgid "Shell & Compositor Page" msgstr "" #. Translators: Replace "translator-credits" with your name/username, and optionally an email or URL. #: refine/main.py:82 msgid "translator-credits" msgstr "" #: refine/main.py:83 msgid "Copyright © 2024 Hari Rana (TheEvilSkeleton)" msgstr "" #: refine/main.py:87 msgid "Bottles" msgstr "" #: refine/main.py:88 msgid "Run Windows software" msgstr "" #: refine/main.py:92 msgid "Upscaler" msgstr "" #: refine/main.py:93 msgid "Upscale and enhance images" msgstr "" #: refine/sections/appearance.blp:5 msgid "Appearance" msgstr "" #: refine/sections/appearance.blp:9 msgid "Themes" msgstr "" #: refine/sections/appearance.blp:12 msgid "Cursors" msgstr "" #: refine/sections/appearance.blp:20 msgid "Icons" msgstr "" #: refine/sections/appearance.blp:28 msgid "GTK 3/4 Theme" msgstr "" #: refine/sections/appearance.blp:29 msgid "Platform libraries may ignore this option" msgstr "" #: refine/sections/appearance.blp:44 msgid "Light Style" msgstr "" #: refine/sections/appearance.blp:45 msgid "Use a light appearance for the shell and supported apps" msgstr "" #: refine/sections/appearance.blp:53 msgid "Fonts" msgstr "" #: refine/sections/appearance.blp:56 msgid "Interface" msgstr "" #: refine/sections/appearance.blp:62 msgid "Document" msgstr "" #: refine/sections/appearance.blp:68 msgid "Monospace" msgstr "" #: refine/sections/appearance.blp:75 msgid "Text Rendering" msgstr "" #: refine/sections/appearance.blp:78 msgid "Font Hinting" msgstr "" #: refine/sections/appearance.blp:79 msgid "Adjusts text shapes for better clarity, especially at smaller sizes" msgstr "" #: refine/sections/appearance.blp:86 msgid "Font Antialiasing" msgstr "" #: refine/sections/appearance.blp:87 msgid "Smooths text edges for better clarity by blending colors" msgstr "" #: refine/sections/appearance.blp:95 msgid "Background" msgstr "" #: refine/sections/appearance.blp:98 msgid "Adjustment" msgstr "" #: refine/sections/mouse-touchpad.blp:5 msgid "Mouse & Touchpad" msgstr "" #: refine/sections/mouse-touchpad.blp:9 msgid "Mouse" msgstr "" #: refine/sections/mouse-touchpad.blp:12 msgid "Middle Click to Paste Text" msgstr "" #: refine/sections/mouse-touchpad.blp:13 msgid "Paste highlighted text, independent of the clipboard" msgstr "" #: refine/sections/mouse-touchpad.blp:20 msgid "Window Header Bar Actions" msgstr "" #: refine/sections/mouse-touchpad.blp:23 msgid "Double Click" msgstr "" #: refine/sections/mouse-touchpad.blp:36 msgid "Middle Click" msgstr "" #: refine/sections/mouse-touchpad.blp:49 msgid "Secondary Click" msgstr "" #: refine/sections/power.blp:5 msgid "Power" msgstr "" #: refine/sections/power.blp:10 msgid "Show Power Buttons in Lock Screen" msgstr "" #: refine/sections/shell-compositor.blp:5 msgid "Shell & Compositor" msgstr "" #: refine/sections/shell-compositor.blp:10 msgid "Center New Windows" msgstr "" #: refine/sections/shell-compositor.blp:16 msgid "Attach Modal Windows" msgstr "" #: refine/sections/shell-compositor.blp:17 msgid "" "Attaches modal windows to their parent window to prevent them from moving " "independently" msgstr "" #: refine/sections/shell-compositor.blp:23 msgid "Resize With Secondary Clicks" msgstr "" #: refine/sections/shell-compositor.blp:24 msgid "" "Use Secondary Click instead of Middle Click to resize windows while holding " "the window action key" msgstr "" #: refine/sections/shell-compositor.blp:32 msgid "Window Focus Mode" msgstr "" #: refine/sections/shell-compositor.blp:33 msgid "Sets the action that will cause a window to take focus" msgstr "" #: refine/sections/shell-compositor.blp:40 msgid "Automatically Raise on Hover" msgstr "" #: refine/sections/shell-compositor.blp:41 msgid "Automatically raises the focused window" msgstr "" #: refine/sections/shell-compositor.blp:48 msgid "Window Button Layout" msgstr "" #: refine/sections/shell-compositor.blp:51 msgid "Header Bar" msgstr "" #: refine/sections/shell-compositor.blp:64 msgid "Experimental Features" msgstr "" #: refine/sections/shell-compositor.blp:71 msgid "Fractional Scaling Options" msgstr "" #: refine/sections/shell-compositor.blp:72 #: refine/sections/shell-compositor.blp:80 msgid "These options will appear in Settings" msgstr "" #: refine/sections/shell-compositor.blp:79 msgid "Variable Refresh Rate Options" msgstr "" #: refine/sections/shell-compositor.blp:94 msgid "Autoclose Xwayland" msgstr "" #: refine/sections/shell-compositor.blp:102 msgid "Xwayland Native Scaling" msgstr "" #: refine/sections/sound.blp:5 msgid "Sound" msgstr "" #: refine/sections/sound.blp:10 msgid "Volume Step" msgstr "" #: refine/sections/wellbeing.blp:5 msgid "Wellbeing" msgstr "" #: refine/sections/wellbeing.blp:9 msgid "Eyesight Reminders" msgstr "" #: refine/sections/wellbeing.blp:12 refine/sections/wellbeing.blp:113 msgid "Show Countdown When Break Is Due" msgstr "" #: refine/sections/wellbeing.blp:18 refine/sections/wellbeing.blp:119 msgid "Lock Screen During Break" msgstr "" #: refine/sections/wellbeing.blp:24 refine/sections/wellbeing.blp:125 msgid "Delay (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:25 refine/sections/wellbeing.blp:126 msgid "Amount to delay break if requested" msgstr "" #: refine/sections/wellbeing.blp:53 refine/sections/wellbeing.blp:154 msgid "Break Duration (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:81 refine/sections/wellbeing.blp:182 msgid "Time Between Breaks (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:110 msgid "Movement Reminders" msgstr "" #: refine/widgets/panel-page.blp:6 msgid "Options will be changed after next login" msgstr "" #: refine/widgets/reset_button.py:34 refine/widgets/window-buttons-row.blp:64 msgid "Reset" msgstr "" #: refine/widgets/window-buttons-row.blp:48 msgid "Hidden" msgstr "" #: refine/widgets/window_buttons_row.py:95 msgid "Move to _Left Corner" msgstr "" #: refine/widgets/window_buttons_row.py:99 msgid "Move to _Right Corner" msgstr "" #: refine/widgets/window_buttons_row.py:109 msgid "Move _Left" msgstr "" #: refine/widgets/window_buttons_row.py:113 msgid "Move _Right" msgstr "" #: refine/widgets/window_buttons_row.py:116 msgid "_Hide" msgstr "" #: refine/window.blp:34 refine/window.blp:65 msgid "About Refine" msgstr "" #: refine/window.blp:73 msgid "Unsupported Environment" msgstr "" #: refine/window.blp:76 msgid "Accept the Risk and Continue" msgstr "" #: refine/window.py:118 msgid "" "Some settings may not work as intended and could lead to undesirable " "behavior." msgstr "" #: refine/window.py:125 msgid "" "Refine only supports versions of GNOME that have not been modified by the " "operating system." msgstr "" #: refine/window.py:133 msgid "Refine is only intended to run on the GNOME desktop environment." msgstr "" Refine-0.7.1/po/ru.po000066400000000000000000000310321514222123300143250ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the refine package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: refine\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-01-03 13:23-0500\n" "PO-Revision-Date: 2025-03-06 00:38+0300\n" "Last-Translator: Aleksandr Melman \n" "Language-Team: \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.5\n" #: data/page.tesk.Refine.desktop.in.in:2 #: data/page.tesk.Refine.metainfo.xml.in.in:7 refine/window.blp:5 msgid "Refine" msgstr "Refine" #: data/page.tesk.Refine.desktop.in.in:3 #: data/page.tesk.Refine.metainfo.xml.in.in:8 msgid "Tweak various aspects of GNOME" msgstr "Настройка различных параметров GNOME" #: data/page.tesk.Refine.desktop.in.in:9 msgid "tweaks;tweak;toggle;" msgstr "tweaks;tweak;toggle;настройка;настройки;переключатели;параметры;" #: data/page.tesk.Refine.metainfo.xml.in.in:10 msgid "Refine helps discover advanced and experimental features in GNOME." msgstr "" "Refine помогает открывать дополнительные и экспериментальные функции в GNOME." #: data/page.tesk.Refine.metainfo.xml.in.in:14 msgid "Hari Rana (TheEvilSkeleton)" msgstr "Hari Rana (TheEvilSkeleton)" #: data/page.tesk.Refine.metainfo.xml.in.in:36 msgid "Appearance Page" msgstr "Страница внешнего вида" #: data/page.tesk.Refine.metainfo.xml.in.in:40 #, fuzzy msgid "Shell & Compositor Page" msgstr "Страница оболочки и композитора" #. Translators: Replace "translator-credits" with your name/username, and optionally an email or URL. #: refine/main.py:82 msgid "translator-credits" msgstr "Aleksandr Melman" #: refine/main.py:83 msgid "Copyright © 2024 Hari Rana (TheEvilSkeleton)" msgstr "Авторское право © 2024 Hari Rana (TheEvilSkeleton)" #: refine/main.py:87 msgid "Bottles" msgstr "Bottles" #: refine/main.py:88 msgid "Run Windows software" msgstr "Запуск программ Windows" #: refine/main.py:92 msgid "Upscaler" msgstr "Upscaler" #: refine/main.py:93 msgid "Upscale and enhance images" msgstr "Увеличение масштаба и улучшение изображений" #: refine/sections/appearance.blp:5 msgid "Appearance" msgstr "Внешний вид" #: refine/sections/appearance.blp:9 msgid "Themes" msgstr "Темы" #: refine/sections/appearance.blp:12 msgid "Cursors" msgstr "Курсоры" #: refine/sections/appearance.blp:20 msgid "Icons" msgstr "Значки" #: refine/sections/appearance.blp:28 msgid "GTK 3/4 Theme" msgstr "Тема GTK 3/4" #: refine/sections/appearance.blp:29 msgid "Platform libraries may ignore this option" msgstr "Библиотеки платформы могут игнорировать этот параметр" #: refine/sections/appearance.blp:44 msgid "Light Style" msgstr "Светлый стиль" #: refine/sections/appearance.blp:45 msgid "Use a light appearance for the shell and supported apps" msgstr "" "Использовать светлый внешний вид для оболочки и поддерживаемых приложений" #: refine/sections/appearance.blp:53 msgid "Fonts" msgstr "Шрифты" #: refine/sections/appearance.blp:56 msgid "Interface" msgstr "Интерфейс" #: refine/sections/appearance.blp:62 msgid "Document" msgstr "Документы" #: refine/sections/appearance.blp:68 msgid "Monospace" msgstr "Моноширинный" #: refine/sections/appearance.blp:75 msgid "Text Rendering" msgstr "Отрисовка текста" #: refine/sections/appearance.blp:78 msgid "Font Hinting" msgstr "Хинтинг шрифта" #: refine/sections/appearance.blp:79 msgid "Adjusts text shapes for better clarity, especially at smaller sizes" msgstr "" "Корректирует контуры текста для большей четкости, особенно при небольших " "размерах" #: refine/sections/appearance.blp:86 msgid "Font Antialiasing" msgstr "Сглаживание шрифта" #: refine/sections/appearance.blp:87 msgid "Smooths text edges for better clarity by blending colors" msgstr "Сглаживает края текста для большей четкости путем смешивания цветов" #: refine/sections/appearance.blp:95 msgid "Background" msgstr "Фон" #: refine/sections/appearance.blp:98 msgid "Adjustment" msgstr "Регулировка" #: refine/sections/mouse-touchpad.blp:5 msgid "Mouse & Touchpad" msgstr "Мышь и сенсорная панель" #: refine/sections/mouse-touchpad.blp:9 msgid "Mouse" msgstr "Мышь" #: refine/sections/mouse-touchpad.blp:12 msgid "Middle Click to Paste Text" msgstr "Щелчок средней кнопки для вставки текста" #: refine/sections/mouse-touchpad.blp:13 msgid "Paste highlighted text, independent of the clipboard" msgstr "Вставка выделенного текста независимо от буфера обмена" #: refine/sections/mouse-touchpad.blp:20 msgid "Window Header Bar Actions" msgstr "Действия в панели заголовка окна" #: refine/sections/mouse-touchpad.blp:23 msgid "Double Click" msgstr "Двойной щелчок основной кнопки" #: refine/sections/mouse-touchpad.blp:36 msgid "Middle Click" msgstr "Щелчок средней кнопки" #: refine/sections/mouse-touchpad.blp:49 msgid "Secondary Click" msgstr "Щелчок вторичной кнопки" #: refine/sections/power.blp:5 msgid "Power" msgstr "" #: refine/sections/power.blp:10 msgid "Show Power Buttons in Lock Screen" msgstr "" #: refine/sections/shell-compositor.blp:5 msgid "Shell & Compositor" msgstr "Оболочка и композитор" #: refine/sections/shell-compositor.blp:10 msgid "Center New Windows" msgstr "Центрировать новые окна" #: refine/sections/shell-compositor.blp:16 msgid "Attach Modal Windows" msgstr "Прикреплять модальные окна" #: refine/sections/shell-compositor.blp:17 msgid "" "Attaches modal windows to their parent window to prevent them from moving " "independently" msgstr "" "Прикрепляет модальные окна к их родительскому окну, чтобы предотвратить их " "самостоятельное перемещение" #: refine/sections/shell-compositor.blp:23 msgid "Resize With Secondary Clicks" msgstr "Изменять размер щелчком вторичной кнопки" #: refine/sections/shell-compositor.blp:24 msgid "" "Use Secondary Click instead of Middle Click to resize windows while holding " "the window action key" msgstr "" "Использовать щелчок вторичной кнопки вместо щелчка средней кнопки для " "изменения размера окна, удерживая клавишу действия окна" #: refine/sections/shell-compositor.blp:32 msgid "Window Focus Mode" msgstr "Режим фокусировки окна" #: refine/sections/shell-compositor.blp:33 msgid "Sets the action that will cause a window to take focus" msgstr "Устанавливает действие, в результате которого окно получает фокус" #: refine/sections/shell-compositor.blp:40 msgid "Automatically Raise on Hover" msgstr "Автоматически поднимать при наведении" #: refine/sections/shell-compositor.blp:41 msgid "Automatically raises the focused window" msgstr "Автоматически поднимает сфокусированное окно" #: refine/sections/shell-compositor.blp:48 msgid "Window Button Layout" msgstr "Расположение кнопок окна" #: refine/sections/shell-compositor.blp:51 msgid "Header Bar" msgstr "Панель заголовка" #: refine/sections/shell-compositor.blp:64 msgid "Experimental Features" msgstr "Экспериментальные возможности" #: refine/sections/shell-compositor.blp:71 msgid "Fractional Scaling Options" msgstr "Параметры дробного масштабирования" #: refine/sections/shell-compositor.blp:72 #: refine/sections/shell-compositor.blp:80 msgid "These options will appear in Settings" msgstr "Эти параметры появятся в Настройках" #: refine/sections/shell-compositor.blp:79 msgid "Variable Refresh Rate Options" msgstr "Параметры переменной частоты обновления" #: refine/sections/shell-compositor.blp:94 msgid "Autoclose Xwayland" msgstr "" #: refine/sections/shell-compositor.blp:102 msgid "Xwayland Native Scaling" msgstr "Родное масштабирование Xwayland" #: refine/sections/sound.blp:5 msgid "Sound" msgstr "Звук" #: refine/sections/sound.blp:10 msgid "Volume Step" msgstr "Шаг громкости" #: refine/sections/wellbeing.blp:5 msgid "Wellbeing" msgstr "" #: refine/sections/wellbeing.blp:9 msgid "Eyesight Reminders" msgstr "" #: refine/sections/wellbeing.blp:12 refine/sections/wellbeing.blp:113 msgid "Show Countdown When Break Is Due" msgstr "" #: refine/sections/wellbeing.blp:18 refine/sections/wellbeing.blp:119 msgid "Lock Screen During Break" msgstr "" #: refine/sections/wellbeing.blp:24 refine/sections/wellbeing.blp:125 msgid "Delay (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:25 refine/sections/wellbeing.blp:126 msgid "Amount to delay break if requested" msgstr "" #: refine/sections/wellbeing.blp:53 refine/sections/wellbeing.blp:154 msgid "Break Duration (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:81 refine/sections/wellbeing.blp:182 msgid "Time Between Breaks (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:110 msgid "Movement Reminders" msgstr "" #: refine/widgets/panel-page.blp:6 msgid "Options will be changed after next login" msgstr "Параметры будут изменены после следующего входа в систему" #: refine/widgets/reset_button.py:34 refine/widgets/window-buttons-row.blp:64 msgid "Reset" msgstr "Сбросить" #: refine/widgets/window-buttons-row.blp:48 msgid "Hidden" msgstr "Скрыто" #: refine/widgets/window_buttons_row.py:95 msgid "Move to _Left Corner" msgstr "Переместить в _левый угол" #: refine/widgets/window_buttons_row.py:99 msgid "Move to _Right Corner" msgstr "Переместить в п_равый угол" #: refine/widgets/window_buttons_row.py:109 msgid "Move _Left" msgstr "Переместить _влево" #: refine/widgets/window_buttons_row.py:113 msgid "Move _Right" msgstr "Переместить в_право" #: refine/widgets/window_buttons_row.py:116 msgid "_Hide" msgstr "_Скрыть" #: refine/window.blp:34 refine/window.blp:65 msgid "About Refine" msgstr "О приложении" #: refine/window.blp:73 msgid "Unsupported Environment" msgstr "Неподдерживаемая среда рабочего стола" #: refine/window.blp:76 msgid "Accept the Risk and Continue" msgstr "Принять риск и продолжить" #: refine/window.py:118 msgid "" "Some settings may not work as intended and could lead to undesirable " "behavior." msgstr "" "Некоторые настройки могут работать не так, как задумано, и привести к " "нежелательному поведению." #: refine/window.py:125 msgid "" "Refine only supports versions of GNOME that have not been modified by the " "operating system." msgstr "" "Refine поддерживает только те версии GNOME, которые не были изменены " "операционной системой." #: refine/window.py:133 msgid "Refine is only intended to run on the GNOME desktop environment." msgstr "Refine предназначен для работы только в среде рабочего стола GNOME." #~ msgid "@app_name@" #~ msgstr "@app_name@" #~ msgctxt "shortcut window" #~ msgid "General" #~ msgstr "Общие" #~ msgctxt "shortcut window" #~ msgid "Show Shortcuts" #~ msgstr "Показать комбинации клавиш" #~ msgctxt "shortcut window" #~ msgid "Quit" #~ msgstr "Выйти" #~ msgid "Main Menu" #~ msgstr "Главное меню" #~ msgid "_Keyboard Shortcuts" #~ msgstr "_Комбинации клавиш" #~ msgid "_About Refine" #~ msgstr "_О приложении" Refine-0.7.1/po/tr.po000066400000000000000000000253571514222123300143410ustar00rootroot00000000000000# Turkish translation of page.tesk.Refine. # Copyright (C) 2025 page.tesk.Refine's COPYRIGHT HOLDER # This file is distributed under the same license as the page.tesk.Refine package. # # Sabri Ünal , 2025. # msgid "" msgstr "" "Project-Id-Version: refine\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-01-03 13:23-0500\n" "PO-Revision-Date: 2025-11-16 22:27+0300\n" "Last-Translator: Sabri Ünal \n" "Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 3.8\n" #: data/page.tesk.Refine.desktop.in.in:2 #: data/page.tesk.Refine.metainfo.xml.in.in:7 refine/window.blp:5 msgid "Refine" msgstr "Refine" #: data/page.tesk.Refine.desktop.in.in:3 #: data/page.tesk.Refine.metainfo.xml.in.in:8 msgid "Tweak various aspects of GNOME" msgstr "GNOMEʼun çeşitli yönlerini değiştirin" #: data/page.tesk.Refine.desktop.in.in:9 msgid "tweaks;tweak;toggle;" msgstr "tweaks;tweak;toggle;ince ayar;ince ayarlar;aç kapat;değiştir;" #: data/page.tesk.Refine.metainfo.xml.in.in:10 msgid "Refine helps discover advanced and experimental features in GNOME." msgstr "" "Refine, GNOMEʼun gelişmiş ve deneysel özelliklerinin keşfedilmesini sağlar." #: data/page.tesk.Refine.metainfo.xml.in.in:14 msgid "Hari Rana (TheEvilSkeleton)" msgstr "Hari Rana (TheEvilSkeleton)" #: data/page.tesk.Refine.metainfo.xml.in.in:36 msgid "Appearance Page" msgstr "Görünüm Sayfası" # Compositor, mutter içinde Dizgici diye çevrilmiş. #: data/page.tesk.Refine.metainfo.xml.in.in:40 msgid "Shell & Compositor Page" msgstr "Shell ve Dizgici Sayfası" #. Translators: Replace "translator-credits" with your name/username, and optionally an email or URL. #: refine/main.py:82 msgid "translator-credits" msgstr "Sabri Ünal " #: refine/main.py:83 msgid "Copyright © 2024 Hari Rana (TheEvilSkeleton)" msgstr "Telif Hakkı © 2024 Hari Rana (TheEvilSkeleton)" #: refine/main.py:87 msgid "Bottles" msgstr "Şişeler" #: refine/main.py:88 msgid "Run Windows software" msgstr "Windows yazılımını çalıştırın" #: refine/main.py:92 msgid "Upscaler" msgstr "Upscaler" #: refine/main.py:93 msgid "Upscale and enhance images" msgstr "Görüntüleri büyütün ve geliştirin" #: refine/sections/appearance.blp:5 msgid "Appearance" msgstr "Görünüm" #: refine/sections/appearance.blp:9 msgid "Themes" msgstr "Temalar" #: refine/sections/appearance.blp:12 msgid "Cursors" msgstr "İmleçler" #: refine/sections/appearance.blp:20 msgid "Icons" msgstr "Simgeler" #: refine/sections/appearance.blp:28 msgid "GTK 3/4 Theme" msgstr "GTK 3/4 Teması" #: refine/sections/appearance.blp:29 msgid "Platform libraries may ignore this option" msgstr "Platform kütüphaneleri bu seçeneği göz ardı edebilir" #: refine/sections/appearance.blp:44 msgid "Light Style" msgstr "Açık Biçem" #: refine/sections/appearance.blp:45 msgid "Use a light appearance for the shell and supported apps" msgstr "Shell ve desteklenen uygulamalar için açık görünümü kullan" #: refine/sections/appearance.blp:53 msgid "Fonts" msgstr "Yazı Tipleri" #: refine/sections/appearance.blp:56 msgid "Interface" msgstr "Arayüz" #: refine/sections/appearance.blp:62 msgid "Document" msgstr "Belge" #: refine/sections/appearance.blp:68 msgid "Monospace" msgstr "Eş aralıklı" #: refine/sections/appearance.blp:75 msgid "Text Rendering" msgstr "Metin İşleme" #: refine/sections/appearance.blp:78 msgid "Font Hinting" msgstr "Yazı Tipi Yumuşatma" #: refine/sections/appearance.blp:79 msgid "Adjusts text shapes for better clarity, especially at smaller sizes" msgstr "" "Özellikle küçük boyutlarda daha iyi netlik için metin şekillerini ayarlar" #: refine/sections/appearance.blp:86 msgid "Font Antialiasing" msgstr "Yazı Tipi Kenar Yumuşatma" #: refine/sections/appearance.blp:87 msgid "Smooths text edges for better clarity by blending colors" msgstr "Renkleri karıştırarak daha iyi netlik için metin kenarlarını yumuşatır" #: refine/sections/appearance.blp:95 msgid "Background" msgstr "Arka plan" #: refine/sections/appearance.blp:98 msgid "Adjustment" msgstr "Düzeltme" #: refine/sections/mouse-touchpad.blp:5 msgid "Mouse & Touchpad" msgstr "Fare ve Dokunmatik Yüzey" #: refine/sections/mouse-touchpad.blp:9 msgid "Mouse" msgstr "Fare" #: refine/sections/mouse-touchpad.blp:12 msgid "Middle Click to Paste Text" msgstr "Metin Yapıştırmak için Orta Tıklama" #: refine/sections/mouse-touchpad.blp:13 msgid "Paste highlighted text, independent of the clipboard" msgstr "Vurgulanan metni, panodan bağımsız olarak yapıştır" #: refine/sections/mouse-touchpad.blp:20 msgid "Window Header Bar Actions" msgstr "Pencere Başlık Çubuğu Eylemleri" #: refine/sections/mouse-touchpad.blp:23 msgid "Double Click" msgstr "Çift Tıklama" #: refine/sections/mouse-touchpad.blp:36 msgid "Middle Click" msgstr "Orta Tıklama" #: refine/sections/mouse-touchpad.blp:49 msgid "Secondary Click" msgstr "İkincil Tık" #: refine/sections/power.blp:5 msgid "Power" msgstr "Güç" #: refine/sections/power.blp:10 msgid "Show Power Buttons in Lock Screen" msgstr "Kilit Ekranında Güç Düğmelerini Göster" #: refine/sections/shell-compositor.blp:5 msgid "Shell & Compositor" msgstr "Kabuk ve Dizgici" #: refine/sections/shell-compositor.blp:10 msgid "Center New Windows" msgstr "Yeni Pencereleri Ortala" #: refine/sections/shell-compositor.blp:16 msgid "Attach Modal Windows" msgstr "Yardımcı Pencereler Ekleme" #: refine/sections/shell-compositor.blp:17 msgid "" "Attaches modal windows to their parent window to prevent them from moving " "independently" msgstr "" "Bağımsız hareket etmelerini önlemek için yardımcı pencereleri ana " "pencerelere bağlar" #: refine/sections/shell-compositor.blp:23 msgid "Resize With Secondary Clicks" msgstr "İkincil Tıklamalarla Yeniden Boyutlandırma" #: refine/sections/shell-compositor.blp:24 msgid "" "Use Secondary Click instead of Middle Click to resize windows while holding " "the window action key" msgstr "" "Pencere işlem tuşunu basılı tutarken pencereleri yeniden boyutlandırmak için " "Orta Tıklama yerine İkincil Tıklamayı kullan" #: refine/sections/shell-compositor.blp:32 msgid "Window Focus Mode" msgstr "Pencere Odaklama Kipi" #: refine/sections/shell-compositor.blp:33 msgid "Sets the action that will cause a window to take focus" msgstr "Pencerenin odağı almasına neden olacak eylemi ayarlar" #: refine/sections/shell-compositor.blp:40 msgid "Automatically Raise on Hover" msgstr "Üzerine Gelindiğinde Kendiliğinden Yükselt" #: refine/sections/shell-compositor.blp:41 msgid "Automatically raises the focused window" msgstr "Odaklanılan pencereyi kendiliğinden üste getirir" #: refine/sections/shell-compositor.blp:48 msgid "Window Button Layout" msgstr "Pencere Düğme Düzeni" #: refine/sections/shell-compositor.blp:51 msgid "Header Bar" msgstr "Başlık Çubuğu" #: refine/sections/shell-compositor.blp:64 msgid "Experimental Features" msgstr "Deneysel Özellikler" #: refine/sections/shell-compositor.blp:71 msgid "Fractional Scaling Options" msgstr "Kesirli Ölçeklendirme Seçenekleri" #: refine/sections/shell-compositor.blp:72 #: refine/sections/shell-compositor.blp:80 msgid "These options will appear in Settings" msgstr "Bu seçenekler Ayarlarʼda görünecek" #: refine/sections/shell-compositor.blp:79 msgid "Variable Refresh Rate Options" msgstr "Değişken Yenileme Hızı Seçenekleri" #: refine/sections/shell-compositor.blp:94 msgid "Autoclose Xwayland" msgstr "Xwaylandʼı Kendiliğinden Kapat" #: refine/sections/shell-compositor.blp:102 msgid "Xwayland Native Scaling" msgstr "Xwayland Yerel Ölçeklendirme" #: refine/sections/sound.blp:5 msgid "Sound" msgstr "Ses" #: refine/sections/sound.blp:10 msgid "Volume Step" msgstr "Ses Basamağı" #: refine/sections/wellbeing.blp:5 msgid "Wellbeing" msgstr "" #: refine/sections/wellbeing.blp:9 msgid "Eyesight Reminders" msgstr "" #: refine/sections/wellbeing.blp:12 refine/sections/wellbeing.blp:113 msgid "Show Countdown When Break Is Due" msgstr "" #: refine/sections/wellbeing.blp:18 refine/sections/wellbeing.blp:119 msgid "Lock Screen During Break" msgstr "" #: refine/sections/wellbeing.blp:24 refine/sections/wellbeing.blp:125 msgid "Delay (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:25 refine/sections/wellbeing.blp:126 msgid "Amount to delay break if requested" msgstr "" #: refine/sections/wellbeing.blp:53 refine/sections/wellbeing.blp:154 msgid "Break Duration (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:81 refine/sections/wellbeing.blp:182 msgid "Time Between Breaks (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:110 msgid "Movement Reminders" msgstr "" #: refine/widgets/panel-page.blp:6 msgid "Options will be changed after next login" msgstr "Seçeneklerin etkin olması için oturumu yeniden başlatın" #: refine/widgets/reset_button.py:34 refine/widgets/window-buttons-row.blp:64 msgid "Reset" msgstr "Sıfırla" #: refine/widgets/window-buttons-row.blp:48 msgid "Hidden" msgstr "Gizli" #: refine/widgets/window_buttons_row.py:95 msgid "Move to _Left Corner" msgstr "S_ol Köşeye Taşı" #: refine/widgets/window_buttons_row.py:99 msgid "Move to _Right Corner" msgstr "_Sağ Köşeye Taşı" #: refine/widgets/window_buttons_row.py:109 msgid "Move _Left" msgstr "S_ola Taşı" #: refine/widgets/window_buttons_row.py:113 msgid "Move _Right" msgstr "_Sağa Taşı" #: refine/widgets/window_buttons_row.py:116 msgid "_Hide" msgstr "_Gizle" #: refine/window.blp:34 refine/window.blp:65 msgid "About Refine" msgstr "Refine Hakkında" #: refine/window.blp:73 msgid "Unsupported Environment" msgstr "Desteklenmeyen Ortam" #: refine/window.blp:76 msgid "Accept the Risk and Continue" msgstr "Riski Kabul Et ve Sürdür" #: refine/window.py:118 msgid "" "Some settings may not work as intended and could lead to undesirable " "behavior." msgstr "" "Kimi ayarlar amaçlandığı gibi çalışmayabilir ve istenmeyen davranışlara yol " "açabilir." #: refine/window.py:125 msgid "" "Refine only supports versions of GNOME that have not been modified by the " "operating system." msgstr "" "Refine yalnızca işletim sistemi tarafından değiştirilmemiş GNOME sürümlerini " "destekler." #: refine/window.py:133 msgid "Refine is only intended to run on the GNOME desktop environment." msgstr "" "Refine yalnızca GNOME masaüstü ortamında çalışmak üzere tasarlanmıştır." #~ msgid "@app_name@" #~ msgstr "@app_name@" #, fuzzy #~ msgctxt "shortcut window" #~ msgid "Show Shortcuts" #~ msgstr "_Klavye Kısayolları" #~ msgid "Main Menu" #~ msgstr "Ana Menü" #~ msgid "_Keyboard Shortcuts" #~ msgstr "_Klavye Kısayolları" #~ msgid "_About Refine" #~ msgstr "Refine _Hakkında" Refine-0.7.1/po/uk.po000066400000000000000000000301011514222123300143120ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the refine package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: refine\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-01-03 13:23-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: data/page.tesk.Refine.desktop.in.in:2 #: data/page.tesk.Refine.metainfo.xml.in.in:7 refine/window.blp:5 msgid "Refine" msgstr "Refine" #: data/page.tesk.Refine.desktop.in.in:3 #: data/page.tesk.Refine.metainfo.xml.in.in:8 msgid "Tweak various aspects of GNOME" msgstr "Налаштовуйте всілякі функції GNOME" #: data/page.tesk.Refine.desktop.in.in:9 msgid "tweaks;tweak;toggle;" msgstr "налаштування;опції;опція;перемикач" #: data/page.tesk.Refine.metainfo.xml.in.in:10 msgid "Refine helps discover advanced and experimental features in GNOME." msgstr "" "Refine допомагає вам знаходити додаткові та експериментальні функції GNOME." #: data/page.tesk.Refine.metainfo.xml.in.in:14 msgid "Hari Rana (TheEvilSkeleton)" msgstr "Харі Рана (TheEvilSkeleton)" #: data/page.tesk.Refine.metainfo.xml.in.in:36 msgid "Appearance Page" msgstr "Сторінка вигляду" #: data/page.tesk.Refine.metainfo.xml.in.in:40 #, fuzzy msgid "Shell & Compositor Page" msgstr "Сторінка оболонки та компонувальника вікон" #. Translators: Replace "translator-credits" with your name/username, and optionally an email or URL. #: refine/main.py:82 msgid "translator-credits" msgstr "sadlyascii https://matrix.to/#/@two:matrix.debian.social" #: refine/main.py:83 msgid "Copyright © 2024 Hari Rana (TheEvilSkeleton)" msgstr "Авторство © 2024 Харі Рана (TheEvilSkeleton)" #: refine/main.py:87 msgid "Bottles" msgstr "Bottles" #: refine/main.py:88 msgid "Run Windows software" msgstr "Запускайте програми для Windows" #: refine/main.py:92 msgid "Upscaler" msgstr "Upscaler" #: refine/main.py:93 msgid "Upscale and enhance images" msgstr "Покращуйте якість картинок" #: refine/sections/appearance.blp:5 msgid "Appearance" msgstr "Вигляд" #: refine/sections/appearance.blp:9 msgid "Themes" msgstr "Теми" #: refine/sections/appearance.blp:12 msgid "Cursors" msgstr "Курсори" #: refine/sections/appearance.blp:20 msgid "Icons" msgstr "Іконки" #: refine/sections/appearance.blp:28 msgid "GTK 3/4 Theme" msgstr "Тема GTK 3/4" #: refine/sections/appearance.blp:29 msgid "Platform libraries may ignore this option" msgstr "Бібліотеки інтерфейсів можуть не читати цю опцію" #: refine/sections/appearance.blp:44 msgid "Light Style" msgstr "Світлий стиль" #: refine/sections/appearance.blp:45 msgid "Use a light appearance for the shell and supported apps" msgstr "" "Використовувати світлу тему в оболонці, та програмах, що її підтримують." #: refine/sections/appearance.blp:53 msgid "Fonts" msgstr "Шрифти" #: refine/sections/appearance.blp:56 msgid "Interface" msgstr "Інтерфейс" #: refine/sections/appearance.blp:62 msgid "Document" msgstr "Документ" #: refine/sections/appearance.blp:68 msgid "Monospace" msgstr "Моноширинний" #: refine/sections/appearance.blp:75 msgid "Text Rendering" msgstr "Растеризація тексту" #: refine/sections/appearance.blp:78 msgid "Font Hinting" msgstr "Гінтинг шрифтів" #: refine/sections/appearance.blp:79 msgid "Adjusts text shapes for better clarity, especially at smaller sizes" msgstr "Коригує форму літер для кращої чіткості (особливо в маленьких шрифтах)" #: refine/sections/appearance.blp:86 msgid "Font Antialiasing" msgstr "Згладжування шрифтів" #: refine/sections/appearance.blp:87 msgid "Smooths text edges for better clarity by blending colors" msgstr "Робить краї літер більш плавними, змішуючи кольори" #: refine/sections/appearance.blp:95 msgid "Background" msgstr "Фон" #: refine/sections/appearance.blp:98 msgid "Adjustment" msgstr "Налаштування" #: refine/sections/mouse-touchpad.blp:5 msgid "Mouse & Touchpad" msgstr "Миша й тачпад" #: refine/sections/mouse-touchpad.blp:9 msgid "Mouse" msgstr "Миша" #: refine/sections/mouse-touchpad.blp:12 msgid "Middle Click to Paste Text" msgstr "Вставляти текст середньою кнопкою" #: refine/sections/mouse-touchpad.blp:13 msgid "Paste highlighted text, independent of the clipboard" msgstr "Вставляти виділений текст, незалежно від того, що в буфері обміну" #: refine/sections/mouse-touchpad.blp:20 msgid "Window Header Bar Actions" msgstr "Дії на заголовках вікон" #: refine/sections/mouse-touchpad.blp:23 msgid "Double Click" msgstr "Подвійний клац" #: refine/sections/mouse-touchpad.blp:36 msgid "Middle Click" msgstr "Клац середньою кнопкою миші" #: refine/sections/mouse-touchpad.blp:49 msgid "Secondary Click" msgstr "Клац другою кнопкою миші" #: refine/sections/power.blp:5 msgid "Power" msgstr "" #: refine/sections/power.blp:10 msgid "Show Power Buttons in Lock Screen" msgstr "" #: refine/sections/shell-compositor.blp:5 msgid "Shell & Compositor" msgstr "Оболонка та компонувальник вікон" #: refine/sections/shell-compositor.blp:10 msgid "Center New Windows" msgstr "Центрувати нові вікна" #: refine/sections/shell-compositor.blp:16 msgid "Attach Modal Windows" msgstr "Прив'язувати діалогові вікна" #: refine/sections/shell-compositor.blp:17 msgid "" "Attaches modal windows to their parent window to prevent them from moving " "independently" msgstr "Прив'язує діалогові вікна до основних, щоб вони рухалися разом" #: refine/sections/shell-compositor.blp:23 msgid "Resize With Secondary Clicks" msgstr "Змінювати розмір другою кнопкою миші" #: refine/sections/shell-compositor.blp:24 msgid "" "Use Secondary Click instead of Middle Click to resize windows while holding " "the window action key" msgstr "" "Використовувати другу кнопку миші замість середньої (разом з клавішею " "Вікна), щоб розтягувати чи зменшувати вікно" #: refine/sections/shell-compositor.blp:32 msgid "Window Focus Mode" msgstr "Режим фокусу вікон" #: refine/sections/shell-compositor.blp:33 msgid "Sets the action that will cause a window to take focus" msgstr "Обирає дію, яка дає вікну фокус" #: refine/sections/shell-compositor.blp:40 msgid "Automatically Raise on Hover" msgstr "Автоматично фокусувати вікно під курсором" #: refine/sections/shell-compositor.blp:41 msgid "Automatically raises the focused window" msgstr "Автоматично підіймає вікно, що під фокусом" #: refine/sections/shell-compositor.blp:48 msgid "Window Button Layout" msgstr "Розташування кнопок вікон" #: refine/sections/shell-compositor.blp:51 msgid "Header Bar" msgstr "Заголовок" #: refine/sections/shell-compositor.blp:64 msgid "Experimental Features" msgstr "Експериментальні функції" #: refine/sections/shell-compositor.blp:71 msgid "Fractional Scaling Options" msgstr "Налаштування нецілочисельного масштабу" #: refine/sections/shell-compositor.blp:72 #: refine/sections/shell-compositor.blp:80 msgid "These options will appear in Settings" msgstr "Ці опції з'являться у системних налаштуваннях" #: refine/sections/shell-compositor.blp:79 msgid "Variable Refresh Rate Options" msgstr "Налаштування змінної швидкості оновлення дисплею" #: refine/sections/shell-compositor.blp:94 msgid "Autoclose Xwayland" msgstr "" #: refine/sections/shell-compositor.blp:102 msgid "Xwayland Native Scaling" msgstr "Самостійне масштабування в Xwayland" #: refine/sections/sound.blp:5 msgid "Sound" msgstr "Звук" #: refine/sections/sound.blp:10 msgid "Volume Step" msgstr "Розмір ділення гучності" #: refine/sections/wellbeing.blp:5 msgid "Wellbeing" msgstr "" #: refine/sections/wellbeing.blp:9 msgid "Eyesight Reminders" msgstr "" #: refine/sections/wellbeing.blp:12 refine/sections/wellbeing.blp:113 msgid "Show Countdown When Break Is Due" msgstr "" #: refine/sections/wellbeing.blp:18 refine/sections/wellbeing.blp:119 msgid "Lock Screen During Break" msgstr "" #: refine/sections/wellbeing.blp:24 refine/sections/wellbeing.blp:125 msgid "Delay (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:25 refine/sections/wellbeing.blp:126 msgid "Amount to delay break if requested" msgstr "" #: refine/sections/wellbeing.blp:53 refine/sections/wellbeing.blp:154 msgid "Break Duration (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:81 refine/sections/wellbeing.blp:182 msgid "Time Between Breaks (Seconds)" msgstr "" #: refine/sections/wellbeing.blp:110 msgid "Movement Reminders" msgstr "" #: refine/widgets/panel-page.blp:6 msgid "Options will be changed after next login" msgstr "Налаштування зміняться після наступного входу" #: refine/widgets/reset_button.py:34 refine/widgets/window-buttons-row.blp:64 msgid "Reset" msgstr "Скинути" #: refine/widgets/window-buttons-row.blp:48 msgid "Hidden" msgstr "Сховано" #: refine/widgets/window_buttons_row.py:95 msgid "Move to _Left Corner" msgstr "Пересунути в _лівий куток" #: refine/widgets/window_buttons_row.py:99 msgid "Move to _Right Corner" msgstr "Пересунути у _правий куток" #: refine/widgets/window_buttons_row.py:109 msgid "Move _Left" msgstr "Пересунути _ліворуч" #: refine/widgets/window_buttons_row.py:113 msgid "Move _Right" msgstr "Пересунути _праворуч" #: refine/widgets/window_buttons_row.py:116 msgid "_Hide" msgstr "С_ховати" #: refine/window.blp:34 refine/window.blp:65 msgid "About Refine" msgstr "Про Refine" #: refine/window.blp:73 msgid "Unsupported Environment" msgstr "Середовище не підтримується" #: refine/window.blp:76 msgid "Accept the Risk and Continue" msgstr "Погодитись на ризики та продовжити" #: refine/window.py:118 msgid "" "Some settings may not work as intended and could lead to undesirable " "behavior." msgstr "Деякі опції можуть не працювати, або поводитись не так, як задумано." #: refine/window.py:125 msgid "" "Refine only supports versions of GNOME that have not been modified by the " "operating system." msgstr "Refine підтримує тільки немодифіковані версії GNOME." #: refine/window.py:133 msgid "Refine is only intended to run on the GNOME desktop environment." msgstr "Refine зроблено тільки для середовища GNOME." #~ msgid "@app_name@" #~ msgstr "@app_name@" #~ msgctxt "shortcut window" #~ msgid "General" #~ msgstr "Загальне" #~ msgctxt "shortcut window" #~ msgid "Show Shortcuts" #~ msgstr "Показати клавіатурні скорочення" #~ msgctxt "shortcut window" #~ msgid "Quit" #~ msgstr "Вийти" #~ msgid "Main Menu" #~ msgstr "Головне меню" #~ msgid "_Keyboard Shortcuts" #~ msgstr "Скорочення _клавіатури" #~ msgid "_About Refine" #~ msgstr "_Про Refine" Refine-0.7.1/po/zh_CN.po000066400000000000000000000240721514222123300147060ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the refine package. # FIRST AUTHOR , YEAR. # Maicss , 2025. # msgid "" msgstr "" "Project-Id-Version: refine\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-01-03 13:23-0500\n" "PO-Revision-Date: 2025-01-19 20:12+0800\n" "Last-Translator: Maicss \n" "Language-Team: Chinese (China)\n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Gtranslator 47.1\n" #: data/page.tesk.Refine.desktop.in.in:2 #: data/page.tesk.Refine.metainfo.xml.in.in:7 refine/window.blp:5 msgid "Refine" msgstr "Refine" #: data/page.tesk.Refine.desktop.in.in:3 #: data/page.tesk.Refine.metainfo.xml.in.in:8 msgid "Tweak various aspects of GNOME" msgstr "自定义 GNOME 的方方面面" #: data/page.tesk.Refine.desktop.in.in:9 msgid "tweaks;tweak;toggle;" msgstr "tweaks;tweak;toggle;" #: data/page.tesk.Refine.metainfo.xml.in.in:10 msgid "Refine helps discover advanced and experimental features in GNOME." msgstr "Refine 可帮助你发现 GNOME 中的高级和实验性特性。" #: data/page.tesk.Refine.metainfo.xml.in.in:14 msgid "Hari Rana (TheEvilSkeleton)" msgstr "Hari Rana (TheEvilSkeleton)" #: data/page.tesk.Refine.metainfo.xml.in.in:36 msgid "Appearance Page" msgstr "外观页面" #: data/page.tesk.Refine.metainfo.xml.in.in:40 #, fuzzy msgid "Shell & Compositor Page" msgstr "Shell 与合成器" #. Translators: Replace "translator-credits" with your name/username, and optionally an email or URL. #: refine/main.py:82 msgid "translator-credits" msgstr "Maicss" #: refine/main.py:83 msgid "Copyright © 2024 Hari Rana (TheEvilSkeleton)" msgstr "Copyright © 2024 Hari Rana (TheEvilSkeleton)" #: refine/main.py:87 msgid "Bottles" msgstr "Bottles" #: refine/main.py:88 msgid "Run Windows software" msgstr "运行 Windows 软件" #: refine/main.py:92 msgid "Upscaler" msgstr "Upscaler" #: refine/main.py:93 msgid "Upscale and enhance images" msgstr "提升和增强图像" #: refine/sections/appearance.blp:5 msgid "Appearance" msgstr "外观" #: refine/sections/appearance.blp:9 msgid "Themes" msgstr "主题" #: refine/sections/appearance.blp:12 msgid "Cursors" msgstr "鼠标指针" #: refine/sections/appearance.blp:20 msgid "Icons" msgstr "图标" #: refine/sections/appearance.blp:28 msgid "GTK 3/4 Theme" msgstr "GTK 3/4 主题" #: refine/sections/appearance.blp:29 msgid "Platform libraries may ignore this option" msgstr "平台库可能会忽略此选项" #: refine/sections/appearance.blp:44 msgid "Light Style" msgstr "亮色风格" #: refine/sections/appearance.blp:45 msgid "Use a light appearance for the shell and supported apps" msgstr "为 Shell 和支持的应用程序使用亮色风格外观" #: refine/sections/appearance.blp:53 msgid "Fonts" msgstr "字体" #: refine/sections/appearance.blp:56 msgid "Interface" msgstr "界面" #: refine/sections/appearance.blp:62 msgid "Document" msgstr "文档" #: refine/sections/appearance.blp:68 msgid "Monospace" msgstr "等宽" #: refine/sections/appearance.blp:75 msgid "Text Rendering" msgstr "文本渲染" #: refine/sections/appearance.blp:78 msgid "Font Hinting" msgstr "字体提示" #: refine/sections/appearance.blp:79 msgid "Adjusts text shapes for better clarity, especially at smaller sizes" msgstr "调整文本形状以获得更好的清晰度,特别是在较小的尺寸时" #: refine/sections/appearance.blp:86 msgid "Font Antialiasing" msgstr "字体抗锯齿" #: refine/sections/appearance.blp:87 msgid "Smooths text edges for better clarity by blending colors" msgstr "通过混合颜色平滑文本边缘以获得更好的清晰度" #: refine/sections/appearance.blp:95 msgid "Background" msgstr "背景" #: refine/sections/appearance.blp:98 msgid "Adjustment" msgstr "自适应" #: refine/sections/mouse-touchpad.blp:5 msgid "Mouse & Touchpad" msgstr "鼠标和触控板" #: refine/sections/mouse-touchpad.blp:9 msgid "Mouse" msgstr "鼠标" #: refine/sections/mouse-touchpad.blp:12 msgid "Middle Click to Paste Text" msgstr "单击中键粘贴文本" #: refine/sections/mouse-touchpad.blp:13 msgid "Paste highlighted text, independent of the clipboard" msgstr "不通过剪贴板,直接粘贴选中文本" #: refine/sections/mouse-touchpad.blp:20 msgid "Window Header Bar Actions" msgstr "窗口标题栏动作" #: refine/sections/mouse-touchpad.blp:23 msgid "Double Click" msgstr "双击左键" #: refine/sections/mouse-touchpad.blp:36 msgid "Middle Click" msgstr "单击中键" #: refine/sections/mouse-touchpad.blp:49 msgid "Secondary Click" msgstr "单击右键" #: refine/sections/power.blp:5 msgid "Power" msgstr "电源" #: refine/sections/power.blp:10 msgid "Show Power Buttons in Lock Screen" msgstr "在锁屏界面显示电源按钮" #: refine/sections/shell-compositor.blp:5 msgid "Shell & Compositor" msgstr "Shell 与合成器" #: refine/sections/shell-compositor.blp:10 msgid "Center New Windows" msgstr "在屏幕中心创建新窗口" #: refine/sections/shell-compositor.blp:16 msgid "Attach Modal Windows" msgstr "附加模态窗口" #: refine/sections/shell-compositor.blp:17 msgid "" "Attaches modal windows to their parent window to prevent them from moving " "independently" msgstr "将模态窗口附加到它们的父窗口以防止它们独立移动" #: refine/sections/shell-compositor.blp:23 msgid "Resize With Secondary Clicks" msgstr "右键调整大小" #: refine/sections/shell-compositor.blp:24 msgid "" "Use Secondary Click instead of Middle Click to resize windows while holding " "the window action key" msgstr "在按住窗口操作键的同时,使用辅助单击而不是中键单击来调整窗口大小" #: refine/sections/shell-compositor.blp:32 msgid "Window Focus Mode" msgstr "窗口焦点模式" #: refine/sections/shell-compositor.blp:33 msgid "Sets the action that will cause a window to take focus" msgstr "设置使窗口成为焦点的操作" #: refine/sections/shell-compositor.blp:40 msgid "Automatically Raise on Hover" msgstr "悬停时自动提升" #: refine/sections/shell-compositor.blp:41 msgid "Automatically raises the focused window" msgstr "自动提升聚焦窗口" #: refine/sections/shell-compositor.blp:48 msgid "Window Button Layout" msgstr "窗口按钮布局" #: refine/sections/shell-compositor.blp:51 msgid "Header Bar" msgstr "标题栏" #: refine/sections/shell-compositor.blp:64 msgid "Experimental Features" msgstr "实验性功能" #: refine/sections/shell-compositor.blp:71 msgid "Fractional Scaling Options" msgstr "分数缩放选项" #: refine/sections/shell-compositor.blp:72 #: refine/sections/shell-compositor.blp:80 msgid "These options will appear in Settings" msgstr "这些选项将出现在系统设置中" #: refine/sections/shell-compositor.blp:79 msgid "Variable Refresh Rate Options" msgstr "可变刷新率选项" #: refine/sections/shell-compositor.blp:94 msgid "Autoclose Xwayland" msgstr "自动关闭 Xwayland" #: refine/sections/shell-compositor.blp:102 msgid "Xwayland Native Scaling" msgstr "Xwayland 原生缩放" #: refine/sections/sound.blp:5 msgid "Sound" msgstr "声音" #: refine/sections/sound.blp:10 msgid "Volume Step" msgstr "音量调整步长" #: refine/sections/wellbeing.blp:5 msgid "Wellbeing" msgstr "身心健康" #: refine/sections/wellbeing.blp:9 msgid "Eyesight Reminders" msgstr "护眼提醒" #: refine/sections/wellbeing.blp:12 refine/sections/wellbeing.blp:113 msgid "Show Countdown When Break Is Due" msgstr "在休息时显示倒计时" #: refine/sections/wellbeing.blp:18 refine/sections/wellbeing.blp:119 msgid "Lock Screen During Break" msgstr "休息时锁屏" #: refine/sections/wellbeing.blp:24 refine/sections/wellbeing.blp:125 msgid "Delay (Seconds)" msgstr "延迟(秒)" #: refine/sections/wellbeing.blp:25 refine/sections/wellbeing.blp:126 msgid "Amount to delay break if requested" msgstr "允许延迟的时间" #: refine/sections/wellbeing.blp:53 refine/sections/wellbeing.blp:154 msgid "Break Duration (Seconds)" msgstr "休息时长(秒)" #: refine/sections/wellbeing.blp:81 refine/sections/wellbeing.blp:182 msgid "Time Between Breaks (Seconds)" msgstr "休息间隔(秒)" #: refine/sections/wellbeing.blp:110 msgid "Movement Reminders" msgstr "活动提醒" #: refine/widgets/panel-page.blp:6 msgid "Options will be changed after next login" msgstr "修改将在下次登录后生效" #: refine/widgets/reset_button.py:34 refine/widgets/window-buttons-row.blp:64 msgid "Reset" msgstr "重置" #: refine/widgets/window-buttons-row.blp:48 msgid "Hidden" msgstr "隐藏" #: refine/widgets/window_buttons_row.py:95 msgid "Move to _Left Corner" msgstr "" #: refine/widgets/window_buttons_row.py:99 msgid "Move to _Right Corner" msgstr "" #: refine/widgets/window_buttons_row.py:109 msgid "Move _Left" msgstr "" #: refine/widgets/window_buttons_row.py:113 msgid "Move _Right" msgstr "" #: refine/widgets/window_buttons_row.py:116 msgid "_Hide" msgstr "" #: refine/window.blp:34 refine/window.blp:65 msgid "About Refine" msgstr "关于 Refine" #: refine/window.blp:73 msgid "Unsupported Environment" msgstr "不支持的环境" #: refine/window.blp:76 msgid "Accept the Risk and Continue" msgstr "接受风险,继续前进" #: refine/window.py:118 msgid "" "Some settings may not work as intended and could lead to undesirable " "behavior." msgstr "某些设置可能无法正常工作,并可能导致不良行为。" #: refine/window.py:125 msgid "" "Refine only supports versions of GNOME that have not been modified by the " "operating system." msgstr "Refine 仅支持未被操作系统修改过的 GNOME 版本。" #: refine/window.py:133 msgid "Refine is only intended to run on the GNOME desktop environment." msgstr "Refine 只能在 GNOME 桌面环境下运行。" #~ msgid "@app_name@" #~ msgstr "@app_name@" #, fuzzy #~ msgctxt "shortcut window" #~ msgid "Show Shortcuts" #~ msgstr "_键盘快捷键" #~ msgid "Main Menu" #~ msgstr "主菜单" #~ msgid "_Keyboard Shortcuts" #~ msgstr "_键盘快捷键" #~ msgid "_About Refine" #~ msgstr "_关于 Refine" Refine-0.7.1/pyproject.toml000066400000000000000000000034421514222123300156410ustar00rootroot00000000000000[refine] requires-python = ">=3.12" [tool.typos.files] extend-exclude = ["po"] [tool.mypy] pretty = true strict = true disable_error_code = ["misc"] [tool.ruff] fix = true show-fixes = true [tool.ruff.lint] ignore = [ "D100", # Missing docstring in public module "D104", # Missing docstring in public package "ANN401", # Dynamically typed expressions (typing.Any) are disallowed "FA", # flake8-future-annotations "S603", # `subprocess` call: check for execution of untrusted input "E501", # Line too long "PLR0915", # Too many statements "C901", # {func} is too complex "ERA001", # Found commented-out code "FIX", # flake8-fixme "TD", # flake8-todos "BLE001", # Do not catch blind exception: `Exception` "FBT003", # Boolean positional value in function call "A", # flake8-builtins "FBT", # Boolean default positional argument in function definition "RUF", # String contains ambiguous `’` (RIGHT SINGLE QUOTATION MARK). Did you mean ``` (GRAVE ACCENT)? "COM812", # The following rule may cause conflicts when used with the formatter: `COM812`. "D107", # Missing docstring in `__init__` "D401", # First line of docstring should be in imperative mood: "Callback for the app.about action." "INP", # File `refine/widgets/action_row.py` is part of an implicit namespace package. Add an `__init__.py`. "D", # Missing docstring in public method "PLW", # `for` loop variable `word` overwritten by assignment target "EXE003", # Shebang should contain `python`, `pytest`, or `uv run` ] select = [ "ALL", ] [tool.ruff.lint.flake8-builtins] strict-checking = true [tool.ruff.lint.flake8-type-checking] strict = true [tool.ruff.lint.isort] case-sensitive = true [tool.ruff.lint.pydocstyle] convention = "pep257" Refine-0.7.1/refine/000077500000000000000000000000001514222123300141725ustar00rootroot00000000000000Refine-0.7.1/refine/__init__.py000066400000000000000000000015541514222123300163100ustar00rootroot00000000000000# __init__.py.in # # Copyright 2025 Hari Rana # # 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 . # # SPDX-License-Identifier: GPL-3.0-or-later APP_ID = "@app_id@" PROFILE = "@profile@" MAJOR = "@major@" MINOR = "@minor@" MICRO = "@micro@" VERSION = "@VERSION@" Refine-0.7.1/refine/__init__.py.in000066400000000000000000000015541514222123300167150ustar00rootroot00000000000000# __init__.py.in # # Copyright 2025 Hari Rana # # 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 . # # SPDX-License-Identifier: GPL-3.0-or-later APP_ID = "@app_id@" PROFILE = "@profile@" MAJOR = "@major@" MINOR = "@minor@" MICRO = "@micro@" VERSION = "@VERSION@" Refine-0.7.1/refine/logger.py000066400000000000000000000026421514222123300160270ustar00rootroot00000000000000# logger.py # # Copyright (C) 2025 The Upscaler Contributors # # 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, version 3. # # 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 . # # SPDX-License-Identifier: GPL-3.0-only import logging import os import sys from refine import PROFILE class PackageNameFilter(logging.Filter): """The path name of the package.""" def filter(self, record: logging.LogRecord) -> bool | logging.LogRecord: """Get the path name of the package.""" package_absolute_path = sys.path[1] + os.sep record.packagename = record.pathname.replace(package_absolute_path, "") return True logger = logging.getLogger() format = "%(packagename)s:%(lineno)d:0:\n%(levelname)8s: %(funcName)s(): %(message)s" if PROFILE == "development": logging.basicConfig( format=format, level=logging.DEBUG, ) else: logging.basicConfig( format=format, ) logger.handlers[0].addFilter(PackageNameFilter()) Refine-0.7.1/refine/main.py000066400000000000000000000075441514222123300155020ustar00rootroot00000000000000# main.py # # Copyright 2024 Hari Rana (TheEvilSkeleton) # # 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 . # # SPDX-License-Identifier: GPL-3.0-or-later import sys from collections.abc import Callable from gettext import gettext as _ from typing import Any import gi from refine import APP_ID, MAJOR, MINOR, PROFILE gi.require_version("Gtk", "4.0") gi.require_version("Adw", "1") gi.require_version("Pango", "1.0") gi.require_version("XdpGtk4", "1.0") # ruff: noqa: E402 from gi.repository import Adw, Gio from refine import settings from refine.typing import SettingsSource from refine.window import Window class Application(Adw.Application): """The main application singleton class.""" settings: dict[str, SettingsSource] = {} def __init__(self) -> None: super().__init__( application_id=APP_ID, flags=Gio.ApplicationFlags.DEFAULT_FLAGS, resource_base_path="/page/tesk/Refine", ) self.create_action("quit", lambda *_: self.quit(), ["q"]) self.create_action("about", self.on_about_action) self.sources: list[Gio.SettingsSchemaSource] = ( settings.create_schema_sources_list() ) def do_activate(self) -> None: """ Call when the application is activated. We raise the application's main window, creating it if necessary. """ win = self.props.active_window if not win: win = Window(application=self) win.present() if PROFILE == "development": win.add_css_class("devel") def on_about_action(self, *_args: Any) -> None: """Callback for the app.about action.""" about = Adw.AboutDialog.new_from_appdata( "/page/tesk/Refine/appdata", f"{MAJOR}.{MINOR}.0" ) # Translators: Replace "translator-credits" with your name/username, and optionally an email or URL. about.set_translator_credits(_("translator-credits")) about.set_copyright(_("Copyright © 2024 Hari Rana (TheEvilSkeleton)")) about.add_other_app( "com.usebottles.bottles", _("Bottles"), _("Run Windows software"), ) about.add_other_app( "io.gitlab.theevilskeleton.Upscaler", _("Upscaler"), _("Upscale and enhance images"), ) about.set_developers( ( f"{about.get_developer_name()} https://tesk.page", "Evelyn Serra (itsEve) https://itseve.xyz", "Mitchell Winkelman (Heliguy) https://heliguy.neocities.org", ) ) about.set_artists(("Dominik Baran https://gitlab.gnome.org/toad",)) about.set_debug_info(settings.get_debug_info()) about.present(self.props.active_window) def create_action( self, name: str, callback: Callable[[Any], None], shortcuts: None | list[str] = None, ) -> None: """Add an application action.""" action = Gio.SimpleAction.new(name, None) action.connect("activate", callback) self.add_action(action) if shortcuts: self.set_accels_for_action(f"app.{name}", shortcuts) def main() -> int: """The application's entry point.""" app = Application() return app.run(sys.argv) Refine-0.7.1/refine/meson.build000066400000000000000000000047461514222123300163470ustar00rootroot00000000000000pkgdatadir = get_option('prefix') / get_option('datadir') / meson.project_name() moduledir = pkgdatadir / 'refine' gnome = import('gnome') exec = get_option('exec_name_as_base_id') ? base_id : meson.project_name() blueprints = custom_target('blueprints', input: files( 'widgets/panel-page.blp', 'widgets/panel-row.blp', 'widgets/boolean-switch-row.blp', 'widgets/data-combo-row.blp', 'widgets/font-row.blp', 'widgets/flags-switch-row.blp', 'widgets/value-switch-row.blp', 'widgets/value-combo-row.blp', 'widgets/window-buttons-row.blp', 'sections/sound.blp', 'sections/mouse-touchpad.blp', 'sections/shell-compositor.blp', 'sections/power.blp', 'sections/appearance.blp', 'sections/wellbeing.blp', 'window.blp' ), output: '.', command: [ find_program('blueprint-compiler', version: '>=0.14.0', version_argument: '--version', ), 'batch-compile', '@OUTPUT@', '@CURRENT_SOURCE_DIR@', '@INPUT@' ], ) gnome.compile_resources('refine', 'refine.gresource.xml', gresource_bundle: true, install: true, install_dir: pkgdatadir, dependencies: blueprints ) python = import('python') conf = configuration_data() conf.set('PYTHON', python.find_installation('python3').full_path()) conf.set('VERSION', meson.project_version()) conf.set('localedir', get_option('prefix') / get_option('localedir')) conf.set('pkgdatadir', pkgdatadir) conf.set('app_id', app_id) conf.set('profile', profile) conf.set('major', major) conf.set('micro', micro) conf.set('minor', minor) configure_file( input: 'refine.in', output: exec, configuration: conf, install: true, install_dir: get_option('bindir'), install_mode: 'rwxr-xr-x' ) configure_file( input: '__init__.py.in', output: '__init__.py', configuration: conf, install: true, install_dir: moduledir ) refine_sources = [ 'logger.py', 'main.py', 'window.py', 'typing.py', 'settings.py', ] install_data(refine_sources, install_dir: moduledir) widgets_sources = [ 'widgets/adjustment.py', 'widgets/base.py', 'widgets/panel_row.py', 'widgets/flags_switch_row.py', 'widgets/action_row.py', 'widgets/data_combo_row.py', 'widgets/value_combo_row.py', 'widgets/boolean_switch_row.py', 'widgets/string_row.py', 'widgets/font_row.py', 'widgets/reset_button.py', 'widgets/value_switch_row.py', 'widgets/combo_row.py', 'widgets/window_buttons_row.py', 'widgets/toggle_row.py', ] install_data(widgets_sources, install_dir: moduledir + '/' + 'widgets') Refine-0.7.1/refine/refine.gresource.xml000066400000000000000000000023631514222123300201650ustar00rootroot00000000000000 window.ui sections/appearance.ui sections/mouse-touchpad.ui sections/power.ui sections/shell-compositor.ui sections/sound.ui sections/wellbeing.ui widgets/panel-page.ui widgets/panel-row.ui widgets/flags-switch-row.ui widgets/boolean-switch-row.ui widgets/font-row.ui widgets/value-switch-row.ui widgets/data-combo-row.ui widgets/value-combo-row.ui widgets/window-buttons-row.ui style.css Refine-0.7.1/refine/refine.in000077500000000000000000000057721514222123300160100ustar00rootroot00000000000000#!@PYTHON@ # refine.in # # Copyright 2024 Hari Rana (TheEvilSkeleton) # # 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 . # # SPDX-License-Identifier: GPL-3.0-or-later import gettext import locale import os import signal import subprocess import sys from pathlib import Path VERSION = "@VERSION@" pkgdatadir = "@pkgdatadir@" localedir = "@localedir@" sys.path.insert(1, pkgdatadir) signal.signal(signal.SIGINT, signal.SIG_DFL) locale.bindtextdomain("refine", localedir) locale.textdomain("refine") gettext.install("refine", localedir) # ruff: noqa: E402 from refine.logger import logger if __name__ == "__main__": import gi gi.require_version("Xdp", "1.0") from gi.repository import GLib, Gio, Xdp refine_resource = Gio.Resource.load(str(Path(pkgdatadir, "refine.gresource"))) Gio.resources_register(refine_resource) data_resource = Gio.Resource.load(str(Path(pkgdatadir, "data.gresource"))) Gio.resources_register(data_resource) from refine import main if Xdp.Portal.running_under_flatpak(): logger.debug("Running under Flatpak") output = subprocess.run( ("flatpak-spawn", "--host", "sh", "-c", 'echo "$XDG_DATA_DIRS"'), capture_output=True, text=True, ) host_xdg_data_dirs = { Path(paths) for paths in output.stdout.strip().split(os.pathsep) } home = Path(GLib.get_home_dir()).name xdg_data_dirs = os.environ["XDG_DATA_DIRS"].split(os.pathsep) try: redundant_path = str(Path(os.sep, "usr", "share")) xdg_data_dirs.remove(redundant_path) os.environ["XDG_DATA_DIRS"] = os.pathsep.join(xdg_data_dirs) logger.debug(f"Removed “{redundant_path}” from XDG_DATA_DIRS") except ValueError: pass for directory in host_xdg_data_dirs: host_path = Path(os.sep, "run", "host", directory.relative_to(os.sep)) host_schemas_path = host_path / "glib-2.0" / "schemas" if not host_schemas_path.exists(): logger.debug(f"Ignoring “{str(directory).replace(home, '[REDACTED]')}”") continue xdg_data_dirs = os.environ["XDG_DATA_DIRS"].split(os.pathsep) xdg_data_dirs.insert(0, str(host_path)) os.environ["XDG_DATA_DIRS"] = os.pathsep.join(xdg_data_dirs) logger.debug(f"Added “{host_path}” into XDG_DATA_DIRS") sys.exit(main.main()) Refine-0.7.1/refine/refine.py000077500000000000000000000057721514222123300160320ustar00rootroot00000000000000#!@PYTHON@ # refine.in # # Copyright 2024 Hari Rana (TheEvilSkeleton) # # 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 . # # SPDX-License-Identifier: GPL-3.0-or-later import gettext import locale import os import signal import subprocess import sys from pathlib import Path VERSION = "@VERSION@" pkgdatadir = "@pkgdatadir@" localedir = "@localedir@" sys.path.insert(1, pkgdatadir) signal.signal(signal.SIGINT, signal.SIG_DFL) locale.bindtextdomain("refine", localedir) locale.textdomain("refine") gettext.install("refine", localedir) # ruff: noqa: E402 from refine.logger import logger if __name__ == "__main__": import gi gi.require_version("Xdp", "1.0") from gi.repository import GLib, Gio, Xdp refine_resource = Gio.Resource.load(str(Path(pkgdatadir, "refine.gresource"))) Gio.resources_register(refine_resource) data_resource = Gio.Resource.load(str(Path(pkgdatadir, "data.gresource"))) Gio.resources_register(data_resource) from refine import main if Xdp.Portal.running_under_flatpak(): logger.debug("Running under Flatpak") output = subprocess.run( ("flatpak-spawn", "--host", "sh", "-c", 'echo "$XDG_DATA_DIRS"'), capture_output=True, text=True, ) host_xdg_data_dirs = { Path(paths) for paths in output.stdout.strip().split(os.pathsep) } home = Path(GLib.get_home_dir()).name xdg_data_dirs = os.environ["XDG_DATA_DIRS"].split(os.pathsep) try: redundant_path = str(Path(os.sep, "usr", "share")) xdg_data_dirs.remove(redundant_path) os.environ["XDG_DATA_DIRS"] = os.pathsep.join(xdg_data_dirs) logger.debug(f"Removed “{redundant_path}” from XDG_DATA_DIRS") except ValueError: pass for directory in host_xdg_data_dirs: host_path = Path(os.sep, "run", "host", directory.relative_to(os.sep)) host_schemas_path = host_path / "glib-2.0" / "schemas" if not host_schemas_path.exists(): logger.debug(f"Ignoring “{str(directory).replace(home, '[REDACTED]')}”") continue xdg_data_dirs = os.environ["XDG_DATA_DIRS"].split(os.pathsep) xdg_data_dirs.insert(0, str(host_path)) os.environ["XDG_DATA_DIRS"] = os.pathsep.join(xdg_data_dirs) logger.debug(f"Added “{host_path}” into XDG_DATA_DIRS") sys.exit(main.main()) Refine-0.7.1/refine/sections/000077500000000000000000000000001514222123300160215ustar00rootroot00000000000000Refine-0.7.1/refine/sections/appearance.blp000066400000000000000000000044731514222123300206270ustar00rootroot00000000000000using Gtk 4.0; using Adw 1; $PanelPage page { title: _("Appearance"); icon-name: 'preferences-desktop-appearance-symbolic'; Adw.PreferencesGroup { title: _("Themes"); $DataComboRow { title: _("Cursors"); schema-id: 'org.gnome.desktop.interface'; lookup-directory: 'cursors'; data-subdirectory: 'icons'; key: 'cursor-theme'; } $DataComboRow { title: _("Icons"); schema-id: 'org.gnome.desktop.interface'; data-subdirectory: 'icons'; require-file: 'index.theme'; key: 'icon-theme'; } $DataComboRow { title: _("GTK 3/4 Theme"); subtitle: _("Platform libraries may ignore this option"); schema-id: 'org.gnome.desktop.interface'; aliases: [ "Default", "Adwaita", ]; data-subdirectory: 'themes'; key: 'gtk-theme'; } } Adw.PreferencesGroup { $ValueSwitchRow { title: _("Light Style"); subtitle: _("Use a light appearance for the shell and supported apps"); schema-id: 'org.gnome.desktop.interface'; key: 'color-scheme'; value: 'prefer-light'; } } Adw.PreferencesGroup { title: _("Fonts"); $FontRow { title: _("Interface"); schema-id: 'org.gnome.desktop.interface'; key: 'font-name'; } $FontRow { title: _("Document"); schema-id: 'org.gnome.desktop.interface'; key: 'document-font-name'; } $FontRow { title: _("Monospace"); schema-id: 'org.gnome.desktop.interface'; key: 'monospace-font-name'; } } Adw.PreferencesGroup { title: _("Text Rendering"); $ValueComboRow { title: _("Font Hinting"); subtitle: _("Adjusts text shapes for better clarity, especially at smaller sizes"); title-case: true; schema-id: 'org.gnome.desktop.interface'; key: 'font-hinting'; } $ValueComboRow { title: _("Font Antialiasing"); subtitle: _("Smooths text edges for better clarity by blending colors"); title-case: true; schema-id: 'org.gnome.desktop.interface'; key: 'font-antialiasing'; } } Adw.PreferencesGroup { title: _("Background"); $ValueComboRow { title: _("Adjustment"); title-case: true; schema-id: 'org.gnome.desktop.background'; key: 'picture-options'; } } } Refine-0.7.1/refine/sections/mouse-touchpad.blp000066400000000000000000000023421514222123300214560ustar00rootroot00000000000000using Gtk 4.0; using Adw 1; $PanelPage page { title: _("Mouse & Touchpad"); icon-name: 'input-mouse-symbolic'; Adw.PreferencesGroup { title: _("Mouse"); $BooleanSwitchRow { title: _("Middle Click to Paste Text"); subtitle: _("Paste highlighted text, independent of the clipboard"); schema-id: 'org.gnome.desktop.interface'; key: 'gtk-enable-primary-paste'; } } Adw.PreferencesGroup { title: _("Window Header Bar Actions"); $ValueComboRow { title: _("Double Click"); title-case: true; omit-hyphens: true; omit-words: [ "Toggle", ]; schema-id: 'org.gnome.desktop.wm.preferences'; key: 'action-double-click-titlebar'; } $ValueComboRow { title: _("Middle Click"); title-case: true; omit-hyphens: true; omit-words: [ "Toggle", ]; schema-id: 'org.gnome.desktop.wm.preferences'; key: 'action-middle-click-titlebar'; } $ValueComboRow { title: _("Secondary Click"); title-case: true; omit-hyphens: true; omit-words: [ "Toggle", ]; schema-id: 'org.gnome.desktop.wm.preferences'; key: 'action-right-click-titlebar'; } } } Refine-0.7.1/refine/sections/power.blp000066400000000000000000000004711514222123300176560ustar00rootroot00000000000000using Gtk 4.0; using Adw 1; $PanelPage page { title: _("Power"); icon-name: 'org.gnome.Settings-power-symbolic'; Adw.PreferencesGroup { $BooleanSwitchRow { title: _("Show Power Buttons in Lock Screen"); schema-id: 'org.gnome.desktop.screensaver'; key: 'restart-enabled'; } } } Refine-0.7.1/refine/sections/shell-compositor.blp000066400000000000000000000052471514222123300220330ustar00rootroot00000000000000using Gtk 4.0; using Adw 1; $PanelPage page { title: _("Shell & Compositor"); icon-name: 'overlapping-windows-symbolic'; Adw.PreferencesGroup { $BooleanSwitchRow { title: _("Center New Windows"); schema-id: 'org.gnome.mutter'; key: 'center-new-windows'; } $BooleanSwitchRow { title: _("Attach Modal Windows"); subtitle: _("Attaches modal windows to their parent window to prevent them from moving independently"); schema-id: 'org.gnome.mutter'; key: 'attach-modal-dialogs'; } $BooleanSwitchRow { title: _("Resize With Secondary Clicks"); subtitle: _("Use Secondary Click instead of Middle Click to resize windows while holding the window action key"); schema-id: 'org.gnome.desktop.wm.preferences'; key: 'resize-with-right-button'; } } Adw.PreferencesGroup { $ValueComboRow { title: _("Window Focus Mode"); subtitle: _("Sets the action that will cause a window to take focus"); title-case: true; schema-id: 'org.gnome.desktop.wm.preferences'; key: 'focus-mode'; } $BooleanSwitchRow { title: _("Automatically Raise on Hover"); subtitle: _("Automatically raises the focused window"); schema-id: 'org.gnome.desktop.wm.preferences'; key: 'auto-raise'; } } Adw.PreferencesGroup { title: _("Window Button Layout"); $WindowButtonsRow { title: _("Header Bar"); schema-id: 'org.gnome.desktop.wm.preferences'; key: 'button-layout'; available-buttons: [ "minimize", "maximize", "close", ]; } } Adw.PreferencesGroup { title: _("Experimental Features"); styles [ "warning", ] $FlagsSwitchRow { title: _("Fractional Scaling Options"); subtitle: _("These options will appear in Settings"); schema-id: 'org.gnome.mutter'; key: 'experimental-features'; value: 'scale-monitor-framebuffer'; } $FlagsSwitchRow { title: _("Variable Refresh Rate Options"); subtitle: _("These options will appear in Settings"); schema-id: 'org.gnome.mutter'; key: 'experimental-features'; value: 'variable-refresh-rate'; restart-required: true; } } Adw.PreferencesGroup { styles [ "warning", ] $FlagsSwitchRow { title: _("Autoclose Xwayland"); schema-id: 'org.gnome.mutter'; key: 'experimental-features'; value: 'autoclose-xwayland'; restart-required: true; } $FlagsSwitchRow { title: _("Xwayland Native Scaling"); schema-id: 'org.gnome.mutter'; key: 'experimental-features'; value: 'xwayland-native-scaling'; } } } Refine-0.7.1/refine/sections/sound.blp000066400000000000000000000014501514222123300176500ustar00rootroot00000000000000using Gtk 4.0; using Adw 1; $PanelPage page { title: _("Sound"); icon-name: 'org.gnome.Settings-sound-symbolic'; Adw.PreferencesGroup { Adw.SpinRow { title: _("Volume Step"); sensitive: bind volume_step_adjustment.is-valid-setting; adjustment: $Adjustment volume_step_adjustment { step-increment: 1; page-increment: 5; schema-id: 'org.gnome.settings-daemon.plugins.media-keys'; key: 'volume-step'; reset-button: volume_step_reset_button; revealer: volume_step_revealer; }; Revealer volume_step_revealer { transition-type: crossfade; child: Separator {}; } $ResetButton volume_step_reset_button { valign: center; styles [ "flat", ] } } } } Refine-0.7.1/refine/sections/wellbeing.blp000066400000000000000000000126741514222123300205020ustar00rootroot00000000000000using Gtk 4.0; using Adw 1; $PanelPage page { title: _("Wellbeing"); icon-name: 'org.gnome.Settings-wellbeing-symbolic'; Adw.PreferencesGroup { title: _("Eyesight Reminders"); $BooleanSwitchRow { title: _("Show Countdown When Break Is Due"); schema-id: 'org.gnome.desktop.break-reminders.eyesight'; key: 'countdown'; } $BooleanSwitchRow { title: _("Lock Screen During Break"); schema-id: 'org.gnome.desktop.break-reminders.eyesight'; key: 'lock-screen'; } Adw.SpinRow { title: _("Delay (Seconds)"); subtitle: _("Amount to delay break if requested"); sensitive: bind eyesight_delay_seconds_adjustment.is-valid-setting; adjustment: $Adjustment eyesight_delay_seconds_adjustment { step-increment: 10; page-increment: 100; schema-id: 'org.gnome.desktop.break-reminders.eyesight'; key: 'delay-seconds'; reset-button: eyesight_delay_seconds_reset_button; revealer: eyesight_delay_seconds_revealer; }; Revealer eyesight_delay_seconds_revealer { transition-type: crossfade; child: Separator {}; } $ResetButton eyesight_delay_seconds_reset_button { valign: center; styles [ "flat", ] } } Adw.SpinRow { title: _("Break Duration (Seconds)"); sensitive: bind eyesight_duration_seconds_adjustment.is-valid-setting; adjustment: $Adjustment eyesight_duration_seconds_adjustment { step-increment: 10; page-increment: 100; schema-id: 'org.gnome.desktop.break-reminders.eyesight'; key: 'duration-seconds'; reset-button: eyesight_duration_seconds_reset_button; revealer: eyesight_duration_seconds_revealer; }; Revealer eyesight_duration_seconds_revealer { transition-type: crossfade; child: Separator {}; } $ResetButton eyesight_duration_seconds_reset_button { valign: center; styles [ "flat", ] } } Adw.SpinRow { title: _("Time Between Breaks (Seconds)"); sensitive: bind eyesight_interval_seconds_adjustment.is-valid-setting; adjustment: $Adjustment eyesight_interval_seconds_adjustment { step-increment: 10; page-increment: 100; schema-id: 'org.gnome.desktop.break-reminders.eyesight'; key: 'interval-seconds'; reset-button: eyesight_interval_seconds_reset_button; revealer: eyesight_interval_seconds_revealer; }; Revealer eyesight_interval_seconds_revealer { transition-type: crossfade; child: Separator {}; } $ResetButton eyesight_interval_seconds_reset_button { valign: center; styles [ "flat", ] } } } Adw.PreferencesGroup { title: _("Movement Reminders"); $BooleanSwitchRow { title: _("Show Countdown When Break Is Due"); schema-id: 'org.gnome.desktop.break-reminders.movement'; key: 'countdown'; } $BooleanSwitchRow { title: _("Lock Screen During Break"); schema-id: 'org.gnome.desktop.break-reminders.movement'; key: 'lock-screen'; } Adw.SpinRow { title: _("Delay (Seconds)"); subtitle: _("Amount to delay break if requested"); sensitive: bind movement_delay_seconds_adjustment.is-valid-setting; adjustment: $Adjustment movement_delay_seconds_adjustment { step-increment: 10; page-increment: 100; schema-id: 'org.gnome.desktop.break-reminders.movement'; key: 'delay-seconds'; reset-button: movement_delay_seconds_reset_button; revealer: movement_delay_seconds_revealer; }; Revealer movement_delay_seconds_revealer { transition-type: crossfade; child: Separator {}; } $ResetButton movement_delay_seconds_reset_button { valign: center; styles [ "flat", ] } } Adw.SpinRow { title: _("Break Duration (Seconds)"); sensitive: bind movement_duration_seconds_adjustment.is-valid-setting; adjustment: $Adjustment movement_duration_seconds_adjustment { step-increment: 10; page-increment: 100; schema-id: 'org.gnome.desktop.break-reminders.movement'; key: 'duration-seconds'; reset-button: movement_duration_seconds_reset_button; revealer: movement_duration_seconds_revealer; }; Revealer movement_duration_seconds_revealer { transition-type: crossfade; child: Separator {}; } $ResetButton movement_duration_seconds_reset_button { valign: center; styles [ "flat", ] } } Adw.SpinRow { title: _("Time Between Breaks (Seconds)"); sensitive: bind movement_interval_seconds_adjustment.is-valid-setting; adjustment: $Adjustment movement_interval_seconds_adjustment { step-increment: 10; page-increment: 100; schema-id: 'org.gnome.desktop.break-reminders.movement'; key: 'interval-seconds'; reset-button: movement_interval_seconds_reset_button; revealer: movement_interval_seconds_revealer; }; Revealer movement_interval_seconds_revealer { transition-type: crossfade; child: Separator {}; } $ResetButton movement_interval_seconds_reset_button { valign: center; styles [ "flat", ] } } } } Refine-0.7.1/refine/settings.py000066400000000000000000000051311514222123300164040ustar00rootroot00000000000000# settings.py # # Copyright 2024 Hari Rana (TheEvilSkeleton) # # 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 . # # SPDX-License-Identifier: GPL-3.0-or-later import os from pathlib import Path from gi.repository import GLib, Gio, Xdp def get_user_config_dir() -> str: """Retrieve the user's config directory.""" if not Xdp.Portal.running_under_sandbox(): return GLib.get_user_config_dir() return os.environ.get( "HOST_XDG_CONFIG_HOME", str(Path(GLib.get_home_dir(), "." + "config")) ) def get_user_data_dir() -> str: """Retrieve the user's data directory.""" if not Xdp.Portal.running_under_sandbox(): return GLib.get_user_data_dir() return os.environ.get( "HOST_XDG_DATA_HOME", str(Path(GLib.get_home_dir(), "." + "local", "share")), ) def get_system_data_dirs() -> list[str]: """Retrieve the system's data directory.""" data_dirs = GLib.get_system_data_dirs() if Xdp.Portal.running_under_flatpak(): data_dirs.remove(str(Path(os.sep, "app", "share"))) return data_dirs def get_debug_info() -> str: """Retrieve important information for debugging.""" environment_variables = ( "XDG_DATA_DIRS", "XDG_CONFIG_HOME", "XDG_DATA_HOME", "HOST_XDG_CONFIG_HOME", "HOST_XDG_DATA_HOME", ) home = Path(GLib.get_home_dir()).name output = "" for environment_variable in environment_variables: original = f"{environment_variable}: “{GLib.getenv(environment_variable)}”\n" output += original.replace(home, "[REDACTED]") return str(output) def create_schema_sources_list() -> list[Gio.SettingsSchemaSource]: """Create a list schema sources based on the user's system data directory.""" sources = [] for data_dir in GLib.get_system_data_dirs(): path = Path(data_dir, "glib-2.0", "schemas") if path.is_dir(): source = Gio.SettingsSchemaSource.new_from_directory(str(path), None, True) sources.append(source) return sources Refine-0.7.1/refine/style.css000066400000000000000000000004261514222123300160460ustar00rootroot00000000000000row separator { --_separator-margin: 9px; margin-top: var(--_separator-margin); margin-bottom: var(--_separator-margin); } windowbuttonbox { border-radius: 8px; padding: 2px; margin: -2px; } button.window-menu-button { border-radius: 50%; background: none; } Refine-0.7.1/refine/typing.py000066400000000000000000000021441514222123300160570ustar00rootroot00000000000000# typing.py # # Copyright 2025 Hari Rana (TheEvilSkeleton) # # 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 . # # SPDX-License-Identifier: GPL-3.0-or-later from enum import IntEnum, auto from typing import TypedDict from gi.repository import Gio class SettingsSource(TypedDict): """Dictionary for storing important `Gio.Settings`-related data.""" settings: Gio.Settings | None schema: Gio.SettingsSchema | None class LogicalDirectionType(IntEnum): """Logical direction types.""" START = auto() END = auto() Refine-0.7.1/refine/widgets/000077500000000000000000000000001514222123300156405ustar00rootroot00000000000000Refine-0.7.1/refine/widgets/action_row.py000066400000000000000000000035071514222123300203630ustar00rootroot00000000000000# action_row.py # # Copyright 2024 Hari Rana (TheEvilSkeleton) # # 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 . # # SPDX-License-Identifier: GPL-3.0-or-later from typing import Any, cast from gi.repository import Adw, GObject, Gio, Gtk from refine.logger import logger from refine.widgets.base import BaseInterface class ActionRow(Adw.ActionRow, BaseInterface): """ Base action row widget implementing the `schema-id` and `key` properties. It is assumed to derive from it, rather than using it directly. """ __gtype_name__ = "ActionRow" schema = cast("Gio.SettingsSchema", GObject.Property(type=Gio.SettingsSchema)) schema_id = cast("str", GObject.Property(type=str)) key = cast("str", GObject.Property(type=str)) is_valid_setting = cast("bool", GObject.Property(type=bool, default=False)) restart_required = GObject.Property(type=bool, default=False) def value_set(self, value: Any) -> None: """Log key-value pair.""" logger.debug(f"Set key “{self.key}” to “{value}”") if not self.restart_required: return toplevels = Gtk.Window.get_toplevels() if not (window := toplevels.get_item(0)): return window.emit("restart-items-changed", self) Refine-0.7.1/refine/widgets/adjustment.py000066400000000000000000000067751514222123300204070ustar00rootroot00000000000000# adjustment.py # # Copyright 2024 Hari Rana (TheEvilSkeleton) # # 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 . # # SPDX-License-Identifier: GPL-3.0-or-later from typing import Any, cast from gi.repository import GLib, GObject, Gio, Gtk from refine.logger import logger from refine.widgets.base import BaseInterface from refine.widgets.reset_button import ResetButton class Adjustment(Gtk.Adjustment, BaseInterface): """ Derivative of `Gtk.Adjustment` implementing the properties needed to work with `Gio.Settings`. This widget is meant to be used in conjunction with widgets relying on `Gtk.Adjustment`. """ __gtype_name__ = "Adjustment" settings = cast("Gio.Settings", GObject.Property(type=Gio.Settings)) schema_id = cast("str", GObject.Property(type=str)) schema = cast("Gio.SettingsSchema", GObject.Property(type=Gio.SettingsSchema)) key = cast("str", GObject.Property(type=str)) is_valid_setting = cast("bool", GObject.Property(type=bool, default=False)) revealer = GObject.Property(type=Gtk.Revealer) reset_button = GObject.Property(type=ResetButton) sensitive = GObject.Property(type=bool, default=True) restart_required = GObject.Property(type=bool, default=False) def __init__(self, **kwargs: Any) -> None: super().__init__(**kwargs) BaseInterface.__init__(self, **kwargs) def _reset_button_clicked(self, *_args: Any) -> None: logger.debug("Revert button pressed") self.settings.reset(self.key) self.set_value(self.settings.get_value(self.key).unpack()) self.do_update() def _value_changed(self, _adjustment: Gtk.Adjustment, *_args: Any) -> None: value_type = self.schema.get_key(self.key).get_value_type() format_string = value_type.dup_string() variant = GLib.Variant(format_string, self.get_value()) self.settings.set_value(self.key, variant) self.value_set(int(self.get_value())) self.do_update() def do_setup(self) -> None: type Range = tuple[Any, tuple[int, int]] schema_key = self.schema.get_key(self.key) variant = cast("Range", schema_key.get_range()) range = variant[1] self.set_lower(range[0]) self.set_upper(range[1]) self.set_value(self.settings.get_value(self.key).unpack()) self.do_update() self.reset_button.connect("clicked", self._reset_button_clicked) self.connect("value-changed", self._value_changed) BaseInterface.set_up_separator_revealer(self.revealer, self.reset_button) def do_update(self) -> None: default_value = cast("GLib.Variant", self.settings.get_default_value(self.key)) default_int = default_value.unpack() value = int(self.get_value()) self.reset_button.set_sensitive(value != default_int) def value_set(self, value: Any) -> None: """Log key-value pair.""" logger.debug(f"Set key “{self.key}” to “{value}”") Refine-0.7.1/refine/widgets/base.py000066400000000000000000000107261514222123300171320ustar00rootroot00000000000000# base.py # # Copyright 2025 Hari Rana # # 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 . # # SPDX-License-Identifier: GPL-3.0-or-later from abc import abstractmethod from typing import Any from gi.repository import GLib, GObject, Gio, Gtk from refine.logger import logger class InvalidSettingError(TypeError): ... class BaseInterface(GObject.Object): __gtype_name__ = "BaseInterface" key: str schema_id: str schema: Gio.SettingsSchema settings: Gio.Settings is_valid_setting: bool def __init__(self, **kwargs: Any) -> None: super().__init__(**kwargs) GLib.idle_add(self._post_init) @staticmethod def set_up_separator_revealer(revealer: Gtk.Revealer, widget: Gtk.Widget) -> None: """Initialize and set up the `Gtk.Revealer`.""" def state_flags_changed( widget: Gtk.Widget, _flags: Gtk.StateFlags, revealer: Gtk.Revealer ) -> None: flags = widget.get_state_flags() is_prelight = flags & (Gtk.StateFlags.PRELIGHT) is_activated = flags & (Gtk.StateFlags.SELECTED | Gtk.StateFlags.CHECKED) is_focused = flags & Gtk.StateFlags.FOCUSED & Gtk.StateFlags.FOCUS_VISIBLE revealer.set_reveal_child(not (is_prelight or is_activated or is_focused)) revealer.set_reveal_child(True) widget.connect("state-flags-changed", state_flags_changed, revealer) widget.bind_property( "visible", revealer, "visible", GObject.BindingFlags.SYNC_CREATE ) widget.bind_property( "opacity", revealer, "opacity", GObject.BindingFlags.SYNC_CREATE ) @abstractmethod def do_check_value(self) -> None: """Check if value exists.""" @abstractmethod def do_update(self) -> None: """Update the widget according to the setting.""" @abstractmethod def do_setup(self) -> None: """ Set up the object. This is mainly useful to, for example, connect signals, bind properties, and other necessary steps when the key is valid. """ def _do_check_key(self) -> None: if not self.schema.has_key(self.key): logger.warning(f"Key “{self.key}” does not exist. Skipping…") raise InvalidSettingError def _do_find_schema_id(self) -> None: toplevels = Gtk.Window.get_toplevels() window = toplevels.get_item(0) application = window.get_application() # type: ignore[union-attr] if settings := application.settings.get(self.schema_id): self.settings = settings["settings"] self.schema = settings["schema"] return try: for source in application.sources: self.schema = source.lookup(self.schema_id, True) if self.schema: break if not self.schema: raise InvalidSettingError except (AttributeError, TypeError) as error: application.settings[self.schema_id] = {"settings": None, "schema": None} logger.warning(f"Schema ID “{self.schema_id}” does not exist. Skipping…") raise InvalidSettingError(error) from error self.settings = Gio.Settings.new(self.schema_id) application.settings[self.schema_id] = { "settings": self.settings, "schema": self.schema, } def _post_init(self) -> bool: try: self._do_find_schema_id() self._do_check_key() self.do_check_value() self.do_update() self.do_setup() self.is_valid_setting = True except InvalidSettingError: pass finally: self.bind_property( "is-valid-setting", self, "sensitive", GObject.BindingFlags.SYNC_CREATE, ) return False Refine-0.7.1/refine/widgets/boolean-switch-row.blp000066400000000000000000000007061514222123300220650ustar00rootroot00000000000000using Gtk 4.0; template $BooleanSwitchRow: $ToggleRow { activatable-widget: switch; active: bind switch.active bidirectional; [suffix] $ResetButton revert_button { valign: center; styles [ "flat", ] } [suffix] Revealer revealer { transition-type: crossfade; child: Box { Separator { margin-end: 6; } }; } [suffix] Switch switch { can-focus: false; valign: center; } } Refine-0.7.1/refine/widgets/boolean_switch_row.py000066400000000000000000000041141514222123300221010ustar00rootroot00000000000000# boolean_switch_row.py # # Copyright 2024 Hari Rana (TheEvilSkeleton) # # 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 . # # SPDX-License-Identifier: GPL-3.0-or-later from typing import Any from gi.repository import Gio, Gtk from refine.logger import logger from refine.widgets.base import BaseInterface from refine.widgets.toggle_row import ToggleRow @Gtk.Template.from_resource("/page/tesk/Refine/widgets/boolean-switch-row.ui") class BooleanSwitchRow(ToggleRow): """A `ToggleRow` with on/off switches.""" __gtype_name__ = "BooleanSwitchRow" revert_button = Gtk.Template.Child() revealer = Gtk.Template.Child() def do_setup(self) -> None: super().do_setup() self.settings.bind(self.key, self, "active", Gio.SettingsBindFlags.DEFAULT) self.connect("notify::active", self._active_set_callback) self.revert_button.connect("clicked", self._revert_button_clicked) BaseInterface.set_up_separator_revealer(self.revealer, self.revert_button) def do_update(self) -> None: super().do_update() self.is_default = self.settings.get_default_value( self.key ) != self.settings.get_value(self.key) self.revert_button.set_sensitive(self.is_default) def _active_set_callback(self, *_args: Any) -> None: self.do_update() self.value_set(self.settings.get_value(self.key)) def _revert_button_clicked(self, *_args: Any) -> None: logger.debug("Revert button pressed") self.settings.reset(self.key) Refine-0.7.1/refine/widgets/combo_row.py000066400000000000000000000110361514222123300202010ustar00rootroot00000000000000# combo_row.py # # Copyright 2025 Mitchell Winkelman (Heliguy) # # 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 . # # SPDX-License-Identifier: GPL-3.0-or-later from typing import TYPE_CHECKING, Any, cast from gi.repository import Adw, GObject, Gio, Gtk from refine.logger import logger from refine.widgets.base import BaseInterface if TYPE_CHECKING: from gi.repository import GLib class ComboRow(Adw.ComboRow, BaseInterface): """ Base combo row widget implementing the `schema-id` and `key` properties. It is assumed to derive from it, rather than using it directly. """ __gtype_name__ = "ComboRow" is_valid_setting = cast("bool", GObject.Property(type=bool, default=False)) settings = cast("Gio.Settings", GObject.Property(type=Gio.Settings)) schema = cast("Gio.SettingsSchema", GObject.Property(type=Gio.SettingsSchema)) schema_id = cast("str", GObject.Property(type=str)) key = cast("str", GObject.Property(type=str)) restart_required = GObject.Property(type=bool, default=False) is_default = GObject.Property(type=bool, default=True) original_list: list[str] transformed_list: list[str] revert_button: Gtk.Button revealer: Gtk.Revealer def _settings_changed(self, *_args: Any) -> None: row_string = self.original_list[self.get_selected()] settings_string = self.settings.get_string(self.key) if row_string != settings_string: self.emit("inconsistent") def _inconsistent_set(self, *_args: Any) -> None: self.handler_block_by_func(self.selected_callback) # type: ignore [no-untyped-call] string = self.settings.get_string(self.key) self.set_selected(self.original_list.index(string)) self.set_is_default(self.key) self.handler_unblock_by_func(self.selected_callback) # type: ignore [no-untyped-call] def _reset_button_clicked(self, *_args: Any) -> None: logger.debug("Revert button pressed") string_object = cast( "Gtk.StringObject", self.settings.get_default_value(self.key) ) if not string_object: return string = string_object.get_string() self.settings.reset(self.key) self.set_selected(self.original_list.index(string)) self.set_is_default(self.key) def set_is_default(self, key: str) -> None: """Update the `ComboRow.is-default` property.""" default_value = cast("GLib.Variant", self.settings.get_default_value(key)) default_string = default_value.get_string() row_string = self.original_list[self.get_selected()] self.is_default = row_string == default_string def selected_callback(self, *_args: Any) -> None: """Callback method for selecting an item.""" row_string = self.original_list[self.get_selected()] self.set_is_default(self.key) self.settings.set_string(self.key, row_string) self.value_set(row_string) def value_set(self, value: Any) -> None: """Log key-value pair.""" logger.debug(f"Set key “{self.key}” to “{value}”") if not self.restart_required: return toplevels = Gtk.Window.get_toplevels() if not (window := toplevels.get_item(0)): return window.emit("restart-items-changed", self) def do_setup(self) -> None: self.revert_button.connect("clicked", self._reset_button_clicked) self.bind_property( "is-default", self.revert_button, "sensitive", GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.INVERT_BOOLEAN, ) BaseInterface.set_up_separator_revealer(self.revealer, self.revert_button) self.connect("inconsistent", self._inconsistent_set) self.settings.connect("changed", self._settings_changed) @GObject.Signal def inconsistent(self) -> None: """Log inconsistency signal.""" logger.info(f"{self.__class__.__name__}::inconsistent signal emitted") Refine-0.7.1/refine/widgets/data-combo-row.blp000066400000000000000000000004541514222123300211550ustar00rootroot00000000000000using Gtk 4.0; template $DataComboRow: $ComboRow { [suffix] Revealer revealer { transition-type: crossfade; child: Box { Separator { margin-start: 6; } }; } [suffix] $ResetButton revert_button { valign: center; styles [ "flat", ] } } Refine-0.7.1/refine/widgets/data_combo_row.py000066400000000000000000000067311514222123300212000ustar00rootroot00000000000000# data_combo_row.py # # Copyright 2024 Hari Rana (TheEvilSkeleton) # # 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 . # # SPDX-License-Identifier: GPL-3.0-or-later from pathlib import Path from gi.repository import GObject, Gtk from refine import settings from refine.widgets.base import InvalidSettingError from refine.widgets.combo_row import ComboRow @Gtk.Template.from_resource("/page/tesk/Refine/widgets/data-combo-row.ui") class DataComboRow(ComboRow): """An `Adw.ComboRow` implementing the properties needed to work with `Gio.Settings`.""" __gtype_name__ = "DataComboRow" revert_button = Gtk.Template.Child() revealer = Gtk.Template.Child() require_file = GObject.Property(type=str, default="") lookup_directory = GObject.Property(type=str, default="") data_subdirectory = GObject.Property(type=str, default="") aliases_dict: dict[str, str] = {} def do_setup(self) -> None: if not (string := self.settings.get_string(self.key)): raise InvalidSettingError system_data_dirs_list: list[Path] = [] for directory in settings.get_system_data_dirs(): found_directories = Path(directory, self.data_subdirectory).glob("*") system_data_dirs_list += found_directories data_dirs_list = system_data_dirs_list data_dirs_list += Path( settings.get_user_data_dir(), self.data_subdirectory ).glob("*") data_dirs_list = [ path for path in data_dirs_list if Path(path, self.lookup_directory).is_dir() ] data_dirs_list = [ path for path in data_dirs_list if Path(path, self.lookup_directory, self.require_file).exists() ] data_dirs_list = [path.name for path in data_dirs_list if path.is_dir()] if self.aliases_dict: data_dirs_list = [ self.aliases_dict.get(str(path), path) for path in data_dirs_list ] self.original_list = self.transformed_list = sorted( {str(path) for path in data_dirs_list}, key=str.lower ) data_dirs_model = Gtk.StringList.new(self.transformed_list) self.set_model(data_dirs_model) self.set_selected(self.original_list.index(string)) self.set_is_default(self.key) self.connect("notify::selected", self.selected_callback) super().do_setup() @GObject.Property(type=str) def aliases(self) -> dict[str, str]: """Get a dictionary of aliases or set a newline-separated string that gets converted to a dictionary.""" return self.aliases_dict @aliases.setter # type: ignore [no-redef] def aliases(self, aliases: str) -> None: aliases_list = aliases.split() # Credit: https://stackoverflow.com/a/12739974 self.aliases_dict = dict( zip(aliases_list[::2], aliases_list[1::2], strict=False) ) Refine-0.7.1/refine/widgets/flags-switch-row.blp000066400000000000000000000003171514222123300215400ustar00rootroot00000000000000using Gtk 4.0; template $FlagsSwitchRow: $StringRow { activatable-widget: switch; active: bind switch.active bidirectional; [suffix] Switch switch { can-focus: false; valign: center; } } Refine-0.7.1/refine/widgets/flags_switch_row.py000066400000000000000000000041301514222123300215540ustar00rootroot00000000000000# flags_switch_row.py # # Copyright 2024 Hari Rana (TheEvilSkeleton) # # 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 . # # SPDX-License-Identifier: GPL-3.0-or-later import contextlib from typing import Any, cast from gi.repository import Gtk from refine.widgets.base import InvalidSettingError from refine.widgets.string_row import StringRow @Gtk.Template.from_resource("/page/tesk/Refine/widgets/flags-switch-row.ui") class FlagsSwitchRow(StringRow): """A `ActionRow` to enable or disable a feature from a string list.""" __gtype_name__ = "FlagsSwitchRow" def get_string(self) -> list[str]: """Retrieve list from key.""" return self.settings.get_strv(self.key) def active_set(self, *_args: Any) -> None: """Set whether @self is in its “on” or “off” position.""" flags = self.get_string() value = cast("str", self.value) if self.active: flags.append(value) else: with contextlib.suppress(ValueError): flags.remove(value) flags = list(set(flags)) self.settings.set_strv(self.key, flags) self.value_set(flags) self.do_update() def do_update(self) -> None: super().do_update() schema_key = self.schema.get_key(self.key) try: key_range = schema_key.get_range()[1] if self.value not in key_range: raise InvalidSettingError except (IndexError, TypeError) as error: raise InvalidSettingError from error Refine-0.7.1/refine/widgets/font-row.blp000066400000000000000000000007001514222123300201070ustar00rootroot00000000000000using Gtk 4.0; template $FontRow: $ActionRow { activatable: true; title-lines: 1; subtitle-lines: 1; styles [ "property", ] [suffix] $ResetButton revert_button { valign: center; styles [ "flat", ] } [suffix] Revealer revealer { transition-type: crossfade; child: Box { Separator { margin-end: 6; } }; } [suffix] Image { icon-name: 'go-next-symbolic'; } } Refine-0.7.1/refine/widgets/font_row.py000066400000000000000000000065601514222123300200560ustar00rootroot00000000000000# font_row.py # # Copyright 2024 Hari Rana (TheEvilSkeleton) # # 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 . # # SPDX-License-Identifier: GPL-3.0-or-later from typing import TYPE_CHECKING, Any, cast from gi.repository import GLib, GObject, Gio, Gtk, Pango from refine.logger import logger from refine.widgets.action_row import ActionRow from refine.widgets.base import BaseInterface if TYPE_CHECKING: from gi.repository import Adw @Gtk.Template.from_resource("/page/tesk/Refine/widgets/font-row.ui") class FontRow(ActionRow): """ An `ActionRow` for displaying and interacting with font. It is also used for launching the `Gtk.FontDialog`. """ __gtype_name__ = "FontRow" revert_button = Gtk.Template.Child() revealer = Gtk.Template.Child() is_default = GObject.Property(type=bool, default=True) def _row_activated(self, *_args: Any) -> None: def choose_font_and_features_callback( _dialog: Gtk.FontDialog, result: Gio.AsyncResult ) -> None: try: font = font_dialog.choose_font_and_features_finish(result) font_string = font[1].to_string() except (IndexError, GLib.Error): return self.settings.set_string(self.key, font_string) self.value_set(self.settings.get_string(self.key)) self.do_update() font_string = self.settings.get_string(self.key) font_description = Pango.FontDescription.from_string(font_string) font_dialog = Gtk.FontDialog() if window := cast("Adw.Window | None", self.get_root()): font_dialog.choose_font_and_features( window, font_description, callback=choose_font_and_features_callback ) def _revert_button_clicked(self, *_args: Any) -> None: logger.debug("Revert button pressed") self.settings.reset(self.key) self.do_update() def do_update(self) -> None: font_string = self.settings.get_string(self.key) default_value = cast("GLib.Variant", self.settings.get_default_value(self.key)) default_font_string = default_value.get_string() self.is_default = default_font_string != font_string font_description = Pango.FontDescription.from_string(font_string) font_family = font_description.get_family() self.set_subtitle(f"{font_string}") def do_setup(self) -> None: self.connect("activated", self._row_activated) self.bind_property( "is-default", self.revert_button, "visible", GObject.BindingFlags.SYNC_CREATE, ) self.revert_button.connect("clicked", self._revert_button_clicked) BaseInterface.set_up_separator_revealer(self.revealer, self.revert_button) Refine-0.7.1/refine/widgets/panel-page.blp000066400000000000000000000003071514222123300203500ustar00rootroot00000000000000using Gtk 4.0; using Adw 1; template $PanelPage: Adw.PreferencesPage { banner: Adw.Banner { title: _("Options will be changed after next login"); // button-label: _('Log _Out…'); }; } Refine-0.7.1/refine/widgets/panel-row.blp000066400000000000000000000005101514222123300202370ustar00rootroot00000000000000using Gtk 4.0; using Adw 1; template $PanelRow: Adw.PreferencesRow { child: Box { spacing: 12; margin-start: 6; margin-end: 6; margin-top: 12; margin-bottom: 12; Image thumbnail_image { icon-name: bind template.icon-name; } Label label { label: bind template.title; } }; } Refine-0.7.1/refine/widgets/panel_row.py000066400000000000000000000030711514222123300202010ustar00rootroot00000000000000# panel_row.py # # Copyright 2024 Hari Rana (TheEvilSkeleton) # # 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 . # # SPDX-License-Identifier: GPL-3.0-or-later from gi.repository import Adw, GObject, Gtk @Gtk.Template.from_resource("/page/tesk/Refine/widgets/panel-row.ui") class PanelRow(Adw.PreferencesRow): """An `Adw.PreferencesRow` for displaying information of a page.""" __gtype_name__ = "PanelRow" @GObject.Property(type=Adw.PreferencesPage) def page(self) -> Adw.PreferencesPage: """Get or set the `Adw.PreferencesPage` of the row.""" return self._page @page.setter # type: ignore [no-redef] def page(self, page: Adw.PreferencesPage) -> None: self._page = page @GObject.Property(type=str, default="") def icon_name(self) -> str: """Get or set the icon name.""" return self._icon_name @icon_name.setter # type: ignore [no-redef] def icon_name(self, icon_name: str) -> None: self._icon_name = icon_name Refine-0.7.1/refine/widgets/reset_button.py000066400000000000000000000021511514222123300207260ustar00rootroot00000000000000# reset_button.py # # Copyright 2024 Hari Rana (TheEvilSkeleton) # # 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 . # # SPDX-License-Identifier: GPL-3.0-or-later from gettext import gettext as _ from typing import Any from gi.repository import Gtk class ResetButton(Gtk.Button): """A `Gtk.Button` for resetting a setting.""" __gtype_name__ = "ResetButton" def __init__(self, **kwargs: Any) -> None: super().__init__(**kwargs) self.set_tooltip_text(_("Reset")) self.set_icon_name("edit-undo-symbolic") Refine-0.7.1/refine/widgets/string_row.py000066400000000000000000000045711514222123300204160ustar00rootroot00000000000000# string_row.py # # Copyright 2024 Hari Rana (TheEvilSkeleton) # # 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 . # # SPDX-License-Identifier: GPL-3.0-or-later from typing import Any, cast from gi.repository import GObject from refine.logger import logger from refine.widgets.toggle_row import ToggleRow class StringRow(ToggleRow): """A `ToggleRow` adding the base properties and functionality to manipulate strings and string lists.""" __gtype_name__ = "StringRow" value = GObject.Property(type=str) def _settings_changed(self, *_args: Any) -> None: flag = self.get_string() is_setting_active = cast("str", self.value) in flag if self.active != is_setting_active: self.emit("inconsistent") def _inconsistent_set(self, *_args: Any) -> None: self.handler_block_by_func(self.active_set) # type: ignore [no-untyped-call] flag = self.get_string() self.active = cast("str", self.value) in flag self.value_set(flag) self.handler_unblock_by_func(self.active_set) # type: ignore [no-untyped-call] def get_string(self) -> str | list[str]: """String or list getter virtual method.""" raise NotImplementedError def active_set(self, *_args: Any) -> None: """Active setter virtual method.""" raise NotImplementedError def do_setup(self) -> None: super().do_setup() self.active = cast("str", self.value) in self.get_string() self.connect("notify::active", self.active_set) self.connect("inconsistent", self._inconsistent_set) self.settings.connect("changed", self._settings_changed) @GObject.Signal def inconsistent(self) -> None: """Log inconsistency signal.""" logger.info(f"{self.__class__.__name__}::inconsistent signal emitted") Refine-0.7.1/refine/widgets/toggle_row.py000066400000000000000000000026661514222123300203740ustar00rootroot00000000000000# toggle_row.py # # Copyright 2025 Hari Rana / TheEvilSkeleton # # 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 . # # SPDX-License-Identifier: GPL-3.0-or-later from gi.repository import GObject, Gtk from refine.widgets.action_row import ActionRow class ToggleRow(ActionRow): __gtype_name__ = "ToggleRow" active = GObject.Property(type=bool, default=False) is_default = GObject.Property(type=bool, default=True) def _update_accessible_state(self) -> None: self.update_state( *zip( # type: ignore [arg-type] (Gtk.AccessibleState.CHECKED, int(self.active)), ) ) def do_setup(self) -> None: self.props.accessible_role = Gtk.AccessibleRole.SWITCH self._update_accessible_state() def do_update(self) -> None: self._update_accessible_state() Refine-0.7.1/refine/widgets/value-combo-row.blp000066400000000000000000000004551514222123300213610ustar00rootroot00000000000000using Gtk 4.0; template $ValueComboRow: $ComboRow { [suffix] Revealer revealer { transition-type: crossfade; child: Box { Separator { margin-start: 6; } }; } [suffix] $ResetButton revert_button { valign: center; styles [ "flat", ] } } Refine-0.7.1/refine/widgets/value-switch-row.blp000066400000000000000000000003171514222123300215600ustar00rootroot00000000000000using Gtk 4.0; template $ValueSwitchRow: $StringRow { activatable-widget: switch; active: bind switch.active bidirectional; [suffix] Switch switch { can-focus: false; valign: center; } } Refine-0.7.1/refine/widgets/value_combo_row.py000066400000000000000000000056321514222123300214020ustar00rootroot00000000000000# value_combo_row.py # # Copyright 2025 Mitchell Winkelman (Heliguy) # # 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 . # # SPDX-License-Identifier: GPL-3.0-or-later from gi.repository import GObject, Gtk from refine.widgets.base import InvalidSettingError from refine.widgets.combo_row import ComboRow MINIMUM_CHILDREN = 2 @Gtk.Template.from_resource("/page/tesk/Refine/widgets/value-combo-row.ui") class ValueComboRow(ComboRow): """An `Adw.ComboRow` implementing the properties needed to work with enumerated properties in `Gio.Settings`.""" __gtype_name__ = "ValueComboRow" revert_button = Gtk.Template.Child() revealer = Gtk.Template.Child() title_case = GObject.Property(type=bool, default=False) omit_hyphens = GObject.Property(type=bool, default=False) omit_words = GObject.Property(type=str) def do_setup(self) -> None: enum_tuple: tuple[str, list[str]] = ( self.schema.get_key(self.key).get_range().unpack() ) if len(enum_tuple) < MINIMUM_CHILDREN or enum_tuple[0] != "enum": raise InvalidSettingError self.original_list = enum_tuple[1] self.transformed_list = self.original_list if self.omit_words: for word in self.omit_words.split(): self.transformed_list = [ string.replace(word.lower(), "") for string in self.transformed_list ] if self.omit_hyphens: self.transformed_list = [ string.replace("-", " ") for string in self.transformed_list ] if self.title_case: self.transformed_list = [string.title() for string in self.transformed_list] self.transformed_list = [string.strip() for string in self.transformed_list] combined_lists = sorted( zip(self.transformed_list, self.original_list, strict=False) ) self.transformed_list = [string[0] for string in combined_lists] self.original_list = [string[1] for string in combined_lists] model = Gtk.StringList.new(self.transformed_list) string: str = self.settings.get_string(self.key) self.set_model(model) self.set_selected(self.original_list.index(string)) self.set_is_default(self.key) self.connect("notify::selected", self.selected_callback) super().do_setup() Refine-0.7.1/refine/widgets/value_switch_row.py000066400000000000000000000030121514222123300215720ustar00rootroot00000000000000# value_switch_row.py # # Copyright 2024 Evelyn Serra (itsEve) # # 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 . # # SPDX-License-Identifier: GPL-3.0-or-later from typing import Any from gi.repository import Gtk from refine.widgets.string_row import StringRow @Gtk.Template.from_resource("/page/tesk/Refine/widgets/value-switch-row.ui") class ValueSwitchRow(StringRow): """A `StringRow` to enable or disable a feature from a combo action.""" __gtype_name__ = "ValueSwitchRow" def get_string(self) -> str: """Retrieve string from key.""" return self.settings.get_string(self.key) def active_set(self, *_args: Any) -> None: """Set whether @self is in its “on” or “off” position.""" self.do_update() if self.active: self.settings.set_string(self.key, self.value) else: self.settings.reset(self.key) self.value_set(self.settings.get_string(self.key)) Refine-0.7.1/refine/widgets/window-buttons-row.blp000066400000000000000000000025221514222123300221500ustar00rootroot00000000000000using Gtk 4.0; using Adw 1; template $WindowButtonsRow: Adw.PreferencesRow { activatable: false; child: Box { orientation: vertical; spacing: 12; margin-top: 12; margin-bottom: 12; margin-start: 12; margin-end: 12; CenterBox { styles [ "card", "toolbar", ] [start] $WindowButtonBin start_box { available-buttons: bind template.available-buttons; hexpand: true; alignment: start; next-box: end_box; } [center] Adw.WindowTitle { title: bind template.title; subtitle: bind template.subtitle; } [end] $WindowButtonBin end_box { available-buttons: bind template.available-buttons; hexpand: true; alignment: end; prev-box: start_box; } } Box { spacing: 12; Label { label: _("Hidden"); styles [ "heading", ] } $WindowButtonBin hidden_box { available-buttons: bind template.available-buttons; reorderable: false; alignment: start; hexpand: true; } Button reset_button { child: Adw.ButtonContent { label: _("Reset"); icon-name: "edit-undo-symbolic"; }; styles [ "flat", ] } } }; } Refine-0.7.1/refine/widgets/window_buttons_row.py000066400000000000000000000375341514222123300222020ustar00rootroot00000000000000# window_button_row.py # # Copyright 2025 Frederick Schenk (CodedOre) # # 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 . # # SPDX-License-Identifier: GPL-3.0-or-later from collections.abc import Callable from gettext import gettext as _ from typing import Any, cast from gi.repository import Adw, GLib, GObject, Gdk, Gio, Gtk from refine.logger import logger from refine.typing import LogicalDirectionType from refine.widgets.base import BaseInterface class ButtonNotFoundError(AssertionError): ... class WindowMenuButton(Gtk.Button): __gtype_name__ = "WindowMenuButton" in_reorderable_box = GObject.Property(type=bool, default=True) popover = GObject.Property(type=Gtk.Popover, default=None) def __init__(self, button_id: str, **kwargs: Any) -> None: super().__init__( tooltip_text=button_id.capitalize(), **kwargs, ) self.button_id = button_id self.add_css_class(button_id) self.add_css_class("window-menu-button") self.set_child( Gtk.Image.new_from_icon_name(f"window-{self.button_id}-symbolic") ) self.popover = Gtk.PopoverMenu() self.popover.set_parent(self) drag_controller = Gtk.DragSource() drag_controller.connect("prepare", self._drag_prepare) drag_controller.connect("drag-begin", self._drag_begin) drag_controller.connect("drag-cancel", self._drag_end) drag_controller.connect("drag-end", self._drag_end) self.add_controller(drag_controller) self.connect("clicked", self._clicked) def _clicked(self, *_args: Any) -> None: if self.in_reorderable_box: menu = self._reorder_menu() else: menu = self._hidden_item_menu() self.popover.set_menu_model(menu) self.popover.popup() def _translate_alignment( self, alignment: Gtk.DirectionType ) -> LogicalDirectionType: # fmt: off match (alignment, self.get_direction()): case (Gtk.DirectionType.LEFT, (Gtk.TextDirection.NONE | Gtk.TextDirection.LTR)): return LogicalDirectionType.START case (Gtk.DirectionType.LEFT, Gtk.TextDirection.RTL): return LogicalDirectionType.END case (Gtk.DirectionType.RIGHT, (Gtk.TextDirection.NONE | Gtk.TextDirection.LTR)): return LogicalDirectionType.END case (Gtk.DirectionType.RIGHT, Gtk.TextDirection.RTL): return LogicalDirectionType.START case _: raise AssertionError # fmt: on def _hidden_item_menu(self) -> Gio.Menu: menu = Gio.Menu() menu.append( _("Move to _Left Corner"), f'window_button_row.show_item(("{self.button_id}",{int(self._translate_alignment(Gtk.DirectionType.LEFT))}))', ) menu.append( _("Move to _Right Corner"), f'window_button_row.show_item(("{self.button_id}",{int(self._translate_alignment(Gtk.DirectionType.RIGHT))}))', ) return menu def _reorder_menu(self) -> Gio.Menu: menu = Gio.Menu() menu.append( _("Move _Left"), f'window_button_row.move_item(("{self.button_id}",{int(self._translate_alignment(Gtk.DirectionType.LEFT))}))', ) menu.append( _("Move _Right"), f'window_button_row.move_item(("{self.button_id}",{int(self._translate_alignment(Gtk.DirectionType.RIGHT))}))', ) menu.append(_("_Hide"), f"window_button_row.hide_item::{self.button_id}") return menu def get_sibling_button(self, alignment: LogicalDirectionType) -> Gtk.Widget | None: """ Get the next or previous sibling `WindowMenuButton`. Depends on the `LogicalDirectionType` provided. """ sibling = self while True: match alignment: case LogicalDirectionType.START: sibling = sibling.get_prev_sibling() # type: ignore [assignment] case LogicalDirectionType.END: sibling = sibling.get_next_sibling() # type: ignore [assignment] case _: raise AssertionError if sibling is None: return None if type(sibling) is WindowMenuButton: return sibling def _drag_prepare( self, _ctrl: Gtk.DragSource, _x: float, _y: float ) -> Gdk.ContentProvider: return Gdk.ContentProvider.new_for_value(self) def _drag_begin(self, ctrl: Gtk.DragSource, _drag: Gdk.Drag) -> None: icon = Gtk.WidgetPaintable.new(self) ctrl.set_icon(icon, 0, 0) self.add_css_class("dimmed") def _drag_end(self, *_args: Any) -> None: self.remove_css_class("dimmed") class WindowButtonBin(Adw.Bin): __gtype_name__ = "WindowButtonBin" button_layout = GObject.Property(type=str, default="") available_buttons = GObject.Property(type=GObject.Strv) alignment = GObject.Property(type=Gtk.Align, default=Gtk.Align.START) reorderable = GObject.Property(type=bool, default=True) next_box = GObject.Property(type=Gtk.Widget, default=None) prev_box = GObject.Property(type=Gtk.Widget, default=None) _unknown_buttons: list[str] = [] @GObject.Signal def changed(self) -> None: pass def __init__(self, **kwargs: Any) -> None: self.set_css_name("windowbuttonbox") super().__init__(**kwargs) self.connect("notify::button-layout", self._button_layout_set_callback) self.button_box = Gtk.Box(css_name="windowcontrols", homogeneous=True) self.bind_property("alignment", self.button_box, "halign") self.set_child(self.button_box) self._drop_place = Gtk.Image.new_from_icon_name("list-drag-handle-symbolic") self._drop_place.add_css_class("dimmed") self.button_box.append(self._drop_place) drop_controller = Gtk.DropTarget.new( type=WindowMenuButton, actions=Gdk.DragAction.COPY ) drop_controller.connect("drop", self._on_drop) drop_controller.connect("motion", self._on_drag_motion) drop_controller.connect("leave", self._check_remaining_handles) self.add_controller(drop_controller) def _for_each_button(self, func: Callable[[WindowMenuButton], None]) -> None: next_child = self.button_box.get_first_child() while next_child is not None: child = next_child next_child = next_child.get_next_sibling() if type(child) is WindowMenuButton: func(child) def _button_layout_set_callback(self, *_args: Any) -> None: self._for_each_button(lambda button: self.button_box.remove(button)) self._unknown_buttons = [] if len(self.button_layout) != 0: buttons = self.button_layout.split(",") for button_id in buttons: if button_id in self.available_buttons: button = WindowMenuButton(button_id) button.in_reorderable_box = self.reorderable self.button_box.append(button) else: self._unknown_buttons.append(button_id) self._check_remaining_handles() def update_layout(self, *_args: Any) -> None: layout = [] self._for_each_button(lambda button: layout.append(button.button_id)) if self.alignment is Gtk.Align.END: layout = self._unknown_buttons + layout else: layout = layout + self._unknown_buttons self.button_layout = ",".join(layout) def _check_remaining_handles(self, *_args: Any) -> None: button_count = 0 child = self.button_box.get_first_child() while child is not None: if type(child) is WindowMenuButton: button_count += 1 child = child.get_next_sibling() self._drop_place.set_visible(button_count == 0) def _on_drag_motion( self, _ctrl: Gtk.DropTarget, x: float, y: float ) -> Gdk.DragAction: if self.reorderable: self._drop_place.set_visible(True) child = self._get_place_sibling(x, y) self.button_box.reorder_child_after(self._drop_place, child) return Gdk.DragAction.COPY def _on_drop( self, _ctrl: Gtk.DropTarget, button: WindowMenuButton, x: float, y: float ) -> None: button.unparent() button.in_reorderable_box = self.reorderable if self.reorderable: sibling = self._get_place_sibling(x, y) self.button_box.insert_child_after(button, sibling) else: self.button_box.append(button) self.emit("changed") def _get_place_sibling(self, x: float, y: float) -> Gtk.Widget | None: child = self.pick(x, y, Gtk.PickFlags.DEFAULT) child = self._get_box_child(child) # type: ignore [arg-type] if child is None: if self.alignment is Gtk.Align.END: return None return self.button_box.get_last_child() child_width = child.get_width() if (x % child_width) > child_width / 2: return child return child.get_prev_sibling() def _get_box_child(self, child: Gtk.Widget) -> Gtk.Widget | None: if child is self: return None while True: parent = child.get_parent() if parent is None: return None if parent is self.button_box: return child child = parent def pick_button(self, button_id: str) -> Gtk.Widget | None: """Get button widget with the given button ID.""" child = self.button_box.get_first_child() while child is not None: child = child.get_next_sibling() if type(child) is WindowMenuButton and child.button_id == button_id: return child return None def add_button(self, button: WindowMenuButton) -> None: """Append or prepend a button.""" button.unparent() if self.alignment is Gtk.Align.END: self.button_box.prepend(button) else: self.button_box.append(button) self.emit("changed") def reorder_items(self, widget: Gtk.Widget, sibling: Gtk.Widget) -> None: """Reorder buttons and emit the `::changed` signal.""" self.button_box.reorder_child_after(widget, sibling) self.emit("changed") @Gtk.Template.from_resource("/page/tesk/Refine/widgets/window-buttons-row.ui") class WindowButtonsRow(Adw.PreferencesRow, BaseInterface): __gtype_name__ = "WindowButtonsRow" start_box = Gtk.Template.Child() end_box = Gtk.Template.Child() hidden_box = Gtk.Template.Child() reset_button = Gtk.Template.Child() settings = cast("Gio.Settings", GObject.Property(type=Gio.Settings)) schema_id = cast("str", GObject.Property(type=str)) schema = cast("Gio.SettingsSchema", GObject.Property(type=Gio.SettingsSchema)) key = cast("str", GObject.Property(type=str)) is_valid_setting = cast("bool", GObject.Property(type=bool, default=False)) is_default = GObject.Property(type=bool, default=True) button_layout = GObject.Property(type=str, default="") title = GObject.Property(type=str, default=None) subtitle = GObject.Property(type=str, default=None) available_buttons = GObject.Property(type=GObject.Strv) def _move_item(self, _widget: Any, _action_name: str, variant: Any) -> None: (button_id, alignment) = variant.unpack() alignment = LogicalDirectionType(alignment) box = None button = None for searched_box in [self.start_box, self.end_box]: button = searched_box.pick_button(button_id) if button is not None: box = searched_box break if not box or not button: raise IndexError button_sibling = button.get_sibling_button(alignment) match alignment: case LogicalDirectionType.START: if button_sibling is not None: box.reorder_items(button_sibling, button) if button_sibling is None and box.prev_box is not None: box.prev_box.add_button(button) case LogicalDirectionType.END: if button_sibling is not None: box.reorder_items(button, button_sibling) if button_sibling is None and box.next_box is not None: box.next_box.add_button(button) case _: logger.error("Unsupported alignment used in move_item") def _show_item(self, _widget: Any, _action_name: str, variant: Any) -> None: (button_id, alignment) = variant.unpack() alignment = LogicalDirectionType(alignment) button = self.hidden_box.pick_button(button_id) if not button: raise ButtonNotFoundError(button_id) match alignment: case LogicalDirectionType.START: self.start_box.add_button(button) case LogicalDirectionType.END: self.end_box.add_button(button) case _: logger.error("Unsupported alignment used in show_item") def _hide_item(self, _widget: Any, _action_name: str, variant: Any) -> None: button_id = variant.unpack() button = self.start_box.pick_button(button_id) if button is None: button = self.end_box.pick_button(button_id) if button is None: raise ButtonNotFoundError(button_id) self.hidden_box.add_button(button) def _layout_changed(self, *_args: Any) -> None: self.start_box.update_layout() self.end_box.update_layout() layout = f"{self.start_box.button_layout}:{self.end_box.button_layout}" logger.debug(f"Set key “{self.key}” to “{layout}”") self.settings.set_value(self.key, GLib.Variant.new_string(layout)) def _button_layout_set_callback(self, *_args: Any) -> None: layout = self.button_layout.split(":") self.start_box.button_layout = layout[0] self.end_box.button_layout = layout[1] hidden_buttons = filter( lambda handle: handle not in self.button_layout, self.available_buttons ) self.hidden_box.button_layout = ",".join(hidden_buttons) default_value = self.settings.get_default_value(self.key) self.is_default = default_value == self.settings.get_value(self.key) self.reset_button.set_visible(not self.is_default) def _reset_button_clicked(self, *_args: Any) -> None: logger.debug("Reset button pressed") self.settings.reset(self.key) def do_setup(self) -> None: self.install_action("window_button_row.show_item", "(si)", self._show_item) self.install_action("window_button_row.move_item", "(si)", self._move_item) self.install_action("window_button_row.hide_item", "s", self._hide_item) self.start_box.connect("changed", self._layout_changed) self.end_box.connect("changed", self._layout_changed) self.hidden_box.connect("changed", self._layout_changed) self.connect("notify::button-layout", self._button_layout_set_callback) self.settings.bind( self.key, self, "button-layout", Gio.SettingsBindFlags.DEFAULT ) self.reset_button.connect("clicked", self._reset_button_clicked) Refine-0.7.1/refine/window.blp000066400000000000000000000036341514222123300162060ustar00rootroot00000000000000using Gtk 4.0; using Adw 1; template $Window: Adw.ApplicationWindow { title: _("Refine"); default-width: 800; default-height: 600; height-request: 240; Adw.Breakpoint { condition ("max-width: 550sp") setters { main_navigation_split_view.collapsed: true; } } content: Stack stack { transition-type: crossfade; StackPage { name: 'refine-page'; child: Adw.NavigationSplitView main_navigation_split_view { sidebar: Adw.NavigationPage { title: bind template.title; child: Adw.ToolbarView { [top] Adw.HeaderBar { [end] Button { icon-name: "help-about-symbolic"; tooltip-text: _("About Refine"); action-name: "app.about"; } } content: ListBox panels_list_box { styles [ "navigation-sidebar", ] }; }; }; content: Adw.NavigationPage { child: Adw.ToolbarView { [top] Adw.HeaderBar {} }; }; }; } StackPage { name: 'unsupported-environment-page'; child: Adw.ToolbarView { [top] Adw.HeaderBar { [end] Button { icon-name: 'info-outline-symbolic'; tooltip-text: _("About Refine"); action-name: 'app.about'; } } content: WindowHandle { child: Adw.StatusPage unsupported_status_page { icon-name: 'dialog-warning-symbolic'; title: _("Unsupported Environment"); child: Button continue_button { label: _("Accept the Risk and Continue"); halign: center; styles [ "pill", "warning", ] }; }; }; }; } }; } Refine-0.7.1/refine/window.py000066400000000000000000000134441514222123300160610ustar00rootroot00000000000000# window.py # # Copyright 2024 Hari Rana (TheEvilSkeleton) # # 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 . # # SPDX-License-Identifier: GPL-3.0-or-later from gettext import gettext as _ from typing import Any, cast from gi.repository import Adw, GLib, GObject, Gtk from refine.logger import logger # ruff: noqa: F401 from refine.widgets.adjustment import Adjustment from refine.widgets.base import BaseInterface from refine.widgets.boolean_switch_row import BooleanSwitchRow from refine.widgets.combo_row import ComboRow from refine.widgets.data_combo_row import DataComboRow from refine.widgets.flags_switch_row import FlagsSwitchRow from refine.widgets.font_row import FontRow from refine.widgets.panel_row import PanelRow from refine.widgets.reset_button import ResetButton from refine.widgets.value_combo_row import ValueComboRow from refine.widgets.value_switch_row import ValueSwitchRow from refine.widgets.window_buttons_row import WindowButtonsRow @Gtk.Template.from_resource("/page/tesk/Refine/widgets/panel-page.ui") class PanelPage(Adw.PreferencesPage): """Panel page containing options.""" __gtype_name__ = "PanelPage" @Gtk.Template.from_resource("/page/tesk/Refine/window.ui") class Window(Adw.ApplicationWindow): """The main window singleton class.""" __gtype_name__ = "Window" stack = Gtk.Template.Child() continue_button = Gtk.Template.Child() panels_list_box = Gtk.Template.Child() unsupported_status_page = Gtk.Template.Child() main_navigation_split_view = Gtk.Template.Child() def __init__(self, **kwargs: Any) -> None: super().__init__(**kwargs) self._verify_environment() self.needs_restart: list[Gtk.Widget] = [] panels_schema = ( "/page/tesk/Refine/sections/appearance.ui", "/page/tesk/Refine/sections/mouse-touchpad.ui", "/page/tesk/Refine/sections/power.ui", "/page/tesk/Refine/sections/shell-compositor.ui", "/page/tesk/Refine/sections/sound.ui", "/page/tesk/Refine/sections/wellbeing.ui", ) panels_list = Gtk.StringList.new(panels_schema) self.panels_list_box.bind_model(panels_list, self._create_row_func) self.panels_list_box.connect("row-activated", self._set_preferences_page_cb) first_row = self.panels_list_box.get_first_child() self._set_preferences_page(first_row) def _create_row_func(self, panel: Gtk.StringObject, *_args: Any) -> Gtk.Widget: builder = Gtk.Builder.new_from_resource(panel.get_string()) row = PanelRow() page = builder.get_object("page") row.page = page # type: ignore [method-assign] row.page.bind_property( "icon-name", row, "icon-name", GObject.BindingFlags.SYNC_CREATE ) row.page.bind_property("title", row, "title", GObject.BindingFlags.SYNC_CREATE) return row def _set_preferences_page(self, row: PanelRow, *_args: Any) -> None: navigation_page = self.main_navigation_split_view.get_content() toolbar_view = navigation_page.get_child() toolbar_view.set_content(row.page) navigation_page.set_title(row.page.get_title()) def _set_preferences_page_cb(self, _: Any, row: PanelRow, *_args: Any) -> None: self._set_preferences_page(row) self.main_navigation_split_view.set_show_content(True) def _verify_environment(self) -> None: if GLib.getenv("XDG_CURRENT_DESKTOP") != "GNOME": self.stack.set_visible_child_name("unsupported-environment-page") self.continue_button.connect( "clicked", lambda _: self.stack.set_visible_child_name("refine-page") ) unintended_behavior_label = _( "Some settings may not work as intended and could lead to undesirable behavior." ) unintended_behavior_label = f"{unintended_behavior_label}" if GLib.getenv("XDG_SESSION_DESKTOP") == "gnome": description = ( _( "Refine only supports versions of GNOME that have not been modified by the operating system." ) + " " + unintended_behavior_label ) else: description = ( _( "Refine is only intended to run on the GNOME desktop environment." ) + " " + unintended_behavior_label ) self.unsupported_status_page.set_description(description) # TODO: Find a way to request a logout dialog @GObject.Signal def restart_items_changed(self, widget: Gtk.Widget) -> None: logger.info(f"{self.__class__.__name__}::restart-items-changed signal emitted") if not (panel := cast("PanelPage", widget.get_ancestor(PanelPage))): return try: if not (banner := panel.get_banner()): return except (AttributeError, TypeError): return try: self.needs_restart.remove(widget) banner.set_revealed(False) except ValueError: self.needs_restart.append(widget) banner.set_revealed(True) Refine-0.7.1/subprojects/000077500000000000000000000000001514222123300152655ustar00rootroot00000000000000Refine-0.7.1/subprojects/blueprint-compiler.wrap000066400000000000000000000002611514222123300217730ustar00rootroot00000000000000[wrap-git] directory = blueprint-compiler url = https://gitlab.gnome.org/jwestman/blueprint-compiler.git revision = main depth = 1 [provide] program_names = blueprint-compiler