pax_global_header00006660000000000000000000000064141046430620014512gustar00rootroot0000000000000052 comment=9c70b9dece84e56a17b15c1f503799e756d13baf sequeler-0.8.2/000077500000000000000000000000001410464306200133465ustar00rootroot00000000000000sequeler-0.8.2/.editorconfig000066400000000000000000000002641410464306200160250ustar00rootroot00000000000000root = true [*] indent_style = space trim_trailing_whitespace = true insert_final_newline = true charset = utf-8 [*.{build,json,xml.in}] indent_size = 2 [*.vala] indent_size = 4 sequeler-0.8.2/.github/000077500000000000000000000000001410464306200147065ustar00rootroot00000000000000sequeler-0.8.2/.github/FUNDING.yml000066400000000000000000000011021410464306200165150ustar00rootroot00000000000000# These are supported funding model platforms github: [alecaddd] patreon: alecaddd open_collective: # Replace with a single Open Collective username ko_fi: # Replace with a single Ko-fi username tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry liberapay: Alecaddd issuehunt: # Replace with a single IssueHunt username otechie: # Replace with a single Otechie username custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] sequeler-0.8.2/.github/workflows/000077500000000000000000000000001410464306200167435ustar00rootroot00000000000000sequeler-0.8.2/.github/workflows/build.yml000066400000000000000000000012201410464306200205600ustar00rootroot00000000000000name: "CI" on: [push, pull_request] jobs: build: runs-on: ubuntu-latest container: image: elementary/docker:unstable steps: - uses: actions/checkout@v1 - name: Install Dependencies run: | apt update apt install -y meson libgranite-dev libgtk-3-dev libjson-glib-dev libgudev-1.0-dev libevdev-dev libgtksourceview-3.0-dev libxml2-dev libglib2.0-dev libgda-5.0-dev libmysqlclient-dev libpq-dev libgda-5.0-mysql libgda-5.0-postgres libsecret-1-dev libssh2-1-dev valac - name: Build env: DESTDIR: out run: | meson build ninja -C build ninja -C build install sequeler-0.8.2/.github/workflows/flatpak.yml000066400000000000000000000011061410464306200211060ustar00rootroot00000000000000on: push: # branches: [master] pull_request: name: CI jobs: flatpak-builder: name: "Flatpak Builder" runs-on: ubuntu-20.04 container: image: bilelmoussaoui/flatpak-github-actions:elementary-juno options: --privileged steps: - uses: actions/checkout@v2 - uses: bilelmoussaoui/flatpak-github-actions/flatpak-builder@master with: bundle: "sequeler-nightly.flatpak" manifest-path: "build-aux/com.github.alecaddd.sequeler.json" run-tests: true cache-key: "flatpak-builder-${{ github.sha }}" sequeler-0.8.2/.github/workflows/lint.yml000066400000000000000000000003461410464306200204370ustar00rootroot00000000000000name: "CI: Lint" on: [push, pull_request] jobs: lint: runs-on: ubuntu-latest container: image: valalang/lint steps: - uses: actions/checkout@v1 - name: Lint run: io.elementary.vala-lint -d . sequeler-0.8.2/.gitignore000066400000000000000000000001541410464306200153360ustar00rootroot00000000000000.snapcraft .vscode src/config.vala build/ _build/ parts/ prime/ stage/ builddir/ .flatpak-builder/ *~ *.snapsequeler-0.8.2/.travis.yml000066400000000000000000000004261410464306200154610ustar00rootroot00000000000000--- language: node_js node_js: - 10/* sudo: required services: - docker addons: apt: sources: - ubuntu-toolchain-r-test packages: - libstdc++-5-dev install: - npm i -g @elementaryos/houston script: - houston ci branches: only: - master sequeler-0.8.2/AUTHORS000066400000000000000000000000741410464306200144170ustar00rootroot00000000000000Alessandro "Alecaddd" Castellani sequeler-0.8.2/LICENSE000066400000000000000000001045051410464306200143600ustar00rootroot00000000000000 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. {one line to give the program's name and a brief idea of what it does.} Copyright (C) {year} {name of author} This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . 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: {project} Copyright (C) {year} {fullname} 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 . sequeler-0.8.2/README.md000066400000000000000000000056241410464306200146340ustar00rootroot00000000000000# ![Sequeler](data/assets/sequeler-logo-transparent.png) > Friendly SQL Client [![Build Status](https://github.com/Alecaddd/sequeler/workflows/CI/badge.svg)](https://github.com/Alecaddd/sequeler/action) [![Translation status](https://hosted.weblate.org/widgets/sequeler/-/svg-badge.svg)](https://hosted.weblate.org/engage/sequeler/?utm_source=widget) Sequeler is a native Linux SQL client built in Vala and Gtk. It allows you to connect to your local and remote databases, write SQL in a handy text editor with language recognition, and visualize SELECT results in a Gtk.Grid Widget. ![](data/assets/screenshots/sequeler-screenshot.png) ## Supported Databases - PostgreSQL - MariaDB/MySQL - SQLite ## Get it from the elementary OS AppCenter! Sequeler, is primarily available from the AppCenter of elementary OS. Download it from there! [![Get it on AppCenter](https://appcenter.elementary.io/badge.svg)](https://appcenter.elementary.io/com.github.alecaddd.sequeler) ## Get it from Flathub! You can get Sequeler form Flathub no matter what distribution you're using. Download it or follow the instructions to install it from here! Get it from Flathub! ## Support the Project If you like Sequeler and you want to support its development, consider donating via [PayPal](https://www.paypal.me/alecaddd) or pledge on [Patreon](https://www.patreon.com/alecaddd). Become a Patron Donate on PayPal ## Install it from source You can install Sequeler by compiling from source, here's the list of dependencies required: - `gtk+-3.0>=3.22.29` - `granite>=5.2` - `glib-2.0` - `gee-0.8` - `gobject-2.0` - `libxml-2.0` - `libgda-5.0` - `gtksourceview-3.0` - `libsecret-1` - `libssh2` - `meson` ## Building ``` meson build --prefix=/usr sudo ninja -C build install ``` ## Building development version The development version allows you to keep the stable version perfectly working while hacking on Sequeler. ``` meson build --prefix=/usr -Dprofile=development sudo ninja -C build install ``` You can run the application from terminal using ``` com.github.alecaddd.sequelerDevel ``` ### Help with the translation [![Translation status](https://hosted.weblate.org/widgets/sequeler/-/287x66-grey.png)](https://hosted.weblate.org/engage/sequeler/?utm_source=widget) ### Contributors - Alberto Fanjul - [Github](https://github.com/albfan) - Bilal Elmoussaoui - [Github](https://github.com/bilelmoussaoui) - [Paypal](https://www.paypal.me/BilalELMoussaoui) sequeler-0.8.2/build-aux/000077500000000000000000000000001410464306200152405ustar00rootroot00000000000000sequeler-0.8.2/build-aux/com.github.alecaddd.sequeler.json000066400000000000000000000134261410464306200235440ustar00rootroot00000000000000 { "app-id": "com.github.alecaddd.sequeler", "runtime": "org.gnome.Platform", "runtime-version": "40", "sdk": "org.gnome.Sdk", "base": "io.elementary.BaseApp", "base-version": "juno-20.08", "command": "com.github.alecaddd.sequeler", "finish-args": [ "--share=ipc", "--socket=fallback-x11", "--socket=wayland", "--talk-name=org.freedesktop.secrets", "--metadata=X-DConf=migrate-path=/com/github/alecaddd/sequeler/", "--share=network", "--filesystem=~/.ssh/:ro", "--socket=ssh-auth" ], "cleanup": [ "/include", "/lib/pkgconfig", "/lib/debug", "/share/vala", "/man", "*.a", "*.la" ], "modules": [{ "name": "libxml2", "build-options": { "config-opts": [ "--with-python=no" ] }, "sources": [{ "type": "archive", "url": "https://github.com/GNOME/libxml2/archive/v2.9.10.tar.gz", "sha256": "3bdffb4d728e4dc135b3210bf2a2cebb76548b820a5617c68abb7b83654066dd" }] }, { "name": "gtksourceview", "build-options": { "config-opts": [ "--enable-gtk-doc=no" ] }, "sources": [{ "type": "archive", "url": "https://download.gnome.org/sources/gtksourceview/3.24/gtksourceview-3.24.11.tar.xz", "sha256": "691b074a37b2a307f7f48edc5b8c7afa7301709be56378ccf9cc9735909077fd" }] }, { "name": "libgda", "build-options": { "config-opts": [ "--with-java=no", "--with-jni=no", "--with-oracle=no" ] }, "sources": [{ "type": "archive", "url": "https://download-fallback.gnome.org/sources/libgda/5.2/libgda-5.2.9.tar.xz", "sha256": "59caed8ca72b1ac6437c9844f0677f8a296d52cfd1c0049116026abfb1d87d9b" }], "modules": [{ "name": "postgresql-libs", "build-options": { "config-opts": [ "--with-python=no", "--with-perl=no", "--with-libxml", "--with-openssl" ] }, "sources": [{ "type": "archive", "url": "https://ftp.postgresql.org/pub/source/v13.2/postgresql-13.2.tar.gz", "sha256": "3386a40736332aceb055c7c9012ecc665188536d874d967fcc5a33e7992f8080" }] }, { "name": "jemalloc", "cleanup": [ "/bin/", "/share" ], "sources": [{ "type": "archive", "url": "https://github.com/jemalloc/jemalloc/releases/download/5.2.1/jemalloc-5.2.1.tar.bz2", "sha256": "34330e5ce276099e2e8950d9335db5a875689a4c6a56751ef3b1d8c537f887f6" }] }, { "name": "libaio", "buildsystem": "simple", "build-options": { "arch": { "i386": { "cflags": "-march=x86-64 -mtune=generic -O2 -pipe -fno-stack-protector -fno-plt" } } }, "build-commands": [ "make", "make prefix=/app install" ], "sources": [{ "type": "archive", "url": "http://ftp.de.debian.org/debian/pool/main/liba/libaio/libaio_0.3.110.orig.tar.gz", "sha256": "e019028e631725729376250e32b473012f7cb68e1f7275bfc1bbcdd0f8745f7e" }] }, { "name": "mariadb", "buildsystem": "cmake", "no-make-install": true, "config-opts": [ "-DCMAKE_BUILD_TYPE=Release", "-DBUILD_CONFIG=mysql_release", "-DWITH_INNOBASE_STORAGE_ENGINE=1", "-DWITHOUT_ARCHIVE_STORAGE_ENGINE=1", "-DWITHOUT_BLACKHOLE_STORAGE_ENGINE=1", "-DWITHOUT_PARTITION_STORAGE_ENGINE=1", "-DWITHOUT_TOKUDB=1", "-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1", "-DWITHOUT_FEDERATED_STORAGE_ENGINE=1", "-DWITHOUT_PBXT_STORAGE_ENGINE=1", "-DPLUGIN_AUTH_PAM=NO" ], "post-install": [ "make -C libmysql install", "make -C include install", "install -Dm755 scripts/mysql_config /app/bin/mysql_config", "install -Dm644 support-files/mariadb.pc /app/share/pkgconfig/mariadb.pc" ], "cleanup": [ "/bin/" ], "sources": [{ "type": "archive", "url": "http://ftp.hosteurope.de/mirror/archive.mariadb.org/mariadb-10.1.48/source/mariadb-10.1.48.tar.gz", "sha256": "069d58b1e2c06bb1e6c31249eda34138f41fb8ae3dec7ecaeba8035812c87cf9" }] }, { "name": "intltool", "cleanup": [ "*" ], "sources": [ { "type": "archive", "url": "https://launchpad.net/intltool/trunk/0.51.0/+download/intltool-0.51.0.tar.gz", "sha256": "67c74d94196b153b774ab9f89b2fa6c6ba79352407037c8c14d5aeb334e959cd" } ] } ] }, { "name": "libssh2", "sources": [{ "type": "archive", "url": "https://www.libssh2.org/download/libssh2-1.9.0.tar.gz", "sha256": "d5fb8bd563305fd1074dda90bd053fb2d29fc4bce048d182f96eaa466dfadafd" }] }, { "name": "libfiposix", "sources": [{ "type": "archive", "url": "https://github.com/sionescu/libfixposix/archive/v0.4.3.tar.gz", "sha256": "78fe8bcebf496520ac29b5b65049f5ec1977c6bd956640bdc6d1da6ea04d8504" }, { "type": "script", "dest-filename": "autogen.sh", "commands": [ "autoreconf -vfi" ] } ] }, { "name": "sequeler", "buildsystem": "meson", "sources": [{ "type": "dir", "path": "../" } ] } ] } sequeler-0.8.2/build-aux/meson_post_install.py000066400000000000000000000012301410464306200215220ustar00rootroot00000000000000#!/usr/bin/env python3 import os import subprocess install_prefix = os.environ['MESON_INSTALL_PREFIX'] schemadir = os.path.join(install_prefix, 'share/glib-2.0/schemas') if not os.environ.get('DESTDIR'): print('Compiling gsettings schemas...') subprocess.call(['glib-compile-schemas', schemadir]) print('Updating icon cache...') icon_cache_dir = os.path.join(install_prefix, 'share/icons/hicolor') subprocess.call(['gtk-update-icon-cache', '-qtf', icon_cache_dir]) print('Updating desktop database...') desktop_database_dir = os.path.join(install_prefix, 'share/applications') subprocess.call(['update-desktop-database', '-q', desktop_database_dir]) sequeler-0.8.2/com.github.alecaddd.sequeler.yml000066400000000000000000000131521410464306200214760ustar00rootroot00000000000000{ "app-id": "com.github.alecaddd.sequeler", "runtime": "io.elementary.Platform", "runtime-version": "6", "sdk": "io.elementary.Sdk", "command": "com.github.alecaddd.sequeler", "finish-args": [ "--share=ipc", "--socket=fallback-x11", "--socket=wayland", "--share=network", "--filesystem=~/.ssh/:ro", "--socket=ssh-auth" ], "cleanup": [ "/include", "/lib/pkgconfig", "/lib/debug", "/share/vala", "/man", "*.a", "*.la" ], "modules": [{ "name": "libxml2", "build-options": { "config-opts": [ "--with-python=no" ] }, "sources": [{ "type": "archive", "url": "https://github.com/GNOME/libxml2/archive/v2.9.10.tar.gz", "sha256": "3bdffb4d728e4dc135b3210bf2a2cebb76548b820a5617c68abb7b83654066dd" }] }, { "name": "gtksourceview", "build-options": { "config-opts": [ "--enable-gtk-doc=no" ] }, "sources": [{ "type": "archive", "url": "https://download.gnome.org/sources/gtksourceview/3.24/gtksourceview-3.24.11.tar.xz", "sha256": "691b074a37b2a307f7f48edc5b8c7afa7301709be56378ccf9cc9735909077fd" }] }, { "name": "libgda", "build-options": { "config-opts": [ "--with-java=no", "--with-jni=no", "--with-oracle=no" ] }, "sources": [{ "type": "archive", "url": "https://download-fallback.gnome.org/sources/libgda/5.2/libgda-5.2.9.tar.xz", "sha256": "59caed8ca72b1ac6437c9844f0677f8a296d52cfd1c0049116026abfb1d87d9b" }], "modules": [{ "name": "postgresql-libs", "build-options": { "config-opts": [ "--with-python=no", "--with-perl=no", "--with-libxml", "--with-openssl" ] }, "sources": [{ "type": "archive", "url": "https://ftp.postgresql.org/pub/source/v13.2/postgresql-13.2.tar.gz", "sha256": "3386a40736332aceb055c7c9012ecc665188536d874d967fcc5a33e7992f8080" }] }, { "name": "jemalloc", "cleanup": [ "/bin/", "/share" ], "sources": [{ "type": "archive", "url": "https://github.com/jemalloc/jemalloc/releases/download/5.2.1/jemalloc-5.2.1.tar.bz2", "sha256": "34330e5ce276099e2e8950d9335db5a875689a4c6a56751ef3b1d8c537f887f6" }] }, { "name": "libaio", "buildsystem": "simple", "build-options": { "arch": { "i386": { "cflags": "-march=x86-64 -mtune=generic -O2 -pipe -fno-stack-protector -fno-plt" } } }, "build-commands": [ "make", "make prefix=/app install" ], "sources": [{ "type": "archive", "url": "http://ftp.de.debian.org/debian/pool/main/liba/libaio/libaio_0.3.110.orig.tar.gz", "sha256": "e019028e631725729376250e32b473012f7cb68e1f7275bfc1bbcdd0f8745f7e" }] }, { "name": "mariadb", "buildsystem": "cmake", "no-make-install": true, "config-opts": [ "-DCMAKE_BUILD_TYPE=Release", "-DBUILD_CONFIG=mysql_release", "-DWITH_INNOBASE_STORAGE_ENGINE=1", "-DWITHOUT_ARCHIVE_STORAGE_ENGINE=1", "-DWITHOUT_BLACKHOLE_STORAGE_ENGINE=1", "-DWITHOUT_PARTITION_STORAGE_ENGINE=1", "-DWITHOUT_TOKUDB=1", "-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1", "-DWITHOUT_FEDERATED_STORAGE_ENGINE=1", "-DWITHOUT_PBXT_STORAGE_ENGINE=1", "-DPLUGIN_AUTH_PAM=NO" ], "post-install": [ "make -C libmysql install", "make -C include install", "install -Dm755 scripts/mysql_config /app/bin/mysql_config", "install -Dm644 support-files/mariadb.pc /app/share/pkgconfig/mariadb.pc" ], "cleanup": [ "/bin/" ], "sources": [{ "type": "archive", "url": "http://ftp.hosteurope.de/mirror/archive.mariadb.org/mariadb-10.1.48/source/mariadb-10.1.48.tar.gz", "sha256": "069d58b1e2c06bb1e6c31249eda34138f41fb8ae3dec7ecaeba8035812c87cf9" }] }, { "name": "intltool", "cleanup": [ "*" ], "sources": [ { "type": "archive", "url": "https://launchpad.net/intltool/trunk/0.51.0/+download/intltool-0.51.0.tar.gz", "sha256": "67c74d94196b153b774ab9f89b2fa6c6ba79352407037c8c14d5aeb334e959cd" } ] } ] }, { "name": "libssh2", "sources": [{ "type": "archive", "url": "https://www.libssh2.org/download/libssh2-1.9.0.tar.gz", "sha256": "d5fb8bd563305fd1074dda90bd053fb2d29fc4bce048d182f96eaa466dfadafd" }] }, { "name": "libfiposix", "sources": [{ "type": "archive", "url": "https://github.com/sionescu/libfixposix/archive/v0.4.3.tar.gz", "sha256": "78fe8bcebf496520ac29b5b65049f5ec1977c6bd956640bdc6d1da6ea04d8504" }, { "type": "script", "dest-filename": "autogen.sh", "commands": [ "autoreconf -vfi" ] } ] }, { "name": "sequeler", "buildsystem": "meson", "sources": [{ "type": "dir", "path": "." } ] } ] } sequeler-0.8.2/data/000077500000000000000000000000001410464306200142575ustar00rootroot00000000000000sequeler-0.8.2/data/assets.gresource.xml000066400000000000000000000003131410464306200202750ustar00rootroot00000000000000 stylesheet.css sequeler-0.8.2/data/assets/000077500000000000000000000000001410464306200155615ustar00rootroot00000000000000sequeler-0.8.2/data/assets/icons/000077500000000000000000000000001410464306200166745ustar00rootroot00000000000000sequeler-0.8.2/data/assets/icons/128x128/000077500000000000000000000000001410464306200176315ustar00rootroot00000000000000sequeler-0.8.2/data/assets/icons/128x128/com.github.alecaddd.sequeler.svg000066400000000000000000003530601410464306200257640ustar00rootroot00000000000000 image/svg+xml sequeler-0.8.2/data/assets/icons/128x128/com.github.alecaddd.sequelerDevel.svg000066400000000000000000005070071410464306200267460ustar00rootroot00000000000000 image/svg+xml sequeler-0.8.2/data/assets/icons/16x16/000077500000000000000000000000001410464306200174615ustar00rootroot00000000000000sequeler-0.8.2/data/assets/icons/16x16/com.github.alecaddd.sequeler.svg000066400000000000000000000415261410464306200256150ustar00rootroot00000000000000 image/svg+xml sequeler-0.8.2/data/assets/icons/16x16/com.github.alecaddd.sequelerDevel.svg000066400000000000000000000424761410464306200266020ustar00rootroot00000000000000 image/svg+xml sequeler-0.8.2/data/assets/icons/24x24/000077500000000000000000000000001410464306200174575ustar00rootroot00000000000000sequeler-0.8.2/data/assets/icons/24x24/com.github.alecaddd.sequeler.svg000066400000000000000000000645061410464306200256160ustar00rootroot00000000000000 image/svg+xml sequeler-0.8.2/data/assets/icons/24x24/com.github.alecaddd.sequelerDevel.svg000066400000000000000000000645121410464306200265730ustar00rootroot00000000000000 image/svg+xml sequeler-0.8.2/data/assets/icons/32x32/000077500000000000000000000000001410464306200174555ustar00rootroot00000000000000sequeler-0.8.2/data/assets/icons/32x32/com.github.alecaddd.sequeler.svg000066400000000000000000001253451410464306200256130ustar00rootroot00000000000000 image/svg+xml sequeler-0.8.2/data/assets/icons/32x32/com.github.alecaddd.sequelerDevel.svg000066400000000000000000001473751410464306200266020ustar00rootroot00000000000000 image/svg+xml sequeler-0.8.2/data/assets/icons/48x48/000077500000000000000000000000001410464306200174735ustar00rootroot00000000000000sequeler-0.8.2/data/assets/icons/48x48/com.github.alecaddd.sequeler.svg000066400000000000000000001530611410464306200256250ustar00rootroot00000000000000 image/svg+xml sequeler-0.8.2/data/assets/icons/48x48/com.github.alecaddd.sequelerDevel.svg000066400000000000000000002120351410464306200266020ustar00rootroot00000000000000 image/svg+xml sequeler-0.8.2/data/assets/icons/64x64/000077500000000000000000000000001410464306200174675ustar00rootroot00000000000000sequeler-0.8.2/data/assets/icons/64x64/com.github.alecaddd.sequeler.svg000066400000000000000000001605221410464306200256210ustar00rootroot00000000000000 image/svg+xml sequeler-0.8.2/data/assets/icons/64x64/com.github.alecaddd.sequelerDevel.svg000066400000000000000000002221621410464306200266000ustar00rootroot00000000000000 image/svg+xml sequeler-0.8.2/data/assets/icons/actions/000077500000000000000000000000001410464306200203345ustar00rootroot00000000000000sequeler-0.8.2/data/assets/icons/actions/application-logout.svg000066400000000000000000000473151410464306200247010ustar00rootroot00000000000000 image/svg+xml sequeler-0.8.2/data/assets/icons/actions/office-database-edit.svg000066400000000000000000000443101410464306200247770ustar00rootroot00000000000000 image/svg+xml sequeler-0.8.2/data/assets/icons/actions/office-database-new.svg000066400000000000000000000366561410464306200246610ustar00rootroot00000000000000 image/svg+xml sequeler-0.8.2/data/assets/icons/actions/office-database-remove.svg000066400000000000000000000362351410464306200253560ustar00rootroot00000000000000 image/svg+xml sequeler-0.8.2/data/assets/icons/status/000077500000000000000000000000001410464306200202175ustar00rootroot00000000000000sequeler-0.8.2/data/assets/icons/status/table-empty.svg000066400000000000000000000424661410464306200231770ustar00rootroot00000000000000 image/svg+xml sequeler-0.8.2/data/assets/icons/status/table.svg000066400000000000000000000411161410464306200220320ustar00rootroot00000000000000 image/svg+xml sequeler-0.8.2/data/assets/screenshots/000077500000000000000000000000001410464306200201215ustar00rootroot00000000000000sequeler-0.8.2/data/assets/screenshots/sequeler-screenshot.png000066400000000000000000001451341410464306200246370ustar00rootroot00000000000000‰PNG  IHDR‡æØ ô^sBIT|dˆ IDATxœìÝy|TÕÝÇñï,™¬„²ad’@¢DáQ[—*Uqëb+­>Õª¸ÛÕZmë]€Ó[gAY»¨C"9 ´O¨ÚÛÒpújo ªö¶îR]Œ´7jKøÓ–÷{LÐýutšW°mmÝ·­û„L¸CPCÞm ”Ú‚ð€ÈÔÑ`¥#AOGä¶îá 9Ú3½«=¡ÁO{g…DàôL(äðÓÌv[ÚÚòzH„+ E0ÔÚ¶±Çl­œÞ:2RÈÞÊëí Úòz‡Ej8Ô–mïPÈ`?#ŠZë8=³²˜¿QC’o(d°_{¶õ¥Ó„# e0äýÜày ¶`ûEHÀé©­ËÍ»EÞ¡‘w[ 0)¢¢®‡Ú ½ž¼ÚCµe¹Ú[º¥`Èî¶í>r(Ð(¢ŽDÝ: u0äo´óË ™äml?Û²ˆ …¼ƒ÷0Èvê¹Ýmß@£ˆ"> 2wÖ;¨µ`È}„Ñí1VRI)’âOµyDþÎl_@÷l°((²Ÿúª—T-é ¤F¯×¥“‚]_e ŽSÏn¯‡m‰ú`ufðÑÞQC-‘ö7ZȨ“£…údee ÷Ýw¯MOO?Ïl6§K²´·ónš¬VëþŠŠŠÏ¾ño¼\VV¶CÒEä "rl鹿í`_k·H‡Ú ¹2KJýÁ~PðØc=b³Ù²ìv»ìvïÂáíg4e4e2™Êî½÷ÞŸþío[¡“‘U_…CÞ!‘ü<ûÜ[· ‡::jÈ_i÷@Èùh’?`À€üuëÖýÙjµ¦;7: œF ƒÌfsYNNέåååëtrº™s‘ÃëÑ)Ø Èßv°¯µ‹±õ]:U QCÞ¼W!sD&Iio½õÖL›ÍF0:ÃáÍfËzûí·gJJÓW‹cùË/ 6étá‡Ú²*X G÷UÉÌ’Rû÷ï6ÓÈ@¸Øív¥§§Ÿ-©Næ¦S/yD-Í’ $¬aQWŽ f:™w½!g#‡Ì’ŒFã€Nì'€SyD¢Næþr‹`òùyV±”} ‹ik{ ýÜW(3J2;Ž8¦”€pr8ñ:™­8s gj›‚_¶>Ð~mmo·®9ä/jm™³Í{Å2“º†{½!÷Ü©µifîºdôPW¤n¿ È; èJòжÔê2¡W‚™:Ö–ZCîϽo´ófZäp8|¾€qfþ2 ©ý9ˆ÷sÑÞ.Qs(Tü Áro÷.wä¾m0|¶vj) 2J²»µGd*Ù•á÷o^ ´Ì_»¿€+ôq>Úíö€ûž“Q‰Z¶{÷nUTTÈf³I:yÿ2224tèÐ.îY—sÈâä ¹·;¼ŽÑ%áQ¸Ã¡`‹-rÕÒ2p€(ç Ùív?~\»wïVyy¹jkkÕØØ(“ɤ˜˜%%%©G²X,2 ®`(˜€(&&FqqqêÙ³§RSSe±X:õººJss³jkkÕ³gO UTTèŠ+®PLLŒ‡¬V«Þ|óM :T‡CÇŽSRR’ÌæHž¨rþrŠ@ƒ]ü@Á¶ušp|·ÚÞ´4jÈß¼=£$æ‹\Ÿ ív»¬V«Ö­[§ŠŠ M›6MS¦LQ||¼L&“l6›êëëUVV¦Õ«WËh4ªÿþ2™L®‘D­Dv»]6›MUUUª¨¨Pjjª pZ<:qâ„¶lÙ¢ÄÄDÙíveeeÉ`0Èd2©¶¶V’/ƒÁ Ã‡«¬¬L&“IÇ×Yg¥¤¤¤.¾‚Îç–E¸çvyfÎQB’ïè¡`tzP)Q^°–Z*âèæ®¿þz½øâ‹m~Ÿ{0tâÄ }òÉ'7nœ®¸â ™Íf&“IIII9r¤†®íÛ·kÇŽ2dˆ,‹ŒF£ÇH"œTSS“êêêtìØ18qBgœq†bbbÚuí‘äĉÚ¼y³Æ¯¬¬,­_¿^åååÊËË“ÍfsMÕ³ÙlÊËËÓŽ;”ššªÜÜ\•••iݺuQ©õ¢ÒÎmODÔ! e8ÔžB-M) f:© ›²Ûí>5Ú³Ÿ{m¡ææf}òÉ'š6mšFŒÑâL‡Ã!£Ñ¨Q£F©G*,,t…;΂Õ"£Ñ(‹Å"‹Å¢øøxY,UWWkçÎ9rd·AÔÜܬ͛7+//OéééjhhPNNެV«JJJôæ›oêØ±c’¤””5JS¦L‘ÉdRCCƒÒÓÓ•——§õë×k„ Ñ0ŬµÜBò¬1ÔÒ4².QÎïPk¿­%lV/t3v»]wÜq‡fÏž­1cƸڽG mÙ²EÏ<óŒæÍ›×b@äœæUXX¨qãÆ¹‚¡`8 0@ÇŽSyy¹²²²$ù«Äd2©gÏž2:|ø°öíÛ§õÞ@êëëe0סã´Gmm­”™™©††ÙívíÝ»W›6mRzzºÆŽ«„„IR]]***´iÓ&;V²ÛíÊÌÌTqq±Nœ8¡”””°_Ck^ýuýãÿðióÍ7;zh£$Û©çÞ…¨åµÝZ¸¶QE²´7* 4*È{i8÷mp:qâ„^xá=øàƒzøá‡õꫯª¡¡¡KúRVV¦_ýêWÚ¶m[—œN'F£Q³gÏÖÊ•+[ÜoÕªUš={vÀ Æ92Èáp¨¦¦Fš8qb›ëÒ:yæ™:vì˜êëë}V ¯]»VsæÌѵ×^«9s樰°P’ôýïßcdQ 6›M»víÒùçŸ/“ÉÔ®þ˜L&åææªªªJ6›­Í“ÑhTbb¢bccuøðá ÞÓØØ¨ŸýìgzõÕWuðàAH’bccUSS£¥K—ê£>Ruuu›¯§#222T]]­ææfíÞ½[£GV||¼ß{âp8§Q£F©¤¤DV«UÕÕÕÊÈÈkŸÛ¢±±Q“&M eM¤¶f­e!a‰ÿ>­¥pí2oÞ<é¿ø…}ôQY­VW0´`Á=òÈ#¡8 h‡²²2íÞ½[7Üpƒn¼ñFIÒû￯ÂÂBY­V™ÍfÙív-[¶L%%%êׯŸ¦OŸî‚ßÐРŋ«¾¾^çwžÖ¯_¯=zh̘1úàƒ4eÊ 8PV«U/½ô’Ƨ±cǶxLé«líwøða}ðÁ*((Ðúõë5hÐ Mœ81ü7º‰µk×jáÂ…ºí¶Û4bÄmß¾]øÃ$Iùùù­¾ßn·Ën·«¼¼\Ó¦MëP_ÒÒÒ´aÃ¥¥¥µXs(˜˜%&&êØ±cA…#¯½öš¶oß.I2›ÍŠw½+³Ù,›ÍÖ¦‘H±k×.•••Éáp(//OTZZšbbb\E¨÷íÛ§C‡I’RSS]SèbbbÔ¯_?û¬~ýë_+..N\p®¸â ¥¦¦jÓ¦MZ·n}ôQåç竲²R7Ýt“>ýôSõêÕK»wïÖm·Ý¦Ë.»L¥¥¥úÁ~àZžX’ßÇ–Ž™íê[0û;V÷ÜsÃö?¾ÐÜpà ’¤^xA’´ÿ~qÆû >\eeeßãä577Ëd2u(D1™Ljnnöø,Ø–DƒA&“I6›­õ%ŸégûÛßô³ŸýÌu¾®¨Ùc6›]#iŒF£ëžFUVVjâĉ®ë:t¨Ö®]«ÁƒËjµÊd2Éh4ª®®N’”˜˜‘+·Í˜1Cqqqš={¶zôè¡«®º*èï™Áæî+—E”H ‡Z[¥ÌßÍîÐO™ÝnwýÏ£“ÍfSmm­bcc;rhÐAÎâ óçÏ×—_~©O?ýTo¼ñ†Ö®]«?üáÚ»w¯$iîܹÿðÜ¿¿«hõèÑ£UWW§þýû«W¯^­ž³¥cº‡CÁì—ŸŸ¯ãÇ·ïâà4æðdffjçή‘C’´cÇתaþÞãÎùyÎ9Ú¥½5‡¤“Ÿ®;Gж%Üp¾'ØåÛSSSuàÀ×ö† ôøãë–[nQŸ>}ÚÖù±Ùl®p,..Nî³uœ!œóó²Õju½ÏùžØØX×óöÔn ¥W^yE×\s$©¢¢B .Ô”)Stá…ê¼óÎs­ÆÖØØ¨«¯¾Zí9MkYEk«–u¹p…CÁN ôš{¡’N¦´?ÿùÏU^^®!C†Èn·ëË/¿ÔOúSýò—¿TjjjGOÚ©¸¸X+W®Ô%—\¢ÌÌLÍš5Kf³Yÿûßµÿ~õèÑC’ôãÿØ5ß`0Èb±híÚµ’NÖHOOWmm­+¨qþ#¿¶¶V’çÿÚ¶tÌòòò6íÇdÎ5×\£ è¶ÛnÓðáõ}ûvýñÔìÙ³ƒz¿óÏõ„„ÕÔÔõŸÔÕÕ¹êÌ †6z±Ûíjjj z ú)S¦è•W^ñh[³f •––¦™3gêüóÏoS:Âh4ª©©Iñññ²Ùl®H‡Cv»]}ûöÕ¶mÛtæ™gJ:ùwujjªìv»ktQbb¢,‹L&“ššš®4/¿ü²L&“Î=÷\ýô§?Õ‘#G«)S¦¨¹¹ÙcßvCN~Ëàȳ¾P{–µKˆªp(cÄ êy󿩼¼\ Ðoû[ÙívÝ}÷Ý*++Ó¼yó(H @JHHлᆱ]»véòË/WCCƒ>øà%$$(##õÔîâÅ‹5kÖ,}ùå—Z´h‘fÏž­1cÆÈl6ë­·ÞRrr²V¬XáúßÍþýûËh4êí·ß–ÙlÖ²eË\çÌÍÍ xL÷M‚Ýкüü| ½øâ‹*++SVV–fÏžÝb½!'÷©ÁÚ³gO‡Â¡ýû÷+))É#ÐhK@dµZUWWt®¼òJmܸQÅÅÅív»]}úôѹçžô¹CaðàÁZºt©ìv»FŽ©þýû«©©I jhhÐàÁƒURR¢µk×Êáp(##CƒV}}½‡,‹bccµoß>Ë`0hðàÁa½o/¾ø¢Þ|óMÕÖÖ*--M?úÑ:ã4m©¯êóv8ÒªU«Ô«W/=øàƒêÛ·¯âãã5|øp½óÎ;zýõ×µzõj{î¹úú׿®ÄÄDeddèƒ>Ї~¨ììlÕÖÖ*%%E矾µlÙ2mÚ´I3gÎÔ矮±cÇ*???à1=ª?üP_ûÚ×tÆgµ_fffWßFˆX[¶lÑ[o½¥ñãÇ+##CÓ§O×UW]¥éÓ§»VúZ¸p¡bccÕ¯_?Ÿ÷{OÿŠ‹‹ÓG}¤É“'·k´ŠÍfÓ| ¬¬,ÅÅÅÉl6·iôÝnWCCƒªªª4dÈ ú`2™tÞyçÉl6ëÈ‘#jllTFF†®¸â ýà?PLLL›¯£#z÷î­áÇ«wïÞÚ¹s§(“É$«Õ*›Í&›Í¦¾}ûjÈ!ÊÎÎVrr²kj–ÙlVbb¢ŒF£¶lÙ¢ÜÜ\3F=zô販eÎQYÍÍÍJJJÒüùóÕ³gÏõÇ`0è©§žz[R…$«N®Tæ)äðzîþQÓÊB•bù;N ´,˜pÈèÖfÒWÁó+æÔW¼¤ü²²²¿¶wضÑhT||¼êëë]C¿ýµ€®£¸¸8ÕÔÔ¸–ømhhpr¶UWW+!!AF£Qõõõ’$‹Å¢˜˜WÒ›o¾Yƒ Ò=÷Ü£ØØXWÑLçðù††566<¦ÉdRRR’êêêÔÜÜô~_v»]wÜq‡k´g [¶lÑ3Ï<£yóæù [œÁPss³µzõjeeeiÚ´im ƒÖ¬Y£²²2egg·9r8jhhÐÁƒÕ«W/effvÛ•*‡6lØ ØØX=Z‡Cñññªªª ¸À‚ÅbQŸ>}\©±±Q999]Zú›ßü¦Çö•W^©o¼1dÇ7ÊÊÊú¾¤BIõ’šO}Ùܾì§ò Œìnmòó\­Å4«Ý÷mí˜V«UÕÕÕmÞàË`0hîܹ2vßxãúç?ÿéÚ=z´«ø¿¿Ï}Î?ß«j?^ï½÷žz÷î­œœœ >+ mß¾]EEE:óÌ3e2™p‡CÁÎÁó¾±Ràykâ€kíç-½î|íÚk¯u’Å9ÛºÀS°S¿ZÚϽæÙl–ÍfÓ´iÓôŸÿüGÔ´iÓã÷ÏjƒÁ «Õª5kÖ¨¸¸Xgœq†Çˆ!÷ã{sh¶Z­jjjÒ‘#Gd2™4räÈn IRRR’ ƒÊËËÕ¿ð+))IYYY®énÍÍͪ­­ÕáÇ]+“F•——Ë`0´éïÝΰdÉŸ¶ÆÆFŸÿ$ê ÖfKyïãýÃè¯0uXƒ£pO+kiÅ1÷©dF?fyÖrM+Û·oß_˜þZc±X\S§gð㬉ãuºfÍíß¿_Ó§O׈#Ô£G™ÍfY­V8qB%%%Zµj•’’’”‘‘¡øøxY,™ÍfW (rž§®®NõõõJKKÓ AƒÔÜÜ|Zü§340`€ú÷ï¯ââb8qB™™™JOO—Íf“t²fREE…«÷™gž©ƒjß¾}š8q¢ÌæHš°z§FŠÝ"ßieÎúCV}5}ÌûÑ»&‘÷”²Ö¦˜µÔÖ&Ýá»ÔR±ë,g¢C : €îÍ9åÌèX,IRAAŽ;¦;vè“O>ÑñãÇeµZe0d±X”˜˜èšòtèÐ!ÅÄÄÈh4¶ FWݹ>}ú¨ÿþ®eÛ»;gÀf³Ù4räHmذA%%%ŠUFF†ŠŠŠÔ¯_?ú¼EEE5j”8 Ï?ÿ\v»]999jnn–Ýn—Éd’ɪõ°"RkùDÄL $Ã!ï›Ih‘3Èq;±±±²Z­JIIQ~~¾Æï 4 ƒL&“Ìf³Ìf³,‹+À0A¡vÖ:r)§Ã¨T»Ýîš*g·Ûe45nÜ8ÕÕÕÉl6»jí555¹Âž¦¦&Wý½ììlY­V×" ÎifÎûÙžäNfZETX‰á?þŠ;\œŽ3äqŽðq8îÓ½œa…sÁgÐã~œhã¼F£QV«ÕUäÛ9Ïl6kРAZ±b…ÇjßÙÙÙŠ—ÑhtCîïu7 øË-".ò§»„CRàbÔQñhsŠ™3äp~9 ({óžB%!F@¤¯FHÙív9õéÓGyyy«¹9G¹nmYíí4¨øt·ùaŠ”p¨µ‚Ö-¾§#KÙNoÎÈ{ä?|¶<Éû>¸O ó^Ê(¹¿7Zî£×u»„}kmaÉá¿vŠP‚â9GzÁ‹–à§åB ¡ (´Š ¨ÛgQY*'u—p(ØigáÖ­s‹îIÝüF€ÓR·Ï+ºC8Ôž•Ì­[f‘V:èåëÝŸGÓ2y 2´°”}{–µï2Ýaä·ˆOÜ@Ôêv¹E¤j»Åb‘Ýnïê~€(b4%©ÛÝ=rH²oݺUMMM²ÙlL/¢\ii©FŒÑÕÝp3 2™L²X,ÒÉp¨[‡Ý-2¸=:tò`>|¸¬V«ìv;áåjkk•““ÓÕÝp3 22›Í’dÕW‘{nÑmt·pÈ›C’=66V111C§ÄÄÄ®î€Ó˜Á`p}‰‘C]Î!Én2™d2™‡Èl6;‡v@§"ê\m~e8õÍp~SD1çðN“6eŠÀ ‰OPQŒp ŠD1Â!€(F8Ň¢á@#ˆbæ®î:îĉZ²d‰JJJ$IC‡Õ…^¨„„ý^|ñEUWW«ÿþš9s¦$é“O>QQQ‘Î9çåää¸ö]»v­Ö¬Y£œœ }ú¨¨¨H’<¡O?ýT»víÒŒ3T[[«¢¢"%&&ªW¯^®}êëë]¯ÅÅÅ)!!A;vìЊ+ôÉ'ŸèÎ;ïTRR’OŸ7mÚ¤¿þõ¨Šo IDAT¯²ÙlêÓ§JKKµiÓ&íÚµK7Üpƒ$ióæÍZ¸p¡ìv»RSSµÿ~­_¿^Û¶mÓ·¿ým×y·mÛ¦ÁƒkðàÁ’¤={öhïÞ½²ÙlmÚÇßµÓ׆†;vL’TQQ!IJOO—$544¸Žß»wï]—¤ ¾çƒp¨›Û·oŸöï߯#FèŽ;î$½ôÒK*--ÕÑ£G]¡Äºuë$IC† QII‰Ö¯_¯)S¦häÈ‘JLLÔöíÛÕÐР¸¸8?~\%%%JIIѰaôk×.IR^^žfÍšåqþ;wJ’&L˜ Y³fÉn·ëÝwßÕâÅ‹õæ›oºÂ§ææf½üòË’¤»ï¾[C† щ'ôûßÿ^+W®Ô´iÓÔ·o_½üòË2 ºûî»5xð`Õ××kÁ‚Z½zµòóóe±X$Iv»]Ï?ÿ¼|ðAW›·`öñwmÁôuÆŒš1c†$éþûï—$=øàƒ>÷Çýx½®`¿çƒšCÝ\BB‚ ƒöîÝ«O?ýTÇŽÓ¬Y³tß}÷y„………2™Lºþúëe0TXX(I2›Í7nœ¬V«¶lÙ"IÚ¸q£ìv»òòòþ®­©©©Õ¾¶…óÚ;z]Á|ÏáÐi`êÔ©*((ÐÎ;µiÓ&­ZµJÅÅÅúÅ/~¡””QBË–-S\\œ‡Ö­[§éÓ§kĈJNNVQQ‘jjj´}ûv¥¦¦jРAç6l˜«p²$eeeéèÑ£~ûT[[+‹Å¢øøxöäädI'‹hhçvJJŠGû¬Y³´{÷n½ð ‹`·¶¿k;|øp«}m‹P^Wkßs‚Å´²nnýúõš?¾¶nݪѣGkÖ¬YÊËËSSS“öíÛ'é«zC›6mÒ+¯¼¢­[·z´ åææª±±Q¯¾úªl6›òóó}Εžž®sÏ=×õ•ššê·OÛ·o×Áƒ•íS933Sf³Y6lPCCƒ«ý™gžÑwÜ¡­[·*++Ëï>Α=ô8fBB‚®¿þzUUUyŒ¾iË>þ®-˜¾¶E¨®+˜ï9ÁbäP7×§OíØ±Cû÷ïמ={d³Ù´aÙL&effª´´T•••>|¸«x±$ýö·¿Uii©<¨þýû+??_Ë–-Óúõë%Éo8´wï^½óÎ;®í¬¬,×jd»víÒ+¯¼¢êêjmÙ²Ef³YW]u•Ï1zôè¡ /¼P‹/Öã?®1cÆhß¾}Ú¹s§  áÇËl6kÆŒzÿý÷]û’$¥¦¦êÊ+¯TïÞ½µlÙ2Iò).››«ÒÒRêë_ÿº† ¢^½zéèÑ£JOO÷[S§´´T¥¥¥®íI“&©  @ÒɺFêÕ«—F­Ë/¿Üµ¤»·K/½TqqqZºt©–.]ª˜˜?^3gÎtMŸúú׿®øøx}ôÑGZºt©,‹òòòtÍ5ל:vå•Wª¸¸8àè¡–öñwm¹¹¹Aõµ-Bq]­}Ïh Cë»´û8?Ïý=ôÕô6£Û¶óÑtêÑ|êË$ÉrêyŒ¤±UUUχä*º¹ºº: Ÿ:?‘¬¶¶ÖµúV uuuŠoqŸp¦¯mŠëêŽßóÎöù矻V€€Îf0¾-i“¤fIVIM’l§ž[%ÙOmÛ%9¼å¶í8µèÑûyKmmÂȡӈûª`Ý…¿ÕμEÊuÓ×¶ÅuEʽt_¤ˆb„CQŒp ŠD1Â!€(F8Ň¢á@#ˆb„CQŒp Š™»º¡püøñ®î@·tZ„Cééé]ÝbË–-]ÝèV˜VŇ¢á@#ˆb„CQŒp ŠD1Â!€(F8Ň¢á@#ˆb„CQŒp ŠD1Â!€(F8Ň¢á@#ˆb„CQŒp ŠD1Â!€(F8Ň¢á@#ˆb„CQŒp ŠD1Â!€(F8Ň¢á@#ˆb„CQŒp ŠD1Â!€(F8Ň¢á@#ˆb„CQŒp ŠD1Â!€(F8Ň¢á@#ˆb„CQŒp ŠD1Â!€(F8Ň¢á@#ˆb„CQŒp ŠD1Â!€(F8Ň¢á@#ˆb„CQŒp ŠD1Â!€(F8Ň¢á@#ˆb„CQŒp ŠD1Â!€(F8Ň¢á@#ˆb„CQŒp ŠD1Â!€(F8Ň¢á@#ˆb„CQŒp ŠD1Â!€(F8Ň¢á@#ˆb„CQŒp ŠD1Â!€(F8Ň¢á@#ˆb„CQŒp ŠD1Â!€(F8Ň¢á@#ˆb„CQŒp ŠD1Â!€(F8Ň¢á@#ˆb„CQŒp ŠD1sWwÀŸC‡i×®]>í“'Onñ}[¶lÑñãÇ]Û111ÊÏÏoñ=ëׯWcc£G[VV– Іû²Z­Z»v­G[=4f̘§Ÿ½{÷jãÆª¨¨PMMâââÔ«W/5JcÆŒ‘Åbéê.vkü.@ˇ@D:zô¨~üãû´¿öÚk4hß÷ØívÝ~ûíª©©qµ }øá‡êÕ«—ß÷466êÖ[o•ÕjõhÿÝï~×áp¨¶¶Öçrrrô׿þµCÇÅécãÆúÓŸþ¤Â€û¤¦¦êûßÿ¾®¸â ™Íüó½=ø]€–ñ· ˆHÇWß¾}uèÐ!ö/¾ø"`8T\\ì I’ÃáPaa¡¦OŸî÷=[¶lñ †L&“&MšÔÞ#Ò<öØcª¯¯wmÇÇÇëè²þÔ××ëá‡Ö²eËZÝ÷ðáÃzüñÇõ /èÉ'ŸÔСCÃÐC@4¡æˆX>m_|ñEÀý½§´Öèx999JLL ¢‡è.–,Y¢÷ßßõµdÉ’.ë‹ÃáÐ]wÝT0䮬¬L?úÑtäÈ‘Nê Z€ˆuÎ9çø´µ­Y³¦MíŽçï¼@¨¼ñÆ~ËäädMŸ>]×_½.»ì2 <ØgŸªª*Í›7/ÝD¦•€ˆ5qâD™L&Ùl6W[yy¹*++Õ¯_?}›šš´aÿÇ)++Ó”––æÑn·ÛµyófŸýýXBåõ×_÷i›6mš~ùË_*>>ÞÕæp8ôÖ[oéÑG•Ãápµÿ÷¿ÿÕ½÷Þ«¤¤¤°ôpú#+))IãÆÓúõë=Ú7lØ 3fx´mÞ¼ÙgÅ1wkÖ¬Ñe—]æÑV\\¬ºº:¶~ýúiذa>ï?pà€>ûì3íÙ³GUUUŠWZZš&L˜ œœ †¶^ž_•••Z±b…vïÞ­ªª*¥¤¤(;;[ÙÙÙÊËË º ±÷qbcc•ššªÜÜ\?^±±±~ß×ØØ¨ýë_m£FR^^ž¤“+»­\¹RêÓ§ÆŽ«iÓ¦Éhô¾qãF­\¹RåååêÕ«—† ¦©S§*99¹Õ¾‡ê^ïß¿_ü±$©¡¡Á㵆†½ð ®í‹.ºH©©©>Çhï} ¤¹¹YÛ·o÷h3 z衇<‚!gûW\¡ÂÂB-^¼ØÕÞÔÔ¤;v¸¾'ÞBqÿŽ=ª?þØõ;2`Àåççküøñ’Nþ¾mܸÑã=矾233ýþ õë×ÏçwÖé7ÞPmm­kÛh4êºë® Ø·pý.¶ç<þ®}È!*((PSS“Þ}÷]mÞ¼YV«U_|1A4€ˆA8"ZAAO8ôÅ_ø|Ð\½zu‹ÇY»v­O8äo¤‘÷‡µÊÊJÍ›7O~ø¡Çè §¿üå/2dˆî¼óNMž<¹Å>´¤²²R ,Ð|à÷<’4pà@Ý~ûíš:uj‹Çù¿ÿû?-^¼Øïqþþ÷¿+%%E7ß|³®¹æŸP§¡¡AsçÎõh»ñÆ5zôh=ðÀZ¾|¹Çk‹-ÒСCµ`ÁõíÛW555º÷Þ{ý®¾õÇ?þQ=ô¾öµ¯ì{(ïõž={|®%Ðuæääx„C½?~Üçx&“©Åé;ßùŽÆŽëÑæ=rÎÙçPÜ¿E‹éÏþ³OpºpáB{î¹zì±Ç´víZýñôx=;;[™™™~†rrr†CÿûßU^^îÚ¶X,~ápþ.¶÷<þ®ýÒK/ÕÈ‘#uË-·hÏž=®öŒŒ Â!ƒšC ¢[wÈ»†‹wAiu‡Z«7T\\¬o¼QÿùÏ6’TRR¢;î¸C‹- ¸OKœçyÿý÷[|X÷ÜsJJJ|^ ×½FgÞÇÞ½{ûŒž²Z­úç?ÿð=Æ ÓÕW_íñ•••å±O¨îß‚ ôÔSOùCNŸ}ö™î¿ÿþÏÑÂý»êó<òÈ#ÁDÂ!ÑÎ8ã ŸQ»wïöX²¾¶¶V[·nõØçÎ;ïôØ>räˆO(á=rÈl6kâĉ’NþýÉO~âwe(S»ìv»ž~úi­X±"ˆ«úJKç äµ×^Óûï¿ïÑväÈÝy窪ª ú8Ë—/×oûÛV÷Û¸q£Ç´&Š‹‹uß}÷©¸¸¸Åý¬V«žxâ ¶pÝë`tæ}t5j”OÛ3Ï<£Ûn»MË—/W}}}ÐÇ’BwÿV­Z¥çž{®Õó­X±BÿùÏÚÔÇŽˆ„ßÅŽœgÛ¶múôÓOÛÔ7¦•€ˆ7yòd½õÖ[®m‡Ã¡7º¦'­[·Î£huBB‚¾ñoèŸÿü§öîÝëj_»v­† "IúòË/uôèQóŒ7Î5âhÞ¼y:|ø°Çë'NÔí·ß®3Î8C'NœÐÿû_ÍŸ?ßU/ÅápèÉ'ŸÔäÉ“ƒžf4wî\ŸóÄÅÅéÖ[oÕ„ ÔÜܬ÷Þ{O¯¾úªÇH†Ç{LS¦Lqõwîܹ>j“““u÷Ýwk„ ª®®Ö»ï¾ë3Òáí·ßÖÅ_¬ &ìã¦M›d4õÍo~S999*++Ó¢E‹tâÄ ýœõ}.¹äMœ8QÇŽÓ+¯¼â1eH’ ÕÔÔ$‹Å"©óîunn®ëzgÏž­ãÇ»^ëÑ£‡žyæ×öÀ;ý>:ýøÇ?Vaa¡¬V«GûêÕ«µzõjÅÄÄhÔ¨QÊÍÍÕ”)S4f̘ëè„êþýéOò9¶ÉdÒ 7Ü I“&©®®NK—.Õûï¿ïwôWg ×ïbgg×®]’¤øøxMžöìÙSW]u•úöí«»îºËµ_ii©V®\©sÏ=·Õ몬¬ôa4õ§?ýIgu–«mÔ¨QЉ‰ñ( \__¯åË—ëâ‹/ÖÁƒõá‡zÇl6ëÏþ³†.édš»îºKf³YÿøÇ?<öýÇ?þÑj¨qÏ=÷è[ßú–k»  @ßýîw}¦Þ|ÿûß×øC×öÅ_¬™3gzŒô²ÛíÚ·oŸ†Ú©÷:11Ñuý&“Éã5“ÉäzÍ)÷Q’FŒ¡9sæè÷¿ÿ½G¨éÔÜܬ7jãÆzî¹çÔ¯_?]|ñźù曕à±o¨îß®]»TTTäÓ—ßýîwš2eŠk{êÔ©JKKÓßþö·V¯3Âù»Ø™ç6l˜ž~úi¥§§·~ÑИV"Þ¤I“|>Ü»O ó‡œÒ¼?¬­[·Nv»]’ÿpÈYvÅŠ>ÚøÃúpÞyçùŒh­8¶ÓgŸ}æsž©S§zCNþ ô:G$øëïùçŸï~H'‹;Gì8­]»Ög5/wÉÉɺꪫ<ÚÆŒ£ììlŸ}gΜé±Ý»wo¿Å8°ïq¯ƒÑÙ÷ÑÝÌ™3õÜsÏù=¶·ÊÊJ=ÿüóš9s¦>ûì³VûÜžûçï÷Á9rÉÛw¿ûÝ V …pý|töy~ýë_ ˆhŒ/11ÑgIû­[·ª±±QµµµS\ ƒ+ŒÈÍÍUBB‚«¸îñãÇU\\¬Q£FùÔr_Â~óæÍ>}X½zµßÕÍüñ^ª<ç9ÿüóýîÛ¯_¿€…ž7mÚôq’““•——§U«V¹Ú¬V«¶nÝpiôøýÜ·o_"»111~—ƒïß¿¿O›sÄQ¸îu0:û>z9r¤-Z¤¢¢"}øá‡úä“O´ÿþ€ûWVVêî»ïÖÂ… ]«—…êþíܹÓçµ /¼Ðï{âããUPPÐjªPèÊßÅP'--Íõg D*Â!Ð-œsÎ9áÕjÕ–-[tèÐ!ýFŒ¡¾}ûJ:9%èì³ÏÖÒ¥K]¯¯Y³F©©©>upÜW)ó®;"IÏ>ûlÐ}­®®j?…o322‚>“¿âÉiii÷÷÷ZK˜cbb‚êG º8-Õ| ×½FgßÇ@F­Ñ£GëÎ;ïTEE… õùçŸëóÏ?÷¨“$I6›M=ô^~ùe%&&†ìþ¹Oûsji¤KK÷%”ÂõóÑ™çñŽ@¤aZèœS¾Ü}ñÅ>SÊÜCÉwjÙš5küŽp?~[W‹òæ]¨9Ë…'%%µù|m=Ž¿×-]ÞÙÂu¯ƒ ÷1==]—^z©~ó›ßèƒ>Ðm·Ýæ®UTThÉ’%’Bwÿ}^s;÷§¥×B)\?yž–Љ@¤`äèœKÚWVVºÚ UVV江w8TPP ƒÁàšÆ´qãFõë×Ïc÷%쥓+Yyûö·¿íw9k‚ýàì¯nKee¥†Ôû[:ÎáÇ]+³ù{Í[Ïž=ÛtÎP ×½F8îcQQ‘Ï*yÎêÞâââôÝï~WÇ÷)~½eË]vÙe!»þ‚.ïQyÁ¾æwárwÞ«¶¹ ×ÏG$ý@W ݆÷’öÞ5xzöì©1cÆx´¥¦¦jĈ*..–tr„Ä»ï¾ë±ûö’ÿi —_~yÈ—žö7…lÏž=~ 8Ûív½óÎ;mC† ÑYgð8î—÷kÞºªXn¸îu0Âq_zé%ŸZ=ùË_Z¬Sä¯hµs¤J¨îŸs*¦»;wꢋ.ò»¿³º?þFʸ‡ºîêëë[ šÂõóI?‡Ð˜Vº ïQAÞ üÖ·im)kïãæææúìã^xØ[QQ‘¶lÙ¢ÒÒR=z´Å‘îü¯½öškE5w›7oÖ#<âñåü€>~üxŸýß|óM¿çܾ}»OñÜäää.+˜®{íÍß=Ç}ô6,Z´¨Å‘5Ë—/÷iëÓ§¤ÐÝ?ïPU’Þyç555ù´ïÞ½Û£þ—·äädŸ‘4ð(-^¼¸Åk×ÏGWý@¤ ÝÆ¤I“Zœæ(j-Tò~ýœsÎñ™fóç?ÿY¥¥¥>ïݺu«¾÷½ïé;ßùŽ®¼òJMŸ>]O>ùd‹çs*((PJJŠGÛÞ½{5wî\𢮮NO<ñ„ÏûáÒäÉ“}޳sçN-\¸Ð£­¦¦F>ú¨Ïq.ºè¢‹Fw¦pÝëøøxíššmŸ|ò‰î¿ÿ~}ùå—í•••zì±Çôá‡ú¼Çd…êþåççËb±xì_UU¥‡~XÍÍÍ®¶C‡顇jñ%);;ÛcÛápèÁtD6›Mï½÷žž~ú鮟p"ÓÊ@·‘˜˜¨±cÇúµ`4uöÙgû}ßèÑ£Õ«W/ŸZ/ÒÉ%â½kü$&&jÖ¬Y¡@MM®»î:Íœ9S£F’ÙlÖÆõúë¯Ëf³y¼æÌ™A]O\\œnºé&ÍŸ?ߣ}Ñ¢EZ³fÆ/»Ý®¥K—ú¬l6|øp 4¨Åã<óÌ3Z»v­&L˜ cÇŽiùòå>«´ÅÇÇ릛n ª¿!\÷zذaª¨¨ðh»úê«5nÜ8%%%é7¿ùMXîãðáÃUPP •+Wz´/Y²DK–,QïÞ½•ššªêêj>|Øï§ŒŒ WõPÝ¿ääd]tÑEzûí·=^_ºt©.»ì2åææª®®N_|ñ…jkk[½ÎqãÆ©¨¨È£­¤¤D×^{­RRRTWWç•d±XüŽP åõµ&\ç€HE8ºï%íÆŒ°°ÑhÔäÉ“õþûïû=ž?7ß|³V¯^­M›6¹Úô /´Ø¿k¯½¶M¥o¸á­ZµÊgÕµ]»v¬ë’ Ç{,¨ã¬_¿¾Å)@<ð@Ø–%$÷://OŸ~ú©G[mm­V®\)£Ñ¨‡~X a¹<ð€n¾ùf¿uxªªªTUUð½‹E?ÿùÏ=Fù„êþýïÿþ¯–/_î³,û¡C‡µ‘Buÿz÷î­yóæù]¹ËÝí·ßî·H¶»ž={êþûï÷™ªæ®_¿~úéOÚêRïáú] ×y €nʤ½·Ö¡³Ï>Û§ŒÙlÖ¤I“¾'))IóçÏ×ã?®³Î:Ëo=£Ñ¨ .¸@Ï?ÿ¼î½÷Þ ¯ÂS\\œžxâ =ñÄ7nœßó$''ëúë¯×o¼¡)S¦<Îïÿ{=õÔSÓ£G]vÙeú÷¿ÿÁSgßk“ɤ¹sçê{ßûžO±dƒÁ }ûö¹¶Ãq3335þ|=ÿüóúÚ×¾¦„„¿ûDI7 IDATY, >\?ùÉOôïÿ;àÊi¡º£GÖË/¿¬‹.ºÈ'ØÉÌÌÔo~ó]wÝuA]ãŒ3ô /hüøñDzX,ºüòËõÜsϽX¸~Ãuˆ4-Çô;ŽÁÏs}Rݶ¦SæS_&I–SÏc$mjjz>$W Ûûè£"êÀÓKMMöìÙ£êêjÅÇÇ+##Ciii-Énïy¾üòKUUU©gÏžÊÎÎV¯^½:t‹Å¢ÔÔT 6¬ËŠO·EgÞk«Õª#GŽèÈ‘#Љ‰QFF†O`äÝ—pÜÇššíß¿_•••êÙ³§222Ô·oßVGÖ:VGï_]]öìÙ£ºº:eff*--ÍuÍ ,ÐsÏ=ç±ÿܹs†´6›M{÷î•ÙlVzzºbbbÚ|MîÂù»ŽóèÞ ÷%m’Ô,É*©I’íÔs«$û©m»$‡×£Ü¶Ë7zô~ÞR[Û®¡£há8„CÂŽp€Î×ÖpNg§C8ùÿmü?{wUyïüsΙ%ûJdOH¾†€AÜ@‘º´n­½Þ«÷jëµ­­ÚÚVoíõçR­¶¶ÞªußQD”d I ì!BVȾg2Û™óû#™!“L&3“ÉBóyûš×,gû>Ï9'2ßy"""2LaLaLafŸˆˆˆˆˆÜ2cÆŒ>SÚÇÄÄŒP4DD4XL‘[²³³‘=Òa‘—°[ÑÆäÑÆäÑÆäÑÆäÑÆäÑƩ쉈ˆ.3çϟDZcÇÐØØAƒØØX¤¥¥thäf³;vì@`` .\8Òá8TPP€––,Y²d¤CñØ–-[˜˜ˆ”””‘ÅNAAjkkû|ˆèèhL˜0Z­v"»¼õW¯~~~ Err2|||F 2× ½½ÙÙÙ# ý‹brˆˆˆè2Q[[‹>øEEEº¾,jµZäää@Q¤¤¤àöÛoÇĉG8ÒÑÅl6£¬¬ ‘‘‘ òíëÈ‘#X»v-DQÄÔ©S4lÇvUNNJJJ.ëäÐÚµkqà 7ŒºäPNNŽ9µZm÷¹Édøûûãæ›oÆ¢E‹ ÂH„èUÃuŸ9ªW‹ÅY–’$aΜ9X½z5ÂÃÃ}û,~õ«_!..n„#=šššðüóÏãG?ú-Z4äÛ ÖÁƒ„ööväææâÚk¯¶cÓè„^xÁî³ÎÎN\¼x6lÀûᅫŽ,[¶l„"ôžá¼ÏÕkCCªªªPTT„o¿ý'NœÀƒ>8è¤áHýý "òÇ"""º ¼ÿþûe¿øÅ/pà 7Øý²­Õj‘'žxxíµ×ÐÞÞ>‚Ñ’§ÚÚÚpâÄ \yå•HNNFNNÎH‡D£„¯¯/ñÐCaÆŒøúë¯ÑØØ8Òa]öÂÃÃ1}útÜvÛmøÕ¯~???üýïGCCÃH‡FD4¬˜"""å pîÜ9|ï{ßsúkvHHî¿ÿ~455aÿþýý®W__ªª*X,–~×ikkƒÁ`°½¯­­EII ÚÚÚ¼ºMOƒeee¨¬¬´uõpe›òòr”••Ùèê2ÒÖÖf;~gg§í½³²{²+uêŠüü|X,ÌŸ?™™™¨¨¨À… ú]ß:okkƒ^¯wz|ƒÁN7èr ÄÝúrvž©««Cqq1.^¼³Ù<Øpûp÷²v1*,,ôÊñW¬X“É„³gÏ:\îê½Ô;ÆÊÊJ”––:¼Nš››QRR‚ææf—ãtVOîÞgžü}pWbb"î¿ÿ~tvvâ‹/¾èw=g×—'?<¹^­çËÑ8JžÄÝ›ÅbA}}=JJJÐÔÔ4྇ãüÑÐb·2""¢QnݺuˆŽŽv©kBbb"&Mš„ƒbéÒ¥¶ÏÍf3¾üòK8pºZM›6 wÝuüüüìöóË_þ7ß|3RRRðÞ{ïáâÅ‹¶eñññ¸çž{3èm¬±­]»ß}÷m\•J…ùóçã¶ÛnëȲŒµk×b÷îݶmAÀœ9spóÍ7#<<øå/iÛfÍš5X³f àø¢¢¢Ö¡«Û¹[§®ÈÉÉABB"##€O>ù999¸ùæ›®ïN¿ôÒKP«ÕøÍo~Óïñ_ýu”••áùçŸw;öxR_®œçžöïß7¢®®ÎöY@@®¹æ,_¾|PcôxzEGGãÃ?DKK Ôj5^}õUc°?~<ØokŒîÜKÖ###ñÑG¡µµÕV®•+WbéÒ¥hnnÆ;ï¼c—؊Ž÷Þk‹£w ®Ô“;÷™»#..sçÎÅ¡C‡ÐÜÜŒÛ2W®/wþîxz½nÚ´ 7n„ÑhÐ5Õ’%K°råJˆbßßþÝ9ŽÅbÁöíÛ±yófÛùºÎùwÞ‰„„»}÷ù!¢¡ÃäÑ(V__êêj¬^½Úá?úùíok÷^§Óá•W^Aee%–.]ŠôôthµZœ9s›7oÆÿøG<üðÃ}’%uuuزe –,Y‚©S§B’$aÆ øÓŸþ„§Ÿ~þþþƒÚF§Óá¯ý+***pýõ×#==*• ÅÅÅøúë¯QXXˆ'žxÂn@WN‡W_}¥¥¥X¶l222àç燳gÏbÆ xá…ðøã#00>ú(šššðÆo`Ù²e˜1c ,,¬ßúóóóp;OëÔ™šš”––âöÛo·Å1uêTäææ:=ÿ®Öyff&¾üòKÔÖÖ"22²Ï~ÚÛÛqêÔ)\uÕU._k®ò¤¾\=ÏÖ/ï_}õ6n܈©S§âŽ;î@TT”mܦõë×C–eÜxãÃ?TTTà믿ƕW^‰ŒŒ øúúz^‰½â`7k™'÷TUUaÛ¶mX¹r%’““ÑÚÚŠM›6á‹/¾@XX6lØ€ØØX<òÈ#ðóóCQQÖ¯_×^{ O>ù$$Iò¨ž\½Ï<)Ó`]yå•ÈËËCQQ233¸~}¹R.wö×Û¦M›ðí·ßâ–[nARRÚÚÚpìØ1lذxàìî_w³~ýzlÞ¼×\s ²²²€‹/bíÚµxùå—ñë_ÿÑÑÑ#z~ˆhh09DDD4Š•••€Ã/ó®Ú°aªªªððÃ#55Õöy\\f̘—^z ü1~ö³ŸÙm·gÏü÷ÿ7¦L™b·M||<^|ñElÙ²¥O‹w·Ù´i*++ñøãÛͲ‡™3gâÿ÷ñùçŸãßþíßì¶)//ÇÏþs»nv&L@FFžyæ¬Y³÷Ýw’’’l¿–GEE!))iÀú’$iÀí<­Sgrrr Š"æÎkû,338sæ ÒÒÒnçjgff⫯¾Bnn.V®\Ùg?‡†ÅbÁ‚ \ŽÙUžÔ—;ç¹££{÷îÅÂ… qÏ=÷ØÖ7nâãã!Ë2¶lÙ‚åË—C¥rÿŸ¿žžïüü|<ôÐCvçÆN: «.¬<¹— //?þ¸Ý ö©©©xòÉ'ñÖ[o!33Ó®N'Nœˆ€€¼õÖ[8vìfÍše[æN=¹rŸyZ¦Á²þ½-//Gff¦Û××@åòôzmmmÅÞ½{ñøãÛµšËÈÈÀ„ ðÁ //Ï–Ðr÷8f³Û·oÇ•W^‰Ûn»Í¶~HH|ðAüÏÿüöìÙc[6R燈†Ç"""ŬãV¸Ó¥§ÆÆFìÚµ ÙÙÙv_Ö¬"##±bÅ Ú¾pZ¥¤¤8üR›ššŠøøx”––öYæÎ6ÍÍÍØ¹s'V®\i÷ÅÂ*<<«V­BNNŽm\¦¦&ìܹ‹/v8þRdd$–-[†ÖÖÖ!7g0uÚEQ››‹ŒŒ »_Ù§M›___§S»Zç¡¡¡HMMEnn®Ãýäææ"&&±±±.Åì*OêËÝóìïïgŸ}wÞy§ÃfÍš“É„ªªªa‰ß*--Í뉡’’|þù爊ŠÂÔ©Sxv/Yeddô™ÝP¥RaÚ´ie‹/™3gB»nmÞ¾/S¦Á †F£± ìïíëËÓýét:\}õÕ}ºS@vv6âââðÍ7ßx|œúúz˜L&‡³]†††â™gž±%†FòüÑÐ`rˆˆˆh³êiw”³gÏÂl6㪫®êw¬¬,øøøô,×Ñ?ø­¢££þƒßmŠŠŠ`2™œ¶T™>}:€®î9pæÌ˜L&,Y²¤ßm–/_ŽGyÄë]£¬S§ý)..F}}=æÏŸo÷¹J¥ÂìÙ³QPP`_¤7wê<33555¶iV(..’VCžÔ—'çY’$¨Õj‡ëZëΓٽs¾'Mšäöñ€®Á}¿úê+»Ç‡~ˆ_|Ï=÷$Iƒ>h+»'÷’•£qÀ€®iß®V&½iµZøùùÙ Nííûb0eò»A›½}}yº¿¬¬¬~÷¹hÑ"ÔÖÖÚwŽ3nÜ8hµZìß¿ßáÀï=ÇéóCDÞÇneDDD£˜õãõõõ-Huu5ÔjµÃ/xV*• ¨©©±ûÜYBJ¥R9œ‘Æmª««¡Õj‘ŸŸï¬EÑÖBÁ•ò µÁÔirrr Ñh0sæÌ>ËæÏŸ}ûöáÈ‘#}’G€{u>gÎ|ôÑGÈÍ͵kŸŸAlÝQ¼É“úÌynkkCee%ªªªlcv9sfXãïù¹'ŒF#víÚe÷™,Ë0 ÈÊÊÂí·ß»ݽ—ŠÑ:HqIVA (Š] Þ¼/S¦Á2hmmu8˜²·¯/wöçïïït€gk Óºº:»´]=ŽJ¥Âm·Ý†>úO>ù$æÍ›‡ôôt$%%ÙoŒìù!¢¡ÁäÑ(fÀ´¶¶“'Ov{ûÆÆF ØŠ&$$ Åè©ÆÆF˜L&lÞ¼Ùéz¶©µ]-ÏPòvšÍf:tjµo½õVŸåÖ/àt˜r‡V«ÅÌ™3‘ŸŸ[n¹ÅV†ÜÜ\Lž<¹ÏJoð¤¾<9ÏUUUX·nNœ8‹Å‚ððpDFF"&&3gÎÄÇ> ³ÙŒ¼¼<Ìš5«Ï˜"ÞâI}¹{žëëëÐoò´¸¸xXã*Z­+W®DuuµÝ}ãɽämƒ­§Þ÷ÙH”IQ|õÕWhmmÅŠ+l÷ä`®/Gw³¿ýû÷÷»lïÞ½7n‚ƒƒ=:Nss3>ìp]___¤¤¤ØºކkŽˆ¼‹É!""¢Q.$$K—.E~~>^ýu‡ã7X,lݺ7nÄ¢E‹lÓg‡‡‡cÉ’%øî»ïl]%zª««Ãúõë1yòd¯O¹=qãÆañâÅØ¼ysŸÙ³€®2}ðÁxüñÇÑÖÖ «<‹/Æž={–§¡¡Û¶mCpp°í‹õõ… ÜŠ¯¿í¼Y§ùùùeÙ¥±„æÏŸŠŠ ¯ îš™™‰ŽŽ|óÍ7¨««s:Ò`yR_îžç & ­­ÍaÝÔÔÔ`ÇŽÃÿPÊÎÎFDDÖ¯_o›QÊ“{ÉÛ<­§þî³á.Scc#^~ùeìØ± ,°›…Ë“ëËÙßO¯×   ìÞ½ÛáL‘»víBEEn¼ñF[·>wsüøqüãÿ@QQQŸõF#Î;g›ÑÓó£ÓéÕÍ“ˆ†»•]V®\‰ÖÖVìÙ³¥¥¥˜>}:âãã¡ÕjqñâEäååáÂ… ˜>}:î¼óÎ>Ûž={¯¼ò –-[†´´4h4cÓ¦MP©T¸ãŽ;F¤\«V­BII žþy,]º“'OFXXª««ñí·ß¢°°·Ür‹Ý@¬7Þx#JJJðç?ÿË–-CFFP\\Œ 6@’$üà?°­¯Ñh‘‘={ö ((ÑÑш°+„³í¼U§À¸q㘘8àºóçÏǺuëpàÀÜ|óÍ®ïLll,bbb°iÓ&„††"55Õí}8šQ«·Y³f!88Ø£úrç<Ï;›7oÆ«¯¾ŠÕ«W#11(**Â7ß|ƒ%K–`Ë–-n—Ñj4ÝC’$aõêÕxã7°}ûv¬X±€g÷’·yROÎî3o—©÷5+Ë2ÚÛÛQYY‰Ó§OC–e,_¾«V­²ÛΓëËY¹<½^LJéÓ§ãùçŸÇÊ•+‘œœŒ¶¶69r»ví”)SìÍîgþüùرcþñ`õêÕHKKƒ$I¨¬¬ÄÆÑØØˆ{î¹Ç¶¾'ççÙgŸEMM ~þóŸ{Wf"rŽÉ!""¢Ë€(Џûî»1}útlÞ¼»ví²Íbem9ñÀ87ÆÏÏ=ö>ÿüsìØ±ß|ó @­VcêÔ©¸ûî»ûÃb¨ùùùáÑGźuë°{÷nlܸѶ,::÷ÝwæÎk·¿¿?}ôQ¬Y³ÆÖZÊjÆŒ¸õÖ[û̺õãÿo¿ý6Ö­[¸å–[°téÒãëo;oÔimm-JKKqà 7 ÐÕ2#)) ¹¹¹X½zõ äÎÌÌÄ—_~‰ùóç{´/½^?à M“&MBpp°GõåÎyÀOúS|øá‡xóÍ7mëáÎ;ïÄ„ •m÷М9s°uëVlݺ‹/F`` G÷’·yZOÎî3o–©÷5+Š"üýýŽk¯½W\q…Ã.Xž^_ý•k0×ëòåË_|ñŒF#€®._Ë–-ëówÁÝãhµZüìg?ÃgŸ}†?þØ®K\||<~øa¤¤¤Ø>óäü„‡‡£¹¹yÄþŸCDýë*ÁïGpðÚѳ€KÝÛÄï­ÏR÷³ªû!Ðt¿V˜n4ßõJ)ˆè²·mÛ6—¿h]Ît: Š"¢¢¢ R¹ö{¢(¨©©Éd„ FtJxGÐØØˆððp„††:õèú²wá‚€èèhøúú:]¿­­ mmmˆŒŒt¹ÎÚn´×irrrðöÛoã©§žÂøñã‡í¸žÔ—;繡¡µµµÀøñãÝ:Ï®¸\η»÷’·yROÝŸ#]&k î^_ÎÊåéõj0P]] Fƒ¨¨¨ë×Ýãèt:ÔÕÕA–eDDD¸Ô:ËÕóc0†lŒ3¢‘"Â=Ž000»_›Xºß[(½žÑã½Òý¾¿çÞ¯}æ^»'ûarˆˆ†“CDD®yùå—ÑÑÑ'žxb¤C!""º¬ý+$‡FçODDDD4dNŸ>ÂÂB\uÕU# sˆˆˆˆh èèèÀÚµk!Š"rrr””d7#]L5558{ö,DQÄâÅ‹±råÊQ;^ /&‡ˆˆˆˆÆ€ÄÄDüáé0ˆˆˆhâÏEDDDDDDDDc“CDDDDDDDDc“CDDDDDDDDc“CDDDDDDDDc“CDDDDDDDDc“CDDDDDDDDc“CDDDDDDDDc“CDDDDDDDDc“CDDDDDDDDc“CDDDDDDDDc“CDDDDDDDDc“CDDDDDDDDc“CDDDDDDDDc“CDDDDDDDDc“CDDDDDDDDc“CDDDDDDDDc“CDDDDDDDDc“CDDDDDDDDc“CDDDDDDDDc“CDDDDDDDDc“CDDDDDDDDc“CDDDDDDDDc“CDDDDDDDDc“CDDDDDDDDc˜j¤ ""¢Ëœt¶È0t(°ÈÊHGCD4&‰’­¿ß`F:"ºÜ09DDDDƒÒÙbAg«e¤Ã "Ó,²‚ÎVàÂ"DäþÕ ""¢A1t01DD4Zðo2y‚É!"""v%#"=ø7™ˆ<ÁäÑÆ1‡ˆˆˆè²£˜õ¨=öw‚ˆqÓ€(iG:$"""¢Ë[Ñe§ñì—˜4%Ò#ÑtfíH‡CDDDtYcrˆˆˆˆ.+ú¦Rˆú½˜´± é÷Bß\6Òa]¶˜"""¢ËJëù5˜8ç*@‚¾1³²ÑZüéH‡EDDDtÙbrˆˆˆˆ.ºú"h5eІ¥CÑŸ¢/‚ϸiШK «?3Òá]–˜"""¢Ëƒ¢ µäÄÌXE°‹Šá<&Ì\ŒÖs §p&"""r“CDDDtYh¯=ŽÀÀzhƒb}iW"HQ€ÎhC’áXŽÚ#&Ñe‡É!"""º (h/ùQSB1”Š€ÒõPŒP åˆÎX€¶’Oº?'""""W19DDDD£^GÍI†¶C00T–²> åÐÅ! ¨5'G6X"""¢Ë “CDDD4º) ÚK?CdÚlÀP(æK]Êl3`¬DdÚ´•~Ʊ‡ˆˆˆˆÜ 鈈ˆˆœé¨=¿ÀFhüç…ý÷3Ö@”†¿ÃÐÕŸ†_Dú°ÆéÈ'ol€AoÄê»®EpXà€ëçí9†ÓGKðß®Ô:îX÷ÁvXd ¾÷£ë ‚ݲ¯>ÜVå·.öʱ\§¥© Â#C‰éóÒ ICÿ»æº¶# È×®Z8äÇ"""-ØrˆˆˆˆF-E± µäcD¥Nb¼E±@éï?Å ÅTÈÉéh9÷Å2¢±Ÿ?S‰œo `ÿ)ÚïÚ@Ù•¥5(È95èuÜqêH1¾Ûœ‡öYVxôΞ,õÚ±\§ðÈ9´5w ¹¡wÅ»¯|‰Ÿø'ª«êÝÚ×ÁÝGñ»^Fsc«[Ç/.,s7l""¢Ë“CDDD4jµUå! °Ú€PÀÔè ;Y¯‡±Ú (\Dû…Ã#{þÞãPkU˜”8y{Ž÷»žE¶Àl’îË•uz“e ô—×ßðÙ.\¬¨uy}£ÁäV<ÄOw7þûÉá?ùÝÝhoÕáÝ¿¬…ÅÒ·éXe5Lhkîpk›žª÷öa6É0™ÌN1”õHDDä*v+#""¢QCQ,0w6ÁØ^cK1ŒÕ_ iá,(¦z®´’¡˜6çöÿfݭІ$C•Oax~“e r 1uN*’Óã°æŸ›p¡¼1±‘¶u z#Ö¼µGÂl–‘yåth´»ý¸²NoMõ-øôŸQtì<‹‚qÑ¡¸åžeHŸ™Ôï6ãc#`4˜ðþß¾Â#¼’Jr¸žE¶`ãšÝ8°ó:ZuÆ·_…Ù §¾Û’‡uïoÃcÏÿ'¢bÂxøoеwâ_ÿ$ID{k~ÿ“¿àº›¹Ü]-%#ßûádgÅ IDATux÷/_â𓘻hê€eýüíÍØ·½+AøôÃCbÚ$<ô»º\?[×íÅ–/ö@0yjîøÏ• p©Ž«ÊjðÙ›Qvî .yîzàFDŽw©‰ˆˆ†[Ѱ³˜õзT ­êšŠ7 þÈ_P}àQTíº­ÇƒØô*Âv"yAT>€Ü6ðNK×ÃÜ•O’³R¸hø+Z?† ;ÿÕEý‘¿¢¹x#Ú/†¾¥³Þëå+3Ï<ò Ý WÖéMü䉻`4š6.ÐÙ¡Ç»ùç«‘’×oÌ “'áš³°ãë˜2;‰“'Ù-ïhïÄÞm‡°üÖŸjÅ]-zÊŠ/à»ÍyHJ‹EDt"Ƈ¡èÄyd/›‹¢ã% „ÖG¢ãç‘8yN/b“bܪSQˆúš&—ËÙÝz)qò$Û:®ÔEQpß/¿­Ï¥VZkßÙŠÒ³•ˆO™ètñ)ÐPÛŒ9 § mzˆMokåJ= 7&‡ˆˆˆhHÕù$Ó!„Djàµ<$mW· »$ºAN»)—ž•ÞI!\ÚV1²¾Ç¾º–«* ¾þ€(!B¨`6ê`ê(ƒ®¹-EZ5ó1óAÊ«×pâð¤NI@]u# 6)§–àìÉ2¤NGíÅ(©SâmÛ ”6 µ]ÉWÖqD£Õ ¬øvm8ˆš õ¨(¹h‹k Ëo]ŒÂ£çðÁß×ã±çî³[V]Y‹Ù‚“‡‹QÞÝ] ÚZ;`2^7gʬdØu‹‚3'Î#}F"|ý}Ptü<–ߺgŽ—"cfRŸ™Ñ\¡ëèD`ß ÊêÊ6“ÆÛ%†R2â»ê ªñ)îC­Va^ö4ä}w¥ÅUHŸ‘„ôIȘ•ìV= '&‡ˆˆˆhHYô;5Úàq€¬`r! Ô›5déõÝŸu¿î“0R.-ƒ¥ë¥¥{ò¥õT  TÃ78 ~¡Í(=]åai#¹§a6Ê8UPŒSÅvËò÷GêÔxX,ý”½GÂÄ•uz3èxñ·o¡µ©ÓçMÆÔ9©˜2+kßÝêRì’JÂÝÞ„?=ñO|ùžý6¹+žˆñaˆˆµ}>)q<´=ÆAʘ•‚]sQz¶gO–áöûVÀ7À»7å¢ìÜ47´Ú%î¸XQ £Þdk äIY=­k•[d‹Kû¸ó¿VaÖ‚ œ,8‹3'K±wë!¤ÏLÂýÞîr= '&‡ˆˆˆhH§Ý²#¿Còˆ*.l嬅PϤºÆ²mã()ä`½[Á@„ÙØòuö´‡¥íJùùâÁßÜe÷ù׋£¹§që¿]o˜¸øt9¦ÏO³­sþL¥íµ+ëôVz¶ µU ¸û§7ÙmvwÚûñ“"°òKðÕ; ©DÄ%wu±‹š0€è˜p\³j¡mýÚ‹ ´½OJ…ÖWƒ­ëö 7"uZ45$•„o>Ù Q6=Ñ­˜ŒÖ¾· Z? æt—˲ZÌ·¶©*­†Ñ`‚F«–w×Aø€ûe ꫟:Ñ–ûô 8ðí4Ö5»\DDDÉÉ!"""R>!q0ÆýJòþŠ„ùó!‰>Ý]¾zëÝ*¨oRH±.w¸z$Ь‰£Zu¿–|`‘%œ?Rß„ŸÃ'¤ÿ±yœinlŹÂr,ºv6&ÄEÙ-›åtœ>Z‚‡Ï`vÖÌÈLþm‡0.2qÉ18¸ûšZmë… ¸NoÝ]®ŠŽ• !e"š[±ÉÉÓýYrC&N>‹s§. €yÙÓ°õ«} @lb Μ(ÅÚ÷¶âŠ¥spË=Ë’$bò´Ë-B|êøùûèêšuª I±ðõóqzüÖæväì<Ò•h©i±¼ÓhªoÁî[a›1Ì•²w¯»sc,™érýX, Þýë—¸vÕB4Ô5cç;‰ÄÉ“p¡¼Öé>ÚšÛñ죯cò´ÜxÇÕ0ê(-®‚¯¿!aT’KõHDD4œ˜"""¢!4i!Ú3ÊòÿñóæC-€Åš ržìqšê/Ùƒ]ДþHÝŸ X,”-fâO41ËãrÚwŠEq8%ùÔÙ©PkUÈÛs³³¦àûÿqÌ&3¾|‹‚éó'cá5³±{ÓAÛ6®¬ÓÓ„¸(\·z¶¯ß¼ïŽ#$<Kn˜uïow«‚ à®Vá¹Ç^·ûüÖ»’JÂ'¯o€l¶@”ÌÍž†Uw\c·Þ”Ù)8–[„´é—f$KŸ‘„SŘâB—²úê&|òú¢€ð¨LŒÆ½?¿Õ.áæJY§ÌNÁ”9)Ø·í0Ο©Ä£ÏÞçRý¤NǸ¨0¼òÔ»€Ä&ÇàG?] A—B½<À¥$P?Éž~“HÝSÝÛžˆ>PÄ ”-ƒ}?‚–zTƒaÐa2šm­Z<]§'½Î]‡aÁÞ ÓŽ,[ÐÜЊÀ`[׫‘âJYõ¨T*¨Ô’ËÛXד-øøº}\‹EAsc+Ôjƒý®3šê‘þµ„Åòz"N‚ Üàºú©›ÈݯÍèúŒK%ö|F÷=årôÜûµ³ÏÜ–CDDD4lB¯C³Å„ŠCïcÒ¬™!ŠÊ€-~˜Ìn¹Pä^‰ ÿfµPà²ceÇÝ;"‰!ÐúhìfÆòtž|ü´ðñÓ6´~I’ˆðÈ!Û¿;\)«¯ýrWëÇÙ:íCÛT÷ýMõHDDc“CDDD4¬B’o@ó9 e‡ÞBÜìé# tO#® 4î`÷#›bóÀ‰ ÞD-!¥ÇË!Fþ;B’ØâˆˆˆÆ.&‡ˆˆˆhØ…$-C‹(áüá·03̀ŀ¾I!ôHü˜{´’{$’Ü$jaAÊŽWAŒ¸!I˽R&"""¢Ë“CDDD4"‚®E3€’‚"qF‹±;dîñìbk WˆÈŠ?Ê_„óŸN¸Î;û%"""ºŒ19DDDD#&$áZ´(?ñ&&¥G@ÛÅõ®]ñÿC» A€APC¯3êHHåïïb~¶øy¯ˆˆˆèrÃä¨à„kÑdêÄ…¢·1!m<`¬‡×Z hS€ïz¢ Bº&LUEÆ_>yÏkÇ!¢)Šb»/Wÿ e "êÉ!"""q!)+P½w dƒ’ÝL®ƒ§@A¥aLh`Q,P AP¼xœžj›p4÷4êZàà‹Œ™ÉˆO™0$Ç,ƒÞQ ÖôúÚÙ²Á’Í26¬Ùm{臨‰ã>#Éå/Þ®Æg=Vöus:.hPq¤ß $,é3“ú,3è8|à.”×@%Ä¥Ä`ú¼4H’8äqYë7ëêYˆˆ í÷¼4Ô6áó··à¶_>àLnVEÇJPr¦K¿w…]Yöl̓F«Aæ•3¼Z oyzêY†à€‰ëŠˆ†þÿDDDDPD@Ð5™ƒ™Ê<|(гœl‚Éb´=Ì3¼™„²*/¹ˆÏþ¹ :#R3â!I6~¶ ÇòN{ýXÞ°å˽ÈÙuÔíeƒeQ”_@P°?bÇC¥QáணøüíÍͲKûp5>뱌ã`ÃQµÐÜØêpÙ7ŸîDIQ’Óã0)1‡÷ŸÂž-y×µ~õº®Yû;/!aAX²"Á¡.ï;>e"ªJ«qôà¥û§üÜË=ƒ„Ô‰ƒÞÞåé©gþU®+""€-‡ˆˆˆh4P,°ÈÍT~€Ñ» E±t%‡#€KÝÊDÁ‹âíc)ؽ)3“qåòù€ìôGή£˜2;’$AQœ9QŠºê cfÔ5:uzÉ)Ä´¹©8s² z³’ät™õØgŽŸGmu#‚C1eV2$•ÔgYPpÒg&A£U£èÄy4×·@¯3 ïq̽bš­,Ž–õwo”U¢¾¦!áÁHŸ™•Êñ?;“Òã0)!0?{:>úÇ×8|àæeOsº/Gñ t\£ÑŒCûOÂÐi@rF"LJ»s{k –Àd4aRÂxLJ?`»RSÙ,ãÄá³hmnGrzl¿×®£ËëpÓÝ×Úê2r|8ªÊjŒáü™J´·v`ÚÜɶ2åì:ŠÔ)q u¹ŒVή)£Ñ„ÆÚf˜“'Àh°8-»•ÖWƒ¬«gaï¶CH›‘_ìÙvSf'#r|ø€÷Òì…S õÑt•kçdÌL†ÆG#9…H›ž„ÓÇÏ!qr,¢bÂ{Å¡že»[2õw]Ycè}œ®‡žëëÚ;Ñަô9©¶ósp×Q$gÄa\¯VMDDƒÁ–CDDD4bE,ËеÖ@­¶tÍL¦(^}(P`²˜`”0Y#LŠÑëÝÊZšÚÐÒØ†™™évŸg.ž;î_¡;9µù‹ï»û(T*Ξ,ŧÿÜ³É }§‡öĶuûÐÚÔ†óg*ñùÛ[`4˜œ.³îópÎ)h´jœ<|kßߥ;ùµù‹ïpð»cP©U8}ì¾xw ,²*I‚ Š]]€ÔöIGËú‹»'“ÑŒÏÞ܈ÓÇKàãçƒ# ±ó›ƒ.ÕŸÖWƒ)³SPz¶rÀ}õŽÏ•ãîÝ–ŽVÚÛtøü­Í¶ä‰³m z#>}sꪡѪ±}ý~;7`»RÓ¯>ÜcyEP©$ìÿ¶Í mŽëÍG _Ë;†ÚfÀ¤ÄñXpÕÌc{¶äàïjýRYZƒÃNÂ/À×å2öäìš²–×h0Xöž2f%#t\0|{Çó‹ÐÙ¡GÖU³lñ9»—z¶ê9´ï$Z[:lË6ñÚZ:ú-‹#ŽöÛßuåè8®\=×{·æÃd쪗ª²Ú~>nÅMD4¶"""¢agM Y,2, :[.ÂÇ·{úz6Šüñp1-2]½ÓºŸMZuW2H6YŠ&˜¤<¹ãv(JWšHQºº¡…j&á‘+_t{ÐÙ–Æ6@‚Bì>%Á]ŸUWÕã\an¿ÆE…B–e¼ù§ÏpêÈ9[‹”©sR‘2%-Ííxÿ¯ëP{±þ~ý.S©U()ªÄ~ºÁþ˜µ ÿ|ésT–Ö@­–p®°ßÿ刎٠2³û(tz$¥Çâä‘b„†aFfš]̽—9‹{ú¼É¶í$IIJï]ˆñá$­¹»¹\‡Á!]õ8À¾zÇg‘-7.) ¯™ 0L8¼ÿ$&ÄE9=Ž®CÎ=æ,šŠ¨˜pLž–I%¢ºª¾ß:·¶Þqµ>SIq¡¼wüç „Gvãóæ‹kÖ™$‰¸ùGKqð»£øäõ  ñÇ´y“1eV Ô•Ób“b õÕàü™J¤MOĹÂ2Ä%ÆÀ×ÏÇå2:»nâ¨ìãí÷-®¼~>>g3T* W, ­¯Æ¥{É™¹ÙÓ’7àzéïºrtW®ÓÞë«5j”ž­BÊ”xœ+,Glâxøùû:n"¢ž˜"""¢aÓ3)Ôõll‘¡o¹€ ?ŠEîÊô¸»_õ²?þþ“¢ @èñ(îØ£Åx)7Lø¯›î·%„,=žß^÷Å¥D’ü|Ðwàëçø—ýúš&øøjl]B$IBôÄH4Ô4Ù¾ÐFO +Q"©$˜ & {˜GËšÛ ¾ùd§Ý±ëš!©$h}5ˆˆÐÕ:çÊëç¹]6gq÷$J"ÚÛ:q,?jª`è4ÀhêÛ¤?:~¾nïË•u'ôH:LˆÆÑÜÓn„)sRðÅ;[Фô8L›“Šúš¦~ë¼gâÄ•¸Ó>¾„GvÕ·ÖGã´Qè¸ \s6:¯×£ätí;òs°êÎkœÆ ŠR2âq®° “§%àÜé ,î¾>\-ã`8¼ÖˆšޤôX4Ô4!£{@nWî%§Çv±+Ù@ú»®Ç¥ë¡×ú)SâP\X†äŒ8œ;]ì¥s¼7QOLѰ°&‚,rWbHîNɲ sûhc|‹Ñ£ä@Qp¼itr$Q„(Š¢(B+ú¤˜ì¦²W„ä7¼‹¢tÇfÅbŸ4Îi·gBà֨p®°Sç¤Ø>?_Tü}'°úîë õÑÀ`4Ád4ÙÆëioÓ!"ºÇg‰)Ë´Z5DQÀõ·.†JuiÔ­eÅU0L0LÐúhtu•Rkº¶q•Kq£k@î-k÷àê`Ñ5sP]U‡Ík÷¸|œâÂ2DÅŒs{_®¬ÛÞ£ Q[K;´ZKÛ^uC&æ]1 Ue5ÈÛsu͈KŠé·ÎÝ®GçÔGƒÁƒÞh3§½Õq¨–¦6Tž¯FúŒ$øúù`Êìøøk±iÍw0›Í¸P^ç4†ÉÓ±öÝ-(=[³YFBj×Ìzή+¯q# ëà‹Î½í>vvMZý æîgI'/ÍFßßuåè8ž\iÓñåûÛPQr&£ “‡f n"Û8æ 9G‰!³Ù ³Ù Y6ÃÜq¿@1ÁµYȨƒ•uðÚîYÉd3̲Üõ0›mÏ:S;̲ “ÙÜõetš:`²®Ûãa’Mç§TjæfOþ‡QxäZšÚpæD)vn:ˆà°@¨5*LŒ‚J¥Âñü³P%ÑTß2¨™—&ÆGCT”\@`p z¶®ÛƒÞˆ‰ ÑP©U8–W‹EAщóxóOk k×uU£ZBc]‹mÌ™žz.s5îŽV´>$MŽ…J-áÔ‘sNcïhÓ¡¹±竱á³Ýh¬k±MO>оzÆçÊq žƒAoDKs;ή@lÒøS]Y‡ÏßÞ EQ2%‘1ahnhuZ烩«˜ØH’ˆãùE°Èœ9YŠÎ޾³g]ÉÎ]›rq`çt´w¢¡¶ gŽŸGpHT*Õ€1DÅ„#0$»7ç"9=Ö6·«eìÍÙ5åMήɀ ?ˆ’ˆ#9§ÐTßâѬ{ºŽN´µ´Û²lq¸^ו#ž\QÆÁ?л7å"9#®ßÁ݉ˆƒYˆˆˆhÈY,(Ý-sä]ÊÅY–}5Ô> €Î4@Ë!P‡BÐŒƒlÒ ùE@1ÖCQ“Ù³EîžL€`±@E@Ÿñƒzv'³¶²X,0Á4¨aªgge@Eìÿ¶zH* é3qÅu]]A|ý|°ü–lìøúrv$ È^:ã'E¢©Áñ4åñõ÷Áõ·.Æ·_ÀþPkÔ˜12ƒýÀv¼ÜïŽA¥qåòùêZ6uv*¾ý&ü}=þý·Úí·÷²þâî)1mŽåáÍ×@£U#)­ÿY¶`ûWû òGÔÄq¸óþòsi_=ã»ûÁU7>e>|íkèÚ;›4sMð8ãÄO^ßY–áç7gXçžÖ‡•Ÿ¿/®^™…r»ûâS'ö›t µ7faïöC(8p ‚ëo]ìr iÓ‘³óÒ¦%Ø>sµŒ½9»¦¼ÉÙ½‹®}Ûã\Q²®žAr¯©Ð¶/÷Ù½¿íÞë¡ñÑôY¯¿ëÊO¯‡ÉÓ»û®¾1Ë­2¹ÊK)îGpðÚѳ€K-˜Äï­ÏR÷³ªû!Ðt¿V˜n4ßõJ)ˆè²·mÛ6Üpà #јÒXî|<k‹k«!³l¶u'“e3LÍÀ™ß #+JÛ©~öÒÒFÂÐÖŠÊâ*\¨îšN;&Ú„˜¤üª éW$ ÓÒbëNf{H#ùÂlÑ‚`K>©Dåή‘ÅbKùˆÁ8yP³×a›]ÌSøøhúØZ×Ñ _?·¾vzL>¾Z‡ûÔutÂÇGk›‚»'³ÙÜo‹„ÞËŠ[QèÚ;áëïëV×5O÷eÏ•uE±ëbçêqEA§Nï°ÜÎêÜÕ2ô§¿xG¥V¹]¾ TFGœ]SÞÖß5)ˈ¢àÕ{ÌOΓ;ç¢ §ÇrOãG­v©,a±ê×!"ïáǘ˜ÈݯÍ,Ýï-èjÝó=Þ[Ÿêï¹÷kgŸ¹…-‡ˆˆˆhDÉú&ø°˜Ñ÷ß6M ‚¡½ å' QUŽV¿Õ£&AÐÔ^ŽÊƒ{ÐiÐÁO ‡¿jœ-1tµê07À$÷¯EQ Vi¦o›©Ì¢(]­›ŠÒ蕲ùú:›e(fêo ìŽçìK|ïeÅ-‚mvµÁre_Öø\YW‡_àÚV„~Ëí¬Î]ËÙ¶®$:Î`ÏÉ@etd8»?õwn$‰Ð¡à­óÔ›,[°qÍn\(«Æµ7-ò$]LÑ¡{zù¾Qa1¶À/@è5µA3ð‰†±³ŸÆ…š@´Þ LJ†FmÐhÁ'Jp¶;¾Ü­Ê­Ÿ/D•°˜ M˜›=&³Ù..“`ÆæïŽÃG„î6BÝ-‹ÆùÆw婸=ŒˆFl–‘œ‹…WÏ´Í\GD4˜"""¢!'Š"(’ÒÕÌ:æh¬‡Ö_‚b1BQA3‚ïu-¨=qê‚`½BÒdø*—¶³%‡ºM÷ÌøD°4Ÿ†¶éÄ„5 21¿ÈˇIîˆúÒTö€Y0CkÃSWI” IDI‚$JEÎÙAD#O£U#}fÒH‡ADc“CDDD4ä&[T݉K T>~€*bÈlÛQ{â(jêƒ!GÜ )}:|!v`mŸ²²k4~Äñ³p¡á8jó7@ßÖ“¹k¦²žSÙ›€ÄÄyLѰE‚ @¶v1“ˆ‚  úÖvÔW¡¡%âøà;kˆ¶£EH¡Gw5íÄ,3aÜsW×,f²l[_`LP A¥RAìNq<"""‹˜"""¢a#B÷¬RDQ†Å"Ã7rΟÎä)ê.„¦¥Á¢ˆPKÄPßîdJ÷àÕÖÅìÇ3º”Œ5A0ˆ>c™…®d‘ZÝÿlbDDDDc“CDDD4ìz&‰B&ÎCЄwºf ³>ìCJŸGût4ൠŠPE @Ñ5à4ÐcàkCDDD4æ19DDDD#FH’ —©–e º¦•ï/1¤ôšòÞqë¡®G„o<Ž,…(Ú'ˆòO†RnLѨamQÔ“-!äFË!ë{øÝ²¿ aÄDDDD—?&‡ˆˆˆhTëì!""""ïâ\­DDD4(¢Ä¤ ÑhÁ¿ÉDä &‡ˆˆˆhP´þüçÑhÁ¿ÉDä v+#""¢Añ îú"bè°À";ˆˆˆ†–( Ðú‹¶¿ÉDDî`rˆˆˆˆG|CDø†ð ÑåˆÿŠ#"""""""Ø""""""""Ø""""""""Ø""""""""Ø""""""""Ø""""""""Ø""""""""Ø""""""""Ø""""""""Ø""""""""Ø""""""""Ø""""""""Ø""""""""Ø""""""""Ø""""""""Ø""""""""Ø""""""""Ø""""""""Ø""""""""Ø""""""""Ø""""""""Ø""""""""ÃT#ýëëììÄá‚c¸X] Y–G:‡$It–û¯ IDATÂøèhÌ™=>>>#Ѱarˆˆˆˆ†Üá‚cˆ‰‰Â¬ùa¤ÃqHQ”––áÐá£X´0s¤Ã!"""6LÑ»X]Ä„XBQ”‘Ç!AŠ‹ÕÕ# Ѱâ˜CDDD4äÌf3ôz=EAAAÑØØˆ‚‚‚‘͇¢(Ðëõ0›Í#Ò¨`±XF:"""&l9DDDDÃ*99999€ÌL×»oY·qfÁ‚nÅbM Í›7Ï­íœùóŸÿ Y–ñ‹_ü¢hÿ;Ü+¯¼___Üÿý^;ž3k×®E~~>~÷»ßÁ×××öù?þñ”••á‰'ž€¿¿¿íó7Þx555xä‘G°zõj,^¼O<ñÄ bذa8€?þñƒÚ &‡ˆˆˆhXõl‘âÎàÔ×\sÍ€ëttt¸¼?kbhÁ‚ òÚ@ÙûöíCii)¢¢¢ðÃþÐnÙþýû8lÉ!•J…­[·â¦›n²%âŒF#Þ{ï= ,_¾ÙÙÙºÎËûsçB«Õ"++ Ó§Ot EEEضm“CDDD£“CDDD4¬ÎŸ?… Ξ=‹ÐÐP—¶s'ñãŠòòr¯'†zzíµ×••…ääd—Öïìì´kÝã Ö–T‡²%‡Ž?ƒÁÈË˳%‡ ¡Óé••QñÔSOõ»_Y–¡( T*Çÿ””e²,C£Ñ8o(ÊLDDDîã˜CDDD4¬233„   ·º• UC‘JNNFDD~ÿûßÃd2õ»ž,ËøÛßþ†ë®»ÙÙÙ¸ñƱeËÛòO?ý™™™(--µ}¶jÕ*,Y²Ä66Rcc#,X€×_½Ïþ###‘˜˜ˆüü|Ûg¹¹¹ðóóÃâÅ‹‘››kûܺNVV ;;Ï=÷œmyvv6^}õU<óÌ3¸êª«pÅWà©§ž²«?N‡ßÿþ÷X¼x1®¸â <ýôÓ}Æ.2›ÍøûßÿnWæõë×{­ÌDDDä>¶"""¢aqþüy444ŒtN…‡‡{e?øõ¯ûî»ÿ÷ÿ‡‡zÈáz/¿ü2Ö®]‹xiiiؾ};~ûÛß"""³gÏFVVdYFnn.âããQ^^Ž .Nœ8™3g"//f³ÙÖ«·¬¬,|òÉ'¶V:yyy˜;w.–,Y‚§Ÿ~ áC‡0qâDLœøÿÙ»óø¨ªÃÿÿïY“LH„„LØ*;"D a³¸Ç5ÀGÔo¿•Ö*­µ~~n¿ÒŠ­UÐZkÕŸmq÷£¨EvD,@DD”=ÅÙ„°%! ™ÌÜûû#dÌ„d’L& x_ÏÇc3sï¹çžsoÒš7çœÛERepUs àüùóuÝu×iêÔ©Z¼x±>øà 8PãÆ“$ýùÏÖÒ¥Kõ‹_üB}ûöÕ‡~¨?þøŒ>Ïž=[¿øÅ/Ô¿­X±B=ö˜œN§233#ÒgÐ8„C ÙµmÛVC‡ Œü°ÙlAû«¯¹¯®má0M3ä6»Ý®5k×Eä\]t‘n¿ýv½ùæ›5j” ´¿°°PsæÌÑäÉ“õ“ŸüD’”––¦œœÍš5KƒVJJŠRRR´nÝ:Ý|óÍúâ‹/”œœ¬˜˜­[·Nƒ ÒºuëÔ®];õíÛ·Öv¤§§ëwÞQvv¶.ºè"mÛ¶M=ô†.Ó4µqãF]vÙeÊÎÎÖµ×^²O={öÔý÷ß/©rÊÚ•W^©ììl7NÇ×Ò¥K5a„ÀšJ#FŒÐøñãS«ú<~üø@™ŒŒ íÙ³G¯¾úª233#ÒgÐ8„C ETaLÓ |ª¯*WsÍmáž»®mµ•iª»îºKŸ}ö™þð‡?hÖ¬YAûvïÞ-ŸÏ§O?ýTÛ¶m l?vìX`M I9r¤-Z$Ã0´~ýz¥§§+..NëÖ­ÓäÉ“µnÝ:eddœñd´*ƒVTT”6mÚX (==]ÉÉÉêÑ£‡6lØ N:Ö ¥k×®Ïñññêܹ³Š‹‹%I{÷î•aJKK ”±Ùlºøâ‹•——'IÚµk—ü~ÿO•6l˜^}õÕÀ覦ö4ÿ ZLÍ€¨®}µ}¯ÚVõjȹê*ÛÁ$¹\.=þøã:r䈞yæ™ }U£¨RRRÔ·oßÀk„ ÊÊÊ ”9r¤JJJ´uëVmܸQéééÊÈÈжmÛ´mÛ6:tH#Gެ³ n·[ƒÖ¦M›´~ýz¥¤¤¨sçÎ’*Gí¬_¿^›6m’Óé vjjÄW͵…B•©YÝn—išýMí3hF€VjQÕw©öCá: Š"­Gºûî»õÜsÏÉår©_¿~’¤nݺÉf³©[·nºýöÛå÷íÛ§¤¤¤À÷ÁƒËãñèõ×_Wii©†ªèèh¹\.ýãÿÃá8c$NMééézþùçuìØ± P%==]3gÎÔû￯Êãñ„ÝÏÔÔTIÒ–-[4vìØÀö­[·>wïÞ]6›M[¶lÑèÑ£Û·lÙ¢Ž;*666b} ÇÈ!Тš{ÄPcŽm©D·Ýv›ôä²öíÛ+33S¯¿þº–,Y¢o¿ýV³gÏÖ„ ô÷¿ÿ=PÎétjøðáZ»v­ú÷ï¯øøx¹Ýn¥¥¥iýúõºè¢‹òüÇ—ßïW^^^Ð"΃ RLLŒöíÛWú$&&ê²Ë.Óܹs5kÖ,åääèÉ'ŸÔwß}(“ ë¯¿^ï½÷žfÏž­;vè…^Ðúõ냲Hô4#‡@‹hèšCÕËFjÄPCêhÎDv»]úÓŸtË-·mÿío+—Ë¥iÓ¦©¢¢B‡C™™™º÷Þ{ƒÊ9R+W® -“‘‘¡5kÖ4hzU÷îÝ•œœ¬'NhÈ!íU˧Ÿ~ÚäpH’~ÿûßËëõêoû› ÃÐØ±c5~üx½ûî»2=ôìv»ž}öYUTTÈãñèž{îÑøñã#ÚgÐp‘yôGíõØjù\Û»Mß`²Wû^õî8ýî<ýrHrŸþì’4Ðëõ¾‘^8ç-_¾\™™™­Ý 5,]ö‘2†_"ŸÏrÝšÚ¾×·½¡ê ªow8úìóõºúÊËšt®Æòù|:tèÓ¢çn¥¥¥*//W»víê,ãóùTPP :°°4àœf³Ùn—´UR…$Ÿ$¯$ÿéÏ>IÆéï†$³Æ»ª}¯ú’ºÞk~µ­Q9ZT¸£†ª‡8 ŠBjõ‡êât:‹Dÿx<žz×/r:êÔ©S µ„B8Z\}QÕ6)òSË2‚ÀJ‡@‹¨mñçæ1Tß¹ºÀ ‡@‹iH Έ¡ª² z…*€UW Ô”C¡‚žç–ýA%¾Ã²É¨Ç0M™2ëHÖÿsåŸu+"-"Üie5mìÔ²âŠCúÍ„ŸÉn³02L¿^˜ûZ…a<¥ pÖ -¦1ÓÊjn¯mCÏy ü3U¨P6Uþ1n˜†\¶xÍ åååé£>Òwß}§ÄÄD >\ýúõk–s…ËçóiÆŒ3fŒؾ{÷n-Y²D¿ùÍošå¼¥¥¥Z¾|¹rssåt:Õ¯_?;VNgËÿgé‰'4sæLMš4Iqqqa×óïÿ[^¯W7Þxc`Û+¯¼¢ÔÔT]yå•’$¿ß¯3fèòË/W›6môôÓOkÊ”)~bÛ‚ Ô¡Cedd„Ý^jâŸ+@‹ªmúV]Sºª¶7ééd2å3*Tá¯P…á ¼|†O’òüáØ¾}»ž|òI•””è’K.Qtt´þþ÷¿ë£>ŠHý‘â÷û•““£7ß|SÅÅÅíÅÅÅÚ¾}{³÷Ÿÿü§²³³5dÈõîÝ[Ë—/×ìÙ³›í|¡”——+''G^¯·IõDGGë“O> ü >|X7nÔêÕ«eöîÝ«/¿üRIIIêØ±£n»í6%%%5ú\{÷îÕ¡C‡šÔ^jbähõM+«^¦¡#†êšbV½¬iž‡L¯¤ï§•Ùm•kEpôaš5k–FŒ¡[o½5°=%%E³gÏÖ!Cäp8´bÅ =ZŸþ¹ü~¿†Ab†6lØ }ûö)))I#GŽ”ÓéTqq±V¬X¡K/½T6lÐÉ“'5räH%''ŸÑŽ“'OjëÖ­Ú¿¿:tè #FÈårÕÚf›Í¦7ß|S÷ÜsO}ª­=[·nÕÉ“'#XV­Z¥˜˜ 6L’´lÙ2uëÖM?úÑué›o¾Ñ}÷ݧ޽{K’ºvíªÜÜÜzÏ'UŽvZ½zµŽ=ªÁƒëðáÊWJJŠV¬X¡«®ºJG†ahÑ¢E1b„’““CÖÙ¾V]ûôôt}ñźøâ‹•šš8®_¿~š5k–òòòÔ¥K}õÕWj×® tôèQ%&&ê믿V‡”˜˜¨ââbåççkÀ€*++ y_kö9T›5bÄEEE…uÖÅÈ!Ðb;b¨!õÕö *#CF…¼~¯*ª^†W¦W¦ÎlOS9rD‡Òe—]´}Ĉ²ÛíÚ¹s§JKKµtéR½öÚk*//W^^ž¦OŸ®üü|I•Ó‘–-[¦¨¨(­^½ZÏ<óŒ Ã÷ú믫  @[·nÕSO=¥S§N«¼¼\O>ù¤>ÿüsÅÅÅiåÊ•zûí·ëlóøñãµ{÷n}ú駵=§NÒܹs+Ã7ŸOsçÎÕÂ… %UN[°`GP]GñññZ¹re ¿}úô9c:Vm瓤çŸ^ü±œN§æÏŸ¯>ø@¹¹¹kSVV¨géÒ¥:vìX½u6¤¯Uõ¿üòË:«KNNVûöí!׎;4|øpþùúúë¯%I¹¹¹êÛ·oàúTµ·¾ûZ³Ï5G ½òÊ+Z¼x±Ün·6nܨéÓ§Ëëõ†uÖÅÈ!ТóøúšaM¨Å¨ÿºô÷:áÍ”³~÷9 å5’Uá÷JUÇ›¦ìª×~\.¹£rí!Ó”l6(,ÔÅ‹ôèøÿ¯Ñ}+((ÍfSûö탶Ûív%&&êðáÃºà‚ $IC‡Õ¥—^*Iš6mšV¬X¡‘#G*;;[Ó§OWBB‚®¼òJ=øàƒÊÍÍU»ví$IcÆŒQZZšŽ9¢‡~X{öì ŒÂ‘$§Ó©;î¸C)))r:ŠŽŽÖâÅ‹ëls»vítÛm·é­·Þ ªGª\¨®öôïß_eeeÚ¿¿JKK• ¢¢">|XyyyЉ‰Q×®]ƒês:zà´xñb=þøãJLLÔüc9RQQQ!Ïçt:•››«GyD]ºtQii©xàzïI¨:«®iCËeff*--­ÖóôíÛW_ýµ~üãëë¯¿ÖØ±cå÷ûµcÇ 6L»víÒØ±cëlgm÷µ¾>ïÞ½[›7oì÷ù|ºÿþûµvíZ :´Ñ÷`]„C U4vZYõýµ9vê€î¸q¢l6›ì6[e@túµãäûò™ªªÕ”)Ã,Ò¯®ŸmdT{sÉܰú/Ó4URRrÆÇÅÅÅŠ|¿ð Ÿ{õê¥Ý»w+//Ov»]/¼ðBбùùù€¢[·n’¤öíÛËår©¼¼<¨¬ÃáЉ'´jÕ*}ûí·*))9ctQMiiiÊÎÎÖo¼¡+®¸"°=T{z÷î­îݻ뫯¾RII‰.ºè"9rD_}õ•öï߯Ôú4®Ž;êÎ;ïTqq±²³³µtéRmÛ¶M÷Þ{oÈó¹ÝnÅÆÆªK—.’*G!U}¥!×´¡åª®}múöí«™3gjß¾}òûýêÞ½»ü~¿^{í5íÝ»W~¿?èž×TÛ}=räHÈ>çååíw:êÑ£‡8 K/½4¬û°&Â!Ð"ªB˜H #éËãKTê?*‡Ý.»Ý.»Íx¯^išòšEÚxt¦ Ó”aò† ÃÇÑ>ìée:tPtt´¶l٢ѣG¶ïÞ½[EEEA#5Ž;¦óÏ??ðÙãñ(&&Fv»]¿üå/ƒÖĉUaaaƒÚ°}ûv½òÊ+úéOªqãÆéÛo¿ÕË/¿\ïq·Ýv›{ì1ýïÿþo`[¨öHÒ€´}ûv•••)++KGŽѶmÛ´ÿ~ÝtÓMgœ£  @_}õ•222§Q£F©M›6z饗TQQò|Uç)++SLLŒLÓÔñãÇ%}_«‚²êYC¯iS¯}Ÿ>}TVV¦•+WªOŸ>r8êÙ³§ÊË˵jÕ*õìÙSQQQõÖSÇ㩳ÏUm.++Syyy î'NF§5öþ¬‹.-*ÔÓÊê eê[W¨ªŒÏç“Ïï¯|U}öùTqúsÅéÏïUe«½*üg¬EÔPn·[×\sæÍ›§µk×êèÑ£Úºu«^}õU¥¥¥úX½zµ¼^¯8 íÛ·«oß¾êÕ«—ìv»¶oß®ÄÄD•••é7ÞPiiiƒÛpâÄ y<]|ñÅr»ÝZ³fMƒŽóx<š4i’öìÙØV_{  o¾ùFß}÷zöì©þýûëË/¿ÔÑ£GëëTgš¦Þ}÷]-\¸P………ÊËËÓúõë£eB¯gÏžr:Zµj•ü~¿Ö¯_xÊZ»víät:µ|ùr°­1Bõ¹ªÍn·[Ÿ|ò‰ ÃÐŽ;tðàA 8PRãïÀº9ZE}£†ê-T[ÀTá¯ÏðË4 ÙívÙªÞë8OÕ4²ªÑC†a¨BjʺÔW]u•œN§,X ¢¢"EGG+==]ãÇ*—’’¢)S¦¨´´Tiii3fŒœN§îºë.Íœ9SóçÏWtt´ÆŽ«„„„?¾üâ‹/ÖªU«ôÀ(::ºÖ'\Õ¥wïÞ;v¬>þøcIR\\\푤Î;+>>^]ºt‘ÓéTÛ¶m•””¤6mÚÈãñœQrr²&Mš¤9sæhÙ²e’¤ .¸@“'OnÐù~úÓŸêí·ßÖâÅ‹5pàÀÀ4-—Ë¥ñãÇkÞ¼yÚ²e‹²²²S¦BÕYýš6´\(ýû÷×Î;ƒ‚—~ýúiëÖ­a…1ñññgô¹zÈTÕæ·ÞzK‹-’ÃáÐÍ7߬ž={JjüýXWýc´Ã¯ÇVËçÚÞmú~“½Ú÷ªwÇéwçé—C’ûôg—¤^¯÷͈ôÀ9oùòåÊÌÌlíf¨aé²tÉAòù|u†>õ…Aõퟲàÿªÿ0›NEAÓÉkÕ(oJ߯5d€(ʯ¯6;ôÒÏ>hDkWRR"ÇÔöC‡éøƒžxâ µmÛVŠŽŽ>ãØââbµiÓ¦ASêj2MS………ŠØº2MiOMUís»Ýu†u¯êIiGÏ=÷œRSS•••%©ò±ïöÓS ›Ò‡Hö5ª÷¹.ÅÅÅŠe!h6›ívI[%UHòIòJòŸþì“dœþn¨ò?Aª¿«Ú÷ªžªë½æçPÛ…‘C E…;b¨¾u€LÓT¬#ImœIg¬3tÂ{@æ©ê…å²Ç¨»Kå")($2Í£aö.XÕÚN¼æ‚Öa³ÙÔ¶mÛ°¯MSÚSSCÚW×ùìv{!Iõµ‚Sg¸åZJ¨>W9ÛÚ 8·€VÉŨ%)!º‹>ÿì@å¡j#…NÙŽiè°$UøN•wÙ\ZöÉ—ŠQbå?·~”}QQ‘z]0¨ñj ¸¸8M˜0¡Þàõ5jTÐà@x‡@‹¨íieUۥƪ­ìÿ{Í“µû»…·«Â_¹uu>›OÑf‚ž¸éÍ@Y§Ó© ›²uõ•—5¬Saðx^µ&buU‰ikÏ>û¬bccu×]wE°e­gãÆZ¹r¥víÚ¥ÄÄD >\×]wÝ*H)++ÓM7ݤѣGëá‡níæÐâ‡@³kêt²ê.32-ª]$¦­}öÙgjÛ¶íY½ÿþûúÇ?þ¡™3g*99¹ÎrÏ=÷œÞyçµk×N^x¡vîÜ©eË–iÑ¢Eš1c†Ünw ¶:rjö?**Jééé8p`k7 €VA8ši*//—ßïoR=jQíG³N[óz½g*§NRtttÈc‡GeÊÊÊòÜ¥¥¥r»Ýr::uꔎ=ò~|òÉ'zûí·uà 7hÊ”)v/Y²D>ú¨^|ñEÝ{ï½aµÅï÷Ë4M9uÿ§hCÊ4´ß'h[ÍþÛív=úè£M:O}í­šJy®j€6Â!Ð"ÊÊÊš=Üi*—Ëñ:G¥›o¾YZ±b…Î;ïŸvíÚ¥qãÆÕ:ÒåücÐ÷†¶eþüùºîºë4uêT-^¼X|ð¨qãÆ5¸ÌsÏ=§ùóçëW¿ú•z÷î­+VhêÔ©JJJÒàÁƒ%IÏ?ÿ¼fÍš¥;î¸CýúõÓâÅ‹5}út%''kâĉµößï÷Ë0Œˆ÷顇’Ýn×óÏ?/Ó4õÌ3ÏhÊ”)ú׿þÎÍ‚p4«Ã{6jÌõ¿–ÍÞôõ†Z‚išÚº&²¸Ÿþùšù¤ìv»F¥¢¢"½ûï¾ûäv»5gÎ?>°¶QFF†öìÙ£W_}5^HRïÞ½õØcÕݵkWIÒ AƒÔ©S§3Ú{ðàAùýþZ÷ÕTXXØà¶ôìÙS÷ß¿$iøðáºòÊ+•Rê+Su®É“'ë'?ù‰$)--M999š5k–¬ÂÂB½÷Þ{?~|àš:TIII*..V×®]ëí¤úäõz•ŸŸ¯«®ºJééé²ÙlêÓ§O³ŒP )‡@³²Û*+< ›iH2[»9Ükqä IDATõ2mNÙíu¯ï޾}û>'&&JR` ™$uìØQyyÁOs|xÐ1Æ Ó«¯¾´FNUÒíÚµ“T’Ôg×®]aµ%>>^;wVqqqÐq¡ÊìÞ½[>ŸOŸ~úi`š–$;vLåååAí6lX`¿ÛíÖƒ>Ø€žG¶On·[™™™Z²d‰rrr”žž®ŒŒ 1¢Ám %€fåpºdú+*G™g{8d“iTÈîˆì"Eâ)mUuøýþÀçšõÚív™¦4=*œs·iÓFíÛ·WNNN­û׬Y£‚‚eeeÎN[jk[¨2>ŸORe°V=\ëÛ·o`QïªE¦›rÍ#Ù§G}TW\q…Ö¬Y£ 6hΜ9ÊÈÈÐóÏ?‘Ÿ "Á^€ðÙl.~oe0dg÷K† ŸWvGëOûÉÎΖY-LÛ¼y³$)55UÝ»w—ÍfÓ–-[‚ŽÙ²e‹:vìX´º>UaKmn¸ámÚ´IkÖ¬ Ú~øðaM:UŸ~ú©$E¬- Ñ­[7Ùl6uëÖM?ÿùϯË/¿\YYYAíÙ´iSà8¿ß¯W_}U«V­ ª¯®þGòúîÙ³GÔ”)S4wî\eeeiíÚµ:xð`#z@óbähV§K†ß/9Ìs`ädþ³"*((дiÓ”••¥íÛ·kÖ¬Y=zt`œë¯¿^ï½÷ž:uê¤hÅŠZ¿~}ài[¡´oß^’ôÎ;ïè†nšöVeÒ¤IZ¶l™xàM˜0AýúõSAAÞ{ï=™¦©{î¹G’”Ф¶4Fûöí•™™©×_]íÛ·Wß¾}µaÃýõ¯Õý×顇Rbb¢®½öZÍ;W]ºtQ¿~ý´hÑ"ÍŸ?_þóŸÔÿHõéèÑ£š8q¢† ¦ßüæ7*++Ó—_~©¸¸8%%%EîÂÐD„C YÙnþ ÉtË4Ïî§•Iv™†Ogë‡CW_}µJJJ4iÒ$Ùl6 >\S§N ì¯z Ö³Ï>«ŠŠ y<ÝsÏ=?~|½u5J£GÖܹsµuëV½ûî»g”ñxuèÐAúÓŸôì³Ïê¶Ûn“T9%î™gžaQjÀY%Rk«ÇVËçÚÞmú~z›½Ú÷ªwÇéwçé—C’ûôg—¤^¯÷͈ôÀ9oùòåAO‘Ðúv¬}[ñžy<ñ2M“ê*.<¦ïöïÔñ#uªì¤$)ƧvIÔé‚)6®mÓk³ëTÙI/:©~£~Ú´ºš ##C×_½~÷»ßéĉr¹\uNeòù|*((P‡‚°nˆ’’¹\®ZW_ÓáÇծ]»¡FSÚÒX>ŸO‡RBBB`qèÚÊ>|XÉÉÉr:Ïü7цô?}2 C‡RTT”ªpö²Ùl·KÚ*©B’O’W’ÿôgŸ$ãô÷ª§sTWµïUC¬ëz¯ù9Ô¶FaähV6»K¦á“láO+ó~íÌY¯ƒûvJv‡d³Ë¦Ê'Š•”–¨äÛ\å}û•:¥^¨ž}ÓÂþ#Þ&S†QqVL+«Ò¶mèÀËét6è‘óµiÌz@ÉÉÉõ–iJ[ËétªsçÎõ–9ÿüóëÜßþG¢Ov»½Å® á ÍÊápËo”È4°¦•ù ¿þóÅ 8.§Û£ÎÝû©Ó?’'¾rFiñ1Ü›«ßnSÞÞoTZ|B†Ž 3 ²ÉïóÉአãX€sáhV—KfyÅ÷O+k¤o¾\§âÂãò´9Oƒ2®UŒ'F†ï”Œ²c’¤˜(§zö¬N©ê?Ÿ}¨Çh÷ŽMêÙwHãk³U®9äŠoü±´víÚV=?°eš•Í%ÃWÖ£åOÕ¡ü½r8ܺhøÕŠròŸ*”QqJð¦>ùp¦L_¹ü§ ã²k`úU²;œÊß¿K¥'O„uNÓ_!ûY° 5@K!ÍÊátW>ÊÞ4ýúîÀ·²ÙêÒ½Ÿ¢]’é¯ìs¸<²»<ï¦ß+O”Sç§ö‘dסý߆uN¿ßwV­9Ð܇@³ª ‡*dšf`Ý¡†¾Ž=,Ó4•Ô±³ ¿·ÆþʇzTßføÊ•Üñ|™¦©£Ç7ú|¦iÊðWÈîdÍ¡¦2ŒÆO!~Høp.aÍ!Ь*Ã!ß÷S·¡âT™$SÑÑnÉô¿ãt0TùÐ×à:c¢£%™*?UÖø5ŽLC¦á—ÃYÿ£Ýkãóù4cÆ eee©K—.aÕ ¥¥¥r8ŠŠ ¹ªÚWÅãñ¨W¯^ÊÈȈè£ç8 §Ÿ~ZS¦L‰øSºNœ8¡™3gjÒ¤IŠ‹‹kÐ15û]e̘18p`DÛJ]÷¥!,X :(##£Öz—/_®ÜÜ\9Nõë×OcÇŽ•ÓÙòÿ©Îý %//O}ô‘<¨óÎ;O#FŒÐ€"ÐÒÈ«~›ówš#‡@³²Ù2mª|”½÷²Ùl’$Ó¨djÏ7_jÕ‡ÿÒ'ÿž%I2 ¿V}ø/­úð_Ú»óKéô£è%Én³7ú|•#‘LÙ펰úê÷û•““£“'O†u|¤¼öÚkzÿý÷ÏØ^Õ¾¤¤$ 0@‰‰‰š7ožfÏžÑówìØQ·Ýv›’’’"Z¯$•——+''G^¯·ÁÇÔìwÕ+111âí ¥®ûÒ{÷îÕ¡C‡jÝ÷ÏþSÙÙÙ2dˆz÷î­åË—Güž6T8÷§.Û·oדO>©’’¥¥¥ÉétjÆŒúøã#ÐÒÈ«~›ówš#‡@³²Û•Ó+Â9䎎•¯¤P¥ÅÇ×V=ú “3¦­vµùûúÝuï3D©Ý.”¿¼X¥EÇ%IQ1ž0žŽfÊ0ýYs¨¸¸X+V¬ÐèÑ£õÅ_ÈívkôèÑÊËËSvv¶4jÔ(9Ž ²Ÿþ¹ü~¿†q`†6lØ }ûö)11Q#FŒPTTTà¸ôôt}ñźøâ‹õÝwßé»ï¾ÓÉ“'õïÿ[×\sÍm4hz÷î-IЉ‰ÑâÅ‹uóÍ7«¤¤äŒú.¸à‚À¹“’’4räH9NmݺUÇŽÓ¥—^hãâÅ‹5dÈwÞyÊÏÏ×€ät:ëmÿUW]%Ç#Ã0´hÑ"1BÉÉÉ:~ü¸Ö®]«òòrõéÓG}úô êÇÖ­[uüøq3æŒ6Ô6r«z¿«ìÝ»WÙÙÙºîºëäp8´gÏåää(333p=šë¾T?¾úµ•*G;­^½ZGÕàÁƒëü9+**Ò7ß|£ûî»/з®]»*777P¦1ç9|ø°âãã•’’òÞ„ª³ººÊÕvRSSƒŽ›5k–FŒ¡[o½5°}áÂ…Z´h‘FÕ Ÿ­K/½T6lÐÉ“'5räH%''‡ÜWßõª¾/!!A#FŒPtt´Ö­[tGŽ٨ߺÚRßïD #‡@³²;*ÿ0 gÍ¡„äN’iêpþ>™¦!ß©B¥t»PÝz]X@º[ï!JéÚS¾S…2MC‡î—LS ‰ÂXsÈi˜²;šþïg¥¥¥Zºt©Þzë-jÙ²eúûßÿ®y󿩬¬LsçÎÕòå˃ʾöÚk*//W^^ž¦OŸ®üü|IÒ+¯¼¢Å‹ËívkãÆš>}º¼^oท_~YÇŽ“$¹Ýn99¹ÝõOkÓ¦ü~¿ èµ¾W^yEË–-STT”V¯^­gžy&°–ÊìÙ³UZZ*IÊÍÍÕÒ¥KuÞyçê)++kPû«ÊIÒÒ¥KuìØ1•••é‰'žÐþýû£ÿùŸÿÑçŸ~FûçÌ™£òòò 6ÄÇÇ7ø>uêÔIëׯתU«d†Þ|óMI’ÝnoöûêÚ>ÿüóúøãåt:5þü:G y<ÅÇÇkåÊ•võéÓG7Þxc LcÎóÁ(777佩¯Îêê*WÛ5ªîÈ‘#:tè.»ì² í×_½yä‘À¨ÂúîÁ믿®‚‚mݺUO=õ”N:r_}}{å•WôþûïËívëóÏ?×_ÿúWùýþ3îocjkKC 9š•Ýá”iß?¬:vJUÞ·_)ÿ·êб‹bãΓÿT¡R»]X9 ÌnSj×òŸ*’$ס¼=²;\êÐ%¥ÑçÓé+áP•Ë.»LT§N4gÎýõ¯•Çã‘×ëÕÎ;ƒÊ:40gÚ´iZ±b…FŽ©Í›7ë‘GQ—.]äóùtÿý÷kíÚµQ™™™JKK“$¥¦¦jÍš5êØ±ãXW9räˆòóóUXX¨åË—«_¿~A£>ªêÛ½{·²³³5}út%$$èÊ+¯Ôƒ>¨ÜÜ\õïß_G[·nÕðáõiÓ&õïß_qqqÀH’vïÞ]oûkSTT¤¢¢"]sÍ5JMMÕ°aÃät:ƒÂŠ~ýú)**J_~ù¥ÒÒÒ´eËõíÛ·ÎphÆŒAýœ:uªÚµk§[n¹Eo¼ñ†¼^¯ü~¿®¾úêf¿/¡®­ÓéTnnn îÒÒR=ðÀµöÉétêÐâÅ‹õøã+11Q?þñ5räHEEEEì<Õ…ª³]»v*WýUWPP ›Í¦öíÛmw8é€ ùÙ3fŒÒÒÒtäÈ=üðÃÚ³gOàܵís»Ýu¶ÙívkóæÍúýï¯ÔÔT]qÅzÿý÷U\\¬‹/¾8èþVóšÒÎÚ~ 9ð¿. YÙíŽÊ'‹…1­ÌãÒù)½”·g‡¾Üü™ú_œ®6qçÉê„R»õ”dʪPRe0´}Ë2e×Ýú)Úi—iø×XÓ”ßï—ݹGÙwîÜY’§˜˜y<IRÛ¶mUXXTö / |îÕ«—vïÞ­¼¼<ÅÆÆ¦I9NõèÑCüaÙ­[·FµiöìÙr8©Ç´¿ª¾¼¼<Ùív½ð AûóóóÕ»wo¥¥¥ióæÍ:t¨²³³5qâÄ3ÎÕöצC‡=z´þò—¿¨K—.2dˆÆŒ9]rÉ%Ú´i“¬Í›7×Ú†*YYYAתjÁä¨k×®Z¸p¡~ýë_ŸñxsÜ—P×ÖívÕíñxB.pÞ±cGÝyç*..Vvv¶–.]ªmÛ¶éÞ{ïèyÒöêáPCÊÕuâããeš¦JJJê\غ1÷ }ûör¹\Qfuí+((¨³Í.—K±±±JII‘Ty½n¹å–Wªií¬ëwšáhV6»S¦i¨òéb ‡L_¹zö Ò“ÇuüH¾6¯ûX:§ªc§ 䉭\¤ºäd¡ܯƒùûd³»”Ø!E]{\(Ó[ÜøÆš•#œÂ]º©Ž;¦óÏ??ðÙãñ(&&Feee*//<åêĉºà‚ Â>ÏÝwß}ÆÚ;µ‰‰‰‘Ýn×/ùË À$66V’”žž®§Ÿ~:°ñE]Tkuµ¿jjPÕìÕÿp—¤ÿóþ®½öZ}ýõ×Z²d‰òóóÏXCiذaúÛßþ¦;vÔÙ†*;v ZצÊÉ“'#5rrrÎx‚YsÜ—P×vûöí*++SYY™bbbdš¦Ž?^k=úꫯ”‘‘¡¸¸85JmÚ´ÑK/½¤ŠŠŠ°ÏêÞ„ª³zàÙÐrµéСƒ¢££µeË=:°ý?ÿùþýïë¾ûîk–ßPmÎÉÉ \¯ª·¬¬LQQQ!Ÿö×”vÖö;0iÒ¤°ûuaÍ!ЬìvG`ÔP8kùOÐÀK.Uç®}es¸u0oŸ6­ûDŸ~´PŸ~´H›×¯ÖÁüý²»¢•Òs ú)£¼0¼õ†LC¦"³æP8V¯^-¯×«hûöíêÛ·¯zõê%·Û­O>ùD†ahÇŽ:xð`ÈG°»ÝnåççMï G¯^½d·Ûµ}ûv%&&ª¬¬Lo¼ñF ÞÔÔT%$$èÝwßÕ!Cär9â*TûÛµk'§Ó©åË—ëàÁƒZ´hQà¸Ý»wë/ù‹ ÃÐ%—\¢®]»êðáÃgÔß­[7µmÛVÿú׿êlC•ÂÂB=z4ðªZcfΜ9JIIÑÿ÷kíÚµÚ½{wÐqÍq_B]Ûž={ÊétjÕªUòûýZ¿~½Š‹k;MÓԻᆱ… ª°°PyyyZ¿~}`J¸ç uoêû¹hl¹º®Õ5×\£yóæiíÚµ*((І ôÎ;ï(99YQQQa݃ú„jsÕùªÖ§Z·nî¿ÿþ@ÐU×ï]¸ílèïD#‡@³ª9d†µæP%SþÒ£úQïêÒµ·ò÷åêXA¾N•”M6EÇÆ)¡}'Ÿr¡¢£ò• ¿­’ džVŽ””M™2E¥¥¥JKKÓ˜1cät:u×]wé­·ÞÒ¢E‹äp8tóÍ7«gÏžu.RŸâããuÇwÔzŽaÆiñâźýöÛCöçõ×_ú>nÜ8uëÖM›6mÒ#<¢:hìØ±zûí·5uêÔ@¹æº/¡®íOúS½ýöÛZ¼x±¨~ýúÕZgrr²&Mš¤9sæhÙ²e’¤ .¸@“'Oºþ =OÕ:—ËUç½ Ugõ¾7´\]®ºê*9N-X°@EEEr¹\ÊÈÈЄ ‚êoÌ=¨O}׫ê|‹/–ËåÒ­·Þ˜"Wýþ>øàƒgÔÙØv6æwšÊÖŒõØjù\Û»Mß`²Wû^õî8ýî<ýrHrŸþì’4Ðëõ¾‘^8ç-_¾\™™™­Ý Õ”<ªm½ ®©=eøÊë? ›Ã%‡»lÎ(Ùì•ÿÆe>™¾Sò——È4*šT¿Ý¥={wªÿåÿ­èØvõ!‡Òþð=ñÄjÛ¶­***}F¹ââbÅÆÆ†œÂR]EEEÈ‘4Q\\¬6mÚ¦…[Gmí÷ù|²ÛíµöË0 •””„<÷Š+´råJMŸ>½Ií«©¥îK]×Ö0 :u*0…)Ó4UXX(·Û]gù†œç¹çžSjjª²²²$…¾7¡ê ·\]Nž<)Dz¹ ªÍÅÅÅòx»§ç˜¦)Ÿß¯Š ŸÜnwk7 E€æe³É“ØS›7¯UE…·ò±ög!›Í&—Ë­ó:\ØÚMhQ„C Y¹ÝnõñUTT¤S§NÉ0ÎΩev»]ÑÑÑŠgÔ°Â!Ðìâãã+¯×+ŸÏ×ÚÍ©•Óé”Ûí®óqå?T„C E8ÅÄÄ´v3Pƒ½µ€ÖC8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CælíDÂÁƒ[» ç¤D8×ÚM²sçN åää4¨lÿþýõì³Ï6s‹€–qÅW}_¾|y+µ¬é\ ‡ÌHVæõzµdÉ­\¹R{öì l{ë­·´|ùrýêW¿Rzzz$OY§œœ-\¸P±±±!Ë•””覛nj‘6ÍᦛnRIIIû«‡E±±±Z¸paK4 ")¢ùEs;סˆ9r䈦Nª]»vµvSê †Z8›… †šRžs9 ;…óz½`())Iwß}·† ¢n¸A.—K·Þz«&Nœ(·ÛÉöÓÆü`S£…ª;[Ã!S’­eeÉ’%`襗^R\\œ$iøðáºûî»Õ©S§ÆVÙ,²²²d·Û5oÞ¼Ön Q5ת A€s@cr‰³2@:[¡†„A»€}ô‘$éî»ïC’ôøãGêqòäÉÖnOCrŒ³",²ä£ì÷íÛ'I2dH+·@õÑAŒ€–w®„Cfïͦ¤¤DW\q…n¸á†æ>Õ&Mš4íæŠ+®ÐÏ~ö³oh”Ï/"á\ ‡Biô…NII‘$mÞ¼¹Î27n”$uíÚ5¼V5Á¯ýkÙíß߻ݮ;ï¼³ÅÛêuN@¡œ«áP“¸Ë/¿\’ôꫯª¸¸øŒýEEEzñÅ%I—]vYx-l‚K.¹$h¤ÐÏþsedd´x;@ƒœS#…j:[¤®Yíe«±½I233µtéRíÚµK“'OÖ/ùK¥¥¥I’6lØ _|QGŽQ=”™™ÙÔÓ…å–[nQ~¯Šù7 ËIDAT~¾$iâĉ­ÒÐh5s‹êùÆYél ‡ûû°.¬ÛíÖ´iÓ4uêTíÚµ«Ö§”õèÑCÓ¦M“Ëå çqÿý÷·Ú¹@ƒ56£8«‚¢–‡ªÂŸê!PmPÍý5÷5ù"¶oß^/¼ð‚>üðC}ôÑGÚ³g$©[·n;v¬233[<*))Qlll½e€’š‹¯À9¬¶Ì¬ãs¨ý-m#‡¤ºGÕ …}Á\.—n¼ñFÝxãáV1ýû÷×M7ÝÔà²À¹¬ÿþÊÉÉ YfÀ€-Ôh’º²ŠºòгjÔtv†Cµ©-93t^Ðp=ûì³­Ý ÅðóàÆTeNQý{õ÷³Zs>­,œ ê˜sâ‚(òG³å"çÊ£ì뚯wV¯ö ~ðªg¡Ö:kE*ª¯³ ™g×Ð9zÕ§“€ÖT32B쯹½¶Ïu• gƒœ-#‡jëL¨5……ÀÙ¤¾E¨k†Fÿ{÷–ܸ D´=Î fwYw¶3ròa£ƒ4”(‘’Ï©r‘À—üw«–öÃ%jªˆÚ4î?$ð-µùD›_´cOçÈph¥|ªîïýЧüa€o!Ë(V Z¶d#wsD84{ÙÙܼçÐfí'í³µ”g×{¨¿}É#â­9®Û>â3Ъ¸Ÿ?þï_}e[öß¾öߪ¾·Á¶Ý/÷n÷³-ðXí—²XµáM»Ÿm/MÛåkÿ£Ú¿$çFÌ¢Sºœ!j¡º=;.ÿñùcÿŸïñW|†?mHT‡EÙñJX´EçØ×(3è-I3 ƒê¿Kç¸Þ^"â××_ eŸµŸ-V}¨{‡CuðÓ fc³d †._ã.Íø÷¯mWB¥ý-æÑJ8‘¿—öµòIøQ84 †êª¡• ¨ ¢ºN¶ÎÖõ—WÇÞä¨Ê¡þdP •ýjL©º|õ—ö÷fûou\þ‘[*‡"~¯ÍÔ«À1²¥Î>ª¶ÕÊ¡l*Ù¨‚¨®j§˜õ¢YÛÜaZYD¾ÖP{\»ÄgØóëk[´ÁP•sÚª¡²QV1Ô†Bõ3ÍóÀ¾fáI¶ÖOeDõÚB½5‡F•Cm@ÔÞôü‡O)‹Ø7šMÛzº’¨L +ÿä²_W•sÞ«ñm…P¹fS r­Þ”²ìG‚à(³ieõ~ eUD½P¨Œ.Íq{~;Å,{Î[í,=¢rh¶îЬ-›fÖ&ïM½¶PVt‰|JÙìKe³)eB"xŒÙZ>måÐJ8´%(ê­I´u¡YÛÝ«‹ŽœVÖ›JVo#~WöDüY=T·—óël]]TW õ¡-‹P¯|Â^Pû%m…Ψr¨ÎfAQ]4 ‹êöˆ?+ˆÚgÉÞå°)fgYs¨èM++meÝ òƒ·áRio+‡êj¢úkg%ª¯·åëd½H0÷Ñ QzÓ·V¢Þ¶·`uo\¹W»öPö\§qD84 €²@¨=¯…JÈÕy?ªñmXTÎͪ„ÊyïÕõFUCí~,´·™…Cõ~Eüo²Ïη•D³0(kï=g¯zèÐàhïp( uFí³kÔÁN«…"þ …J…Ñ¥i/!PÙ¯ÿ²`je*Yö^Â!¸•u{V§˜eáP/ ŠøóƒX½ð¨ý‹êüÞó÷¬a7;Ó´²YQýâå¸þ‘KÕPYoèWäC½/“Õí‘ì×Ûè÷Ú€ýìõ‚¢ì8b\uÔ^»÷½w8Ä=‚ŒÕEšGû£/…ýH¶Ùô°¬ý­Ó× …ʵ"ò€HçЛVVô‡ÎB¢ˆq@4jÏîÕ ŽzÏÝî·^¶r¨–MC+mí‚Òe[|Tãê`¨†‘Duôy(”ÏÚ€}¬N·U팦€ÕãzÓÅV‚¡Õç>Ô½‚ŒÕàdkõP=®­ ʪ†ÚýYµÐl*™idp>³ femm@Ôî×!R/º¶j¨÷N£ö«=:ÊúöˆF¡OoL{-ë „àœV—^ðS¶³j¢Þ˜ì:í9[ž3³{8t¶ieõt²²_ocÒ–]§žVÚÛÀ©^5¼î¯ÛFÇÀ9Ì‚–,¤É‚œ¶o4¦½WÖ¿ºžÐÃÝ3䨳z(âÿN6¦^{¨®ÊŽÛ*¢¶oË3Ç[©Àé…5Y ÓVÕÅ%Ù×íqe÷ž=óJßÕŽ ‡²þ^@ô#·Æ®„B½qÀ¹õ›¶õÚfÁP{¯fL¶Ÿ·ž.š]ËÔ­Q4jÏÆdŸ§ïí †ày¥ígaNoZYoÌhÜêñjßMŽ ‡²þ-QÄ8è™UeÏÖ»ÞŒàޱ%4é@mÿ–ª¢Þõö †Vú¯öˆPãÞÑʱvjÚJïy¶ö÷uK°Ò›ò5ê_™²öÁPÄ9¡lÌhAèÕõŠlÍ¢Ù~ï€ç5 eFaN¯Êh¶ŽÑhAìÞqæéáÕû¬|!¬´­„:+çÞòlÀù]¾dÁO=n2­„B×>Ûîzìe}«UA«íB!x £jžÕö•©bO E<>ü¸¥JgÔ> •® ‡€×²W8T·ÝrÍž‡CÇ„ ·Nãêõ•Þ2fDhÏáÖp%[ghuÌ­Ÿ¤X0qÞpheì¬ïšûà{˜M3ësmð³õ>sdò¨èšû­^8¿kÖٔ²[ûn»›÷#núekèrët´Ù,€ïå–PçtÓîut rÍýWÏÙ{ðšVCœ½ÇÝzÎ.ÎŒÀëÚ#Ô9<Š8g˜²×3ñÝ€çµW˜sŠP¨8s€rijù÷ösD@sªP¨x†0䞠甡PñlÁ˳=/ð=:ª½BØò ï<¯§ ‚2¯¬¼â;çñÔaPë;)ßñ€u/þgñòósé ·IEND®B`‚sequeler-0.8.2/data/assets/screenshots/sequeler-screenshot1.png000066400000000000000000001464461410464306200247270ustar00rootroot00000000000000‰PNG  IHDR‡æØ ô^sBIT|dˆ IDATxœìÝyt”ÕáÿñÏ,Ù a_ÊEA¥ —êÑZDV¥.i­»h]¨¢­öj] nk¿.´iq+ @"([ Ù—IÈ:Ûï˜q–g&“d2™0ï×9s&sç™ûÜçf™Oî" Å35w¢ ®4Ws7 )ÎÁÉé|m úNËètPN‡k-W‹Zb°ÒÛ âG‹ ‹ZJÐÒRÚ à-惢X]¢Ý¶Xî yÑnb2(ŠÅ@$’mŠÅë-O$ƒ˜ ‰b)¯‰Äõ5w€Æ‰DSŸ:r¾f ‰š3ø¨ï¹Ã9>Ü: |€‘pCšpŽ«oàÓ,Qs„$‘…B=ßhù"ÜÔUWL‡D±¼]|CCŸH†E‘z-ˆ¾¦Z ¨)žḵ«áP°ã"U^Ÿ¶€øÐ`'Rå =®Ñ¢4E0nY8ç', ¾4t:˜Qy¸e᜷¾Ç5J´‘Æ,&í_N ÄH"P—HŒ 'jLHÔäQ4‘†C‘…ê3²¨®çÀ飾ÁP]OCC¢fˆš: iª`ÈÔÀçBµ‰`€øÒÐic¡BŸH„Há¶)"š;ªo0T߯Ãy¬,B$b[cw«OÀS߯Ã=g}Ÿo°¦ : EâkÿûpÎ"bS}C”pG ùßGòëPeõy¾Aš*ähŠ`(œçÃ=6T;Ây´<õYg¨®Pǥ𣘈š#jL0TW(dñ\¨ó„* †ð€ØÉédþ_û=ÎÏÉ ,RQ‹‡ê;j¨¾ÁP¨P(Ø}¨ó„* ç9»³+™÷×Î:îB¢†DQ=íp(Á(ä]fVðÀ¨©F€–£¾#†$ã È©!—C¢¦ ˆZl8ÔÁ; rß[äIÆSÍÂmW(HÄ–pC“pw#3 ‡ÜÁC¾!‘SÑ ˆ"Y#Y™˜Ô7ò¼oî`Èê÷¼¨dTC®ƒp€ØNhRWàb´Öwøã’d×ÉÌÁ¡“ù€Óï5þõš‚ÜËïëp5ä5AE: &œÑ9õ †,~÷Ö„„„΋å&³Ù|¦ÉdÊ2™L aœÀŸOøâr¹l.—«Øét®w8¯Úl¶ƒú!r‡D’oPä]W¨€ÈÍ¿,¢!P0‘ KÂ]k¨1‹N{OsCVI–¤¤¤«Õ¥K—cYYYé&“©³¤”] €¯*§Ó¹¯¤¤¤lß¾}mkkk_¬©©yO'ƒ!û©{wPlš™Â¸õµ¿ˆGчÂYkÈ( 2ZxÚ{ ™;JHLL¼:--í¦AƒYGO›Í&§Ó)—«ÉÃ5L&“Ìf³d±X¾ß¼y³³ªªêåS‘M?DîÈ{-")0 72z\Wy½X"QÉ)á„C †¼œö-$)ÁjµvMNN~|ðàÁ–êêêž6›PDœËå’Ýn—ÓéÌèÔ©Siqqñ§Óù‰Óé¬qðã-Ü|Äÿë&©p¨¾£†ü/8T@ä¿ÎU¾£†~Û½{÷¶‹e€ÃáhÔEÔÅårÉåre$&&~_^^ÞÉn·¯’ñÈ ú„DFZ^/ÑZZ ½µÑ×Áv&s?¶JJ°X,ÃZ·nJ0¢Åáp(==½µÅb.)A?L%sêdná†ü¨6Ú¥,œÅ©›Œ9'©C°QDþeF;•%º\® I™J¢ÅårÉd2åœÊ%å›WøgÞüËš}gõ¦ ‡êòT×0*wdTæ™^f2™%¥6ºµõàr¹ZÊ%¼—Áñ‡ÜŒÊ$ãl¤I§‰Ä´²pîbÕþkù—»ƒ!÷vöI&v&Ñæt:%¿ŒâÔ½{Ç2wžáò»w 5­,Ty} )ÚÓÊÂ];ÔšC2x Ð\B塦˜IÆIT§š5g¸Ψ!£çÍ~_4'ÿ¬"ÔzC ò|³­=ÔTáJc.Î(U3ID8bwNN¦QM 5ÇVöuíNæÿšp:€&j[“)~>–Z­VqÆ>e›7o–Ýno¦Å„p §‚¯ ä~ù¯?Ô资ÂÍpÈ[¨ÝÉ‚ ­ 6zH.—‹©‡l6›jkkåt:Ý ׋Óé”ÃáÝn÷|þ4›Í²X,JNNVjjªNËÈårÉétÊb±H’ ¤_|Q r¹\²Ûíš>}ºÖ¯_/éd›ÍæÓ²/Œxe¡·xãæŒ$ß(j·æ ‡Âå €N1 ‡ðWYY©ššY,Y,Y­Öz….—K5552™LêÖ­›222”˜˜(‹Å"‡Ã¡ÚÚZkß¾}JLLTÛ¶me2™N›`ÄétjÀ€:ï¼óôî»ïêèÑ£žP¬¢¢B’”’’"³Ù,»Ý®víÚéꫯ֊+´eË™ÍqµL]^Ì:¹ƒYLjl8Tßw|¸SÊÂ9ÔóbØÊ•+5nܸFÕár¹T^^.—Ë¥¤¤$Ϩ—pà ÷h™êêjeee©K—.žÑCµµµr¹\2™L2›ÍÊÉÉQ§Nôý÷ß«¨¨HYYY²X,-> r:8p {ì1uíÚU}ûöUaa¡~üãËápxF`9Ýwß}úôÓOÕ¯_?3F'NÔC=¤o¿ý6ž"£…¦ƒ ¶e½÷sõAÔ¨G}·½ÞèÂîƒMó¾Y¼î­’NÝ%%Kj•––öýû÷ïàpÄl0`6›¦y…CFÇ…RVV&“ɤ„„O0.÷´±ÊÊJuîÜYíÛ·WMMMk%%%éàÁƒÚ³g:tèТG¹\.õíÛWO<ñ„:wî,›Í¦ÄÄDÙívíܹS[¶lQii©$©mÛ¶ÊÍÍUÏž=e±XT[[«„„íß¿_<ð€¶mÛÖbû!‹E[·n-ª¨¨ø¹¤’ª%ÕJ²ºÙurÄËëÞûæ4(s¿Ù‚Ýûª,,Í1­,œw…ÿè ³ƒ%OüÈšCв˜Íf½ÿþûš3gŽÖ­[ç);v¬Ïq#FŒÐƒ>¨+¯¼2¬€¨²²RN§SIII2›Íõþ¬èr¹T]]­ÌÌLeee©ªª*¬×TUU);;[•••:~ü¸ÒÓÓ5j&55ÕSo´ÙívsÎ9êÒ¥‹ª««åt:µ{÷nmÚ´I999#‹B±Ùlž“ÂårÉf³);;»Á[³;NuêÔÉ,Õ%99Y¯¾úªn¹åuéÒEŸ|ò‰$©ººZmÛ¶Õ¥—^ª+®¸"ª‘ÙlVee¥ d³Ù´cÇ 8P)))†×är¹”œœ¬ÜÜ\íܹSv»]ÿûßÿTQQ³áPzzºV¬Xá™ÞYŒº••5Kpͱ]ÁÖ'ªkëz7ïáYf¿ãì±ÇÓðáÃõÒK/é—¿ü¥¬V«,X Î;ëá‡Ö-·ÜÒ˜ê@#ôèÑC¹¹¹úÓŸþ¤yóæÉåriÕªUºà‚ ”àùpñÅ«ÿþ:pà€-Z¤ÊÊJI'ÿšyÕUW)55Uÿþ÷¿uî¹çª´´TëÖ­ÓÏþs-]ºT………JHHÐôéÓ•ŸŸ¯üüü uºÿŠë¾v\vv¶~þóŸëÓO?Õ9眣ÂÂB-_¾¼¹ºbÞ¸qã4kÖ,=ú裞éI>ú¨žxâ }ñÅa×S[[Ûè)L6›M­Zµ’ÓélÐò%‡Cééé:xð Z·níY¼:˜iÓ¦iðàÁ’N¶ß½ ˜û±Ýn—ÅbQbbbý/¦¬V«rsseµZ5qâD>|XÙÙÙJHHðüÿ·uëV-Y²D’tÉ%—¨ÿþ’¤„„uèÐA‡Ö¤I“TPP »Ýî¹%]»vÕüùó•žž®ÒÒR¥§§7¦:ïlÂ?»pøã=eÌ? òÃEmzYS†C m‚2zÎ$5nÍ¡[o½Uï½÷žz÷î­W^yE‰‰‰êܹ³¶oß®[o½•µŒhF‡Vuuµ®ºê*íÚµKùùùúðÃõÎ;ï(++K&“IÏ>û¬Î:ë,­X±B“'OÖUW]¥Ÿÿüç²ÙlZ°`z÷î­/¿üR?þñ•‘‘¡õë×kÇŽš6mš6mÚ¤íÛ·Ël6kÚ´iª¨¨P^^^Ð:ÝÜ¿{;.##CÓ¦MÓ…^(“ɤ ð;„pë­·ê‘GQ~~¾$)//O³gÏÖÌ™3µråʰëq:ž ¦!k ¹§•Y­Öz-€í_OBB‚GXm˜úHôŒrrOK“¤´´´˜üÉÂ… U^^®‡~X555š?~c?ÿíÆîýœKËGš´#Õu¡Á¦–ùm4RÈìw\DÂ!«Õª¶mÛúüb±XÔ¾}{•””4¶zÐf³Y[¶lÑäɓշo_]z饺õÖ[5nÜ8]vÙeêÝ»·$é™gž‘ôÃ_}»u릤¤$IÒúõëÕ¡C«¨¨¨Îs†ªÓ; ç¸+V¨sçΑè 8­ø<»víÒàÁƒ•——ç)tèÒÓÓ•‘‘!é‡_^Ý K{ÿÕ6T}úô©×q±¸u/Ä¢—_~Y>ú¨fÏž­7jÈ!zä‘G4gΜzÕãáÒ˜Df³Ù³ãYCB “É¤ššš°G¡,]ºT·Þz«OÙøñãuÞyçiïÞ½š?¾/^\ïv4”{Ç·””9Ï¡î)w?ùÉO´víZÏÚH­ZµÒ¤I“©•+W.>=kÖ,}úé§Z»vmõ%&&ª¢¢Â³xr}¸§¤%$$¨¨¨¨Q[Çë³P]¿°‡ûËlsþÒ -Y¸O}Öþ©©©Qff¦JJJTSS£ÄÄDO@T׿ûÞϧ¤¤èСCª©©QçÎåt:=‹.»ÿ¸àþ£…ÙlÖ®]»tìØ1åääÈn··Ø`Èí‹/¾Ð\ œœ9NÕÔÔ¨¤¤D­ZµR—.]<ëøÙl6UTT¨¸¸Ø³3™ÙlÖ¾}û § F[Û¶mÊÚ´icX!þƒ`"‘‡4ù4³h 5z(ØÈ!‹×½{äP¢~9”,©uZZÚë?úÑ9êTQQ!³Ùö"¡€–Éd2)%%Eeeeª¨¨Åb‘Õj ;°q‡Q.—KÕÕÕr:êСƒÒÓÓ=a“ÓéTmm­Ž;¦(55U™™™žiW-9r¹\:~ü¸  ‡~X999ÊËËÓÖ­[5aÂuîÜYîÏà‹Eû÷ï×'Ÿ|¢þýûkÔ¨Q:xð ~ÿûßkË–-jÛ¶m‹í‡pX,WTTÜ(©\Rµ~9T«F¹G ùªkä ¾–ÁסÊêÔÜ êÛ…¬®×Dd§2_ÒÒÒš» €(p¹\ª¬¬TZZšZµj¥ÊÊJUWWËn·‡= É{Š™ËåÒ´wï^Ïc³ÙìY€9''Gf³ù´ †¤“ 8ûí·z衇4zôh}ðÁ:r䈶nݪ9sæøôãóÏ?¯Ï>ûLí۷וW^©5kÖhÛ¶mž­áëšÆ}iH®jײ¨iîp(˜`£’ââÝh¼šš™L&%''«U«V!×®óç½+¶÷t27w™ÃáÃáÓéô -=q?­[·Öwß}§M›6)--M²Ûíª­­õL©®­­•ÍfSFF†ªªªôÊ+¯xÖ!r×Uß…ÁOÁ2Œf ‚‰ÕpÈÍ š9A¹\.ÕÖÖÝe+œ×{ß9]B!7÷u˜ÍfµiÓÆ|¹\.­_¿^¿ûÝï|ÖÚ°aƒ=#©Üë0µäT ,»ˆù #ÖÃ!#Fëqá„§Sât¹Gý¸G9Nåçç{Â2“ɤ´´4Y­VŸã½ûätêŸZtVËáP] ^Çå¸4@ôÅIÀ!É8Ø1›Íž-íƒmìO}„wNQW¦Sb% ÖAu­=³ Àé„ð'$£Ûž7*oö5ˆZÊè£Îå] b…QnÑ"²‹X ‡Âí¼ÑÉà´Ö¢sŒ¦žV©‹öŸFæ³Ð“ÿ–‚MíTa´u¤—ÃiÒég±:rQÐTáPCVå6TÇëbr8ˆ+ue¡FÕ§Î&ÉA9Çbe+{·pF ù'n.ÖÑv*‹ð$¼3‹º2Ž˜ 2b-ªO'§¤¤Èáp4g[@œ±X,Þ[ìÒ7-9’$§$1r€$©ªªJ­Zµjîf8Í™L&™Lž<ÈÙœmi¬–ùL'“䪨¨(êÝ»w–;"$â›ÍfSVVVs7@0™L*,,,Ò©ŒÂû©fjRƒ´´pȈË/­ÇL&“ÌfÖÚд¼rˆ?J¥¥‡C.IC<‡4ƒÅê'(Òpº‰É¼#VÃ!Dá@#ˆc„Cq¬¥†C1¹€ˆk-2¯h©á"€p ŽÄ1ks7׺uk]|ñÅêÓ§$é»ï¾Ó’%KTYYésÜÍ7߬víÚéÀúë_ÿ*Iš4i’†ªÏ?ÿ\k×®õ{Î9çhìØ±úꫯTXX¨k®¹&༛7oÖæÍ›}ž;zô¨¾ÿþ{-_¾\v»=h›»uë¦I“&©K—.*//×W_}¥/¾øB.—ËsL×®]õ“ŸüD]ºtÑÑ£Gõõ×_ëË/¿ôáЄ Ô¯_?-^¼X­ZµÒ!CT^^®’’Ï1©©©žçªªªTQQ¡ÜÜ\?^'NÔc=¦òòò€6>\·ß~»,‹Ž9¢^½ziذa0`€^yåŸcÌf³ŠŠŠÔµkW}öÙ:ãŒ3ôÒK/yÎ{Æghûöí*,,”$õéÓG½zõ’Ùl®×1F×N[SRR”žž.éd°#I{÷î•$¥¤¤xê?räHÄ®+Üï9á jázôè¡nݺéÛo¿Õœ9s$IÓ¦MS¯^½”™™©ââbIÒèÑ£%IÛ·oWŸ>}tÖYgé“O>ÑæÍ›UQQ¡Aƒ)%%EUUUJOOWŸ>}tìØ1mݺUýû÷—$åççëµ×^ó9ÿ€$I«V­Òk¯½&‹Å¢+¯¼R—_~¹¦NªW_}ÕçøÄÄDM›6M’4{ölmÛ¶M­[·Öïÿ{wÞyZºt©>¬o¼Q.—K>ú¨ •ššªûî»OcÇŽÕêÕ«U[[+I2›Íš>}ºfÍšå)óÎ1F×N[/^¬Å‹K’^|ñEIÒ<Ð?îú"q]á~Ïkµpr¹\êÝ»·.¼ðBeddèµ×^Óï~÷;Ÿ`ôèѲÛízõÕWår¹tÎ9çH’ìv»¾úê+Y­Vyæ™’NŽn1›ÍZ³fÏ(”äädµk×ÎsKLL hÃáÐû￯ãÇkøðáÏwëÖMúꫯ´mÛ6IRyy¹žyæ=ÿü󪮮V·nÝÔ®];Ï”6Iª¬¬Ô¢E‹$IC‡õÔWRR¢œœM:5h…sŒÑµ…ÓÖúˆÔu…û= Œjá<¨·ÞzKS¦LÑ´iÓtã7jýúõZ´h‘vìØ!IêÒ¥‹ºvíª7jÿþýÚ¾}»úöí«ÌÌL•””hÍš5?~¼FީիWkäÈ‘’¤Õ«Wûœk̘13fŒçñ¼yó §9N©oß¾JMMõY';;ÛÓno{÷îõLÇêׯŸ$éСC>Ǹ»ë¤ 6(--M'NÔ×_mØGáctmîð+T[ëÃÝîÆ^W8ßsÂE8tX¶l™þûßÿ*77WÇ׸qã4pà@Ýu×]:zô¨gJ™Ýnׄ TUU%“ɤѣGkÉ’%*((Pii©† ¢¶mÛjàÀ***ÒÎ;}γuëV­ZµÊóx×®]ÊÌÌ4lS«V­T[[«ªª*ŸòÒÒRI'Ñæøñã†Ç¸»Ÿ—$—Ë¥×^{MýúõÓ-·Üb¸v8Ç][ÇŽëlk}Dòºêúž.¦•µpgŸ}¶fÍš¥!C†hÆ Z°`òóó•””¤ž={Júa½¡áÇëÆoÔ!C|ÊN§òó󕜜¬ë¯¿^V«5`Ô$íÛ·OŸ}ö™çVTTdئªS§N*,, Xy÷îݲÛí9r¤RRR<åwÞy§Þxã Ç][8m­H]W8ßsÂÅÈ¡îÈ‘#8p ºwï®>}úÈb±hĈ²ÛíÚ½{·zöì©ììlè‰'žð¼î÷¿ÿ½zõ꥜œPee¥.¹ä]tÑEª­­U^^žÞ|óMÃia’´páBqÆAG…:ÆèÚòóóÃjk}DâºêúžP¦¿ÖâÞÿk“NNksß{ß,§Ê­§'œº%žº¥HJ’”,éC‡؈ë8m¤¦¦J’Ïб®U«Vª¬¬ô ®ŒŽqïÐÕœÂik}ëkìuµÄïyS+..V·nÝš»âÄêÕ«¿•t¿¤jI5’ª$ÕžºÙNÝœ’ì’\’§{ß\^÷î› ¾6º÷Ö ˜Œ:´Ä€àĉ9&"ÝŽHÔ×¿ç€ØÂ‚ÔqŒp ŽÄ1Â!€8F8LJâá@#ˆc„CqŒp ŽÄ1ks7 œNgs7 E:-¡„„„æn@‹Ä´2€8F8LJâá@#ˆc„CqŒp ŽÄ1Â!€8F8LJâá@#ˆc„CqŒp ŽÄ1Â!€8F8LJâá@#ˆc„CqŒp ŽÄ1Â!€8F8LJâá@#ˆc„CqŒp ŽÄ1Â!€8F8LJâá@#ˆc„CqŒp ŽÄ1Â!€8F8LJâá@#ˆc„CqŒp ŽÄ1Â!€8F8LJâá@#ˆc„CqŒp ŽÄ1Â!€8F8LJâá@#ˆc„CqŒp ŽÄ1Â!€8F8LJâá@#ˆc„CqŒp ŽÄ1Â!€8F8LJâá@#ˆc„CqŒp ŽÄ1Â!€8F8LJâá@#ˆc„CqŒp ŽÄ1Â!€8F8LJâá@#ˆc„CqŒp ŽÄ1Â!€8F8LJâá@#ˆc„CqŒp ŽÄ1Â!€8F8LJâá@#ˆc„CqŒp ŽÄ1Â!€8F8LJâá@#ˆc„CqŒp ŽÄ1Â!€8F8LJâá@#ˆc„CqŒp ŽY›»F²²²Ô»wï€òüüü¯ËÍÍUëÖ­=m6›¾ù曯:t¨’’’|Êöï߯}ûöգŬV«†îSV^^®‚‚‚FÕ‹ÓO·nÝtÆg(''G­[·VuuµŽ?®-[¶¨  @µµµÍÝÄŸEpĤ¶mÛê™gž (Ÿ:uªöìÙcø³Ù¬gžyÆ'r¹\ºä’KtüøqÃ×$%%éÙgŸ•ÕêûkÑ<Ðèp(---à6mÚ¤éÓ§7ª^œ>¬›o¾YÆ zLII‰^ýuýë_ÿ’ÝnbëNü,@h„C &ª¸¸XYYY>åC† õíÛ×'’$“ɤaÆéóÏ?7|Mnnn@0äp8´nݺF´±æž{îQJJŠçqUU•ž~úéfkOrr²}ôQ;¶Îc333u÷ÝwkêÔ©ºÿþûµsçÎ(´OXsĬ¼¼¼€²!C†=~Ĉõ*—NN)ó·iÓ&UTT„ÑB´ãÇפI“<·ñãÇ7[[L&“žzê©°‚!o;wÖsÏ=§ÌÌÌ&j ^€˜µfÍš€2£0Ç­!áQØdt^ R~úÓŸ¬#IeeeúüóÏõî»ïê£>Ò®]»ŽÉÈÈÐŒ3¢ÐJ@ýôSŸ²Aƒì8æmĈúè£|Êúöíë³$9rD;vìx}ÇŽuÎ9ç¨Gj×®*++uøða}ýõ×Ú´i“\.W}/ÏPûöí5zôhõêÕK*--ÕîÝ»µgÏ­_¿>ì‰;tè Q£Fyê©­­UII‰6lØ õë׫¦¦ÆðuIIIºâŠ+|ʶnݪõë×K:9rkÔ¨QÊÎÎÖÑ£Gõ¿ÿýOË—/—ÓéôyÍàÁƒuöÙg«S§N:vì˜vìØ¡•+Wª¼¼¼Î¶Gª¯;uê¤óÎ;Ïs]þ×9uêTÏã?þX%%%u4´ƒIHHPß¾}}Ê\.—žzê)Ÿ`È]þ¯ýKÆ Óĉ}êøÑ~¤ 6ž#ý×¶m[þùžŸ‘ýû÷ë믿ö¼Æ®X±B0|9r$àgÖí§?ý©ÒÒÒ]&L0¬çºë®Sii©Þxã ½ÿþû¡Nrr²fΜéSöÎ;蘒 @=ö˜Î=÷\Ÿç¦L™¢;wêŽ;îPqq±Ú´i£9sæî¾uë­·êü£V­Z´í‘ìë=z\K°ëܸq£O8ÔØ~ ¦U«Võ9Ž!ÓÛo¿­ÿýï>eþ#çÜmŽDÿM™2E7ß|s@pzã7jõêÕz衇4bÄÝrË->ÏïÞ½[0|mÚ´)h8ô‹_üB999žÇµµµ†áP´~s£k_ºt©¶nݪ^xA=zôð”8p€p@Ì`Í!ÓŒÖÿ1 uü×ò_PÚh—ºÖêׯŸæÏŸ4 pëÙ³§þô§?iÊ”)A ¥_¿~Z°`&Mšò<]»vÕ“O>©{î¹ÇðùþýûkÁ‚!&IJOO×í·ß®'Ÿ|2äh+o÷ß@0äÖ«W/=õÔS2›Íš7o^ÐmÙ333õÄOø|@v‹V_‡£)ûñرc*++ó)³Z­>£˜üíØ±C|ðÏmÿþý>ÇDªÿ~õ«_é7¿ùM@0ävÎ9çèñÇyަ͟Ŧ8Ï<`ø¾€XA8bZaaaÀ(‰^½zùlYŸ––¦þýûûóüóÏû<ÎÌÌ øpæÙívÏözúé§ w†2šÚe6›õë_ÿZ£G®û¢¼´k×.èy‚¹üòË5iÒ$Ÿ²ÌÌL=õÔSj×®]ØõŒ3FwÞygÇ ø ¾øâ Ïã•+WêðáÃúÅ/~QçuFB4›ò<;vìн÷Þ«C‡Õ}ÑÐ ˜VbÞÚµk>Ü{‡;þë ¹CÿkÆ “Ùlx½›{qØQ£F|hÿË_þb82`ÕªUÚ»w¯OY]‹c»=:à<+W®ô †ÜŒèuHVø!\ܸ¶¶Ö§løðá!§2•——ëÿø‡OYAAvïÞpì¢E‹|;vÌpÑÝŽ;JŠ^_‡£©ûÑÛ¢E‹tóÍ7Öí¯}ûöúÿïÿiáÂ…Ó“"ÕF?î‘KþÞ|óͰv‹„h½?šú<³gÏ&Ó9b^EE…6mÚ¤3Ï<ÓSÖ¿%%%)--M={öô”»\.O±qãFUVV*55UÒÉ¢úõë§-[¶|.**òla?hР€6Œ9Òð´‘>}ú„uœÑyV¬Xaxì‘#G‚.}Æg”-_¾ÜðØ²²2mذAgu–§ÌjµªÿþA·Fß»w¯á‡äââbŸéE6›Íp;ø¢¢¢€2÷ˆ£hõu8šºý}÷Ýwºþúë•››« .¸@ãÆS§N‚ß¡CýáÐŒ3<»—EªÿÜA£·Ï?ÿÜð5ÕÕÕZ³fMÀH›¦Ðœ?‹‘:ÏáÇ=ÿ¶@¬"-B^^žO8dµZ•››«öíÛû·mÛ6K:9%híÚµžµp¤“£ŒŠ‹‹ÖÁñÝb´ í 7Üv[322Â:ÎhÑㆌ.0:ßáǃoô\¨˜ã•°N°uqB­ù­¾nh]‘ìÇ` TPP çŸ^ÙÙÙ6l˜F¥³Ï>;`]'‹Å¢Ù³gë¿ø…***"ÖmÚ´ x.Ô{1T¿DR´ÞMyžhõ4ÓÊ@‹`45ièС[Ô{oE/N->|xÈ)e’‚nã.÷H¥†wâĉˆœÏ½Pµ£s„ÛæH‹V_7´®h÷ã¡C‡´téR=üðúì²ËôòË/„kÙÙÙ?~¼¤Èõ_RRRÀs¡®=Ôs‘­÷G,½ 90r´î-í½G 6L;wö9Î?Z³f\.—gÓàÁƒ=#‹Ü¼·°—Œ?ô¿ýöÛAGÐø ÷ƒsYYY@Yûöíµsçΰ^ªž¬¬,}ÿý÷†Ç’(--­×9#%Z}ŽhôcnnnÀ.yîÔýUWWë¯ý«Ú´i£k®¹Æç¹hÉ’%ë?£~ô•îsõå¿k›·h½?bé}Íp´þ[Ú6ÌçùÒÒRø”•””hÛ¶mêׯŸ¤“#$&OžìsŒ÷ö’ñ4%K–,BÛX (ëÑ£‡òóóÊÍf³.ºè"Ÿ²ï¿ÿ^ß~û­a=Ý»w×Úµk Ïk´ ¹QÑ­¾G4úñª«® X«ç¶Ûn ¹NÑöíÛÊÜ»¿EªÿüSÉx¢pž3šFØ¡CÃc“““•••´®h½?bé}Íie Å¨kKêüü|æu½Îÿy£êÞ ûËÍÍUnn®ºvíª¶mÛ† ámýúõe—_~¹gG5oƒ Ò¬Y³|nîèFõ\z饆çìÛ·¯úöíëSVVVVïÑJ‘­¾ögÔÇÑèÇ}ûö”M™2Å3²ÍȘ1cÊÜ GªÿŒvÈ»øâ‹•PÞ«W/ :4è9ÊËËFÒtìØÑ0Pš8qbÈkÖû£¹Þ‡+‡@‹±nݺÓ<‚…@þSÍüù¯g”——0Í䦛nR×®]^;`À½üòËúË_þ¢wß}W}ô‘n¿ýöçsËÏϘ†Ô­[7Íœ9Ó'¼HMMÕoûÛ€×»?ÐÕó£ýH7Þx£OYëÖ­uï½÷ÔóÉ'Ÿ„\4º)E«¯«ªª|·nÝ:`4K4úqåÊ•eãÆÓc=¦îÝ»û”·oß^÷Üs.¸à‚€×¸ƒ¬Hõß7ß|£ÚÚZŸã322ôè£úDYYYzôÑGC^£$íÞ½Ûç±ÉdÒìÙ³=‘ÅbÑäÉ“õë_ÿ:d=ÑzDë<«ˆ¸@‹QQQ¡Í›7ûìZææt:õÕW_¾nË–-:~üxÀZ/ÒÉmÖýG{TTTè½÷Þó Ú´i£7ÞxC‹-ÒÖ­[e³Ù4xð`]~ùå²X,>¯_´hQX×S]]­… jÆŒ>åS¦Lш#´~ýz™ÍfwÞyëÛjÏž=žzÞ~ûmÝvÛm>ÇÜtÓM>|¸¾þúk¥§§k̘1»´¹ÛÐ\¢Õ×;vìPvv¶OÙÛo¿­Í›7ëĉzä‘G¢ÒÛ·oW^^žFåS>~üx?^ÇŽSqq±ÒÓÓ•••e8ÂéàÁƒžÀ3RýWVV¦?þØgÚ¦$þùzÿý÷µqãF¥¤¤hÈ!JKK«ó:7oÞ¬ÜÜ\Ÿ²ž={ê­·ÞRii©RSS=¡Smm­ ë‰Öû#Zç€XE8Zÿ-íݾýöÛ ‹;Nåååé'?ù‰a}FÞxã 9Rƒ ò”%''kêÔ©!Û÷Þ{ïÕkŠÖßþö7uÖY1b„OyïÞ½ƒ®ëRUU¥‡zȧìÝwßÕYg¥‘#Gú”Ÿy晆ýåöÔSO5ûVÛÑèë 6èÜsÏõ)KKKÓ¨Q£ät:õÇ?þQ•••QéǧŸ~Z/¿ü²á¢Î!·E·Ùlš3gŽl6›§,Rý÷òË/kìØ±JOO÷9.++Ëgô’{wÿ€ËÛ›o¾©‹.ºÈ³6’7ïú7nܨ²²2;6h]ÑúYŒÖy 1­ ´(ÁœºÖ 6µ,X}v»]wÝu—áâÐÁ|ðÁš7o^ØÇK'ƒ«ûî»Ïpº‘‘ÒÒRÍž=Û3jÈ»žûï¿_+V¬«›Í¦Ç{LË–-«W{›B4úúïÿ»6mÚdøœÙlö,X~S£\.—ºtéâ ]¢ÑÐ]wÝ¥ÜÜ\Ýpà :óÌ3•ššpœÍfÓ®]»´lÙ2ýóŸÿTee¥a}‘ê¿‚‚]wÝuš>}ºÎ?ÿ|Ÿé^Ð+¯¼¢O?ýT¿úÕ¯ê¼ÆÏ>ûL;vìÐÝwß­zê²ÙlZ¶l™,X ¢¢¢:ë‰äõÅÊy Öß a¯5…¸÷ÿÚ¤“#—Ü÷Þ7Ë©rë©Ç §n‰§n)’’$%KúÃðáÃ6â:œF>¬nݺ5w3œ¦Ú´i£=z(==]UUU:xð >r‘솞§{÷îÊÈÈPii©vïÞ­ãÇ7ªžÚÚZ•””hÇŽͶøt}4e_[­Vµk×N™™™²Ùl:xð`ÀîZþm‰F?¶iÓF999êСƒJKKuðàA×9²&X]í¿””õìÙS))):pà€>ì¹æ_ýêWºîºë|Ž¿çž{‚Žà³X,êÚµ«‡:ä3-®!¢ù³óhÙV¯^ý­¤û%UKª‘T%©öÔÍvêæ”d—ä’ä8õØûæòºwßdðµÑ½·úÿ§!F„­¬¬,èÔ¤HŸgóæÍ1SOshʾ¶Ûí*** {ÔJ´ú±¬¬Leeeúî»ï"RWcû¯ªª*b#c‡víÚ‘º¤èþ,Fã<ÐÜXsÿŸ½ûŽë¬Ó†©õ.YÕ–dÙ²-ÛªîݲãîÒIØÝÀ6Èo€^Ú› Ø,xa!”BHuâ—$î‘e˶lõ^lõÞ¦žóü1š±FšÍŒª£ëËç0Òœö»ïsÎDóó]ˆˆˆhcrˆˆˆˆˆˆˆˆhcrˆˆˆˆˆˆˆˆhcrˆˆˆˆˆˆˆˆhã€ÔDDDDDä–7nàõ×_·yïöíÛÓ “CDDDDDä–óçÏãüùóÓMv+#"""""""šÅ˜""""""""šÅ˜""""""""šÅ˜""""""""šÅ˜""""""""šÅ˜""""""""šÅ8•=Ñ]fîܹX²d ‚ƒƒ!Inß¾úúz”••Mwh4”J%6n܈¾¾>\¼xqºÃ±kÙ²eÀ™3g¦;åää ªª •••ÓŠeË–!<<|Ôû½½½hjjBcc#t:Ý4DvwsT¯èêêBee%´Zí4DæšeË–ÁÇÇ.\˜îPˆèSŠÉ!""¢»DXXzè!$''0YÔétÈÎΆ ¨¨¨À›o¾‰†††iŽtfQ*•ˆEkk+z{{'}¿ñJMMž}û Š" ÑÓÓ3eçvUvv6æÍ›wW'‡öíÛ‡cǎ͸äPvv6–-[ƒÁ`}O(æ?ÛûûûqðàA\¼x’$MW˜fªž3{õ*“É —Ë&“ ùùù8tèÚÛÛÇ}¾‰.Wvv6"""˜"¢IÃäÑ] 22O?ý4¼½½qèÐ!äååY¿À¨T*dggcçÎxæ™gðßÿýߨ««›æˆgŽ€€|ãßÀ«¯¾êVKO÷¯ììlôôôÀ××™™™øðçìÜ43ôôôà;ßùŽÍ{sæÌÁöíÛñðÃÃÇÇ'Nœ˜¦'ÎT>göê588ÑÑÑHNNƆ °xñbüþ÷¿GEEŸÎ5]ŸDDžâ˜CDDDw‡z2™ ¿üå/qìØ1›ÙÖëõ8wîžþyôõõáÉ'Ÿ„¯¯ï4FKžòõõEJJ Ξ=‹ÊÊJdggOwH4C ¢ªª ¿ýíoQPP€;w"((hºÃºëuttàÆxë­·ðâ‹/bppO>ù$‚ƒƒ§;4"¢)ÅäÑ ·lÙ2$&&âý÷ßwÚ¦»»/¿ü2±råJ‡Û…††"** 2™ã?üüü R©¬¿‡……!!!ÁiÒÉ“}†S«Õˆ‹‹Ctt´µ«ÇXT*bccgsnÀÜÇÏÏÏz~F???øùù9-»'û¹R§®ÈÈÈ€\.ÇåË—‘——‡˜˜Ì™3ÇáöîÔ¹ŸŸ¼¼¼œž_¥RÁÛÛ‚ x^¸[_ή³£ã'&&"22ÒÚk"¹û ÉårÄÅÅaáÂ…rþcÇŽA©T"))ÉîzWŸ¥‘1FGG#>>Þî}€„„º§³zr÷9óäóÁ]UUUøãÿFƒýû÷;ÜÎÙýåé燻÷«R©DLL ÂÂÂ\,{ç‘Éd EBB‚KIÈ©¸>D4¹Ø­Œˆˆh†Û³gššš\k¢ººõõõÈÊÊÂÉ“'­ïËårìÛ·+V¬€@§Ó¡°°ÿøÇ?000`sœçž{DEEyäDFFZ×ÕÔÔàÕW_Eccã¸÷±Ä¶ÿ~¬]»J¥`4qùòe¼õÖ[´»Ï¾}û°víZë—[I’põêUÒÒÒ€îînë:Wî/w>w<½_·oߎíÛ·[Ÿ‰þþ~œ9sGޱ»;ç[¶lANNŽõúækþú믣¦¦ÆæØS}}ˆhò09DDD4ƒ…††"22ï¿ÿ>DQtiŸçŸÞæwooo|ùË_FLL Nž<‰ÒÒRèõz$%%!''Ï>û,^zé¥QÉ’ÐÐPlݺgΜAqq1ŒF#æÏŸ;wâk_û~ô£¡¿¿\ûh4klÇGii)ŒF#±sçN,\¸Ï?ÿ¼Í€®–}âââpâÄ ”””```‰‰‰Ø±c¾þõ¯ã…^@oo/~ñ‹_ 00_øÂpâÄ Ü¸q€¹+‰#cîçi:øøx¼ñÆÌ݈ ‘••…÷Þ{ÏáEWëüÒ¥KØ·oÂÃÃÑÒÒ2ê8¾¾¾X¸p!Μ9ãò½æ*OêËÕëÜÕÕؽ{7î¹çâ7Þ@KK |||™™‰]»vA.—ãðáÃS?ÄÄÄ`ÇŽ8wîJJJ&싲F£›YËù$~úÓŸÂd2yTO®øÖ·¾…{ï½ýë_mö‰Å/ùK›nv·oßFII ¾õ­oáÀxùå—QUU…ÐÐPæ:¬ªª³¾L&Ó˜ûyZ§ÎdeeAEäçç[ßËËËòeËœœŒÒÒR»û¹Zç—/_Æž={‘‘£GŽ:ÎòåË!—ËqéÒ%—cv•'õåÎuöññÁêÕ«ñÉ'Ÿàoû›uÛ¶¶6ÔÖÖB.—#''ÇŽ³IfLfüžžŽßüæ7(..vûœÎ,Z´lžOž%ÀÜ•ñ…^°bëÖ-TTTà»ßý.>ÿùÏ#//ϦNoݺ…þþ~<öØcHMMŵk׬ëÜ©'Wž3OË4^–ÏÛØØXäåå¹}U.OïW¬Zµ ?ÿùÏmZÍ£¡¡?ü0233­ -wÏ£P(°yófœ={o¿ý¶uûîîn477ã;ßùÖ®]‹·Þz Àô]"šsˆˆˆh³Œ[áir(((ëׯDž l¾¬Y´¶¶âÈ‘#X¸p!RRRlÖUTTØ$,ÊËËQ[[‹øøøQëÜÙ'007nÄÑ£Gm¾XX´··ãðáÃÈÎÎFxx¸µ<7n´Øl¯<'Nœ€¿¿ÿ¸ÇÿqdëÔÚ®–g2Mt* ¤¥¥Á`0à±ÇµÞÒ=.;;ÛnrÈZ­ÈÈÈÀ;ï¼c-Cff&ÊÊʬƒ;O$Oê˓녽{÷bÑ¢EÉdèèè@KK nß¾ëׯãþûøÇ«··ßùÎwlÞó÷÷Ç~ð„††ŽJzò,M´‰®§é,“e¼ á­¦&úþòäxc ìliíèñy.\¸€ææflذëÖ­ÃÖ­[a2™PXXˆ>øµµµfÆ=GD‹É!""¢¬¦¦&“ qqq8þ¼Kû,[¶ þþþ8{ö,:;;áççAœ~i @ggçD…í’®®.ètºQ_‚ÇÚÇßßÌòL¦‰®ÓÔÔTh4ÔÖÖÂÛÛÛî6---X¸p!üýý­_=uéÒ%dff")) åå刌ŒDLL̤ ëI}¹{CCCñÕ¯~Z­¯¼ò mZXÄÄÄLiü“¡§§~ø!vìØ¥K—Ú´2óäYšh]OÓY¦ÄÄD°$=Ñ÷—§Çó÷÷wz\ËzK’×ÓóTVV¢²²r¹±±±X¸p!Ö¬Yƒo|ãøÝï~‡¢¢¢qÏÑÄbrˆˆˆhÓëõÈËËÊ+püøq»ã §R©ð¹Ï}EEE8{ö,š››¡T*â°»‡\.÷¸eÒx´´´@£Ñ ((Èå/ÕÍÍÍP( Ekkë$Gè8†‰¬Óììlôõõáç?ÿ¹Ã.<111xöÙg‘‘‘>úh\ñ—”” §§™™™(//Gff&t:®_¿>®ã:âI}¹{ÓÒÒàããƒÿú¯ÿ²ûŒŒõ¥z¢ãŸ,§NÂÚµk±wï^ܼyÓz¿xò,M´‰®§é*“Z­ÆŽ;ÐÚÚŠêêjyzgÓQ&A°{÷nøûûãèÑ£ÖP㹿ì}îŒçx+W®t¸nõêÕhkk³¶.t÷ÞÞÞãêæID“dzB3œ¼gïuäÏÎÙˆWùˆE s—8€­QQQáã(}Šô÷÷ÛLáJôiQQQ€€¬X±™™™ …¯¯/BCC‘––†ûï¿YYY¸yó&þú׿ڌùQ[[‹Å‹cË–-Ëå$ ¾¾¾HOOÇ£> Qñç?ÿÙ¦«ÂÎ;QQQá°ûGjj*ÂÃÃqêÔ©qíSSSƒE‹aÛ¶mP(̽Ýår9æÍ›‡x©©©xÿý÷mZÔÖÖ"%%[·n…B¡€(ŠP«ÕXºt)}ôQÀþðë ½&“ óæÍCZZDQ„¯¯/ôz½ÓY¾ÆÚÏ“:µç¾ûîƒÑhÄ»ï¾ët;Àœ$Ü´it:µ><©sÀü%3-- Ë—/GWWÞ|óÍ1Ï?\FF""" Õjïpéìì„N§ó¨¾Ü¹ÎíííÈÌÌDFFz{{¡×ëЬ¬,<öØc8{ö,‘ŸŸ¦¦&—ên¸Éx†œÕmPPШkf!Iz{{±råJ TTTðìYrcRR,X€“'OÚ }ëÖ­hjjBaaá¸êÉÙsæI™œÕëÈ{6!!K–,ÁæÍ›qàÀ„††âäÉ“£žOî/gåòäxÖV=ô L&¢¢¢°yófìÚµ EEExï½÷¬Ÿÿîž§¹¹Ë–-ÃÊ•+¡Õj188Fƒùóçãá‡Fdd$^}õUëD ž\ŸgŸ}÷Üs*++Çì&Mt7©¯¯op€€iØ« €8´HC¯úyä‚a¯SŽcÝ$IÂk¯½†7n ''ëׯ‡ ˜ÿÝÅd2¡±±¿ÿýïíN…>00€Ÿÿüç8pà6n܈;v0O[\TT„×^{mÌ$Æd±Ä¶wï^¬[·÷Üsu]SS^~ùeäççÛìÓßß_üâ8pà¶nÝj³OAAÞyçQ³n½òÊ+xôÑG±wï^À»ï¾‹“'OŽŸ£ý&¢NÃÂÂ0wî\;vlÌ8󽪪*dffÚ|ôÔ¥K—°oß>äååyt,//¯1ghjhh@OOGõåÎuîëëÃoû[<øàƒxüñÇ­Ûõôôà7ÞÀ­[·““ãv-fÚ3tõêUÔÕÕ!''çÏŸGoo¯GÏÒDó´žÆzÎ&ªL#ïYQÑßßööv|ôÑG¸pá‚Ý„…§÷—£rç~ýàƒû÷ï·¶ÄÉ“'ñÞ{ïÙtOu÷<:¿úÕ¯ð™Ï|÷ß¿M×ÜÚÚZ¼ôÒKÖd$àÙçwGG§í¿9D䘽Ö?ãÙ×Ý–CÃ[ _äCï+†~W-ª¡E@ À Àfdd,G9ˆèS¤¹¹Ùnóf¢OoooCE477Ãd2¹´Ÿ ‡R©ÄíÛ·Žs3‚ƒƒ„ŽŽtuu™´ðòò²vÛhnnÆàà Óí}}}áç燶¶6»­!<Ùo¦×©#ÙÙÙxì±ÇðÓŸþSv^OêËë‚°°0ôõõ¡©© F£qÂbîžëíî³4Ñ<©§±žÏé.àÙýå¬\žÞ¯*• ‘‘‘0 hjj³.Ü=··7BCC¡P(ÐÚÚŠÞÞÞ1crõú¨T*èõú1Gt7¹páB!€ghè Ð-†¡E„¹E‘ÛE#[ÙkM4²e‘³–F}829DDŸ*L¹æ©§ž‚··7žþùé…ˆˆè®öiHq@j"""¢YfÁ‚X°`NŸ>=Ý¡Ñ À1‡ˆˆˆˆfìÛ·’$!++ UUU632ÑìÅäÑ,ޤ¤$ˆ¢ˆsçÎáèÑ£3v¼"""šZLÍÕÕÕøÑ~4ÝaÑ Ä1‡ˆˆˆˆˆˆˆˆf1&‡ˆˆˆˆˆˆˆˆf1&‡ˆˆˆˆˆˆˆˆf1&‡ˆˆˆˆˆˆˆˆf1&‡ˆˆˆˆˆˆˆˆf1&‡ˆˆˆˆˆˆˆˆf1&‡ˆˆˆˆˆˆˆˆf1&‡ˆˆˆˆˆˆˆˆf1&‡ˆˆˆˆˆˆˆˆf1&‡ˆˆˆˆˆˆˆˆf1&‡ˆˆˆˆˆˆˆˆf1&‡ˆˆˆˆˆˆˆˆf1&‡ˆˆˆˆˆˆˆˆf1&‡ˆˆˆˆˆˆˆˆf1&‡ˆˆˆˆˆˆˆˆf1&‡ˆˆˆˆˆˆˆˆf1&‡ˆˆˆˆˆˆˆˆf1&‡ˆˆˆˆˆˆˆˆf1&‡ˆˆˆˆˆˆˆˆf1&‡ˆˆˆˆˆˆˆˆf1&‡ˆˆˆˆˆˆˆˆf1&‡ˆˆˆˆˆˆˆˆf1&‡ˆˆˆˆˆˆˆˆf1&‡ˆˆˆˆˆˆˆˆf1Åt@DDDw72„©’ †BPOw8DD³’QÒ¡ÛØ€VC9$ˆÓÝe˜"""¢q SÎGˆ"aºÃ "šÕ‚!ÊD@‹¡tš£!¢» »•Ѹ(b¦;""ÂÏd"ò“CDDD4.ìJFD4sð3™ˆ<ÁäÑ,Æ1‡ˆˆˆè®#ŒHË   . ¢Ä?iˆˆˆˆ<Å¿¤ˆˆˆè®37¤Ÿ{f$½?:‰Ê¶ÅÓÑ]‹Ýʈˆˆè®â-ïÄÆ :Î[ƒÀyk°qÞòÎ鋈ˆˆè®ÅäÝURâʾû³€¶‚¶ i»ïEJ §m&"""ò“CDDDt×ðQ´"k7ÔÁ)´e´¥ð MEÖ5|mÓÑ]‰É!"""º+:¯ ©[÷AÒV¢utÕHݺKâK @šî0‰ˆˆˆî:LÑ]ÁOÙŒ•ë‚ ö´5€$™—Á*¨“½Þ~ªæé“ˆˆˆè®ÃäÍx‚`n5”¼n;$] éHæEÒCÒÕaáڤƗAØzˆˆˆˆÈLÑŒç§hAæºp(}çºXC–EW•<2×ÀOÑ2½ÁÝe˜"""¢M€„%s˼z «$ã.eÖÅè0õF,Š/ãØCDDDDnPLwDDDDÎø*Z±6*Ÿ`°ó>úf¨ý"k•? k[ÑkŸÒ8íùìçïJ­Äá7>Fwgï˜Ûg¬^‚äÅóðÚÿ¾?®mܱûþMÉexÿB’l+w×}¡×pâ½ór.WãñôµþÞÞڅƆVæ—Ád§äüý}ƒøèÈ'“~.""¢™‚-‡ˆˆˆh“°dn)¬\ IßI!9úŸd„dh‚Õ+°8¾޳HS#>)Ùë–byv –¯HqiŸ¨¸p,ËZ0îmܱpi"ÖnÉÀúmY£Ö-X’€¤Eñv.WãY˜š¿_û!kíR|î‹{ñÔ|Q!n+sM*¾÷‹¯ ÈÏ­ó'$Ǻ6Ñ]É!"""š±‚Ô X±Þjß ÀÐa§;ÙˆEßµV¬õE úö´Æž¾r1ôz#jš¾j±Ãíd2 ¹Óc¹²ÍHr¹ ^µâ IDATµËÛo¿w"cÂ\Þ^¥Vº;oµâwÿõ~ûŸÇOžy ¿{áðõ÷ÆÃ_Ü ™Lµ½£²ªÔJøùû¸µÏpcÕûXÇP(äP(7ÔŸÌz$""r»•Ñ "A%„JÞ‡@ïNd/©AòÊ= m\éRd‚dhÇ‚UØ\v —nö¡{0Z“ ¢€ÑI‚É —˰4kŠ®•£ª¬>· sbÂÐØÐjÝF¥VáÀçrš¹ …yço@¯3ØÇ•mF öÇgÛŽäÅs!ÚZºpðµ“(½QåpŸÆ[­P©Txð‰ÝøÕOÿ “Ñdw;™L†mû×"{Ý2øúiÐÙÞƒ£oŸÆµÜbÀš-ØóÀ&üâBKc;àÙÿü"¼}¼ðïý &“_?o|÷…/ãÃÃ]î®VYR‡÷ÿq |q/–e§àê'Ec–uÿ#9Xµq9àÿy©hÀÿÿ³×\®ŸÍ»V!gï@yq ÞüÓ1ôt÷¹TÇsbÃñ™Ç¶#vÞ@}Õm¼þò´6u¸TDDDS-‡ˆˆˆhÊÉ#¼ä]PÞB´_–Å\Æú”±+óØž/}¡_ý?~Èyt+^~€iìñz ‰æÅØ…W rÛ„§¾é‹'oÁƒ÷äcwÆXŸò1–Æ\F´9”·á%ï‚L0Nxù¤&ÀÇGƒk—ŠqãJDQÕzèÀçr°|Å"||4þÕÛP«UÈð`›áAÀãOsbÃñÆŸá/¾þÞ<öåýN[¸huxý‡ŠmûÖ:Ün÷ý›°.'ý¿{á(¹Q…‡þmæ uÃ*½Y™L†¤sW´°ˆ`‡ÀK£FlB iQ<ärJoV;¯ÄÌõ(!:.Â¥²^ø0>º xýåÃ8ôÏ\®Ÿ¸„(ÌO‰Çß~{‡þùæÍÅ£_Þïr?öå{áí£ÁË/¾?ýÏ›Ðøhð¹/ís¹‰ˆˆ¦[Ѥó’÷ À«!ñëF€¿ásˆÀð@¨|¢¡Ð@¡ö37wC›¹ËØ(ÒаB#¦µ—$@ß¹R… ¨XEÇcäd0êú`ì…¾¿Ýmhª«A[S/º{ähï @s[ºu¡ÐšüÇUÞô•‹18 CéÍj˜Œ&”×bùŠE8òæiH’?o¤­\„‹_³¶ž)¹Q‰ÿó“ƒÚK.m3ªF$ ÿûÂëPªèlïh4j<òŽˆŽ@eIØk*náãc¹Ø´cŠ *QSÞ`³ÞÛWƒU›Òpüà9œ9žÀÜ¢'.aÖnÉ@uY=Úš;ÑÚ܉ù‹æâ‡ù˜¿x.º»ú ×ꑼh.jÊ0Ñ\ôõ¢¾ºÑ­:E=Ý} r¹¬––:5å Öm\©A&àÏ¿~:­Þzþ}mA|bj+o;=Fmåm‡àZn1Ê «!I@CML&“ËõHDD4Õ˜"""¢IµdÎedeé˜ÿd(}B WÍF5< „¡DÓîcÒWidRwö•Œ€I;ìXæõ A…Ÿ0DF".U@£~†þnô´·¢êæ-\ºâÂÆ Êë¥Q#eY*Šk:”Ȩ¯nÄ‚Åó¸0ŵ‹ † ¨(®½S2 ¨.¯GHX¸´=:± s°n[Âç„ &>Ò—רãxï<¦&àÁ'vá¿ÿß?Ù¬‹˜¹\†”e‰ˆê.¾~ÞPW§¤ Yë–B&0?%¥7« Ð!iQ<Ž<‡ù‹æ¢ôfÕ¨™Ñ\áíã…¾žþq•Õ•}nÕ4Ù$†*KÌ× |Nj+o;=†Ñ`DþÅBd¬ZŒ¸„9(½YÒ›U()¨r«‰ˆˆ¦ÿ DDDD“*À·é[VA ˜\HdI‰#~ÇÐ{C?JIwÖA4ÿ(Ãtg;äPø)¡ H†hJJJ<,-š‘ ¥RŽ”¥ HYš`³.}åbT×Ú ÙR, W¶I¥Vá«ß{ þ>¸™_Ž¢k(¾^‰}mq)v“Ñ„üá¾ú½Ïcσ›mÖÉåæ™Ûš;ÑÖÜi}¿¾¦ zýqŠ *±.'q‰ÑH\‡7ÿr ƒ:¬ÝšØysä‡â‚J—â.2& *•ÒÚÈ“²zZ?–[M&—¹tŒ¾|y%X¸4I)ñX½) %7«ð§ÿyÓåz$""šJLѤºZµ±ïœÆÆ‡¶C¦“~윶ž‚yœ!ë>ö’BvŽ1²¥ d0êûqþ½\¯Îô°´æPß þ÷ç¯Ûäqv~vR3’ñΫ'¬ Ž„äXÜÌ/³nŸmýÙ•mFŠOŒBxd0^ûÃ!ë ÍK³ºÓ­6{û vß¿ &“ˆºjó¬o-í†^?>škÝ>,"Ý]wÆ„ª.«‡N«Ç–]« R«P^T ƒÞ£QÄŽë!Š"Ê ÝoH¥VbÕêq5·Èí²Ê†2®î•Ziü;aAìPtŒy ¹\†ð ÔTܲ&Á>óØv¬X¿ A!.×#ÑTbrˆˆˆˆ&Õ€)'rÀÛ÷$²ön‡\æ5Ôåk¤‘­‚F'…$Ëz»Û`X¢È’8«%ÑÐÏr/ˆ&9.»ŒSy)0yTÖ€ ?$,ˆÅůáv}‹Íº+çobÁâyX¼< ×.£àJ)VmJC{kê«‘¹f ƒü¬Û÷v÷¹ÍH}½€äÅóP[y¾Øîd€iGΞ¸ŒEË“0l€äžî>ä_,Äæ]«ÐÛÝúêF$¥Äcïƒ[pñ£«8øÚI€É$¢¬¨©éɨ­¼Áóµ®,©CÊÒT•Õcp@çôü~þ¾ÈZ·Ôœh Ä’ô ñÛù½Ýý.—µ§Ë<»ØúmYÈ;WàrýÈd~r/>:ú ‚CpϽëÑØÐŠšòDÆ„9=†_€žùÑPVTƒ#ož†Z­D\btèîêƒÉhr©‰ˆˆ¦“CDDD4éÚãpèCrÅ dìÚ™LDK‚Èy²ÇiBÈQ²ú IŽHCï *ˆ¢ ù'¯âÈ™ùhô|ƨ´‹ ®]=%yÑõ èõF¤¯ZŒk—Šñö+Ç¡T*°÷ÁÍ7òËðÉékX—s§Õ’+Û ×Xß‚|‚÷¬@ƪÅèêìÅÙãyØóÀf»Û;"I^ÿãa|ý‡_°yÿ¿€ÉhÂg?ärDQDþ'…8òÖÇ6Û_¯Djz2ʆµ*½Y…”¥ .u) Ä}Ÿ¿¢(¡£­ ·ëšñ×ß¼ƒÆa 7WÊZ\P‰¢ë•Xµq9â£ñâÿäRýT×¢­¥_~ö0õ÷ß¿I’ÆøøjPt­Âz}²Ö¤¢²¤í­].ÅLDä ¶"""¢i$A’DÈÐÿ@¥yf2IšÐE‚ƒh€Þ¤‡Á²ˆz$ý„w+óðE@/ ®”ؼùÜ ¼ùç#æ˜äì]ƒÌ5K`4š´0ŸytJ¼4J¤­HÁ¦+áàƒ¹‰ÑØÿHT*¥Óu–c.ÏJAgÄ¢e‰ØûÀfëK9{× su* É‹æbïÃ[ “É ME ¢I‚Áh´‰ÙÞ:Gq§T)pàÑ혿x.tHÍ\€ Û³]ª?V‡â‚JÄ'Fy¬‘ñ¹rÞÕ›Òá㫯7ö?’ƒ9CÉgûªÔJxt;B#‚`бiÇJ$/™7f»Rc]Ó]÷mÄ’ôd"VlXê°Õ^«Ãà€KÒç#84ÐPÓ„Kg ƾ&’¹‹–Zmn%Ž´ì…èïÓº\ÆáœÝS–òªÔÎïõ‘JnT¡«³+Ö/Å¢´ùÐx{áÒÙÖøœ=K*õÐý)i+Ràçïc]—³o |ý¼–ÅžQÇ…ãûÊÞy\¹lâº>Ê¡z™Žå+R00 s+n"¢±°åM ¢dN ”²^„†©ÌÓ×{°‘$à'ùèM ˜{§ ½ÔJs2Èd°4$ 2ànÀ팃$sšH’ÌÝÐL>˜W» wvpM@  ½Ýý6ï‹¢ˆÞž@DTæ%ÇàÍ?C{kdr9ê¤&àVM# øZ*Jêà苇þm7B#ƒ1Ð7àpÉhÄÜùÑøûïÞG_ï®ç•౯ìGT\Œ#æ%ÇàíWŽ£µ©y%È\³5ªÊ°piº:ºqãr©MÌ#×9‹»0¿ÌºŸÉ(âÔ¡ hkî€É$B¯7 kMªËuØÓÕ¿ ß152>™L6æyëªo#÷ôuæ¤OZö"4Ö·8=·4Þjä碵±e…Õ0‰"¢BÖ¹¥õŽ«õa¢ˆ91aÖúV«UøüS÷Ú­3“IÄ{¯BæÚT|ö_v ·»…WËQ\P ƒÞè4†úêÛÐé ˆOŠBYa ’cQWÝí Öå2:»oÆb¯ì·ëšm¶‘$ çŽ_ÁþÏmE‚Á„‹]…N«séYr&ÿb!*KêÆÜn,Žî+{çqå>¹½AoD|ÂT”Ô!!9 ÕÍìwÜDDÃ19DDDDSèNRHjÕ#I"Ôª„E¨!‰&kë÷Ž ´™Œø—ûA ÖŠþЋú;¹!HÀï<ñMkBHöúÏ¿ÔÁí•¥õ˜—ƒ‹æOHÜDDÃ19DDDDSœ J %‡DI„ a]Ðøù¢Þ£äÐÐ p£ó0LíËdÉd d2Ô2 ’Áf*{IèÆåöW JDQ„I!Š"¼å¡OSÝÝÙ £Á„„ä]¯°¾?7)i+SpèŸA§ÕC­RB©RZÇëññÓ ­eؘ'ÎÎogN«‡('ž³F§5 6aT^ ¨Õ*è´zæÖ Fƒ¢‹³‚YÎ1fÜ0ȽuÏj||ì>9} Q!ÈÙ³Æåó$.ˆEKc›ÛÇre[_ïa?û@¯Ó»´ïÙãyÈ¿xQ±H_½A¡¨«ºí°ÎÝ®{×T§‡Z­„J­„^gnõæãïc·ìþ¾ˆŽ@éjhµ(.¨„vPmûÖ@®cNL¸ÓÊŠª±ï¡­ˆKŒ‚B)GMÅ­¡²8¾¯&ŒÏÚ@ß4ÞjkÒÖÙ=i9¬¥;–ݤâ9æè¾²wOÂìyp bâ#¡T*P]19qÑìÆ1‡ˆˆˆhÒ9L -!]Pyû’®ÍB@(ü-g0ÏJf2Âh2™£Ñú:`èƒÑd‚Áh4/& ý0X¶¶L¿3 F\¹Xˆ•—cajü}‘”u9™èîìƒAoÄ­Ú&,^žA37AÁþ¨­ô|ªûÛu-D1sç ·g*µ ›v­‚J­4ŸÏ`Ââ´ùÉ̃ ÿËSŸ·¯ÆsPH uÌ™‘屬s5n_ tZjÊ`2š°05Ñiì>¾ù!:>Ûö¯CPhò†¦'ëXÃãså¼ –$@í¥‚ /’cQ?ÔºÄÙ¾Q¡ØÿH¨,©Ekc‚üœÖùxêⱡ &“„%iÉÉdHJ‰‡ÆÎìY€y`ìu9™È^¿Þ>‡bþ¢xôt›[ãŒCkcúºû±nk&ªJ묉 WË8’³{j"9»'ûz šD,ËZˆ d­]êöñ5>^ðó÷¶.r¹ý¯NŽî+{<¹ZÛÑß7€µ96ׇˆh"±åM:i(ys§ —¹Åù"¼û¡ôò cük¾(ƒ ¨Ba2  ÷ƒ¤oƒ$£FÑ44™A!“É £ÑÞÌÒzHE`×@Õ×.A4‰È^¿ o5LFJnV㓯´ƒZœ8xw¬@ÖÚTˆ¢„ó壩¡Ëà€'Þ; ÷dcņå0è ¸y¥ }½æÎh–óe®Y“QĹ—Ñ74RÑõ lØžþuþúÒ;6ǹÎQÜÃU—×cqÚ||þßï…^oDuy½ÓØ7í\ H@_ïšÛñÆŸ¢¿wÐ¥c ï84æyë*oãþ/ì„·jšpõ“¢1ÏÓÚ܉îÎ^Ü÷øÈär öâÔ¡ cÖ¹§õa1Ø?ˆÓÇr±~[2Ö,A]åmë,i#uwö⣣¹Xµ)˲Ú[»püày—c(-¬AöºT”ÕÞ‰ÁÅ2ŽäìžšHΞ%¸xúVmX޹óc‘{æ$7ZÊÀ–]«l~ço'F· ‚ãûÊOï‡ò¢d®^‚]r« DD®ro”ű÷œ¼ŽüY€¹å’åuø"z_1ô»rhQ -j^þ3##cñ8ÊADŸ"ÍÍ͈‹‹›î0ˆf•ïclai%dn54òg¥loü[î_ ©×Ñ—ª¡¤:ºÞ”\-Çó”שK}¼< ß¼z)kçaPì¶v'³Œ=¤’k`µ€ X“O ™ô¦As‚H­ "/YÞûëm$Üø, çO%óôá:­Þa75·´ƒ:»±Ù?§´Z­Ýñ’4Þ^æ®BCSp'WȶH¹n̸ÀÇ׃ýƒnu]óôXÖø\ØV¨ÔJk;WÏ#Èxy©188ºnÕ¹«epD P)•ÐÙIJ8:Ñ`t»|c³Œv8»§&š£{R.—™Çï}8‡÷•ÝÝ¿K3"5#¯þþ=—®AñÀ—ŽKDãÂ… …ž  0@?´†€æ§Ø4ôûðEö:¬©ô¨Ÿí½çÑ[Ñ´RÉꈖ¿—† ¨‚ut}½(þä2.äêq©2탉œ*èBö¥bôÎï…·<>ŠPkb0ië7¶Ã`6ƒ˜$A©P!X9Ç:S™ù ¤840õÄŒé¡t>Ýôà€ýA«ÇwNÇÇtv>g_âG®3n è£u‰Ë\8–5>¶•$Éþø1ö•DÉa¹Õ¹«q9;¯K‰¡±Î3Îk2fí˜ÊîOŽ®É4::ÞWv7výZÈå2lÛ¿Q±áøðÈE¿òÉ!"""šd–Ã`žhÞÜmK0ÿ¬’ëî5b0j‚*ðŠ„~°ò‘wiçJãÐ6Iä‚yÛN]8ŽßC—©ïõœD ŸŸd % 0 3 sÝbŒF›¨ ‚¯½sº6•92i¨¡$Aêöç—0"švr¹ÕeõÈ=s­Žg«#"/&‡ˆˆˆhÒ Ì]º†~“AQÐ À/PIÔC’A A ý@7j/]Ann?.–& u ¢Èd ÝIÞæÿ )Ý YàíÝŠ• ª°"K…ø%ÉøFÞeLæ¨ïLe#´­JÄ_ß?4å½Ìü Ù¨ñ‰ˆˆ¦ƒ^o@ɪ郈f&‡ˆˆˆhÒ ‚H2@aNP4'ˆøhôPxù ?ÈÓ¡ïë@í¥\\¹<ˆÜ²D4DB2 ò¡–E#Œ,iA@»6ÇnDáJE2ŠÐ× ƒ1Êœ6•½A0\ÍÄÍvLÑ”°$_Äac(Êr Ðöô¡¶(ùWŒ¸R=­%2HdCé ’CÂÐïmÚ8/ŽE“×ÛX`4Àhº3þ‰À ˜§¬7'†,c11DDDD³“CDDD4…sF†~ÑÔ=¼}-]A(oZˆ.}8DI€ H Ò°Ù‡ì'ˆF&†, a(Ù£7©a4™F9dL A.“ƒI!"""šÍ˜"""¢ip'IÔ«Æ…QCI 2A‚ HCà 9N>äèä’ ÀW_EØq, &©L ÑlÇäM#a(‰ƒ¡q(Id“’†^­ûžò~øÿ °ßzðî+%d¶{H ë œÀ²ݘ"""¢d¨E‘ùÇ!–V>æŸÍ0o›ºóÎÂÛ»'>L"""¢O&‡ˆˆˆh†³t3ÿÌN`DDDDK6ö&DDDDŽ%Ýt‡@DDCø™LDž`rˆˆˆˆÆ¥ÛØ0Ý!Ñ.~&‘Ø­ŒUæãú IDATˆˆˆÆ¥ÕP @ " A=ÝáÍJFI‡.cÚ åÓ Ý…˜"""¢q‘ ¢ÕPŠVCét‡BDDDD`·2"""""""¢YŒÉ!"""""""¢YŒÉ!"""""""¢YŒÉ!"""""""¢YŒÉ!"""""""¢YŒÉ!"""""""¢YŒÉ!"""""""¢YŒÉ!"""""""¢YŒÉ!"""""""¢YŒÉ!"""""""¢YŒÉ!"""""""¢YŒÉ!"""""""¢YŒÉ!"""""""¢YŒÉ!"""""""¢YŒÉ!"""""""¢YŒÉ!"""""""¢YŒÉ!"""""""¢YŒÉ!"""""""¢YŒÉ!"""""""¢YŒÉ!"""""""¢YŒÉ!"""""""¢YŒÉ!"""""""¢YL1ÝѧŸ$I ADdät‡âTsSº»Ú!Ât‡BDDD4e˜"""¢I‚—^ú%æÍ;c/’$¡ºº_ù÷¯¢§»cºÃ!"""š2LѤ‹ŠŽ†ÆË ÅÅÅ$iºÃ±K!*:šÉ!"""šU8æM ­V I’põêUttt ££W¯^î°¬qH’­V;ÝáÌ2ÿL$""š-Ørˆˆˆˆ¦TRR>ùäÀŠ+\Þϲ3+W®t+Kb(++Ë­ýœyê©§ —ËñË_þ¢(Ú¬ûÊW¾­V‹?þñv>göïß´´4<÷Üs6‰¯ý×Ell,~ö³Ÿ¡¿¿ßúþã?Žˆˆ¼øâ‹øç?ÿ‰óçÏãùçŸW ;vì@vv6~øÃŽë8DDD4y˜"""¢)5'žxbÔñ[[[Q]]ôôtë{™™™Ĺsç™™i}ß²%¡têÔ)<óÌ3Öõ§N—¾ô%|ó›ßıcÇpêÔ)üÇüär¹uFƒï}ï{8qâ>üðC|ûÛß5v‘B¡À¿øE›2ïÞ½{ÂÊLDDDîcË!"""šÕÕÕhooŸî0œ ù¿ìÝyxUÕ¡ÿÿÏ9'óÀ"a a 2QQ@àR™Eªb‹X¿^)¶ZzŸjµ½H¥ÕÖÖz¯‚óµNe( U2HŠ!!!!óöþýršNæ Ýï×óì眳ÏÚk­½wÒ’k¯ÕµEê)))ÑŠ+ô׿þU‹-Òßþö7¿å/^¬Ù³gëå—_VVV–&Mš¤§žzJ¹¹¹Úµk—RRRäp8” cÇŽ©wïÞŠ‰‰‘$ÅÇÇkÏž=JHHP@@€vìØá·””Í›7Ï;JgôèÑÚ¹s§¶mÛ¦'žxB;wÖ¹sç4räH}úèî»ïÖÆ[äœ@ã€6Q=„1MÓ'ð©þ¹ª\ÍïkîkjÛµíóW¦¹V®\©«¯¾ZO>ù¤,Xàó]ß¾} qãÆ)>>Þ»¿sçÎÞ9$)))I3gΔÝnWBB‚RRRTTT¤„„½òÊ+3fŒvìØqÑÊhUvíÚ¥ŠŠ 9R‡C‡C)))ÊÍÍÕ‘#G” Ó§O+44ÔûHYmŽ;æ}_TT¤S§N)""B’+»Ý®;wz˘¦©Ý»w«G’¤~ýúÉáp(55Õ§Þ/¿üRwß}·wtSsÏ4s€6S3 ªí;Ÿ«öUm i«¶²m I’ËåÒo~óEEE顇òù®jþœ'NèàÁƒÞmÍš5Z·n·\RR’ÂÃÃuå•WjÔ¨QJIIQJJŠâãã¯èèh%%%ÕÚ§Ó©]»viÔ¨QJHHÐñãÇuêÔ)I•£v4jÔ(¹Ýn¥§§×y>u]·êsÕV¦ê1µš¡ŽÇã‘ÍfóÖÑÜsÃÈ!ÐnêATõYò?b¨)NC‚¢–väÈýÏÿü/^,—Ë¥ÌÌLIÒÑ£Geš¦Ž=ª·ÞzË[¾wïÞÊÍÍõ~Þµk—JKKu×]w),,Liii*//—ËåÒý÷ß/ÇsÑHœšRRRôàƒªsçÎ>¡JJJŠæÏŸ¯3fhïÞ½*--mòyfggK’FŒ¡/¾øÂ»èСÞ÷Uçûÿð‡?ÈívëñÇW`` <þõ¯éÅ_ô)—˜˜¨ &ø8ÉÉɺöÚkôxÕÑ£G•““£Î;+##ûßåriçÎ7n\‹ŒÄyöÙg¤%K–Èn·ë‹/¾Ðš5ktÛm·yËüñ”aúéOªÀÀ@•••饗^ò®xÖRç ®9Kø;ÖVÇkÍ÷6UŽ\ªz­¾9.ì¸ð9ðÂta •,)DÒ3£GÒŒóð=ræÌÅÆÆ¶w7ÔPTR®í[7Ëív×¹R™¿Ïõío¨ÚŸšó挻~b‹¬VÖŠŽŽV~~¾ÊËËÛ´íÖ¦   ÔZ& @QQQÊÉÉabiÀwZRRÒ~IOH*—T!©L’óÂæº°’Ü’LIž Ÿ«ofµ×ªM~Þû{­®Iÿµ‹‘C M5uÔPõ§¡AQ]£Úcþ¡Ú¸Ýnï$Ñߥ¥¥õÎ_äv»uúôé6ê¨ áhsõDUû¤–´¬!#ˆ¬„p´ “?·Öˆ¡úÚnèwV@8ÚLC¡¦Œª*Û˜ ‡P áhSµBÍ1TWÐóü'OªÄ#›ìÞz Ó”)CáŽhýlêÿç­ƒÀXáhM}¬¬æ±}´¬ÈuF?½õÙmvŸF†éÑ ¼J „va³ÙøÙ\2‡@›iÌce5÷ûû¾¡mž¨H”K…²É.I2LC¶2Zéó=zhâĉЉ‰ÑÙ³g•ššªÌÌÌVi«©uß}÷iÛ¶mÚ»w¯w¿~ýtã7êoû[«´ª)S¦(..Nn·[Ж-[äñxZ¥½ºtêÔIóçÏ×›o¾©¢¢¢&×óƒü@Z¿~½wß½÷Þ«ììl}öÙg’$‡Ã¡ûî»O›7oVqq±~øa=ûì³^±í¦›nRNNŽ’““›Ü_j²·w€µø{|«¶Gºªö7ku2™r.¹<.¹ §wsnIfí7ÅàÁƒõØc)<<\_~ù¥œN§xàÝpà -RK±ÙlŠ×wÞ©ÈÈHïþÈÈH 4¨ÕÚ½ÿþû5lØ0edd(++K“'OÖ­·ÞÚjíÕ%88Xñññ lV=åååºþúë½af·nÝ4jÔ(7Î[&66VW^y¥Îž=«œœýýïWnnn£ÛŠUttt³ú @MŒm¢¾Çʪ—i舡Ú1«^Ö4/„C¦SÒ¿+³Û\•sµàè!»Ý®yóæ)))Iï½÷žwvv¶æÎ«ôôty<Mš4IÛ·oר±c ´´4ï›Í¦1cƨwïÞÊÍÍÕŽ;är¹¡I“&iÛ¶m=z´ÂÃÕ””ä7`ˆˆˆÐСCÕ³gO9sFÉÉÉr¹\µ^«;ï¼S/½ô’ßïkëÏСC¡;vH’Ư²²2¥¥¥I’&Ož¬£Gê믿öÖÕ¡CÅÅÅé…^PVV–÷ÚÄÅÅÕÛžT9ÚiܸqêÚµ«222Ô­[7);;[“&MÒ§Ÿ~ª²²2Ùl6Íš5K;vìPnnnu6ä\«®}JJŠÆŽ«Ý»wëØ±cÞã2335oÞ<õèÑC'OžÔÀuîÜ9uëÖM]ºtQ~~¾ú÷ﯜœååå)""B111 ’Ãá¨ó¾Ö£\ª«­?ÁÁÁš3gŽl6›4gÎÍš5K’¦Ù³gË0 ŸºJJJTTT¤ &xÏ÷àÁƒ>cÕÖž$=øàƒš0a‚\.—fÏž­iÓ¦ù\ÓÐÐPI•ÉÔ©SÕ¥K—zëlȹVÕ¿páBuîÜù¢ãªBŸþýûK’¨´´4:uJ”$õïß_$ŸþÖw_kžsÍQC .ÔôéÓåt:5zôh=úè£ jÒýX#‡@›jÌòõ5Úº&£^±ñ—*pžò–³]xu; å4¢åò8¥ªãMSv¹ä´ŸÓ¯?ZX9÷iJ6›Â'檼À¡Ã=}nQQQ2MSyyy>û ÃðŽ$9qâ„$)--M[·n•$=þøãš4i’5lØ0=õÔS:wîœ6mÚ¤eË–iÀ€*(($mß¾];wîTTT”~ýë_+66V‡ò¶åv»õÚk¯);;[Gåååš>}z­}.((лᆱùóç{GóTéÛ·o­ý9pà€BCCÕ«W/………©  @‘‘‘êÖ­›zö쩲²2=zÔ§>Ç£çŸ^3fÌÐÒ¥K•——§­[·*))Iu¶çv»§eË–éäÉ“ ÕòåËë½'uÕYuMZnãÆJOO÷ÛNff¦ú÷ï¯/¾øB Ð_|!»Ý®(55U—_~¹¶lÙRk?ýÝת@±¶sîÛ·¯FŒáý~ãÆZ¾|¹®¾új}ùå—¾?ë"í¢±•UÿÞŸüòZ8û6Ùl6Ùm¶Ê€è–Y¼NnÓ¥ªZM™2Ìóz`ÖýÞÑFU˜Ý5óV=üß¿’y¸ñçtþüyïH“šGDDèüùóÞχöy߯_?õêÕK†aèð96&&ÆPTýAöìY¹\®‹Fy<uêÔIãÇWß¾}¦ààà:û½sçN :T ,ÐçŸîÝ_W²²²ôÍ7ßhàÀ Óž={¥ªW¯^Ú¿¿ßûuæÌ­ZµJ6l˜¦NªÁƒëÅ_¬³=§Ó©’’‡Æ–«Myy¹Ž=ª1cÆxçr»Ý:|ø°ü^úÔuÎ’tèÐ!9N]wÝu²Ùl4hºwï®}ûöIjüýX#‡@»¨oÔP}£…üL.KnÃ#Ó0d·Ûe«z­¥ªÇɪF†!—\•Ó5ñ¼>ûì3y<ÝtÓMŠŒŒTYY™RSSµfÍŸrÇ×ÓO?­°°0¥§§kÛ¶mr»ÝZµj•æÏŸ¯Ù³g«¢¢B[¶lѹsçtÙe—5¨ýÝ»wküøñzæ™gT^^®Ý»w7¸ïYYYÚ²e‹Æ/I***ªµ?’têÔ)?^§N’ÛíVAAΞ=«’’•••]Tnn®Þzë-Ý|óÍÞJ'NœÐÊ•+ÔÞÛo¿­;î¸CÓ§O×¾}û¼i¹\.­Y³FsæÌÑðáõnÝ:y<žzë¬~MZ®.ÐW\á¼8p@W^ye“˜óçÏ_tÎUÁ“$kÕªUúÑ~¤™3gÊãñèÃ?ô®@ÖØû°®¦þ»§¶cmu¼Ö|oSåÈ¥ª×ê›ãÂþ€ Ÿ/lA¶PIÁ’B$=3zôè!Í8ß#gΜQlll{w@ E%åÚ¼é¹ÝîZCŸú ú¾bõuåX›Êó>“yçªQÞ”þ=×ax¢`{½ûê>9Òšÿ¿%ááá*--õ ².»ì2ýêW¿Ò“O>©ÂÂBz ª®j¾™¦<âf³ÙÔ±cG?¾ÅV¤jNjªêŸÓéô>¢ÖÐöìv»‚ƒƒUVV¦Å‹+;;[ëÖ­“$9ŽÊ{ZË97ôZò\[Bõs®Mdd¤Š‹‹/™>€•$%%í—ô„¤rI’Ê$9/l® ›!É­Ê‚x.|®¾™Õ^«6ùyïﵺ&ý#‡@›jꈡúþè5MSáŽnŠèvÑ!QKý]RRRç÷Ç;Â¥¦âââ&·kš¦ÏdË-¡9ý©©!ý«­=Ã0j Ij»–õÕÙÔrm¥®s®Rstƒp´‹–œŒZ’º„ôÒŽÄ•#„ª*·å몱ÝärûþÁh Ô'_ìU¨ºVþ'¶ KÙïÚµKîóŠhü)5HQQ‘V¯^]ëˆ4\bb¢Ï p i‡@›ð·ZYÕ~©q#†ü•}lÚ2¿Ç.]s—\žÊI¨«sÛÜ 1»è¿ç¼î- þ:U‘á!ÕÕRJKKµiÓ¦V«ßJ222Ú» |/€VW}˜†ŒjìdÔõ•u¹+W*«¾”½Ëæ‘iÚ}êòx<ÌÙ,‡p´o(dšZ½f­n{‹.þçGs'£®óX»M.·K.Çû¨™)ÉesI¶ïRån·[ï½ÿ¾dšòx<•«œ5£]€ï Â!ÐêB‚ô ÕŸû“¤ÆüivÛrÕ+~ Ü=VæÑ—;Ó•ðÇk¼!P`@€BCÛ¬o—Â!Ðjl6›‡ìv»¼¡P[†CN{ž"*W1«)ÀqX;FxÃ!ï²÷ŒB8Z]{.¥…ú¿×“ü~ç.T¨ŸÇܬ„ €ïµÇb¥cíÝ €K—½½;€öC8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`a„CF8`aíÝ`]ºF©S§.’lM¬ÁTÁ¹|åçŸmÉnXáh3;vÑ믭”ÝÞ´ÁˆahÁ] ‡Záh36›d·Ûåt:›t|PPlMtÔÁn·Ë0Œöîí‚p´º?NÖ2.¿b`‹Õå«ù­ýô§?Uii©V®\Ù‚ýj?£FÒĉuùå—+//O©©©Ú°aÃ÷*H Ñ{ï½§ÄÄD-_¾¼½»@›#­®¹“U÷毶@ük‰ÇÖ®¹æ^ÒáÐŒ3tÿý÷kÑ¢EÊÉÉ©µÜâÅ‹uûí·«  @‡V\\œ¦L™¢™3gꡇjò°öVóüN§RSSµwïÞöîí‚p´:›Mr:òx<ͪÇårµPüs8­úØZ``àEç¢òòò:1 £ÎkW_’&§Ó)·Û­uíڵΰîúë¯×wÜ¡õë×kÅŠÞ~O›6Mÿõ_ÿ¥E‹éÅ_lR_*¯³Mn·»YeÒVhh¨ÊÊÊ.:®úù†¡ßþö·Íj§¾þÊf³}g5À÷áheee­î4W```‹×¹iÓ&}ðÁŠŠŠÒäÉ“UXX¨+V¨¬¬L<òˆbccuäÈýò—¿ÔñãǽǬ]»VAAAš={¶Ün·¶lÙ¢+V¨¤¤D’ … ꦛnR§Ntúôi½úê«Z¿~½OÛk×®U÷îÝuýõ×ë—¿ü¥®ºê*Í™3G’ôþûïk÷îÝZ¼xñEý^´h‘Μ9ã IÒ† 4jÔ(]~ùåÞ} íËû￯ÈÈHM:UAAAúôÓOµlÙ2oðÕ2‡C÷ÝwŸfÍšåm륗^Ò§Ÿ~êmËáphÑ¢EÞþœ={V+W®ÔºuëôÈ#ø=ÿM›6éã?Öþð‡=§¸¸8=þøã©S§NéwÞQ×®]µhÑ"=ðÀúå/é=æÆoTzzºžxâ õïß_÷Þ{¯ìv»žzê)I•|Í;W¯½öšöï߯n¸AK—.•ÛíÖÆ½õÌš5K[·nÕï~÷;}õÕWÊÎΖišš;w®ž~úi¿!E@@€úõë§µk×ú ô~÷»ßù|nh_fÏž­ 6è™gžÑŒ34mÚ4íÛ·OkÖ¬ip™Å‹köìÙzùå—•••¥I“&é©§žRnn®víÚ%IzðÁ5oÞ<½þúë:pà€¦OŸ®Ç\¹¹¹úàƒüž¿Ýn÷ãøíÙ IDATIÕRç´lÙ2†¡_üâ²Ùlz衇ôôÓOë®»îjÊ­‚p´ªáý;kþÿûoÙìßeÆÆL1µò¹‡[,’¤S§Né•W^‘$ëÑGÕ| þóŸ’¤«¯¾Z ð9¦¸¸XO>ù¤ ÃPbb¢"##uÛm·é…^ËåÒ-·Ü¢5kÖxç6JNNVŸ>}t÷Ýw{à I:tèž~úiŸº;&IÚ³gNŸ>}Q»wï.‡Ã¡o¿ý¶ÞsëØ±cƒûräÈýùÏ–$¥¦¦jýúõ6l˜7H©¯LU[¯¼òŠÞyçIRzzºâãã5oÞ<íÚµK;vÔ­·Þª5kÖx¯yZZšÎž=«ÈÈH;v¬Þóo©s RLLŒ>ýôS¥¤¤È4M+‚¥§§ëöÛoWŸ>}äñxäp8”ššêsÌ—_~©»ï¾ÛgŽœ£G6º¿’*C’úôëׯÁ}© e$©¨¨H§NRDD„Ïqu•éÛ·¯4nÜ8ÅÇÇ{ËuîÜYÁÁÁ>ýIKKó~ïr¹ôüóÏ7èÜ[òœœN§6nܨiÓ¦iÈ!JIIQrr²vìØÑà¾Ð‡@«r{ ™WåÈ!óR‡l2 —Ü—àãoæ…kçp8¼ïk.'ïñxd³Ùäp8šÕVqq±òòò4dÈ¿ß_{íµŠŠŠÒºuë|&u®¯/fû_ós}e*ÿézâÄ ïüL’tðàAoXSÕž¿ºª%Ïéw¿û>ÿüs]{íµ=z´n¹å%''ë¿øE³ú@Kjþz²up¹Lge0d—ö&C†Û)·§ýÿh6l˜lÕ–N9r¤$);;[G•iš1b„Ï1#FŒÐ™3g¼“V×§*lñç£>ÒÈ‘#uíµ×ú쎎ÖSO=¥qãÆIR‹õ¥!ªÚ:zô¨^ýuïöùçŸkíÚµ>eª®—TÝsÏ=?~¼O}µK^ß>}úhïÞ½Z±b…æÏŸ¯uëÖéꫯV÷îÝsê´*F€Våö2<Éa~FI†á‘ËÝþ#‡ºuë¦'žxBk×®ÕàÁƒ5oÞ<%&&zçÈùøã5oÞ<>}ZûöíÓ¤I“”à]m«.gÏž•$Ý~ûíZ¿~½“;×&))I‰‰‰ºùæ›5tèP¿+g•••éÞ{ïÕ’%Ktã7êÖ[o•aÊÈÈÐ /¼ o¾ù¦EúÒXøÃäv»õøã+00PGÿú׿ôâ‹/zˬX±BÇÛŸŠŠ ½üòËúüóÏ|þ-qN999zúé§µdɽþúë’¤ãÇëñÇgRjÀ%¥9ˆø;ÖVÇkÍ÷6U>ÖVõZ}s\Øpásà…-èÂ*)XRˆ¤gFíÿx–sæÌÅÆÆ¶w7T3~h¸ÿ¿ûÖA¦éiV]E…ù:}ü+;û­ÊËŠ%I¡a‘êÜ-F1½û+<²Só:k³«¼¬XùÛÿ苽ÅÍ««6oÞ¬?þXÏ>û¬:vì(·Û]ë£LŠŠŠRNNÎEsäÔ'<<\N§³AAE·nÝTPPPgÙæô¥±­üü|ï|CþÊtëÖM¹¹¹r»Ý}ßóo‰s²ÛíŠŽŽ–ÓéT~~~“ê\º’’’öKzBR¹¤ Ie’œ6×…ÍäVåêž Ÿ«ofµ×ªM~Þû{­®Iô9Z•ÓeÈ4Ü’­é•y ¾Ú—ªo³¿’ìÉf—M•“—”–¨ä›C:ùÍAÅô ¸øï„Âe“)Ãp]•U),,¬ó{·Ûíw9ö†hÌ|@¹¹¹õ–iN_ËívëÔ©Sõ–ùöÛoký¾!çßçdF›]š‚p´*§Ó#á’iMz¬Ìcx´;ù3/8§€ 0õ¼|ˆbz÷WX‡.’¤Ò¢|}{ìN|³_'ViQ†^5©‰‘M·[N?£L¾¯‡@«ry<2=®¯VÖH‡÷¦¨¨ðœÂ":jĵ3*Ã].£¬òñœÐàÅÅRLŸÚø± ÎÕ‘ÌŠ‹ÝøÎÚl•sµs6tà 7´o€¥°”=hUåNC†ÛÕ¤¥å‹ ótæÔ19A~õ 0ä)/”á*׿õ¯ë‹ß”é®§¼P¡v »æ²;têø×*-.hR›¦Ç¥ #‡€u€Våty*—²7ÍFo§O|#›Í¡^—QH ª@2å “=0ÌûÙô8 }K²ëÌñošÔ¦Çã–ÓÕ¼‰³¾K‡@«ª ‡\2MÓ;ïPC·¼¼™¦©nÝ{Êð8k|_¹xGõ}†»BÑÝ{È4Mååç4º=Ó4ex\ªp]:RWÙlÍYøîãwÀw s€Vå1$gEù¿ÝjWy™$S!!A’Ym4Ï…`¨rqWß:CCB$™ª(/küG¦!Ãã¾°Z™£qÇJ Ô}÷ݧuëÖéĉ>¾¥„……É0Œ‹–x¯ê_•’’>|X;v츶µŒž={êá‡Ö³Ï>Ûâ«tuêÔIóçÏ×›o¾©¢¢¢Só¼«lÛ¶M{÷îmÑþÕ¥¶ûÒ7Ýt“rrr”œœ|Ñw¡¡¡š2eŠâââäv»uàÀmÙ²EOÛ€kÊý©K=4qâDÅÄÄèüùóJJJÒþýû[ §-¯úýmÍßh Œ­ÊcHN·«r){5n«ú/ï¦á’dêèá½Úòñ;úbÃß%I†áÑ–ßÑ–ßѱ¯öJ–¢—$»ÍÞèö$S.—KMÍIl6›âããÞ´ ZÈÝwß­3f\´¿ª¹¹¹Ú·oŸÎ;§9sæhîܹ-Ú~NNŽþþ÷¿+77·E땤àà`ÅÇÇ+00°ÁÇÔ<ïª-//¯ÅûW—ÚîKCÄÆÆ*::Úïw÷ß¿† ¦ŒŒ eeeiòäɺõÖ[›ÓÕ&kÊý©ÍàÁƒõØc)<<\;wî”ÛíÖO~òM˜0¡zÚòªßßÖü€ÖÀÈ!ЪLSr:M9.wI¡J‹Î)2²“®2V¡tä`º·Œ=(L—­>ýÈSQ¤Òóç$IÁ¡aMXÍT…³\†ÙüÇA"""4iÒ$%&&j̘1r¹\Ú¶m›zôè¡áÇëܹsJLL”Çãñ–ݾ}»ÆŽ«€€¥¥¥yGØl6%$$¨wïÞÊÏÏWrr²ÊË˽ǥ¤¤hìØ±Ú½{·¢££­ððpýà?пþõ¯‹ú¶gÏeeeI’ÊÊÊ4mÚ4}øá‡ ¿¨¾ììl3F½{÷Vnn®vìØ!—Ë¥¡C‡ªsçÎÚºu«$Én·kÆŒJOOWaa¡bbb¤²²²zûÿé§ŸzËÍš5K;vìPnn®:wcÇ*88XYYY:xð Ïy :T:uÒ¶mÛ¼}˜>}º222tòäÉ:Ï»Jll¬† ¦ 6Èãñ¨OŸ>2dˆ6nܨ°°°V½/6›Íﵕ*G;7N]»vUFFF­?g:tP\\œ^xáï¹egg+..Î[¦1ítëÖMEEEÊÎήóÞÔUguµ•ówŽ;æ=În·kÞ¼yJJJÒ{ï½'IÚ²e‹nºé&Íœ9S‰‰‰r»ÝõÞƒmÛ¶iôèÑ WRR’rssëü®¾ëUý»üü|íØ±Cååå3fŒÏýMLLlÔï@m}©ïwZ #‡@«2e“ÓélÒœC]¢c$ÓTΩl™¦!wy¡bû P¿#½H÷4Z±}ãä./”i:óíqÉ4Õ¥kLæ2ä¬pÊh'¬ÂÃÃ5uêTÍŸ?_;vÔ”)SôŸÿùŸºù曪›o¾Y“&Mò){Ï=÷(88X111zì±Ç#IZ¸p¡¦OŸ.§Ó©Ñ£GëÑGUPP÷¸… ªsçÎ’$—Ë%Ã0dFe(Wââb9Ùív¿õ-\¸P“'OVyy¹®»î:-Y²D6›M¦ijîܹ •$õïß_S¦LQaa¡·žªïêëU9›Í¦©S§ªK—. Õc=¦Þ½{«¼¼\?þñ5vìXߟ­ } ‘$ÅÅÅiêÔ©zœéôéÓ3fŒÆ/»Ý®;ï¼³rî)ÃhõûRÛµ•¤|P&LËåÒìÙ³k5TRR¢¢¢"M˜0ÁÛ¯ƒjýúõÞ2igÚ´iŠ‹‹«óÞÔWguµ•ówª‹ŠŠRtt´6oÞì³ÿ£>Ò²e˼AÖw,X ®]»jèСzä‘GRçwõ[õö®ºê*ýìg?“Ãá¸èþ6öwÀ__ò;-…‘C U¦är:ÿ½"X#t飓ßÔ©ãßè²î½ÙQžòBõé7 ò)0»M}ú^!OùyIÒùóçtæäQÙº¬Wl£Û“iÊåj™p¨ÊæÍ›µoß>>}Z·Ür‹–.]ªÒÒRéŠ+®Ð§Ÿ~ê-›––æ‰óøã{G1BË–-ÓÉ“'µqãF-_¾\W_}µw¤ÈÆ•ž^9šêرcºöÚkuæÌ™‹þ°®ÒµkWÅÄĨcÇŽšç¹|ùr;wNï½÷žîºë.) Àçž´Ö}©ëÚºÝnÅÅÅyë ÕòåËýž“ÇãÑóÏ?¯3fhéÒ¥ÊËËÓÖ­[•””¤ŠŠŠk§ººê,((hT¹êרº¨¨¨Ê‰åk<úçñx”ŸŸï­¿¾{°}ûvíܹSQQQúõ¯­ØØXÖúÓ鬵ÏN§S#FŒÐïÿ{eggkÓ¦Mš1c†"##µk×.Ÿû{Ùe—ù\‡¦öÓßï´Â!ЪL³rÔDS+ TØ:y4S{ÓuåÈkÙQžòõé'É”§¼ò½óçÏé@F²LÙջ߅ØeîFw¶¢¢B†Ñr« :uJ’TTT¤²²2•––J’ Ô¡CŸ²‡öy߯_?õêÕK%%%ÞǤÜn·Ž9¢ž={zÿ°¬þ8NCÌ;WG¥¥¥:tèÖ­[çó}U}½zõ’azà|¾‰‰QVV–vîÜ©‘#G*--MÇ×|pQ[ é¿?gΜÑöíÛõóŸÿ\'NœÐ®]»´mÛ6ŸpÈãñ(==]#GŽTzzºFŒ¡?ü°Ö:×­[çs­ªB¤ýû÷ëèÑ£š5k–^zé%¹Ý¾?7­q_꺶N§Ó§î²²2¿ÉU¿V«V­RDD„† ¦©S§jðàÁzñÅ[´†ô½z8Ôrµ]£óçÏËf³),,LÅÅŵö£¾{pôèQIÒÙ³går¹â ‡ü}]kŸÝn·JJJtüøqIRii©Þÿý:¯UsúyèÐ!¿¿Ð‡@«2L›ÜîÊ ¥™î Å ªÒâs:wö”ÒS6+¦gué­°ðÊ:KŠ uæÛãúöT¶lö@u½,V}¯ ÓÙ„•’LC.§³ÉR7W—.]ôí·ßzßW…I!!! ñ®rÕ©S'ŸÕÐ»ÒØÿþïÿÖÌTÕWZZ*Ã0´råJŸùdª®´´4ýüç?וW^©ÀÀ@¿+ÕÕèüyöy­ò÷¿ÿ]7nTÿþý5mÚ4ÅÄÄè“O>ñ)“ššª%K–hРA Òž={j=¯œœegg_´?""B}úôѹsç4dÈíÛ·ÏçûÖ¸/u]ÛÁƒ+44T¡¡¡Þùj:uêä·ž¨¨( 8PÉÉÉ*..VRR’JJJ´hÑ"6¹ºîM]uvìØ±Qåj»F999ª¨¨Ðˆ#´}ûvïþªðë…^hö=ð÷]]}Ž÷^¯ªßÐÐÐ ríÿÛÖœ~úûxóÍ7km šŠ9‡@«2MÉíªœº)syÊ 4lÌDõì/›#HßžÌÖΔ/´mÓmÛ´Vé©[õí©ã²†(6n˜®uŒŠÂ&µeš†\nW‹>VÖãÆSPPzöì©*33S‡’ÓéÔu×]'›Í¦Aƒ©{÷îÕ9NuïÞÝg”MS>|X†ahРAÊÏÏWhh¨,Xà­÷رcÊËËÓøCíÚµËï„Äuõ¿  @n·[“'OV÷îÝ5sæLïqýúõÓ#<"›Í¦;wêØ±c~çÝ9zô¨ õÃþP~ûP¥C‡êÒ¥‹w«šcææ›oÖñãÇõ׿þU×\súöíës\kÜ—º®í×_-·Û­ñãÇËáp(!!A‘‘‘~ë´Ùlºí¶Û4kÖ,uèÐA=zôИ1c¼#PšÚN]÷¦¾Ÿ‹Æ–«íZmܸQ³gÏÖ5×\£¨¨(=Z·Ýv›rssUQQѤ{PŸºú|èÐ!UTTxç§3fŒ–/_î ºjû½kj?ú;-‘C UUŽr7iΡJ¦<¥yê?h¨zõ¤SÙ‡”Ÿ{JåeŲɦðHu‰ŠQØ vÈ]z¶É}µ©r~¤–X­¬)Ž?®§Ÿ~ZaaaJOO×¶mÛäv»µjÕ*ýèG?ÒÌ™3åñxôá‡ê믿ö™×¤ºíÛ·kþüùzòÉ'µtéÒ&÷§¨¨H«V­Òüùó5{ölUTThË–-:wLjjªfÍš¥´´4¿u×ÚIZ³fæÌ™£áÇkݺuÞ9UŽ?®œœ-]ºT:þ¼^{í5¿m¤¦¦jÆŒzûí·ë<Ÿ»îºËçóÚµkuôèQ=ZË–-óÎ3þ|=óÌ3Þr­u_꺶o¿ý¶î¸ãMŸ>]ûöíÓüÖ™››«·ÞzK7ß|³¦L™"I:qâ„V®\)©þ{X³ªGè\.W­÷¦®:«Ÿ{CËÕæ³Ï>“ÇãÑM7ݤÈÈH¹\.%''kõêÕ’êþÙjHýþÔw½ªÚ›>}º\.—Þ{ï=ïwÕïïóÏ?ï­³©ýlÌï4WsþåãïX[¯5ßÛT9r©êµú渰?àÂçÀ [Ð…-TR°¤IÏŒ=zH3ÎÀ÷È™3gÛÞÝPMH ¡E3/×L™&Ã]ѬºlŽ@9‚"d –Í^ù߸LÃ-Ó].OE‰L£öQ# aÖ'Ÿ~¬WÖ£ wÛ °¾ì²Ëô«_ýJO>ù¤ è}ü¤ºÈÈH7ø1²ÀÀÀ:GÒ4FDD„JJJý[uµõßápxW«©jµºÎ{Ò¤Iš8q¢žzê©fõ¯¦¶º/µ][»Ý®àà`•••Õ[§ÍfSÇŽåt:½<ÕÔv/^¬ììlï}Z+V¬Prr²¶oß.§Ó©W_}U¯¾úª***Z²Yâ±1–R3Ïhj¾ÑªOZ]ª#‡‡‹Ø •IDATZõ¤çÎë †n¿ývJ’¶nݪgŸ}V'NœhÍælëÖ­2 C'Nlï®-ªæüðæ6Ó,¯¾úªV¯^­Õ«WëÕW_m—>€«™W4ôµÝ]*«•µ)§Ó©%K–èÏþ³¨ßÿþ÷•ÉÊÊÒ’%Kär¹Ú¡‡•~ó›ß´[ÛÀ.¥pÈ_rVÛ(¡f§l999úñ¬¹sçjúôéºâŠ+$I_}õ•6lØ ?ü°Íƒ¡ˆˆ×[ø>©9ù:|Õ–SøË5,;rÈ”dkÀþªÏõ]Ôšï›ÄårýÿíÝ[rÜ8ДäîÙ§0‹™Uhþ·ÖÓm«<B) Á*¾$ŸQA|XÒ×ñøøxËcVñôôß¾}¾>²§§§Ùeë¿ÿ¾Son6—WÌ )ëå»Hg¨êGõ5½ú4IÛ-¾~ýzt`7þ߀O¤—UŒµžkÜ2!õ-_Rõ3uÝá? ðÇ[#»¸u„ÔÕ÷±ZY«³scïZãó>ÜÒpÀ§Ô›[h$ïh=kWg\ʾ×V~ÔK´P€#䜢ä§ zÎe½9…òþó~ݘ”sŠ^ÅÐi¡líphî%—œï•båÊ!p´’O”Ê¡²?•sL¹õü"{TÍMÊ4µ|[.Ū¢KœCÎ*ê,#g­äП¶ ‡–t¾þ!ê­®*?ìóÂïXÓ¯øOÔ™EÄxÞ1ú=›¸Ûàþ»Æ~ÞÞUÇ÷UûCjHÛ/ñ×Ëç?/Ÿ¿#âÕ=½ïi÷ú8÷Ž#ç€ý,©¾©ç9nÍ Tbjj*ÁÐ#â߈øçåóãåó3^ƒ£çꞺ²hê{ëwXu‚ë£Â¡¼_‡Cåø!ms8ô%~‡BÇï€è¯—ý²}¨î)û÷ñ4åãûx.õúÓ —z¿…àÖ555M9n…,õ´5—xÔ\Òç¹j+Ç?Óþsüƒ~¤í?/ûÿ¾\û£º'‡B­þ´úmë½{mC¾\{ã ~ÅXp’¯ËÃÈîãõô3Þ8¿ß)ÿÀÏñ¶)?§õ¹kl§*ò6Àº¦B‘¹ŠŸKcÛûä€è9Þ‡D­O}®êõ}ô7uD8Tk¥|u(tïç*ÁPaò!Wµ¶õ¶^@ÔúD¨€½T•mëÓ †rUO+ÊáP®"*UB?ãí²Þ±^ßµW8Ô«šj¿ÄëB­?æs:_<¼´×ÃÉêaeK«†¦Â!!kªz¨MUÕÃÊzÃËÊð±\iÔ ~Z!Q«ÿ£í«Ú"ª+îœëµç@(ËEùÚ«ª÷[UC½P(:Çy[÷ XÏ-ÃÊZùA]=4åý MUÕýíµ÷ÞóšáiÃn ‡F皺¯¼T>®“µ^ô#ÞþØy2ê2'Q+ ªƒ © ©#µÅĶÞ¶Ó LZÛzYùœ+äádSDyÈYýÉaP«r¨WMãkÜaΡ)%D*?V]9ô®Ë)_röãÑád½9‡TÀö¦*‡ò~oXYoxYžk¨^Ŭž‹(/’Õš(¯NV‡U§´g8”ƒžVÕPþ¡êù†JÊWV*«‡=Ä랃ŸKºç>Þ¯Rö3ÞWÕaQD?À9Œ /««xê¥å§V0›nVŸ««“zUDQí·Þcs[…CSs -¹¦uO.+Û]âµJ¨<³^™,WÝ¥¶çF{Õûí~ `#ÕC­à¥Ò<7ÚŸ'¶½j¢:Zú.½{6o(bÿae½ê¡º’(ï×Õ?¥-_—«†~ÅÛ £z[ª‡r…Ðs¼ „–¬P&€ý,ZV¶sCÌ.ã:š«,ªŸÓ›s¨ø2 íè9‡rXñ6T©Ã ©€(?/ÿåÚê”gÜWÇs¡`ÎaéÜCy¿7ÿP+(ªC¡\-Ô ‹¦‚¡:Ǩûv˜½Â¡¹acuHéúVâ—ïË?nÜ”ó9Xê­JVÚ#ÚáPkÛú^`?u°ÒËêªÞÊbu°ÓÚNÍ+4W%´$Ú%4Z#ê?sí½m¾n¤z¨´E´«zZÛ^µPkêÖ3êýhÖ±d~ž^Q/ªÏÏ…C­ ¡º˜¥5ÑTˆ5÷n#íÃŽX­l予·KØçãˆ×p§ç•ÈÊ3r”·w{K”C¦¹ ¨…@p.½QGsÃÌZ¡P+è©¢hì÷¾£þþÑwÙÜÖáÐ’ê¡¢žƒ(W ey¢éhìçïÎÇ­ç_;ù´€ΡW™“÷[¡Íèp³Þñܰ²Wäg„B‚!8·z8Wnoí_ªö‘¡g½ê£%ÁÐ)ìY9Ô:ß cF*ˆ¦††MíV õú¼ô<°­¹°¥MU—™ý%“N÷æ jõñšwºÊÁÆÒyy–DÓáÐ\[ï¸ÕŸ%ó çÓ \ææ#š†6ÚÖ;ß»fªï£çÛ;ê ˆz×õB¤zU±VeеÕB£×û M檈¦ÚêágõuSáÏZÁÐÈùE¶ 8n ˆêã‘(bzþ kæÀç0W‰3MÍSÔÛ_:tl×`(â¸p¨wÍ’€¨uþškGŽ€Ïa. ™ s–Ì´v04zÍ"[† kD¥mI¸ñ~XÙè}*‰àã[:gÏHxsi´-™¿hÉ÷·l²ÊÙÖaÇ-s÷,©}Þµ+ …àcê*#÷Fï½u²Ã‚¡ˆ}B5¢Ü¶¤êg¤]–¹‰¡—¶÷VC»æùK¯¹ÚY¡¹ë–†D#ßkøüynY"~.àÙjIú-ýžkB›%CËæ\3¤l¤}îÜ-×^åaë/HÖ ˆ–>ëÚ{Ið¹, Z¶XjþTÁPľáPÄ6͵!ŽðÈF«‚æî»öš[®¿ÚÉ–U?k¼Ð>·5‚—-ç Ú-Š86¹å»U [º6 ¹%ØÙ5*ŽKnýþµûôïìcí æÖç Eœ' Y³gy'àsZ3È9,*ΤìÙ§3¾?°¿=CšÃ¡ìÌáÈ™û°Ô©B¡â£0¥ŸÙ)¡ì£†.µßÀçvú0¨öÙB–Ïö>À9}¸¨çþèÀêÿo©Žté/ÝIEND®B`‚sequeler-0.8.2/data/assets/screenshots/sequeler-screenshot2.png000066400000000000000000000765601410464306200247270ustar00rootroot00000000000000‰PNG  IHDRB‹zûsBIT|dˆ IDATxœìÝy\”Õâ?ðÏì Ã"È&›ûHäŽ[uË’rɽ4oåòµŒl׫VšÝ6KÛloëÍÒº.©Y&æJšŠ€ ²ÃÀìÏïšççÈŽ 3ÈçýzñRžõœgæÃ9ç9Äd2 """r"©« @DDD×>"""r:"""r:"""r:¹« @DDÔÖ‚{Þo!‘H\]„:1p5’ bØp·Ð!‘H $‰[""¢FV«¹¹¹(..†Åbqu‘Èårøúú"((2™ÌíB‡„ópÕOØl6äææÂh4¢sçÎP(®.–³ÙŒŒŒ ¨ÕjC*•ºUèà Q""¢Ø»RŠŠŠ¹\..s—/¹\ŽÎ;£¨¨È¡ëÇ]0pÕÃþÁm³Ù`±XÜ®eãr …‹6› €{3¹æÆpF”••¡ªª ƒUUU0°Ùl°Z­°Z­™L™L©T •JFµZ F///¨T*ׄˆˆÜ…;¶ÔÇ^^wêRióÃÞÄuéÒ%”””@"‘Â××Z­>>àï † ‰D™L°Z­â «Õ³Ù“ɈââRœ=›A°ÁÇÇþþþðõõu«ˆˆÜÇÉ“'ѵkWhµÚV=oII .]º„.]º´êy›«Í“É„sçÎ!//¾¾¾ðóóÉØ[2l6L&£CÓ’=¡^~ÛT*…T*…F£N§Cpp l6ŒF#òóóqòäI"""­›Òˆˆ¨õ¹"l€O›juisCœ={999 B÷= Ì Æÿ.®–T*…L&C__øúù¡´´)){‚.]º°ÅƒˆˆÀ%aîC‡nw{n]ÚTà0™LHMM…\.GXX8 ¢¼Âé O"‘@©P"""………Ø¿?bcc¡T*z^""¢kE› ‹{÷î…OxxxÀh4¶jS’Ùl†D"··7ôz=þøã :TBDDDuk3#==J• *µ •U•.+‡Él‚J­‚\¯À™3gЫW/—•…ˆˆ¨­h3ãÂ… „¡ÊÐbã4šËfµA§ó@vv6Q#´™Àa0`±Za6›]]€B!GUU•«‹ADDÔ&´™Àááá©n3W¥Tºtd2Q[Òf‡Ùl†··7ªªŒ0™L.-‹Z­‚§§'òò.º´DDDmE› &“ gÏf ""eeå(.)nõ O¤R)|;Tß%söìÙëÞùå—_©S§6jb±ß~û ¹¹¹˜:uj‹œ¿µ;v ¿ÿþ;rss!•JѵkWôêÕ  puÑڛ͆~ø={öDïÞ½]]"¢µ™ÀO!Û=ºwGaa Äç£8‹\.GÇŽáë닲²Rœ8q6› ryË<û.99¿þú+Š‹‹‘ÐàöÛ¶mÃþýûÛLà¸páþýïãàÁƒªgÇÓjµHNN† ˆÅã?Ž=z¸¸¤îÅd2áäÉ“ …¯¯¯Ãº£GâÅ_D=°~ýz•ˆ¨ñÚTઠgffÁ×× ^¯GñßsÊ-ÓÝ¢R)oxh=PVV† . ¸¸f³Ù)óo|ñň‹‹Cÿþý[üØ®’‘‘‡zeeeø¿ÿû?Œ=ÁÁÁ€ªª*lÙ²|ðæÌ™ƒµk×¢OŸ>..±û¸téæÍ›‡%K–`ìØ±ë"##qï½÷"&&ÆE¥#"jš68l6›CJee%rs/¢¬¬>>> E—Îa4PVV޲òrñ‰±&“ ‹‚ Àf«>†T*§/W*UP«TÐzhà©ó„——'T*5¬V ÊË+páÂTVVË®¥Ÿ¨Óéàïï+VàÓO?…§§g‹Û•þýïÃf³á­·ÞBll¬Ã:Fƒ;ï¼ÇÇìÙ³±hÑ"¬_¿>>>.*mÛ¡P(ðÀ¸ºDí’»=¿ÄÝÊS—68Š‹‹¡ÓyÖhY°Z­Ðëõ°Z-0™Lw¯P«TP«”H|T?÷Äf³‰Ï@R©Tü?Pý‚ Æ¿ƒˆCÍy?¤R),3ÊÊô-V?•J…çž{³gÏÆK/½„矾ÙǪªªBVVär9:wî ¹¼æË\TTµZ]ë66› %%%Ðh4Ðh45Ö[,”••A§ÓÕ;½û/¿ü‚#GŽ`Ñ¢E5ÂÆå:vìˆ^xsçÎÅ?þˆ3fÔº]vv6 ºté"¾vµÕëòrŸ?%%% «3È4gŸË5æz׶Ϲsç """®³ýú¨îJ,**PÝe¯{}¯¡³®QSµ™À!*+õðóëXïƒÓÌf3 C-_Fñÿ V«¯øR9|_W—‰D"R©DyyY‹×±G˜7oÞzë- 6 ñññMÚßl6ãí·ßÆÆÅ;y n½õV<úè£Ðétâ¶sçÎEDDV­ZUã8»wïÆ¢E‹gŸ}¶Æú~ø/½ô’’’гgÏ:˳víZDDD`ܸq –=::={öÄæÍ›‡ÙlÆ;#ääd”––¨n:t(.\///‡ãÜqǘ?>®¿þz¼ð ÈÌÌ×EFFbéÒ¥èÚµëUïc/[c¯·Åb÷1ªßSÿøÇ?0þ|têÔ %%%¸ãŽ;Ä}Ö¬Yƒ5kÖ¾úê+„‡W?Ghܸq¸ë®»jŒûikFDÔTm&pøùù!/ÿŠŠ‹ä’§µJ¥R(•J\¼˜ “Ù„À€€?ÇÝwß””¼ú꫸îºëЩS§FíWQQÇ{ iii¸÷Þ{1`À( üùçŸøè£°oß>$%%¡C‡€áÇcÓ¦M0P©TÇJIIÿ¡ÆµÞ³gê ÙÙÙÈÊʼyóêüËúJIIIß———ãÑGÅéÓ§1cÆ 8‡ÆþóÜ{ï½X½zµø|ù¹?ýôSLž<C† B¡ÀÁƒñÑGaþüùøê«¯àíí}Uû4õz_¾ÏÉ“'qÏ=÷`РAðòòBjj*>ùä<ðÀøè£Ð¡C¼÷Þ{ÈÏÏÇ3Ï<ƒ™3gbøðá€ÀÀÀz¯ak^3"¢¦h™Û,ZN§Ãu1}QYY…ŒŒ äry«‰D¹\A°!##•UU¸.æ:xxx´ø¹¤R)ž}öYH¥R,_¾¼ÑÓ¸¯[·gΜÁ‡~ˆY³f!&&}úôÁ]wÝ…¤¤$Fñ¯d1bL&“xçÈåRRR0hÐ ”””àäÉ“ëÌf38 ~ÖåÔ©SPロ)>ù䤧§ã7ÞÀ¼yóЯ_?ôéÓÓ§OÇûï¿«ÕŠW_}µÆ~ß}÷ž{î9Ì;}ûöEïÞ½1cÆ ¼úê«(--ŧŸ~zÕû4õzÛ÷9uêÞ|óMÌ›7×_=ºuë†I“&aíÚµ¨ªªÂêÕ«!—ËÅã@XXbbbS#ºòš5E› f³;vDtT4Ôj5öî݇S§NÂd2A.—A*•¶høHª•Êå2˜Lfœ:u ûöí‡Z­ALß¾ðõõuÚ4ëX´hŽ=ŠuëÖ5¸}~~>þûßÿbÖ¬YµÞZÚ©S'Ì;›7oƹsç±±±Ðétbk†ÝÙ³g‘——‡¹sçÂÏϯÆúÔÔTTUU58ìãÂÂÂ,mòòò°aÃŒ?ýúõ«±>,, ³gÏÆþýûñÇ8¬‹Å!Cjìcÿð=qâDuMÙ§9×;//ÿýï1qâÄZdz„††bæÌ™(,,lömÞ­}͈ˆš¢ÍûÄ_þˆŠŠFìõ±ÐëõHNþ ÉÉÉ8uê$ 4 Ôj5”J% är9d²šÄ(d2)är9 ”J%Ôj54 Nž:‰ääd$'ÿ½¾±×Ç¢oß¾ðóókщ¿jsË-· >>ü1Ž?^ﶇ‚Ùl®wÌLj#gΜP=·ÈàÁƒkŠ””øøø 22qqqµ®×h4 ÞºkÓÐÜ»mìušÍ¹Þ©Ï?ÿùO¼ûî»Í¾åºµ¯QS´™1€ãÄ_Q‘‘ Â¥K—pñâE¤¦AaáN‚ :Ãǧ´Zí߃A5P*UÐétâ_Õ!D™L«ÕŒ‚‚ TVV¢¤¤99¹H¤ðóóC§NÕþþþN›ø«.O<ñRSS±lÙ2¬_¿¾Ö;F ++ Û·o¯÷xR©ôïî¨jÇÇöíÛqîÜ9±ë#%%C† T*E\\~úé'”––Šý÷{öìÁÀë½;øÿA#;;AAA®³Ý¹sç P(Rç6 …¡¡¡ÈÊÊrX^Û`M;¥RYëóxš²Os®·½>“Ó­}͈ˆš¢M á‰¿JKËPXX€Â¢"œ;¨ª¬„ÕfƒÅlqÊårÈ ȤRh´Zèt:xxxÀÓÓ ƒ‡t†··W«Oüu%,[¶ óçÏÇ믿Ž%K–Ôº]^^ŒF#þóŸÿÔ{¼: ²²Rü~èСJ¥HIIAxx8*++ñ矊w¦ 4‰ûöíèQ£››‹¬¬,ÜsÏ= –Ý2Ο?߬‰Ìòòòàçç×à€Ó€€\¼ØºÏ´iÎõnl}®¶\îz͈ˆÚLà¸Ö'þªËu×]‡™3g")) Æ à 7ÜPch4üðÃM:¶——bbb°gÏL›6 €ÍfÃàÁƒü=P÷ºë’’‚Q£FaÏž=J¥6lXƒÇŽŠŠ‚L&6Æ®]»PPP€I“&! EEEµÞ%s¹K—.5xçFKkÎõö÷÷Gaa!l6›ÓB‡;_3"¢63†£¸¸V«µÆ/kûÄ_%%¥ÈÍÍÅ¥K0 P«TèàãNÁAèîݺ¡[×®èÙ£;zöèŽn]»¢[×®èà @tèà Õß}]ºT€ÜÜ\”””B¯××9ñ—}2&g›3gúôéƒ_|5Ö‡‡‡C¯×#//¯ÉÇ>|8>Œªª*¤¤¤ ::Úaž†¡C‡bïÞ½)))ˆŒŒt¸Õ³.£GÆ?þˆÜÜÜ·7 X¹r%þüóOÕãL&rrrêÜÇb±àÂ… ˆˆˆhDM[Ns®wDDÌf3²³³V.w¾fDDm&pØ'þR*• NüU^^üü|œ;w§N¥áÏ?ÿÄìÃo¿íÆÖ­Û°uë6üöÛnüñÇ>üù礥ƹs瑟 õµOüUUUåŒjÖJ.—cùòå0X¹re ¹\ŽÿýïuC¯×£¼¼¼Æò#Fˆ·º¦¤¤`èСëãââP\\Œ#GŽààÁƒâ`ÈÆ°ÏÁñöÛo7¸íºuë ×ëŘö:mذ¡Î}6oÞŒÊÊÊVÚls®÷õ×_ß`}Ö¯_¹sçÖ¸K¥±w­¸ó5#º–ÙïÊs½¾åf¼v¶68üüü`4™QT\…BáÒ‰¿Š‹‹`2›j<ÁÓ™ÂÃÃñÈ#`ß¾}ؽ{·ÃºL˜0Ÿ~úiy3€ê^z ãÇGIIIㆇ‡cýúõÈËË«8ºvíŠÀÀ@¼õÖ[0 Þ{9̘1Û·oÇÒ¥KkýÁ°Ùløì³Ï””„1cÆ ..ŒI“&aÓ¦MHMM­±_vv6>üðCôïß_ܧµ4çzc„ ظqc­õÉÍÍÅgŸ}†€€q|}<Æå}ëãÎ׌èZVPPà’С×ëýûÁ´™1:AAA8œú'222н{·VŸøËh4 ##$¸>6Ö)Ó›×çÎ;ïÄï¿ÿŽÝ»w׸ceΜ98zô(þïÿþ3fÌ@ÿþý€óçÏãË/¿ÄPë³1†ŽÏ?ÿ;vD÷îÝk¬:t(6n܈ààà&Oq={ölâ»ï¾ÃñãÇ1|øpDFFB£Ñ ##Û¶mCFF† †… :ì;kÖ,¤¦¦bÁ‚˜9s&•J…?ÿüIIIP*•xâ‰'šTž–Òœë={öl=z?ü0fΜ)Î4zôèQ|üñÇP(xä‘GÄíÕj5 „7ÂÏÏèÝ»w½ã/Üùš]«:wî N*¡6J¥½zõjÕs^68.Ÿø+=ý öî݇NèÙ³<<´Nø«¼ÜŒ´´4äää $¤zôè___¶ØùkéÒ¥˜1cFn///¼ÿþûX»v-6nÜè0aXDDV®\‰[n¹¥ÖcŽ1Ÿþ9âââj½†öÀÑ”Ö ;©TŠýë_1bÖ¯_o¾ùFlò—ÉdèÚµ+^zé%Œ9²Æ¾^^^øàƒ°fÍü÷¿ÿÅÇ  ú‡,..ÿú׿\öp±æ\oooo¼ÿþûX½z5>ýôS|òÉ'⺑#Gâá‡FÀÓå?óÌ3X±bÞ}÷]ÀC=Tï]Bî|͈¨}“˜L¦6ñ\Ûü(++G^~232pñâEtèн{÷BPP0Ôj5ªªªPYY‰ªªªË¾ âÿˆOÇÔhÔÐh´ÿ«V«'þʽ˜‹S'O¢¸¸AAAèÒµ+‚áááÌÌL‡‡l¹“‹/ââÅ‹F@@€Kº jSVV†‹/B&“!<< …¢Qû ‚€sçÎÁh4¢[·n­r[rS4õzÛ›B% """êJJJPTT„ÐÐÐç@±s÷kFÔVTßáhƒÅbÁ‰'Õèß]­Íl6ãøñãèÝ»7äry‹ÿ1~5ÚTà°ZmÿUÜ:' ‹Ä‰¿rrrPXXXëÄ_R©6› V«µÖ‰¿l63 c;Lüuöl†8ñ—»""jöi,‹ø¸‚ˆˆˆF‡ÿÖb2™ÄIýÂÃÃÅaî8ÚL—Š]{šø‹ˆˆ\O"‘@H¥ÕˆæççãØ±c~¸fk‘J¥Ðh4§p—°´‘Àaoκœ«'þþÿddîô‚Q˳·Ø»? ƒØbÞ“@ÖÇþ$“É V«¡ÓéܪeÃÎí‡ °Z­P*•0›-5^XûÄ_V«&“éï7€µJµJ ‰Ä@õE·Ùlâ `O«öÿÕÇ5 0‘ê‰Àj›øK"©ˆgµZ!“ÉÜî…%"¢–c¿‘¨~V”‡‡‡ËƒÆ•ìe¼ü_wâöÃf³Áf³!((.\hÔÄ_ƒ¡–/£ø ú–CÇ/•Ã÷uu™Ø'þ+‚ƒƒÅÃ."¢k›ýƒÜþ«;û¿î6€68ìƒuºt邜œ‚ J¥Ú¥UUUB&“¢sçέöL""r=û‡¹»v§»c™ìÜ~¦QûÅ“Ëå8p  **Ê!“ÉZ}â/©T‚òòR¨TJ 8r¹Ü¡ŒDDÔ>؃‡»}¹³68ì}QjµD`` ²²2‘ŸñïÛSeNøËf³!/ï"Ο?‡   8jµÚmûɈˆˆÜÛw©ØûÉìc$A@ïÞ½¿þú 샇‡:wîŒ|Å)¿íónX,–¿çÜp ö° “I!—Ë¡P( T*¡VWOf±XPPp ÐëõèÚµ+ ø4 d2™ø%•Jö¸q""¢kE›™øëò‰».ÿ2›Í¸páΞ=‹ììl˜ÍføûûÃÃÃjµúï@ ƒÅR>Ìf@¡PB&“A¡PÀf«>–Ñh€^¯Ç¥K— P(‚®]»",, r¹Ü!h\8ˆˆˆ¨~m&pØ]6ì!Ä~'‹ÕjEEE²³³QTT„ÒÒR””” ¼¼\ '&SuàP*•P(Édðôô„¼½½áçç‡xxx8´`ØÿyØ ""¢ÆisÃîʰqå—ýîûµÝMrù {—‹½«¥¶/¶h5Ûá¨Ëåc'ìÁâò°qy踗¨=`à """§cà """§cà º±©žˆÜ GÍÕ!##7nDff&|}}Áƒ»ºXµª¨¨€T*…V«ÅÙ³gñè£âÍ7ßDDD„KÊS^^ŽÏ>û ‡†B¡@\\¦N …BÑàz“É„… bþüùèÙ³§x̽{÷â»ï¾Ã‹/¾èp®­[·â§Ÿ~ªµWÃÙòó󑘘ˆeË–¡C‡­v^¢¶€-Dµ8xð zè!”••ᦛn‚R©Äòå˱iÓ&W­V‰‰‰HJJ„††â‘GAHHˆËÊóÔSOa×®]¸ùæ›1pà@|öÙgxýõ×µÞjµbïÞ½(--u8f~~>8Pã\aaa>|8†ŽóçÏÃjµŠßûøø8·¢W¨ªªÂÞ½{a4[õ¼Dm[8ˆ®`³Ùðæ›o">>?ü0`„ øøã±nÝ:ÜqÇP(;vìÀéÓ§ˆÛn» Z­¥¥¥Ø°aƇ;w¢¬¬ ñññ ©wPݲ}ûvœ>}:uB||<”Jeu=z4´Z-¶oߎóçÏ£´´Ÿþ9î¸ãdffbðàÁÐétÍ*çÕ(,,Djj*Þ|óM 8ЧO:t¨Q뛪OŸ>èÓ§`Û¶mèÙ³'&Ož ())Á;#™3gÂÓÓ6› k׮Ÿqã ÓéðùçŸcÒ¤IضmJKK1nÜ8„……¡¤¤¤Îu@õ{dË–-8uêBBB0~üxñu"¢Ú±…ƒè 999ÈÎÎÆ¤I“–ÿóŸÿÄ{ï½'ÞR»bÅ ¬_¿*• ¿üò `4QVV†/¿üÿþ÷¿‘››‹””<òÈ#¨¬¬¬wý˜_ý5´Z-~üñG<ùä“âxŒËÏ·mÛ6<öØc°X,P*•ÉdËåP«Õâ9ôz}³Ëy5¼¼¼Ð¡C|ýõ×HOO 4<ð@£Ö·¤ÒÒR¬_¿^¼°~ýzäææŠë–/_ŽœœüöÛo˜;w.ôz}½ë`É’%øì³Ï Õj±iÓ&ÌŸ?_œWƒˆjÇ¢+äää@"‘ ((Èa¹\.G`` àĉؽ{7Þ{ï=tíÚf³'NÄæÍ›Ñ¯_?À˜1cpÓM7!77ÿüç?‘––??¿:שT*ìÙ³ÿùÏ€)S¦`Ê”)8|ø0Ôj5vïÞ·ß~={öÄ”)S””„ââbŒ1ÉÉÉ Ãĉqþüy±ÌÍ-glll½×¨¾A©r¹ï¾û.>øàÌœ9ÁÁÁ˜Àh4B&“5j@ì•ÛØç¼¨mß &`Ô¨QÈÎÎÆäÉ“qüøqÔ¹N­Vã×_Å·ß~‹ÀÀ@LŸ>·ß~;8 ¾?8ÇQM DWðõõ… (//‡··w­Û¤§§ÃËË ]»vP={dTTΞ=+~GFF‚ƒƒ¡T*QYY)ŽÚÖ]¸pR©K—.u8WVV <==Ñ£G€§§'¬KsËyµ"""ðüóÏ£¤¤»víÂúõë±wï^¼ñÆZ>ø ¢¢¢ÄïýõW|ýõ×W]¶+EGGBBBjÔ¿¶u.\€L&Ãã?îpœŒŒ 1pQM DW ƒF£Áo¿ý†1cƈË÷ìÙƒ/¾ø/¿ü2<==¡×ëQYY ­V (((@÷îÝ›}^N™L†gŸ}Öa<€§§'öíÛj¢ý IDAT½^½^/>­U¯×C­V×û:g”³!ÙÙÙØ¿?ÆŒŒ?>>>X¼x1ŒF# ê]oÞ½{‹ßŸ>}ºÉe±wÙCDmaª¾Ygk[g^|ñůSaaa“ËHÔ^p ÑT*¦OŸŽ>ø›7oFNNvî܉իW#$$±±±P©TøßÿþApðàAœ;wC† iöyccc!“ÉpðàAB¯×㥗^BEE®¿þz¨Õj|÷Ýw°Z­Ø¾};&L˜€¢¢"±ÌYYY¨¨¨¨qÌ–.gCl6^yå¬]»HOOÇæÍ›Ñ©S'¨Tª×·¤€€( |þùçÈÌÌÄ{ï½wÕÇìß¿?¤R)þøã¡¼¼Ï=÷\kODŽØÂAT‹iÓ¦A.—ã£>BII ”J%n»í6Ì›7àíígžy¯¾ú*Ö­[¹\Ž|ÑÑÑc(šÂÇÇO?ý4V­Z…?ü&LÇØÏ·~ýz(•J,X°þþþªÇa¼þúë¸ÿþû±jÕ*ñ˜Î(gCÂÂÂðôÓOcÍš5øì³Ï=zô@bbb£Ö·$•J…„„¼õÖ[صk|ðÁz[„£C‡xá…˜˜ˆwÞyS§NE`` Î;×B%'ºöHL&G6Q»²{÷nôèÑÚ¾´´^^^u6½ÃÇǧEWß9‹‹‹áééYëÓnFc­WSNA`³ÙPZZŠ‚‚qüGCû@­VÃÓÓ³Éë[’Ùl†L&ƒTÚ²º%%%ðöönò5=t袢¢ —Ë!•Jù0AjØÂAÔ€ºŽÚ9cFÉúÎYßùêë’hí™/%‰ØÓœõ-éò»]ZRkO,FÔ–q 999µ;J¥‹V«ÕÕE¡vÈ>€•¨½á Qjw‘ŸŸµÞéA5ÙïR±ßMÁ»*šÇd2!++ H$¼ŽÔ®ð¶Xj—²²²——“Éäꢴ6› V«µÁ»v¨nR©ðôô„T*mñ[u‰ÜµKü˲é죠 V«•(kûûM&“A­VC§Ó‰aƒïEj/8ˆ¨QìÝ*6›a£™$‰26¨½a65Ê•’ Mwù† jo8ˆ¨Ñ씂 ð³™xݨ½bà ¢&ã‡&5‡G‘Ó1p‘Ó1p‘Ó1p‘Ó1p‘Ó1p‘Ó1p‘Ó1p‘Ó1p‘Ó1p‘Ó1p‘Ó1p‘Ó1p‘Ó1p‘Ó1p‘Ó1p‘Ó1p‘Ó1p‘Ó1p‘Ó1p‘Ó1p‘Ó1p‘Ó1p‘Ó1p‘Ó1p‘ÓÉ]]"A““ƒ¢¢"˜ÍfW‡ˆ¨MR(ðóóCpp0$‰«‹S¹\nn.ÊË˹œoI"¢æ°X,(**têÔÉÅ¥©‰¿ÝÉå ???"¢f²X,ËåÈÎÎvËÀÁ1ärf³Z­–aƒˆè*ÈårhµZ·íšfà ·àŽýDDm;ÿ.eà """§cà """§cà """§sëÀqöìY$&&bîܹX²d <èê"Õ©¢¢&“ ™™‰ & ªªªÅŽ¿hÑ"üõ×_Ëôz=žzê©;‡»yòÉ'qäȇez½?þ¸SÏ›žžŽ•+WâþûïÇÂ… qàÀ§žïj\þ¾ËÈÈÀرc[ô}GDÔRÜ6pL, öíÛ×bçp7ûöíóÏ>[£Î{÷îuÚ98€|=zôÀO<ØØX,]º[·nuÚ9¯ÆË/¿ŒíÛ·BCCñôÓO·èûŽˆ¨¥¸å}ˆ‚ àµ×^ÃâÅ‹1bÄ@TT‚‚‚°fÍÜ|óÍH$°Ùlغu+N:…ððpŒ3 …UUUøæ›o0bÄlÙ²r¹“&M‚··w½ëìçÞ²e Nž<‰ˆˆñ˜W® Ř1c V«ñóÏ?#-- ååå0 ¸õÖ[ñ×_aРAЬrÖ¦[·nX½z5þõ¯Õº¾¤¤;vì@ff&ºu놱cÇB*•Šç2d¶mÛ†°°0Œ3;wîÄ‘#GpÝu×áÆol°þiiièÒ¥‹ø}kèÖ­V­Z…¥K—Öº^$''‹å7n þøãØl6ÄÅÅ6n܈°°0 0ðå—_bäÈ‘÷ª ‚€—_~O?ý4FŽ ˆŽŽFpp0^ýuŒ5J|ßmÞ¼Y<çØ±c¡T*QYY‰ 6`äÈ‘HNN†B¡À”)Sàíí]ïºúêqåºÐÐPŒ7jµ[·nÅÉ“'Å÷Ým·Ý†£GbðàÁЬr9‹[¶päå塼¼\ v7Üp¾þúkñ¶Ÿ+V`çÎˆŠŠÂ‰'›Í†ªª*$%%aíÚµèÔ©Ž?.~H×·V®\‰ßÿ1118qâ/^ì°î—_~ATTRSS±páBÕYz{{#44]ºtAUU¾þúkq¿æ”³6 HMMÅîÝ»k¬3˜={6222зo_lÙ²ëÖ­s¨óúõë†/¾øóçÏÇ_ý…ððp$&&"55µÞúFÌš5«Õ[Tyä>|¿þúk­ë—/_ŽÝ»w#&&Ç»˜l6’’’V««W¯Æ_|¨¬¬Ä»ï¾‹:8ëâÅ‹(++ÆÝM7Ý„M›6‰ï»eË–aÇŽˆŽŽÆñãÇñàƒÂf³Á`0àã?Æ;#;v O>ù$Ô»®¾zØÏgÿ>|XìR ƒÂÂÂеkW |ùå—û5µœDDNc2™wûJIIî»ï¾z·9yò¤pà 7UUUⲩS§ ;vì.^¼(ôïß_ÈÌÌL&“péÒ%aРABiii½ëÒÒÒ„øøxñ˜ƒA¸í¶Û„S§N §NÆ' qÝW_}%èõzÁd2 K—.þ÷¿ÿ &“I¸xñ¢póÍ7_U9¯¬ïðáÃ…ììláÏ?ÿF-äçç —.]âââÄmΟ?/þçν÷Þ+–gàÀBnn®`2™„ï¾ûN˜6mš¸íóÏ?/|øá‡õÖßd2 .\ŒFc‹¿Þ{÷îÊËË…+1BÈËËŽ;&ÄÇÇ EEEBII‰'‚ œ={Vˆ,‹ ‚`µZ…Ñ£G ééé‚Ñhnºé&A¯× ‡žzê)áŽ;î,‹°k×.áÑG­q¾ýû÷ ÷ßå—KOOn¸áñœ‚ Ó¦MvíÚ% ýû÷²³³A„’’aРABeee½ëê«Gzzº0~üxÁjµŠë6lØ FAá™gž~úé'A¡°°P¸ù曯ªœDÔ¶•—— {÷îuùçxm_nÙ¥âëë‹’’’z·9{ö,bcc!“ÉÄe @zz:"##áíí-6—{{{ÃÓÓS P׺3gÎÀ`0`îܹâ1 ²²²`±X ©´ºQH*•b„ Ö¥¹å¬«¾OŸ>¸óÎ;ñâ‹/:´¾ÕƒU“’’ð×_¡ªª J¥R\çåå???€‡‡:vì(®óññÙl®·þ]ºtA@@@ƒõu†ÈÈHL˜0Ï?ÿ<žyæqùéÓ§a0pÿý÷‹Ëªªª™™‰®]»bÀ€Ø·oŽ?Ž#F@&“áÈ‘#øý÷ßk´b{ß9sýúõsx= „3gÎ ::ºYï»úêa±Xåð¾›4iRƒ×¬¹åäø"r· ¡¡¡(--EVV"""ÄåçÎÃûï¿•+WÂÓÓùùùûåçç#,, @ý³­ÕµÎÃÑ‘‘X¾|¹Ãr­V‹ƒ¢¬¬¬Éu¹šrÖåÞ{ïżyóðÃ?ˆËNœ8gŸ}+V¬À‚ ™™‰•+W6é¸õÕßÕfÍš…Ù³gãûï¿—ét:DGGר§ýCó†nÀž={pòäIL›6 ‰)))Ø»w¯C¨² CII 233ѹsgqyVVÖ®]‹ÄÄDxzz"//Ïa¿‹/^Õû®¾z8p Ùï»æ–“ˆÈÜr ‡B¡À}÷݇åË—#''páÂ<ÿüó „D"Att4òóóqêÔ)Õ¿L>Œ!C†4û¼}ûöEFF Åt«V­‚ÉdBß¾}qæÌœùäqYLL ÒÓÓQPP –÷•W^_“aÆa×®]??? :ßÿ=:tèàÐÂc§P(0{öl<óÌ3âkyþüy<÷Üsâû.&&ùùùâû 77‡§6G}õ¸îºë––†'N¨~ßMœ8Q|Mêzß9£œDDWÃ-[8àî»ï†T*Åœ9s ªªª0qâDÌŸ?@õ_ã+W®ÄâÅ‹¡ÕjQZZŠÇ{ !!!âãy›J§Óáé§ŸÆÂ… ¡ÕjQYY‰)S¦ÀÃÃ@õÀ¾¥K—B­V£¨¨?þ¸x'Á˜1c°lÙ2;v K–,éŒrÕÏŸ?o¼ñ ..6lÀäÉ“áåå…^½zµhýF#‘˜˜(Þ}ÓÚÂÃÑ€×^{M,ïòåËñÄO@«ÕB¯×ã®»î_/„‡‡ãúë¯PÝeâïï_kwŠÝŒ3 ‘Hpß}÷‰{'OžŒ‡~@õ뙘˜(^£ÒÒR<ñÄ ½ª÷]}õxþùç±hÑ"h4báÂ…bwÙØ±cñôÓO㯿þrènrF9‰ˆ®†Äd2 ®.DCJJJàåå%öc_©¨¨>>>u®oî9½½½kmz.,,„Cÿ¸Ñh„J¥jµr^ÉþWòÕÞºZ[ým6›SÊ~èÐ!DEEA§Ó5ûÅÅÅðññiÑ®W¼ï꫇;¿ïˆÈ=TTTàØ±cèׯŸ«‹RC›tmk‰ÀADDî8ø'9999¹œB¡€Ùl†ÕjuuQˆˆÚ,«Õ “ÉÔªØl ·‡ƒÚ???äää@‡é؉ˆ¨ñL&rsskØÐð¶Xr ¹¹¹(((g %"¢¦Q(èØ±#‚ƒƒ]]”Z1p[à³=ˆˆZ† ¸çÇ:»TÈ-¸ëµ %"""§cà """§cà """§cà """§cà """§cà """§cà """§cà """§ãÄ_ä68ùÑÕqçY›8ÈåAÃCQóH$‚‰Dâ–Áƒƒ\JX­Väææ¢¸¸‹ÅÕE""j“är9|}}™Læv¡ƒo#—6› ¹¹¹0èܹ3 …«‹EDÔ&™Ífddd@­V#88R©Ô­B[8Èeì])EEEˆŒŒ„\.g— Q3ÉårtîÜÇGPPؽâ.x— ¹„=XØl6X,¶lµ…B‹Å›ÍÀ½ÆÅ1pË\>X”ˆˆZŽ;þ~eà """§cà """§cà """§cà """§cà """§»fçáX´hL& 00}ûöE||<¤ÒÆe¬ŠŠ (•J(•ÊFkåʕڶ¥ìÞ½ß|óM­ë–-[ŸV+‹³-Z´·ÝvþñÔX÷ꫯ"""S¦Lið8øôÓOqèÐ!¨T*Üpà ˜8q¢Ã{"==_}õ222Š & &&Æ¡,‹/¾¦®/Qk¸f[8öïßI“&aöìÙèß¿?~þùg$$$Àjµ6jÿ×^{ ;wîlô¹{Ü–‰9sæ`Μ90 ß{xx´jYœmß¾}X·n]åYYYذa222uœ%K– ¸¸ ,ÀŒ3ðý÷ß;÷àÁƒHHH@÷îÝñØc¡_¿~X²d ¶mÛæP³Ù|µU""jw®ÙèÕ«üýýQ£Fá‰'žÀ·ß~+þ5\RR‚;v 33ݺuÃØ±c!•JñóÏ?#-- ååå0 ?~|ÛÚâ§Ÿ~‚D"Ám·Ý†ðððzÏøþûïa2™0tèPñ/iA°eËœ}›6m‚ªªª””„Õ«W£gÏž°X,˜={6JKKë=·ÑhĬY³°oß¾&•¥¥Lš4 ß~û­ø½ÑhĶmÛpçwŠË´Z-Þzë-ñû´´4±ÞjµáááX»v­X׈ˆÄÇÇòòòP^^îV OŸ>èØ±#NŸ>íÌêaÇŽØ´iSƒ_;vìpuQ›åšná¸Rpp0rrr*• ï¼óTX­[·³fÍBïÞ½ˆ>}úˆ­umk/~xá‹/¾ÀÒ¥KëÜO¯×£²²“'O†——âââ Õj‘™™‰ƒâÛo¿…L&Ã7ÞˆñãÇ###]ºtiT=£¢¢ NŸ>=z`ëÖ­¸ýöÛÅ9õ+**pï½÷ŠuËÊÊÂwß}‡‘#GÖ{îo¿ýþþþWû2Ôª¡ñFéÓ§£¬¬ žžžØºu+ ___äååADFFB¤¥¥‰õ¶¿&‚ àwÞÁúõë1yòdôìÙ“&M 7Ü©TŠ . 88¸ÖrtêÔ .\@tt´x,w›ÁˆÚ¾§žz YYYHKK«s›nݺá‰'žh“¿ƒÚUà(..»! 33IIIøë¯¿PUUUï Ï†¶íׯŸøÿþýûãƒ>¨w?LŸ>wß}7¢££qçw"..gΜÁ`ÀܹsÅã dee5:pÕÐ[·nE÷îÝñóÏ?cÍš5â:¥RéÐ5Ñ¿¤¦¦¢S§Nõž;  Ñçoi:7Þx#~úé'L›6 ß~û-,X€óçÏ;lW_½}||°`Á<øàƒâ¸cÇŽ!!!¾¾¾())©õÜ—.]rèº!"rOOO¼þúëx衇™™Yc}XXV¯^ ooïÖ/\ hWc×®]â8‡'NàÙgŸÅŠ+°`ÁdffbåÊ•µîטmóòòÄ–ŒÜÜ\ètº÷»ï¾û0uêT¤¦¦âÝwßEaa!üüü‰åË—;_«Õ6©®£GÆüùó1lØ0øûû#,,L\g2™P\\,¶Väää@§ÓÁÃãEÎí,'NÄ3Ï<ƒ˜˜FÄÆÆÖ8j«wyy9.^¼ˆ=z@¡P`ذaèܹ3zè!$$$ 44¥¥¥ÈÊÊBDD’““QXXˆøøxddd {÷2µ3¾¾¾X³f æÍ›‡ÜÜ\qy`` Ö¬Y???–îê´‹1øâ‹/°}ûvÌœ9ŸŸððp <jµÉÉÉû¨T*±û¥¡mˆË, ¶mÛ†!C†Ô»_nn.^xáh4 :ýû÷ÇéÓ§Ñ·o_ddd °°PL±«V­oñm¬àà`á7ÞÀí·ß^cý–-[TÆüå—_0dÈϽcÇèõú&•£%õèÑžžžxþùç1iÒ¤Z·©«Þz½<ð€ØTi2™°eËqp¯B¡À}÷݇åË—#''ÿøÇ?°yóf,X°wÝut:ó+HDÀßßo¾ù¦8˜ßßßï¼óN›oi½¦[8f̘©T ­V‹˜˜|üñÇâi\\6lØ Ž¡èÕ«—þcÆŒÁ²eËpìØ1$&&Ö»-PÝÔ5mÚ4TVV¢_¿~˜8q"A¨s¿àà`( Üu×]ªÎ+¯¼N‡§Ÿ~ .„V«Eee%¦L™Ò¬[]o¿ýv¼ú꫸å–[–ûøø °°Ó§OGII n¿ýv 6 ê<·ÑhDbb"1hР&—¥¥Lš4 /¿ü2F]ç6µÕ;(( .Ä#<•J…ÒÒRôêÕ Ï>û¬¸ÍÝwß ©TŠ9sæ@"‘@ qˆÝŒ3Ä;]àƒ>@hhh Ö’ˆÚ»¬Y³Ÿ|ò æÌ™ƒN:¹ºHWMb2™ÚÞÈ“TPPooï:oõ4P©TÚV¯×C"‘Ô肨o?³Ù ½^_ëDR%%%ðöö{6Urr2öìÙãÐSTT„3f 99¥¥¥P«Õbý:·ÍfkôÄi 6› ‹ÇŽssµj«·ÍfCaa!´Zm½!®´´ÞÞÞØ¶m8Ðä;…ˆˆ\åСCˆŠŠ‚\.‡T*mögHK»¦[8ÃÞdU—Ë?ŒÚ¶®°úöS(uÎZÙÜÙ,m6Þzë-üúë¯XµjUÛÕ7ð¨¶s·TØp–ÆÔ[*•6êNûµ5jFÕ¢å$"jÚ}à¸FtíÚ“&MBHHˆÃ:­V+Îÿq­©¯ÞDDäZí¾K…\Ù]*DDí™»v©¸w9]8ˆˆˆÈé8ˆˆˆÈé8Èå¤R)ùNDÔÌf³Ã|P\^YY‰~øèر#ÆŽ‹€€9r¿üòKãÌœ9:t¹uëV=z¾¾¾¸ãŽ;Xë¹Ú®®òQMlá¸ìß¿¿Æ¨ä²²29r䪎ûÚk¯açÎWuŒæ*--Å+¯¼‚´´4œ8qÂaÝG}ƒÁ€éÓ§#,, o¼ñ, :wcÇŠ_7Þx#ÒÓÓ¡R©Ä}¿ÿþ{œ}ú &&ðí·ßÂßßß%õ«ÍfÇ~ˆQ£FÕ˜4lË–-:t(<==Åe¥¥¥ÐétÛyzz¢ JÇu IDAT¤¤ÄaYc·#"¢Æcà¸F,_¾;v¿?zô(Ö­[ :pÄÆÆB&“‰ë €ôôt >Ó§OÇÝwßèèhÜy爋‹«õW¶"¸ÚçŸN‡Ñ£G;,/++ÃÞ½{±|ùr‡åZ­ƒÁa™Á`»\šº5Ç5¢cÇŽ­ö»2€ê¿Îóóó¶ÏÏÏGXXà¾ûîÃÔ©S‘ššŠwß}………3fLë¼™6mÚ„¢¢"ÌŸ?¿ÆÌzÉÉÉ6l˜CëøùùáÒ¥K0›ÍP(€óçÏ×hµiìvDDÔxÃÑDGG#??§N\¼x‡Æ!C››‹^xC‡Eÿþýqúôi€J¥BNNŽxœ;v@¯×»¤—Û¾};ÒÒÒðÀÔèJ)))Á¾}ûÆn:tƒ:={öÄÖ­[ÅÅÅøý÷ßŦnGDDÇŽvÀÃÃ+W®ÄâÅ‹¡ÕjQZZŠÇ{ !!!…B»îº @uÈxå•WcÆŒÁ²eËpìØ1¼ð HLLDbb" 䲺”••á믿†J¥ÂâÅ‹ÅåS§NÅàÁƒ±yóf >\ƒa6›‘””„x}úôÁÌ™3±víZüöÛo°X,˜0a‚ƒƒ›½5ŽÄd2 ®.µž¢¢"øøø@*ulÜ2›ÍÐëõwfØF¨T*Øl¶ûµ„C‡!**ªÆ@Í–R[¹«ªª V«ºc®f;""wPQQcÇŽ¡_¿~®.J láhg|}}k]®P(j ĉ³Úê‡lmå¶ßVÛRÛQýø›“ˆˆˆœŽƒˆˆˆœŽƒˆˆˆœŽƒˆˆˆœŽƒ\N¡PÀl6Ãjµºº(DDm–Õj…Éd',t7¼K…\ÎÏÏ999J¥ÒÕÅ!"j“L&rsssáN8¹…ÜÜ\Àl6»º(DDm’B¡@ÇŽìê¢ÔŠƒÜ•ÏC!"¢æ÷üXg— ¹wý!"úíÝ{|TÕ¡÷ÿÏÜ2Éä6ÉB ä "á"‚A}¸X´´øE¬b[åèñA[{ÚRE…B‰U­çœµ x,GE¯(ЂŠxá&E!\‚H17Èu.™ùýÁ“9ÄÜ“ÙÌ|߯/Ȭ={¯½×f曵×^[BCƒFEDDÄp """b81œ‡ˆˆˆNCDDD §À!"""†SàÃ)pˆˆˆˆá8DDDÄp """b8Mm.a((( ´´Toé ›Í†Ëå"---"ŸO¥À!aWXXHEE©©©X­:%ED:ÂçóQZZ @zzz˜kÓ˜>Ý%ìJJJèÝ»7.—KCD¤ƒ|>V«•ãÇGdàÐ ;¯×‹ÃáPØé«ÕŠÃáˆØKÓ "ñz£ˆÈù&’?K8DDDÄp """b81\—óæÍã¾ûîã¾ûîãü#ï¾û.~¿¿Íﯬ¬Äãñ´y[m]6”æÍ›Çž={¼VUUÅo~ó›s^‘öêcÛ¶mLŸ>Ûo¿‘#Gò·¿ý¹sçRWWצ÷?ñÄlÚ´©ÍÛjëzCiÛ¶m,\¸šššàk>Ÿ­[·žóºˆˆˆ´W—¹qàÀôèу!C†0iÒ$þõ_ÿ•5kÖ0cÆ ÊËËÙ¸q#ùùùôïߟk¯½³ÙÌßþö78@EEµµµL:µÙeë•””°víZL&×\s ™™™-n ¸¸˜·Þz ÇÃØ±c6lpf–ÍuëÖñõ×_Ó·o_¦L™‚Ífkrû÷ïÏ¿ýÛ¿ñ»ßý®Éòæ¶_SSÃ믿Îe—]Ɔ ÈÈÈ`Ê”)lÚ´‰Ý»wsñÅ3~üøVësàÀ²²²š­ŸˆˆHsºDGSn¸á>ùäÜn7·ß~;GŽaèС¬[·ŽåË—ЧOéÓ§YYY-.[ï±Ç£wïÞ$$$p÷Ýwsøðáßçõz¹ãŽ;€3¡áÑGe×®],^¼˜-[¶0lØ0öíÛÇý÷ßßì>Í;—]»vññÇ7*kiû555¬X±‚•+W’‘‘ÁªU«¸ûî»Ù³g™™™äææ¶Z·ÛÍìÙ³Õ£"""Òez8¾/--‚‚ìv;O?ý4©©©8–/_ÎìÙ³¹è¢‹HMMeРAÁ^‡æ–­7yòd&Ož @ii)«V­bþüù;¯ªªŠêêjn¸áÈÉÉÁápŸŸÏŽ;X³f ‹…ñãÇ3uêTŽ9BVVV£}ŠŽŽfÁ‚Ì›7!C†4¸ßº¥}¨®®æ¿ø.— ‹ÅÂ_ÿúWî¹çòòòؽ{7N§³Åú¬Y³†=z„®‘DD¤Ûè²£¬¬ŒäääàÏùùù¬X±‚={öPSSCTTT³ïmmÙ#Fÿ=räHž{î¹ßçt:™9s&7ß|3C† aÚ´iäääpðàAjkk™3gNp}µµµ=z´ÉÀ0hÐ ¦M›Æ#<Ò¨7¤¥z'$$àr¹ˆ%%%%Xæt:ñz½­Ö§gÏžÍ3‘–tÙÀñá‡2xð`öíÛÇÃ?Ì¢E‹¸÷Þ{ÉÏÏgñâÅM¾¯-Ëž6lØÀe—]Öâû Y²d 111Œ;–‘#G’——ÇСC9rä%%%$&&ðä“O¶zÛ­ÅbaÁ‚¬X±"øZ[êÝšÖê³qãFªªªÚ½^‘.ÓÃqË-·`6›q8 6Œ^x!ø¥™““ÃêÕ«ƒc(Øà½S¦LaÁ‚ìÝ»—ÜÜÜ—ÈÈÈà'?ù ÕÕÕŒ1‚믿ž@ ÐìûÒÒÒ°ÙlÜtÓMÀ™€óøãǃ>Èoû[ÕÕÕ̘1ƒØØØV÷7##ƒ»ï¾›§žzªMûØ-ÕÇív“››Knn.£Gn÷ºED¤{3y<ž@¸+q®“˜˜Øìmn·»ÝÞ¦e«ªª0™L.7´ô>¯×KUUN§³QYyy9‰‰‰~ðNkõn«¦êã÷ûÜ*;wîdðàÁÄÅÅ…|Ý""ÝIee%{÷îm0Ö0Rt™޶8{ dSêÃF[–m®¢¥÷Ùl¶&ÃÐìëíÕZ½Ûª©ú6DD¤{Ð7ˆˆˆˆNCDDD §À!"""†SàÃ)pHØÙl6¼^oXžÂ+"ÒUÔÕÕáñx"ö›Ýê.‰L.—‹‚‚@‹S΋ˆHó<………!»[1ÔºÕ<¹ )..Æëõ†»*""ç%›ÍFJJ iiiá®J“8$"tvÂ39#ˆÌ¯u]R‘ˆ©ÿADD$44hTDDD §À!"""†SàÃ)pˆˆˆˆá8DDDÄp """b81œ‡ˆˆˆNCDDD §À!"""†ÓÔæv@€‚‚JKKõð6‘²Ùl¸\.ÒÒÒ"òùT v………TTTššŠÕªSRD¤#|>¥¥¥¤§§‡¹6éÓ]®¤¤„Þ½{ãr¹8DD:ÈçóaµZ9~üxDá°óz½8… ‘N°Z­8Žˆ½4­À!!¯7Šˆœo"ù³TCDDD §À!"""†SàÃ)p„ȼyó(//oðÚáÇyôÑGÃT#‘È¡À"Û¶mk42¸²²’Ý»w‡©F"""‘C÷!žCÅÅżõÖ[x<ÆŽ˰aÀ33m®[·Ž¯¿þš¾}û2eÊl6555¼þúëŒ5еk×2}út6oÞÌ•W^ɺuë°Z­LŸ>ÄÄDÊËËÙ¸q#ùùùôïߟk¯½³Ù\Ïe—]Ɔ ÈÈÈ`Ê”)lÚ´‰Ý»wsñÅ3~üøëpàÀ²²²‚?‹ˆˆ´•z8ί×ËwÜ@ÿþýyôÑGÙµk‹/fË–- 6Œ}ûöqÿý÷PSSÃòåËY¶lýúõ#°bÅ –.]Jzz:_}õ¿ûÝïp»ÝÜ~ûí9r„¡C‡²nÝ:–/_\ÏŠ+X¹r%¬ZµŠ»ï¾›={ö™™Innn«uq»ÝÌž=›­[·žËÃ&""]„z8Αªª*ª««¹á†HHH ''‡ÃA~~>;vì`Íš5X,ÆÏÔ©S9r䉉‰ÔÖÖ2þ|RRR(--¥²²’{ôôt®¼òJ~üãSSSCLL O?ý4©©©8–/_ÎìÙ³¨®®æ¿ø.— ‹ÅÂ_ÿúWî¹çòòòؽ{7N§³Ùºdee±fÍzôè¶c(""ç/à¿N'3gÎäæ›ofÈ!L›6œœùä“x<žvm¿¨¨ˆÌÌLÆŒCtt4ï½÷^»÷¡µºlܸ‘ªªªv¯WDDD=!r×]wñ§?ý‰©S§ât:9uê3fÌ`úô餥¥a³Ù¸é¦›°Ûí<þøãÄÅÅñàƒòÛßþ‡ÃAuu53fÌ 66·ÛÝæíçää°zõêà‘¶{Z«Knn.¹¹¹Œ=ºÝë‘îÍäñx­/&måóù())¡G˜Í;¼^/UUU8ÎFeååå$&&vêá;ÅÅÅ$&&vúÖÕ¦êâ÷û›Ü§ÎÚ¹s'ƒ&...äëéN*++Ù»w/#FŒwUQGˆY­Öà"M±ÙlM†  Ù×ÛãìÁ ÑT]Œ""Ò=èDDDD §À!"""†SàÃ)pˆˆˆˆá8$ìl6^¯—ºººpWEDä¼UWW‡Çã‰Ølê. ;—ËEAA@ Átì""Òv‡ÂÂÂÝ­jš‡C"Baa!ÅÅÅx½ÞpWEDä¼d³ÙHII!---ÜUi’‡D„ÎLv&""ÿãì‡F]R‘ˆ©ÿADD$44hTDDD §À!"""†SàÃ)pˆˆˆˆá8DDDÄp """b81œ‡ˆˆˆNCDDD §À!"""†ÓÔæv@€‚‚JKKõð6‘²Ùl¸\.ÒÒÒ"òùT v………TTTššŠÕªSRD¤#|>¥¥¥¤§§‡¹6éÓ]®¤¤„Þ½{ãr¹8DD:ÈçóaµZ9~üxDá°óz½8… ‘N°Z­8Žˆ½4­À!!¯7Šˆœo"ù³T¿RŠˆˆDÚÚZ^ýu¶oßNuu5‡ƒ‘#G2}útbbbÂ\ÃŽQà‰µµµäææròäɯWWW³yóföïßÏø Û·oWàضm‹-ÂétRZZÊ‹/¾Haa!³gÏwÕ:äСC$&&†»""ÝBý˜ÔÔÔFeõ¤~™ó‡<1¢££yì±Ç‚£¼¼œ7’ŸŸOÿþý¹öÚk1›ÏÜ,T\\Ì[o½…ÇãaìØ± 6¬Ù×·nÝJ `̘1¼ùæ›ôéÓ‡‘#GðꫯrÅWžžŽßïgýúõìß¿ŸÌÌL¦L™‚Íf£¦¦†×_Q£F±víZn¹å\.ï¼óùùùÁu×;pàYYYØl¶srED¤ëÐm±³ÛíÔÕÕàv»¹ýöÛ9räC‡eݺu,_¾83ÅwÜ@ÿþýyôÑGÙµkW³¯^zé%êêêøóŸÿÌ«¯¾ @MM Ï>û,III,Z´ˆM›61xð`öíÛÇܹsñûýÔÔÔ°|ùr–-[F¿~ýˆŽŽæ`ÇŽ :” 6°k×®`ÝgÏžÍÖ­[ÏÙ±én–-[ƲeË:\ÉÔÃa€ââbÊÊÊøË_þ„ €3áãé§Ÿv•9–/_ÎìÙ³©ªª¢ººšn¸„„rrrp8œ>}ºÉ×ëêêxøá‡©®®æÀŒ5Š}ûöQWWÇöíÛ>|8111>|˜-[¶ðþûïc±XøÁ~ÀOúS>ùä²³³©­­eþüù¤¤¤——Ç®]»xÿý÷1›ÍL˜0þð‡Áº¯Y³¦Á5E ;ï¼³]ËŸoÁCà .Äjµât:=z43gÎ –åçç³bÅ öìÙCMM QQQ8NfΜÉÍ7ßÌ!C˜6m999;n6›9r$Û·ogß¾}\qÅX,¾üòK>ýôS®¼òJ>ÌðáñX,Á:Œ5ŠC‡‘M||<)))Áº >sFDDÚ¯®®Ç±ØÔ% ;—ËEAA@ 8Õ»ˆˆ´Çã¡°°°Å;!ÃIópHD(,,¤¸¸¯×ˆœ—l6)))¤¥¥…»*MRàˆpöc""Òq@d~­ë’ŠD„Hý"""¡¡A£"""b81œ‡ˆˆˆNCDDD §À!"""†SàÃ)pˆˆˆˆá8DDDÄp """b81œ¦6—° PZZª‡·‰ˆtÍfÃår‘––‘ϧRà°+,,¤¢¢‚ÔÔT¬V’""áóù(-- ===̵iLŸîv%%%ôîÝ—Ë¥À!"ÒA>Ÿ«ÕÊñãÇ#2ph ‡„×ëÅáp(lˆˆt‚ÕjÅápDì¥i‰‘x½QDä|ÉŸ¥ """b81œ‡ˆˆˆN£ôºyóæáñxHJJâÒK/eòäÉ^_ee%QQQDEE…ªŠíâõzY¿~=_}õv»‰'2dÈ6—Ö¯_Ï—_~Irr2?þñIMM –úé§|öÙgÆψ#Îéþ‰ˆt'êáèB¶mÛÆôéÓ¹ýöÛ?~<¯¾ú*/¼ðB‡×÷ÄO°iÓ¦Ö°}^yå ˜1cW^y%ùË_øöÛoÛ\þÖ[oñõ×_sÓM7qÑEñä“OR]] œ ›7oæúë¯ç?ø«V­â믿>çû("Ò]¨‡£‹8p =zô ::šÇ{ŒÙ³gà÷ûY¿~=û÷ï'33“)S¦`³Ù¨©©áõ×_gÔ¨Q¬]»–[n¹…/¿ü’PQQAmm-S§NåÀdeea³ÙÎɾddd0jÔ(bccéׯ[·nåðáÃôéÓ§Õr¯×Ë|À‚ p:ôéÓ‡¼¼<>ýôS®ºê*Ö¯_Ïܹsq¹\Ì™3¿ßNöKD¤;RGf·Û©«« þ¼hÑ"6mÚÄàÁƒÙ·osçÎÅï÷SSSÃòåËY¶lýúõ#::š>}ú˜˜HŸ>}ÈÊÊÂív3{öl¶nÝzÎê?nÜ8bcc8zô(yyy 8°Måß}÷‰‰‰8Îàò]tß|ó •••ÔÕÕQUUŪU«øë_ÿJll,]tÑ9Û7‘îF=]Lqq1eeeüå/a„ >|˜-[¶ðþûïc±XøÁ~ÀOúS>ùä²³³©­­eþüù¤¤¤˜˜Hjj*ƒ bذa¬Y³&Ø{r®øý~~ùË_âv»ùùÏÞ` FKå§N"..®Á²ñññ”——S^^NMM ¯½öW]ueee<ùä“üú׿&--íœí›ˆHw¢ÀÑÅ,\¸«ÕŠÓédôèÑÌœ988†ŽÅb .;jÔ(:Dvv6ñññÁ°Ñœž={Z÷¦˜Ífžzê):Ä›o¾‰Õje̘1­–;jkk¬«¶¶‡ÃÅb¡¢¢‚ùóç{@jjjøè£øÉO~rN÷OD¤»Pàèbþüç?7Ù OQQQƒ×ŠŠŠÈÈÈ8WUk¿ßω'HOOÇl63`À&MšÄÇ̘1cZ-w¹\|÷Ýwx½Þà˜“cÇŽÑ£GRRRˆŠŠ"111¸=§Óɉ'µ»""]žÆptC† ¡¨¨ˆýû÷pâÄ ¾øâ .»ì²fßc·Û)((þ¼qãFªªª ¯k½'žx‚-[¶àv»ÙµkWƒK*-•ÇÅÅqá…²~ýzàÌ%¦-[¶““ƒÍfcРAlܸ8Ó»ñᇒ}ÎöMD¤»1y<ž@¸+!¡1qâD^yå•fÇYlß¾ÜÜ\§Nâž{îáꫯ¦´´”[n¹…÷Þ{¯Áò{öìaÁ‚dee±dÉ~üã“››ËèÑ£CZï;w2xðàFc.òòòX¹r%µµµÔÖÖ2tèPn½õVìv{›ÊOŸ>ÍÒ¥K)--ÅçóqÝu×qùå—gÈóÏ?Oii)n·›±cÇ2}úôˆ~ˆHk*++Ù»woDÎ+¤ÀÑ •––ât:1›ÛÖÁåv»±Ûíøýþ6¿§=š õªªªˆŠŠjövÜÖÊkjjˆŽŽn2LTWWc·ÛŒm9_EràÐŽn(99¹]Ë×÷6Ú¢þÖ׎–ÇÄÄ4[æp8:T'iáÃ)pˆˆˆˆá8DDDÄp """b8 ;›Í†×ëmðÜiŸºº:<Ï9{Àf{é. ;—ËEAA@€¨¨¨pWGDä¼äñx(,,lõ1á¢y8$"R\\Œ×ë wUDDÎK6›”””ˆ}¥‡DÍð)"@d~­ë’ŠD„Hý"""¡¡A£"""b81œ‡ˆˆˆNCDDD §À!"""†SàÃ)pˆˆˆˆá4‡œ7Zš«C‡‰ˆD6‰hßM…“ÉÔàu…‘È£À!©>@Ôÿí÷ûü}6³ÙÜàïz ""‘CC"ÊÙA£þÛí&??Ÿ£GrêÔ)ª««ñx<˜Ífl6QQQÄÅÅÅbÁl67 &“)¸~‡ÃArr2IIIX,–쫈Hw¢‡·IÄ8;løý~ª««Ù¹s'GŽaÈ!\pÁÄÅÅa³Ù‚—Q¼^/UUU|óÍ7ŸÚÚZ¼^/½zõ¢OŸ>X­Êë""m¥À!¡þËÝï÷ã÷û9pàŸþ9W^y%^x!f³¹ÕA£@€ÂÂBöîÝKß¾}INNÆl6ƒGGBG}}<‡ÚÚZ*++ñx<ôïß—ËÕ™Ýé68$ìÎuuulݺ•“'O2uêTìç.*=IDATv{»ž$k2™ðù||öÙgÄÇÇÓ»wïN‡Ž³ÕÕÕQYYIee%eee¤§§“™™Ù©uŠˆt Võa¢®®.6<'Nl4´½ëݽ{7@€ŒŒ ÌfspìE(“ºÝnÊËË)--%55U¡CD¤šøK®¾wãÀv:lÀ™P1lØ0ªªª(..Æï÷·«§¤5v»—Ë…Ë墠 €’’’­[D¤+Rà°9ûRJUUŸ}öÓ§Oïtبg2™3f ùùù¸Ýî`èUð°Z­8N’““9tè>Ÿ/$ëéŠ8$¬>Ÿ;vpå•W†üΫÕJvv6ÔÕÕ…tÝQQQ8N¢¢¢øöÛoC¾~‘®BCÂâìy6jkk9tè^x¡!ÛêÓ§ÅÅÅx<ž÷rDGG“˜˜ÈÉ“' 5""]Ç94oÞ<ÊË˼vøða}ôÑm£²²’¥K—rçwrï½÷²zõê³s¶VÞTTWWG~~>C‡5lB-“ÉD¿~ý(++kr¦ÒÎ2›ÍÄÅÅaµZ)++ ùúEDºŽshÛ¶mx½Þ¯UVV²{÷îmcþüù”——sÏ=÷0sæLÞ~ûm–/_Þæò¦êX/”½ð?s\äççsÁ„tÝß—žžNYYuuu†„«ÕJLLŒ‡ˆH34Ub„)..æ­·ÞÂãñ0vìX† œù²_·n_ý5}ûöeÊ”)Øl¶ï­­­eÇŽ|øá‡ÁÞ‚´´4¾úê«6•·Äív3mÚ4/^̨Q£:µg¿ßOyy9‰‰‰ZgkUUU ÂF ÙóV, ‡ƒS§N…d}""]z8"ˆ×ëåŽ;î ÿþ<úè£ìÚµ €Å‹³eˆ ƾ}û¸ÿþû½?::šÌÌL–.]üâëÛ·/“'OnSyKìv;÷Þ{/ ɾž=ÑWUUU£ðjf³·ÛÜn¨{kL&V«·ÛÒõŠˆtêሠUUUTWWsà 7@NN‡ƒüü|vìØÁš5k°X,Œ?ž©S§räȲ²²¬ãé§Ÿfåʕ̘1ƒ /¼éÓ§3nܸ୦­•·¤-Á¤½êÎÖÚÔåU?©—Sê×o±Xtk¬ˆH38Âìì/Y§ÓÉÌ™3¹ùæ›2dÓ¦M#''‡ƒR[[Ëœ9s‚ËÖÖÖrôèÑFÃétrï½÷ò/ÿò/lݺ•åË—³wï^æÎÛ¦òp°ÙløýþͿє@ `øúý~¿è&"Ò }:žCIIIÓ£Gàk%%%$''ž5k7Þx#»víâ™gž¡¤¤—ËEvv6 .l°>‡ÃÑà犊 Nœ8Á€°Ùl\~ùåôë×ÿý¿ÿ7sçÎmµ¼%@€gŸ}–iÓ¦‘ššÚùƒq–˜˜¼^/v»=¤ë=[]]¡—mêŸ*kä>ˆˆœÏ4†ã7nË–-£²²83@tùòåŒ7€ÂÂB–,YBLL cÇŽeäÈ‘äåå1tèPŽ9BIIIppå“O>‰Çãi°þªª*îºë.8€ÇãaݺuÁç|´VÞ¯×ËŽ;B>…·Éd"!!Áð»;*++‰ŽŽ6¬—£®®ŽÚÚÚF!PDDÎÐÃÛÎ!Çßþô'Ö¯_ÓéäÔ©S̘1ƒþçÞ-ñØc±cÇàÌ@ÍÇœÔÔT¶oßÎÿøGÕÕÕ̘1ƒŸüä'¶±nÝ:žzê)ìv;§NbàÀ<üðä§§·©|âĉX­Ösb<÷ÜsôéÓ'dÇáì¶¹Ýn¾üòKjjj˜0aBȶñ}ÿøÇ?ðûý¤§§c·ÛCú 7€šš¾ýö[222HII É:EDºŽ0ðù|”””УG&ãöz½TUUát:•ÕßBÚÒ¥ß理¤‡ÃAlll»ËÏ…úK^¯—òòr^}õUæÎkÈä_~¿Ÿ7ÞxƒK.¹„¸¸8l6‹%daÃï÷SQQÁ±cǸôÒK ›ÀLDä|¦K*a`µZIMMm¶{ßf³56àÌ ÏÖ¾(Íf3=zôh6L´V~®˜ÍfÌf3111deeñå—_²Ã‡“’’BTT‹%ä—U<¥¥¥¤¥¥)lˆˆ4CCÂÊb±`³Ù¸ä’KøàƒKé,ŸÏÇ®]»HKKÃjµ†ŸššNœ8Á\ Þ ‘(pHXÕÏÐi³Ù¸ð éÕ«o¼ñF§CG àã?&&&†ÔÔÔàå”Pñz½TWWSPP@zzzƒ[›ED¤1 ›úž³ÙŒÍf#&&†1cÆ`µZyþùçq»Ýíî‰0™Lx½^Ö®]‹×ë%333xWJ(z7ü~?µµµœ>}šcÇŽÑ«W¯6ÝV,"ÒÝé. «³o‘­¿MÖív³oß>¶nÝÊ„ ¸ä’K°X,-N}n2™¨««ãàÁƒìرƒ~ýú‘ššŠÃá ** ³ÙÜ¡[a@ðŽŸÏ Z]]Í€p¹\†NÉ."ÒU(pHØÕ©×?ÌÍëõRSSÃéÓ§ùâ‹/8rä_|1C† !999 ü~?^¯—Ó§OsðàAöíÛ‡Ëå"==ØØXìv{§ÃF}Ðp»ÝTUUáv»IOO§wïÞ³!"Ò Îîé¨^¯ÇCee%ùùù;vŒS§NQ]]ÛíÆb±`µZ‰ŽŽ&!!øøxìv;6›-8×Fý­·ÐþI¾L&6› »ÝŽÃá 99™¤¤¤V{[DD¤1‰õ_âõ½>Ÿ¯Á¥Œú×÷ˆÔÿ¨6› «ÕüS?fB3£¨B†ˆHÇ)pHD9;tœ=~Âï÷/¹œýÅ_[m}OFý ¢g ÕŒ¢""ÒqzZ¬D”³ÃÉd >V¾þ6Ù¦n—­¿dòýK' ""‘CC"Ò÷ÃBýͦf ýþ² ""‘GC"ÚÙá¡~ÜFkˉˆHäQàó†B…ˆÈùK3Šˆˆˆá8DDDÄp """b81œ‡ˆˆˆNCDDD §À!"""†SàÃ)pˆˆˆˆá8DDDÄp """b81œ‡ˆˆˆNCDDD §À!"""†SàÃ)pˆˆˆˆá8DDDÄp """b81œ‡ˆˆˆNCDDD §À!"""†SàÃ)pˆˆˆˆá8DDDÄp """b81œ‡ˆˆˆNCDDD §À!"""†SàÃ)pˆˆˆˆá8DDDÄp """b81œ‡ˆˆˆNCDDD §À!"""†SàÃ)pˆˆˆˆá8DDDÄp """b81œ‡ˆˆˆNCDDD §À!"""†SàÃ)pˆˆˆˆá8DDDÄp """b81œ‡ˆˆˆNCDDD §À!"""†SàÃ)pˆˆˆˆá8DDDÄp """b81œ‡ˆˆˆNCDDD §À!"""†SàÃ)pˆˆˆˆá8DDDÄp """b81œ‡ˆˆˆNCDDD §À!"""†SàÃ)pˆˆˆˆá8DDDÄp """b81œ‡ˆˆˆNCDDD §À!"""†SàÃ)pˆˆˆˆá8DDDÄp """b81œ‡ˆˆˆNCDDD §À!"""†SàÃYXi 0bµF&“©M詒ȵ}÷¥¶ï¾ÚÚöíÒÀ‚'žNÀ®Ãd20™LÍž„jû®Imß}©í»¯¶´}G„,pêêê(,,¤¬¬ ŸÏªUK˜Y­V’““éÕ«‹¥Ñ ¨¶ïºÔöÝWÛÚÞOñ‘Nyñyüaª©„š5ÊLBj)ý¢±XÌ! &ÇÓéXðûýâv»éׯ6›-õ“àõz9räÑÑѤ¥¥a6ÿÏ ¨¶ïÚÔöÝW[Úþ»#µÔžöÓ£o,V›%Ì5–P©óÖQt´Šè3=²¢´}g„¤‡£¾[­´´”ììl¬V«º×º«ÕJ¿~ýøê«¯èÕ«W°« Ôö]Ú¾ûjKÛŸ>é¡÷… PgÂëSGWa2™èÑÇÁñ¼Ó¤ô³7hûÎètà¨ÿ€ñûýø|>ý†ÓEÙl6|>~¿³ÙÜà‹Emßµ©í»¯VÛÞãÇd2á÷+hv%˜-&|ƒ¶ïlèÉm±g’®íûm­¶ï>ÔöÝWKm¯S kªo×Pþ?7ä¶XéÿïHk8DD¤ã”8º&ÚT3ž‡ü~ Î"r~‰ˆŽõë׳víÚ&Ëî¾ûn.¼ðÂv¯³¢¢‹Å‚Ãáh²üСC¼òÊ+>|˜””®½öZ.¿üòvoç\8{_<Èœ9sxá…ÈÊÊ wÕ:¥¢¢‚—_~™/¾ø›ÍFNN7Þxã9€¨ó ûj©í‹ŠŠÈÍÍeÁ‚$%%…¹¦Ò^…ß|LJïo£ðØw$$Å‘3áb²/¹ ÜÕjRuU-³{LT¸«b¸ˆèáÈÈÈàŠ+®àŠ+®àرcÔÕÕv:ZçC=ijÏ>ÛdÙçŸάY³8uê“&MÂf³1oÞ<^{íµÎì†aÎÞ—ÌÌL~÷»ßѧOŸ0תó~ó›ßðá‡rÕUWq饗òòË/ó§?ýéœm_çA÷ÕZÛ×ÔÔðÙgŸáv»Ã\Si¯¯wáÿÌ‘ªŠFŒÍÆjµðü¯óÑûÛÃ]µ&­ü7YûÚGá®Æ9ay衇vv%ÁI`¾ûŽôôôv¿¿Gdgg“ÍÆ4h·ÝvÙÙÙÄÆÆâ÷ûyÿý÷y÷Ýw9vì Àb93ÉÌÉ“'yõÕWùä“OèÝ»7ëÖ­cãÆ”——S^^ÎðáÃÛòûýüêW¿bâĉ,X°€!C†0qâDÜn7/½ô7ß|3‹¿ßϺuëx÷Ýwùæ›oÈÊÊÂf³Q^^Î /¼@ff&o¼ñ›7o&--ÄÄÄËê·ÝÜ~œ]–ŸŸOVVQQQö¥ÿþ|ôÑG <»ÝÞ¡zvTaa!={ölz v¶}II O>ù$‹/æê«¯føðá 0€ÒÒRF@yy96làÝwߥ  €þýûcµZÙ¼y3Û¶m#;;;xì–-[†Óé$99¹Åã¬ó cçA(Û>ÜÚÒö¬^½š›nº‰¸¸¸f/4ýT¿ÖÎÃóAKm_vÌCb˜ˆÃá÷XöØ+\2æ"~z÷µô» 7ÃÇ\„×ããïoÆøÉ£ƒ·xîøx/[?ÜMQA)½ú¤`µZ¨<]Íúÿ»…žiÉ|ò÷/س#ä”DbãbZ,ƒ3Çdûæ3ë,.,#=³'³¹QYÑñzõNÁjµ²}Ë^v}¶ªÓÕTž®¦ÿE™á<| ˜Lpê»Z’3¢‚m·Åíàå—_ÆápðÆop÷Ýwã÷û©¬¬dÖ¬Y8p€ØØX-ZÄ»ï¾KTT‹«ÕJtttƒu}ûí·;vŒ›o¾¹ÁësæÌá¿þë¿‚ôà¹çžÃn·³aÃn»í6jkk9uê+W®dáÂ…°yófæÌ™CUUU‹e-íG}ÙóÏ?Ott4k׮宻îÂçó5Ú—úmœ½ÎöÖ3$$$””Äk¯½Æ¡C‡=z4wÝupæ7ÌÛn»÷Þ{¤¤$þû¿ÿ›Gy83)ÍSO=EEE;vìॗ^"%%hù8×ÓyçA8´µíÏÖÜñmî3¨þ=­‡]A ‚þŸ,£¸°Œq“G7xý‡3þ¿}ôv0›/>õyoõflv;?ýŠÿ3ÿEÜn/UU5üíÍOyéé·)>YΞy<µ`%55îËê×¹ñÝϰGGñÉÆ/øóâ—ñÁ²÷_ߌ-ÊÆÖ¾äßÿ_øêüXmÌ3«…({TØß÷ÿ„ZDŒáhÉž={øè£X³f ½zõâ–[naòäÉìØ±ƒž={RVVÆÏþs²³³ùáˆÍfÃårñæ›oÒ¯_?nºé¦ë;~ü8&“©ÑodV«•^½z·ùÁðÒK/1`À¼^/W_}5o¿ý6£Gàúë¯gÒ¤I?~œéÓ§³oß>zôèÑlYttt³ûÍ|À‹/¾È Aƒ˜9s&Ï=÷¥¥¥L˜0¡Á¾=z´Á±éH=ë{ÂÉf³±téRž}öY~ö³Ÿ‘––Æ 7ÜÀ´iÓˆ‰‰Áf³±hÑ".ºè"l6±±±<÷ÜsäääÇæÍ›ùÑ~ĦM›ÈÉÉÁét¶x¾\zé¥Áíë<ˆŒó ÚÒögkíø6õÔÖóPB«ød˜ ¹gÃKñ‹™¤”3½zùyÇÙ½u?¿ùãí¤÷í‰Ï[ÇüþŸ°›Ãú0ö—0"'›’¢rþð‹g8vø‰ÉqÍ–Ù¢¬|¹ýýÛÝ$¥$0aʺëßÈÛ{”(»Ý[÷ó«%³Èø§4&üx4ï­ÞLÅ©*.}Ÿmú©é.ÆMîúçEÈG¨&©_O^^‹…_ýêW Ê>̨Q£˜6mwÞy' `âĉ\ýõ ž^øýú$''8uêT³ãCòòòHLLä‚ . `µZ6l ~€<˜@ @zz:QQQTUU¿hš*;vìX³ûEBB$\®¹} ®§Q“5µw½™™™üá ¼¼œ?ü•+WòÙgŸñÔSOa±X(**bõêÕìÝ»—ŠŠ ª«« ˜Íf&MšÄƹæškøàƒøÕ¯~<&-/õt„ö<8Ÿ&kKÛ×kíøÖ‡äïµõ<ì"è¶ØøÄ8@uE q Mß0Pp´G| é™=!V«…¬ ûPðM‡ö _ÿÞW'Ö( î7âš-û®°³Ùij½Ò`['¾-Æjµàˆ‹¦O¿4€#6†é·^}f£»:ÀúD|G\\‹…Gy„¨¨ÿÅÀ¼yó¸í¶Ûعs'/¾ø"‡桇jv}™™™ÄÄİiÓ&®»îºàë}ô+W®ä?þã?ˆ§²²’êêêà].EEE 0 ¸|Kײš*ki?>ýôS*++©¬¬ îWee%111-^óíl=ÃéøñãlÛ¶)S¦àt:™:u*N§“ûï¿·ÛÍ®]»x衇˜?>sçÎeÏž=<øàƒÁ÷Ož<™;3-[¶àv»¹âŠ+€ÖÏ—z:º¯¶´ýÙZ;¾M}åää´é<”ÐꙞLT´lûšË¯|}ÏŽlxóSî~àf±ÑÔV×â®õ`>Ó6å¥ôî›\¾¥ÿ.M•ÅÄFc¶˜¹í—×c³Y¼¾ï‡©©vSS]‹#öÌ%þÚj7QvfËy1ª!d"~oGމÙlæóÏ?§W¯^TTTðûßÿžÊÊJöìÙÜ9sLš4‰AƒñÍ7ßM~~>••• ÖͬY³øÏÿüOÞyçŽ?Ά xüñÇéÓ§111Œ9’èèhÖ¬YƒßïgëÖ­äçç¿ÔB½£F"&&†Õ«WSWWǺuë¸æšk(..nq_Œ¨ç¹â÷ûyüñÇYºt)ÅÅÅ:tˆ÷ߟôôtìv;ß}÷ Œ7»ÝÎÛo¿Ýàýƒ "--'žx‚ &`·Û–óÙtt_miû³µt|›û jëy(¡ecÒ´Ëy{Õ&>ÿàŸ,cç'_ñÚ ïÓ£Wöè(.Èî‹Íncˆöy„“Ç‹<¢ã·ÍÈî‹Ùlfÿî#$¥$RSåæ¿ž~›šj7²ûmãã ;ð×ùÙ±e/üó“œ.?s.DÙmœ8^LMum¨CÄŠøޤ¤$–,YBnn.O?ý4111Üx㤦¦’œœLFF?ýéOñù|$''óûßÿ€ë®»ŽGy„o¼±Ñ?ûÙϰÙl<ýôÓ”••Å”)S¸çž{p:,Y²„?üá<ûì³X­V~ùË_rñÅM(÷nïùçŸÇn·óë_ÿ:Xvö¾,]º4¸N#êy®dddðàƒòïÿþï¼üòË 0€ÜÜ\ÆÏ믿ÎäÉ“‰eüøñÖñ£ýˆ¥K—òÃþ0øZkÇùl:º¯ÖÚþl-_¯×ÛägP{ÎC ­«®ÍÁjµðÎ+Pyªk”…1ã.æÿ»e"q fÝ{«–½ËÚ×>ÄbµpÝÏ'ñO3(*,éÐ6ãÜzïu¼òÜ»¼ýß›°GGñ¿®E’+ ¸½÷WoÆeeúm×àüec¯º„Wž_Kî¿.cñ3¿ÍAˆP&ÇÓ©+5õ·Gù|>öîÝˈ#ZS•——“˜˜Ø¨{Øï÷S^^NRRR£2·Ûüí·¹u&$$`67ÝÙSZZŠÓél¶¼#šÛúí%$$`µ6΂-í‹õü¾;w2xð`¬Vkp;mû@ @qq1ÑÑѺ›ëË’““;t;aKǹ©eu4ψ¶­µýÙš;¾-}µç<ŒD-µý¡O*ésQ½ù¦ª¢G\L³Ç¾âTq ޶MåéjbãM^z©8U…#.K—R¼¶¨Èé0™áÛ¯Ëè?6.Øö=N‘³wmÐÜ/³ÙLrrr“e-…–ÖY¯¹õvFKÛli{-í‹õ<L&Spe{ÊÚ¢=“Æé<è¾Úsž4w|[ú êèä…ç—HñxFl|ý屦ëŸèh±¼#âb:´=[”%¤õè¼ÐäˆÃ!"""ç¿óª‡CDD"L$ÞÒ)§§ÅŠˆˆÈùHCDDD §K*""Òa“®¨tIÜTÒÀa6›ñz½Á§(J×áõz[¼5Umßu©í»¯ÖÚÞb3qæžX¥Ž.ÅügÚ7„B8ê[ÇÑ£GéÛ·oƒé|åüæñx8zô(±±±Q¬¶ïÚÔöÝW[Ú>&J «q¥90[Û?WŽD&¿¯Ž’Âjb’iÔöÑ鉿àÌ$0~¿ŸŠŠ ŠŠŠ¨©©é’aî®Ìf3111ôìÙ“øøxÌfsƒ €Ôö]—Ú¾ûj[ÛWrê¸Ú2~_˜+,!c¶BtR€ÄÞVâãã´}g„¼‡ ¶¶–ºº:àüzФ4TŸj- ÑÑÑÄÅŵø[.¨í» µ}÷Õ¾¶…Þ•Ø]jû® qÛ7îÝêÔúCÑÃÿ3ÅùÙK×`2™‚ÓÚ65½­Ú¾ëRÛw_jû¶ïðzC8àÌ XÒéäë:êO¶–’®Ú¾kRÛw_jûî«-mß¡õ†2pÔÓ‰×õ´õ¤SÛw=jûîKmß}ñ°ACæá8_ŸŠ(§¶ï¾ÔöÝ—Ú^ÚB3Šˆˆˆá8DDDÄp """b81œ‡ˆˆˆNCDDD §À!"""†SàÃ)pˆˆˆˆá8DDDÄp """b81œ‡ˆˆˆΪ§ü‰ˆˆˆÑþ „•Xàó‘%IEND®B`‚sequeler-0.8.2/data/assets/sequeler-logo-transparent.png000066400000000000000000000471511410464306200234210ustar00rootroot00000000000000‰PNG  IHDRÓsÕè÷_zTXtRaw profile type exifxÚ­™i’9r…ÿã:6Çr¬fºÁ_ßC&Énv÷˜I–±*+*ÀŸ¿éοþûºÿâ_¶Þ\¶ÚJ/Åó/÷ÜãàEóŸŸŸÁç÷ýýÛéû*üùº«é{Sä’^/çó3 ®Û¯jþ^Ÿ¾îêúŽÓ¾…Ÿ¿IOÖëïûÚw ?×Ã÷w׿÷ü‡å|ÿÇõsŸ±û=W6cã¥èâI!y¾7=%1ƒÔÒà{|ß-êJâµ¥ò¾·¿ß;÷óåo›—îßïßw¤?o…óåû†òÛ}¯ûíúµCœQøñ2þùççÝ»{w»÷|V7ra§Šû.êǾW¼q²•éÝVøªü7^×÷Õùj,qQ±M5'_Ë…"»}C;ŒpÃy?WXL1Ç+?c\1½k-ÕØãzEÉú 7ÖÔÓvÔ(¦EÕ—ãϹ„÷Üþž·BãÉ;ðÎLýË—û»‹ÿ—¯ŸÝ+膠ͤôáSà(L3 UNßy ÷»§öö÷}¹ß‹ó-l¢‚ö¶¹±Àáçgˆiá¶Ò«sâ}æ³óŸÖu`‹x¶1™¨€/À;”àkŒ5ö±QŸÁÌcÊqR`wp—Ú¤T(N‹z6÷ÔðÞ-~.C-B-R)MOƒbålà§æ††%ËÎÌŠUkÖm”Tr±RJ-â¨QSÍÕj©µ¶Úëh©åf­´ÚZëmôØf½ôêzë½ÁCCî¼cŒgšyÚ,³Î6û ø¬¼l•UW[}wÚ´ÿ.»ºÝvßã„”N>vÊ©§~Æk7Ý|í–[o»ýŽŸUûVõÏU ¿UîßW-|«¦Šå÷¾ú«j\®õÇAtbª‹9Pñª 訚ùrŽªœjæ{¤),Rµ`*ΪÌ'D»ágí~UîßÖÍYþ_Õ-þSåœJ÷Ÿ¨œS龕ûkÝþ¦j{,«¹ŠÒó•yYHôÉ0s kì-]Š4Póa¹l6˜à/ÛJoº?׌hÆòÝë&ªXoŒã„–½a³¡€©eM[ÛôÅPVÒ|ÇÖ_p?iæU0ªYD jòŒÞì÷{Tüž…¥ë ¬Úi-Fm~U6{ÀÇcÁBèeZ+§‹€<#¶H{îÚ…ýú¿á`þ€‚û˜¶Ý,»”"ÓåW¬˜Ý;;õÛ)°DŸf;…›iø>ï°è€ n#?Á§+£Ð:f•6À2ðì1Öô{f6 f§,«_Ä:˜¬ê ÇÞž‹BÎjÜÑÆé=-""| a4¶uyæ„-Dx$V!Á~áPEMîñÙª¨ ™6&ƒ(?ÍŒ.àÛ&kL¹—¨)óbFl®–T ”-‹.X“N‡â[_VDõëf7t– *Jœë)ò_£âð‘xP Û¢OL&‡Œù⑽Ñ~ÐQÏ"·€@Ô{§:Ò¹…ž².J›#•.â/3‰ïEᦜäA¾ÞÈè v[Дæ®é°ehReŸ¶:$:$ýP_ˆ§ÇÒ%sd0Z0)" /ã }™û+zϨd0ú[Rl,­²e ²Èž°0àB0$0½€Þá7à ÀY8ÙÞ*»çdÂÒÎYz=Ÿs9 ê=›î×…K-#\&×vO´€b÷°aÀwCxÞ€wŠ8›‰?âÒ¼” U¿Ø^Ë•à‘ñ$pjMù˜¾Ö雸à_">¸é\Z<>{ÕÆ0ÎçÍ VÜÍÁ *Ö‚â7 »±[Ȉ(JÔ…ÞRÐ,wÅñ¨–ºP2•C.!LÙ'ÙEª5Ѱì^ †æ¤ç& S–GßríDZÞD¥ ¨ÖöðÅGÂBçUTà$;x~¯Š@yü@+ue”POA®‘§àÒvèNn³ðëào÷YT á«ÀI(¨± Q'–^½”ŒFZašÚÒÁú‰‘¤7t6ÁY­‚ðÓÆˆyòOZ¬ŸZôAžëf½ëì’d%ÝSXR¶è#D?Ò–7V 2þbœ¼x‚XÀlðtû&H¤¡¨SÒJ„rãÌM²h DÒ+Që·È[1Y ôDŸŠ5P΂ܦ>†Kê¤C;ïÂ-slWß)寏âQœQ­ˆDõ8ŒNôH G¤”ê²!Ȳä¸;ãxÖºÐñ§ÉT¡Þ èšò0â?ÐæL½Á]H#Ã$½–yƸh$°õä¨Êsº«Ó0˜‘õ2ú:%bøÙ°ðè/Ûê”]/ä_†Ò6Ô¼3;ãy¦¹uZQ.t²úvÔ‡í,8±$¬‘õh üd—â\Äò[˜­.ž¬°Y.‰5áËx¸c¼Ã6g¥z¬úrÊöëWð2é˜Nš6ˆgj€¦¿ŽhÓßñ3Ü’§ôª“°Sn,Þ€}Ôí’ÎÆkÇ}#›à DD©Ùùð£Èk);(-â‡sÌ;ã¬NÂJ#]sékVx ‚z®¢ÔcË0Ón:wp8;gé4 ]A§5yÜŠ×íÆ\ýóØf 5µ~áA*/H’²Óvw·LÿªììÄ‚\¤Ž-ô¿‚ 7¬Gcój+ Åß´סÔäÈ`Fo=_ZDNh¨ïä»Tq!ÏsAR[S²l‰U¹Ëc¬®§gÄ Q'DD8—Hì°›PÂ6¥u\$|vDõ?œÈT`׉šBöxº ¡Dv¶WŒ^%¹º•tâGV¦eå¨a¿ô†ái!êˆ6þp~ß÷\ñrC+5/L²ËØÙ"G4Z¤¦b7Ë(#®„ÝÂÚTæÂ8ំ6w6UH8>Þg‡aW†ë=dæ…¨hèKyÀ§GîN=Äb¹ìá:\mŸŠÈ=ÐC• ŸÅð¼ ô ¾ªgêœþñ¶4Rúœbºa*‡_ñøn˜þ#æA¿°e$; .ž±l9f%€ô…kÉ(¢cbVBšÑÅçnà[Ç„\Éá À­6ˆv­feäQJÕ)¹¸ÓÀP-Y„ ¶€J»¡xºÕÁFSvC{‰ç|‡fݦG.¯¸L+“ž‰ȼ áy¿]À#¦×Ô Òê´úL)”R´ ±+È:áW"|Ö²pþ´ÈLØœRg‡7ºÄ0ì«–è3qïÙ*¨‰¥<ÇJ3¶) ãTÞnn!h1ˆ|¾è|„žÁ*q3+›/nª¤#?Fy2ùÆÁú1ï^]Ó>Ü-Œr³ÇÎ]Œ[6l1ÑdÈ¥ÉX©å¦Þ}`µ\ÑÙÐ"’ËÐ<:¥¤ÅiõÒ*Q›Ùqlõ=±y¥ú :®:ÁʂʔÆ|à5ÂŽ±u” y0Ç©£Ïó9útÿpö‰žÉ,vxé©0_ïUꯙbÆá]éójÜ×m„œc°I2k%Q¡> ”Ö¸DªÙˆô| ¬…ÙR€¥Dsܯƒ /™pB¿‹*&ŠHQ¨SöX¼«³È<»(E<:l¾CÔeØLËkã=Æ)7Tÿ¯“BgZ¸KÀ‚A×ñèc‰.[²!>xÌÁjH¬Ùb片„BZ˜™VÝÛIÇ[ëP†:ï“‚F´;·éX†?ÉzœDœ˜pô²E)Yw%¨>(“f"AÑŸYdG§ÐW‘3¾úˆ“¦AÜç&Éž$bD–§SÞïlïIÙ"$Ô“ª³£u*pursÖÁ”Þ‡c…ŽÆÁy’2f˜˜ Ó6‹á)t §M7¾ó¬šuØ`Pb-âªóòƒ¥0|wÒožv:ŽÔ3GHÊCtüꇷdR9£»:.ŸfÝç›æŽ@*ãj§ÍØ_là H^ÖY?ÖQjæ/yE%l%TlÚuº¡£axLŸ)@ºƒD¿]çå€9*~ÔLŸ3è£/ÉìQ'9¬Çš‘y ˆƒ¨O2X•‚Óf‡Êuú /²-ÇþÎÎZÇ«¡ñQüŽë4ÏCÉ´Äï€ßŸ³8T,x‡Vd£&Û_tôÁ_2¹_a¶Ö³§êˆÜ‘‰Ù/y,£Y`¹(öx—¤ê~»ëº×§:¡6±¡>$THaS6ŽÙèL *f°z h3üÉ“JÜ ± žLh·(©Úo#‡ÌËBÐà06ô‡¥DsaÔƒW«Åë„Å€\-8 :¸Ç2Ð_ÄJ«±É2îhýòMSnFr× DØ…Ë ~À…ó[Ÿ‡e§//¡ ½M/ôs7t¬",1+Ô:rÿ¶_eõ8bKGDÿÿÿ ½§“ pHYs.#.#x¥?vtIMEâ 8:Áµé¬ IDATxÚíy˜TÅÕÆçÞîžéÙPP ¨Œ²Q4‰F#ˆQ\"J>C4nQ—I01qMLbÜâŠË‡Û'£‰wPPcÔDÐaXfíé¾÷|ô2ÝMÏ0K÷ÐÍÔû<ýôíê{k»UõÖ©:uŽÐ=XÀ`/À‡AGá Àzà@M•ä.<©ý~?ÿûß™1c.gΛÅWGD$ñž“¿’_»úê«¿yÚi§]——W¡šÈ ùÝg»û»§Ó…BN}}ý>øàÝøÃ^–?øð# 7¹®òî{ïqÏóæ›Oó«_ýŠ;ï¼Ó´Xƒ,„$SWWÇìÙó˜{ÖößÿKãõz8FÍËËyá…~ãâ‹/¾Þ²,!ÏÎÿVUçž{î¹ôºë®ûGMMÍ»%%%¨*Á`ˆºú:>úhwÞq?|øÌÛn»í8`lAAÝÎ;10000Èf2M’J‡Ï™3güܹs¯” èFÓ71/“'O>oÁ‚‡EV r•L LžgvæÏÀÀÀÀ ‡ÈtO$Á=‘€ ²„L ¶éÓ§Ç”…â¯?þøØõŒ3:­¸ÕkJÙOgH5¨Û¶Mô8M0$ ÅÂ}¾ðiŽ@ €ã8±ð¼¼¼Xxôþ\#àø#D>ŸUEDbeކR40000dºK¬xy~­  ßèe &Ç ->ž_ Ïc€ÕÀ&ç}^[{  LîwåŒÈI ØçóÅœv{½Þ®U5!¼;ù3$l```½°ÒADÏmê‚P‚g7´G[á/}q3 ¡Í4„¶ðbõïsB MuO[h{’éî*“Án"ÓK¦[!ä„?¶í:|Mͧ´„BC!>­Y›Rh[’ig® Qô"2mÏÇf*LbÝfX·­l=zè€`\xK,|Bÿ“ùxýZ>Z¿– ³rV)~Ï´#×ÝIÛ±Aö¢[{¦Ñ~Je)ô§T9´ËNÏMê?›Iýgw‹(³€Û“FS)#ô"É4[%ÁlK»3’iwÓ6’©A’éžL‚éJ;*uvT)å60000ØýHufãØ`0ø”ã8ÒÞÀÞûóžžH»¢¢‚ššT•þýû³iÓ¦Xxô:ÞÝ´KKKéß¿ÿ´@ ð4ÆkŒAV¡C^cz¹$×ÔÔÄ®£äÙÞuwÒ6RªA·ñŸgÆr¿Ù:°8o0â¸MÅdˆL3EpfÖÀÀÀ`w™ò ¼.iY׆LÓ€ï™.[¶Œ¥K—ö8Éô6^±bË—/7l```°§I¦V¤‰l7nÐ2—viiiï2tÿS-Æm @Ü>@DŠÀiÁ’Tj±´ÇY‰-+¹¦d‹é¶]… Do(©µf ÒJ¦n¤Öc˜0a---)úè{‰ùÚ2ˆ†]רÙÓxܸqlݺ5ñ…¸® …téÒ¥:qâÄÜmqUê¡.ðMD§£:·idr[ · TÃ× X‘E”Ëê¶ |ˆèˈµ„†Â׸IšLW60èè dH´§È´¹¡¡aKAAAÿxë©H´• ÂßNܵ&½°dNQ·5@$¼Þ¬¾Î 3ùÛ¶mÛNñZ–EccãVÇqšV¯^›-íl- 0ð?윺Wl¥ÚñŽnS}Q¾|uFA]€Ÿo ‹û±§jP£éÖ…aÕt!Õžé¦÷Þ{略<ìt|#"Ɔ€  šhr…f§ZÔ" BPGwjouîóùxÿý÷—59ÙÊÎo>ŽÂÀ‡ÀõÀ^)—.ÚëØÚn§Ï¾…r?¡Â/¸|û¦[dƒdºú”SNY¸|ùò¯•——s]·m[½‘ohq…fWhv äHLèhWÌP°-%ÏRò\—<;¼à›ÎUˆl×¶m/m˲ðù|ÔÖÖ®>óÌ3«rªuU©‡Úà¨þIYÎ5 /¢¬À’wÁÚ„7´ƒPS#vžõ•â8eX Fu¢#AF£›HLÂ-6]ÚÀ #Ò¨QpÌ8™>ðТÆSfÍ\:vìØ .\xÊèÑ£óûý"’Ró7Y® ºB½#Ô‡„Gq´=Ft[Àã*Å^ðØ.b+¶„ÃÓEŒ™’(3)©FÂÜÆÆÆÍo½õÖKgŸ}ö7n\úÐÃ6:¡æ‘FÕ϶–Ǿ4‡R,þåvnÈ‘6X6‚¨²ÑÛÀ“±ÐŸÕW"î7PùÊ4„òؼÎÃ-¦[t®©‚LJ¦lß¾½¦´´ôùÃ;l p;àœpÌésv :ò«ùyùyyù6ùŠŠò))+¡´O)Þ‚Bl, ѰÀ ­‚hL(uEQÇ¡¥%HS}=uµÛih¨£¥)€ã*®Þ¯UWq!ò\%)<üÛuÃã´ëÆÝ!*AD°$¬Ç"Hø[Âß Vë="`YÑë¸g%|_4<ñ^Aâ½71\]¥9àhqi8áë€Ks‹KsÀ¥ß–—W¾üÄ÷ÿê€MÀêíÛ·7>ýÌs¹"‘ZÔ¶<qD^nø/èÙÜà¥[ñÿº¨xx€k¥õÇ¢z*T•®2ÝÚÀ`W³xÌviO)@mmm#ð@YYÙW,X0rà¨#¾òô†A4yŠ(,°),´)ò{(.ôPThãϳP‘°¬!J¹ö-‚ýŠ„ýŠaC#lhPÖ7ÀÇÛÇÇU C.E-.-A—–‹£Šë„ ÔuW‰¬«m„»àjøÚ‰»†V²³­Ök+rm[Q’•ÆÂ-"÷†¯í¸ëøxì¤8-K°SÄ%Ó†F‡†&‡†ÆPø:ò;¯e;SË*†Ÿrô˜Šyóæm–ÖÖÖ:9ת¶….™›A…;í?hÈ;žÛ%½ Bðxø£fx000È.2¢¬¬løœ9sÆÏ;÷ÊêmMi „†€: mò Ûýà/ÄõùW„í ïÖÀ»)âõ¢.ê‘æ&hª‡–&$Œˆ±­«»4µ'šp¸¢C¦ù”°ú±“â?:Wþ&§ªäù@ߤ7á/°=´/ýËö>oÁ‚›¯¸âЦ²²²·kkksgƒãüæa8zUxI (ÏSæ›Æï$ÃkÔb6‚ ²LËÊÊLž}ú•k×®­½óÎ;s¦E…¬+â]åì@B§Såk6ÝÍÀ [`”zŒLËÊÊJ<þ®»îºÌï÷÷O)uÞG´ kä"à³\7Q›7iHä]Ú–â—÷ ÀÛr¿éfY£„”Y2=eÖL1bÄa‹/^8dÈ¿ëº8ŽÓæÀÖš>]Û*kG2ÕÖ÷BcÚÒÎ3»"¢lõ{ÚÕg<eee>øàÓ¦M;õ”Y3ŸX¸paö.— “:ë«\_¼Ét3C¢{:R|Ýu×]2dÈ¿ã8íJd­GOÂ/ǰ­¸„÷Eí˜ô÷IºI4%˜I1×=΄B!vìØAII‰çÆo< Ø7»%S= ÖYÃøÈt1ƒ^)™:è ƒ£b:.”D$ÎŒìb¢düž&¢±±‘aÆúeukréÛ —èsÓÅ ²vö‹QBÊ,™———vÅâOÆV%z¹ßÓP(DqqqÇã)ÈrWlI+ÖžitþÚMÉ8,w`B!ˆ8-`}è*,{V|œù½ó³rŒCÙa0BI8¿BtÊ:,ëcœà›œy`3„å¯ ÅуÁ À"UhBd#Ê*çu&¹ç)ìmZTD‹w<â2Õ>XØ„O nÆr× úoT¼L eM¾õ6/Myã°äkû ZXXÒ„º XlD­UجNE¦^¯×K²dºlÙ2T•¨û/ã{43i¯X±UeìØ±É/ElÛöey—Iô5*îžc+÷êÍ{a¹g€|GG†Í{IøŒWÄHIÂo×ë>_ú·ré u=šß?¯êeÍAôdÜ–ƒˆ7ªÚšÏت‚ –äî—béýHóCœ:º!eÜ÷tâžn>å”'v:K–xØÚwYkžØÄ‰_=¦Gêæ¹7oCô¸´Oâ¨ñk2’ÖëKûLÐ ¹ûÆBˆsàq5(€W`Å ÿ¹–ÀL:zkNh³g&"§`‚7ÜGïéÅ{ŒR+\Õ[vPýèã¨ÜÆ€ï.K{žêX«|‹* g?ò¾¦öAœKif&––<§ôƒ ëR‘©eYÖNdšŠ`wÁíÉ\ZZš²ž#^|dΜ9Y¼6£[ýîÉ~9O¢¿ª®¹t.ˆ/Öv¹ŸC@.ÃÅܰñò=Wð£þõÍï_þ[Œ“÷sTç…»\ÊK,‹˜‚ÊÔÿ[îùøvü™yc‚I¢dTØ¥|~\,”sH,m¡ç¤1aT‰iAÚêO{/½4ü åD$¹µDÞIÊv$ úeDƒÏw+þy uÖ LM³´–I%¤ù(ΛO³^Ú¯“i— œîé|ñÈ_ë\*¿ûIËÝÚæ\öÙùÿE6ÍËÁ¹ %¯ý:ŠŸè[VGCU™0a“&MÊY‚Ë;v,ãÇÏMâQù°µ‘JŽ$&Î@­÷AÎ|ípÒf” Á6îñ¡òšCïrÝg_Íœ4ºv2Á¼wq¹$‘ä$Õ ²½UJ‰r„ß“_ü:w¸oÒÃû¤‹Õö8¨ ¯½üclë]औ…ÔÈPÕÀçìd‡-vO)ðJÝ×ø×?÷JKþ2mØ~íâ‘ùÞ@õ _âä:áÎzµ@cŠrG›Ç±à¾KÍ¢“31£ÚÉË”.*¢±åY”*Žøµ1IˆÎJM¦©  ƒ9%ååbþjkk©­­%Ë÷FÛ‹Ia?nùZné–+Ç@ú%™ü­îEø޵7Íý½\ZYÁ¥•{sI¥‹JD¾ ü¤6)Ö¡Xö«Üøùa Ò™àþHµð&ÈÏ9Œ V2w˜0wXŸ}Ƀhý2"ß~ü+iÀƒe½ÅÂâödˆ9[‘J"ûÀÇ«¯ÞƒÊÍ„ƒÄw†µÀ-Ç"ÁŒ?ÌË„Ã0þðA¬­Éò!:ä> 9iàGˆeüëùý³ºüŸ.þ6ªË€ƒ’&ÙÍÀÓ(ç ¡ö:¡˜½NØ—Aß-Äë)Æ¡\¬Nšh¡²êEg`ò_G¤~šO!ú$Î] \ˆÈ|Þ ¼êÇë-Çu¿„Êx”3P~‡#ÿðt)fŸ3+ó·ÛayÞ@CÛ#3êHc”+€rjP\°åzT/LìÓº±® hÛ]œ;<Ðæ³Ø<<Ïo¶^¸ø áSbáÙ°êbnÚ8•ó½–üþqÍtÐI°P- ú–ûsÎöVÊçªÄLj›¬|¨âžU‡€{p\LJuå9îÿh*Û¬ÿ‚SÙæ ½·bÉÛ¶-¦' Æk@.aâ×C$µ\8s¦‘P‹yýŸ?ÃËõ ß- {ãÊ?xûï9ø[³®üŸ<9 ô1À·ŒBôfZô· ;¡íóæÓë€åÀrtÑo¨–3@®GáZjm§bæí鯴•L›ZnC9¼uÛAþ…r.ysRy¸j¶Ÿ„'ª‘è î¹Üã{pIò'ª3øIËrˆHÏG¹0)tA÷Ëü¬ßŸÛ%Òd\Z¾‹^ˆÊñ@KÜ?%(ð›Õ¥ÝÎï­ŸŒÆ’$"¥ô,~8ôè6‰´=œ>ì-Nߪ³€ˆ’öAyœ¾¡Q±‰AZ;SŽ·}Ë÷'4‰H]y_Á(&úH›Dš “ŽÜÀØ#g!z~R ë!-²»—YIo¯Y<áa¢§CÂñVcéd†Ì¸°]"Ý)k3œt'b¬KȧËØüðØ4¶¹0™6,< eNkôòòÆãŸÓ)W‘»$SC‚mcúôé1e¡øëã?>v=cÆŒN+nuÄšRÖ"äù]ëë·qnàûYŸ÷ª­_G¹6i™éIB-GR5 ë–œ.ðªß'ìg)Š¡xó¯ïV~ï^“k=Ä幕c™7ôÎn×Ç<Œk}#î}Å‘§Ò¼Ô¶ûÞwºÒ~ùµÓ=;ab üž¯ý{ŒÓõãa‡ù;„Ÿ&’žLaXùO²fâ²þñ¾À"\¼ƒ3‰Á3Þìr¼•3V#òˆÄNdÓ‡Z÷¡‹|i)¿RBã½{¡Ü÷ßÝäÏ™‡Ìléô|*DdÛ6ùùùäççcÛvìÛ¶ñûýøý~lÛN¸¿°°ÂÂB<O·ÒÞìóù®£÷$‡ï‘Rh›’’lBå‡1%¤0<r^àª4;÷Tm,@t! g¯õ5*úžDՠ½xШue’€ðnÜ8¦Ëq6Ú#‡ =ÿÙ÷…´ÕË×!rjÜ»˜óm4J8¯¾:ô­ƒ´ÜÇäCÒ)i´MB=â:Ðû’Èà*Þ{¾2+ê²Ås Êà¸F½Çú&û¤A·ÿ‰+A¿›ôÆd³ž›žÌK1jßQE$}š‚½ÏFºæÊ1-˼ë^îX%ܾRø,à…ohñÅÂ7[•£69ïóðÚ3yxíØz/g%`¯×=²’òZU»“¿œ"á?z¢ò‡kK—²½åÎ |*µ²+Óy—Äk©nF¬YÌ“`Ú’(©¼ø nvl¡úó.Åuóç —$,Ù‰ÞÁ‡>šöª9uÿÇÃÒ)^i/GHn@Žý‡ÆÆsÒš†å»ak\µãÈOv{ÙW->˜™@óÂi|é¸ô©®œ¹¸#©Ý]Äš»óÓû7QNŠä|+.gvÇ`„•"zn£P„ú<»¡µƒµþÒ7ÓÚLCh /Vÿ>'¤ÐT÷´%¶'™î®2õ<¡Úç\µÓ¢’òe„‡© ¼Ïù“9Iíݞתý¹ ±¿ÊO¸¼ïgiMgžwÚ¦qÓçûv:.;ðC 8®v·ÑÄ%™“æœËIu„£7ãå¥#œ¯¥†pGÕÖtžRƒ+¿H|:%Kòwoȯ’îfŸiO§žÛrP7 ­¤°°‹ÛFI@õ÷ŸR|j·œr¤G2Ý !'üÙ°m×ákj>¥%" ñiÍÚœBS¡³dºÇ/ñ&6ZåÞ_"z¦J#@`ïÀ§\Ø´€ó›‡î¾¼Ï%¶ï «Ø¿ÏÃIêÂÖÄul ÕΣ[¤vx)=aŒ¸‰ó÷«ÍXñå•Àsíœì}pÝK“Bžãë__‘‘´|Þûæ¸:ïCŸP7,FEÞcW¢W>u8„¸‡k2Rö²S¶áòHBÛfw,~}@ÁÉwu{¡3„ÓVø”!Öm†u›áÐÊÖU±CãÂ[÷s'ô?™×¯å£õk™P1+g•‘¼^o§®»“vÎñïó£Å{ ðç6ºîÞ¨\Žè*.lz ›Náü X¤iS*U ä LõZfJf¤0ÝiL˜Ö©8ª× ŠŸ àqoÏx]‰,̉æ¢Ò’%ý€ãÉ•_g,Ÿ_=tÈ“ D¨2­ëåî6sœ•Ô8aØôU+¿eÝ“r[–¤§ÜzGW÷IãáéV;Œ ðS*ƒL‰hü ?¥2È¡ýwVŠšÔ6“úÏîQf·'ª*"ÒéeÞ=–mÀ9œ¸¸Œ°e{§©²2a*VS-5>ˆê]ÜPøVf3·ýp`¯Vg  ô`F“´ôÿp媸u7o)áܾ;:(TÌH þÁYC«3þÁçðyBÝ7¶ÝÅ£ÝM[|3 ›_ŒÆ·ŠÃ¿þJFó,îÿ¡ò½¸4Ø-u÷îs…Ð2=©>ïÎhš'¼BÍ£[€¾1îr=S€n.+K3Žïþ´të\’³-íÎH¦ÝM{X"þ}Þ¿ù}Þ,=¸è‘‹Š&eÀ9ˆ¬àâÆw¸¸ñÇ\ZÛ'C£êwÛ/sñ€†ŒÖCÁ^mçPg,EéÔ$r}¦GÞßÜ‘[“™=÷Ž<Ëw’¢ü[ƳmñvRšƒw‹VoQ`*Qs•aɾÇ~)ë"Šè;IcÒó«”ÎÜšž×Ó I0]iG¥ÎŽ*#e¢Ü9‰?䝿wù?Ä›7Õ3Q^mkå Лq¼¹¸ñ.©f åÈÄ7óƒbXCø½„]ÜQzö¦5e$‡áõžã!ùObuõ•–Eø€C&‚néèWW;¤ë`ÛMZûŒ|#©·.aø1h|o'Ô¹ÊWº?™Ò7Ò7×ÙÍ—Ë|Ûm·Å޽Ä_ßzë­)¯{Qv×J¿óßÅïòÅ–€_¡IVOZ‘èɨ¼Ã%õ‹¹¨¾ûã«6£•jìWz¤ì‡I-¢c†Ì}VØQë9ÞùúaÏ ¤úŸ¤3Ľ}wŒB)J˜’i0óíFª\à£$#{u§vI,äåj{&åyP7'Ò úfº²×)¤ž©¯Ü!àšššØõ¦M›vyÝ´÷xò½.%7ú/§$?„#½˜åIŽÃæm.møU[Jºœ¦“7r§>ï®ì™†Î¶¤®XÖ¡ç\ë€$"[Éû5÷\å?’vv_Û묭‹¯$µË/˜:µ¾‡r»-1m)ëÆ»ìÊ ) £’êcUÏ´=«6i.ЧÛåV+mQ«cõg¤ÐlL{D•¸\ïë O£Ñ?ÕyhRgØBõšóÞå’“º”–íïf.-ßÞC%ÝžÔH:80h²W˜÷{xº»)½ÑíÆ¶¦]îô$ ê«{,Ï’ÔnD:I(V÷ê|Õßö‚©§gÈÔ•ä¾YÖí8-oÚŽ“uX+oÙ²e¨*'NìQ’ém¼bÅ T•1cÆÐëq‹Ô·s’þ…}›f¢zÂW’^ï‹È ü¬ît~]Üɳ¡:(¶džèo ª6Åy×ÈvP^7Ê’|¼^oÄçk4í²6žJ· >ïÑwâJ=i3³±›üÜ+„ëP»šíÄåEWkxå•¡ÝnÉí­c/¤¬gëN÷ÚiuX=ÊÚ§‡v¹,5=¡NqÒ*U÷•‹¶õ<™ú|¾˜Ávã-si—––æ¶¡ûLàq€‡@æ’†Y¨ÜÄk1æ¡<À¥uA~SüXÇ_¨$Û™¸a)#þØ™DØ#zò4úŸDFæøþÝÖ¡T÷&?a¹ðIDATJaÇréŸø[ë{ô]ØRßë­5'B2Wf´ß6⮣ÿ…Rµ™ð¢Kë½IÿEÇhÚ®UØÃe8)DßÃi«Üž¶ë$¹þK*·( “ÈpÚ>ô6/2/Ø•‚€6uíÙ6eþÔÓä€ &0iÒ¤=–à:š?ûîÈÇU]·µ²Ÿö¸qã?~üÎ/ÄuÝP(¤O=õT/ÉDùmуØÎH”g“^Œ…p??«ë¸vc‚MÕ6ÌŒ¥ú/¹SvætÿíùÓ–º}V4½^¬„äRØù÷½‹6ÔfÛÈô^r'uP•Â8ƒþéiç)·¦µNœL×dsCCÖ¨jt oii¡¥¥%m ç"k„]WÇW%ü»­Æ}"P{ÉoÛ¶­[=Y–EccãVÇqš’ÿ땸¦d …Çw'u.?*é„6K~ú6MÛ ™—8«Óž%S'Ôd‚Ç/øK†È¤#÷¦T:{´I4×ù“.ö‰ŒNB3©—y7½÷Þ{/M˜0᤮.7î‰ûœ®*. "8*8VlÓ¸‰pÚ²ÓsBx…ÂRÅB±"û5í >Ÿ·Þzk PcY„•ªt.M ƒ€£âZÀ8~^7_ñä®i¯Âûh!îÿîÔá¬äAÀm{:åq+Åh¥ÉÏÄK$îævRà ôh½‡$/MöëewZBê¾òT^‰µ »4¬¤5~uÚˆQ’ÚŠÛF|€J\IxFߥ:—d ¦¹¢ãí¼½:’¤zp“JYGŸ;ÙÒÖRu‹Õ§œrÊÂåË—­¼¼|˜ëºÝ&¨\'àÖ3ÂB‹+Ô¢E-BNk»l+PW±-%ÏR|€W\ìh¼í¤mY>ŸÚÚÚÕgžyæB`Ugïñ„ú³†3pu%$,Ùž Ó¨áðÖ}­\Õ÷‘ì.´´$Œ0*=»gæÑ¢´FÝUÚmiKsÒsÿåðIôŽN§ÍIõäKßÉѲ§—Uw"Óûî¨ñÔ9³–Ž;öÂ… ž2zôèÃü~…ˆtøLjW,S{ŸéŠ7ä*A‚ŽEKÈ¢.! /ݶå™SUÛ(b»ä{\òl¯(¶´[nccãæ·Þz륳Ï>û7.½ïþ‡ÕmÁ ¿.üœKëÿœ7¡=œª-%TíÂÖ­jSRçê“%N”DE‹{6yOa«²›ˆ°ûè®Á즤™vy¯éoJcìµK/+{$Sjjjj***ž?ì°ÃÖ·Vz8pÂ1§ÏÙ1èȯæçYäçYäåYäûl¢¿óó†Y\7,p©*®‚ë*ªeœÈž¡«žêÞˆSl7¼¼ÚvxäY”ðwìžQ‰"‚%`Y Hø[Âß Vë="`YÑkA, %äåçQP\LIi ùEÅäù¼ˆ^u¤Õ2œ$+jº„‚ABÍ 4Öí n{õÍ46‡hnv\š[\š.ý¶¼¼òå'î¸øPlV×ÔÔ4þíÙçM‹M9Át¡rn\÷ðŽÚ·J£Ö&$^Ò—ò̶&jKÏ’©åí&K»Ùà6%,“ }zM_SÝÔªU+€2mLU•êêêF"öC+++¿º`Á‚‘Gñ•§7 ¢ÉSDaþø=ØE~GÉÔu5B˜à¸Q’ hô:ž|¯Æ…»a’uâ®S†ÇÅïÄ]C”Ûj½¶"×¶%Y‰h,Ü"|¯~Ög[ø|6~Ÿ…×cá±Ã÷ôˇ¡ÅÂÐbدXØÐaCƒ²ª>º’+ˆ„óÞÔäP×äÐТ¡Á¡¡Ñ¡¡É!¯e;SË*†Ÿrô˜Šyóæm–VWW;•ž{-š‹ß&¯Á8Gã»$StcÒï~90šU'JERÚ£É;R‚hú÷žz¶yw¯ÎT7&åê×kúšHRŸ!Ÿ1rf}Ž€=‰L“i<*++‡Ï™3güܹs¯¬ÞÖ$°‘Æ@ä`P(";Õ¥&äöÛ£véÞ”ÿ‹&lhw(>%¬í´Ÿ–jä|“x¼WˆUP„æ ¶µ,¶ï€w6Á;mŒ¢.n(Í ¸õ;ðéj¡¯Æ©özÀ_`3zh_ú—í}Þ‚ 6_qÅM•••oWWW&m7I—ÖoÆUü®gÌ¢«“:רJ:|fëQ‰?{@EÃÒ,iïå£ÒÄÁµÓH¶x4"Y±ýcm!ظ_A ñKåù…+r¦èjsž]é€É“'»úꫯ¶m»`P¿"¦õÞ!ÂkïwgîM÷ï®>ë"„°hrmÔK“zp°ÂZ½í½7¬ÁkcãøÉ#ˆQ·­´eúôéW®]»¶öÎ;ïl>Ä`WƒCCÂTS¤`׃ýo¼n|ç*áÛ÷>Éârþ7)à«=<˜–¨Ï'.úåxiÁÓ#ùÿÇŠRBZÔ­AUøwÒ~ñHV¬ð2fL0'ºJwÈdäÌV>ý!Ðê½ÉuÊ)2ͬvˆ´tðàÁãïºë®Ëü~ÿî­Šd·áü޵=ÅÅ'…V+@ Íô±šéCë§L›>}¬fJh¦Ä P -x a‹"h»« –eùæÏŸÿË#Ž8bLee徆,wù¢û%ýnÜå3×”lÖ$ ”S³ºœ¶ýARH97¯ß»spàNNW0s¦Ä/ –ôHîCúµNœJkƒL›ß‚qD;‚ãzQo{+60†q¸€ÚLû÷ï_8jÔ¨#/^|ë!C*âÏ6îÎ#,»“´Ý¨‚rÃ’ªv`ë(fqKÀBñDž¬ˆ’R[yVUÇ)¿ûî»o={öú÷ïÿÌ}÷?´É4Ù¸H ‘†²¤YwMŸ~8+®âþ’µe?h-7¶h%PÑñÀú˜°÷®™F){;hÔhºŸEø˜92³êê*‡ÄÆÔ©õ,y}Ê¡±Îo¹Ç¯õŠþæò,~›L‰~‹%K7øqÇÖfô\9«õ99†ªmeTõ©ÍÚò*/"ÌŽq‚Å÷€Ç2žî}}¬ŠØ`Ôݽ'ÑZ”xœ âÏ6s•76=–ƒ¬g÷иÂÌBõò,ßoO©¸-ÿÀòo$¤‚!õßžéÍÃPªeÞÁ×]wÝ%C† ñ;ŽÓ®´×Û¬!Iø LÄŠQ܇?¢nÊûöåP(ÄŽ;())ñÜxãgûæLÛþ~RH€¼âw:öpÙ3Àæ¸F“zv–O$lÔ«~‡›Wf~™T­ãº+Ô%uе ñ©spFó¿dI>ÈÑ;-umä\H¢i¢ýxùµãzEq¿&MŒ~œSeÈ-¥"ÓtÐÁ]±´Ó¼¾ÄŸ°êÌ'*ÊJÒnlldذaã€Þ£‚ßQüd[ª3“B_¤J;ô|•´ Ü“dóô‚n9Ï4BüD¨~,ïÌÌ>*(§¥™œßHêY‡d´ E'Õäíî3uÂzT’$1ëJTsÃÞgwËo¹w$J«r4+Ÿš¸Ç—»“dZ\^^^ØKB™ëǽÛïi(¢¸¸¸Àãñ`Ÿïº&.÷tNÒóÜ@¼U›°{·_fm™/Ü„pGRWþ‹>ðe,ÍûV O¯„­o$-ýœˆjfÊ,Yâ¹´c^\:¼Bpu ­z/¾–Ý«é2¸1ô;V$ÙÎý#+Vx{ëP”ŠL½^ïÎõ±lÙ2–.]Ú«¤ÐÝ‘öŠ+X¾|yª—"¶mû0hÅOOÎLœuÊÇl+êÜþaUÑ 7&”çò‹­Ù»l§òû¤ À~l*¾"#iݽ&WöxƒyKx€yü½C3#•–œ|9­q1ñ \MšÜÀK¯eï{"ŠX—è¼ô`ú|þ›)@©•Ê3‰×ëÅãéÞQ0CÀ»Ž·´´”’’’m7ì…ø´ÓN à¢Æ™ >µÔJ§"çs»tþ¼ŸUz5¢%ô6åA~¹urV–ÿܽ××·N"ôRnùôÛéO,t=­Gbjíûàì fßðTB˜Ãµa)2xjùá(¿ÊÈ{ð†ÎÔIt€.}†¾ö¥=¾;æ{’×MX½ø|#™¶AªÚ®sð\ ¸\!à±cǦtžõ˜£=㽤Jó¹¸áˆ>ˆ’´„"äšÂ®iVI30¡!Ž ŠPžã[NÊ`y¬./må"&?#𠲈?­ûVš·pת(?Š“ˆÏù"}{O’4!ñlî—¾%ö§W‹XOÞÙ½ÛJ~iÀ”)Ÿs„Ô½ñð /¿œ¹‰Ø¢Ev÷ßoòá„ÎÞO ½ÕOýMCÛÌ{–”Wdš²ßƒƒÁNôÃÜ'¸Ý‘¿ÚÚZjkksÏo‘[Åÿ8ÿâ‡Î¥Ì×ýÒÿIjsQÃtê›þÊ•$@ŸÄ_pA÷ˆ­ü߸œ‚ßÐ Aþ—_n¾Ÿ_Õ L[y®Ýt×~~=EÕ븾ºk{á nÂr¿G¢2RèÓܲö2ªºaUèÞöâ/«Ÿ½<®žoáŒá€¦o»aæÈ7‡ã$;€ËxôýÛ¸­ûoÏ~PÎâ·oFå)ZÝóÕaˉÀGiL§NzW.N¤¢ö^~õZ–-K2›VY¼ùÏ)¬xáv†ö{»ëñ¤qqëÀéu¸L6ÆMˆÑŸ²&ÿuV?9&mi}¶h/ª»/}‡jë˜l!ÑÖ™l†È*¤¼Þ&gF#ŒÆu¯áœÐ'ËY†8oð~Âí²¹S±]¤…„šÂ’c‘æÓP”z«Cîg[Ñ™üVºhü—}žäÊm'aYƒ›ßÊÖ2GNdÁ–ûk!¡²W©’Ž«s\÷E!jŠèá¨~qGF^,ÝÚ¿ùѾróºãž)ˆx3ñ¢üšŠµ§ò§µ×àñ>ʼAÓn¾}ÍAˆóBò$nµAYDѰ¨›»¼´¶i9õM þè—êÙôõÉ#ÿ¾­¿™“švÏ3+ópÆ¢îL‚SJãÎR6û]Ž»ŠgV¬ƧõðþoäÅ¥ zCÜ õÓ:‹W_½‘™<ù_Š÷çû‚g –;•åÖtÄ9ßûYÖôúý¿ó «ž< ¬ç}âþ‡%o²æÉç°ô/xígt\cǽ%ª·‚ËTD¾zX6kK§eoÂ(egþvÂ}(ÊPГQ |!˜l>EÜÏk;hÂÒZÅ?ªeˆ–ÃpbIË9h#ÂEüÖk¼å÷´jUídàQ`¿¸2壜îYØ[¶sõæe "ú)HJ6Ũæ#ø û!ì‡Ë ÞéÎò 76KŸ$lø ZE‚Þ‹Ûò'þüé+À ,] lGÝ,é‹H_Tû"z 0q÷N˜¾‡hß̺Ï.¤jxÔ-Dzáf\Ã|>Ÿ•/!z+Rt3ý{¢ËA¿@¬­¨@èƒ%å(刎&Ø04?Éß&@ ß瘱/D~¯ÍH»?|âM¼ðÚÇXÜG¢ŸÏ2\.FÜ‹yå•jD–ƒ»hÆÖ&”BD Áõƒì…è~ÀP`8¨–&£…ÊÂñbØôU¬|f,â>úÍÄŽ*Gãr4-n€Oÿïm„wOA·aI=¸…¨åE(Ærû ²/–îÇÆ­#2ëb0ÃÎÁ vüžéÓ§óÄO`YVìZD8þøãyüñDZ,‹3fðØc‘J©«3içá°”Þ0¬ þ c‡ö;\FEy u1¿ñš‘ÒT•½ÍokFÓä¹ ÑsA¼Iå)Ž9ªÕfdŠ"KʉF-¨Gä|~0ì“þõµóŽ»†“G~À¢w'õ0ʸ¤zó“P&EL‡Xá´Ý¸lÄæSñù’§q˜ÇwŽs¦k3æªæˆÉeÉ›#‘àõÀÉhØÕq\¾*A§'´è²kÔCÕ®QòY7 ?¦­:š5‡ü¸è—ÔÞó@&‚NLlƒq^¢mRÛh_áø–áZ«²­ø™S ê¶m“ŸŸO~~>¶mÇî±m¿ßßïǶí„û ),,씆p¶pü"¯×»'9|–B£ø³õs\kp°²]©µ3n"3mù3–=’ë NÊ‘FqIEU}.–ᠿ¶¥ÎŸìzöÛZ—°‡Ÿdo~:`ó$=ÞF~´ßÌr–‰È‹±J;1+ßû9ÈU„dD "m%Ót7噣×P±y2p»2+Ø~Ú!DÿŠr8Ç}í8¦œäƒÓZ›Ñv3uÜ6y6bÜ4v£,ÑwDX‚r2±Gœ›–¼¦ÛÑ»T¹ =îNZt(ʈ¬NÓX°ä·(#pâDÐEOZiÐBïªdÚ¬xy~mØðû7zh‡·®6´øx~]4<V¸MmrÞçµµ·Êä~çPΈœ”€}>_ôÈJÊkUMïNþ²Ÿ„E¹7€7€Ÿò#í‹ú–u0ª£PŒè”½Š;°L¬ÀgÀ‡o ¼H}þ«]:öÒ]\Þg-ðnÓ‹Ù´õH\¾ÅDÂçËÚÔ•u«Aþú"ÞàË\0xkFóû?û¾¼ÀÍ뾄‡Q‚0hËûS#®|„Å+ˆû7œÚ2¯wbŠ/c>HÃÆÒÿÌ¢E·##ŽDõpDÆ‚xV4ZÑ ² ô-—±[žáØq_´™†íy74/ÖØÜ‚Ï3R–)þ œÆsÏCAÁ1 ‡ û -lg©?^e5»¸ò"ù×}TC÷ÉÓ}KæÅÈÄ–w3Rö§×77±öéCpœc&¡2°í]ôsÂ>c?ÆålëEÎHÏÄY™‡#Ô´Ž%žtÑs…ÆÈnʳ„3†„¯“ÃO¾~é‹› hX;ýÅêßsBå­Y/…¦ºÇçó%ë®®Ó•vNàO²…°G–çwúï"-¤‘bò8بUéG8µäåoã·²=ëÊ– Ÿ|ÂøÍÖR‚Á~ØV˜T]u°t. ôë¿5mRgWpîÕÀo#øË‹iöT"ÞR¼€ë6 ¡zæÛÐaía ÛÌŸu»hû{äÆÂ•%øûâ•ð~¤ãî@œz¾;¦sdxÔèMÀí=öŽ:ªx$ò ãå—+éƒF&–¶Û‚c5 ZÇ¡‡nAÄÍH^:úàƒm‡û|ç-¢nÛÖ,ɇº¨SŠÓʯÅr¨³…Á3›2–—òïgì½§G2Ý %GJ¶CÚéššOéWV„k׆·e¹Ú–dE[K»ñ×{ìogq½4 {DY.-ßNâÑ”ìÅ™Öu;…ŸÕ‰8Bþe`ˆu›aÝf8´²u"~è€`\x«ŽÅ„þ'óñúµ|´~-*få¬2R\×Í ‚Ëe.--Ý¥¡û¨ÏSƒ,#Ó$¸$8_† &ÐÒÒ²G\¶äoܸqlÝšh¾Õu]7 )fqÍÀÀÀ 'È´¹¡¡aKAAAÿxë©H4Û¥¼\$àmÛ¶í¯eY466nu§É4YƒìC*mÞMï½÷ÞKmy:1ûœ=Ÿ?ŸÏÇûï¿¿„ÞjËÓ {aÖI Ú$Ó5§œrʃ[¶lYmYV»îÃz fl,j'm˲ÈÏϧ¶¶võ™gžùð‰i²ÙC¢F ÉÀ Šøe^ìÊÊJ­­­ýϸq㮾ýöÛO;vì„¢¢¢r˲¤£dÐË”ä—kñFÃTUëëë·¾ùæ›ËÎ;ï¼Çêêê>¬¬¬Ôêêjà™ÀÀÀÀ ;ÉÔÓ¯_¿|É÷z½Mõõõop ;\×}Ʋ¬BUͼ–eyEÄ䩪WDšE¤(yšªªÒÆÔ5>\’ÂÛ»–ñ´÷Ü.çÕI×ÚÆ=º‹ç’ïMEr*;û‹TU­WÕ| U ¹®‚"p]·Á²¬/òóóWz½Þ&)èׯŸµyóæf hš¯AÏ£h6Õ``Й7oÞìTVVºEEE¡¦¦¦`^^Þ¯×ë³,+ÏqŸmÛ^×u½ªêµmÛVU±,+ä8N^<¹Eˆ4™ðâÃãIURpJ2Mñü®wWdš’#Ä×Ö=ÉĨÉ$÷|BÉñÚ¶p]×#"ê8Ž#"A˲‚ŽãmÛnq]7 [<OÀï÷@ËæÍ››k[d!™¸ÕÕÕñŽ›ð4ÈÓÒÒâ žÂÂBËqÛqKU% ň2J†Idšð» BM–d¾Û ç”ÒhRü;‹Å)$ĶH6îÞ¾“þKIÄɤý-"!ÐØµˆ¸¶m; ®Çã ù|¾`uuu("š%]ƒ,…Ù750ø\¡¢”{UöIEND®B`‚sequeler-0.8.2/data/assets/sequeler.png000066400000000000000000000105551410464306200201220ustar00rootroot00000000000000‰PNG  IHDR€€Ã>aËsBIT|dˆ pHYsÄÄ•+tEXtSoftwarewww.inkscape.org›î<êIDATxœí\kŒUvþέGwu÷Ì8ÏŒíÕŒ‚ÅZ©Ô·NŸ:çVsoÝ{«ê$H A‚ $H°¶@]¶/lð-z—}­&Hyç|€»åHí–a8ÉõÛÏ>ûì÷yä‘§R©Ôóòó²ßɱî÷Ú·eYöâââçÓÓÓÿúòË/p]J¥F«¸åé§ŸÞûÄOüXÓ´¡ {/J/ÑOß@D"NOlÛ¶íûÙlö‹cÇŽå\솯n%ÀÔ}÷Ý·û¹çžû±ªª?…•ZA/Ñï€×£¾.D$n»í¶=sssŸÏÌÌ̸µ¿n$ÀØæÍ›wMOO?kÆFW8¨¹ßX©.D¤Ýyç;Ož<9söìÙ«æ£ôu䆇‡¿ûî»ï½=bÛ¡1H½K˜º¨ªš¹çž{nyï½÷~yýúõY…ˆª•!ºªª;Þ~ûí?›˜˜Ø¡ÝÀ¤€G…\.wóáÇÿjxxx;€\Tv£Jð»o¼ñƃ[¶ly8"›mc5Üccc»>ü#;¤¢°Õ-àöC‡ÝûðÃÿ5u{maÍÜ£££·lݺõÚÑ£G¯8§‡Q$ÀæÜuðàÁ¿Bte±g-¼n]¦¦¦îܸqãW|ðÁ"€o:±Ùilؽ{÷žW^yåït]_ס­’€;hQºùæ›ï2Móó'N,˜ 룓™œœ¼ëÍ7ßü›¡¡¡:°“¼Š u!"eÛ¶m;O:õ‹Ó§OϘ ã3ìý:{ë­·þÁ[o½õÏSSScB,%»uA£°ÛÍ`÷ú¼™¶mcvv¶°ÿþ¿üè£þÀ¥ öÃ$mÙ²åÞy矚š2¤”µJúU¶ypеò^ê ²oUUaæçç­ûï¿ÿO?ûì³#J µ@˜iàä /¼ppjjʰm»eæ·Ó*úÙcÄÝ·eY˜ŸŸÇðð°úâ‹/þ9€oµ&6ÞqÇ¿#¥ |`T&î‹Úw¡PÀM7Ý´Àú ~Ã$ÀÐèèh6ns1pQù¶, CCC™fÞZ!Lhš¦5?ùä|üñÇ •k…A¸xqóýé§Ÿâøñã rMÓHQ”Àë0a^Bxoš¦5È‚"Iš•펌Œø^çê,U·¶+ê ¿îçÎÓ4Û:&*¬µ¤Ù¾};`n.Ô´¿‘½Ö,ðͰ‚Òú¹Êw”ƒkôÀõÓ÷ -”u%¼ô 3è¾»9Ãê8ýâõÓ÷†3¶(ø|68p`ïóÏ?ÿ¯3ŸþêÿP([uÖXUÁšYHÝ©¤›MàäˆÛ&¨TŠ‹@¥²Lçß&ã_[»ç OÝ:]¢ bÏÐl½ñ71¾Îà#GŽ<óÌ3ÏüÀ „Ÿ%wœvïÞý½ééé Ã÷S°° · ¶‚¼-`CÀf,xOœ`¨Ä0ÈÂbÃ64b/‹6è@ªÕ~”¶ºY)e套^zêµ×^û/¿DHt•"†Q·“³§@«Žè3ŠD†$2B !k›A62Š ƒ$2ŠŒ"‘*1–•¢@?×á½R—ØPÄ0œA—`I§Gp~­œ»ÿ  1ª­•îf°{½¾À#ŠWìŽÖ½Þ}»ºe"®­XQ«c||wª3¨k@Œ(bÜÛ€B€"ê6rîóJ­•×m=Ðòeà•°VWB1a¦¡(bÜ•»•bè§ã½]Ä=pQûN(bb¸¨|'1!Wß ELL•ï„"&„ÝA\T¾Š˜ç¤I(bbõóCBßÝœa%1]ôPÄT±V)bÚù"8¡ˆYÅ1~´0õeæ„"&¡ˆI(bŠ˜nøn ELv›é$1ÕJ%1 EL¤vãâ;¡ˆ ¡³š|'1 ’N/|'1]À ¶v?„"¦ :a°V}·ƒ„"&f¾Š˜é„A/|Ç–"f% zPÚ­c*œv›½ËU¯KŠ˜0ˆcÒ¸"IÎ.Ggù§L °T&ˆiš=ŠELX0è§oÉMT£Â)³p¨n¤³•lª•k²*N&,L¨,EL3Ùj[àê¾ BE:¯°h Âñ³C°äŽÉZøŽELØK;A$»–d˜L(Øó–À‚ XL-©p˜ĨQád‰aÕùrÚ¥Âiqýb@“Hë ÜýtJäÒ¶8'â2z0;ݨ#_bðpÊ~ºŽl (b„€*©t ™¡! #BJ×@ŠR}Yi,@õÃÀ–iÂ*åQX˜ÇÂõK(”,”JvŒ)b2 ²†ŠlFA®ºï&€CáâÄöP¸¸åšÜ«ËuòA ˆQœcuE@׺€¦ ¨Š£³> Ü8D¸q¸aˆp¾\¨Òáüï¢ÛË;\AR2ŠE .EL>Î1-di³ÓeРÝ~§nìÙ‰URYˆLœÎ€ \%ÃjjŽ´LP){q\.Vµî°ŠXRĸ2 :p‹r?ì± E© ÏЬúRá4@:¬' $ ²A)˜P![RáÄ‚"¦] úÃ¥mÀe3q–rb¨$¡³ CXHÂQÝÒl" «¶ÂBŠß4YÐ`µE…Š˜¨I º˜hҤ¡‘¨.¡}*†ZtºT8ÍêÌ#Š˜VûíèÄe ¶XWP] hbg™˜Aµ™ÉʾcCÓ «iUÐ¥Â`ªÛиK_½ T8±¢ˆº·˜¢ðí>Ð ÚµÖÖ$BøN(bbž4úN(bB ®¾Š˜˜.*ß EL»ƒ¸¨|'1 ÎI“PÄÄÜ÷ -”%11ðÝÍVBÓEß ELk•"Æû(³óEp«ÏÃ{½ž’PÄt1it]¯Ñ¿ø•™y™¼“úõe Ðn劘„"fÍSÄ´ÃÐåô„"&»Ítꃦâ{`õp+•PÄ$1‘Ú‹ï„"&„ÎjòPÄx0H:½ðPÄtƒÚÚýtŠ˜.è„ÁZõÝŠ˜˜ùN(bz¤½ðPÄÄjKš„"& N?}w£~ EL‡vÝw˜úuB&NïÛ·oúÊ•+_ !Z>Êl«!pÝB+ßB¤ÓiÌÍÍ}ùè£þÀWAí‰P&&&R…Bá[ëÖ­ÛõꫯþÉöíÛwær¹Q!„¯­°–vFÖ¢]WÆÌ¼¸¸xõĉŸ<ùä“oÎÍÍý<“Éœ¿xñbiD[Y$´õë×§UUMW*•43¯+•J›¥”„YfNЄ©R̬Q‰ˆr^_ÌL^Y]¨®ìWW¿²×ÖJ6Z}ÊÞ ê'_©ÜlÆD 4Ì̜̋&"@™™-)¥ À$¢²”2/„ø&NADsº®—,Ë*ÍÎΖ´õšvÐþ[LLL©TJ/‹)Ó4Sš¦éBˆ”mÛº¢(š”RcfMQ…™IaÙ¶ªóEÕà×û'¼&«¯c]Òø&€Ïñ :mžgËàVƒÕLÇL†'ðuÇ/³áµ«(JYJ©Û¶m‘)„0mÛ6E©H)˦iV4M+†Q.—Ë•‹/áÌÒÚB§7p mÚ´I-‹šeYj6›¶m+Ì,˜Ù yËuÇ/Ûo’ÞcÙo“„ò=GýÆòi‰>eöè6üzþóMo"¸ûDÄÞ2IEQì|>/UUµ Ã0/\¸`Áié¡)Qp5³Iž Ê­d~¿­Ê~ûí¢d¨/·ú]I֪ܬÇéÝH€ ~ÛI¿c¼²Ve?¿+¡ÙEz¿o&kðž¢_ Ð)‚´öNϱU/àÝïß|1A‚ $H þMi6%ˆ£YXIEND®B`‚sequeler-0.8.2/data/com.github.alecaddd.sequeler.appdata.xml.in.in000066400000000000000000000472131410464306200250360ustar00rootroot00000000000000 @appid@ CC0-1.0 GPL-3.0+ Sequeler Friendly SQL Client

Easily connect to your local or remote database

Store your Database Connections in the library, connect over SSH tunnel, type and execute SQL commands directly in the app, and do everything you need to do without the necessity of opening the terminal.

Supported Databases:

  • SQLite
  • MySQL
  • MariaDB
  • PostgreSQL

Features Include:

  • Test Connections before saving them
  • View Table structure, content, and relations
  • Write multiple custom SQL Queries
  • Switch between light and dark mode
  • Handy keyboard shortcuts to quit (ctrl+q), create new connection (ctrl+shift+n), open a new window (ctrl+n)
@appid@

Odin release

  • Update elementary OS Platform runtime.
  • Update screenshots.

Odin release

  • Updated translations for Ukranian, Russian, Indonisian, Chinese, Lithuanian, Portugese, Turkish, and Arabic.

New Features

  • Create, Edit, and Delete databases.
  • New context menu to copy and edit tables.
  • Support unencrypted connections.

Bug Fixes

  • Fix copy column data.

Translations

  • Updated translations for Ukranian, Russian, French, and German.

Reduced CPU usage by 2%.

Update translations for Italian, Spanish, Catalan, French, Hindi, Russian, and Turkish.

More fixes!

0.7.8 changelog

  • Fixed usage attempt of wrong Vala method.

0.7.7 changelog

  • Fix nasty GSettings bug causing the app to crash.
  • Implement GDA Placeholder statement.
  • Improve Query Tab iconography.

0.7.6 changelog

  • Fix ORDER BY in PostgreSQL Relationship view.
  • Improve MySQL structure view.
  • Drop Granite.Settings in favour of GLib.Settings.
  • Implement Granite.Notebook on the Query tab.
  • Show query error messages inline.

More fixes!

  • Fixed usage attempt of wrong Vala method.

Because 0.7.6 never happened!

  • Fix nasty GSettings bug causing the app to crash.
  • Implement GDA Placeholder statement.
  • Improve Query Tab iconography.

Query Tab Bonanza!

  • Fix ORDER BY in PostgreSQL Relationship view.
  • Improve MySQL structure view.
  • Drop Granite.Settings in favour of GLib.Settings.
  • Implement Granite.Notebook on the Query tab.
  • Show query error messages inline.

New features and improvements

  • You can now duplicate connections.
  • Sorting columns now works as expected by actually running the ORDER BY query.
  • Quickly jump to a specific result page with the handy dandy pagination popover.
  • Show Comment Column inside table structure view.

The 2020 release!

  • Manually reorder saved connection.
  • Allow selecting a custom SSH public key.
  • Fix SSH tunnel crashes.

Raw Query Improvements

  • Strip comments from SQL raw queries.
  • Better handle complex queries on multiple lines.
  • Speed up query rendering.

Sweet Query Tab Improvements

  • Edit font size of the Query Tab.
  • Edit background style of the Query Tab.
  • Save and remember the Query Tab size.

PostgreSQL Fixes

  • Fixed PostgreSQL relationship table.
  • Fixed wrong response message when handling non select queries.

Bite-Size fixes

  • Removed unused libfixposix.
  • Fixed pagination issue when clicking too fast while fetching big data.

Bug fixes and improvements

  • Rewritten pagination to use LIMIT and OFFSET.
  • Faster pagination and content viewing for big data.
  • Show records count in table's list.
  • Bug fixes and other improvements.

Bug fixes and improvements

  • Properly handle EXPLAIN SQL statement.
  • Properly handle querying capitlized PostgreSQL tables.
  • Improved async methods for internal views.
  • Updated translations.

Critical bug fix!

  • CRITICAL: Fixes missing GSettings Schema, restore lost connections.
  • Other small bug fixes and improvements.

Implemented SSH tunneling

  • WARNING: This release packs many updates and something could break. Please, backup your connections.
  • Connect via SSH to a remote Database.
  • Major code refactor to handle UI updates via async methods.
  • Use Stack container to show a loading Spinner during fetch or data processing methods.
  • Major performance improvements to the table search and dropdown schema switcher.
  • Bug fixes and other improvements.

Fancy New Icon!

  • New fancy Icon.
  • Use GtkNativeDialog.
  • Bug fixes and Improvements.

Open SQLite files

  • Open SQLite files directly in Sequeler.
  • Right click to copy data inside a column.
  • Bug fixes and Improvements.

UI Fixes and Performance Improvements

  • UI fix for logout button.
  • View shortcuts on preferences dropdown.
  • Performance Improvements.
  • Italian translation.

Export all the things!

  • Export results from Query Tab.
  • Export in CSV or Plain Text format.
  • Sort Columns order everywhere.
  • Brazilian translation.

Here comes the power of Pagination!!!

  • Paginate results in the Content tab.
  • Query messages UI improvements.
  • Relations table bug fixes.

We got Multi SQL Query support.

  • Ability to handle multiple SQL queries.
  • Execute the currently highlighted query.
  • Improved Library Popover UI.
  • Use native GTK+ CSS attributes for better Light/Dark mode.
  • Random UI improvements.

Urgent! Fixed broken Tabs for translated version.

Light and Dark Mode Switch!

  • Better Dark/Light mode switch in header bar.
  • Add Russian translation.
  • Updated Welcome screen with New Window command.
  • Code cleanup.

Official Juno release!

  • Missing filter name on SQLite File Dialog.

We got Search!

  • Search table names in sidebar.
  • Fixes issue in connecting directly on a non saved connection.
  • Updated Lithuanian translation.
  • Italian translation.

Improved Password Security.

  • Safely store passwords in LibSecret.
  • Auto upgrade on startup to remove passwords from GSettings.
  • Fixes issues with identical table names from other database in the same connection.
  • Alphabetically ordered tables.
  • Improvements in showing MySql/MariaDB Table Structure.
  • Many more bugs for you to discover.

New Icon and Import/Export Library.

  • Fancy new icon.
  • Import and Export connections library.
  • Fixed random crash when opening and closing multiple connections.
  • Bug fixes and improvements.

Bug fixes and improvements.

  • Fixed PostgreSQL Schema show options.
  • Fixed crash on new connection dialog when opening the connection before saving.

Little side dish update.

  • Fixed save window state on close.
  • Bug fixes and improvements.

Alternate coloured rows!

  • Manually reload Content, Structure, and Relations.
  • Show Table schema, content, and constraint relationships.
  • Properly handle compound queries.
  • Fix PostgreSQL table switch.

Complete rewrite of the entire code base!

  • Handle multiple Windows/Instances and multiple open connections.
  • Show Table schema, content, and constraint relationships.
  • Quicker response on big select queries
  • Better error handling.
  • Bug fixes and improvements.

Better error handling, less crashes!

  • The app doesn't crash when dealing with big values
  • Handling errors related to columns
  • Quicker response on big select queries
  • Some small clean up
  • Fixes issue with SQL Lite encrypted path

Better error handling, less crashes!

  • The app doesn't crash when dealing with big values
  • Handling errors related to columns
  • Quicker response on big select queries
  • Some small clean up

New Icon, Better error messages!

  • New shiny icon
  • View SQL error message on error
  • FIX: Show proper PostgreSql Schema Table in Sidebar
  • Snappiest query execution ever for local databases
  • The usual bundle of bugs for you to discover

Summoning the power of async methods!

  • All DataBase queries are now async methods, super fast.
  • The UI doesn't freeze anymore during a long process
  • Granite SourceList to display list of tables
  • Tabs to switch between the Query Builder and the Table Structure
  • ComboBox to select table schemas from the open connection
  • Many more bugs and issues for you to have fun with

Bug Fixes and Improvements

  • Display Table lists for SQLite and PostgreSQL
  • Refresh Table List view if tables change
  • Removed unused GSettings

This is so good you won't believe it. New Library UI, Schema Table, Custom Port, and more

  • A brand new Library View directly in your home screen, super tight and organized
  • Custom Port field for those snazzy geeks who don't just use 3306
  • A shiny new Sidebar View to list all your DataBase Tables
  • Code cleanup and speed improvements
  • Usual abundance of bugs and issues for you to have fun with!

Major Update: Releasing a sweet table to view Query Results!

  • Did I say we got a sweet table to view query results?
  • New shortcut (ctrl+enter) to execute query
  • Solved bug while connecting to DB directly from the Connection Dialog
  • UI Improvements to Connection Dialog
  • Added Spanish and Lithuanian translations

UI fixes

  • Visual improvements to the library view

Initial Release

  • Store your Database connections
  • Quickly connect to a Local or Remote Database
  • Write SQL queries in the built-in code editor
https://raw.githubusercontent.com/Alecaddd/sequeler/master/data/assets/screenshots/sequeler-screenshot.png https://raw.githubusercontent.com/Alecaddd/sequeler/master/data/assets/screenshots/sequeler-screenshot1.png https://raw.githubusercontent.com/Alecaddd/sequeler/master/data/assets/screenshots/sequeler-screenshot2.png Alessandro Castellani @appid@.desktop https://github.com/Alecaddd/sequeler https://www.paypal.me/alecaddd https://github.com/Alecaddd/sequeler/issues https://github.com/Alecaddd/sequeler/issues https://hosted.weblate.org/projects/sequeler castellani.ale@gmail.com none none none none none none none none none none none none none none none none none none none none none none none none none none none #3f3f3f #ffffff 25 pk_live_Arrxw947rfYpLQK7VcSv4766 HiDpiIcon HighContrast ModernToolkit
sequeler-0.8.2/data/com.github.alecaddd.sequeler.desktop.in.in000066400000000000000000000005041410464306200242660ustar00rootroot00000000000000[Desktop Entry] Name=Sequeler GenericName=Sequeler App Comment=Friendly SQL Client Categories=Utility;Development; TryExec=@binary@ Exec=@binary@ %U Icon=@icon@ Terminal=false Type=Application Keywords=SQL;MySql;Database;MariaDB;S3;PostgreSQL; MimeType=application/x-sqlite3;application/vnd.sqlite3; StartupWMClass=Sequeler sequeler-0.8.2/data/meson.build000066400000000000000000000061241410464306200164240ustar00rootroot00000000000000icon_sizes = ['16', '24', '32', '48', '64', '128'] icons_dir = join_paths(get_option('datadir'), 'icons', 'hicolor') foreach size : icon_sizes asset = join_paths('assets', 'icons', '@0@x@0@'.format(size), '@0@.svg'.format(meson.project_name())) install_data( asset, install_dir: join_paths(icons_dir, '@0@x@0@'.format(size), 'apps'), rename: '@0@.svg'.format(application_id) ) install_data( asset, install_dir: join_paths(icons_dir, '@0@x@0@@2'.format(size), 'apps'), rename: '@0@.svg'.format(application_id) ) endforeach install_data( join_paths('assets', 'icons', '128x128', '@0@.svg'.format(meson.project_name())), install_dir: join_paths(icons_dir , 'scalable', 'apps'), rename: '@0@.svg'.format(application_id) ) install_data( join_paths('assets', 'icons', 'status', 'table.svg'), install_dir: join_paths(icons_dir , '16x16', 'status'), ) install_data( join_paths('assets', 'icons', 'status', 'table-empty.svg'), install_dir: join_paths(icons_dir , '16x16', 'status'), ) install_data( join_paths('assets', 'icons', 'actions', 'office-database-new.svg'), install_dir: join_paths(icons_dir , '24x24', 'actions'), ) install_data( join_paths('assets', 'icons', 'actions', 'office-database-remove.svg'), install_dir: join_paths(icons_dir , '24x24', 'actions'), ) install_data( join_paths('assets', 'icons', 'actions', 'office-database-edit.svg'), install_dir: join_paths(icons_dir , '24x24', 'actions'), ) install_data( join_paths('assets', 'icons', 'actions', 'application-logout.svg'), install_dir: join_paths(icons_dir , '24x24', 'actions'), ) # Install the Desktop file desktop_conf = configuration_data() desktop_conf.set('icon', application_id) desktop_conf.set('binary', application_id) desktop_file = i18n.merge_file( input: configure_file( input: '@0@.desktop.in.in'.format(meson.project_name()), output: '@0@.desktop.in'.format(application_id), configuration: desktop_conf ), output:'@0@.desktop'.format(application_id), po_dir: join_paths(meson.source_root(), 'po', 'extra'), type: 'desktop', install: true, install_dir: join_paths(get_option('datadir'), 'applications') ) # Validate desktop file desktop_file_validate = find_program('desktop-file-validate', required: false) if desktop_file_validate.found() test( 'validate-desktop', desktop_file_validate, args: [ desktop_file.full_path() ] ) endif # Install the AppData file appdata_conf = configuration_data() appdata_conf.set('appid', application_id) appdata_file = i18n.merge_file( input: configure_file( input: '@0@.appdata.xml.in.in'.format(meson.project_name()), output: '@0@.appdata.xml.in'.format(application_id), configuration: appdata_conf ), output: '@0@.appdata.xml'.format(application_id), po_dir: join_paths(meson.source_root(), 'po'), install: true, install_dir: join_paths(get_option('datadir'), 'metainfo') ) # Validate AppData file appstream_util = find_program('appstream-util', required: false) if appstream_util.found() test( 'validate-appdata', appstream_util, args: [ 'validate-relax', appdata_file.full_path() ] ) endif sequeler-0.8.2/data/stylesheet.css000066400000000000000000000056231410464306200171700ustar00rootroot00000000000000.text-bold { font-weight: 600; } .library-box { background-color: transparent; } .library-box:selected .library-btn { background-color: transparent; } .library-box:selected .library-btn image { color: @fg_color; } .library-inner-box { background: transparent; transition: background 320ms ease; color: @fg_color; } .library-inner-box .library-btn { opacity: 0; } .library-inner-box:hover { background: shade (@bg_color, 0.9); } .library-inner-box:hover .library-btn { opacity: 1; } .library-btn:active, .library-btn:focus { background-color: transparent; } .grid-motion { background-color: alpha (#3689e6, 0.25); border-radius: 4px; } .library-titlebar { border-bottom: 1px solid shade (@bg_color, 0.9); background: shade (@bg_color, 0.95); } .library-toolbar { background: shade (@bg_color, 0.95); border-top: 1px solid shade (@bg_color, 0.9); } .library-colorbox { border-radius: 12px; box-shadow: inset 0px 0px 0px 1px rgba(0, 0, 0, 0.2); } .toolbar-btn { background: transparent; border: none; box-shadow: none; } .toolbar-btn.active { background: shade (@bg_color, 0.9); opacity: 1; } .headerbar-separator { margin-right: 3px; margin-left: 3px; } infobar.inline revealer > box { box-shadow: inset 0 -1px 0 0 alpha (#fff, 0.4); border-width: 1px; border-radius: 4px; } .color-button radio, .color-button radio:checked { border-color: alpha (#000, 0.3); box-shadow: inset 0 1px 0 0 alpha (@inset_dark_color, 0.7), inset 0 0 0 1px alpha (@inset_dark_color, 0.3), 0 1px 0 0 alpha (@bg_highlight_color, 0.3); padding: 10px; -gtk-icon-shadow: none; } .color-button radio:focus { border-color: @colorAccent; box-shadow: inset 0 1px 0 0 alpha (@inset_dark_color, 0.7), inset 0 0 0 1px alpha (@inset_dark_color, 0.3), inset 0 0 0 1px alpha (@bg_highlight_color, 0.05), 0 1px 0 0 alpha (@bg_highlight_color, 0.3), 0 0 0 1px alpha (@colorAccent, 0.25); } .color-dark radio { background: #252E32; border-color: #151B1C; color: #fff; } .color-light radio { background: #fdf6e3; color: #4d4d4d; } .color-white radio { background: #fff; color: #000; } .query-error { background-color: alpha (@STRAWBERRY_300, 0.2); border: 1px solid @STRAWBERRY_500; border-radius: 4px; } button.notebook-temp-fix image { color: @selected_fg_color; } .database-panel-overlay { background-color: alpha (#000, 0.3); } .database-panel { border-radius: 3px; border: 1px solid alpha (#000, 0.3); box-shadow: 0 3px 1px -2px rgba(0,0,0,.2), 0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12); text-shadow: none; background-color: shade (@base_color, 1.15); } .database-panel-bottom { background-color: alpha (#000, 0.1); box-shadow: inset 0 5px 5px -10px #000 } sequeler-0.8.2/meson.build000066400000000000000000000024031410464306200155070ustar00rootroot00000000000000# project name and programming language project('com.github.alecaddd.sequeler', 'vala', 'c', version: '0.8.2') cc = meson.get_compiler('c') m_dep = cc.find_library('m', required: true) vala_args = ['--pkg', 'posix'] add_project_arguments( ['--vapidir', join_paths(meson.current_source_dir(), 'vapi')], language: 'vala' ) if get_option('profile') == 'development' application_id = '@0@Devel'.format(meson.project_name()) vala_args += ['-D', 'IS_DEVEL'] else application_id = meson.project_name() endif linux_dep = meson.get_compiler('vala').find_library('linux') # Include the translations module i18n = import('i18n') # Include the gnome module gnome = import('gnome') asresources = gnome.compile_resources( 'as-resources', 'data/assets.gresource.xml', source_dir: 'data', c_name: 'as' ) # Set our translation domain add_global_arguments('-DGETTEXT_PACKAGE="@0@"'.format (meson.project_name()), language: 'c') vala_lint = find_program('io.elementary.vala-lint', required : false) if vala_lint.found() test ( 'Vala lint', vala_lint, args: ['-d', join_paths(meson.source_root(), 'src')] ) endif subdir('src') subdir('data') subdir('po') subdir('schemas') meson.add_install_script('build-aux/meson_post_install.py') sequeler-0.8.2/meson_options.txt000066400000000000000000000002441410464306200170030ustar00rootroot00000000000000option( 'profile', type: 'combo', choices: [ 'default', 'development' ], value: 'default' ) sequeler-0.8.2/po/000077500000000000000000000000001410464306200137645ustar00rootroot00000000000000sequeler-0.8.2/po/LINGUAS000066400000000000000000000000441410464306200150070ustar00rootroot00000000000000ca de es fr id it lg lt pt_BR ru tr sequeler-0.8.2/po/POTFILES000066400000000000000000000013551410464306200151400ustar00rootroot00000000000000src/Main.vala src/Application.vala src/Window.vala src/Layouts/HeaderBar.vala src/Layouts/Main.vala src/Layouts/Library.vala src/Layouts/Welcome.vala src/Layouts/DataBaseSchema.vala src/Layouts/DataBaseView.vala src/Layouts/Views/Structure.vala src/Layouts/Views/Content.vala src/Layouts/Views/Relations.vala src/Layouts/Views/Query.vala src/Partials/ButtonType.vala src/Partials/Helpers.vala src/Partials/LibraryItem.vala src/Partials/TreeBuilder.vala src/Services/Settings.vala src/Services/ActionManager.vala src/Services/DataManager.vala src/Services/ConnectionManager.vala src/Services/Types/DataBaseType.vala src/Services/Types/MySQL.vala src/Services/Types/PostgreSQL.vala src/Services/Types/SQLite.vala src/Widgets/ConnectionDialog.vala sequeler-0.8.2/po/ar_EG.po000066400000000000000000000376631410464306200153200ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.alecaddd.sequeler package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: com.github.alecaddd.sequeler\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-04-11 12:37+0200\n" "PO-Revision-Date: 2020-11-05 23:27+0000\n" "Last-Translator: Ahmed744 \n" "Language-Team: Arabic (Egypt) \n" "Language: ar_EG\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" "X-Generator: Weblate 4.3.2\n" #: src/Application.vala:62 msgid "Directories are not supported" msgstr "الدلائل غير مدعومة" #: src/Application.vala:68 msgid "Don't know what to do" msgstr "لا أعر٠ما يجب القيام به" #: src/Application.vala:80 msgid "Something completely unexpected happened" msgstr "شئ غير متوقع قد حدث" #: src/Layouts/HeaderBar.vala:46 src/Layouts/HeaderBar.vala:53 msgid "Logout" msgstr "خروج" #: src/Layouts/HeaderBar.vala:56 msgid "Light background" msgstr "خلÙية مضيئة" #: src/Layouts/HeaderBar.vala:57 msgid "Dark background" msgstr "خلÙية داكنة" #: src/Layouts/HeaderBar.vala:68 src/Layouts/Welcome.vala:39 msgid "New Window" msgstr "Ù†Ø§ÙØ°Ø© جديدة" #: src/Layouts/HeaderBar.vala:71 src/Widgets/ConnectionDialog.vala:130 #: src/Widgets/ConnectionDialog.vala:165 msgid "New Connection" msgstr "اتصال جديد" #: src/Layouts/HeaderBar.vala:74 msgid "Quit" msgstr "خروج" #: src/Layouts/HeaderBar.vala:94 msgid "Menu" msgstr "القائمة" #: src/Layouts/Main.vala:77 #, c-format msgid "Connected to %s" msgstr "متصل ب %s" #: src/Layouts/Library.vala:65 msgid "SAVED CONNECTIONS" msgstr "اتصالات محÙوظة" #: src/Layouts/Library.vala:74 msgid "Delete All" msgstr "مسح الكل" #: src/Layouts/Library.vala:81 msgid "Reload Library" msgstr "تحديث المكتبة" #: src/Layouts/Library.vala:84 msgid "Export Library" msgstr "تصدير المكتبة" #: src/Layouts/Library.vala:215 src/Layouts/Library.vala:233 msgid "Are you sure you want to proceed?" msgstr "هل انت متأكد انك تريد المتابعة؟" #: src/Layouts/Library.vala:215 msgid "By deleting this connection you won’t be able to recover this data." msgstr "بحذ٠هذا الاتصال ØŒ لن تتمكن من استعادة هذه البيانات." #: src/Layouts/Library.vala:218 msgid "Yes, Delete!" msgstr "نعم ØŒ احذÙ!" #: src/Layouts/Library.vala:233 msgid "All the data will be deleted and you won’t be able to recover it." msgstr "سيتم حذ٠جميع البيانات ولن تتمكن من استعادتها." #: src/Layouts/Library.vala:236 msgid "Yes, Delete All!" msgstr "نعم ØŒ احذ٠الكل!" #: src/Layouts/Library.vala:330 src/Widgets/ConnectionDialog.vala:575 #: src/Widgets/ConnectionDialog.vala:596 msgid "A username is required in order to connect!" msgstr "مطلوب اسم مستخدم من أجل الاتصال!" #: src/Layouts/Library.vala:404 src/Layouts/Views/Query.vala:528 msgid "Pick a file" msgstr "اختر ملÙًا" #: src/Layouts/Library.vala:407 src/Layouts/Views/Query.vala:531 msgid "_Save" msgstr "_Ø­ÙØ¸" #: src/Layouts/Library.vala:408 src/Layouts/Welcome.vala:62 #: src/Layouts/Views/Query.vala:532 msgid "_Cancel" msgstr "_إلغاء" #: src/Layouts/Library.vala:467 #, c-format msgid "Unable to Connect to %s" msgstr "غير قادر على الاتصال ب %s" #: src/Layouts/Library.vala:480 msgid "Unable to Export Library " msgstr "تعذر تصدير المكتبة " #: src/Layouts/Welcome.vala:28 msgid "Welcome to Sequeler" msgstr "مرحبا بكم ÙÙŠ Sequeler" #: src/Layouts/Welcome.vala:29 msgid "Connect to Any Local or Remote Database." msgstr "اتصل بأي قاعدة بيانات محلية أو بعيدة." #: src/Layouts/Welcome.vala:38 msgid "Add a New Database" msgstr "Ø¥Ø¶Ø§ÙØ© قاعدة بيانات جديدة" #: src/Layouts/Welcome.vala:38 msgid "Connect to a Database and Save It in Your Library" msgstr "اتصل بقاعدة بيانات ÙˆØ§Ø­ÙØ¸Ù‡Ø§ ÙÙŠ مكتبتك" #: src/Layouts/Welcome.vala:39 msgid "Open a New Sequeler Window" msgstr "Ø§ÙØªØ­ Ù†Ø§ÙØ°Ø© جديدة لاحقة" #: src/Layouts/Welcome.vala:40 msgid "Import Connections" msgstr "اتصالات الاستيراد" #: src/Layouts/Welcome.vala:40 msgid "Import Previously Exported Sequeler Connections" msgstr "استيراد اتصالات التي تم تصديرها مسبقًا" #: src/Layouts/Welcome.vala:58 msgid "Select a file" msgstr "حدد ملÙ" #: src/Layouts/Welcome.vala:61 msgid "_Open" msgstr "_Ø§ÙØªØ­" #: src/Layouts/Welcome.vala:107 msgid "Unable to Import Library " msgstr "تعذر استيراد المكتبة " #: src/Layouts/DataBaseSchema.vala:66 src/Layouts/DataBaseSchema.vala:167 msgid "- Select Database -" msgstr "- حدد قاعدة البيانات -" #: src/Layouts/DataBaseSchema.vala:87 msgid "Search Tables" msgstr "جداول البحث" #: src/Layouts/DataBaseSchema.vala:98 msgid "Search Tables…" msgstr "جداول البحث…" #: src/Layouts/DataBaseSchema.vala:120 msgid "Reload Tables" msgstr "إعادة تحميل الجداول" #: src/Layouts/DataBaseSchema.vala:125 msgid "Add Table" msgstr "أض٠الجدول" #: src/Layouts/DataBaseSchema.vala:289 msgid "TABLES" msgstr "الجداول" #: src/Layouts/DataBaseView.vala:49 msgid "Structure" msgstr "بناء" #: src/Layouts/DataBaseView.vala:50 msgid "Content" msgstr "المحتوى" #: src/Layouts/DataBaseView.vala:51 msgid "Relations" msgstr "علاقات" #: src/Layouts/DataBaseView.vala:52 src/Layouts/DataBaseView.vala:229 #: src/Layouts/DataBaseView.vala:253 msgid "Query" msgstr "استعلام" #: src/Layouts/DataBaseView.vala:101 msgid "Zoom Out" msgstr "تصغير" #: src/Layouts/DataBaseView.vala:107 msgid "Zoom 1:1" msgstr "تكبير 1: 1" #: src/Layouts/DataBaseView.vala:111 msgid "Zoom In" msgstr "تكبير" #: src/Layouts/DataBaseView.vala:124 msgid "High Contrast" msgstr "تباين عالي" #: src/Layouts/DataBaseView.vala:132 msgid "Solarized Light" msgstr "ضوء شمسي" #: src/Layouts/DataBaseView.vala:140 msgid "Solarized Dark" msgstr "الظلام الشمسي" #: src/Layouts/DataBaseView.vala:163 msgid "Change Text Style" msgstr "تغيير نمط النص" #: src/Layouts/DataBaseView.vala:222 msgid "Create a new Query Tab" msgstr "إنشاء علامة تبويب استعلام جديدة" #: src/Layouts/DataBaseView.vala:240 #, c-format msgid "Query %i" msgstr "استعلام %i" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select Table" msgstr "حدد الجدول" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select a table from the left sidebar to activate this view." msgstr "حدد جدولاً من الشريط الجانبي الأيسر لتنشيط هذا العرض." #: src/Layouts/Views/Structure.vala:107 src/Layouts/Views/Structure.vala:145 #: src/Layouts/Views/Content.vala:179 src/Layouts/Views/Content.vala:218 #: src/Layouts/Views/Relations.vala:106 src/Layouts/Views/Relations.vala:144 #: src/Layouts/Views/Query.vala:323 msgid "No Results Available" msgstr "لا توجد نتائج متاحة" #: src/Layouts/Views/Structure.vala:118 src/Layouts/Views/Content.vala:191 #: src/Layouts/Views/Relations.vala:117 msgid "Reload Results" msgstr "إعادة تحميل النتائج" #: src/Layouts/Views/Structure.vala:197 msgid " Fields" msgstr " مجالات" #: src/Layouts/Views/Content.vala:121 msgid "Previous Page" msgstr "Ø§Ù„ØµÙØ­Ø© السابقة" #: src/Layouts/Views/Content.vala:126 msgid "Next Page" msgstr "Ø§Ù„ØµÙØ­Ø© التالية" #: src/Layouts/Views/Content.vala:131 #, c-format msgid "%d Pages" msgstr "%d ØµÙØ­Ø§Øª" #: src/Layouts/Views/Content.vala:134 msgid "Jump to page…" msgstr "انتقال إلى Ø§Ù„ØµÙØ­Ø© …" #: src/Layouts/Views/Content.vala:165 msgid "1 Page" msgstr "1 ØµÙØ­Ø©" #: src/Layouts/Views/Content.vala:171 #, c-format msgid "%d of %d Pages" msgstr "%d من %d ØµÙØ­Ø§Øª" #: src/Layouts/Views/Content.vala:275 #, c-format msgid "%d Entries" msgstr "%d إدخالات" #: src/Layouts/Views/Relations.vala:197 msgid " Constraints" msgstr " القيود" #: src/Layouts/Views/Query.vala:279 msgid "Running Query…" msgstr "الاستعلام قيد التشغيل …" #: src/Layouts/Views/Query.vala:295 src/Layouts/Views/Query.vala:304 msgid "Run Query" msgstr "قم بتشغيل الاستعلام" #: src/Layouts/Views/Query.vala:356 msgid "Export Results" msgstr "نتائج التصدير" #: src/Layouts/Views/Query.vala:369 msgid "Export as CSV" msgstr "تصدير كمل٠CSV" #: src/Layouts/Views/Query.vala:377 msgid "Export as Text" msgstr "تصدير كنص" #: src/Layouts/Views/Query.vala:436 src/Layouts/Views/Query.vala:482 msgid "Unable to process Query!" msgstr "غير قادر على معالجة الاستعلام!" #: src/Layouts/Views/Query.vala:457 #, c-format msgid "%d Total Results" msgstr "%d إجمالي النتائج" #: src/Layouts/Views/Query.vala:492 #, c-format msgid "Query Successfully Executed! Rows Affected: %s" msgstr "تم تنÙيذ الاستعلام بنجاح! الصÙو٠المتأثرة: %s" #: src/Layouts/Views/Query.vala:495 msgid "Query Executed!" msgstr "تم تنÙيذ الاستعلام!" #: src/Partials/LibraryItem.vala:107 src/Widgets/ConnectionDialog.vala:431 msgid "Connect" msgstr "الاتصال" #: src/Partials/LibraryItem.vala:110 msgid "Edit Connection" msgstr "تحرير الاتصال" #: src/Partials/LibraryItem.vala:113 msgid "Duplicate Connection" msgstr "اتصال مكرر" #: src/Partials/LibraryItem.vala:116 msgid "Delete Connection" msgstr "حذ٠الاتصال" #: src/Partials/LibraryItem.vala:126 msgid "Options" msgstr "خيارات" #: src/Partials/TreeBuilder.vala:131 msgid "Error" msgstr "خطأ" #: src/Partials/TreeBuilder.vala:131 msgid "on Column" msgstr "ÙÙŠ العمود" #: src/Partials/TreeBuilder.vala:172 #, c-format msgid "Copy %s" msgstr "نسخ %s" #: src/Services/Settings.vala:106 #, c-format msgid "%s (copy)" msgstr "%s (نسخة)" #: src/Services/ConnectionManager.vala:193 #, c-format msgid "Libssh2 initialization failed (%d)" msgstr "(%d) ÙØ´Ù„ تهيئة Libssh2" #: src/Services/ConnectionManager.vala:202 msgid "Failed to open socket" msgstr "ÙØ´Ù„ ÙÙŠ ÙØªØ­ المقبس" #: src/Services/ConnectionManager.vala:211 msgid "Failed to connect!" msgstr "ÙØ´Ù„ الاتصال!" #: src/Services/ConnectionManager.vala:223 #, c-format msgid "Error when starting up SSH session: %d" msgstr "خطأ عند بدء جلسة SSH :%d" #: src/Services/ConnectionManager.vala:242 msgid "Authentication by password failed!" msgstr "ÙØ´Ù„ت المصادقة بكلمة المرور!" #: src/Services/ConnectionManager.vala:252 msgid "Authentication by public key failed!" msgstr "ÙØ´Ù„ت المصادقة Ø¨Ø§Ù„Ù…ÙØªØ§Ø­ العام!" #: src/Services/ConnectionManager.vala:259 msgid "No supported authentication methods found!" msgstr "لم يتم العثور على طرق مصادقة مدعومة!" #: src/Services/ConnectionManager.vala:266 msgid "Failed to open listen socket" msgstr "ÙØ´Ù„ ÙÙŠ ÙØªØ­ مأخذ توصيل الاستماع" #: src/Services/ConnectionManager.vala:281 msgid "Failed to bind. Your Database Port may be wrong!" msgstr "ÙØ´Ù„ الربط. قد يكون Ù…Ù†ÙØ° قاعدة البيانات الخاص بك خاطئًا!" #: src/Services/ConnectionManager.vala:287 msgid "Failed to listen!" msgstr "ÙØ´Ù„ ÙÙŠ الاستماع!" #: src/Services/ConnectionManager.vala:314 msgid "Failed to accept remote connection!" msgstr "ÙØ´Ù„ قبول الاتصال عن بعد!" #: src/Services/ConnectionManager.vala:323 msgid "" "Could not open the direct-tcpip channel! (Note that this can be a problem at " "the server! Please review the server logs.)" msgstr "" "تعذر ÙØªØ­ قناة Direct-tcpip! (لاحظ أن هذا يمكن أن يكون مشكلة ÙÙŠ الخادم! يرجى " "مراجعة سجلات الخادم.)" #: src/Services/ConnectionManager.vala:566 msgid "Error!" msgstr "خطأ!" #: src/Widgets/ConnectionDialog.vala:33 msgid "Missing SSH Key file!" msgstr "مل٠SSH Key Ù…Ùقود!" #: src/Widgets/ConnectionDialog.vala:34 msgid "Missing SSH public key!" msgstr "Ù…ÙØªØ§Ø­ SSH العمومي Ù…Ùقود!" #: src/Widgets/ConnectionDialog.vala:89 src/Widgets/ConnectionDialog.vala:355 msgid "Connection" msgstr "الإتصال" #: src/Widgets/ConnectionDialog.vala:141 msgid "Select connection color" msgstr "حدد لون الاتصال" #: src/Widgets/ConnectionDialog.vala:164 msgid "Connection Name:" msgstr "اسم الاتصال:" #: src/Widgets/ConnectionDialog.vala:165 msgid "Connection's name" msgstr "اسم الاتصالات" #: src/Widgets/ConnectionDialog.vala:172 msgid "Database Type:" msgstr "نوع قاعدة البيانات:" #: src/Widgets/ConnectionDialog.vala:194 msgid "Host:" msgstr "مضيÙ:" #: src/Widgets/ConnectionDialog.vala:200 msgid "Database Name:" msgstr "اسم قاعدة البيانات:" #: src/Widgets/ConnectionDialog.vala:207 msgid "Username:" msgstr "اسم المستخدم:" #: src/Widgets/ConnectionDialog.vala:213 msgid "Password:" msgstr "كلمه السر:" #: src/Widgets/ConnectionDialog.vala:217 src/Widgets/ConnectionDialog.vala:227 #: src/Widgets/ConnectionDialog.vala:285 src/Widgets/ConnectionDialog.vala:295 msgid "Show password" msgstr "عرض كلمة المرور" #: src/Widgets/ConnectionDialog.vala:224 src/Widgets/ConnectionDialog.vala:292 msgid "Hide password" msgstr "Ø§Ø®ÙØ§Ø¡ كلمة المرور" #: src/Widgets/ConnectionDialog.vala:234 msgid "Port:" msgstr "ميناء:" #: src/Widgets/ConnectionDialog.vala:240 msgid "File Path:" msgstr "مسار الملÙ:" #: src/Widgets/ConnectionDialog.vala:241 msgid "Select Your SQLite File…" msgstr "حدد مل٠SQLite الخاص بك …" #: src/Widgets/ConnectionDialog.vala:261 msgid "Connect via SSH Tunnel:" msgstr "الاتصال عبر Ù†ÙÙ‚ SSH:" #: src/Widgets/ConnectionDialog.vala:271 msgid "SSH Host:" msgstr "مضي٠SSH:" #: src/Widgets/ConnectionDialog.vala:276 msgid "SSH Username:" msgstr "اسم مستخدم SSH:" #: src/Widgets/ConnectionDialog.vala:281 msgid "SSH Password:" msgstr "كلمة مرور SSH:" #: src/Widgets/ConnectionDialog.vala:301 msgid "SSH Port:" msgstr "Ù…Ù†ÙØ° SSH:" #: src/Widgets/ConnectionDialog.vala:302 msgid "Optional" msgstr "اختياري" #: src/Widgets/ConnectionDialog.vala:306 msgid "SSH Identity" msgstr "هوية SSH" #: src/Widgets/ConnectionDialog.vala:308 msgid "Select Your Identity File…" msgstr "حدد مل٠هويتك …" #: src/Widgets/ConnectionDialog.vala:324 msgid "Generate SSH Key" msgstr "توليد Ù…ÙØªØ§Ø­ SSH" #: src/Widgets/ConnectionDialog.vala:356 msgid "SSH Tunnel" msgstr "Ù†ÙÙ‚ SSH" #: src/Widgets/ConnectionDialog.vala:426 msgid "Close" msgstr "أغلق" #: src/Widgets/ConnectionDialog.vala:427 msgid "Save Connection" msgstr "Ø­ÙØ¸ الاتصال" #: src/Widgets/ConnectionDialog.vala:429 msgid "Test Connection" msgstr "اختبار الاتصال" #: src/Widgets/ConnectionDialog.vala:620 msgid "Opening SSH Tunnel…" msgstr "Ø¬Ø§Ø±Ù ÙØªØ­ Ù†ÙÙ‚ SSH …" #: src/Widgets/ConnectionDialog.vala:650 msgid "Testing Connection…" msgstr "جار٠اختبار الاتصال …" #: src/Widgets/ConnectionDialog.vala:661 msgid "Successfully Connected!" msgstr "تم الاتصال بنجاح!" #: src/Widgets/ConnectionDialog.vala:679 msgid "Saving Connection…" msgstr "Ø¬Ø§Ø±Ù Ø­ÙØ¸ الاتصال …" #: src/Widgets/ConnectionDialog.vala:684 msgid "Connection Saved!" msgstr "تم Ø­ÙØ¸ الاتصال!" #: src/Widgets/ConnectionDialog.vala:692 msgid "Connecting…" msgstr "توصيل…" sequeler-0.8.2/po/ca.po000066400000000000000000000401711410464306200147120ustar00rootroot00000000000000# Catalan translations for com.github.alecaddd.sequeler package. # Copyright (C) 2020 THE com.github.alecaddd.sequeler'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.alecaddd.sequeler package. # Adolfo Jayme Barrientos , 2020. # msgid "" msgstr "" "Project-Id-Version: com.github.alecaddd.sequeler\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-04-11 12:37+0200\n" "PO-Revision-Date: 2020-05-01 13:11+0000\n" "Last-Translator: Adolfo Jayme Barrientos \n" "Language-Team: Catalan \n" "Language: ca\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: Weblate 4.0.2\n" #: src/Application.vala:62 msgid "Directories are not supported" msgstr "No s’admeten els directoris" #: src/Application.vala:68 msgid "Don't know what to do" msgstr "No se sap què fer" #: src/Application.vala:80 msgid "Something completely unexpected happened" msgstr "S’ha produït una situació inesperada" #: src/Layouts/HeaderBar.vala:46 src/Layouts/HeaderBar.vala:53 msgid "Logout" msgstr "Finalitza la sessió" #: src/Layouts/HeaderBar.vala:56 msgid "Light background" msgstr "Fons clar" #: src/Layouts/HeaderBar.vala:57 msgid "Dark background" msgstr "Fons fosc" #: src/Layouts/HeaderBar.vala:68 src/Layouts/Welcome.vala:39 msgid "New Window" msgstr "Finestra nova" #: src/Layouts/HeaderBar.vala:71 src/Widgets/ConnectionDialog.vala:130 #: src/Widgets/ConnectionDialog.vala:165 msgid "New Connection" msgstr "Connexió nova" #: src/Layouts/HeaderBar.vala:74 msgid "Quit" msgstr "Surt" #: src/Layouts/HeaderBar.vala:94 msgid "Menu" msgstr "Menú" #: src/Layouts/Main.vala:77 #, c-format msgid "Connected to %s" msgstr "Connectat a %s" #: src/Layouts/Library.vala:65 msgid "SAVED CONNECTIONS" msgstr "CONNEXIONS DESADES" #: src/Layouts/Library.vala:74 msgid "Delete All" msgstr "Suprimeix-ho tot" #: src/Layouts/Library.vala:81 msgid "Reload Library" msgstr "Torna a carregar la biblioteca" #: src/Layouts/Library.vala:84 msgid "Export Library" msgstr "Exporta la biblioteca" #: src/Layouts/Library.vala:215 src/Layouts/Library.vala:233 msgid "Are you sure you want to proceed?" msgstr "Segur que voleu continuar?" #: src/Layouts/Library.vala:215 msgid "By deleting this connection you won’t be able to recover this data." msgstr "" "Si suprimiu aquesta connexió, no sereu capaç de recuperar-ne les dades." #: src/Layouts/Library.vala:218 msgid "Yes, Delete!" msgstr "Sí, suprimeix-la" #: src/Layouts/Library.vala:233 msgid "All the data will be deleted and you won’t be able to recover it." msgstr "Se suprimiran totes les dades i no sereu capaç de recuperar-les." #: src/Layouts/Library.vala:236 msgid "Yes, Delete All!" msgstr "Sí, suprimeix-ho tot" #: src/Layouts/Library.vala:330 src/Widgets/ConnectionDialog.vala:575 #: src/Widgets/ConnectionDialog.vala:596 msgid "A username is required in order to connect!" msgstr "Cal un nom d’usuari per a establir la connexió." #: src/Layouts/Library.vala:404 src/Layouts/Views/Query.vala:528 msgid "Pick a file" msgstr "Trieu un fitxer" #: src/Layouts/Library.vala:407 src/Layouts/Views/Query.vala:531 msgid "_Save" msgstr "_Desa" #: src/Layouts/Library.vala:408 src/Layouts/Welcome.vala:62 #: src/Layouts/Views/Query.vala:532 msgid "_Cancel" msgstr "_Cancel·la" #: src/Layouts/Library.vala:467 #, c-format msgid "Unable to Connect to %s" msgstr "No es pot connectar a %s" #: src/Layouts/Library.vala:480 msgid "Unable to Export Library " msgstr "No es pot exportar la biblioteca " #: src/Layouts/Welcome.vala:28 msgid "Welcome to Sequeler" msgstr "Us donem la benvinguda al Sequeler" #: src/Layouts/Welcome.vala:29 msgid "Connect to Any Local or Remote Database." msgstr "Connecteu-vos a qualsevol base de dades local o remota." #: src/Layouts/Welcome.vala:38 msgid "Add a New Database" msgstr "Afegeix una base de dades nova" #: src/Layouts/Welcome.vala:38 msgid "Connect to a Database and Save It in Your Library" msgstr "Connecta a una base de dades i desa-la a la biblioteca" #: src/Layouts/Welcome.vala:39 msgid "Open a New Sequeler Window" msgstr "Obre una finestra nova del Sequeler" #: src/Layouts/Welcome.vala:40 msgid "Import Connections" msgstr "Importa connexions" #: src/Layouts/Welcome.vala:40 msgid "Import Previously Exported Sequeler Connections" msgstr "Importa connexions del Sequeler prèviament exportades" #: src/Layouts/Welcome.vala:58 msgid "Select a file" msgstr "Seleccioneu un fitxer" #: src/Layouts/Welcome.vala:61 msgid "_Open" msgstr "_Obre" #: src/Layouts/Welcome.vala:107 msgid "Unable to Import Library " msgstr "No es pot importar la biblioteca " #: src/Layouts/DataBaseSchema.vala:66 src/Layouts/DataBaseSchema.vala:167 msgid "- Select Database -" msgstr "- Seleccioneu una base de dades -" #: src/Layouts/DataBaseSchema.vala:87 msgid "Search Tables" msgstr "Cerca a les taules" #: src/Layouts/DataBaseSchema.vala:98 msgid "Search Tables…" msgstr "Cerca a les taules…" #: src/Layouts/DataBaseSchema.vala:120 msgid "Reload Tables" msgstr "Torna a carregar les taules" #: src/Layouts/DataBaseSchema.vala:125 msgid "Add Table" msgstr "Afegeix una taula" #: src/Layouts/DataBaseSchema.vala:289 msgid "TABLES" msgstr "TAULES" #: src/Layouts/DataBaseView.vala:49 msgid "Structure" msgstr "Estructura" #: src/Layouts/DataBaseView.vala:50 msgid "Content" msgstr "Contingut" #: src/Layouts/DataBaseView.vala:51 msgid "Relations" msgstr "Relacions" #: src/Layouts/DataBaseView.vala:52 src/Layouts/DataBaseView.vala:229 #: src/Layouts/DataBaseView.vala:253 msgid "Query" msgstr "Consulta" #: src/Layouts/DataBaseView.vala:101 msgid "Zoom Out" msgstr "Allunya" #: src/Layouts/DataBaseView.vala:107 msgid "Zoom 1:1" msgstr "Ajusta 1:1" #: src/Layouts/DataBaseView.vala:111 msgid "Zoom In" msgstr "Acosta" #: src/Layouts/DataBaseView.vala:124 msgid "High Contrast" msgstr "Contrast alt" #: src/Layouts/DataBaseView.vala:132 msgid "Solarized Light" msgstr "Solarized clar" #: src/Layouts/DataBaseView.vala:140 msgid "Solarized Dark" msgstr "Solarized fosc" #: src/Layouts/DataBaseView.vala:163 msgid "Change Text Style" msgstr "Canvia l’estil del text" #: src/Layouts/DataBaseView.vala:222 msgid "Create a new Query Tab" msgstr "Crea una pestanya de consulta" #: src/Layouts/DataBaseView.vala:240 #, c-format msgid "Query %i" msgstr "Consulta %i" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select Table" msgstr "Seleccioneu una taula" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select a table from the left sidebar to activate this view." msgstr "" "Seleccioneu una taula de la barra lateral esquerra per a activar aquesta " "vista." #: src/Layouts/Views/Structure.vala:107 src/Layouts/Views/Structure.vala:145 #: src/Layouts/Views/Content.vala:179 src/Layouts/Views/Content.vala:218 #: src/Layouts/Views/Relations.vala:106 src/Layouts/Views/Relations.vala:144 #: src/Layouts/Views/Query.vala:323 msgid "No Results Available" msgstr "No hi ha cap resultat disponible" #: src/Layouts/Views/Structure.vala:118 src/Layouts/Views/Content.vala:191 #: src/Layouts/Views/Relations.vala:117 msgid "Reload Results" msgstr "Torna a carregar els resultats" #: src/Layouts/Views/Structure.vala:197 msgid " Fields" msgstr " camps" #: src/Layouts/Views/Content.vala:121 msgid "Previous Page" msgstr "Pàgina anterior" #: src/Layouts/Views/Content.vala:126 msgid "Next Page" msgstr "Pàgina següent" #: src/Layouts/Views/Content.vala:131 #, c-format msgid "%d Pages" msgstr "%d pàgines" #: src/Layouts/Views/Content.vala:134 msgid "Jump to page…" msgstr "Bota a la pàgina…" #: src/Layouts/Views/Content.vala:165 msgid "1 Page" msgstr "1 pàgina" #: src/Layouts/Views/Content.vala:171 #, c-format msgid "%d of %d Pages" msgstr "%d de %d pàgines" #: src/Layouts/Views/Content.vala:275 #, c-format msgid "%d Entries" msgstr "%d entrades" #: src/Layouts/Views/Relations.vala:197 msgid " Constraints" msgstr " restriccions" #: src/Layouts/Views/Query.vala:279 msgid "Running Query…" msgstr "S’està executant la consulta…" #: src/Layouts/Views/Query.vala:295 src/Layouts/Views/Query.vala:304 msgid "Run Query" msgstr "Executa la consulta" #: src/Layouts/Views/Query.vala:356 msgid "Export Results" msgstr "Exporta els resultats" #: src/Layouts/Views/Query.vala:369 msgid "Export as CSV" msgstr "Exporta com a CSV" #: src/Layouts/Views/Query.vala:377 msgid "Export as Text" msgstr "Exporta com a text" #: src/Layouts/Views/Query.vala:436 src/Layouts/Views/Query.vala:482 msgid "Unable to process Query!" msgstr "No es pot processar la consulta." #: src/Layouts/Views/Query.vala:457 #, c-format msgid "%d Total Results" msgstr "%d resultats en total" #: src/Layouts/Views/Query.vala:492 #, c-format msgid "Query Successfully Executed! Rows Affected: %s" msgstr "S’ha executat la consulta correctament. Files afectades: %s" #: src/Layouts/Views/Query.vala:495 msgid "Query Executed!" msgstr "S’ha executat la consulta." #: src/Partials/LibraryItem.vala:107 src/Widgets/ConnectionDialog.vala:431 msgid "Connect" msgstr "Connecta" #: src/Partials/LibraryItem.vala:110 msgid "Edit Connection" msgstr "Edita la connexió" #: src/Partials/LibraryItem.vala:113 msgid "Duplicate Connection" msgstr "Duplica la connexió" #: src/Partials/LibraryItem.vala:116 msgid "Delete Connection" msgstr "Suprimeix la connexió" #: src/Partials/LibraryItem.vala:126 msgid "Options" msgstr "Opcions" #: src/Partials/TreeBuilder.vala:131 msgid "Error" msgstr "Error" #: src/Partials/TreeBuilder.vala:131 msgid "on Column" msgstr "a la columna" #: src/Partials/TreeBuilder.vala:172 #, c-format msgid "Copy %s" msgstr "Copia %s" #: src/Services/Settings.vala:106 #, c-format msgid "%s (copy)" msgstr "%s (còpia)" #: src/Services/ConnectionManager.vala:193 #, c-format msgid "Libssh2 initialization failed (%d)" msgstr "Ha fallat la inicialització del libssh2 (%d)" #: src/Services/ConnectionManager.vala:202 msgid "Failed to open socket" msgstr "Ha fallat l’obertura del sòcol" #: src/Services/ConnectionManager.vala:211 msgid "Failed to connect!" msgstr "Ha fallat la connexió." #: src/Services/ConnectionManager.vala:223 #, c-format msgid "Error when starting up SSH session: %d" msgstr "S’ha produït un error en iniciar la sessió SSH: %d" #: src/Services/ConnectionManager.vala:242 msgid "Authentication by password failed!" msgstr "Ha fallat l’autenticació per contrasenya." #: src/Services/ConnectionManager.vala:252 msgid "Authentication by public key failed!" msgstr "Ha fallat l’autenticació per clau pública." #: src/Services/ConnectionManager.vala:259 msgid "No supported authentication methods found!" msgstr "No s’ha trobat cap mètode d’autenticació admès." #: src/Services/ConnectionManager.vala:266 msgid "Failed to open listen socket" msgstr "No s’ha pogut obrir el sòcol d’escolta" #: src/Services/ConnectionManager.vala:281 msgid "Failed to bind. Your Database Port may be wrong!" msgstr "No s’ha pogut vincular. Potser el port de la base de dades és erroni." #: src/Services/ConnectionManager.vala:287 msgid "Failed to listen!" msgstr "No s’ha pogut escoltar." #: src/Services/ConnectionManager.vala:314 msgid "Failed to accept remote connection!" msgstr "No s’ha pogut acceptar la connexió remota." #: src/Services/ConnectionManager.vala:323 msgid "" "Could not open the direct-tcpip channel! (Note that this can be a problem at " "the server! Please review the server logs.)" msgstr "" "No s’ha pogut obrir el canal direct-tcpip (observeu que això pot ser un " "problema del servidor; reviseu-ne els registres)." #: src/Services/ConnectionManager.vala:566 msgid "Error!" msgstr "S’ha produït un error" #: src/Widgets/ConnectionDialog.vala:33 msgid "Missing SSH Key file!" msgstr "Manca el fitxer de la clau SSH." #: src/Widgets/ConnectionDialog.vala:34 msgid "Missing SSH public key!" msgstr "Manca la clau pública SSH." #: src/Widgets/ConnectionDialog.vala:89 src/Widgets/ConnectionDialog.vala:355 msgid "Connection" msgstr "Connexió" #: src/Widgets/ConnectionDialog.vala:141 msgid "Select connection color" msgstr "Seleccioneu el color de la connexió" #: src/Widgets/ConnectionDialog.vala:164 msgid "Connection Name:" msgstr "Nom de la connexió:" #: src/Widgets/ConnectionDialog.vala:165 msgid "Connection's name" msgstr "Nom de la connexió" #: src/Widgets/ConnectionDialog.vala:172 msgid "Database Type:" msgstr "Tipus de base de dades:" #: src/Widgets/ConnectionDialog.vala:194 msgid "Host:" msgstr "Amfitrió:" #: src/Widgets/ConnectionDialog.vala:200 msgid "Database Name:" msgstr "Nom de la base de dades:" #: src/Widgets/ConnectionDialog.vala:207 msgid "Username:" msgstr "Nom d’usuari:" #: src/Widgets/ConnectionDialog.vala:213 msgid "Password:" msgstr "Contrasenya:" #: src/Widgets/ConnectionDialog.vala:217 src/Widgets/ConnectionDialog.vala:227 #: src/Widgets/ConnectionDialog.vala:285 src/Widgets/ConnectionDialog.vala:295 msgid "Show password" msgstr "Mostra la contrasenya" #: src/Widgets/ConnectionDialog.vala:224 src/Widgets/ConnectionDialog.vala:292 msgid "Hide password" msgstr "Amaga la contrasenya" #: src/Widgets/ConnectionDialog.vala:234 msgid "Port:" msgstr "Port:" #: src/Widgets/ConnectionDialog.vala:240 msgid "File Path:" msgstr "Camí del fitxer:" #: src/Widgets/ConnectionDialog.vala:241 msgid "Select Your SQLite File…" msgstr "Seleccioneu el vostre fitxer SQLite…" #: src/Widgets/ConnectionDialog.vala:261 msgid "Connect via SSH Tunnel:" msgstr "Connecta mitjançant un túnel SSH:" #: src/Widgets/ConnectionDialog.vala:271 msgid "SSH Host:" msgstr "Amfitrió SSH:" #: src/Widgets/ConnectionDialog.vala:276 msgid "SSH Username:" msgstr "Nom d’usuari SSH:" #: src/Widgets/ConnectionDialog.vala:281 msgid "SSH Password:" msgstr "Contrasenya SSH:" #: src/Widgets/ConnectionDialog.vala:301 msgid "SSH Port:" msgstr "Port SSH:" #: src/Widgets/ConnectionDialog.vala:302 msgid "Optional" msgstr "Opcional" #: src/Widgets/ConnectionDialog.vala:306 msgid "SSH Identity" msgstr "Identitat SSH" #: src/Widgets/ConnectionDialog.vala:308 msgid "Select Your Identity File…" msgstr "Seleccioneu el vostre fitxer d’identitat…" #: src/Widgets/ConnectionDialog.vala:324 msgid "Generate SSH Key" msgstr "Genera una clau SSH" #: src/Widgets/ConnectionDialog.vala:356 msgid "SSH Tunnel" msgstr "Túnel SSH" #: src/Widgets/ConnectionDialog.vala:426 msgid "Close" msgstr "Tanca" #: src/Widgets/ConnectionDialog.vala:427 msgid "Save Connection" msgstr "Desa la connexió" #: src/Widgets/ConnectionDialog.vala:429 msgid "Test Connection" msgstr "Prova la connexió" #: src/Widgets/ConnectionDialog.vala:620 msgid "Opening SSH Tunnel…" msgstr "S’està obrint el túnel SSH…" #: src/Widgets/ConnectionDialog.vala:650 msgid "Testing Connection…" msgstr "S’està provant la connexió…" #: src/Widgets/ConnectionDialog.vala:661 msgid "Successfully Connected!" msgstr "S’ha establert la connexió." #: src/Widgets/ConnectionDialog.vala:679 msgid "Saving Connection…" msgstr "S’està desant la connexió…" #: src/Widgets/ConnectionDialog.vala:684 msgid "Connection Saved!" msgstr "S’ha desat la connexió." #: src/Widgets/ConnectionDialog.vala:692 msgid "Connecting…" msgstr "S’està connectant…" #, fuzzy #~ msgid "Easily connect to your local or remote database" #~ msgstr "Connecteu-vos a qualsevol base de dades local o remota." #, fuzzy #~ msgid "Test Connections before saving them" #~ msgstr "Prova la connexió" #, fuzzy #~ msgid "Connect via SSH to a remote Database." #~ msgstr "Connecteu-vos a qualsevol base de dades local o remota." #, fuzzy #~ msgid "Export all the things!" #~ msgstr "Exporta com a text" #, fuzzy #~ msgid "New Icon and Import/Export Library." #~ msgstr "No es pot importar la biblioteca " #, fuzzy #~ msgid "Import and Export connections library." #~ msgstr "Importa connexions" #, fuzzy #~ msgid "Quickly connect to a Local or Remote Database" #~ msgstr "Connecteu-vos a qualsevol base de dades local o remota." #, fuzzy #~ msgid "Save Quick Connections" #~ msgstr "Desa la connexió" #, fuzzy #~ msgid "Light Mode" #~ msgstr "Fons clar" #~ msgid " of " #~ msgstr "/" sequeler-0.8.2/po/com.github.alecaddd.sequeler.pot000066400000000000000000000275371410464306200221310ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.alecaddd.sequeler package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.alecaddd.sequeler\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-04-11 12:37+0200\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" #: src/Application.vala:62 msgid "Directories are not supported" msgstr "" #: src/Application.vala:68 msgid "Don't know what to do" msgstr "" #: src/Application.vala:80 msgid "Something completely unexpected happened" msgstr "" #: src/Layouts/HeaderBar.vala:46 src/Layouts/HeaderBar.vala:53 msgid "Logout" msgstr "" #: src/Layouts/HeaderBar.vala:56 msgid "Light background" msgstr "" #: src/Layouts/HeaderBar.vala:57 msgid "Dark background" msgstr "" #: src/Layouts/HeaderBar.vala:68 src/Layouts/Welcome.vala:39 msgid "New Window" msgstr "" #: src/Layouts/HeaderBar.vala:71 src/Widgets/ConnectionDialog.vala:130 #: src/Widgets/ConnectionDialog.vala:165 msgid "New Connection" msgstr "" #: src/Layouts/HeaderBar.vala:74 msgid "Quit" msgstr "" #: src/Layouts/HeaderBar.vala:94 msgid "Menu" msgstr "" #: src/Layouts/Main.vala:77 #, c-format msgid "Connected to %s" msgstr "" #: src/Layouts/Library.vala:65 msgid "SAVED CONNECTIONS" msgstr "" #: src/Layouts/Library.vala:74 msgid "Delete All" msgstr "" #: src/Layouts/Library.vala:81 msgid "Reload Library" msgstr "" #: src/Layouts/Library.vala:84 msgid "Export Library" msgstr "" #: src/Layouts/Library.vala:215 src/Layouts/Library.vala:233 msgid "Are you sure you want to proceed?" msgstr "" #: src/Layouts/Library.vala:215 msgid "By deleting this connection you won’t be able to recover this data." msgstr "" #: src/Layouts/Library.vala:218 msgid "Yes, Delete!" msgstr "" #: src/Layouts/Library.vala:233 msgid "All the data will be deleted and you won’t be able to recover it." msgstr "" #: src/Layouts/Library.vala:236 msgid "Yes, Delete All!" msgstr "" #: src/Layouts/Library.vala:330 src/Widgets/ConnectionDialog.vala:575 #: src/Widgets/ConnectionDialog.vala:596 msgid "A username is required in order to connect!" msgstr "" #: src/Layouts/Library.vala:404 src/Layouts/Views/Query.vala:528 msgid "Pick a file" msgstr "" #: src/Layouts/Library.vala:407 src/Layouts/Views/Query.vala:531 msgid "_Save" msgstr "" #: src/Layouts/Library.vala:408 src/Layouts/Welcome.vala:62 #: src/Layouts/Views/Query.vala:532 msgid "_Cancel" msgstr "" #: src/Layouts/Library.vala:467 #, c-format msgid "Unable to Connect to %s" msgstr "" #: src/Layouts/Library.vala:480 msgid "Unable to Export Library " msgstr "" #: src/Layouts/Welcome.vala:28 msgid "Welcome to Sequeler" msgstr "" #: src/Layouts/Welcome.vala:29 msgid "Connect to Any Local or Remote Database." msgstr "" #: src/Layouts/Welcome.vala:38 msgid "Add a New Database" msgstr "" #: src/Layouts/Welcome.vala:38 msgid "Connect to a Database and Save It in Your Library" msgstr "" #: src/Layouts/Welcome.vala:39 msgid "Open a New Sequeler Window" msgstr "" #: src/Layouts/Welcome.vala:40 msgid "Import Connections" msgstr "" #: src/Layouts/Welcome.vala:40 msgid "Import Previously Exported Sequeler Connections" msgstr "" #: src/Layouts/Welcome.vala:58 msgid "Select a file" msgstr "" #: src/Layouts/Welcome.vala:61 msgid "_Open" msgstr "" #: src/Layouts/Welcome.vala:107 msgid "Unable to Import Library " msgstr "" #: src/Layouts/DataBaseSchema.vala:66 src/Layouts/DataBaseSchema.vala:167 msgid "- Select Database -" msgstr "" #: src/Layouts/DataBaseSchema.vala:87 msgid "Search Tables" msgstr "" #: src/Layouts/DataBaseSchema.vala:98 msgid "Search Tables…" msgstr "" #: src/Layouts/DataBaseSchema.vala:120 msgid "Reload Tables" msgstr "" #: src/Layouts/DataBaseSchema.vala:125 msgid "Add Table" msgstr "" #: src/Layouts/DataBaseSchema.vala:289 msgid "TABLES" msgstr "" #: src/Layouts/DataBaseView.vala:49 msgid "Structure" msgstr "" #: src/Layouts/DataBaseView.vala:50 msgid "Content" msgstr "" #: src/Layouts/DataBaseView.vala:51 msgid "Relations" msgstr "" #: src/Layouts/DataBaseView.vala:52 src/Layouts/DataBaseView.vala:229 #: src/Layouts/DataBaseView.vala:253 msgid "Query" msgstr "" #: src/Layouts/DataBaseView.vala:101 msgid "Zoom Out" msgstr "" #: src/Layouts/DataBaseView.vala:107 msgid "Zoom 1:1" msgstr "" #: src/Layouts/DataBaseView.vala:111 msgid "Zoom In" msgstr "" #: src/Layouts/DataBaseView.vala:124 msgid "High Contrast" msgstr "" #: src/Layouts/DataBaseView.vala:132 msgid "Solarized Light" msgstr "" #: src/Layouts/DataBaseView.vala:140 msgid "Solarized Dark" msgstr "" #: src/Layouts/DataBaseView.vala:163 msgid "Change Text Style" msgstr "" #: src/Layouts/DataBaseView.vala:222 msgid "Create a new Query Tab" msgstr "" #: src/Layouts/DataBaseView.vala:240 #, c-format msgid "Query %i" msgstr "" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select Table" msgstr "" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select a table from the left sidebar to activate this view." msgstr "" #: src/Layouts/Views/Structure.vala:107 src/Layouts/Views/Structure.vala:145 #: src/Layouts/Views/Content.vala:179 src/Layouts/Views/Content.vala:218 #: src/Layouts/Views/Relations.vala:106 src/Layouts/Views/Relations.vala:144 #: src/Layouts/Views/Query.vala:323 msgid "No Results Available" msgstr "" #: src/Layouts/Views/Structure.vala:118 src/Layouts/Views/Content.vala:191 #: src/Layouts/Views/Relations.vala:117 msgid "Reload Results" msgstr "" #: src/Layouts/Views/Structure.vala:197 msgid " Fields" msgstr "" #: src/Layouts/Views/Content.vala:121 msgid "Previous Page" msgstr "" #: src/Layouts/Views/Content.vala:126 msgid "Next Page" msgstr "" #: src/Layouts/Views/Content.vala:131 #, c-format msgid "%d Pages" msgstr "" #: src/Layouts/Views/Content.vala:134 msgid "Jump to page…" msgstr "" #: src/Layouts/Views/Content.vala:165 msgid "1 Page" msgstr "" #: src/Layouts/Views/Content.vala:171 #, c-format msgid "%d of %d Pages" msgstr "" #: src/Layouts/Views/Content.vala:275 #, c-format msgid "%d Entries" msgstr "" #: src/Layouts/Views/Relations.vala:197 msgid " Constraints" msgstr "" #: src/Layouts/Views/Query.vala:279 msgid "Running Query…" msgstr "" #: src/Layouts/Views/Query.vala:295 src/Layouts/Views/Query.vala:304 msgid "Run Query" msgstr "" #: src/Layouts/Views/Query.vala:356 msgid "Export Results" msgstr "" #: src/Layouts/Views/Query.vala:369 msgid "Export as CSV" msgstr "" #: src/Layouts/Views/Query.vala:377 msgid "Export as Text" msgstr "" #: src/Layouts/Views/Query.vala:436 src/Layouts/Views/Query.vala:482 msgid "Unable to process Query!" msgstr "" #: src/Layouts/Views/Query.vala:457 #, c-format msgid "%d Total Results" msgstr "" #: src/Layouts/Views/Query.vala:492 #, c-format msgid "Query Successfully Executed! Rows Affected: %s" msgstr "" #: src/Layouts/Views/Query.vala:495 msgid "Query Executed!" msgstr "" #: src/Partials/LibraryItem.vala:107 src/Widgets/ConnectionDialog.vala:431 msgid "Connect" msgstr "" #: src/Partials/LibraryItem.vala:110 msgid "Edit Connection" msgstr "" #: src/Partials/LibraryItem.vala:113 msgid "Duplicate Connection" msgstr "" #: src/Partials/LibraryItem.vala:116 msgid "Delete Connection" msgstr "" #: src/Partials/LibraryItem.vala:126 msgid "Options" msgstr "" #: src/Partials/TreeBuilder.vala:131 msgid "Error" msgstr "" #: src/Partials/TreeBuilder.vala:131 msgid "on Column" msgstr "" #: src/Partials/TreeBuilder.vala:172 #, c-format msgid "Copy %s" msgstr "" #: src/Services/Settings.vala:106 #, c-format msgid "%s (copy)" msgstr "" #: src/Services/ConnectionManager.vala:193 #, c-format msgid "Libssh2 initialization failed (%d)" msgstr "" #: src/Services/ConnectionManager.vala:202 msgid "Failed to open socket" msgstr "" #: src/Services/ConnectionManager.vala:211 msgid "Failed to connect!" msgstr "" #: src/Services/ConnectionManager.vala:223 #, c-format msgid "Error when starting up SSH session: %d" msgstr "" #: src/Services/ConnectionManager.vala:242 msgid "Authentication by password failed!" msgstr "" #: src/Services/ConnectionManager.vala:252 msgid "Authentication by public key failed!" msgstr "" #: src/Services/ConnectionManager.vala:259 msgid "No supported authentication methods found!" msgstr "" #: src/Services/ConnectionManager.vala:266 msgid "Failed to open listen socket" msgstr "" #: src/Services/ConnectionManager.vala:281 msgid "Failed to bind. Your Database Port may be wrong!" msgstr "" #: src/Services/ConnectionManager.vala:287 msgid "Failed to listen!" msgstr "" #: src/Services/ConnectionManager.vala:314 msgid "Failed to accept remote connection!" msgstr "" #: src/Services/ConnectionManager.vala:323 msgid "" "Could not open the direct-tcpip channel! (Note that this can be a problem at " "the server! Please review the server logs.)" msgstr "" #: src/Services/ConnectionManager.vala:566 msgid "Error!" msgstr "" #: src/Widgets/ConnectionDialog.vala:33 msgid "Missing SSH Key file!" msgstr "" #: src/Widgets/ConnectionDialog.vala:34 msgid "Missing SSH public key!" msgstr "" #: src/Widgets/ConnectionDialog.vala:89 src/Widgets/ConnectionDialog.vala:355 msgid "Connection" msgstr "" #: src/Widgets/ConnectionDialog.vala:141 msgid "Select connection color" msgstr "" #: src/Widgets/ConnectionDialog.vala:164 msgid "Connection Name:" msgstr "" #: src/Widgets/ConnectionDialog.vala:165 msgid "Connection's name" msgstr "" #: src/Widgets/ConnectionDialog.vala:172 msgid "Database Type:" msgstr "" #: src/Widgets/ConnectionDialog.vala:194 msgid "Host:" msgstr "" #: src/Widgets/ConnectionDialog.vala:200 msgid "Database Name:" msgstr "" #: src/Widgets/ConnectionDialog.vala:207 msgid "Username:" msgstr "" #: src/Widgets/ConnectionDialog.vala:213 msgid "Password:" msgstr "" #: src/Widgets/ConnectionDialog.vala:217 src/Widgets/ConnectionDialog.vala:227 #: src/Widgets/ConnectionDialog.vala:285 src/Widgets/ConnectionDialog.vala:295 msgid "Show password" msgstr "" #: src/Widgets/ConnectionDialog.vala:224 src/Widgets/ConnectionDialog.vala:292 msgid "Hide password" msgstr "" #: src/Widgets/ConnectionDialog.vala:234 msgid "Port:" msgstr "" #: src/Widgets/ConnectionDialog.vala:240 msgid "File Path:" msgstr "" #: src/Widgets/ConnectionDialog.vala:241 msgid "Select Your SQLite File…" msgstr "" #: src/Widgets/ConnectionDialog.vala:261 msgid "Connect via SSH Tunnel:" msgstr "" #: src/Widgets/ConnectionDialog.vala:271 msgid "SSH Host:" msgstr "" #: src/Widgets/ConnectionDialog.vala:276 msgid "SSH Username:" msgstr "" #: src/Widgets/ConnectionDialog.vala:281 msgid "SSH Password:" msgstr "" #: src/Widgets/ConnectionDialog.vala:301 msgid "SSH Port:" msgstr "" #: src/Widgets/ConnectionDialog.vala:302 msgid "Optional" msgstr "" #: src/Widgets/ConnectionDialog.vala:306 msgid "SSH Identity" msgstr "" #: src/Widgets/ConnectionDialog.vala:308 msgid "Select Your Identity File…" msgstr "" #: src/Widgets/ConnectionDialog.vala:324 msgid "Generate SSH Key" msgstr "" #: src/Widgets/ConnectionDialog.vala:356 msgid "SSH Tunnel" msgstr "" #: src/Widgets/ConnectionDialog.vala:426 msgid "Close" msgstr "" #: src/Widgets/ConnectionDialog.vala:427 msgid "Save Connection" msgstr "" #: src/Widgets/ConnectionDialog.vala:429 msgid "Test Connection" msgstr "" #: src/Widgets/ConnectionDialog.vala:620 msgid "Opening SSH Tunnel…" msgstr "" #: src/Widgets/ConnectionDialog.vala:650 msgid "Testing Connection…" msgstr "" #: src/Widgets/ConnectionDialog.vala:661 msgid "Successfully Connected!" msgstr "" #: src/Widgets/ConnectionDialog.vala:679 msgid "Saving Connection…" msgstr "" #: src/Widgets/ConnectionDialog.vala:684 msgid "Connection Saved!" msgstr "" #: src/Widgets/ConnectionDialog.vala:692 msgid "Connecting…" msgstr "" sequeler-0.8.2/po/de.po000066400000000000000000000366151410464306200147270ustar00rootroot00000000000000# German translations for com.github.alecaddd.sequeler package. # Copyright (C) 2020 THE com.github.alecaddd.sequeler'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.alecaddd.sequeler package. # Peter Nerlich , 2020. # msgid "" msgstr "" "Project-Id-Version: com.github.alecaddd.sequeler\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-04-11 12:37+0200\n" "PO-Revision-Date: 2020-06-22 03:41+0000\n" "Last-Translator: J. Lavoie \n" "Language-Team: German \n" "Language: de\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: Weblate 4.2-dev\n" #: src/Application.vala:62 msgid "Directories are not supported" msgstr "Verzeichnisse werden nicht unterstützt" #: src/Application.vala:68 msgid "Don't know what to do" msgstr "Ich weiß nicht, was ich tun soll" #: src/Application.vala:80 msgid "Something completely unexpected happened" msgstr "Es ist ein unerwartetes Problem aufgetreten" #: src/Layouts/HeaderBar.vala:46 src/Layouts/HeaderBar.vala:53 msgid "Logout" msgstr "Abmelden" #: src/Layouts/HeaderBar.vala:56 msgid "Light background" msgstr "Heller Hintergrund" #: src/Layouts/HeaderBar.vala:57 msgid "Dark background" msgstr "Dunkler Hintergrund" #: src/Layouts/HeaderBar.vala:68 src/Layouts/Welcome.vala:39 msgid "New Window" msgstr "Neues Fenster" #: src/Layouts/HeaderBar.vala:71 src/Widgets/ConnectionDialog.vala:130 #: src/Widgets/ConnectionDialog.vala:165 msgid "New Connection" msgstr "Neue Verbindung" #: src/Layouts/HeaderBar.vala:74 msgid "Quit" msgstr "Beenden" #: src/Layouts/HeaderBar.vala:94 msgid "Menu" msgstr "Menü" #: src/Layouts/Main.vala:77 #, c-format msgid "Connected to %s" msgstr "Verbunden mit %s" #: src/Layouts/Library.vala:65 msgid "SAVED CONNECTIONS" msgstr "GESPEICHERTE VERBINDUNGEN" #: src/Layouts/Library.vala:74 msgid "Delete All" msgstr "Alle Verbindungen löschen" #: src/Layouts/Library.vala:81 msgid "Reload Library" msgstr "Bibliothek erneut laden" #: src/Layouts/Library.vala:84 msgid "Export Library" msgstr "Bibliothek exportieren" #: src/Layouts/Library.vala:215 src/Layouts/Library.vala:233 msgid "Are you sure you want to proceed?" msgstr "Sind Sie sicher, dass Sie fortfahren wollen?" #: src/Layouts/Library.vala:215 msgid "By deleting this connection you won’t be able to recover this data." msgstr "" "Wenn Sie diese Verbindung löschen, können die Zugangsdaten nicht " "wiederhergestellt werden." #: src/Layouts/Library.vala:218 msgid "Yes, Delete!" msgstr "Ja, Löschen!" #: src/Layouts/Library.vala:233 msgid "All the data will be deleted and you won’t be able to recover it." msgstr "" "Alle Daten werden gelöscht, eine Wiederherstellung wird nicht mehr möglich " "sein." #: src/Layouts/Library.vala:236 msgid "Yes, Delete All!" msgstr "Ja, alles löschen!" #: src/Layouts/Library.vala:330 src/Widgets/ConnectionDialog.vala:575 #: src/Widgets/ConnectionDialog.vala:596 msgid "A username is required in order to connect!" msgstr "Ein Benutzername ist für die Verbindung erforderlich!" #: src/Layouts/Library.vala:404 src/Layouts/Views/Query.vala:528 msgid "Pick a file" msgstr "Eine Datei auswählen" #: src/Layouts/Library.vala:407 src/Layouts/Views/Query.vala:531 msgid "_Save" msgstr "_Speichern" #: src/Layouts/Library.vala:408 src/Layouts/Welcome.vala:62 #: src/Layouts/Views/Query.vala:532 msgid "_Cancel" msgstr "_Abbrechen" #: src/Layouts/Library.vala:467 #, c-format msgid "Unable to Connect to %s" msgstr "Es konnte keine Verbindung zu %s hergestellt werden" #: src/Layouts/Library.vala:480 msgid "Unable to Export Library " msgstr "Die Bibliothek konnte nicht exportiert werden " #: src/Layouts/Welcome.vala:28 msgid "Welcome to Sequeler" msgstr "Willkommen bei Sequeler" #: src/Layouts/Welcome.vala:29 msgid "Connect to Any Local or Remote Database." msgstr "" "Verbinden Sie sich mit einer beliebigen lokalen oder externen Datenbank." #: src/Layouts/Welcome.vala:38 msgid "Add a New Database" msgstr "Neue Datenbank hinzufügen" #: src/Layouts/Welcome.vala:38 msgid "Connect to a Database and Save It in Your Library" msgstr "" "Verbindung zu einer Datenbank herstellen und in der Bibliothek speichern" #: src/Layouts/Welcome.vala:39 msgid "Open a New Sequeler Window" msgstr "Ein neues Sequeler-Fenster öffnen" #: src/Layouts/Welcome.vala:40 msgid "Import Connections" msgstr "Verbindungen importieren" #: src/Layouts/Welcome.vala:40 msgid "Import Previously Exported Sequeler Connections" msgstr "Importieren von zuvor exportierten Sequeler-Verbindungen" #: src/Layouts/Welcome.vala:58 msgid "Select a file" msgstr "Datei auswählen" #: src/Layouts/Welcome.vala:61 msgid "_Open" msgstr "_Öffnen" #: src/Layouts/Welcome.vala:107 msgid "Unable to Import Library " msgstr "Die Bibliothek konnte nicht importiert werden " #: src/Layouts/DataBaseSchema.vala:66 src/Layouts/DataBaseSchema.vala:167 msgid "- Select Database -" msgstr "- Datenbank auswählen -" #: src/Layouts/DataBaseSchema.vala:87 msgid "Search Tables" msgstr "Tabelle suchen" #: src/Layouts/DataBaseSchema.vala:98 msgid "Search Tables…" msgstr "Tabelle suchen…" #: src/Layouts/DataBaseSchema.vala:120 msgid "Reload Tables" msgstr "Tabellen erneut laden" #: src/Layouts/DataBaseSchema.vala:125 msgid "Add Table" msgstr "Tabelle hinzufügen" #: src/Layouts/DataBaseSchema.vala:289 msgid "TABLES" msgstr "TABELLEN" #: src/Layouts/DataBaseView.vala:49 msgid "Structure" msgstr "Struktur" #: src/Layouts/DataBaseView.vala:50 msgid "Content" msgstr "Inhalt" #: src/Layouts/DataBaseView.vala:51 msgid "Relations" msgstr "Beziehungen" #: src/Layouts/DataBaseView.vala:52 src/Layouts/DataBaseView.vala:229 #: src/Layouts/DataBaseView.vala:253 msgid "Query" msgstr "Abfrage" #: src/Layouts/DataBaseView.vala:101 msgid "Zoom Out" msgstr "Ansicht verkleinern" #: src/Layouts/DataBaseView.vala:107 msgid "Zoom 1:1" msgstr "Ansicht 1:1" #: src/Layouts/DataBaseView.vala:111 msgid "Zoom In" msgstr "Ansicht vergrößern" #: src/Layouts/DataBaseView.vala:124 msgid "High Contrast" msgstr "Hoher Kontrast" #: src/Layouts/DataBaseView.vala:132 msgid "Solarized Light" msgstr "" #: src/Layouts/DataBaseView.vala:140 msgid "Solarized Dark" msgstr "" #: src/Layouts/DataBaseView.vala:163 msgid "Change Text Style" msgstr "Textstil verändern" #: src/Layouts/DataBaseView.vala:222 msgid "Create a new Query Tab" msgstr "" #: src/Layouts/DataBaseView.vala:240 #, c-format msgid "Query %i" msgstr "Abfrage %i" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select Table" msgstr "Tabelle auswählen" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select a table from the left sidebar to activate this view." msgstr "" "Wählen Sie auf der linken Seite eine Tabelle aus, um diese Ansicht zu " "aktivieren." #: src/Layouts/Views/Structure.vala:107 src/Layouts/Views/Structure.vala:145 #: src/Layouts/Views/Content.vala:179 src/Layouts/Views/Content.vala:218 #: src/Layouts/Views/Relations.vala:106 src/Layouts/Views/Relations.vala:144 #: src/Layouts/Views/Query.vala:323 msgid "No Results Available" msgstr "Keine Ergebnisse verfügbar" #: src/Layouts/Views/Structure.vala:118 src/Layouts/Views/Content.vala:191 #: src/Layouts/Views/Relations.vala:117 msgid "Reload Results" msgstr "Ergebnisse erneut laden" #: src/Layouts/Views/Structure.vala:197 msgid " Fields" msgstr " Felder" #: src/Layouts/Views/Content.vala:121 msgid "Previous Page" msgstr "Vorherige Seite" #: src/Layouts/Views/Content.vala:126 msgid "Next Page" msgstr "Nächste Seite" #: src/Layouts/Views/Content.vala:131 #, c-format msgid "%d Pages" msgstr "%d Seiten" #: src/Layouts/Views/Content.vala:134 msgid "Jump to page…" msgstr "" #: src/Layouts/Views/Content.vala:165 msgid "1 Page" msgstr "1 Seite" #: src/Layouts/Views/Content.vala:171 #, c-format msgid "%d of %d Pages" msgstr "%d von %d Seiten" #: src/Layouts/Views/Content.vala:275 #, c-format msgid "%d Entries" msgstr "%d Einträge" #: src/Layouts/Views/Relations.vala:197 msgid " Constraints" msgstr " Bedingungen" #: src/Layouts/Views/Query.vala:279 msgid "Running Query…" msgstr "Abfrage wird ausgeführt…" #: src/Layouts/Views/Query.vala:295 src/Layouts/Views/Query.vala:304 msgid "Run Query" msgstr "Abfrage ausführen" #: src/Layouts/Views/Query.vala:356 msgid "Export Results" msgstr "Ergebnisse exportieren" #: src/Layouts/Views/Query.vala:369 msgid "Export as CSV" msgstr "Als CSV exportieren" #: src/Layouts/Views/Query.vala:377 msgid "Export as Text" msgstr "Als Text exportieren" #: src/Layouts/Views/Query.vala:436 src/Layouts/Views/Query.vala:482 msgid "Unable to process Query!" msgstr "Abfrage konnte nicht verarbeitet werden!" #: src/Layouts/Views/Query.vala:457 #, c-format msgid "%d Total Results" msgstr "%d Ergebnisse" #: src/Layouts/Views/Query.vala:492 #, fuzzy, c-format msgid "Query Successfully Executed! Rows Affected: %s" msgstr "Abfrage erfolgreich ausgeführt! Betroffene Zeilen: %d" #: src/Layouts/Views/Query.vala:495 #, fuzzy msgid "Query Executed!" msgstr "Abfrage erfolgreich ausgeführt!" #: src/Partials/LibraryItem.vala:107 src/Widgets/ConnectionDialog.vala:431 msgid "Connect" msgstr "Verbinden" #: src/Partials/LibraryItem.vala:110 msgid "Edit Connection" msgstr "Verbindung bearbeiten" #: src/Partials/LibraryItem.vala:113 #, fuzzy msgid "Duplicate Connection" msgstr "Verbindung löschen" #: src/Partials/LibraryItem.vala:116 msgid "Delete Connection" msgstr "Verbindung löschen" #: src/Partials/LibraryItem.vala:126 msgid "Options" msgstr "Optionen" #: src/Partials/TreeBuilder.vala:131 msgid "Error" msgstr "Fehler" #: src/Partials/TreeBuilder.vala:131 msgid "on Column" msgstr "bei Spalte" #: src/Partials/TreeBuilder.vala:172 #, c-format msgid "Copy %s" msgstr "Kopiere %s" #: src/Services/Settings.vala:106 #, c-format msgid "%s (copy)" msgstr "" #: src/Services/ConnectionManager.vala:193 #, c-format msgid "Libssh2 initialization failed (%d)" msgstr "Libssh2-Initialisierung fehlgeschlagen (%d)" #: src/Services/ConnectionManager.vala:202 msgid "Failed to open socket" msgstr "Der TCP-Socket konnte nicht geöffnet werden" #: src/Services/ConnectionManager.vala:211 msgid "Failed to connect!" msgstr "Die Verbindung konnte nicht hergestellt werden!" #: src/Services/ConnectionManager.vala:223 #, c-format msgid "Error when starting up SSH session: %d" msgstr "Fehler beim Starten der SSH-Sitzung: %d" #: src/Services/ConnectionManager.vala:242 msgid "Authentication by password failed!" msgstr "Die Authentifizierung mit dem Passwort ist fehlgeschlagen!" #: src/Services/ConnectionManager.vala:252 msgid "Authentication by public key failed!" msgstr "" "Die Authentifizierung durch den öffentlichen Schlüssel ist fehlgeschlagen!" #: src/Services/ConnectionManager.vala:259 msgid "No supported authentication methods found!" msgstr "Keine unterstützten Authentifizierungsmethoden gefunden!" #: src/Services/ConnectionManager.vala:266 msgid "Failed to open listen socket" msgstr "Fehler beim Öffnen des TCP-Sockets für eine eingehende Verbindung" #: src/Services/ConnectionManager.vala:281 msgid "Failed to bind. Your Database Port may be wrong!" msgstr "" "Die Verbindung konnte nicht hergestellt werden. Prüfen Sie den Port der " "Datenbank!" #: src/Services/ConnectionManager.vala:287 msgid "Failed to listen!" msgstr "Fehler beim Warten auf eine eingehende Verbindung!" #: src/Services/ConnectionManager.vala:314 msgid "Failed to accept remote connection!" msgstr "Die Remoteverbindung konnte nicht akzeptiert werden!" #: src/Services/ConnectionManager.vala:323 msgid "" "Could not open the direct-tcpip channel! (Note that this can be a problem at " "the server! Please review the server logs.)" msgstr "" "Der direct-tcpip Kanal konnte nicht geöffnet werden! (Beachten Sie, dass " "dies ein Problem auf dem Server sein kann! Bitte überprüfen Sie die " "Serverprotokolle.)" #: src/Services/ConnectionManager.vala:566 msgid "Error!" msgstr "Fehler!" #: src/Widgets/ConnectionDialog.vala:33 msgid "Missing SSH Key file!" msgstr "Fehlender SSH-Schlüssel!" #: src/Widgets/ConnectionDialog.vala:34 #, fuzzy msgid "Missing SSH public key!" msgstr "Fehlender SSH-Schlüssel!" #: src/Widgets/ConnectionDialog.vala:89 src/Widgets/ConnectionDialog.vala:355 msgid "Connection" msgstr "Verbindung" #: src/Widgets/ConnectionDialog.vala:141 #, fuzzy msgid "Select connection color" msgstr "Verbindung löschen" #: src/Widgets/ConnectionDialog.vala:164 msgid "Connection Name:" msgstr "Name der Verbindung:" #: src/Widgets/ConnectionDialog.vala:165 msgid "Connection's name" msgstr "Verbindungsname" #: src/Widgets/ConnectionDialog.vala:172 msgid "Database Type:" msgstr "Datenbanktyp:" #: src/Widgets/ConnectionDialog.vala:194 msgid "Host:" msgstr "Host:" #: src/Widgets/ConnectionDialog.vala:200 msgid "Database Name:" msgstr "Datenbankname:" #: src/Widgets/ConnectionDialog.vala:207 msgid "Username:" msgstr "Benutzername:" #: src/Widgets/ConnectionDialog.vala:213 msgid "Password:" msgstr "Passwort:" #: src/Widgets/ConnectionDialog.vala:217 src/Widgets/ConnectionDialog.vala:227 #: src/Widgets/ConnectionDialog.vala:285 src/Widgets/ConnectionDialog.vala:295 #, fuzzy msgid "Show password" msgstr "SSH Passwort:" #: src/Widgets/ConnectionDialog.vala:224 src/Widgets/ConnectionDialog.vala:292 #, fuzzy msgid "Hide password" msgstr "SSH Passwort:" #: src/Widgets/ConnectionDialog.vala:234 msgid "Port:" msgstr "Port:" #: src/Widgets/ConnectionDialog.vala:240 msgid "File Path:" msgstr "Dateipfad:" #: src/Widgets/ConnectionDialog.vala:241 msgid "Select Your SQLite File…" msgstr "Wähle eine SQLite Datei…" #: src/Widgets/ConnectionDialog.vala:261 msgid "Connect via SSH Tunnel:" msgstr "Verbindung über einen SSH Tunnel herstellen:" #: src/Widgets/ConnectionDialog.vala:271 msgid "SSH Host:" msgstr "SSH Host:" #: src/Widgets/ConnectionDialog.vala:276 msgid "SSH Username:" msgstr "SSH Benutzername:" #: src/Widgets/ConnectionDialog.vala:281 msgid "SSH Password:" msgstr "SSH Passwort:" #: src/Widgets/ConnectionDialog.vala:301 msgid "SSH Port:" msgstr "SSH Port:" #: src/Widgets/ConnectionDialog.vala:302 msgid "Optional" msgstr "Optional" #: src/Widgets/ConnectionDialog.vala:306 msgid "SSH Identity" msgstr "" #: src/Widgets/ConnectionDialog.vala:308 #, fuzzy msgid "Select Your Identity File…" msgstr "Wähle eine SQLite Datei…" #: src/Widgets/ConnectionDialog.vala:324 msgid "Generate SSH Key" msgstr "SSH-Schlüssel erstellen" #: src/Widgets/ConnectionDialog.vala:356 msgid "SSH Tunnel" msgstr "SSH Tunnel" #: src/Widgets/ConnectionDialog.vala:426 msgid "Close" msgstr "Schließen" #: src/Widgets/ConnectionDialog.vala:427 msgid "Save Connection" msgstr "Verbindung speichern" #: src/Widgets/ConnectionDialog.vala:429 msgid "Test Connection" msgstr "Verbindung testen" #: src/Widgets/ConnectionDialog.vala:620 msgid "Opening SSH Tunnel…" msgstr "Öffne SSH Tunnel…" #: src/Widgets/ConnectionDialog.vala:650 msgid "Testing Connection…" msgstr "Verbindung wird getestet…" #: src/Widgets/ConnectionDialog.vala:661 msgid "Successfully Connected!" msgstr "Erfolgreich verbunden!" #: src/Widgets/ConnectionDialog.vala:679 msgid "Saving Connection…" msgstr "Verbindung wird gespeichert…" #: src/Widgets/ConnectionDialog.vala:684 msgid "Connection Saved!" msgstr "Verbindung gespeichert!" #: src/Widgets/ConnectionDialog.vala:692 msgid "Connecting…" msgstr "Verbinde…" sequeler-0.8.2/po/es.po000066400000000000000000000361031410464306200147360ustar00rootroot00000000000000# Spanish translations for com.github.alecaddd.sequeler package. # Copyright (C) 2020 THE com.github.alecaddd.sequeler'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.alecaddd.sequeler package. # Adolfo Jayme Barrientos , 2020. # msgid "" msgstr "" "Project-Id-Version: com.github.alecaddd.sequeler\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-04-11 12:37+0200\n" "PO-Revision-Date: 2020-08-14 12:32+0000\n" "Last-Translator: Adolfo Jayme Barrientos \n" "Language-Team: Spanish \n" "Language: es\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: Weblate 4.2-dev\n" #: src/Application.vala:62 msgid "Directories are not supported" msgstr "No se admiten los directorios" #: src/Application.vala:68 msgid "Don't know what to do" msgstr "No se sabe qué hacer" #: src/Application.vala:80 msgid "Something completely unexpected happened" msgstr "Se produjo una situación inesperada" #: src/Layouts/HeaderBar.vala:46 src/Layouts/HeaderBar.vala:53 msgid "Logout" msgstr "Finalizar sesión" #: src/Layouts/HeaderBar.vala:56 msgid "Light background" msgstr "Fondo claro" #: src/Layouts/HeaderBar.vala:57 msgid "Dark background" msgstr "Fondo oscuro" #: src/Layouts/HeaderBar.vala:68 src/Layouts/Welcome.vala:39 msgid "New Window" msgstr "Ventana nueva" #: src/Layouts/HeaderBar.vala:71 src/Widgets/ConnectionDialog.vala:130 #: src/Widgets/ConnectionDialog.vala:165 msgid "New Connection" msgstr "Conexión nueva" #: src/Layouts/HeaderBar.vala:74 msgid "Quit" msgstr "Salir" #: src/Layouts/HeaderBar.vala:94 msgid "Menu" msgstr "Menú" #: src/Layouts/Main.vala:77 #, c-format msgid "Connected to %s" msgstr "Conectado con %s" #: src/Layouts/Library.vala:65 msgid "SAVED CONNECTIONS" msgstr "CONEXIONES GUARDADAS" #: src/Layouts/Library.vala:74 msgid "Delete All" msgstr "Eliminar todas" #: src/Layouts/Library.vala:81 msgid "Reload Library" msgstr "Recargar biblioteca" #: src/Layouts/Library.vala:84 msgid "Export Library" msgstr "Exportar biblioteca" #: src/Layouts/Library.vala:215 src/Layouts/Library.vala:233 msgid "Are you sure you want to proceed?" msgstr "¿Confirma que quiere continuar?" #: src/Layouts/Library.vala:215 msgid "By deleting this connection you won’t be able to recover this data." msgstr "Si elimina esta conexión, no será capaz de recuperar los datos." #: src/Layouts/Library.vala:218 msgid "Yes, Delete!" msgstr "Sí, eliminarla" #: src/Layouts/Library.vala:233 msgid "All the data will be deleted and you won’t be able to recover it." msgstr "Se eliminarán todos los datos y no será capaz de recuperarlos." #: src/Layouts/Library.vala:236 msgid "Yes, Delete All!" msgstr "Sí, eliminarlo todo" #: src/Layouts/Library.vala:330 src/Widgets/ConnectionDialog.vala:575 #: src/Widgets/ConnectionDialog.vala:596 msgid "A username is required in order to connect!" msgstr "Se necesita un nombre de usuario para efectuar la conexión." #: src/Layouts/Library.vala:404 src/Layouts/Views/Query.vala:528 msgid "Pick a file" msgstr "Elija un archivo" #: src/Layouts/Library.vala:407 src/Layouts/Views/Query.vala:531 msgid "_Save" msgstr "_Guardar" #: src/Layouts/Library.vala:408 src/Layouts/Welcome.vala:62 #: src/Layouts/Views/Query.vala:532 msgid "_Cancel" msgstr "_Cancelar" #: src/Layouts/Library.vala:467 #, c-format msgid "Unable to Connect to %s" msgstr "No se pudo conectar con %s" #: src/Layouts/Library.vala:480 msgid "Unable to Export Library " msgstr "No se pudo exportar la biblioteca " #: src/Layouts/Welcome.vala:28 msgid "Welcome to Sequeler" msgstr "Le damos la bienvenida a Sequeler" #: src/Layouts/Welcome.vala:29 msgid "Connect to Any Local or Remote Database." msgstr "Conéctese con cualquier base de datos local o remota." #: src/Layouts/Welcome.vala:38 msgid "Add a New Database" msgstr "Añadir base de datos nueva" #: src/Layouts/Welcome.vala:38 msgid "Connect to a Database and Save It in Your Library" msgstr "Conéctese con una base de datos y guárdela en la biblioteca" #: src/Layouts/Welcome.vala:39 msgid "Open a New Sequeler Window" msgstr "Abrir una ventana nueva de Sequeler" #: src/Layouts/Welcome.vala:40 msgid "Import Connections" msgstr "Importar conexiones" #: src/Layouts/Welcome.vala:40 msgid "Import Previously Exported Sequeler Connections" msgstr "Abrir conexiones de Sequeler exportadas anteriormente" #: src/Layouts/Welcome.vala:58 msgid "Select a file" msgstr "Seleccione un archivo" #: src/Layouts/Welcome.vala:61 msgid "_Open" msgstr "_Abrir" #: src/Layouts/Welcome.vala:107 msgid "Unable to Import Library " msgstr "No se pudo importar la biblioteca " #: src/Layouts/DataBaseSchema.vala:66 src/Layouts/DataBaseSchema.vala:167 msgid "- Select Database -" msgstr "- Seleccione una base de datos -" #: src/Layouts/DataBaseSchema.vala:87 msgid "Search Tables" msgstr "Buscar en las tablas" #: src/Layouts/DataBaseSchema.vala:98 msgid "Search Tables…" msgstr "Buscar en las tablas…" #: src/Layouts/DataBaseSchema.vala:120 msgid "Reload Tables" msgstr "Recargar tablas" #: src/Layouts/DataBaseSchema.vala:125 msgid "Add Table" msgstr "Añadir tabla" #: src/Layouts/DataBaseSchema.vala:289 msgid "TABLES" msgstr "TABLAS" #: src/Layouts/DataBaseView.vala:49 msgid "Structure" msgstr "Estructura" #: src/Layouts/DataBaseView.vala:50 msgid "Content" msgstr "Contenido" #: src/Layouts/DataBaseView.vala:51 msgid "Relations" msgstr "Relaciones" #: src/Layouts/DataBaseView.vala:52 src/Layouts/DataBaseView.vala:229 #: src/Layouts/DataBaseView.vala:253 msgid "Query" msgstr "Consulta" #: src/Layouts/DataBaseView.vala:101 msgid "Zoom Out" msgstr "Alejar" #: src/Layouts/DataBaseView.vala:107 msgid "Zoom 1:1" msgstr "Ajustar 1:1" #: src/Layouts/DataBaseView.vala:111 msgid "Zoom In" msgstr "Acercar" #: src/Layouts/DataBaseView.vala:124 msgid "High Contrast" msgstr "Contraste alto" #: src/Layouts/DataBaseView.vala:132 msgid "Solarized Light" msgstr "Solarizado claro" #: src/Layouts/DataBaseView.vala:140 msgid "Solarized Dark" msgstr "Solarizado oscuro" #: src/Layouts/DataBaseView.vala:163 msgid "Change Text Style" msgstr "Cambiar estilo de texto" #: src/Layouts/DataBaseView.vala:222 msgid "Create a new Query Tab" msgstr "Crear pestaña de consulta" #: src/Layouts/DataBaseView.vala:240 #, c-format msgid "Query %i" msgstr "Consulta %i" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select Table" msgstr "Seleccionar tabla" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select a table from the left sidebar to activate this view." msgstr "" "Seleccione una tabla de la barra lateral izquierda para activar esta vista." #: src/Layouts/Views/Structure.vala:107 src/Layouts/Views/Structure.vala:145 #: src/Layouts/Views/Content.vala:179 src/Layouts/Views/Content.vala:218 #: src/Layouts/Views/Relations.vala:106 src/Layouts/Views/Relations.vala:144 #: src/Layouts/Views/Query.vala:323 msgid "No Results Available" msgstr "No se encontraron resultados" #: src/Layouts/Views/Structure.vala:118 src/Layouts/Views/Content.vala:191 #: src/Layouts/Views/Relations.vala:117 msgid "Reload Results" msgstr "Recargar resultados" #: src/Layouts/Views/Structure.vala:197 msgid " Fields" msgstr " campos" #: src/Layouts/Views/Content.vala:121 msgid "Previous Page" msgstr "Página anterior" #: src/Layouts/Views/Content.vala:126 msgid "Next Page" msgstr "Página siguiente" #: src/Layouts/Views/Content.vala:131 #, c-format msgid "%d Pages" msgstr "%d páginas" #: src/Layouts/Views/Content.vala:134 msgid "Jump to page…" msgstr "Saltar a la página…" #: src/Layouts/Views/Content.vala:165 msgid "1 Page" msgstr "1 página" #: src/Layouts/Views/Content.vala:171 #, c-format msgid "%d of %d Pages" msgstr "%d de %d páginas" #: src/Layouts/Views/Content.vala:275 #, c-format msgid "%d Entries" msgstr "%d entradas" #: src/Layouts/Views/Relations.vala:197 msgid " Constraints" msgstr " restricciones" #: src/Layouts/Views/Query.vala:279 msgid "Running Query…" msgstr "Ejecutando la consulta…" #: src/Layouts/Views/Query.vala:295 src/Layouts/Views/Query.vala:304 msgid "Run Query" msgstr "Ejecutar consulta" #: src/Layouts/Views/Query.vala:356 msgid "Export Results" msgstr "Exportar resultados" #: src/Layouts/Views/Query.vala:369 msgid "Export as CSV" msgstr "Exportar como CSV" #: src/Layouts/Views/Query.vala:377 msgid "Export as Text" msgstr "Exportar como texto" #: src/Layouts/Views/Query.vala:436 src/Layouts/Views/Query.vala:482 msgid "Unable to process Query!" msgstr "No se pudo procesar la consulta." #: src/Layouts/Views/Query.vala:457 #, c-format msgid "%d Total Results" msgstr "%d resultados en total" #: src/Layouts/Views/Query.vala:492 #, c-format msgid "Query Successfully Executed! Rows Affected: %s" msgstr "Se ejecutó la consulta correctamente. Filas afectadas: %s" #: src/Layouts/Views/Query.vala:495 msgid "Query Executed!" msgstr "Se ha ejecutado la consulta." #: src/Partials/LibraryItem.vala:107 src/Widgets/ConnectionDialog.vala:431 msgid "Connect" msgstr "Conectar" #: src/Partials/LibraryItem.vala:110 msgid "Edit Connection" msgstr "Editar conexión" #: src/Partials/LibraryItem.vala:113 msgid "Duplicate Connection" msgstr "Duplicar conexión" #: src/Partials/LibraryItem.vala:116 msgid "Delete Connection" msgstr "Eliminar conexión" #: src/Partials/LibraryItem.vala:126 msgid "Options" msgstr "Opciones" #: src/Partials/TreeBuilder.vala:131 msgid "Error" msgstr "Error" #: src/Partials/TreeBuilder.vala:131 msgid "on Column" msgstr "en la columna" #: src/Partials/TreeBuilder.vala:172 #, c-format msgid "Copy %s" msgstr "Copiar %s" #: src/Services/Settings.vala:106 #, c-format msgid "%s (copy)" msgstr "%s (copia)" #: src/Services/ConnectionManager.vala:193 #, c-format msgid "Libssh2 initialization failed (%d)" msgstr "No se pudo inicializar libssh2 (%d)" #: src/Services/ConnectionManager.vala:202 msgid "Failed to open socket" msgstr "Fallo al abrir socket" #: src/Services/ConnectionManager.vala:211 msgid "Failed to connect!" msgstr "No se pudo establecer la conexión." #: src/Services/ConnectionManager.vala:223 #, c-format msgid "Error when starting up SSH session: %d" msgstr "Error al iniciar la sesión SSH: %d" #: src/Services/ConnectionManager.vala:242 msgid "Authentication by password failed!" msgstr "No se pudo autenticar por contraseña." #: src/Services/ConnectionManager.vala:252 msgid "Authentication by public key failed!" msgstr "No se pudo autenticar por clave pública." #: src/Services/ConnectionManager.vala:259 msgid "No supported authentication methods found!" msgstr "No se encontró ningún método de autenticación admitido." #: src/Services/ConnectionManager.vala:266 msgid "Failed to open listen socket" msgstr "Fallo al abrir socket de escucha" #: src/Services/ConnectionManager.vala:281 msgid "Failed to bind. Your Database Port may be wrong!" msgstr "" "No se pudo vincular. Puede que el puerto de su base de datos sea erróneo." #: src/Services/ConnectionManager.vala:287 msgid "Failed to listen!" msgstr "No se pudo escuchar." #: src/Services/ConnectionManager.vala:314 msgid "Failed to accept remote connection!" msgstr "No se pudo aceptar la conexión remota." #: src/Services/ConnectionManager.vala:323 msgid "" "Could not open the direct-tcpip channel! (Note that this can be a problem at " "the server! Please review the server logs.)" msgstr "" "No se pudo abrir el canal direct-tcpip (Nota: esto puede ser un problema con " "el servidor. Revise los registros del servidor.)" #: src/Services/ConnectionManager.vala:566 msgid "Error!" msgstr "Error" #: src/Widgets/ConnectionDialog.vala:33 msgid "Missing SSH Key file!" msgstr "Falta el archivo de clave SSH." #: src/Widgets/ConnectionDialog.vala:34 msgid "Missing SSH public key!" msgstr "Falta la clave SSH pública." #: src/Widgets/ConnectionDialog.vala:89 src/Widgets/ConnectionDialog.vala:355 msgid "Connection" msgstr "Conexión" #: src/Widgets/ConnectionDialog.vala:141 msgid "Select connection color" msgstr "Seleccionar el color de la conexión" #: src/Widgets/ConnectionDialog.vala:164 msgid "Connection Name:" msgstr "Nombre de la conexión:" #: src/Widgets/ConnectionDialog.vala:165 msgid "Connection's name" msgstr "Nombre de la conexión" #: src/Widgets/ConnectionDialog.vala:172 msgid "Database Type:" msgstr "Tipo de base de datos:" #: src/Widgets/ConnectionDialog.vala:194 msgid "Host:" msgstr "Anfitrión:" #: src/Widgets/ConnectionDialog.vala:200 msgid "Database Name:" msgstr "Nombre de la base de datos:" #: src/Widgets/ConnectionDialog.vala:207 msgid "Username:" msgstr "Nombre de usuario:" #: src/Widgets/ConnectionDialog.vala:213 msgid "Password:" msgstr "Contraseña:" #: src/Widgets/ConnectionDialog.vala:217 src/Widgets/ConnectionDialog.vala:227 #: src/Widgets/ConnectionDialog.vala:285 src/Widgets/ConnectionDialog.vala:295 msgid "Show password" msgstr "Mostrar contraseña" #: src/Widgets/ConnectionDialog.vala:224 src/Widgets/ConnectionDialog.vala:292 msgid "Hide password" msgstr "Ocultar contraseña" #: src/Widgets/ConnectionDialog.vala:234 msgid "Port:" msgstr "Puerto:" #: src/Widgets/ConnectionDialog.vala:240 msgid "File Path:" msgstr "Ruta de archivo:" #: src/Widgets/ConnectionDialog.vala:241 msgid "Select Your SQLite File…" msgstr "Seleccione su archivo SQLite…" #: src/Widgets/ConnectionDialog.vala:261 msgid "Connect via SSH Tunnel:" msgstr "Conectar mediante túnel SSH:" #: src/Widgets/ConnectionDialog.vala:271 msgid "SSH Host:" msgstr "Anfitrión SSH:" #: src/Widgets/ConnectionDialog.vala:276 msgid "SSH Username:" msgstr "Nombre de usuario SSH:" #: src/Widgets/ConnectionDialog.vala:281 msgid "SSH Password:" msgstr "Contraseña SSH:" #: src/Widgets/ConnectionDialog.vala:301 msgid "SSH Port:" msgstr "Puerto SSH:" #: src/Widgets/ConnectionDialog.vala:302 msgid "Optional" msgstr "Opcional" #: src/Widgets/ConnectionDialog.vala:306 msgid "SSH Identity" msgstr "Identidad SSH" #: src/Widgets/ConnectionDialog.vala:308 msgid "Select Your Identity File…" msgstr "Seleccione su archivo de identidad…" #: src/Widgets/ConnectionDialog.vala:324 msgid "Generate SSH Key" msgstr "Generar clave SSH" #: src/Widgets/ConnectionDialog.vala:356 msgid "SSH Tunnel" msgstr "Túnel SSH" #: src/Widgets/ConnectionDialog.vala:426 msgid "Close" msgstr "Cerrar" #: src/Widgets/ConnectionDialog.vala:427 msgid "Save Connection" msgstr "Guardar conexión" #: src/Widgets/ConnectionDialog.vala:429 msgid "Test Connection" msgstr "Probar conexión" #: src/Widgets/ConnectionDialog.vala:620 msgid "Opening SSH Tunnel…" msgstr "Abriendo túnel SSH…" #: src/Widgets/ConnectionDialog.vala:650 msgid "Testing Connection…" msgstr "Probando la conexión…" #: src/Widgets/ConnectionDialog.vala:661 msgid "Successfully Connected!" msgstr "Se ha conectado correctamente." #: src/Widgets/ConnectionDialog.vala:679 msgid "Saving Connection…" msgstr "Guardando la conexión…" #: src/Widgets/ConnectionDialog.vala:684 msgid "Connection Saved!" msgstr "Se guardó la conexión." #: src/Widgets/ConnectionDialog.vala:692 msgid "Connecting…" msgstr "Conectando…" sequeler-0.8.2/po/extra/000077500000000000000000000000001410464306200151075ustar00rootroot00000000000000sequeler-0.8.2/po/extra/LINGUAS000066400000000000000000000000111410464306200161240ustar00rootroot00000000000000de fr lt sequeler-0.8.2/po/extra/POTFILES000066400000000000000000000001441410464306200162560ustar00rootroot00000000000000data/com.github.alecaddd.sequeler.desktop.in.in data/com.github.alecaddd.sequeler.appdata.xml.in.in sequeler-0.8.2/po/extra/de.po000066400000000000000000000542651410464306200160530ustar00rootroot00000000000000# German translations for extra package. # Copyright (C) 2020 THE extra'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # Peter Nerlich , 2020. # msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-04-11 12:37+0200\n" "PO-Revision-Date: 2020-04-11 12:12+0200\n" "Last-Translator: Peter Nerlich \n" "Language-Team: none\n" "Language: de\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" #: data/com.github.alecaddd.sequeler.desktop.in.in:3 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:7 msgid "Sequeler" msgstr "Sequeler" #: data/com.github.alecaddd.sequeler.desktop.in.in:4 msgid "Sequeler App" msgstr "Sequeler Anwendung" #: data/com.github.alecaddd.sequeler.desktop.in.in:5 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:8 msgid "Friendly SQL Client" msgstr "Benutzerfreundlicher SQL-Client" #: data/com.github.alecaddd.sequeler.desktop.in.in:9 msgid "@icon@" msgstr "@icon@" #: data/com.github.alecaddd.sequeler.desktop.in.in:12 msgid "SQL;MySql;Database;MariaDB;S3;PostgreSQL;" msgstr "SQL;MySql;Database;MariaDB;S3;PostgreSQL;" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:10 msgid "Easily connect to your local or remote database" msgstr "" "Verbinden Sie sich mit einer beliebigen lokalen oder externen Datenbank" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:13 #, fuzzy msgid "" "Store your Database Connections in the library, connect over SSH tunnel, " "type and execute SQL commands directly in the app, and do everything you " "need to do without the necessity of opening the terminal." msgstr "" "Speichern Sie Ihre Datenbankverbindungen in der integrierten Bibliothek, " "führen Sie SQL-Befehle direkt in der Anwendung aus, und tun Sie alles, was " "Sie tun müssen, ohne das Terminal öffnen zu müssen." #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:16 msgid "Supported Databases:" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:20 msgid "SQLite" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:21 msgid "MySQL" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:22 msgid "MariaDB" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:23 msgid "PostgreSQL" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:25 msgid "Features Include:" msgstr "Zu den Funktionen gehören:" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:29 msgid "Test Connections before saving them" msgstr "Verbindung vor dem Speichern testen" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:30 msgid "View Table structure, content, and relations" msgstr "Anzeigen von Tabellenstruktur, Inhalt und Beziehungen" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:31 msgid "Write multiple custom SQL Queries" msgstr "Mehrere benutzerdefinierte SQL-Abfragen schreiben" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:32 msgid "Switch between light and dark mode" msgstr "Zwischen dem hellen und dunklen Modus umschalten" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:33 #, fuzzy msgid "" "Handy keyboard shortcuts to quit (ctrl+q), create new connection (ctrl+shift" "+n), open a new window (ctrl+n)" msgstr "" "Tastenkombinationen zum Beenden (Strg+q), Erstellen einer neuen Verbindung " "(Strg+Shift+n), mehrere Instanzen (Strg+n)" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:42 msgid "Query Tab Bonanza!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:44 msgid "Fix ORDER BY in PostgreSQL Relationship view." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:45 msgid "Improve MySQL structure view." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:46 msgid "Drop Granite.Settings in favor of GLib.Settings." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:47 msgid "Implement Granite.Notebook on the Query tab." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:48 msgid "Show query error messages inline." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:54 msgid "New features and improvements" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:56 #, fuzzy msgid "You can now duplicate connections." msgstr "Gesamtzahl der gespeicherten Verbindungen." #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:57 msgid "" "Sorting columns now works as expected by actually running the ORDER BY query." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:58 msgid "" "Quickly jump to a specific result page with the handy dandy pagination " "popover." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:59 msgid "Show Comment Column inside table structure view." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:65 msgid "The 2020 release!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:67 #, fuzzy msgid "Manually reorder saved connection." msgstr "Gesamtzahl der gespeicherten Verbindungen." #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:68 msgid "Allow selecting a custom SSH public key." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:69 msgid "Fix SSH tunnel crashes." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:75 msgid "Raw Query Improvements" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:77 msgid "Strip comments from SQL raw queries." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:78 msgid "Better handle complex queries on multiple lines." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:79 msgid "Speed up query rendering." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:85 msgid "Sweet Query Tab Improvements" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:87 msgid "Edit font size of the Query Tab." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:88 msgid "Edit background style of the Query Tab." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:89 msgid "Save and remember the Query Tab size." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:95 msgid "PostgreSQL Fixes" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:97 msgid "Fixed PostgreSQL relationship table." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:98 msgid "Fixed wrong response message when handling non select queries." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:104 msgid "Bite-Size fixes" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:106 msgid "Removed unused libfixposix." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:107 msgid "Fixed pagination issue when clicking too fast while fetching big data." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:113 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:124 msgid "Bug fixes and improvements" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:115 msgid "Rewritten pagination to use LIMIT and OFFSET." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:116 msgid "Faster pagination and content viewing for big data." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:117 msgid "Show records count in table's list." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:118 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:151 msgid "Bug fixes and other improvements." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:126 msgid "Properly handle EXPLAIN SQL statement." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:127 msgid "Properly handle querying capitlized PostgreSQL tables." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:128 msgid "Improved async methods for internal views." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:129 msgid "Updated translations." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:135 msgid "Critical bug fix!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:137 msgid "CRITICAL: Fixes missing GSettings Schema, restore lost connections." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:138 msgid "Other small bug fixes and improvements." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:144 msgid "Implemented SSH tunneling" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:146 msgid "" "WARNING: This release packs many updates and something could break. Please, " "backup your connections." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:147 #, fuzzy msgid "Connect via SSH to a remote Database." msgstr "Zu einer lokalen oder entfernten Datenbank verbinden" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:148 msgid "Major code refactor to handle UI updates via async methods." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:149 msgid "" "Use Stack container to show a loading Spinner during fetch or data " "processing methods." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:150 msgid "" "Major performance improvements to the table search and dropdown schema " "switcher." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:157 msgid "Fancy New Icon!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:159 msgid "New fancy Icon." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:160 msgid "Use GtkNativeDialog." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:161 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:171 msgid "Bug fixes and Improvements." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:167 msgid "Open SQLite files" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:169 msgid "Open SQLite files directly in Sequeler." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:170 msgid "Right click to copy data inside a column." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:177 msgid "UI Fixes and Performance Improvements" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:179 msgid "UI fix for logout button." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:180 msgid "View shortcuts on preferences dropdown." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:181 msgid "Performance Improvements." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:182 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:250 msgid "Italian translation." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:188 msgid "Export all the things!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:190 msgid "Export results from Query Tab." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:191 msgid "Export in CSV or Plain Text format." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:192 msgid "Sort Columns order everywhere." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:193 msgid "Brazilian translation." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:199 msgid "Here comes the power of Pagination!!!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:201 msgid "Paginate results in the Content tab." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:202 msgid "Query messages UI improvements." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:203 msgid "Relations table bug fixes." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:209 msgid "We got Multi SQL Query support." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:211 msgid "Ability to handle multiple SQL queries." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:212 msgid "Execute the currently highlighted query." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:213 msgid "Improved Library Popover UI." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:214 msgid "Use native GTK+ CSS attributes for better Light/Dark mode." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:215 msgid "Random UI improvements." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:221 msgid "Urgent! Fixed broken Tabs for translated version." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:226 msgid "Light and Dark Mode Switch!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:228 msgid "Better Dark/Light mode switch in header bar." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:229 msgid "Add Russian translation." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:230 msgid "Updated Welcome screen with New Window command." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:231 msgid "Code cleanup." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:237 msgid "Official Juno release!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:239 msgid "Missing filter name on SQLite File Dialog." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:245 msgid "We got Search!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:247 msgid "Search table names in sidebar." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:248 msgid "Fixes issue in connecting directly on a non saved connection." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:249 msgid "Updated Lithuanian translation." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:256 msgid "Improved Password Security." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:258 msgid "Safely store passwords in LibSecret." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:259 msgid "Auto upgrade on startup to remove passwords from GSettings." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:260 msgid "" "Fixes issues with identical table names from other database in the same " "connection." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:261 msgid "Alphabetically ordered tables." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:262 msgid "Improvements in showing MySql/MariaDB Table Structure." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:263 msgid "Many more bugs for you to discover." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:269 #, fuzzy msgid "New Icon and Import/Export Library." msgstr "Abfrage konnte nicht verarbeitet werden!" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:271 msgid "Fancy new icon." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:272 #, fuzzy msgid "Import and Export connections library." msgstr "Verbindung testen" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:273 msgid "Fixed random crash when opening and closing multiple connections." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:274 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:280 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:292 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:315 msgid "Bug fixes and improvements." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:282 msgid "Fixed PostgreSQL Schema show options." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:283 msgid "" "Fixed crash on new connection dialog when opening the connection before " "saving." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:289 msgid "Little side dish update." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:291 msgid "Fixed save window state on close." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:298 msgid "Alternate coloured rows!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:300 msgid "Manually reload Content, Structure, and Relations." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:301 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:312 msgid "Show Table schema, content, and constraint relationships." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:302 msgid "Properly handle compound queries." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:303 msgid "Fix PostgreSQL table switch." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:309 msgid "Complete rewrite of the entire code base!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:311 msgid "Handle multiple Windows/Instances and multiple open connections." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:313 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:325 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:337 msgid "Quicker response on big select queries" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:314 msgid "Better error handling." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:321 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:333 msgid "Better error handling, less crashes!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:323 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:335 msgid "The app doesn't crash when dealing with big values" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:324 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:336 msgid "Handling errors related to columns" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:326 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:338 msgid "Some small clean up" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:327 msgid "Fixes issue with SQL Lite encrypted path" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:344 msgid "New Icon, Better error messages!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:346 msgid "New shiny icon" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:347 msgid "View SQL error message on error" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:348 msgid "FIX: Show proper PostgreSql Schema Table in Sidebar" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:349 msgid "Snappiest query execution ever for local databases" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:350 msgid "The usual bundle of bugs for you to discover" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:356 msgid "Summoning the power of async methods!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:358 msgid "All DataBase queries are now async methods, super fast." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:359 msgid "The UI doesn't freeze anymore during a long process" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:360 msgid "Granite SourceList to display list of tables" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:361 msgid "Tabs to switch between the Query Builder and the Table Structure" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:362 msgid "ComboBox to select table schemas from the open connection" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:363 msgid "Many more bugs and issues for you to have fun with" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:369 msgid "Bug Fixes and Improvements" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:371 msgid "Display Table lists for SQLite and PostgreSQL" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:372 msgid "Refresh Table List view if tables change" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:373 msgid "Removed unused GSettings" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:379 msgid "" "This is so good you won't believe it. New Library UI, Schema Table, Custom " "Port, and more" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:381 msgid "" "A brand new Library View directly in your home screen, super tight and " "organized" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:382 msgid "Custom Port field for those snazzy geeks who don't just use 3306" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:383 msgid "A shiny new Sidebar View to list all your DataBase Tables" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:384 msgid "Code cleanup and speed improvements" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:385 msgid "Usual abundance of bugs and issues for you to have fun with!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:391 msgid "Major Update: Releasing a sweet table to view Query Results!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:393 msgid "Did I say we got a sweet table to view query results?" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:394 msgid "New shortcut (ctrl+enter) to execute query" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:395 msgid "Solved bug while connecting to DB directly from the Connection Dialog" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:396 msgid "UI Improvements to Connection Dialog" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:397 msgid "Added Spanish and Lithuanian translations" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:403 msgid "UI fixes" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:405 msgid "Visual improvements to the library view" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:411 msgid "Initial Release" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:413 msgid "Store your Database connections" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:414 #, fuzzy msgid "Quickly connect to a Local or Remote Database" msgstr "Zu einer lokalen oder entfernten Datenbank verbinden" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:415 msgid "Write SQL queries in the built-in code editor" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:437 msgid "Alessandro Castellani" msgstr "Alessandro Castellani" sequeler-0.8.2/po/extra/extra.pot000066400000000000000000000521001410464306200167540ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-04-11 12:37+0200\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=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: data/com.github.alecaddd.sequeler.desktop.in.in:3 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:7 msgid "Sequeler" msgstr "" #: data/com.github.alecaddd.sequeler.desktop.in.in:4 msgid "Sequeler App" msgstr "" #: data/com.github.alecaddd.sequeler.desktop.in.in:5 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:8 msgid "Friendly SQL Client" msgstr "" #: data/com.github.alecaddd.sequeler.desktop.in.in:9 msgid "@icon@" msgstr "" #: data/com.github.alecaddd.sequeler.desktop.in.in:12 msgid "SQL;MySql;Database;MariaDB;S3;PostgreSQL;" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:10 msgid "Easily connect to your local or remote database" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:13 msgid "" "Store your Database Connections in the library, connect over SSH tunnel, " "type and execute SQL commands directly in the app, and do everything you " "need to do without the necessity of opening the terminal." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:16 msgid "Supported Databases:" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:20 msgid "SQLite" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:21 msgid "MySQL" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:22 msgid "MariaDB" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:23 msgid "PostgreSQL" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:25 msgid "Features Include:" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:29 msgid "Test Connections before saving them" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:30 msgid "View Table structure, content, and relations" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:31 msgid "Write multiple custom SQL Queries" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:32 msgid "Switch between light and dark mode" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:33 msgid "" "Handy keyboard shortcuts to quit (ctrl+q), create new connection (ctrl+shift" "+n), open a new window (ctrl+n)" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:42 msgid "Query Tab Bonanza!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:44 msgid "Fix ORDER BY in PostgreSQL Relationship view." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:45 msgid "Improve MySQL structure view." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:46 msgid "Drop Granite.Settings in favor of GLib.Settings." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:47 msgid "Implement Granite.Notebook on the Query tab." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:48 msgid "Show query error messages inline." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:54 msgid "New features and improvements" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:56 msgid "You can now duplicate connections." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:57 msgid "" "Sorting columns now works as expected by actually running the ORDER BY query." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:58 msgid "" "Quickly jump to a specific result page with the handy dandy pagination " "popover." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:59 msgid "Show Comment Column inside table structure view." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:65 msgid "The 2020 release!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:67 msgid "Manually reorder saved connection." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:68 msgid "Allow selecting a custom SSH public key." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:69 msgid "Fix SSH tunnel crashes." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:75 msgid "Raw Query Improvements" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:77 msgid "Strip comments from SQL raw queries." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:78 msgid "Better handle complex queries on multiple lines." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:79 msgid "Speed up query rendering." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:85 msgid "Sweet Query Tab Improvements" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:87 msgid "Edit font size of the Query Tab." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:88 msgid "Edit background style of the Query Tab." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:89 msgid "Save and remember the Query Tab size." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:95 msgid "PostgreSQL Fixes" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:97 msgid "Fixed PostgreSQL relationship table." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:98 msgid "Fixed wrong response message when handling non select queries." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:104 msgid "Bite-Size fixes" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:106 msgid "Removed unused libfixposix." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:107 msgid "Fixed pagination issue when clicking too fast while fetching big data." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:113 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:124 msgid "Bug fixes and improvements" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:115 msgid "Rewritten pagination to use LIMIT and OFFSET." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:116 msgid "Faster pagination and content viewing for big data." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:117 msgid "Show records count in table's list." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:118 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:151 msgid "Bug fixes and other improvements." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:126 msgid "Properly handle EXPLAIN SQL statement." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:127 msgid "Properly handle querying capitlized PostgreSQL tables." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:128 msgid "Improved async methods for internal views." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:129 msgid "Updated translations." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:135 msgid "Critical bug fix!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:137 msgid "CRITICAL: Fixes missing GSettings Schema, restore lost connections." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:138 msgid "Other small bug fixes and improvements." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:144 msgid "Implemented SSH tunneling" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:146 msgid "" "WARNING: This release packs many updates and something could break. Please, " "backup your connections." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:147 msgid "Connect via SSH to a remote Database." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:148 msgid "Major code refactor to handle UI updates via async methods." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:149 msgid "" "Use Stack container to show a loading Spinner during fetch or data " "processing methods." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:150 msgid "" "Major performance improvements to the table search and dropdown schema " "switcher." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:157 msgid "Fancy New Icon!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:159 msgid "New fancy Icon." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:160 msgid "Use GtkNativeDialog." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:161 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:171 msgid "Bug fixes and Improvements." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:167 msgid "Open SQLite files" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:169 msgid "Open SQLite files directly in Sequeler." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:170 msgid "Right click to copy data inside a column." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:177 msgid "UI Fixes and Performance Improvements" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:179 msgid "UI fix for logout button." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:180 msgid "View shortcuts on preferences dropdown." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:181 msgid "Performance Improvements." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:182 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:250 msgid "Italian translation." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:188 msgid "Export all the things!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:190 msgid "Export results from Query Tab." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:191 msgid "Export in CSV or Plain Text format." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:192 msgid "Sort Columns order everywhere." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:193 msgid "Brazilian translation." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:199 msgid "Here comes the power of Pagination!!!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:201 msgid "Paginate results in the Content tab." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:202 msgid "Query messages UI improvements." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:203 msgid "Relations table bug fixes." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:209 msgid "We got Multi SQL Query support." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:211 msgid "Ability to handle multiple SQL queries." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:212 msgid "Execute the currently highlighted query." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:213 msgid "Improved Library Popover UI." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:214 msgid "Use native GTK+ CSS attributes for better Light/Dark mode." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:215 msgid "Random UI improvements." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:221 msgid "Urgent! Fixed broken Tabs for translated version." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:226 msgid "Light and Dark Mode Switch!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:228 msgid "Better Dark/Light mode switch in header bar." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:229 msgid "Add Russian translation." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:230 msgid "Updated Welcome screen with New Window command." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:231 msgid "Code cleanup." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:237 msgid "Official Juno release!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:239 msgid "Missing filter name on SQLite File Dialog." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:245 msgid "We got Search!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:247 msgid "Search table names in sidebar." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:248 msgid "Fixes issue in connecting directly on a non saved connection." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:249 msgid "Updated Lithuanian translation." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:256 msgid "Improved Password Security." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:258 msgid "Safely store passwords in LibSecret." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:259 msgid "Auto upgrade on startup to remove passwords from GSettings." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:260 msgid "" "Fixes issues with identical table names from other database in the same " "connection." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:261 msgid "Alphabetically ordered tables." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:262 msgid "Improvements in showing MySql/MariaDB Table Structure." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:263 msgid "Many more bugs for you to discover." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:269 msgid "New Icon and Import/Export Library." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:271 msgid "Fancy new icon." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:272 msgid "Import and Export connections library." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:273 msgid "Fixed random crash when opening and closing multiple connections." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:274 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:280 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:292 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:315 msgid "Bug fixes and improvements." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:282 msgid "Fixed PostgreSQL Schema show options." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:283 msgid "" "Fixed crash on new connection dialog when opening the connection before " "saving." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:289 msgid "Little side dish update." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:291 msgid "Fixed save window state on close." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:298 msgid "Alternate coloured rows!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:300 msgid "Manually reload Content, Structure, and Relations." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:301 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:312 msgid "Show Table schema, content, and constraint relationships." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:302 msgid "Properly handle compound queries." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:303 msgid "Fix PostgreSQL table switch." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:309 msgid "Complete rewrite of the entire code base!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:311 msgid "Handle multiple Windows/Instances and multiple open connections." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:313 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:325 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:337 msgid "Quicker response on big select queries" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:314 msgid "Better error handling." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:321 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:333 msgid "Better error handling, less crashes!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:323 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:335 msgid "The app doesn't crash when dealing with big values" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:324 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:336 msgid "Handling errors related to columns" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:326 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:338 msgid "Some small clean up" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:327 msgid "Fixes issue with SQL Lite encrypted path" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:344 msgid "New Icon, Better error messages!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:346 msgid "New shiny icon" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:347 msgid "View SQL error message on error" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:348 msgid "FIX: Show proper PostgreSql Schema Table in Sidebar" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:349 msgid "Snappiest query execution ever for local databases" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:350 msgid "The usual bundle of bugs for you to discover" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:356 msgid "Summoning the power of async methods!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:358 msgid "All DataBase queries are now async methods, super fast." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:359 msgid "The UI doesn't freeze anymore during a long process" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:360 msgid "Granite SourceList to display list of tables" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:361 msgid "Tabs to switch between the Query Builder and the Table Structure" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:362 msgid "ComboBox to select table schemas from the open connection" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:363 msgid "Many more bugs and issues for you to have fun with" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:369 msgid "Bug Fixes and Improvements" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:371 msgid "Display Table lists for SQLite and PostgreSQL" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:372 msgid "Refresh Table List view if tables change" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:373 msgid "Removed unused GSettings" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:379 msgid "" "This is so good you won't believe it. New Library UI, Schema Table, Custom " "Port, and more" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:381 msgid "" "A brand new Library View directly in your home screen, super tight and " "organized" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:382 msgid "Custom Port field for those snazzy geeks who don't just use 3306" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:383 msgid "A shiny new Sidebar View to list all your DataBase Tables" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:384 msgid "Code cleanup and speed improvements" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:385 msgid "Usual abundance of bugs and issues for you to have fun with!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:391 msgid "Major Update: Releasing a sweet table to view Query Results!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:393 msgid "Did I say we got a sweet table to view query results?" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:394 msgid "New shortcut (ctrl+enter) to execute query" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:395 msgid "Solved bug while connecting to DB directly from the Connection Dialog" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:396 msgid "UI Improvements to Connection Dialog" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:397 msgid "Added Spanish and Lithuanian translations" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:403 msgid "UI fixes" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:405 msgid "Visual improvements to the library view" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:411 msgid "Initial Release" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:413 msgid "Store your Database connections" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:414 msgid "Quickly connect to a Local or Remote Database" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:415 msgid "Write SQL queries in the built-in code editor" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:437 msgid "Alessandro Castellani" msgstr "" sequeler-0.8.2/po/extra/fr.po000066400000000000000000000546161410464306200160720ustar00rootroot00000000000000# French translations for extra package. # Copyright (C) 2020 THE extra'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # NathanBnm, 2020. # msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-04-11 12:37+0200\n" "PO-Revision-Date: 2020-04-11 12:12+0200\n" "Last-Translator: NathanBnm\n" "Language-Team: none\n" "Language: fr\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" #: data/com.github.alecaddd.sequeler.desktop.in.in:3 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:7 msgid "Sequeler" msgstr "Sequeler" #: data/com.github.alecaddd.sequeler.desktop.in.in:4 msgid "Sequeler App" msgstr "Sequeler" #: data/com.github.alecaddd.sequeler.desktop.in.in:5 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:8 msgid "Friendly SQL Client" msgstr "Un simple client SQL" #: data/com.github.alecaddd.sequeler.desktop.in.in:9 msgid "@icon@" msgstr "@icon@" #: data/com.github.alecaddd.sequeler.desktop.in.in:12 msgid "SQL;MySql;Database;MariaDB;S3;PostgreSQL;" msgstr "SQL;MySql;Base de données;MariaDB;S3;PostgreSQL;" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:10 #, fuzzy msgid "Easily connect to your local or remote database" msgstr "Connectez-vous facilement à une base de données locale ou distante." #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:13 #, fuzzy msgid "" "Store your Database Connections in the library, connect over SSH tunnel, " "type and execute SQL commands directly in the app, and do everything you " "need to do without the necessity of opening the terminal." msgstr "" "Stockez vos connexions de base de données dans la bibliothèque intégrée, " "tapez et exécutez les commandes SQL directement dans l'application, et " "faites tout ce dont vous avez besoin pour vous passer la nécessité d'ouvrir " "le terminal." #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:16 msgid "Supported Databases:" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:20 msgid "SQLite" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:21 msgid "MySQL" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:22 msgid "MariaDB" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:23 msgid "PostgreSQL" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:25 msgid "Features Include:" msgstr "Fonctionnalités incluses :" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:29 #, fuzzy msgid "Test Connections before saving them" msgstr "Tester les connexions avant de les enregistrer" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:30 msgid "View Table structure, content, and relations" msgstr "Voir la structure, le contenu et les relations des tables" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:31 msgid "Write multiple custom SQL Queries" msgstr "Écrire plusieurs requêtes SQL personnalisées" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:32 msgid "Switch between light and dark mode" msgstr "Changer entre le thème clair et le thème sombre" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:33 #, fuzzy msgid "" "Handy keyboard shortcuts to quit (ctrl+q), create new connection (ctrl+shift" "+n), open a new window (ctrl+n)" msgstr "" "Raccourcis clavier pour quitter (Ctrl+Q), créer une nouvelle connexion(Ctrl" "+Maj+N), Ouvrir une nouvelle instance (Ctrl+N)" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:42 msgid "Query Tab Bonanza!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:44 msgid "Fix ORDER BY in PostgreSQL Relationship view." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:45 msgid "Improve MySQL structure view." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:46 msgid "Drop Granite.Settings in favor of GLib.Settings." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:47 msgid "Implement Granite.Notebook on the Query tab." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:48 msgid "Show query error messages inline." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:54 msgid "New features and improvements" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:56 #, fuzzy msgid "You can now duplicate connections." msgstr "Nombre total de connexions enregistrées." #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:57 msgid "" "Sorting columns now works as expected by actually running the ORDER BY query." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:58 msgid "" "Quickly jump to a specific result page with the handy dandy pagination " "popover." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:59 msgid "Show Comment Column inside table structure view." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:65 msgid "The 2020 release!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:67 #, fuzzy msgid "Manually reorder saved connection." msgstr "Nombre total de connexions enregistrées." #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:68 msgid "Allow selecting a custom SSH public key." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:69 msgid "Fix SSH tunnel crashes." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:75 msgid "Raw Query Improvements" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:77 msgid "Strip comments from SQL raw queries." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:78 msgid "Better handle complex queries on multiple lines." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:79 msgid "Speed up query rendering." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:85 msgid "Sweet Query Tab Improvements" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:87 msgid "Edit font size of the Query Tab." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:88 msgid "Edit background style of the Query Tab." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:89 msgid "Save and remember the Query Tab size." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:95 msgid "PostgreSQL Fixes" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:97 msgid "Fixed PostgreSQL relationship table." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:98 msgid "Fixed wrong response message when handling non select queries." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:104 msgid "Bite-Size fixes" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:106 msgid "Removed unused libfixposix." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:107 msgid "Fixed pagination issue when clicking too fast while fetching big data." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:113 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:124 msgid "Bug fixes and improvements" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:115 msgid "Rewritten pagination to use LIMIT and OFFSET." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:116 msgid "Faster pagination and content viewing for big data." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:117 msgid "Show records count in table's list." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:118 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:151 msgid "Bug fixes and other improvements." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:126 msgid "Properly handle EXPLAIN SQL statement." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:127 msgid "Properly handle querying capitlized PostgreSQL tables." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:128 msgid "Improved async methods for internal views." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:129 msgid "Updated translations." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:135 msgid "Critical bug fix!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:137 msgid "CRITICAL: Fixes missing GSettings Schema, restore lost connections." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:138 msgid "Other small bug fixes and improvements." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:144 msgid "Implemented SSH tunneling" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:146 msgid "" "WARNING: This release packs many updates and something could break. Please, " "backup your connections." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:147 #, fuzzy msgid "Connect via SSH to a remote Database." msgstr "Connectez-vous à une base de données locale ou distante." #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:148 msgid "Major code refactor to handle UI updates via async methods." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:149 msgid "" "Use Stack container to show a loading Spinner during fetch or data " "processing methods." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:150 msgid "" "Major performance improvements to the table search and dropdown schema " "switcher." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:157 msgid "Fancy New Icon!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:159 msgid "New fancy Icon." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:160 msgid "Use GtkNativeDialog." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:161 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:171 msgid "Bug fixes and Improvements." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:167 msgid "Open SQLite files" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:169 msgid "Open SQLite files directly in Sequeler." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:170 msgid "Right click to copy data inside a column." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:177 msgid "UI Fixes and Performance Improvements" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:179 msgid "UI fix for logout button." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:180 msgid "View shortcuts on preferences dropdown." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:181 msgid "Performance Improvements." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:182 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:250 msgid "Italian translation." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:188 #, fuzzy msgid "Export all the things!" msgstr "Exporter au format Texte" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:190 msgid "Export results from Query Tab." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:191 msgid "Export in CSV or Plain Text format." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:192 msgid "Sort Columns order everywhere." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:193 msgid "Brazilian translation." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:199 msgid "Here comes the power of Pagination!!!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:201 #, fuzzy msgid "Paginate results in the Content tab." msgstr "Nombre maximum de lignes à afficher dans l'onglet Contenu." #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:202 msgid "Query messages UI improvements." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:203 msgid "Relations table bug fixes." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:209 msgid "We got Multi SQL Query support." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:211 #, fuzzy msgid "Ability to handle multiple SQL queries." msgstr "Écrire plusieurs requêtes SQL personnalisées" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:212 msgid "Execute the currently highlighted query." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:213 msgid "Improved Library Popover UI." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:214 msgid "Use native GTK+ CSS attributes for better Light/Dark mode." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:215 msgid "Random UI improvements." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:221 msgid "Urgent! Fixed broken Tabs for translated version." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:226 msgid "Light and Dark Mode Switch!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:228 msgid "Better Dark/Light mode switch in header bar." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:229 msgid "Add Russian translation." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:230 msgid "Updated Welcome screen with New Window command." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:231 msgid "Code cleanup." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:237 msgid "Official Juno release!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:239 msgid "Missing filter name on SQLite File Dialog." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:245 msgid "We got Search!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:247 msgid "Search table names in sidebar." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:248 msgid "Fixes issue in connecting directly on a non saved connection." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:249 msgid "Updated Lithuanian translation." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:256 msgid "Improved Password Security." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:258 msgid "Safely store passwords in LibSecret." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:259 msgid "Auto upgrade on startup to remove passwords from GSettings." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:260 msgid "" "Fixes issues with identical table names from other database in the same " "connection." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:261 msgid "Alphabetically ordered tables." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:262 msgid "Improvements in showing MySql/MariaDB Table Structure." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:263 msgid "Many more bugs for you to discover." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:269 #, fuzzy msgid "New Icon and Import/Export Library." msgstr "Impossible d'importer la bibliothèque " #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:271 msgid "Fancy new icon." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:272 #, fuzzy msgid "Import and Export connections library." msgstr "Importer des connexions" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:273 msgid "Fixed random crash when opening and closing multiple connections." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:274 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:280 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:292 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:315 msgid "Bug fixes and improvements." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:282 msgid "Fixed PostgreSQL Schema show options." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:283 msgid "" "Fixed crash on new connection dialog when opening the connection before " "saving." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:289 msgid "Little side dish update." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:291 msgid "Fixed save window state on close." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:298 msgid "Alternate coloured rows!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:300 msgid "Manually reload Content, Structure, and Relations." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:301 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:312 #, fuzzy msgid "Show Table schema, content, and constraint relationships." msgstr "Voir la structure, le contenu et les relations des tables" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:302 msgid "Properly handle compound queries." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:303 msgid "Fix PostgreSQL table switch." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:309 msgid "Complete rewrite of the entire code base!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:311 msgid "Handle multiple Windows/Instances and multiple open connections." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:313 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:325 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:337 msgid "Quicker response on big select queries" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:314 msgid "Better error handling." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:321 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:333 msgid "Better error handling, less crashes!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:323 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:335 msgid "The app doesn't crash when dealing with big values" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:324 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:336 msgid "Handling errors related to columns" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:326 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:338 msgid "Some small clean up" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:327 msgid "Fixes issue with SQL Lite encrypted path" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:344 msgid "New Icon, Better error messages!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:346 msgid "New shiny icon" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:347 msgid "View SQL error message on error" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:348 msgid "FIX: Show proper PostgreSql Schema Table in Sidebar" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:349 msgid "Snappiest query execution ever for local databases" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:350 msgid "The usual bundle of bugs for you to discover" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:356 msgid "Summoning the power of async methods!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:358 msgid "All DataBase queries are now async methods, super fast." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:359 msgid "The UI doesn't freeze anymore during a long process" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:360 msgid "Granite SourceList to display list of tables" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:361 msgid "Tabs to switch between the Query Builder and the Table Structure" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:362 msgid "ComboBox to select table schemas from the open connection" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:363 msgid "Many more bugs and issues for you to have fun with" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:369 msgid "Bug Fixes and Improvements" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:371 msgid "Display Table lists for SQLite and PostgreSQL" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:372 msgid "Refresh Table List view if tables change" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:373 msgid "Removed unused GSettings" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:379 msgid "" "This is so good you won't believe it. New Library UI, Schema Table, Custom " "Port, and more" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:381 msgid "" "A brand new Library View directly in your home screen, super tight and " "organized" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:382 msgid "Custom Port field for those snazzy geeks who don't just use 3306" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:383 msgid "A shiny new Sidebar View to list all your DataBase Tables" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:384 msgid "Code cleanup and speed improvements" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:385 msgid "Usual abundance of bugs and issues for you to have fun with!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:391 msgid "Major Update: Releasing a sweet table to view Query Results!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:393 msgid "Did I say we got a sweet table to view query results?" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:394 msgid "New shortcut (ctrl+enter) to execute query" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:395 msgid "Solved bug while connecting to DB directly from the Connection Dialog" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:396 msgid "UI Improvements to Connection Dialog" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:397 msgid "Added Spanish and Lithuanian translations" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:403 msgid "UI fixes" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:405 msgid "Visual improvements to the library view" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:411 msgid "Initial Release" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:413 msgid "Store your Database connections" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:414 #, fuzzy msgid "Quickly connect to a Local or Remote Database" msgstr "Connectez-vous à une base de données locale ou distante." #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:415 msgid "Write SQL queries in the built-in code editor" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:437 msgid "Alessandro Castellani" msgstr "Alessandro Castellani" sequeler-0.8.2/po/extra/lt.po000066400000000000000000000546071410464306200161020ustar00rootroot00000000000000# Lithuanian translations for extra package. # Copyright (C) 2020 THE extra'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # Moo, 2020. # msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-04-11 12:37+0200\n" "PO-Revision-Date: 2020-04-11 12:12+0200\n" "Last-Translator: Moo\n" "Language-Team: none\n" "Language: lt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" "%100<10 || n%100>=20) ? 1 : 2);\n" #: data/com.github.alecaddd.sequeler.desktop.in.in:3 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:7 msgid "Sequeler" msgstr "Sequeler" #: data/com.github.alecaddd.sequeler.desktop.in.in:4 msgid "Sequeler App" msgstr "Sequeler programa" #: data/com.github.alecaddd.sequeler.desktop.in.in:5 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:8 msgid "Friendly SQL Client" msgstr "DraugiÅ¡ka SQL kliento programa" #: data/com.github.alecaddd.sequeler.desktop.in.in:9 msgid "@icon@" msgstr "@icon@" #: data/com.github.alecaddd.sequeler.desktop.in.in:12 msgid "SQL;MySql;Database;MariaDB;S3;PostgreSQL;" msgstr "SQL;MySql;Database;MariaDB;S3;PostgreSQL;" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:10 msgid "Easily connect to your local or remote database" msgstr "" "Lengvai prisijunkite prie bet kurios vietinÄ—s ar nuotolinÄ—s duomenų bazÄ—s" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:13 #, fuzzy msgid "" "Store your Database Connections in the library, connect over SSH tunnel, " "type and execute SQL commands directly in the app, and do everything you " "need to do without the necessity of opening the terminal." msgstr "" "Laikykite savo duomenų bazių ryÅ¡ius įtaisytoje bibliotekoje, tiesiogiai " "programoje raÅ¡ykite ir vykdykite SQL komandas ir atlikite viskÄ…, kÄ… reikia " "be bÅ«tinybÄ—s atverti terminalÄ…." #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:16 msgid "Supported Databases:" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:20 msgid "SQLite" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:21 msgid "MySQL" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:22 msgid "MariaDB" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:23 msgid "PostgreSQL" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:25 msgid "Features Include:" msgstr "YpatybÄ—s:" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:29 msgid "Test Connections before saving them" msgstr "PrieÅ¡ įraÅ¡ant ryÅ¡ius, juos iÅ¡bandyti" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:30 msgid "View Table structure, content, and relations" msgstr "Rodyti lentelÄ—s struktÅ«rÄ…, turinį ir sÄ…sajos ryÅ¡ius" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:31 msgid "Write multiple custom SQL Queries" msgstr "RaÅ¡yti keletÄ… tinkintų SQL užklausų" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:32 msgid "Switch between light and dark mode" msgstr "Perjungti tarp Å¡viesios ir tamsios veiksenos" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:33 #, fuzzy msgid "" "Handy keyboard shortcuts to quit (ctrl+q), create new connection (ctrl+shift" "+n), open a new window (ctrl+n)" msgstr "" "PatogÅ«s klaviatÅ«ros susiejimai, norint iÅ¡eiti (ctrl (vald)+q), sukurti naujÄ… " "ryšį (ctrl (vald)+shift (lyg2)+n), keli egzemplioriai (ctrl (vald)+n)" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:42 msgid "Query Tab Bonanza!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:44 msgid "Fix ORDER BY in PostgreSQL Relationship view." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:45 msgid "Improve MySQL structure view." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:46 msgid "Drop Granite.Settings in favor of GLib.Settings." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:47 msgid "Implement Granite.Notebook on the Query tab." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:48 msgid "Show query error messages inline." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:54 msgid "New features and improvements" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:56 #, fuzzy msgid "You can now duplicate connections." msgstr "Bendras įraÅ¡ytų ryÅ¡ių skaiÄius." #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:57 msgid "" "Sorting columns now works as expected by actually running the ORDER BY query." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:58 msgid "" "Quickly jump to a specific result page with the handy dandy pagination " "popover." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:59 msgid "Show Comment Column inside table structure view." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:65 msgid "The 2020 release!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:67 #, fuzzy msgid "Manually reorder saved connection." msgstr "Bendras įraÅ¡ytų ryÅ¡ių skaiÄius." #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:68 msgid "Allow selecting a custom SSH public key." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:69 msgid "Fix SSH tunnel crashes." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:75 msgid "Raw Query Improvements" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:77 msgid "Strip comments from SQL raw queries." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:78 msgid "Better handle complex queries on multiple lines." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:79 msgid "Speed up query rendering." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:85 msgid "Sweet Query Tab Improvements" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:87 msgid "Edit font size of the Query Tab." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:88 msgid "Edit background style of the Query Tab." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:89 msgid "Save and remember the Query Tab size." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:95 msgid "PostgreSQL Fixes" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:97 msgid "Fixed PostgreSQL relationship table." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:98 msgid "Fixed wrong response message when handling non select queries." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:104 msgid "Bite-Size fixes" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:106 msgid "Removed unused libfixposix." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:107 msgid "Fixed pagination issue when clicking too fast while fetching big data." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:113 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:124 msgid "Bug fixes and improvements" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:115 msgid "Rewritten pagination to use LIMIT and OFFSET." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:116 msgid "Faster pagination and content viewing for big data." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:117 msgid "Show records count in table's list." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:118 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:151 msgid "Bug fixes and other improvements." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:126 msgid "Properly handle EXPLAIN SQL statement." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:127 msgid "Properly handle querying capitlized PostgreSQL tables." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:128 msgid "Improved async methods for internal views." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:129 msgid "Updated translations." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:135 msgid "Critical bug fix!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:137 msgid "CRITICAL: Fixes missing GSettings Schema, restore lost connections." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:138 msgid "Other small bug fixes and improvements." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:144 msgid "Implemented SSH tunneling" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:146 msgid "" "WARNING: This release packs many updates and something could break. Please, " "backup your connections." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:147 #, fuzzy msgid "Connect via SSH to a remote Database." msgstr "Prisijunkite prie bet kurios vietinÄ—s ar nuotolinÄ—s duomenų bazÄ—s." #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:148 msgid "Major code refactor to handle UI updates via async methods." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:149 msgid "" "Use Stack container to show a loading Spinner during fetch or data " "processing methods." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:150 msgid "" "Major performance improvements to the table search and dropdown schema " "switcher." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:157 msgid "Fancy New Icon!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:159 msgid "New fancy Icon." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:160 msgid "Use GtkNativeDialog." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:161 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:171 msgid "Bug fixes and Improvements." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:167 msgid "Open SQLite files" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:169 msgid "Open SQLite files directly in Sequeler." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:170 msgid "Right click to copy data inside a column." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:177 msgid "UI Fixes and Performance Improvements" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:179 msgid "UI fix for logout button." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:180 msgid "View shortcuts on preferences dropdown." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:181 msgid "Performance Improvements." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:182 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:250 msgid "Italian translation." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:188 #, fuzzy msgid "Export all the things!" msgstr "Eksportuoti kaip tekstÄ…" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:190 msgid "Export results from Query Tab." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:191 msgid "Export in CSV or Plain Text format." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:192 msgid "Sort Columns order everywhere." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:193 msgid "Brazilian translation." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:199 msgid "Here comes the power of Pagination!!!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:201 #, fuzzy msgid "Paginate results in the Content tab." msgstr "Daugiausiai turinio kortelÄ—je rodoma eiluÄių." #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:202 msgid "Query messages UI improvements." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:203 msgid "Relations table bug fixes." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:209 msgid "We got Multi SQL Query support." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:211 #, fuzzy msgid "Ability to handle multiple SQL queries." msgstr "RaÅ¡yti keletÄ… tinkintų SQL užklausų" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:212 msgid "Execute the currently highlighted query." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:213 msgid "Improved Library Popover UI." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:214 msgid "Use native GTK+ CSS attributes for better Light/Dark mode." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:215 msgid "Random UI improvements." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:221 msgid "Urgent! Fixed broken Tabs for translated version." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:226 msgid "Light and Dark Mode Switch!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:228 msgid "Better Dark/Light mode switch in header bar." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:229 msgid "Add Russian translation." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:230 msgid "Updated Welcome screen with New Window command." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:231 msgid "Code cleanup." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:237 msgid "Official Juno release!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:239 msgid "Missing filter name on SQLite File Dialog." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:245 msgid "We got Search!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:247 msgid "Search table names in sidebar." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:248 msgid "Fixes issue in connecting directly on a non saved connection." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:249 msgid "Updated Lithuanian translation." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:256 msgid "Improved Password Security." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:258 msgid "Safely store passwords in LibSecret." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:259 msgid "Auto upgrade on startup to remove passwords from GSettings." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:260 msgid "" "Fixes issues with identical table names from other database in the same " "connection." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:261 msgid "Alphabetically ordered tables." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:262 msgid "Improvements in showing MySql/MariaDB Table Structure." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:263 msgid "Many more bugs for you to discover." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:269 #, fuzzy msgid "New Icon and Import/Export Library." msgstr "Nepavyko importuoti bibliotekos " #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:271 msgid "Fancy new icon." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:272 #, fuzzy msgid "Import and Export connections library." msgstr "Importuoti ryÅ¡ius" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:273 msgid "Fixed random crash when opening and closing multiple connections." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:274 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:280 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:292 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:315 msgid "Bug fixes and improvements." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:282 msgid "Fixed PostgreSQL Schema show options." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:283 msgid "" "Fixed crash on new connection dialog when opening the connection before " "saving." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:289 msgid "Little side dish update." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:291 msgid "Fixed save window state on close." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:298 msgid "Alternate coloured rows!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:300 msgid "Manually reload Content, Structure, and Relations." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:301 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:312 #, fuzzy msgid "Show Table schema, content, and constraint relationships." msgstr "Rodyti lentelÄ—s struktÅ«rÄ…, turinį ir sÄ…sajos ryÅ¡ius" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:302 msgid "Properly handle compound queries." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:303 msgid "Fix PostgreSQL table switch." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:309 msgid "Complete rewrite of the entire code base!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:311 msgid "Handle multiple Windows/Instances and multiple open connections." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:313 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:325 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:337 msgid "Quicker response on big select queries" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:314 msgid "Better error handling." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:321 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:333 msgid "Better error handling, less crashes!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:323 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:335 msgid "The app doesn't crash when dealing with big values" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:324 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:336 msgid "Handling errors related to columns" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:326 #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:338 msgid "Some small clean up" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:327 msgid "Fixes issue with SQL Lite encrypted path" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:344 msgid "New Icon, Better error messages!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:346 msgid "New shiny icon" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:347 msgid "View SQL error message on error" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:348 msgid "FIX: Show proper PostgreSql Schema Table in Sidebar" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:349 msgid "Snappiest query execution ever for local databases" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:350 msgid "The usual bundle of bugs for you to discover" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:356 msgid "Summoning the power of async methods!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:358 msgid "All DataBase queries are now async methods, super fast." msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:359 msgid "The UI doesn't freeze anymore during a long process" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:360 msgid "Granite SourceList to display list of tables" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:361 msgid "Tabs to switch between the Query Builder and the Table Structure" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:362 msgid "ComboBox to select table schemas from the open connection" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:363 msgid "Many more bugs and issues for you to have fun with" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:369 msgid "Bug Fixes and Improvements" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:371 msgid "Display Table lists for SQLite and PostgreSQL" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:372 msgid "Refresh Table List view if tables change" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:373 msgid "Removed unused GSettings" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:379 msgid "" "This is so good you won't believe it. New Library UI, Schema Table, Custom " "Port, and more" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:381 msgid "" "A brand new Library View directly in your home screen, super tight and " "organized" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:382 msgid "Custom Port field for those snazzy geeks who don't just use 3306" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:383 msgid "A shiny new Sidebar View to list all your DataBase Tables" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:384 msgid "Code cleanup and speed improvements" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:385 msgid "Usual abundance of bugs and issues for you to have fun with!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:391 msgid "Major Update: Releasing a sweet table to view Query Results!" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:393 msgid "Did I say we got a sweet table to view query results?" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:394 msgid "New shortcut (ctrl+enter) to execute query" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:395 msgid "Solved bug while connecting to DB directly from the Connection Dialog" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:396 msgid "UI Improvements to Connection Dialog" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:397 msgid "Added Spanish and Lithuanian translations" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:403 msgid "UI fixes" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:405 msgid "Visual improvements to the library view" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:411 msgid "Initial Release" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:413 msgid "Store your Database connections" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:414 #, fuzzy msgid "Quickly connect to a Local or Remote Database" msgstr "Prisijunkite prie bet kurios vietinÄ—s ar nuotolinÄ—s duomenų bazÄ—s." #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:415 msgid "Write SQL queries in the built-in code editor" msgstr "" #: data/com.github.alecaddd.sequeler.appdata.xml.in.in:437 msgid "Alessandro Castellani" msgstr "Alessandro Castellani" sequeler-0.8.2/po/extra/meson.build000066400000000000000000000002101410464306200172420ustar00rootroot00000000000000i18n.gettext('extra', args: [ '--directory=' + meson.source_root(), '--from-code=UTF-8' ], install: false ) sequeler-0.8.2/po/fr.po000066400000000000000000000366311410464306200147440ustar00rootroot00000000000000# French translations for com.github.alecaddd.sequeler package. # Copyright (C) 2020 THE com.github.alecaddd.sequeler'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.alecaddd.sequeler package. # NathanBnm, 2020. # msgid "" msgstr "" "Project-Id-Version: com.github.alecaddd.sequeler\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-04-11 12:37+0200\n" "PO-Revision-Date: 2020-06-22 03:41+0000\n" "Last-Translator: J. Lavoie \n" "Language-Team: French \n" "Language: fr\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: Weblate 4.2-dev\n" #: src/Application.vala:62 msgid "Directories are not supported" msgstr "Les dossiers ne sont pas pris en charge" #: src/Application.vala:68 msgid "Don't know what to do" msgstr "Qu'est-ce qu'il s'est passé ?" #: src/Application.vala:80 msgid "Something completely unexpected happened" msgstr "Quelque chose de complètement inattendu est survenu" #: src/Layouts/HeaderBar.vala:46 src/Layouts/HeaderBar.vala:53 msgid "Logout" msgstr "Déconnexion" #: src/Layouts/HeaderBar.vala:56 msgid "Light background" msgstr "Thème clair" #: src/Layouts/HeaderBar.vala:57 msgid "Dark background" msgstr "Thème sombre" #: src/Layouts/HeaderBar.vala:68 src/Layouts/Welcome.vala:39 msgid "New Window" msgstr "Nouvelle fenêtre" #: src/Layouts/HeaderBar.vala:71 src/Widgets/ConnectionDialog.vala:130 #: src/Widgets/ConnectionDialog.vala:165 msgid "New Connection" msgstr "Nouvelle connexion" #: src/Layouts/HeaderBar.vala:74 msgid "Quit" msgstr "Quitter" #: src/Layouts/HeaderBar.vala:94 msgid "Menu" msgstr "Menu" #: src/Layouts/Main.vala:77 #, c-format msgid "Connected to %s" msgstr "Connecté à %s" #: src/Layouts/Library.vala:65 msgid "SAVED CONNECTIONS" msgstr "CONNEXIONS SAUVEGARDÉES" #: src/Layouts/Library.vala:74 msgid "Delete All" msgstr "Tout supprimer" #: src/Layouts/Library.vala:81 msgid "Reload Library" msgstr "Recharger la bibliothèque" #: src/Layouts/Library.vala:84 msgid "Export Library" msgstr "Exporter la bibliothèque" #: src/Layouts/Library.vala:215 src/Layouts/Library.vala:233 msgid "Are you sure you want to proceed?" msgstr "Êtes-vous sûr·e de vouloir continuer ?" #: src/Layouts/Library.vala:215 msgid "By deleting this connection you won’t be able to recover this data." msgstr "" "En supprimant cette connexion, vous ne pourrez pas récupérer ces données." #: src/Layouts/Library.vala:218 msgid "Yes, Delete!" msgstr "Oui, supprimer !" #: src/Layouts/Library.vala:233 msgid "All the data will be deleted and you won’t be able to recover it." msgstr "" "Toutes les données seront supprimées et vous ne pourrez pas les récupérer." #: src/Layouts/Library.vala:236 msgid "Yes, Delete All!" msgstr "Oui, tout supprimer !" #: src/Layouts/Library.vala:330 src/Widgets/ConnectionDialog.vala:575 #: src/Widgets/ConnectionDialog.vala:596 msgid "A username is required in order to connect!" msgstr "Un nom d'utilisateur est nécessaire pour pouvoir se connecter !" #: src/Layouts/Library.vala:404 src/Layouts/Views/Query.vala:528 msgid "Pick a file" msgstr "Choisissez un fichier" #: src/Layouts/Library.vala:407 src/Layouts/Views/Query.vala:531 msgid "_Save" msgstr "_Enregistrer" #: src/Layouts/Library.vala:408 src/Layouts/Welcome.vala:62 #: src/Layouts/Views/Query.vala:532 msgid "_Cancel" msgstr "_Annuler" #: src/Layouts/Library.vala:467 #, c-format msgid "Unable to Connect to %s" msgstr "Impossible de se connecter à %s" #: src/Layouts/Library.vala:480 msgid "Unable to Export Library " msgstr "Impossible d'exporter la bibliothèque " #: src/Layouts/Welcome.vala:28 msgid "Welcome to Sequeler" msgstr "Bienvenue dans Sequeler" #: src/Layouts/Welcome.vala:29 msgid "Connect to Any Local or Remote Database." msgstr "Connectez-vous à une base de données locale ou distante." #: src/Layouts/Welcome.vala:38 msgid "Add a New Database" msgstr "Ajouter une nouvelle base de données" #: src/Layouts/Welcome.vala:38 msgid "Connect to a Database and Save It in Your Library" msgstr "" "Connectez-vous à une base de données et enregistrez-la dans votre " "bibliothèque" #: src/Layouts/Welcome.vala:39 msgid "Open a New Sequeler Window" msgstr "Ouvrir une nouvelle fenêtre de Sequeler" #: src/Layouts/Welcome.vala:40 msgid "Import Connections" msgstr "Importer des connexions" #: src/Layouts/Welcome.vala:40 msgid "Import Previously Exported Sequeler Connections" msgstr "Importer des connexions de Sequeler précédemment exportées" #: src/Layouts/Welcome.vala:58 msgid "Select a file" msgstr "Sélectionner un fichier" #: src/Layouts/Welcome.vala:61 msgid "_Open" msgstr "_Ouvrir" #: src/Layouts/Welcome.vala:107 msgid "Unable to Import Library " msgstr "Impossible d'importer la bibliothèque " #: src/Layouts/DataBaseSchema.vala:66 src/Layouts/DataBaseSchema.vala:167 msgid "- Select Database -" msgstr "- Sélectionner une base de données -" #: src/Layouts/DataBaseSchema.vala:87 msgid "Search Tables" msgstr "Rechercher des tables" #: src/Layouts/DataBaseSchema.vala:98 msgid "Search Tables…" msgstr "Rechercher des tables…" #: src/Layouts/DataBaseSchema.vala:120 msgid "Reload Tables" msgstr "Recharger les tables" #: src/Layouts/DataBaseSchema.vala:125 msgid "Add Table" msgstr "Ajouter une table" #: src/Layouts/DataBaseSchema.vala:289 msgid "TABLES" msgstr "TABLES" #: src/Layouts/DataBaseView.vala:49 msgid "Structure" msgstr "Structure" #: src/Layouts/DataBaseView.vala:50 msgid "Content" msgstr "Contenu" #: src/Layouts/DataBaseView.vala:51 msgid "Relations" msgstr "Relations" #: src/Layouts/DataBaseView.vala:52 src/Layouts/DataBaseView.vala:229 #: src/Layouts/DataBaseView.vala:253 msgid "Query" msgstr "Requête" #: src/Layouts/DataBaseView.vala:101 msgid "Zoom Out" msgstr "Zoom arrière" #: src/Layouts/DataBaseView.vala:107 msgid "Zoom 1:1" msgstr "Zoom 1:1" #: src/Layouts/DataBaseView.vala:111 msgid "Zoom In" msgstr "Zoom avant" #: src/Layouts/DataBaseView.vala:124 msgid "High Contrast" msgstr "Contraste élevé" #: src/Layouts/DataBaseView.vala:132 msgid "Solarized Light" msgstr "Solarisé clair" #: src/Layouts/DataBaseView.vala:140 msgid "Solarized Dark" msgstr "Solarisé sombre" #: src/Layouts/DataBaseView.vala:163 msgid "Change Text Style" msgstr "Modifier l'apparence du texte" #: src/Layouts/DataBaseView.vala:222 msgid "Create a new Query Tab" msgstr "Créer un nouvel onglet de requête" #: src/Layouts/DataBaseView.vala:240 #, c-format msgid "Query %i" msgstr "Requête %i" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select Table" msgstr "Sélectionner une table" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select a table from the left sidebar to activate this view." msgstr "" "Sélectionnez une table dans la barre latérale de gauche pour activer cette " "vue." #: src/Layouts/Views/Structure.vala:107 src/Layouts/Views/Structure.vala:145 #: src/Layouts/Views/Content.vala:179 src/Layouts/Views/Content.vala:218 #: src/Layouts/Views/Relations.vala:106 src/Layouts/Views/Relations.vala:144 #: src/Layouts/Views/Query.vala:323 msgid "No Results Available" msgstr "Aucun résultat disponible" #: src/Layouts/Views/Structure.vala:118 src/Layouts/Views/Content.vala:191 #: src/Layouts/Views/Relations.vala:117 msgid "Reload Results" msgstr "Recharger les résultats" #: src/Layouts/Views/Structure.vala:197 msgid " Fields" msgstr " Champs" #: src/Layouts/Views/Content.vala:121 msgid "Previous Page" msgstr "Page précédente" #: src/Layouts/Views/Content.vala:126 msgid "Next Page" msgstr "Page suivante" #: src/Layouts/Views/Content.vala:131 #, c-format msgid "%d Pages" msgstr "%d pages" #: src/Layouts/Views/Content.vala:134 msgid "Jump to page…" msgstr "Aller à la page…" #: src/Layouts/Views/Content.vala:165 msgid "1 Page" msgstr "1 page" #: src/Layouts/Views/Content.vala:171 #, c-format msgid "%d of %d Pages" msgstr "%d pages sur %d" #: src/Layouts/Views/Content.vala:275 #, c-format msgid "%d Entries" msgstr "%d entrées" #: src/Layouts/Views/Relations.vala:197 msgid " Constraints" msgstr " Contraintes" #: src/Layouts/Views/Query.vala:279 msgid "Running Query…" msgstr "Exécution de la requête…" #: src/Layouts/Views/Query.vala:295 src/Layouts/Views/Query.vala:304 msgid "Run Query" msgstr "Exécuter la requête" #: src/Layouts/Views/Query.vala:356 msgid "Export Results" msgstr "Exporter les résultats" #: src/Layouts/Views/Query.vala:369 msgid "Export as CSV" msgstr "Exporter au format CSV" #: src/Layouts/Views/Query.vala:377 msgid "Export as Text" msgstr "Exporter au format Texte" #: src/Layouts/Views/Query.vala:436 src/Layouts/Views/Query.vala:482 msgid "Unable to process Query!" msgstr "Impossible de traiter la requête !" #: src/Layouts/Views/Query.vala:457 #, c-format msgid "%d Total Results" msgstr "%d résultats au total" #: src/Layouts/Views/Query.vala:492 #, c-format msgid "Query Successfully Executed! Rows Affected: %s" msgstr "Requête exécutée avec succès ! Lignes affectées : %s" #: src/Layouts/Views/Query.vala:495 msgid "Query Executed!" msgstr "Requête exécutée !" #: src/Partials/LibraryItem.vala:107 src/Widgets/ConnectionDialog.vala:431 msgid "Connect" msgstr "Se connecter" #: src/Partials/LibraryItem.vala:110 msgid "Edit Connection" msgstr "Modifier la connexion" #: src/Partials/LibraryItem.vala:113 msgid "Duplicate Connection" msgstr "Dupliquer la connexion" #: src/Partials/LibraryItem.vala:116 msgid "Delete Connection" msgstr "Supprimer la connexion" #: src/Partials/LibraryItem.vala:126 msgid "Options" msgstr "Options" #: src/Partials/TreeBuilder.vala:131 msgid "Error" msgstr "Erreur" #: src/Partials/TreeBuilder.vala:131 msgid "on Column" msgstr "sur la colonne" #: src/Partials/TreeBuilder.vala:172 #, c-format msgid "Copy %s" msgstr "Copier %s" #: src/Services/Settings.vala:106 #, c-format msgid "%s (copy)" msgstr "%s (copie)" #: src/Services/ConnectionManager.vala:193 #, c-format msgid "Libssh2 initialization failed (%d)" msgstr "L'initialisation de libssh2 à échoué (%d)" #: src/Services/ConnectionManager.vala:202 msgid "Failed to open socket" msgstr "Échec de l'ouverture du socket" #: src/Services/ConnectionManager.vala:211 msgid "Failed to connect!" msgstr "Échec de la connexion !" #: src/Services/ConnectionManager.vala:223 #, c-format msgid "Error when starting up SSH session: %d" msgstr "Erreur lors du lancement de la session SSH : %d" #: src/Services/ConnectionManager.vala:242 msgid "Authentication by password failed!" msgstr "Échec de l'authentification par mot de passe !" #: src/Services/ConnectionManager.vala:252 msgid "Authentication by public key failed!" msgstr "Échec de l'authentification par clé publique !" #: src/Services/ConnectionManager.vala:259 msgid "No supported authentication methods found!" msgstr "Aucune méthode d'authentification pris en charge trouvée !" #: src/Services/ConnectionManager.vala:266 msgid "Failed to open listen socket" msgstr "Échec de l'ouverture de la liste des sockets" #: src/Services/ConnectionManager.vala:281 msgid "Failed to bind. Your Database Port may be wrong!" msgstr "Échec de la liaison. Votre port de connexion peut être incorrect !" #: src/Services/ConnectionManager.vala:287 msgid "Failed to listen!" msgstr "Échec de la récupération !" #: src/Services/ConnectionManager.vala:314 msgid "Failed to accept remote connection!" msgstr "Échec d'autorisation de la connexion distante !" #: src/Services/ConnectionManager.vala:323 msgid "" "Could not open the direct-tcpip channel! (Note that this can be a problem at " "the server! Please review the server logs.)" msgstr "" "Impossible d'ouvrir le canal direct-tcpip ! (Notez que cela peut être un " "problème lié au serveur ! Veuillez consulter les journaux du serveur.)" #: src/Services/ConnectionManager.vala:566 msgid "Error!" msgstr "Erreur !" #: src/Widgets/ConnectionDialog.vala:33 msgid "Missing SSH Key file!" msgstr "Fichier de clé SSH manquant !" #: src/Widgets/ConnectionDialog.vala:34 msgid "Missing SSH public key!" msgstr "Fichier de clé SSH publique manquant !" #: src/Widgets/ConnectionDialog.vala:89 src/Widgets/ConnectionDialog.vala:355 msgid "Connection" msgstr "Connexion" #: src/Widgets/ConnectionDialog.vala:141 msgid "Select connection color" msgstr "Sélectionner la couleur de la connexion" #: src/Widgets/ConnectionDialog.vala:164 msgid "Connection Name:" msgstr "Nom de la connexion :" #: src/Widgets/ConnectionDialog.vala:165 msgid "Connection's name" msgstr "Nom de la connexion" #: src/Widgets/ConnectionDialog.vala:172 msgid "Database Type:" msgstr "Type de base de données :" #: src/Widgets/ConnectionDialog.vala:194 msgid "Host:" msgstr "Hôte :" #: src/Widgets/ConnectionDialog.vala:200 msgid "Database Name:" msgstr "Nom de la base de données :" #: src/Widgets/ConnectionDialog.vala:207 msgid "Username:" msgstr "Nom d'utilisateur :" #: src/Widgets/ConnectionDialog.vala:213 msgid "Password:" msgstr "Mot de passe :" #: src/Widgets/ConnectionDialog.vala:217 src/Widgets/ConnectionDialog.vala:227 #: src/Widgets/ConnectionDialog.vala:285 src/Widgets/ConnectionDialog.vala:295 msgid "Show password" msgstr "Afficher le mot de passe" #: src/Widgets/ConnectionDialog.vala:224 src/Widgets/ConnectionDialog.vala:292 msgid "Hide password" msgstr "Masquer le mot de passe" #: src/Widgets/ConnectionDialog.vala:234 msgid "Port:" msgstr "Port :" #: src/Widgets/ConnectionDialog.vala:240 msgid "File Path:" msgstr "Chemin du fichier :" #: src/Widgets/ConnectionDialog.vala:241 msgid "Select Your SQLite File…" msgstr "Sélectionnez votre fichier SQLite…" #: src/Widgets/ConnectionDialog.vala:261 msgid "Connect via SSH Tunnel:" msgstr "Se connecter via un tunnel SSH :" #: src/Widgets/ConnectionDialog.vala:271 msgid "SSH Host:" msgstr "Hôte SSH :" #: src/Widgets/ConnectionDialog.vala:276 msgid "SSH Username:" msgstr "Nom d'utilisateur SSH :" #: src/Widgets/ConnectionDialog.vala:281 msgid "SSH Password:" msgstr "Mot de passe SSH :" #: src/Widgets/ConnectionDialog.vala:301 msgid "SSH Port:" msgstr "Port SSH :" #: src/Widgets/ConnectionDialog.vala:302 msgid "Optional" msgstr "Facultatif" #: src/Widgets/ConnectionDialog.vala:306 msgid "SSH Identity" msgstr "Identité SSH" #: src/Widgets/ConnectionDialog.vala:308 msgid "Select Your Identity File…" msgstr "Sélectionnez votre fichier d'identité…" #: src/Widgets/ConnectionDialog.vala:324 msgid "Generate SSH Key" msgstr "Générer une clé SSH" #: src/Widgets/ConnectionDialog.vala:356 msgid "SSH Tunnel" msgstr "Tunnel SSH" #: src/Widgets/ConnectionDialog.vala:426 msgid "Close" msgstr "Fermer" #: src/Widgets/ConnectionDialog.vala:427 msgid "Save Connection" msgstr "Enregistrer la connexion" #: src/Widgets/ConnectionDialog.vala:429 msgid "Test Connection" msgstr "Tester la connexion" #: src/Widgets/ConnectionDialog.vala:620 msgid "Opening SSH Tunnel…" msgstr "Ouverture du tunnel SSH…" #: src/Widgets/ConnectionDialog.vala:650 msgid "Testing Connection…" msgstr "Test de connexion…" #: src/Widgets/ConnectionDialog.vala:661 msgid "Successfully Connected!" msgstr "Connexion établie !" #: src/Widgets/ConnectionDialog.vala:679 msgid "Saving Connection…" msgstr "Enregistrement de la connexion…" #: src/Widgets/ConnectionDialog.vala:684 msgid "Connection Saved!" msgstr "Connexion enregistrée !" #: src/Widgets/ConnectionDialog.vala:692 msgid "Connecting…" msgstr "Connexion en cours…" sequeler-0.8.2/po/hi.po000066400000000000000000000454601410464306200147350ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.alecaddd.sequeler package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: com.github.alecaddd.sequeler\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-04-11 12:37+0200\n" "PO-Revision-Date: 2020-04-27 09:11+0000\n" "Last-Translator: abhishek maurya \n" "Language-Team: Hindi \n" "Language: hi\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: Weblate 4.0.2-dev\n" #: src/Application.vala:62 msgid "Directories are not supported" msgstr "पथ(सà¥à¤¥à¤¾à¤¨) समरà¥à¤¥à¤¿à¤¤ नहीं है" #: src/Application.vala:68 msgid "Don't know what to do" msgstr "पता नहीं कà¥à¤¯à¤¾ करना है" #: src/Application.vala:80 msgid "Something completely unexpected happened" msgstr "कà¥à¤› पूरà¥à¤£à¤¤à¤¯à¤¾ अपà¥à¤°à¤¤à¥à¤¯à¤¾à¤¶à¤¿à¤¤ हà¥à¤† है" #: src/Layouts/HeaderBar.vala:46 src/Layouts/HeaderBar.vala:53 msgid "Logout" msgstr "पà¥à¤°à¤¸à¥à¤¥à¤¾à¤¨ करे" #: src/Layouts/HeaderBar.vala:56 msgid "Light background" msgstr "लाइट बैकगà¥à¤°à¤¾à¤‰à¤‚ड" #: src/Layouts/HeaderBar.vala:57 msgid "Dark background" msgstr "डारà¥à¤• बैकगà¥à¤°à¤¾à¤‰à¤‚ड" #: src/Layouts/HeaderBar.vala:68 src/Layouts/Welcome.vala:39 msgid "New Window" msgstr "नया विंडो" #: src/Layouts/HeaderBar.vala:71 src/Widgets/ConnectionDialog.vala:130 #: src/Widgets/ConnectionDialog.vala:165 msgid "New Connection" msgstr "नया कनेकà¥à¤¶à¤¨" #: src/Layouts/HeaderBar.vala:74 msgid "Quit" msgstr "छोड़े" #: src/Layouts/HeaderBar.vala:94 msgid "Menu" msgstr "मेनà¥à¤¯à¥‚" #: src/Layouts/Main.vala:77 #, c-format msgid "Connected to %s" msgstr "%s से संपरà¥à¤• मे" #: src/Layouts/Library.vala:65 msgid "SAVED CONNECTIONS" msgstr "सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ कनेकà¥à¤¶à¤‚स" #: src/Layouts/Library.vala:74 msgid "Delete All" msgstr "सभी हटाà¤" #: src/Layouts/Library.vala:81 msgid "Reload Library" msgstr "लाइबà¥à¤°à¥‡à¤°à¥€ पà¥à¤¨à¤ƒ लोड करें" #: src/Layouts/Library.vala:84 msgid "Export Library" msgstr "लाइबà¥à¤°à¥‡à¤°à¥€ निरà¥à¤¯à¤¾à¤¤ करे" #: src/Layouts/Library.vala:215 src/Layouts/Library.vala:233 msgid "Are you sure you want to proceed?" msgstr "कà¥à¤¯à¤¾ आप सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ रूप से आगे बढ़ना चाहते हैं?" #: src/Layouts/Library.vala:215 msgid "By deleting this connection you won’t be able to recover this data." msgstr "इस कनेकà¥à¤¶à¤¨ को हटाने से आप इस डेटा को पà¥à¤¨à¤°à¥à¤ªà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं कर पाà¤à¤‚गे।" #: src/Layouts/Library.vala:218 msgid "Yes, Delete!" msgstr "हाà¤, हटाà¤à¤‚!" #: src/Layouts/Library.vala:233 msgid "All the data will be deleted and you won’t be able to recover it." msgstr "" "समà¥à¤ªà¥‚रà¥à¤£ डेटा हटा दिठजाà¤à¤—ा और आप इसे पà¥à¤¨à¤°à¥à¤ªà¥à¤°à¤¾à¤ªà¥à¤¤ करने में सकà¥à¤·à¤® नहीं होंगे।" #: src/Layouts/Library.vala:236 msgid "Yes, Delete All!" msgstr "हाà¤, सभी हटाà¤à¤!" #: src/Layouts/Library.vala:330 src/Widgets/ConnectionDialog.vala:575 #: src/Widgets/ConnectionDialog.vala:596 msgid "A username is required in order to connect!" msgstr "कनेकà¥à¤Ÿ करने के लिठउपयोगकरà¥à¤¤à¤¾ नाम (username ) आवशà¥à¤¯à¤• है!" #: src/Layouts/Library.vala:404 src/Layouts/Views/Query.vala:528 msgid "Pick a file" msgstr "à¤à¤• फ़ाइल चà¥à¤¨à¥‡à¤‚" #: src/Layouts/Library.vala:407 src/Layouts/Views/Query.vala:531 msgid "_Save" msgstr "_सहेजें" #: src/Layouts/Library.vala:408 src/Layouts/Welcome.vala:62 #: src/Layouts/Views/Query.vala:532 msgid "_Cancel" msgstr "_रदà¥à¤¦ करे" #: src/Layouts/Library.vala:467 #, c-format msgid "Unable to Connect to %s" msgstr "%s संपरà¥à¤• करने मे असमरà¥à¤¥" #: src/Layouts/Library.vala:480 msgid "Unable to Export Library " msgstr "लाइबà¥à¤°à¥‡à¤°à¥€ निरà¥à¤¯à¤¾à¤¤ करने में असमरà¥à¤¥ " #: src/Layouts/Welcome.vala:28 msgid "Welcome to Sequeler" msgstr "Sequeler में आपका सà¥à¤µà¤¾à¤—त है" #: src/Layouts/Welcome.vala:29 msgid "Connect to Any Local or Remote Database." msgstr "किसी भी सà¥à¤¥à¤¾à¤¨à¥€à¤¯(local) या दूरसà¥à¤¥(remote) डेटाबेस से कनेकà¥à¤Ÿ करे।" #: src/Layouts/Welcome.vala:38 msgid "Add a New Database" msgstr "à¤à¤• नया डेटाबेस जोड़ें" #: src/Layouts/Welcome.vala:38 msgid "Connect to a Database and Save It in Your Library" msgstr "à¤à¤• डेटाबेस से कनेकà¥à¤Ÿ करें और इसे अपनी लाइबà¥à¤°à¥‡à¤°à¥€ में सहेजें" #: src/Layouts/Welcome.vala:39 msgid "Open a New Sequeler Window" msgstr "à¤à¤• नया Sequeler विंडो खोलें" #: src/Layouts/Welcome.vala:40 msgid "Import Connections" msgstr "संपरà¥à¤• आयात करे" #: src/Layouts/Welcome.vala:40 msgid "Import Previously Exported Sequeler Connections" msgstr "पहले निरà¥à¤¯à¤¾à¤¤ किठगठSequeler संपरà¥à¤• आयात करें" #: src/Layouts/Welcome.vala:58 msgid "Select a file" msgstr "किसी फाइल का चयन करें" #: src/Layouts/Welcome.vala:61 msgid "_Open" msgstr "_खोले" #: src/Layouts/Welcome.vala:107 msgid "Unable to Import Library " msgstr "लाइबà¥à¤°à¥‡à¤°à¥€ आयात करने मे असमरà¥à¤¥ " #: src/Layouts/DataBaseSchema.vala:66 src/Layouts/DataBaseSchema.vala:167 msgid "- Select Database -" msgstr "- डेटाबेस का चयन करें -" #: src/Layouts/DataBaseSchema.vala:87 msgid "Search Tables" msgstr "तालिका खोजें" #: src/Layouts/DataBaseSchema.vala:98 msgid "Search Tables…" msgstr "तालिका खोजें…" #: src/Layouts/DataBaseSchema.vala:120 msgid "Reload Tables" msgstr "तालिका पà¥à¤¨à¤ƒ लोड करे" #: src/Layouts/DataBaseSchema.vala:125 msgid "Add Table" msgstr "तालिका जोड़े" #: src/Layouts/DataBaseSchema.vala:289 msgid "TABLES" msgstr "तालिकाà¤à¤‚" #: src/Layouts/DataBaseView.vala:49 msgid "Structure" msgstr "संरचना" #: src/Layouts/DataBaseView.vala:50 msgid "Content" msgstr "सामगà¥à¤°à¥€" #: src/Layouts/DataBaseView.vala:51 msgid "Relations" msgstr "समà¥à¤¬à¤¨à¥à¤§" #: src/Layouts/DataBaseView.vala:52 src/Layouts/DataBaseView.vala:229 #: src/Layouts/DataBaseView.vala:253 msgid "Query" msgstr "सवाल" #: src/Layouts/DataBaseView.vala:101 msgid "Zoom Out" msgstr "ज़ूम आउट" #: src/Layouts/DataBaseView.vala:107 msgid "Zoom 1:1" msgstr "ज़ूम 1: 1" #: src/Layouts/DataBaseView.vala:111 msgid "Zoom In" msgstr "ज़ूम इन" #: src/Layouts/DataBaseView.vala:124 msgid "High Contrast" msgstr "उचà¥à¤š विषमता(contrast)" #: src/Layouts/DataBaseView.vala:132 msgid "Solarized Light" msgstr "सोलराइज़à¥à¤¡ लाइट" #: src/Layouts/DataBaseView.vala:140 msgid "Solarized Dark" msgstr "सोलराइज़à¥à¤¡ डारà¥à¤•" #: src/Layouts/DataBaseView.vala:163 msgid "Change Text Style" msgstr "टेकà¥à¤¸à¥à¤Ÿ सà¥à¤Ÿà¤¾à¤‡à¤² बदलें" #: src/Layouts/DataBaseView.vala:222 msgid "Create a new Query Tab" msgstr "à¤à¤• नया कà¥à¤µà¥‡à¤°à¥€ टैब बनाà¤à¤" #: src/Layouts/DataBaseView.vala:240 #, c-format msgid "Query %i" msgstr "कà¥à¤µà¥‡à¤°à¥€ %i" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select Table" msgstr "तालिका का चयन करें" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select a table from the left sidebar to activate this view." msgstr "" "इस दृशà¥à¤¯ को सकà¥à¤°à¤¿à¤¯ करने के लिठबाईं(left) साइडबार से à¤à¤• तालिका का चयन करें।" #: src/Layouts/Views/Structure.vala:107 src/Layouts/Views/Structure.vala:145 #: src/Layouts/Views/Content.vala:179 src/Layouts/Views/Content.vala:218 #: src/Layouts/Views/Relations.vala:106 src/Layouts/Views/Relations.vala:144 #: src/Layouts/Views/Query.vala:323 msgid "No Results Available" msgstr "कोई परिणाम उपलबà¥à¤§ नहीं" #: src/Layouts/Views/Structure.vala:118 src/Layouts/Views/Content.vala:191 #: src/Layouts/Views/Relations.vala:117 msgid "Reload Results" msgstr "परिणाम पà¥à¤¨à¤ƒ लोड करें" #: src/Layouts/Views/Structure.vala:197 msgid " Fields" msgstr " खाने (फ़ीलà¥à¤¡à¥à¤¸ )" #: src/Layouts/Views/Content.vala:121 msgid "Previous Page" msgstr "पिछला पृषà¥à¤ " #: src/Layouts/Views/Content.vala:126 msgid "Next Page" msgstr "अगला पृषà¥à¤ " #: src/Layouts/Views/Content.vala:131 #, c-format msgid "%d Pages" msgstr "%d पृषà¥à¤ " #: src/Layouts/Views/Content.vala:134 msgid "Jump to page…" msgstr "पृषà¥à¤  पर जाà¤à¤‚ …" #: src/Layouts/Views/Content.vala:165 msgid "1 Page" msgstr "1 पृषà¥à¤ " #: src/Layouts/Views/Content.vala:171 #, c-format msgid "%d of %d Pages" msgstr "%d का %d पृषà¥à¤ " #: src/Layouts/Views/Content.vala:275 #, c-format msgid "%d Entries" msgstr "%d पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿à¤¯à¤¾à¤ (entries)" #: src/Layouts/Views/Relations.vala:197 msgid " Constraints" msgstr " पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§" #: src/Layouts/Views/Query.vala:279 msgid "Running Query…" msgstr "रनिंग कà¥à¤µà¥‡à¤°à¥€ …" #: src/Layouts/Views/Query.vala:295 src/Layouts/Views/Query.vala:304 msgid "Run Query" msgstr "रन कà¥à¤µà¥‡à¤°à¥€" #: src/Layouts/Views/Query.vala:356 msgid "Export Results" msgstr "परिणामो को निरà¥à¤¯à¤¾à¤¤ करे" #: src/Layouts/Views/Query.vala:369 msgid "Export as CSV" msgstr "CSV के रूप में निरà¥à¤¯à¤¾à¤¤ करें" #: src/Layouts/Views/Query.vala:377 msgid "Export as Text" msgstr "Text के रूप में निरà¥à¤¯à¤¾à¤¤ करें" #: src/Layouts/Views/Query.vala:436 src/Layouts/Views/Query.vala:482 msgid "Unable to process Query!" msgstr "कà¥à¤µà¥‡à¤°à¥€ पà¥à¤°à¥‹à¤¸à¥‡à¤¸ करने में असमरà¥à¤¥!" #: src/Layouts/Views/Query.vala:457 #, c-format msgid "%d Total Results" msgstr "कà¥à¤² %d परिणाम" #: src/Layouts/Views/Query.vala:492 #, c-format msgid "Query Successfully Executed! Rows Affected: %s" msgstr "कà¥à¤µà¥‡à¤°à¥€ सफलतापूरà¥à¤µà¤• निषà¥à¤ªà¤¾à¤¦à¤¿à¤¤! पà¥à¤°à¤­à¤¾à¤µà¤¿à¤¤ पंकà¥à¤¤à¤¿à¤¯à¤¾à¤ : %s" #: src/Layouts/Views/Query.vala:495 msgid "Query Executed!" msgstr "कà¥à¤µà¥‡à¤°à¥€ निषà¥à¤ªà¤¾à¤¦à¤¿à¤¤!" #: src/Partials/LibraryItem.vala:107 src/Widgets/ConnectionDialog.vala:431 msgid "Connect" msgstr "जà¥à¥œà¥‡" #: src/Partials/LibraryItem.vala:110 msgid "Edit Connection" msgstr "कनेकà¥à¤¶à¤¨ संपादित करें" #: src/Partials/LibraryItem.vala:113 msgid "Duplicate Connection" msgstr "डà¥à¤ªà¥à¤²à¤¿à¤•ेट कनेकà¥à¤¶à¤¨" #: src/Partials/LibraryItem.vala:116 msgid "Delete Connection" msgstr "कनेकà¥à¤¶à¤¨ हटाà¤à¤" #: src/Partials/LibraryItem.vala:126 msgid "Options" msgstr "विकलà¥à¤ª" #: src/Partials/TreeBuilder.vala:131 msgid "Error" msgstr "तà¥à¤°à¥à¤Ÿà¤¿(error)" #: src/Partials/TreeBuilder.vala:131 msgid "on Column" msgstr "सà¥à¤¤à¤‚भ पर" #: src/Partials/TreeBuilder.vala:172 #, c-format msgid "Copy %s" msgstr "%s कॉपी करे" #: src/Services/Settings.vala:106 #, c-format msgid "%s (copy)" msgstr "%s (कॉपी)" #: src/Services/ConnectionManager.vala:193 #, c-format msgid "Libssh2 initialization failed (%d)" msgstr "Libssh2 पà¥à¤°à¤¾à¤°à¤‚भ विफल (%d)" #: src/Services/ConnectionManager.vala:202 msgid "Failed to open socket" msgstr "सॉकेट खोलने में विफल" #: src/Services/ConnectionManager.vala:211 msgid "Failed to connect!" msgstr "कनेकà¥à¤Ÿ करने में विफल!" #: src/Services/ConnectionManager.vala:223 #, c-format msgid "Error when starting up SSH session: %d" msgstr "SSH सेशन शà¥à¤°à¥‚ करते समय तà¥à¤°à¥à¤Ÿà¤¿(error): %d" #: src/Services/ConnectionManager.vala:242 msgid "Authentication by password failed!" msgstr "पासवरà¥à¤¡ दà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤®à¤¾à¤£à¥€à¤•रण विफल!" #: src/Services/ConnectionManager.vala:252 msgid "Authentication by public key failed!" msgstr "सारà¥à¤µà¤œà¤¨à¤¿à¤• कà¥à¤‚जी(public key) दà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤®à¤¾à¤£à¥€à¤•रण विफल!" #: src/Services/ConnectionManager.vala:259 msgid "No supported authentication methods found!" msgstr "कोई समरà¥à¤¥à¤¿à¤¤ पà¥à¤°à¤®à¤¾à¤£à¥€à¤•रण के साधन नहीं मिले!" #: src/Services/ConnectionManager.vala:266 msgid "Failed to open listen socket" msgstr "लिसेन सॉकेट को खोलने में विफल" #: src/Services/ConnectionManager.vala:281 msgid "Failed to bind. Your Database Port may be wrong!" msgstr "बाइनà¥à¤¡ करने में विफल। आपका डेटाबेस पोरà¥à¤Ÿ गलत हो सकता है!" #: src/Services/ConnectionManager.vala:287 msgid "Failed to listen!" msgstr "लिसेन असफल रहा!" #: src/Services/ConnectionManager.vala:314 msgid "Failed to accept remote connection!" msgstr "दूरसà¥à¤¥(remote) कनेकà¥à¤¶à¤¨ सà¥à¤µà¥€à¤•ार करने में विफल!" #: src/Services/ConnectionManager.vala:323 msgid "" "Could not open the direct-tcpip channel! (Note that this can be a problem at " "the server! Please review the server logs.)" msgstr "" "direct-tcpip चैनल नहीं खोल सका! (धà¥à¤¯à¤¾à¤¨ दें कि यह सरà¥à¤µà¤° की समसà¥à¤¯à¤¾ हो सकती है! " "कृपया सरà¥à¤µà¤° लॉग की समीकà¥à¤·à¤¾ करें।)" #: src/Services/ConnectionManager.vala:566 msgid "Error!" msgstr "तà¥à¤°à¥à¤Ÿà¤¿(error)!" #: src/Widgets/ConnectionDialog.vala:33 msgid "Missing SSH Key file!" msgstr "SSH कà¥à¤‚जी(key) फ़ाइल उपलबà¥à¤§ नहीं है!" #: src/Widgets/ConnectionDialog.vala:34 msgid "Missing SSH public key!" msgstr "SSH पबà¥à¤²à¤¿à¤• की(key) उपलबà¥à¤§ नहीं!" #: src/Widgets/ConnectionDialog.vala:89 src/Widgets/ConnectionDialog.vala:355 msgid "Connection" msgstr "कनेकà¥à¤¶à¤¨" #: src/Widgets/ConnectionDialog.vala:141 msgid "Select connection color" msgstr "कनेकà¥à¤¶à¤¨ का रंग चà¥à¤¨à¥‡à¤‚" #: src/Widgets/ConnectionDialog.vala:164 msgid "Connection Name:" msgstr "कनेकà¥à¤¶à¤¨ नाम:" #: src/Widgets/ConnectionDialog.vala:165 msgid "Connection's name" msgstr "कनेकà¥à¤¶à¤¨ का नाम" #: src/Widgets/ConnectionDialog.vala:172 msgid "Database Type:" msgstr "डेटाबेस पà¥à¤°à¤•ार:" #: src/Widgets/ConnectionDialog.vala:194 msgid "Host:" msgstr "होसà¥à¤Ÿ:" #: src/Widgets/ConnectionDialog.vala:200 msgid "Database Name:" msgstr "डेटाबेस का नाम:" #: src/Widgets/ConnectionDialog.vala:207 msgid "Username:" msgstr "यूजरनाम:" #: src/Widgets/ConnectionDialog.vala:213 msgid "Password:" msgstr "पासवरà¥à¤¡:" #: src/Widgets/ConnectionDialog.vala:217 src/Widgets/ConnectionDialog.vala:227 #: src/Widgets/ConnectionDialog.vala:285 src/Widgets/ConnectionDialog.vala:295 msgid "Show password" msgstr "पासवरà¥à¤¡ दिखाà¤" #: src/Widgets/ConnectionDialog.vala:224 src/Widgets/ConnectionDialog.vala:292 msgid "Hide password" msgstr "पासवरà¥à¤¡ छिपाà¤à¤‚" #: src/Widgets/ConnectionDialog.vala:234 msgid "Port:" msgstr "पोरà¥à¤Ÿ:" #: src/Widgets/ConnectionDialog.vala:240 msgid "File Path:" msgstr "फाइल पथ:" #: src/Widgets/ConnectionDialog.vala:241 msgid "Select Your SQLite File…" msgstr "अपनी SQLite फ़ाइल का चयन करें …" #: src/Widgets/ConnectionDialog.vala:261 msgid "Connect via SSH Tunnel:" msgstr "SSH टनल के माधà¥à¤¯à¤® से कनेकà¥à¤Ÿ करें:" #: src/Widgets/ConnectionDialog.vala:271 msgid "SSH Host:" msgstr "SSH होसà¥à¤Ÿ:" #: src/Widgets/ConnectionDialog.vala:276 msgid "SSH Username:" msgstr "SSH यूजरनाम:" #: src/Widgets/ConnectionDialog.vala:281 msgid "SSH Password:" msgstr "SSH पासवरà¥à¤¡:" #: src/Widgets/ConnectionDialog.vala:301 msgid "SSH Port:" msgstr "SSH पोरà¥à¤Ÿ:" #: src/Widgets/ConnectionDialog.vala:302 msgid "Optional" msgstr "वैकलà¥à¤ªà¤¿à¤•" #: src/Widgets/ConnectionDialog.vala:306 msgid "SSH Identity" msgstr "SSH आइडेंटिटी(identity)" #: src/Widgets/ConnectionDialog.vala:308 msgid "Select Your Identity File…" msgstr "अपनी पहचान(Identity) फ़ाइल चà¥à¤¨à¥‡à¤‚ …" #: src/Widgets/ConnectionDialog.vala:324 msgid "Generate SSH Key" msgstr "SSH कà¥à¤‚जी बनाà¤à¤‚" #: src/Widgets/ConnectionDialog.vala:356 msgid "SSH Tunnel" msgstr "SSH टनल" #: src/Widgets/ConnectionDialog.vala:426 msgid "Close" msgstr "बंद करे" #: src/Widgets/ConnectionDialog.vala:427 msgid "Save Connection" msgstr "कनेकà¥à¤¶à¤¨ सहेजें" #: src/Widgets/ConnectionDialog.vala:429 msgid "Test Connection" msgstr "टेसà¥à¤Ÿ कनेकà¥à¤¶à¤¨" #: src/Widgets/ConnectionDialog.vala:620 msgid "Opening SSH Tunnel…" msgstr "ओपनिंग SSH टनल…" #: src/Widgets/ConnectionDialog.vala:650 msgid "Testing Connection…" msgstr "टेसà¥à¤Ÿà¤¿à¤‚ग कनेकà¥à¤¶à¤¨â€¦" #: src/Widgets/ConnectionDialog.vala:661 msgid "Successfully Connected!" msgstr "सफलतापूरà¥à¤µà¤• कनेकà¥à¤Ÿ हà¥à¤†!" #: src/Widgets/ConnectionDialog.vala:679 msgid "Saving Connection…" msgstr "कनेकà¥à¤¶à¤¨ सहेजा जा रहा है …" #: src/Widgets/ConnectionDialog.vala:684 msgid "Connection Saved!" msgstr "कनेकà¥à¤¶à¤¨ सहेजा गया!" #: src/Widgets/ConnectionDialog.vala:692 msgid "Connecting…" msgstr "कनेकà¥à¤Ÿ किया जा रहा…" sequeler-0.8.2/po/id.po000066400000000000000000000336721410464306200147330ustar00rootroot00000000000000# Indonesian translations for com.github.alecaddd.sequeler package. # Copyright (C) 2020 THE com.github.alecaddd.sequeler'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.alecaddd.sequeler package. # Mahyuddin , 2020. # msgid "" msgstr "" "Project-Id-Version: com.github.alecaddd.sequeler\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-04-11 12:37+0200\n" "PO-Revision-Date: 2021-04-28 04:32+0000\n" "Last-Translator: Reza Almanda \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: Weblate 4.7-dev\n" #: src/Application.vala:62 msgid "Directories are not supported" msgstr "Direktori tidak didukung" #: src/Application.vala:68 msgid "Don't know what to do" msgstr "Saya tidak tahu apa yang harus dilakukan" #: src/Application.vala:80 msgid "Something completely unexpected happened" msgstr "Sesuatu yang tak terduga terjadi" #: src/Layouts/HeaderBar.vala:46 src/Layouts/HeaderBar.vala:53 msgid "Logout" msgstr "Keluar" #: src/Layouts/HeaderBar.vala:56 msgid "Light background" msgstr "Latar belakang terang" #: src/Layouts/HeaderBar.vala:57 msgid "Dark background" msgstr "Latar belakang gelap" #: src/Layouts/HeaderBar.vala:68 src/Layouts/Welcome.vala:39 msgid "New Window" msgstr "Jendela Baru" #: src/Layouts/HeaderBar.vala:71 src/Widgets/ConnectionDialog.vala:130 #: src/Widgets/ConnectionDialog.vala:165 msgid "New Connection" msgstr "Koneksi Baru" #: src/Layouts/HeaderBar.vala:74 msgid "Quit" msgstr "Keluar" #: src/Layouts/HeaderBar.vala:94 msgid "Menu" msgstr "Menu" #: src/Layouts/Main.vala:77 #, c-format msgid "Connected to %s" msgstr "Menghubungkan %s" #: src/Layouts/Library.vala:65 msgid "SAVED CONNECTIONS" msgstr "KONEKSI TERSIMPAN" #: src/Layouts/Library.vala:74 msgid "Delete All" msgstr "Hapus Semua" #: src/Layouts/Library.vala:81 msgid "Reload Library" msgstr "Muat Ulang Pustaka" #: src/Layouts/Library.vala:84 msgid "Export Library" msgstr "Ekspor Pustaka" #: src/Layouts/Library.vala:215 src/Layouts/Library.vala:233 msgid "Are you sure you want to proceed?" msgstr "Anda yakin ingin melanjutkan?" #: src/Layouts/Library.vala:215 msgid "By deleting this connection you won’t be able to recover this data." msgstr "Dengan menghapus koneksi ini, Anda tidak dapat memulihkan data ini." #: src/Layouts/Library.vala:218 msgid "Yes, Delete!" msgstr "Ya, Hapus!" #: src/Layouts/Library.vala:233 msgid "All the data will be deleted and you won’t be able to recover it." msgstr "Semua data akan dihapus dan anda tidak bisa memulihkannya." #: src/Layouts/Library.vala:236 msgid "Yes, Delete All!" msgstr "Ya, Hapus Semua!" #: src/Layouts/Library.vala:330 src/Widgets/ConnectionDialog.vala:575 #: src/Widgets/ConnectionDialog.vala:596 msgid "A username is required in order to connect!" msgstr "Nama pengguna diperlukan untuk terhubung!" #: src/Layouts/Library.vala:404 src/Layouts/Views/Query.vala:528 msgid "Pick a file" msgstr "Pilih file" #: src/Layouts/Library.vala:407 src/Layouts/Views/Query.vala:531 msgid "_Save" msgstr "_Simpan" #: src/Layouts/Library.vala:408 src/Layouts/Welcome.vala:62 #: src/Layouts/Views/Query.vala:532 msgid "_Cancel" msgstr "_Batal" #: src/Layouts/Library.vala:467 #, c-format msgid "Unable to Connect to %s" msgstr "Tidak dapat terhubung ke %s" #: src/Layouts/Library.vala:480 msgid "Unable to Export Library " msgstr "Tak Bisa Mengekspor Pustaka " #: src/Layouts/Welcome.vala:28 msgid "Welcome to Sequeler" msgstr "Selamat datang di Sequeler" #: src/Layouts/Welcome.vala:29 msgid "Connect to Any Local or Remote Database." msgstr "Hubungkan ke Basis Data Lokal atau Jauh." #: src/Layouts/Welcome.vala:38 msgid "Add a New Database" msgstr "Tambahkan Basis Data Baru" #: src/Layouts/Welcome.vala:38 msgid "Connect to a Database and Save It in Your Library" msgstr "Hubungkan ke Basis Data dan simpan di Pustaka Anda" #: src/Layouts/Welcome.vala:39 msgid "Open a New Sequeler Window" msgstr "Buka Jendela Sequeler Baru" #: src/Layouts/Welcome.vala:40 msgid "Import Connections" msgstr "Impor Koneksi" #: src/Layouts/Welcome.vala:40 msgid "Import Previously Exported Sequeler Connections" msgstr "Impor Koneksi Sequeler yang Sebelumnya Diekspor" #: src/Layouts/Welcome.vala:58 msgid "Select a file" msgstr "Pilih berkas" #: src/Layouts/Welcome.vala:61 msgid "_Open" msgstr "_Buka" #: src/Layouts/Welcome.vala:107 msgid "Unable to Import Library " msgstr "Tak Bisa Mengimpor Pustaka " #: src/Layouts/DataBaseSchema.vala:66 src/Layouts/DataBaseSchema.vala:167 msgid "- Select Database -" msgstr "- Pilih Basis Data -" #: src/Layouts/DataBaseSchema.vala:87 msgid "Search Tables" msgstr "Cari Table" #: src/Layouts/DataBaseSchema.vala:98 msgid "Search Tables…" msgstr "Cari Table…" #: src/Layouts/DataBaseSchema.vala:120 msgid "Reload Tables" msgstr "Muat ulang Table" #: src/Layouts/DataBaseSchema.vala:125 msgid "Add Table" msgstr "Tambah Table" #: src/Layouts/DataBaseSchema.vala:289 msgid "TABLES" msgstr "TABLE" #: src/Layouts/DataBaseView.vala:49 msgid "Structure" msgstr "Struktur" #: src/Layouts/DataBaseView.vala:50 msgid "Content" msgstr "Konten" #: src/Layouts/DataBaseView.vala:51 msgid "Relations" msgstr "Relasi" #: src/Layouts/DataBaseView.vala:52 src/Layouts/DataBaseView.vala:229 #: src/Layouts/DataBaseView.vala:253 msgid "Query" msgstr "Kueri" #: src/Layouts/DataBaseView.vala:101 msgid "Zoom Out" msgstr "Perkecil" #: src/Layouts/DataBaseView.vala:107 msgid "Zoom 1:1" msgstr "Perbesar 1:1" #: src/Layouts/DataBaseView.vala:111 msgid "Zoom In" msgstr "Perbesar" #: src/Layouts/DataBaseView.vala:124 msgid "High Contrast" msgstr "Kontras Tinggi" #: src/Layouts/DataBaseView.vala:132 msgid "Solarized Light" msgstr "Cahaya Terpolarisasi" #: src/Layouts/DataBaseView.vala:140 msgid "Solarized Dark" msgstr "Gelap Terpolarisasi" #: src/Layouts/DataBaseView.vala:163 msgid "Change Text Style" msgstr "Ubah Gaya Teks" #: src/Layouts/DataBaseView.vala:222 msgid "Create a new Query Tab" msgstr "Buat tab Kueri baru" #: src/Layouts/DataBaseView.vala:240 #, c-format msgid "Query %i" msgstr "Kueri %i" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select Table" msgstr "Pilih Table" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select a table from the left sidebar to activate this view." msgstr "Pilih tabel dari sidebar kiri untuk mengaktifkan tampilan ini." #: src/Layouts/Views/Structure.vala:107 src/Layouts/Views/Structure.vala:145 #: src/Layouts/Views/Content.vala:179 src/Layouts/Views/Content.vala:218 #: src/Layouts/Views/Relations.vala:106 src/Layouts/Views/Relations.vala:144 #: src/Layouts/Views/Query.vala:323 msgid "No Results Available" msgstr "Tidak Ada hasil Yang Tersedia" #: src/Layouts/Views/Structure.vala:118 src/Layouts/Views/Content.vala:191 #: src/Layouts/Views/Relations.vala:117 msgid "Reload Results" msgstr "Muat Ulang Hasil" #: src/Layouts/Views/Structure.vala:197 msgid " Fields" msgstr " Bidang" #: src/Layouts/Views/Content.vala:121 msgid "Previous Page" msgstr "Halaman Sebelumnya" #: src/Layouts/Views/Content.vala:126 msgid "Next Page" msgstr "Halaman Selanjutnya" #: src/Layouts/Views/Content.vala:131 #, c-format msgid "%d Pages" msgstr "%d Halaman" #: src/Layouts/Views/Content.vala:134 msgid "Jump to page…" msgstr "Lompat ke halaman…" #: src/Layouts/Views/Content.vala:165 msgid "1 Page" msgstr "1 Halaman" #: src/Layouts/Views/Content.vala:171 #, c-format msgid "%d of %d Pages" msgstr "%d dari %d Halaman" #: src/Layouts/Views/Content.vala:275 #, c-format msgid "%d Entries" msgstr "%d Entri" #: src/Layouts/Views/Relations.vala:197 msgid " Constraints" msgstr "" #: src/Layouts/Views/Query.vala:279 #, fuzzy msgid "Running Query…" msgstr "Query sedang jalan..." #: src/Layouts/Views/Query.vala:295 src/Layouts/Views/Query.vala:304 msgid "Run Query" msgstr "Jalankan Query" #: src/Layouts/Views/Query.vala:356 msgid "Export Results" msgstr "" #: src/Layouts/Views/Query.vala:369 msgid "Export as CSV" msgstr "" #: src/Layouts/Views/Query.vala:377 msgid "Export as Text" msgstr "" #: src/Layouts/Views/Query.vala:436 src/Layouts/Views/Query.vala:482 msgid "Unable to process Query!" msgstr "Tidak dapat memproses Query!" #: src/Layouts/Views/Query.vala:457 #, c-format msgid "%d Total Results" msgstr "" #: src/Layouts/Views/Query.vala:492 #, fuzzy, c-format msgid "Query Successfully Executed! Rows Affected: %s" msgstr "Query Berhasil Dijalankan!" #: src/Layouts/Views/Query.vala:495 #, fuzzy msgid "Query Executed!" msgstr "Query Berhasil Dijalankan!" #: src/Partials/LibraryItem.vala:107 src/Widgets/ConnectionDialog.vala:431 msgid "Connect" msgstr "Menghubungkan" #: src/Partials/LibraryItem.vala:110 msgid "Edit Connection" msgstr "Sunting Koneksi" #: src/Partials/LibraryItem.vala:113 #, fuzzy msgid "Duplicate Connection" msgstr "Hapus Koneksi" #: src/Partials/LibraryItem.vala:116 msgid "Delete Connection" msgstr "Hapus Koneksi" #: src/Partials/LibraryItem.vala:126 msgid "Options" msgstr "" #: src/Partials/TreeBuilder.vala:131 msgid "Error" msgstr "" #: src/Partials/TreeBuilder.vala:131 msgid "on Column" msgstr "" #: src/Partials/TreeBuilder.vala:172 #, c-format msgid "Copy %s" msgstr "" #: src/Services/Settings.vala:106 #, c-format msgid "%s (copy)" msgstr "" #: src/Services/ConnectionManager.vala:193 #, c-format msgid "Libssh2 initialization failed (%d)" msgstr "" #: src/Services/ConnectionManager.vala:202 msgid "Failed to open socket" msgstr "" #: src/Services/ConnectionManager.vala:211 #, fuzzy msgid "Failed to connect!" msgstr "Hapus Koneksi" #: src/Services/ConnectionManager.vala:223 #, c-format msgid "Error when starting up SSH session: %d" msgstr "" #: src/Services/ConnectionManager.vala:242 msgid "Authentication by password failed!" msgstr "" #: src/Services/ConnectionManager.vala:252 msgid "Authentication by public key failed!" msgstr "" #: src/Services/ConnectionManager.vala:259 msgid "No supported authentication methods found!" msgstr "" #: src/Services/ConnectionManager.vala:266 msgid "Failed to open listen socket" msgstr "" #: src/Services/ConnectionManager.vala:281 msgid "Failed to bind. Your Database Port may be wrong!" msgstr "" #: src/Services/ConnectionManager.vala:287 msgid "Failed to listen!" msgstr "" #: src/Services/ConnectionManager.vala:314 msgid "Failed to accept remote connection!" msgstr "" #: src/Services/ConnectionManager.vala:323 msgid "" "Could not open the direct-tcpip channel! (Note that this can be a problem at " "the server! Please review the server logs.)" msgstr "" #: src/Services/ConnectionManager.vala:566 msgid "Error!" msgstr "" #: src/Widgets/ConnectionDialog.vala:33 msgid "Missing SSH Key file!" msgstr "" #: src/Widgets/ConnectionDialog.vala:34 msgid "Missing SSH public key!" msgstr "" #: src/Widgets/ConnectionDialog.vala:89 src/Widgets/ConnectionDialog.vala:355 #, fuzzy msgid "Connection" msgstr "Koneksi Baru" #: src/Widgets/ConnectionDialog.vala:141 #, fuzzy msgid "Select connection color" msgstr "Hapus Koneksi" #: src/Widgets/ConnectionDialog.vala:164 #, fuzzy msgid "Connection Name:" msgstr "Nama koneksi" #: src/Widgets/ConnectionDialog.vala:165 msgid "Connection's name" msgstr "Nama koneksi" #: src/Widgets/ConnectionDialog.vala:172 msgid "Database Type:" msgstr "Tipe Basis Data:" #: src/Widgets/ConnectionDialog.vala:194 msgid "Host:" msgstr "Utama:" #: src/Widgets/ConnectionDialog.vala:200 msgid "Database Name:" msgstr "Nama Basis Data:" #: src/Widgets/ConnectionDialog.vala:207 msgid "Username:" msgstr "Nama pengguna:" #: src/Widgets/ConnectionDialog.vala:213 msgid "Password:" msgstr "Kata sandi:" #: src/Widgets/ConnectionDialog.vala:217 src/Widgets/ConnectionDialog.vala:227 #: src/Widgets/ConnectionDialog.vala:285 src/Widgets/ConnectionDialog.vala:295 #, fuzzy msgid "Show password" msgstr "Kata sandi:" #: src/Widgets/ConnectionDialog.vala:224 src/Widgets/ConnectionDialog.vala:292 #, fuzzy msgid "Hide password" msgstr "Kata sandi:" #: src/Widgets/ConnectionDialog.vala:234 msgid "Port:" msgstr "" #: src/Widgets/ConnectionDialog.vala:240 msgid "File Path:" msgstr "" #: src/Widgets/ConnectionDialog.vala:241 msgid "Select Your SQLite File…" msgstr "" #: src/Widgets/ConnectionDialog.vala:261 #, fuzzy msgid "Connect via SSH Tunnel:" msgstr "Koneksi di Terminal" #: src/Widgets/ConnectionDialog.vala:271 #, fuzzy msgid "SSH Host:" msgstr "Utama:" #: src/Widgets/ConnectionDialog.vala:276 #, fuzzy msgid "SSH Username:" msgstr "Nama pengguna:" #: src/Widgets/ConnectionDialog.vala:281 #, fuzzy msgid "SSH Password:" msgstr "Kata sandi:" #: src/Widgets/ConnectionDialog.vala:301 msgid "SSH Port:" msgstr "" #: src/Widgets/ConnectionDialog.vala:302 msgid "Optional" msgstr "" #: src/Widgets/ConnectionDialog.vala:306 msgid "SSH Identity" msgstr "" #: src/Widgets/ConnectionDialog.vala:308 msgid "Select Your Identity File…" msgstr "" #: src/Widgets/ConnectionDialog.vala:324 msgid "Generate SSH Key" msgstr "" #: src/Widgets/ConnectionDialog.vala:356 #, fuzzy msgid "SSH Tunnel" msgstr "Koneksi di Terminal" #: src/Widgets/ConnectionDialog.vala:426 msgid "Close" msgstr "Tutup" #: src/Widgets/ConnectionDialog.vala:427 msgid "Save Connection" msgstr "Simpan Koneksi" #: src/Widgets/ConnectionDialog.vala:429 msgid "Test Connection" msgstr "Uji Koneksi" #: src/Widgets/ConnectionDialog.vala:620 msgid "Opening SSH Tunnel…" msgstr "" #: src/Widgets/ConnectionDialog.vala:650 #, fuzzy msgid "Testing Connection…" msgstr "Uji Koneksi" #: src/Widgets/ConnectionDialog.vala:661 #, fuzzy msgid "Successfully Connected!" msgstr "Query Berhasil Dijalankan!" #: src/Widgets/ConnectionDialog.vala:679 #, fuzzy msgid "Saving Connection…" msgstr "Simpan Koneksi" #: src/Widgets/ConnectionDialog.vala:684 msgid "Connection Saved!" msgstr "Koneksi Tersimpan!" #: src/Widgets/ConnectionDialog.vala:692 #, fuzzy msgid "Connecting…" msgstr "Menghubungkan" sequeler-0.8.2/po/it.po000066400000000000000000000357521410464306200147540ustar00rootroot00000000000000# Italian translations for com.github.alecaddd.sequeler package. # Copyright (C) 2020 THE com.github.alecaddd.sequeler'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.alecaddd.sequeler package. # Luca Andrea Rossi , 2020. # msgid "" msgstr "" "Project-Id-Version: com.github.alecaddd.sequeler\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-04-11 12:37+0200\n" "PO-Revision-Date: 2020-04-12 17:29+0000\n" "Last-Translator: Alessandro \n" "Language-Team: Italian \n" "Language: it\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: Weblate 4.0-dev\n" #: src/Application.vala:62 msgid "Directories are not supported" msgstr "Selezione di Cartelle non supportata" #: src/Application.vala:68 msgid "Don't know what to do" msgstr "Non so cosa fare" #: src/Application.vala:80 msgid "Something completely unexpected happened" msgstr "Si é verificato un errore inaspettato" #: src/Layouts/HeaderBar.vala:46 src/Layouts/HeaderBar.vala:53 msgid "Logout" msgstr "Disconnetti" #: src/Layouts/HeaderBar.vala:56 msgid "Light background" msgstr "Sfondo chiaro" #: src/Layouts/HeaderBar.vala:57 msgid "Dark background" msgstr "Sfondo scuro" #: src/Layouts/HeaderBar.vala:68 src/Layouts/Welcome.vala:39 msgid "New Window" msgstr "Nuova finestra" #: src/Layouts/HeaderBar.vala:71 src/Widgets/ConnectionDialog.vala:130 #: src/Widgets/ConnectionDialog.vala:165 msgid "New Connection" msgstr "Nuova connessione" #: src/Layouts/HeaderBar.vala:74 msgid "Quit" msgstr "Chiudi" #: src/Layouts/HeaderBar.vala:94 msgid "Menu" msgstr "Menu" #: src/Layouts/Main.vala:77 #, c-format msgid "Connected to %s" msgstr "Connesso a %s" #: src/Layouts/Library.vala:65 msgid "SAVED CONNECTIONS" msgstr "CONNESSIONI SALVATE" #: src/Layouts/Library.vala:74 msgid "Delete All" msgstr "Elimina tutto" #: src/Layouts/Library.vala:81 msgid "Reload Library" msgstr "Ricarica libreria" #: src/Layouts/Library.vala:84 msgid "Export Library" msgstr "Esporta libreria" #: src/Layouts/Library.vala:215 src/Layouts/Library.vala:233 msgid "Are you sure you want to proceed?" msgstr "Si è sicuri di voler procedere?" #: src/Layouts/Library.vala:215 msgid "By deleting this connection you won’t be able to recover this data." msgstr "" "Eliminando questa connessione non sarà possibile recuperare questi dati." #: src/Layouts/Library.vala:218 msgid "Yes, Delete!" msgstr "Sì, elimina!" #: src/Layouts/Library.vala:233 msgid "All the data will be deleted and you won’t be able to recover it." msgstr "Tutti i dati saranno cancellati e non potranno essere recuperati." #: src/Layouts/Library.vala:236 msgid "Yes, Delete All!" msgstr "Sì, elimina tutto!" #: src/Layouts/Library.vala:330 src/Widgets/ConnectionDialog.vala:575 #: src/Widgets/ConnectionDialog.vala:596 msgid "A username is required in order to connect!" msgstr "Nome utente necessario per eseguire una connessione!" #: src/Layouts/Library.vala:404 src/Layouts/Views/Query.vala:528 msgid "Pick a file" msgstr "Seleziona un file" #: src/Layouts/Library.vala:407 src/Layouts/Views/Query.vala:531 msgid "_Save" msgstr "_Salva" #: src/Layouts/Library.vala:408 src/Layouts/Welcome.vala:62 #: src/Layouts/Views/Query.vala:532 msgid "_Cancel" msgstr "_Annulla" #: src/Layouts/Library.vala:467 #, c-format msgid "Unable to Connect to %s" msgstr "Impossibile connettersi a %s" #: src/Layouts/Library.vala:480 msgid "Unable to Export Library " msgstr "Impossibile esportare la libreria " #: src/Layouts/Welcome.vala:28 msgid "Welcome to Sequeler" msgstr "Benvenuto in Sequeler" #: src/Layouts/Welcome.vala:29 msgid "Connect to Any Local or Remote Database." msgstr "Collegati a qualunque database locale o remoto." #: src/Layouts/Welcome.vala:38 msgid "Add a New Database" msgstr "Aggiungi nuovo database" #: src/Layouts/Welcome.vala:38 msgid "Connect to a Database and Save It in Your Library" msgstr "Connettiti a un database e salvalo nella libreria" #: src/Layouts/Welcome.vala:39 msgid "Open a New Sequeler Window" msgstr "Apri una nuova finestra di Sequeler" #: src/Layouts/Welcome.vala:40 msgid "Import Connections" msgstr "Importa connessioni" #: src/Layouts/Welcome.vala:40 msgid "Import Previously Exported Sequeler Connections" msgstr "Importa un file di connessioni di Sequeler precedentemente esportato" #: src/Layouts/Welcome.vala:58 msgid "Select a file" msgstr "Seleziona un file" #: src/Layouts/Welcome.vala:61 msgid "_Open" msgstr "_Apri" #: src/Layouts/Welcome.vala:107 msgid "Unable to Import Library " msgstr "Impossibile importare la libreria " #: src/Layouts/DataBaseSchema.vala:66 src/Layouts/DataBaseSchema.vala:167 msgid "- Select Database -" msgstr "- Selezionare un database -" #: src/Layouts/DataBaseSchema.vala:87 msgid "Search Tables" msgstr "Cerca tabelle" #: src/Layouts/DataBaseSchema.vala:98 msgid "Search Tables…" msgstr "Cerca tabelle…" #: src/Layouts/DataBaseSchema.vala:120 msgid "Reload Tables" msgstr "Ricarica tabelle" #: src/Layouts/DataBaseSchema.vala:125 msgid "Add Table" msgstr "Aggiungi tabella" #: src/Layouts/DataBaseSchema.vala:289 msgid "TABLES" msgstr "TABELLE" #: src/Layouts/DataBaseView.vala:49 msgid "Structure" msgstr "Struttura" #: src/Layouts/DataBaseView.vala:50 msgid "Content" msgstr "Contenuto" #: src/Layouts/DataBaseView.vala:51 msgid "Relations" msgstr "Relazioni" #: src/Layouts/DataBaseView.vala:52 src/Layouts/DataBaseView.vala:229 #: src/Layouts/DataBaseView.vala:253 msgid "Query" msgstr "Esegui query" #: src/Layouts/DataBaseView.vala:101 msgid "Zoom Out" msgstr "Riduci zoom" #: src/Layouts/DataBaseView.vala:107 msgid "Zoom 1:1" msgstr "Resetta zoom" #: src/Layouts/DataBaseView.vala:111 msgid "Zoom In" msgstr "Aumenta zoom" #: src/Layouts/DataBaseView.vala:124 msgid "High Contrast" msgstr "Alto Contrasto" #: src/Layouts/DataBaseView.vala:132 msgid "Solarized Light" msgstr "Chiaro Solarizzato" #: src/Layouts/DataBaseView.vala:140 msgid "Solarized Dark" msgstr "Scuro Solarizzato" #: src/Layouts/DataBaseView.vala:163 msgid "Change Text Style" msgstr "Cambia stile testo" #: src/Layouts/DataBaseView.vala:222 msgid "Create a new Query Tab" msgstr "Aggiungi una nuova tab" #: src/Layouts/DataBaseView.vala:240 #, c-format msgid "Query %i" msgstr "Query %i" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select Table" msgstr "Seleziona tabella" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select a table from the left sidebar to activate this view." msgstr "" "Selezionare una tabella dal pannello a sinistra per attivare questa " "visualizzazione." #: src/Layouts/Views/Structure.vala:107 src/Layouts/Views/Structure.vala:145 #: src/Layouts/Views/Content.vala:179 src/Layouts/Views/Content.vala:218 #: src/Layouts/Views/Relations.vala:106 src/Layouts/Views/Relations.vala:144 #: src/Layouts/Views/Query.vala:323 msgid "No Results Available" msgstr "Nessun risultato disponibile" #: src/Layouts/Views/Structure.vala:118 src/Layouts/Views/Content.vala:191 #: src/Layouts/Views/Relations.vala:117 msgid "Reload Results" msgstr "Ricarica risultati" #: src/Layouts/Views/Structure.vala:197 msgid " Fields" msgstr " campi" #: src/Layouts/Views/Content.vala:121 msgid "Previous Page" msgstr "Pagina precedente" #: src/Layouts/Views/Content.vala:126 msgid "Next Page" msgstr "Pagina successiva" #: src/Layouts/Views/Content.vala:131 #, c-format msgid "%d Pages" msgstr "%d pagine" #: src/Layouts/Views/Content.vala:134 msgid "Jump to page…" msgstr "Vai alla pagina…" #: src/Layouts/Views/Content.vala:165 msgid "1 Page" msgstr "1 pagina" #: src/Layouts/Views/Content.vala:171 #, c-format msgid "%d of %d Pages" msgstr "%d di %d pagine" #: src/Layouts/Views/Content.vala:275 #, c-format msgid "%d Entries" msgstr "%d voci" #: src/Layouts/Views/Relations.vala:197 msgid " Constraints" msgstr " vincoli" #: src/Layouts/Views/Query.vala:279 msgid "Running Query…" msgstr "Query in esecuzione…" #: src/Layouts/Views/Query.vala:295 src/Layouts/Views/Query.vala:304 msgid "Run Query" msgstr "Esegui query" #: src/Layouts/Views/Query.vala:356 msgid "Export Results" msgstr "Esporta risultati" #: src/Layouts/Views/Query.vala:369 msgid "Export as CSV" msgstr "Esporta come CSV" #: src/Layouts/Views/Query.vala:377 msgid "Export as Text" msgstr "Esporta come testo" #: src/Layouts/Views/Query.vala:436 src/Layouts/Views/Query.vala:482 msgid "Unable to process Query!" msgstr "Impossibile eseguire la query!" #: src/Layouts/Views/Query.vala:457 #, c-format msgid "%d Total Results" msgstr "%d risultati totali" #: src/Layouts/Views/Query.vala:492 #, c-format msgid "Query Successfully Executed! Rows Affected: %s" msgstr "Query eseguita correttamente! Righe alterate: %s" #: src/Layouts/Views/Query.vala:495 msgid "Query Executed!" msgstr "Query eseguita!" #: src/Partials/LibraryItem.vala:107 src/Widgets/ConnectionDialog.vala:431 msgid "Connect" msgstr "Connetti" #: src/Partials/LibraryItem.vala:110 msgid "Edit Connection" msgstr "Modifica connessione" #: src/Partials/LibraryItem.vala:113 msgid "Duplicate Connection" msgstr "Duplica connessione" #: src/Partials/LibraryItem.vala:116 msgid "Delete Connection" msgstr "Cancella connessione" #: src/Partials/LibraryItem.vala:126 msgid "Options" msgstr "Opzioni" #: src/Partials/TreeBuilder.vala:131 msgid "Error" msgstr "Errore" #: src/Partials/TreeBuilder.vala:131 msgid "on Column" msgstr "sulla colonna" #: src/Partials/TreeBuilder.vala:172 #, c-format msgid "Copy %s" msgstr "Copia %s" #: src/Services/Settings.vala:106 #, c-format msgid "%s (copy)" msgstr "%s (copia)" #: src/Services/ConnectionManager.vala:193 #, c-format msgid "Libssh2 initialization failed (%d)" msgstr "Impossibile inizializzare Libssh2 (%d)" #: src/Services/ConnectionManager.vala:202 msgid "Failed to open socket" msgstr "Impossibile aprire il Socket" #: src/Services/ConnectionManager.vala:211 msgid "Failed to connect!" msgstr "Impossibile connettersi!" #: src/Services/ConnectionManager.vala:223 #, c-format msgid "Error when starting up SSH session: %d" msgstr "Errore durante il lancio della sessione SSH: %d" #: src/Services/ConnectionManager.vala:242 msgid "Authentication by password failed!" msgstr "Autenticazione con password fallita!" #: src/Services/ConnectionManager.vala:252 msgid "Authentication by public key failed!" msgstr "Autenticazione con chiave publica fallita!" #: src/Services/ConnectionManager.vala:259 msgid "No supported authentication methods found!" msgstr "Nessun metodo di autenticazione supportato!" #: src/Services/ConnectionManager.vala:266 msgid "Failed to open listen socket" msgstr "Impossibile aprire il socket" #: src/Services/ConnectionManager.vala:281 msgid "Failed to bind. Your Database Port may be wrong!" msgstr "" "Collegamento fallito. La tua porta del database potrebbe essere sbagliata!" #: src/Services/ConnectionManager.vala:287 msgid "Failed to listen!" msgstr "Impossibile collegarsi!" #: src/Services/ConnectionManager.vala:314 msgid "Failed to accept remote connection!" msgstr "Connessione remote fallita!" #: src/Services/ConnectionManager.vala:323 msgid "" "Could not open the direct-tcpip channel! (Note that this can be a problem at " "the server! Please review the server logs.)" msgstr "" "Impossibile aprire un canale tcpip diretto! (Questo potrebbe essere un " "problema relativo alle impostazioni del tuo server! Controlla il tuo server " "log.)" #: src/Services/ConnectionManager.vala:566 msgid "Error!" msgstr "Errore!" #: src/Widgets/ConnectionDialog.vala:33 msgid "Missing SSH Key file!" msgstr "Nessuna chiave SSH trovata!" #: src/Widgets/ConnectionDialog.vala:34 msgid "Missing SSH public key!" msgstr "Nessuna chiave publica SSH trovata!" #: src/Widgets/ConnectionDialog.vala:89 src/Widgets/ConnectionDialog.vala:355 msgid "Connection" msgstr "Connessione" #: src/Widgets/ConnectionDialog.vala:141 msgid "Select connection color" msgstr "Seleziona il colore della connessione" #: src/Widgets/ConnectionDialog.vala:164 msgid "Connection Name:" msgstr "Nome connessione:" #: src/Widgets/ConnectionDialog.vala:165 msgid "Connection's name" msgstr "Nome della connessione" #: src/Widgets/ConnectionDialog.vala:172 msgid "Database Type:" msgstr "Tipo database:" #: src/Widgets/ConnectionDialog.vala:194 msgid "Host:" msgstr "Server:" #: src/Widgets/ConnectionDialog.vala:200 msgid "Database Name:" msgstr "Nome database:" #: src/Widgets/ConnectionDialog.vala:207 msgid "Username:" msgstr "Nome utente:" #: src/Widgets/ConnectionDialog.vala:213 msgid "Password:" msgstr "Password:" #: src/Widgets/ConnectionDialog.vala:217 src/Widgets/ConnectionDialog.vala:227 #: src/Widgets/ConnectionDialog.vala:285 src/Widgets/ConnectionDialog.vala:295 msgid "Show password" msgstr "Mostra password" #: src/Widgets/ConnectionDialog.vala:224 src/Widgets/ConnectionDialog.vala:292 msgid "Hide password" msgstr "Nascondi password" #: src/Widgets/ConnectionDialog.vala:234 msgid "Port:" msgstr "Porta:" #: src/Widgets/ConnectionDialog.vala:240 msgid "File Path:" msgstr "Indirizzo del file:" #: src/Widgets/ConnectionDialog.vala:241 msgid "Select Your SQLite File…" msgstr "Selezionare il file SQLite…" #: src/Widgets/ConnectionDialog.vala:261 msgid "Connect via SSH Tunnel:" msgstr "Connessione via tunnel SSH:" #: src/Widgets/ConnectionDialog.vala:271 msgid "SSH Host:" msgstr "Server SSH:" #: src/Widgets/ConnectionDialog.vala:276 msgid "SSH Username:" msgstr "Nome utente SSH:" #: src/Widgets/ConnectionDialog.vala:281 msgid "SSH Password:" msgstr "Password SSH:" #: src/Widgets/ConnectionDialog.vala:301 msgid "SSH Port:" msgstr "Porta SSH:" #: src/Widgets/ConnectionDialog.vala:302 msgid "Optional" msgstr "Opzionale" #: src/Widgets/ConnectionDialog.vala:306 msgid "SSH Identity" msgstr "Identità SSH" #: src/Widgets/ConnectionDialog.vala:308 msgid "Select Your Identity File…" msgstr "Seleziona il tuo file SSH…" #: src/Widgets/ConnectionDialog.vala:324 msgid "Generate SSH Key" msgstr "Come generare una chiave SSH" #: src/Widgets/ConnectionDialog.vala:356 msgid "SSH Tunnel" msgstr "Connessione via tunnel SSH" #: src/Widgets/ConnectionDialog.vala:426 msgid "Close" msgstr "Chiudi" #: src/Widgets/ConnectionDialog.vala:427 msgid "Save Connection" msgstr "Salva connessione" #: src/Widgets/ConnectionDialog.vala:429 msgid "Test Connection" msgstr "Prova connessione" #: src/Widgets/ConnectionDialog.vala:620 msgid "Opening SSH Tunnel…" msgstr "Apertura tunnel SSH in corso…" #: src/Widgets/ConnectionDialog.vala:650 msgid "Testing Connection…" msgstr "Verifica connessione in corso…" #: src/Widgets/ConnectionDialog.vala:661 msgid "Successfully Connected!" msgstr "Connesso correttamente!" #: src/Widgets/ConnectionDialog.vala:679 msgid "Saving Connection…" msgstr "Salvataggio connessione…" #: src/Widgets/ConnectionDialog.vala:684 msgid "Connection Saved!" msgstr "Connessione salvata!" #: src/Widgets/ConnectionDialog.vala:692 msgid "Connecting…" msgstr "Connessione in corso…" sequeler-0.8.2/po/lg.po000066400000000000000000000322531410464306200147330ustar00rootroot00000000000000# Ganda translations for com.github.alecaddd.sequeler package. # Copyright (C) 2020 THE com.github.alecaddd.sequeler'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.alecaddd.sequeler package. # Laurence Bahiirwa , 2020. # msgid "" msgstr "" "Project-Id-Version: com.github.alecaddd.sequeler\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-04-11 12:37+0200\n" "PO-Revision-Date: 2020-04-11 12:12+0200\n" "Last-Translator: Laurence Bahiirwa \n" "Language-Team: none\n" "Language: lg\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: src/Application.vala:62 msgid "Directories are not supported" msgstr "" #: src/Application.vala:68 msgid "Don't know what to do" msgstr "" #: src/Application.vala:80 msgid "Something completely unexpected happened" msgstr "" #: src/Layouts/HeaderBar.vala:46 src/Layouts/HeaderBar.vala:53 msgid "Logout" msgstr "Fuluma" #: src/Layouts/HeaderBar.vala:56 msgid "Light background" msgstr "" #: src/Layouts/HeaderBar.vala:57 msgid "Dark background" msgstr "" #: src/Layouts/HeaderBar.vala:68 src/Layouts/Welcome.vala:39 msgid "New Window" msgstr "" #: src/Layouts/HeaderBar.vala:71 src/Widgets/ConnectionDialog.vala:130 #: src/Widgets/ConnectionDialog.vala:165 msgid "New Connection" msgstr "Enkolagana empya" #: src/Layouts/HeaderBar.vala:74 msgid "Quit" msgstr "" #: src/Layouts/HeaderBar.vala:94 msgid "Menu" msgstr "" #: src/Layouts/Main.vala:77 #, fuzzy, c-format msgid "Connected to %s" msgstr "Gatta Enkolagana" #: src/Layouts/Library.vala:65 msgid "SAVED CONNECTIONS" msgstr "" #: src/Layouts/Library.vala:74 msgid "Delete All" msgstr "Byonna bigyemu" #: src/Layouts/Library.vala:81 #, fuzzy msgid "Reload Library" msgstr "Nonya mu terekero lyo" #: src/Layouts/Library.vala:84 #, fuzzy msgid "Export Library" msgstr "Nonya mu terekero lyo" #: src/Layouts/Library.vala:215 src/Layouts/Library.vala:233 msgid "Are you sure you want to proceed?" msgstr "" #: src/Layouts/Library.vala:215 msgid "By deleting this connection you won’t be able to recover this data." msgstr "" #: src/Layouts/Library.vala:218 msgid "Yes, Delete!" msgstr "" #: src/Layouts/Library.vala:233 msgid "All the data will be deleted and you won’t be able to recover it." msgstr "" #: src/Layouts/Library.vala:236 #, fuzzy msgid "Yes, Delete All!" msgstr "Byonna bigyemu" #: src/Layouts/Library.vala:330 src/Widgets/ConnectionDialog.vala:575 #: src/Widgets/ConnectionDialog.vala:596 msgid "A username is required in order to connect!" msgstr "" #: src/Layouts/Library.vala:404 src/Layouts/Views/Query.vala:528 msgid "Pick a file" msgstr "" #: src/Layouts/Library.vala:407 src/Layouts/Views/Query.vala:531 msgid "_Save" msgstr "" #: src/Layouts/Library.vala:408 src/Layouts/Welcome.vala:62 #: src/Layouts/Views/Query.vala:532 msgid "_Cancel" msgstr "_sazamu" #: src/Layouts/Library.vala:467 #, fuzzy, c-format msgid "Unable to Connect to %s" msgstr "Gyamu Enkolagana" #: src/Layouts/Library.vala:480 #, fuzzy msgid "Unable to Export Library " msgstr "Okunyerezebwa tekusobolwa!" #: src/Layouts/Welcome.vala:28 msgid "Welcome to Sequeler" msgstr "Tukwaniriza ku Sequeler" #: src/Layouts/Welcome.vala:29 #, fuzzy msgid "Connect to Any Local or Remote Database." msgstr "Kola enkolagana ne Databesi ku sava yonna" #: src/Layouts/Welcome.vala:38 #, fuzzy msgid "Add a New Database" msgstr "Kola Datanesi empya" #: src/Layouts/Welcome.vala:38 #, fuzzy msgid "Connect to a Database and Save It in Your Library" msgstr "Wegatte ku Database ogiterekke mu terekero lyo." #: src/Layouts/Welcome.vala:39 msgid "Open a New Sequeler Window" msgstr "" #: src/Layouts/Welcome.vala:40 #, fuzzy msgid "Import Connections" msgstr "Gezesa Enkolagana" #: src/Layouts/Welcome.vala:40 msgid "Import Previously Exported Sequeler Connections" msgstr "" #: src/Layouts/Welcome.vala:58 msgid "Select a file" msgstr "" #: src/Layouts/Welcome.vala:61 msgid "_Open" msgstr "" #: src/Layouts/Welcome.vala:107 #, fuzzy msgid "Unable to Import Library " msgstr "Okunyerezebwa tekusobolwa!" #: src/Layouts/DataBaseSchema.vala:66 src/Layouts/DataBaseSchema.vala:167 #, fuzzy msgid "- Select Database -" msgstr "Kola Datanesi empya" #: src/Layouts/DataBaseSchema.vala:87 msgid "Search Tables" msgstr "" #: src/Layouts/DataBaseSchema.vala:98 msgid "Search Tables…" msgstr "" #: src/Layouts/DataBaseSchema.vala:120 msgid "Reload Tables" msgstr "" #: src/Layouts/DataBaseSchema.vala:125 msgid "Add Table" msgstr "" #: src/Layouts/DataBaseSchema.vala:289 msgid "TABLES" msgstr "" #: src/Layouts/DataBaseView.vala:49 msgid "Structure" msgstr "" #: src/Layouts/DataBaseView.vala:50 msgid "Content" msgstr "" #: src/Layouts/DataBaseView.vala:51 msgid "Relations" msgstr "" #: src/Layouts/DataBaseView.vala:52 src/Layouts/DataBaseView.vala:229 #: src/Layouts/DataBaseView.vala:253 #, fuzzy msgid "Query" msgstr "Buza Databesi" #: src/Layouts/DataBaseView.vala:101 msgid "Zoom Out" msgstr "" #: src/Layouts/DataBaseView.vala:107 msgid "Zoom 1:1" msgstr "" #: src/Layouts/DataBaseView.vala:111 msgid "Zoom In" msgstr "" #: src/Layouts/DataBaseView.vala:124 msgid "High Contrast" msgstr "" #: src/Layouts/DataBaseView.vala:132 msgid "Solarized Light" msgstr "" #: src/Layouts/DataBaseView.vala:140 msgid "Solarized Dark" msgstr "" #: src/Layouts/DataBaseView.vala:163 msgid "Change Text Style" msgstr "" #: src/Layouts/DataBaseView.vala:222 msgid "Create a new Query Tab" msgstr "" #: src/Layouts/DataBaseView.vala:240 #, fuzzy, c-format msgid "Query %i" msgstr "Buza Databesi" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select Table" msgstr "" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select a table from the left sidebar to activate this view." msgstr "" #: src/Layouts/Views/Structure.vala:107 src/Layouts/Views/Structure.vala:145 #: src/Layouts/Views/Content.vala:179 src/Layouts/Views/Content.vala:218 #: src/Layouts/Views/Relations.vala:106 src/Layouts/Views/Relations.vala:144 #: src/Layouts/Views/Query.vala:323 msgid "No Results Available" msgstr "Teri bivuddeyo" #: src/Layouts/Views/Structure.vala:118 src/Layouts/Views/Content.vala:191 #: src/Layouts/Views/Relations.vala:117 msgid "Reload Results" msgstr "" #: src/Layouts/Views/Structure.vala:197 msgid " Fields" msgstr "" #: src/Layouts/Views/Content.vala:121 msgid "Previous Page" msgstr "" #: src/Layouts/Views/Content.vala:126 msgid "Next Page" msgstr "" #: src/Layouts/Views/Content.vala:131 #, c-format msgid "%d Pages" msgstr "" #: src/Layouts/Views/Content.vala:134 msgid "Jump to page…" msgstr "" #: src/Layouts/Views/Content.vala:165 msgid "1 Page" msgstr "" #: src/Layouts/Views/Content.vala:171 #, c-format msgid "%d of %d Pages" msgstr "" #: src/Layouts/Views/Content.vala:275 #, c-format msgid "%d Entries" msgstr "" #: src/Layouts/Views/Relations.vala:197 msgid " Constraints" msgstr "" #: src/Layouts/Views/Query.vala:279 #, fuzzy msgid "Running Query…" msgstr "Databesi erikebelwa..." #: src/Layouts/Views/Query.vala:295 src/Layouts/Views/Query.vala:304 msgid "Run Query" msgstr "Buza Databesi" #: src/Layouts/Views/Query.vala:356 msgid "Export Results" msgstr "" #: src/Layouts/Views/Query.vala:369 msgid "Export as CSV" msgstr "" #: src/Layouts/Views/Query.vala:377 msgid "Export as Text" msgstr "" #: src/Layouts/Views/Query.vala:436 src/Layouts/Views/Query.vala:482 msgid "Unable to process Query!" msgstr "Okunyerezebwa tekusobolwa!" #: src/Layouts/Views/Query.vala:457 #, c-format msgid "%d Total Results" msgstr "" #: src/Layouts/Views/Query.vala:492 #, fuzzy, c-format msgid "Query Successfully Executed! Rows Affected: %s" msgstr "Okunyerezebwa kukoze bulungi!" #: src/Layouts/Views/Query.vala:495 #, fuzzy msgid "Query Executed!" msgstr "Okunyerezebwa kukoze bulungi!" #: src/Partials/LibraryItem.vala:107 src/Widgets/ConnectionDialog.vala:431 msgid "Connect" msgstr "Gatta Enkolagana" #: src/Partials/LibraryItem.vala:110 msgid "Edit Connection" msgstr "Terezza Enkolagana" #: src/Partials/LibraryItem.vala:113 #, fuzzy msgid "Duplicate Connection" msgstr "Gyamu Enkolagana" #: src/Partials/LibraryItem.vala:116 msgid "Delete Connection" msgstr "Gyamu Enkolagana" #: src/Partials/LibraryItem.vala:126 msgid "Options" msgstr "" #: src/Partials/TreeBuilder.vala:131 msgid "Error" msgstr "" #: src/Partials/TreeBuilder.vala:131 msgid "on Column" msgstr "" #: src/Partials/TreeBuilder.vala:172 #, c-format msgid "Copy %s" msgstr "" #: src/Services/Settings.vala:106 #, c-format msgid "%s (copy)" msgstr "" #: src/Services/ConnectionManager.vala:193 #, c-format msgid "Libssh2 initialization failed (%d)" msgstr "" #: src/Services/ConnectionManager.vala:202 msgid "Failed to open socket" msgstr "" #: src/Services/ConnectionManager.vala:211 #, fuzzy msgid "Failed to connect!" msgstr "Gyamu Enkolagana" #: src/Services/ConnectionManager.vala:223 #, c-format msgid "Error when starting up SSH session: %d" msgstr "" #: src/Services/ConnectionManager.vala:242 msgid "Authentication by password failed!" msgstr "" #: src/Services/ConnectionManager.vala:252 msgid "Authentication by public key failed!" msgstr "" #: src/Services/ConnectionManager.vala:259 msgid "No supported authentication methods found!" msgstr "" #: src/Services/ConnectionManager.vala:266 msgid "Failed to open listen socket" msgstr "" #: src/Services/ConnectionManager.vala:281 msgid "Failed to bind. Your Database Port may be wrong!" msgstr "" #: src/Services/ConnectionManager.vala:287 msgid "Failed to listen!" msgstr "" #: src/Services/ConnectionManager.vala:314 msgid "Failed to accept remote connection!" msgstr "" #: src/Services/ConnectionManager.vala:323 msgid "" "Could not open the direct-tcpip channel! (Note that this can be a problem at " "the server! Please review the server logs.)" msgstr "" #: src/Services/ConnectionManager.vala:566 msgid "Error!" msgstr "" #: src/Widgets/ConnectionDialog.vala:33 msgid "Missing SSH Key file!" msgstr "" #: src/Widgets/ConnectionDialog.vala:34 msgid "Missing SSH public key!" msgstr "" #: src/Widgets/ConnectionDialog.vala:89 src/Widgets/ConnectionDialog.vala:355 #, fuzzy msgid "Connection" msgstr "Enkolagana empya" #: src/Widgets/ConnectionDialog.vala:141 #, fuzzy msgid "Select connection color" msgstr "Gyamu Enkolagana" #: src/Widgets/ConnectionDialog.vala:164 #, fuzzy msgid "Connection Name:" msgstr "Erinnya ly'enkolagana" #: src/Widgets/ConnectionDialog.vala:165 msgid "Connection's name" msgstr "Erinnya ly'enkolagana" #: src/Widgets/ConnectionDialog.vala:172 msgid "Database Type:" msgstr "Ekika ky'enkolagana:" #: src/Widgets/ConnectionDialog.vala:194 msgid "Host:" msgstr "Erinnya lya Sava:" #: src/Widgets/ConnectionDialog.vala:200 msgid "Database Name:" msgstr "Erinnya lya Databesi:" #: src/Widgets/ConnectionDialog.vala:207 msgid "Username:" msgstr "Erinnya lya agyikozesa:" #: src/Widgets/ConnectionDialog.vala:213 msgid "Password:" msgstr "Ekyama:" #: src/Widgets/ConnectionDialog.vala:217 src/Widgets/ConnectionDialog.vala:227 #: src/Widgets/ConnectionDialog.vala:285 src/Widgets/ConnectionDialog.vala:295 #, fuzzy msgid "Show password" msgstr "Ekyama:" #: src/Widgets/ConnectionDialog.vala:224 src/Widgets/ConnectionDialog.vala:292 #, fuzzy msgid "Hide password" msgstr "Ekyama:" #: src/Widgets/ConnectionDialog.vala:234 msgid "Port:" msgstr "" #: src/Widgets/ConnectionDialog.vala:240 msgid "File Path:" msgstr "" #: src/Widgets/ConnectionDialog.vala:241 msgid "Select Your SQLite File…" msgstr "" #: src/Widgets/ConnectionDialog.vala:261 #, fuzzy msgid "Connect via SSH Tunnel:" msgstr "Enkolagana mu termino" #: src/Widgets/ConnectionDialog.vala:271 #, fuzzy msgid "SSH Host:" msgstr "Erinnya lya Sava:" #: src/Widgets/ConnectionDialog.vala:276 #, fuzzy msgid "SSH Username:" msgstr "Erinnya lya agyikozesa:" #: src/Widgets/ConnectionDialog.vala:281 #, fuzzy msgid "SSH Password:" msgstr "Ekyama:" #: src/Widgets/ConnectionDialog.vala:301 msgid "SSH Port:" msgstr "" #: src/Widgets/ConnectionDialog.vala:302 msgid "Optional" msgstr "" #: src/Widgets/ConnectionDialog.vala:306 msgid "SSH Identity" msgstr "" #: src/Widgets/ConnectionDialog.vala:308 msgid "Select Your Identity File…" msgstr "" #: src/Widgets/ConnectionDialog.vala:324 msgid "Generate SSH Key" msgstr "" #: src/Widgets/ConnectionDialog.vala:356 #, fuzzy msgid "SSH Tunnel" msgstr "Enkolagana mu termino" #: src/Widgets/ConnectionDialog.vala:426 msgid "Close" msgstr "Galawo" #: src/Widgets/ConnectionDialog.vala:427 msgid "Save Connection" msgstr "Tereka Enkolagana" #: src/Widgets/ConnectionDialog.vala:429 msgid "Test Connection" msgstr "Gezesa Enkolagana" #: src/Widgets/ConnectionDialog.vala:620 msgid "Opening SSH Tunnel…" msgstr "" #: src/Widgets/ConnectionDialog.vala:650 #, fuzzy msgid "Testing Connection…" msgstr "Gezesa Enkolagana" #: src/Widgets/ConnectionDialog.vala:661 #, fuzzy msgid "Successfully Connected!" msgstr "Okunyerezebwa kukoze bulungi!" #: src/Widgets/ConnectionDialog.vala:679 #, fuzzy msgid "Saving Connection…" msgstr "Tereka Enkolagana" #: src/Widgets/ConnectionDialog.vala:684 msgid "Connection Saved!" msgstr "Enkolagana eterekeddwa!" #: src/Widgets/ConnectionDialog.vala:692 #, fuzzy msgid "Connecting…" msgstr "Gatta Enkolagana" sequeler-0.8.2/po/lt.po000066400000000000000000000363351410464306200147550ustar00rootroot00000000000000# Lithuanian translations for com.github.alecaddd.sequeler package. # Copyright (C) 2020 THE com.github.alecaddd.sequeler'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.alecaddd.sequeler package. # Moo, 2020. # msgid "" msgstr "" "Project-Id-Version: com.github.alecaddd.sequeler\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-04-11 12:37+0200\n" "PO-Revision-Date: 2021-06-28 12:33+0000\n" "Last-Translator: GM \n" "Language-Team: Lithuanian \n" "Language: lt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n % 10 == 1 && (n % 100 < 11 || n % 100 > " "19)) ? 0 : ((n % 10 >= 2 && n % 10 <= 9 && (n % 100 < 11 || n % 100 > 19)) ? " "1 : 2);\n" "X-Generator: Weblate 4.7.1-dev\n" #: src/Application.vala:62 msgid "Directories are not supported" msgstr "Katalogai yra nepalaikomi" #: src/Application.vala:68 msgid "Don't know what to do" msgstr "Nežinau kÄ… daryti" #: src/Application.vala:80 msgid "Something completely unexpected happened" msgstr "Nutiko kažkas visiÅ¡kai netikÄ—to" #: src/Layouts/HeaderBar.vala:46 src/Layouts/HeaderBar.vala:53 msgid "Logout" msgstr "Atsijungti" #: src/Layouts/HeaderBar.vala:56 msgid "Light background" msgstr "Å viesus fonas" #: src/Layouts/HeaderBar.vala:57 msgid "Dark background" msgstr "Tamsus fonas" #: src/Layouts/HeaderBar.vala:68 src/Layouts/Welcome.vala:39 msgid "New Window" msgstr "Naujas langas" #: src/Layouts/HeaderBar.vala:71 src/Widgets/ConnectionDialog.vala:130 #: src/Widgets/ConnectionDialog.vala:165 msgid "New Connection" msgstr "Naujas ryÅ¡ys" #: src/Layouts/HeaderBar.vala:74 msgid "Quit" msgstr "IÅ¡eiti" #: src/Layouts/HeaderBar.vala:94 msgid "Menu" msgstr "Meniu" #: src/Layouts/Main.vala:77 #, c-format msgid "Connected to %s" msgstr "Prisijungta prie %s" #: src/Layouts/Library.vala:65 msgid "SAVED CONNECTIONS" msgstr "Ä®RAÅ YTI RYÅ IAI" #: src/Layouts/Library.vala:74 msgid "Delete All" msgstr "IÅ¡trinti visus" #: src/Layouts/Library.vala:81 msgid "Reload Library" msgstr "IÅ¡ naujo įkelti bibliotekÄ…" #: src/Layouts/Library.vala:84 msgid "Export Library" msgstr "Eksportuoti bibliotekÄ…" #: src/Layouts/Library.vala:215 src/Layouts/Library.vala:233 msgid "Are you sure you want to proceed?" msgstr "Ar tikrai norite tÄ™sti?" #: src/Layouts/Library.vala:215 msgid "By deleting this connection you won’t be able to recover this data." msgstr "IÅ¡trynÄ™ šį ryšį, nebegalÄ—site atkurti Å¡ių duomenų." #: src/Layouts/Library.vala:218 msgid "Yes, Delete!" msgstr "Taip, iÅ¡trinti!" #: src/Layouts/Library.vala:233 msgid "All the data will be deleted and you won’t be able to recover it." msgstr "Visi duomenys bus iÅ¡trinti ir jÅ«s nebegalÄ—site jų atkurti." #: src/Layouts/Library.vala:236 msgid "Yes, Delete All!" msgstr "Taip, iÅ¡trinti viskÄ…!" #: src/Layouts/Library.vala:330 src/Widgets/ConnectionDialog.vala:575 #: src/Widgets/ConnectionDialog.vala:596 msgid "A username is required in order to connect!" msgstr "Norint prisijungti bÅ«tina įvesti slapyvardį!" #: src/Layouts/Library.vala:404 src/Layouts/Views/Query.vala:528 msgid "Pick a file" msgstr "Pasirinkti failÄ…" #: src/Layouts/Library.vala:407 src/Layouts/Views/Query.vala:531 msgid "_Save" msgstr "Ä®_raÅ¡yti" #: src/Layouts/Library.vala:408 src/Layouts/Welcome.vala:62 #: src/Layouts/Views/Query.vala:532 msgid "_Cancel" msgstr "_Atsisakyti" #: src/Layouts/Library.vala:467 #, c-format msgid "Unable to Connect to %s" msgstr "Nepavyko prisijungti prie %s" #: src/Layouts/Library.vala:480 msgid "Unable to Export Library " msgstr "Nepavyko eksportuoti bibliotekos " #: src/Layouts/Welcome.vala:28 msgid "Welcome to Sequeler" msgstr "Sveiki atvykÄ™ į Sequeler" #: src/Layouts/Welcome.vala:29 msgid "Connect to Any Local or Remote Database." msgstr "Prisijunkite prie bet kurios vietinÄ—s ar nuotolinÄ—s duomenų bazÄ—s." #: src/Layouts/Welcome.vala:38 msgid "Add a New Database" msgstr "PridÄ—ti naujÄ… duomenų bazÄ™" #: src/Layouts/Welcome.vala:38 msgid "Connect to a Database and Save It in Your Library" msgstr "Prisijunkite prie duomenų bazÄ—s ir įraÅ¡ykite jÄ… savo bibliotekoje" #: src/Layouts/Welcome.vala:39 msgid "Open a New Sequeler Window" msgstr "Atverkite naujÄ… Sequeler langÄ…" #: src/Layouts/Welcome.vala:40 msgid "Import Connections" msgstr "Importuoti ryÅ¡ius" #: src/Layouts/Welcome.vala:40 msgid "Import Previously Exported Sequeler Connections" msgstr "Importuokite anksÄiau eksportuotus Sequeler ryÅ¡ius" #: src/Layouts/Welcome.vala:58 msgid "Select a file" msgstr "Pasirinkti failÄ…" #: src/Layouts/Welcome.vala:61 msgid "_Open" msgstr "_Atverti" #: src/Layouts/Welcome.vala:107 msgid "Unable to Import Library " msgstr "Nepavyko importuoti bibliotekos " #: src/Layouts/DataBaseSchema.vala:66 src/Layouts/DataBaseSchema.vala:167 msgid "- Select Database -" msgstr "- Pasirinkite duomenų bazÄ™ -" #: src/Layouts/DataBaseSchema.vala:87 msgid "Search Tables" msgstr "IeÅ¡koti lentelÄ—se" #: src/Layouts/DataBaseSchema.vala:98 msgid "Search Tables…" msgstr "IeÅ¡koti lentelÄ—se…" #: src/Layouts/DataBaseSchema.vala:120 msgid "Reload Tables" msgstr "IÅ¡ naujo įkelti lenteles" #: src/Layouts/DataBaseSchema.vala:125 msgid "Add Table" msgstr "PridÄ—ti lentelÄ™" #: src/Layouts/DataBaseSchema.vala:289 msgid "TABLES" msgstr "LENTELÄ–S" #: src/Layouts/DataBaseView.vala:49 msgid "Structure" msgstr "StruktÅ«ra" #: src/Layouts/DataBaseView.vala:50 msgid "Content" msgstr "Turinys" #: src/Layouts/DataBaseView.vala:51 msgid "Relations" msgstr "SÄ…sajos" #: src/Layouts/DataBaseView.vala:52 src/Layouts/DataBaseView.vala:229 #: src/Layouts/DataBaseView.vala:253 msgid "Query" msgstr "Užklausti" #: src/Layouts/DataBaseView.vala:101 msgid "Zoom Out" msgstr "Atitolinti" #: src/Layouts/DataBaseView.vala:107 msgid "Zoom 1:1" msgstr "Mastelis 1:1" #: src/Layouts/DataBaseView.vala:111 msgid "Zoom In" msgstr "Priartinti" #: src/Layouts/DataBaseView.vala:124 msgid "High Contrast" msgstr "AukÅ¡tas kontrastas" #: src/Layouts/DataBaseView.vala:132 msgid "Solarized Light" msgstr "Solarized Å¡viesa" #: src/Layouts/DataBaseView.vala:140 msgid "Solarized Dark" msgstr "Solarized tamsa" #: src/Layouts/DataBaseView.vala:163 msgid "Change Text Style" msgstr "Pakeisti teksto stilių" #: src/Layouts/DataBaseView.vala:222 msgid "Create a new Query Tab" msgstr "Sukurti naujÄ… užklausos langÄ…" #: src/Layouts/DataBaseView.vala:240 #, c-format msgid "Query %i" msgstr "Užklausti %i" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select Table" msgstr "Pasirinkti lentelÄ™" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select a table from the left sidebar to activate this view." msgstr "" "NorÄ—dami aktyvuoti šį rodinį, pasirinkite lentelÄ™ kairiojoje Å¡oninÄ—je " "juostoje." #: src/Layouts/Views/Structure.vala:107 src/Layouts/Views/Structure.vala:145 #: src/Layouts/Views/Content.vala:179 src/Layouts/Views/Content.vala:218 #: src/Layouts/Views/Relations.vala:106 src/Layouts/Views/Relations.vala:144 #: src/Layouts/Views/Query.vala:323 msgid "No Results Available" msgstr "NÄ—ra prieinamų rezultatų" #: src/Layouts/Views/Structure.vala:118 src/Layouts/Views/Content.vala:191 #: src/Layouts/Views/Relations.vala:117 msgid "Reload Results" msgstr "IÅ¡ naujo įkelti rezultatus" #: src/Layouts/Views/Structure.vala:197 msgid " Fields" msgstr " laukai" #: src/Layouts/Views/Content.vala:121 msgid "Previous Page" msgstr "Ankstesnis puslapis" #: src/Layouts/Views/Content.vala:126 msgid "Next Page" msgstr "Kitas puslapis" #: src/Layouts/Views/Content.vala:131 #, c-format msgid "%d Pages" msgstr "%d puslapių" #: src/Layouts/Views/Content.vala:134 msgid "Jump to page…" msgstr "Pereitį į puslapį…" #: src/Layouts/Views/Content.vala:165 msgid "1 Page" msgstr "1 puslapis" #: src/Layouts/Views/Content.vala:171 #, c-format msgid "%d of %d Pages" msgstr "%d iÅ¡ %d puslapių" #: src/Layouts/Views/Content.vala:275 #, c-format msgid "%d Entries" msgstr "%d įrašų" #: src/Layouts/Views/Relations.vala:197 msgid " Constraints" msgstr " ribojimų" #: src/Layouts/Views/Query.vala:279 msgid "Running Query…" msgstr "Vykdoma užklausa…" #: src/Layouts/Views/Query.vala:295 src/Layouts/Views/Query.vala:304 msgid "Run Query" msgstr "Vykdyti užklausÄ…" #: src/Layouts/Views/Query.vala:356 msgid "Export Results" msgstr "Eksportuoti rezultatus" #: src/Layouts/Views/Query.vala:369 msgid "Export as CSV" msgstr "Eksportuoti kaip CSV" #: src/Layouts/Views/Query.vala:377 msgid "Export as Text" msgstr "Eksportuoti kaip tekstÄ…" #: src/Layouts/Views/Query.vala:436 src/Layouts/Views/Query.vala:482 msgid "Unable to process Query!" msgstr "Nepavyksta įvykdyti užklausos!" #: src/Layouts/Views/Query.vala:457 #, c-format msgid "%d Total Results" msgstr "IÅ¡ viso %d rezultatų" #: src/Layouts/Views/Query.vala:492 #, c-format msgid "Query Successfully Executed! Rows Affected: %s" msgstr "Užklausa sÄ—kmingai įvykdyta! Paveiktos eilutÄ—s: %s" #: src/Layouts/Views/Query.vala:495 msgid "Query Executed!" msgstr "Užklausa įvykdyta!" #: src/Partials/LibraryItem.vala:107 src/Widgets/ConnectionDialog.vala:431 msgid "Connect" msgstr "Prisijungti" #: src/Partials/LibraryItem.vala:110 msgid "Edit Connection" msgstr "Taisyti ryšį" #: src/Partials/LibraryItem.vala:113 msgid "Duplicate Connection" msgstr "Pasikartojantis ryÅ¡ys" #: src/Partials/LibraryItem.vala:116 msgid "Delete Connection" msgstr "IÅ¡trinti ryšį" #: src/Partials/LibraryItem.vala:126 msgid "Options" msgstr "Parametrai" #: src/Partials/TreeBuilder.vala:131 msgid "Error" msgstr "Klaida" #: src/Partials/TreeBuilder.vala:131 msgid "on Column" msgstr "ties stulpeliu" #: src/Partials/TreeBuilder.vala:172 #, c-format msgid "Copy %s" msgstr "Kopijuoti %s" #: src/Services/Settings.vala:106 #, c-format msgid "%s (copy)" msgstr "%s (nukopijuoti)" #: src/Services/ConnectionManager.vala:193 #, c-format msgid "Libssh2 initialization failed (%d)" msgstr "Libssh2 inicijavimas patyrÄ— nesÄ—kmÄ™ (%d)" #: src/Services/ConnectionManager.vala:202 msgid "Failed to open socket" msgstr "Nepavyko atidaryti lizdo" #: src/Services/ConnectionManager.vala:211 msgid "Failed to connect!" msgstr "Nepavyko prisijungti!" #: src/Services/ConnectionManager.vala:223 #, c-format msgid "Error when starting up SSH session: %d" msgstr "Klaida, paleidžiant SSH seansÄ…: %d" #: src/Services/ConnectionManager.vala:242 msgid "Authentication by password failed!" msgstr "TapatybÄ—s nustatymas slaptažodžiu patyrÄ— nesÄ—kmÄ™!" #: src/Services/ConnectionManager.vala:252 msgid "Authentication by public key failed!" msgstr "TapatybÄ—s nustatymas vieÅ¡uoju raktu patyrÄ— nesÄ—kmÄ™!" #: src/Services/ConnectionManager.vala:259 msgid "No supported authentication methods found!" msgstr "Rasti nepalaikomi tapatybÄ—s nustatymo metodai!" #: src/Services/ConnectionManager.vala:266 msgid "Failed to open listen socket" msgstr "Nepavyko atidaryti klausymosi lizdo" #: src/Services/ConnectionManager.vala:281 msgid "Failed to bind. Your Database Port may be wrong!" msgstr "" "Nepavyko susieti. Gali bÅ«ti, kad jÅ«sų duomenų bazÄ—s prievadas yra " "neteisingas!" #: src/Services/ConnectionManager.vala:287 msgid "Failed to listen!" msgstr "Nepavyko klausytis!" #: src/Services/ConnectionManager.vala:314 msgid "Failed to accept remote connection!" msgstr "Nepavyko priimti nuotolinio ryÅ¡io!" #: src/Services/ConnectionManager.vala:323 msgid "" "Could not open the direct-tcpip channel! (Note that this can be a problem at " "the server! Please review the server logs.)" msgstr "" "Nepavyko atidaryti direct-tcpip kanalo! (TurÄ—kite omenyje, kad Å¡i problema " "gali bÅ«ti serveryje! PeržiÅ«rÄ—kite serverio žurnalus.)" #: src/Services/ConnectionManager.vala:566 msgid "Error!" msgstr "Klaida!" #: src/Widgets/ConnectionDialog.vala:33 msgid "Missing SSH Key file!" msgstr "TrÅ«ksta SSH rakto failo!" #: src/Widgets/ConnectionDialog.vala:34 msgid "Missing SSH public key!" msgstr "TrÅ«ksta SSH rakto failo!" #: src/Widgets/ConnectionDialog.vala:89 src/Widgets/ConnectionDialog.vala:355 msgid "Connection" msgstr "RyÅ¡ys" #: src/Widgets/ConnectionDialog.vala:141 msgid "Select connection color" msgstr "PasirinkitÄ™ prisijungimo spalvÄ…" #: src/Widgets/ConnectionDialog.vala:164 msgid "Connection Name:" msgstr "RyÅ¡io pavadinimas:" #: src/Widgets/ConnectionDialog.vala:165 msgid "Connection's name" msgstr "RyÅ¡io pavadinimas" #: src/Widgets/ConnectionDialog.vala:172 msgid "Database Type:" msgstr "Duomenų bazÄ—s tipas:" #: src/Widgets/ConnectionDialog.vala:194 msgid "Host:" msgstr "Serveris:" #: src/Widgets/ConnectionDialog.vala:200 msgid "Database Name:" msgstr "Duomenų bazÄ—s pavadinimas:" #: src/Widgets/ConnectionDialog.vala:207 msgid "Username:" msgstr "Naudotojo vardas:" #: src/Widgets/ConnectionDialog.vala:213 msgid "Password:" msgstr "Slaptažodis:" #: src/Widgets/ConnectionDialog.vala:217 src/Widgets/ConnectionDialog.vala:227 #: src/Widgets/ConnectionDialog.vala:285 src/Widgets/ConnectionDialog.vala:295 msgid "Show password" msgstr "Rodyti slaptažodį" #: src/Widgets/ConnectionDialog.vala:224 src/Widgets/ConnectionDialog.vala:292 msgid "Hide password" msgstr "PaslÄ—pti slaptažodį" #: src/Widgets/ConnectionDialog.vala:234 msgid "Port:" msgstr "Prievadas:" #: src/Widgets/ConnectionDialog.vala:240 msgid "File Path:" msgstr "Failo kelias:" #: src/Widgets/ConnectionDialog.vala:241 msgid "Select Your SQLite File…" msgstr "Pasirinkite savo SQLite failą…" #: src/Widgets/ConnectionDialog.vala:261 msgid "Connect via SSH Tunnel:" msgstr "Prisijungti per SSH tunelį:" #: src/Widgets/ConnectionDialog.vala:271 msgid "SSH Host:" msgstr "SSH serveris:" #: src/Widgets/ConnectionDialog.vala:276 msgid "SSH Username:" msgstr "SSH naudotojo vardas:" #: src/Widgets/ConnectionDialog.vala:281 msgid "SSH Password:" msgstr "SSH slaptažodis:" #: src/Widgets/ConnectionDialog.vala:301 msgid "SSH Port:" msgstr "SSH prievadas:" #: src/Widgets/ConnectionDialog.vala:302 msgid "Optional" msgstr "NebÅ«tina" #: src/Widgets/ConnectionDialog.vala:306 msgid "SSH Identity" msgstr "SSH tapatybÄ—" #: src/Widgets/ConnectionDialog.vala:308 msgid "Select Your Identity File…" msgstr "Pasirinkite savo tapatybÄ—s failą…" #: src/Widgets/ConnectionDialog.vala:324 msgid "Generate SSH Key" msgstr "Generuoti SSH raktÄ…" #: src/Widgets/ConnectionDialog.vala:356 msgid "SSH Tunnel" msgstr "SSH tunelis" #: src/Widgets/ConnectionDialog.vala:426 msgid "Close" msgstr "Užverti" #: src/Widgets/ConnectionDialog.vala:427 msgid "Save Connection" msgstr "Ä®raÅ¡yti ryšį" #: src/Widgets/ConnectionDialog.vala:429 msgid "Test Connection" msgstr "IÅ¡bandyti ryšį" #: src/Widgets/ConnectionDialog.vala:620 msgid "Opening SSH Tunnel…" msgstr "Atidaromas SSH tunelis…" #: src/Widgets/ConnectionDialog.vala:650 msgid "Testing Connection…" msgstr "IÅ¡bandomas ryÅ¡ys…" #: src/Widgets/ConnectionDialog.vala:661 msgid "Successfully Connected!" msgstr "SÄ—kmingai prisijungta!" #: src/Widgets/ConnectionDialog.vala:679 msgid "Saving Connection…" msgstr "Ä®raÅ¡omas ryÅ¡ys…" #: src/Widgets/ConnectionDialog.vala:684 msgid "Connection Saved!" msgstr "RyÅ¡ys įraÅ¡ytas!" #: src/Widgets/ConnectionDialog.vala:692 msgid "Connecting…" msgstr "Jungiamasi…" sequeler-0.8.2/po/meson.build000066400000000000000000000002221410464306200161220ustar00rootroot00000000000000i18n.gettext(meson.project_name(), args: [ '--directory=' + meson.source_root(), '--from-code=UTF-8' ] ) subdir('extra') sequeler-0.8.2/po/pl.po000066400000000000000000000357161410464306200147530ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.alecaddd.sequeler package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: com.github.alecaddd.sequeler\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-04-11 12:37+0200\n" "PO-Revision-Date: 2020-08-04 08:33+0000\n" "Last-Translator: Grzegorz Judas \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 4.2-dev\n" #: src/Application.vala:62 msgid "Directories are not supported" msgstr "Katalogi nie sÄ… wspierane" #: src/Application.vala:68 msgid "Don't know what to do" msgstr "Nie wiem co zrobić" #: src/Application.vala:80 msgid "Something completely unexpected happened" msgstr "WydarzyÅ‚o siÄ™ coÅ› kompletnie niespodziewanego" #: src/Layouts/HeaderBar.vala:46 src/Layouts/HeaderBar.vala:53 msgid "Logout" msgstr "Wyloguj" #: src/Layouts/HeaderBar.vala:56 msgid "Light background" msgstr "Jasne tÅ‚o" #: src/Layouts/HeaderBar.vala:57 msgid "Dark background" msgstr "Ciemne tÅ‚o" #: src/Layouts/HeaderBar.vala:68 src/Layouts/Welcome.vala:39 msgid "New Window" msgstr "Nowe okno" #: src/Layouts/HeaderBar.vala:71 src/Widgets/ConnectionDialog.vala:130 #: src/Widgets/ConnectionDialog.vala:165 msgid "New Connection" msgstr "Nowe połączenie" #: src/Layouts/HeaderBar.vala:74 msgid "Quit" msgstr "WyjÅ›cie" #: src/Layouts/HeaderBar.vala:94 msgid "Menu" msgstr "Menu" #: src/Layouts/Main.vala:77 #, c-format msgid "Connected to %s" msgstr "Połączono z %s" #: src/Layouts/Library.vala:65 msgid "SAVED CONNECTIONS" msgstr "ZAPISANE POÅÄ„CZENIA" #: src/Layouts/Library.vala:74 msgid "Delete All" msgstr "UsuÅ„ wszystko" #: src/Layouts/Library.vala:81 msgid "Reload Library" msgstr "PrzeÅ‚aduj bibliotekÄ™" #: src/Layouts/Library.vala:84 msgid "Export Library" msgstr "Eksportuj bibliotekÄ™" #: src/Layouts/Library.vala:215 src/Layouts/Library.vala:233 msgid "Are you sure you want to proceed?" msgstr "Czy na pewno chcesz kontynuować?" #: src/Layouts/Library.vala:215 msgid "By deleting this connection you won’t be able to recover this data." msgstr "Po usuniÄ™ciu tego połączenia nie bÄ™dzie można go odzyskać." #: src/Layouts/Library.vala:218 msgid "Yes, Delete!" msgstr "Tak, usuÅ„!" #: src/Layouts/Library.vala:233 msgid "All the data will be deleted and you won’t be able to recover it." msgstr "Wszystkie dane zostanÄ… usuniÄ™te i nie bÄ™dzie można ich przywrócić." #: src/Layouts/Library.vala:236 msgid "Yes, Delete All!" msgstr "Tak, usuÅ„ wszystko!" #: src/Layouts/Library.vala:330 src/Widgets/ConnectionDialog.vala:575 #: src/Widgets/ConnectionDialog.vala:596 msgid "A username is required in order to connect!" msgstr "Nazwa użytkownika jest wymagana do połączenia!" #: src/Layouts/Library.vala:404 src/Layouts/Views/Query.vala:528 msgid "Pick a file" msgstr "Wybierz plik" #: src/Layouts/Library.vala:407 src/Layouts/Views/Query.vala:531 msgid "_Save" msgstr "_Zapisz" #: src/Layouts/Library.vala:408 src/Layouts/Welcome.vala:62 #: src/Layouts/Views/Query.vala:532 msgid "_Cancel" msgstr "_Anuluj" #: src/Layouts/Library.vala:467 #, c-format msgid "Unable to Connect to %s" msgstr "Nie można połączyć z %s" #: src/Layouts/Library.vala:480 msgid "Unable to Export Library " msgstr "Nie udaÅ‚o siÄ™ wyeksportować biblioteki " #: src/Layouts/Welcome.vala:28 msgid "Welcome to Sequeler" msgstr "Witaj w programie Sequeler" #: src/Layouts/Welcome.vala:29 msgid "Connect to Any Local or Remote Database." msgstr "Połącz siÄ™ z dowolnÄ… lokalnÄ… lub zdalnÄ… bazÄ… danych." #: src/Layouts/Welcome.vala:38 msgid "Add a New Database" msgstr "Dodaj nowÄ… bazÄ™ danych" #: src/Layouts/Welcome.vala:38 msgid "Connect to a Database and Save It in Your Library" msgstr "Połącz z bazÄ… danych i zapisz jÄ… w swojej bibliotece" #: src/Layouts/Welcome.vala:39 msgid "Open a New Sequeler Window" msgstr "Otwórz nowe okno Sequelera" #: src/Layouts/Welcome.vala:40 msgid "Import Connections" msgstr "Importuj połączenia" #: src/Layouts/Welcome.vala:40 msgid "Import Previously Exported Sequeler Connections" msgstr "Zaimportuj wczeÅ›niej wyeksportowane połączenia programu Sequeler" #: src/Layouts/Welcome.vala:58 msgid "Select a file" msgstr "Wybierz plik" #: src/Layouts/Welcome.vala:61 msgid "_Open" msgstr "_Otwórz" #: src/Layouts/Welcome.vala:107 msgid "Unable to Import Library " msgstr "Nie można zaimportować biblioteki " #: src/Layouts/DataBaseSchema.vala:66 src/Layouts/DataBaseSchema.vala:167 msgid "- Select Database -" msgstr "- Wybierz dazÄ™ danych -" #: src/Layouts/DataBaseSchema.vala:87 msgid "Search Tables" msgstr "Szukaj w tabelach" #: src/Layouts/DataBaseSchema.vala:98 msgid "Search Tables…" msgstr "Szukaj w tabelach…" #: src/Layouts/DataBaseSchema.vala:120 msgid "Reload Tables" msgstr "PrzeÅ‚aduj tabele" #: src/Layouts/DataBaseSchema.vala:125 msgid "Add Table" msgstr "Dodaj tabelÄ™" #: src/Layouts/DataBaseSchema.vala:289 msgid "TABLES" msgstr "TABELE" #: src/Layouts/DataBaseView.vala:49 msgid "Structure" msgstr "Struktura" #: src/Layouts/DataBaseView.vala:50 msgid "Content" msgstr "Dane" #: src/Layouts/DataBaseView.vala:51 msgid "Relations" msgstr "Relacje" #: src/Layouts/DataBaseView.vala:52 src/Layouts/DataBaseView.vala:229 #: src/Layouts/DataBaseView.vala:253 msgid "Query" msgstr "Zapytania" #: src/Layouts/DataBaseView.vala:101 msgid "Zoom Out" msgstr "Oddal" #: src/Layouts/DataBaseView.vala:107 msgid "Zoom 1:1" msgstr "Zbliżenie 1:1" #: src/Layouts/DataBaseView.vala:111 msgid "Zoom In" msgstr "Przybliż" #: src/Layouts/DataBaseView.vala:124 msgid "High Contrast" msgstr "Wysoki kontrast" #: src/Layouts/DataBaseView.vala:132 msgid "Solarized Light" msgstr "RozÅ›wietlony jasny" #: src/Layouts/DataBaseView.vala:140 msgid "Solarized Dark" msgstr "RozÅ›wietlony ciemny" #: src/Layouts/DataBaseView.vala:163 msgid "Change Text Style" msgstr "ZmieÅ„ styl tekstu" #: src/Layouts/DataBaseView.vala:222 msgid "Create a new Query Tab" msgstr "Stwórz nowÄ… kartÄ™ zapytania" #: src/Layouts/DataBaseView.vala:240 #, c-format msgid "Query %i" msgstr "Zapytanie %i" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select Table" msgstr "Wybierz tabelÄ™" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select a table from the left sidebar to activate this view." msgstr "Wybierz tabelÄ™ z menu po lewej by aktywować ten widok." #: src/Layouts/Views/Structure.vala:107 src/Layouts/Views/Structure.vala:145 #: src/Layouts/Views/Content.vala:179 src/Layouts/Views/Content.vala:218 #: src/Layouts/Views/Relations.vala:106 src/Layouts/Views/Relations.vala:144 #: src/Layouts/Views/Query.vala:323 msgid "No Results Available" msgstr "Brak wyników" #: src/Layouts/Views/Structure.vala:118 src/Layouts/Views/Content.vala:191 #: src/Layouts/Views/Relations.vala:117 msgid "Reload Results" msgstr "PrzeÅ‚aduj wyniki" #: src/Layouts/Views/Structure.vala:197 msgid " Fields" msgstr " Pola" #: src/Layouts/Views/Content.vala:121 msgid "Previous Page" msgstr "Poprzednia strona" #: src/Layouts/Views/Content.vala:126 msgid "Next Page" msgstr "NastÄ™pna strona" #: src/Layouts/Views/Content.vala:131 #, c-format msgid "%d Pages" msgstr "Stron: %d" #: src/Layouts/Views/Content.vala:134 msgid "Jump to page…" msgstr "Przejdź do strony…" #: src/Layouts/Views/Content.vala:165 msgid "1 Page" msgstr "1 strona" #: src/Layouts/Views/Content.vala:171 #, c-format msgid "%d of %d Pages" msgstr "%d z %d stron" #: src/Layouts/Views/Content.vala:275 #, c-format msgid "%d Entries" msgstr "%d wpisów" #: src/Layouts/Views/Relations.vala:197 msgid " Constraints" msgstr " Ograniczenia" #: src/Layouts/Views/Query.vala:279 msgid "Running Query…" msgstr "Uruchamianie zapytania…" #: src/Layouts/Views/Query.vala:295 src/Layouts/Views/Query.vala:304 msgid "Run Query" msgstr "Wykonaj zapytanie" #: src/Layouts/Views/Query.vala:356 msgid "Export Results" msgstr "Eksportuj wyniki" #: src/Layouts/Views/Query.vala:369 msgid "Export as CSV" msgstr "Eksportuj do CSV" #: src/Layouts/Views/Query.vala:377 msgid "Export as Text" msgstr "Eksportuj jako tekst" #: src/Layouts/Views/Query.vala:436 src/Layouts/Views/Query.vala:482 msgid "Unable to process Query!" msgstr "Nie udaÅ‚o siÄ™ przetworzyć zapytania!" #: src/Layouts/Views/Query.vala:457 #, c-format msgid "%d Total Results" msgstr "CaÅ‚kowita liczba wyników: %d" #: src/Layouts/Views/Query.vala:492 #, c-format msgid "Query Successfully Executed! Rows Affected: %s" msgstr "Zapytanie wykonane! Zmienionych rekordów: %s" #: src/Layouts/Views/Query.vala:495 msgid "Query Executed!" msgstr "Zapytanie wykonane!" #: src/Partials/LibraryItem.vala:107 src/Widgets/ConnectionDialog.vala:431 msgid "Connect" msgstr "Połącz" #: src/Partials/LibraryItem.vala:110 msgid "Edit Connection" msgstr "Edytuj połączenie" #: src/Partials/LibraryItem.vala:113 msgid "Duplicate Connection" msgstr "Klonuj połączenie" #: src/Partials/LibraryItem.vala:116 msgid "Delete Connection" msgstr "UsuÅ„ połączenie" #: src/Partials/LibraryItem.vala:126 msgid "Options" msgstr "Opcje" #: src/Partials/TreeBuilder.vala:131 msgid "Error" msgstr "Błąd" #: src/Partials/TreeBuilder.vala:131 msgid "on Column" msgstr "w kolumnie" #: src/Partials/TreeBuilder.vala:172 #, c-format msgid "Copy %s" msgstr "Kopiuj %s" #: src/Services/Settings.vala:106 #, c-format msgid "%s (copy)" msgstr "%s (kopia)" #: src/Services/ConnectionManager.vala:193 #, c-format msgid "Libssh2 initialization failed (%d)" msgstr "Nie udaÅ‚o siÄ™ zainicjować Libssh2 (%d)" #: src/Services/ConnectionManager.vala:202 msgid "Failed to open socket" msgstr "Nie udaÅ‚o siÄ™ otworzyć gniazda dla połączenia" #: src/Services/ConnectionManager.vala:211 msgid "Failed to connect!" msgstr "Nie udaÅ‚o siÄ™ połączyć!" #: src/Services/ConnectionManager.vala:223 #, c-format msgid "Error when starting up SSH session: %d" msgstr "Błąd przy uruchamianiu sesji SSH: %d" #: src/Services/ConnectionManager.vala:242 msgid "Authentication by password failed!" msgstr "Uwierzytelnianie hasÅ‚em siÄ™ nie powiodÅ‚o!" #: src/Services/ConnectionManager.vala:252 msgid "Authentication by public key failed!" msgstr "Uwierzytelnianie kluczem publicznym siÄ™ nie powiodÅ‚o!" #: src/Services/ConnectionManager.vala:259 msgid "No supported authentication methods found!" msgstr "Nie znaleziono żadnych wspieranych metod uwierzytelniania!" #: src/Services/ConnectionManager.vala:266 msgid "Failed to open listen socket" msgstr "Nie udaÅ‚o siÄ™ utworzyć gniazda dla nasÅ‚uchiwania" #: src/Services/ConnectionManager.vala:281 msgid "Failed to bind. Your Database Port may be wrong!" msgstr "" "Nie udaÅ‚o siÄ™ przypisać gniazda. Twój port bazy danych może być niepoprawny!" #: src/Services/ConnectionManager.vala:287 msgid "Failed to listen!" msgstr "Nie udaÅ‚o siÄ™ rozpocząć nasÅ‚uchiwania!" #: src/Services/ConnectionManager.vala:314 msgid "Failed to accept remote connection!" msgstr "Nie udaÅ‚o siÄ™ przyjąć zdalnego połączenia!" #: src/Services/ConnectionManager.vala:323 msgid "" "Could not open the direct-tcpip channel! (Note that this can be a problem at " "the server! Please review the server logs.)" msgstr "" "Nie udaÅ‚o siÄ™ otworzyć kanaÅ‚u direct-tcpip! (To może być problem serwera! " "Przejrzyj jego logi.)" #: src/Services/ConnectionManager.vala:566 msgid "Error!" msgstr "Błąd!" #: src/Widgets/ConnectionDialog.vala:33 msgid "Missing SSH Key file!" msgstr "Brak pliku klucza SSH!" #: src/Widgets/ConnectionDialog.vala:34 msgid "Missing SSH public key!" msgstr "Brak pliku klucza publicznego SSH!" #: src/Widgets/ConnectionDialog.vala:89 src/Widgets/ConnectionDialog.vala:355 msgid "Connection" msgstr "Połączenie" #: src/Widgets/ConnectionDialog.vala:141 msgid "Select connection color" msgstr "Wybierz kolor połączenia" #: src/Widgets/ConnectionDialog.vala:164 msgid "Connection Name:" msgstr "Nazwa połączenia:" #: src/Widgets/ConnectionDialog.vala:165 msgid "Connection's name" msgstr "Nazwa połączenia" #: src/Widgets/ConnectionDialog.vala:172 msgid "Database Type:" msgstr "Typ bazy danych:" #: src/Widgets/ConnectionDialog.vala:194 msgid "Host:" msgstr "Adres:" #: src/Widgets/ConnectionDialog.vala:200 msgid "Database Name:" msgstr "Nazwa bazy danych:" #: src/Widgets/ConnectionDialog.vala:207 msgid "Username:" msgstr "Użytkownik:" #: src/Widgets/ConnectionDialog.vala:213 msgid "Password:" msgstr "HasÅ‚o:" #: src/Widgets/ConnectionDialog.vala:217 src/Widgets/ConnectionDialog.vala:227 #: src/Widgets/ConnectionDialog.vala:285 src/Widgets/ConnectionDialog.vala:295 msgid "Show password" msgstr "Pokaż hasÅ‚o" #: src/Widgets/ConnectionDialog.vala:224 src/Widgets/ConnectionDialog.vala:292 msgid "Hide password" msgstr "Ukryj hasÅ‚o" #: src/Widgets/ConnectionDialog.vala:234 msgid "Port:" msgstr "Port:" #: src/Widgets/ConnectionDialog.vala:240 msgid "File Path:" msgstr "Åšcieżka do pliku:" #: src/Widgets/ConnectionDialog.vala:241 msgid "Select Your SQLite File…" msgstr "Wybierz plik SQLite…" #: src/Widgets/ConnectionDialog.vala:261 msgid "Connect via SSH Tunnel:" msgstr "Połącz przez tunel SSH:" #: src/Widgets/ConnectionDialog.vala:271 msgid "SSH Host:" msgstr "Adres SSH:" #: src/Widgets/ConnectionDialog.vala:276 msgid "SSH Username:" msgstr "Użytkownik SSH:" #: src/Widgets/ConnectionDialog.vala:281 msgid "SSH Password:" msgstr "HasÅ‚o SSH:" #: src/Widgets/ConnectionDialog.vala:301 msgid "SSH Port:" msgstr "Port SSH:" #: src/Widgets/ConnectionDialog.vala:302 msgid "Optional" msgstr "Opcjonalne" #: src/Widgets/ConnectionDialog.vala:306 msgid "SSH Identity" msgstr "Tożsamość SSH" #: src/Widgets/ConnectionDialog.vala:308 msgid "Select Your Identity File…" msgstr "Wybierz plik tożsamoÅ›ci…" #: src/Widgets/ConnectionDialog.vala:324 msgid "Generate SSH Key" msgstr "Wygeneruj klucz SSH" #: src/Widgets/ConnectionDialog.vala:356 msgid "SSH Tunnel" msgstr "Tunel SSH" #: src/Widgets/ConnectionDialog.vala:426 msgid "Close" msgstr "Zamknij" #: src/Widgets/ConnectionDialog.vala:427 msgid "Save Connection" msgstr "Zapisz" #: src/Widgets/ConnectionDialog.vala:429 msgid "Test Connection" msgstr "Test połączenia" #: src/Widgets/ConnectionDialog.vala:620 msgid "Opening SSH Tunnel…" msgstr "Otwieranie tunelu SSH…" #: src/Widgets/ConnectionDialog.vala:650 msgid "Testing Connection…" msgstr "Testowanie połączenia…" #: src/Widgets/ConnectionDialog.vala:661 msgid "Successfully Connected!" msgstr "UdaÅ‚o siÄ™ połączyć!" #: src/Widgets/ConnectionDialog.vala:679 msgid "Saving Connection…" msgstr "Zapisywanie połączenia…" #: src/Widgets/ConnectionDialog.vala:684 msgid "Connection Saved!" msgstr "Połączenie zapisane!" #: src/Widgets/ConnectionDialog.vala:692 msgid "Connecting…" msgstr "ÅÄ…czenie…" sequeler-0.8.2/po/pt.po000066400000000000000000000355571410464306200147660ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.alecaddd.sequeler package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: com.github.alecaddd.sequeler\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-04-11 12:37+0200\n" "PO-Revision-Date: 2020-08-30 19:37+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese \n" "Language: pt\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: Weblate 4.2.1-dev\n" #: src/Application.vala:62 msgid "Directories are not supported" msgstr "Diretórios não são suportados" #: src/Application.vala:68 msgid "Don't know what to do" msgstr "Não sei o que fazer" #: src/Application.vala:80 msgid "Something completely unexpected happened" msgstr "Algo inesperado aconteceu" #: src/Layouts/HeaderBar.vala:46 src/Layouts/HeaderBar.vala:53 msgid "Logout" msgstr "Sair" #: src/Layouts/HeaderBar.vala:56 msgid "Light background" msgstr "Fundo claro" #: src/Layouts/HeaderBar.vala:57 msgid "Dark background" msgstr "Fundo escuro" #: src/Layouts/HeaderBar.vala:68 src/Layouts/Welcome.vala:39 msgid "New Window" msgstr "Nova Janela" #: src/Layouts/HeaderBar.vala:71 src/Widgets/ConnectionDialog.vala:130 #: src/Widgets/ConnectionDialog.vala:165 msgid "New Connection" msgstr "Nova Conexão" #: src/Layouts/HeaderBar.vala:74 msgid "Quit" msgstr "Sair" #: src/Layouts/HeaderBar.vala:94 msgid "Menu" msgstr "Menu" #: src/Layouts/Main.vala:77 #, c-format msgid "Connected to %s" msgstr "Conectado a %s" #: src/Layouts/Library.vala:65 msgid "SAVED CONNECTIONS" msgstr "CONEXÕES SALVAS" #: src/Layouts/Library.vala:74 msgid "Delete All" msgstr "Apagar Tudo" #: src/Layouts/Library.vala:81 msgid "Reload Library" msgstr "Recarregar Biblioteca" #: src/Layouts/Library.vala:84 msgid "Export Library" msgstr "Exportar Biblioteca" #: src/Layouts/Library.vala:215 src/Layouts/Library.vala:233 msgid "Are you sure you want to proceed?" msgstr "Tem certeza que deseja prosseguir?" #: src/Layouts/Library.vala:215 msgid "By deleting this connection you won’t be able to recover this data." msgstr "Ao apagar esta conexão, não será capaz de recuperar estes dados." #: src/Layouts/Library.vala:218 msgid "Yes, Delete!" msgstr "Sim, Apague!" #: src/Layouts/Library.vala:233 msgid "All the data will be deleted and you won’t be able to recover it." msgstr "Todos os dados serão apagados e não será capaz de recuperá-los." #: src/Layouts/Library.vala:236 msgid "Yes, Delete All!" msgstr "Sim, Apague Tudo!" #: src/Layouts/Library.vala:330 src/Widgets/ConnectionDialog.vala:575 #: src/Widgets/ConnectionDialog.vala:596 msgid "A username is required in order to connect!" msgstr "É obrigatório um nome de utilizador para conectar!" #: src/Layouts/Library.vala:404 src/Layouts/Views/Query.vala:528 msgid "Pick a file" msgstr "Escolha um ficheiro" #: src/Layouts/Library.vala:407 src/Layouts/Views/Query.vala:531 msgid "_Save" msgstr "_Gravar" #: src/Layouts/Library.vala:408 src/Layouts/Welcome.vala:62 #: src/Layouts/Views/Query.vala:532 msgid "_Cancel" msgstr "_Cancelar" #: src/Layouts/Library.vala:467 #, c-format msgid "Unable to Connect to %s" msgstr "Não é possível conectar-se a %s" #: src/Layouts/Library.vala:480 msgid "Unable to Export Library " msgstr "Não é Possível Exportar a Biblioteca " #: src/Layouts/Welcome.vala:28 msgid "Welcome to Sequeler" msgstr "Bem-vindo ao Sequeler" #: src/Layouts/Welcome.vala:29 msgid "Connect to Any Local or Remote Database." msgstr "Conecte-se a qualquer banco de dados local ou remoto." #: src/Layouts/Welcome.vala:38 msgid "Add a New Database" msgstr "Adicionar um Novo Banco de Dados" #: src/Layouts/Welcome.vala:38 msgid "Connect to a Database and Save It in Your Library" msgstr "Conecte-se a um Banco de Dados e Grave ele em sua Biblioteca" #: src/Layouts/Welcome.vala:39 msgid "Open a New Sequeler Window" msgstr "Abrir uma nova janela do Sequeler" #: src/Layouts/Welcome.vala:40 msgid "Import Connections" msgstr "Importar Conexões" #: src/Layouts/Welcome.vala:40 msgid "Import Previously Exported Sequeler Connections" msgstr "Importar Conexões do Sequeler Exportadas Anteriormente" #: src/Layouts/Welcome.vala:58 msgid "Select a file" msgstr "Selecione um ficheiro" #: src/Layouts/Welcome.vala:61 msgid "_Open" msgstr "_Abrir" #: src/Layouts/Welcome.vala:107 msgid "Unable to Import Library " msgstr "Não é Possível Importar a Biblioteca " #: src/Layouts/DataBaseSchema.vala:66 src/Layouts/DataBaseSchema.vala:167 msgid "- Select Database -" msgstr "- Selecione o Banco de Dados -" #: src/Layouts/DataBaseSchema.vala:87 msgid "Search Tables" msgstr "Buscar Tabelas" #: src/Layouts/DataBaseSchema.vala:98 msgid "Search Tables…" msgstr "Buscar Tabelas…" #: src/Layouts/DataBaseSchema.vala:120 msgid "Reload Tables" msgstr "Recarregar as Tabelas" #: src/Layouts/DataBaseSchema.vala:125 msgid "Add Table" msgstr "Adicionar Tabela" #: src/Layouts/DataBaseSchema.vala:289 msgid "TABLES" msgstr "TABELAS" #: src/Layouts/DataBaseView.vala:49 msgid "Structure" msgstr "Estrutura" #: src/Layouts/DataBaseView.vala:50 msgid "Content" msgstr "Conteúdo" #: src/Layouts/DataBaseView.vala:51 msgid "Relations" msgstr "Relacionamentos" #: src/Layouts/DataBaseView.vala:52 src/Layouts/DataBaseView.vala:229 #: src/Layouts/DataBaseView.vala:253 msgid "Query" msgstr "Consultar" #: src/Layouts/DataBaseView.vala:101 msgid "Zoom Out" msgstr "Diminuir zoom" #: src/Layouts/DataBaseView.vala:107 msgid "Zoom 1:1" msgstr "Zoom 1:1" #: src/Layouts/DataBaseView.vala:111 msgid "Zoom In" msgstr "Aumentar Zoom" #: src/Layouts/DataBaseView.vala:124 msgid "High Contrast" msgstr "Alto Contraste" #: src/Layouts/DataBaseView.vala:132 msgid "Solarized Light" msgstr "Claro Solarizado" #: src/Layouts/DataBaseView.vala:140 msgid "Solarized Dark" msgstr "Escuro Solarizado" #: src/Layouts/DataBaseView.vala:163 msgid "Change Text Style" msgstr "Mudar Estilo do Texto" #: src/Layouts/DataBaseView.vala:222 msgid "Create a new Query Tab" msgstr "Criar uma nova Guia de Consultas" #: src/Layouts/DataBaseView.vala:240 #, c-format msgid "Query %i" msgstr "Consultar %i" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select Table" msgstr "Selecionar Tabela" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select a table from the left sidebar to activate this view." msgstr "" "Selecione uma tabela da barra lateral esquerda para ativar esta exibição." #: src/Layouts/Views/Structure.vala:107 src/Layouts/Views/Structure.vala:145 #: src/Layouts/Views/Content.vala:179 src/Layouts/Views/Content.vala:218 #: src/Layouts/Views/Relations.vala:106 src/Layouts/Views/Relations.vala:144 #: src/Layouts/Views/Query.vala:323 msgid "No Results Available" msgstr "Não Há Resultados Disponíveis" #: src/Layouts/Views/Structure.vala:118 src/Layouts/Views/Content.vala:191 #: src/Layouts/Views/Relations.vala:117 msgid "Reload Results" msgstr "Recarregar Resultados" #: src/Layouts/Views/Structure.vala:197 msgid " Fields" msgstr " Campos" #: src/Layouts/Views/Content.vala:121 msgid "Previous Page" msgstr "Página Anterior" #: src/Layouts/Views/Content.vala:126 msgid "Next Page" msgstr "Próxima Página" #: src/Layouts/Views/Content.vala:131 #, c-format msgid "%d Pages" msgstr "%d páginas" #: src/Layouts/Views/Content.vala:134 msgid "Jump to page…" msgstr "Ir para página…" #: src/Layouts/Views/Content.vala:165 msgid "1 Page" msgstr "1 Página" #: src/Layouts/Views/Content.vala:171 #, c-format msgid "%d of %d Pages" msgstr "%d de %d Páginas" #: src/Layouts/Views/Content.vala:275 #, c-format msgid "%d Entries" msgstr "%d Entradas" #: src/Layouts/Views/Relations.vala:197 msgid " Constraints" msgstr " Restrições" #: src/Layouts/Views/Query.vala:279 msgid "Running Query…" msgstr "Executando Consulta…" #: src/Layouts/Views/Query.vala:295 src/Layouts/Views/Query.vala:304 msgid "Run Query" msgstr "Executar Consulta" #: src/Layouts/Views/Query.vala:356 msgid "Export Results" msgstr "Exportar Resultados" #: src/Layouts/Views/Query.vala:369 msgid "Export as CSV" msgstr "Exportar como CSV" #: src/Layouts/Views/Query.vala:377 msgid "Export as Text" msgstr "Exportar como Texto" #: src/Layouts/Views/Query.vala:436 src/Layouts/Views/Query.vala:482 msgid "Unable to process Query!" msgstr "Não é possível processar a consulta!" #: src/Layouts/Views/Query.vala:457 #, c-format msgid "%d Total Results" msgstr "Total de %d Resultados" #: src/Layouts/Views/Query.vala:492 #, c-format msgid "Query Successfully Executed! Rows Affected: %s" msgstr "Consulta executada com sucesso! Linhas afetadas: %s" #: src/Layouts/Views/Query.vala:495 msgid "Query Executed!" msgstr "Consulta Executada!" #: src/Partials/LibraryItem.vala:107 src/Widgets/ConnectionDialog.vala:431 msgid "Connect" msgstr "Conectar" #: src/Partials/LibraryItem.vala:110 msgid "Edit Connection" msgstr "Editar Conexão" #: src/Partials/LibraryItem.vala:113 msgid "Duplicate Connection" msgstr "Duplicar Conexão" #: src/Partials/LibraryItem.vala:116 msgid "Delete Connection" msgstr "Remover Conexão" #: src/Partials/LibraryItem.vala:126 msgid "Options" msgstr "Opções" #: src/Partials/TreeBuilder.vala:131 msgid "Error" msgstr "Erro" #: src/Partials/TreeBuilder.vala:131 msgid "on Column" msgstr "na Coluna" #: src/Partials/TreeBuilder.vala:172 #, c-format msgid "Copy %s" msgstr "Copiar %s" #: src/Services/Settings.vala:106 #, c-format msgid "%s (copy)" msgstr "%s (cópia)" #: src/Services/ConnectionManager.vala:193 #, c-format msgid "Libssh2 initialization failed (%d)" msgstr "Falha ao iniciar libssh2 (%d)" #: src/Services/ConnectionManager.vala:202 msgid "Failed to open socket" msgstr "Falha ao abrir socket" #: src/Services/ConnectionManager.vala:211 msgid "Failed to connect!" msgstr "Falhou ao conectar!" #: src/Services/ConnectionManager.vala:223 #, c-format msgid "Error when starting up SSH session: %d" msgstr "Erro ao iniciar sessão SSH: %d" #: src/Services/ConnectionManager.vala:242 msgid "Authentication by password failed!" msgstr "Falha na autenticação por palavra-passe!" #: src/Services/ConnectionManager.vala:252 msgid "Authentication by public key failed!" msgstr "Autenticação via chave pública falhou!" #: src/Services/ConnectionManager.vala:259 msgid "No supported authentication methods found!" msgstr "Não foi encontrado nenhum método de autenticação suportado!" #: src/Services/ConnectionManager.vala:266 msgid "Failed to open listen socket" msgstr "Falha ao abrir o socket" #: src/Services/ConnectionManager.vala:281 msgid "Failed to bind. Your Database Port may be wrong!" msgstr "Falha ao conectar. A porta do banco de dados pode estar errada!" #: src/Services/ConnectionManager.vala:287 msgid "Failed to listen!" msgstr "Falha ao iniciar!" #: src/Services/ConnectionManager.vala:314 msgid "Failed to accept remote connection!" msgstr "Falha ao aceitar a conexão remota!" #: src/Services/ConnectionManager.vala:323 msgid "" "Could not open the direct-tcpip channel! (Note that this can be a problem at " "the server! Please review the server logs.)" msgstr "" "Não foi possível abrir o canal direct-tcpip! (Note que isso pode ser um " "problema no servidor! Por favor, verifique os logs do servidor.)" #: src/Services/ConnectionManager.vala:566 msgid "Error!" msgstr "Erro!" #: src/Widgets/ConnectionDialog.vala:33 msgid "Missing SSH Key file!" msgstr "Ficheiro de chave SSH não encontrada!" #: src/Widgets/ConnectionDialog.vala:34 msgid "Missing SSH public key!" msgstr "Chave pública SSH não encontrada!" #: src/Widgets/ConnectionDialog.vala:89 src/Widgets/ConnectionDialog.vala:355 msgid "Connection" msgstr "Conexão" #: src/Widgets/ConnectionDialog.vala:141 msgid "Select connection color" msgstr "Escolha a cor da conexão" #: src/Widgets/ConnectionDialog.vala:164 msgid "Connection Name:" msgstr "Nome da Conexão:" #: src/Widgets/ConnectionDialog.vala:165 msgid "Connection's name" msgstr "Nome da Conexão" #: src/Widgets/ConnectionDialog.vala:172 msgid "Database Type:" msgstr "Tipo de Banco de Dados:" #: src/Widgets/ConnectionDialog.vala:194 msgid "Host:" msgstr "Host:" #: src/Widgets/ConnectionDialog.vala:200 msgid "Database Name:" msgstr "Nome do Banco de Dados:" #: src/Widgets/ConnectionDialog.vala:207 msgid "Username:" msgstr "Utilizador:" #: src/Widgets/ConnectionDialog.vala:213 msgid "Password:" msgstr "Palavra-passe:" #: src/Widgets/ConnectionDialog.vala:217 src/Widgets/ConnectionDialog.vala:227 #: src/Widgets/ConnectionDialog.vala:285 src/Widgets/ConnectionDialog.vala:295 msgid "Show password" msgstr "Exibir palavra-passe" #: src/Widgets/ConnectionDialog.vala:224 src/Widgets/ConnectionDialog.vala:292 msgid "Hide password" msgstr "Ocultar palavra-passe" #: src/Widgets/ConnectionDialog.vala:234 msgid "Port:" msgstr "Porta:" #: src/Widgets/ConnectionDialog.vala:240 msgid "File Path:" msgstr "Caminho do Ficheiro:" #: src/Widgets/ConnectionDialog.vala:241 msgid "Select Your SQLite File…" msgstr "Selecione seu Ficheiro SQLite…" #: src/Widgets/ConnectionDialog.vala:261 msgid "Connect via SSH Tunnel:" msgstr "Conectar via terminal SSH:" #: src/Widgets/ConnectionDialog.vala:271 msgid "SSH Host:" msgstr "Host SSH:" #: src/Widgets/ConnectionDialog.vala:276 msgid "SSH Username:" msgstr "Utilizador SSH:" #: src/Widgets/ConnectionDialog.vala:281 msgid "SSH Password:" msgstr "Palavra-passe SSH:" #: src/Widgets/ConnectionDialog.vala:301 msgid "SSH Port:" msgstr "Porta SSH:" #: src/Widgets/ConnectionDialog.vala:302 msgid "Optional" msgstr "Opcional" #: src/Widgets/ConnectionDialog.vala:306 msgid "SSH Identity" msgstr "Identidade SSH" #: src/Widgets/ConnectionDialog.vala:308 msgid "Select Your Identity File…" msgstr "Selecione o seu ficheiro de identificação…" #: src/Widgets/ConnectionDialog.vala:324 msgid "Generate SSH Key" msgstr "Gerar chave SSH" #: src/Widgets/ConnectionDialog.vala:356 msgid "SSH Tunnel" msgstr "Túnel SSH" #: src/Widgets/ConnectionDialog.vala:426 msgid "Close" msgstr "Fechar" #: src/Widgets/ConnectionDialog.vala:427 msgid "Save Connection" msgstr "Gravar Conexão" #: src/Widgets/ConnectionDialog.vala:429 msgid "Test Connection" msgstr "Testar Conexão" #: src/Widgets/ConnectionDialog.vala:620 msgid "Opening SSH Tunnel…" msgstr "A abrir túnel SSH…" #: src/Widgets/ConnectionDialog.vala:650 msgid "Testing Connection…" msgstr "Testando Conexão…" #: src/Widgets/ConnectionDialog.vala:661 msgid "Successfully Connected!" msgstr "Conectado com Sucesso!" #: src/Widgets/ConnectionDialog.vala:679 msgid "Saving Connection…" msgstr "A gravar Conexão…" #: src/Widgets/ConnectionDialog.vala:684 msgid "Connection Saved!" msgstr "Conexão Salva!" #: src/Widgets/ConnectionDialog.vala:692 msgid "Connecting…" msgstr "Conectando…" sequeler-0.8.2/po/pt_BR.po000066400000000000000000000356711410464306200153460ustar00rootroot00000000000000# Portuguese translations for com.github.alecaddd.sequeler package. # Copyright (C) 2020 THE com.github.alecaddd.sequeler'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.alecaddd.sequeler package. # Everson Santos Araujo , 2020. # msgid "" msgstr "" "Project-Id-Version: com.github.alecaddd.sequeler\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-04-11 12:37+0200\n" "PO-Revision-Date: 2020-08-19 03:33+0000\n" "Last-Translator: Eduardo Addad de Oliveira \n" "Language-Team: Portuguese (Brazil) \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: Weblate 4.2-dev\n" #: src/Application.vala:62 msgid "Directories are not supported" msgstr "Diretórios não são suportados" #: src/Application.vala:68 msgid "Don't know what to do" msgstr "Não sei o que fazer" #: src/Application.vala:80 msgid "Something completely unexpected happened" msgstr "Algo inesperado aconteceu" #: src/Layouts/HeaderBar.vala:46 src/Layouts/HeaderBar.vala:53 msgid "Logout" msgstr "Sair" #: src/Layouts/HeaderBar.vala:56 msgid "Light background" msgstr "Fundo claro" #: src/Layouts/HeaderBar.vala:57 msgid "Dark background" msgstr "Fundo escuro" #: src/Layouts/HeaderBar.vala:68 src/Layouts/Welcome.vala:39 msgid "New Window" msgstr "Nova Janela" #: src/Layouts/HeaderBar.vala:71 src/Widgets/ConnectionDialog.vala:130 #: src/Widgets/ConnectionDialog.vala:165 msgid "New Connection" msgstr "Nova Conexão" #: src/Layouts/HeaderBar.vala:74 msgid "Quit" msgstr "Sair" #: src/Layouts/HeaderBar.vala:94 msgid "Menu" msgstr "Menu" #: src/Layouts/Main.vala:77 #, c-format msgid "Connected to %s" msgstr "Conectado a %s" #: src/Layouts/Library.vala:65 msgid "SAVED CONNECTIONS" msgstr "CONEXÕES SALVAS" #: src/Layouts/Library.vala:74 msgid "Delete All" msgstr "Apagar Tudo" #: src/Layouts/Library.vala:81 msgid "Reload Library" msgstr "Recarregar Biblioteca" #: src/Layouts/Library.vala:84 msgid "Export Library" msgstr "Exportar Biblioteca" #: src/Layouts/Library.vala:215 src/Layouts/Library.vala:233 msgid "Are you sure you want to proceed?" msgstr "Tem certeza que deseja prosseguir?" #: src/Layouts/Library.vala:215 msgid "By deleting this connection you won’t be able to recover this data." msgstr "Ao excluir esta conexão, você não será capaz de recuperar estes dados." #: src/Layouts/Library.vala:218 msgid "Yes, Delete!" msgstr "Sim, Apague!" #: src/Layouts/Library.vala:233 msgid "All the data will be deleted and you won’t be able to recover it." msgstr "Todos os dados serão apagados e você não será capaz de recuperá-los." #: src/Layouts/Library.vala:236 msgid "Yes, Delete All!" msgstr "Sim, Apague Tudo!" #: src/Layouts/Library.vala:330 src/Widgets/ConnectionDialog.vala:575 #: src/Widgets/ConnectionDialog.vala:596 msgid "A username is required in order to connect!" msgstr "É obrigatório um nome de usuário para conectar!" #: src/Layouts/Library.vala:404 src/Layouts/Views/Query.vala:528 msgid "Pick a file" msgstr "Escolha um arquivo" #: src/Layouts/Library.vala:407 src/Layouts/Views/Query.vala:531 msgid "_Save" msgstr "_Salvar" #: src/Layouts/Library.vala:408 src/Layouts/Welcome.vala:62 #: src/Layouts/Views/Query.vala:532 msgid "_Cancel" msgstr "_Cancelar" #: src/Layouts/Library.vala:467 #, c-format msgid "Unable to Connect to %s" msgstr "Não é possível conectar-se a %s" #: src/Layouts/Library.vala:480 msgid "Unable to Export Library " msgstr "Não é Possível Exportar a Biblioteca " #: src/Layouts/Welcome.vala:28 msgid "Welcome to Sequeler" msgstr "Bem-vindo ao Sequeler" #: src/Layouts/Welcome.vala:29 msgid "Connect to Any Local or Remote Database." msgstr "Conecte-se a qualquer banco de dados local ou remoto." #: src/Layouts/Welcome.vala:38 msgid "Add a New Database" msgstr "Adicionar um Novo Banco de Dados" #: src/Layouts/Welcome.vala:38 msgid "Connect to a Database and Save It in Your Library" msgstr "Conecte-se a um Banco de Dados e Salve ele em sua Biblioteca" #: src/Layouts/Welcome.vala:39 msgid "Open a New Sequeler Window" msgstr "Abrir uma nova janela do Sequeler" #: src/Layouts/Welcome.vala:40 msgid "Import Connections" msgstr "Importar Conexões" #: src/Layouts/Welcome.vala:40 msgid "Import Previously Exported Sequeler Connections" msgstr "Importar Conexões do Sequeler Exportadas Anteriormente" #: src/Layouts/Welcome.vala:58 msgid "Select a file" msgstr "Selecione um arquivo" #: src/Layouts/Welcome.vala:61 msgid "_Open" msgstr "_Abrir" #: src/Layouts/Welcome.vala:107 msgid "Unable to Import Library " msgstr "Não é Possível Importar a Biblioteca " #: src/Layouts/DataBaseSchema.vala:66 src/Layouts/DataBaseSchema.vala:167 msgid "- Select Database -" msgstr "- Selecione o Banco de Dados -" #: src/Layouts/DataBaseSchema.vala:87 msgid "Search Tables" msgstr "Buscar Tabelas" #: src/Layouts/DataBaseSchema.vala:98 msgid "Search Tables…" msgstr "Buscar Tabelas…" #: src/Layouts/DataBaseSchema.vala:120 msgid "Reload Tables" msgstr "Recarregar as Tabelas" #: src/Layouts/DataBaseSchema.vala:125 msgid "Add Table" msgstr "Adicionar Tabela" #: src/Layouts/DataBaseSchema.vala:289 msgid "TABLES" msgstr "TABELAS" #: src/Layouts/DataBaseView.vala:49 msgid "Structure" msgstr "Estrutura" #: src/Layouts/DataBaseView.vala:50 msgid "Content" msgstr "Conteúdo" #: src/Layouts/DataBaseView.vala:51 msgid "Relations" msgstr "Relacionamentos" #: src/Layouts/DataBaseView.vala:52 src/Layouts/DataBaseView.vala:229 #: src/Layouts/DataBaseView.vala:253 msgid "Query" msgstr "Consultar" #: src/Layouts/DataBaseView.vala:101 msgid "Zoom Out" msgstr "Diminuir zoom" #: src/Layouts/DataBaseView.vala:107 msgid "Zoom 1:1" msgstr "Zoom 1:1" #: src/Layouts/DataBaseView.vala:111 msgid "Zoom In" msgstr "Aumentar Zoom" #: src/Layouts/DataBaseView.vala:124 msgid "High Contrast" msgstr "Alto Contraste" #: src/Layouts/DataBaseView.vala:132 msgid "Solarized Light" msgstr "Claro Solarizado" #: src/Layouts/DataBaseView.vala:140 msgid "Solarized Dark" msgstr "Escuro Solarizado" #: src/Layouts/DataBaseView.vala:163 msgid "Change Text Style" msgstr "Mudar Estilo do Texto" #: src/Layouts/DataBaseView.vala:222 msgid "Create a new Query Tab" msgstr "Criar uma nova Aba de Consultas" #: src/Layouts/DataBaseView.vala:240 #, c-format msgid "Query %i" msgstr "Consultar %i" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select Table" msgstr "Selecionar Tabela" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select a table from the left sidebar to activate this view." msgstr "" "Selecione uma tabela da barra lateral esquerda para ativar esta exibição." #: src/Layouts/Views/Structure.vala:107 src/Layouts/Views/Structure.vala:145 #: src/Layouts/Views/Content.vala:179 src/Layouts/Views/Content.vala:218 #: src/Layouts/Views/Relations.vala:106 src/Layouts/Views/Relations.vala:144 #: src/Layouts/Views/Query.vala:323 msgid "No Results Available" msgstr "Não Há Resultados Disponíveis" #: src/Layouts/Views/Structure.vala:118 src/Layouts/Views/Content.vala:191 #: src/Layouts/Views/Relations.vala:117 msgid "Reload Results" msgstr "Recarregar Resultados" #: src/Layouts/Views/Structure.vala:197 msgid " Fields" msgstr " Campos" #: src/Layouts/Views/Content.vala:121 msgid "Previous Page" msgstr "Página Anterior" #: src/Layouts/Views/Content.vala:126 msgid "Next Page" msgstr "Próxima Página" #: src/Layouts/Views/Content.vala:131 #, c-format msgid "%d Pages" msgstr "%d páginas" #: src/Layouts/Views/Content.vala:134 msgid "Jump to page…" msgstr "Ir para página..." #: src/Layouts/Views/Content.vala:165 msgid "1 Page" msgstr "1 Página" #: src/Layouts/Views/Content.vala:171 #, c-format msgid "%d of %d Pages" msgstr "%d de %d Páginas" #: src/Layouts/Views/Content.vala:275 #, c-format msgid "%d Entries" msgstr "%d Entradas" #: src/Layouts/Views/Relations.vala:197 msgid " Constraints" msgstr " Restrições" #: src/Layouts/Views/Query.vala:279 msgid "Running Query…" msgstr "Executando Consulta…" #: src/Layouts/Views/Query.vala:295 src/Layouts/Views/Query.vala:304 msgid "Run Query" msgstr "Executar Consulta" #: src/Layouts/Views/Query.vala:356 msgid "Export Results" msgstr "Exportar Resultados" #: src/Layouts/Views/Query.vala:369 msgid "Export as CSV" msgstr "Exportar como CSV" #: src/Layouts/Views/Query.vala:377 msgid "Export as Text" msgstr "Exportar como Texto" #: src/Layouts/Views/Query.vala:436 src/Layouts/Views/Query.vala:482 msgid "Unable to process Query!" msgstr "Não é possível processar a consulta!" #: src/Layouts/Views/Query.vala:457 #, c-format msgid "%d Total Results" msgstr "Total de %d Resultados" #: src/Layouts/Views/Query.vala:492 #, c-format msgid "Query Successfully Executed! Rows Affected: %s" msgstr "Consulta executada com sucesso! Linhas afetadas: %s" #: src/Layouts/Views/Query.vala:495 msgid "Query Executed!" msgstr "Consulta Executada!" #: src/Partials/LibraryItem.vala:107 src/Widgets/ConnectionDialog.vala:431 msgid "Connect" msgstr "Conectar" #: src/Partials/LibraryItem.vala:110 msgid "Edit Connection" msgstr "Editar Conexão" #: src/Partials/LibraryItem.vala:113 msgid "Duplicate Connection" msgstr "Duplicar Conexão" #: src/Partials/LibraryItem.vala:116 msgid "Delete Connection" msgstr "Remover Conexão" #: src/Partials/LibraryItem.vala:126 msgid "Options" msgstr "Opções" #: src/Partials/TreeBuilder.vala:131 msgid "Error" msgstr "Erro" #: src/Partials/TreeBuilder.vala:131 msgid "on Column" msgstr "na Coluna" #: src/Partials/TreeBuilder.vala:172 #, c-format msgid "Copy %s" msgstr "Copiar %s" #: src/Services/Settings.vala:106 #, c-format msgid "%s (copy)" msgstr "%s (cópia)" #: src/Services/ConnectionManager.vala:193 #, c-format msgid "Libssh2 initialization failed (%d)" msgstr "Falha ao iniciar libssh2 (%d)" #: src/Services/ConnectionManager.vala:202 msgid "Failed to open socket" msgstr "Falha ao abrir socket" #: src/Services/ConnectionManager.vala:211 msgid "Failed to connect!" msgstr "Falhou ao conectar!" #: src/Services/ConnectionManager.vala:223 #, c-format msgid "Error when starting up SSH session: %d" msgstr "Erro ao iniciar sessão SSH: %d" #: src/Services/ConnectionManager.vala:242 msgid "Authentication by password failed!" msgstr "Falha na autenticação por senha!" #: src/Services/ConnectionManager.vala:252 msgid "Authentication by public key failed!" msgstr "Autenticação via chave pública falhou!" #: src/Services/ConnectionManager.vala:259 msgid "No supported authentication methods found!" msgstr "Não foi encontrado nenhum método de autenticação suportado!" #: src/Services/ConnectionManager.vala:266 msgid "Failed to open listen socket" msgstr "Falha ao abrir o socket" #: src/Services/ConnectionManager.vala:281 msgid "Failed to bind. Your Database Port may be wrong!" msgstr "Falha ao conectar. A porta do banco de dados pode estar errada!" #: src/Services/ConnectionManager.vala:287 msgid "Failed to listen!" msgstr "Falha ao iniciar!" #: src/Services/ConnectionManager.vala:314 msgid "Failed to accept remote connection!" msgstr "Falha ao aceitar a conexão remota!" #: src/Services/ConnectionManager.vala:323 msgid "" "Could not open the direct-tcpip channel! (Note that this can be a problem at " "the server! Please review the server logs.)" msgstr "" "Não foi possível abrir o canal direct-tcpip! (Note que isso pode ser um " "problema no servidor! Por favor, verifique os logs do servidor.)" #: src/Services/ConnectionManager.vala:566 msgid "Error!" msgstr "Erro!" #: src/Widgets/ConnectionDialog.vala:33 msgid "Missing SSH Key file!" msgstr "Arquivo de chave SSH não encontrada!" #: src/Widgets/ConnectionDialog.vala:34 msgid "Missing SSH public key!" msgstr "Chave pública SSH não encontrada!" #: src/Widgets/ConnectionDialog.vala:89 src/Widgets/ConnectionDialog.vala:355 msgid "Connection" msgstr "Conexão" #: src/Widgets/ConnectionDialog.vala:141 msgid "Select connection color" msgstr "Escolha a cor da conexão" #: src/Widgets/ConnectionDialog.vala:164 msgid "Connection Name:" msgstr "Nome da Conexão:" #: src/Widgets/ConnectionDialog.vala:165 msgid "Connection's name" msgstr "Nome da Conexão" #: src/Widgets/ConnectionDialog.vala:172 msgid "Database Type:" msgstr "Tipo de Banco de Dados:" #: src/Widgets/ConnectionDialog.vala:194 msgid "Host:" msgstr "Host:" #: src/Widgets/ConnectionDialog.vala:200 msgid "Database Name:" msgstr "Nome do Banco de Dados:" #: src/Widgets/ConnectionDialog.vala:207 msgid "Username:" msgstr "Usuário:" #: src/Widgets/ConnectionDialog.vala:213 msgid "Password:" msgstr "Senha:" #: src/Widgets/ConnectionDialog.vala:217 src/Widgets/ConnectionDialog.vala:227 #: src/Widgets/ConnectionDialog.vala:285 src/Widgets/ConnectionDialog.vala:295 msgid "Show password" msgstr "Exibir senha" #: src/Widgets/ConnectionDialog.vala:224 src/Widgets/ConnectionDialog.vala:292 msgid "Hide password" msgstr "Ocultar senha" #: src/Widgets/ConnectionDialog.vala:234 msgid "Port:" msgstr "Porta:" #: src/Widgets/ConnectionDialog.vala:240 msgid "File Path:" msgstr "Caminho do Arquivo:" #: src/Widgets/ConnectionDialog.vala:241 msgid "Select Your SQLite File…" msgstr "Selecione seu Arquivo SQLite…" #: src/Widgets/ConnectionDialog.vala:261 msgid "Connect via SSH Tunnel:" msgstr "Conectar via terminal SSH" #: src/Widgets/ConnectionDialog.vala:271 msgid "SSH Host:" msgstr "Host SSH:" #: src/Widgets/ConnectionDialog.vala:276 msgid "SSH Username:" msgstr "Usuário SSH:" #: src/Widgets/ConnectionDialog.vala:281 msgid "SSH Password:" msgstr "Senha SSH:" #: src/Widgets/ConnectionDialog.vala:301 msgid "SSH Port:" msgstr "Porta SSH:" #: src/Widgets/ConnectionDialog.vala:302 msgid "Optional" msgstr "Opcional" #: src/Widgets/ConnectionDialog.vala:306 msgid "SSH Identity" msgstr "Identidade SSH" #: src/Widgets/ConnectionDialog.vala:308 msgid "Select Your Identity File…" msgstr "Selecione o seu arquivo de identificação…" #: src/Widgets/ConnectionDialog.vala:324 msgid "Generate SSH Key" msgstr "Gerar chave SSH" #: src/Widgets/ConnectionDialog.vala:356 msgid "SSH Tunnel" msgstr "Túnel SSH" #: src/Widgets/ConnectionDialog.vala:426 msgid "Close" msgstr "Fechar" #: src/Widgets/ConnectionDialog.vala:427 msgid "Save Connection" msgstr "Salvar Conexão" #: src/Widgets/ConnectionDialog.vala:429 msgid "Test Connection" msgstr "Testar Conexão" #: src/Widgets/ConnectionDialog.vala:620 msgid "Opening SSH Tunnel…" msgstr "Abrindo túnel SSH" #: src/Widgets/ConnectionDialog.vala:650 msgid "Testing Connection…" msgstr "Testando Conexão…" #: src/Widgets/ConnectionDialog.vala:661 msgid "Successfully Connected!" msgstr "Conectado com Sucesso!" #: src/Widgets/ConnectionDialog.vala:679 msgid "Saving Connection…" msgstr "Salvando Conexão…" #: src/Widgets/ConnectionDialog.vala:684 msgid "Connection Saved!" msgstr "Conexão Salva!" #: src/Widgets/ConnectionDialog.vala:692 msgid "Connecting…" msgstr "Conectando…" sequeler-0.8.2/po/ru.po000066400000000000000000000422501410464306200147550ustar00rootroot00000000000000# Russian translations for com.github.alecaddd.sequeler package. # Copyright (C) 2020 THE com.github.alecaddd.sequeler'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.alecaddd.sequeler package. # Automatically generated, 2020. # msgid "" msgstr "" "Project-Id-Version: com.github.alecaddd.sequeler\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-04-11 12:37+0200\n" "PO-Revision-Date: 2021-05-26 21:33+0000\n" "Last-Translator: Axus Wizix \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 4.7-dev\n" #: src/Application.vala:62 msgid "Directories are not supported" msgstr "Каталоги не поддерживаютÑÑ" #: src/Application.vala:68 msgid "Don't know what to do" msgstr "Ðе знаю что делать" #: src/Application.vala:80 msgid "Something completely unexpected happened" msgstr "Произошло что-то Ñовершенно неожиданное" #: src/Layouts/HeaderBar.vala:46 src/Layouts/HeaderBar.vala:53 msgid "Logout" msgstr "ОтключитьÑÑ" #: src/Layouts/HeaderBar.vala:56 msgid "Light background" msgstr "Светлый фон" #: src/Layouts/HeaderBar.vala:57 msgid "Dark background" msgstr "Тёмный фон" #: src/Layouts/HeaderBar.vala:68 src/Layouts/Welcome.vala:39 msgid "New Window" msgstr "Ðовое окно" #: src/Layouts/HeaderBar.vala:71 src/Widgets/ConnectionDialog.vala:130 #: src/Widgets/ConnectionDialog.vala:165 msgid "New Connection" msgstr "Ðовое подключение" #: src/Layouts/HeaderBar.vala:74 msgid "Quit" msgstr "Выход" #: src/Layouts/HeaderBar.vala:94 msgid "Menu" msgstr "Меню" #: src/Layouts/Main.vala:77 #, c-format msgid "Connected to %s" msgstr "ПодключитьÑÑ Ðº %s" #: src/Layouts/Library.vala:65 msgid "SAVED CONNECTIONS" msgstr "Сохраненные подключениÑ" #: src/Layouts/Library.vala:74 msgid "Delete All" msgstr "Удалить вÑÑ‘" #: src/Layouts/Library.vala:81 msgid "Reload Library" msgstr "Перезагрузить библиотеку" #: src/Layouts/Library.vala:84 msgid "Export Library" msgstr "ЭкÑпортировать библиотеку" #: src/Layouts/Library.vala:215 src/Layouts/Library.vala:233 msgid "Are you sure you want to proceed?" msgstr "Ð’Ñ‹ дейÑтвительно хотите Ñделать Ñто?" #: src/Layouts/Library.vala:215 msgid "By deleting this connection you won’t be able to recover this data." msgstr "Удалив Ñто Ñоединение, вы не Ñможете воÑÑтановить Ñти данные." #: src/Layouts/Library.vala:218 msgid "Yes, Delete!" msgstr "Да, удалить!" #: src/Layouts/Library.vala:233 msgid "All the data will be deleted and you won’t be able to recover it." msgstr "Ð’Ñе Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ безвозвратно удалены." #: src/Layouts/Library.vala:236 msgid "Yes, Delete All!" msgstr "Да, удалить вÑÑ‘!" #: src/Layouts/Library.vala:330 src/Widgets/ConnectionDialog.vala:575 #: src/Widgets/ConnectionDialog.vala:596 msgid "A username is required in order to connect!" msgstr "Ð”Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ÑÑ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ!" #: src/Layouts/Library.vala:404 src/Layouts/Views/Query.vala:528 msgid "Pick a file" msgstr "Выберите файл" #: src/Layouts/Library.vala:407 src/Layouts/Views/Query.vala:531 msgid "_Save" msgstr "_Сохранить" #: src/Layouts/Library.vala:408 src/Layouts/Welcome.vala:62 #: src/Layouts/Views/Query.vala:532 msgid "_Cancel" msgstr "_Отмена" #: src/Layouts/Library.vala:467 #, c-format msgid "Unable to Connect to %s" msgstr "Ðе удалоÑÑŒ подключитьÑÑ Ðº %s" #: src/Layouts/Library.vala:480 msgid "Unable to Export Library " msgstr "Ðе удалоÑÑŒ ÑкÑпортировать библиотеку " #: src/Layouts/Welcome.vala:28 msgid "Welcome to Sequeler" msgstr "Добро пожаловать в Sequeler" #: src/Layouts/Welcome.vala:29 msgid "Connect to Any Local or Remote Database." msgstr "ПодключитьÑÑ Ðº локальной или удалённой базе данных." #: src/Layouts/Welcome.vala:38 msgid "Add a New Database" msgstr "Добавить новую базу данных" #: src/Layouts/Welcome.vala:38 msgid "Connect to a Database and Save It in Your Library" msgstr "ПодключитьÑÑ Ðº базе данных и Ñохранить её в вашей библиотеке" #: src/Layouts/Welcome.vala:39 msgid "Open a New Sequeler Window" msgstr "Открыть новое окно Sequeler" #: src/Layouts/Welcome.vala:40 msgid "Import Connections" msgstr "Импортировать подключениÑ" #: src/Layouts/Welcome.vala:40 msgid "Import Previously Exported Sequeler Connections" msgstr "Импорт ранее ÑкÑпортированных Sequeler-подключений" #: src/Layouts/Welcome.vala:58 msgid "Select a file" msgstr "Выберите файл" #: src/Layouts/Welcome.vala:61 msgid "_Open" msgstr "_Открыть" #: src/Layouts/Welcome.vala:107 msgid "Unable to Import Library " msgstr "Ðе удалоÑÑŒ импортировать библиотеку " #: src/Layouts/DataBaseSchema.vala:66 src/Layouts/DataBaseSchema.vala:167 msgid "- Select Database -" msgstr "- Выберите базу данных -" #: src/Layouts/DataBaseSchema.vala:87 msgid "Search Tables" msgstr "Ðайти таблицы" #: src/Layouts/DataBaseSchema.vala:98 msgid "Search Tables…" msgstr "ПоиÑк таблиц…" #: src/Layouts/DataBaseSchema.vala:120 msgid "Reload Tables" msgstr "Обновить таблицы" #: src/Layouts/DataBaseSchema.vala:125 msgid "Add Table" msgstr "Добавить таблицу" #: src/Layouts/DataBaseSchema.vala:289 msgid "TABLES" msgstr "ТÐБЛИЦЫ" #: src/Layouts/DataBaseView.vala:49 msgid "Structure" msgstr "Структура" #: src/Layouts/DataBaseView.vala:50 msgid "Content" msgstr "Данные" #: src/Layouts/DataBaseView.vala:51 msgid "Relations" msgstr "ОтношениÑ" #: src/Layouts/DataBaseView.vala:52 src/Layouts/DataBaseView.vala:229 #: src/Layouts/DataBaseView.vala:253 msgid "Query" msgstr "ЗапроÑ" #: src/Layouts/DataBaseView.vala:101 msgid "Zoom Out" msgstr "Уменьшить маÑштаб" #: src/Layouts/DataBaseView.vala:107 msgid "Zoom 1:1" msgstr "МаÑштаб 1:1" #: src/Layouts/DataBaseView.vala:111 msgid "Zoom In" msgstr "Увеличить маÑштаб" #: src/Layouts/DataBaseView.vala:124 msgid "High Contrast" msgstr "Ð’Ñ‹Ñокий контраÑÑ‚" #: src/Layouts/DataBaseView.vala:132 msgid "Solarized Light" msgstr "Ð¡Ð²ÐµÑ‚Ð»Ð°Ñ Ñ†Ð²ÐµÑ‚Ð¾Ð²Ð°Ñ Ñхема" #: src/Layouts/DataBaseView.vala:140 msgid "Solarized Dark" msgstr "Ð¢Ñ‘Ð¼Ð½Ð°Ñ Ñ†Ð²ÐµÑ‚Ð¾Ð²Ð°Ñ Ñхема" #: src/Layouts/DataBaseView.vala:163 msgid "Change Text Style" msgstr "Изменить Ñтиль текÑта" #: src/Layouts/DataBaseView.vala:222 msgid "Create a new Query Tab" msgstr "Создать новую вкладку запроÑов" #: src/Layouts/DataBaseView.vala:240 #, c-format msgid "Query %i" msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ %i" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select Table" msgstr "Выберите таблицу" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select a table from the left sidebar to activate this view." msgstr "Выберите таблицу на панели Ñлева Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸." #: src/Layouts/Views/Structure.vala:107 src/Layouts/Views/Structure.vala:145 #: src/Layouts/Views/Content.vala:179 src/Layouts/Views/Content.vala:218 #: src/Layouts/Views/Relations.vala:106 src/Layouts/Views/Relations.vala:144 #: src/Layouts/Views/Query.vala:323 msgid "No Results Available" msgstr "Ðет результатов" #: src/Layouts/Views/Structure.vala:118 src/Layouts/Views/Content.vala:191 #: src/Layouts/Views/Relations.vala:117 msgid "Reload Results" msgstr "Обновить результаты" #: src/Layouts/Views/Structure.vala:197 msgid " Fields" msgstr " ПолÑ" #: src/Layouts/Views/Content.vala:121 msgid "Previous Page" msgstr "ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ñтраница" #: src/Layouts/Views/Content.vala:126 msgid "Next Page" msgstr "Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ñтраница" #: src/Layouts/Views/Content.vala:131 #, c-format msgid "%d Pages" msgstr "%d Ñтраниц" #: src/Layouts/Views/Content.vala:134 msgid "Jump to page…" msgstr "Перейти к Ñтранице…" #: src/Layouts/Views/Content.vala:165 msgid "1 Page" msgstr "1 Ñтраница" #: src/Layouts/Views/Content.vala:171 #, c-format msgid "%d of %d Pages" msgstr "%d из %d Ñтраниц" #: src/Layouts/Views/Content.vala:275 #, c-format msgid "%d Entries" msgstr "%d ЗапиÑи" #: src/Layouts/Views/Relations.vala:197 msgid " Constraints" msgstr " ОтношениÑ" #: src/Layouts/Views/Query.vala:279 msgid "Running Query…" msgstr "Выполнение запроÑа…" #: src/Layouts/Views/Query.vala:295 src/Layouts/Views/Query.vala:304 msgid "Run Query" msgstr "Выполнить запроÑ" #: src/Layouts/Views/Query.vala:356 msgid "Export Results" msgstr "ЭкÑпорт результатов" #: src/Layouts/Views/Query.vala:369 msgid "Export as CSV" msgstr "ЭкÑпортировать в CSV" #: src/Layouts/Views/Query.vala:377 msgid "Export as Text" msgstr "ЭкÑпортировать в текÑÑ‚" #: src/Layouts/Views/Query.vala:436 src/Layouts/Views/Query.vala:482 msgid "Unable to process Query!" msgstr "Ðевозможно выполнить запроÑ!" #: src/Layouts/Views/Query.vala:457 #, c-format msgid "%d Total Results" msgstr "%d Общий результат" #: src/Layouts/Views/Query.vala:492 #, c-format msgid "Query Successfully Executed! Rows Affected: %s" msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½ уÑпешно! Строк обработано: %s" #: src/Layouts/Views/Query.vala:495 msgid "Query Executed!" msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½!" #: src/Partials/LibraryItem.vala:107 src/Widgets/ConnectionDialog.vala:431 msgid "Connect" msgstr "ПодключитьÑÑ" #: src/Partials/LibraryItem.vala:110 msgid "Edit Connection" msgstr "Изменить" #: src/Partials/LibraryItem.vala:113 msgid "Duplicate Connection" msgstr "Дублировать Ñоединение" #: src/Partials/LibraryItem.vala:116 msgid "Delete Connection" msgstr "Удалить" #: src/Partials/LibraryItem.vala:126 msgid "Options" msgstr "ÐаÑтройки" #: src/Partials/TreeBuilder.vala:131 msgid "Error" msgstr "Ошибка" #: src/Partials/TreeBuilder.vala:131 msgid "on Column" msgstr "на Ñтолбце" #: src/Partials/TreeBuilder.vala:172 #, c-format msgid "Copy %s" msgstr "Копировать %s" #: src/Services/Settings.vala:106 #, c-format msgid "%s (copy)" msgstr "%s (копиÑ)" #: src/Services/ConnectionManager.vala:193 #, c-format msgid "Libssh2 initialization failed (%d)" msgstr "Ð˜Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Libssh2 не удалаÑÑŒ (%d)" #: src/Services/ConnectionManager.vala:202 msgid "Failed to open socket" msgstr "Ðе удалоÑÑŒ открыть Ñокет" #: src/Services/ConnectionManager.vala:211 msgid "Failed to connect!" msgstr "Ðе удалоÑÑŒ подключитьÑÑ!" #: src/Services/ConnectionManager.vala:223 #, c-format msgid "Error when starting up SSH session: %d" msgstr "Ошибка при запуÑке SSH ÑеÑÑии: %d" #: src/Services/ConnectionManager.vala:242 msgid "Authentication by password failed!" msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð½Ðµ удалаÑÑŒ!" #: src/Services/ConnectionManager.vala:252 msgid "Authentication by public key failed!" msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ публичного ключа не удалаÑÑŒ!" #: src/Services/ConnectionManager.vala:259 msgid "No supported authentication methods found!" msgstr "Поддерживаемые методы аутентификации не найдены!" #: src/Services/ConnectionManager.vala:266 msgid "Failed to open listen socket" msgstr "Ðе удалоÑÑŒ открыть проÑлушивание Ñокета" #: src/Services/ConnectionManager.vala:281 msgid "Failed to bind. Your Database Port may be wrong!" msgstr "Ðе удалоÑÑŒ Ñоединить. Ваш порт базы данных может быть неправильным!" #: src/Services/ConnectionManager.vala:287 msgid "Failed to listen!" msgstr "Ðе удалоÑÑŒ поÑлушать!" #: src/Services/ConnectionManager.vala:314 msgid "Failed to accept remote connection!" msgstr "Ðе удалоÑÑŒ принÑть удаленное Ñоединение!" #: src/Services/ConnectionManager.vala:323 msgid "" "Could not open the direct-tcpip channel! (Note that this can be a problem at " "the server! Please review the server logs.)" msgstr "" "Ðе удалоÑÑŒ открыть прÑмой канал tcpip! (Обратите внимание, что Ñто может " "быть проблемой на Ñервере! ПроÑмотрите журналы Ñервера.)" #: src/Services/ConnectionManager.vala:566 msgid "Error!" msgstr "Ошибка!" #: src/Widgets/ConnectionDialog.vala:33 msgid "Missing SSH Key file!" msgstr "ОтÑутÑтвует файл SSH ключа!" #: src/Widgets/ConnectionDialog.vala:34 msgid "Missing SSH public key!" msgstr "ОтÑутÑтвует публичный SSH ключ!" #: src/Widgets/ConnectionDialog.vala:89 src/Widgets/ConnectionDialog.vala:355 msgid "Connection" msgstr "Подключение" #: src/Widgets/ConnectionDialog.vala:141 msgid "Select connection color" msgstr "Выбрать цвет ÑоединениÑ" #: src/Widgets/ConnectionDialog.vala:164 msgid "Connection Name:" msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ:" #: src/Widgets/ConnectionDialog.vala:165 msgid "Connection's name" msgstr "Имена подключений" #: src/Widgets/ConnectionDialog.vala:172 msgid "Database Type:" msgstr "Тип БД:" #: src/Widgets/ConnectionDialog.vala:194 msgid "Host:" msgstr "Сервер:" #: src/Widgets/ConnectionDialog.vala:200 msgid "Database Name:" msgstr "Ð˜Ð¼Ñ Ð‘Ð”:" #: src/Widgets/ConnectionDialog.vala:207 msgid "Username:" msgstr "Пользователь:" #: src/Widgets/ConnectionDialog.vala:213 msgid "Password:" msgstr "Пароль:" #: src/Widgets/ConnectionDialog.vala:217 src/Widgets/ConnectionDialog.vala:227 #: src/Widgets/ConnectionDialog.vala:285 src/Widgets/ConnectionDialog.vala:295 msgid "Show password" msgstr "Показать пароль" #: src/Widgets/ConnectionDialog.vala:224 src/Widgets/ConnectionDialog.vala:292 msgid "Hide password" msgstr "Скрыть пароль" #: src/Widgets/ConnectionDialog.vala:234 msgid "Port:" msgstr "Порт:" #: src/Widgets/ConnectionDialog.vala:240 msgid "File Path:" msgstr "Файл:" #: src/Widgets/ConnectionDialog.vala:241 msgid "Select Your SQLite File…" msgstr "Выберите SQLite-файл…" #: src/Widgets/ConnectionDialog.vala:261 msgid "Connect via SSH Tunnel:" msgstr "Подключение через SSH туннель:" #: src/Widgets/ConnectionDialog.vala:271 msgid "SSH Host:" msgstr "Сервер SSH:" #: src/Widgets/ConnectionDialog.vala:276 msgid "SSH Username:" msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ SSH:" #: src/Widgets/ConnectionDialog.vala:281 msgid "SSH Password:" msgstr "Пароль SSH:" #: src/Widgets/ConnectionDialog.vala:301 msgid "SSH Port:" msgstr "Порт SSH:" #: src/Widgets/ConnectionDialog.vala:302 msgid "Optional" msgstr "Ðе обÑзательно" #: src/Widgets/ConnectionDialog.vala:306 msgid "SSH Identity" msgstr "Ð˜Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ SSH" #: src/Widgets/ConnectionDialog.vala:308 msgid "Select Your Identity File…" msgstr "Выберите Ñвой файл идентификации…" #: src/Widgets/ConnectionDialog.vala:324 msgid "Generate SSH Key" msgstr "Создать SSH ключ" #: src/Widgets/ConnectionDialog.vala:356 msgid "SSH Tunnel" msgstr "SSH-туннель" #: src/Widgets/ConnectionDialog.vala:426 msgid "Close" msgstr "Закрыть" #: src/Widgets/ConnectionDialog.vala:427 msgid "Save Connection" msgstr "Сохранить" #: src/Widgets/ConnectionDialog.vala:429 msgid "Test Connection" msgstr "Проверить" #: src/Widgets/ConnectionDialog.vala:620 msgid "Opening SSH Tunnel…" msgstr "Открытие Ñ‚ÑƒÐ½Ð½ÐµÐ»Ñ SSH…" #: src/Widgets/ConnectionDialog.vala:650 msgid "Testing Connection…" msgstr "Проверка подключениÑ…" #: src/Widgets/ConnectionDialog.vala:661 msgid "Successfully Connected!" msgstr "Подключение уÑпешно!" #: src/Widgets/ConnectionDialog.vala:679 msgid "Saving Connection…" msgstr "Сохранение подключениÑ…" #: src/Widgets/ConnectionDialog.vala:684 msgid "Connection Saved!" msgstr "Подключение Ñохранено!" #: src/Widgets/ConnectionDialog.vala:692 msgid "Connecting…" msgstr "Подключение…" sequeler-0.8.2/po/tr.po000066400000000000000000000361171410464306200147610ustar00rootroot00000000000000# Turkish translations for com.github.alecaddd.sequeler package. # Copyright (C) 2020 THE com.github.alecaddd.sequeler'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.alecaddd.sequeler package. # ÇaÄŸatay YiÄŸit Åžahin , 2020. # msgid "" msgstr "" "Project-Id-Version: com.github.alecaddd.sequeler\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-04-11 12:37+0200\n" "PO-Revision-Date: 2020-10-09 19:26+0000\n" "Last-Translator: OÄŸuz Ersen \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=2; plural=n != 1;\n" "X-Generator: Weblate 4.3-dev\n" #: src/Application.vala:62 msgid "Directories are not supported" msgstr "Dizinler desteklenmiyor" #: src/Application.vala:68 msgid "Don't know what to do" msgstr "Ne yapılacağı bilinmiyor" #: src/Application.vala:80 msgid "Something completely unexpected happened" msgstr "Tamamıyla beklenmeyen bir ÅŸey oldu" #: src/Layouts/HeaderBar.vala:46 src/Layouts/HeaderBar.vala:53 msgid "Logout" msgstr "Çıkış" #: src/Layouts/HeaderBar.vala:56 msgid "Light background" msgstr "Açık arka plan" #: src/Layouts/HeaderBar.vala:57 msgid "Dark background" msgstr "Koyu arka plan" #: src/Layouts/HeaderBar.vala:68 src/Layouts/Welcome.vala:39 msgid "New Window" msgstr "Yeni Pencere" #: src/Layouts/HeaderBar.vala:71 src/Widgets/ConnectionDialog.vala:130 #: src/Widgets/ConnectionDialog.vala:165 msgid "New Connection" msgstr "Yeni BaÄŸlantı" #: src/Layouts/HeaderBar.vala:74 msgid "Quit" msgstr "Çık" #: src/Layouts/HeaderBar.vala:94 msgid "Menu" msgstr "Menü" #: src/Layouts/Main.vala:77 #, c-format msgid "Connected to %s" msgstr "%s ile baÄŸlantı kuruldu" #: src/Layouts/Library.vala:65 msgid "SAVED CONNECTIONS" msgstr "KAYITLI BAÄžLANTILAR" #: src/Layouts/Library.vala:74 msgid "Delete All" msgstr "Hepsini Sil" #: src/Layouts/Library.vala:81 msgid "Reload Library" msgstr "Kütüphaneyi Yeniden Yükle" #: src/Layouts/Library.vala:84 msgid "Export Library" msgstr "Kütüphaneyi Dışa Aktar" #: src/Layouts/Library.vala:215 src/Layouts/Library.vala:233 msgid "Are you sure you want to proceed?" msgstr "Devam etmek istediÄŸinize emin misiniz?" #: src/Layouts/Library.vala:215 msgid "By deleting this connection you won’t be able to recover this data." msgstr "Bu baÄŸlantıyı silerek, bu verileri kurtaramayacaksınız." #: src/Layouts/Library.vala:218 msgid "Yes, Delete!" msgstr "Evet, Sil!" #: src/Layouts/Library.vala:233 msgid "All the data will be deleted and you won’t be able to recover it." msgstr "Tüm veriler silinecek ve bunları kurtaramayacaksınız." #: src/Layouts/Library.vala:236 msgid "Yes, Delete All!" msgstr "Evet, Hepsini Sil!" #: src/Layouts/Library.vala:330 src/Widgets/ConnectionDialog.vala:575 #: src/Widgets/ConnectionDialog.vala:596 msgid "A username is required in order to connect!" msgstr "BaÄŸlanmak için bir kullanıcı adı gerekli!" #: src/Layouts/Library.vala:404 src/Layouts/Views/Query.vala:528 msgid "Pick a file" msgstr "Dosya seç" #: src/Layouts/Library.vala:407 src/Layouts/Views/Query.vala:531 msgid "_Save" msgstr "_Kaydet" #: src/Layouts/Library.vala:408 src/Layouts/Welcome.vala:62 #: src/Layouts/Views/Query.vala:532 msgid "_Cancel" msgstr "_İptal Et" #: src/Layouts/Library.vala:467 #, c-format msgid "Unable to Connect to %s" msgstr "%s ile BaÄŸlantı Kurulamıyor" #: src/Layouts/Library.vala:480 msgid "Unable to Export Library " msgstr "Kütüphane Dışa Aktarılamıyor " #: src/Layouts/Welcome.vala:28 msgid "Welcome to Sequeler" msgstr "Sequeler‘a HoÅŸ Geldiniz" #: src/Layouts/Welcome.vala:29 msgid "Connect to Any Local or Remote Database." msgstr "Herhangi Bir Yerel veya Uzak Veri Tabanına BaÄŸlanın." #: src/Layouts/Welcome.vala:38 msgid "Add a New Database" msgstr "Yeni Bir Veri Tabanı Ekle" #: src/Layouts/Welcome.vala:38 msgid "Connect to a Database and Save It in Your Library" msgstr "Bir Veri Tabanına BaÄŸlanın ve Kütüphanenize Kaydedin" #: src/Layouts/Welcome.vala:39 msgid "Open a New Sequeler Window" msgstr "Yeni Bir Sequeler Penceresi Açın" #: src/Layouts/Welcome.vala:40 msgid "Import Connections" msgstr "BaÄŸlantıları İçe Aktar" #: src/Layouts/Welcome.vala:40 msgid "Import Previously Exported Sequeler Connections" msgstr "Önceden Dışa Aktarılmış Sequeler BaÄŸlantılarını İçe Aktarın" #: src/Layouts/Welcome.vala:58 msgid "Select a file" msgstr "Dosya seç" #: src/Layouts/Welcome.vala:61 msgid "_Open" msgstr "_Aç" #: src/Layouts/Welcome.vala:107 msgid "Unable to Import Library " msgstr "Kütüphane İçe Aktarılamıyor " #: src/Layouts/DataBaseSchema.vala:66 src/Layouts/DataBaseSchema.vala:167 msgid "- Select Database -" msgstr "- Veri Tabanı Seç -" #: src/Layouts/DataBaseSchema.vala:87 msgid "Search Tables" msgstr "Tabloları Ara" #: src/Layouts/DataBaseSchema.vala:98 msgid "Search Tables…" msgstr "Tabloları Ara…" #: src/Layouts/DataBaseSchema.vala:120 msgid "Reload Tables" msgstr "Tabloları Yeniden Yükle" #: src/Layouts/DataBaseSchema.vala:125 msgid "Add Table" msgstr "Tablo Ekle" #: src/Layouts/DataBaseSchema.vala:289 msgid "TABLES" msgstr "TABLOLAR" #: src/Layouts/DataBaseView.vala:49 msgid "Structure" msgstr "Yapı" #: src/Layouts/DataBaseView.vala:50 msgid "Content" msgstr "İçerik" #: src/Layouts/DataBaseView.vala:51 msgid "Relations" msgstr "İliÅŸkiler" #: src/Layouts/DataBaseView.vala:52 src/Layouts/DataBaseView.vala:229 #: src/Layouts/DataBaseView.vala:253 msgid "Query" msgstr "Sorgu" #: src/Layouts/DataBaseView.vala:101 msgid "Zoom Out" msgstr "UzaklaÅŸtır" #: src/Layouts/DataBaseView.vala:107 msgid "Zoom 1:1" msgstr "YakınlaÅŸtırmayı sıfırla" #: src/Layouts/DataBaseView.vala:111 msgid "Zoom In" msgstr "YakınlaÅŸtır" #: src/Layouts/DataBaseView.vala:124 msgid "High Contrast" msgstr "Yüksek Karşıtlık" #: src/Layouts/DataBaseView.vala:132 msgid "Solarized Light" msgstr "Solarized Açık" #: src/Layouts/DataBaseView.vala:140 msgid "Solarized Dark" msgstr "Solarized Koyu" #: src/Layouts/DataBaseView.vala:163 msgid "Change Text Style" msgstr "Metin Tarzını DeÄŸiÅŸtir" #: src/Layouts/DataBaseView.vala:222 msgid "Create a new Query Tab" msgstr "Yeni bir sorgu sekmesi oluÅŸturun" #: src/Layouts/DataBaseView.vala:240 #, c-format msgid "Query %i" msgstr "Sorgu %i" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select Table" msgstr "Tablo Seç" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select a table from the left sidebar to activate this view." msgstr "" "Bu görünümü etkinleÅŸtirmek için soldaki kenar çubuÄŸundan bir tablo seçin." #: src/Layouts/Views/Structure.vala:107 src/Layouts/Views/Structure.vala:145 #: src/Layouts/Views/Content.vala:179 src/Layouts/Views/Content.vala:218 #: src/Layouts/Views/Relations.vala:106 src/Layouts/Views/Relations.vala:144 #: src/Layouts/Views/Query.vala:323 msgid "No Results Available" msgstr "Sonuç Yok" #: src/Layouts/Views/Structure.vala:118 src/Layouts/Views/Content.vala:191 #: src/Layouts/Views/Relations.vala:117 msgid "Reload Results" msgstr "Sonuçları Yeniden Yükle" #: src/Layouts/Views/Structure.vala:197 msgid " Fields" msgstr " Alanlar" #: src/Layouts/Views/Content.vala:121 msgid "Previous Page" msgstr "Önceki Sayfa" #: src/Layouts/Views/Content.vala:126 msgid "Next Page" msgstr "Sonraki Sayfa" #: src/Layouts/Views/Content.vala:131 #, c-format msgid "%d Pages" msgstr "%d Sayfa" #: src/Layouts/Views/Content.vala:134 msgid "Jump to page…" msgstr "Sayfaya atla…" #: src/Layouts/Views/Content.vala:165 msgid "1 Page" msgstr "1 Sayfa" #: src/Layouts/Views/Content.vala:171 #, c-format msgid "%d of %d Pages" msgstr "Sayfa %d / %d" #: src/Layouts/Views/Content.vala:275 #, c-format msgid "%d Entries" msgstr "%d Girdi" #: src/Layouts/Views/Relations.vala:197 msgid " Constraints" msgstr " Kısıtlar" #: src/Layouts/Views/Query.vala:279 msgid "Running Query…" msgstr "Sorgu Çalıştırılıyor…" #: src/Layouts/Views/Query.vala:295 src/Layouts/Views/Query.vala:304 msgid "Run Query" msgstr "Sorguyu Çalıştır" #: src/Layouts/Views/Query.vala:356 msgid "Export Results" msgstr "Sonuçları Dışa Aktar" #: src/Layouts/Views/Query.vala:369 msgid "Export as CSV" msgstr "CSV Olarak Dışa Aktar" #: src/Layouts/Views/Query.vala:377 msgid "Export as Text" msgstr "Metin Olarak Dışa Aktar" #: src/Layouts/Views/Query.vala:436 src/Layouts/Views/Query.vala:482 msgid "Unable to process Query!" msgstr "Sorgu iÅŸlenemedi!" #: src/Layouts/Views/Query.vala:457 #, c-format msgid "%d Total Results" msgstr "%d Toplam Sonuç" #: src/Layouts/Views/Query.vala:492 #, c-format msgid "Query Successfully Executed! Rows Affected: %s" msgstr "Sorgu BaÅŸarıyla Çalıştırıldı! Etkilenen Satırlar: %s" #: src/Layouts/Views/Query.vala:495 msgid "Query Executed!" msgstr "Sorgu Çalıştırıldı!" #: src/Partials/LibraryItem.vala:107 src/Widgets/ConnectionDialog.vala:431 msgid "Connect" msgstr "BaÄŸlan" #: src/Partials/LibraryItem.vala:110 msgid "Edit Connection" msgstr "BaÄŸlantıyı Düzenle" #: src/Partials/LibraryItem.vala:113 msgid "Duplicate Connection" msgstr "BaÄŸlantıyı ÇoÄŸalt" #: src/Partials/LibraryItem.vala:116 msgid "Delete Connection" msgstr "BaÄŸlantıyı Sil" #: src/Partials/LibraryItem.vala:126 msgid "Options" msgstr "Seçenekler" #: src/Partials/TreeBuilder.vala:131 msgid "Error" msgstr "Hata" #: src/Partials/TreeBuilder.vala:131 msgid "on Column" msgstr "Sütun" #: src/Partials/TreeBuilder.vala:172 #, c-format msgid "Copy %s" msgstr "%s kopyala" #: src/Services/Settings.vala:106 #, c-format msgid "%s (copy)" msgstr "%s (kopyala)" #: src/Services/ConnectionManager.vala:193 #, c-format msgid "Libssh2 initialization failed (%d)" msgstr "Libssh2 baÅŸlatma baÅŸarısız oldu (%d)" #: src/Services/ConnectionManager.vala:202 msgid "Failed to open socket" msgstr "Soket açma baÅŸarısız oldu" #: src/Services/ConnectionManager.vala:211 msgid "Failed to connect!" msgstr "BaÄŸlantı baÅŸarısız oldu!" #: src/Services/ConnectionManager.vala:223 #, c-format msgid "Error when starting up SSH session: %d" msgstr "SSH oturumu baÅŸlatılırken hata oluÅŸtu: %d" #: src/Services/ConnectionManager.vala:242 msgid "Authentication by password failed!" msgstr "Parola ile kimlik doÄŸrulama baÅŸarısız oldu!" #: src/Services/ConnectionManager.vala:252 msgid "Authentication by public key failed!" msgstr "Ortak anahtar ile kimlik doÄŸrulama baÅŸarısız oldu!" #: src/Services/ConnectionManager.vala:259 msgid "No supported authentication methods found!" msgstr "Desteklenen kimlik doÄŸrulama yöntemi bulunamadı!" #: src/Services/ConnectionManager.vala:266 msgid "Failed to open listen socket" msgstr "Dinleme soketi açma baÅŸarısız oldu" #: src/Services/ConnectionManager.vala:281 msgid "Failed to bind. Your Database Port may be wrong!" msgstr "BaÄŸlama baÅŸarısız oldu. Veri tabanı baÄŸlantı noktanız yanlış olabilir!" #: src/Services/ConnectionManager.vala:287 msgid "Failed to listen!" msgstr "Dinleme baÅŸarısız oldu!" #: src/Services/ConnectionManager.vala:314 msgid "Failed to accept remote connection!" msgstr "Uzaktan baÄŸlantı kabul etme baÅŸarısız oldu!" #: src/Services/ConnectionManager.vala:323 msgid "" "Could not open the direct-tcpip channel! (Note that this can be a problem at " "the server! Please review the server logs.)" msgstr "" "direct-tcpip kanalı açılamadı! (Bu sorunun sunucuda olabileceÄŸini unutmayın! " "Lütfen sunucu günlüklerini inceleyin.)" #: src/Services/ConnectionManager.vala:566 msgid "Error!" msgstr "Hata!" #: src/Widgets/ConnectionDialog.vala:33 msgid "Missing SSH Key file!" msgstr "SSH anahtar dosyası eksik!" #: src/Widgets/ConnectionDialog.vala:34 msgid "Missing SSH public key!" msgstr "SSH ortak anahtarı eksik!" #: src/Widgets/ConnectionDialog.vala:89 src/Widgets/ConnectionDialog.vala:355 msgid "Connection" msgstr "BaÄŸlantı" #: src/Widgets/ConnectionDialog.vala:141 msgid "Select connection color" msgstr "BaÄŸlantı rengini seçin" #: src/Widgets/ConnectionDialog.vala:164 msgid "Connection Name:" msgstr "BaÄŸlantı Adı:" #: src/Widgets/ConnectionDialog.vala:165 msgid "Connection's name" msgstr "BaÄŸlantının adı" #: src/Widgets/ConnectionDialog.vala:172 msgid "Database Type:" msgstr "Veri Tabanı Türü:" #: src/Widgets/ConnectionDialog.vala:194 msgid "Host:" msgstr "Ana Makine:" #: src/Widgets/ConnectionDialog.vala:200 msgid "Database Name:" msgstr "Veri Tabanı Adı:" #: src/Widgets/ConnectionDialog.vala:207 msgid "Username:" msgstr "Kullanıcı Adı:" #: src/Widgets/ConnectionDialog.vala:213 msgid "Password:" msgstr "Parola:" #: src/Widgets/ConnectionDialog.vala:217 src/Widgets/ConnectionDialog.vala:227 #: src/Widgets/ConnectionDialog.vala:285 src/Widgets/ConnectionDialog.vala:295 msgid "Show password" msgstr "Parolayı göster" #: src/Widgets/ConnectionDialog.vala:224 src/Widgets/ConnectionDialog.vala:292 msgid "Hide password" msgstr "Parolayı gizle" #: src/Widgets/ConnectionDialog.vala:234 msgid "Port:" msgstr "BaÄŸlantı Noktası:" #: src/Widgets/ConnectionDialog.vala:240 msgid "File Path:" msgstr "Dosya Yolu:" #: src/Widgets/ConnectionDialog.vala:241 msgid "Select Your SQLite File…" msgstr "SQLite Dosyanızı Seçin…" #: src/Widgets/ConnectionDialog.vala:261 msgid "Connect via SSH Tunnel:" msgstr "SSH Tüneli ile BaÄŸlan:" #: src/Widgets/ConnectionDialog.vala:271 msgid "SSH Host:" msgstr "SSH Ana Makinesi:" #: src/Widgets/ConnectionDialog.vala:276 msgid "SSH Username:" msgstr "SSH Kullanıcı Adı:" #: src/Widgets/ConnectionDialog.vala:281 msgid "SSH Password:" msgstr "SSH Parolası:" #: src/Widgets/ConnectionDialog.vala:301 msgid "SSH Port:" msgstr "SSH BaÄŸlantı Noktası:" #: src/Widgets/ConnectionDialog.vala:302 msgid "Optional" msgstr "İsteÄŸe BaÄŸlı" #: src/Widgets/ConnectionDialog.vala:306 msgid "SSH Identity" msgstr "SSH KimliÄŸi" #: src/Widgets/ConnectionDialog.vala:308 msgid "Select Your Identity File…" msgstr "Kimlik Dosyanızı Seçin…" #: src/Widgets/ConnectionDialog.vala:324 msgid "Generate SSH Key" msgstr "SSH Anahtarı OluÅŸtur" #: src/Widgets/ConnectionDialog.vala:356 msgid "SSH Tunnel" msgstr "SSH Tüneli" #: src/Widgets/ConnectionDialog.vala:426 msgid "Close" msgstr "Kapat" #: src/Widgets/ConnectionDialog.vala:427 msgid "Save Connection" msgstr "BaÄŸlantıyı Kaydet" #: src/Widgets/ConnectionDialog.vala:429 msgid "Test Connection" msgstr "BaÄŸlantıyı Sına" #: src/Widgets/ConnectionDialog.vala:620 msgid "Opening SSH Tunnel…" msgstr "SSH Tüneli açılıyor…" #: src/Widgets/ConnectionDialog.vala:650 msgid "Testing Connection…" msgstr "BaÄŸlantı Sınanıyor…" #: src/Widgets/ConnectionDialog.vala:661 msgid "Successfully Connected!" msgstr "BaÄŸlantı BaÅŸarılı!" #: src/Widgets/ConnectionDialog.vala:679 msgid "Saving Connection…" msgstr "BaÄŸlantı Kaydediliyor…" #: src/Widgets/ConnectionDialog.vala:684 msgid "Connection Saved!" msgstr "BaÄŸlantı Kaydedildi!" #: src/Widgets/ConnectionDialog.vala:692 msgid "Connecting…" msgstr "BaÄŸlanıyor…" sequeler-0.8.2/po/uk.po000066400000000000000000000417131410464306200147510ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.alecaddd.sequeler package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: com.github.alecaddd.sequeler\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-04-11 12:37+0200\n" "PO-Revision-Date: 2020-09-16 20:36+0000\n" "Last-Translator: ihor_ck \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 4.3-dev\n" #: src/Application.vala:62 msgid "Directories are not supported" msgstr "Директорії не підтримуютьÑÑ" #: src/Application.vala:68 msgid "Don't know what to do" msgstr "Ðе знаю, що робити" #: src/Application.vala:80 msgid "Something completely unexpected happened" msgstr "СталоÑÑ Ð´ÐµÑ‰Ð¾ неочікуване" #: src/Layouts/HeaderBar.vala:46 src/Layouts/HeaderBar.vala:53 msgid "Logout" msgstr "Від'єднатиÑÑ" #: src/Layouts/HeaderBar.vala:56 msgid "Light background" msgstr "Світле тло" #: src/Layouts/HeaderBar.vala:57 msgid "Dark background" msgstr "Темне тло" #: src/Layouts/HeaderBar.vala:68 src/Layouts/Welcome.vala:39 msgid "New Window" msgstr "Ðове вікно" #: src/Layouts/HeaderBar.vala:71 src/Widgets/ConnectionDialog.vala:130 #: src/Widgets/ConnectionDialog.vala:165 msgid "New Connection" msgstr "Ðове з'єднаннÑ" #: src/Layouts/HeaderBar.vala:74 msgid "Quit" msgstr "Вийти" #: src/Layouts/HeaderBar.vala:94 msgid "Menu" msgstr "Меню" #: src/Layouts/Main.vala:77 #, c-format msgid "Connected to %s" msgstr "Під'єднано до %s" #: src/Layouts/Library.vala:65 msgid "SAVED CONNECTIONS" msgstr "ЗБЕРЕЖЕÐІ З'ЄДÐÐÐÐЯ" #: src/Layouts/Library.vala:74 msgid "Delete All" msgstr "Видалити вÑе" #: src/Layouts/Library.vala:81 msgid "Reload Library" msgstr "Оновити бібліотеку" #: src/Layouts/Library.vala:84 msgid "Export Library" msgstr "ЕкÑпортувати бібліотеку" #: src/Layouts/Library.vala:215 src/Layouts/Library.vala:233 msgid "Are you sure you want to proceed?" msgstr "Ви впевнені, що хочете продовжити?" #: src/Layouts/Library.vala:215 msgid "By deleting this connection you won’t be able to recover this data." msgstr "Видаливши це з'єднаннÑ, ви не зможете відновити ці дані." #: src/Layouts/Library.vala:218 msgid "Yes, Delete!" msgstr "Так, видалити!" #: src/Layouts/Library.vala:233 msgid "All the data will be deleted and you won’t be able to recover it." msgstr "Ð’ÑÑ– дані буде видалено, Ñ– ви не зможете Ñ—Ñ… відновити." #: src/Layouts/Library.vala:236 msgid "Yes, Delete All!" msgstr "Так, видалити вÑе!" #: src/Layouts/Library.vala:330 src/Widgets/ConnectionDialog.vala:575 #: src/Widgets/ConnectionDialog.vala:596 msgid "A username is required in order to connect!" msgstr "Ð”Ð»Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð½ÐµÐ¾Ð±Ñ…Ñ–Ð´Ð½Ðµ ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача!" #: src/Layouts/Library.vala:404 src/Layouts/Views/Query.vala:528 msgid "Pick a file" msgstr "Виберіть файл" #: src/Layouts/Library.vala:407 src/Layouts/Views/Query.vala:531 msgid "_Save" msgstr "_Зберегти" #: src/Layouts/Library.vala:408 src/Layouts/Welcome.vala:62 #: src/Layouts/Views/Query.vala:532 msgid "_Cancel" msgstr "_СкаÑувати" #: src/Layouts/Library.vala:467 #, c-format msgid "Unable to Connect to %s" msgstr "Ðе можливо з'єднатиÑÑ Ð· %s" #: src/Layouts/Library.vala:480 msgid "Unable to Export Library " msgstr "Ðе можливо екÑпортувати бібліотеку " #: src/Layouts/Welcome.vala:28 msgid "Welcome to Sequeler" msgstr "Вітаємо в Sequeler" #: src/Layouts/Welcome.vala:29 msgid "Connect to Any Local or Remote Database." msgstr "Під'єднайтеÑÑŒ до будь-Ñкої локальної чи віддаленої бази даних." #: src/Layouts/Welcome.vala:38 msgid "Add a New Database" msgstr "Додати нову базу даних" #: src/Layouts/Welcome.vala:38 msgid "Connect to a Database and Save It in Your Library" msgstr "З'єднатиÑÑŒ з базою даних та додати Ñ—Ñ— до вашої бібліотеки" #: src/Layouts/Welcome.vala:39 msgid "Open a New Sequeler Window" msgstr "Відкрити нове вікно Sequeler" #: src/Layouts/Welcome.vala:40 msgid "Import Connections" msgstr "Імпортувати з'єднаннÑ" #: src/Layouts/Welcome.vala:40 msgid "Import Previously Exported Sequeler Connections" msgstr "Імпортувати попередньо екÑпортовані з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Sequeler" #: src/Layouts/Welcome.vala:58 msgid "Select a file" msgstr "Виділити файл" #: src/Layouts/Welcome.vala:61 msgid "_Open" msgstr "_Відкрити" #: src/Layouts/Welcome.vala:107 msgid "Unable to Import Library " msgstr "Ðе вдалоÑÑŒ імпортувати бібліотеку " #: src/Layouts/DataBaseSchema.vala:66 src/Layouts/DataBaseSchema.vala:167 msgid "- Select Database -" msgstr "- Вибрати базу даних -" #: src/Layouts/DataBaseSchema.vala:87 msgid "Search Tables" msgstr "Шукати таблиці" #: src/Layouts/DataBaseSchema.vala:98 msgid "Search Tables…" msgstr "Пошук таблиць…" #: src/Layouts/DataBaseSchema.vala:120 msgid "Reload Tables" msgstr "Оновити таблиці" #: src/Layouts/DataBaseSchema.vala:125 msgid "Add Table" msgstr "Додати таблицю" #: src/Layouts/DataBaseSchema.vala:289 msgid "TABLES" msgstr "ТÐБЛИЦІ" #: src/Layouts/DataBaseView.vala:49 msgid "Structure" msgstr "Структура" #: src/Layouts/DataBaseView.vala:50 msgid "Content" msgstr "ВміÑÑ‚" #: src/Layouts/DataBaseView.vala:51 msgid "Relations" msgstr "Зв'Ñзки" #: src/Layouts/DataBaseView.vala:52 src/Layouts/DataBaseView.vala:229 #: src/Layouts/DataBaseView.vala:253 msgid "Query" msgstr "Запит" #: src/Layouts/DataBaseView.vala:101 msgid "Zoom Out" msgstr "Зменшити" #: src/Layouts/DataBaseView.vala:107 msgid "Zoom 1:1" msgstr "МаÑштаб 1:1" #: src/Layouts/DataBaseView.vala:111 msgid "Zoom In" msgstr "Збільшити" #: src/Layouts/DataBaseView.vala:124 msgid "High Contrast" msgstr "ВиÑока контраÑтніÑть" #: src/Layouts/DataBaseView.vala:132 msgid "Solarized Light" msgstr "Solarized Ñвітла" #: src/Layouts/DataBaseView.vala:140 msgid "Solarized Dark" msgstr "Solarized темна" #: src/Layouts/DataBaseView.vala:163 msgid "Change Text Style" msgstr "Змінити Ñтиль текÑту" #: src/Layouts/DataBaseView.vala:222 msgid "Create a new Query Tab" msgstr "Створити нову вкладку запитів" #: src/Layouts/DataBaseView.vala:240 #, c-format msgid "Query %i" msgstr "Запит %i" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select Table" msgstr "Вибрати таблицю" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select a table from the left sidebar to activate this view." msgstr "Вибрати таблицю у лівій бічній панелі, щоб увімкнути це поданнÑ." #: src/Layouts/Views/Structure.vala:107 src/Layouts/Views/Structure.vala:145 #: src/Layouts/Views/Content.vala:179 src/Layouts/Views/Content.vala:218 #: src/Layouts/Views/Relations.vala:106 src/Layouts/Views/Relations.vala:144 #: src/Layouts/Views/Query.vala:323 msgid "No Results Available" msgstr "Ðемає доÑтупних результатів" #: src/Layouts/Views/Structure.vala:118 src/Layouts/Views/Content.vala:191 #: src/Layouts/Views/Relations.vala:117 msgid "Reload Results" msgstr "Оновити результати" #: src/Layouts/Views/Structure.vala:197 msgid " Fields" msgstr " ПолÑ" #: src/Layouts/Views/Content.vala:121 msgid "Previous Page" msgstr "ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ Ñторінка" #: src/Layouts/Views/Content.vala:126 msgid "Next Page" msgstr "ÐаÑтупна Ñторінка" #: src/Layouts/Views/Content.vala:131 #, c-format msgid "%d Pages" msgstr "%d Ñторінки" #: src/Layouts/Views/Content.vala:134 msgid "Jump to page…" msgstr "Стрибнути до Ñторінки…" #: src/Layouts/Views/Content.vala:165 msgid "1 Page" msgstr "1 Ñторінка" #: src/Layouts/Views/Content.vala:171 #, c-format msgid "%d of %d Pages" msgstr "%d з %d Ñторінок" #: src/Layouts/Views/Content.vala:275 #, c-format msgid "%d Entries" msgstr "%d запиÑи" #: src/Layouts/Views/Relations.vala:197 msgid " Constraints" msgstr " ОбмеженнÑ" #: src/Layouts/Views/Query.vala:279 msgid "Running Query…" msgstr "Працює запит…" #: src/Layouts/Views/Query.vala:295 src/Layouts/Views/Query.vala:304 msgid "Run Query" msgstr "ЗапуÑтити запит" #: src/Layouts/Views/Query.vala:356 msgid "Export Results" msgstr "ЕкÑпортувати результат" #: src/Layouts/Views/Query.vala:369 msgid "Export as CSV" msgstr "ЕкÑпортувати Ñк CSV" #: src/Layouts/Views/Query.vala:377 msgid "Export as Text" msgstr "ЕкÑпортувати Ñк текÑÑ‚" #: src/Layouts/Views/Query.vala:436 src/Layouts/Views/Query.vala:482 msgid "Unable to process Query!" msgstr "Ðе вдалоÑÑ Ð¾Ð±Ñ€Ð¾Ð±Ð¸Ñ‚Ð¸ запит!" #: src/Layouts/Views/Query.vala:457 #, c-format msgid "%d Total Results" msgstr "Ð’Ñього %d результатів" #: src/Layouts/Views/Query.vala:492 #, c-format msgid "Query Successfully Executed! Rows Affected: %s" msgstr "Запит уÑпішно виконано! Уражені Ñ€Ñдки: %s" #: src/Layouts/Views/Query.vala:495 msgid "Query Executed!" msgstr "Запит очікуєтьÑÑ!" #: src/Partials/LibraryItem.vala:107 src/Widgets/ConnectionDialog.vala:431 msgid "Connect" msgstr "З'єднати" #: src/Partials/LibraryItem.vala:110 msgid "Edit Connection" msgstr "Змінити з'єднаннÑ" #: src/Partials/LibraryItem.vala:113 msgid "Duplicate Connection" msgstr "Дублювати з'єднаннÑ" #: src/Partials/LibraryItem.vala:116 msgid "Delete Connection" msgstr "Видалити з'єднаннÑ" #: src/Partials/LibraryItem.vala:126 msgid "Options" msgstr "ВлаÑтивоÑті" #: src/Partials/TreeBuilder.vala:131 msgid "Error" msgstr "Помилка" #: src/Partials/TreeBuilder.vala:131 msgid "on Column" msgstr "на Ñтовпці" #: src/Partials/TreeBuilder.vala:172 #, c-format msgid "Copy %s" msgstr "Копіювати %s" #: src/Services/Settings.vala:106 #, c-format msgid "%s (copy)" msgstr "%s (копіÑ)" #: src/Services/ConnectionManager.vala:193 #, c-format msgid "Libssh2 initialization failed (%d)" msgstr "Libssh2 Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð½Ðµ вдалаÑÑŒ (%d)" #: src/Services/ConnectionManager.vala:202 msgid "Failed to open socket" msgstr "Ðе вдалоÑÑŒ відкрити Ñокет" #: src/Services/ConnectionManager.vala:211 msgid "Failed to connect!" msgstr "Ðе вдалоÑÑŒ з'єднатиÑÑŒ!" #: src/Services/ConnectionManager.vala:223 #, c-format msgid "Error when starting up SSH session: %d" msgstr "Помилка на Ñтарті SSH ÑеанÑу: %d" #: src/Services/ConnectionManager.vala:242 msgid "Authentication by password failed!" msgstr "Ðе вдалаÑÑ Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð·Ð° допомогою паролÑ!" #: src/Services/ConnectionManager.vala:252 msgid "Authentication by public key failed!" msgstr "Ðе вдалаÑÑ Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð¿ÑƒÐ±Ð»Ñ–Ñ‡Ð½Ð¸Ð¼ ключем!" #: src/Services/ConnectionManager.vala:259 msgid "No supported authentication methods found!" msgstr "Ðе знайдено підтримуваних методів автентифікації!" #: src/Services/ConnectionManager.vala:266 msgid "Failed to open listen socket" msgstr "Ðе вдалоÑÑŒ відкрити гніздо проÑлуханнÑ" #: src/Services/ConnectionManager.vala:281 msgid "Failed to bind. Your Database Port may be wrong!" msgstr "Ðе вдалоÑÑŒ з'єднати. Ваш порт бази даних може бути хибним!" #: src/Services/ConnectionManager.vala:287 msgid "Failed to listen!" msgstr "Ðе вдалоÑÑŒ проÑлухати!" #: src/Services/ConnectionManager.vala:314 msgid "Failed to accept remote connection!" msgstr "Ðе вдалоÑÑŒ прийнÑти віддалене з'єднаннÑ!" #: src/Services/ConnectionManager.vala:323 msgid "" "Could not open the direct-tcpip channel! (Note that this can be a problem at " "the server! Please review the server logs.)" msgstr "" "Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ прÑмий tcpip канал! (Зауважте, що це може бути проблемою " "на Ñервері! ПереглÑньте журнали Ñервера.)" #: src/Services/ConnectionManager.vala:566 msgid "Error!" msgstr "Помилка!" #: src/Widgets/ConnectionDialog.vala:33 msgid "Missing SSH Key file!" msgstr "ВідÑутній файл SSH-ключа!" #: src/Widgets/ConnectionDialog.vala:34 msgid "Missing SSH public key!" msgstr "ВідÑутній публічний ключ SSH!" #: src/Widgets/ConnectionDialog.vala:89 src/Widgets/ConnectionDialog.vala:355 msgid "Connection" msgstr "З'єднаннÑ" #: src/Widgets/ConnectionDialog.vala:141 msgid "Select connection color" msgstr "Оберіть колір з'єднаннÑ" #: src/Widgets/ConnectionDialog.vala:164 msgid "Connection Name:" msgstr "Ðазва з'єднаннÑ:" #: src/Widgets/ConnectionDialog.vala:165 msgid "Connection's name" msgstr "Ðазви з'єднань" #: src/Widgets/ConnectionDialog.vala:172 msgid "Database Type:" msgstr "Тип бази даних:" #: src/Widgets/ConnectionDialog.vala:194 msgid "Host:" msgstr "ХоÑÑ‚:" #: src/Widgets/ConnectionDialog.vala:200 msgid "Database Name:" msgstr "Ðазва бази даних:" #: src/Widgets/ConnectionDialog.vala:207 msgid "Username:" msgstr "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача:" #: src/Widgets/ConnectionDialog.vala:213 msgid "Password:" msgstr "Пароль:" #: src/Widgets/ConnectionDialog.vala:217 src/Widgets/ConnectionDialog.vala:227 #: src/Widgets/ConnectionDialog.vala:285 src/Widgets/ConnectionDialog.vala:295 msgid "Show password" msgstr "Показати пароль" #: src/Widgets/ConnectionDialog.vala:224 src/Widgets/ConnectionDialog.vala:292 msgid "Hide password" msgstr "Приховати пароль" #: src/Widgets/ConnectionDialog.vala:234 msgid "Port:" msgstr "Порт:" #: src/Widgets/ConnectionDialog.vala:240 msgid "File Path:" msgstr "ШлÑÑ… файлу:" #: src/Widgets/ConnectionDialog.vala:241 msgid "Select Your SQLite File…" msgstr "Оберіть Ваш SQLite файл…" #: src/Widgets/ConnectionDialog.vala:261 msgid "Connect via SSH Tunnel:" msgstr "З'єднати з SSH тунелем:" #: src/Widgets/ConnectionDialog.vala:271 msgid "SSH Host:" msgstr "SSH хоÑÑ‚:" #: src/Widgets/ConnectionDialog.vala:276 msgid "SSH Username:" msgstr "SSH ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача:" #: src/Widgets/ConnectionDialog.vala:281 msgid "SSH Password:" msgstr "SSH пароль:" #: src/Widgets/ConnectionDialog.vala:301 msgid "SSH Port:" msgstr "SSH порт:" #: src/Widgets/ConnectionDialog.vala:302 msgid "Optional" msgstr "Ðеобов'Ñзковий" #: src/Widgets/ConnectionDialog.vala:306 msgid "SSH Identity" msgstr "Ð†Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ SSH" #: src/Widgets/ConnectionDialog.vala:308 msgid "Select Your Identity File…" msgstr "Оберіть Ваш файл ідентифікації…" #: src/Widgets/ConnectionDialog.vala:324 msgid "Generate SSH Key" msgstr "Згенерувати SSH ключ" #: src/Widgets/ConnectionDialog.vala:356 msgid "SSH Tunnel" msgstr "SSH тунель" #: src/Widgets/ConnectionDialog.vala:426 msgid "Close" msgstr "Закрити" #: src/Widgets/ConnectionDialog.vala:427 msgid "Save Connection" msgstr "Зберегти з'єднаннÑ" #: src/Widgets/ConnectionDialog.vala:429 msgid "Test Connection" msgstr "ТеÑÑ‚ з'єднаннÑ" #: src/Widgets/ConnectionDialog.vala:620 msgid "Opening SSH Tunnel…" msgstr "Відкрити SSH тунель…" #: src/Widgets/ConnectionDialog.vala:650 msgid "Testing Connection…" msgstr "ТеÑтуєтьÑÑ Ð·'єднаннÑ…" #: src/Widgets/ConnectionDialog.vala:661 msgid "Successfully Connected!" msgstr "УÑпішно з'єднано!" #: src/Widgets/ConnectionDialog.vala:679 msgid "Saving Connection…" msgstr "ЗберігаєтьÑÑ Ð·'єднаннÑ…" #: src/Widgets/ConnectionDialog.vala:684 msgid "Connection Saved!" msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð¾!" #: src/Widgets/ConnectionDialog.vala:692 msgid "Connecting…" msgstr "З'єднаннÑ…" sequeler-0.8.2/po/zh_Hans.po000066400000000000000000000342571410464306200157310ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.alecaddd.sequeler package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: com.github.alecaddd.sequeler\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-04-11 12:37+0200\n" "PO-Revision-Date: 2021-04-09 12:45+0000\n" "Last-Translator: Yangfl \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\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: Weblate 4.6-dev\n" #: src/Application.vala:62 msgid "Directories are not supported" msgstr "䏿”¯æŒç›®å½•" #: src/Application.vala:68 msgid "Don't know what to do" msgstr "ä¸çŸ¥é“åšä»€ä¹ˆ" #: src/Application.vala:80 msgid "Something completely unexpected happened" msgstr "å‘ç”Ÿäº†å®Œå…¨å‡ºä¹Žæ„æ–™çš„事" #: src/Layouts/HeaderBar.vala:46 src/Layouts/HeaderBar.vala:53 msgid "Logout" msgstr "登出" #: src/Layouts/HeaderBar.vala:56 msgid "Light background" msgstr "浅色背景" #: src/Layouts/HeaderBar.vala:57 msgid "Dark background" msgstr "深色背景" #: src/Layouts/HeaderBar.vala:68 src/Layouts/Welcome.vala:39 msgid "New Window" msgstr "新窗å£" #: src/Layouts/HeaderBar.vala:71 src/Widgets/ConnectionDialog.vala:130 #: src/Widgets/ConnectionDialog.vala:165 msgid "New Connection" msgstr "新连接" #: src/Layouts/HeaderBar.vala:74 msgid "Quit" msgstr "退出" #: src/Layouts/HeaderBar.vala:94 msgid "Menu" msgstr "目录" #: src/Layouts/Main.vala:77 #, c-format msgid "Connected to %s" msgstr "已连接至 %s" #: src/Layouts/Library.vala:65 msgid "SAVED CONNECTIONS" msgstr "å·²ä¿æŒè¿žæŽ¥" #: src/Layouts/Library.vala:74 msgid "Delete All" msgstr "删除全部" #: src/Layouts/Library.vala:81 msgid "Reload Library" msgstr "é‡è½½åº“" #: src/Layouts/Library.vala:84 msgid "Export Library" msgstr "导出库" #: src/Layouts/Library.vala:215 src/Layouts/Library.vala:233 msgid "Are you sure you want to proceed?" msgstr "您确定è¦ç»§ç»­å—?" #: src/Layouts/Library.vala:215 msgid "By deleting this connection you won’t be able to recover this data." msgstr "删除此连接åŽï¼Œæ‚¨å°†æ— æ³•æ¢å¤æ­¤æ•°æ®ã€‚" #: src/Layouts/Library.vala:218 msgid "Yes, Delete!" msgstr "是,删除ï¼" #: src/Layouts/Library.vala:233 msgid "All the data will be deleted and you won’t be able to recover it." msgstr "所有数æ®å°†è¢«åˆ é™¤ï¼Œæ‚¨å°†æ— æ³•æ¢å¤ã€‚" #: src/Layouts/Library.vala:236 msgid "Yes, Delete All!" msgstr "是,删除全部ï¼" #: src/Layouts/Library.vala:330 src/Widgets/ConnectionDialog.vala:575 #: src/Widgets/ConnectionDialog.vala:596 msgid "A username is required in order to connect!" msgstr "需è¦ç”¨æˆ·åæ‰èƒ½è¿žæŽ¥ï¼" #: src/Layouts/Library.vala:404 src/Layouts/Views/Query.vala:528 msgid "Pick a file" msgstr "选择文件" #: src/Layouts/Library.vala:407 src/Layouts/Views/Query.vala:531 msgid "_Save" msgstr "ä¿å­˜(_S)" #: src/Layouts/Library.vala:408 src/Layouts/Welcome.vala:62 #: src/Layouts/Views/Query.vala:532 msgid "_Cancel" msgstr "å–æ¶ˆ(_S)" #: src/Layouts/Library.vala:467 #, c-format msgid "Unable to Connect to %s" msgstr "无法连接到 %s" #: src/Layouts/Library.vala:480 msgid "Unable to Export Library " msgstr "无法导出库 " #: src/Layouts/Welcome.vala:28 msgid "Welcome to Sequeler" msgstr "欢迎æ¥åˆ° Sequeler" #: src/Layouts/Welcome.vala:29 msgid "Connect to Any Local or Remote Database." msgstr "连接到任何本地或远程数æ®åº“。" #: src/Layouts/Welcome.vala:38 msgid "Add a New Database" msgstr "添加一个新的数æ®åº“" #: src/Layouts/Welcome.vala:38 msgid "Connect to a Database and Save It in Your Library" msgstr "连接到数æ®åº“并将其ä¿å­˜åœ¨æ‚¨çš„库中" #: src/Layouts/Welcome.vala:39 msgid "Open a New Sequeler Window" msgstr "打开新的 Sequeler 窗å£" #: src/Layouts/Welcome.vala:40 msgid "Import Connections" msgstr "导入连接" #: src/Layouts/Welcome.vala:40 msgid "Import Previously Exported Sequeler Connections" msgstr "导入先å‰å¯¼å‡ºçš„ Sequeler 连接" #: src/Layouts/Welcome.vala:58 msgid "Select a file" msgstr "选择文件" #: src/Layouts/Welcome.vala:61 msgid "_Open" msgstr "打开(_O)" #: src/Layouts/Welcome.vala:107 msgid "Unable to Import Library " msgstr "无法导入库 " #: src/Layouts/DataBaseSchema.vala:66 src/Layouts/DataBaseSchema.vala:167 msgid "- Select Database -" msgstr "- 选择数æ®åº“ -" #: src/Layouts/DataBaseSchema.vala:87 msgid "Search Tables" msgstr "æœç´¢è¡¨" #: src/Layouts/DataBaseSchema.vala:98 msgid "Search Tables…" msgstr "æœç´¢è¡¨â€¦" #: src/Layouts/DataBaseSchema.vala:120 msgid "Reload Tables" msgstr "刷新表" #: src/Layouts/DataBaseSchema.vala:125 msgid "Add Table" msgstr "添加表" #: src/Layouts/DataBaseSchema.vala:289 msgid "TABLES" msgstr "表" #: src/Layouts/DataBaseView.vala:49 msgid "Structure" msgstr "结构" #: src/Layouts/DataBaseView.vala:50 msgid "Content" msgstr "内容" #: src/Layouts/DataBaseView.vala:51 msgid "Relations" msgstr "关系" #: src/Layouts/DataBaseView.vala:52 src/Layouts/DataBaseView.vala:229 #: src/Layouts/DataBaseView.vala:253 msgid "Query" msgstr "查询" #: src/Layouts/DataBaseView.vala:101 msgid "Zoom Out" msgstr "缩å°" #: src/Layouts/DataBaseView.vala:107 msgid "Zoom 1:1" msgstr "原始缩放" #: src/Layouts/DataBaseView.vala:111 msgid "Zoom In" msgstr "放大" #: src/Layouts/DataBaseView.vala:124 msgid "High Contrast" msgstr "高对比度" #: src/Layouts/DataBaseView.vala:132 msgid "Solarized Light" msgstr "" #: src/Layouts/DataBaseView.vala:140 msgid "Solarized Dark" msgstr "" #: src/Layouts/DataBaseView.vala:163 msgid "Change Text Style" msgstr "更改文字样å¼" #: src/Layouts/DataBaseView.vala:222 msgid "Create a new Query Tab" msgstr "创建新查询选项å¡" #: src/Layouts/DataBaseView.vala:240 #, c-format msgid "Query %i" msgstr "查询 %i" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select Table" msgstr "选择表" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select a table from the left sidebar to activate this view." msgstr "从左边æ ä¸­é€‰æ‹©ä¸€ä¸ªè¡¨æ ¼ä»¥æ¿€æ´»æ­¤è§†å›¾ã€‚" #: src/Layouts/Views/Structure.vala:107 src/Layouts/Views/Structure.vala:145 #: src/Layouts/Views/Content.vala:179 src/Layouts/Views/Content.vala:218 #: src/Layouts/Views/Relations.vala:106 src/Layouts/Views/Relations.vala:144 #: src/Layouts/Views/Query.vala:323 msgid "No Results Available" msgstr "æ— å¯ç”¨ç»“æžœ" #: src/Layouts/Views/Structure.vala:118 src/Layouts/Views/Content.vala:191 #: src/Layouts/Views/Relations.vala:117 msgid "Reload Results" msgstr "刷新结果" #: src/Layouts/Views/Structure.vala:197 msgid " Fields" msgstr "" #: src/Layouts/Views/Content.vala:121 msgid "Previous Page" msgstr "å‰ä¸€é¡µ" #: src/Layouts/Views/Content.vala:126 msgid "Next Page" msgstr "åŽä¸€é¡µ" #: src/Layouts/Views/Content.vala:131 #, c-format msgid "%d Pages" msgstr "%d 页" #: src/Layouts/Views/Content.vala:134 msgid "Jump to page…" msgstr "跳至页…" #: src/Layouts/Views/Content.vala:165 msgid "1 Page" msgstr "1 页" #: src/Layouts/Views/Content.vala:171 #, c-format msgid "%d of %d Pages" msgstr "%2$d 页中的第 %1$d 页" #: src/Layouts/Views/Content.vala:275 #, c-format msgid "%d Entries" msgstr "%d æ¡" #: src/Layouts/Views/Relations.vala:197 msgid " Constraints" msgstr " 约æŸ" #: src/Layouts/Views/Query.vala:279 msgid "Running Query…" msgstr "正在è¿è¡ŒæŸ¥è¯¢â€¦" #: src/Layouts/Views/Query.vala:295 src/Layouts/Views/Query.vala:304 msgid "Run Query" msgstr "è¿è¡ŒæŸ¥è¯¢" #: src/Layouts/Views/Query.vala:356 msgid "Export Results" msgstr "导出结果" #: src/Layouts/Views/Query.vala:369 msgid "Export as CSV" msgstr "导出为 CSV" #: src/Layouts/Views/Query.vala:377 msgid "Export as Text" msgstr "导出为文本文件" #: src/Layouts/Views/Query.vala:436 src/Layouts/Views/Query.vala:482 msgid "Unable to process Query!" msgstr "æ— æ³•å¤„ç†æŸ¥è¯¢ï¼" #: src/Layouts/Views/Query.vala:457 #, c-format msgid "%d Total Results" msgstr "å…± %d æ¡ç»“æžœ" #: src/Layouts/Views/Query.vala:492 #, c-format msgid "Query Successfully Executed! Rows Affected: %s" msgstr "æˆåŠŸæ‰§è¡ŒæŸ¥è¯¢ï¼ å—å½±å“的行:%s" #: src/Layouts/Views/Query.vala:495 msgid "Query Executed!" msgstr "查询已执行ï¼" #: src/Partials/LibraryItem.vala:107 src/Widgets/ConnectionDialog.vala:431 msgid "Connect" msgstr "连接" #: src/Partials/LibraryItem.vala:110 msgid "Edit Connection" msgstr "编辑连接" #: src/Partials/LibraryItem.vala:113 msgid "Duplicate Connection" msgstr "å¤åˆ¶è¿žæŽ¥" #: src/Partials/LibraryItem.vala:116 msgid "Delete Connection" msgstr "删除连接" #: src/Partials/LibraryItem.vala:126 msgid "Options" msgstr "选项" #: src/Partials/TreeBuilder.vala:131 msgid "Error" msgstr "错误" #: src/Partials/TreeBuilder.vala:131 msgid "on Column" msgstr "于列" #: src/Partials/TreeBuilder.vala:172 #, c-format msgid "Copy %s" msgstr "å¤åˆ¶ %s" #: src/Services/Settings.vala:106 #, c-format msgid "%s (copy)" msgstr "%s (å¤åˆ¶)" #: src/Services/ConnectionManager.vala:193 #, c-format msgid "Libssh2 initialization failed (%d)" msgstr "Libssh2åˆå§‹åŒ–失败 (%d)" #: src/Services/ConnectionManager.vala:202 msgid "Failed to open socket" msgstr "打开套接字失败" #: src/Services/ConnectionManager.vala:211 msgid "Failed to connect!" msgstr "连接失败ï¼" #: src/Services/ConnectionManager.vala:223 #, c-format msgid "Error when starting up SSH session: %d" msgstr "å¯åЍ SSH ä¼šè¯æ—¶å‡ºé”™ï¼š%d" #: src/Services/ConnectionManager.vala:242 msgid "Authentication by password failed!" msgstr "密ç è®¤è¯å¤±è´¥ï¼" #: src/Services/ConnectionManager.vala:252 msgid "Authentication by public key failed!" msgstr "公钥认è¯å¤±è´¥ï¼" #: src/Services/ConnectionManager.vala:259 msgid "No supported authentication methods found!" msgstr "找ä¸åˆ°æ”¯æŒçš„èº«ä»½éªŒè¯æ–¹æ³•ï¼" #: src/Services/ConnectionManager.vala:266 msgid "Failed to open listen socket" msgstr "无法打开监å¬å¥—接字" #: src/Services/ConnectionManager.vala:281 msgid "Failed to bind. Your Database Port may be wrong!" msgstr "绑定失败。 æ•°æ®åº“端å£å¯èƒ½æœ‰è¯¯ï¼" #: src/Services/ConnectionManager.vala:287 msgid "Failed to listen!" msgstr "监å¬å¤±è´¥ï¼" #: src/Services/ConnectionManager.vala:314 msgid "Failed to accept remote connection!" msgstr "无法接å—远程连接ï¼" #: src/Services/ConnectionManager.vala:323 msgid "" "Could not open the direct-tcpip channel! (Note that this can be a problem at " "the server! Please review the server logs.)" msgstr "无法打开直接 tcpip 通é“ï¼(请注æ„,这å¯èƒ½æ˜¯æœåŠ¡å™¨ä¸Šçš„é—®é¢˜ï¼è¯·æŸ¥çœ‹æœåŠ¡å™¨æ—¥å¿—ã€‚)" #: src/Services/ConnectionManager.vala:566 msgid "Error!" msgstr "错误ï¼" #: src/Widgets/ConnectionDialog.vala:33 msgid "Missing SSH Key file!" msgstr "缺少 SSH 密钥文件ï¼" #: src/Widgets/ConnectionDialog.vala:34 msgid "Missing SSH public key!" msgstr "缺少 SSH 公钥ï¼" #: src/Widgets/ConnectionDialog.vala:89 src/Widgets/ConnectionDialog.vala:355 msgid "Connection" msgstr "连接" #: src/Widgets/ConnectionDialog.vala:141 msgid "Select connection color" msgstr "选择连接颜色" #: src/Widgets/ConnectionDialog.vala:164 msgid "Connection Name:" msgstr "连接å:" #: src/Widgets/ConnectionDialog.vala:165 msgid "Connection's name" msgstr "连接åç§°" #: src/Widgets/ConnectionDialog.vala:172 msgid "Database Type:" msgstr "æ•°æ®åº“类型:" #: src/Widgets/ConnectionDialog.vala:194 msgid "Host:" msgstr "主机:" #: src/Widgets/ConnectionDialog.vala:200 msgid "Database Name:" msgstr "æ•°æ®åº“å:" #: src/Widgets/ConnectionDialog.vala:207 msgid "Username:" msgstr "用户å:" #: src/Widgets/ConnectionDialog.vala:213 msgid "Password:" msgstr "密ç ï¼š" #: src/Widgets/ConnectionDialog.vala:217 src/Widgets/ConnectionDialog.vala:227 #: src/Widgets/ConnectionDialog.vala:285 src/Widgets/ConnectionDialog.vala:295 msgid "Show password" msgstr "显示密ç " #: src/Widgets/ConnectionDialog.vala:224 src/Widgets/ConnectionDialog.vala:292 msgid "Hide password" msgstr "éšè—密ç " #: src/Widgets/ConnectionDialog.vala:234 msgid "Port:" msgstr "端å£ï¼š" #: src/Widgets/ConnectionDialog.vala:240 msgid "File Path:" msgstr "文件路径:" #: src/Widgets/ConnectionDialog.vala:241 msgid "Select Your SQLite File…" msgstr "选择您的 SQLite 文件…" #: src/Widgets/ConnectionDialog.vala:261 msgid "Connect via SSH Tunnel:" msgstr "通过 SSH éš§é“连接:" #: src/Widgets/ConnectionDialog.vala:271 msgid "SSH Host:" msgstr "SSH 主机:" #: src/Widgets/ConnectionDialog.vala:276 msgid "SSH Username:" msgstr "SSH 用户å:" #: src/Widgets/ConnectionDialog.vala:281 msgid "SSH Password:" msgstr "SSH 密ç ï¼š" #: src/Widgets/ConnectionDialog.vala:301 msgid "SSH Port:" msgstr "SSH 端å£ï¼š" #: src/Widgets/ConnectionDialog.vala:302 msgid "Optional" msgstr "å¯é€‰" #: src/Widgets/ConnectionDialog.vala:306 msgid "SSH Identity" msgstr "SSH 身份" #: src/Widgets/ConnectionDialog.vala:308 msgid "Select Your Identity File…" msgstr "é€‰æ‹©æ‚¨çš„èº«ä»½éªŒè¯æ–‡ä»¶â€¦" #: src/Widgets/ConnectionDialog.vala:324 msgid "Generate SSH Key" msgstr "ç”Ÿæˆ SSH 密钥" #: src/Widgets/ConnectionDialog.vala:356 msgid "SSH Tunnel" msgstr "SSH éš§é“" #: src/Widgets/ConnectionDialog.vala:426 msgid "Close" msgstr "关闭" #: src/Widgets/ConnectionDialog.vala:427 msgid "Save Connection" msgstr "ä¿å­˜è¿žæŽ¥" #: src/Widgets/ConnectionDialog.vala:429 msgid "Test Connection" msgstr "测试连接" #: src/Widgets/ConnectionDialog.vala:620 msgid "Opening SSH Tunnel…" msgstr "正在打开 SSH éš§é“…" #: src/Widgets/ConnectionDialog.vala:650 msgid "Testing Connection…" msgstr "正在测试连接…" #: src/Widgets/ConnectionDialog.vala:661 msgid "Successfully Connected!" msgstr "å·²æˆåŠŸè¿žæŽ¥ï¼" #: src/Widgets/ConnectionDialog.vala:679 msgid "Saving Connection…" msgstr "正在ä¿å­˜è¿žæŽ¥â€¦" #: src/Widgets/ConnectionDialog.vala:684 msgid "Connection Saved!" msgstr "连接已ä¿å­˜ï¼" #: src/Widgets/ConnectionDialog.vala:692 msgid "Connecting…" msgstr "连接中…" sequeler-0.8.2/po/zh_Hant.po000066400000000000000000000343051410464306200157240ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.alecaddd.sequeler package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: com.github.alecaddd.sequeler\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-04-11 12:37+0200\n" "PO-Revision-Date: 2021-04-10 13:27+0000\n" "Last-Translator: Yangfl \n" "Language-Team: Chinese (Traditional) \n" "Language: zh_Hant\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: Weblate 4.6-dev\n" #: src/Application.vala:62 msgid "Directories are not supported" msgstr "䏿”¯æ´ç›®éŒ„" #: src/Application.vala:68 msgid "Don't know what to do" msgstr "ä¸çŸ¥é“åšä»€éº¼" #: src/Application.vala:80 msgid "Something completely unexpected happened" msgstr "ç™¼ç”Ÿäº†å®Œå…¨å‡ºä¹Žæ„æ–™çš„事" #: src/Layouts/HeaderBar.vala:46 src/Layouts/HeaderBar.vala:53 msgid "Logout" msgstr "登出" #: src/Layouts/HeaderBar.vala:56 msgid "Light background" msgstr "淺色背景" #: src/Layouts/HeaderBar.vala:57 msgid "Dark background" msgstr "深色背景" #: src/Layouts/HeaderBar.vala:68 src/Layouts/Welcome.vala:39 msgid "New Window" msgstr "新視窗" #: src/Layouts/HeaderBar.vala:71 src/Widgets/ConnectionDialog.vala:130 #: src/Widgets/ConnectionDialog.vala:165 msgid "New Connection" msgstr "新連線" #: src/Layouts/HeaderBar.vala:74 msgid "Quit" msgstr "退出" #: src/Layouts/HeaderBar.vala:94 msgid "Menu" msgstr "目錄" #: src/Layouts/Main.vala:77 #, c-format msgid "Connected to %s" msgstr "已連線至 %s" #: src/Layouts/Library.vala:65 msgid "SAVED CONNECTIONS" msgstr "å·²ä¿æŒé€£ç·š" #: src/Layouts/Library.vala:74 msgid "Delete All" msgstr "刪除全部" #: src/Layouts/Library.vala:81 msgid "Reload Library" msgstr "éŽè¼‰åº«" #: src/Layouts/Library.vala:84 msgid "Export Library" msgstr "匯出庫" #: src/Layouts/Library.vala:215 src/Layouts/Library.vala:233 msgid "Are you sure you want to proceed?" msgstr "您確定è¦ç¹¼çºŒå—Žï¼Ÿ" #: src/Layouts/Library.vala:215 msgid "By deleting this connection you won’t be able to recover this data." msgstr "刪除此連線後,您將無法æ¢å¾©æ­¤è³‡æ–™ã€‚" #: src/Layouts/Library.vala:218 msgid "Yes, Delete!" msgstr "是,刪除ï¼" #: src/Layouts/Library.vala:233 msgid "All the data will be deleted and you won’t be able to recover it." msgstr "所有資料將被刪除,您將無法æ¢å¾©ã€‚" #: src/Layouts/Library.vala:236 msgid "Yes, Delete All!" msgstr "是,刪除全部ï¼" #: src/Layouts/Library.vala:330 src/Widgets/ConnectionDialog.vala:575 #: src/Widgets/ConnectionDialog.vala:596 msgid "A username is required in order to connect!" msgstr "需è¦ä½¿ç”¨è€…å稱æ‰èƒ½é€£ç·šï¼" #: src/Layouts/Library.vala:404 src/Layouts/Views/Query.vala:528 msgid "Pick a file" msgstr "鏿“‡æª”案" #: src/Layouts/Library.vala:407 src/Layouts/Views/Query.vala:531 msgid "_Save" msgstr "儲存(_S)" #: src/Layouts/Library.vala:408 src/Layouts/Welcome.vala:62 #: src/Layouts/Views/Query.vala:532 msgid "_Cancel" msgstr "å–æ¶ˆ(_S)" #: src/Layouts/Library.vala:467 #, c-format msgid "Unable to Connect to %s" msgstr "無法連線到 %s" #: src/Layouts/Library.vala:480 msgid "Unable to Export Library " msgstr "無法匯出庫 " #: src/Layouts/Welcome.vala:28 msgid "Welcome to Sequeler" msgstr "歡迎來到 Sequeler" #: src/Layouts/Welcome.vala:29 msgid "Connect to Any Local or Remote Database." msgstr "連線到任何本地或é ç«¯è³‡æ–™åº«ã€‚" #: src/Layouts/Welcome.vala:38 msgid "Add a New Database" msgstr "新增一個新的資料庫" #: src/Layouts/Welcome.vala:38 msgid "Connect to a Database and Save It in Your Library" msgstr "連線到資料庫並將其儲存在您的庫中" #: src/Layouts/Welcome.vala:39 msgid "Open a New Sequeler Window" msgstr "開啟新的 Sequeler 視窗" #: src/Layouts/Welcome.vala:40 msgid "Import Connections" msgstr "匯入連線" #: src/Layouts/Welcome.vala:40 msgid "Import Previously Exported Sequeler Connections" msgstr "匯入先å‰åŒ¯å‡ºçš„ Sequeler 連線" #: src/Layouts/Welcome.vala:58 msgid "Select a file" msgstr "鏿“‡æª”案" #: src/Layouts/Welcome.vala:61 msgid "_Open" msgstr "開啟(_O)" #: src/Layouts/Welcome.vala:107 msgid "Unable to Import Library " msgstr "無法匯入庫 " #: src/Layouts/DataBaseSchema.vala:66 src/Layouts/DataBaseSchema.vala:167 msgid "- Select Database -" msgstr "- 鏿“‡è³‡æ–™åº« -" #: src/Layouts/DataBaseSchema.vala:87 msgid "Search Tables" msgstr "æœå°‹è¡¨" #: src/Layouts/DataBaseSchema.vala:98 msgid "Search Tables…" msgstr "æœå°‹è¡¨â€¦" #: src/Layouts/DataBaseSchema.vala:120 msgid "Reload Tables" msgstr "釿–°æ•´ç†è¡¨" #: src/Layouts/DataBaseSchema.vala:125 msgid "Add Table" msgstr "新增表" #: src/Layouts/DataBaseSchema.vala:289 msgid "TABLES" msgstr "表" #: src/Layouts/DataBaseView.vala:49 msgid "Structure" msgstr "çµæ§‹" #: src/Layouts/DataBaseView.vala:50 msgid "Content" msgstr "內容" #: src/Layouts/DataBaseView.vala:51 msgid "Relations" msgstr "關係" #: src/Layouts/DataBaseView.vala:52 src/Layouts/DataBaseView.vala:229 #: src/Layouts/DataBaseView.vala:253 msgid "Query" msgstr "查詢" #: src/Layouts/DataBaseView.vala:101 msgid "Zoom Out" msgstr "縮å°" #: src/Layouts/DataBaseView.vala:107 msgid "Zoom 1:1" msgstr "原始縮放" #: src/Layouts/DataBaseView.vala:111 msgid "Zoom In" msgstr "放大" #: src/Layouts/DataBaseView.vala:124 msgid "High Contrast" msgstr "é«˜å°æ¯”度" #: src/Layouts/DataBaseView.vala:132 msgid "Solarized Light" msgstr "" #: src/Layouts/DataBaseView.vala:140 msgid "Solarized Dark" msgstr "" #: src/Layouts/DataBaseView.vala:163 msgid "Change Text Style" msgstr "更改文字樣å¼" #: src/Layouts/DataBaseView.vala:222 msgid "Create a new Query Tab" msgstr "建立新查詢é¸é …å¡" #: src/Layouts/DataBaseView.vala:240 #, c-format msgid "Query %i" msgstr "查詢 %i" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select Table" msgstr "鏿“‡è¡¨" #: src/Layouts/Views/Structure.vala:79 src/Layouts/Views/Content.vala:90 #: src/Layouts/Views/Relations.vala:78 msgid "Select a table from the left sidebar to activate this view." msgstr "å¾žå·¦é‚Šæ¬„ä¸­é¸æ“‡ä¸€å€‹è¡¨æ ¼ä»¥å•Ÿç”¨æ­¤æª¢è¦–。" #: src/Layouts/Views/Structure.vala:107 src/Layouts/Views/Structure.vala:145 #: src/Layouts/Views/Content.vala:179 src/Layouts/Views/Content.vala:218 #: src/Layouts/Views/Relations.vala:106 src/Layouts/Views/Relations.vala:144 #: src/Layouts/Views/Query.vala:323 msgid "No Results Available" msgstr "ç„¡å¯ç”¨çµæžœ" #: src/Layouts/Views/Structure.vala:118 src/Layouts/Views/Content.vala:191 #: src/Layouts/Views/Relations.vala:117 msgid "Reload Results" msgstr "釿–°æ•´ç†çµæžœ" #: src/Layouts/Views/Structure.vala:197 msgid " Fields" msgstr "" #: src/Layouts/Views/Content.vala:121 msgid "Previous Page" msgstr "å‰ä¸€é " #: src/Layouts/Views/Content.vala:126 msgid "Next Page" msgstr "後一é " #: src/Layouts/Views/Content.vala:131 #, c-format msgid "%d Pages" msgstr "%d é " #: src/Layouts/Views/Content.vala:134 msgid "Jump to page…" msgstr "跳至é â€¦" #: src/Layouts/Views/Content.vala:165 msgid "1 Page" msgstr "1 é " #: src/Layouts/Views/Content.vala:171 #, c-format msgid "%d of %d Pages" msgstr "%2$d é ä¸­çš„第 %1$d é " #: src/Layouts/Views/Content.vala:275 #, c-format msgid "%d Entries" msgstr "%d æ¢" #: src/Layouts/Views/Relations.vala:197 msgid " Constraints" msgstr " ç´„æŸ" #: src/Layouts/Views/Query.vala:279 msgid "Running Query…" msgstr "正在執行查詢…" #: src/Layouts/Views/Query.vala:295 src/Layouts/Views/Query.vala:304 msgid "Run Query" msgstr "執行查詢" #: src/Layouts/Views/Query.vala:356 msgid "Export Results" msgstr "åŒ¯å‡ºçµæžœ" #: src/Layouts/Views/Query.vala:369 msgid "Export as CSV" msgstr "匯出為 CSV" #: src/Layouts/Views/Query.vala:377 msgid "Export as Text" msgstr "匯出為文字檔案" #: src/Layouts/Views/Query.vala:436 src/Layouts/Views/Query.vala:482 msgid "Unable to process Query!" msgstr "ç„¡æ³•è™•ç†æŸ¥è©¢ï¼" #: src/Layouts/Views/Query.vala:457 #, c-format msgid "%d Total Results" msgstr "å…± %d æ¢çµæžœ" #: src/Layouts/Views/Query.vala:492 #, c-format msgid "Query Successfully Executed! Rows Affected: %s" msgstr "æˆåŠŸåŸ·è¡ŒæŸ¥è©¢ï¼ å—影響的行:%s" #: src/Layouts/Views/Query.vala:495 msgid "Query Executed!" msgstr "查詢已執行ï¼" #: src/Partials/LibraryItem.vala:107 src/Widgets/ConnectionDialog.vala:431 msgid "Connect" msgstr "連線" #: src/Partials/LibraryItem.vala:110 msgid "Edit Connection" msgstr "編輯連線" #: src/Partials/LibraryItem.vala:113 msgid "Duplicate Connection" msgstr "複製連線" #: src/Partials/LibraryItem.vala:116 msgid "Delete Connection" msgstr "刪除連線" #: src/Partials/LibraryItem.vala:126 msgid "Options" msgstr "é¸é …" #: src/Partials/TreeBuilder.vala:131 msgid "Error" msgstr "錯誤" #: src/Partials/TreeBuilder.vala:131 msgid "on Column" msgstr "於列" #: src/Partials/TreeBuilder.vala:172 #, c-format msgid "Copy %s" msgstr "複製 %s" #: src/Services/Settings.vala:106 #, c-format msgid "%s (copy)" msgstr "%s (複製)" #: src/Services/ConnectionManager.vala:193 #, c-format msgid "Libssh2 initialization failed (%d)" msgstr "Libssh2åˆå§‹åŒ–失敗 (%d)" #: src/Services/ConnectionManager.vala:202 msgid "Failed to open socket" msgstr "開啟套接字失敗" #: src/Services/ConnectionManager.vala:211 msgid "Failed to connect!" msgstr "連線失敗ï¼" #: src/Services/ConnectionManager.vala:223 #, c-format msgid "Error when starting up SSH session: %d" msgstr "啟動 SSH 會話時出錯:%d" #: src/Services/ConnectionManager.vala:242 msgid "Authentication by password failed!" msgstr "密碼èªè­‰å¤±æ•—ï¼" #: src/Services/ConnectionManager.vala:252 msgid "Authentication by public key failed!" msgstr "公鑰èªè­‰å¤±æ•—ï¼" #: src/Services/ConnectionManager.vala:259 msgid "No supported authentication methods found!" msgstr "找ä¸åˆ°æ”¯æ´çš„身份驗證方法ï¼" #: src/Services/ConnectionManager.vala:266 msgid "Failed to open listen socket" msgstr "無法開啟監è½å¥—接字" #: src/Services/ConnectionManager.vala:281 msgid "Failed to bind. Your Database Port may be wrong!" msgstr "繫çµå¤±æ•—。 資料庫埠å¯èƒ½æœ‰èª¤ï¼" #: src/Services/ConnectionManager.vala:287 msgid "Failed to listen!" msgstr "監è½å¤±æ•—ï¼" #: src/Services/ConnectionManager.vala:314 msgid "Failed to accept remote connection!" msgstr "無法接å—é ç«¯é€£ç·šï¼" #: src/Services/ConnectionManager.vala:323 msgid "" "Could not open the direct-tcpip channel! (Note that this can be a problem at " "the server! Please review the server logs.)" msgstr "無法開啟直接 tcpip 通é“ï¼(請注æ„,這å¯èƒ½æ˜¯ä¼ºæœå™¨ä¸Šçš„å•題ï¼è«‹æª¢è¦–伺æœå™¨æ—¥èªŒã€‚)" #: src/Services/ConnectionManager.vala:566 msgid "Error!" msgstr "錯誤ï¼" #: src/Widgets/ConnectionDialog.vala:33 msgid "Missing SSH Key file!" msgstr "缺少 SSH 金鑰檔案ï¼" #: src/Widgets/ConnectionDialog.vala:34 msgid "Missing SSH public key!" msgstr "缺少 SSH 公鑰ï¼" #: src/Widgets/ConnectionDialog.vala:89 src/Widgets/ConnectionDialog.vala:355 msgid "Connection" msgstr "連線" #: src/Widgets/ConnectionDialog.vala:141 msgid "Select connection color" msgstr "鏿“‡é€£ç·šé¡è‰²" #: src/Widgets/ConnectionDialog.vala:164 msgid "Connection Name:" msgstr "連線å:" #: src/Widgets/ConnectionDialog.vala:165 msgid "Connection's name" msgstr "連線å稱" #: src/Widgets/ConnectionDialog.vala:172 msgid "Database Type:" msgstr "資料庫型別:" #: src/Widgets/ConnectionDialog.vala:194 msgid "Host:" msgstr "主機:" #: src/Widgets/ConnectionDialog.vala:200 msgid "Database Name:" msgstr "資料庫å:" #: src/Widgets/ConnectionDialog.vala:207 msgid "Username:" msgstr "使用者å稱:" #: src/Widgets/ConnectionDialog.vala:213 msgid "Password:" msgstr "密碼:" #: src/Widgets/ConnectionDialog.vala:217 src/Widgets/ConnectionDialog.vala:227 #: src/Widgets/ConnectionDialog.vala:285 src/Widgets/ConnectionDialog.vala:295 msgid "Show password" msgstr "顯示密碼" #: src/Widgets/ConnectionDialog.vala:224 src/Widgets/ConnectionDialog.vala:292 msgid "Hide password" msgstr "éš±è—密碼" #: src/Widgets/ConnectionDialog.vala:234 msgid "Port:" msgstr "埠:" #: src/Widgets/ConnectionDialog.vala:240 msgid "File Path:" msgstr "檔案路徑:" #: src/Widgets/ConnectionDialog.vala:241 msgid "Select Your SQLite File…" msgstr "鏿“‡æ‚¨çš„ SQLite 檔案…" #: src/Widgets/ConnectionDialog.vala:261 msgid "Connect via SSH Tunnel:" msgstr "é€éŽ SSH éš§é“連線:" #: src/Widgets/ConnectionDialog.vala:271 msgid "SSH Host:" msgstr "SSH 主機:" #: src/Widgets/ConnectionDialog.vala:276 msgid "SSH Username:" msgstr "SSH 使用者å稱:" #: src/Widgets/ConnectionDialog.vala:281 msgid "SSH Password:" msgstr "SSH 密碼:" #: src/Widgets/ConnectionDialog.vala:301 msgid "SSH Port:" msgstr "SSH 埠:" #: src/Widgets/ConnectionDialog.vala:302 msgid "Optional" msgstr "å¯é¸" #: src/Widgets/ConnectionDialog.vala:306 msgid "SSH Identity" msgstr "SSH 身份" #: src/Widgets/ConnectionDialog.vala:308 msgid "Select Your Identity File…" msgstr "鏿“‡æ‚¨çš„身份驗證檔案…" #: src/Widgets/ConnectionDialog.vala:324 msgid "Generate SSH Key" msgstr "ç”Ÿæˆ SSH 金鑰" #: src/Widgets/ConnectionDialog.vala:356 msgid "SSH Tunnel" msgstr "SSH éš§é“" #: src/Widgets/ConnectionDialog.vala:426 msgid "Close" msgstr "關閉" #: src/Widgets/ConnectionDialog.vala:427 msgid "Save Connection" msgstr "儲存連線" #: src/Widgets/ConnectionDialog.vala:429 msgid "Test Connection" msgstr "測試連線" #: src/Widgets/ConnectionDialog.vala:620 msgid "Opening SSH Tunnel…" msgstr "正在開啟 SSH éš§é“…" #: src/Widgets/ConnectionDialog.vala:650 msgid "Testing Connection…" msgstr "正在測試連線…" #: src/Widgets/ConnectionDialog.vala:661 msgid "Successfully Connected!" msgstr "å·²æˆåŠŸé€£ç·šï¼" #: src/Widgets/ConnectionDialog.vala:679 msgid "Saving Connection…" msgstr "正在儲存連線…" #: src/Widgets/ConnectionDialog.vala:684 msgid "Connection Saved!" msgstr "連線已儲存ï¼" #: src/Widgets/ConnectionDialog.vala:692 msgid "Connecting…" msgstr "連線中…" sequeler-0.8.2/schemas/000077500000000000000000000000001410464306200147715ustar00rootroot00000000000000sequeler-0.8.2/schemas/com.github.alecaddd.sequeler.gschema.xml.in000066400000000000000000000062751410464306200251430ustar00rootroot00000000000000 360 The saved horizontal position of the window. The saved horizontal position of the window. 360 The vertical position width of the window. The saved vertical position of the window. 900 The saved width of the window. The saved width of the window. Must be greater than 750, or it will not take effect. 600 The saved height of the window. The saved height of the window. Must be greater than 500, or it will not take effect. 260 The saved width of the sidebar pane. The saved width of the sidebar pane containing the connections library and database schema. 0 Total amount of saved connections. Increase the amount at every new connection, set a unique ID for every connection. 1000 Max rows to show in Content tab. Split results based on max amount, helps generate the pagination. [] The saved configured conenctions All the configured connections you saved are here true Save Quick Connections Automatically Save a Quick Connections into the Database Library. false Use dark theme Switch between Light and Dark theme. "" Current Version Check current App version for upgrades on startup. true Use system font Whether Sequeler should use the default system font 'Droid Sans Mono 12' Preferred Font Set the preferred font. 'solarized-light' Preferred Style Scheme Set the preferred style scheme. 200 Query tab height. Controls the height of the Query tab. sequeler-0.8.2/schemas/meson.build000066400000000000000000000007451410464306200171410ustar00rootroot00000000000000schema_path = '/com/github/alecaddd/sequeler/' if get_option('profile') == 'development' schema_path += 'Devel/' endif schema_conf = configuration_data() schema_conf.set('appid', application_id) schema_conf.set('schema-path', schema_path) configure_file( input: '@0@.gschema.xml.in'.format(meson.project_name()), output: '@0@.gschema.xml'.format(application_id), install: true, install_dir: join_paths(get_option('datadir'), 'glib-2.0', 'schemas'), configuration:schema_conf ) sequeler-0.8.2/src/000077500000000000000000000000001410464306200141355ustar00rootroot00000000000000sequeler-0.8.2/src/Application.vala000066400000000000000000000072061410464306200172520ustar00rootroot00000000000000/* * Copyright (c) 2011-2018 Alecaddd (http://alecaddd.com) * * 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 2 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, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Alessandro "Alecaddd" Castellani */ namespace Sequeler { public Sequeler.Services.Settings settings; public Sequeler.Services.PasswordManager password_mngr; public Sequeler.Services.UpgradeManager upgrade_mngr; public Secret.Schema schema; } public class Sequeler.Application : Gtk.Application { public GLib.List windows; construct { application_id = Constants.PROJECT_NAME; flags |= ApplicationFlags.HANDLES_OPEN; schema = new Secret.Schema (Constants.PROJECT_NAME, Secret.SchemaFlags.NONE, "id", Secret.SchemaAttributeType.INTEGER, "schema", Secret.SchemaAttributeType.STRING); settings = new Sequeler.Services.Settings (); password_mngr = new Sequeler.Services.PasswordManager (); upgrade_mngr = new Sequeler.Services.UpgradeManager (); windows = new GLib.List (); } public void new_window () { new Sequeler.Window (this).present (); } public override void window_added (Gtk.Window window) { windows.append (window as Window); base.window_added (window); } protected override void open (File[] files, string hint) { foreach (var file in files) { var type = file.query_file_type (FileQueryInfoFlags.NONE); switch (type) { case FileType.DIRECTORY: // File handle represents a directory. critical (_("Directories are not supported")); continue; case FileType.UNKNOWN: // File's type is unknown case FileType.SPECIAL: // File is a "special" file, such as a socket, fifo, block device, or character device. case FileType.MOUNTABLE: // File is a mountable location. critical (_("Don't know what to do")); continue; case FileType.REGULAR: // File handle represents a regular file. case FileType.SYMBOLIC_LINK: // File handle represents a symbolic link (Unix systems). case FileType.SHORTCUT: // File is a shortcut (Windows systems). var window = this.add_new_window (); window.main.library.check_open_sqlite_file (file.get_uri (), file.get_basename ()); break; default: error (_("Something completely unexpected happened")); } } } public override void window_removed (Gtk.Window window) { windows.remove (window as Window); base.window_removed (window); } private Sequeler.Window add_new_window () { var window = new Sequeler.Window (this); this.add_window (window); return window; } protected override void activate () { this.add_new_window (); } } sequeler-0.8.2/src/Layouts/000077500000000000000000000000001410464306200155755ustar00rootroot00000000000000sequeler-0.8.2/src/Layouts/DataBaseSchema.vala000066400000000000000000000422671410464306200212420ustar00rootroot00000000000000/* * Copyright (c) 2017-2020 Alecaddd (https://alecaddd.com) * * 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 2 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, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Alessandro "Alecaddd" Castellani */ public class Sequeler.Layouts.DataBaseSchema : Gtk.Grid { public weak Sequeler.Window window { get; construct; } public Gtk.ListStore schema_list; public Gtk.ComboBox schema_list_combo; public Gtk.TreeIter iter; private bool reloading { get; set; default = false;} public Gee.HashMap schemas; private ulong handler_id = 0; public Gtk.Stack stack; public Gtk.ScrolledWindow scroll; private Gda.DataModel? schema_table; public Granite.Widgets.SourceList.ExpandableItem tables_category; public Granite.Widgets.SourceList source_list; private Gtk.Grid toolbar; private Gtk.Spinner spinner; public Gtk.Revealer revealer; public Gtk.SearchEntry search; public string search_text; private Gtk.Grid main_grid; private Gtk.Revealer main_revealer; private Sequeler.Partials.DataBasePanel db_panel; enum Column { SCHEMAS } public DataBaseSchema (Sequeler.Window main_window) { Object ( orientation: Gtk.Orientation.VERTICAL, window: main_window, column_homogeneous: true ); } construct { var dropdown_area = new Gtk.Grid (); dropdown_area.column_homogeneous = false; dropdown_area.get_style_context ().add_class ("library-titlebar"); var cell = new Gtk.CellRendererText (); schema_list = new Gtk.ListStore (1, typeof (string)); schema_list_combo = new Gtk.ComboBox.with_model (schema_list); schema_list_combo.hexpand = true; schema_list_combo.pack_start (cell, false); schema_list_combo.set_attributes (cell, "text", Column.SCHEMAS); schema_list_combo.margin_top = schema_list_combo.margin_bottom = 9; schema_list_combo.margin_start = 9; reset_schema_combo.begin (); var search_btn = new Sequeler.Partials.HeaderBarButton ("system-search-symbolic", _("Search Tables")); search_btn.valign = Gtk.Align.CENTER; search_btn.clicked.connect (toggle_search_tables); dropdown_area.attach (schema_list_combo, 0, 0, 1, 1); dropdown_area.attach (search_btn, 1, 0, 1, 1); revealer = new Gtk.Revealer (); revealer.hexpand = true; revealer.reveal_child = false; search = new Gtk.SearchEntry (); search.placeholder_text = _("Search Tables\u2026"); search.hexpand = true; search.margin = 9; search.search_changed.connect (on_search_tables); search.key_press_event.connect (key => { if (key.keyval == 65307) { search.set_text (""); toggle_search_tables (); return true; } return false; }); revealer.add (search); scroll = new Gtk.ScrolledWindow (null, null); scroll.hscrollbar_policy = Gtk.PolicyType.AUTOMATIC; scroll.vscrollbar_policy = Gtk.PolicyType.AUTOMATIC; scroll.vexpand = true; toolbar = new Gtk.Grid (); toolbar.get_style_context ().add_class ("library-toolbar"); var reload_btn = new Sequeler.Partials.HeaderBarButton ("view-refresh-symbolic", _("Reload Tables")); reload_btn.clicked.connect (reload_schema); reload_btn.hexpand = true; reload_btn.halign = Gtk.Align.START; var add_table_btn = new Sequeler.Partials.HeaderBarButton ("list-add-symbolic", _("Add Table")); // add_table_btn.clicked.connect (add_table); add_table_btn.sensitive = false; spinner = new Gtk.Spinner (); spinner.hexpand = true; spinner.vexpand = true; spinner.halign = Gtk.Align.CENTER; spinner.valign = Gtk.Align.CENTER; toolbar.attach (add_table_btn, 0, 0, 1, 1); toolbar.attach (new Gtk.Separator (Gtk.Orientation.VERTICAL), 1, 0, 1, 1); toolbar.attach (reload_btn, 2, 0, 1, 1); stack = new Gtk.Stack (); stack.hexpand = true; stack.vexpand = true; stack.add_named (scroll, "list"); stack.add_named (spinner, "spinner"); main_grid = new Gtk.Grid (); main_grid.attach (dropdown_area, 0, 0, 1, 1); main_grid.attach (revealer, 0, 1, 1, 1); main_grid.attach (stack, 0, 2, 1, 2); main_grid.attach (toolbar, 0, 4, 1, 1); main_revealer = new Gtk.Revealer (); main_revealer.reveal_child = true; main_revealer.transition_type = Gtk.RevealerTransitionType.CROSSFADE; main_revealer.add (main_grid); db_panel = new Sequeler.Partials.DataBasePanel (window); var overlay = new Gtk.Overlay (); overlay.add_overlay (db_panel); overlay.add (main_revealer); add (overlay); } public void start_spinner () { spinner.start (); stack.visible_child_name = "spinner"; } public void stop_spinner () { spinner.stop (); stack.visible_child_name = "list"; } private async void reset_schema_combo () { if (handler_id > 0) { schema_list_combo.disconnect (handler_id); } schema_list.clear (); schema_list.append (out iter); schema_list.set (iter, Column.SCHEMAS, _("- Select Database -")); schema_list_combo.set_active (0); schema_list_combo.sensitive = false; handler_id = schema_list_combo.changed.connect (() => { if (schema_list_combo.get_active () == 0) { return; } start_spinner (); init_populate_schema.begin (null); }); } public async void init_populate_schema (Gda.DataModel? schema) { var database = window.data_manager.data["type"] == "SQLite" ? null : schemas[schema_list_combo.get_active ()]; yield populate_schema (database, schema); } public async void reload_schema () { if (reloading) { debug ("still loading"); return; } Gda.DataModel? schema = null; Gda.DataModelIter? _iter = null; reloading = true; schema = yield get_schema (); if (schema == null) { reloading = false; return; } yield reset_schema_combo (); if (window.data_manager.data["type"] == "SQLite") { yield init_populate_schema (schema); reloading = false; return; } _iter = schema.create_iter (); if (_iter == null) { debug ("not a valid iter"); return; } schemas = new Gee.HashMap (); int i = 1; while (_iter.move_next ()) { schema_list.append (out iter); schema_list.set (iter, Column.SCHEMAS, _iter.get_value_at (0).get_string ()); schemas.set (i, _iter.get_value_at (0).get_string ()); i++; } if (window.data_manager.data["type"] != "PostgreSQL") { schema_list_combo.sensitive = true; } if (window.data_manager.data["type"] == "PostgreSQL") { foreach (var entry in schemas.entries) { if ("public" == entry.value) { schema_list_combo.set_active (entry.key); } } reloading = false; return; } foreach (var entry in schemas.entries) { if (window.data_manager.data["name"] == entry.value) { schema_list_combo.set_active (entry.key); } } reloading = false; } public async Gda.DataModel? get_schema () { Gda.DataModel? result = null; var query = (window.main.connection_manager.db_type as DataBaseType).show_schema (); result = yield window.main.connection_manager.init_select_query (query); if (result == null) { reloading = false; yield reset_schema_combo (); } return result; } public async void populate_schema (string? database, Gda.DataModel? schema) { yield clear_views (); if (database != null && window.data_manager.data["name"] != database && window.data_manager.data["type"] != "PostgreSQL") { window.data_manager.data["name"] = database; yield update_connection (); return; } if (database == null && window.data_manager.data["type"] == "SQLite" && schema != null) { schema_table = schema; } else { yield get_schema_table (database); } if (schema_table == null) { stop_spinner (); return; } if (scroll.get_child () != null) { scroll.remove (scroll.get_child ()); } source_list = new Granite.Widgets.SourceList (); source_list.set_filter_func (source_list_visible_func, true); tables_category = new Granite.Widgets.SourceList.ExpandableItem (_("TABLES")); tables_category.expand_all (); Gda.DataModelIter _iter = schema_table.create_iter (); int top = 0; int count = 0; while (_iter.move_next ()) { var item = new Sequeler.Partials.DataBaseTable (_iter.get_value_at (0).get_string (), source_list); // Get the table rows coutn with an extra query for SQLite if (window.data_manager.data["type"] == "SQLite") { var table_count = yield get_table_count (item.name); Gda.DataModelIter count_iter = table_count.create_iter (); while (count_iter.move_next ()) { count = count_iter.get_value_at (0).get_int (); item.badge = count.to_string (); } } else { count = (int) _iter.get_value_at (1).get_long (); item.badge = count.to_string (); } var icon_name = count == 0 ? "table-empty" : "table"; item.icon = new GLib.ThemedIcon (icon_name); item.edited.connect ((new_name) => { if (new_name != item.name) { edit_table_name.begin (item.name, new_name); } }); tables_category.add (item); top++; } source_list.root.add (tables_category); scroll.add (source_list); source_list.item_selected.connect (item => { if (item == null) { return; } if (window.main.database_view.tabs.selected == 0) { window.main.database_view.structure.fill (item.name, database); } if (window.main.database_view.tabs.selected == 1) { window.main.database_view.content.fill (item.name, database, item.badge); } if (window.main.database_view.tabs.selected == 2) { window.main.database_view.relations.fill (item.name, database); } }); window.main.database_view.structure.database = database; window.main.database_view.content.database = database; window.main.database_view.relations.database = database; stop_spinner (); } public async void get_schema_table (string database) { var query = (window.main.connection_manager.db_type as DataBaseType).show_table_list (database); schema_table = yield window.main.connection_manager.init_select_query (query); } public async Gda.DataModel? get_table_count (string table) { var query = (window.main.connection_manager.db_type as DataBaseType).show_table_list (table); return yield window.main.connection_manager.init_select_query (query); } private async void update_connection () { if (window.data_manager.data["type"] == "PostgreSQL") { return; } schema_list_combo.sensitive = false; if (scroll.get_child () != null) { scroll.remove (scroll.get_child ()); } if (window.main.connection_manager.connection != null && window.main.connection_manager.connection.is_opened ()) { window.main.connection_manager.connection.clear_events_list (); window.main.connection_manager.connection.close (); } var result = new Gee.HashMap (); try { result = yield window.main.connection_manager.init_connection (); } catch (ThreadError e) { window.main.connection_manager.query_warning (e.message); } if (result["status"] == "true") { reload_schema.begin (); } else { window.main.connection_manager.query_warning (result["msg"]); } } private async void edit_table_name (string old_name, string new_name) { var query = (window.main.connection_manager.db_type as DataBaseType).edit_table_name (old_name, new_name); yield window.main.connection_manager.init_query (query); yield reload_schema (); } public void toggle_search_tables () { revealer.reveal_child = ! revealer.get_reveal_child (); if (revealer.get_reveal_child ()) { search.grab_focus_without_selecting (); } search.text = ""; } public void on_search_tables (Gtk.Entry searchentry) { search_text = searchentry.get_text ().down (); source_list.refilter (); tables_category.expand_all (); } private bool source_list_visible_func (Granite.Widgets.SourceList.Item item) { if (search_text == null || item is Granite.Widgets.SourceList.ExpandableItem) { return true; } return item.name.down ().contains (search_text); } private async void clear_views () { window.main.database_view.content.reset.begin (); window.main.database_view.relations.reset.begin (); window.main.database_view.structure.reset.begin (); } public void show_database_panel () { db_panel.new_database (); main_revealer.reveal_child = false; db_panel.reveal = true; } public void hide_database_panel () { main_revealer.reveal_child = true; db_panel.reveal = false; } public void edit_database_name () { db_panel.edit_database (schemas[schema_list_combo.get_active ()]); main_revealer.reveal_child = false; db_panel.reveal = true; } public async void create_database (string name) { var query = (window.main.connection_manager.db_type as DataBaseType).create_database (name); var result = yield window.main.connection_manager.init_query (query); if (result == null) { return; } yield reload_schema (); hide_database_panel (); } public async void edit_database (string name) { var current_db = schemas[schema_list_combo.get_active ()]; // Renaming a database is tricky as we can't simply update its name. // We need to first create a new database with the chosen name. var query = (window.main.connection_manager.db_type as DataBaseType).create_database (name); var result = yield window.main.connection_manager.init_query (query); if (result == null) { return; } // Then, we need to loop through all the tables and attach them to the new database. if (tables_category.n_children > 0) { foreach (Granite.Widgets.SourceList.Item child in tables_category.children) { var tb_result = yield window.main.connection_manager.init_query ( (window.main.connection_manager.db_type as DataBaseType).transfer_table ( current_db, child.name, name ) ); if (tb_result == null) { return; } } } // Delete the old database. yield window.main.connection_manager.init_query ( (window.main.connection_manager.db_type as DataBaseType).delete_database (current_db) ); // Update the DataManager to use the newly created database. window.data_manager.data["name"] = name; yield update_connection (); hide_database_panel (); } public async void delete_database () { yield window.main.connection_manager.init_query ( (window.main.connection_manager.db_type as DataBaseType).delete_database ( schemas[schema_list_combo.get_active ()] ) ); yield reload_schema (); schema_list_combo.active = 0; } } sequeler-0.8.2/src/Layouts/DataBaseView.vala000066400000000000000000000265521410464306200207530ustar00rootroot00000000000000/* * Copyright (c) 2011-2018 Alecaddd (http://alecaddd.com) * * 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 2 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, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Alessandro "Alecaddd" Castellani */ public class Sequeler.Layouts.DataBaseView : Gtk.Grid { public weak Sequeler.Window window { get; construct; } public Granite.Widgets.ModeButton tabs; public Gtk.Stack stack; public Sequeler.Layouts.Views.Structure structure; public Sequeler.Layouts.Views.Content content; public Sequeler.Layouts.Views.Relations relations; public Granite.Widgets.DynamicNotebook query; private Sequeler.Layouts.Views.Query tab_to_restore; public Gtk.MenuButton font_style; public DataBaseView (Sequeler.Window main_window) { Object ( orientation: Gtk.Orientation.VERTICAL, window: main_window, column_homogeneous: true ); } construct { var toolbar = new Gtk.Grid (); toolbar.get_style_context ().add_class ("library-titlebar"); tabs = new Granite.Widgets.ModeButton (); tabs.append (new Sequeler.Partials.ToolBarButton ("x-office-spreadsheet-template", "Structure", _("Structure"))); tabs.append (new Sequeler.Partials.ToolBarButton ("x-office-document", "Content", _("Content"))); tabs.append (new Sequeler.Partials.ToolBarButton ("preferences-system-windows", "Relations", _("Relations"))); tabs.append (new Sequeler.Partials.ToolBarButton ("accessories-text-editor", "Query", _("Query"))); tabs.set_active (0); tabs.margin = 9; tabs.mode_changed.connect ((tab) => { stack.set_visible_child_name (tab.name); if (tab.name == "Query") { font_style.visible = true; font_style.no_show_all = false; } else { font_style.visible = false; font_style.no_show_all = true; } if (window.main.database_schema.source_list == null) { return; } var item_selected = window.main.database_schema.source_list.selected; if (item_selected == null) { return; } if (tab.name == "Structure") { window.main.database_view.structure.fill (item_selected.name, window.main.database_view.structure.database); } if (tab.name == "Content") { window.main.database_view.content.fill (item_selected.name, window.main.database_view.content.database, item_selected.badge); } if (tab.name == "Relations") { window.main.database_view.relations.fill (item_selected.name, window.main.database_view.relations.database); } }); toolbar.attach (tabs, 0, 0, 1, 1); var view_options = new Gtk.Grid (); view_options.hexpand = true; view_options.halign = Gtk.Align.END; view_options.valign = Gtk.Align.CENTER; // Query View buttons var zoom_out_button = new Gtk.Button.from_icon_name ("zoom-out-symbolic", Gtk.IconSize.MENU); zoom_out_button.action_name = Sequeler.Services.ActionManager.ACTION_PREFIX + Sequeler.Services.ActionManager.ACTION_ZOOM_OUT; zoom_out_button.tooltip_markup = Granite.markup_accel_tooltip ({"minus"}, _("Zoom Out")); var zoom_default_button = new Gtk.Button.with_label ( "%.0f%%".printf (window.action_manager.get_current_font_size () * 10) ); zoom_default_button.action_name = Sequeler.Services.ActionManager.ACTION_PREFIX + Sequeler.Services.ActionManager.ACTION_ZOOM_DEFAULT; zoom_default_button.tooltip_markup = Granite.markup_accel_tooltip ({"0"}, _("Zoom 1:1")); var zoom_in_button = new Gtk.Button.from_icon_name ("zoom-in-symbolic", Gtk.IconSize.MENU); zoom_in_button.action_name = Sequeler.Services.ActionManager.ACTION_PREFIX + Sequeler.Services.ActionManager.ACTION_ZOOM_IN; zoom_in_button.tooltip_markup = Granite.markup_accel_tooltip ({"plus"}, _("Zoom In")); var font_size_grid = new Gtk.Grid (); font_size_grid.column_homogeneous = true; font_size_grid.hexpand = true; font_size_grid.margin = 12; font_size_grid.get_style_context ().add_class (Gtk.STYLE_CLASS_LINKED); font_size_grid.add (zoom_out_button); font_size_grid.add (zoom_default_button); font_size_grid.add (zoom_in_button); var color_button_white = new Gtk.RadioButton (null); color_button_white.halign = Gtk.Align.CENTER; color_button_white.tooltip_text = _("High Contrast"); var color_button_white_context = color_button_white.get_style_context (); color_button_white_context.add_class ("color-button"); color_button_white_context.add_class ("color-white"); var color_button_light = new Gtk.RadioButton.from_widget (color_button_white); color_button_light.halign = Gtk.Align.CENTER; color_button_light.tooltip_text = _("Solarized Light"); var color_button_light_context = color_button_light.get_style_context (); color_button_light_context.add_class ("color-button"); color_button_light_context.add_class ("color-light"); var color_button_dark = new Gtk.RadioButton.from_widget (color_button_white); color_button_dark.halign = Gtk.Align.CENTER; color_button_dark.tooltip_text = _("Solarized Dark"); var color_button_dark_context = color_button_dark.get_style_context (); color_button_dark_context.add_class ("color-button"); color_button_dark_context.add_class ("color-dark"); var menu_grid = new Gtk.Grid (); menu_grid.margin_bottom = 12; menu_grid.orientation = Gtk.Orientation.VERTICAL; menu_grid.width_request = 200; menu_grid.attach (font_size_grid, 0, 0, 3, 1); menu_grid.attach (color_button_white, 0, 1, 1, 1); menu_grid.attach (color_button_light, 1, 1, 1, 1); menu_grid.attach (color_button_dark, 2, 1, 1, 1); menu_grid.show_all (); var menu = new Gtk.Popover (null); menu.add (menu_grid); font_style = new Gtk.MenuButton (); font_style.margin_end = 9; font_style.get_style_context ().add_class (Gtk.STYLE_CLASS_FLAT); font_style.set_image (new Gtk.Image.from_icon_name ("font-select-symbolic", Gtk.IconSize.LARGE_TOOLBAR)); font_style.tooltip_text = _("Change Text Style"); font_style.popover = menu; font_style.can_focus = false; font_style.visible = false; font_style.no_show_all = true; view_options.add (font_style); toolbar.attach (view_options, 1, 0, 1, 1); stack = new Gtk.Stack (); structure = new Sequeler.Layouts.Views.Structure (window); content = new Sequeler.Layouts.Views.Content (window); relations = new Sequeler.Layouts.Views.Relations (window); query = get_query_notebook (); stack.add_named (structure, "Structure"); stack.add_named (content, "Content"); stack.add_named (relations, "Relations"); stack.add_named (query, "Query"); stack.expand = true; attach (toolbar, 0, 0, 1, 1); attach (stack, 0, 1, 1, 1); settings.changed.connect (() => { zoom_default_button.label = "%.0f%%".printf (window.action_manager.get_current_font_size () * 10); }); switch (Sequeler.settings.style_scheme) { case "high-contrast": color_button_white.active = true; break; case "solarized-light": color_button_light.active = true; break; case "solarized-dark": color_button_dark.active = true; break; } color_button_dark.clicked.connect (() => { Sequeler.settings.style_scheme = "solarized-dark"; (query.current.page as Layouts.Views.Query).update_color_style (); }); color_button_light.clicked.connect (() => { Sequeler.settings.style_scheme = "solarized-light"; (query.current.page as Layouts.Views.Query).update_color_style (); }); color_button_white.clicked.connect (() => { Sequeler.settings.style_scheme = "classic"; (query.current.page as Layouts.Views.Query).update_color_style (); }); } private Granite.Widgets.DynamicNotebook get_query_notebook () { var notebook = new Granite.Widgets.DynamicNotebook (); notebook.add_button_tooltip = _("Create a new Query Tab"); notebook.expand = true; notebook.allow_restoring = true; notebook.max_restorable_tabs = 1; var first_page = new Sequeler.Layouts.Views.Query (window); var first_tab = new Granite.Widgets.Tab ( _("Query"), null, first_page ); first_page.update_tab_indicator.connect ((status) => { var icon = status ? new ThemedIcon ("process-completed") : new ThemedIcon ("process-stop"); first_tab.icon = icon; }); notebook.insert_tab (first_tab, 0); notebook.new_tab_requested.connect (() => { var new_page = new Sequeler.Layouts.Views.Query (window); var new_tab = new Granite.Widgets.Tab ( _("Query %i").printf (notebook.n_tabs), null, new_page ); new_page.update_tab_indicator.connect ((status) => { var icon = status ? new ThemedIcon ("process-completed") : new ThemedIcon ("process-stop"); new_tab.icon = icon; }); notebook.insert_tab (new_tab, notebook.n_tabs - 1); }); notebook.close_tab_requested.connect ((tab) => { if (notebook.n_tabs == 1) { var new_page = new Sequeler.Layouts.Views.Query (window); var new_tab = new Granite.Widgets.Tab ( _("Query"), null, new_page ); notebook.insert_tab (new_tab, notebook.n_tabs - 1); } tab_to_restore = tab.page as Sequeler.Layouts.Views.Query; tab.restore_data = tab.label; return true; }); notebook.tab_restored.connect ((label, data, icon) => { var tab = new Granite.Widgets.Tab (label, icon, tab_to_restore); tab_to_restore.update_tab_indicator.connect ((status) => { var update_icon = status ? new ThemedIcon ("process-completed") : new ThemedIcon ("process-stop"); tab.icon = update_icon; }); notebook.insert_tab (tab, notebook.n_tabs - 1); }); return notebook; } } sequeler-0.8.2/src/Layouts/HeaderBar.vala000066400000000000000000000163131410464306200202630ustar00rootroot00000000000000/* * Copyright (c) 2017-2020 Alecaddd (https://alecaddd.com) * * 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 2 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, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Alessandro "Alecaddd" Castellani */ public class Sequeler.Layouts.HeaderBar : Gtk.HeaderBar { public weak Sequeler.Window window { get; construct; } private Gtk.Button logout_button; private Gtk.Button new_db_button; private Gtk.Button delete_db_button; private Gtk.Button edit_db_button; private Granite.ModeSwitch mode_switch; private Gtk.Popover menu_popover; public bool logged_out { get; set; } public HeaderBar (Sequeler.Window main_window) { Object ( window: main_window, logged_out: true ); set_title (APP_NAME); set_show_close_button (true); build_ui (); toggle_logout.begin (); } private void build_ui () { logout_button = header_button ("application-logout"); logout_button.action_name = Sequeler.Services.ActionManager.ACTION_PREFIX + Sequeler.Services.ActionManager.ACTION_LOGOUT; logout_button.tooltip_markup = Granite.markup_accel_tooltip ({"Escape"}, _("Logout")); new_db_button = header_button ("office-database-new"); new_db_button.tooltip_markup = Granite.markup_accel_tooltip ( {"N"}, _("Create a new database") ); new_db_button.action_name = Sequeler.Services.ActionManager.ACTION_PREFIX + Sequeler.Services.ActionManager.ACTION_NEW_DB; delete_db_button = header_button ("office-database-remove"); delete_db_button.tooltip_markup = Granite.markup_accel_tooltip ( {"D"}, _("Delete database") ); delete_db_button.action_name = Sequeler.Services.ActionManager.ACTION_PREFIX + Sequeler.Services.ActionManager.ACTION_DELETE_DB; edit_db_button = header_button ("office-database-edit"); edit_db_button.tooltip_markup = Granite.markup_accel_tooltip ( {"P"}, _("Database properties") ); edit_db_button.action_name = Sequeler.Services.ActionManager.ACTION_PREFIX + Sequeler.Services.ActionManager.ACTION_EDIT_DB; new_db_button.visible = false; new_db_button.no_show_all = true; edit_db_button.visible = false; edit_db_button.no_show_all = true; delete_db_button.visible = false; delete_db_button.no_show_all = true; mode_switch = new Granite.ModeSwitch.from_icon_name ("display-brightness-symbolic", "weather-clear-night-symbolic"); mode_switch.primary_icon_tooltip_text = _("Light background"); mode_switch.secondary_icon_tooltip_text = _("Dark background"); mode_switch.valign = Gtk.Align.CENTER; mode_switch.bind_property ("active", settings, "dark-theme"); mode_switch.notify.connect (() => { Gtk.Settings.get_default ().gtk_application_prefer_dark_theme = settings.dark_theme; }); if (settings.dark_theme) { mode_switch.active = true; } var new_window_item = new_menuitem (_("New Window"), "n"); new_window_item.action_name = Sequeler.Services.ActionManager.ACTION_PREFIX + Sequeler.Services.ActionManager.ACTION_NEW_WINDOW; var new_connection_item = new_menuitem (_("New Connection"), "n"); new_connection_item.action_name = Sequeler.Services.ActionManager.ACTION_PREFIX + Sequeler.Services.ActionManager.ACTION_NEW_CONNECTION; var quit_item = new_menuitem (_("Quit"), "q"); quit_item.action_name = Sequeler.Services.ActionManager.ACTION_PREFIX + Sequeler.Services.ActionManager.ACTION_QUIT; var menu_separator = new Gtk.Separator (Gtk.Orientation.HORIZONTAL); menu_separator.margin_top = 6; menu_separator.margin_bottom = 6; var menu_grid = new Gtk.Grid (); menu_grid.expand = true; menu_grid.margin_top = menu_grid.margin_bottom = 6; menu_grid.orientation = Gtk.Orientation.VERTICAL; menu_grid.attach (new_window_item, 0, 1, 1, 1); menu_grid.attach (new_connection_item, 0, 2, 1, 1); menu_grid.attach (menu_separator, 0, 3, 1, 1); menu_grid.attach (quit_item, 0, 4, 1, 1); menu_grid.show_all (); var open_menu = new Gtk.MenuButton (); open_menu.set_image (new Gtk.Image.from_icon_name ("open-menu", Gtk.IconSize.LARGE_TOOLBAR)); open_menu.tooltip_text = _("Menu"); menu_popover = new Gtk.Popover (open_menu); menu_popover.add (menu_grid); open_menu.popover = menu_popover; open_menu.valign = Gtk.Align.CENTER; pack_start (logout_button); pack_start (headerbar_separator ()); pack_start (new_db_button); pack_start (edit_db_button); pack_start (headerbar_separator ()); pack_start (delete_db_button); pack_end (open_menu); pack_end (headerbar_separator ()); pack_end (mode_switch); } private Gtk.ModelButton new_menuitem (string label, string accels) { var button = new Gtk.ModelButton (); button.get_child ().destroy (); button.add (new Granite.AccelLabel (label, accels)); return button; } private Gtk.Button header_button (string image) { var button = new Gtk.Button.from_icon_name (image, Gtk.IconSize.LARGE_TOOLBAR); button.get_style_context ().add_class (Gtk.STYLE_CLASS_FLAT); button.valign = Gtk.Align.CENTER; button.can_focus = false; return button; } private Gtk.Separator headerbar_separator () { var separator = new Gtk.Separator (Gtk.Orientation.VERTICAL); separator.get_style_context ().add_class ("headerbar-separator"); return separator; } public async void toggle_logout () { logged_out = !logged_out; logout_button.visible = logged_out; logout_button.no_show_all = !logged_out; if ( window.data_manager != null && ( window.data_manager.data["type"] == "MySQL" || window.data_manager.data["type"] == "MariaDB" ) ) { new_db_button.visible = logged_out; new_db_button.no_show_all = !logged_out; edit_db_button.visible = logged_out; edit_db_button.no_show_all = !logged_out; delete_db_button.visible = logged_out; delete_db_button.no_show_all = !logged_out; } } } sequeler-0.8.2/src/Layouts/Library.vala000066400000000000000000000447221410464306200200570ustar00rootroot00000000000000/* * Copyright (c) 2017-2020 Alecaddd (https://alecaddd.com) * * 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 2 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, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Alessandro "Alecaddd" Castellani */ public class Sequeler.Layouts.Library : Gtk.Grid { public weak Sequeler.Window window { get; construct; } GLib.File? file; Gtk.TextBuffer buffer; private Gtk.Grid title; private Gtk.Revealer motion_revealer; public Gtk.ListBox item_box; public Gtk.ScrolledWindow scroll; public Sequeler.Partials.HeaderBarButton delete_all; public Gee.HashMap real_data; public Gtk.Spinner real_spinner; public Gtk.ModelButton real_button; public Sequeler.Services.ConnectionManager connection_manager; public signal void edit_dialog (Gee.HashMap data); // Datatype restrictions on DnD (Gtk.TargetFlags). public const Gtk.TargetEntry[] TARGET_ENTRIES_LABEL = { { "LIBRARYITEM", Gtk.TargetFlags.SAME_APP, 0 } }; public Library (Sequeler.Window main_window) { Object ( orientation: Gtk.Orientation.VERTICAL, window: main_window, width_request: 260, column_homogeneous: true ); } construct { var motion_grid = new Gtk.Grid (); motion_grid.margin = 6; motion_grid.get_style_context ().add_class ("grid-motion"); motion_grid.height_request = 18; motion_revealer = new Gtk.Revealer (); motion_revealer.transition_type = Gtk.RevealerTransitionType.SLIDE_DOWN; motion_revealer.add (motion_grid); var titlebar = new Sequeler.Partials.TitleBar (_("SAVED CONNECTIONS")); title = new Gtk.Grid (); title.attach (titlebar, 0, 0); title.attach (motion_revealer, 0, 1); var toolbar = new Gtk.Grid (); toolbar.get_style_context ().add_class ("library-toolbar"); delete_all = new Sequeler.Partials.HeaderBarButton ("user-trash-symbolic", _("Delete All")); delete_all.halign = Gtk.Align.END; delete_all.hexpand = true; delete_all.clicked.connect (() => { confirm_delete_all (); }); var reload_btn = new Sequeler.Partials.HeaderBarButton ("view-refresh-symbolic", _("Reload Library")); reload_btn.clicked.connect (() => reload_library.begin ()); var export_btn = new Sequeler.Partials.HeaderBarButton ("document-save-symbolic", _("Export Library")); export_btn.clicked.connect (export_library); toolbar.attach (reload_btn, 0, 0, 1, 1); toolbar.attach (new Gtk.Separator (Gtk.Orientation.VERTICAL), 1, 0, 1, 1); toolbar.attach (export_btn, 2, 0, 1, 1); toolbar.attach (new Gtk.Separator (Gtk.Orientation.VERTICAL), 3, 0, 1, 1); toolbar.attach (delete_all, 4, 0, 1, 1); scroll = new Gtk.ScrolledWindow (null, null); scroll.hscrollbar_policy = Gtk.PolicyType.AUTOMATIC; scroll.vscrollbar_policy = Gtk.PolicyType.AUTOMATIC; item_box = new Gtk.ListBox (); item_box.get_style_context ().add_class ("library-box"); item_box.set_activate_on_single_click (false); item_box.selection_mode = Gtk.SelectionMode.SINGLE; item_box.valign = Gtk.Align.FILL; item_box.expand = true; scroll.add (item_box); foreach (var conn in settings.saved_connections) { add_item (settings.arraify_data (conn)); } if (settings.saved_connections.length > 0) { delete_all.sensitive = true; } item_box.row_activated.connect ((row) => { var item = row as Sequeler.Partials.LibraryItem; item.spinner.start (); item.connect_button.sensitive = false; window.data_manager.data = item.data; init_connection_begin (item.data, item.spinner, item.connect_button, false); }); attach (title, 0, 0, 1, 1); scroll.expand = true; attach (scroll, 0, 1, 1, 2); attach (toolbar, 0, 3, 1, 1); build_drag_and_drop (); } private void build_drag_and_drop () { Gtk.drag_dest_set (item_box, Gtk.DestDefaults.ALL, TARGET_ENTRIES_LABEL, Gdk.DragAction.MOVE); item_box.drag_data_received.connect (on_drag_data_received); Gtk.drag_dest_set (title, Gtk.DestDefaults.ALL, TARGET_ENTRIES_LABEL, Gdk.DragAction.MOVE); title.drag_data_received.connect (on_drag_item_received); title.drag_motion.connect (on_drag_motion); title.drag_leave.connect (on_drag_leave); } private void on_drag_data_received (Gdk.DragContext context, int x, int y, Gtk.SelectionData selection_data, uint target_type, uint time) { int new_pos; var target = (Partials.LibraryItem) item_box.get_row_at_y (y); var row = ((Gtk.Widget[]) selection_data.get_data ())[0]; var source = (Partials.LibraryItem) row; int last_index = (int) item_box.get_children ().length (); if (target == null) { new_pos = last_index - 1; } else { new_pos = source.get_index () < target.get_index () ? target.get_index () : target.get_index () + 1; } settings.reorder_connection (source.data, new_pos); reload_library.begin (); } private void on_drag_item_received (Gdk.DragContext context, int x, int y, Gtk.SelectionData selection_data, uint target_type, uint time) { var row = ((Gtk.Widget[]) selection_data.get_data ())[0]; var source = (Partials.LibraryItem) row; settings.reorder_connection (source.data, 0); reload_library.begin (); } public bool on_drag_motion (Gdk.DragContext context, int x, int y, uint time) { motion_revealer.reveal_child = true; return true; } public void on_drag_leave (Gdk.DragContext context, uint time) { motion_revealer.reveal_child = false; } public void add_item (Gee.HashMap data) { var item = new Sequeler.Partials.LibraryItem (data); item.scrolled = scroll; item_box.add (item); item.confirm_delete.connect ((item, data) => { confirm_delete (item, data); }); item.edit_dialog.connect ((data) => { window.data_manager.data = data; if (window.connection_dialog == null) { window.connection_dialog = new Sequeler.Widgets.ConnectionDialog (window); window.connection_dialog.show_all (); window.connection_dialog.destroy.connect (() => { window.connection_dialog = null; }); } window.connection_dialog.present (); }); item.duplicate_connection.connect ((data) => { duplicate_connection.begin (data); }); item.connect_to.connect ((data, spinner, connect_button) => { window.data_manager.data = data; init_connection_begin (data, spinner, connect_button); }); } public void confirm_delete (Gtk.ListBoxRow item, Gee.HashMap data) { var message_dialog = new Granite.MessageDialog.with_image_from_icon_name (_("Are you sure you want to proceed?"), _("By deleting this connection you won’t be able to recover this data."), "dialog-warning", Gtk.ButtonsType.CANCEL); message_dialog.transient_for = window; var suggested_button = new Gtk.Button.with_label (_("Yes, Delete!")); suggested_button.get_style_context ().add_class (Gtk.STYLE_CLASS_DESTRUCTIVE_ACTION); message_dialog.add_action_widget (suggested_button, Gtk.ResponseType.ACCEPT); message_dialog.show_all (); if (message_dialog.run () == Gtk.ResponseType.ACCEPT) { settings.delete_connection (data); item_box.remove (item); reload_library.begin (); } message_dialog.destroy (); } public void confirm_delete_all () { var message_dialog = new Granite.MessageDialog.with_image_from_icon_name (_("Are you sure you want to proceed?"), _("All the data will be deleted and you won’t be able to recover it."), "dialog-warning", Gtk.ButtonsType.CANCEL); message_dialog.transient_for = window; var suggested_button = new Gtk.Button.with_label (_("Yes, Delete All!")); suggested_button.get_style_context ().add_class (Gtk.STYLE_CLASS_DESTRUCTIVE_ACTION); message_dialog.add_action_widget (suggested_button, Gtk.ResponseType.ACCEPT); message_dialog.show_all (); if (message_dialog.run () == Gtk.ResponseType.ACCEPT) { settings.clear_connections (); item_box.forall ((item) => item_box.remove (item)); reload_library.begin (); } message_dialog.destroy (); } public async void reload_library () { item_box.@foreach ((item) => item_box.remove (item)); foreach (var new_conn in settings.saved_connections) { var array = settings.arraify_data (new_conn); add_item (array); } item_box.show_all (); delete_all.sensitive = (settings.saved_connections.length > 0); } public async void check_add_item (Gee.HashMap data) { bool result = false; SourceFunc callback = check_add_item.callback; new Thread ("check-add-item", () => { result = update_existing_connection (data); Idle.add ((owned) callback); Thread.exit (null); return null; }); yield; if (!result) { settings.add_connection (data); } yield reload_library (); } private bool update_existing_connection (Gee.HashMap data) { foreach (var conn in settings.saved_connections) { var check = settings.arraify_data (conn); if (check["id"] == data["id"]) { settings.edit_connection (data, conn); return true; } } return false; } public void check_open_sqlite_file (string path, string name) { foreach (var conn in settings.saved_connections) { var check = settings.arraify_data (conn); if (check["file_path"] == path) { settings.edit_connection (check, conn); reload_library.begin ((obj, res) => { item_box.get_row_at_index (0).activate (); }); return; } } var data = new Gee.HashMap (); data.set ("id", settings.tot_connections.to_string ()); data.set ("title", name); data.set ("color", "rgb(222,222,222)"); data.set ("type", "SQLite"); data.set ("host", ""); data.set ("name", ""); data.set ("file_path", path); data.set ("username", ""); data.set ("password", ""); data.set ("port", ""); settings.add_connection (data); reload_library.begin ((obj, res) => { item_box.get_row_at_index (0).activate (); }); } private void init_connection_begin (Gee.HashMap data, Gtk.Spinner spinner, Gtk.ModelButton button, bool update = true) { connection_manager = new Sequeler.Services.ConnectionManager (window, data); if (data["type"] != "SQLite" && data["username"] == "") { spinner.stop (); button.sensitive = true; connection_warning (_("A username is required in order to connect!"), data["name"]); return; } if (data["has_ssh"] == "true") { real_data = data; real_spinner = spinner; real_button = button; connection_manager.ssh_tunnel_ready.connect (() => init_real_connection_begin (real_data, real_spinner, real_button, update) ); new Thread (null, () => { var result = new Gee.HashMap (); try { connection_manager.ssh_tunnel_init (true); } catch (Error e) { result["status"] = "false"; result["message"] = e.message; } Idle.add (() => { if (result["status"] == "false") { spinner.stop (); button.sensitive = true; connection_warning (result["message"], data["name"]); } return false; }); return null; }); } else { init_real_connection_begin (data, spinner, button, update); } } private void init_real_connection_begin (Gee.HashMap data, Gtk.Spinner spinner, Gtk.ModelButton button, bool update) { var result = new Gee.HashMap (); connection_manager.init_connection.begin ((obj, res) => { new Thread (null, () => { try { result = connection_manager.init_connection.end (res); } catch (ThreadError e) { connection_warning (e.message, data["name"]); spinner.stop (); button.sensitive = true; } Idle.add (() => { spinner.stop (); button.sensitive = true; if (result["status"] == "true") { if (settings.save_quick && update) { check_add_item.begin (data); } window.main.connection_opened.begin (connection_manager); } else { connection_warning (result["msg"], data["name"]); } return false; }); return null; }); }); } private void export_library () { file = null; buffer = new Gtk.TextBuffer (null); var save_dialog = new Gtk.FileChooserNative (_("Pick a file"), window, Gtk.FileChooserAction.SAVE, _("_Save"), _("_Cancel")); save_dialog.do_overwrite_confirmation = true; save_dialog.modal = true; save_dialog.response.connect ((dialog, response_id) => { switch (response_id) { case Gtk.ResponseType.ACCEPT: file = save_dialog.get_file (); save_to_file.begin (); break; default: break; } dialog.destroy (); }); save_dialog.run (); } private async void save_to_file () { var buffer_content = ""; var library = settings.saved_connections; foreach (var lib in library) { var array = settings.arraify_data (lib); try { array["password"] = yield password_mngr.get_password_async (array["id"]); } catch (Error e) { debug ("Unable to get the password from libsecret"); } if (array["has_ssh"] == "true") { try { array["ssh_password"] = yield password_mngr.get_password_async (array["id"] + "9999"); } catch { debug ("Unable to get the SSH password from libsecret"); } } buffer_content += settings.stringify_data (array) + "---\n"; } buffer.set_text (buffer_content); Gtk.TextIter start; Gtk.TextIter end; buffer.get_bounds (out start, out end); string current_contents = buffer.get_text (start, end, false); try { file.replace_contents (current_contents.data, null, false, GLib.FileCreateFlags.NONE, null, null); } catch (GLib.Error err) { export_warning (err.message); } } private void connection_warning (string message, string title) { var message_dialog = new Granite.MessageDialog.with_image_from_icon_name (_("Unable to Connect to %s").printf (title), message, "dialog-error", Gtk.ButtonsType.NONE); message_dialog.transient_for = window; var suggested_button = new Gtk.Button.with_label ("Close"); message_dialog.add_action_widget (suggested_button, Gtk.ResponseType.ACCEPT); message_dialog.show_all (); if (message_dialog.run () == Gtk.ResponseType.ACCEPT) {} message_dialog.destroy (); } private void export_warning (string message) { var message_dialog = new Granite.MessageDialog.with_image_from_icon_name (_("Unable to Export Library "), message, "dialog-error", Gtk.ButtonsType.NONE); message_dialog.transient_for = window; var suggested_button = new Gtk.Button.with_label ("Close"); message_dialog.add_action_widget (suggested_button, Gtk.ResponseType.ACCEPT); message_dialog.show_all (); if (message_dialog.run () == Gtk.ResponseType.ACCEPT) {} message_dialog.destroy (); } private async void duplicate_connection (Gee.HashMap data) { if (data["type"] != "SQLite") { try { data["password"] = yield password_mngr.get_password_async (data["id"]); } catch (Error e) { debug ("Unable to get the password from libsecret"); } } if (data["has_ssh"] == "true") { try { data["ssh_password"] = yield password_mngr.get_password_async (data["id"] + "9999"); } catch { debug ("Unable to get the SSH password from libsecret"); } } yield settings.duplicate_connection (data); yield reload_library (); } } sequeler-0.8.2/src/Layouts/Main.vala000066400000000000000000000074301410464306200173320ustar00rootroot00000000000000/* * Copyright (c) 2011-2018 Alecaddd (http://alecaddd.com) * * 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 2 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, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Alessandro "Alecaddd" Castellani */ public class Sequeler.Layouts.Main : Gtk.Paned { public weak Sequeler.Window window { get; construct; } public Sequeler.Services.ConnectionManager? connection_manager { get; set; default = null; } public Sequeler.Layouts.Library library; public Sequeler.Layouts.DataBaseSchema database_schema; public Sequeler.Layouts.Welcome welcome; public Sequeler.Layouts.DataBaseView database_view; public Gtk.Stack sidebar_stack; public Gtk.Stack main_stack; public Main (Sequeler.Window main_window) { Object ( orientation: Gtk.Orientation.HORIZONTAL, window: main_window ); } construct { position = settings.sidebar_width; sidebar_stack = new Gtk.Stack (); library = new Sequeler.Layouts.Library (window); database_schema = new Sequeler.Layouts.DataBaseSchema (window); sidebar_stack.add_named (library, "library"); sidebar_stack.add_named (database_schema, "database_schema"); main_stack = new Gtk.Stack (); welcome = new Sequeler.Layouts.Welcome (window); database_view = new Sequeler.Layouts.DataBaseView (window); main_stack.add_named (welcome, "welcome"); main_stack.add_named (database_view, "database_view"); build_sidebar (); build_main (); } public void build_sidebar () { pack1 (sidebar_stack, false, false); } public void build_main () { pack2 (main_stack, true, false); } public async void connection_opened (Sequeler.Services.ConnectionManager? cnn_manager) { debug ("connection opened"); connection_manager = cnn_manager; var host = cnn_manager.data["host"] != "" ? cnn_manager.data["host"] : "127.0.0.1"; window.headerbar.toggle_logout.begin (); sidebar_stack.set_visible_child_full ("database_schema", Gtk.StackTransitionType.CROSSFADE); main_stack.set_visible_child_full ("database_view", Gtk.StackTransitionType.SLIDE_LEFT); window.headerbar.title = _("Connected to %s").printf (cnn_manager.data["title"]); window.headerbar.subtitle = cnn_manager.data["username"] + "@" + host; database_schema.reload_schema.begin (); } public void connection_closed () { if (connection_manager.data["has_ssh"] == "true") { debug ("connection manager %p", connection_manager); connection_manager.ssh_tunnel_close (Log.FILE + ":" + Log.LINE.to_string ()); } if (connection_manager.connection != null && connection_manager.connection.is_opened ()) { connection_manager.connection.clear_events_list (); connection_manager.connection.close (); connection_manager.connection = null; } connection_manager = null; sidebar_stack.set_visible_child_full ("library", Gtk.StackTransitionType.CROSSFADE); main_stack.set_visible_child_full ("welcome", Gtk.StackTransitionType.UNDER_RIGHT); } } sequeler-0.8.2/src/Layouts/Views/000077500000000000000000000000001410464306200166725ustar00rootroot00000000000000sequeler-0.8.2/src/Layouts/Views/Content.vala000066400000000000000000000234631410464306200211610ustar00rootroot00000000000000/* * Copyright (c) 2017-2020 Alecaddd (https://alecaddd.com) * * 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 2 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, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Alessandro "Alecaddd" Castellani */ public class Sequeler.Layouts.Views.Content : Gtk.Grid { public weak Sequeler.Window window { get; construct; } public Gtk.Stack stack; private Gda.DataModel? table_content; public Gtk.Grid scroll_grid; public Gtk.ScrolledWindow scroll; public Gtk.Label result_message; private Gtk.Spinner spinner; private Gtk.Button pages_button; private Gtk.SpinButton pages_entry; private Sequeler.Partials.HeaderBarButton page_prev_btn; private Sequeler.Partials.HeaderBarButton page_next_btn; private int tot_pages { get; set; default = 0; } private int current_page { get; set; default = 1; } private bool reloading { get; set; default = false; } private string _table_name = ""; public string table_name { get { return _table_name; } set { _table_name = value; } } private string _database = ""; public string database { get { return _database; } set { _database = value; } } public int table_count = 0; private string? sortby = null; private string sort = "ASC"; public Content (Sequeler.Window main_window) { Object ( orientation: Gtk.Orientation.VERTICAL, window: main_window ); } construct { scroll_grid = new Gtk.Grid (); scroll_grid.expand = true; scroll = new Gtk.ScrolledWindow (null, null); scroll.hscrollbar_policy = Gtk.PolicyType.AUTOMATIC; scroll.vscrollbar_policy = Gtk.PolicyType.AUTOMATIC; scroll.expand = true; scroll_grid.add (scroll); var info_bar = new Gtk.Grid (); info_bar.get_style_context ().add_class ("library-toolbar"); info_bar.attach (build_pagination (), 0, 0, 1, 1); info_bar.attach (new Gtk.Separator (Gtk.Orientation.VERTICAL), 1, 0, 1, 1); info_bar.attach (build_results_msg (), 2, 0, 1, 1); info_bar.attach (build_reload_btn (), 3, 0, 1, 1); spinner = new Gtk.Spinner (); spinner.hexpand = true; spinner.vexpand = true; spinner.halign = Gtk.Align.CENTER; spinner.valign = Gtk.Align.CENTER; var welcome = new Granite.Widgets.Welcome (_("Select Table"), _("Select a table from the left sidebar to activate this view.")); stack = new Gtk.Stack (); stack.hexpand = true; stack.vexpand = true; stack.add_named (welcome, "welcome"); stack.add_named (spinner, "spinner"); stack.add_named (scroll_grid, "list"); attach (stack, 0, 0, 1, 1); attach (info_bar, 0, 1, 1, 1); placeholder (); } public void placeholder () { stack.visible_child_name = "welcome"; } public void start_spinner () { spinner.start (); stack.visible_child_name = "spinner"; } public void stop_spinner () { spinner.stop (); stack.visible_child_name = "list"; } public Gtk.Grid build_pagination () { var page_grid = new Gtk.Grid (); page_grid.valign = Gtk.Align.CENTER; page_prev_btn = new Sequeler.Partials.HeaderBarButton ("go-previous-symbolic", _("Previous Page")); page_prev_btn.clicked.connect (go_prev_page); page_prev_btn.halign = Gtk.Align.START; page_prev_btn.sensitive = false; page_next_btn = new Sequeler.Partials.HeaderBarButton ("go-next-symbolic", _("Next Page")); page_next_btn.clicked.connect (go_next_page); page_next_btn.halign = Gtk.Align.END; page_next_btn.sensitive = false; pages_button = new Gtk.Button.with_label (_("%d Pages").printf (tot_pages)); pages_button.can_focus = false; pages_button.get_style_context ().add_class (Gtk.STYLE_CLASS_FLAT); pages_button.set_tooltip_text (_("Jump to page…")); pages_entry = new Gtk.SpinButton.with_range (0, 0, 1); pages_entry.margin = 3; pages_entry.value_changed.connect (() => { if (pages_entry.get_value_as_int () > tot_pages) { return; } current_page = pages_entry.get_value_as_int (); reload_results (); }); var pages_popover = new Gtk.Popover (pages_button); pages_popover.add (pages_entry); pages_button.clicked.connect (() => { pages_popover.popup (); pages_popover.show_all (); }); page_grid.attach (page_prev_btn, 0, 0, 1, 1); page_grid.attach (new Gtk.Separator (Gtk.Orientation.VERTICAL), 1, 0, 1, 1); page_grid.attach (pages_button, 2, 0, 1, 1); page_grid.attach (new Gtk.Separator (Gtk.Orientation.VERTICAL), 3, 0, 1, 1); page_grid.attach (page_next_btn, 4, 0, 1, 1); return page_grid; } private void update_pagination () { if (table_count <= settings.limit_results) { pages_button.label = _("1 Page"); pages_entry.set_range (1, 1); return; } tot_pages = (int) Math.ceilf (((float) table_count) / settings.limit_results); pages_button.label = _("%d of %d Pages").printf (current_page, tot_pages); page_prev_btn.sensitive = (current_page > 1); page_next_btn.sensitive = (current_page < tot_pages); pages_entry.set_range (1, tot_pages); } public Gtk.Label build_results_msg () { result_message = new Gtk.Label (_("No Results Available")); result_message.halign = Gtk.Align.START; result_message.margin_top = result_message.margin_bottom = 3; result_message.margin_start = result_message.margin_end = 9; result_message.ellipsize = Pango.EllipsizeMode.END; result_message.hexpand = true; result_message.wrap = true; return result_message; } private Gtk.Button build_reload_btn () { var reload_btn = new Sequeler.Partials.HeaderBarButton ("view-refresh-symbolic", _("Reload Results")); reload_btn.clicked.connect (reload_results); reload_btn.halign = Gtk.Align.END; return reload_btn; } public async void clear () { if (scroll == null) { return; } scroll.destroy (); scroll = new Gtk.ScrolledWindow (null, null); scroll.hscrollbar_policy = Gtk.PolicyType.AUTOMATIC; scroll.vscrollbar_policy = Gtk.PolicyType.AUTOMATIC; scroll.expand = true; scroll_grid.add (scroll); } public async void reset () { if (scroll.get_child () != null) { scroll.remove (scroll.get_child ()); } result_message.label = _("No Results Available"); table_name = ""; database = ""; placeholder (); } public void fill (string? table, string? db_name = null, string? count = null) { if (table == null) { return; } if (table == _table_name && db_name == _database) { return; } // Reset sorting attributes. sortby = null; sort = "ASC"; table_name = table; database = db_name; table_count = count != null ? int.parse (count) : 0; tot_pages = 0; current_page = 1; get_content_and_fill.begin (); } public void reload_results () { if (table_name == "") { return; } get_content_and_fill.begin (); } public async void get_content_and_fill () { if (reloading) { debug ("still loading"); return; } start_spinner (); var query = (window.main.connection_manager.db_type as DataBaseType) .show_table_content (table_name, table_count, current_page, sortby, sort); reloading = true; table_content = yield get_table_content (query); if (table_content == null) { return; } var result_data = new Sequeler.Partials.TreeBuilder ( table_content, window, settings.limit_results, current_page, sortby, sort); build_signals (result_data); result_message.label = _("%d Entries").printf (table_count); yield clear (); update_pagination (); scroll.add (result_data); scroll.show_all (); reloading = false; stop_spinner (); } private async Gda.DataModel? get_table_content (string query) { Gda.DataModel? result = null; result = yield window.main.connection_manager.init_select_query (query); if (result == null) { reloading = false; yield reset (); } return result; } private void build_signals (Sequeler.Partials.TreeBuilder tree) { tree.sortby_column.connect ((column, direction) => { sortby = column; sort = direction; reload_results (); }); } public void go_prev_page () { page_prev_btn.sensitive = false; current_page--; get_content_and_fill.begin (); } public void go_next_page () { page_next_btn.sensitive = false; current_page++; get_content_and_fill.begin (); } } sequeler-0.8.2/src/Layouts/Views/Query.vala000066400000000000000000000525271410464306200206570ustar00rootroot00000000000000/* * Copyright (c) 2017-2020 Alecaddd (https://alecaddd.com) * * 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 2 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, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Alessandro "Alecaddd" Castellani */ public class Sequeler.Layouts.Views.Query : Gtk.Grid { public weak Sequeler.Window window { get; construct; } public Gtk.SourceView query_builder; public Gtk.SourceBuffer buffer; public Gtk.SourceBuffer buffer_copy; public Gtk.SourceStyleSchemeManager style_scheme_manager; public Gtk.CssProvider style_provider; private Gtk.Revealer error_revealer; private Gtk.Label error_message; public Gtk.ScrolledWindow scroll_results; public Gtk.Spinner spinner; public Gtk.Label loading_msg; public Gtk.Label result_message; public Gtk.Image icon_success; public Gtk.Image icon_fail; public Gtk.Button run_button; public Gtk.MenuButton export_button; private string font; public string default_font { get; set; } GLib.File? file; Gda.DataModel? response_data; public Gtk.Paned panels; public Sequeler.Partials.TreeBuilder result_data; public Sequeler.Widgets.QueryParamsDialog? params_dialog { get; set; default = null; } public signal void update_tab_indicator (bool status); public Query (Sequeler.Window main_window) { Object ( orientation: Gtk.Orientation.VERTICAL, window: main_window ); } construct { default_font = new GLib.Settings ("org.gnome.desktop.interface").get_string ("monospace-font-name"); panels = new Gtk.Paned (Gtk.Orientation.VERTICAL); panels.position = settings.query_area; panels.expand = true; attach (panels, 0, 0, 1, 1); var scroll = new Gtk.ScrolledWindow (null, null); scroll.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); build_query_builder (); scroll.add (query_builder); panels.pack1 (scroll, false, false); panels.pack2 (results_view (), true, false); } public void use_default_font (bool value) { if (!value) { return; } font = default_font; } public void build_query_builder () { var manager = Gtk.SourceLanguageManager.get_default (); style_provider = new Gtk.CssProvider (); style_scheme_manager = new Gtk.SourceStyleSchemeManager (); buffer = new Gtk.SourceBuffer (null); buffer.highlight_syntax = true; buffer.highlight_matching_brackets = true; buffer.language = manager.get_language ("sql"); query_builder = new Gtk.SourceView.with_buffer (buffer); query_builder.show_line_numbers = true; query_builder.highlight_current_line = true; query_builder.show_right_margin = false; query_builder.wrap_mode = Gtk.WrapMode.WORD; query_builder.smart_home_end = Gtk.SourceSmartHomeEndType.AFTER; Gtk.drag_dest_add_uri_targets (query_builder); update_font_style (); update_color_style (); } private string get_current_font_family () { return font.substring (0, font.last_index_of (" ")); } private double get_current_font_size () { return double.parse (font.substring (font.last_index_of (" ") + 1)); } public void update_font_style () { font = Sequeler.settings.font; use_default_font (Sequeler.settings.use_system_font); var font_family = get_current_font_family (); var font_size = get_current_font_size ().to_string (); try { style_provider.load_from_data (" * { font-family: '%s'; font-size: %spx; }".printf (font_family, font_size), -1); query_builder.get_style_context ().add_provider ( style_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION ); } catch (Error e) { debug ("Internal error loading session chooser style: %s", e.message); } } public void update_color_style () { buffer.style_scheme = style_scheme_manager.get_scheme (Sequeler.settings.style_scheme); } /** * Get the text buffer based on user cursor, selection, and semicolon */ public string get_text () { Gtk.TextIter start, end; // If a portion of text is selected if (buffer.get_selection_bounds (out start, out end)) { strip_comments (buffer.get_text (start, end, true).strip ()); return buffer_copy.text.strip (); } // If there's a semicolon, return the currently highlighted line if (buffer.text.contains (";")) { buffer.get_selection_bounds (out start, out end); start.set_line_offset (0); start.backward_find_char (is_semicolon, null); if (! start.starts_line ()) { start.forward_char (); } if (end.starts_line ()) { end.backward_char (); } if (!end.ends_line ()) { end.forward_to_line_end (); } end.forward_find_char (is_semicolon, null); debug (buffer.get_text (start, end, true).strip ()); strip_comments (buffer.get_text (start, end, true).strip ()); return buffer_copy.text.strip (); } // Return full text strip_comments (); debug (buffer_copy.text.strip ()); return buffer_copy.text.strip (); } /** * Remove inline comments (//) and block comments (/*) */ public void strip_comments (string? source_text = null) { var text = source_text != null ? source_text : buffer.text; buffer_copy = new Gtk.SourceBuffer (null); buffer_copy.set_text (text); string[] lines = Regex.split_simple ("""[\r\n]""", text); if (lines.length != buffer_copy.get_line_count ()) { warning ("Mismatch between line counts when stripping trailing spaces, not continuing"); return; } MatchInfo info; Gtk.TextIter start_delete, end_delete; Regex comments; try { comments = new Regex ("""\/\*[\s\S]*?\*\/|([^:]|^)\/\/.*$""", 0); } catch (RegexError e) { critical ("Error while building regex to replace trailing whitespace: %s", e.message); return; } // Find comments line by line for (int line_no = 0; line_no < lines.length; line_no++) { if (comments.match (lines[line_no], 0, out info)) { buffer_copy.get_iter_at_line (out start_delete, line_no); start_delete.forward_to_line_end (); end_delete = start_delete; end_delete.backward_chars (info.fetch (0).length); buffer_copy.@delete (ref start_delete, ref end_delete); } } int start_pos, end_pos; // Find leftover comment blocks if (comments.match (text, 0, out info)) { info.fetch_pos (0, out start_pos, out end_pos); buffer_copy.get_iter_at_offset (out start_delete, start_pos); end_delete = start_delete; end_delete.forward_chars (info.fetch (0).length); buffer_copy.@delete (ref start_delete, ref end_delete); } } public Gtk.Grid results_view () { var results_view = new Gtk.Grid (); spinner = new Gtk.Spinner (); spinner.hexpand = true; spinner.halign = Gtk.Align.END; spinner.margin = 10; var action_bar = new Gtk.Grid (); action_bar.get_style_context ().add_class ("library-titlebar"); action_bar.attach (build_loading_msg (), 0, 0, 1, 1); action_bar.attach (spinner, 1, 0, 1, 1); action_bar.attach (build_run_button (), 2, 0, 1, 1); scroll_results = new Gtk.ScrolledWindow (null, null); scroll_results.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); scroll_results.expand = true; error_revealer = new Gtk.Revealer (); var error_grid = new Gtk.Grid (); error_grid.get_style_context ().add_class ("query-error"); error_grid.hexpand = true; error_grid.margin = 6; error_message = new Gtk.Label (""); error_message.wrap = true; error_message.margin = 6; error_grid.add (error_message); error_revealer.add (error_grid); error_revealer.reveal_child = false; var info_bar = new Gtk.Grid (); info_bar.get_style_context ().add_class ("library-toolbar"); info_bar.attach (build_results_msg (), 0, 0, 1, 1); info_bar.attach (build_export_btn (), 1, 0, 1, 1); results_view.attach (action_bar, 0, 0, 1, 1); results_view.attach (error_revealer, 0, 1, 1, 1); results_view.attach (scroll_results, 0, 2, 1, 1); results_view.attach (info_bar, 0, 3, 1, 1); return results_view; } public Gtk.Label build_loading_msg () { loading_msg = new Gtk.Label (_("Running Query\u2026")); loading_msg.halign = Gtk.Align.START; loading_msg.margin = 10; loading_msg.hexpand = true; loading_msg.wrap = true; toggle_loading_msg (false); return loading_msg; } public void toggle_loading_msg (bool toggle) { loading_msg.visible = toggle; loading_msg.no_show_all = !toggle; } public Gtk.Button build_run_button () { run_button = new Sequeler.Partials.RunQueryButton (); run_button.margin = 10; run_button.action_name = Services.ActionManager.ACTION_PREFIX + Services.ActionManager.ACTION_RUN_QUERY; return run_button; } public Gtk.Grid build_results_msg () { var result_box = new Gtk.Grid (); icon_success = new Gtk.Image.from_icon_name ("process-completed-symbolic", Gtk.IconSize.BUTTON); icon_success.margin_start = 6; icon_success.visible = false; icon_success.no_show_all = true; icon_fail = new Gtk.Image.from_icon_name ("dialog-error-symbolic", Gtk.IconSize.BUTTON); icon_fail.margin_start = 6; icon_fail.visible = false; icon_fail.no_show_all = true; result_message = new Gtk.Label (_("No Results Available")); result_message.halign = Gtk.Align.START; result_message.margin = 6; result_message.margin_top = 6; result_message.hexpand = true; result_message.wrap = true; result_box.attach (icon_success, 0, 0, 1, 1); result_box.attach (icon_fail, 1, 0, 1, 1); result_box.attach (result_message, 2, 0, 1, 1); return result_box; } public void show_result_icon (bool status) { update_tab_indicator (status); if (status) { icon_success.visible = true; icon_success.no_show_all = false; icon_fail.visible = false; icon_fail.no_show_all = true; return; } icon_success.visible = false; icon_success.no_show_all = true; icon_fail.visible = true; icon_fail.no_show_all = false; } public Gtk.Button build_export_btn () { var export_image = new Gtk.Image.from_icon_name ("document-save-symbolic", Gtk.IconSize.BUTTON); export_button = new Gtk.MenuButton (); export_button.label = _("Export Results"); export_button.get_style_context ().add_class (Gtk.STYLE_CLASS_FLAT); export_button.always_show_image = true; export_button.set_image (export_image); export_button.can_focus = false; var menu_grid = new Gtk.Grid (); menu_grid.expand = true; menu_grid.margin_top = 3; menu_grid.margin_bottom = 3; menu_grid.orientation = Gtk.Orientation.VERTICAL; var export_csv = new Gtk.ModelButton (); export_csv.label = _("Export as CSV"); export_csv.image = new Gtk.Image.from_icon_name ("x-office-spreadsheet", Gtk.IconSize.BUTTON); export_csv.always_show_image = true; export_csv.clicked.connect (() => { export_results (1); }); var export_text = new Gtk.ModelButton (); export_text.label = _("Export as Text"); export_text.image = new Gtk.Image.from_icon_name ("text-x-generic", Gtk.IconSize.BUTTON); export_text.always_show_image = true; export_text.clicked.connect (() => { export_results (2); }); menu_grid.attach (export_csv, 0, 1, 1, 1); menu_grid.attach (export_text, 0, 2, 1, 1); menu_grid.show_all (); var export_menu = new Gtk.Popover (null); export_menu.add (menu_grid); export_button.popover = export_menu; export_button.direction = Gtk.ArrowType.UP; export_button.sensitive = false; return export_button; } public void run_query (string query) { Gda.Statement statement; Gda.Set params; try { statement = window.main.connection_manager.parse_sql_string (query, out params); } catch (GLib.Error ex) { on_query_error (ex.message); return; } if (statement == null || params == null) { run_query_statement (query, statement, null); return; } for (int i = 0; ; i++) { var holder = params.get_nth_holder (i); if (holder == null) { break; } debug ("holder #%d is %s type: %s", i, holder.get_id (), holder.get_g_type ().name ()); } params_dialog = new Sequeler.Widgets.QueryParamsDialog (window, this, query, statement, params); params_dialog.set_modal (true); params_dialog.show_all (); params_dialog.destroy.connect (() => { params_dialog = null; }); } public void run_query_statement (string query, Gda.Statement statement, Gda.Set? params) { toggle_loading_msg (true); spinner.start (); var select_pos = query.down ().index_of ("select", 0); var show_pos = query.down ().index_of ("show", 0); var pragma_pos = query.down ().index_of ("pragma", 0); var explain_pos = query.down ().index_of ("explain", 0); var describe_pos = query.down ().index_of ("describe", 0); if (select_pos == 0 || show_pos == 0 || pragma_pos == 0 || explain_pos == 0 || describe_pos == 0) { select_statement.begin (statement, params, (obj, res) => { handle_select_response (select_statement.end (res)); }); } else { non_select_statement.begin (statement, params, (obj, res) => { handle_query_response (non_select_statement.end (res)); }); } } private async Gee.HashMap select_statement (Gda.Statement statement, Gda.Set? params) { return yield window.main.connection_manager.init_silent_select_statement (statement, params); } public async Gee.HashMap non_select_statement (Gda.Statement statement, Gda.Set? params) { return yield window.main.connection_manager.init_silent_statement (statement, params); } public void handle_select_response (Gee.HashMap response) { foreach (var entry in response.entries) { response_data = entry.key; on_query_error (entry.value); } if (response_data == null) { toggle_loading_msg (false); spinner.stop (); result_message.label = _("Unable to process Query!"); show_result_icon (false); export_button.sensitive = false; return; } if (error_revealer.get_reveal_child ()) { error_revealer.reveal_child = false; } if (result_data != null) { scroll_results.remove (result_data); result_data = null; } result_data = new Sequeler.Partials.TreeBuilder (response_data, window); toggle_loading_msg (false); spinner.stop (); result_message.label = _("%d Total Results").printf (response_data.get_n_rows ()); show_result_icon (true); scroll_results.add (result_data); scroll_results.show_all (); export_button.sensitive = response_data.get_n_rows () == 0 ? false : true; } public void handle_query_response (Gee.HashMap data) { string? response = null; foreach (var entry in data.entries) { response = entry.key; on_query_error (entry.value); } toggle_loading_msg (false); spinner.stop (); if (result_data != null) { scroll_results.remove (result_data); result_data = null; } if (response == null) { result_message.label = _("Unable to process Query!"); show_result_icon (false); return; } if (error_revealer.get_reveal_child ()) { error_revealer.reveal_child = false; } if (int.parse (response) > 0) { result_message.label = _("Query Successfully Executed! Rows Affected: %s").printf (response); show_result_icon (true); } else { result_message.label = _("Query Executed!"); show_result_icon (true); } window.main.database_schema.reload_schema.begin (); // Force reset all views to fetch updated data window.main.database_view.content.reset.begin (); window.main.database_view.relations.reset.begin (); window.main.database_view.structure.reset.begin (); } private void on_query_error (string error) { if (error == "") { return; } if (result_data != null) { scroll_results.remove (result_data); result_data = null; } error_message.label = error; error_revealer.reveal_child = true; } private bool is_semicolon (unichar semicolon) { return semicolon.to_string () == ";"; } private void export_results (int type) { file = null; var save_dialog = new Gtk.FileChooserNative (_("Pick a file"), window, Gtk.FileChooserAction.SAVE, _("_Save"), _("_Cancel")); save_dialog.do_overwrite_confirmation = true; save_dialog.modal = true; save_dialog.response.connect ((dialog, response_id) => { switch (response_id) { case Gtk.ResponseType.ACCEPT: file = save_dialog.get_file (); save_to_file (type); break; } dialog.destroy (); }); save_dialog.run (); } private void save_to_file (int type) { var options_list = new GLib.SList (); var separator_holder = new Gda.Holder (GLib.Type.STRING); var first_line_holder = new Gda.Holder (GLib.Type.BOOLEAN); var overwrite_holder = new Gda.Holder (GLib.Type.BOOLEAN); separator_holder.id = "SEPARATOR"; try { separator_holder.set_value (","); } catch (GLib.Error err) { window.main.connection_manager.query_warning (err.message); } first_line_holder.id = "NAMES_ON_FIRST_LINE"; try { first_line_holder.set_value (true); } catch (GLib.Error err) { window.main.connection_manager.query_warning (err.message); } overwrite_holder.id = "OVERWRITE"; try { overwrite_holder.set_value (true); } catch (GLib.Error err) { window.main.connection_manager.query_warning (err.message); } options_list.append (separator_holder); options_list.append (first_line_holder); options_list.append (overwrite_holder); var options = new Gda.Set (options_list); switch (type) { case 1: // Export as CSV try { response_data.export_to_file (Gda.DataModelIOFormat.TEXT_SEPARATED, file.get_path (), null, null, options); } catch (GLib.Error err) { window.main.connection_manager.query_warning (err.message); } break; case 2: // Export as plain text try { response_data.export_to_file (Gda.DataModelIOFormat.TEXT_TABLE, file.get_path (), null, null, options); } catch (GLib.Error err) { window.main.connection_manager.query_warning (err.message); } break; } } } sequeler-0.8.2/src/Layouts/Views/Relations.vala000066400000000000000000000145471410464306200215120ustar00rootroot00000000000000/* * Copyright (c) 2017-2020 Alecaddd (https://alecaddd.com) * * 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 2 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, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Alessandro "Alecaddd" Castellani */ public class Sequeler.Layouts.Views.Relations : Gtk.Grid { public weak Sequeler.Window window { get; construct; } public Gtk.Stack stack; public Gtk.Grid scroll_grid; public Gtk.ScrolledWindow scroll; public Gtk.Label result_message; private Gtk.Spinner spinner; private bool reloading { get; set; default = false; } private string _table_name = ""; public string table_name { get { return _table_name; } set { _table_name = value; } } private string _database = ""; public string database { get { return _database; } set { _database = value; } } private string? sortby = null; private string sort = "ASC"; public Relations (Sequeler.Window main_window) { Object ( orientation: Gtk.Orientation.VERTICAL, window: main_window ); } construct { scroll_grid = new Gtk.Grid (); scroll_grid.expand = true; scroll = new Gtk.ScrolledWindow (null, null); scroll.hscrollbar_policy = Gtk.PolicyType.AUTOMATIC; scroll.vscrollbar_policy = Gtk.PolicyType.AUTOMATIC; scroll.expand = true; var info_bar = new Gtk.Grid (); info_bar.get_style_context ().add_class ("library-toolbar"); info_bar.attach (build_results_msg (), 0, 0, 1, 1); info_bar.attach (build_reload_btn (), 1, 0, 1, 1); spinner = new Gtk.Spinner (); spinner.hexpand = true; spinner.vexpand = true; spinner.halign = Gtk.Align.CENTER; spinner.valign = Gtk.Align.CENTER; var welcome = new Granite.Widgets.Welcome (_("Select Table"), _("Select a table from the left sidebar to activate this view.")); stack = new Gtk.Stack (); stack.hexpand = true; stack.vexpand = true; stack.add_named (welcome, "welcome"); stack.add_named (spinner, "spinner"); stack.add_named (scroll_grid, "list"); attach (stack, 0, 0, 1, 1); attach (info_bar, 0, 1, 1, 1); placeholder (); } public void placeholder () { stack.visible_child_name = "welcome"; } public void start_spinner () { spinner.start (); stack.visible_child_name = "spinner"; } public void stop_spinner () { spinner.stop (); stack.visible_child_name = "list"; } public Gtk.Label build_results_msg () { result_message = new Gtk.Label (_("No Results Available")); result_message.halign = Gtk.Align.START; result_message.margin = 7; result_message.margin_top = 6; result_message.hexpand = true; result_message.wrap = true; return result_message; } private Gtk.Button build_reload_btn () { var reload_btn = new Sequeler.Partials.HeaderBarButton ("view-refresh-symbolic", _("Reload Results")); reload_btn.clicked.connect (reload_results); reload_btn.halign = Gtk.Align.END; return reload_btn; } public async void clear () { if (scroll == null) { return; } scroll.destroy (); scroll = new Gtk.ScrolledWindow (null, null); scroll.hscrollbar_policy = Gtk.PolicyType.AUTOMATIC; scroll.vscrollbar_policy = Gtk.PolicyType.AUTOMATIC; scroll.expand = true; scroll_grid.add (scroll); } public async void reset () { if (scroll.get_child () != null) { scroll.remove (scroll.get_child ()); } result_message.label = _("No Results Available"); table_name = ""; database = ""; placeholder (); } public void fill (string? table, string? db_name = null) { if (table == null) { return; } if (table == _table_name && db_name == _database) { return; } // Reset sorting attributes. sortby = null; sort = "ASC"; table_name = table; database = db_name; get_content_and_fill.begin (); } public void reload_results () { if (table_name == "") { return; } get_content_and_fill.begin (); } public async void get_content_and_fill () { if (reloading) { debug ("still loading"); return; } start_spinner (); var query = (window.main.connection_manager.db_type as DataBaseType) .show_table_relations (table_name, database, sortby, sort); reloading = true; var table_relations = yield get_table_relations (query); if (table_relations == null) { return; } var result_data = new Sequeler.Partials.TreeBuilder ( table_relations, window, 0, 0, sortby, sort); build_signals (result_data); result_message.label = table_relations.get_n_rows ().to_string () + _(" Constraints"); yield clear (); scroll.add (result_data); scroll.show_all (); reloading = false; stop_spinner (); } private async Gda.DataModel? get_table_relations (string query) { Gda.DataModel? result = null; result = yield window.main.connection_manager.init_select_query (query); if (result == null) { reloading = false; yield reset (); } return result; } private void build_signals (Sequeler.Partials.TreeBuilder tree) { tree.sortby_column.connect ((column, direction) => { sortby = column; sort = direction; reload_results (); }); } } sequeler-0.8.2/src/Layouts/Views/Structure.vala000066400000000000000000000145331410464306200215450ustar00rootroot00000000000000/* * Copyright (c) 2011-2019 Alecaddd (http://alecaddd.com) * * 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 2 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, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Alessandro "Alecaddd" Castellani */ public class Sequeler.Layouts.Views.Structure : Gtk.Grid { public weak Sequeler.Window window { get; construct; } public Gtk.Stack stack; public Gtk.Grid scroll_grid; public Gtk.ScrolledWindow scroll; public Gtk.Label result_message; private Gtk.Spinner spinner; private bool reloading { get; set; default = false; } private string _table_name = ""; public string table_name { get { return _table_name; } set { _table_name = value; } } private string _database = ""; public string database { get { return _database; } set { _database = value; } } private string? sortby = null; private string sort = "ASC"; public Structure (Sequeler.Window main_window) { Object ( orientation: Gtk.Orientation.VERTICAL, window: main_window ); } construct { scroll_grid = new Gtk.Grid (); scroll_grid.expand = true; scroll = new Gtk.ScrolledWindow (null, null); scroll.hscrollbar_policy = Gtk.PolicyType.AUTOMATIC; scroll.vscrollbar_policy = Gtk.PolicyType.AUTOMATIC; scroll.expand = true; scroll_grid.add (scroll); var info_bar = new Gtk.Grid (); info_bar.get_style_context ().add_class ("library-toolbar"); info_bar.attach (build_results_msg (), 0, 0, 1, 1); info_bar.attach (build_reload_btn (), 1, 0, 1, 1); spinner = new Gtk.Spinner (); spinner.hexpand = true; spinner.vexpand = true; spinner.halign = Gtk.Align.CENTER; spinner.valign = Gtk.Align.CENTER; var welcome = new Granite.Widgets.Welcome (_("Select Table"), _("Select a table from the left sidebar to activate this view.")); stack = new Gtk.Stack (); stack.hexpand = true; stack.vexpand = true; stack.add_named (welcome, "welcome"); stack.add_named (spinner, "spinner"); stack.add_named (scroll_grid, "list"); attach (stack, 0, 0, 1, 1); attach (info_bar, 0, 1, 1, 1); placeholder (); } public void placeholder () { stack.visible_child_name = "welcome"; } public void start_spinner () { spinner.start (); stack.visible_child_name = "spinner"; } public void stop_spinner () { spinner.stop (); stack.visible_child_name = "list"; } public Gtk.Label build_results_msg () { result_message = new Gtk.Label (_("No Results Available")); result_message.halign = Gtk.Align.START; result_message.margin = 7; result_message.margin_top = 6; result_message.hexpand = true; result_message.wrap = true; return result_message; } private Gtk.Button build_reload_btn () { var reload_btn = new Sequeler.Partials.HeaderBarButton ("view-refresh-symbolic", _("Reload Results")); reload_btn.clicked.connect (reload_results); reload_btn.halign = Gtk.Align.END; return reload_btn; } public async void clear () { if (scroll == null) { return; } scroll.destroy (); scroll = new Gtk.ScrolledWindow (null, null); scroll.hscrollbar_policy = Gtk.PolicyType.AUTOMATIC; scroll.vscrollbar_policy = Gtk.PolicyType.AUTOMATIC; scroll.expand = true; scroll_grid.add (scroll); } public async void reset () { if (scroll.get_child () != null) { scroll.remove (scroll.get_child ()); } result_message.label = _("No Results Available"); table_name = ""; database = ""; placeholder (); } public void fill (string? table, string? db_name = null) { if (table == null) { return; } if (table == _table_name && db_name == _database) { return; } // Reset sorting attributes. sortby = null; sort = "ASC"; table_name = table; database = db_name; get_content_and_fill.begin (); } public void reload_results () { if (table_name == "") { return; } get_content_and_fill.begin (); } public async void get_content_and_fill () { if (reloading) { debug ("still loading"); return; } start_spinner (); var query = (window.main.connection_manager.db_type as DataBaseType) .show_table_structure (table_name, sortby, sort); reloading = true; var table_schema = yield get_table_schema (query); if (table_schema == null) { return; } var result_data = new Sequeler.Partials.TreeBuilder (table_schema, window, 0, 0, sortby, sort); build_signals (result_data); result_message.label = table_schema.get_n_rows ().to_string () + _(" Fields"); yield clear (); scroll.add (result_data); scroll.show_all (); reloading = false; stop_spinner (); } private async Gda.DataModel? get_table_schema (string query) { Gda.DataModel? result = null; result = yield window.main.connection_manager.init_select_query (query); if (result == null) { reloading = false; yield reset (); } return result; } private void build_signals (Sequeler.Partials.TreeBuilder tree) { tree.sortby_column.connect ((column, direction) => { sortby = column; sort = direction; reload_results (); }); } } sequeler-0.8.2/src/Layouts/Welcome.vala000066400000000000000000000106461410464306200200440ustar00rootroot00000000000000/* * Copyright (c) 2011-2018 Alecaddd (http://alecaddd.com) * * 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 2 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, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Alessandro "Alecaddd" Castellani */ public class Sequeler.Layouts.Welcome : Granite.Widgets.Welcome { public unowned Sequeler.Window window { get; construct; } public Welcome (Sequeler.Window main_window) { Object ( window: main_window, title: _("Welcome to Sequeler"), subtitle: _("Connect to Any Local or Remote Database.") ); } construct { valign = Gtk.Align.FILL; halign = Gtk.Align.FILL; vexpand = true; append ("bookmark-new", _("Add a New Database"), _("Connect to a Database and Save It in Your Library")); append ("window-new", _("New Window"), _("Open a New Sequeler Window")); append ("folder-download", _("Import Connections"), _("Import Previously Exported Sequeler Connections")); activated.connect ( index => { switch (index) { case 0: Sequeler.Services.ActionManager.action_from_group (Sequeler.Services.ActionManager.ACTION_NEW_CONNECTION, window.get_action_group ("win")); break; case 1: Sequeler.Services.ActionManager.action_from_group (Sequeler.Services.ActionManager.ACTION_NEW_WINDOW, window.get_action_group ("win")); break; case 2: import_file (); break; } }); } private void import_file () { var open_dialog = new Gtk.FileChooserNative (_("Select a file"), window, Gtk.FileChooserAction.OPEN, _("_Open"), _("_Cancel")); open_dialog.local_only = true; open_dialog.modal = true; open_dialog.response.connect (open_file); open_dialog.run (); } private void open_file (Gtk.NativeDialog dialog, int response_id) { var open_dialog = dialog as Gtk.FileChooserNative; switch (response_id) { case Gtk.ResponseType.ACCEPT: var file = open_dialog.get_file (); uint8[] file_contents; try { file.load_contents (null, out file_contents, null); } catch (GLib.Error err) { import_warning (err.message); } var imported_connections = (string) file_contents; var data = imported_connections.split ("---\n"); foreach (var import in data) { if (import == "") { continue; } var array = settings.arraify_data (import); array["id"] = settings.tot_connections.to_string (); settings.add_connection (array); } window.main.library.reload_library.begin (); break; case Gtk.ResponseType.CANCEL: break; } open_dialog.destroy (); } private void import_warning (string message) { var message_dialog = new Granite.MessageDialog.with_image_from_icon_name (_("Unable to Import Library "), message, "dialog-error", Gtk.ButtonsType.NONE); message_dialog.transient_for = window; var suggested_button = new Gtk.Button.with_label ("Close"); message_dialog.add_action_widget (suggested_button, Gtk.ResponseType.ACCEPT); message_dialog.show_all (); if (message_dialog.run () == Gtk.ResponseType.ACCEPT) {} message_dialog.destroy (); } } sequeler-0.8.2/src/Main.vala000066400000000000000000000023371410464306200156730ustar00rootroot00000000000000/* * Copyright (c) 2011-2018 Alecaddd (http://alecaddd.com) * * 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 2 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, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Alessandro "Alecaddd" Castellani */ #if IS_DEVEL public const string APP_NAME = "(Development) Sequeler"; #else public const string APP_NAME = "Sequeler"; #endif public const string TERMINAL_NAME = "sequeler"; public static int main (string[] args) { Environment.set_application_name ("Sequeler"); Environment.set_prgname ("Sequeler"); var application = new Sequeler.Application (); return application.run (args); } sequeler-0.8.2/src/Partials/000077500000000000000000000000001410464306200157145ustar00rootroot00000000000000sequeler-0.8.2/src/Partials/ButtonType.vala000066400000000000000000000040551410464306200207020ustar00rootroot00000000000000/* * Copyright (c) 2011-2018 Alecaddd (http://alecaddd.com) * * 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 2 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, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Alessandro "Alecaddd" Castellani */ namespace Sequeler.Partials { public class HeaderBarButton : Gtk.Button { public HeaderBarButton (string icon_name, string tooltip) { can_focus = false; Gtk.Image image; if (icon_name.contains ("/")) { image = new Gtk.Image.from_resource (icon_name); } else { image = new Gtk.Image.from_icon_name (icon_name, Gtk.IconSize.BUTTON); } image.margin = 3; get_style_context ().add_class (Gtk.STYLE_CLASS_FLAT); set_tooltip_text (tooltip); add (image); } } public class ToolBarButton : Gtk.Grid { public ToolBarButton (string icon_name, string tooltip, string label) { name = tooltip; halign = Gtk.Align.CENTER; Gtk.Image icon; var title = new Gtk.Label (label); if (icon_name.contains ("/")) { icon = new Gtk.Image.from_resource (icon_name); } else { icon = new Gtk.Image.from_icon_name (icon_name, Gtk.IconSize.BUTTON); } icon.margin = 2; attach (icon, 0, 0, 1, 1); attach (title, 1, 0, 1, 1); } } } sequeler-0.8.2/src/Partials/DataBasePanel.vala000066400000000000000000000134151410464306200212110ustar00rootroot00000000000000/* * Copyright (c) 2020 Alecaddd (https://alecaddd.com) * * 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 2 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, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Alessandro "Alecaddd" Castellani */ public class Sequeler.Partials.DataBasePanel : Gtk.Revealer { public weak Sequeler.Window window { get; construct; } private Gtk.Label title; private Sequeler.Partials.Entry db_entry; private Gtk.Stack button_stack; private Gtk.Button button_save; private Gtk.Button button_edit; private Gtk.Button button_cancel; private Gtk.Spinner spinner; public bool reveal { get { return reveal_child; } set { reveal_child = value; spinner.stop (); button_cancel.sensitive = true; } } public DataBasePanel (Sequeler.Window main_window) { Object ( window: main_window ); } construct { valign = Gtk.Align.START; hexpand = true; transition_type = Gtk.RevealerTransitionType.SLIDE_DOWN; reveal_child = false; var panel = new Gtk.Grid (); panel.margin = 9; panel.get_style_context ().add_class ("database-panel"); // Title area. title = new Gtk.Label (""); title.get_style_context ().add_class ("h4"); title.margin_start = title.margin_end = 3; title.margin_top = 6; title.ellipsize = Pango.EllipsizeMode.END; // Body area. var body = new Gtk.Grid (); body.margin = 3; db_entry = new Sequeler.Partials.Entry (_("Database name"), null); db_entry.margin = 6; db_entry.changed.connect (change_sensitivity); body.add (db_entry); // Action buttons area. var buttons_area = new Gtk.Grid (); buttons_area.hexpand = true; buttons_area.get_style_context ().add_class ("database-panel-bottom"); button_cancel = new Gtk.Button.with_label (_("Cancel")); button_cancel.clicked.connect (() => { window.main.database_schema.hide_database_panel (); }); button_cancel.margin = 9; button_save = new Gtk.Button.with_label (_("Save")); button_save.get_style_context ().add_class (Gtk.STYLE_CLASS_SUGGESTED_ACTION); button_save.margin = 9; button_save.sensitive = false; button_save.clicked.connect (() => { window.main.database_schema.create_database.begin (db_entry.text); }); button_edit = new Gtk.Button.with_label (_("Edit")); button_edit.get_style_context ().add_class (Gtk.STYLE_CLASS_SUGGESTED_ACTION); button_edit.margin = 9; button_edit.sensitive = false; button_edit.clicked.connect (() => { var dialog = new Granite.MessageDialog.with_image_from_icon_name (_("Are you sure you want to edit this Database?"), _("This is a dangerous operation and it might cause data loss, a backup before proceeding is recommended."), "dialog-warning", Gtk.ButtonsType.CANCEL); dialog.transient_for = window; var suggested_button = new Gtk.Button.with_label (_("Yes, proceed!")); suggested_button.get_style_context ().add_class (Gtk.STYLE_CLASS_DESTRUCTIVE_ACTION); dialog.add_action_widget (suggested_button, Gtk.ResponseType.ACCEPT); dialog.show_all (); if (dialog.run () == Gtk.ResponseType.ACCEPT) { button_cancel.sensitive = false; spinner.start (); button_stack.visible_child_name = "spinner"; window.main.database_schema.edit_database.begin (db_entry.text); } dialog.destroy (); }); spinner = new Gtk.Spinner (); spinner.hexpand = true; spinner.vexpand = true; spinner.halign = Gtk.Align.CENTER; spinner.valign = Gtk.Align.CENTER; button_stack = new Gtk.Stack (); button_stack.expand = false; button_stack.add_named (button_save, "new"); button_stack.add_named (button_edit, "edit"); button_stack.add_named (spinner, "spinner"); var separator = new Gtk.Separator (Gtk.Orientation.HORIZONTAL); separator.expand = true; separator.halign = Gtk.Align.CENTER; buttons_area.attach (button_cancel, 0, 0); buttons_area.attach (separator, 1, 0); buttons_area.attach (button_stack, 2, 0); panel.attach (title, 0, 0); panel.attach (body, 0, 1); panel.attach (buttons_area, 0, 2); add (panel); } private void change_sensitivity () { button_save.sensitive = db_entry.text != ""; button_edit.sensitive = db_entry.text != ""; } public void new_database () { spinner.stop (); button_cancel.sensitive = true; title.label = _("Create a new Database"); db_entry.text = ""; button_stack.visible_child_name = "new"; } public void edit_database (string name) { spinner.stop (); button_cancel.sensitive = true; title.label = _("Edit Database"); db_entry.text = name; button_stack.visible_child_name = "edit"; } } sequeler-0.8.2/src/Partials/DatabaseTable.vala000066400000000000000000000042541410464306200212420ustar00rootroot00000000000000/* * Copyright (c) 2017-2020 Alecaddd (https://alecaddd.com) * * 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 2 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, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Alessandro "Alecaddd" Castellani */ public class Sequeler.Partials.DataBaseTable : Granite.Widgets.SourceList.Item { private Gtk.Menu menu; private Granite.Widgets.SourceList source_list; public DataBaseTable (string table_name = "", Granite.Widgets.SourceList list) { name = table_name; source_list = list; editable = true; build_context_menu (); } public override Gtk.Menu? get_context_menu () { return menu; } private void build_context_menu () { menu = new Gtk.Menu (); Gtk.MenuItem copy_item = new Gtk.MenuItem.with_label (_("Copy table name")); Gtk.MenuItem edit_item = new Gtk.MenuItem.with_label (_("Edit table name")); copy_item.activate.connect (() => { Gdk.Display display = Gdk.Display.get_default (); Gtk.Clipboard clipboard = Gtk.Clipboard.get_default (display); clipboard.set_text (name, -1); }); copy_item.show (); edit_item.activate.connect (() => { source_list.start_editing_item (this); }); edit_item.show (); menu.append (copy_item); menu.append (edit_item); /* Wayland complains if not set */ menu.realize.connect (() => { Gdk.Window child = menu.get_window (); child.set_type_hint (Gdk.WindowTypeHint.POPUP_MENU); }); } } sequeler-0.8.2/src/Partials/Helpers.vala000066400000000000000000000113671410464306200201730ustar00rootroot00000000000000/* * Copyright (c) 2011-2018 Alecaddd (http://alecaddd.com) * * 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 2 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, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Alessandro "Alecaddd" Castellani */ namespace Sequeler.Partials { public class TitleBar : Gtk.Grid { public TitleBar (string text) { get_style_context ().add_class ("library-titlebar"); var title = new Gtk.Label (text); title.get_style_context ().add_class ("h4"); title.halign = Gtk.Align.CENTER; title.margin = 4; title.hexpand = true; this.add (title); } } public class ResponseMessage : Gtk.Label { public ResponseMessage () { get_style_context ().add_class ("h4"); halign = Gtk.Align.CENTER; valign = Gtk.Align.CENTER; justify = Gtk.Justification.CENTER; set_line_wrap (true); margin_bottom = 10; } } public class Entry : Gtk.Entry { public Entry (string? placeholder, string? val) { hexpand = true; if (placeholder != null) { placeholder_text = placeholder; } if (val != null) { text = val; } } } public class ButtonClass : Gtk.Button { public ButtonClass (string text, string* class) { label = text; if (class != null) { var style_context = this.get_style_context (); style_context.add_class (class); } } } public class TableRow : Gtk.Grid { public TableRow (string text, int type) { if (type % 2 == 0) { get_style_context ().add_class ("row-odd"); } else { get_style_context ().add_class ("row-even"); } var title = new Gtk.Label (text); title.get_style_context ().add_class ("h4"); title.halign = Gtk.Align.START; title.margin_start = 6; title.margin_end = 6; title.hexpand = true; this.add (title); } } public class LabelForm : Gtk.Label { public LabelForm (string text) { label = text; halign = Gtk.Align.END; } } class UrlButton : Gtk.Button { public UrlButton (string label, string uri, string icon_name) { get_style_context ().add_class (Granite.STYLE_CLASS_ACCENT); get_style_context ().add_class (Gtk.STYLE_CLASS_FLAT); tooltip_text = uri; var icon = new Gtk.Image.from_icon_name (icon_name, Gtk.IconSize.SMALL_TOOLBAR); icon.valign = Gtk.Align.CENTER; var title = new Gtk.Label (label); title.ellipsize = Pango.EllipsizeMode.END; var grid = new Gtk.Grid (); grid.column_spacing = 6; grid.add (icon); grid.add (title); add (grid); clicked.connect (() => { try { AppInfo.launch_default_for_uri (uri, null); } catch (Error e) { warning ("%s\n", e.message); } }); } } public class RunQueryButton : Gtk.Button { public RunQueryButton () { set_label (_("Run Query")); get_style_context ().add_class ("suggested-action"); get_style_context ().add_class ("notebook-temp-fix"); always_show_image = true; image = new Gtk.Image.from_icon_name ("media-playback-start-symbolic", Gtk.IconSize.BUTTON); image.valign = Gtk.Align.CENTER; tooltip_markup = Granite.markup_accel_tooltip ({"Return"}, _("Run Query")); } } public class ParamEntry : Gtk.Entry { public ParamEntry (Widgets.QueryParamsDialog dialog, Gtk.InputPurpose? purpose = null) { hexpand = true; if (purpose != null) { set_input_purpose (purpose); } activate.connect (() => { dialog.run_query (); }); } } } sequeler-0.8.2/src/Partials/LibraryItem.vala000066400000000000000000000252361410464306200210140ustar00rootroot00000000000000/* * Copyright (c) 2017-2020 Alecaddd (https://alecaddd.com) * * 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 2 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, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Alessandro "Alecaddd" Castellani */ public class Sequeler.Partials.LibraryItem : Gtk.ListBoxRow { public Gee.HashMap data { get; set; } public Gtk.Label title; public Gdk.RGBA color; public Gtk.Revealer main_revealer; private Gtk.Revealer motion_revealer; public Gtk.ModelButton connect_button; public Gtk.Spinner spinner; public Gtk.ScrolledWindow scrolled { get; set; } private bool scroll_up = false; private bool scrolling = false; private bool should_scroll = false; public Gtk.Adjustment vadjustment; private const int SCROLL_STEP_SIZE = 5; private const int SCROLL_DISTANCE = 30; private const int SCROLL_DELAY = 50; public signal void edit_dialog (Gee.HashMap data); public signal void duplicate_connection (Gee.HashMap data); public signal void confirm_delete ( Gtk.ListBoxRow item, Gee.HashMap data ); public signal void connect_to ( Gee.HashMap data, Gtk.Spinner spinner, Gtk.ModelButton button ); // Datatype restrictions on DnD (Gtk.TargetFlags). const Gtk.TargetEntry[] TARGET_ENTRIES_LABEL = { { "LIBRARYITEM", Gtk.TargetFlags.SAME_APP, 0 } }; public LibraryItem (Gee.HashMap data) { Object ( data: data ); get_style_context ().add_class ("library-box"); expand = true; var box = new Gtk.Grid (); box.get_style_context ().add_class ("library-inner-box"); box.margin = 3; var color_box = new Gtk.Grid (); color_box.get_style_context ().add_class ("library-colorbox"); color_box.set_size_request (12, 12); color_box.margin = 9; color = Gdk.RGBA (); color.parse (data["color"]); try { var style = new Gtk.CssProvider (); style.load_from_data ( "* {background-color: %s;}".printf (color.to_string ()), -1 ); color_box.get_style_context ().add_provider ( style, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION ); } catch (Error e) { debug ( "Internal error loading session chooser style: %s", e.message ); } title = new Gtk.Label (data["title"]); title.get_style_context ().add_class ("text-bold"); title.halign = Gtk.Align.START; title.ellipsize = Pango.EllipsizeMode.END; title.margin_end = 9; title.set_line_wrap (true); title.hexpand = true; box.attach (color_box, 0, 0, 1, 1); box.attach (title, 1, 0, 1, 1); connect_button = new Gtk.ModelButton (); connect_button.text = _("Connect"); var edit_button = new Gtk.ModelButton (); edit_button.text = _("Edit Connection"); var duplicate_button = new Gtk.ModelButton (); duplicate_button.text = _("Duplicate Connection"); var delete_button = new Gtk.ModelButton (); delete_button.text = _("Delete Connection"); var open_menu = new Gtk.MenuButton (); open_menu.set_image ( new Gtk.Image.from_icon_name ( "view-more-symbolic", Gtk.IconSize.SMALL_TOOLBAR ) ); open_menu.get_style_context ().add_class ("library-btn"); open_menu.tooltip_text = _("Options"); var menu_separator = new Gtk.Separator (Gtk.Orientation.HORIZONTAL); menu_separator.margin_top = 6; menu_separator.margin_bottom = 6; var menu_grid = new Gtk.Grid (); menu_grid.expand = true; menu_grid.margin_top = 3; menu_grid.margin_bottom = 3; menu_grid.orientation = Gtk.Orientation.VERTICAL; menu_grid.attach (connect_button, 0, 1, 1, 1); menu_grid.attach (edit_button, 0, 2, 1, 1); menu_grid.attach (duplicate_button, 0, 3, 1, 1); menu_grid.attach (menu_separator, 0, 4, 1, 1); menu_grid.attach (delete_button, 0, 5, 1, 1); menu_grid.show_all (); var menu_popover = new Gtk.Popover (null); menu_popover.add (menu_grid); open_menu.popover = menu_popover; open_menu.relief = Gtk.ReliefStyle.NONE; open_menu.valign = Gtk.Align.CENTER; spinner = new Gtk.Spinner (); box.attach (spinner, 2, 0, 1, 1); box.attach (open_menu, 3, 0, 1, 1); var motion_grid = new Gtk.Grid (); motion_grid.margin = 6; motion_grid.get_style_context ().add_class ("grid-motion"); motion_grid.height_request = 18; motion_revealer = new Gtk.Revealer (); motion_revealer.transition_type = Gtk.RevealerTransitionType.SLIDE_DOWN; motion_revealer.add (motion_grid); box.attach (motion_revealer, 0, 1, 4, 1); var event_box = new Gtk.EventBox (); event_box.add (box); main_revealer = new Gtk.Revealer (); main_revealer.reveal_child = true; main_revealer.transition_type = Gtk.RevealerTransitionType.SLIDE_DOWN; main_revealer.add (event_box); add (main_revealer); delete_button.clicked.connect (() => { confirm_delete (this, data); }); edit_button.clicked.connect (() => { edit_dialog (data); }); duplicate_button.clicked.connect (() => { duplicate_connection (data); }); connect_button.clicked.connect (() => { spinner.start (); connect_button.sensitive = false; connect_to (data, spinner, connect_button); }); event_box.enter_notify_event.connect (event => { box.set_state_flags (Gtk.StateFlags.PRELIGHT, true); return false; }); event_box.leave_notify_event.connect (event => { if (event.detail != Gdk.NotifyType.INFERIOR) { box.set_state_flags (Gtk.StateFlags.NORMAL, true); } return false; }); open_menu.clicked.connect (event => { box.set_state_flags (Gtk.StateFlags.PRELIGHT, true); }); menu_popover.closed.connect (event => { box.set_state_flags (Gtk.StateFlags.NORMAL, true); }); build_drag_and_drop (); } private void build_drag_and_drop () { // Make this a draggable widget Gtk.drag_source_set ( this, Gdk.ModifierType.BUTTON1_MASK, TARGET_ENTRIES_LABEL, Gdk.DragAction.MOVE ); drag_begin.connect (on_drag_begin); drag_data_get.connect (on_drag_data_get); // Make this widget a DnD destination. Gtk.drag_dest_set ( this, Gtk.DestDefaults.MOTION, TARGET_ENTRIES_LABEL, Gdk.DragAction.MOVE ); drag_motion.connect (on_drag_motion); drag_leave.connect (on_drag_leave); drag_end.connect (clear_indicator); } private void on_drag_begin (Gtk.Widget widget, Gdk.DragContext context) { var row = (Partials.LibraryItem) widget; Gtk.Allocation alloc; row.get_allocation (out alloc); var surface = new Cairo.ImageSurface (Cairo.Format.ARGB32, alloc.width, alloc.height); var cr = new Cairo.Context (surface); cr.set_source_rgba (0, 0, 0, 0.3); cr.set_line_width (1); cr.move_to (0, 0); cr.line_to (alloc.width, 0); cr.line_to (alloc.width, alloc.height); cr.line_to (0, alloc.height); cr.line_to (0, 0); cr.stroke (); cr.set_source_rgba (255, 255, 255, 0.5); cr.rectangle (0, 0, alloc.width, alloc.height); cr.fill (); row.draw (cr); Gtk.drag_set_icon_surface (context, surface); main_revealer.reveal_child = false; } private void on_drag_data_get (Gtk.Widget widget, Gdk.DragContext context, Gtk.SelectionData selection_data, uint target_type, uint time) { uchar[] data = new uchar[(sizeof (Partials.LibraryItem))]; ((Gtk.Widget[])data)[0] = widget; selection_data.set ( Gdk.Atom.intern_static_string ("LIBRARYITEM"), 32, data ); } public void clear_indicator (Gdk.DragContext context) { main_revealer.reveal_child = true; } public bool on_drag_motion (Gdk.DragContext context, int x, int y, uint time) { motion_revealer.reveal_child = true; int index = get_index (); Gtk.Allocation alloc; get_allocation (out alloc); int real_y = (index * alloc.height) - alloc.height + y; check_scroll (real_y); if (should_scroll && !scrolling) { scrolling = true; Timeout.add (SCROLL_DELAY, scroll); } return true; } private void check_scroll (int y) { vadjustment = scrolled.vadjustment; if (vadjustment == null) { return; } double vadjustment_min = vadjustment.value; double vadjustment_max = vadjustment.page_size + vadjustment_min; double show_min = double.max (0, y - SCROLL_DISTANCE); double show_max = double.min (vadjustment.upper, y + SCROLL_DISTANCE); if (vadjustment_min > show_min) { should_scroll = true; scroll_up = true; } else if (vadjustment_max < show_max) { should_scroll = true; scroll_up = false; } else { should_scroll = false; } } private bool scroll () { if (should_scroll) { if (scroll_up) { vadjustment.value -= SCROLL_STEP_SIZE; } else { vadjustment.value += SCROLL_STEP_SIZE; } } else { scrolling = false; } return should_scroll; } public void on_drag_leave (Gdk.DragContext context, uint time) { motion_revealer.reveal_child = false; should_scroll = false; } } sequeler-0.8.2/src/Partials/TreeBuilder.vala000066400000000000000000000160631410464306200207750ustar00rootroot00000000000000/* * Copyright (c) 2011-2019 Alecaddd (http://alecaddd.com) * * 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 2 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, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Alessandro "Alecaddd" Castellani */ public class Sequeler.Partials.TreeBuilder : Gtk.TreeView { public weak Sequeler.Window window { get; construct; } public Gda.DataModel data { get; construct; } public int per_page { get; construct; } public int current_page { get; construct; } public string? sortby { get; set construct; } public string sort { get; set construct; } public Gtk.ListStore store; public string? error_message { get; set; default = null; } public string background; public int tot_columns; private string bg_light = "rgba(255,255,255,0.05)"; private string bg_dark = "rgba(0,0,0,0.05)"; public signal void sortby_column (string column, string direction); public TreeBuilder ( Gda.DataModel response, Sequeler.Window main_window, int per_page = 0, int current_page = 0, string? sortby = null, string sort = "ASC" ) { Object ( window: main_window, data: response, per_page: per_page, current_page: current_page, sortby: sortby, sort: sort ); } construct { Gtk.TreeViewColumn column; var renderer = new Gtk.CellRendererText (); renderer.single_paragraph_mode = true; tot_columns = data.get_n_columns (); var the_types = new GLib.Type [tot_columns + 1]; for (int col = 0; col < tot_columns; col++) { the_types[col] = data.describe_column (col).get_g_type (); var title = data.get_column_title (col).replace ("_", "__"); column = new Gtk.TreeViewColumn.with_attributes (title, renderer, "text", col, "background", tot_columns, null); column.clickable = true; column.resizable = true; column.expand = true; column.set_data ("model_column_id", col); if (col > 0) { column.sizing = Gtk.TreeViewColumnSizing.FIXED; column.fixed_width = 150; } if (sortby != null && sortby.replace ("_", "__") == title) { column.sort_indicator = true; column.sort_order = sort == "ASC" ? Gtk.SortType.ASCENDING : Gtk.SortType.DESCENDING; } column.clicked.connect (init_sortby_column); append_column (column); } the_types[tot_columns] = typeof (string); store = new Gtk.ListStore.newv (the_types); Gda.DataModelIter _iter = data.create_iter (); Gtk.TreeIter iter; if (per_page != 0 && data.get_n_rows () > per_page) { int counter = 1; int offset = (per_page * (current_page - 1)); if (current_page != 0 && offset != 0) { _iter.move_to_row ((offset - 1)); } while (counter <= per_page && _iter.move_next ()) { append_value (_iter, iter); counter++; } } else { while (_iter.move_next ()) { append_value (_iter, iter); } } if (error_message != null) { window.main.connection_manager.query_warning (error_message); error_message = null; } set_model (store); } private void append_value (Gda.DataModelIter _iter, Gtk.TreeIter iter) { background = _iter.get_row () % 2 == 0 ? bg_light : bg_dark; store.append (out iter); for (int i = 0; i < tot_columns; i++) { var placeholder_type = data.describe_column (i).get_g_type (); try { var raw_value = _iter.get_value_at_e (i); var sanitized_value = raw_value.strdup_contents () != "NULL" ? raw_value : GLib.Value (placeholder_type); store.set_value (iter, i, sanitized_value); } catch (Error e) { error_message = "%s %s %s %s: %s".printf (_("Error"), e.code.to_string (), _("on Column"), data.get_column_title (i), e.message.to_string ()); } } store.set_value (iter, tot_columns, background); } public void init_sortby_column (Gtk.TreeViewColumn column) { // Detect sort order. sort = "ASC"; if (column.sort_order == Gtk.SortType.ASCENDING) { sort = "DESC"; } sortby_column (column.title.replace ("__", "_"), sort); } private void copy_column_data (Gdk.EventButton event, Gtk.TreePath path, Gtk.TreeViewColumn column) { if (path == null || column == null) { return; } Value val; Gtk.TreeIter iter; Gdk.Display display = Gdk.Display.get_default (); Gtk.Clipboard clipboard = Gtk.Clipboard.get_default (display); model.get_iter (out iter, path); model.get_value (iter, column.get_data ("model_column_id"), out val); Gda.DataHandler handler = Gda.DataHandler.get_default (val.type ()); string? column_data = handler.get_str_from_value (val); if (column_data == null) { column_data = ""; } clipboard.set_text (column_data, -1); } private Gtk.Menu create_context_menu (Gdk.EventButton event, Gtk.TreePath path, Gtk.TreeViewColumn column) { Gtk.Menu menu = new Gtk.Menu (); Gtk.MenuItem item = new Gtk.MenuItem.with_label (_("Copy %s").printf (column.get_title ())); item.activate.connect (() => { copy_column_data (event, path, column); }); item.show (); menu.append (item); /* Wayland complains if not set */ menu.realize.connect (() => { Gdk.Window child = menu.get_window (); child.set_type_hint (Gdk.WindowTypeHint.POPUP_MENU); }); return menu; } public override bool button_press_event (Gdk.EventButton event) { if (event.triggers_context_menu () && event.type == Gdk.EventType.BUTTON_PRESS) { Gtk.TreePath path; Gtk.TreeViewColumn column; get_path_at_pos ((int) event.x, (int) event.y, out path, out column, null, null); if (path != null) { var menu = create_context_menu (event, path, column); menu.popup_at_pointer (event); return true; } } return base.button_press_event (event); } } sequeler-0.8.2/src/Services/000077500000000000000000000000001410464306200157205ustar00rootroot00000000000000sequeler-0.8.2/src/Services/ActionManager.vala000066400000000000000000000237721410464306200213100ustar00rootroot00000000000000/* * Copyright (c) 2011-2018 Alecaddd (http://alecaddd.com) * * 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 2 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, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Alessandro "Alecaddd" Castellani */ public class Sequeler.Services.ActionManager : Object { public const int FONT_SIZE_MAX = 72; public const int FONT_SIZE_MIN = 7; public weak Sequeler.Application app { get; construct; } public weak Sequeler.Window window { get; construct; } public SimpleActionGroup actions { get; construct; } public const string ACTION_PREFIX = "win."; public const string ACTION_NEW_WINDOW = "action_new_window"; public const string ACTION_NEW_CONNECTION = "action_new_connection"; public const string ACTION_RUN_QUERY = "action_run_query"; public const string ACTION_LOGOUT = "action_logout"; public const string ACTION_QUIT = "action_quit"; public const string ACTION_ZOOM_DEFAULT = "action_zoom_default"; public const string ACTION_ZOOM_IN = "action_zoom_in"; public const string ACTION_ZOOM_OUT = "action_zoom_out"; public const string ACTION_NEW_DB = "action_new_db"; public const string ACTION_EDIT_DB = "action_edit_db"; public const string ACTION_DELETE_DB = "action_delete_db"; public static Gee.MultiMap action_accelerators = new Gee.HashMultiMap (); private const ActionEntry[] ACTION_ENTRIES = { { ACTION_NEW_WINDOW, action_new_window }, { ACTION_NEW_CONNECTION, action_new_connection }, { ACTION_RUN_QUERY, action_run_query }, { ACTION_LOGOUT, action_logout }, { ACTION_QUIT, action_quit }, { ACTION_ZOOM_DEFAULT, action_set_default_zoom }, { ACTION_ZOOM_IN, action_zoom_in }, { ACTION_ZOOM_OUT, action_zoom_out}, { ACTION_NEW_DB, action_new_db}, { ACTION_EDIT_DB, action_edit_db}, { ACTION_DELETE_DB, action_delete_db} }; public ActionManager (Sequeler.Application sequeler_app, Sequeler.Window main_window) { Object ( app: sequeler_app, window: main_window ); } static construct { action_accelerators.set (ACTION_NEW_WINDOW, "n"); action_accelerators.set (ACTION_NEW_CONNECTION, "n"); action_accelerators.set (ACTION_RUN_QUERY, "Return"); action_accelerators.set (ACTION_LOGOUT, "Escape"); action_accelerators.set (ACTION_QUIT, "q"); action_accelerators.set (ACTION_ZOOM_DEFAULT, "0"); action_accelerators.set (ACTION_ZOOM_DEFAULT, "KP_0"); action_accelerators.set (ACTION_ZOOM_IN, "plus"); action_accelerators.set (ACTION_ZOOM_IN, "equal"); action_accelerators.set (ACTION_ZOOM_IN, "KP_Add"); action_accelerators.set (ACTION_ZOOM_OUT, "minus"); action_accelerators.set (ACTION_ZOOM_OUT, "KP_Subtract"); action_accelerators.set (ACTION_NEW_DB, "N"); action_accelerators.set (ACTION_EDIT_DB, "P"); action_accelerators.set (ACTION_DELETE_DB, "D"); } construct { actions = new SimpleActionGroup (); actions.add_action_entries (ACTION_ENTRIES, this); window.insert_action_group ("win", actions); foreach (var action in action_accelerators.get_keys ()) { var accels_array = action_accelerators[action].to_array (); accels_array += null; app.set_accels_for_action (ACTION_PREFIX + action, accels_array); } } private void action_quit () { window.before_destroy (); } private void action_logout () { window.headerbar.toggle_logout.begin (); window.headerbar.title = APP_NAME; window.headerbar.subtitle = null; if (window.main.database_schema.scroll.get_child () != null) { window.main.database_schema.scroll.remove (window.main.database_schema.scroll.get_child ()); } if (window.main.database_view.query.n_tabs > 0) { (window.main.database_view.query.current.page as Layouts.Views.Query).buffer.text = ""; (window.main.database_view.query.current.page as Layouts.Views.Query).export_button.sensitive = false; } window.main.database_view.structure.reset.begin (); window.main.database_view.structure.table_name = ""; window.main.database_view.content.reset.begin (); window.main.database_view.content.table_name = ""; window.main.database_view.relations.reset.begin (); window.main.database_view.relations.table_name = ""; window.main.connection_closed (); window.data_manager.data = null; window.main.database_schema.hide_database_panel (); } private void action_new_window () { app.new_window (); } private void action_new_connection () { if (window.main.connection_manager != null) { return; } window.data_manager.data = null; if (window.connection_dialog == null) { window.connection_dialog = new Sequeler.Widgets.ConnectionDialog (window); window.connection_dialog.show_all (); window.connection_dialog.destroy.connect (() => { window.connection_dialog = null; }); } window.connection_dialog.present (); } private void action_run_query () { if (window.main.connection_manager == null) { return; } var page = (window.main.database_view.query.current.page as Layouts.Views.Query); var query = page.get_text ().strip (); if (query == "") { return; } page.run_query (query); } public static void action_from_group (string action_name, ActionGroup? action_group) { action_group.activate_action (action_name, null); } public void set_default_zoom () { Sequeler.settings.font = get_current_font () + " " + get_default_font_size ().to_string (); (window.main.database_view.query.current.page as Layouts.Views.Query).update_font_style (); } // Ctrl + scroll public void action_zoom_in () { zooming (Gdk.ScrollDirection.UP); } // Ctrl + scroll public void action_zoom_out () { zooming (Gdk.ScrollDirection.DOWN); } private void zooming (Gdk.ScrollDirection direction) { string font = get_current_font (); int font_size = (int) get_current_font_size (); if (Sequeler.settings.use_system_font) { Sequeler.settings.use_system_font = false; font = get_default_font (); font_size = (int) get_default_font_size (); } if (direction == Gdk.ScrollDirection.DOWN) { font_size --; if (font_size < FONT_SIZE_MIN) { return; } } else if (direction == Gdk.ScrollDirection.UP) { font_size ++; if (font_size > FONT_SIZE_MAX) { return; } } string new_font = font + " " + font_size.to_string (); Sequeler.settings.font = new_font; (window.main.database_view.query.current.page as Layouts.Views.Query).update_font_style (); } public string get_current_font () { string font = Sequeler.settings.font; string font_family = font.substring (0, font.last_index_of (" ")); return font_family; } public double get_current_font_size () { string font = Sequeler.settings.font; string font_size = font.substring (font.last_index_of (" ") + 1); return double.parse (font_size); } public string get_default_font () { string font = (window.main.database_view.query.current.page as Layouts.Views.Query).default_font; string font_family = font.substring (0, font.last_index_of (" ")); return font_family; } public double get_default_font_size () { string font = (window.main.database_view.query.current.page as Layouts.Views.Query).default_font; string font_size = font.substring (font.last_index_of (" ") + 1); return double.parse (font_size); } // Actions functions private void action_set_default_zoom () { set_default_zoom (); } // Show the Database Panel. private void action_new_db () { window.main.database_schema.show_database_panel (); } // Show the Database Panel to edit the currently selected database. private void action_edit_db () { window.main.database_schema.edit_database_name (); } // Ask confirmation to the user before deleting the database. private void action_delete_db () { var dialog = new Granite.MessageDialog.with_image_from_icon_name (_("Are you sure you want to delete this Database?"), _("All the tables and data will be deleted and you won’t be able to recover it."), "dialog-warning", Gtk.ButtonsType.CANCEL); dialog.transient_for = window; var suggested_button = new Gtk.Button.with_label (_("Yes, Delete!")); suggested_button.get_style_context ().add_class (Gtk.STYLE_CLASS_DESTRUCTIVE_ACTION); dialog.add_action_widget (suggested_button, Gtk.ResponseType.ACCEPT); dialog.show_all (); if (dialog.run () == Gtk.ResponseType.ACCEPT) { window.main.database_schema.delete_database.begin (); } dialog.destroy (); } } sequeler-0.8.2/src/Services/ConnectionManager.vala000066400000000000000000000507601410464306200221670ustar00rootroot00000000000000/* * Copyright (c) 2011-2019 Alecaddd (http://alecaddd.com) * * 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 2 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, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Alessandro "Alecaddd" Castellani */ public class Sequeler.Services.ConnectionManager : Object { public weak Sequeler.Window window { get; construct; } public Gee.HashMap data { get; construct; } private Object _db_type; public signal void ssh_tunnel_ready (); public signal void query_error (string error); public Object db_type { get { return _db_type; } set { _db_type = value; } } public Gda.Connection? connection { get; set; default = null; } public Gda.DataModel? output_select; public SSH2.Session session; int sock; int listensock; int forwardsock; bool ssh_tunnel_alive = false; [Flags] enum Auth { NONE, PASSWORD, PUBLICKEY } public ConnectionManager (Sequeler.Window window, Gee.HashMap data) { Object ( window: window, data: data ); } construct { switch (data["type"]) { case "MySQL": db_type = new Sequeler.Services.Types.MySQL (); break; case "MariaDB": db_type = new Sequeler.Services.Types.MySQL (); break; case "PostgreSQL": db_type = new Sequeler.Services.Types.PostgreSQL (); break; case "SQLite": db_type = new Sequeler.Services.Types.SQLite (); break; } fetch_password (); } public void fetch_password () { if (data["password"] == null) { data["password"] = ""; var loop = new MainLoop (); password_mngr.get_password_async.begin (data["id"], (obj, res) => { try { data["password"] = password_mngr.get_password_async.end (res); } catch (Error e) { debug ("Unable to get the password from libsecret"); } loop.quit (); }); loop.run (); } if (data["has_ssh"] == "true") { data["ssh_password"] = ""; var ssh_loop = new MainLoop (); password_mngr.get_password_async.begin (data["id"] + "9999", (obj, res) => { try { data["ssh_password"] = password_mngr.get_password_async.end (res); } catch (Error e) { debug ("Unable to get the SSH password from libsecret"); } ssh_loop.quit (); }); ssh_loop.run (); } } public void test () throws Error { if (data["password"] == null) { fetch_password (); } var connection_string = (db_type as DataBaseType).connection_string (data); debug ("connection string %s", connection_string); try { connection = Gda.Connection.open_from_string (null, connection_string, null, Gda.ConnectionOptions.NONE); } catch (Error e) { throw e; } if (connection.is_opened ()) { connection.close (); } } public void open () throws Error { if (data["password"] == null) { fetch_password (); } var connection_string = (db_type as DataBaseType).connection_string (data); debug ("connection string %s", connection_string); try { connection = Gda.Connection.open_from_string (null, connection_string, null, Gda.ConnectionOptions.NONE); } catch (Error e) { throw e; } debug ("open ends"); } public void ssh_tunnel_init (bool is_real) throws Error { try { ssh_tunnel_open (is_real); } catch (Error e) { debug (e.message); throw e; } } private void ssh_tunnel_open (bool is_real) throws Error { debug ("Opening tunnel %p", Thread.self ()); ssh_tunnel_alive = true; Quark q = Quark.from_string ("ssh-error-str"); var home_dir = Environment.get_home_dir (); // private key file var keyfile2 = home_dir + "/.ssh/id_rsa"; if (data.has_key ("ssh_identity_file") && data["ssh_identity_file"] != "") { keyfile2 = data["ssh_identity_file"]; } // public key file var keyfile1 = keyfile2 + ".pub"; // SSH credentials if password authentication is required var username = data["ssh_username"]; var password = data["ssh_password"]; // SSH HOST address and Port var server_ip = data["ssh_host"]; var server_port = data["ssh_port"] != "" ? (uint16) int.parse (data["ssh_port"]) : 22; // The IP address where the DB is available on your SSH var local_listenip = "127.0.0.1"; // The Port used by the DB on your SSH host uint16 local_listenport = 9000; // Default vars for TCPIP Tunnelling var remote_desthost = data["host"] != "" ? data["host"] : "127.0.0.1"; var remote_destport = data["port"] != "" ? int.parse (data["port"]) : 3306; var rc = SSH2.init (0); if (rc != SSH2.Error.NONE) { debug ("libssh2 initialization failed (%d)", rc); throw new Error.literal (q, 1, _("Libssh2 initialization failed (%d)").printf (rc)); } debug ("Socket params: %s %d", server_ip, server_port); /* Connect to SSH server */ sock = Posix.socket (Posix.AF_INET, Posix.SOCK_STREAM, Posix.IPProto.TCP); if (sock == -1) { debug ("Failed to open socket"); throw new Error.literal (q, 1, _("Failed to open socket")); } Posix.SockAddrIn sin = Posix.SockAddrIn (); sin.sin_family = Posix.AF_INET; sin.sin_addr.s_addr = Posix.inet_addr (server_ip); sin.sin_port = Posix.htons (server_port); if (Posix.connect (sock, &sin, sizeof (Posix.SockAddrIn)) != 0) { debug ("Failed to connect!"); throw new Error.literal (q, 1, _("Failed to connect!")); } /* Create a session instance */ session = SSH2.Session.create (); /* …start it up. This will trade welcome banners, exchange keys, * and setup crypto, compression, and MAC layers */ rc = session.handshake (sock); if (rc != SSH2.Error.NONE) { debug ("Error when starting up SSH session: %d", rc); throw new Error.literal (q, 1, _("Error when starting up SSH session: %d").printf (rc)); } /* check what authentication methods are available */ int auth_pw = 0; var userauthlist = session.list_authentication (username.data); debug ("Authentication methods: %s", userauthlist); if ("password" in userauthlist) { auth_pw |= Auth.PASSWORD; } if ("publickey" in userauthlist) { auth_pw |= Auth.PUBLICKEY; } if ((auth_pw & Auth.PASSWORD) != 0) { if (session.auth_password (username, password) != SSH2.Error.NONE) { debug ("Authentication by password failed."); ssh_tunnel_close (Log.FILE + ":" + Log.LINE.to_string ()); throw new Error.literal (q, 1, _("Authentication by password failed!")); } } else if ((auth_pw & Auth.PUBLICKEY) != 0) { if (session.auth_publickey_from_file (username, keyfile1, keyfile2, password ) != SSH2.Error.NONE) { debug ("Authentication by public key failed!"); ssh_tunnel_close (Log.FILE + ":" + Log.LINE.to_string ()); throw new Error.literal (q, 1, _("Authentication by public key failed!")); } debug ("Authentication by public key succeeded."); } else { debug ("No supported authentication methods found!"); ssh_tunnel_close (Log.FILE + ":" + Log.LINE.to_string ()); throw new Error.literal (q, 1, _("No supported authentication methods found!")); } listensock = Posix.socket (Posix.AF_INET, Posix.SOCK_STREAM, Posix.IPProto.TCP); if (listensock == -1) { debug ("failed to open listen socket"); ssh_tunnel_close (Log.FILE + ":" + Log.LINE.to_string ()); throw new Error.literal (q, 1, _("Failed to open listen socket")); } debug ("listensock %d", listensock); sin = Posix.SockAddrIn (); sin.sin_family = Posix.AF_INET; sin.sin_addr.s_addr = Posix.inet_addr (local_listenip); sin.sin_port = Posix.htons (local_listenport); var sockopt = 1; Posix.setsockopt (listensock, Linux.Socket.SOL_SOCKET, Linux.Socket.SO_REUSEADDR, &sockopt, (Posix.socklen_t) sizeof (int)); if (Posix.bind (listensock, &sin, sizeof (Posix.SockAddrIn)) == -1) { debug ("Failed to bind!"); ssh_tunnel_close (Log.FILE + ":" + Log.LINE.to_string ()); throw new Error.literal (q, 1, _("Failed to bind. Your Database Port may be wrong!")); } if (Posix.listen (listensock, 2) == -1) { debug ("Failed to listen!"); ssh_tunnel_close (Log.FILE + ":" + Log.LINE.to_string ()); throw new Error.literal (q, 1, _("Failed to listen!")); } debug ("Waiting for TCP connection on %s:%d…", local_listenip, local_listenport); bool signal_launched = false; while (ssh_tunnel_alive) { if (!signal_launched) { signal_launched = true; ssh_tunnel_ready (); } else { if (!is_real) { ssh_tunnel_close (Log.FILE + ":" + Log.LINE.to_string ()); return; } } debug ("Waiting for remote connection %p", Thread.self ()); forwardsock = Posix.accept (listensock, null, null); debug ("forwardsock %d", forwardsock); if (forwardsock == -1) { debug ("Failed to accept!"); ssh_tunnel_close (Log.FILE + ":" + Log.LINE.to_string ()); throw new Error.literal (q, 1, _("Failed to accept remote connection!")); } debug ("Forwarding connection from %s:%d here to remote %s:%d", local_listenip, local_listenport, remote_desthost, remote_destport); var channel = session.direct_tcpip (remote_desthost, remote_destport, local_listenip, local_listenport); if (channel == null) { debug ("Could not open the direct-tcpip channel! (Note that this can be a problem at the server! Please review the server logs.)"); ssh_tunnel_close (Log.FILE + ":" + Log.LINE.to_string ()); throw new Error.literal (q, 1, _("Could not open the direct-tcpip channel! (Note that this can be a problem at the server! Please review the server logs.)")); } session.blocking = false; uint8[] buf = new uint8[16384]; while (ssh_tunnel_alive) { Posix.fd_set fds; Posix.FD_ZERO (out fds); Posix.FD_SET (forwardsock, ref fds); Posix.timeval tv = {0, 100000}; var res = Posix.select (forwardsock + 1, &fds, null, null, tv); if (-1 == res) { debug ("Error on select!"); if (is_real) { ssh_tunnel_close (Log.FILE + ":" + Log.LINE.to_string ()); } // direct_shutdown (); break; } if (res > 0 && Posix.FD_ISSET (forwardsock, fds) > 0) { var len = Posix.recv (forwardsock, buf, 16384, 0); if (len < 0) { debug ("Error reading from the forwardsock!"); ssh_tunnel_close (Log.FILE + ":" + Log.LINE.to_string ()); break; } else if (0 == len) { debug ("The client at %s:%d disconnected!", local_listenip, local_listenport); debug ("connection manager %p", this); if (is_real) { direct_shutdown (); } break; } ssize_t wr = 0; ssize_t i = 0; do { i = channel.write (buf[wr:len]); if (i < 0) { debug ("Error writing on the SSH channel: %s", i.to_string ()); ssh_tunnel_close (Log.FILE + ":" + Log.LINE.to_string ()); // direct_shutdown (); break; } wr += i; } while (i > 0 && wr < len); } while (ssh_tunnel_alive) { ssize_t len = channel.read (buf); if (SSH2.Error.AGAIN == len) break; else if (len < 0) { debug ("Error reading from the SSH channel: %d", (int) len); ssh_tunnel_close (Log.FILE + ":" + Log.LINE.to_string ()); // direct_shutdown (); break; } ssize_t wr = 0; while (wr < len) { ssize_t i = Posix.send (forwardsock, buf[wr:buf.length], len - wr, 0); if (i <= 0) { debug ("Error writing on the forwardsock!"); ssh_tunnel_close (Log.FILE + ":" + Log.LINE.to_string ()); // direct_shutdown (); break; } wr += i; } if (channel.eof () != SSH2.Error.NONE) { debug ("The remote client at %s:%d disconnected!", remote_desthost, remote_destport); if (is_real) { ssh_tunnel_close (Log.FILE + ":" + Log.LINE.to_string ()); // direct_shutdown (); } break; } } } } } public void ssh_tunnel_close (string from = "Unknown") { debug ("closing ssh tunnel from: %s %p", from, Thread.self ()); ssh_tunnel_alive = false; // debug ("closing listensock: %d", listensock); Posix.close (listensock); listensock = -1; // debug ("listensock closed: %d", listensock); // debug ("closing forwardsock: %d", forwardsock); Posix.close (forwardsock); forwardsock = -1; // debug ("forwardsock closed: %d", forwardsock); if (session != null) { session.disconnect ("Client disconnecting normally"); session.blocking = false; session = null; } Posix.close (sock); sock = -1; SSH2.exit (); } private void direct_shutdown () { session.blocking = true; Posix.close (forwardsock); forwardsock = -1; } public async int run_query (string query) throws Error requires (connection.is_opened ()) { return connection.execute_non_select_command (query); } public async string run_silent_statement (Gda.Statement statement, Gda.Set? params) throws Error requires (connection.is_opened ()) { var result = connection.statement_execute_non_select (statement, params, null); return result.to_string (); } public Gda.DataModel? run_silent_select_statement (Gda.Statement statement, Gda.Set? params) throws Error requires (connection.is_opened ()) { return connection.statement_execute_select (statement, params); } public Gda.DataModel? run_select (string query) throws Error { return connection.execute_select_command (query); } public async Gee.HashMap init_connection () throws ThreadError { var output = new Gee.HashMap (); output["status"] = "false"; bool result = true; string msg = ""; SourceFunc callback = init_connection.callback; new Thread (null, () => { try { debug ("pass init connection"); open (); } catch (Error e) { result = false; msg = e.message; } Idle.add ((owned) callback); Thread.exit (null); return null; }); yield; output["msg"] = msg; output["status"] = result.to_string (); return output; } public Gda.Statement parse_sql_string (string sql, out Gda.Set @params) throws Error { return connection.parse_sql_string (sql, out params); } public async Gda.DataModel? init_select_query (string query) { Gda.DataModel? result = null; var error = ""; SourceFunc callback = init_select_query.callback; new Thread (null, () => { try { result = run_select (query); } catch (Error e) { error = e.message; result = null; } Idle.add ((owned) callback); Thread.exit (null); return null; }); yield; if (error != "") { query_warning (error); return null; } return result; } public async Gee.HashMap init_silent_select_statement (Gda.Statement statement, Gda.Set? params) { var result = new Gee.HashMap (); Gda.DataModel? data = null; var error = ""; SourceFunc callback = init_silent_select_statement.callback; new Thread (null, () => { try { data = run_silent_select_statement (statement, params); } catch (Error e) { error = e.message; data = null; } Idle.add ((owned) callback); Thread.exit (null); return null; }); yield; result.@set (data, error); return result; } public async int? init_query (string query) { int result = 0; var error = ""; try { result = yield run_query (query); } catch (Error e) { error = e.message; } if (error != "") { query_warning (error); return null; } return result; } public async Gee.HashMap init_silent_statement (Gda.Statement statement, Gda.Set? params) { var result = new Gee.HashMap (); string? data = null; var error = ""; try { data = yield run_silent_statement (statement, params); } catch (Error e) { error = e.message; } if (error != "") { data = null; } result.@set (data, error); return result; } public void query_warning (string message) { var message_dialog = new Granite.MessageDialog.with_image_from_icon_name (_("Error!"), message, "dialog-error", Gtk.ButtonsType.NONE); message_dialog.transient_for = window; var suggested_button = new Gtk.Button.with_label ("Close"); message_dialog.add_action_widget (suggested_button, Gtk.ResponseType.ACCEPT); message_dialog.show_all (); if (message_dialog.run () == Gtk.ResponseType.ACCEPT) {} message_dialog.destroy (); } } sequeler-0.8.2/src/Services/DataManager.vala000066400000000000000000000020621410464306200207310ustar00rootroot00000000000000/* * Copyright (c) 2011-2018 Alecaddd (http://alecaddd.com) * * 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 2 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, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Alessandro "Alecaddd" Castellani */ public class Sequeler.Services.DataManager : Object { private Gee.HashMap? _data = null; public Gee.HashMap? data { get { return _data; } set { _data = value; } } } sequeler-0.8.2/src/Services/PasswordManager.vala000066400000000000000000000057421410464306200216720ustar00rootroot00000000000000/* * Copyright (c) 2011-2018 Alecaddd (http://alecaddd.com) * * 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 2 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, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Alessandro "Alecaddd" Castellani */ public class Sequeler.Services.PasswordManager : Object { // Store Password Async public async void store_password_async (string id, string password) throws Error { var attributes = new GLib.HashTable (str_hash, str_equal); attributes["id"] = id; attributes["schema"] = Constants.PROJECT_NAME; var key_name = Constants.PROJECT_NAME + "." + id; bool result = yield Secret.password_storev (schema, attributes, Secret.COLLECTION_DEFAULT, key_name, password, null); if (! result) { debug ("Unable to store password for \"%s\" in libsecret keyring", key_name); } } // Get Password Async public async string? get_password_async (string id) throws Error { var attributes = new GLib.HashTable (str_hash, str_equal); attributes["id"] = id; attributes["schema"] = Constants.PROJECT_NAME; var key_name = Constants.PROJECT_NAME + "." + id; string? password = yield Secret.password_lookupv (schema, attributes, null); if (password == null) { debug ("Unable to fetch password in libsecret keyring for %s", key_name); } return password; } // Delete Password Async public async void clear_password_async (string id) throws Error { var attributes = new GLib.HashTable (str_hash, str_equal); attributes["id"] = id; attributes["schema"] = Constants.PROJECT_NAME; var key_name = Constants.PROJECT_NAME + "." + id; bool removed = yield Secret.password_clearv (schema, attributes, null); if (! removed) { debug ("Unable to clear password in libsecret keyring for %s", key_name); } } // Delete All Passwords public async void clear_all_passwords_async () throws Error { var attributes = new GLib.HashTable (str_hash, str_equal); attributes["schema"] = Constants.PROJECT_NAME; bool removed = yield Secret.password_clearv (schema, attributes, null); if (! removed) { debug ("Unable to clear all passwords in libsecret"); } } } sequeler-0.8.2/src/Services/Settings.vala000066400000000000000000000170311410464306200203670ustar00rootroot00000000000000/* * Copyright (c) 2017-2020 Alecaddd (https://alecaddd.com) * * 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 2 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, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Alessandro "Alecaddd" Castellani */ public class Sequeler.Services.Settings : GLib.Settings { public int pos_x { get { return get_int ("pos-x"); } set { set_int ("pos-x", value); } } public int pos_y { get { return get_int ("pos-y"); } set { set_int ("pos-y", value); } } public int window_width { get { return get_int ("window-width"); } set { set_int ("window-width", value); } } public int window_height { get { return get_int ("window-height"); } set { set_int ("window-height", value); } } public int sidebar_width { get { return get_int ("sidebar-width"); } set { set_int ("sidebar-width", value); } } public string[] saved_connections { owned get { return get_strv ("saved-connections"); } set { set_strv ("saved-connections", value); } } public int tot_connections { get { return get_int ("tot-connections"); } set { set_int ("tot-connections", value); } } public int limit_results { get { return get_int ("limit-results"); } set { set_int ("limit-results", value); } } public bool dark_theme { get { return get_boolean ("dark-theme"); } set { set_boolean ("dark-theme", value); } } public bool save_quick { get { return get_boolean ("save-quick"); } set { set_boolean ("save-quick", value); } } public string version { owned get { return get_string ("version"); } set { set_string ("version", value); } } public bool use_system_font { get { return get_boolean ("use-system-font"); } set { set_boolean ("use-system-font", value); } } public string font { owned get { return get_string ("font"); } set { set_string ("font", value); } } public string style_scheme { owned get { return get_string ("style-scheme"); } set { set_string ("style-scheme", value); } } public int query_area { get { return get_int ("query-area"); } set { set_int ("query-area", value); } } public Settings () { Object (schema_id: Constants.PROJECT_NAME); } public void add_connection (Gee.HashMap data) { if (data["type"] != "SQLite") { update_password.begin (data); data.unset ("password"); data.unset ("ssh_password"); } var conns = get_strv ("saved-connections"); conns += stringify_data (data); set_strv ("saved-connections", conns); tot_connections = tot_connections + 1; } public async void duplicate_connection (Gee.HashMap data) { data["id"] = tot_connections.to_string (); data["title"] = _("%s (copy)").printf (data["title"]); add_connection (data); } public void edit_connection (Gee.HashMap new_data, string old_data) { var position = 0; Gee.List existing_connections = new Gee.ArrayList (); existing_connections.add_all_array (saved_connections); if (existing_connections.contains (old_data)) { position = existing_connections.index_of (old_data); existing_connections.remove (old_data); } if (new_data["type"] != "SQLite") { update_password.begin (new_data); new_data.unset ("password"); if (new_data["has_ssh"] == "true" && new_data["ssh_password"] != null) { update_ssh_password.begin (new_data); new_data.unset ("ssh_password"); } } existing_connections.insert (position, stringify_data (new_data)); string[] new_conns = {}; foreach (var conn in existing_connections.to_array ()) { new_conns += conn; } set_strv ("saved-connections", new_conns); } public void delete_connection (Gee.HashMap data) { string[] new_conns = {}; var conns = get_strv ("saved-connections"); if (data["type"] != "SQLite") { delete_password.begin (data); } foreach (var conn in conns) { var check = arraify_data (conn); if (check["id"] == data["id"]) { continue; } new_conns += conn; } set_strv ("saved-connections", new_conns); } public void clear_connections () { string[] empty = {}; set_strv ("saved-connections", empty); tot_connections = 0; delete_all_passwords.begin (); } public void reorder_connection (Gee.HashMap source, int position) { Gee.ArrayList existing_connections = new Gee.ArrayList (); existing_connections.add_all_array (saved_connections); foreach (var conn in saved_connections) { var check = arraify_data (conn); if (check["id"] == source["id"]) { existing_connections.remove (conn); } } existing_connections.insert (position, stringify_data (source)); string[] new_conns = {}; foreach (var conn in existing_connections.to_array ()) { new_conns += conn; } set_strv ("saved-connections", new_conns); } public string stringify_data (Gee.HashMap data) { string result = ""; foreach (var entry in data.entries) { string values = "%s=%s\n".printf (entry.key, entry.value); result = result + values; } return result; } public Gee.HashMap arraify_data (string connection) { var array = new Gee.HashMap (); var data = connection.split ("\n"); foreach (var d in data) { var d2 = d.split ("=", 2); if (d2[0] == null) { continue; } array.set (d2[0], d2[1]); } return array; } public async void update_password (Gee.HashMap data) throws Error { yield password_mngr.store_password_async (data["id"], data["password"]); } public async void update_ssh_password (Gee.HashMap data) throws Error { yield password_mngr.store_password_async (data["id"] + "9999", data["ssh_password"]); } public async void delete_password (Gee.HashMap data) throws Error { yield password_mngr.clear_password_async (data["id"]); if (data["has_ssh"] == "true" && data["ssh_password"] != null) { yield password_mngr.clear_password_async (data["id"] + "9999"); } } public async void delete_all_passwords () throws Error { yield password_mngr.clear_all_passwords_async (); } } sequeler-0.8.2/src/Services/Types/000077500000000000000000000000001410464306200170245ustar00rootroot00000000000000sequeler-0.8.2/src/Services/Types/DataBaseType.vala000066400000000000000000000043351410464306200222040ustar00rootroot00000000000000/* * Copyright (c) 2011-2018 Alecaddd (http://alecaddd.com) * * 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 2 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, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Alessandro "Alecaddd" Castellani */ public interface DataBaseType : Object { /* * Connect to the database */ public abstract string connection_string (Gee.HashMap data); /* * Populate dropdown database selection */ public abstract string show_schema (); /* * Populate sidebar with table list */ public abstract string show_table_list (string name); /* * Update table name */ public abstract string edit_table_name (string old_table, string new_table); /* * Transfer a table from a Database to another */ public abstract string transfer_table (string old_database, string table, string new_database); /* * Show table structure */ public abstract string show_table_structure (string table, string? sortby = null, string sort = "ASC"); /* * Show table content */ public abstract string show_table_content ( string table, int? count = null, int? page = null, string? sortby = null, string sort = "ASC" ); /* * Show table relations */ public abstract string show_table_relations ( string table, string? database, string? sortby = null, string sort = "ASC" ); /* * Create database */ public abstract string create_database (string name); /* * Delete database */ public abstract string delete_database (string name); } sequeler-0.8.2/src/Services/Types/MySQL.vala000066400000000000000000000101551410464306200206400ustar00rootroot00000000000000/* * Copyright (c) 2011-2019 Alecaddd (https://alecaddd.com) * * 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 2 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, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Alessandro "Alecaddd" Castellani */ public class Sequeler.Services.Types.MySQL : Object, DataBaseType { public string port { set; get; default = "3306"; } public string host { set; get; default = "127.0.0.1"; } public string connection_string (Gee.HashMap data) { var username = Gda.rfc1738_encode (data["username"]); var password = Gda.rfc1738_encode (data["password"]); var use_ssl = Gda.rfc1738_encode (data["use_ssl"] ?? "false"); var name = Gda.rfc1738_encode (data["name"]); if (data["has_ssh"] == "true") { port = "9000"; host = "127.0.0.1"; } else { port = data["port"] != "" ? data["port"] : port; host = data["host"] != "" ? Gda.rfc1738_encode (data["host"]) : host; } return "MySQL://" + username + ":" + password + "@DB_NAME=" + name + ";HOST=" + host + ";PORT=" + port + ";USE_SSL=" + use_ssl; } public string show_schema () { return "SHOW SCHEMAS"; } public string show_table_list (string name) { return "SELECT table_name, table_rows FROM information_schema.TABLES WHERE TABLE_SCHEMA = '%s'".printf (name); } public string edit_table_name (string old_table, string new_table) { return "RENAME TABLE %s TO %s".printf (old_table, new_table); } public string transfer_table (string old_database, string table, string new_database) { return "RENAME TABLE %s.%s TO %s.%s".printf (old_database, table, new_database, table); } public string show_table_structure (string table, string? sortby = null, string sort = "ASC") { var output = "SELECT COLUMN_NAME, ORDINAL_POSITION, COLUMN_DEFAULT, IS_NULLABLE, CHARACTER_SET_NAME, COLLATION_NAME, COLUMN_TYPE, COLUMN_KEY, EXTRA, COLUMN_COMMENT FROM information_schema.COLUMNS WHERE table_name = '%s' AND table_schema = DATABASE()".printf (table); if (sortby != null) { output += " ORDER BY %s %s".printf (sortby, sort); } return output; } public string show_table_content ( string table, int? count = null, int? page = null, string? sortby = null, string sort = "ASC" ) { var output = "SELECT * FROM %s".printf (table); if (sortby != null) { output += " ORDER BY %s %s".printf (sortby, sort); } if (count != null && count > settings.limit_results) { output += " LIMIT %i".printf (settings.limit_results); } if (page != null && page > 1) { output += " OFFSET %i".printf (settings.limit_results * (page - 1)); } return output; } public string show_table_relations ( string table, string? database, string? sortby = null, string sort = "ASC" ) { var output = "SELECT COLUMN_NAME, CONSTRAINT_NAME, REFERENCED_COLUMN_NAME, REFERENCED_TABLE_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE TABLE_NAME = '%s' AND TABLE_SCHEMA = '%s'".printf (table, database); if (sortby != null) { output += " ORDER BY %s %s".printf (sortby, sort); } return output; } public string create_database (string name) { return "CREATE DATABASE %s".printf (name); } public string delete_database (string name) { return "DROP DATABASE %s".printf (name); } } sequeler-0.8.2/src/Services/Types/PostgreSQL.vala000066400000000000000000000107251410464306200217010ustar00rootroot00000000000000/* * Copyright (c) 2011-2019 Alecaddd (https://alecaddd.com) * * 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 2 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, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Alessandro "Alecaddd" Castellani */ public class Sequeler.Services.Types.PostgreSQL : Object, DataBaseType { public string port { set; get; default = "5432"; } public string host { set; get; default = "127.0.0.1"; } public string connection_string (Gee.HashMap data) { var username = Gda.rfc1738_encode (data["username"]); var password = Gda.rfc1738_encode (data["password"]); var use_ssl = Gda.rfc1738_encode (data["use_ssl"] ?? "false"); var name = Gda.rfc1738_encode (data["name"]); host = data["host"] != "" ? Gda.rfc1738_encode (data["host"]) : host; if (data["has_ssh"] == "true") { port = "9000"; } else { port = data["port"] != "" ? data["port"] : port; } return "PostgreSQL://" + username + ":" + password + "@DB_NAME=" + name + ";HOST=" + host + ";PORT=" + port + ";USE_SSL=" + use_ssl; } public string show_schema () { return "SELECT schema_name FROM information_schema.schemata"; } public string show_table_list (string name) { return "SELECT relname, reltuples FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE nspname NOT IN ('pg_catalog', 'information_schema') AND relkind='r' ORDER BY relname DESC;"; } public string edit_table_name (string old_table, string new_table) { return "ALTER TABLE \"%s\" RENAME TO \"%s\"".printf (old_table, new_table); } public string transfer_table (string old_database, string table, string new_database) { return ""; } public string show_table_structure (string table, string? sortby = null, string sort = "ASC") { var output = "SELECT * FROM information_schema.COLUMNS WHERE table_name='%s'".printf (table); if (sortby != null) { output += " ORDER BY %s %s".printf (sortby, sort); } return output; } public string show_table_content ( string table, int? count = null, int? page = null, string? sortby = null, string sort = "ASC" ) { var output = "SELECT * FROM \"%s\"".printf (table); if (sortby != null) { output += " ORDER BY \"%s\" %s".printf (sortby, sort); } if (count != null && count > settings.limit_results) { output += " LIMIT %i".printf (settings.limit_results); } if (page != null && page > 1) { output += " OFFSET %i".printf (settings.limit_results * (page - 1)); } return output; } public string show_table_relations ( string table, string? database, string? sortby = null, string sort = "ASC" ) { var output = "SELECT ccu.column_name as \"COLUMN_NAME\", tc.constraint_name as \"CONSTRAINT_NAME\", kcu.column_name as \"REFERENCED_COLUMN_NAME\", tc.table_name as \"REFERENCED_TABLE\" FROM information_schema.table_constraints tc JOIN information_schema.key_column_usage kcu ON tc.constraint_name = kcu.constraint_name JOIN information_schema.constraint_column_usage ccu ON ccu.constraint_name = tc.constraint_name WHERE constraint_type = 'FOREIGN KEY' AND ccu.table_name='%s' AND ccu.table_schema = '%s'".printf (table, database); if (sortby != null) { output += " ORDER BY \"%s\" %s".printf (sortby, sort); } return output; } public string create_database (string name) { // Temporary placeholder methods. No current support for database // operations in PostgreSQL. return ""; } public string delete_database (string name) { // Temporary placeholder methods. No current support for database // operations in PostgreSQL. return ""; } } sequeler-0.8.2/src/Services/Types/SQLite.vala000066400000000000000000000064021410464306200210340ustar00rootroot00000000000000/* * Copyright (c) 2011-2019 Alecaddd (https://alecaddd.com) * * 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 2 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, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Alessandro "Alecaddd" Castellani */ public class Sequeler.Services.Types.SQLite : Object, DataBaseType { public string connection_string (Gee.HashMap data) { var file_path = data["file_path"].replace ("file://", ""); var last_slash = file_path.last_index_of ("/", 0) + 1; var dir = Gda.rfc1738_encode (file_path.substring (0, last_slash)); var name = Gda.rfc1738_encode (file_path.substring (last_slash, -1)); return "SQLite://DB_DIR=" + dir + ";DB_NAME=" + name; } public string show_schema () { return "SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;"; } public string show_table_list (string name) { return "SELECT COUNT(*) FROM %s".printf (name); } public string edit_table_name (string old_table, string new_table) { return "ALTER TABLE %s RENAME TO %s".printf (old_table, new_table); } public string transfer_table (string old_database, string table, string new_database) { // Temporary placeholder methods. No current support for database // operations in SQLite. return ""; } public string show_table_structure (string table, string? sortby = null, string sort = "ASC") { return "PRAGMA table_info('%s')".printf (table); } public string show_table_content ( string table, int? count = null, int? page = null, string? sortby = null, string sort = "ASC" ) { var output = "SELECT * FROM %s".printf (table); if (sortby != null) { output += " ORDER BY `%s` %s".printf (sortby, sort); } if (count != null && count > settings.limit_results) { output += " LIMIT %i".printf (settings.limit_results); } if (page != null && page > 1) { output += " OFFSET %i".printf (settings.limit_results * (page - 1)); } return output; } public string show_table_relations ( string table, string? database, string? sortby = null, string sort = "ASC" ) { return "PRAGMA foreign_key_list('%s')".printf (table); } public string create_database (string name) { // Temporary placeholder methods. No current support for database // operations in SQLite. return ""; } public string delete_database (string name) { // Temporary placeholder methods. No current support for database // operations in SQLite. return ""; } } sequeler-0.8.2/src/Services/UpgradeManager.vala000066400000000000000000000037521410464306200214560ustar00rootroot00000000000000/* * Copyright (c) 2011-2018 Alecaddd (http://alecaddd.com) * * 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 2 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, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Alessandro "Alecaddd" Castellani */ public class Sequeler.Services.UpgradeManager : Object { construct { string version = settings.version; switch (version) { case "": upgrade_passwords_to_libsecret.begin (); case Constants.VERSION: debug ("Current Version"); } settings.version = Constants.VERSION; } public virtual async void upgrade_passwords_to_libsecret () throws Error { var current_connections = settings.saved_connections; Gee.List existing_connections = new Gee.ArrayList (); existing_connections.add_all_array (current_connections); foreach (var conn in settings.saved_connections) { var check = settings.arraify_data (conn); if (check["type"] != "SQLite" && check.has_key ("password")) { settings.update_password.begin (check); check.unset ("password"); existing_connections.remove (conn); existing_connections.insert (0, settings.stringify_data (check)); } } settings.saved_connections = existing_connections.to_array (); } } sequeler-0.8.2/src/Widgets/000077500000000000000000000000001410464306200155435ustar00rootroot00000000000000sequeler-0.8.2/src/Widgets/ConnectionDialog.vala000066400000000000000000000732651410464306200216440ustar00rootroot00000000000000/* * Copyright (c) 2017-2020 Alecaddd (https://alecaddd.com) * * 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 2 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, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Alessandro "Alecaddd" Castellani */ public class Sequeler.Widgets.ConnectionDialog : Gtk.Dialog { public weak Sequeler.Window window { get; construct; } private Sequeler.Services.ConnectionManager? connection_manager { get; set; default = null; } public Sequeler.Partials.ButtonClass test_button; public Sequeler.Partials.ButtonClass connect_button; public Sequeler.Partials.ButtonClass cancel_button; public Sequeler.Partials.ButtonClass save_button; private Gtk.Label header_title; private Gtk.ColorButton color_picker; private Gtk.InfoBar infobar; private Gtk.Label infobar_label; private string infobar_label_missing_private_key = _("Missing SSH Key file!"); private string infobar_label_missing_public_key = _("Missing SSH public key!"); private Sequeler.Partials.LabelForm db_file_label; private Sequeler.Partials.LabelForm db_host_label; private Sequeler.Partials.LabelForm db_name_label; private Sequeler.Partials.LabelForm db_username_label; private Sequeler.Partials.LabelForm db_password_label; private Sequeler.Partials.LabelForm db_port_label; private Gtk.Entry connection_id; private Sequeler.Partials.Entry title_entry; private Gee.HashMap db_types; private Gtk.ComboBox db_type_entry; private Sequeler.Partials.Entry db_host_entry; private Sequeler.Partials.Entry db_name_entry; private Sequeler.Partials.Entry db_username_entry; private Sequeler.Partials.Entry db_password_entry; private Sequeler.Partials.Entry db_port_entry; private Gtk.FileChooserButton db_file_entry; private string keyfile1; private string keyfile2; private Sequeler.Partials.LabelForm ssl_switch_label; private Gtk.Grid ssl_switch_container; private Gtk.Switch ssl_switch; private Sequeler.Partials.LabelForm ssh_switch_label; private Gtk.Grid ssh_switch_container; private Gtk.Switch ssh_switch; private Sequeler.Partials.LabelForm ssh_host_label; private Sequeler.Partials.Entry ssh_host_entry; private Sequeler.Partials.LabelForm ssh_username_label; private Sequeler.Partials.Entry ssh_username_entry; private Sequeler.Partials.LabelForm ssh_password_label; private Sequeler.Partials.Entry ssh_password_entry; private Sequeler.Partials.LabelForm ssh_port_label; private Sequeler.Partials.Entry ssh_port_entry; private Sequeler.Partials.LabelForm ssh_identity_file_label; private Gtk.FileChooserButton ssh_identity_file_entry; private Gtk.Spinner spinner; private Sequeler.Partials.ResponseMessage response_msg; enum Column { DBTYPE } enum Action { TEST, SAVE, CANCEL, CONNECT } public ConnectionDialog (Sequeler.Window? parent) { Object ( border_width: 5, deletable: false, resizable: false, title: _("Connection"), transient_for: parent, window: parent ); } construct { set_id (); build_content (); toggle_ssh_fields (false); build_actions (); populate_data.begin (); change_sensitivity (); response.connect (on_response); } private void set_id () { var id = settings.tot_connections; connection_id = new Gtk.Entry (); connection_id.text = id.to_string (); } private void build_content () { var body = get_content_area (); db_types = new Gee.HashMap (); db_types.set (0, "MySQL"); db_types.set (1, "MariaDB"); db_types.set (2, "PostgreSQL"); db_types.set (3, "SQLite"); var header_grid = new Gtk.Grid (); header_grid.margin_start = 30; header_grid.margin_end = 30; header_grid.margin_bottom = 10; var image = new Gtk.Image.from_icon_name ("office-database", Gtk.IconSize.DIALOG); image.margin_end = 10; header_title = new Gtk.Label (_("New Connection")); header_title.get_style_context ().add_class (Granite.STYLE_CLASS_H2_LABEL); header_title.halign = Gtk.Align.START; header_title.ellipsize = Pango.EllipsizeMode.END; header_title.margin_end = 10; header_title.set_line_wrap (true); header_title.hexpand = true; color_picker = new Gtk.ColorButton.with_rgba ({ 222, 222, 222, 255 }); color_picker.get_style_context ().add_class ("color-picker"); color_picker.can_focus = false; color_picker.set_tooltip_text (_("Select connection color")); header_grid.attach (image, 0, 0, 1, 2); header_grid.attach (header_title, 1, 0, 1, 2); header_grid.attach (color_picker, 2, 0, 1, 1); body.add (header_grid); var form_grid = new Gtk.Grid (); form_grid.margin = 30; form_grid.row_spacing = 12; form_grid.column_spacing = 20; var ssh_grid = new Gtk.Grid (); ssh_grid.margin = 30; ssh_grid.row_spacing = 12; ssh_grid.column_spacing = 20; var ssh_switch_grid = new Gtk.Grid (); ssh_switch_grid.halign = Gtk.Align.CENTER; ssh_switch_grid.column_spacing = 20; ssh_switch_grid.margin_bottom = 12; var title_label = new Sequeler.Partials.LabelForm (_("Connection Name:")); title_entry = new Sequeler.Partials.Entry (_("Connection's name"), _("New Connection")); title_entry.changed.connect (() => { header_title.label = title_entry.text; }); form_grid.attach (title_label, 0, 0, 1, 1); form_grid.attach (title_entry, 1, 0, 1, 1); var db_type_label = new Sequeler.Partials.LabelForm (_("Database Type:")); var list_store = new Gtk.ListStore (1, typeof (string)); for (int i = 0; i < db_types.size; i++) { Gtk.TreeIter iter; list_store.append (out iter); list_store.set (iter, Column.DBTYPE, db_types[i]); } db_type_entry = new Gtk.ComboBox.with_model (list_store); var cell = new Gtk.CellRendererText (); db_type_entry.pack_start (cell, false); db_type_entry.set_attributes (cell, "text", Column.DBTYPE); db_type_entry.set_active (0); db_type_entry.changed.connect (() => { db_type_changed (); }); form_grid.attach (db_type_label, 0, 1, 1, 1); form_grid.attach (db_type_entry, 1, 1, 1, 1); db_host_label = new Sequeler.Partials.LabelForm (_("Host:")); db_host_entry = new Sequeler.Partials.Entry ("127.0.0.1", null); form_grid.attach (db_host_label, 0, 2, 1, 1); form_grid.attach (db_host_entry, 1, 2, 1, 1); db_name_label = new Sequeler.Partials.LabelForm (_("Database Name:")); db_name_entry = new Sequeler.Partials.Entry ("", null); db_name_entry.changed.connect (change_sensitivity); form_grid.attach (db_name_label, 0, 3, 1, 1); form_grid.attach (db_name_entry, 1, 3, 1, 1); db_username_label = new Sequeler.Partials.LabelForm (_("Username:")); db_username_entry = new Sequeler.Partials.Entry ("", null); form_grid.attach (db_username_label, 0, 4, 1, 1); form_grid.attach (db_username_entry, 1, 4, 1, 1); db_password_label = new Sequeler.Partials.LabelForm (_("Password:")); db_password_entry = new Sequeler.Partials.Entry ("", null); db_password_entry.visibility = false; db_password_entry.set_icon_from_icon_name (Gtk.EntryIconPosition.SECONDARY, "changes-prevent-symbolic"); db_password_entry.set_icon_tooltip_text (Gtk.EntryIconPosition.SECONDARY, _("Show password")); db_password_entry.icon_press.connect ((pos, event) => { if (pos == Gtk.EntryIconPosition.SECONDARY) { db_password_entry.visibility = !db_password_entry.visibility; } if (db_password_entry.visibility) { db_password_entry.set_icon_from_icon_name (Gtk.EntryIconPosition.SECONDARY, "changes-allow-symbolic"); db_password_entry.set_icon_tooltip_text (Gtk.EntryIconPosition.SECONDARY, _("Hide password")); } else { db_password_entry.set_icon_from_icon_name (Gtk.EntryIconPosition.SECONDARY, "changes-prevent-symbolic"); db_password_entry.set_icon_tooltip_text (Gtk.EntryIconPosition.SECONDARY, _("Show password")); } }); form_grid.attach (db_password_label, 0, 5, 1, 1); form_grid.attach (db_password_entry, 1, 5, 1, 1); db_port_label = new Sequeler.Partials.LabelForm (_("Port:")); db_port_entry = new Sequeler.Partials.Entry ("3306", null); form_grid.attach (db_port_label, 0, 6, 1, 1); form_grid.attach (db_port_entry, 1, 6, 1, 1); ssl_switch_label = new Sequeler.Partials.LabelForm (_("Use SSL:")); ssl_switch = new Gtk.Switch (); ssl_switch_container = new Gtk.Grid (); ssl_switch_container.add (ssl_switch); ssl_switch.set_state (false); form_grid.attach (ssl_switch_label, 0, 7, 1, 1); form_grid.attach (ssl_switch_container, 1, 7, 1, 1); db_file_label = new Sequeler.Partials.LabelForm (_("File Path:")); db_file_entry = new Gtk.FileChooserButton (_("Select Your SQLite File\u2026"), Gtk.FileChooserAction.OPEN); var filter = new Gtk.FileFilter (); filter.set_filter_name ("Database File"); filter.add_pattern ("*.db"); filter.add_pattern ("*.sqlite"); filter.add_pattern ("*.sqlite3"); db_file_entry.add_filter (filter); db_file_entry.selection_changed.connect (change_sensitivity); form_grid.attach (db_file_label, 0, 7, 1, 1); form_grid.attach (db_file_entry, 1, 7, 1, 1); db_file_label.visible = false; db_file_label.no_show_all = true; db_file_entry.visible = false; db_file_entry.no_show_all = true; ssh_switch = new Gtk.Switch (); ssh_switch_container = new Gtk.Grid (); ssh_switch_container.add (ssh_switch); ssh_switch_label = new Sequeler.Partials.LabelForm (_("Connect via SSH Tunnel:")); ssh_switch.notify["active"].connect (() => { toggle_ssh_fields (ssh_switch.get_active ()); }); ssh_switch_grid.attach (ssh_switch_label, 0, 0, 1, 1); ssh_switch_grid.attach (ssh_switch_container, 1, 0, 1, 1); ssh_grid.attach (ssh_switch_grid, 0, 0, 2, 1); ssh_host_label = new Sequeler.Partials.LabelForm (_("SSH Host:")); ssh_host_entry = new Sequeler.Partials.Entry ("", null); ssh_grid.attach (ssh_host_label, 0, 2, 1, 1); ssh_grid.attach (ssh_host_entry, 1, 2, 1, 1); ssh_username_label = new Sequeler.Partials.LabelForm (_("SSH Username:")); ssh_username_entry = new Sequeler.Partials.Entry ("", null); ssh_grid.attach (ssh_username_label, 0, 3, 1, 1); ssh_grid.attach (ssh_username_entry, 1, 3, 1, 1); ssh_password_label = new Sequeler.Partials.LabelForm (_("SSH Password:")); ssh_password_entry = new Sequeler.Partials.Entry ("", null); ssh_password_entry.visibility = false; ssh_password_entry.set_icon_from_icon_name (Gtk.EntryIconPosition.SECONDARY, "changes-prevent-symbolic"); ssh_password_entry.set_icon_tooltip_text (Gtk.EntryIconPosition.SECONDARY, _("Show password")); ssh_password_entry.icon_press.connect ((pos, event) => { if (pos == Gtk.EntryIconPosition.SECONDARY) { ssh_password_entry.visibility = !ssh_password_entry.visibility; } if (ssh_password_entry.visibility) { ssh_password_entry.set_icon_from_icon_name (Gtk.EntryIconPosition.SECONDARY, "changes-allow-symbolic"); ssh_password_entry.set_icon_tooltip_text (Gtk.EntryIconPosition.SECONDARY, _("Hide password")); } else { ssh_password_entry.set_icon_from_icon_name (Gtk.EntryIconPosition.SECONDARY, "changes-prevent-symbolic"); ssh_password_entry.set_icon_tooltip_text (Gtk.EntryIconPosition.SECONDARY, _("Show password")); } }); ssh_grid.attach (ssh_password_label, 0, 4, 1, 1); ssh_grid.attach (ssh_password_entry, 1, 4, 1, 1); ssh_port_label = new Sequeler.Partials.LabelForm (_("SSH Port:")); ssh_port_entry = new Sequeler.Partials.Entry (_("Optional"), null); ssh_grid.attach (ssh_port_label, 0, 5, 1, 1); ssh_grid.attach (ssh_port_entry, 1, 5, 1, 1); ssh_identity_file_label = new Sequeler.Partials.LabelForm (_("SSH Identity")); ssh_identity_file_entry = new Gtk.FileChooserButton ( _("Select Your Identity File\u2026"), Gtk.FileChooserAction.OPEN ); ssh_identity_file_entry.set_filename (this.get_default_ssh_identity_filename ()); ssh_identity_file_entry.file_set.connect (this.verify_ssh_file_entry); ssh_grid.attach (ssh_identity_file_label, 0, 6, 1, 1); ssh_grid.attach (ssh_identity_file_entry, 1, 6, 1, 1); infobar_label = new Gtk.Label (infobar_label_missing_private_key); infobar_label.show (); infobar = new Gtk.InfoBar (); infobar.message_type = Gtk.MessageType.WARNING; infobar.get_style_context ().add_class ("inline"); infobar.get_content_area ().add (infobar_label); infobar.show_close_button = false; infobar.add_button (_("Generate SSH Key"), 0); infobar.revealed = false; infobar.response.connect ((response) => { if (response == 0) { try { ssh_switch.active = false; AppInfo.launch_default_for_uri ( "https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/", null ); } catch (Error e) { warning ("%s\n", e.message); } } }); ssh_grid.attach (infobar, 0, 7, 2, 1); var stack_grid = new Gtk.Grid (); stack_grid.expand = true; stack_grid.margin_top = 20; var stackswitcher = new Gtk.StackSwitcher (); stackswitcher.halign = Gtk.Align.CENTER; stack_grid.attach (stackswitcher, 0, 0, 1, 1); var stack = new Gtk.Stack (); stack.expand = true; stackswitcher.stack = stack; stack.add_titled (form_grid, "connection", _("Connection")); stack.add_titled (ssh_grid, "ssh", _("SSH Tunnel")); stack_grid.attach (stack, 0, 1, 1, 1); body.add (stack_grid); spinner = new Gtk.Spinner (); response_msg = new Sequeler.Partials.ResponseMessage (); body.add (spinner); body.add (response_msg); } private string get_default_ssh_identity_filename () { var home_dir = Environment.get_home_dir (); return home_dir + "/.ssh/id_rsa"; } private void verify_ssh_file_entry (Gtk.FileChooserButton file_entry) { keyfile2 = file_entry.get_filename (); keyfile1 = keyfile2 + ".pub"; var public_key_exists = File.new_for_path (keyfile1).query_exists (); var private_key_exists = File.new_for_path (keyfile2).query_exists (); infobar.revealed = ! private_key_exists || ! public_key_exists; // missing_public_key message is more specific if (! public_key_exists && private_key_exists) { infobar_label.set_text (infobar_label_missing_public_key); } else if (! private_key_exists) { infobar_label.set_text (infobar_label_missing_private_key); } } private void toggle_ssh_fields (bool toggle) { if (toggle) { this.verify_ssh_file_entry (ssh_identity_file_entry); } else { infobar.revealed = false; } ssh_host_label.visible = toggle; ssh_host_label.no_show_all = !toggle; ssh_host_entry.visible = toggle; ssh_host_entry.no_show_all = !toggle; ssh_username_label.visible = toggle; ssh_username_label.no_show_all = !toggle; ssh_username_entry.visible = toggle; ssh_username_entry.no_show_all = !toggle; ssh_password_label.visible = toggle; ssh_password_label.no_show_all = !toggle; ssh_password_entry.visible = toggle; ssh_password_entry.no_show_all = !toggle; ssh_port_label.visible = toggle; ssh_port_label.no_show_all = !toggle; ssh_port_entry.visible = toggle; ssh_port_entry.no_show_all = !toggle; ssh_identity_file_label.visible = toggle; ssh_identity_file_label.no_show_all = !toggle; ssh_identity_file_entry.visible = toggle; ssh_identity_file_entry.no_show_all = !toggle; } private void build_actions () { cancel_button = new Sequeler.Partials.ButtonClass (_("Close"), null); save_button = new Sequeler.Partials.ButtonClass (_("Save Connection"), null); test_button = new Sequeler.Partials.ButtonClass (_("Test Connection"), null); connect_button = new Sequeler.Partials.ButtonClass (_("Connect"), "suggested-action"); add_action_widget (test_button, Action.TEST); add_action_widget (save_button, Action.SAVE); add_action_widget (cancel_button, Action.CANCEL); add_action_widget (connect_button, Action.CONNECT); } private async void populate_data () { if (window.data_manager.data == null || window.data_manager.data.size == 0) { return; } var update_data = window.data_manager.data; string? old_password = ""; try { old_password = yield password_mngr.get_password_async (update_data["id"]); } catch (Error e) { debug ("Unable to get the password from libsecret"); } connection_id.text = update_data["id"]; title_entry.text = update_data["title"]; var color = Gdk.RGBA (); color.parse (update_data["color"]); color_picker.rgba = color; foreach (var entry in db_types.entries) { if (entry.value == update_data["type"]) { db_type_entry.set_active (entry.key); } } db_host_entry.text = update_data["host"]; db_name_entry.text = update_data["name"]; db_username_entry.text = update_data["username"]; db_password_entry.text = old_password != null ? old_password : ""; if (update_data["file_path"] != null) { db_file_entry.set_uri (update_data["file_path"]); } if (update_data["type"] == "SQLite" && update_data["file_path"] == null) { var update_file_path = update_data["host"] + "/" + update_data["name"] + ".db"; try { db_file_entry.set_file (File.new_for_path (update_file_path)); } catch (Error e) { write_response (e.message); } } if (update_data["port"] != null) { db_port_entry.text = update_data["port"]; } if (update_data["has_ssh"] == "true") { string? old_ssh_password = ""; try { old_ssh_password = yield password_mngr.get_password_async (update_data["id"] + "9999"); } catch (Error e) { debug ("Unable to get the password from libsecret"); } ssh_switch.active = bool.parse (update_data["has_ssh"]); ssh_host_entry.text = (update_data["ssh_host"] != null) ? update_data["ssh_host"] : ""; ssh_username_entry.text = (update_data["ssh_username"] != null) ? update_data["ssh_username"] : ""; ssh_password_entry.text = (old_ssh_password != null) ? old_ssh_password : ""; ssh_port_entry.text = (update_data["ssh_port"] != null) ? update_data["ssh_port"] : ""; if (update_data["ssh_identity_file"] != null) { ssh_identity_file_entry.set_filename (update_data["ssh_identity_file"]); } } if (update_data["use_ssl"] != null) { ssl_switch.set_state (update_data["use_ssl"] == "true"); } } private void db_type_changed () { var toggle = db_type_entry.get_active () == 3 ? true : false; toggle_database_info (toggle); change_sensitivity (); if (db_type_entry.get_active () == 2) { db_port_entry.placeholder_text = "5432"; } else { db_port_entry.placeholder_text = "3306"; } } private void toggle_database_info (bool toggle) { db_file_label.visible = toggle; db_file_label.no_show_all = !toggle; db_file_entry.visible = toggle; db_file_entry.no_show_all = !toggle; db_host_label.visible = !toggle; db_host_label.no_show_all = toggle; db_host_entry.visible = !toggle; db_host_entry.no_show_all = toggle; db_name_label.visible = !toggle; db_name_label.no_show_all = toggle; db_name_entry.visible = !toggle; db_name_entry.no_show_all = toggle; db_username_label.visible = !toggle; db_username_label.no_show_all = toggle; db_username_entry.visible = !toggle; db_username_entry.no_show_all = toggle; db_password_label.visible = !toggle; db_password_label.no_show_all = toggle; db_password_entry.visible = !toggle; db_password_entry.no_show_all = toggle; db_port_label.visible = !toggle; db_port_label.no_show_all = toggle; db_port_entry.visible = !toggle; db_port_entry.no_show_all = toggle; ssl_switch_label.visible = !toggle; ssl_switch_label.no_show_all = toggle; ssl_switch.visible = !toggle; ssl_switch.no_show_all = toggle; if (toggle) ssh_switch.active = false; ssh_switch_container.visible = !toggle; ssh_switch_container.no_show_all = toggle; ssh_switch_label.visible = !toggle; ssh_switch_label.no_show_all = toggle; } private void change_sensitivity () { if (db_type_entry.get_active () != 3 || (db_type_entry.get_active () == 3 && db_file_entry.get_uri () != null) ) { test_button.sensitive = true; connect_button.sensitive = true; return; } test_button.sensitive = false; connect_button.sensitive = false; } private async void toggle_buttons (bool status) { test_button.sensitive = status; connect_button.sensitive = status; cancel_button.sensitive = status; save_button.sensitive = status; } private void on_response (Gtk.Dialog source, int response_id) { switch (response_id) { case Action.TEST: if (db_types[db_type_entry.get_active ()] != "SQLite" && db_username_entry.text == "") { write_response (_("A username is required in order to connect!")); return; } if (ssh_switch.active) { open_ssh_connection.begin (false); } else { test_connection.begin (); } break; case Action.SAVE: save_connection.begin (); break; case Action.CANCEL: if (connection_manager != null) { connection_manager.ssh_tunnel_close (Log.FILE + ":" + Log.LINE.to_string ()); } destroy (); break; case Action.CONNECT: if (db_types[db_type_entry.get_active ()] != "SQLite" && db_username_entry.text == "") { write_response (_("A username is required in order to connect!")); return; } debug ("init connection"); if (ssh_switch.active) { open_ssh_connection.begin (true); } else { init_connection.begin (); } break; } } public void test_connection_callback () { test_connection.begin (); } public void init_connection_callback () { init_connection.begin (); } public async void open_ssh_connection (bool is_real) throws ThreadError { yield toggle_spinner (true); write_response (_("Opening SSH Tunnel\u2026")); var data = package_data (); connection_manager = new Sequeler.Services.ConnectionManager (window, data); if (is_real) { connection_manager.ssh_tunnel_ready.connect (init_connection_callback); } else { connection_manager.ssh_tunnel_ready.connect (test_connection_callback); } SourceFunc callback = open_ssh_connection.callback; new Thread (null, () => { try { connection_manager.ssh_tunnel_init (is_real); } catch (Error e) { write_response (e.message); } Idle.add ((owned) callback); Thread.exit (null); return null; }); yield; toggle_spinner.begin (false); } private async void test_connection () throws ThreadError { if (Thread.supported () == false) { error ("Threads are not supported!"); } yield toggle_spinner (true); write_response (_("Testing Connection\u2026")); if (connection_manager == null) { connection_manager = new Sequeler.Services.ConnectionManager (window, package_data ()); } SourceFunc callback = test_connection.callback; new Thread (null, () => { try { connection_manager.test (); } catch (Error e) { write_response (e.message); } Idle.add ((owned) callback); Thread.exit (null); return null; }); yield; write_response (_("Successfully Connected!")); connection_manager = null; yield toggle_spinner (false); } private async void save_connection () { var data = package_data (); yield toggle_spinner (true); write_response (_("Saving Connection\u2026")); yield window.main.library.check_add_item (data); yield toggle_spinner (false); write_response (_("Connection Saved!")); } private async void init_connection () { var data = package_data (); var result = new Gee.HashMap (); yield toggle_spinner (true); write_response (_("Connecting\u2026")); if (connection_manager == null) { connection_manager = new Sequeler.Services.ConnectionManager (window, data); } try { result = yield connection_manager.init_connection (); } catch (ThreadError e) { yield toggle_spinner (false); connection_manager = null; write_response (e.message); return; } if (result["status"] != "true") { yield toggle_spinner (false); connection_manager = null; write_response (result["msg"]); return; } if (settings.save_quick) { yield window.main.library.check_add_item (data); } window.data_manager.data = data; yield window.main.connection_opened (connection_manager); destroy (); } private Gee.HashMap package_data () { var packaged_data = new Gee.HashMap (); packaged_data.set ("id", connection_id.text); packaged_data.set ("title", title_entry.text); packaged_data.set ("color", color_picker.rgba.to_string ()); packaged_data.set ("type", db_types[db_type_entry.get_active ()]); packaged_data.set ("host", db_host_entry.text); packaged_data.set ("name", db_name_entry.text); packaged_data.set ("file_path", db_file_entry.get_uri () != null ? db_file_entry.get_uri () : ""); packaged_data.set ("username", db_username_entry.text); packaged_data.set ("password", db_password_entry.text); packaged_data.set ("port", db_port_entry.text); packaged_data.set ("has_ssh", ssh_switch.active.to_string ()); packaged_data.set ("ssh_host", ssh_switch.active ? ssh_host_entry.text : ""); packaged_data.set ("ssh_username", ssh_switch.active ? ssh_username_entry.text : ""); packaged_data.set ("ssh_password", ssh_switch.active ? ssh_password_entry.text : ""); packaged_data.set ("ssh_port", ssh_switch.active ? ssh_port_entry.text : ""); packaged_data.set ("ssh_identity_file", ssh_identity_file_entry.get_filename () ?? ""); packaged_data.set ("use_ssl", ssl_switch.active.to_string ()); return packaged_data; } public async void toggle_spinner (bool type) { yield toggle_buttons (!type); if (type == true) { spinner.start (); return; } spinner.stop (); } public void write_response (string? response_text) { response_msg.label = response_text; } } sequeler-0.8.2/src/Widgets/QueryParamsDialog.vala000066400000000000000000000176741410464306200220200ustar00rootroot00000000000000/** * Copyright (c) 2017-2020 Alecaddd (https://alecaddd.com) * * 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 2 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, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Francisco Altoe * Authored by: Alessandro "Alecaddd" Castellani */ /** * Dialog subclass used to prompt the user to provide the required query parameters */ public class Sequeler.Widgets.QueryParamsDialog : Gtk.Dialog { public weak Sequeler.Window window { get; construct; } public Sequeler.Layouts.Views.Query parent_view { get; construct; } public string query { get; construct; } public Gda.Statement statement { get; construct; } public Gda.Set params { get; construct; } private Gee.ArrayList entries; private Sequeler.Partials.ResponseMessage response_msg; enum Action { RUN_QUERY, CANCEL } public QueryParamsDialog ( Sequeler.Window? parent, Sequeler.Layouts.Views.Query view, string query, Gda.Statement statement, Gda.Set? @params ) { Object ( border_width: 6, deletable: false, resizable: true, title: _("Query parameters"), transient_for: parent, window: parent, parent_view: view, query: query, statement: statement, params: @params ); } construct { build_content (); response.connect (on_response); } private void build_content () { default_width = 500; var content = get_content_area (); var form_grid = new Gtk.Grid (); form_grid.margin = 6; form_grid.row_spacing = 12; form_grid.column_spacing = 12; entries = new Gee.ArrayList (); for (int i = 0; ; i++) { Gda.Holder? holder = params.get_nth_holder (i); if (holder == null) { break; } var holder_id = holder.get_id (); var label = new Gtk.Label (holder_id + ":"); form_grid.attach (label, 0, i, 1, 1); var entry = entry_for_holder (holder); form_grid.attach (entry, 1, i, 1, 1); entries.add (entry); } var scrolled_window = new Gtk.ScrolledWindow (null, null); scrolled_window.add (form_grid); int main_window_width, main_window_height; parent_view.window.get_size (out main_window_width, out main_window_height); // Prevent the scrolled window from growing bigger than the main window itself. scrolled_window.set_max_content_height (main_window_height / 2); scrolled_window.set_max_content_width (main_window_width); scrolled_window.set_propagate_natural_width (true); scrolled_window.set_propagate_natural_height (true); response_msg = new Sequeler.Partials.ResponseMessage (); content.add (scrolled_window); content.add (response_msg); var cancel_button = new Gtk.Button.with_label (_("Cancel")); add_action_widget (cancel_button, Action.CANCEL); var run_button = new Sequeler.Partials.RunQueryButton (); add_action_widget (run_button, Action.RUN_QUERY); } private Gtk.Widget entry_for_holder (Gda.Holder holder) { Type holder_g_type = holder.get_g_type (); switch (holder_g_type) { case Type.BOOLEAN: return new Gtk.Switch (); case Type.INT: case Type.UINT: var widget = new Partials.ParamEntry (this, Gtk.InputPurpose.DIGITS); return widget; case Type.FLOAT: case Type.DOUBLE: var widget = new Partials.ParamEntry (this, Gtk.InputPurpose.NUMBER); return widget; default: return new Partials.ParamEntry (this); } } /** * Takes the parse result and update the widgets style and the holder value. */ private bool store_parsed_value ( bool parse_result, Value parsed_value, Gda.Holder holder, Gtk.Entry entry ) { entry.get_style_context ().remove_class ("error"); if (!parse_result) { entry.get_style_context ().add_class ("error"); return false; } try { holder.set_value (parsed_value); } catch (Error e) { write_response (e.message); entry.get_style_context ().add_class ("error"); return false; } return true; } private bool set_value_for_holder (Gda.Holder holder, Gtk.Widget widget) { Type holder_g_type = holder.get_g_type (); if (holder_g_type == Type.BOOLEAN) { Gtk.Switch switch = widget as Gtk.Switch; if (switch == null) { return false; } try { holder.set_value (switch.get_active ()); } catch (Error ex) { return false; } return true; } else { Gtk.Entry entry = widget as Gtk.Entry; string text = entry.get_text (); bool parse_result = true; Value parsed_value; if (holder_g_type == Type.INT) { // TODO: replace this with the following once we upgrade to a newer valac // parse_result = int.try_parse (text, out parsed_value); parsed_value = int.parse (text); } else if (holder_g_type == Type.UINT) { // TODO: replace this with the following once we upgrade to a newer valac // parse_result = uint.try_parse (text, out parsed_value); parsed_value = int.parse (text); } else if (holder_g_type == Type.FLOAT) { // TODO: replace this with the following once we upgrade to a newer valac // parse_result = float.try_parse (text, out parsed_value); parsed_value = double.parse (text); } else if (holder_g_type == Type.DOUBLE) { // TODO: replace this with the following once we upgrade to a newer valac // parse_result = double.try_parse (text, out parsed_value); parsed_value = double.parse (text); } else { parsed_value = text; } return store_parsed_value (parse_result, parsed_value, holder, entry); } } private bool get_param_values () { bool validation_result = true; for (int i = 0; ; i++) { Gda.Holder? holder = params.get_nth_holder (i); if (holder == null) { break; } validation_result &= set_value_for_holder (holder, entries[i]); } return validation_result; } private void on_response (Gtk.Dialog source, int response_id) { switch (response_id) { case Action.RUN_QUERY: run_query (); break; case Action.CANCEL: destroy (); break; } } public void run_query () { if (!get_param_values ()) { return; } parent_view.run_query_statement (query, statement, params); destroy (); } private void write_response (string? response_text) { response_msg.label = response_text; } } sequeler-0.8.2/src/Window.vala000066400000000000000000000065631410464306200162630ustar00rootroot00000000000000/* * Copyright (c) 2017-2020 Alecaddd (https://alecaddd.com) * * 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 2 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, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Alessandro "Alecaddd" Castellani */ public class Sequeler.Window : Gtk.ApplicationWindow { public weak Sequeler.Application app { get; construct; } public Sequeler.Layouts.Main main; public Sequeler.Layouts.HeaderBar headerbar; public Sequeler.Services.ActionManager action_manager; public Sequeler.Services.DataManager data_manager; public Sequeler.Widgets.ConnectionDialog? connection_dialog = null; public Gtk.AccelGroup accel_group { get; construct; } public Window (Sequeler.Application sequeler_app) { Object ( application: sequeler_app, app: sequeler_app, icon_name: Constants.PROJECT_NAME ); } construct { accel_group = new Gtk.AccelGroup (); add_accel_group (accel_group); action_manager = new Sequeler.Services.ActionManager (app, this); main = new Sequeler.Layouts.Main (this); headerbar = new Sequeler.Layouts.HeaderBar (this); data_manager = new Sequeler.Services.DataManager (); build_ui (); move (settings.pos_x, settings.pos_y); resize (settings.window_width, settings.window_height); show_app (); } public Sequeler.Window get_instance () { return this; } private void build_ui () { Gtk.Settings.get_default ().gtk_application_prefer_dark_theme = settings.dark_theme; var css_provider = new Gtk.CssProvider (); css_provider.load_from_resource ("/com/github/alecaddd/sequeler/stylesheet.css"); Gtk.StyleContext.add_provider_for_screen ( Gdk.Screen.get_default (), css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION ); set_titlebar (headerbar); set_border_width (0); delete_event.connect (before_destroy); add (main); } public bool before_destroy () { update_status (); app.get_active_window ().destroy (); return true; } private void update_status () { int width, height, x, y; get_size (out width, out height); get_position (out x, out y); settings.pos_x = x; settings.pos_y = y; settings.window_width = width; settings.window_height = height; settings.sidebar_width = main.get_position (); if (main.database_view.query.n_tabs > 0) { settings.query_area = (main.database_view.query.current.page as Layouts.Views.Query) .panels.get_position (); } } public void show_app () { show_all (); show (); present (); } } sequeler-0.8.2/src/config.vala.in000066400000000000000000000002661410464306200166600ustar00rootroot00000000000000namespace Constants { public const string PROJECT_NAME = "@PROJECT_NAME@"; public const string GETTEXT_PACKAGE = "@GETTEXT_PACKAGE@"; public const string VERSION = "@VERSION@"; } sequeler-0.8.2/src/meson.build000066400000000000000000000036451410464306200163070ustar00rootroot00000000000000conf_data = configuration_data() conf_data.set('PROJECT_NAME', application_id) conf_data.set('GETTEXT_PACKAGE', meson.project_name()) conf_data.set('VERSION', meson.project_version()) config_header = configure_file( input: 'config.vala.in', output: 'config.vala', configuration: conf_data ) # Create a new executable, list the files we want to compile, list the dependencies we need, and install executable( application_id, 'Main.vala', 'Application.vala', 'Window.vala', 'Layouts/HeaderBar.vala', 'Layouts/Main.vala', 'Layouts/Library.vala', 'Layouts/Welcome.vala', 'Layouts/DataBaseSchema.vala', 'Layouts/DataBaseView.vala', 'Layouts/Views/Structure.vala', 'Layouts/Views/Content.vala', 'Layouts/Views/Relations.vala', 'Layouts/Views/Query.vala', 'Partials/ButtonType.vala', 'Partials/DataBasePanel.vala', 'Partials/DatabaseTable.vala', 'Partials/Helpers.vala', 'Partials/LibraryItem.vala', 'Partials/TreeBuilder.vala', 'Services/Settings.vala', 'Services/ActionManager.vala', 'Services/DataManager.vala', 'Services/ConnectionManager.vala', 'Services/PasswordManager.vala', 'Services/UpgradeManager.vala', 'Services/Types/DataBaseType.vala', 'Services/Types/MySQL.vala', 'Services/Types/PostgreSQL.vala', 'Services/Types/SQLite.vala', 'Widgets/ConnectionDialog.vala', 'Widgets/QueryParamsDialog.vala', asresources, config_header, dependencies: [ dependency('gtk+-3.0'), dependency('granite', version: '>= 0.5.1'), dependency('glib-2.0'), dependency('gee-0.8'), dependency('gobject-2.0'), dependency('libxml-2.0'), dependency('libgda-5.0'), dependency('libssh2'), dependency('libsecret-1'), dependency('gtksourceview-3.0'), m_dep, linux_dep ], vala_args: vala_args, install: true ) sequeler-0.8.2/vapi/000077500000000000000000000000001410464306200143055ustar00rootroot00000000000000sequeler-0.8.2/vapi/libgda-5.0.deps000066400000000000000000000000371410464306200167040ustar00rootroot00000000000000glib-2.0 gobject-2.0 libxml-2.0sequeler-0.8.2/vapi/libgda-5.0.vapi000066400000000000000000003016461410464306200167220ustar00rootroot00000000000000/* libgda-5.0.vapi generated by vapigen-0.26, do not modify. */ [CCode (cprefix = "Gda", gir_namespace = "Gda", gir_version = "5.0", lower_case_cprefix = "gda_")] namespace Gda { [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_batch_get_type ()")] public class Batch : GLib.Object { [CCode (has_construct_function = false)] public Batch (); public void add_statement (Gda.Statement stmt); public Gda.Batch copy (); public static GLib.Quark error_quark (); public bool get_parameters (out Gda.Set out_params) throws GLib.Error; public unowned GLib.SList get_statements (); public void remove_statement (Gda.Statement stmt); public string serialize (); public virtual signal void changed (GLib.Object changed_stmt); } [CCode (cheader_filename = "libgda/libgda.h", copy_function = "g_boxed_copy", free_function = "g_boxed_free", type_id = "gda_binary_get_type ()")] [Compact] public class Binary { public long binary_length; public uint8 data; public static void* copy (void* boxed); public static void free (owned void* boxed); public string to_string (uint maxlen); } [CCode (cheader_filename = "libgda/libgda.h", copy_function = "g_boxed_copy", free_function = "g_boxed_free", type_id = "gda_blob_get_type ()")] [Compact] public class Blob { public weak Gda.Binary data; public weak Gda.BlobOp op; public static void* copy (void* boxed); public static void free (owned void* boxed); public void set_op (Gda.BlobOp? op); public string to_string (uint maxlen); } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_blob_op_get_type ()")] public abstract class BlobOp : GLib.Object { public void* _gda_reserved1; [CCode (has_construct_function = false)] protected BlobOp (); public virtual long get_length (); public virtual long read (Gda.Blob blob, long offset, long size); public bool read_all (Gda.Blob blob); public virtual long write (Gda.Blob blob, long offset); public virtual bool write_all (Gda.Blob blob); } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_column_get_type ()")] public class Column : GLib.Object { [CCode (has_construct_function = false)] public Column (); public Gda.Column copy (); public bool get_allow_null (); public unowned GLib.Value? get_attribute (string attribute); public bool get_auto_increment (); public unowned string get_dbms_type (); public unowned GLib.Value? get_default_value (); public unowned string get_description (); public GLib.Type get_g_type (); public unowned string get_name (); public int get_position (); public void set_allow_null (bool allow); public void set_attribute (string attribute, GLib.Value? value, GLib.DestroyNotify? destroy); public void set_auto_increment (bool is_auto); public void set_dbms_type (string dbms_type); public void set_default_value (GLib.Value? default_value); public void set_description (string title); public void set_g_type (GLib.Type type); public void set_name (string name); public void set_position (int position); [NoAccessorMethod] public string id { owned get; set; } public virtual signal void g_type_changed (GLib.Type old_type, GLib.Type new_type); public virtual signal void name_changed (string old_name); } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_config_get_type ()")] public class Config : GLib.Object { [CCode (has_construct_function = false)] protected Config (); public static bool can_modify_system_config (); public static bool define_dsn (Gda.DsnInfo info) throws GLib.Error; public static bool dsn_needs_authentication (string dsn_name); public static GLib.Quark error_quark (); public static Gda.Config @get (); public static unowned Gda.DsnInfo get_dsn_info (string dsn_name); public static unowned Gda.DsnInfo get_dsn_info_at_index (int index); public static int get_dsn_info_index (string dsn_name); public static int get_nb_dsn (); public static unowned Gda.ServerProvider get_provider (string provider_name) throws GLib.Error; public static unowned Gda.ProviderInfo? get_provider_info (string provider_name); public static Gda.DataModel list_dsn (); public static Gda.DataModel list_providers (); public static bool remove_dsn (string dsn_name) throws GLib.Error; [NoAccessorMethod] public string system_filename { owned get; set; } [NoAccessorMethod] public string user_filename { owned get; set; } public virtual signal void dsn_added (void* new_dsn); public virtual signal void dsn_changed (void* dsn); public virtual signal void dsn_removed (void* old_dsn); public virtual signal void dsn_to_be_removed (void* old_dsn); } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_connection_get_type ()")] public class Connection : GLib.Object, Gda.Lockable { [CCode (has_construct_function = false)] protected Connection (); public void add_event (owned Gda.ConnectionEvent event); public void add_prepared_statement (Gda.Statement gda_stmt, Gda.PStmt prepared_stmt); public bool add_savepoint (string? name) throws GLib.Error; public bool async_cancel (uint task_id) throws GLib.Error; public GLib.Object async_fetch_result (uint task_id, out Gda.Set last_insert_row) throws GLib.Error; public uint async_statement_execute (Gda.Statement stmt, Gda.Set? @params, Gda.StatementModelUsage model_usage, [CCode (array_length = false)] GLib.Type[]? col_types, bool need_last_insert_row) throws GLib.Error; public GLib.SList batch_execute (Gda.Batch batch, Gda.Set? @params, Gda.StatementModelUsage model_usage) throws GLib.Error; public bool begin_transaction (string? name, Gda.TransactionIsolation level) throws GLib.Error; public void clear_events_list (); public void close (); public void close_no_warning (); public bool commit_transaction (string? name) throws GLib.Error; public Gda.ServerOperation create_operation (Gda.ServerOperationType type, Gda.Set? options) throws GLib.Error; public Gda.SqlParser create_parser (); public void del_prepared_statement (Gda.Statement gda_stmt); public bool delete_row_from_table (string table, string condition_column_name, GLib.Value condition_value) throws GLib.Error; public bool delete_savepoint (string? name) throws GLib.Error; public static GLib.Quark error_quark (); public int execute_non_select_command (string sql) throws GLib.Error; public Gda.DataModel execute_select_command (string sql) throws GLib.Error; [CCode (has_construct_function = false)] public Connection.from_dsn (string dsn, string? auth_string, Gda.ConnectionOptions options) throws GLib.Error; [CCode (has_construct_function = false)] public Connection.from_string (string? provider_name, string cnc_string, string? auth_string, Gda.ConnectionOptions options) throws GLib.Error; public unowned string get_authentication (); public unowned string get_cnc_string (); public bool get_date_format (out GLib.DateDMY out_first, out GLib.DateDMY out_second, out GLib.DateDMY out_third, out string out_sep) throws GLib.Error; public unowned string get_dsn (); public unowned GLib.List get_events (); public unowned Gda.MetaStore get_meta_store (); public Gda.DataModel get_meta_store_data_v (Gda.ConnectionMetaType meta_type, GLib.List filters) throws GLib.Error; public Gda.ConnectionOptions get_options (); public unowned Gda.PStmt get_prepared_statement (Gda.Statement gda_stmt); public unowned Gda.ServerProvider get_provider (); public unowned string get_provider_name (); public unowned Gda.TransactionStatus get_transaction_status (); public bool insert_row_into_table_v (string table, GLib.SList col_names, GLib.SList values) throws GLib.Error; public bool is_opened (); public bool open () throws GLib.Error; public static Gda.Connection open_from_dsn (string dsn, string? auth_string, Gda.ConnectionOptions options) throws GLib.Error; public static Gda.Connection open_from_string (string? provider_name, string cnc_string, string? auth_string, Gda.ConnectionOptions options) throws GLib.Error; public static Gda.Connection open_sqlite (string? directory, string filename, bool auto_unlink); public Gda.Statement parse_sql_string (string sql, out Gda.Set @params) throws GLib.Error; public bool perform_operation (Gda.ServerOperation op) throws GLib.Error; public Gda.ConnectionEvent point_available_event (Gda.ConnectionEventType type); public string quote_sql_identifier (string id); public GLib.SList repetitive_statement_execute (Gda.RepetitiveStatement rstmt, Gda.StatementModelUsage model_usage, [CCode (array_length = false)] GLib.Type[]? col_types, bool stop_on_error) throws GLib.Error; public bool rollback_savepoint (string? name) throws GLib.Error; public bool rollback_transaction (string? name) throws GLib.Error; public GLib.Object statement_execute (Gda.Statement stmt, Gda.Set? @params, Gda.StatementModelUsage model_usage, out Gda.Set last_insert_row) throws GLib.Error; public int statement_execute_non_select (Gda.Statement stmt, Gda.Set? @params, out Gda.Set last_insert_row) throws GLib.Error; public Gda.DataModel statement_execute_select (Gda.Statement stmt, Gda.Set? @params) throws GLib.Error; public Gda.DataModel statement_execute_select_full (Gda.Statement stmt, Gda.Set? @params, Gda.StatementModelUsage model_usage, [CCode (array_length = false)] GLib.Type[]? col_types) throws GLib.Error; public bool statement_prepare (Gda.Statement stmt) throws GLib.Error; public string statement_to_sql (Gda.Statement stmt, Gda.Set? @params, Gda.StatementSqlFlag flags, out GLib.SList params_used) throws GLib.Error; public static void string_split (string string, string out_cnc_params, string out_provider, string out_username, string? out_password); public bool supports_feature (Gda.ConnectionFeature feature); public bool update_meta_store (Gda.MetaContext? context) throws GLib.Error; public bool update_row_in_table_v (string table, string condition_column_name, GLib.Value condition_value, GLib.SList col_names, GLib.SList values) throws GLib.Error; public string value_to_sql_string (GLib.Value from); [NoAccessorMethod] public string auth_string { owned get; set; } [NoAccessorMethod] public string cnc_string { owned get; set; } [NoAccessorMethod] public string dsn { owned get; set; } [NoAccessorMethod] public int events_history_size { get; set; } [NoAccessorMethod] public uint execution_slowdown { get; set; } [NoAccessorMethod] public bool execution_timer { get; set; } [NoAccessorMethod] public bool is_wrapper { get; set; } [NoAccessorMethod] public Gda.MetaStore meta_store { owned get; set; } [NoAccessorMethod] public bool monitor_wrapped_in_mainloop { get; set; } [NoAccessorMethod] public Gda.ServerProvider provider { owned get; set; } [NoAccessorMethod] public void* thread_owner { get; set; } public virtual signal void conn_closed (); public virtual signal void conn_opened (); public virtual signal void conn_to_close (); public virtual signal void dsn_changed (); public virtual signal void error (Gda.ConnectionEvent error); public virtual signal void transaction_status_changed (); } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_connection_event_get_type ()")] public class ConnectionEvent : GLib.Object { [CCode (has_construct_function = false)] protected ConnectionEvent (); public long get_code (); public unowned string get_description (); public Gda.ConnectionEventType get_event_type (); public Gda.ConnectionEventCode get_gda_code (); public unowned string get_source (); public unowned string get_sqlstate (); public void set_code (long code); public void set_description (string? description); public void set_event_type (Gda.ConnectionEventType type); public void set_gda_code (Gda.ConnectionEventCode code); public void set_source (string source); public void set_sqlstate (string sqlstate); [NoAccessorMethod] public int type { get; set; } } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_data_access_wrapper_get_type ()")] public class DataAccessWrapper : GLib.Object, Gda.DataModel { [CCode (has_construct_function = false)] protected DataAccessWrapper (); public static Gda.DataModel @new (Gda.DataModel model); public bool set_mapping ([CCode (array_length_cname = "mapping_size", array_length_pos = 1.1)] int[]? mapping); [NoAccessorMethod] public Gda.DataModel model { owned get; construct; } } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_data_comparator_get_type ()")] public class DataComparator : GLib.Object { [CCode (has_construct_function = false, type = "GObject*")] public DataComparator (Gda.DataModel old_model, Gda.DataModel new_model); public bool compute_diff () throws GLib.Error; public static GLib.Quark error_quark (); public unowned Gda.Diff? get_diff (int pos); public int get_n_diffs (); public void set_key_columns ([CCode (array_length_cname = "nb_cols", array_length_pos = 1.1)] int[] col_numbers); [NoAccessorMethod] public Gda.DataModel new_model { owned get; set; } [NoAccessorMethod] public Gda.DataModel old_model { owned get; set; } public virtual signal bool diff_computed (void* diff); } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_data_model_array_get_type ()")] public class DataModelArray : GLib.Object, Gda.DataModel { [CCode (has_construct_function = false)] protected DataModelArray (); public void clear (); public unowned Gda.Row get_row (int row) throws GLib.Error; public static Gda.DataModel @new (int cols); public static Gda.DataModel new_with_g_types_v (int cols, [CCode (array_length = false)] GLib.Type[] types); public void set_n_columns (int cols); [NoAccessorMethod] public uint n_columns { get; set; } [NoAccessorMethod] public bool read_only { get; set; } } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_data_model_bdb_get_type ()")] public class DataModelBdb : GLib.Object, Gda.DataModel { [CCode (has_construct_function = false)] protected DataModelBdb (); public void clean_errors (); [NoWrapper] public virtual GLib.Value? get_data_part (void* data, int length, int part); public unowned GLib.SList get_errors (); [NoWrapper] public virtual GLib.Value? get_key_part (void* data, int length, int part); public static Gda.DataModel @new (string filename, string? db_name); [NoWrapper] public virtual bool update_data_part (void* data, int length, int part, GLib.Value value) throws GLib.Error; [NoWrapper] public virtual bool update_key_part (void* data, int length, int part, GLib.Value value) throws GLib.Error; [NoAccessorMethod] public string db_name { owned get; construct; } [NoAccessorMethod] public string filename { owned get; construct; } } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_data_model_dir_get_type ()")] public class DataModelDir : GLib.Object, Gda.DataModel { [CCode (has_construct_function = false)] protected DataModelDir (); public void clean_errors (); public unowned GLib.SList get_errors (); public static Gda.DataModel @new (string basedir); [NoAccessorMethod] public string basedir { owned get; construct; } } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_data_model_import_get_type ()")] public class DataModelImport : GLib.Object, Gda.DataModel { [CCode (has_construct_function = false)] protected DataModelImport (); public void clean_errors (); public unowned GLib.SList get_errors (); public static Gda.DataModel new_file (string filename, bool random_access, Gda.Set? options); public static Gda.DataModel new_mem (string data, bool random_access, Gda.Set? options); public static Gda.DataModel new_xml_node ([CCode (type = "xmlNodePtr")] Xml.Node* node); [NoAccessorMethod] public string data_string { owned get; construct; } [NoAccessorMethod] public string filename { owned get; construct; } [NoAccessorMethod] public Gda.Set options { owned get; construct; } [NoAccessorMethod] public bool random_access { get; construct; } [NoAccessorMethod] public bool strict { get; set construct; } [NoAccessorMethod] public void* xml_node { get; construct; } } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_data_model_iter_get_type ()")] public class DataModelIter : Gda.Set { [CCode (has_construct_function = false)] protected DataModelIter (); public static GLib.Quark error_quark (); [Version (deprecated = true, deprecated_since = "5.2", replacement = "")] public int get_column_for_param (Gda.Holder param); public unowned Gda.Holder get_holder_for_field (int col); public int get_row (); public unowned GLib.Value? get_value_at (int col); public unowned GLib.Value? get_value_at_e (int col) throws GLib.Error; public unowned GLib.Value? get_value_for_field (string field_name); public void invalidate_contents (); public bool is_valid (); public bool move_next (); public bool move_prev (); public bool move_to_row (int row); public bool set_value_at (int col, GLib.Value value) throws GLib.Error; [NoAccessorMethod] public int current_row { get; set; } [NoAccessorMethod] public Gda.DataModel data_model { owned get; set construct; } [NoAccessorMethod] public Gda.DataModel forced_model { owned get; set; } [NoAccessorMethod] public bool update_model { get; set; } public virtual signal void end_of_data (); public virtual signal void row_changed (int row); } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_data_model_ldap_get_type ()")] public class DataModelLdap : GLib.Object, Gda.DataModel { [CCode (has_construct_function = false)] protected DataModelLdap (); public static GLib.List compute_columns (Gda.Connection cnc, string? attributes); [Version (deprecated = true, deprecated_since = "5.2", replacement = "")] public static Gda.DataModel @new (Gda.Connection cnc, string? base_dn, string? filter, string? attributes, Gda.LdapSearchScope scope); [CCode (has_construct_function = false)] public DataModelLdap.with_config (Gda.Connection cnc, string? base_dn, string? filter, string? attributes, Gda.LdapSearchScope scope); public string attributes { construct; } [NoAccessorMethod] public string @base { owned get; construct; } [NoAccessorMethod] public string filter { owned get; construct; } [NoAccessorMethod] public int scope { get; construct; } [NoAccessorMethod] public bool use_rdn { get; set; } } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_data_pivot_get_type ()")] public class DataPivot : GLib.Object, Gda.DataModel { [CCode (has_construct_function = false)] protected DataPivot (); public bool add_data (Gda.DataPivotAggregate aggregate_type, string field, string? alias) throws GLib.Error; public bool add_field (Gda.DataPivotFieldType field_type, string field, string? alias) throws GLib.Error; public static GLib.Quark error_quark (); public static Gda.DataModel @new (Gda.DataModel? model); public bool populate () throws GLib.Error; [NoAccessorMethod] public Gda.DataModel model { owned get; set; } } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_data_proxy_get_type ()")] public class DataProxy : GLib.Object, Gda.DataModel { [CCode (has_construct_function = false, type = "GObject*")] public DataProxy (Gda.DataModel model); public void alter_value_attributes (int proxy_row, int col, Gda.ValueAttribute alter_flags); public bool apply_all_changes () throws GLib.Error; public bool apply_row_changes (int proxy_row) throws GLib.Error; public bool cancel_all_changes (); public void cancel_row_changes (int proxy_row, int col); public void @delete (int proxy_row); public static GLib.Quark error_quark (); public unowned string get_filter_expr (); public int get_filtered_n_rows (); public int get_n_modified_rows (); public int get_n_new_rows (); public unowned Gda.DataModel get_proxied_model (); public int get_proxied_model_n_cols (); public int get_proxied_model_n_rows (); public int get_proxied_model_row (int proxy_row); public int get_sample_end (); public int get_sample_size (); public int get_sample_start (); public Gda.ValueAttribute get_value_attributes (int proxy_row, int col); public GLib.SList get_values (int proxy_row, [CCode (array_length_cname = "n_cols", array_length_pos = 2.1)] int[] cols_index); public bool has_changed (); public bool is_read_only (); public bool row_has_changed (int proxy_row); public bool row_is_deleted (int proxy_row); public bool row_is_inserted (int proxy_row); public bool set_filter_expr (string? filter_expr) throws GLib.Error; public bool set_ordering_column (int col) throws GLib.Error; public void set_sample_size (int sample_size); public void set_sample_start (int sample_start); public void undelete (int proxy_row); [CCode (has_construct_function = false)] public DataProxy.with_data_model (Gda.DataModel model); [NoAccessorMethod] public bool cache_changes { get; set; } [NoAccessorMethod] public bool defer_sync { get; set; } [NoAccessorMethod] public Gda.DataModel model { owned get; set construct; } [NoAccessorMethod] public bool prepend_null_entry { get; set; } public int sample_size { get; set construct; } public virtual signal void filter_changed (); public virtual signal void row_changes_applied (int row, int proxied_row); public virtual signal void row_delete_changed (int row, bool to_be_deleted); public virtual signal void sample_changed (int sample_start, int sample_end); public virtual signal void sample_size_changed (int sample_size); public virtual signal GLib.Error validate_row_changes (int row, int proxied_row); } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_data_select_get_type ()")] public abstract class DataSelect : GLib.Object, Gda.DataModel { public int advertized_nrows; public int nb_stored_rows; public weak Gda.PStmt prep_stmt; [CCode (has_construct_function = false)] protected DataSelect (); public bool compute_columns_attributes () throws GLib.Error; public bool compute_modification_statements () throws GLib.Error; public bool compute_modification_statements_ext (Gda.DataSelectConditionType cond_type) throws GLib.Error; public bool compute_row_selection_condition () throws GLib.Error; public static GLib.Quark error_quark (); [NoWrapper] public virtual bool fetch_at (Gda.Row prow, int rownum) throws GLib.Error; [NoWrapper] public virtual int fetch_nb_rows (); [NoWrapper] public virtual bool fetch_next (Gda.Row prow, int rownum) throws GLib.Error; [NoWrapper] public virtual bool fetch_prev (Gda.Row prow, int rownum) throws GLib.Error; [NoWrapper] public virtual bool fetch_random (Gda.Row prow, int rownum) throws GLib.Error; public unowned Gda.Connection get_connection (); public bool prepare_for_offline () throws GLib.Error; public bool rerun () throws GLib.Error; public bool set_modification_statement (Gda.Statement mod_stmt) throws GLib.Error; public bool set_modification_statement_sql (string sql) throws GLib.Error; public bool set_row_selection_condition_sql (string sql_where) throws GLib.Error; [NoWrapper] public virtual bool store_all () throws GLib.Error; [NoAccessorMethod] public bool auto_reset { get; set; } public Gda.Connection connection { get; construct; } [NoAccessorMethod] public Gda.Statement delete_stmt { owned get; set; } [NoAccessorMethod] public Gda.Set exec_params { owned get; construct; } [NoAccessorMethod] public double execution_delay { get; set; } [NoAccessorMethod] public Gda.Statement insert_stmt { owned get; set; } [NoAccessorMethod] public uint model_usage { get; construct; } [NoAccessorMethod] public Gda.PStmt prepared_stmt { owned get; set; } [NoAccessorMethod] public Gda.Statement select_stmt { owned get; } [NoAccessorMethod] public bool store_all_rows { get; set; } [NoAccessorMethod] public Gda.Statement update_stmt { owned get; set; } } [CCode (cheader_filename = "libgda/libgda.h", copy_function = "g_boxed_copy", free_function = "g_boxed_free", type_id = "gda_default_get_type ()")] [Compact] public class Default { public static string escape_string (string string); public static string unescape_string (string string); } [CCode (cheader_filename = "libgda/libgda.h", copy_function = "g_boxed_copy", free_function = "g_boxed_free", type_id = "gda_dsn_info_get_type ()")] [Compact] public class DsnInfo { public weak string auth_string; public weak string cnc_string; public weak string description; public bool is_system; public weak string name; public weak string provider; [CCode (has_construct_function = false)] public DsnInfo (); public Gda.DsnInfo copy (); public void free (); } [CCode (cheader_filename = "libgda/libgda.h", copy_function = "g_boxed_copy", free_function = "g_boxed_free", lower_case_csuffix = "geometricpoint", type_id = "gda_geometricpoint_get_type ()")] [Compact] public class GeometricPoint { public double x; public double y; public static void* copy (void* boxed); public static void free (void* boxed); } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_handler_bin_get_type ()")] public class HandlerBin : GLib.Object, Gda.DataHandler { [CCode (has_construct_function = false)] protected HandlerBin (); public static Gda.DataHandler @new (); } [CCode (cheader_filename = "libgda/libgda.h")] [Compact] public class HandlerBinPriv { } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_handler_boolean_get_type ()")] public class HandlerBoolean : GLib.Object, Gda.DataHandler { [CCode (has_construct_function = false)] protected HandlerBoolean (); public static Gda.DataHandler @new (); } [CCode (cheader_filename = "libgda/libgda.h")] [Compact] public class HandlerBooleanPriv { } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_handler_numerical_get_type ()")] public class HandlerNumerical : GLib.Object, Gda.DataHandler { [CCode (has_construct_function = false)] protected HandlerNumerical (); public static Gda.DataHandler @new (); } [CCode (cheader_filename = "libgda/libgda.h")] [Compact] public class HandlerNumericalPriv { } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_handler_string_get_type ()")] public class HandlerString : GLib.Object, Gda.DataHandler { [CCode (has_construct_function = false)] protected HandlerString (); public static Gda.DataHandler @new (); public static Gda.DataHandler new_with_provider (Gda.ServerProvider prov, Gda.Connection? cnc); } [CCode (cheader_filename = "libgda/libgda.h")] [Compact] public class HandlerStringPriv { } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_handler_time_get_type ()")] public class HandlerTime : GLib.Object, Gda.DataHandler { [CCode (has_construct_function = false)] protected HandlerTime (); public string get_format (GLib.Type type); public string get_no_locale_str_from_value (GLib.Value value); public static Gda.DataHandler @new (); public static Gda.DataHandler new_no_locale (); public void set_sql_spec (GLib.DateDMY first, GLib.DateDMY sec, GLib.DateDMY third, char separator, bool twodigits_years); public void set_str_spec (GLib.DateDMY first, GLib.DateDMY sec, GLib.DateDMY third, char separator, bool twodigits_years); } [CCode (cheader_filename = "libgda/libgda.h")] [Compact] public class HandlerTimePriv { } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_handler_type_get_type ()")] public class HandlerType : GLib.Object, Gda.DataHandler { [CCode (has_construct_function = false)] protected HandlerType (); public static Gda.DataHandler @new (); } [CCode (cheader_filename = "libgda/libgda.h")] [Compact] public class HandlerTypePriv { } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_holder_get_type ()")] public class Holder : GLib.Object, Gda.Lockable { [CCode (has_construct_function = false)] public Holder (GLib.Type type); [NoWrapper] public virtual void att_changed (string att_name, GLib.Value att_value); public Gda.Holder copy (); public static GLib.Quark error_quark (); public void force_invalid (); public void force_invalid_e (owned GLib.Error? error); public string get_alphanum_id (); public unowned GLib.Value? get_attribute (string attribute); public unowned Gda.Holder get_bind (); public unowned GLib.Value? get_default_value (); public GLib.Type get_g_type (); public unowned string get_id (); public bool get_not_null (); public unowned Gda.DataModel get_source_model (int col); public unowned GLib.Value? get_value (); public string get_value_str (Gda.DataHandler? dh); public bool is_valid (); public bool is_valid_e () throws GLib.Error; public void set_attribute (string attribute, GLib.Value value, GLib.DestroyNotify destroy); public bool set_bind (Gda.Holder bind_to) throws GLib.Error; public void set_default_value (GLib.Value value); public void set_not_null (bool not_null); public bool set_source_model (Gda.DataModel model, int col) throws GLib.Error; public bool set_value (GLib.Value? value) throws GLib.Error; public bool set_value_str (Gda.DataHandler dh, string value) throws GLib.Error; public bool set_value_to_default (); public GLib.Value? take_static_value (GLib.Value value, bool value_changed) throws GLib.Error; public bool take_value (owned GLib.Value value) throws GLib.Error; public bool value_is_default (); [NoAccessorMethod] public string description { owned get; set; } [NoAccessorMethod] public Gda.Holder full_bind { owned get; set; } [NoAccessorMethod] public GLib.Type g_type { get; set construct; } [NoAccessorMethod] public string id { owned get; set; } [NoAccessorMethod] public string name { owned get; set; } public bool not_null { get; set; } [NoAccessorMethod] public Gda.Holder simple_bind { owned get; set; } [NoAccessorMethod] public int source_column { get; set; } [NoAccessorMethod] public Gda.DataModel source_model { owned get; set; } [NoAccessorMethod] public bool validate_changes { get; set; } public signal void attribute_changed (string att_name, GLib.Value att_value); public virtual signal void changed (); public virtual signal void source_changed (); public virtual signal GLib.Error validate_change (GLib.Value new_value); } [CCode (cheader_filename = "libgda/libgda.h", copy_function = "g_boxed_copy", free_function = "g_boxed_free", type_id = "gda_meta_context_get_type ()")] [Compact] public class MetaContext { [CCode (array_length = false, array_null_terminated = true)] public weak string[] column_names; [CCode (array_length = false, array_null_terminated = true)] public weak GLib.Value[] column_values; public weak GLib.HashTable columns; public int size; public weak string table_name; [CCode (has_construct_function = false)] public MetaContext (); public Gda.MetaContext copy (); public void free (); public unowned string get_table (); public void set_column (string column, GLib.Value value, Gda.Connection? cnc); public void set_columns (GLib.HashTable columns, Gda.Connection? cnc); public void set_table (string table); } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_meta_store_get_type ()")] public class MetaStore : GLib.Object { [CCode (has_construct_function = false)] public MetaStore (string? cnc_string); public Gda.DataModel create_modify_data_model (string table_name); public bool declare_foreign_key (Gda.MetaStruct? mstruct, string fk_name, string? catalog, string? schema, string table, string? ref_catalog, string? ref_schema, string ref_table, [CCode (array_length_cname = "nb_cols", array_length_pos = 8.5, array_length_type = "guint")] string[] colnames, [CCode (array_length_cname = "nb_cols", array_length_pos = 8.5, array_length_type = "guint")] string[] ref_colnames) throws GLib.Error; public static GLib.Quark error_quark (); [CCode (cname = "gda_meta_store_extract_v")] public Gda.DataModel extract (string select_sql, GLib.HashTable? vars) throws GLib.Error; public bool get_attribute_value (string att_name, out string att_value) throws GLib.Error; public unowned Gda.Connection get_internal_connection (); public int get_version (); public bool modify_v (string table_name, Gda.DataModel? new_data, string? condition, [CCode (array_length_cname = "nvalues", array_length_pos = 3.5)] string[] value_names, [CCode (array_length_cname = "nvalues", array_length_pos = 3.5)] GLib.Value[] values) throws GLib.Error; public bool modify_with_context (Gda.MetaContext context, Gda.DataModel? new_data) throws GLib.Error; public bool schema_add_custom_object (string xml_description) throws GLib.Error; public GLib.SList schema_get_all_tables (); public GLib.SList schema_get_depend_tables (string table_name); public Gda.MetaStruct schema_get_structure () throws GLib.Error; public bool schema_remove_custom_object (string obj_name) throws GLib.Error; public bool set_attribute_value (string att_name, string? att_value) throws GLib.Error; public void set_identifiers_style (Gda.SqlIdentifierStyle style); public void set_reserved_keywords_func (Gda.SqlReservedKeywordsFunc? func); public static string sql_identifier_quote (string id, Gda.Connection cnc); public bool undeclare_foreign_key (Gda.MetaStruct? mstruct, string fk_name, string? catalog, string? schema, string table, string? ref_catalog, string? ref_schema, string ref_table) throws GLib.Error; [CCode (has_construct_function = false)] public MetaStore.with_file (string file_name); public string catalog { construct; } [NoAccessorMethod] public Gda.Connection cnc { owned get; construct; } public string cnc_string { construct; } public string schema { construct; } public signal void meta_changed (GLib.SList changes); public virtual signal void meta_reset (); public virtual signal GLib.Error suggest_update (Gda.MetaContext suggest); } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_meta_struct_get_type ()")] public class MetaStruct : GLib.Object { [CCode (has_construct_function = false)] public MetaStruct (Gda.MetaStore store, Gda.MetaStructFeature features); public unowned Gda.MetaDbObject? complement (Gda.MetaDbObjectType type, GLib.Value? catalog, GLib.Value? schema, GLib.Value name) throws GLib.Error; public bool complement_all () throws GLib.Error; public bool complement_default () throws GLib.Error; public bool complement_depend (Gda.MetaDbObject dbo) throws GLib.Error; public bool complement_schema (GLib.Value? catalog, GLib.Value? schema) throws GLib.Error; public string dump_as_graph (Gda.MetaGraphInfo info) throws GLib.Error; public static GLib.Quark error_quark (); public GLib.SList get_all_db_objects (); public unowned Gda.MetaDbObject? get_db_object (GLib.Value? catalog, GLib.Value? schema, GLib.Value name); public bool load_from_xml_file (string? catalog, string? schema, string xml_spec_file) throws GLib.Error; public bool sort_db_objects (Gda.MetaSortType sort_type) throws GLib.Error; [NoAccessorMethod] public uint features { get; construct; } [NoAccessorMethod] public Gda.MetaStore meta_store { owned get; construct; } } [CCode (cheader_filename = "libgda/libgda.h", copy_function = "g_boxed_copy", free_function = "g_boxed_free", type_id = "gda_null_get_type ()")] [Compact] public class Null { } [CCode (cheader_filename = "libgda/libgda.h", copy_function = "g_boxed_copy", free_function = "g_boxed_free", type_id = "gda_numeric_get_type ()")] [Compact] public class Numeric { public weak string number; public long precision; public long width; [CCode (has_construct_function = false)] public Numeric (); public Gda.Numeric copy (); public void free (); public double get_double (); public long get_precision (); public string? get_string (); public long get_width (); public void set_double (double number); public void set_from_string (string str); public void set_precision (long precision); public void set_width (long width); } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_pstmt_get_type ()")] public abstract class PStmt : GLib.Object { public int ncols; public weak GLib.SList param_ids; public weak string sql; public weak GLib.SList tmpl_columns; public GLib.Type types; [CCode (has_construct_function = false)] protected PStmt (); public void copy_contents (Gda.PStmt dest); public unowned Gda.Statement get_gda_statement (); public void set_gda_statement (Gda.Statement stmt); } [CCode (cheader_filename = "libgda/libgda.h", copy_function = "g_boxed_copy", free_function = "g_boxed_free", type_id = "gda_quark_list_get_type ()")] [Compact] public class QuarkList { [CCode (has_construct_function = false)] public QuarkList (); public void add_from_string (string string, bool cleanup); public void clear (); public Gda.QuarkList copy (); public unowned string find (string name); public void @foreach (GLib.HFunc func); public void free (); [CCode (has_construct_function = false)] public QuarkList.from_string (string string); public void protect_values (); public void remove (string name); } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_repetitive_statement_get_type ()")] public class RepetitiveStatement : GLib.Object { [CCode (has_construct_function = false)] public RepetitiveStatement (Gda.Statement stmt); public bool append_set (Gda.Set values, bool make_copy); public GLib.SList get_all_sets (); public bool get_template_set (Gda.Set @set) throws GLib.Error; [NoAccessorMethod] public Gda.Statement statement { owned get; construct; } } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_row_get_type ()")] public class Row : GLib.Object { [CCode (has_construct_function = false)] public Row (int count); public int get_length (); public unowned GLib.Value? get_value (int num); public void invalidate_value (GLib.Value value); public void invalidate_value_e (GLib.Value value, owned GLib.Error? error); public bool value_is_valid (GLib.Value value); public bool value_is_valid_e (GLib.Value value) throws GLib.Error; [NoAccessorMethod] public int nb_values { set; } } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_server_operation_get_type ()")] public class ServerOperation : GLib.Object { [CCode (has_construct_function = false)] public ServerOperation (Gda.ServerOperationType op_type, string xml_file); public uint add_item_to_sequence (string seq_path); public bool del_item_from_sequence (string item_path); public static GLib.Quark error_quark (); public string get_node_parent (string path); public string get_node_path_portion (string path); public Gda.ServerOperationNodeType get_node_type (string path, Gda.ServerOperationNodeStatus? status); public Gda.ServerOperationType get_op_type (); [CCode (array_length = false, array_null_terminated = true)] public string[] get_root_nodes (); [CCode (array_length = false, array_null_terminated = true)] public string[] get_sequence_item_names (string path); public uint get_sequence_max_size (string path); public uint get_sequence_min_size (string path); public unowned string get_sequence_name (string path); public uint get_sequence_size (string path); public string get_sql_identifier_at_path (Gda.Connection? cnc, Gda.ServerProvider? prov, string path); [CCode (cname = "gda_server_operation_get_value_at_path")] public unowned GLib.Value? get_value_at (string path); public bool is_valid (string? xml_file) throws GLib.Error; public bool load_data_from_xml ([CCode (type = "xmlNodePtr")] Xml.Node* node) throws GLib.Error; public static unowned string op_type_to_string (Gda.ServerOperationType type); public bool perform_create_database (string? provider) throws GLib.Error; public bool perform_create_table () throws GLib.Error; public bool perform_drop_database (string? provider) throws GLib.Error; public bool perform_drop_table () throws GLib.Error; public static Gda.ServerOperation prepare_create_database (string provider, string? db_name) throws GLib.Error; public static Gda.ServerOperation prepare_drop_database (string provider, string? db_name) throws GLib.Error; public static Gda.ServerOperation prepare_drop_table (Gda.Connection cnc, string table_name) throws GLib.Error; [NoWrapper] public virtual void seq_item_added (string seq_path, int item_index); [NoWrapper] public virtual void seq_item_remove (string seq_path, int item_index); [CCode (cname = "gda_server_operation_set_value_at_path")] public bool set_value_at (string? value, string path) throws GLib.Error; public static Gda.ServerOperationType string_to_op_type (string str); [NoAccessorMethod] public Gda.Connection connection { owned get; construct; } public int op_type { get; construct; } [NoAccessorMethod] public Gda.ServerProvider provider { owned get; construct; } public string spec_filename { construct; } public signal void sequence_item_added (string seq_path, int item_index); public signal void sequence_item_remove (string seq_path, int item_index); } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_server_provider_get_type ()")] public abstract class ServerProvider : GLib.Object { [CCode (has_construct_function = false)] protected ServerProvider (); [NoWrapper] public virtual bool add_savepoint (Gda.Connection cnc, string name) throws GLib.Error; [NoWrapper] public virtual bool begin_transaction (Gda.Connection cnc, string name, Gda.TransactionIsolation level) throws GLib.Error; [NoWrapper] public virtual bool cancel (Gda.Connection cnc, uint task_id) throws GLib.Error; [NoWrapper] public virtual bool close_connection (Gda.Connection cnc); [NoWrapper] public virtual bool commit_transaction (Gda.Connection cnc, string name) throws GLib.Error; public virtual Gda.ServerOperation create_operation (Gda.Connection? cnc, Gda.ServerOperationType type, Gda.Set? options) throws GLib.Error; public virtual Gda.SqlParser create_parser (Gda.Connection? cnc); [NoWrapper] public virtual bool delete_savepoint (Gda.Connection cnc, string name) throws GLib.Error; public static GLib.Quark error_quark (); public virtual string escape_string (Gda.Connection? cnc, string str); public string find_file (string inst_dir, string filename); public unowned Gda.DataHandler get_data_handler_dbms (Gda.Connection? cnc, string for_type); [Version (deprecated = true, deprecated_since = "5.2", replacement = "")] public unowned Gda.DataHandler get_data_handler_default (Gda.Connection? cnc, GLib.Type type, string dbms_type); public unowned Gda.DataHandler get_data_handler_g_type (Gda.Connection? cnc, GLib.Type for_type); [NoWrapper] public virtual unowned string get_database (Gda.Connection cnc); [NoWrapper] public virtual unowned string get_def_dbms_type (Gda.Connection cnc, GLib.Type g_type); public unowned string get_default_dbms_type (Gda.Connection? cnc, GLib.Type type); public virtual unowned string get_name (); public virtual unowned string get_server_version (Gda.Connection cnc); public virtual unowned string get_version (); [NoWrapper] public virtual bool handle_async (Gda.Connection cnc) throws GLib.Error; public void handler_declare (Gda.DataHandler dh, Gda.Connection cnc, GLib.Type g_type, string dbms_type); public unowned Gda.DataHandler handler_find (Gda.Connection? cnc, GLib.Type g_type, string? dbms_type); [NoWrapper] public virtual string identifier_quote (Gda.Connection cnc, string id, bool for_meta_store, bool force_quotes); public unowned Gda.SqlParser internal_get_parser (); [NoWrapper] public virtual bool is_busy (Gda.Connection cnc) throws GLib.Error; public static string load_file_contents (string inst_dir, string data_dir, string filename); public bool perform_operation (Gda.Connection? cnc, Gda.ServerOperation op) throws GLib.Error; public bool perform_operation_default (Gda.Connection? cnc, Gda.ServerOperation op) throws GLib.Error; public virtual string render_operation (Gda.Connection? cnc, Gda.ServerOperation op) throws GLib.Error; [NoWrapper] public virtual bool rollback_savepoint (Gda.Connection cnc, string name) throws GLib.Error; [NoWrapper] public virtual bool rollback_transaction (Gda.Connection cnc, string name) throws GLib.Error; [NoWrapper] public virtual bool statement_prepare (Gda.Connection cnc, Gda.Statement stmt) throws GLib.Error; public GLib.Value? string_to_value (Gda.Connection? cnc, string string, GLib.Type preferred_type, string? dbms_type); public virtual bool supports_feature (Gda.Connection? cnc, Gda.ConnectionFeature feature); public virtual bool supports_operation (Gda.Connection? cnc, Gda.ServerOperationType type, Gda.Set? options); public virtual string unescape_string (Gda.Connection? cnc, string str); public string value_to_sql_string (Gda.Connection? cnc, GLib.Value from); } [CCode (cheader_filename = "libgda/libgda.h")] [Compact] public class ServerProviderInfo { } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_set_get_type ()")] public class Set : GLib.Object { public weak GLib.SList groups_list; public weak GLib.SList nodes_list; public weak GLib.SList sources_list; [CCode (has_construct_function = false)] public Set (GLib.SList holders); public bool add_holder (Gda.Holder holder); public Gda.Set copy (); public static GLib.Quark error_quark (); [CCode (has_construct_function = false)] public Set.from_spec_node ([CCode (type = "xmlNodePtr")] Xml.Node* xml_spec) throws GLib.Error; [CCode (has_construct_function = false)] public Set.from_spec_string (string xml_spec) throws GLib.Error; public unowned Gda.SetGroup get_group (Gda.Holder holder); public unowned Gda.Holder get_holder (string holder_id); public unowned GLib.Value? get_holder_value (string holder_id); public unowned Gda.SetNode get_node (Gda.Holder holder); public unowned Gda.Holder get_nth_holder (int pos); public unowned Gda.SetSource get_source (Gda.Holder holder); public unowned Gda.SetSource get_source_for_model (Gda.DataModel model); public bool is_valid () throws GLib.Error; public void merge_with_set (Gda.Set set_to_merge); [CCode (has_construct_function = false)] public Set.read_only (GLib.SList holders); public void remove_holder (Gda.Holder holder); public void replace_source_model (Gda.SetSource source, Gda.DataModel model); [NoAccessorMethod] public string description { owned get; set; } public void* holders { construct; } [NoAccessorMethod] public string id { owned get; set; } [NoAccessorMethod] public string name { owned get; set; } [NoAccessorMethod] public bool validate_changes { get; set; } public virtual signal void holder_attr_changed (Gda.Holder holder, string attr_name, GLib.Value attr_value); public virtual signal void holder_changed (Gda.Holder holder); public virtual signal void holder_type_set (Gda.Holder holder); public virtual signal void public_data_changed (); public virtual signal void source_model_changed (void* source); public virtual signal GLib.Error validate_holder_change (Gda.Holder holder, GLib.Value new_value); public virtual signal GLib.Error validate_set (); } [CCode (cheader_filename = "libgda/libgda.h", copy_function = "g_boxed_copy", free_function = "g_boxed_free", type_id = "gda_set_group_get_type ()")] [Compact] public class SetGroup { public weak GLib.SList nodes; public weak Gda.SetSource nodes_source; [CCode (has_construct_function = false)] public SetGroup (Gda.SetNode node); public void add_node (Gda.SetNode node); public Gda.SetGroup copy (); public void free (); public int get_n_nodes (); public Gda.SetNode get_node (); public unowned GLib.SList get_nodes (); public Gda.SetSource get_source (); public void set_source (Gda.SetSource source); } [CCode (cheader_filename = "libgda/libgda.h", copy_function = "g_boxed_copy", free_function = "g_boxed_free", type_id = "gda_set_node_get_type ()")] [Compact] public class SetNode { public weak Gda.Holder holder; public int source_column; public weak Gda.DataModel source_model; [CCode (has_construct_function = false)] public SetNode (Gda.Holder holder); public Gda.SetNode copy (); public void free (); public unowned Gda.DataModel get_data_model (); public unowned Gda.Holder get_holder (); public int get_source_column (); public void set_data_model (Gda.DataModel? model); public void set_holder (Gda.Holder holder); public void set_source_column (int column); } [CCode (cheader_filename = "libgda/libgda.h", copy_function = "g_boxed_copy", free_function = "g_boxed_free", type_id = "gda_set_source_get_type ()")] [Compact] public class SetSource { public weak Gda.DataModel data_model; public weak GLib.SList nodes; [CCode (has_construct_function = false)] public SetSource (Gda.DataModel model); public void add_node (Gda.SetNode node); public Gda.SetSource copy (); public void free (); public unowned Gda.DataModel get_data_model (); public int get_n_nodes (); public unowned GLib.SList get_nodes (); public void set_data_model (Gda.DataModel model); } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_short_get_type ()")] public class Short { [CCode (has_construct_function = false)] protected Short (); } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_sql_builder_get_type ()")] public class SqlBuilder : GLib.Object { [CCode (has_construct_function = false)] public SqlBuilder (Gda.SqlStatementType stmt_type); public Gda.SqlBuilderId add_case_v (Gda.SqlBuilderId test_expr, Gda.SqlBuilderId else_expr, [CCode (array_length_cname = "args_size", array_length_pos = 4.1)] Gda.SqlBuilderId[] when_array, [CCode (array_length_cname = "args_size", array_length_pos = 4.1)] Gda.SqlBuilderId[] then_array); public Gda.SqlBuilderId add_cond (Gda.SqlOperatorType op, Gda.SqlBuilderId op1, Gda.SqlBuilderId op2, Gda.SqlBuilderId op3); public Gda.SqlBuilderId add_expr_value (Gda.DataHandler? dh, GLib.Value? value); public Gda.SqlBuilderId add_field_id (string field_name, string? table_name); public void add_field_value_as_gvalue (string field_name, GLib.Value? value); public void add_field_value_id (Gda.SqlBuilderId field_id, Gda.SqlBuilderId value_id); public Gda.SqlBuilderId add_function_v (string func_name, [CCode (array_length_cname = "args_size", array_length_pos = 2.1)] Gda.SqlBuilderId[] args); public Gda.SqlBuilderId add_id (string str); public Gda.SqlBuilderId add_param (string param_name, GLib.Type type, bool nullok); public void compound_add_sub_select_from_builder (Gda.SqlBuilder subselect); public void compound_set_type (Gda.SqlStatementCompoundType compound_type); public static GLib.Quark error_quark (); public Gda.Statement get_statement () throws GLib.Error; public Gda.SqlBuilderId import_expression_from_builder (Gda.SqlBuilder query, Gda.SqlBuilderId expr_id); public void join_add_field (Gda.SqlBuilderId join_id, string field_name); public Gda.SqlBuilderId select_add_field (string field_name, string? table_name, string? alias); public Gda.SqlBuilderId select_add_target (string table_name, string? alias); public Gda.SqlBuilderId select_add_target_id (Gda.SqlBuilderId table_id, string? alias); public void select_group_by (Gda.SqlBuilderId expr_id); public void select_order_by (Gda.SqlBuilderId expr_id, bool asc, string? collation_name); public void select_set_distinct (bool distinct, Gda.SqlBuilderId expr_id); public void select_set_having (Gda.SqlBuilderId cond_id); public void select_set_limit (Gda.SqlBuilderId limit_count_expr_id, Gda.SqlBuilderId limit_offset_expr_id); public void set_table (string table_name); public void set_where (Gda.SqlBuilderId cond_id); } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_sql_parser_get_type ()")] public class SqlParser : GLib.Object, Gda.Lockable { [CCode (has_construct_function = false)] public SqlParser (); public static GLib.Quark error_quark (); public Gda.Batch parse_file_as_batch (string filename) throws GLib.Error; public Gda.Statement parse_string (string sql, out string remain) throws GLib.Error; public Gda.Batch parse_string_as_batch (string sql, out string remain) throws GLib.Error; public void set_overflow_error (); public void set_syntax_error (); [NoAccessorMethod] public int column_error { get; } [NoAccessorMethod] public bool debug { set; } [NoAccessorMethod] public int line_error { get; } [NoAccessorMethod] public int mode { get; set; } [NoAccessorMethod] public int tokenizer_flavour { get; set; } } [CCode (cheader_filename = "libgda/libgda.h")] [Compact] public class SqlStatement { public void compound_set_type (Gda.SqlStatementCompoundType type); public void compound_take_stmt (Gda.SqlStatement s); } [CCode (cheader_filename = "libgda/libgda.h")] [Compact] public class SqlStatementDelete { } [CCode (cheader_filename = "libgda/libgda.h")] [Compact] public class SqlStatementInsert { } [CCode (cheader_filename = "libgda/libgda.h")] [Compact] public class SqlStatementSelect { } [CCode (cheader_filename = "libgda/libgda.h")] [Compact] public class SqlStatementTransaction { } [CCode (cheader_filename = "libgda/libgda.h")] [Compact] public class SqlStatementUnknown { } [CCode (cheader_filename = "libgda/libgda.h")] [Compact] public class SqlStatementUpdate { } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_statement_get_type ()")] public class Statement : GLib.Object { [CCode (has_construct_function = false)] public Statement (); public bool check_structure () throws GLib.Error; public bool check_validity (Gda.Connection? cnc) throws GLib.Error; public Gda.Statement copy (); public static GLib.Quark error_quark (); public bool get_parameters (out Gda.Set out_params) throws GLib.Error; public Gda.SqlStatementType get_statement_type (); public bool is_useless (); public bool normalize (Gda.Connection cnc) throws GLib.Error; public string serialize (); public string to_sql_extended (Gda.Connection? cnc, Gda.Set? @params, Gda.StatementSqlFlag flags, out GLib.SList params_used) throws GLib.Error; public string to_sql_real (Gda.SqlRenderingContext context) throws GLib.Error; [NoAccessorMethod] public void* structure { get; set; } public virtual signal void checked (Gda.Connection cnc, bool checked); public virtual signal void reset (); } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_thread_wrapper_get_type ()")] public class ThreadWrapper : GLib.Object { [CCode (has_construct_function = false)] public ThreadWrapper (); public bool cancel (uint id); public ulong connect_raw (void* instance, string sig_name, bool private_thread, bool private_job, Gda.ThreadWrapperCallback callback); public void disconnect (ulong id); public static GLib.Quark error_quark (); public uint execute_void ([CCode (destroy_notify_pos = 2.1)] owned Gda.ThreadWrapperVoidFunc func, void* arg) throws GLib.Error; public void* fetch_result (bool may_lock, uint exp_id) throws GLib.Error; public unowned GLib.IOChannel get_io_channel (); public int get_waiting_size (); public void iterate (bool may_block); public void steal_signal (ulong id); public void unset_io_channel (); } [CCode (cheader_filename = "libgda/libgda.h", copy_function = "g_boxed_copy", free_function = "g_boxed_free", type_id = "gda_time_get_type ()")] [Compact] public class Time { public ulong fraction; public ushort hour; public ushort minute; public ushort second; public long timezone; public void change_timezone (long ntz); public static void* copy (void* boxed); public static void free (void* boxed); public bool valid (); } [CCode (cheader_filename = "libgda/libgda.h", copy_function = "g_boxed_copy", free_function = "g_boxed_free", type_id = "gda_timestamp_get_type ()")] [Compact] public class Timestamp { public ushort day; public ulong fraction; public ushort hour; public ushort minute; public ushort month; public ushort second; public long timezone; public short year; public void change_timezone (long ntz); public static void* copy (void* boxed); public static void free (void* boxed); public bool valid (); } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_transaction_status_get_type ()")] public class TransactionStatus : GLib.Object { public weak GLib.List events; public Gda.TransactionIsolation isolation_level; public weak string name; public Gda.TransactionStatusState state; [CCode (has_construct_function = false)] public TransactionStatus (string name); public Gda.TransactionStatus find (string str, Gda.TransactionStatusEvent destev); public Gda.TransactionStatus find_current (Gda.TransactionStatusEvent destev, bool unnamed_only); public void free_events (Gda.TransactionStatusEvent event, bool free_after); } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_tree_get_type ()")] public class Tree : GLib.Object { [CCode (has_construct_function = false)] public Tree (); public void add_manager (Gda.TreeManager manager); public void clean (); public void dump (Gda.TreeNode? node, void* stream); public static GLib.Quark error_quark (); public unowned Gda.TreeNode get_node (string tree_path, bool use_names); public unowned Gda.TreeManager get_node_manager (Gda.TreeNode node); public string get_node_path (Gda.TreeNode node); public GLib.SList get_nodes_in_path (string? tree_path, bool use_names); public void set_attribute (string attribute, GLib.Value value, GLib.DestroyNotify destroy); public bool update_all () throws GLib.Error; public bool update_children (Gda.TreeNode? node) throws GLib.Error; public bool update_part (Gda.TreeNode node) throws GLib.Error; [NoAccessorMethod] public bool is_list { get; } public virtual signal void node_changed (Gda.TreeNode node); public virtual signal void node_deleted (string node_path); public virtual signal void node_has_child_toggled (Gda.TreeNode node); public virtual signal void node_inserted (Gda.TreeNode node); } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_tree_manager_get_type ()")] public class TreeManager : GLib.Object { [CCode (has_construct_function = false)] protected TreeManager (); public void add_manager (Gda.TreeManager sub); public void add_new_node_attribute (string attribute, GLib.Value? value); public Gda.TreeNode create_node (Gda.TreeNode? parent, string? name); public static GLib.Quark error_quark (); public unowned GLib.SList get_managers (); [NoAccessorMethod] public void* func { get; set construct; } [NoAccessorMethod] public bool recursive { get; set construct; } } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_tree_mgr_columns_get_type ()")] public class TreeMgrColumns : Gda.TreeManager { [CCode (has_construct_function = false, type = "GdaTreeManager*")] public TreeMgrColumns (Gda.Connection cnc, string schema, string table_name); [NoAccessorMethod] public Gda.Connection connection { owned get; construct; } [NoAccessorMethod] public Gda.MetaStore meta_store { owned get; construct; } public string schema { construct; } public string table_name { construct; } } [CCode (cheader_filename = "libgda/libgda.h")] [Compact] public class TreeMgrColumnsPriv { } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_tree_mgr_label_get_type ()")] public class TreeMgrLabel : Gda.TreeManager { [CCode (has_construct_function = false, type = "GdaTreeManager*")] public TreeMgrLabel (string label); public string label { construct; } } [CCode (cheader_filename = "libgda/libgda.h")] [Compact] public class TreeMgrLabelPriv { } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_tree_mgr_ldap_get_type ()")] public class TreeMgrLdap : Gda.TreeManager { [CCode (has_construct_function = false, type = "GdaTreeManager*")] public TreeMgrLdap (Gda.Connection cnc, string? dn); [NoAccessorMethod] public string dn { owned get; construct; } } [CCode (cheader_filename = "libgda/libgda.h")] [Compact] public class TreeMgrLdapPriv { } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_tree_mgr_schemas_get_type ()")] public class TreeMgrSchemas : Gda.TreeManager { [CCode (has_construct_function = false, type = "GdaTreeManager*")] public TreeMgrSchemas (Gda.Connection cnc); [NoAccessorMethod] public Gda.Connection connection { owned get; construct; } [NoAccessorMethod] public Gda.MetaStore meta_store { owned get; construct; } } [CCode (cheader_filename = "libgda/libgda.h")] [Compact] public class TreeMgrSchemasPriv { } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_tree_mgr_select_get_type ()")] public class TreeMgrSelect : Gda.TreeManager { [CCode (has_construct_function = false, type = "GdaTreeManager*")] public TreeMgrSelect (Gda.Connection cnc, Gda.Statement stmt, Gda.Set @params); [NoAccessorMethod] public Gda.Connection connection { owned get; construct; } [NoAccessorMethod] public Gda.Set @params { owned get; construct; } [NoAccessorMethod] public Gda.Statement statement { owned get; construct; } } [CCode (cheader_filename = "libgda/libgda.h")] [Compact] public class TreeMgrSelectPriv { } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_tree_mgr_tables_get_type ()")] public class TreeMgrTables : Gda.TreeManager { [CCode (has_construct_function = false, type = "GdaTreeManager*")] public TreeMgrTables (Gda.Connection cnc, string? schema); [NoAccessorMethod] public Gda.Connection connection { owned get; construct; } [NoAccessorMethod] public Gda.MetaStore meta_store { owned get; construct; } public string schema { construct; } } [CCode (cheader_filename = "libgda/libgda.h")] [Compact] public class TreeMgrTablesPriv { } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_tree_node_get_type ()")] public class TreeNode : GLib.Object { [CCode (has_construct_function = false)] public TreeNode (string? name); [NoWrapper] public virtual void dump_children (string prefix, GLib.StringBuilder in_string); [NoWrapper] public virtual string dump_header (); public static GLib.Quark error_quark (); public unowned GLib.Value? fetch_attribute (string attribute); public unowned Gda.TreeNode get_child_index (int index); public unowned Gda.TreeNode get_child_name (string name); public GLib.SList get_children (); public unowned GLib.Value? get_node_attribute (string attribute); public unowned Gda.TreeNode get_parent (); public void set_node_attribute (string attribute, GLib.Value? value, GLib.DestroyNotify destroy); [NoAccessorMethod] public string name { owned get; set; } public virtual signal void node_changed (Gda.TreeNode node); public virtual signal void node_deleted (string relative_path); public virtual signal void node_has_child_toggled (Gda.TreeNode node); public virtual signal void node_inserted (Gda.TreeNode node); } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_ushort_get_type ()")] public class UShort { [CCode (has_construct_function = false)] protected UShort (); } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_xa_transaction_get_type ()")] public class XaTransaction : GLib.Object { [CCode (has_construct_function = false)] public XaTransaction (uint32 format, string global_transaction_id); public bool begin () throws GLib.Error; public bool commit (out GLib.SList cnc_to_recover) throws GLib.Error; public bool commit_recovered (out GLib.SList cnc_to_recover) throws GLib.Error; public static GLib.Quark error_quark (); public bool register_connection (Gda.Connection cnc, string branch) throws GLib.Error; public bool rollback () throws GLib.Error; public void unregister_connection (Gda.Connection cnc); [NoAccessorMethod] public uint format_id { get; construct; } [NoAccessorMethod] public string transaction_id { owned get; construct; } } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_data_handler_get_type ()")] public interface DataHandler : GLib.Object { public abstract bool accepts_g_type (GLib.Type type); public static unowned Gda.DataHandler get_default (GLib.Type for_type); public abstract unowned string get_descr (); public abstract GLib.Value? get_sane_init_value (GLib.Type type); public abstract string get_sql_from_value (GLib.Value? value); public abstract string get_str_from_value (GLib.Value? value); public abstract GLib.Value? get_value_from_sql (string? sql, GLib.Type type); public abstract GLib.Value? get_value_from_str (string? str, GLib.Type type); } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_data_model_get_type ()")] public interface DataModel : GLib.Object { public bool add_data_from_xml_node ([CCode (type = "xmlNodePtr")] Xml.Node* node) throws GLib.Error; [CCode (vfunc_name = "i_append_row")] public abstract int append_row () throws GLib.Error; [CCode (vfunc_name = "i_append_values")] public abstract int append_values (GLib.List? values) throws GLib.Error; public Gda.DataModelArray array_copy_model () throws GLib.Error; public Gda.DataModelArray array_copy_model_ext ([CCode (array_length_cname = "ncols", array_length_pos = 0.5)] int[] cols) throws GLib.Error; [CCode (vfunc_name = "i_create_iter")] public abstract Gda.DataModelIter create_iter (); [CCode (vfunc_name = "i_describe_column")] public abstract unowned Gda.Column describe_column (int col); public void dump (void* to_stream); public string dump_as_string (); public static GLib.Quark error_quark (); public bool export_to_file (Gda.DataModelIOFormat format, string file, [CCode (array_length_cname = "nb_cols", array_length_pos = 3.5)] int[]? cols, [CCode (array_length_cname = "nb_rows", array_length_pos = 4.5)] int[]? rows, Gda.Set options) throws GLib.Error; public string export_to_string (Gda.DataModelIOFormat format, [CCode (array_length_cname = "nb_cols", array_length_pos = 2.5)] int[]? cols, [CCode (array_length_cname = "nb_rows", array_length_pos = 3.5)] int[]? rows, Gda.Set options); public void freeze (); [CCode (vfunc_name = "i_get_access_flags")] public abstract Gda.DataModelAccessFlags get_access_flags (); [CCode (vfunc_name = "i_get_attributes_at")] public abstract Gda.ValueAttribute get_attributes_at (int col, int row); public int get_column_index (string name); public unowned string get_column_name (int col); public unowned string get_column_title (int col); [CCode (array_length = false, array_null_terminated = true, vfunc_name = "i_get_exceptions")] public abstract unowned GLib.Error[] get_exceptions (); [CCode (vfunc_name = "i_get_n_columns")] public abstract int get_n_columns (); [CCode (vfunc_name = "i_get_n_rows")] public abstract int get_n_rows (); [CCode (vfunc_name = "i_get_notify")] public abstract bool get_notify (); [CCode (vfunc_name = "i_find_row")] public abstract int get_row_from_values (GLib.SList values, [CCode (array_length = false)] int[] cols_index); public unowned GLib.Value? get_typed_value_at (int col, int row, GLib.Type expected_type, bool nullok) throws GLib.Error; [CCode (vfunc_name = "i_get_value_at")] public abstract unowned GLib.Value? get_value_at (int col, int row) throws GLib.Error; public bool import_from_file (string file, GLib.HashTable? cols_trans, Gda.Set options) throws GLib.Error; public bool import_from_model (Gda.DataModel from, bool overwrite, GLib.HashTable? cols_trans) throws GLib.Error; public bool import_from_string (string string, GLib.HashTable? cols_trans, Gda.Set options) throws GLib.Error; [CCode (vfunc_name = "i_iter_at_row")] [Version (deprecated = true, deprecated_since = "5.2", replacement = "")] public abstract bool iter_at_row (Gda.DataModelIter iter, int row); [CCode (vfunc_name = "i_iter_next")] [Version (deprecated = true, deprecated_since = "5.2", replacement = "")] public abstract bool iter_next (Gda.DataModelIter iter); [CCode (vfunc_name = "i_iter_prev")] [Version (deprecated = true, deprecated_since = "5.2", replacement = "")] public abstract bool iter_prev (Gda.DataModelIter iter); [CCode (vfunc_name = "i_iter_set_value")] [Version (deprecated = true, deprecated_since = "5.2", replacement = "")] public abstract bool iter_set_value (Gda.DataModelIter iter, int col, GLib.Value value) throws GLib.Error; [CCode (vfunc_name = "i_remove_row")] public abstract bool remove_row (int row) throws GLib.Error; [CCode (vfunc_name = "i_send_hint")] public abstract void send_hint (Gda.DataModelHint hint, GLib.Value? hint_value); public void set_column_name (int col, string name); public void set_column_title (int col, string title); [CCode (vfunc_name = "i_set_notify")] [Version (deprecated = true, deprecated_since = "5.2", replacement = "")] public abstract void set_notify (bool do_notify_changes); [CCode (vfunc_name = "i_set_value_at")] public abstract bool set_value_at (int col, int row, GLib.Value value) throws GLib.Error; [CCode (vfunc_name = "i_set_values")] public abstract bool set_values (int row, GLib.List? values) throws GLib.Error; public void thaw (); public virtual signal void access_changed (); public virtual signal void changed (); [HasEmitter] public virtual signal void reset (); [HasEmitter] public virtual signal void row_inserted (int row); [HasEmitter] public virtual signal void row_removed (int row); [HasEmitter] public virtual signal void row_updated (int row); } [CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_lockable_get_type ()")] public interface Lockable : GLib.Object { [NoWrapper] public abstract void i_lock (); [NoWrapper] public abstract bool i_trylock (); [NoWrapper] public abstract void i_unlock (); public void @lock (); public bool trylock (); public void unlock (); } [CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)] public struct Diff { public Gda.DiffType type; public int old_row; public int new_row; public weak GLib.HashTable values; } [CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)] public struct MetaDbObject { public Gda.MetaDbObjectType obj_type; public bool outdated; public weak string obj_catalog; public weak string obj_schema; public weak string obj_name; public weak string obj_short_name; public weak string obj_full_name; public weak string obj_owner; public weak GLib.SList depend_list; [CCode (cname = "extra.meta_table")] public Gda.MetaTable extra_meta_table; [CCode (cname = "extra.meta_view")] public Gda.MetaView extra_meta_view; } [CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)] public struct MetaStoreChange { public Gda.MetaStoreChangeType c_type; public weak string table_name; public weak GLib.HashTable keys; } [CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)] public struct MetaTable { public weak GLib.SList columns; public int pk_cols_array; public int pk_cols_nb; public weak GLib.SList reverse_fk_list; public weak GLib.SList fk_list; } [CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)] public struct MetaTableColumn { public weak string column_name; public weak string column_type; public GLib.Type gtype; public bool pkey; public bool nullok; public weak string default_value; public void foreach_attribute (Gda.AttributesManagerFunc func); public unowned GLib.Value? get_attribute (string attribute); public void set_attribute (string attribute, GLib.Value? value, GLib.DestroyNotify? destroy); } [CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)] public struct MetaTableForeignKey { public Gda.MetaDbObject meta_table; public Gda.MetaDbObject depend_on; public int cols_nb; public int fk_cols_array; public weak string fk_names_array; public int ref_pk_cols_array; public weak string ref_pk_names_array; public weak string fk_name; } [CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)] public struct MetaView { public Gda.MetaTable table; public weak string view_def; public bool is_updatable; } [CCode (cheader_filename = "libgda/libgda.h")] public struct Mutex : GLib.RecMutex { public static void free (Gda.Mutex mutex); public static void @lock (Gda.Mutex mutex); public static bool trylock (Gda.Mutex mutex); public static void unlock (Gda.Mutex mutex); } [CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)] public struct ProviderInfo { public weak string id; public weak string location; public weak string description; public weak Gda.Set dsn_params; public weak Gda.Set auth_params; } [CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)] public struct ServerOperationNode { public Gda.ServerOperationNodeType type; public Gda.ServerOperationNodeStatus status; public weak Gda.Set plist; public weak Gda.DataModel model; public weak Gda.Column column; public weak Gda.Holder param; } [CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)] public struct ServerProviderHandlerInfo { public weak Gda.Connection cnc; public GLib.Type g_type; public weak string dbms_type; } [CCode (cheader_filename = "libgda/libgda.h")] [SimpleType] public struct SqlBuilderId : uint { } [CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)] public struct SqlParserIface { public weak Gda.SqlParser parser; public weak Gda.SqlStatement parsed_statement; } [CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)] public struct SqlRenderingContext { public Gda.StatementSqlFlag flags; public weak Gda.Set @params; public weak GLib.SList params_used; public weak Gda.ServerProvider provider; public weak Gda.Connection cnc; public weak Gda.SqlRenderingValue render_value; } [CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)] public struct ThreadNotification { public Gda.ThreadNotificationType type; public uint job_id; } [CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)] public struct TransactionStatusEvent { public weak Gda.TransactionStatus trans; public Gda.TransactionStatusEventType type; public weak Gda.ConnectionEvent conn_event; [CCode (cname = "pl.svp_name")] public weak string pl_svp_name; [CCode (cname = "pl.sql")] public weak string pl_sql; [CCode (cname = "pl.sub_trans")] public weak Gda.TransactionStatus pl_sub_trans; } [CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)] public struct XaTransactionId { public uint32 format; public ushort gtrid_length; public ushort bqual_length; [CCode (array_length = false, array_null_terminated = true)] public weak char[] data; public string to_string (); } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_BATCH_CONFLICTING_PARAMETER_", has_type_id = false)] public enum BatchError { [CCode (cname = "GDA_BATCH_CONFLICTING_PARAMETER_ERROR")] BATCH_CONFLICTING_PARAMETER_ERROR } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_CONFIG_", has_type_id = false)] public enum ConfigError { DSN_NOT_FOUND_ERROR, PERMISSION_ERROR, PROVIDER_NOT_FOUND_ERROR, PROVIDER_CREATION_ERROR } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_CONNECTION_", has_type_id = false)] public enum ConnectionError { DSN_NOT_FOUND_ERROR, PROVIDER_NOT_FOUND_ERROR, PROVIDER_ERROR, NO_CNC_SPEC_ERROR, NO_PROVIDER_SPEC_ERROR, OPEN_ERROR, STATEMENT_TYPE_ERROR, CANT_LOCK_ERROR, TASK_NOT_FOUND_ERROR, UNSUPPORTED_THREADS_ERROR, CLOSED_ERROR, META_DATA_CONTEXT_ERROR, UNSUPPORTED_ASYNC_EXEC_ERROR } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_CONNECTION_EVENT_CODE_", has_type_id = false)] public enum ConnectionEventCode { CONSTRAINT_VIOLATION, RESTRICT_VIOLATION, NOT_NULL_VIOLATION, FOREIGN_KEY_VIOLATION, UNIQUE_VIOLATION, CHECK_VIOLATION, INSUFFICIENT_PRIVILEGES, UNDEFINED_COLUMN, UNDEFINED_FUNCTION, UNDEFINED_TABLE, DUPLICATE_COLUMN, DUPLICATE_DATABASE, DUPLICATE_FUNCTION, DUPLICATE_SCHEMA, DUPLICATE_TABLE, DUPLICATE_ALIAS, DUPLICATE_OBJECT, SYNTAX_ERROR, UNKNOWN } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_CONNECTION_EVENT_", has_type_id = false)] public enum ConnectionEventType { NOTICE, WARNING, ERROR, COMMAND } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_CONNECTION_FEATURE_", has_type_id = false)] public enum ConnectionFeature { AGGREGATES, BLOBS, INDEXES, INHERITANCE, NAMESPACES, PROCEDURES, SEQUENCES, SQL, TRANSACTIONS, SAVEPOINTS, SAVEPOINTS_REMOVE, TRIGGERS, UPDATABLE_CURSOR, USERS, VIEWS, XA_TRANSACTIONS, MULTI_THREADING, ASYNC_EXEC, LAST } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_CONNECTION_META_", has_type_id = false)] public enum ConnectionMetaType { NAMESPACES, TYPES, TABLES, VIEWS, FIELDS, INDEXES } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_CONNECTION_OPTIONS_", has_type_id = false)] [Flags] public enum ConnectionOptions { NONE, READ_ONLY, SQL_IDENTIFIERS_CASE_SENSITIVE, THREAD_SAFE, THREAD_ISOLATED, AUTO_META_DATA } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_DATA_COMPARATOR_", has_type_id = false)] public enum DataComparatorError { MISSING_DATA_MODEL_ERROR, COLUMN_TYPES_MISMATCH_ERROR, MODEL_ACCESS_ERROR, USER_CANCELLED_ERROR } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_DATA_MODEL_ACCESS_", has_type_id = false)] [Flags] public enum DataModelAccessFlags { RANDOM, CURSOR_FORWARD, CURSOR_BACKWARD, CURSOR, INSERT, UPDATE, DELETE, WRITE } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_DATA_MODEL_HINT_", has_type_id = false)] public enum DataModelHint { START_BATCH_UPDATE, END_BATCH_UPDATE, REFRESH } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_DATA_MODEL_IO_", has_type_id = false)] public enum DataModelIOFormat { DATA_ARRAY_XML, TEXT_SEPARATED, TEXT_TABLE } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_DATA_MODEL_ITER_COLUMN_OUT_OF_RANGE_", has_type_id = false)] public enum DataModelIterError { [CCode (cname = "GDA_DATA_MODEL_ITER_COLUMN_OUT_OF_RANGE_ERROR")] DATA_MODEL_ITER_COLUMN_OUT_OF_RANGE_ERROR } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_DATA_PIVOT_", has_type_id = false)] public enum DataPivotAggregate { AVG, COUNT, MAX, MIN, SUM } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_DATA_PIVOT_", has_type_id = false)] public enum DataPivotError { INTERNAL_ERROR, SOURCE_MODEL_ERROR, FIELD_FORMAT_ERROR, USAGE_ERROR, OVERFLOW_ERROR } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_DATA_PIVOT_FIELD_", has_type_id = false)] public enum DataPivotFieldType { ROW, COLUMN } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_DATA_PROXY_", has_type_id = false)] public enum DataProxyError { COMMIT_ERROR, COMMIT_CANCELLED, READ_ONLY_VALUE, READ_ONLY_ROW, FILTER_ERROR } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_DATA_SELECT_COND_", has_type_id = false)] public enum DataSelectConditionType { PK, ALL_COLUMNS } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_DATA_SELECT_", has_type_id = false)] public enum DataSelectError { MODIFICATION_STATEMENT_ERROR, MISSING_MODIFICATION_STATEMENT_ERROR, CONNECTION_ERROR, ACCESS_ERROR, SQL_ERROR, SAFETY_LOCKED_ERROR } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_DIFF_", has_type_id = false)] public enum DiffType { ADD_ROW, REMOVE_ROW, MODIFY_ROW } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_HOLDER_", has_type_id = false)] public enum HolderError { STRING_CONVERSION_ERROR, VALUE_TYPE_ERROR, VALUE_NULL_ERROR } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_LDAP_SEARCH_", has_type_id = false)] public enum LdapSearchScope { BASE, ONELEVEL, SUBTREE } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_META_DB_", has_type_id = false)] public enum MetaDbObjectType { UNKNOWN, TABLE, VIEW } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_META_FOREIGN_KEY_", has_type_id = false)] public enum MetaForeignKeyPolicy { UNKNOWN, NONE, NO_ACTION, RESTRICT, CASCADE, SET_NULL, SET_DEFAULT } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_META_GRAPH_", has_type_id = false)] [Flags] public enum MetaGraphInfo { [CCode (cname = "GDA_META_GRAPH_COLUMNS")] META_GRAPH_COLUMNS } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_META_SORT_", has_type_id = false)] public enum MetaSortType { ALHAPETICAL, DEPENDENCIES } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_META_STORE_", has_type_id = false)] public enum MetaStoreChangeType { ADD, REMOVE, MODIFY } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_META_STORE_", has_type_id = false)] public enum MetaStoreError { INCORRECT_SCHEMA_ERROR, UNSUPPORTED_PROVIDER_ERROR, INTERNAL_ERROR, META_CONTEXT_ERROR, MODIFY_CONTENTS_ERROR, EXTRACT_SQL_ERROR, ATTRIBUTE_NOT_FOUND_ERROR, ATTRIBUTE_ERROR, SCHEMA_OBJECT_NOT_FOUND_ERROR, SCHEMA_OBJECT_CONFLICT_ERROR, SCHEMA_OBJECT_DESCR_ERROR, TRANSACTION_ALREADY_STARTED_ERROR } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_META_STRUCT_", has_type_id = false)] public enum MetaStructError { UNKNOWN_OBJECT_ERROR, DUPLICATE_OBJECT_ERROR, INCOHERENCE_ERROR, XML_ERROR } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_META_STRUCT_FEATURE_", has_type_id = false)] [Flags] public enum MetaStructFeature { NONE, FOREIGN_KEYS, VIEW_DEPENDENCIES, ALL } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_SERVER_OPERATION_CREATE_TABLE_", has_type_id = false)] [Flags] public enum ServerOperationCreateTableFlag { NOTHING_FLAG, PKEY_FLAG, NOT_NULL_FLAG, UNIQUE_FLAG, AUTOINC_FLAG, FKEY_FLAG, PKEY_AUTOINC_FLAG } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_SERVER_OPERATION_", has_type_id = false)] public enum ServerOperationError { OBJECT_NAME_ERROR, INCORRECT_VALUE_ERROR, XML_ERROR } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_SERVER_OPERATION_STATUS_", has_type_id = false)] public enum ServerOperationNodeStatus { OPTIONAL, REQUIRED, UNKNOWN } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_SERVER_OPERATION_NODE_", has_type_id = false)] public enum ServerOperationNodeType { PARAMLIST, DATA_MODEL, PARAM, SEQUENCE, SEQUENCE_ITEM, DATA_MODEL_COLUMN, UNKNOWN } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_SERVER_OPERATION_", has_type_id = false)] public enum ServerOperationType { CREATE_DB, DROP_DB, CREATE_TABLE, DROP_TABLE, RENAME_TABLE, ADD_COLUMN, DROP_COLUMN, CREATE_INDEX, DROP_INDEX, CREATE_VIEW, DROP_VIEW, COMMENT_TABLE, COMMENT_COLUMN, CREATE_USER, ALTER_USER, DROP_USER, LAST } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_SERVER_PROVIDER_", has_type_id = false)] public enum ServerProviderError { METHOD_NON_IMPLEMENTED_ERROR, PREPARE_STMT_ERROR, EMPTY_STMT_ERROR, MISSING_PARAM_ERROR, STATEMENT_EXEC_ERROR, OPERATION_ERROR, INTERNAL_ERROR, BUSY_ERROR, NON_SUPPORTED_ERROR, SERVER_VERSION_ERROR, DATA_ERROR, DEFAULT_VALUE_HANDLING_ERROR, MISUSE_ERROR, FILE_NOT_FOUND_ERROR } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_SET_", has_type_id = false)] public enum SetError { XML_SPEC_ERROR, HOLDER_NOT_FOUND_ERROR, INVALID_ERROR, READ_ONLY_ERROR, IMPLEMENTATION_ERROR } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_SQL_BUILDER_", has_type_id = false)] public enum SqlBuilderError { WRONG_TYPE_ERROR, MISUSE_ERROR } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_SQL_IDENTIFIERS_", has_type_id = false)] [Flags] public enum SqlIdentifierStyle { LOWER_CASE, UPPER_CASE } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_SQL_OPERATOR_TYPE_", has_type_id = false)] public enum SqlOperatorType { AND, OR, EQ, IS, LIKE, BETWEEN, GT, LT, GEQ, LEQ, DIFF, REGEXP, REGEXP_CI, NOT_REGEXP, NOT_REGEXP_CI, SIMILAR, ISNULL, ISNOTNULL, NOT, IN, NOTIN, CONCAT, PLUS, MINUS, STAR, DIV, REM, BITAND, BITOR, BITNOT, ILIKE, NOTLIKE, NOTILIKE } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_SQL_PARSER_", has_type_id = false)] public enum SqlParserError { SYNTAX_ERROR, OVERFLOW_ERROR, EMPTY_SQL_ERROR } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_SQL_PARSER_FLAVOUR_", has_type_id = false)] public enum SqlParserFlavour { STANDARD, SQLITE, MYSQL, ORACLE, POSTGRESQL } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_SQL_PARSER_MODE_", has_type_id = false)] public enum SqlParserMode { PARSE, DELIMIT } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_SQL_SELECT_JOIN_", has_type_id = false)] public enum SqlSelectJoinType { CROSS, NATURAL, INNER, LEFT, RIGHT, FULL; public static unowned string to_string (Gda.SqlSelectJoinType type); } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_SQL_STATEMENT_COMPOUND_", has_type_id = false)] public enum SqlStatementCompoundType { UNION, UNION_ALL, INTERSECT, INTERSECT_ALL, EXCEPT, EXCEPT_ALL } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_SQL_STATEMENT_", has_type_id = false)] public enum SqlStatementType { SELECT, INSERT, UPDATE, DELETE, COMPOUND, BEGIN, ROLLBACK, COMMIT, SAVEPOINT, ROLLBACK_SAVEPOINT, DELETE_SAVEPOINT, UNKNOWN, NONE } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_STATEMENT_", has_type_id = false)] public enum StatementError { PARSE_ERROR, SYNTAX_ERROR, NO_CNC_ERROR, CNC_CLOSED_ERROR, EXEC_ERROR, PARAM_TYPE_ERROR, PARAM_ERROR } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_STATEMENT_MODEL_", has_type_id = false)] [Flags] public enum StatementModelUsage { RANDOM_ACCESS, CURSOR_FORWARD, CURSOR_BACKWARD, CURSOR, ALLOW_NOPARAM, OFFLINE } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_STATEMENT_SQL_", has_type_id = false)] [Flags] public enum StatementSqlFlag { PARAMS_AS_VALUES, PRETTY, PARAMS_LONG, PARAMS_SHORT, PARAMS_AS_COLON, PARAMS_AS_DOLLAR, PARAMS_AS_QMARK, PARAMS_AS_UQMARK, TIMEZONE_TO_GMT } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_THREAD_NOTIFICATION_", has_type_id = false)] public enum ThreadNotificationType { JOB, SIGNAL } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_THREAD_WRAPPER_UNKNOWN_", has_type_id = false)] public enum ThreadWrapperError { [CCode (cname = "GDA_THREAD_WRAPPER_UNKNOWN_ERROR")] THREAD_WRAPPER_UNKNOWN_ERROR } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_TRANSACTION_ISOLATION_", has_type_id = false)] public enum TransactionIsolation { UNKNOWN, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_TRANSACTION_STATUS_EVENT_", has_type_id = false)] public enum TransactionStatusEventType { SAVEPOINT, SQL, SUB_TRANSACTION } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_TRANSACTION_STATUS_STATE_", has_type_id = false)] public enum TransactionStatusState { OK, FAILED } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_TREE_UNKNOWN_", has_type_id = false)] public enum TreeError { [CCode (cname = "GDA_TREE_UNKNOWN_ERROR")] TREE_UNKNOWN_ERROR } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_TREE_MANAGER_UNKNOWN_", has_type_id = false)] public enum TreeManagerError { [CCode (cname = "GDA_TREE_MANAGER_UNKNOWN_ERROR")] TREE_MANAGER_UNKNOWN_ERROR } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_TREE_NODE_UNKNOWN_", has_type_id = false)] public enum TreeNodeError { [CCode (cname = "GDA_TREE_NODE_UNKNOWN_ERROR")] TREE_NODE_UNKNOWN_ERROR } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_VALUE_ATTR_", has_type_id = false)] [Flags] public enum ValueAttribute { NONE, IS_NULL, CAN_BE_NULL, IS_DEFAULT, CAN_BE_DEFAULT, IS_UNCHANGED, ACTIONS_SHOWN, DATA_NON_VALID, HAS_VALUE_ORIG, NO_MODIF, UNUSED } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_XA_TRANSACTION_", has_type_id = false)] public enum XaTransactionError { ALREADY_REGISTERED_ERROR, DTP_NOT_SUPPORTED_ERROR, CONNECTION_BRANCH_LENGTH_ERROR } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_DATA_MODEL_")] public errordomain DataModelError { ROW_OUT_OF_RANGE_ERROR, COLUMN_OUT_OF_RANGE_ERROR, VALUES_LIST_ERROR, VALUE_TYPE_ERROR, ROW_NOT_FOUND_ERROR, ACCESS_ERROR, FEATURE_NON_SUPPORTED_ERROR, FILE_EXIST_ERROR, XML_FORMAT_ERROR, TRUNCATED_ERROR, OTHER_ERROR; public static GLib.Quark quark (); } [CCode (cheader_filename = "libgda/libgda.h", cprefix = "GDA_SQL_")] public errordomain SqlError { STRUCTURE_CONTENTS_ERROR, MALFORMED_IDENTIFIER_ERROR, MISSING_IDENTIFIER_ERROR, VALIDATION_ERROR; public static GLib.Quark quark (); } [CCode (cheader_filename = "libgda/libgda.h", has_target = false)] public delegate void AttributesManagerFunc (string att_name, GLib.Value value, void* data); [CCode (cheader_filename = "libgda/libgda.h", has_target = false)] public delegate void AttributesManagerSignal (GLib.Object obj, string att_name, GLib.Value value, void* data); [CCode (cheader_filename = "libgda/libgda.h", has_target = false)] public delegate void ServerProviderAsyncCallback (Gda.ServerProvider provider, Gda.Connection cnc, uint task_id, bool result_status, GLib.Error error, void* data); [CCode (cheader_filename = "libgda/libgda.h", has_target = false)] public delegate void ServerProviderExecCallback (Gda.ServerProvider provider, Gda.Connection cnc, uint task_id, GLib.Object result_obj, GLib.Error error, void* data); [CCode (cheader_filename = "libgda/libgda.h", has_target = false)] public delegate string SqlRenderingValue (GLib.Value value, Gda.SqlRenderingContext context) throws GLib.Error; [CCode (cheader_filename = "libgda/libgda.h", has_target = false)] public delegate bool SqlReservedKeywordsFunc (string word); [CCode (cheader_filename = "libgda/libgda.h", has_target = false)] public delegate void ThreadWrapperCallback (Gda.ThreadWrapper wrapper, void* instance, string signame, int n_param_values, GLib.Value param_values, void* gda_reserved, void* data); [CCode (cheader_filename = "libgda/libgda.h", has_target = false)] public delegate void ThreadWrapperVoidFunc (void* arg) throws GLib.Error; [CCode (cheader_filename = "libgda/libgda.h", cname = "GDA_ATTRIBUTE_AUTO_INCREMENT")] public const string ATTRIBUTE_AUTO_INCREMENT; [CCode (cheader_filename = "libgda/libgda.h", cname = "GDA_ATTRIBUTE_DESCRIPTION")] public const string ATTRIBUTE_DESCRIPTION; [CCode (cheader_filename = "libgda/libgda.h", cname = "GDA_ATTRIBUTE_IS_DEFAULT")] public const string ATTRIBUTE_IS_DEFAULT; [CCode (cheader_filename = "libgda/libgda.h", cname = "GDA_ATTRIBUTE_NAME")] public const string ATTRIBUTE_NAME; [CCode (cheader_filename = "libgda/libgda.h", cname = "GDA_ATTRIBUTE_NUMERIC_PRECISION")] public const string ATTRIBUTE_NUMERIC_PRECISION; [CCode (cheader_filename = "libgda/libgda.h", cname = "GDA_ATTRIBUTE_NUMERIC_SCALE")] public const string ATTRIBUTE_NUMERIC_SCALE; [CCode (cheader_filename = "libgda/libgda.h", cname = "GDA_ATTRIBUTE_TREE_NODE_UNKNOWN_CHILDREN")] public const string ATTRIBUTE_TREE_NODE_UNKNOWN_CHILDREN; [CCode (cheader_filename = "libgda/libgda.h", cname = "GDA_EXTRA_AUTO_INCREMENT")] public const string EXTRA_AUTO_INCREMENT; [CCode (cheader_filename = "libgda/libgda.h", cname = "GDA_SQLSTATE_GENERAL_ERROR")] public const string SQLSTATE_GENERAL_ERROR; [CCode (cheader_filename = "libgda/libgda.h", cname = "GDA_SQLSTATE_NO_ERROR")] public const string SQLSTATE_NO_ERROR; [CCode (cheader_filename = "libgda/libgda.h", cname = "GDA_TIMEZONE_INVALID")] public const int TIMEZONE_INVALID; [CCode (cheader_filename = "libgda/libgda.h")] public static string alphanum_to_text (string text); [CCode (array_length = false, array_null_terminated = true, cheader_filename = "libgda/libgda.h")] public static string[] completion_list_get (Gda.Connection cnc, string sql, int start, int end); [CCode (cheader_filename = "libgda/libgda.h")] public static bool compute_dml_statements (Gda.Connection cnc, Gda.Statement select_stmt, bool require_pk, owned Gda.Statement? insert_stmt, owned Gda.Statement? update_stmt, owned Gda.Statement? delete_stmt) throws GLib.Error; [CCode (cheader_filename = "libgda/libgda.h")] public static unowned Gda.DataHandler data_handler_get_default (GLib.Type for_type); [CCode (cheader_filename = "libgda/libgda.h")] public static void dsn_split (string string, string out_dsn, string out_username, string out_password); [CCode (cheader_filename = "libgda/libgda.h")] public static GLib.Type g_type_from_string (string str); [CCode (cheader_filename = "libgda/libgda.h")] public static unowned string g_type_to_string (GLib.Type type); [CCode (cheader_filename = "libgda/libgda.h")] public static bool identifier_equal (string id1, string id2); [CCode (cheader_filename = "libgda/libgda.h")] public static uint identifier_hash (string id); [CCode (cheader_filename = "libgda/libgda.h")] public static void log_disable (); [CCode (cheader_filename = "libgda/libgda.h")] public static void log_enable (); [CCode (cheader_filename = "libgda/libgda.h")] public static bool log_is_enabled (); [CCode (cheader_filename = "libgda/libgda.h")] public static bool parse_formatted_date (GLib.Date gdate, string value, GLib.DateDMY first, GLib.DateDMY second, GLib.DateDMY third, char sep); [CCode (cheader_filename = "libgda/libgda.h")] public static bool parse_formatted_time (Gda.Time timegda, string value, char sep); [CCode (cheader_filename = "libgda/libgda.h")] public static bool parse_formatted_timestamp (Gda.Timestamp timestamp, string value, GLib.DateDMY first, GLib.DateDMY second, GLib.DateDMY third, char sep); [CCode (cheader_filename = "libgda/libgda.h")] public static bool parse_iso8601_date (GLib.Date gdate, string value); [CCode (cheader_filename = "libgda/libgda.h")] public static bool parse_iso8601_time (Gda.Time timegda, string value); [CCode (cheader_filename = "libgda/libgda.h")] public static bool parse_iso8601_timestamp (Gda.Timestamp timestamp, string value); [CCode (cheader_filename = "libgda/libgda.h")] public static bool rewrite_statement_for_null_parameters (Gda.Statement stmt, Gda.Set @params, owned Gda.Statement? out_stmt) throws GLib.Error; [CCode (cheader_filename = "libgda/libgda.h")] public static bool rfc1738_decode (string string); [CCode (cheader_filename = "libgda/libgda.h")] public static string rfc1738_encode (string string); [CCode (cheader_filename = "libgda/libgda.h")] public static Gda.Statement select_alter_select_for_empty (Gda.Statement stmt) throws GLib.Error; [CCode (cheader_filename = "libgda/libgda.h")] public static string sql_identifier_quote (string id, Gda.Connection? cnc, Gda.ServerProvider? prov, bool meta_store_convention, bool force_quotes); [CCode (array_length = false, array_null_terminated = true, cheader_filename = "libgda/libgda.h")] public static string[] sql_identifier_split (string id); [CCode (cheader_filename = "libgda/libgda.h")] public static Gda.SqlOperatorType sql_operation_operator_from_string (string op); [CCode (cheader_filename = "libgda/libgda.h")] public static unowned string sql_operation_operator_to_string (Gda.SqlOperatorType op); [CCode (cheader_filename = "libgda/libgda.h")] public static Gda.Binary string_to_binary (string? str); [CCode (cheader_filename = "libgda/libgda.h")] public static Gda.Blob string_to_blob (string str); [CCode (cheader_filename = "libgda/libgda.h")] public static string text_to_alphanum (string text); [CCode (cheader_filename = "libgda/libgda.h")] public static bool utility_check_data_model_v (Gda.DataModel model, [CCode (array_length_cname = "nbcols", array_length_pos = 1.5)] GLib.Type[] types); [CCode (cheader_filename = "libgda/libgda.h")] public static bool utility_data_model_dump_data_to_xml (Gda.DataModel model, [CCode (type = "xmlNodePtr")] Xml.Node* parent, [CCode (array_length_cname = "nb_cols", array_length_pos = 3.5)] int[]? cols, [CCode (array_length_cname = "nb_rows", array_length_pos = 4.5)] int[]? rows, bool use_col_ids); [CCode (cheader_filename = "libgda/libgda.h")] public static unowned string utility_data_model_find_column_description (Gda.DataSelect model, string field_name); [CCode (cheader_filename = "libgda/libgda.h")] public static bool utility_holder_load_attributes (Gda.Holder holder, [CCode (type = "xmlNodePtr")] Xml.Node* node, GLib.SList sources) throws GLib.Error; [CCode (cheader_filename = "libgda/libgda.h")] public static int value_compare (GLib.Value value1, GLib.Value value2); [CCode (cheader_filename = "libgda/libgda.h")] public static int value_differ (GLib.Value value1, GLib.Value value2); [CCode (cheader_filename = "libgda/libgda.h")] public static string value_stringify (GLib.Value value); } sequeler-0.8.2/vapi/libsecret-1.vapi000066400000000000000000000122161410464306200173020ustar00rootroot00000000000000/* libsecret-1.vapi generated by vapigen-0.18 and hand-edited to add SCHEMA_COMPAT_NETWORK */ [CCode (cprefix = "Secret", gir_namespace = "Secret", gir_version = "1", lower_case_cprefix = "secret_")] namespace Secret { [CCode (cheader_filename = "libsecret/secret.h", cname = "SECRET_SCHEMA_COMPAT_NETWORK")] public Secret.Schema SCHEMA_COMPAT_NETWORK; [CCode (cheader_filename = "libsecret/secret.h", copy_function = "g_boxed_copy", free_function = "g_boxed_free", type_id = "secret_schema_get_type ()")] [Compact] public class Schema { [CCode (array_length = false, array_null_terminated = true)] public weak Secret.SchemaAttribute[] attributes; public Secret.SchemaFlags flags; public weak string name; [CCode (has_construct_function = false)] public Schema (string name, Secret.SchemaFlags flags, ...); [CCode (cname = "secret_schema_newv", has_construct_function = false)] public Schema.newv (string name, Secret.SchemaFlags flags, GLib.HashTable attribute_names_and_types); public Secret.Schema @ref (); public void unref (); } [CCode (cheader_filename = "libsecret/secret.h", copy_function = "g_boxed_copy", free_function = "g_boxed_free", type_id = "secret_schema_attribute_get_type ()")] [Compact] public class SchemaAttribute { public weak string name; public Secret.SchemaAttributeType type; } [CCode (cheader_filename = "libsecret/secret.h", cprefix = "SECRET_ERROR_", has_type_id = false)] public enum Error { PROTOCOL, IS_LOCKED, NO_SUCH_OBJECT, ALREADY_EXISTS; public static GLib.Quark get_quark (); } [CCode (cheader_filename = "libsecret/secret.h", cprefix = "SECRET_SCHEMA_ATTRIBUTE_", has_type_id = false)] public enum SchemaAttributeType { STRING, INTEGER, BOOLEAN } [CCode (cheader_filename = "libsecret/secret.h", cprefix = "SECRET_SCHEMA_", has_type_id = false)] [Flags] public enum SchemaFlags { NONE, DONT_MATCH_NAME } [CCode (cheader_filename = "libsecret/secret.h", cname = "SECRET_COLLECTION_DEFAULT")] public const string COLLECTION_DEFAULT; [CCode (cheader_filename = "libsecret/secret.h", cname = "SECRET_COLLECTION_SESSION")] public const string COLLECTION_SESSION; [CCode (cheader_filename = "libsecret/secret.h")] public static GLib.HashTable attributes_build (Secret.Schema schema, ...); [CCode (cheader_filename = "libsecret/secret.h")] public static GLib.HashTable attributes_buildv (Secret.Schema schema, va_list va); [CCode (cheader_filename = "libsecret/secret.h")] public static async bool password_clear (Secret.Schema schema, GLib.Cancellable? cancellable, ...) throws GLib.Error; [CCode (cheader_filename = "libsecret/secret.h")] public static bool password_clear_sync (Secret.Schema schema, GLib.Cancellable? cancellable = null, ...) throws GLib.Error; [CCode (cheader_filename = "libsecret/secret.h", finish_name = "secret_password_clear_finish")] public static async bool password_clearv (Secret.Schema schema, GLib.HashTable attributes, GLib.Cancellable? cancellable) throws GLib.Error; [CCode (cheader_filename = "libsecret/secret.h")] public static bool password_clearv_sync (Secret.Schema schema, GLib.HashTable attributes, GLib.Cancellable? cancellable = null) throws GLib.Error; [CCode (cheader_filename = "libsecret/secret.h")] public static async string password_lookup (Secret.Schema schema, GLib.Cancellable? cancellable, ...) throws GLib.Error; [CCode (cheader_filename = "libsecret/secret.h")] public static string password_lookup_sync (Secret.Schema schema, GLib.Cancellable? cancellable = null, ...) throws GLib.Error; [CCode (cheader_filename = "libsecret/secret.h", finish_name = "secret_password_lookup_finish")] public static async string password_lookupv (Secret.Schema schema, GLib.HashTable attributes, GLib.Cancellable? cancellable) throws GLib.Error; [CCode (cheader_filename = "libsecret/secret.h")] public static string password_lookupv_sync (Secret.Schema schema, GLib.HashTable attributes, GLib.Cancellable? cancellable = null) throws GLib.Error; [CCode (cheader_filename = "libsecret/secret.h")] public static async bool password_store (Secret.Schema schema, string? collection, string label, string password, GLib.Cancellable? cancellable, ...) throws GLib.Error; [CCode (cheader_filename = "libsecret/secret.h")] public static bool password_store_sync (Secret.Schema schema, string? collection, string label, string password, GLib.Cancellable? cancellable = null, ...) throws GLib.Error; [CCode (cheader_filename = "libsecret/secret.h", finish_name = "secret_password_store_finish")] public static async bool password_storev (Secret.Schema schema, GLib.HashTable attributes, string? collection, string label, string password, GLib.Cancellable? cancellable) throws GLib.Error; [CCode (cheader_filename = "libsecret/secret.h")] public static bool password_storev_sync (Secret.Schema schema, GLib.HashTable attributes, string? collection, string label, string password, GLib.Cancellable? cancellable = null) throws GLib.Error; [CCode (cheader_filename = "libsecret/secret.h")] public static void password_wipe (string? password); } sequeler-0.8.2/vapi/libssh2.vapi000066400000000000000000001656161410464306200165530ustar00rootroot00000000000000[CCode (cheader_filename = "libssh2.h>\ntypedef LIBSSH2_USERAUTH_PUBLICKEY_SIGN_FUNC((*libssh2_userauth_publickey_sign_delegate));\ntypedef LIBSSH2_IGNORE_FUNC((*libssh2_ignore_delegate));\ntypedef LIBSSH2_DEBUG_FUNC((*libssh2_debug_delegate));\ntypedef LIBSSH2_DISCONNECT_FUNC((*libssh2_disconnect_delegate));\ntypedef LIBSSH2_PASSWD_CHANGEREQ_FUNC((*libssh2_passwd_changereq_delegate));\ntypedef LIBSSH2_MACERROR_FUNC((*libssh2_macerror_delegate));\ntypedef LIBSSH2_X11_OPEN_FUNC((*libssh2_x11_open_delegate));\ntypedef LIBSSH2_USERAUTH_KBDINT_RESPONSE_FUNC((*libssh2_userauth_kbdint_response_delegate));\ntypedef LIBSSH2_RECV_FUNC((*libssh2_recv_func_delegate));\ntypedef LIBSSH2_SEND_FUNC((*libssh2_send_func_delegate));\n#include { [CCode (cname = "libssh2_session_init_ex", simple_generics = true)] private static Session _create (void* alloc, void* free, void* realloc, void* user_data); public static Session create (T user_data = null) { return _create((void*) GLib.try_malloc, (void*) GLib.free, (void*) GLib.try_realloc, user_data); } public bool authenticated { [CCode (cname = "libssh2_userauth_authenticated")] get; } /** * The banner that will be sent to the remote host when the SSH session is started. * * This is optional; a banner corresponding to the protocol and libssh2 version will be sent by default. */ public string banner { [CCode (cname = "libssh2_session_banner_set")] set; [CCode (cname = "libssh2_session_banner_get")] get; } /** * The directions that socket should wait for before calling libssh2 function again */ public Direction block_directions { [CCode (cname = "libssh2_session_block_directions")] get; } public bool blocking { [CCode (cname = "libssh2_session_set_blocking")] set; [CCode (cname = "libssh2_session_get_blocking")] get; } public Error last_error { [CCode (cname = "libssh2_session_last_errno")] get; } public long timeout { [CCode (cname = "libssh2_session_set_timeout")] set; [CCode (cname = "libssh2_session_get_timeout")] get; } public unowned T userdata { get { return *access_abstract (); } set { *access_abstract () = value; } } [CCode (cname = "libssh2_hostkey_hash", array_length = false)] private unowned uint8[] _get_hostkey_hash (HashType type); [CCode (cname = "libssh2_session_callback_set", simple_generics = true)] private S _set_callback (CallbackType cbtype, S callback); /** * Return a pointer to where the abstract pointer provided is stored. * * By providing a doubly de-referenced pointer, the internal storage of the session instance may be modified in place. * @see userdata */ [CCode (cname = "libssh2_session_abstract", simple_generics = true)] public T * access_abstract (); /** * Authenticate a session with username and password * @see auth_password_ex */ [CCode (cname = "libssh2_userauth_password")] public Error auth_password (string username, string password); /** * Authenticate a session with username and password * * Attempt basic password authentication. Note that many SSH servers which appear to support ordinary password authentication actually have it disabled and use Keyboard Interactive authentication (routed via PAM or another authentication backed) instead. * @param username Name of user to attempt plain password authentication for. * @param password Password to use for authenticating username. * @param passwd_change_cb If the host accepts authentication but requests that the password be changed, this callback will be issued. If no callback is defined, but server required password change, authentication will fail. */ [CCode (cname = "libssh2_userauth_password_ex")] public Error auth_password_ex ([CCode (array_length_type = "unsigned int")] uint8[] username, [CCode (array_length_type = "unsigned int")] uint8[] password, ChangePasswdHandler? passwd_change_cb = null); /** * Authenticate using a callback function */ [CCode (cname = "libssh2_userauth_publickey")] public Error auth_publickey (string username, [CCode (array_length_type = "size_t")] uint8[] pubkeydata, PublicKeySignFunc sign_func); /** * Authenticate a session with a public key, read from a file * @see auth_publickey_from_file_ex */ [CCode (cname = "libssh2_userauth_publickey_fromfile")] public Error auth_publickey_from_file (string username, string publickey, string privatekey, string? passphrase); /** * Authenticate a session with a public key, read from a file * * Attempt public key authentication using a PEM encoded private key file stored on disk * @param username Remote user name to authenticate as. * @param publickey Path and name of public key file. (e.g., /etc/ssh/hostkey.pub) * @param privatekey Path and name of private key file. (e.g., /etc/ssh/hostkey) * @param passphrase Passphrase to use when decoding private key file. */ [CCode (cname = "libssh2_userauth_publickey_fromfile_ex")] public Error auth_publickey_from_file_ex ([CCode (array_length_type = "unsigned int")] uint8[] username, string publickey, string privatekey, string? passphrase); [CCode (cname = "libssh2_userauth_hostbased_fromfile")] public Error auth_host_based_from_file (string username, string publickey, string privatekey, string? passphrase, string hostname, string local_user_name); [CCode (cname = "libssh2_userauth_hostbased_fromfile_ex")] public Error auth_host_based_from_file_ex ([CCode (array_length_type = "unsigned int")] uint8[] username, string publickey, string privatekey, string? passphrase, [CCode (array_length_type = "unsigned int")] uint8[] hostname, [CCode (array_length_type = "unsigned int")] uint8[] local_user_name); /** * Authenticate a session using a challenge-response authentication * @see auth_keyboard_interactive_ex */ [CCode (cname = "libssh2_userauth_keyboard_interactive")] public Error auth_keyboard_interactive (string username, KeyboardInteractiveHandler reponse_callback); /** * Authenticate a session using a challenge-response authentication * * Note that many SSH servers will always issue single "password" challenge, requesting actual password as response, but it is not required by the protocol, and various authentication schemes, such as smartcard authentication may use keyboard-interactive authentication type too. * @param username Name of user to attempt plain password authentication for. * @param response_callback As authentication proceeds, host issues several (1 or more) challenges and requires responses. This callback will be called at this moment. Callback is responsible to obtain responses for the challenges, fill the provided data structure and then return control. Responses will be sent to the host. */ [CCode (cname = "libssh2_userauth_keyboard_interactive_ex")] public Error auth_keyboard_interactive_ex ([CCode (array_length_type = "unsigned int")] uint8[] username, KeyboardInteractiveHandler response_callback); [CCode (cname = "libssh2_agent_init")] public Agent? create_agent (); /** * Tunnel a TCP/IP connection through the SSH transport via the remote host to a third party. * * Communication from the client to the SSH server remains encrypted, communication from the server to the 3rd party host travels in cleartext. * @param host Third party host to connect to using the SSH host as a proxy. * @param port Port on third party host to connect to. * @param shost Host to tell the SSH server the connection originated on. * @param sport Port to tell the SSH server the connection originated from. */ [CCode (cname = "libssh2_channel_direct_tcpip_ex")] public Channel? direct_tcpip (string host, int port, string shost = "127.0.0.1", int sport = 22); /** * Disconnect by application. * @see disconnect_ex */ [CCode (cname = "libssh2_session_disconnect")] public Error disconnect (string description); /** * Send a disconnect message to the remote host associated with session, along with a reason symbol and a verbose description. * * @param description Human readable reason for disconnection. * @param lang Localization string describing the langauge/encoding of the description provided. */ [CCode (cname = "libssh2_session_disconnect_ex")] public Error disconnect_ex (Disconnect reason, string description, string lang); /** * Instruct the remote SSH server to begin listening for inbound TCP/IP connections. * @see forward_listen_ex */ [CCode (cname = "libssh2_channel_forward_listen")] public Listener? forward_listen (int port); /** * Instruct the remote SSH server to begin listening for inbound TCP/IP connections. * * New connections will be queued by the library until accepted. * @param host specific address to bind to on the remote host. Binding to 0.0.0.0 (default when null) will bind to all available addresses. * @param port port to bind to on the remote host. When 0 is passed, the remote host will select the first available dynamic port. * @param bound_port Populated with the actual port bound on the remote host. Useful when requesting dynamic port numbers. * @param queue_maxsize Maximum number of pending connections to queue before rejecting further attempts. */ [CCode (cname = "libssh2_channel_forward_listen_ex")] public Listener? forward_listen_ex (string? host, int port, out int bound_port, int queue_maxsize = 16); [CCode (cname = "libssh2_knownhost_init")] public KnownHosts? get_known_hosts (); /** * Determine the most recent error condition and its cause. */ [CCode (cname = "libssh2_session_last_error")] public Error get_last_error (out char[] errmsg, bool want_buf = true); /** * Returns the computed digest of the remote system's hostkey. The length of the returned string is hash-type specific (e.g., 16 bytes for MD5, 20 bytes for SHA1). */ public unowned uint8[]? get_host_key_hash (HashType type) { unowned uint8[]? hash = _get_hostkey_hash (type); if (hash == null) { return null; } switch (type) { case HashType.SHA1 : hash.length = 20; break; case HashType.MD5 : hash.length = 16; break; } return hash; } [CCode (cname = "libssh2_session_hostkey", array_length_type = "size_t", array_length_pos = 0.1)] public unowned uint8[] get_host_key (out KeyType type); /** * Returns the actual method negotiated for a particular transport parameter. * @return Negotiated method or null if the session has not yet been started. */ [CCode (cname = "libssh2_session_methods")] public unowned string get_methods (MethodType method_type); [CCode (cname = "libssh2_publickey_init")] public PublicKey? get_public_key (); [CCode (cname = "libssh2_sftp_init")] public SFTP? get_sftp (); [CCode (cname = "libssh2_session_supported_algs")] private int _supported_algs (MethodType method_type, out string[]? algs); public Error get_supported_algs (MethodType method_type, out string[]? algs) { var result = _supported_algs (method_type, out algs); if (result < 1) { return (Error) result; } else { ((!)algs).length = result; return Error.NONE; } } [CCode (cname = "libssh2_session_handshake")] public Error handshake (int sock); /** * List supported authentication methods * * Send a SSH_USERAUTH_NONE request to the remote host. Unless the remote host is configured to accept none as a viable authentication scheme (unlikely), it will return SSH_USERAUTH_FAILURE along with a listing of what authentication schemes it does support. In the unlikely event that none authentication succeeds, this method with return null. This case may be distinguished from a failing case by examining {@link authenticated} * @param username Username which will be used while authenticating. Note that most server implementations do not permit attempting authentication with different usernames between requests. Therefore this must be the same username you will use on later userauth calls. * @return On success a comma delimited list of supported authentication schemes. */ [CCode (cname = "libssh2_userauth_list")] public unowned string list_authentication ([CCode (array_length_type = "unsigned int")] uint8[] username); /** * Establish a generic session channel * @param channel_type Channel type to open. Typically one of session, directtcpip, or tcpipforward. The SSH2 protocol allowed for additional types including local, custom channel types. * @param window_size Maximum amount of unacknowledged data remote host is allowed to send before receiving an SSH_MSG_CHANNEL_WINDOW_ADJUST packet. * @param packet_size Maximum number of bytes remote host is allowed to send in a single SSH_MSG_CHANNEL_DATA or SSG_MSG_CHANNEL_EXTENDED_DATA packet. * @param message Additional data as required by the selected channel_type. * @see open_session * @see direct_tcpip * @see forward_listen */ [CCode (cname = "libssh2_channel_open_ex")] public Channel? open ([CCode (array_length_type = "unsigned int")] uint8[] channel_type, uint window_size = Channel.WINDOW_DEFAULT, uint packet_size = Channel.PACKET_DEFAULT, [CCode (array_length_type = "unsigned int")] uint8[]? message = null); [CCode (cname = "libssh2_channel_open_session")] public Channel? open_channel (); [CCode (cname = "libssh2_scp_recv")] public Channel? scp_recv (string path, out Posix.Stat sb); [CCode (cname = "libssh2_scp_send64")] public Channel? scp_send (string path, Posix.mode_t mode, int64 size, time_t mtime, time_t atime); /** * Send a keepalive message if needed. * * @param seconds_to_next indicates how many seconds you can sleep after * this call before you need to call it again. */ [CCode (cname = "libssh2_keepalive_send")] public Error send_keep_alive (out int seconds_to_next); /** * Set a handler when a SSH_MSG_DEBUG message is received * @param callback the handler, or null to ignore this message * @return the previous callback handler, if there was one. */ public DebugHandler? set_debug_handler (DebugHandler? callback) { return _set_callback? > (CallbackType.DEBUG, callback); } /** * Set a handler when a SSH_MSG_DISCONNECT message is received * @param callback the handler, or null to ignore this message * @return the previous callback handler, if there was one. */ public DisconnectHandler? set_disconnect_handler (DisconnectHandler? callback) { return _set_callback? > (CallbackType.DISCONNECT, callback); } [CCode (cname = "libssh2_session_flag")] public Error set_flag (Option option, bool @value); /** * Set a handler when a SSH_MSG_IGNORE message is received * @param callback the handler, or null to ignore this message * @return the previous callback handler, if there was one. */ public IgnoreHandler? set_ignore_handler (IgnoreHandler? callback) { return _set_callback? > (CallbackType.IGNORE, callback); } /** * Set how often keepalive messages should be sent. * * Note that non-blocking applications are responsible for sending the * keep-alive messages using {@link send_keep_alive}. * * @param want_reply indicates whether the keepalive messages should * request a response from the server. * @param interval is number of seconds that can pass without any I/O, use * 0 (the default) to disable keepalives. To avoid some busy-loop * corner-cases, if you specify an interval of 1 it will be treated as 2. */ [CCode (cname = "libssh2_keepalive_config")] public void set_keep_alive (bool want_reply, uint interval); /** * Set a handler when a mismatched MAC has been detected in the transport layer. * @param callback the handler, or null to ignore this message * @return the previous callback handler, if there was one. */ public MACErrorHandler? set_mac_error_handler (MACErrorHandler? callback) { return _set_callback? > (CallbackType.MACERROR, callback); } public SendHandler? set_send_handler (SendHandler? callback) { return _set_callback? > (CallbackType.SEND, callback); } public RecvHandler? set_recv_handler (RecvHandler? callback) { return _set_callback? > (CallbackType.RECV, callback); } /** * Set preferred methods to be negotiated. These preferrences must be set prior to calling {@link handshake} as they are used during the protocol initiation phase. * @param prefs Comma-delimited list of preferred methods to use with the most preferred listed first and the least preferred listed last. If a method is listed which is not supported by libssh2 it will be ignored and not sent to the remote host during protocol negotiation. */ [CCode (cname = "libssh2_session_method_pref")] public Error set_method_pref (MethodType method, string prefs); /** * Enables tracing. * * This has no function in builds that aren't built with debug enabled */ [CCode (cname = "libssh2_trace")] public Error set_trace (Trace trace); [CCode (cname = "libssh2_trace_sethandler", simple_generics = true)] public Error set_trace_handler ([CCode (target_pos = 0.1)] TraceFunc handler); /** * Set a handler when an X11 connection has been accepted * @param callback the handler, or null to ignore this message * @return the previous callback handler, if there was one. */ public X11Handler? set_x_handler (X11Handler? callback) { return _set_callback? > (CallbackType.X11, callback); } [CCode (cname = "int", cprefix = "LIBSSH2_CALLBACK_")] private enum CallbackType { IGNORE, DEBUG, DISCONNECT, MACERROR, X11, SEND, RECV } [CCode (cname = "libssh2_passwd_changereq_delegate", simple_generics = true, has_target = false)] public delegate void ChangePasswdHandler (Session session, out uint8[]? newpw, ref T user_data); [CCode (cname = "libssh2_debug_delegate", simple_generics = true, has_target = false)] public delegate void DebugHandler (Session session, bool always_display, uint8[] message, uint8[] language, ref T user_data); [CCode (cname = "libssh2_disconnect_delegate", simple_generics = true, has_target = false)] public delegate void DisconnectHandler (Session session, Disconnect reason, uint8[] message, uint8[] language, ref T user_data); [CCode (cname = "libssh2_ignore_delegate", simple_generics = true, has_target = false)] public delegate void IgnoreHandler (Session session, uint8[] message, ref T user_data); [CCode (cname = "libssh2_userauth_publickey_sign_delegate", simple_generics = true)] public delegate Error PublicKeySignFunc (Session session, [CCode (array_length_type = "size_t")] out uint8[] sig, [CCode (array_length_type = "size_t")] uint8[] data); [CCode (cname = "libssh2_userauth_kbdint_response_delegate", simple_generics = true, has_target = false)] public delegate void KeyboardInteractiveHandler ([CCode (array_length_type = "int")] uint8[] name, [CCode (array_length_type = "int")] uint8[] instruction, [CCode (array_length_pos = 2.1)] keyboard_prompt prompts, [CCode (array_length = false)] keyboard_response responses, ref T user_data); [CCode (cname = "libssh2_recv_func_delegate", simple_generics = true, has_target = false)] public delegate ssize_t RecvHandler (int socket, [CCode (array_length_type = "size_t")] uint8[] buffer, int flags, ref T user_data); [CCode (cname = "libssh2_send_func_delegate", simple_generics = true, has_target = false)] public delegate ssize_t SendHandler (int socket, [CCode (array_length_type = "size_t")] uint8[] buffer, int flags, ref T user_data); /** * Handler for mismatched MAC packets in transport layer. * @return true to discard. If false, the packet will be accepted nonetheless. */ [CCode (cname = "libssh2_macerror_delegate", simple_generics = true, has_target = false)] public delegate bool MACErrorHandler (Session session, uint8[] packet, ref T user_data); [CCode (cname = "libssh2_x11_open_delegate", simple_generics = true, has_target = false)] public delegate void X11Handler (Session session, Channel channel, string host, int port, ref T user_data); } [CCode (cname = "LIBSSH2_SFTP", free_function = "libssh2_sftp_shutdown", cheader_filename = "libssh2_sftp.h")] [Compact] public class SFTP { [CCode (cname = "LIBSSH2_SFTP_PACKET_MAXLEN", cheader_filename = "libssh2_sftp.h")] public const int PACKET_MAXLEN; /** * The last error code produced by the SFTP layer. * * Note that this only returns a sensible error code if libssh2 returned * {@link Error.SFTP_PROTOCOL} in a previous call. */ public SftpError last_error { [CCode (cname = "libssh2_sftp_last_error")] get; } /** * Get status of a link */ [CCode (cname = "libssh2_sftp_lstat")] public Error lstat (string path, out sftp_attributes attrs); /** * Create a directory on the remote file system * @param path full path of the new directory to create. Note that the new directory's parents must all exist priot to making this call. * @param mode directory creation mode (e.g. 0755). */ [CCode (cname = "libssh2_sftp_mkdir_ex")] public Error mkdir (string path, long mode); /** * Open filehandle for a file on SFTP. */ [CCode (cname = "libssh2_sftp_open")] public SftpHandle? open (string filename, Transfer flags, Posix.mode_t mode); /** * Open filehandle for a directory on SFTP. */ [CCode (cname = "libssh2_sftp_opendir")] public SftpHandle? open_dir (string path); /** * Resolve a symbolic link filesystem object to its next target. * * @return the number of bytes it copied to the target buffer (not including the terminating zero) or negative on failure. * @see Error */ [CCode (cname = "libssh2_sftp_readlink")] public int read_link (string path, [CCode (array_length_type = "unsigned int")] uint8[] target); /** * Resolve a complex, relative, or symlinked filepath to its effective target. * * @return the number of bytes it copied to the target buffer (not including the terminating zero) or negative on failure. * @see Error */ [CCode (cname = "libssh2_sftp_realpath")] public int real_path (string path, [CCode (array_length_type = "unsigned int")] uint8[] target); /** * Rename a filesystem object on the remote filesystem. * * Use expected flags. * @see rename_ex */ [CCode (cname = "libssh2_sftp_rename")] public Error rename (string source_file, string dest_file); /** * Rename a filesystem object on the remote filesystem. * * The semantics of this command typically include the ability to move a * filsystem object between folders and/or filesystem mounts. If the * {@link Rename.OVERWRITE} flag is not set and the destfile entry already * exists, the operation will fail. Use of the other two flags indicate * a preference (but not a requirement) for the remote end to perform an * atomic rename operation and/or using native system calls when possible. */ [CCode (cname = "libssh2_sftp_rename_ex")] public Error rename_ex ([CCode (array_length_type = "unsigned int")] uint8[] source_filename, [CCode (array_length_type = "unsigned int")] uint8[] dest_filename, Rename flags); /** * Remove a directory from the remote file system. */ [CCode (cname = "libssh2_sftp_rmdir")] public Error rmdir (string path); /** * Set status of a file */ [CCode (cname = "libssh2_sftp_setstat")] public Error set_stat (string path, sftp_attributes attrs); /** * Get status of a file */ [CCode (cname = "libssh2_sftp_stat")] public Error stat (string path, out sftp_attributes attrs); /** * Get file system statistics */ [CCode (cname = "libssh2_sftp_statvfs")] public Error stat_vfs ([CCode (array_length_type = "size_t")] uint8[] path, out stat_vfs st); /** * Create a symbolic link between two filesystem objects. */ [CCode (cname = "libssh2_sftp_symlink")] public Error symlink (string orig, string linkpath); /** * Unlink (delete) an SFTP file * @see unlink_ex */ [CCode (cname = "libssh2_sftp_unlink")] public Error unlink (string filename); /** * Unlink (delete) an SFTP file */ [CCode (cname = "libssh2_sftp_unlink_ex")] public Error unlink_ex ([CCode (array_length_type = "unsigned int")] uint8[] source_filename); } [CCode (cname = "LIBSSH2_SFTP_HANDLE", free_function = "libssh2_sftp_close_handle", cheader_filename = "libssh2_sftp.h")] [Compact] public class SftpHandle { /** * Reads a block of data. * * This method is modelled after the POSIX read(2) function and uses the * same calling semantics. It will attempt to read as much as possible * however it may not fill all of buffer if the file pointer reaches the * end or if further reads would cause the socket to block. * @return Number of bytes actually populated into buffer, or negative on * failure. It returns {@link Error.AGAIN} when * it would otherwise block.s */ [CCode (cname = "libssh2_sftp_read")] public ssize_t read ([CCode (array_length_size = "size_t")] uint8[] buffer); /** * Reads a block of data and returns file entry information for the * next entry, if any. * @param buffer a buffer to read data into. * @param longentry a buffer to read data into. The format of the is unspecified by SFTP protocol. It MUST be suitable for use in the output of a directory listing command (in fact, the recommended operation for a directory listing command is to simply display this data). * @return number of bytes actually populated into buffer (not counting the terminating zero), or negative on failure. It returns {@link Error.AGAIN} when it would otherwise block. */ [CCode (cname = "libssh2_sftp_readdir_ex")] public int read_dir ([CCode (array_length_size = "size_t")] uint8[] buffer, [CCode (array_length_size = "size_t")] uint8[]? longentry, sftp_attributes attrs); [CCode (cname = "libssh2_sftp_rewind")] public void rewind (); /** * Set the read/write position indicator within a file * * Move the file handle's internal pointer to an arbitrary location. Note * that libssh2 implements file pointers as a localized concept to make * file access appear more POSIX like. No packets are exchanged with the * server during a seek operation. The localized file pointer is simply * used as a convenience offset during read/write operations. */ [CCode (cname = "libssh2_sftp_seek64")] public void seek (uint64 offset); /** * Set attributes on an SFTP file handle */ [CCode (cname = "libssh2_sftp_fsetstat")] public Error set_stat (sftp_attributes attrs); /** * Get attributes on an SFTP file handle */ [CCode (cname = "libssh2_sftp_fstat")] public Error stat (out sftp_attributes attrs); /** * Get file system statistics */ [CCode (cname = "libssh2_sftp_fstatvfs")] public Error stat_vfs (out stat_vfs st); /** * Get the current read/write position indicator for a file */ [CCode (cname = "libssh2_sftp_tell64")] public uint64 tell (); /** * Writes a block of data to the SFTP server. * * This method is modeled after the POSIX write() function and uses the same calling semantics. * * As much as possible of the buffer and put it into a single SFTP * protocol packet. This means that to get maximum performance when sending * larger files, you should try to always pass in at least 32K of data to * this function. * * Starting in libssh2 version 1.2.8, the default behavior of libssh2 is to * create several smaller outgoing pack†ets for all data you pass to this * function and it will return a positive number as soon as the first * packet is acknowledged from the server. * * This has the effect that sometimes more data has been sent off but isn't * acked yet when this function returns, and when this function is * subsequently called again to write more data, libssh2 will immediately * figure out that the data is already received remotely. * * In most normal situation this should not cause any problems, but it * should be noted that if you've once called this method with data and it * returns short, you MUST still assume that the rest of the data might've * been cached so you need to make sure you don't alter that data and * think that the version you have in your next function invoke will be * detected or used. * * The reason for this funny behavior is that SFTP can only send 32K data * in each packet and it gets all packets acked individually. This * means we cannot use a simple serial approach if we want to reach high * performance even on high latency connections. And we want that. * * @return Actual number of bytes written or negative on failure. If this * function returns 0 (zero) it should not be considered an error, but * simply that there was no error but yet no payload data got sent to the * other end. */ [CCode (cname = "libssh2_sftp_write")] public ssize_t write ([CCode (array_length_size = "size_t")] uint8[] buffer); } [CCode (cname = "libssh2_publickey_attribute", has_type_id = false, cheader_filename = "libssh2_publickey.h")] public struct key_attribute { [CCode (cname = "libssh2_publickey_attribute")] public key_attribute (string name, string @value, bool mandatory); [CCode (array_length_cname = "name_len", array_length_type = "unsigned long")] unowned uint8[] name; [CCode (array_length_cname = "value_len", array_length_type = "unsigned long")] unowned uint8[] @value; bool mandatory; } [CCode (cname = "libssh2_publickey_list")] public struct key_list { [CCode (array_length_cname = "name_len", array_length_type = "unsigned long")] uint8[] name; [CCode (array_length_cname = "blob_len", array_length_type = "unsigned long")] uint8[] blob; [CCode (array_length_cname = "num_attrs", array_length_type = "unsigned long")] key_attribute[] attrs; } [CCode (cname = "LIBSSH2_USERAUTH_KBDINT_PROMPT")] public struct keyboard_prompt { [CCode (array_length_cname = "length")] public uint8[] text; public bool echo; } [CCode (cname = "LIBSSH2_USERAUTH_KBDINT_RESPONSE")] public struct keyboard_response { [CCode (array_length_type = "unsigned int", array_length_cname = "length")] public uint8[] text; } [CCode (cname = "LIBSSH2_SFTP_ATTRIBUTES", has_type_id = false, cheader_filename = "libssh2_sftp.h")] public struct sftp_attributes { /** * If flags contains an attribute, then the value in this * struct will be meaningful Otherwise it should be ignored */ Attribute flags; /** * Size of file in bytes */ uint64 filesize; /* * Numerical the user owner */ ulong uid; /* * Numerical the group owner */ ulong gid; Posix.mode_t permissions; /** * Access time of file */ ulong atime; /** * Modification time of file */ ulong mtime; } [CCode (cname = "LIBSSH2_SFTP_STATVFS", has_type_id = false, cheader_filename = "libssh2_sftp.h")] public struct stat_vfs { /** * File system block size */ [CCode (cname = "f_bsize")] uint64 block_size; /** * Fragment size */ [CCode (cname = "f_frsize")] uint64 frg_size; /** * Size of the file system in frg_size units */ [CCode (cname = "f_blocks")] uint64 blocks; /** * Number of free blocks */ [CCode (cname = "f_bfree")] uint64 blocks_free; /** * Number of free blocks for non-root */ [CCode (cname = "f_bavail")] uint64 blocks_avail; /** * Number of inodes */ [CCode (cname = "f_files")] uint64 files; /** * Number of free inodes */ [CCode (cname = "f_ffree")] uint64 inodes_free; /** * Number of free inodes for non-root */ [CCode (cname = "f_favail")] uint64 inodes_avail; /** * File system ID */ [CCode (cname = "f_fsid")] uint64 fs_id; /** * Mount flags */ [CCode (cname = "f_flag")] MountFlags flags; /** * Maximum filename length */ [CCode (cname = "f_namemax")] uint64 name_max; } [CCode (cname = "unsigned long", cprefix = "LIBSSH2_SFTP_ATTR_", cheader_filename = "libssh2_sftp.h")] public enum Attribute { SIZE, UIDGID, PERMISSIONS, ACMODTIME, EXTENDED } [CCode (cname = "int", cprefix = "LIBSSH2_KNOWNHOST_CHECK_", has_type_id = false)] public enum CheckResult { MATCH, MISMATCH, NOTFOUND, FAILURE } [CCode (cname = "int", cprefix = "LIBSSH2_SESSION_BLOCK_", has_type_id = false)] [Flags] public enum Direction { INBOUND, OUTBOUND; public GLib.IOCondition to_condition () { GLib.IOCondition result = 0; if (Direction.INBOUND in this) { result |= GLib.IOCondition.IN; } if (Direction.OUTBOUND in this) { result |= GLib.IOCondition.OUT; } return result; } } /** * Disconnect codes defined by SSH protocol */ [CCode (cname = "int", cprefix = "SSH_DISCONNECT_", has_type_id = false)] public enum Disconnect { HOST_NOT_ALLOWED_TO_CONNECT, PROTOCOL_ERROR, KEY_EXCHANGE_FAILED, RESERVED, MAC_ERROR, COMPRESSION_ERROR, SERVICE_NOT_AVAILABLE, PROTOCOL_VERSION_NOT_SUPPORTED, HOST_KEY_NOT_VERIFIABLE, CONNECTION_LOST, BY_APPLICATION, TOO_MANY_CONNECTIONS, AUTH_CANCELLED_BY_USER, NO_MORE_AUTH_METHODS_AVAILABLE, ILLEGAL_USER_NAME } [CCode (cname = "int", cprefix = "LIBSSH2_ERROR_", has_type_id = false)] public enum Error { NONE, SOCKET_NONE, BANNER_RECV, BANNER_SEND, INVALID_MAC, KEX_FAILURE, ALLOC, SOCKET_SEND, KEY_EXCHANGE_FAILURE, TIMEOUT, HOSTKEY_INIT, HOSTKEY_SIGN, DECRYPT, SOCKET_DISCONNECT, PROTO, PASSWORD_EXPIRED, FILE, METHOD_NONE, AUTHENTICATION_FAILED, PUBLICKEY_UNVERIFIED, CHANNEL_OUTOFORDER, CHANNEL_FAILURE, CHANNEL_REQUEST_DENIED, CHANNEL_UNKNOWN, CHANNEL_WINDOW_EXCEEDED, CHANNEL_PACKET_EXCEEDED, CHANNEL_CLOSED, CHANNEL_EOF_SENT, SCP_PROTOCOL, ZLIB, SOCKET_TIMEOUT, SFTP_PROTOCOL, REQUEST_DENIED, METHOD_NOT_SUPPORTED, INVAL, INVALID_POLL_TYPE, PUBLICKEY_PROTOCOL, [CCode (cname = "LIBSSH2_ERROR_EAGAIN")] AGAIN, BUFFER_TOO_SMALL, BAD_USE, COMPRESS, OUT_OF_BOUNDARY, AGENT_PROTOCOL, SOCKET_RECV, ENCRYPT, BAD_SOCKET, KNOWN_HOSTS } [CCode (cname = "int", cprefix = "LIBSSH2_CHANNEL_EXTENDED_DATA_", has_type_id = false)] public enum ExtendedData { /** * Queue extended data for eventual reading */ NORMAL, /** * Treat extended data and ordinary data the same. Merge all substreams such that calls to {@link Channel.read} will pull from all substreams on a first-in/first-out basis. */ MERGE, /** * Discard all extended data as it arrives. */ IGNORE } [CCode (cname = "int", cprefix = "LIBSSH2_HOSTKEY_HASH_", has_type_id = false)] public enum HashType { MD5, SHA1 } [CCode (cname = "int", cprefix = "LIBSSH2_KNOWNHOST_")] [Flags] public enum HostFormat { TYPE_MASK, /** * ASCII "hostname.domain.tld" */ TYPE_PLAIN, /** * SHA1( ) base64-encoded! */ TYPE_SHA1, /** * Another hash */ TYPE_CUSTOM, KEYENC_MASK, KEYENC_RAW, KEYENC_BASE64, KEY_MASK, KEY_SHIFT, KEY_RSA1, KEY_SSHRSA, KEY_SSHDSS } [CCode (cname = "int", cprefix = "LIBSSH2_INIT_", has_type_id = false)] [Flags] public enum InitFlags { [CCode (cname = "0")] NONE, /** * Do not initialize the crypto library (i.e., OPENSSL_add_cipher_algoritms() for OpenSSL */ NO_CRYPTO } [CCode (cname = "int", cprefix = "LIBSSH2_HOSTKEY_TYPE_", has_type_id = false)] public enum KeyType { UNKNOWN, RSA, DSS; public HostFormat get_format () { switch (this) { case RSA: return HostFormat.KEY_SSHRSA; case DSS: return HostFormat.KEY_SSHDSS; default: return 0; } } } [CCode (cname = "int", cprefix = "SSH_METHOD_", has_type_id = false)] public enum MethodType { KEX, HOSTKEY, CRYPT_CS, CRYPT_SC, MAC_CS, MAC_SC, COMP_CS, COMP_SC, LANG_CS, LANG_SC } [CCode (cname = "unsigned long", cprefix = "LIBSSH2_SFTP_ST_", cheader_filename = "libssh2_sftp.h")] [Flags] public enum MountFlags { RDONLY, NOSUID } [CCode (cname = "int", cprefix = "LIBSSH2_FLAG_", has_type_id = false)] public enum Option { /** * Do not attempt to block SIGPIPEs but will let them trigger from the underlying socket layer. */ SIGPIPE, /** * Before the connection negotiation is performed, try to negotiate compression enabling for this connection. * * By default libssh2 will not attempt to use compression. */ COMPRESS } [CCode (cname = "long", cprefix = "LIBSSH2_SFTP_RENAME_", cheader_filename = "libssh2_sftp.h")] [Flags] public enum Rename { OVERWRITE, ATOMIC, NATIVE } /** * SFTP Status Codes */ [CCode (cname = "unsigned long", has_type_id = false, cprefix = "LIBSSH2_FX_", cheader_filename = "libssh2_sftp.h")] public enum SftpError { OK, EOF, NO_SUCH_FILE, PERMISSION_DENIED, FAILURE, BAD_MESSAGE, NO_CONNECTION, CONNECTION_LOST, OP_UNSUPPORTED, INVALID_HANDLE, NO_SUCH_PATH, FILE_ALREADY_EXISTS, WRITE_PROTECT, NO_MEDIA, NO_SPACE_ON_FILESYSTEM, QUOTA_EXCEEDED, UNKNOWN_PRINCIPAL, LOCK_CONFLICT, DIR_NOT_EMPTY, NOT_A_DIRECTORY, INVALID_FILENAME, LINK_LOOP } [CCode (cname = "int", cprefix = "LIBSSH2_TRACE_", has_type_id = false)] [Flags] public enum Trace { TRANS, KEX, AUTH, CONN, SCP, SFTP, ERROR, PUBLICKEY, SOCKET } /** * File Transfer Flags */ [CCode (cname = "unsigned long", has_type_id = false, cprefix = "LIBSSH2_FXF_", cheader_filename = "libssh2_sftp.h")] [Flags] public enum Transfer { /** * Open the file for reading. */ READ, /** * Open the file for writing. If both this and {@link READ} are specified, the file is opened for both reading and writing. */ WRITE, /** * Force all writes to append data at the end of the file. * * This doesn't have any effect on OpenSSH servers */ APPEND, /** * A new file will be created if one does not already exist (if {@link TRUNC} is specified, the new file will be truncated to zero length if it previously exists) */ CREAT, /** * Forces an existing file with the same name to be truncated to zero length when creating a file by specifying {@link CREAT}. {@link CREAT} MUST also be specified if this flag is used. */ TRUNC, /** * Causes the request to fail if the named file already exists. {@link CREAT} MUST also be specified if this flag is used. */ EXCL } /** * Initialize the libssh2 functions. * * This typically initialize the crypto library. It uses a global state, and * is not thread safe -- you must make sure this function is not called * concurrently. * Returns 0 if succeeded, or a negative value for error. */ [CCode (cname = "libssh2_init")] public Error init (InitFlags flags); /** * Exit the libssh2 functions and free's all memory used internal. */ [CCode (cname = "libssh2_exit")] public void exit (); [CCode (cname = "libssh2_trace_handler_func*", instance_pos = 1.1, simple_generics = true)] public delegate void TraceFunc (Session session, [CCode (array_length_type = "size_t")] uint8[] message); /** * Part of every banner, user specified or not */ [CCode (cname = "LIBSSH2_SSH_BANNER")] public const string BANNER; [CCode (cname = "LIBSSH2_SSH_DEFAULT_BANNER")] public const string DEFAULT_BANNER; [CCode (cname = "LIBSSH2_SSH_DEFAULT_BANNER_WITH_CRLF")] public const string DEFAULT_BANNER_WITH_CRLF; [CCode (cname = "LIBSSH2_TERM_HEIGHT")] public const int TERM_HEIGHT; [CCode (cname = "LIBSSH2_TERM_HEIGHT_PX")] public const int TERM_HEIGHT_PX; [CCode (cname = "LIBSSH2_TERM_WIDTH")] public const int TERM_WIDTH; [CCode (cname = "LIBSSH2_TERM_WIDTH_PX")] public const int TERM_WIDTH_PX; } sequeler-0.8.2/vapi/linux.vapi000066400000000000000000005207311410464306200163350ustar00rootroot00000000000000/* linux.vapi * * Copyright (C) 2009-2015 Michael 'Mickey' Lauer * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library 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 * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ [CCode (cprefix = "", lower_case_cprefix = "")] namespace Linux { /* * Console */ [CCode (cprefix = "", lower_case_cprefix = "")] namespace Console { /* constants */ [CCode (cheader_filename = "linux/kd.h")] public const int GIO_FONT; [CCode (cheader_filename = "linux/kd.h")] public const int PIO_FONT; [CCode (cheader_filename = "linux/kd.h")] public const int GIO_FONTX; [CCode (cheader_filename = "linux/kd.h")] public const int PIO_FONTX; [CCode (cheader_filename = "linux/kd.h")] public const int PIO_FONTRESET; [CCode (cheader_filename = "linux/kd.h")] public const int GIO_CMAP; [CCode (cheader_filename = "linux/kd.h")] public const int PIO_CMAP; [CCode (cheader_filename = "linux/kd.h")] public const int KIOCSOUND; [CCode (cheader_filename = "linux/kd.h")] public const int KDMKTONE; [CCode (cheader_filename = "linux/kd.h")] public const int KDGETLED; [CCode (cheader_filename = "linux/kd.h")] public const int KDSETLED; [CCode (cheader_filename = "linux/kd.h")] public const int KDGKBTYPE; [CCode (cheader_filename = "linux/kd.h")] public const int KB_84; [CCode (cheader_filename = "linux/kd.h")] public const int KB_101; [CCode (cheader_filename = "linux/kd.h")] public const int KB_OTHER; [CCode (cheader_filename = "linux/kd.h")] public const int KDADDIO; [CCode (cheader_filename = "linux/kd.h")] public const int KDDELIO; [CCode (cheader_filename = "linux/kd.h")] public const int KDENABIO; [CCode (cheader_filename = "linux/kd.h")] public const int KDDISABIO; [CCode (cheader_filename = "linux/kd.h")] public const int KDSETMODE; [CCode (cheader_filename = "linux/kd.h")] public const int KDGETMODE; [CCode (cheader_filename = "linux/kd.h")] public const int KDMAPDISP; [CCode (cheader_filename = "linux/kd.h")] public const int KDUNMAPDISP; [CCode (cheader_filename = "linux/kd.h")] public const int E_TABSZ; [CCode (cheader_filename = "linux/kd.h")] public const int GIO_SCRNMAP; [CCode (cheader_filename = "linux/kd.h")] public const int PIO_SCRNMAP; [CCode (cheader_filename = "linux/kd.h")] public const int GIO_UNISCRNMAP; [CCode (cheader_filename = "linux/kd.h")] public const int PIO_UNISCRNMAP; [CCode (cheader_filename = "linux/kd.h")] public const int GIO_UNIMAP; [CCode (cheader_filename = "linux/kd.h")] public const int PIO_UNIMAP; [CCode (cheader_filename = "linux/kd.h")] public const int PIO_UNIMAPCLR; [CCode (cheader_filename = "linux/kd.h")] public const int UNI_DIRECT_BASE; [CCode (cheader_filename = "linux/kd.h")] public const int UNI_DIRECT_MASK; [CCode (cheader_filename = "linux/kd.h")] public const int KDGKBMODE; [CCode (cheader_filename = "linux/kd.h")] public const int KDSKBMODE; [CCode (cheader_filename = "linux/kd.h")] public const int KDGKBMETA; [CCode (cheader_filename = "linux/kd.h")] public const int KDSKBMETA; [CCode (cheader_filename = "linux/kd.h")] public const int KDGKBLED; [CCode (cheader_filename = "linux/kd.h")] public const int KDSKBLED; [CCode (cheader_filename = "linux/kd.h")] public const int K_NORMTAB; [CCode (cheader_filename = "linux/kd.h")] public const int K_SHIFTTAB; [CCode (cheader_filename = "linux/kd.h")] public const int K_ALTTAB; [CCode (cheader_filename = "linux/kd.h")] public const int K_ALTSHIFTTAB; [CCode (cheader_filename = "linux/kd.h")] public const int KDGKBSENT; [CCode (cheader_filename = "linux/kd.h")] public const int KDSKBSENT; [CCode (cheader_filename = "linux/kd.h")] public const int KDGKBDIACR; [CCode (cheader_filename = "linux/kd.h")] public const int KDSKBDIACR; [CCode (cheader_filename = "linux/kd.h")] public const int KDGKBDIACRUC; [CCode (cheader_filename = "linux/kd.h")] public const int KDSKBDIACRUC; [CCode (cheader_filename = "linux/kd.h")] public const int KDGETKEYCODE; [CCode (cheader_filename = "linux/kd.h")] public const int KDSETKEYCODE; [CCode (cheader_filename = "linux/kd.h")] public const int KDSIGACCEPT; [CCode (cheader_filename = "linux/kd.h")] public const int KDKBDREP; [CCode (cheader_filename = "linux/kd.h")] public const int KDFONTOP; [CCode (cheader_filename = "linux/kd.h")] public const int KD_FONT_FLAG_DONT_RECALC; /* enums */ [CCode (cprefix = "KD_FONT_OP_", has_type_id = false, cheader_filename = "linux/kd.h")] public enum FontOperationCode { SET, GET, SET_DEFAULT, COPY } [CCode (cprefix = "K_", has_type_id = false, cheader_filename = "linux/kd.h")] public enum KeyboardMode { RAW, XLATE, MEDIUMRAW, UNICODE } [CCode (cprefix = "K_", has_type_id = false, cheader_filename = "linux/kd.h")] public enum LedMode { SCROLLLOCK, NUMLOCK, CAPSLOCK } [CCode (cprefix = "LED_", has_type_id = false, cheader_filename = "linux/kd.h")] public enum LedType { SCR, NUM, CAP } [CCode (cprefix = "KD_", has_type_id = false, cheader_filename = "linux/kd.h")] public enum TerminalMode { TEXT, GRAPHICS } [CCode (cprefix = "K_", has_type_id = false, cheader_filename = "linux/kd.h")] public enum MetaMode { METABIT, ESCPREFIX } /* structs */ [CCode (cname = "struct kbdiacr", has_type_id = false, cheader_filename = "linux/kd.h")] public struct Diacritic { public uchar diacr; public uchar base; public uchar result; } [CCode (cname = "struct kbdiacrs", has_type_id = false, cheader_filename = "linux/kd.h")] public struct Diacritics { public uint kb_cnt; public Diacritic kbdiacr[256]; } [CCode (cname = "struct kbdiacruc", has_type_id = false, cheader_filename = "linux/kd.h")] public struct Diacruc { public uint diacr; public uint base; public uint result; } [CCode (cname = "struct kbdiacrsuc", has_type_id = false, cheader_filename = "linux/kd.h")] public struct Diacrucs { public uint kb_cnt; public Diacruc kbdiacruc[256]; } [CCode (cname = "struct console_font", has_type_id = false, cheader_filename = "linux/kd.h")] public struct Font { public uint width; public uint height; public uint charcount; public uchar* data; } [CCode (cname = "struct consolefontdesc", has_type_id = false, cheader_filename = "linux/kd.h")] public struct FontDescription { public uint16 charcount; public uint16 charheight; public string chardata; } [CCode (cname = "struct console_font_op", has_type_id = false, cheader_filename = "linux/kd.h")] public struct FontOperation { public FontOperationCode op; public uint flags; public uint width; public uint height; public uint charcount; public uchar* data; } [CCode (cname = "struct kbkeycode", has_type_id = false, cheader_filename = "linux/kd.h")] public struct KeyCode { public uint scancode; public uint keycode; } [CCode (cname = "struct kbentry", has_type_id = false, cheader_filename = "linux/kd.h")] public struct KeyboardEntry { public uchar kb_table; public uchar kb_index; public uint16 kb_value; } [CCode (cname = "struct kbsentry", has_type_id = false, cheader_filename = "linux/kd.h")] public struct KeyboardEntries { public uchar kb_func; public uchar kb_string[512]; } [CCode (cname = "struct kbd_repeat", has_type_id = false, cheader_filename = "linux/kd.h")] public struct KeyRepeat { public int delay; public int period; } [CCode (cname = "struct unipair", has_type_id = false, cheader_filename = "linux/kd.h")] public struct UniPair { public uint16 unicode; public uint16 fontpos; } [CCode (cname = "struct unimapdesc", has_type_id = false, cheader_filename = "linux/kd.h")] public struct UniMapDesc { public uint16 entry_ct; UniPair entries; } [CCode (cname = "struct unimapinit", has_type_id = false, cheader_filename = "linux/kd.h")] public struct UniMapInit { public uint16 advised_hashsize; public uint16 advised_hashstep; public uint16 advised_hashlevel; } } /* * EventFd */ [CCode (cprefix = "EFD_", has_type_id = false, cheader_filename = "sys/eventfd.h")] public enum EventFdFlags { CLOEXEC, NONBLOCK } [CCode (cheader_filename = "sys/eventfd.h")] public int eventfd (uint count = 0, EventFdFlags flags = 0); public int eventfd_read (int fd, out uint64 value); public int eventfd_write (int fd, uint64 value); /* * Epoll */ [CCode (cprefix = "EPOLL_", has_type_id = false, cheader_filename = "sys/epoll.h")] public enum EpollFdFlags { CLOEXEC, } [CCode (cheader_filename = "sys/epoll.h", has_type_id = false, cname = "union epoll_data")] public struct EpollData { public void* ptr; public int fd; public uint32 u32; public uint64 u64; } [CCode (cheader_filename = "sys/epoll.h", has_type_id = false, cname = "struct epoll_event")] public struct EpollEvent { public uint32 events; public EpollData data; } [CCode (cheader_filename = "sys/epoll.h")] public int epoll_create (int size = 0); [CCode (cheader_filename = "sys/epoll.h")] public int epoll_create1 (int flags = 0); [CCode (cheader_filename = "sys/epoll.h")] public int epoll_wait (int epfd, EpollEvent[] events, int timeout); [CCode (cheader_filename = "sys/epoll.h")] public int epoll_pwait (int epfd, EpollEvent[] events, Posix.sigset_t? sigmask, int timeout); [CCode (cheader_filename = "sys/epoll.h")] public int epoll_ctl (int epfd, int op, int fd, EpollEvent? ev); [CCode (cheader_filename = "sys/epoll.h")] public const int EPOLLIN; [CCode (cheader_filename = "sys/epoll.h")] public const int EPOLLOUT; [CCode (cheader_filename = "sys/epoll.h")] public const int EPOLLERR; [CCode (cheader_filename = "sys/epoll.h")] public const int EPOLLHUP; [CCode (cheader_filename = "sys/epoll.h")] public const int EPOLLET; [CCode (cheader_filename = "sys/epoll.h")] public const int EPOLL_CTL_ADD; [CCode (cheader_filename = "sys/epoll.h")] public const int EPOLL_CTL_MOD; [CCode (cheader_filename = "sys/epoll.h")] public const int EPOLL_CTL_DEL; /* * Framebuffer */ [CCode (cprefix = "", lower_case_cprefix = "")] namespace Framebuffer { /* ioctls */ [CCode (cheader_filename = "linux/fb.h")] public const int FBIOGET_VSCREENINFO; [CCode (cheader_filename = "linux/fb.h")] public const int FBIOPUT_VSCREENINFO; [CCode (cheader_filename = "linux/fb.h")] public const int FBIOGET_FSCREENINFO; [CCode (cheader_filename = "linux/fb.h")] public const int FBIOGETCMAP; [CCode (cheader_filename = "linux/fb.h")] public const int FBIOPUTCMAP; [CCode (cheader_filename = "linux/fb.h")] public const int FBIOPAN_DISPLAY; [CCode (cheader_filename = "linux/fb.h")] public const int FBIO_CURSOR; [CCode (cheader_filename = "linux/fb.h")] public const int FBIOGET_MONITORSPEC; [CCode (cheader_filename = "linux/fb.h")] public const int FBIOPUT_MONITORSPEC; [CCode (cheader_filename = "linux/fb.h")] public const int FBIOSWITCH_MONIBIT; [CCode (cheader_filename = "linux/fb.h")] public const int FBIOGET_CON2FBMAP; [CCode (cheader_filename = "linux/fb.h")] public const int FBIOPUT_CON2FBMAP; [CCode (cheader_filename = "linux/fb.h")] public const int FBIOBLANK; [CCode (cheader_filename = "linux/fb.h")] public const int FBIOGET_VBLANK; [CCode (cheader_filename = "linux/fb.h")] public const int FBIO_ALLOC; [CCode (cheader_filename = "linux/fb.h")] public const int FBIO_FREE; [CCode (cheader_filename = "linux/fb.h")] public const int FBIOGET_GLYPH; [CCode (cheader_filename = "linux/fb.h")] public const int FBIOGET_HWCINFO; [CCode (cheader_filename = "linux/fb.h")] public const int FBIOPUT_MODEINFO; [CCode (cheader_filename = "linux/fb.h")] public const int FBIOGET_DISPINFO; /* enums */ [CCode (cname = "guint32", cprefix = "FB_TYPE_", has_type_id = false, cheader_filename = "linux/fb.h")] public enum Type { PACKED_PIXELS, PLANES, INTERLEAVED_PLANES, TEXT, VGA_PLANES } [CCode (cname = "guint32", cprefix = "FB_ACTIVATE_", has_type_id = false, cheader_filename = "linux/fb.h")] public enum Activate { NOW, NXTOPEN, TEST, MASK, VBL, [CCode (cname = "FB_CHANGE_CMAP_VBL")] CHANGE_CMAP_VBL, ALL, FORCE, INV_MODE } [CCode (cname = "guint32", cprefix = "FB_ACCEL_", has_type_id = false, cheader_filename = "linux/fb.h")] public enum Accel { NONE } [CCode (cname = "guint32", cprefix = "FB_AUX_", has_type_id = false, cheader_filename = "linux/fb.h")] public enum Aux { TEXT_MDA, TEXT_CGA, TEXT_S3_MMIO, TEXT_MGA_STEP16, TEXT_MGA_STEP8, TEXT_SVGA_GROUP, TEXT_SVGA_MASK, TEXT_SVGA_STEP2, TEXT_SVGA_STEP4, TEXT_SVGA_STEP8, TEXT_SVGA_STEP16, TEXT_SVGA_LAST, VGA_PLANES_VGA4, VGA_PLANES_CFB4, VGA_PLANES_CFB8 } [CCode (cprefix = "FB_BLANK_", has_type_id = false, cheader_filename = "linux/fb.h")] public enum Blank { UNBLANK, NORMAL, VSYNC_SUSPEND, HSYNC_SUSPEND, POWERDOWN } [CCode (cprefix = "FB_CUR_", has_type_id = false, cheader_filename = "linux/fb.h")] public enum Cur { SETIMAGE, SETPOS, SETHOT, SETCMAP, SETSHAPE, SETSIZE, SETALL } [CCode (cname = "guint32", cprefix = "ROP_", has_type_id = false, cheader_filename = "linux/fb.h")] public enum Rop { COPY, XOR } [CCode (cprefix = "FB_ROTATE_", has_type_id = false, cheader_filename = "linux/fb.h")] public enum Rotate { UR, CW, UD, CCW } [CCode (cname = "guint32", cprefix = "FB_SYNC_", has_type_id = false, cheader_filename = "linux/fb.h")] public enum Sync { HOR_HIGH_ACT, VERT_HIGH_ACT, EXT, COMP_HIGH_ACT, BROADCAST, ON_GREEN } [CCode (cname = "guint32", cprefix = "FB_VISUAL_", has_type_id = false, cheader_filename = "linux/fb.h")] public enum Visual { MONO01, MONO10, TRUECOLOR, PSEUDOCOLOR, DIRECTCOLOR, STATIC_PSEUDOCOLOR } [CCode (cname = "guint32", cprefix = "FB_VMODE_", has_type_id = false, cheader_filename = "linux/fb.h")] public enum Vmode { NONINTERLACED, INTERLACED, DOUBLE, ODD_FLD_FIRST, MASK, YWRAP, SMOOTH_XPAN, CONUPDATE } /* structures */ [CCode (cname = "struct fb_bitfield", has_type_id = false, cheader_filename = "linux/fb.h")] public struct BitField { public uint32 offset; public uint32 length; public uint32 msb_right; } [CCode (cname = "struct fb_cmap", has_type_id = false, cheader_filename = "linux/fb.h")] public struct Cmap { public uint32 start; public uint32 len; public uint16* red; public uint16* green; public uint16* blue; public uint16* transp; } [CCode (cname = "struct fb_con2fbmap", has_type_id = false, cheader_filename = "linux/fb.h")] public struct Con2FbMap { public uint32 console; public uint32 framebuffer; } [CCode (cname = "struct fbcurpos", has_type_id = false, cheader_filename = "linux/fb.h")] public struct CurPos { public uint16 x; public uint16 y; } [CCode (cname = "struct fb_cursor", has_type_id = false, cheader_filename = "linux/fb.h")] public struct Cursor { public uint16 set; public uint16 enable; public uint16 rop; string mask; public CurPos hot; public Image image; } [CCode (cname = "struct fb_copyarea", has_type_id = false, cheader_filename = "linux/fb.h")] public struct CopyArea { public uint32 dx; public uint32 dy; public uint32 width; public uint32 height; public uint32 sx; public uint32 sy; } [CCode (cname = "struct fb_fillrect", has_type_id = false, cheader_filename = "linux/fb.h")] public struct FillRect { public uint32 dx; public uint32 dy; public uint32 width; public uint32 height; public uint32 color; public Rop rop; } [CCode (cname = "struct fb_image", has_type_id = false, cheader_filename = "linux/fb.h")] public struct Image { public uint32 dx; public uint32 dy; public uint32 width; public uint32 height; public uint32 fg_color; public uint32 bg_color; public uint8 depth; public char* data; public Cmap cmap; } [CCode (cname = "struct fb_fix_screeninfo", has_type_id = false, cheader_filename = "linux/fb.h")] public struct FixScreenInfo { public char id[16]; public long smem_start; public uint32 smem_len; public Type type; public Aux type_aux; public Visual visual; public uint16 xpanstep; public uint16 ypanstep; public uint16 ywrapstep; public uint32 line_length; public long mmio_start; public uint32 mmio_len; public Accel accel; } [CCode (cname = "struct fb_var_screeninfo", has_type_id = false, cheader_filename = "linux/fb.h")] public struct VarScreenInfo { public uint32 xres; public uint32 yres; public uint32 xres_virtual; public uint32 yres_virtual; public uint32 xoffset; public uint32 yoffset; public uint32 bits_per_pixel; public uint32 grayscale; public BitField red; public BitField green; public BitField blue; public BitField transp; public uint32 nonstd; public Activate activate; public uint32 height; public uint32 width; public uint32 pixclock; public uint32 left_margin; public uint32 right_margin; public uint32 upper_margin; public uint32 lower_margin; public uint32 hsync_len; public uint32 vsync_len; public Sync sync; public Vmode vmode; public uint32 rotate; } [CCode (cname = "struct fb_vblank", has_type_id = false, cheader_filename = "linux/fb.h")] public struct Vblank { public uint32 flags; public uint32 count; public uint32 vcount; public uint32 hcount; } [CCode (lower_case_cprefix = "omapfb_", has_type_id = false, cheader_filename = "linux/omapfb.h")] namespace OMAP { [CCode (cname = "int", has_type_id = false, cprefix = "OMAPFB_")] public enum IOCTL { MIRROR, SYNC_GFX, VSYNC, SET_UPDATE_MODE, GET_CAPS, GET_UPDATE_MODE, LCD_TEST, CTRL_TEST, UPDATE_WINDOW_OLD, SET_COLOR_KEY, GET_COLOR_KEY, SETUP_PLANE, QUERY_PLANE, UPDATE_WINDOW, SETUP_MEM, QUERY_MEM, WAITFORVSYNC, MEMORY_READ, GET_OVERLAY_COLORMODE, WAITFORGO, GET_VRAM_INFO, SET_TEARSYNC } [Flags, CCode (cname = "int", has_type_id = false, prefix = "OMAPFB_CAPS_")] public enum Caps { GENERIC_MASK, LCDC_MASK, PANEL_MASK, MANUAL_UPDATE, TEARSYNC, PLANE_RELOCATE_MEM, PLANE_SCALE, WINDOW_PIXEL_DOUBLE, WINDOW_SCALE, WINDOW_OVERLAY, WINDOW_ROTATE, SET_BACKLIGHT, } [Flags, CCode (cname = "int", has_type_id = false, cprefix = "OMAPFB_FORMAT_FLAG_")] public enum Format { [CCode (cname = "OMAPFB_FORMAT_MASK")] MASK, DOUBLE, TEARSYNC, FORCE_VSYNC, ENABLE_OVERLAY, DISABLE_OVERLAY } [CCode (cname = "int", has_type_id = false, cprefix = "OMAPFB_MEMTYPE_")] public enum MemType { SDRAM, SRAM, MAX } [CCode (cname = "enum omapfb_color_format", has_type_id = false, cprefix = "OMAPFB_COLOR_")] public enum ColorFormat { RGB565, YUV422, YUV420, CLUT_8BPP, CLUT_4BPP, CLUT_2BPP, CLUT_1BPP, RGB444, YUY422, ARGB16, RGB24U, RGB24P, ARGB32, RGBA32, RGBX32, } [CCode (cname = "omapfb_update_window", has_type_id = false)] public struct UpdateWindow { public uint32 x; public uint32 y; public uint32 width; public uint32 height; public uint32 format; public uint32 out_x; public uint32 out_y; public uint32 out_width; public uint32 out_height; } [CCode (cname = "enum omapfb_plane", has_type_id = false, cprefix = "OMAPFB_PLANE_")] public enum Plane { GFX, VID1, VID2 } [CCode (cname = "enum omapfb_channel_out", has_type_id = false, cprefix = "OMAPFB_CHANNEL_OUT_")] public enum ChannelOut { LCD, DIGIT } [CCode (cname = "struct omapfb_plane_info", has_type_id = false)] public struct PlaneInfo { public uint32 pos_x; public uint32 pos_y; public uint8 enabled; public uint8 channel_out; public uint8 mirror; public uint32 out_width; public uint32 out_height; } [CCode (cname = "struct omapfb_mem_info", has_type_id = false)] public struct MemInfo { public uint32 size; public uint8 type; } [CCode (cname = "struct omapfb_caps", has_type_id = false)] public struct Capabilities { public uint32 ctrl; public uint32 plane_color; public uint32 wnd_color; } [CCode (cname = "enum omapfb_color_key_type", has_type_id = false, cprefix = "OMAPFB_COLOR_KEY_")] public enum ColorKeyType { DISABLED, GFX_DST, VID_SRC } [CCode (cname = "struct omapfb_color_key", has_type_id = false)] public struct ColorKey { public uint8 channel_out; public uint32 background; public uint32 trans_key; public uint8 key_type; } [CCode (cname = "enum omapfb_update_mode", has_type_id = false)] public enum UpdateMode { [CCode (cname = "OMAPFB_UPDATE_DISABLED")] DISABLED, [CCode (cname = "OMAPFB_AUTO_UPDATE")] AUTO, [CCode (cname = "OMAPFB_MANUAL_UPDATE")] MANUAL } [CCode (cname = "struct omapfb_memory_read", has_type_id = false)] public struct MemoryRead { public uint16 x; public uint16 y; public uint16 w; public uint16 h; public size_t buffer_size; public void* buffer; } [CCode (cname = "struct omapfb_ovl_colormode", has_type_id = false)] public struct OvlColorMode { public uint8 overlay_idx; public uint8 mode_idx; public uint32 bits_per_pixel; public uint32 nonstd; public Framebuffer.BitField red; public Framebuffer.BitField green; public Framebuffer.BitField blue; public Framebuffer.BitField transp; } [CCode (cname = "struct omapfb_vram_info", has_type_id = false)] public struct VRamInfo { public uint32 total; public uint32 free; public uint32 largest_free_block; } [CCode (cname = "struct omapfb_tearsync_info", has_type_id = false)] public struct TearSyncInfo { public uint8 enabled; public uint16 line; } } } // Non-Posix file control constants, -D _GNU_SOURCE [CCode (cheader_filename = "fcntl.h", feature_test_macro = "_GNU_SOURCE")] public const int O_DIRECT; [CCode (cheader_filename = "fcntl.h", feature_test_macro = "_GNU_SOURCE")] public const int O_NOATIME; [CCode (cheader_filename = "fcntl.h", feature_test_macro = "_GNU_SOURCE")] public const int O_PATH; [CCode (cheader_filename = "fcntl.h", feature_test_macro = "_GNU_SOURCE")] public const int O_TMPFILE; /* * Gsm */ namespace Gsm { [CCode (cname = "GSMIOC_GETCONF", cheader_filename = "linux/gsmmux.h")] public const int GSMIOC_GETCONF; [CCode (cname = "GSMIOC_SETCONF", cheader_filename = "linux/gsmmux.h")] public const int GSMIOC_SETCONF; [CCode (cname = "struct gsm_config", has_type_id = false, cheader_filename = "linux/gsmmux.h")] public struct Config { public uint adaption; public uint encapsulation; public uint initiator; public uint t1; public uint t2; public uint t3; public uint n2; public uint mru; public uint mtu; public uint k; public uint i; } } /* * I2C and System Management Bus */ [CCode (cprefix = "I2C_", lower_case_cprefix = "i2c_")] namespace I2C { const int SLAVE; [CCode (cprefix = "", lower_case_cprefix = "i2c_smbus_")] namespace SMBUS { int32 write_byte_data_masked (int file, uint8 mask, uint8 command, uint8 value) { int32 result = read_byte_data (file, command); if (result == -1) { return -1; } uint8 oldvalue = (uint8) result & 0xff; return write_byte_data (file, command, oldvalue | (value & mask) ); } //[CCode (cheader_filename = "i2c.h")] //int32 access(int file, char read_write, uint8 command, int size, union data *data); [CCode (cheader_filename = "i2c.h")] int32 write_quick (int file, uint8 value); [CCode (cheader_filename = "i2c.h")] int32 read_byte (int file); [CCode (cheader_filename = "i2c.h")] int32 write_byte (int file, uint8 value); [CCode (cheader_filename = "i2c.h")] int32 read_byte_data (int file, uint8 command); [CCode (cheader_filename = "i2c.h")] int32 write_byte_data (int file, uint8 command, uint8 value); [CCode (cheader_filename = "i2c.h")] int32 read_word_data (int file, uint8 command); [CCode (cheader_filename = "i2c.h")] int32 write_word_data (int file, uint8 command, uint16 value); [CCode (cheader_filename = "i2c.h")] int32 process_call (int file, uint8 command, uint16 value); [CCode (cheader_filename = "i2c.h")] int32 read_block_data (int file, uint8 command, [CCode (array_length=false)] uint8[] values); [CCode (cheader_filename = "i2c.h")] int32 write_block_data (int file, uint8 command, [CCode (array_length_pos = 2.3)] uint8[] values); [CCode (cheader_filename = "i2c.h")] int32 read_i2c_block_data (int file, uint8 command, [CCode (array_length_pos = 2.3)] uint8[] values); [CCode (cheader_filename = "i2c.h")] int32 write_i2c_block_data (int file, uint8 command, [CCode (array_length_pos = 2.3)] uint8[] values); [CCode (cheader_filename = "i2c.h")] int32 block_process_call (int file, uint8 command, [CCode (array_length_pos = 2.3)] uint8[] values); } } /* * Inotify */ [CCode (cname = "struct inotify_event", has_type_id = false, cheader_filename = "sys/inotify.h")] public struct InotifyEvent { public int wd; public uint32 mask; public uint32 cookie; public uint32 len; public string name; } [Flags, CCode (cname = "int", cprefix = "IN_", has_type_id = false, cheader_filename = "sys/inotify.h")] public enum InotifyFlags { CLOEXEC, NONBLOCK } [Flags, CCode (cname = "int", cprefix = "IN_", has_type_id = false, cheader_filename = "sys/inotify.h")] public enum InotifyMaskFlags { ACCESS, ATTRIB, CLOSE, CLOSE_WRITE, CLOSE_NOWRITE, CREATE, DELETE, DELETE_SELF, MODIFY, MOVE, MOVE_SELF, MOVED_FROM, MOVED_TO, OPEN, DONT_FOLLOW, MASK_ADD, ONESHOT, ONLYDIR, IGNORED, ISDIR, Q_OVERFLOW, UNMOUNT } [CCode (cname = "inotify_init1", cheader_filename = "sys/inotify.h")] public int inotify_init (InotifyFlags flags = 0); public int inotify_add_watch (int fd, string pathname, InotifyMaskFlags mask); public int inotify_rm_watch (int fd, int wd); /* * RfKill */ [CCode (cname = "struct rfkill_event", has_type_id = false, cheader_filename = "linux/rfkill.h")] public struct RfKillEvent { public uint32 idx; public RfKillType type; public RfKillOp op; public uint8 soft; public uint8 hard; } [CCode (cname = "guint8", cprefix = "RFKILL_OP_", has_type_id = false, cheader_filename = "linux/rfkill.h")] public enum RfKillOp { ADD, DEL, CHANGE, CHANGE_ALL } [CCode (cname = "guint8", cprefix = "RFKILL_STATE_", has_type_id = false, cheader_filename = "linux/rfkill.h")] public enum RfKillState { SOFT_BLOCKED, UNBLOCKED, HARD_BLOCKED } [CCode (cname = "guint8", cprefix = "RFKILL_TYPE_", has_type_id = false, cheader_filename = "linux/rfkill.h")] public enum RfKillType { ALL, WLAN, BLUETOOTH, UWB, WIMAX, WWAN, GPS, FM, NFC } /* * SignalFd */ [CCode (cprefix = "SFD_", has_type_id = false, cheader_filename = "sys/signalfd.h")] public enum SignalFdFlags { CLOEXEC, NONBLOCK } [CCode (cheader_filename = "sys/signalfd.h")] public int signalfd (int fd, Posix.sigset_t mask, SignalFdFlags flags = 0); /* * Misc non-posix additions */ [CCode (cheader_filename = "dirent.h", has_type_id = false)] public enum DirEntType { DT_UNKNOWN, DT_FIFO, DT_CHR, DT_DIR, DT_BLK, DT_REG, DT_LNK, DT_SOCK, DT_WHT } [CCode (cheader_filename = "errno.h", feature_test_macro = "_GNU_SOURCE")] public const string program_invocation_name; [CCode (cheader_filename = "errno.h", feature_test_macro = "_GNU_SOURCE")] public const string program_invocation_short_name; [Version (deprecated_since = "vala-0.26", replacement = "Backtrace.get"), CCode (cheader_filename = "execinfo.h")] public int backtrace (void* buffer, int size); [Version (deprecated_since = "vala-0.26", replacement = "Backtrace.symbols"), CCode (cheader_filename = "execinfo.h", array_length = false)] public (unowned string)[]? backtrace_symbols (void* buffer, int size); [Version (deprecated_since = "vala-0.26", replacement = "Backtrace.symbols_fd"), CCode (cheader_filename = "execinfo.h")] public void backtrace_symbols_fd (void* buffer, int size, int fd); namespace Backtrace { [CCode (cname = "backtrace", cheader_filename = "execinfo.h")] public int @get (void*[] buffer); [CCode (cname = "backtrace_symbols", cheader_filename = "execinfo.h", array_length = false)] private (unowned string)[]? _symbols (void*[] buffer); [CCode (cname = "_vala_backtrace_symbols")] public (unowned string)[]? symbols (void*[] buffer) { (unowned string)[]? s = _symbols (buffer); s.length = buffer.length; return s; } [CCode (cheader_filename = "execinfo.h")] public void symbols_fd (void*[] buffer, int fd); } [CCode (cheader_filename = "signal.h")] public void psiginfo (Posix.siginfo_t pinfo, string message); [CCode (cheader_filename = "unistd.h", feature_test_macro = "_GNU_SOURCE")] public int dup3 (int oldfd, int newfd, int flags); [CCode (cheader_filename = "sys/types.h,unistd.h")] public int getgroups ([CCode (array_length_pos = 0.9)] Posix.gid_t[]? list = null); [CCode (cheader_filename = "unistd.h", feature_test_macro = "_GNU_SOURCE")] public int getresgid (out Posix.gid_t rgid, out Posix.gid_t egid, out Posix.gid_t sgid); [CCode (cheader_filename = "unistd.h", feature_test_macro = "_GNU_SOURCE")] public int getresuid (out Posix.uid_t ruid, out Posix.uid_t euid, out Posix.uid_t suid); [CCode (cheader_filename = "sys/types.h,grp.h,unistd.h")] public int setgroups ([CCode (array_length_pos = 0.9)] Posix.gid_t[] list); [CCode (cheader_filename = "unistd.h", feature_test_macro = "_GNU_SOURCE")] public int setresgid (Posix.gid_t rgid, Posix.gid_t egid, Posix.gid_t sgid); [CCode (cheader_filename = "unistd.h", feature_test_macro = "_GNU_SOURCE")] public int setresuid (Posix.uid_t ruid, Posix.uid_t euid, Posix.uid_t suid); [CCode (cheader_filename = "unistd.h")] public int sethostname (string name, size_t len); // additional sysconf(3) constants [CCode (cheader_filename = "unistd.h")] public const int _SC_PHYS_PAGES; [CCode (cheader_filename = "unistd.h")] public const int _SC_AVPHYS_PAGES; [CCode (cheader_filename = "unistd.h")] public const int _SC_NPROCESSORS_CONF; [CCode (cheader_filename = "unistd.h")] public const int _SC_NPROCESSORS_ONLN; [CCode (cheader_filename = "arpa/inet.h")] public int inet_aton (string cp, out Posix.InAddr addr); [CCode (cheader_filename = "sys/ioctl.h", sentinel = "")] public int ioctl (int fd, int request, ...); [CCode (cname = "makedev", cheader_filename = "sys/types.h")] public Posix.dev_t makedev (int maj, int min); [CCode (cname = "major", cheader_filename = "sys/types.h")] public int major (Posix.dev_t dev); [CCode (cname = "minor", cheader_filename = "sys/types.h")] public int minor (Posix.dev_t dev); [CCode (cname = "unsigned long int", cprefix = "MS_", has_type_id = false, cheader_filename = "sys/mount.h,linux/fs.h")] public enum MountFlags { RDONLY, NOSUID, NODEV, NOEXEC, SYNCHRONOUS, REMOUNT, MANDLOCK, DIRSYNC, NOATIME, NODIRATIME, BIND, MOVE, REC, SILENT, POSIXACL, UNBINDABLE, PRIVATE, SLAVE, SHARED, RELATIME, KERNMOUNT, I_VERSION, STRICTATIME, BORN, ACTIVE, NOUSER } [CCode (cname = "int", cprefix = "MNT_", has_type_id = false, cheader_filename = "sys/mount.h")] public enum UnmountFlags { FORCE, /* Force unmounting. */ DETACH, /* Just detach from the tree. */ EXPIRE /* Mark for expiry. */ } [CCode (cheader_filename = "sys/mount.h")] public int mount (string source, string target, string filesystemtype, MountFlags flags = 0, string options = ""); [CCode (cheader_filename = "sys/mount.h")] public int umount (string target); [CCode (cheader_filename = "sys/mount.h")] public int umount2 (string target, UnmountFlags flags); [CCode (cname = "struct winsize", has_type_id = false, cheader_filename = "termios.h", destroy_function = "")] public struct winsize { public ushort ws_row; public ushort ws_col; public ushort ws_xpixel; public ushort ws_ypixel; } [CCode (cheader_filename = "pty.h")] public Posix.pid_t forkpty (out int amaster, [CCode (array_length=false, array_null_terminated=true)] char[] name, Posix.termios? termp, winsize? winp); [CCode (cheader_filename = "pty.h")] public int openpty (out int amaster, out int aslave, [CCode (array_length=false, array_null_terminated=true)] char[] name, Posix.termios? termp, winsize? winp); [CCode (cprefix = "RB_", has_type_id = false, cheader_filename = "unistd.h,sys/reboot.h")] public enum RebootCommands { AUTOBOOT, HALT_SYSTEM, ENABLE_CAD, DISABLE_CAD, POWER_OFF } [CCode (cheader_filename = "unistd.h,sys/reboot.h")] public int reboot (RebootCommands cmd); [CCode (cprefix = "CLONE_", has_type_id = false, cheader_filename = "sched.h")] public enum CloneFlags { FILES, FS, NEWNS } [CCode (cheader_filename = "sched.h")] public int unshare (CloneFlags flags); [CCode (cheader_filename = "sys/time.h")] public int adjtime (Posix.timeval delta, Posix.timeval? olddelta = null); // adjtimex(2) [CCode (cprefix = "ADJ_", has_type_id = false, cheader_filename = "sys/timex.h")] public enum AdjustModes { OFFSET, FREQUENCY, MAXERROR, ESTERROR, STATUS, TIMECONST, TICK, OFFSET_SINGLESHOT } [CCode (cheader_filename = "sys/timex.h")] public const int TIME_OK; [CCode (cheader_filename = "sys/timex.h")] public const int TIME_INS; [CCode (cheader_filename = "sys/timex.h")] public const int TIME_DEL; [CCode (cheader_filename = "sys/timex.h")] public const int TIME_OOP; [CCode (cheader_filename = "sys/timex.h")] public const int TIME_WAIT; [CCode (cheader_filename = "sys/timex.h")] public const int TIME_BAD; // adjtimex(2) [CCode (cname = "struct timex", has_type_id = false, cheader_filename = "sys/timex.h")] public struct timex { public AdjustModes modes; /* mode selector */ public long offset; /* time offset (usec) */ public long freq; /* frequency offset (scaled ppm) */ public long maxerror; /* maximum error (usec) */ public long esterror; /* estimated error (usec) */ public int status; /* clock command/status */ public long constant; /* pll time constant */ public long precision; /* clock precision (usec) (read-only) */ public long tolerance; /* clock frequency tolerance (ppm) (read-only) */ public Posix.timeval time; /* current time (read-only) */ public long tick; /* usecs between clock ticks */ } [CCode (cheader_filename = "sys/timex.h")] public int adjtimex (Linux.timex buf); [CCode (cheader_filename = "time.h")] public time_t timegm (GLib.Time t); [CCode (cheader_filename = "time.h")] public const Posix.clockid_t CLOCK_MONOTONIC_RAW; [CCode (cheader_filename = "utmp.h")] public int login_tty (int fd); // emulate gettid(2) for which no glib wrapper exists via syscall public Posix.pid_t gettid() { return (Posix.pid_t) syscall( SysCall.gettid ); } // syscall(2) [CCode (cprefix = "SYS_", has_type_id = false, cname = "int")] public enum SysCall { gettid } [CCode (cname = "syscall", cheader_filename = "unistd.h,sys/syscall.h")] public int syscall (int number, ...); // mremap(2) [CCode (cprefix = "MREMAP_", has_type_id = false, cheader_filename = "sys/mman.h")] public enum MremapFlags { MAYMOVE, FIXED } [CCode (cheader_filename = "sys/mman.h")] public void *mremap (void *old_address, size_t old_size, size_t new_size, MremapFlags flags); /* * Network */ [CCode (cprefix = "", lower_case_cprefix = "")] namespace Network { // interface consts, structs, and methods [CCode (cname = "IFNAMSIZ", cheader_filename = "sys/socket.h,linux/if.h")] public const int INTERFACE_NAME_SIZE; [CCode (cheader_filename = "net/if.h")] public uint if_nametoindex (string ifname); [CCode (cheader_filename = "net/if.h")] public unowned string if_indextoname (uint ifindex, string ifname); [CCode (cheader_filename = "net/if.h")] public IfNameindex if_nameindex (); [CCode (cname = "int", cprefix = "IFF_", has_type_id = false, cheader_filename = "sys/socket.h,linux/if.h")] public enum IfFlag { UP, BROADCAST, DEBUG, LOOPBACK, POINTOPOINT, NOTRAILERS, RUNNING, NOARP, PROMISC, ALLMULTI, MASTER, SLAVE, PORTSEL, AUTOMEDIA, DYNAMIC } [CCode (cname = "struct if_nameindex", has_type_id = false, cheader_filename = "sys/socket.h,linux/if.h", destroy_function = "if_freenameindex")] public struct IfNameindex { public uint if_index; public string if_name; } [CCode (cname = "struct ifmap", has_type_id = false, cheader_filename = "sys/socket.h,linux/if.h", destroy_function = "")] public struct IfMap { public ulong mem_start; public ulong mem_end; public short base_addr; public uchar irq; public uchar dma; public uchar port; } [CCode (cname = "struct ifreq", has_type_id = false, cheader_filename = "netinet/in.h,linux/if.h", destroy_function = "")] public struct IfReq { [CCode (array_length = false)] public char[] ifr_name; public Posix.SockAddr ifr_addr; public Posix.SockAddr ifr_dstaddr; public Posix.SockAddr ifr_broadaddr; public Posix.SockAddr ifr_netmask; public Posix.SockAddr ifr_hwaddr; public short ifr_flags; public int ifr_metric; public int ifr_mtu; public IfMap ifr_map; public char[] ifr_slave; public string ifr_data; public int ifr_ifindex; public int ifr_bandwidth; public int ifr_qlen; public char[] ifr_newname; } [CCode (cname = "struct ifconf", has_type_id = false, cheader_filename = "sys/socket.h,linux/if.h", destroy_function = "")] public struct IfConf { public int ifc_len; public string ifc_buf; public IfReq ifc_req; } [CCode (cname = "struct ifaddrmsg", has_type_id = false, cheader_filename = "linux/if_addr.h", destroy_function = "")] public struct IfAddrMsg { public uint8 ifa_family; public uint8 ifa_prefixlen; public uint8 ifa_flags; public uint8 ifa_scope; public uint32 ifa_index; } [Compact, CCode (cname = "struct ifaddrs", cheader_filename = "sys/types.h,ifaddrs.h", free_function = "freeifaddrs", has_type_id = false)] public class IfAddrs { public unowned IfAddrs? ifa_next; public string ifa_name; public uint ifa_flags; public Posix.SockAddr? ifa_addr; public Posix.SockAddr? ifa_netmask; [CCode (cname = "ifa_ifu.ifu_broadaddr")] public Posix.SockAddr? ifa_ifu_broadaddr; [CCode (cname = "ifa_ifu.ifu_dstaddr")] public Posix.SockAddr? ifa_ifu_dstaddr; public void* ifa_data; } [CCode (cname = "getifaddrs")] public static int getifaddrs (out IfAddrs ifap); [CCode (cprefix = "IFA_", has_type_id = false, cheader_filename = "linux/if_addr.h")] public enum IfAddrType { UNSPEC, ADDRESS, LOCAL, LABEL, BROADCAST, ANYCAST, CACHEINFO, MULTICAST } [CCode (cheader_filename = "linux/if_addr.h")] public int IFA_PAYLOAD (Linux.Netlink.NlMsgHdr nlh); [CCode (cheader_filename = "linux/if_addr.h")] public Linux.Netlink.RtAttr* IFA_RTA (Linux.Network.IfAddrMsg* msg); [CCode (cprefix = "ARPHRD_", has_type_id = false, cheader_filename = "linux/if_arp.h")] public enum IfArpHeaderType { NETROM, ETHER, EETHER, AX25, PRONET, CHAOS, IEEE802, ARCNET, APPLETLK, DLCI, ATM, METRICOM, IEEE1394, EUI64, INFINIBAND, SLIP, CSLIP, SLIP6, CSLIP6, RSRVD, ADAPT, ROSE, X25, HWX25, CAN, PPP, CISCO, HDLC, LAPB, DDCMP, RAWHDLC, TUNNEL, TUNNEL6, FRAD, SKIP, LOOPBACK, LOCALTLK, FDDI, BIF, SIT, IPDDP, IPGRE, PIMREG, HIPPI, ASH, ECONET, IRDA, FCPP, FCAL, FCPL, FCFABRIC, IEEE802_TR, IEEE80211, IEEE80211_PRISM, IEEE80211_RADIOTAP, IEEE802154, PHONET, PHONET_PIPE, CAIF, VOID, NONE } [CCode (cprefix = "ARPOP_", has_type_id = false, cheader_filename = "linux/if_arp.h")] public enum IfArpOpcode { REQUEST, REPLY, RREQUEST, RREPLY, InREQUEST, InREPLY, ARPOP_NAK } // route consts, structs, and methods [CCode (cname = "struct rtentry", has_type_id = false, cheader_filename = "net/route.h", destroy_function = "")] public struct RtEntry { public Posix.SockAddr rt_dst; public Posix.SockAddr rt_gateway; public Posix.SockAddr rt_genmask; public RtFlag rt_flags; public short rt_metric; public string rt_dev; public ulong rt_mtu; public ulong rt_window; public ushort rt_irtt; } [CCode (cname = "ushort", cprefix = "RTF_", has_type_id = false, cheader_filename = "net/route.h")] public enum RtFlag { UP, GATEWAY, HOST, REINSTATE, DYNAMIC, MODIFIED, MTU, WINDOW, IRTT, REJECT, STATIC, XRESOLVE, NOFORWARD, THROW, NOPMTUDISC } /* ioctls */ [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCADDRT; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCDELRT; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCRTMSG; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCGIFNAME; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCSIFLINK; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCGIFCONF; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCGIFFLAGS; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCSIFFLAGS; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCGIFADDR; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCSIFADDR; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCGIFDSTADDR; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCSIFDSTADDR; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCGIFBRDADDR; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCSIFBRDADDR; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCGIFNETMASK; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCSIFNETMASK; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCGIFMETRIC; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCSIFMETRIC; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCGIFMEM; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCSIFMEM; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCGIFMTU; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCSIFMTU; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCSIFNAME; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCSIFHWADDR; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCGIFENCAP; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCSIFENCAP; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCGIFHWADDR; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCGIFSLAVE; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCSIFSLAVE; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCADDMULTI; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCDELMULTI; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCGIFINDEX; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCSIFPFLAGS; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCGIFPFLAGS; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCDIFADDR; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCSIFHWBROADCAST; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCGIFCOUNT; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCGIFBR; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCSIFBR; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCGIFTXQLEN; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCSIFTXQLEN; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCDARP; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCGARP; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCSARP; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCDRARP; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCGRARP; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCSRARP; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCGIFMAP; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCSIFMAP; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCADDDLCI; [CCode (cheader_filename = "sys/ioctl.h")] public const int SIOCDELDLCI; } /* * Input subsystem */ [CCode (cprefix = "", lower_case_cprefix = "")] namespace Input { /* * subsystem structures */ [CCode (cname = "struct input_event", has_type_id = false, cheader_filename = "linux/input.h")] public struct Event { public Posix.timeval time; public uint16 type; public uint16 code; public int32 value; } [CCode (cname = "struct input_id", has_type_id = false, cheader_filename = "linux/input.h")] public struct Id { public uint16 bustype; public uint16 vendor; public uint16 product; public uint16 version; } [CCode (cname = "struct input_absinfo", has_type_id = false, cheader_filename = "linux/input.h")] public struct AbsInfo { public int32 value; public int32 minimum; public int32 maximum; public int32 fuzz; public int32 flat; } /* * ioctls */ [CCode (cheader_filename = "linux/input.h,sys/ioctl.h")] public const int EVIOCGVERSION; [CCode (cheader_filename = "linux/input.h,sys/ioctl.h")] public const int EVIOCGID; [CCode (cheader_filename = "linux/input.h,sys/ioctl.h")] public const int EVIOCGREP; [CCode (cheader_filename = "linux/input.h,sys/ioctl.h")] public const int EVIOCSREP; [CCode (cheader_filename = "linux/input.h,sys/ioctl.h")] public const int EVIOCGKEYCODE; [CCode (cheader_filename = "linux/input.h,sys/ioctl.h")] public const int EVIOCSKEYCODE; [CCode (cheader_filename = "linux/input.h,sys/ioctl.h")] public int EVIOCGNAME( uint len ); [CCode (cheader_filename = "linux/input.h,sys/ioctl.h")] public int EVIOCGPHYS( uint len ); [CCode (cheader_filename = "linux/input.h,sys/ioctl.h")] public int EVIOCGUNIQ( uint len ); [CCode (cheader_filename = "linux/input.h,sys/ioctl.h")] public int EVIOCGKEY( uint len ); [CCode (cheader_filename = "linux/input.h,sys/ioctl.h")] public int EVIOCGLED( uint len ); [CCode (cheader_filename = "linux/input.h,sys/ioctl.h")] public int EVIOCGSND( uint len ); [CCode (cheader_filename = "linux/input.h,sys/ioctl.h")] public int EVIOCGSW( uint len ); [CCode (cheader_filename = "linux/input.h,sys/ioctl.h")] public int EVIOCGBIT( uint ev, uint len ); [CCode (cheader_filename = "linux/input.h,sys/ioctl.h")] public int EVIOCGABS( uint abs ); [CCode (cheader_filename = "linux/input.h,sys/ioctl.h")] public int EVIOCSABS( uint abs ); [CCode (cheader_filename = "linux/input.h,sys/ioctl.h")] public const int EVIOCSFF; [CCode (cheader_filename = "linux/input.h,sys/ioctl.h")] public const int EVIOCRMFF; [CCode (cheader_filename = "linux/input.h,sys/ioctl.h")] public const int EVIOCGEFFECTS; [CCode (cheader_filename = "linux/input.h,sys/ioctl.h")] public const int EVIOCGRAB; /* * event types */ [CCode (cheader_filename = "linux/input.h")] public const uint16 EV_SYN; [CCode (cheader_filename = "linux/input.h")] public const uint16 EV_KEY; [CCode (cheader_filename = "linux/input.h")] public const uint16 EV_REL; [CCode (cheader_filename = "linux/input.h")] public const uint16 EV_ABS; [CCode (cheader_filename = "linux/input.h")] public const uint16 EV_MSC; [CCode (cheader_filename = "linux/input.h")] public const uint16 EV_SW; [CCode (cheader_filename = "linux/input.h")] public const uint16 EV_LED; [CCode (cheader_filename = "linux/input.h")] public const uint16 EV_SND; [CCode (cheader_filename = "linux/input.h")] public const uint16 EV_REP; [CCode (cheader_filename = "linux/input.h")] public const uint16 EV_FF; [CCode (cheader_filename = "linux/input.h")] public const uint16 EV_PWR; [CCode (cheader_filename = "linux/input.h")] public const uint16 EV_FF_STATUS; [CCode (cheader_filename = "linux/input.h")] public const uint16 EV_MAX; /* * synchronization events */ [CCode (cheader_filename = "linux/input.h")] public const int SYN_REPORT; [CCode (cheader_filename = "linux/input.h")] public const int SYN_CONFIG; [CCode (cheader_filename = "linux/input.h")] public const int SYN_MT_REPORT; [CCode (cheader_filename = "linux/input.h")] public const int SYN_DROPPED; [CCode (cheader_filename = "linux/input.h")] public const int SYN_MAX; /* * keys, switches, buttons, etc. */ [CCode (cheader_filename = "linux/input.h")] public const int KEY_RESERVED; [CCode (cheader_filename = "linux/input.h")] public const int KEY_ESC; [CCode (cheader_filename = "linux/input.h")] public const int KEY_1; [CCode (cheader_filename = "linux/input.h")] public const int KEY_2; [CCode (cheader_filename = "linux/input.h")] public const int KEY_3; [CCode (cheader_filename = "linux/input.h")] public const int KEY_4; [CCode (cheader_filename = "linux/input.h")] public const int KEY_5; [CCode (cheader_filename = "linux/input.h")] public const int KEY_6; [CCode (cheader_filename = "linux/input.h")] public const int KEY_7; [CCode (cheader_filename = "linux/input.h")] public const int KEY_8; [CCode (cheader_filename = "linux/input.h")] public const int KEY_9; [CCode (cheader_filename = "linux/input.h")] public const int KEY_0; [CCode (cheader_filename = "linux/input.h")] public const int KEY_MINUS; [CCode (cheader_filename = "linux/input.h")] public const int KEY_EQUAL; [CCode (cheader_filename = "linux/input.h")] public const int KEY_BACKSPACE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_TAB; [CCode (cheader_filename = "linux/input.h")] public const int KEY_Q; [CCode (cheader_filename = "linux/input.h")] public const int KEY_W; [CCode (cheader_filename = "linux/input.h")] public const int KEY_E; [CCode (cheader_filename = "linux/input.h")] public const int KEY_R; [CCode (cheader_filename = "linux/input.h")] public const int KEY_T; [CCode (cheader_filename = "linux/input.h")] public const int KEY_Y; [CCode (cheader_filename = "linux/input.h")] public const int KEY_U; [CCode (cheader_filename = "linux/input.h")] public const int KEY_I; [CCode (cheader_filename = "linux/input.h")] public const int KEY_O; [CCode (cheader_filename = "linux/input.h")] public const int KEY_P; [CCode (cheader_filename = "linux/input.h")] public const int KEY_LEFTBRACE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_RIGHTBRACE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_ENTER; [CCode (cheader_filename = "linux/input.h")] public const int KEY_LEFTCTRL; [CCode (cheader_filename = "linux/input.h")] public const int KEY_A; [CCode (cheader_filename = "linux/input.h")] public const int KEY_S; [CCode (cheader_filename = "linux/input.h")] public const int KEY_D; [CCode (cheader_filename = "linux/input.h")] public const int KEY_F; [CCode (cheader_filename = "linux/input.h")] public const int KEY_G; [CCode (cheader_filename = "linux/input.h")] public const int KEY_H; [CCode (cheader_filename = "linux/input.h")] public const int KEY_J; [CCode (cheader_filename = "linux/input.h")] public const int KEY_K; [CCode (cheader_filename = "linux/input.h")] public const int KEY_L; [CCode (cheader_filename = "linux/input.h")] public const int KEY_SEMICOLON; [CCode (cheader_filename = "linux/input.h")] public const int KEY_APOSTROPHE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_GRAVE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_LEFTSHIFT; [CCode (cheader_filename = "linux/input.h")] public const int KEY_BACKSLASH; [CCode (cheader_filename = "linux/input.h")] public const int KEY_Z; [CCode (cheader_filename = "linux/input.h")] public const int KEY_X; [CCode (cheader_filename = "linux/input.h")] public const int KEY_C; [CCode (cheader_filename = "linux/input.h")] public const int KEY_V; [CCode (cheader_filename = "linux/input.h")] public const int KEY_B; [CCode (cheader_filename = "linux/input.h")] public const int KEY_N; [CCode (cheader_filename = "linux/input.h")] public const int KEY_M; [CCode (cheader_filename = "linux/input.h")] public const int KEY_COMMA; [CCode (cheader_filename = "linux/input.h")] public const int KEY_DOT; [CCode (cheader_filename = "linux/input.h")] public const int KEY_SLASH; [CCode (cheader_filename = "linux/input.h")] public const int KEY_RIGHTSHIFT; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KPASTERISK; [CCode (cheader_filename = "linux/input.h")] public const int KEY_LEFTALT; [CCode (cheader_filename = "linux/input.h")] public const int KEY_SPACE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_CAPSLOCK; [CCode (cheader_filename = "linux/input.h")] public const int KEY_F1; [CCode (cheader_filename = "linux/input.h")] public const int KEY_F2; [CCode (cheader_filename = "linux/input.h")] public const int KEY_F3; [CCode (cheader_filename = "linux/input.h")] public const int KEY_F4; [CCode (cheader_filename = "linux/input.h")] public const int KEY_F5; [CCode (cheader_filename = "linux/input.h")] public const int KEY_F6; [CCode (cheader_filename = "linux/input.h")] public const int KEY_F7; [CCode (cheader_filename = "linux/input.h")] public const int KEY_F8; [CCode (cheader_filename = "linux/input.h")] public const int KEY_F9; [CCode (cheader_filename = "linux/input.h")] public const int KEY_F10; [CCode (cheader_filename = "linux/input.h")] public const int KEY_NUMLOCK; [CCode (cheader_filename = "linux/input.h")] public const int KEY_SCROLLLOCK; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KP7; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KP8; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KP9; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KPMINUS; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KP4; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KP5; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KP6; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KPPLUS; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KP1; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KP2; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KP3; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KP0; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KPDOT; [CCode (cheader_filename = "linux/input.h")] public const int KEY_ZENKAKUHANKAKU; [CCode (cheader_filename = "linux/input.h")] public const int KEY_102ND; [CCode (cheader_filename = "linux/input.h")] public const int KEY_F11; [CCode (cheader_filename = "linux/input.h")] public const int KEY_F12; [CCode (cheader_filename = "linux/input.h")] public const int KEY_RO; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KATAKANA; [CCode (cheader_filename = "linux/input.h")] public const int KEY_HIRAGANA; [CCode (cheader_filename = "linux/input.h")] public const int KEY_HENKAN; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KATAKANAHIRAGANA; [CCode (cheader_filename = "linux/input.h")] public const int KEY_MUHENKAN; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KPJPCOMMA; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KPENTER; [CCode (cheader_filename = "linux/input.h")] public const int KEY_RIGHTCTRL; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KPSLASH; [CCode (cheader_filename = "linux/input.h")] public const int KEY_SYSRQ; [CCode (cheader_filename = "linux/input.h")] public const int KEY_RIGHTALT; [CCode (cheader_filename = "linux/input.h")] public const int KEY_LINEFEED; [CCode (cheader_filename = "linux/input.h")] public const int KEY_HOME; [CCode (cheader_filename = "linux/input.h")] public const int KEY_UP; [CCode (cheader_filename = "linux/input.h")] public const int KEY_PAGEUP; [CCode (cheader_filename = "linux/input.h")] public const int KEY_LEFT; [CCode (cheader_filename = "linux/input.h")] public const int KEY_RIGHT; [CCode (cheader_filename = "linux/input.h")] public const int KEY_END; [CCode (cheader_filename = "linux/input.h")] public const int KEY_DOWN; [CCode (cheader_filename = "linux/input.h")] public const int KEY_PAGEDOWN; [CCode (cheader_filename = "linux/input.h")] public const int KEY_INSERT; [CCode (cheader_filename = "linux/input.h")] public const int KEY_DELETE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_MACRO; [CCode (cheader_filename = "linux/input.h")] public const int KEY_MUTE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_VOLUMEDOWN; [CCode (cheader_filename = "linux/input.h")] public const int KEY_VOLUMEUP; [CCode (cheader_filename = "linux/input.h")] public const int KEY_POWER; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KPEQUAL; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KPPLUSMINUS; [CCode (cheader_filename = "linux/input.h")] public const int KEY_PAUSE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_SCALE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KPCOMMA; [CCode (cheader_filename = "linux/input.h")] public const int KEY_HANGEUL; [CCode (cheader_filename = "linux/input.h")] public const int KEY_HANGUEL; [CCode (cheader_filename = "linux/input.h")] public const int KEY_HANJA; [CCode (cheader_filename = "linux/input.h")] public const int KEY_YEN; [CCode (cheader_filename = "linux/input.h")] public const int KEY_LEFTMETA; [CCode (cheader_filename = "linux/input.h")] public const int KEY_RIGHTMETA; [CCode (cheader_filename = "linux/input.h")] public const int KEY_COMPOSE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_STOP; [CCode (cheader_filename = "linux/input.h")] public const int KEY_AGAIN; [CCode (cheader_filename = "linux/input.h")] public const int KEY_PROPS; [CCode (cheader_filename = "linux/input.h")] public const int KEY_UNDO; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FRONT; [CCode (cheader_filename = "linux/input.h")] public const int KEY_COPY; [CCode (cheader_filename = "linux/input.h")] public const int KEY_OPEN; [CCode (cheader_filename = "linux/input.h")] public const int KEY_PASTE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FIND; [CCode (cheader_filename = "linux/input.h")] public const int KEY_CUT; [CCode (cheader_filename = "linux/input.h")] public const int KEY_HELP; [CCode (cheader_filename = "linux/input.h")] public const int KEY_MENU; [CCode (cheader_filename = "linux/input.h")] public const int KEY_CALC; [CCode (cheader_filename = "linux/input.h")] public const int KEY_SETUP; [CCode (cheader_filename = "linux/input.h")] public const int KEY_SLEEP; [CCode (cheader_filename = "linux/input.h")] public const int KEY_WAKEUP; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FILE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_SENDFILE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_DELETEFILE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_XFER; [CCode (cheader_filename = "linux/input.h")] public const int KEY_PROG1; [CCode (cheader_filename = "linux/input.h")] public const int KEY_PROG2; [CCode (cheader_filename = "linux/input.h")] public const int KEY_WWW; [CCode (cheader_filename = "linux/input.h")] public const int KEY_MSDOS; [CCode (cheader_filename = "linux/input.h")] public const int KEY_COFFEE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_SCREENLOCK; [CCode (cheader_filename = "linux/input.h")] public const int KEY_DIRECTION; [CCode (cheader_filename = "linux/input.h")] public const int KEY_CYCLEWINDOWS; [CCode (cheader_filename = "linux/input.h")] public const int KEY_MAIL; [CCode (cheader_filename = "linux/input.h")] public const int KEY_BOOKMARKS; [CCode (cheader_filename = "linux/input.h")] public const int KEY_COMPUTER; [CCode (cheader_filename = "linux/input.h")] public const int KEY_BACK; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FORWARD; [CCode (cheader_filename = "linux/input.h")] public const int KEY_CLOSECD; [CCode (cheader_filename = "linux/input.h")] public const int KEY_EJECTCD; [CCode (cheader_filename = "linux/input.h")] public const int KEY_EJECTCLOSECD; [CCode (cheader_filename = "linux/input.h")] public const int KEY_NEXTSONG; [CCode (cheader_filename = "linux/input.h")] public const int KEY_PLAYPAUSE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_PREVIOUSSONG; [CCode (cheader_filename = "linux/input.h")] public const int KEY_STOPCD; [CCode (cheader_filename = "linux/input.h")] public const int KEY_RECORD; [CCode (cheader_filename = "linux/input.h")] public const int KEY_REWIND; [CCode (cheader_filename = "linux/input.h")] public const int KEY_PHONE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_ISO; [CCode (cheader_filename = "linux/input.h")] public const int KEY_CONFIG; [CCode (cheader_filename = "linux/input.h")] public const int KEY_HOMEPAGE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_REFRESH; [CCode (cheader_filename = "linux/input.h")] public const int KEY_EXIT; [CCode (cheader_filename = "linux/input.h")] public const int KEY_MOVE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_EDIT; [CCode (cheader_filename = "linux/input.h")] public const int KEY_SCROLLUP; [CCode (cheader_filename = "linux/input.h")] public const int KEY_SCROLLDOWN; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KPLEFTPAREN; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KPRIGHTPAREN; [CCode (cheader_filename = "linux/input.h")] public const int KEY_NEW; [CCode (cheader_filename = "linux/input.h")] public const int KEY_REDO; [CCode (cheader_filename = "linux/input.h")] public const int KEY_F13; [CCode (cheader_filename = "linux/input.h")] public const int KEY_F14; [CCode (cheader_filename = "linux/input.h")] public const int KEY_F15; [CCode (cheader_filename = "linux/input.h")] public const int KEY_F16; [CCode (cheader_filename = "linux/input.h")] public const int KEY_F17; [CCode (cheader_filename = "linux/input.h")] public const int KEY_F18; [CCode (cheader_filename = "linux/input.h")] public const int KEY_F19; [CCode (cheader_filename = "linux/input.h")] public const int KEY_F20; [CCode (cheader_filename = "linux/input.h")] public const int KEY_F21; [CCode (cheader_filename = "linux/input.h")] public const int KEY_F22; [CCode (cheader_filename = "linux/input.h")] public const int KEY_F23; [CCode (cheader_filename = "linux/input.h")] public const int KEY_F24; [CCode (cheader_filename = "linux/input.h")] public const int KEY_PLAYCD; [CCode (cheader_filename = "linux/input.h")] public const int KEY_PAUSECD; [CCode (cheader_filename = "linux/input.h")] public const int KEY_PROG3; [CCode (cheader_filename = "linux/input.h")] public const int KEY_PROG4; [CCode (cheader_filename = "linux/input.h")] public const int KEY_DASHBOARD; [CCode (cheader_filename = "linux/input.h")] public const int KEY_SUSPEND; [CCode (cheader_filename = "linux/input.h")] public const int KEY_CLOSE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_PLAY; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FASTFORWARD; [CCode (cheader_filename = "linux/input.h")] public const int KEY_BASSBOOST; [CCode (cheader_filename = "linux/input.h")] public const int KEY_PRINT; [CCode (cheader_filename = "linux/input.h")] public const int KEY_HP; [CCode (cheader_filename = "linux/input.h")] public const int KEY_CAMERA; [CCode (cheader_filename = "linux/input.h")] public const int KEY_SOUND; [CCode (cheader_filename = "linux/input.h")] public const int KEY_QUESTION; [CCode (cheader_filename = "linux/input.h")] public const int KEY_EMAIL; [CCode (cheader_filename = "linux/input.h")] public const int KEY_CHAT; [CCode (cheader_filename = "linux/input.h")] public const int KEY_SEARCH; [CCode (cheader_filename = "linux/input.h")] public const int KEY_CONNECT; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FINANCE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_SPORT; [CCode (cheader_filename = "linux/input.h")] public const int KEY_SHOP; [CCode (cheader_filename = "linux/input.h")] public const int KEY_ALTERASE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_CANCEL; [CCode (cheader_filename = "linux/input.h")] public const int KEY_BRIGHTNESSDOWN; [CCode (cheader_filename = "linux/input.h")] public const int KEY_BRIGHTNESSUP; [CCode (cheader_filename = "linux/input.h")] public const int KEY_MEDIA; [CCode (cheader_filename = "linux/input.h")] public const int KEY_SWITCHVIDEOMODE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KBDILLUMTOGGLE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KBDILLUMDOWN; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KBDILLUMUP; [CCode (cheader_filename = "linux/input.h")] public const int KEY_SEND; [CCode (cheader_filename = "linux/input.h")] public const int KEY_REPLY; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FORWARDMAIL; [CCode (cheader_filename = "linux/input.h")] public const int KEY_SAVE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_DOCUMENTS; [CCode (cheader_filename = "linux/input.h")] public const int KEY_BATTERY; [CCode (cheader_filename = "linux/input.h")] public const int KEY_BLUETOOTH; [CCode (cheader_filename = "linux/input.h")] public const int KEY_WLAN; [CCode (cheader_filename = "linux/input.h")] public const int KEY_UWB; [CCode (cheader_filename = "linux/input.h")] public const int KEY_UNKNOWN; [CCode (cheader_filename = "linux/input.h")] public const int KEY_VIDEO_NEXT; [CCode (cheader_filename = "linux/input.h")] public const int KEY_VIDEO_PREV; [CCode (cheader_filename = "linux/input.h")] public const int KEY_BRIGHTNESS_CYCLE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_BRIGHTNESS_AUTO; [CCode (cheader_filename = "linux/input.h")] public const int KEY_BRIGHTNESS_ZERO; [CCode (cheader_filename = "linux/input.h")] public const int KEY_DISPLAY_OFF; [CCode (cheader_filename = "linux/input.h")] public const int KEY_WWAN; [CCode (cheader_filename = "linux/input.h")] public const int KEY_WIMAX; [CCode (cheader_filename = "linux/input.h")] public const int KEY_RFKILL; [CCode (cheader_filename = "linux/input.h")] public const int KEY_MICMUTE; /* Code 255 is reserved for special needs of AT keyboard driver */ [CCode (cheader_filename = "linux/input.h")] public const int BTN_MISC; [CCode (cheader_filename = "linux/input.h")] public const int BTN_0; [CCode (cheader_filename = "linux/input.h")] public const int BTN_1; [CCode (cheader_filename = "linux/input.h")] public const int BTN_2; [CCode (cheader_filename = "linux/input.h")] public const int BTN_3; [CCode (cheader_filename = "linux/input.h")] public const int BTN_4; [CCode (cheader_filename = "linux/input.h")] public const int BTN_5; [CCode (cheader_filename = "linux/input.h")] public const int BTN_6; [CCode (cheader_filename = "linux/input.h")] public const int BTN_7; [CCode (cheader_filename = "linux/input.h")] public const int BTN_8; [CCode (cheader_filename = "linux/input.h")] public const int BTN_9; [CCode (cheader_filename = "linux/input.h")] public const int BTN_MOUSE; [CCode (cheader_filename = "linux/input.h")] public const int BTN_LEFT; [CCode (cheader_filename = "linux/input.h")] public const int BTN_RIGHT; [CCode (cheader_filename = "linux/input.h")] public const int BTN_MIDDLE; [CCode (cheader_filename = "linux/input.h")] public const int BTN_SIDE; [CCode (cheader_filename = "linux/input.h")] public const int BTN_EXTRA; [CCode (cheader_filename = "linux/input.h")] public const int BTN_FORWARD; [CCode (cheader_filename = "linux/input.h")] public const int BTN_BACK; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TASK; [CCode (cheader_filename = "linux/input.h")] public const int BTN_JOYSTICK; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER; [CCode (cheader_filename = "linux/input.h")] public const int BTN_THUMB; [CCode (cheader_filename = "linux/input.h")] public const int BTN_THUMB2; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TOP; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TOP2; [CCode (cheader_filename = "linux/input.h")] public const int BTN_PINKIE; [CCode (cheader_filename = "linux/input.h")] public const int BTN_BASE; [CCode (cheader_filename = "linux/input.h")] public const int BTN_BASE2; [CCode (cheader_filename = "linux/input.h")] public const int BTN_BASE3; [CCode (cheader_filename = "linux/input.h")] public const int BTN_BASE4; [CCode (cheader_filename = "linux/input.h")] public const int BTN_BASE5; [CCode (cheader_filename = "linux/input.h")] public const int BTN_BASE6; [CCode (cheader_filename = "linux/input.h")] public const int BTN_DEAD; [CCode (cheader_filename = "linux/input.h")] public const int BTN_GAMEPAD; [CCode (cheader_filename = "linux/input.h")] public const int BTN_A; [CCode (cheader_filename = "linux/input.h")] public const int BTN_B; [CCode (cheader_filename = "linux/input.h")] public const int BTN_C; [CCode (cheader_filename = "linux/input.h")] public const int BTN_X; [CCode (cheader_filename = "linux/input.h")] public const int BTN_Y; [CCode (cheader_filename = "linux/input.h")] public const int BTN_Z; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TL; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TR; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TL2; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TR2; [CCode (cheader_filename = "linux/input.h")] public const int BTN_SELECT; [CCode (cheader_filename = "linux/input.h")] public const int BTN_START; [CCode (cheader_filename = "linux/input.h")] public const int BTN_MODE; [CCode (cheader_filename = "linux/input.h")] public const int BTN_THUMBL; [CCode (cheader_filename = "linux/input.h")] public const int BTN_THUMBR; [CCode (cheader_filename = "linux/input.h")] public const int BTN_DIGI; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TOOL_PEN; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TOOL_RUBBER; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TOOL_BRUSH; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TOOL_PENCIL; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TOOL_AIRBRUSH; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TOOL_FINGER; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TOOL_MOUSE; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TOOL_LENS; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TOOL_QUINTTAP; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TOUCH; [CCode (cheader_filename = "linux/input.h")] public const int BTN_STYLUS; [CCode (cheader_filename = "linux/input.h")] public const int BTN_STYLUS2; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TOOL_DOUBLETAP; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TOOL_TRIPLETAP; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TOOL_QUADTAP; [CCode (cheader_filename = "linux/input.h")] public const int BTN_WHEEL; [CCode (cheader_filename = "linux/input.h")] public const int BTN_GEAR_DOWN; [CCode (cheader_filename = "linux/input.h")] public const int BTN_GEAR_UP; [CCode (cheader_filename = "linux/input.h")] public const int KEY_OK; [CCode (cheader_filename = "linux/input.h")] public const int KEY_SELECT; [CCode (cheader_filename = "linux/input.h")] public const int KEY_GOTO; [CCode (cheader_filename = "linux/input.h")] public const int KEY_CLEAR; [CCode (cheader_filename = "linux/input.h")] public const int KEY_POWER2; [CCode (cheader_filename = "linux/input.h")] public const int KEY_OPTION; [CCode (cheader_filename = "linux/input.h")] public const int KEY_INFO; [CCode (cheader_filename = "linux/input.h")] public const int KEY_TIME; [CCode (cheader_filename = "linux/input.h")] public const int KEY_VENDOR; [CCode (cheader_filename = "linux/input.h")] public const int KEY_ARCHIVE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_PROGRAM; [CCode (cheader_filename = "linux/input.h")] public const int KEY_CHANNEL; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FAVORITES; [CCode (cheader_filename = "linux/input.h")] public const int KEY_EPG; [CCode (cheader_filename = "linux/input.h")] public const int KEY_PVR; [CCode (cheader_filename = "linux/input.h")] public const int KEY_MHP; [CCode (cheader_filename = "linux/input.h")] public const int KEY_LANGUAGE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_TITLE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_SUBTITLE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_ANGLE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_ZOOM; [CCode (cheader_filename = "linux/input.h")] public const int KEY_MODE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KEYBOARD; [CCode (cheader_filename = "linux/input.h")] public const int KEY_SCREEN; [CCode (cheader_filename = "linux/input.h")] public const int KEY_PC; [CCode (cheader_filename = "linux/input.h")] public const int KEY_TV; [CCode (cheader_filename = "linux/input.h")] public const int KEY_TV2; [CCode (cheader_filename = "linux/input.h")] public const int KEY_VCR; [CCode (cheader_filename = "linux/input.h")] public const int KEY_VCR2; [CCode (cheader_filename = "linux/input.h")] public const int KEY_SAT; [CCode (cheader_filename = "linux/input.h")] public const int KEY_SAT2; [CCode (cheader_filename = "linux/input.h")] public const int KEY_CD; [CCode (cheader_filename = "linux/input.h")] public const int KEY_TAPE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_RADIO; [CCode (cheader_filename = "linux/input.h")] public const int KEY_TUNER; [CCode (cheader_filename = "linux/input.h")] public const int KEY_PLAYER; [CCode (cheader_filename = "linux/input.h")] public const int KEY_TEXT; [CCode (cheader_filename = "linux/input.h")] public const int KEY_DVD; [CCode (cheader_filename = "linux/input.h")] public const int KEY_AUX; [CCode (cheader_filename = "linux/input.h")] public const int KEY_MP3; [CCode (cheader_filename = "linux/input.h")] public const int KEY_AUDIO; [CCode (cheader_filename = "linux/input.h")] public const int KEY_VIDEO; [CCode (cheader_filename = "linux/input.h")] public const int KEY_DIRECTORY; [CCode (cheader_filename = "linux/input.h")] public const int KEY_LIST; [CCode (cheader_filename = "linux/input.h")] public const int KEY_MEMO; [CCode (cheader_filename = "linux/input.h")] public const int KEY_CALENDAR; [CCode (cheader_filename = "linux/input.h")] public const int KEY_RED; [CCode (cheader_filename = "linux/input.h")] public const int KEY_GREEN; [CCode (cheader_filename = "linux/input.h")] public const int KEY_YELLOW; [CCode (cheader_filename = "linux/input.h")] public const int KEY_BLUE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_CHANNELUP; [CCode (cheader_filename = "linux/input.h")] public const int KEY_CHANNELDOWN; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FIRST; [CCode (cheader_filename = "linux/input.h")] public const int KEY_LAST; [CCode (cheader_filename = "linux/input.h")] public const int KEY_AB; [CCode (cheader_filename = "linux/input.h")] public const int KEY_NEXT; [CCode (cheader_filename = "linux/input.h")] public const int KEY_RESTART; [CCode (cheader_filename = "linux/input.h")] public const int KEY_SLOW; [CCode (cheader_filename = "linux/input.h")] public const int KEY_SHUFFLE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_BREAK; [CCode (cheader_filename = "linux/input.h")] public const int KEY_PREVIOUS; [CCode (cheader_filename = "linux/input.h")] public const int KEY_DIGITS; [CCode (cheader_filename = "linux/input.h")] public const int KEY_TEEN; [CCode (cheader_filename = "linux/input.h")] public const int KEY_TWEN; [CCode (cheader_filename = "linux/input.h")] public const int KEY_VIDEOPHONE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_GAMES; [CCode (cheader_filename = "linux/input.h")] public const int KEY_ZOOMIN; [CCode (cheader_filename = "linux/input.h")] public const int KEY_ZOOMOUT; [CCode (cheader_filename = "linux/input.h")] public const int KEY_ZOOMRESET; [CCode (cheader_filename = "linux/input.h")] public const int KEY_WORDPROCESSOR; [CCode (cheader_filename = "linux/input.h")] public const int KEY_EDITOR; [CCode (cheader_filename = "linux/input.h")] public const int KEY_SPREADSHEET; [CCode (cheader_filename = "linux/input.h")] public const int KEY_GRAPHICSEDITOR; [CCode (cheader_filename = "linux/input.h")] public const int KEY_PRESENTATION; [CCode (cheader_filename = "linux/input.h")] public const int KEY_DATABASE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_NEWS; [CCode (cheader_filename = "linux/input.h")] public const int KEY_VOICEMAIL; [CCode (cheader_filename = "linux/input.h")] public const int KEY_ADDRESSBOOK; [CCode (cheader_filename = "linux/input.h")] public const int KEY_MESSENGER; [CCode (cheader_filename = "linux/input.h")] public const int KEY_DISPLAYTOGGLE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_BRIGHTNESS_TOGGLE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_SPELLCHECK; [CCode (cheader_filename = "linux/input.h")] public const int KEY_LOGOFF; [CCode (cheader_filename = "linux/input.h")] public const int KEY_DOLLAR; [CCode (cheader_filename = "linux/input.h")] public const int KEY_EURO; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FRAMEBACK; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FRAMEFORWARD; [CCode (cheader_filename = "linux/input.h")] public const int KEY_CONTEXT_MENU; [CCode (cheader_filename = "linux/input.h")] public const int KEY_MEDIA_REPEAT; [CCode (cheader_filename = "linux/input.h")] public const int KEY_10CHANNELSUP; [CCode (cheader_filename = "linux/input.h")] public const int KEY_10CHANNELSDOWN; [CCode (cheader_filename = "linux/input.h")] public const int KEY_IMAGES; [CCode (cheader_filename = "linux/input.h")] public const int KEY_DEL_EOL; [CCode (cheader_filename = "linux/input.h")] public const int KEY_DEL_EOS; [CCode (cheader_filename = "linux/input.h")] public const int KEY_INS_LINE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_DEL_LINE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FN; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FN_ESC; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FN_F1; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FN_F2; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FN_F3; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FN_F4; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FN_F5; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FN_F6; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FN_F7; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FN_F8; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FN_F9; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FN_F10; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FN_F11; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FN_F12; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FN_1; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FN_2; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FN_D; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FN_E; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FN_F; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FN_S; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FN_B; [CCode (cheader_filename = "linux/input.h")] public const int KEY_BRL_DOT1; [CCode (cheader_filename = "linux/input.h")] public const int KEY_BRL_DOT2; [CCode (cheader_filename = "linux/input.h")] public const int KEY_BRL_DOT3; [CCode (cheader_filename = "linux/input.h")] public const int KEY_BRL_DOT4; [CCode (cheader_filename = "linux/input.h")] public const int KEY_BRL_DOT5; [CCode (cheader_filename = "linux/input.h")] public const int KEY_BRL_DOT6; [CCode (cheader_filename = "linux/input.h")] public const int KEY_BRL_DOT7; [CCode (cheader_filename = "linux/input.h")] public const int KEY_BRL_DOT8; [CCode (cheader_filename = "linux/input.h")] public const int KEY_BRL_DOT9; [CCode (cheader_filename = "linux/input.h")] public const int KEY_BRL_DOT10; [CCode (cheader_filename = "linux/input.h")] public const int KEY_NUMERIC_0; [CCode (cheader_filename = "linux/input.h")] public const int KEY_NUMERIC_1; [CCode (cheader_filename = "linux/input.h")] public const int KEY_NUMERIC_2; [CCode (cheader_filename = "linux/input.h")] public const int KEY_NUMERIC_3; [CCode (cheader_filename = "linux/input.h")] public const int KEY_NUMERIC_4; [CCode (cheader_filename = "linux/input.h")] public const int KEY_NUMERIC_5; [CCode (cheader_filename = "linux/input.h")] public const int KEY_NUMERIC_6; [CCode (cheader_filename = "linux/input.h")] public const int KEY_NUMERIC_7; [CCode (cheader_filename = "linux/input.h")] public const int KEY_NUMERIC_8; [CCode (cheader_filename = "linux/input.h")] public const int KEY_NUMERIC_9; [CCode (cheader_filename = "linux/input.h")] public const int KEY_NUMERIC_STAR; [CCode (cheader_filename = "linux/input.h")] public const int KEY_NUMERIC_POUND; [CCode (cheader_filename = "linux/input.h")] public const int KEY_NUMERIC_A; [CCode (cheader_filename = "linux/input.h")] public const int KEY_NUMERIC_B; [CCode (cheader_filename = "linux/input.h")] public const int KEY_NUMERIC_C; [CCode (cheader_filename = "linux/input.h")] public const int KEY_NUMERIC_D; [CCode (cheader_filename = "linux/input.h")] public const int KEY_CAMERA_FOCUS; [CCode (cheader_filename = "linux/input.h")] public const int KEY_WPS_BUTTON; [CCode (cheader_filename = "linux/input.h")] public const int KEY_TOUCHPAD_TOGGLE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_TOUCHPAD_ON; [CCode (cheader_filename = "linux/input.h")] public const int KEY_TOUCHPAD_OFF; [CCode (cheader_filename = "linux/input.h")] public const int KEY_CAMERA_ZOOMIN; [CCode (cheader_filename = "linux/input.h")] public const int KEY_CAMERA_ZOOMOUT; [CCode (cheader_filename = "linux/input.h")] public const int KEY_CAMERA_UP; [CCode (cheader_filename = "linux/input.h")] public const int KEY_CAMERA_DOWN; [CCode (cheader_filename = "linux/input.h")] public const int KEY_CAMERA_LEFT; [CCode (cheader_filename = "linux/input.h")] public const int KEY_CAMERA_RIGHT; [CCode (cheader_filename = "linux/input.h")] public const int KEY_ATTENDANT_ON; [CCode (cheader_filename = "linux/input.h")] public const int KEY_ATTENDANT_OFF; [CCode (cheader_filename = "linux/input.h")] public const int KEY_ATTENDANT_TOGGLE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_LIGHTS_TOGGLE; [CCode (cheader_filename = "linux/input.h")] public const int BTN_DPAD_UP; [CCode (cheader_filename = "linux/input.h")] public const int BTN_DPAD_DOWN; [CCode (cheader_filename = "linux/input.h")] public const int BTN_DPAD_LEFT; [CCode (cheader_filename = "linux/input.h")] public const int BTN_DPAD_RIGHT; [CCode (cheader_filename = "linux/input.h")] public const int KEY_ALS_TOGGLE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_BUTTONCONFIG; [CCode (cheader_filename = "linux/input.h")] public const int KEY_TASKMANAGER; [CCode (cheader_filename = "linux/input.h")] public const int KEY_JOURNAL; [CCode (cheader_filename = "linux/input.h")] public const int KEY_CONTROLPANEL; [CCode (cheader_filename = "linux/input.h")] public const int KEY_APPSELECT; [CCode (cheader_filename = "linux/input.h")] public const int KEY_SCREENSAVER; [CCode (cheader_filename = "linux/input.h")] public const int KEY_VOICECOMMAND; [CCode (cheader_filename = "linux/input.h")] public const int KEY_BRIGHTNESS_MIN; [CCode (cheader_filename = "linux/input.h")] public const int KEY_BRIGHTNESS_MAX; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KBDINPUTASSIST_PREV; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KBDINPUTASSIST_NEXT; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KBDINPUTASSIST_PREVGROUP; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KBDINPUTASSIST_NEXTGROUP; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KBDINPUTASSIST_ACCEPT; [CCode (cheader_filename = "linux/input.h")] public const int KEY_KBDINPUTASSIST_CANCEL; [CCode (cheader_filename = "linux/input.h")] public const int KEY_RIGHT_UP; [CCode (cheader_filename = "linux/input.h")] public const int KEY_RIGHT_DOWN; [CCode (cheader_filename = "linux/input.h")] public const int KEY_LEFT_UP; [CCode (cheader_filename = "linux/input.h")] public const int KEY_LEFT_DOWN; [CCode (cheader_filename = "linux/input.h")] public const int KEY_ROOT_MENU; [CCode (cheader_filename = "linux/input.h")] public const int KEY_MEDIA_TOP_MENU; [CCode (cheader_filename = "linux/input.h")] public const int KEY_NUMERIC_11; [CCode (cheader_filename = "linux/input.h")] public const int KEY_NUMERIC_12; [CCode (cheader_filename = "linux/input.h")] public const int KEY_AUDIO_DESC; [CCode (cheader_filename = "linux/input.h")] public const int KEY_3D_MODE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_NEXT_FAVORITE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_STOP_RECORD; [CCode (cheader_filename = "linux/input.h")] public const int KEY_PAUSE_RECORD; [CCode (cheader_filename = "linux/input.h")] public const int KEY_VOD; [CCode (cheader_filename = "linux/input.h")] public const int KEY_UNMUTE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_FASTREVERSE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_SLOWREVERSE; [CCode (cheader_filename = "linux/input.h")] public const int KEY_DATA; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY1; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY2; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY3; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY4; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY5; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY6; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY7; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY8; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY9; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY10; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY11; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY12; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY13; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY14; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY15; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY16; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY17; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY18; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY19; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY20; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY21; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY22; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY23; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY24; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY25; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY26; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY27; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY28; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY29; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY30; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY31; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY32; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY33; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY34; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY35; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY36; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY37; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY38; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY39; [CCode (cheader_filename = "linux/input.h")] public const int BTN_TRIGGER_HAPPY40; [CCode (cheader_filename = "linux/input.h")] public const int KEY_MIN_INTERESTING; [CCode (cheader_filename = "linux/input.h")] public const int KEY_MAX; /* * Relative axes */ [CCode (cheader_filename = "linux/input.h")] public const int REL_X; [CCode (cheader_filename = "linux/input.h")] public const int REL_Y; [CCode (cheader_filename = "linux/input.h")] public const int REL_Z; [CCode (cheader_filename = "linux/input.h")] public const int REL_RX; [CCode (cheader_filename = "linux/input.h")] public const int REL_RY; [CCode (cheader_filename = "linux/input.h")] public const int REL_RZ; [CCode (cheader_filename = "linux/input.h")] public const int REL_HWHEEL; [CCode (cheader_filename = "linux/input.h")] public const int REL_DIAL; [CCode (cheader_filename = "linux/input.h")] public const int REL_WHEEL; [CCode (cheader_filename = "linux/input.h")] public const int REL_MISC; [CCode (cheader_filename = "linux/input.h")] public const int REL_MAX; /* * Absolute axes */ [CCode (cheader_filename = "linux/input.h")] public const int ABS_X; [CCode (cheader_filename = "linux/input.h")] public const int ABS_Y; [CCode (cheader_filename = "linux/input.h")] public const int ABS_Z; [CCode (cheader_filename = "linux/input.h")] public const int ABS_RX; [CCode (cheader_filename = "linux/input.h")] public const int ABS_RY; [CCode (cheader_filename = "linux/input.h")] public const int ABS_RZ; [CCode (cheader_filename = "linux/input.h")] public const int ABS_THROTTLE; [CCode (cheader_filename = "linux/input.h")] public const int ABS_RUDDER; [CCode (cheader_filename = "linux/input.h")] public const int ABS_WHEEL; [CCode (cheader_filename = "linux/input.h")] public const int ABS_GAS; [CCode (cheader_filename = "linux/input.h")] public const int ABS_BRAKE; [CCode (cheader_filename = "linux/input.h")] public const int ABS_HAT0X; [CCode (cheader_filename = "linux/input.h")] public const int ABS_HAT0Y; [CCode (cheader_filename = "linux/input.h")] public const int ABS_HAT1X; [CCode (cheader_filename = "linux/input.h")] public const int ABS_HAT1Y; [CCode (cheader_filename = "linux/input.h")] public const int ABS_HAT2X; [CCode (cheader_filename = "linux/input.h")] public const int ABS_HAT2Y; [CCode (cheader_filename = "linux/input.h")] public const int ABS_HAT3X; [CCode (cheader_filename = "linux/input.h")] public const int ABS_HAT3Y; [CCode (cheader_filename = "linux/input.h")] public const int ABS_PRESSURE; [CCode (cheader_filename = "linux/input.h")] public const int ABS_DISTANCE; [CCode (cheader_filename = "linux/input.h")] public const int ABS_TILT_X; [CCode (cheader_filename = "linux/input.h")] public const int ABS_TILT_Y; [CCode (cheader_filename = "linux/input.h")] public const int ABS_TOOL_WIDTH; [CCode (cheader_filename = "linux/input.h")] public const int ABS_VOLUME; [CCode (cheader_filename = "linux/input.h")] public const int ABS_MISC; [CCode (cheader_filename = "linux/input.h")] public const int ABS_MT_SLOT; [CCode (cheader_filename = "linux/input.h")] public const int ABS_MT_TOUCH_MAJOR; [CCode (cheader_filename = "linux/input.h")] public const int ABS_MT_TOUCH_MINOR; [CCode (cheader_filename = "linux/input.h")] public const int ABS_MT_WIDTH_MAJOR; [CCode (cheader_filename = "linux/input.h")] public const int ABS_MT_WIDTH_MINOR; [CCode (cheader_filename = "linux/input.h")] public const int ABS_MT_ORIENTATION; [CCode (cheader_filename = "linux/input.h")] public const int ABS_MT_POSITION_X; [CCode (cheader_filename = "linux/input.h")] public const int ABS_MT_POSITION_Y; [CCode (cheader_filename = "linux/input.h")] public const int ABS_MT_TOOL_TYPE; [CCode (cheader_filename = "linux/input.h")] public const int ABS_MT_BLOB_ID; [CCode (cheader_filename = "linux/input.h")] public const int ABS_MT_TRACKING_ID; [CCode (cheader_filename = "linux/input.h")] public const int ABS_MT_PRESSURE; [CCode (cheader_filename = "linux/input.h")] public const int ABS_MT_DISTANCE; [CCode (cheader_filename = "linux/input.h")] public const int ABS_MT_TOOL_X; [CCode (cheader_filename = "linux/input.h")] public const int ABS_MT_TOOL_Y; [CCode (cheader_filename = "linux/input.h")] public const int ABS_MAX; /* * Switch events */ [CCode (cheader_filename = "linux/input.h")] public const int SW_LID; [CCode (cheader_filename = "linux/input.h")] public const int SW_TABLET_MODE; [CCode (cheader_filename = "linux/input.h")] public const int SW_HEADPHONE_INSERT; [CCode (cheader_filename = "linux/input.h")] public const int SW_RFKILL_ALL; [CCode (cheader_filename = "linux/input.h")] public const int SW_RADIO; [CCode (cheader_filename = "linux/input.h")] public const int SW_MICROPHONE_INSERT; [CCode (cheader_filename = "linux/input.h")] public const int SW_DOCK; [CCode (cheader_filename = "linux/input.h")] public const int SW_LINEOUT_INSERT; [CCode (cheader_filename = "linux/input.h")] public const int SW_JACK_PHYSICAL_INSERT; [CCode (cheader_filename = "linux/input.h")] public const int SW_VIDEOOUT_INSERT; [CCode (cheader_filename = "linux/input.h")] public const int SW_CAMERA_LENS_COVER; [CCode (cheader_filename = "linux/input.h")] public const int SW_KEYPAD_SLIDE; [CCode (cheader_filename = "linux/input.h")] public const int SW_FRONT_PROXIMITY; [CCode (cheader_filename = "linux/input.h")] public const int SW_ROTATE_LOCK; [CCode (cheader_filename = "linux/input.h")] public const int SW_LINEIN_INSERT; [CCode (cheader_filename = "linux/input.h")] public const int SW_MUTE_DEVICE; [CCode (cheader_filename = "linux/input.h")] public const int SW_PEN_INSERTED; [CCode (cheader_filename = "linux/input.h")] public const int SW_MAX; /* * Misc events */ [CCode (cheader_filename = "linux/input.h")] public const int MSC_SERIAL; [CCode (cheader_filename = "linux/input.h")] public const int MSC_PULSELED; [CCode (cheader_filename = "linux/input.h")] public const int MSC_GESTURE; [CCode (cheader_filename = "linux/input.h")] public const int MSC_RAW; [CCode (cheader_filename = "linux/input.h")] public const int MSC_SCAN; [CCode (cheader_filename = "linux/input.h")] public const int MSC_TIMESTAMP; [CCode (cheader_filename = "linux/input.h")] public const int MSC_MAX; /* * LEDs */ [CCode (cheader_filename = "linux/input.h")] public const int LED_NUML; [CCode (cheader_filename = "linux/input.h")] public const int LED_CAPSL; [CCode (cheader_filename = "linux/input.h")] public const int LED_SCROLLL; [CCode (cheader_filename = "linux/input.h")] public const int LED_COMPOSE; [CCode (cheader_filename = "linux/input.h")] public const int LED_KANA; [CCode (cheader_filename = "linux/input.h")] public const int LED_SLEEP; [CCode (cheader_filename = "linux/input.h")] public const int LED_SUSPEND; [CCode (cheader_filename = "linux/input.h")] public const int LED_MUTE; [CCode (cheader_filename = "linux/input.h")] public const int LED_MISC; [CCode (cheader_filename = "linux/input.h")] public const int LED_MAIL; [CCode (cheader_filename = "linux/input.h")] public const int LED_CHARGING; [CCode (cheader_filename = "linux/input.h")] public const int LED_MAX; /* * Autorepeat values */ [CCode (cheader_filename = "linux/input.h")] public const int REP_DELAY; [CCode (cheader_filename = "linux/input.h")] public const int REP_PERIOD; [CCode (cheader_filename = "linux/input.h")] public const int REP_MAX; /* * Sounds */ [CCode (cheader_filename = "linux/input.h")] public const int SND_CLICK; [CCode (cheader_filename = "linux/input.h")] public const int SND_BELL; [CCode (cheader_filename = "linux/input.h")] public const int SND_TONE; [CCode (cheader_filename = "linux/input.h")] public const int SND_MAX; /* * IDs. */ [CCode (cheader_filename = "linux/input.h")] public const int ID_BUS; [CCode (cheader_filename = "linux/input.h")] public const int ID_VENDOR; [CCode (cheader_filename = "linux/input.h")] public const int ID_PRODUCT; [CCode (cheader_filename = "linux/input.h")] public const int ID_VERSION; [CCode (cheader_filename = "linux/input.h")] public const int BUS_PCI; [CCode (cheader_filename = "linux/input.h")] public const int BUS_ISAPNP; [CCode (cheader_filename = "linux/input.h")] public const int BUS_USB; [CCode (cheader_filename = "linux/input.h")] public const int BUS_HIL; [CCode (cheader_filename = "linux/input.h")] public const int BUS_BLUETOOTH; [CCode (cheader_filename = "linux/input.h")] public const int BUS_VIRTUAL; [CCode (cheader_filename = "linux/input.h")] public const int BUS_ISA; [CCode (cheader_filename = "linux/input.h")] public const int BUS_I8042; [CCode (cheader_filename = "linux/input.h")] public const int BUS_XTKBD; [CCode (cheader_filename = "linux/input.h")] public const int BUS_RS232; [CCode (cheader_filename = "linux/input.h")] public const int BUS_GAMEPORT; [CCode (cheader_filename = "linux/input.h")] public const int BUS_PARPORT; [CCode (cheader_filename = "linux/input.h")] public const int BUS_AMIGA; [CCode (cheader_filename = "linux/input.h")] public const int BUS_ADB; [CCode (cheader_filename = "linux/input.h")] public const int BUS_I2C; [CCode (cheader_filename = "linux/input.h")] public const int BUS_HOST; [CCode (cheader_filename = "linux/input.h")] public const int BUS_GSC; [CCode (cheader_filename = "linux/input.h")] public const int BUS_ATARI; /* MT_TOOL types */ [CCode (cheader_filename = "linux/input.h")] public const int MT_TOOL_FINGER; [CCode (cheader_filename = "linux/input.h")] public const int MT_TOOL_PEN; [CCode (cheader_filename = "linux/input.h")] public const int MT_TOOL_PALM; [CCode (cheader_filename = "linux/input.h")] public const int MT_TOOL_MAX; /* Values describing the status of a force-feedback effect */ [CCode (cheader_filename = "linux/input.h")] public const int FF_STATUS_STOPPED; [CCode (cheader_filename = "linux/input.h")] public const int FF_STATUS_PLAYING; [CCode (cheader_filename = "linux/input.h")] public const int FF_STATUS_MAX; } /* * Netlink subsystem */ [CCode (cprefix = "", lower_case_cprefix = "", cheader_filename = "linux/netlink.h")] namespace Netlink { [CCode (cheader_filename = "linux/netlink.h")] public const int NETLINK_ROUTE; [CCode (cheader_filename = "linux/netlink.h")] public const int NETLINK_UNUSED; [CCode (cheader_filename = "linux/netlink.h")] public const int NETLINK_USERSOCK; [CCode (cheader_filename = "linux/netlink.h")] public const int NETLINK_FIREWALL; [CCode (cheader_filename = "linux/netlink.h")] public const int NETLINK_INET_DIAG; [CCode (cheader_filename = "linux/netlink.h")] public const int NETLINK_NFLOG; [CCode (cheader_filename = "linux/netlink.h")] public const int NETLINK_XFRM; [CCode (cheader_filename = "linux/netlink.h")] public const int NETLINK_SELINUX; [CCode (cheader_filename = "linux/netlink.h")] public const int NETLINK_ISCSI; [CCode (cheader_filename = "linux/netlink.h")] public const int NETLINK_AUDIT; [CCode (cheader_filename = "linux/netlink.h")] public const int NETLINK_FIB_LOOKUP; [CCode (cheader_filename = "linux/netlink.h")] public const int NETLINK_CONNECTOR; [CCode (cheader_filename = "linux/netlink.h")] public const int NETLINK_NETFILTER; [CCode (cheader_filename = "linux/netlink.h")] public const int NETLINK_IP6_FW; [CCode (cheader_filename = "linux/netlink.h")] public const int NETLINK_DNRTMSG; [CCode (cheader_filename = "linux/netlink.h")] public const int NETLINK_KOBJECT_UEVENT; [CCode (cheader_filename = "linux/netlink.h")] public const int NETLINK_GENERIC; [CCode (cheader_filename = "linux/netlink.h")] public const int NETLINK_SCSITRANSPORT; [CCode (cheader_filename = "linux/netlink.h")] public const int NETLINK_ECRYPTFS; [CCode (cheader_filename = "linux/netlink.h")] public const int NETLINK_ADD_MEMBERSHIP; [CCode (cheader_filename = "linux/netlink.h")] public const int NETLINK_DROP_MEMBERSHIP; [CCode (cheader_filename = "linux/netlink.h")] public const int NETLINK_PKTINFO; [CCode (cheader_filename = "linux/netlink.h")] public const int NETLINK_BROADCAST_ERROR; [CCode (cheader_filename = "linux/netlink.h")] public const int NETLINK_NO_ENOBUFS; [CCode (cheader_filename = "linux/netlink.h")] public const int NLM_F_REQUEST; [CCode (cheader_filename = "linux/netlink.h")] public const int NLM_F_MULTI; [CCode (cheader_filename = "linux/netlink.h")] public const int NLM_F_ACK; [CCode (cheader_filename = "linux/netlink.h")] public const int NLM_F_ECHO; [CCode (cheader_filename = "linux/netlink.h")] public const int NLM_F_ROOT; [CCode (cheader_filename = "linux/netlink.h")] public const int NLM_F_MATCH; [CCode (cheader_filename = "linux/netlink.h")] public const int NLM_F_ATOMIC; [CCode (cheader_filename = "linux/netlink.h")] public const int NLM_F_DUMP; [CCode (cheader_filename = "linux/netlink.h")] public const int NLM_F_REPLACE; [CCode (cheader_filename = "linux/netlink.h")] public const int NLM_F_EXCL; [CCode (cheader_filename = "linux/netlink.h")] public const int NLM_F_CREATE; [CCode (cheader_filename = "linux/netlink.h")] public const int NLM_F_APPEND; [CCode (cheader_filename = "linux/netlink.h")] public const int NLMSG_ALIGNTO; [CCode (cheader_filename = "linux/netlink.h")] public const int NLMSG_NOOP; [CCode (cheader_filename = "linux/netlink.h")] public const int NLMSG_ERROR; [CCode (cheader_filename = "linux/netlink.h")] public const int NLMSG_DONE; [CCode (cheader_filename = "linux/netlink.h")] public const int NLMSG_OVERRUN; [CCode (cheader_filename = "linux/netlink.h")] public const int NLMSG_MIN_TYPE; /* netlink action macros, we bind them as functions for convenience */ [CCode (cheader_filename = "linux/netlink.h")] public void NLMSG_ALIGN (int len); [CCode (cheader_filename = "linux/netlink.h")] public int NLMSG_HDRLEN (); [CCode (cheader_filename = "linux/netlink.h")] public int NLMSG_LENGTH (int len); [CCode (cheader_filename = "linux/netlink.h")] public void NLMSG_SPACE (int len); [CCode (cheader_filename = "linux/netlink.h")] public void* NLMSG_DATA (NlMsgHdr nlh); [CCode (cheader_filename = "linux/netlink.h")] public unowned NlMsgHdr NLMSG_NEXT (NlMsgHdr nlh, int len); [CCode (cheader_filename = "linux/netlink.h")] public bool NLMSG_OK (NlMsgHdr nlh, int len); [CCode (cheader_filename = "linux/netlink.h")] public int NLMSG_PAYLOAD (NlMsgHdr nlh, int len); // netlink socket, can be used instead of sockaddr [CCode (cname = "struct sockaddr_nl", has_type_id = false, cheader_filename = "linux/netlink.h", destroy_function = "")] public struct SockAddrNl { public int nl_family; public ushort nl_pad; public uint32 nl_pid; public uint32 nl_groups; } // netlink message header [CCode (cname = "struct nlmsghdr", has_type_id = false, cheader_filename = "linux/netlink.h", destroy_function = "")] public struct NlMsgHdr { public uint32 nlmsg_len; public uint16 nlmsg_type; public uint16 nlmsg_flags; public uint32 nlmsg_seq; public uint32 nlmsg_pid; } // netlink error message [CCode (cname = "struct nlmsgerr", has_type_id = false, cheader_filename = "linux/netlink.h", destroy_function = "")] public struct NlMsgErr { public int error; public NlMsgHdr msg; } // rtnetlink multicast groups ( userland compatibility values ) [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTMGRP_LINK; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTMGRP_NOTIFY; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTMGRP_NEIGH; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTMGRP_TC; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTMGRP_IPV4_IFADDR; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTMGRP_IPV4_MROUTE; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTMGRP_IPV4_ROUTE; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTMGRP_IPV4_RULE; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTMGRP_IPV6_IFADDR; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTMGRP_IPV6_MROUTE; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTMGRP_IPV6_ROUTE; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTMGRP_IPV6_IFINFO; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTMGRP_DECnet_IFADDR; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTMGRP_DECnet_ROUTE; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTMGRP_IPV6_PREFIX; // rtnetlink multicast groups ( 1 << group ) [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTNLGRP_NONE; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTNLGRP_LINK; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTNLGRP_NOTIFY; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTNLGRP_NEIGH; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTNLGRP_TC; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTNLGRP_IPV4_IFADDR; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTNLGRP_IPV4_MROUTE; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTNLGRP_IPV4_ROUTE; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTNLGRP_IPV4_RULE; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTNLGRP_IPV6_IFADDR; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTNLGRP_IPV6_MROUTE; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTNLGRP_IPV6_ROUTE; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTNLGRP_IPV6_IFINFO; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTNLGRP_DECnet_IFADDR; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTNLGRP_NOP2; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTNLGRP_DECnet_ROUTE; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTNLGRP_DECnet_RULE; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTNLGRP_NOP4; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTNLGRP_IPV6_PREFIX; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTNLGRP_IPV6_RULE; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTNLGRP_ND_USEROPT; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTNLGRP_PHONET_IFADDR; [CCode (cheader_filename = "linux/rtnetlink.h")] public const int RTNLGRP_PHONET_ROUTE; /* rtnetlink action macros, we bind them as functions for convenience */ [CCode (cheader_filename = "linux/rtnetlink.h")] public void RTA_ALIGN (int len); [CCode (cheader_filename = "linux/rtnetlink.h")] public int RTA_HDRLEN (); [CCode (cheader_filename = "linux/rtnetlink.h")] public int RTA_LENGTH (int len); [CCode (cheader_filename = "linux/rtnetlink.h")] public void RTA_SPACE (int len); [CCode (cheader_filename = "linux/rtnetlink.h")] public void* RTA_DATA (RtAttr* rta); [CCode (cheader_filename = "linux/rtnetlink.h")] public RtAttr* RTA_NEXT (RtAttr* rta, int len); [CCode (cheader_filename = "linux/rtnetlink.h")] public bool RTA_OK (RtAttr* rta, int len); [CCode (cheader_filename = "linux/rtnetlink.h")] public void* RTA_PAYLOAD (RtAttr* rta, int len); /* [CCode (cheader_filename = "sys/socket.h", sentinel = "")] public int bind (int sockfd, SockAddrNl addr, ulong length); */ // rtnetlink info message [CCode (cname = "struct ifinfomsg", has_type_id = false, cheader_filename = "linux/rtnetlink.h", destroy_function = "")] public struct IfInfoMsg { public uchar ifi_family; public uchar __ifi_pad; public ushort ifi_type; public int ifi_index; public uint32 ifi_flags; public uint32 ifi_change; } // rtnetlink attribute [CCode (cname = "struct rtattr", has_type_id = false, cheader_filename = "linux/rtnetlink.h", destroy_function = "")] public struct RtAttr { public ushort rta_len; public ushort rta_type; } // rtnetlink routing / discovery messages [CCode (cprefix = "RTM_", has_type_id = false, cheader_filename = "linux/rtnetlink.h")] public enum RtMessageType { NEWLINK, DELLINK, GETLINK, SETLINK, NEWADDR, DELADDR, GETADDR, NEWROUTE, DELROUTE, GETROUTE, NEWNEIGH, DELNEIGH, GETNEIGH, NEWRULE, DELRULE, GETRULE, NEWQDISC, DELQDISC, GETQDISC, NEWTCLASS, DELTCLASS, GETTCLASS, NEWTFILTER, DELTFILTER, GETTFILTER, NEWACTION, DELACTION, GETACTION, NEWPREFIX, GETMULTICAST, GETANYCAST, NEWNEIGHTBL, GETNEIGHTBL, SETNEIGHTBL, } } /* * Real time clock subsystem */ [CCode (cprefix = "", lower_case_cprefix = "")] namespace Rtc { [CCode (cname = "struct rtc_time", cheader_filename = "linux/rtc.h", has_type_id = false)] public struct Time { public int tm_sec; public int tm_min; public int tm_hour; public int tm_mday; public int tm_mon; public int tm_year; public int tm_wday; public int tm_yday; public int tm_isdst; } [CCode (cname = "struct rtc_wkalrm", has_type_id = false, cheader_filename = "linux/rtc.h")] public struct WakeAlarm { public char enabled; public char pending; public Linux.Rtc.Time time; } [CCode (cheader_filename = "linux/rtc.h,sys/ioctl.h")] public const int RTC_RD_TIME; [CCode (cheader_filename = "linux/rtc.h,sys/ioctl.h")] public const int RTC_SET_TIME; [CCode (cheader_filename = "linux/rtc.h,sys/ioctl.h")] public const int RTC_WKALM_RD; [CCode (cheader_filename = "linux/rtc.h,sys/ioctl.h")] public const int RTC_WKALM_SET; } /* * Socket extensions (non-posix) */ [CCode (cprefix = "", lower_case_cprefix = "")] namespace Socket { [CCode (cheader_filename = "sys/socket.h")] public const int AF_NETLINK; [CCode (cheader_filename = "sys/socket.h")] public const int AF_PHONET; [CCode (cheader_filename = "sys/socket.h")] public const int AF_UNSPEC; [CCode (cheader_filename = "sys/socket.h")] public const int SOCK_NONBLOCK; [CCode (cheader_filename = "sys/socket.h")] public const int SOCK_CLOEXEC; [CCode (cname = "struct ucred", has_type_id = false, cheader_filename = "linux/socket.h", destroy_function = "")] public struct ucred { public uint32 pid; public uint32 uid; public uint32 gid; } /* setsockopt(2) level constants */ [CCode (cheader_filename = "linux/socket.h")] public const int SOL_IP; [CCode (cheader_filename = "linux/socket.h")] public const int SOL_TCP; [CCode (cheader_filename = "linux/socket.h")] public const int SOL_UDP; [CCode (cheader_filename = "linux/socket.h")] public const int SOL_IPV6; [CCode (cheader_filename = "linux/socket.h")] public const int SOL_ICMPV6; [CCode (cheader_filename = "linux/socket.h")] public const int SOL_SCTP; [CCode (cheader_filename = "linux/socket.h")] public const int SOL_UDPLITE; [CCode (cheader_filename = "linux/socket.h")] public const int SOL_RAW; [CCode (cheader_filename = "linux/socket.h")] public const int SOL_IPX; [CCode (cheader_filename = "linux/socket.h")] public const int SOL_AX25; [CCode (cheader_filename = "linux/socket.h")] public const int SOL_ATALK; [CCode (cheader_filename = "linux/socket.h")] public const int SOL_NETROM; [CCode (cheader_filename = "linux/socket.h")] public const int SOL_ROSE; [CCode (cheader_filename = "linux/socket.h")] public const int SOL_DECNET; [CCode (cheader_filename = "linux/socket.h")] public const int SOL_X25; [CCode (cheader_filename = "linux/socket.h")] public const int SOL_PACKET; [CCode (cheader_filename = "linux/socket.h")] public const int SOL_ATM; [CCode (cheader_filename = "linux/socket.h")] public const int SOL_AAL; [CCode (cheader_filename = "linux/socket.h")] public const int SOL_IRDA; [CCode (cheader_filename = "linux/socket.h")] public const int SOL_NETBEUI; [CCode (cheader_filename = "linux/socket.h")] public const int SOL_LLC; [CCode (cheader_filename = "linux/socket.h")] public const int SOL_DCCP; [CCode (cheader_filename = "linux/socket.h")] public const int SOL_NETLINK; [CCode (cheader_filename = "linux/socket.h")] public const int SOL_TIPC; [CCode (cheader_filename = "linux/socket.h")] public const int SOL_RXRPC; [CCode (cheader_filename = "linux/socket.h")] public const int SOL_PPPOL2TP; [CCode (cheader_filename = "linux/socket.h")] public const int SOL_BLUETOOTH; [CCode (cheader_filename = "linux/socket.h")] public const int SOL_PNPIPE; [CCode (cheader_filename = "linux/socket.h")] public const int SOL_RDS; [CCode (cheader_filename = "linux/socket.h")] public const int SOL_IUCV; [CCode (cheader_filename = "sys/socket.h")] public const int SOL_SOCKET; [CCode (cheader_filename = "sys/socket.h")] public const int SO_DEBUG; [CCode (cheader_filename = "sys/socket.h")] public const int SO_REUSEADDR; [CCode (cheader_filename = "sys/socket.h")] public const int SO_TYPE; [CCode (cheader_filename = "sys/socket.h")] public const int SO_ERROR; [CCode (cheader_filename = "sys/socket.h")] public const int SO_DONTROUTE; [CCode (cheader_filename = "sys/socket.h")] public const int SO_BROADCAST; [CCode (cheader_filename = "sys/socket.h")] public const int SO_SNDBUF; [CCode (cheader_filename = "sys/socket.h")] public const int SO_RCVBUF; [CCode (cheader_filename = "sys/socket.h")] public const int SO_SNDBUFFORCE; [CCode (cheader_filename = "sys/socket.h")] public const int SO_RCVBUFFORCE; [CCode (cheader_filename = "sys/socket.h")] public const int SO_KEEPALIVE; [CCode (cheader_filename = "sys/socket.h")] public const int SO_OOBINLINE; [CCode (cheader_filename = "sys/socket.h")] public const int SO_NO_CHECK; [CCode (cheader_filename = "sys/socket.h")] public const int SO_PRIORITY; [CCode (cheader_filename = "sys/socket.h")] public const int SO_LINGER; [CCode (cheader_filename = "sys/socket.h")] public const int SO_BSDCOMPAT; [CCode (cheader_filename = "sys/socket.h")] public const int SO_REUSEPORT; [CCode (cheader_filename = "sys/socket.h")] public const int SO_PASSCRED; [CCode (cheader_filename = "sys/socket.h")] public const int SO_PEERCRED; [CCode (cheader_filename = "sys/socket.h")] public const int SO_RCVLOWAT; [CCode (cheader_filename = "sys/socket.h")] public const int SO_SNDLOWAT; [CCode (cheader_filename = "sys/socket.h")] public const int SO_RCVTIMEO; [CCode (cheader_filename = "sys/socket.h")] public const int SO_SNDTIMEO; [CCode (cheader_filename = "sys/socket.h")] public const int SO_SECURITY_AUTHENTICATION; [CCode (cheader_filename = "sys/socket.h")] public const int SO_SECURITY_ENCRYPTION_TRANSPORT; [CCode (cheader_filename = "sys/socket.h")] public const int SO_SECURITY_ENCRYPTION_NETWORK; [CCode (cheader_filename = "sys/socket.h")] public const int SO_BINDTODEVICE; [CCode (cheader_filename = "sys/socket.h")] public const int SO_ATTACH_FILTER; [CCode (cheader_filename = "sys/socket.h")] public const int SO_DETACH_FILTER; [CCode (cheader_filename = "sys/socket.h")] public const int SO_GET_FILTER; [CCode (cheader_filename = "sys/socket.h")] public const int SO_PEERNAME; [CCode (cheader_filename = "sys/socket.h")] public const int SO_TIMESTAMP; [CCode (cheader_filename = "sys/socket.h")] public const int SCM_TIMESTAMP; [CCode (cheader_filename = "sys/socket.h")] public const int SO_ACCEPTCONN; [CCode (cheader_filename = "sys/socket.h")] public const int SO_PEERSEC; [CCode (cheader_filename = "sys/socket.h")] public const int SO_PASSSEC; [CCode (cheader_filename = "sys/socket.h")] public const int SO_TIMESTAMPNS; [CCode (cheader_filename = "sys/socket.h")] public const int SCM_TIMESTAMPNS; [CCode (cheader_filename = "sys/socket.h")] public const int SO_MARK; [CCode (cheader_filename = "sys/socket.h")] public const int SO_TIMESTAMPING; [CCode (cheader_filename = "sys/socket.h")] public const int SCM_TIMESTAMPING; [CCode (cheader_filename = "sys/socket.h")] public const int SO_PROTOCOL; [CCode (cheader_filename = "sys/socket.h")] public const int SO_DOMAIN; [CCode (cheader_filename = "sys/socket.h")] public const int SO_RXQ_OVFL; [CCode (cheader_filename = "sys/socket.h")] public const int SO_WIFI_STATUS; [CCode (cheader_filename = "sys/socket.h")] public const int SCM_WIFI_STATUS; [CCode (cheader_filename = "sys/socket.h")] public const int SO_PEEK_OFF; [CCode (cheader_filename = "sys/socket.h")] public const int SO_NOFCS; [CCode (cheader_filename = "sys/socket.h")] public const int SO_LOCK_FILTER; [CCode (cheader_filename = "sys/socket.h")] public const int SO_SELECT_ERR_QUEUE; [CCode (cheader_filename = "sys/socket.h")] public const int SO_BUSY_POLL; [CCode (cheader_filename = "sys/socket.h")] public const int SO_MAX_PACING_RATE; [CCode (cheader_filename = "sys/socket.h")] public const int SO_BPF_EXTENSIONS; [CCode (cheader_filename = "sys/socket.h")] public const int SO_INCOMING_CPU; [CCode (cheader_filename = "sys/socket.h")] public const int SO_ATTACH_BPF; [CCode (cheader_filename = "sys/socket.h")] public const int SO_DETACH_BPF; [CCode (cheader_filename = "sys/socket.h")] public const int SO_ATTACH_REUSEPORT_CBPF; [CCode (cheader_filename = "sys/socket.h")] public const int SO_ATTACH_REUSEPORT_EBPF; [CCode (cheader_filename = "sys/socket.h")] public const int SO_CNX_ADVICE; } /* * SPI (Serial Peripheral Interface) */ [CCode (cprefix = "", lower_case_cprefix = "")] namespace Spi { [CCode (cname = "spi_ioc_transfer", has_type_id = false, cheader_filename = "linux/spi/spidev.h")] public struct IocTransfer { public uint64 tx_buf; public uint64 rx_buf; public uint32 len; public uint32 speed_hz; public uint16 delay_usecs; public uint8 bits_per_word; public uint8 cs_change; public uint32 pad; } /* mode constants */ [CCode (cheader_filename = "linux/spi/spidev.h")] public const int SPI_CPHA; [CCode (cheader_filename = "linux/spi/spidev.h")] public const int SPI_CPOL; [CCode (cheader_filename = "linux/spi/spidev.h")] public const int SPI_MODE_0; [CCode (cheader_filename = "linux/spi/spidev.h")] public const int SPI_MODE_1; [CCode (cheader_filename = "linux/spi/spidev.h")] public const int SPI_MODE_2; [CCode (cheader_filename = "linux/spi/spidev.h")] public const int SPI_MODE_3; [CCode (cheader_filename = "linux/spi/spidev.h")] public const int SPI_CS_HIGH; [CCode (cheader_filename = "linux/spi/spidev.h")] public const int SPI_LSB_FIRST; [CCode (cheader_filename = "linux/spi/spidev.h")] public const int SPI_3WIRE; [CCode (cheader_filename = "linux/spi/spidev.h")] public const int SPI_LOOP; [CCode (cheader_filename = "linux/spi/spidev.h")] public const int SPI_NO_CS; [CCode (cheader_filename = "linux/spi/spidev.h")] public const int SPI_READY; /* size */ public int SPI_MSGSIZE(int N); public int SPI_IOC_MESSAGE(int N); /* ioctls */ [CCode (cheader_filename = "linux/spi/spidev.h")] public const int SPI_IOC_RD_MODE; [CCode (cheader_filename = "linux/spi/spidev.h")] public const int SPI_IOC_WR_MODE; [CCode (cheader_filename = "linux/spi/spidev.h")] public const int SPI_IOC_RD_LSB_FIRST; [CCode (cheader_filename = "linux/spi/spidev.h")] public const int SPI_IOC_WR_LSB_FIRST; [CCode (cheader_filename = "linux/spi/spidev.h")] public const int SPI_IOC_RD_BITS_PER_WORD; [CCode (cheader_filename = "linux/spi/spidev.h")] public const int SPI_IOC_WR_BITS_PER_WORD; [CCode (cheader_filename = "linux/spi/spidev.h")] public const int SPI_IOC_RD_MAX_SPEED_HZ; [CCode (cheader_filename = "linux/spi/spidev.h")] public const int SPI_IOC_WR_MAX_SPEED_HZ; } /* * Terminal input/output */ [CCode (cprefix = "", lower_case_cprefix = "")] namespace Termios { /* * non-posix functions */ [CCode (cheader_filename = "stdlib.h")] public int ptsname_r (int fd, char[] buf); /* * non-posix flags */ [CCode (cheader_filename = "termios.h")] public const int OLCUC; /* * non-posix constants */ // flow control [CCode (cheader_filename = "termios.h")] public const int CRTSCTS; // v24 modem lines [CCode (cheader_filename = "termios.h")] public const int TIOCM_LE; [CCode (cheader_filename = "termios.h")] public const int TIOCM_DTR; [CCode (cheader_filename = "termios.h")] public const int TIOCM_RTS; [CCode (cheader_filename = "termios.h")] public const int TIOCM_ST; [CCode (cheader_filename = "termios.h")] public const int TIOCM_SR; [CCode (cheader_filename = "termios.h")] public const int TIOCM_CTS; [CCode (cheader_filename = "termios.h")] public const int TIOCM_CARM; [CCode (cheader_filename = "termios.h")] public const int TIOCM_RNG; [CCode (cheader_filename = "termios.h")] public const int TIOCM_DSR; [CCode (cheader_filename = "termios.h")] public const int TIOCM_OUT1; [CCode (cheader_filename = "termios.h")] public const int TIOCM_OUT2; [CCode (cheader_filename = "termios.h")] public const int TIOCM_LOOP; // baud rates [CCode (cheader_filename = "termios.h")] public const int B460800; [CCode (cheader_filename = "termios.h")] public const int B500000; [CCode (cheader_filename = "termios.h")] public const int B576000; [CCode (cheader_filename = "termios.h")] public const int B921600; [CCode (cheader_filename = "termios.h")] public const int B1000000; [CCode (cheader_filename = "termios.h")] public const int B1152000; [CCode (cheader_filename = "termios.h")] public const int B1500000; [CCode (cheader_filename = "termios.h")] public const int B2000000; [CCode (cheader_filename = "termios.h")] public const int B2500000; [CCode (cheader_filename = "termios.h")] public const int B3000000; [CCode (cheader_filename = "termios.h")] public const int B3500000; [CCode (cheader_filename = "termios.h")] public const int B4000000; // misc [CCode (cheader_filename = "termios.h")] public const Posix.tcflag_t CBAUD; [CCode (cheader_filename = "termios.h")] public const Posix.tcflag_t CBAUDEX; [CCode (cheader_filename = "termios.h")] public const Posix.tcflag_t ECHOCTL; [CCode (cheader_filename = "termios.h")] public const Posix.tcflag_t ECHOPRT; [CCode (cheader_filename = "termios.h")] public const Posix.tcflag_t ECHOKE; /* * ioctls */ [CCode (cheader_filename = "sys/ioctl.h")] public const int TCGETS; [CCode (cheader_filename = "sys/ioctl.h")] public const int TCSETS; [CCode (cheader_filename = "sys/ioctl.h")] public const int TCSETSW; [CCode (cheader_filename = "sys/ioctl.h")] public const int TCSETSF; [CCode (cheader_filename = "sys/ioctl.h")] public const int TCGETA; [CCode (cheader_filename = "sys/ioctl.h")] public const int TCSETA; [CCode (cheader_filename = "sys/ioctl.h")] public const int TCSETAW; [CCode (cheader_filename = "sys/ioctl.h")] public const int TCSETAF; [CCode (cheader_filename = "sys/ioctl.h")] public const int TCSBRK; [CCode (cheader_filename = "sys/ioctl.h")] public const int TCXONC; [CCode (cheader_filename = "sys/ioctl.h")] public const int TCFLSH; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCEXCL; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCNXCL; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCSCTTY; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCGPGRP; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCSPGRP; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCOUTQ; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCSTI; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCGWINSZ; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCSWINSZ; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCMGET; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCMBIS; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCMBIC; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCMSET; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCGSOFTCAR; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCSSOFTCAR; [CCode (cheader_filename = "sys/ioctl.h")] public const int FIONREAD; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCINQ; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCLINUX; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCCONS; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCGSERIAL; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCSSERIAL; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCPKT; [CCode (cheader_filename = "sys/ioctl.h")] public const int FIONBIO; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCNOTTY; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCSETD; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCGETD; [CCode (cheader_filename = "sys/ioctl.h")] public const int TCSBRKP; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCSBRK; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCCBRK; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCGSID; [CCode (cheader_filename = "sys/ioctl.h")] public const int TCGETS2; [CCode (cheader_filename = "sys/ioctl.h")] public const int TCSETS2; [CCode (cheader_filename = "sys/ioctl.h")] public const int TCSETSW2; [CCode (cheader_filename = "sys/ioctl.h")] public const int TCSETSF2; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCGRS485; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCSRS485; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCGPTN; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCSPTLCK; [CCode (cheader_filename = "sys/ioctl.h")] public const int TCGETX; [CCode (cheader_filename = "sys/ioctl.h")] public const int TCSETX; [CCode (cheader_filename = "sys/ioctl.h")] public const int TCSETXF; [CCode (cheader_filename = "sys/ioctl.h")] public const int TCSETXW; [CCode (cheader_filename = "sys/ioctl.h")] public const int FIONCLEX; [CCode (cheader_filename = "sys/ioctl.h")] public const int FIOCLEX; [CCode (cheader_filename = "sys/ioctl.h")] public const int FIOASYNC; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCSERCONFIG; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCSERGWILD; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCSERSWILD; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCGLCKTRMIOS; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCSLCKTRMIOS; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCSERGSTRUCT; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCSERGETLSR; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCSERGETMULTI; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCSERSETMULTI; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCMIWAIT; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCGICOUNT; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCGHAYESESP; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCSHAYESESP; [CCode (cheader_filename = "sys/ioctl.h")] public const int FIOQSIZE; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCPKT_DATA; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCPKT_FLUSHREAD; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCPKT_FLUSHWRITE; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCPKT_STOP; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCPKT_START; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCPKT_NOSTOP; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCPKT_DOSTOP; [CCode (cheader_filename = "sys/ioctl.h")] public const int TIOCSER_TEMT; } /* * Userspace Input */ [CCode (cprefix = "", lower_case_cprefix = "")] namespace UserspaceInput { [CCode (cheader_filename = "linux/uinput.h")] public const int VERSION; [CCode (cheader_filename = "linux/uinput.h")] public const int EV_UINPUT; [CCode (cheader_filename = "linux/uinput.h")] public const int UI_FF_UPLOAD; [CCode (cheader_filename = "linux/uinput.h")] public const int UI_FF_ERASE; [CCode (cheader_filename = "linux/uinput.h")] public const int UI_DEV_CREATE; [CCode (cheader_filename = "linux/uinput.h")] public const int UI_DEV_DESTROY; [CCode (cheader_filename = "linux/uinput.h")] public const int UI_SET_EVBIT; [CCode (cheader_filename = "linux/uinput.h")] public const int UI_SET_KEYBIT; [CCode (cheader_filename = "linux/uinput.h")] public const int UI_SET_RELBIT; [CCode (cheader_filename = "linux/uinput.h")] public const int UI_SET_ABSBIT; [CCode (cheader_filename = "linux/uinput.h")] public const int UI_SET_MSCBIT; [CCode (cheader_filename = "linux/uinput.h")] public const int UI_SET_LEDBIT; [CCode (cheader_filename = "linux/uinput.h")] public const int UI_SET_SNDBIT; [CCode (cheader_filename = "linux/uinput.h")] public const int UI_SET_FFBIT; [CCode (cheader_filename = "linux/uinput.h")] public const int UI_SET_PHYS; [CCode (cheader_filename = "linux/uinput.h")] public const int UI_SET_SWBIT; [CCode (cname = "struct uinput_user_dev", cheader_filename = "linux/uinput.h")] struct UserDevice { char name[80]; Input.Id id; int ff_effects_max; int absmax[64]; int absmin[64]; int absfuzz[64]; int absflat[64]; } } /* * Virtual Terminal */ [CCode (cprefix = "", lower_case_cprefix = "")] namespace VirtualTerminal { /* constants */ [CCode (cheader_filename = "linux/vt.h")] public const int MIN_NR_CONSOLES; [CCode (cheader_filename = "linux/vt.h")] public const int MAX_NR_CONSOLES; [CCode (cheader_filename = "linux/vt.h")] public const int MAX_NR_USER_CONSOLES; [CCode (cheader_filename = "linux/vt.h")] public const int VT_OPENQRY; [CCode (cheader_filename = "linux/vt.h")] public const int VT_GETMODE; [CCode (cheader_filename = "linux/vt.h")] public const int VT_SETMODE; [CCode (cheader_filename = "linux/vt.h")] public const int VT_AUTO; [CCode (cheader_filename = "linux/vt.h")] public const int VT_PROCESS; [CCode (cheader_filename = "linux/vt.h")] public const int VT_ACKACQ; [CCode (cheader_filename = "linux/vt.h")] public const int VT_GETSTATE; [CCode (cheader_filename = "linux/vt.h")] public const int VT_SENDSIG; [CCode (cheader_filename = "linux/vt.h")] public const int VT_RELDISP; [CCode (cheader_filename = "linux/vt.h")] public const int VT_ACTIVATE; [CCode (cheader_filename = "linux/vt.h")] public const int VT_WAITACTIVE; [CCode (cheader_filename = "linux/vt.h")] public const int VT_DISALLOCATE; [CCode (cheader_filename = "linux/vt.h")] public const int VT_RESIZE; [CCode (cheader_filename = "linux/vt.h")] public const int VT_RESIZEX; [CCode (cheader_filename = "linux/vt.h")] public const int VT_LOCKSWITCH; [CCode (cheader_filename = "linux/vt.h")] public const int VT_UNLOCKSWITCH; [CCode (cheader_filename = "linux/vt.h")] public const int VT_GETHIFONTMASK; /* structs */ [CCode (cname = "struct vt_mode", has_type_id = false, cheader_filename = "linux/vt.h")] public struct Mode { public char mode; public char waitv; public int16 relsig; public int16 acqsig; public int16 frsig; } [CCode (cname = "struct vt_stat", has_type_id = false, cheader_filename = "linux/vt.h")] public struct Stat { public uint16 v_active; public uint16 v_signal; public uint16 v_state; } [CCode (cname = "struct vt_sizes", has_type_id = false, cheader_filename = "linux/vt.h")] public struct Sizes { public uint16 v_rows; public uint16 v_cols; public uint16 v_scrollsize; } [CCode (cname = "struct vt_consize", has_type_id = false, cheader_filename = "linux/vt.h")] public struct Consize { public uint16 v_rows; public uint16 v_cols; public uint16 v_vlin; public uint16 v_clin; public uint16 v_vcol; public uint16 v_ccol; } } /* * Wireless Extensions (WEXT) Infrastructure */ [CCode (cprefix = "", lower_case_cprefix = "")] namespace WirelessExtensions { [CCode (cname = "struct iw_point", has_type_id = false, cheader_filename = "linux/wireless.h", destroy_function = "")] public struct IwPoint { public void *pointer; public uint16 length; public uint16 flags; } [CCode (cname = "struct iw_param", has_type_id = false, cheader_filename = "linux/wireless.h", destroy_function = "")] public struct IwParam { public int32 value; public uint8 fixed; public uint8 disabled; public uint16 flags; } [CCode (cname = "struct iw_freq", has_type_id = false, cheader_filename = "linux/wireless.h", destroy_function = "")] public struct IwFreq { public int32 m; public int16 e; public uint8 i; public uint8 flags; } [CCode (cname = "struct iw_quality", has_type_id = false, cheader_filename = "linux/wireless.h", destroy_function = "")] public struct IwQuality { public uint8 qual; public uint8 level; public uint8 noise; public uint8 updated; } [CCode (cname = "struct iwreq_data", has_type_id = false, cheader_filename = "linux/wireless.h", destroy_function = "")] public struct IwReqData { [CCode (array_length = false)] public string name; public IwPoint essid; public IwParam nwid; public IwFreq freq; public IwParam sens; public IwParam bitrate; public IwParam txpower; public IwParam rts; public IwParam frag; public uint32 mode; public IwParam retry; public IwPoint encoding; public IwParam power; public IwQuality qual; public Posix.SockAddr ap_addr; public Posix.SockAddr addr; public IwParam param; public IwPoint data; } [CCode (cname = "struct iwreq", has_type_id = false, cheader_filename = "linux/wireless.h", destroy_function = "")] public struct IwReq { [CCode (array_length = false)] public char[] ifr_name; public IwReqData u; } /* constants */ // TBD /* ioctls */ [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCSIWCOMMIT; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCGIWNAME; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCSIWNWID; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCGIWNWID; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCSIWFREQ; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCGIWFREQ; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCSIWMODE; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCGIWMODE; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCSIWSENS; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCGIWSENS; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCSIWRANGE; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCGIWRANGE; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCSIWPRIV; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCGIWPRIV; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCSIWSTATS; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCGIWSTATS; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCSIWSPY; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCGIWSPY; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCSIWTHRSPY; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCGIWTHRSPY; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCSIWAP; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCGIWAP; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCGIWAPLIST; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCSIWSCAN; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCGIWSCAN; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCSIWESSID; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCGIWESSID; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCSIWNICKN; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCGIWNICKN; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCSIWRATE; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCGIWRATE; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCSIWRTS; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCGIWRTS; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCSIWFRAG; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCGIWFRAG; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCSIWTXPOW; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCGIWTXPOW; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCSIWRETRY; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCGIWRETRY; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCSIWENCODE; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCGIWENCODE; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCSIWPOWER; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCGIWPOWER; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCSIWGENIE; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCGIWGENIE; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCSIWMLME; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCSIWAUTH; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCGIWAUTH; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCSIWENCODEEXT; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCGIWENCODEEXT; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCSIWPMKSA; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCIWFIRSTPRIV; [CCode (cheader_filename = "linux/wireless.h")] public const int SIOCIWLASTPRIV; } }