luciole_0.8.6/0000755000175000017500000000000011437127102011703 5ustar niconicoluciole_0.8.6/COPYING0000644000175000017500000010451311437126703012750 0ustar niconico GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . luciole_0.8.6/templates/0000755000175000017500000000000011437126703013707 5ustar niconicoluciole_0.8.6/templates/Menu-Menubar/0000755000175000017500000000000011437126703016202 5ustar niconicoluciole_0.8.6/templates/Menu-Menubar/menu-line.png0000644000175000017500000000034011437126703020576 0ustar niconicoPNG  IHDR^ўkbKGD pHYs  d_tIME4;mIDAT( 0C_ %0;dU2KIKsOȡQ$9HܛA;X9'ԛ_ӱ+7{]ji1?V)@IENDB`luciole_0.8.6/templates/kdenlive_template.kdenlive0000644000175000017500000000420411437126703021126 0ustar niconico producer 0.000000 15000 pause black colour luciole_0.8.6/templates/project_template.xml0000644000175000017500000000055611437126703020000 0ustar niconico toto tata 5 luciole_0.8.6/templates/pitivi_template.xptv0000644000175000017500000000101411437126703020025 0ustar niconico luciole_0.8.6/templates/cinelerra_template.xml0000644000175000017500000001310711437126703020272 0ustar niconico Clips Media Media Video 1 Audio 1 Audio 2 luciole_0.8.6/templates/lucioleConf.xml0000644000175000017500000000054511437126703016677 0ustar niconico luciole_0.8.6/RELEASE0000644000175000017500000001244211437126703012717 0ustar niconico0.8.6 Release : Tue, 31 Aug 2010 10:26:00 +0400 ------------------------------------------------------------------------------- The Luciole team is proud to announce the release 0.8.6 of Luciole. This version is a bug correction release, due to bug raised in luciole 0.8.5 and translation updates. i18n update for more compatibility with automatic launchpad translation New languages : Portuguese, Indonesian, Russian, Hungarian and a bit of Turkish Now project can be opened from any location. Luciole Project (and folder) can now be moved, and opened from any folder. Special thanks to jorge and his patch. Addition of accelerators (key mapping). usual accelerators added ( CTRL+S for save, ...) and some specific ones : key 'a' : Start/stop acquisition key 'space' : takes a snapshot key 'Suppr' : remove image from montage vie, key'CTRL+Suppr': remove image from capture view List of Fixed launchpad bugs : ------------------------------ LP: #532967 Project path is hardcoded in project file LP: #626847 Menu shorcuts as CTRL+N or CTRL+S not in luciole 0.8.5 0.8.5 Release : Wed, 03 Mar 2010 08:54:44 +0400 ------------------------------------------------------------------------------- The Luciole team is proud to announce the release 0.8.5 of Luciole. This version is a bug correction release, due to bug raised in luciole 0.8.4 and translation updates. This vesion solves the problem of very long start up time in ubuntu karmic and lucid. List of Fixed launchpad bugs : ------------------------------ LP: #525286 Luciole start up can be very long 0.8.4 Release : Mon, 15 Feb 2010 23:34:32 +0400 ------------------------------------------------------------------------------- The Luciole team is proud to announce the release 0.8.4 of Luciole. This version is a bug correction release, due to bug raised in luciole 0.8.3 List of Fixed launchpad bugs : ------------------------------ LP: #522266 Luciole crash at start up 0.8.3 Release : Mon, 15 Feb 2010 09:25:00 +0400 ------------------------------------------------------------------------------- The Luciole team is proud to announce the release 0.8.3 of Luciole. This version is a bug correction release, due to bug raised in luciole 0.8.2 List of Fixed launchpad bugs : ------------------------------ LP: #522010 Segmentation fault on webcam detection when acqusisition is on LP: #519652 Luciole takes a while before starting due to theme warnings LP: #521606 Nothing happens when trying to open a non existing project LP: #520495 GUI display issue around mixer LP: #521371 A scroll bar is displayed when only 1 framerate is available 0.8.2 Release : Mon, 08 Feb 2010 ------------------------------------------------------------------------------- The Luciole team is proud to announce the release 0.8.2 of Luciole. This version is a minor ( after 0.8.1) version with bug corrections due to luciole regressions List of Fixed launchpad bugs : ------------------------------ LP :#518402 "View -> Project properties" doesn't open any window LP: #518403 "File -> Import images" doesn't work 0.8.1 Release : Thu, 04 Feb 2010 ------------------------------------------------------------------------------- The Luciole team is proud to announce the release 0.8.1 of Luciole. This version is a major issue with new features and bug updates. This release is based on Luciole 0.7.4 What's new ? - Luciole can now export a project to cinelerra , kdenlive and pitivi video editing tools. - The CPU consumption during live acquisition was seriously reduced. So now Luciole can run on old or small (like netbooks) machines. On project properties a slider is now availabe to select the webcam framerate. - Compatible with more webcams and video cards - On the invisible side : now Luciole use gtk.builder instead of libglade( deprecated). And new logging /debug options (-v) - Luciole is now available in : - english - french - german - italian - spanish - bug fix List of implemented launchpad blueprints : ------------------------------ libglade-to-gtkbuilder : Replace Libglade by gtk.builder cinelerra-export : Add export to cinelerra file format kdenlive-export : Export to Kdenlive pitivi-export : Export to Pitivi luciole-logging : Luciole logging feature List of Fixed launchpad bugs : ------------------------------ #498619 Acquisition doesn't work on DVCAM nor WEBCAM #500649 Excessive CPU use while capturing #500158 Impossible to change export path #500652 Weird Mixer behavior #505288 Error when opening existing project #518129 Unable to open existing project 0.7.4 Release : Thu, 26 Nov 2009 ------------------------------------------------------------------------------- The Luciole team is proud to announce the release 0.7.4 of luciole. This Relase Version is a minor issue ( bugs corrections only). List of Fixed Launchpad Bugs : ------------------------------ #401342 Package generation corrections #481732 Webcam acquisition does not work on luciole under karmic #484062 When luciole is on acquisition and close/destroy button is clicked luciole exit but acquistion still running #485197 Luciole does not allow to overwrite a video file during export #486963 Luciole export on DV format does not work under karmic luciole_0.8.6/images/0000755000175000017500000000000011437126703013156 5ustar niconicoluciole_0.8.6/images/luciole_icon.png0000644000175000017500000016770111437126703016344 0ustar niconicoPNG  IHDRTosRGBbKGD pHYs B(xtIME "# IDATxw|\ՙ>s;W۲-lccSLM/BhHH!6lH6/MHl &B B5Uh̭Ȓ2*6|ü|Д[=yv(JQR(CP||XA}>B(ʱIqxRu]dT*UM&'1CZs/JQ%KcX(+JFiTT)b@92 LxϬVkT(f+(EZJUEiL!{ݘyBT7Ά( Pith֗@OK~B UUei'2| AEC=jAFVZ!މ{^y Bn'4PJi#% K)+ܓCǡ, 0M`#rJ2y'./JQ>(p WOq`&cc`T4#EV8XQ1$حnX>s <06> %P B "ͭ c"R$3c?`gSl4'X%Hvdndb[,{ܰ]ػChZIQreѢE]g" |^a `!m$ 8AE*c'nP[QܹsKeY^v\jT{ g n幼?1nż+<,p~E)G,o0M:Np<  ;c 3.f YQJrEQCyؽnV9扝4L*0ok2#[nsFRn'2j\x Ò]@vqE("RH(ǵ~OIg鹂gvPg7tEpE)G$V5!B"ݽUdz@Mgm0 N]_|2sLˆ .L$CN"cLO A4B<(ŋY{$I!YGBmm'wRB$Pә;5MK_;ȼyL&0 l6/ kkk"9W5rho( b02(;(Eko;p_Sw0InZpmw_Kii՚wvQ w?D&(}f[QrΫ~~L&RrﯽW~tMxgk~Qto֗n83v)r7!%iwww$pUUUɪ]˖-kя~.孷"gX,f&IK2(eAPJ9KQJc!/:I2k׮M29=P(4?,_ORwwr1MOp<7sV (c0?㝿= ] B5Xc"Xlc.{ܥŨ?v!0 ܃+ڛBK裏 ^@t)c16ruv$8  ֙70 7б`3a(_WU5UXzŲLU8o<3 !;tI@(/% xQs4;{į‡^0gΜ|7~K_ i0F`yPRW wi%U; 2X\+Ogf=<fB@@H40节Pglކ>@J* ]U jY]]}Oӟ_s5{Ν[KEQ.| v U 3 6AS5D{8}:Bȵ- ~PسO]U e Uoj͌wvdYV\r^r?=d:)~,K]wY(flAXLh ^BH#HC l=WhaⓔCoƫ/'xJ嗿۽{,d2K2S0 f_(qcgII >o߲e~{KxTTUUej0M"ؕ9ksP5wQ f Ml!g6dMX0MVlkB{vp7.ӟ^( ]`|kR~xQmz1.W\v05r*4J9N?A[^N;ʃ}}}__H$ (YPJ!bJIz<;.Z k%ODׁHF# TKN hC68c|CUy4@, R]];sWd9|:}Rl/xwzMtڑNj<;ͥ/TUU=so~~~.Wutt|I8J ;dֲEX|橨_4\6 \:q8:ci"0vY<3M0ӄi2{e3 h -f4oىPG7ANx@*y 21%>1_l;vQ0<[QKu!MkV?.+*:wWв J*=|RGpGlܸ!EQ\ri8+ gϛ;*+/!-qT_@uq֐x2v E5a>{YB8fIw2ޖ6|UUOOYf;"I\.x|n ΄40YpY5 ٓę}dc3MPJQ؀iiC+`b]v͛7?|0ʆe0!~9OЎA׾f0Ƙ(im64憆LUe>c&ɬqgnݹsg_klzp+pҧ/O )AYas`u:9:"(4' PG;[I]CǞutMH$gXbǁ<E<% 1cCv=ɦ 4#~S7W T@__ߔ&c=vgP(}w;lUUuax|ACcciӦ߿xP._<\)al!ISdVv~ Z;%  # C#x! xw=>Qma\ 3orTmԔ`u:G < z[|v [rX[gy.MMӪLӜH$fD ֜x *fϘ2M<&0k|zMi1{` ΨA@Q@(Z}v?ܿ aUu6tg _X ٬G%I(Ϊxq؟STTF`d2R)L uW%]u 1ysUD@?@N7Gdh|  ?G7zZڲIt]b˻-ٙ9_@6<&Z3m*̯fbA%;*]WD8WoMJy~q__c6* fKY[]9]qY^v9NzP`\Ox &iUk/xgLĵdW^y=EOY 愣wXH4ګ~r_I(fB,QeUֽL*>{W}>r7omӦMku]q]g)lw|V<)mFJ:,[&'Hja[^+p3g?>h_`0x/?sO*:8rtlA3< CIlD_[B ; p leKm6鍿p60|~s!SNhܱcǷ /Xz%V^VwGOs+^pQ`nϋN,V4AOvE0 ˎsx5gᑟ][`&ӳ*]r7xw68Z)TY2f-=4.;lGm bk7 yjŊ455 SJ~j,߼!yT:,  J8+z/Olt\󻺺/L _|\w%ܥ~x+B};؎ޖv--l2Drsv1]?~ጩXiʓ)U1 3ppnĂa L:6644.t`A*C@(dX4'б{?$iO~}R^8PrcX@8SO >0kiyc!D9k.l~Ox)PxK)+mMmii_)Xa*D|e%R,1cwCҴjvMUv-TRd&KWּCne+// WW!։}oc Cpx=ج!-L?hu:PP}#Tx2ߟ5rU϶"c(dtr4E㹻Ǟw?&Z^^OSO==+8Bp}u;pBxܶ6U pO<9xQDz|0t3o',,C?Eш}|oi 8߅Plԗ#]ܭ/VAA5 ]ZеeH/p8vgΜu].3~jp8NGե e}}MI+v\d2h=ؾDQTl55U[dYJ2QJf7_X/l|kseowP4Hl}7ظaڵ-f1M.B)Z!EE¡~kǾ=-<ؽn\ovacO9{sBMP im=eFOɑ:MCBޙ<Muc7#X'#ۙ4`1c! 1v*. Y,pEENoWE1].gG`&dv~ʎ{onv~K?&+3BaVJ|r~V y?Iر>k|Q$IRs,/?!%IgOOlMlDZMolxn3=g#*ȅmeٰ&e_ =e8w^ػyz oXX *+T'B.B\>-I@!iQmxBӴR(e%MN3LFBpy<Ȓ٬5cAS5J9jd^h!UոT2E"1Q(c RXLt:}CF >g %"&.X*wuv7?} -Mج8fI,XO8 D@?e#^$3xyǥNGKEeþJ)U=ʪ]v-qp$Gfiy>UZh?;tx£(xKv0юe,ۛ0 ٗ0̼N\ngᴷ3Vq㓯_HOo 6%=UUgF#Pޝ{wLߋ.< $e)ۄ)!%RsPH'Lq]8CYpxY.-ȘoY0C)fkxNy]4bqfKZAPF !LUUK(_g\ĿRI/W!R3V%ɒyN8Ny^ UqF oI2^UU.7Mm냏k08ϓUSŎ9h1xn(Ym= vkH1 fd2v[k%k>n*аdcN#8o> jRqEAUU-xyAc鴟Tii`?cCd"Y6m5x21bpU):q$KQt:)G Fӽcf&>OsOw"_mt ,$J)c(87MI7TL %y97+o7 kJ`w9LLdd?A>D+YeU@Q , )i}%pB( ;NG|xFpdx\EUG?q-Y8/eiUQi{ku"q `Sg=bIgg yW]Yue}HHIh ӒDdl}VB ;l92 #dG+BuJ<9]Y/8;Da#ބarpJu$I!ӕ>i4hf?4 `tE6(aD"3Rtvx.UN~EQ܊#ݢL$ζ.˖;;䞮>{WgO  ,r(5.-5"X,:)G [8&U{RnLU}ng\P %6#21Qg@EKKnW0W&;J__0dV`c~ėJ&K!lL&mM&S~d _Vkf7 k![8:q's絼?oŽ>&3/ v_zeů-+oh*o:יL,hvd2YOʳ>/7`1Oas;<$_hLeɴ}'\hdӏdL?9Вlr6+d(ǕYZZZ# p+%\^VBT6(u8?뢄tp:}~og>4Fe([ZhirÑ@pN[|Qm- _K)] |ưD(n{$s8N#$Rȸ^;HcA?i۳{I?ퟎb+STid9C, =k:tMCByފRWb|o(I O7ۏޓ_y&3Q5~Դah!% .5i5pȂĂBȲSRr9s=2ƖZ,by*`t|*5v f:J|1j|>O`JYR8hGI'ӻzϕs\}{{O{M\j D*LG#vr[1"t:4O^{٫|zQ<?+H,d2!&dA bV=\%>8|^ %HaKo`Ko n;AL3B $ 5~]9ȀuNB:},'0!iƗ(O$b0NpSJL0tQdxEDnmNgl:)%Eq T ͙fUU秒n`{?UʼnLP?,+6 _)/d4ti9b6 $d.mʲ=ˣ |躁ޞ`@RbX, )EEU\,JJ͔!!Dɲ,Ngp$=ؖ\dN3z|9GOq}oX62Ms~$dgIi`3 v Vf;(fϛIsga[4g@%g1\G(E/L֊ucTeK6ol}jl_ɘ c_/)c#NqkHA6$1sA%Xd  ?WAwd,ӛD+lar98Jy69L6dF*r>g 1upp63V|zd.dC <"o~ځ[X̽0 UѮJxVxY :94(NA֖GM⩑$K4/[. p+,K4@בG_@  A='i(1qXlx ճP/<=߻N[8Ƿ #P`_ctv{Þ]p_gs]lP`O#BI=ԀS^2jb(KV.8F~O6Ȁ 0} 0.ۓ4$4k="m)AE?x??Ma 4]}=gXH)x})I@(b8)c O0 B.nd7p]-daߵ7=>F9 zMM9XmpvUalo4n0U eod[&x.0'9mLc ;l##fpGA*CϡŪp3hݠut  ݣw:xi ާ${N֦^_%^d/CfȽ hP՗HM'p!Dmmnw0"GV']N ̓$K91 3LCT*]nevu:]pNp0T2=7N_޻e$(B8/'(q睁Nd(Igq.סք`BB흈 <0ַ%.# !6Î0zp?T:[8d}~<X<GJ@ W &1_~S6 @MĠ S dZrwYy\\}DOU3q*BttJ%i&!"[ DWUͥ3Lxp8J߭,Iiu0ӕYIANEaS&|1vC8V56`٧c%p:D R)>ǞM P_k4>;TNZо~v% 6=g_pܥ%>K DF }ɔ7WXc+cp(]nB(E13Lr<֨v뵚5BsT <=;s0*kuE#U5]*>ϣabtم?G3D`QTG>!0tѾ OYɈEq&RE5#Ò'㕇G<,{+/؈jHL;ۏh20bDM@sΑq>0楼 ?VX [(g Dg%(ʔuVXqT;llA IDATjk즂י `}R9itCrlO,L\v ]]o> ݙrcL&3Wz==7aӒP c ._88spg^L@K&3fV{ r^vQueI84MWrnthdc,۞@_(DzMA 7 pAc#b'j*olXBzEQTUUzi.`lc 4]4M&"3ޥg}~\:!vYÂ(c aߪj 斟h c/ֵhb 7vJwW|d?lVݴcT2SqV3s..e HhbMLIԟ_)$&Ǝ]Q((Hò~?fnۖ5CΝ;DI_-IbOyE~QTu;P4; E>jJr; d3?%#~Mt,#(b[[{MvluL3w(P~z%F8T@-ފ:O)K!&11d-Ya08c'_x&ş۸|5:[A)4|iɥ;j*#~V.K+dJ)1Gw|ް(gZ90J- [-l!_`0䶏5u5rz GD-QGy$ f!uu#' Q@=QX1Qz*++Iv#(k6l5Pw (^pp3 \1{mǟ5EoOw/:Q16\p@P3j ̘jGg'b̹cSW5h MUQ0!{zkEI2G')+0?A4l[%^ |*z!z<>BVw,*Y Gʛ,V8@rOfE">?0@.79_ $8tz | BH-cLaiPBf:B)q._qJ8Euo$o/E*:$@Q5[ H n͑Ad~11g C[YAk b,ؤ8 } 0ʋuzp]NJ7އ%HmfV:F1CO `I_(T ?Ho:撉(xpav\}2wOjb9$Uf}sY p%IC$5^Y? P(Knl 5qCEPe/"$.9f|B.+Mfkq@'ZqV| b v¶-||$E#QǧB׹E0KAogz:bnXSm0F˦Y&!ʱ^L>j#AvkmjQN=g ]]=8a 3`esPQS ]Ӡ"܂= {=m(4 >K} ^Ԩ570cd`I7~_ ?ya՗@^0aƞ8 fB+!(O |5,T8n9wlKiJS{kMY%|_p8l hFѨųS**Q"B<,cL!FGtCwmĉu>_>]ώ]'nS|.."J|Lr@儑;~CmhA(Dq]A2/Fx9QW~jS[h{/ط0RGqo0Ə'ٙH,Ibߑj`ȕ1ƲzCsSJA)K>wR|H B V,\ֻ) 5) %fƘZ pΩn0`b2T`iL| ??o-~M#⴫/tft1QBFÃn"Q&[6sEQIFLD>8<`.Y\j'mk6wx 0[(fVFDHJzR}~tv%;bqi΀zT'ap="^3{xvܺ(ٴW4jW&Q0XE۾pR]שY.0Fp|܈RŅ$.λtUl9dqa@Cma &PƞPDv:H# &ȿ~P^D_ wzƜr|䵡t64l7JEJXuFFR~MŪ4sjtu`+sM+a5wވ@r!LY7) Jه| 8LB.Hɍ}@wGV/]_y~|-f\0<)`"8٦9'&A; ~ !M C`L٤='j\YŴEEMu\2 )h 00~&V'75z dP+-JaG_Gˁزz=؃ϜC5NYy(r 냦hڱ ڙcI#,BF DU A1[-/.@w?XY'Mc1mC`;[;K8㢳`mq#V@IQS77p`4 sؼ/XRtɨ9:Z]8 [6;v<\=̚ M2!UB)ZZ@1y!ƘVWW߿he[)&LT&0*9 th(%MuM[d2/`㤹n\%5$ DÑ O()+H$~#hshǍc = y{p0᫕08vs8  F&Uib9j즇_X罊VqS'cΕ16`d- dJy誆1F'罆š}k -Y\ GD[T3]~8xtCi1o@D>T__,o.zBp!Dt]m$FyI]wt&0IIp~`_Sc8nW| 8,64Rx'I1Y 4@F!JR=G+vJbF׈C1 (-/찃 vH0b'c/mVD#L;k:gTVV̷:*V⇷^²>Ƣok /L~v? SΘj7~''hnOEQTjjj~W?>dT1Q皮3SbKPRyG(Er˄*sS/jj55G_IL OE: l؂}iaŖ !~]z*`xhVo3.<떮k{N7n*0AiB 0ч!tvi!t5o>lpr%CIY xJ?A:!yՎdžab3eXK48`wȨUxL8~"K[ucj9ҦLض~ Z2x7sЭozCEQK6)! vJ}?4\RN8eJ+B`w;a TSψTcŒ)ؿi;4MCǶk1|Q^5)K4YT^VTm1]0?f޲۾܌][w&tvワLJ_N0y Ʊ B}Eƻ87P7WJ\r .z!Uɇ"~!y~:O, ?y ƞE_ue݆ hhDDWk;ͭPDn1p !JAzn-,C9r]53ѭaj3%OvQlb3-\XnBo '# !,˾-o.cKJ@Js]Y;ܾkDwWoucG``AuR_a$3gBհz4L>ZBZڎu5F ^ϕqIJ+%]\Ӡ=n^ #Zr c\7Je1)s yR&f3sIKN*CCxiߡKy͓'O^7o<[MMM.Ф(!:Qa泀 \յO m5urd VC6J,Brp=NL8} In߶øxqΤY`}.R0xnr.C 몚iƟ$fʢ:HNN2䁛EHL-L86ePX'drO%I>}nj+> o0RKR@MDsh&mZ;eU!9`m aY9ǘCz0ƸfD&o-q)ƔXf4IžɎHOCv_܅" hgI$i&ZoUgaСOx@d>EOIl}$ܜ19ի? (M{EQPi \5yn(-{'dCC3ʪFH'*B?M JVBD)h—|lĄKiϲO#I/Ord:2M3HvA(l ~YBtI\yveTá}{@$I >iw",70I(`jh"Q5#Ҙ0IXxy^_Q?_~6If%*Y>br+I#> E!fZYP8ӯߌWAЇ yvK7FAJwDDe4suAMZ Ox8wuv'owr֔R0Q4dJ!"pD׊ޖӗ4ϑhp]w)S~_/` (DMs0gnu[9 L.Si0͘H@mı$#G,%L k}]=x &4nSO}ƿ`SH!vy_2$:g_KU5QQ[H)A[kǀ@ 偂(;T MYAAPou Nt65]ͭuvASǜq*etǖ_RE4dFpϏUo/FןЫ#7;U:g#g5| %F\^A,9Β`!vmߕ|voĈw}'E'!d&Jb2aO,aj<@baFr]c~i[K?(S IDAT UX {*,O~Ed;{)_Y cm¦6(I;Ӿ7j d@HQљ:*jpwv蚆4܃@ iQj=]g"J򐂙Xv&GYX@}ez5 /[9ȑ} /$ku0&`ĽOƣ>UUUo/[ b (' ,Ώ(oAl@ XϹWf~#vTOXQQS Igk&Id;"0AgGΦ,y%~c|KmWל.`s: ^R*ocN>m!D!|~&ΚQ?=? 2@Q>_'YʋXFVX1Y ?%ӠM7wc8|0G|(zwN47|sr4#R1ɾ#r_/1FӴ]yO4uĨ!W,J!$AB5۸ 䩗owP5gNŔK^C GbtEahQ(\1Od !|'uŒ/HG P |p:p-F7ްw[H'4L3lfupO/ (p(82DUUv O(I(t@5P/c8<_j frL]U-c.Cv9*BT5sH=e񽹰] xW/@} MJ0y Ԍh8Dza;K@ sL1t@eR,aIjc{%(2nxt:{&LCjBGfW{ƨ&Jb4\_w-:ء ^%{ &ye9d! z׊P`o?8^`p0w1)$L(d*-¨F+*BL7e(M2r OG?^S㕠}18CؙS@ALJOփM(,0-+fPoE*BF[ 9jz93֍܉/oea/?^sLLC~1I?IB;DUzwoo@8q$7CɠJS#?6 b4MrocÇ u@9f\u1lR.'*Д[vvL`09dg8ilZmĢǟ;\_s0F1sx8_c o@SɼɸlJdrFa\${;25щ( fnqɒRJUՠ W]uGO"~(G? @5w,ח<ǟ(J\tUF_(UɗDYP7nt]KRHl&k;؍w`'CE)tP%.:|tRyqv~Wo!+.B4,zn>~]S[\s֚ki$wK0yݐ Y5 }z܈E ,: I43ȸ?9nK_rVVV^yWvI)@0Z7hED7=u?F]W)TS 91S@Ha :8x+kAd3K3@W|߱w66 gr4Lx!qaԉpDώu/!]Ͽsπ͆ _zQ@Wk;xiG1UZ[F%e̾g(rB~Z'fͭ{&Ъ('rܺ|ڈ.{L,f @/&RO7:dP`dnE4A0 wEYљ v0pП?A ӈONfm;d3{RzXS0ۏ5 ǟ;3L誚8}a32_{a#]W~#f\|/ځyD#!'z}L" ߊ0DWx1N󻇰xjPf5}3ݳK>qͫ cmV,E~0PwQ`닟|'nsH6CY(KCeH6R(9C*aWktĉs΂w@ErfE! 1?ּA|A1gNǜ;1[p~J4Ԏ oXIW"Q,z%,sT-d3B)5.cL{6(3~e;UGmw)\t]OP:܋m/GRfA2b(6? ^|;G?ܲ'J= {8.=W?԰NcNW NJ1 094lOGEןpE}vJ*ponK{z}O{CWkG E|܊ȴ&_dKJ( JR J4yqCo7E` %oRh 9tn G"~5}6R`D{Ϯ8!ћ {i)l l^kfض#;ThH9CŬw ӿw;w%".gmɕˌs4+8nl.FXp?wn .A>,qxA]3 & u2gI'B Za J)‘io"KJ ?eʱ[~{׍+=^gD4d!?cMfѰ?rhC `OY:J]Tхvf!NN96 ){;PSYO$v3Ie+yscNӯ1&szg]wXp sX\tK<~oy)4Ug-ſ~s/:L2 p0-;Jo#'oD|O?") x,>bH@U5^ 4 ZJr$'g@$I7Xp1`,9?ܦwi`Os&-)ң?4UEηqc?KvbDC´ͅ"enO-?37'cs @LHaa{ .]/=7/Yߚ2[Cd㐕( ѪR UQ1їO1ƆÿƕF J I@NsΤARE3Q"h"] #W{{Q1c9|]P~h7\.].Ⱦp,9A@ӎfjX0Q0Gam?x<pM;5ssnN{Vns|N)C UO;& FQD{e،?~/?QGƲWtAUފR\|y܄؍'<}_o7FkrATĖ sm\-  ]ɻKq~nD4+jұkY,vRƦ(F :;;ӏtScMU#GD@ t@.:MvHv=)ۑSP鏦G]E]٤j!һؿeZDu@ O L1~[@gdF~|C'LCS5 ƕw/>#7S\~6Xc",JTy"Ģu o1--N]O-SJ$?E;/3ЀAU(7m U䏡-o sM')rvuuv)M! 0` ^(@DD\nG@ ZK37aCg~Hvld- 7&1~a[j>a,~;ҟƺoWK;Zڱo78{?xKЖu\7 7rguIyG2df*O:o$~?.^,֭]O>;wm(& ?#Fփ13q9:ڻ;-}5~)S&kNKѽG @1)4 $_ru|Z(Is;l0>ђqk@)5(6Nh(Y2e؀˯>6Zl2 պ@|Mi@ Z_pSObVkK go~ƫ=9gsNc286k:[jѴ>FAbg:\ <>||>˗QyN?n! S9Goo){lov5; @fRǢ j  Gܪ ((m3e%@i3O~_<ߗ2 GiU#gd?9H UhVK8/ϰ2sca08BN_s,)*/~> k[7mO?ǜq $Vh"l"0ȸ~gH=|E<[xnޛؿ)(ᴃMmPQ憍rhj$)Ke;'Mn{o-XZr]oQ(瀮Ppb 4' u?7:EP$BBNfɞEQ#H"w@=PrI͞ {;#Q+8'_5Ρ&`u,{u!>0N,WhBˁ&YC0v0p:z$I2WŪ Ϛj,r<˜'6fhnjOwbѝ%=b>?wp3rH ޡD.P!6#0s!p p?ae>qèe!0pUXQbVv@}W2C6 P Ml&RUJUUAuBe):Fszp@TXoFÍpO;l l.W">46.`7z^($J8 UQ[4I?tUGf;ZxixޫXGiL, m6 6N5g_vm( P#Q(Ѩ1W!یKyraI1;!PmhGaˆmرm5gCFA8Spe0|x5 K2H7NxwĄ Dhx1xY,YFVxԷ L2Y`]B(.Eۺ9׉il#*jD(+Yj#J½=#f5ܑLUB {1]]@=N/&CeKK uOUR~RMUorU_@:nF ÙWŌ6~6+kkj;^?ń&SAW[;QVYq#qQ;ʓ&xs$>J<9QQ,͡( >ُ=矮ك֎1}ѣp/1H@tsPM×h9(I'_SD^~҃( Fqp{8xER %܈gFA ]ׄP(.)v~[L9$)rZJʼ&mۼ@ UQu!*DH?_eP{IqStwt;J "$srwzVI7[$ Il'd>yf $C,#7܋\e[,Yn˙~93wnӽev:k9~>Yɫ>wXӽ|`ٸB,l;/ɱ?gݿ 7:1@^}zBQ]W]{OLp~>z?te\Kغs+xUS& $eiҨթu Jb8c;rR{k)NKOg.@U #@#/yH"D)Z ǏcJq\U_|J%nyw{IpF=eiJEQ@&|8*o~NtO3urZDgĨ7jK%pؗ:sk$b mw U!J{Q*2"Il=H8>M?P-;|5۷̍By 8EUȎȏ;f(9ӘdZFT໧_R( xi?pMPX"FWo^뒟QʗU"ñ&&,jJݨc4 \aeZ[$ 208sֳ$ S9/^YC&9Y/,됔f4Yom)BH{7^-ʆDere*^́@S qs m;%MS_ҽ^'Lf;RմUk~5L)~#sݐ=F/LV\+ қYkKۖEZ{gzDAP0>I%W #7oVQT>_/0rX+ꦷw^EFB_~>2iU=@Uߙ!iް^@èc6M:ldZQ5grM)=E* J'=nE L%e]lv폳 ӄ"RzSy[uPyv֬]S=M\'G pQm<| :) l eI)M\?`;.'Od*nRK=me쳳yƑ߯_aӎ蚦Yof4SEږ-+Xa5ny|]굌 i P-ڟN׵6]tRT_FA8DPk/!?'_,c`y;|CWm:\})ZsF0jn&̅J+%pS3Ql5jσ pѕd`L2Ou ]"Ej$ !iJ wxCWַ_ٞ>Æ u0-Tw7}zTllJ ΋{lܸeqD J΁GD@w%e[E[ݎCvTX,,7MsK iڛT(wF#j hem6nLhfFX$-5K$Ȥ)gVi.7x(G +.bz2L,CmT!1#_8SX07<v#{#91Lu,i w$K>u]u9o߆#uhZsW9pplظ +Uq^;pt5"POiE~qTUy̱mz3Fob֯M.7MSW@P7E*8B+ IoܓeXIzZ0ʴGd4v=7;*G_[6ʻ}zm/{]vb[skGFt&)7W !(JضM8BTA\h,2xJALt]IٗC⮲@$N} r3rexңP)mj%Ӵ/KYnO3:m۾1Eͦ>W-dNឪAxJ;~ݹ_p]רI)A(Z66:9ؚ׍ ]#X)b%XSJQ ATFiVrÉ8TQisR( B`P(RbusYgY:2Q4nK *x.C7p5lƾP#{1jt@ 71z7s/%0-Dv WO lF8Z/;BH&l;IZ LF4? r$z $@OUŞn11Y~CpZ]h4qVcxU~baYeԍ&A\2h!hƒ%]] P,lz0@@/\ǶK$2]J*{ɏNxITUHf(ވw (cϭ>g=w U}_#SmD,V*BGw=>_%2xޟ.n?7Τ#%fn& 9e'tl>[g4-tB.kD.Pgr2ã*uR|_?  . Ǖ.6ςK)\WNVɳ Edn`4hHUWiDbTK%jH@ ,eE,yIb.J FJT D>BZNgW+_oϣ>=))Z0d|뒗rE} F`䗾KO[Zn׭"QF&R0%ajTTPuro?Jt]7]}msitA 3۳96ע?YGu]V5QϦ02<0tUqU3(IQ{|#!{ JJ䈭 ݃J)_^56jIJc E_IB' @'W]B8W^U/bnmlY+UUK|wv=<V( aiG//w4= :̎\]Iv"K<bѕ߅8Zɥoi^ħxֱ"[[XO%NOR)Wخ^3?i_xOW HșQ3 7:QPm[WՠsV|]W*uQV QTɍlZT5š [d5?ҢЉ\+Pڢ!%DS W 0v8\DoQ-d'Loͮ4O̾o?X}ˌsGu#4Zı׽$R OCfD^ؐEUUZR<ytj)!ŖuE`C0Bxl2[F('G&,R*UUuTUk2/3[m4m;9ߙefG]~n3gm۵ZZJSd>S*VZQ$tϕP)TMR `T5B;E1K$֕"Rޠ^.yn/$0y=p'!OdБK9Sc%ވsul]_/>D[p Yuc }]wpXWftv7~F7_Ow_EUpĕQ>&ڱ uw&斊a5ZjDhv:ۚw4?p \g;1;y\@LLu p[Օ~Wu+_Ol۱iv_뻳;+7TzD~ amt]h?J5n۶p[{p\: ]#Th:v tfOQ79b=",$lZ^Ivxp"N0Z%98 S'9H.[F-G5BlbSZUNsϽa{ /rI$uocio [<=[xիUBQ۫3paz׏ɤ7P4-˵%-Ql,ß]wFF0gEוYè\CQfep@`$:-%x;r#u"osRDqdW[/h22 N/ 3#Ǩ˔y{KhJ) n^5.KelāרKڲԲe5FJVEh‰D#1\=h49O 6 Փw~bF5cu[1~'}۲uwl! qo#_lٻUQQUy{Ok}\+<*m_,k!x~N pF)35PTzjnAң2z?zBB8W\qx(2LKZX;Z߱#&PNgһ@t9"!kWҬɍS)edpǡVF A=rrn(ԓ#GQB֯S+ȍJ^_& _GӨ{F5G2#dԨ X:QCkjeX'~cټK<~.^z r3Cr:Tţf̯ ]՛GX3=?Wo6" -Xy:9 o!FQo1q9qa~2zrx+.buAbaWbr/zM\3}7-NcvһdO~7k2` =4/p˔+ ’k:͟ gsV/OK)+AӴVp8T{u4VlmlU`4ʭiT G&Mer%@POvzQBLy3p,F!ZLalՃ,}k0ٛa͌: *.zItgeqm 0 B+LTKX$v<J<#gxm;eskYE%$N,O&|Kw  EBoߕod+&ؔS9N~yx㇏ X68}H4Em:Vg'UU<Vq9sTs9iDKcV& כxyk}5a?ׅ]?1[:.D ͽY2zcV7;6_ը'3(qB`"hkY?NP+ȏϤQIӺ =K$4%?6ARl4)LLQ ǢN @Q5l*ZNadx~GWj3" ~\vمD{ '=ݍ t4mG֮_.zaxjFSSy>2#497~lq./-f'BRP׽] [dŜtF_i11I֭]Eyщ>4]?y}W]uxOobYWw@wgw1+wWd4cp0z48Chו?S/%dV,#7:N~d2+J!]I-Z ű1R^l D~Z.h¤RxJ`0pU8QI0o 21JeƏ4ŶlF}ZWT6  5j ( L+~[Z.FF<$g'."y*S<•WhoVʏ߻x=7^y\JQNilov}?y~8Oض}nTFٞ|8I)EmǎTW3%|:RF {bh*A(@A5;*!U^a,~T]?%{h1J<%?J/߰@8xMO\HtwI%dzT E4>˴-˴%wL'yd~%w "Nnj|!FŠ/\D^+K/+Ϻ;}ݵZ-cJiRj K؎c4ѱj"%2]\%=K`<9\ RQi$1< E'PJY)b==@JI "3J.QVmxs4]#M'mZm÷MJ\l4q(k fn}]{5ۮs;1Q(.Y¦dݿk__L 1J("FGr+V``y?HP8Lo7]=]m"ĵ^(}oI|Yp<_kGt~\{^4Kk4_X"9q|jDOE~31KM~S8PLb|ݽ/: a3,yw&$/#xl~R%RKt3$ք"f!ė\N(FkM&CA MB]k$|\hձۿtG0 eG(NfqmäzuPҒFxzYswFJ5'ctLEg>4|ϰ&/=,z)vo$a; \5H2 DÄaYQPUc OG0>>L:Kg9LM?w_cB6i ̿שР]'sH \TUg?;^az?Su~'zovs T:Ko3`XH&%6f ~CPCuӲl5VD ߅m5}JS9Ǝc()`[4P`7LtyT.`hhES(hB)v^9?9oAvBY B6Ϗlhq鵗GL͏|JgWd(vCU8Ixh#=tӴe}\Xv%(O>4z:~wTwvX]߻\)>1N`ld=/ +)<^_{[UW]85E6Ns,o5:AvCKI0ꙺQHĪpn(]R !'d9J${h9 QA==05 mQOuc"b4tRBC:$nȱq+<|p([%fY`cŐq^/El4y'66q;Uy <vl.?feU}6t=i^.hh-EDGv'yG/A]'>޴L#~k?H"8.o#>1^wJھ^{'hp쎨Yώt/K<||Ӎ_J۶bE+1V$*rt 6MlF#=7~pݴ8yDh:t]PxO/0IV#D24#yU4d9'C w=C+%eZ^ƎKv Aoj3χ(l+<~ q̗#~u3%NF y/k6<г:8 ]v~/S,F{ai÷1 ti~n?R+ʲzh%\yEn(u֟F$1~E`+ *A Qmp1K߁WFR-ѐ7`ٺ5{0*U+%ΞJX& N*V ?RT,FaZ_oH/EBlH1mB>[kƥo}g?E9;rŻ#zT:9/IBXaժn޼0TذaU[[MZkҔ&l^+—,Pۭ ӴS.W"ӓBȮL:㸮.B ` 2k0er#k瓿ku#QG̤y'o%IyǬH>;]?U꿔?;-ab޽P6o^?r޶yWb6? ~ߎY3{eW.p%T,-OSPȐR.)RTW2jQO4 ×RN֢Zm Rzx$GO|vʮzzRb֪S ]H#P6Z~¥,TB.^LI&Xs'J~lr6{^a zfԧg%\(RU( b5=Bx]vGvswg_ns'OWz K3q\lkX+W9~پyx@̃ (#=74Mz{mIr^^ֆVj@NZ>iQظjE6 UW<8#k;ڷS}Egߙt":vf!CiqF.JPdT,%S֍Ҩ4kƢ䋝 jf4u;rXeIT&R.'j]4 1ڌfv6PW>F2- 82ȼtiTMCJG;'_䕧^m$ӄa~q=0 Vdz3 vڮ˃w=؉QTUE 9g1UՓBu=|džƢ >7 {$D 1"%ŮBPU^}'0mJŴB)VjZNնeUJQ?DEBPbsy{Vk4|Xo՛UbhN%ykDn \A ĺ^i$T %FL4  EiQuу|zo`Tj5(D"j*A\ŵ"j`$wˆ/YߙKҨV<Z*޿pWˏ?f:v>pϽiZlq.7EQ=Ѻ#(j}rTUλphԧE'F~ #|5&ǦN>)ny IOx7Flڹ-:ԘtjX b!h֛|j6wvACzz&Ƭ.\̆v:zFGdmbΤ?5$phn-+]P~:/'bUUU۶)%<=C+,3P]I R=*}U`5!˥_c?v~ޏUW-G|lfldy]?W^xqXv%oqvI9x%{_GXBA(]=iUvk80oBUس{O(۷m:NeZU`'g= 3^gM?f n9+,%g-5'RuRyY*RF0+E"/Jlu ;U E"3K(XeS-9 [Mߚh>~_*ty0*f;OasFD+!X)!eF7p<ƺ 1|ٓ^^'WSR$=G$'iڌ&V߰\_נ+P+P팏L;E#lB l-C!۞>C4:hǶ} q]~/I-\esxq lڶށ>I_:[. A!W ;6ū{0|l۲DüW1uni+APm ˲,@Bu6j-'%h vg4z.z"L֚>mQlټ[llDnz秬;׍ƻb___ω%E412J8Ihz z }kVK%>x'^2xFѰ"4Q&jipt`:;IptY.`NR(~}NXZjd۲P<ّqSDXWH"F8AQ_ö́WKJb59Nvdi H8voFv^d[q]PT${ϵQ>\ɽk09Ы)w'K/DQpͽ%l̿;xi?_1. 1FV~sDž'j͜8s#m6͏Jg)ߓʤ'''W!&RH2qF]IaJ4dQJYзz-h=n64*"zF=&:0#1\M#\!k5I0'Bht-Y3(M(LLRH94ju ͈r>UW}AP7Y}f[M$hgQKW_;هw_5 IDATM-!K=6cGth,B2Dxd:IWw==Xt&E(gAay*݅RTѻ_x8~=}PT_Ϡ@.E/ߜ@`X /eSǕN ,BS' Ţuǥeɰ:JS'GW mHûiD^'b5DSk3h*d35UIǖn=ˢi)esTrEzqq]q^zRN 9EA CDqF!mHMG(/)!Ru]7auWp׾t%lZcڨ:X;CfdӖvۆ>g;q$ѷa%Cpōסj`=f?6|'C׵Vr[, i&oq@߃/FR:]9hͤWo;a C/рqH/o D|Uj5*SSXF:!0h MT]''CmH15tĕjXJ DPu ٤41AꡪH g&b^lٶ ϒ=zy7^Gw{}bosf,tJ'PsO>_W^f2哟 n =f.KN1 -ZEQ?oR+WhS-ܯt.f[0_u!~C4gW .{u)?!l6'y\5Ovw٘9ѤV,QD4zW f|h`>Fb#QμNZBoN c>s[Sz8cafjuoX^pdzU'Q|ϒ.w~񷷷z@g[/wC DTo]NGRg؝IZQ}V_/&ZGyO/߻dž۸toO~\L^HWz*?/YIhw?r1"+쵃ڣZs)yK3~?D!}={+"_:?UUYw62ʬN߄1u@6R Xrdo7 Z@u@`uX h/D۟(Jd'`() "ǏkGM۬S=.VSU^ r di:EQ0&~4Mm޼c{%zcqNzrKPJch,ZYl_J+O䲅ɉ۶ɍmpcThZFuj:{0z_w63sjffFRjxN D33pAVAo(E4`UxtfHO{_'WUsZ{WotYHdP$H"1|8: :DQ"$QD [0 I$ުk3[NCt׭n}Rױ9>kæ'}:L/f1߻{3iL{ !܃dPJ~:@[e+>v EcA+2!cSwM6Q(Gʌ:h*- 76 N»y/w 2p<j'}=( 7z`=]x7vfݦ;F$iUQ{2?vyT_{%?h,>#g*w#0 ͲmE OV`E~o;07F&s0ۄd[ f[`9> 9J!(ڰ̽׏ J0(0!|I$w1`p_C"OƱ> ZLjC} cD$A@`;RUvԶl392-Ȫ2ܾ?x~~Z Y_5k֗vKW.VUؘLMDt#ۺӃ]u8=psN0YN374j$ 3U*{.'m1pU\ɊΏ%x# TbDeFo,@),Kt܍>Fx|)3˂mcZG)w96{ w|FccdvmuVsm;cJr >m7r_^Rg)->w( *+~e{PJy2"< =dy|~c?$F=fQ?ըtZbkuq5x S05W,X~SBO.^@5+V- `zzh42L(<ebT*<6,DqhR YՠE"PaHn5_ 2![c>Pvӎ(MWsU:>?4qB$ƨELm{a XQ@5M{ [n} EX%_P(9SpAP9-M;DpԞN_ڴ\Ixa"Iub3njZ|cC)J { 1rx1jǕǨ^*a|!G1GH4Uİ\&uz×q/a`ھxuvv;h#t9 eMVsAp3O}zYR^m01(j6 ) F$fDbf;-PB!g e4bN"K0}1݇R8l]( lŎ5@3-ˎɊ\TŚ|.H<˅z/LW / ?0A)=:_M dU%f2\R?S|d|C ߌf x(ex=k>ٶ CFL RJE[[SO=K۷oߊ:^]j:{r\Npt]/NH$Ⅶ>۲a1!0Po a"BR#I*>c&@H DO&zi{޿ZF{C^߮߈Wq ̙OG}tGG pŪx4Czih!jko GYvU˴BsJ%Y`L`TCu;rD pŗL?ЦOb5x'==a;USw !,v,F_d7.]z5k?WZ _tyiY!UU S Rhggvi^4 +dOXeT? C,)%R xJSl|Ҫ:qmn[/sm$hZVyQa>л ?'ȥ33_ (/t~|qtɒ%7_xw}?s^GQoZel=nŢ٩B!|1ڱke#leZ(Xs##U䩫[o4 xR>r6Pa @j ϡ44`545 'D?c oMcW.6! O}~ y .';ӲeJE@^BUS3[RMrP%#.N8DzQG)kWd&$КW14߱ ݯu ?=EꨆoV4 L`4\?Qo: c {p~{i\bJw?,~yzhPri`sKSGCCb`"%%TkN b眑rç @ml2:6<_F:6#=XmM ؀3hmy_հY 4x#DrlBiܦ'O6'±l~>H ų,6J>- ~?X#d/HJTlim~&Œ޹kvcbq"^ ;׫?xnW<~/fq ! ˲DXjHGc{-M@?Q ]D:y#h%#w<{0%d_L))ܥKW/hˮwm hg\׍ hZŢ1e#!cI휷`t@y(a븚I=u+Y)e0AVU!LG$ڔD(HA?-4愀ТQ8CC,~&냋r#Քys0URv]XB!&V~FB緉F# D(Ϛ-&$LQ!i)\!V.\|}Ş籚 ,2&IPt 1q,CFC @T02 &ɐ_@:D&eed{z`aXɖ*t{<2*= 0LoݽFMWq^yE)}VVw6`Cˆכrf͞]UU!|USV]`;oOǾ,#9j8P,Y $5&|jiMiJAMY&ex!o4LqGs P S~dkMȧ7"ڐ$ ]`Ϳ|/ypCC2/E.zM)-:["W.[] >8b70晖ʮ1yLUe1UJ(ErfZB8^_T8\d@R(0aX+NE@6?>ͫJN 2A?ڑؘ\`ψk'Lwn ! {|⊡.]Ve !~`eKW׫oWK B)+N ̫LMۍ.@h.e*rSe!glVfY !@mkB V1uc Mc}J4$H'oނǫn/[sYz-`Bmފ0~/w<92 ;;O,JtD*/9P8TTZ65~( An?m@9Fqؼ?z:C49H1&gĄLAn=JR>|_ƮBQdh^rمZ}ipC_vk^bmؖ0 33UM5H4\tWJfZ+uPD9iPCA)y{r؊:cYJET{+M5ݸnF(.`aT@ snD>A$.8ko@i\H^߻l ^w築^afcOw߉ٮI,:~yb+(3ؿm'$(c/QS<$_ĕ7ٓ P0ؓ½]~OxE1sS+ߋy?u2L0 I;wWq {}yjp, YfsÆa]e$Ir yc[Qq2m57!8(e|-`?/û'U*.!7Vo30?-cIge\0#\2ιƈEIYwM޽z\C2n?}v7qPRO ߩ^X$Y,[%xX7&11E u bYxb&\ہk!VT,}`& GA$"IRp?}/l-Ԑ7^'/6%M`CAQ,;7݊tc_ҿ|W^+/OyqD+Y,BX+JI7lաIDATq(,K 1eFSJUTs(muGpyr6b6+C5%O硜sYC06f줼tOq ^3>r!. Ȳtpa& F;wtoOx-J(%Ǧ_,{_n.v'@[r<>ac7~a?Gn=x"|⥻G-8DQ|cS1dɩ9atO8TH@˼c) $ )@88d+\<@pm۞ߌ'n ??@V\pUA9c σ@ׅلqzUu8 {o.G2-==}ۉ䷒>{񹫺pri59*PJp$E2(p3B x(q\+վoo1l4M"֘D}-P4:WLPJL4%G(iw^<􃿬jT+c_@8j'2L ^zޟcתBJ)4Mnֿg^RU3MSdCC9a6`/|kCC'S9E{=zH/U!P"0i1 Or.[H ퟕ̴TD}; C(E əP!s O\Fa ;?hRʚCħ{̺GG3|⃸ӫ*HD, !:A<<н{lӪ#@[?kwf;#d2ٹs~IR}-|5PP @>7g !n(6wD ׈]Hb,!(M}OG®Ξb9溮\)VEU*" ?4B5JHc`ȧR>q4W_`бldѿw?v*^ܶgZq÷EԐhP~S3Ƕ`so>uaM,uڒ^|~e{z{ә  ~ՙy@ _x eАLklL(liP {{R3%#2'ԐpCkPB!( UA O`|_ V㠔+ ݋{k+ص ,} ͸W-PʪUf&s] vbWсގ kPU9y+h.Y֓Hmqr:nH빞܏EX?m`>ghښ bxJUUOsV.TwV>_g1gެ^\@l9-DMc\mWm;,+,"+2@۵^x\3O+Xbf̘!D9;4]z 5~ԔO(xԍ%s3yOg2]uکB1ӛ:(5 7C`ÊeŽ:(\B\Es,CP>VN#0"*pV" ՟mjlutý{ ضS~x ӯ">~~׎oxiI " ,[²mVFqbA劢x9m-/8+?oμY%Bp]8QLk&eV2H3H`pǽ/~76Q !gi@OU\,M&TU1jJF4 MSJ)G9QqG3,rc-_zuLɻbU~4&ðxdXd1T.u t7 }v:#@˲T_j~69Vx^ثF|+P誖")USK$ٲ,9XYmZoOja.]_i՟{pc: i!R¡d+ EB q99gii|!\# UpՕWN PJ\ʘij!F2L bO B e b{ plҥND?R[(PH!=/,["ی2z,Kw]W.MR9iNT~-[V,]iuQX?hQ#I Ñke]K,9gX!OI947f360]p`3Zlua6~>_ګ''$I&cp]:\Ajpw_[(9p"2trBu]X,$3B˲BP*(e79!ķV~7MZ eۣgԄQ) 4 !^Xyu5׃ng8ހ`1YAj@+1fi,1Ȋbpϓ빎*m۱`ϻ;!,YV}S5*!BLIWRcj59g?/ \v}_!XCA230 3q%fנ cF6Wbx vpAg##*CIDATXoYv9'4 1XHH -lذbآZHDqTug|ۡMz3+>骮-׽wιoo} rff4M+a !DeEJ...ȴZ-޿ݹs/JOBpr<)ЄۥR K)30 ?}o0??OΟ?WNhRJ9y|v}ebbC)\.`[H͛7z'yN!4 41M]בRSQE}^#>~Z[[vvv0M00 ]ױ, ˲R4 ۶vSSSEo >? >&bo %##;iXK>իWf}}It]0 Ef"jUiJEϩSxJB^gkk 9{,j5,#c躎,˔&*Pd+8躎yuq:qi?mu2  A j111AݦnPi4H)x Byd!#$2. <?mj'NPB1rY@S$K躮mllll6pj7nEi"`bb ~.~IؑRNMM(JO^ضgΜٗڃ$ NȲ ۶uB&uռlL!"(" CU>?~qu˲eS"Z?IR jHQ*|hۗ.]ׯ_m a88ܻ[6B*2eyNVcjj MpY;xe,z`ڶ-LIJ,u[\\Ts0-(뱹J%\egg}βL&IjYl`ܶsjBRgaiw_^;64BX׽m~d@@8|d3kAЎ۟޽Gy2%tEXtcreate-date2009-05-05T21:23:25+02:00]>C %tEXtmodify-date2005-03-10T03:42:56+01:00(IENDB`luciole_0.8.6/images/luciole_logo_grand.png0000644000175000017500000061402511437126703017523 0ustar niconicoPNG  IHDR|~bKGD X pHYsHHFk> vpAgOAIDATxw?v6GvKZrNs%JFEE@%J"9 s9.؜Lt/ʫ{ytWWUΩsNA6ld# +O]>u!ӆӆ.̫̫ͫO^wI%yvOrOrOi?XI;ݟld#F61o4?XdYdYdMoRIqOk]uֵR% qnaaa6b+gy jt(g%}'&7rXJVӜ4d#F6߅"4S9rN1|VYfyrɝ'ݏbqyh'*Z%pLk7,ұk!g)snפtc{Q);%8I)Kb{ҋ^SݩSoJRS d';inP AQv~0`A 01F6 x^(qʸƇOJ7w)#Jz;*e ->|ݙXR?Wcߖ'|32^ʆ[{ӥ랿Z@ )IzRbx*-bˇcfC]CCCpǹ+ GrZ9&QTzG_LCld#Ɵ@lr.{t˺t:Ra"\znt\%] | :0MrӀrp>P1@G(lɷg \T0X"gŜD'iR^a&a]S}W}W}7<+/_N,r߫߫EcX4&\eW=&ld# |5M|.=-?{X0w4LF WK-K:@ $.x (((H!D <b% H'T D@TTNU:&)g~*dۚkpǾrʩrkh-{{;Uˣ3o<jB"W=7ld#?抒d(YP?A$D ehrj츮e.smZ֜r|]t"I)( @2QN`/SԦ?@D(E-Px4SxM@>j`jS}DtxP:M[m2J;ja[ upC\0hDF<)>ƳhB[>C]cGw) \y9zĂ-k߻>[='>[ Q<=>\/ Z;Wn3wv}&q&ld#? V|X!9X`4:"bD.xw6G?(IR]'00ɴPnNUүp pc{4upYܷ6K R;ci0 M.`33'a8r* r %MzBХJ^lfAP.}cld##(rȥ" aV¬Y~o)DIxTD@\vWsӸuolfnJW8Nvm|,\^:2P`sR.INe?YםdfgM@E"AV$j(>ٷ>-mV2aS[7Kld#G>wzq0aÈc8o٬ǻg}bPϴ8 8,; ,~0<6m_y]pn\;Rஜ~|c׉\ȔgE r Qj >jljz٥['гld#N+Vnt?AŘ1+O3L^C+_)T q&c;;px\ZyH1@.T.˽Ĉ0c[Z|N+1 Y.sTyDor:tZld#zݯC )8^Ž ;_yF:@&+ǸbR^x\t+ ɖGb9UNb$R;d+ Rg!ȵr߲u!mAq.s]̭dֿ)Ȫ"^Uld#G T UCU|*D9IN E(L@2E+pXxVykRI& xA!la!}[KU$5ֲֲ֊cv6;ᾇ{UMz6ld R7cnM6dXbnq[-ֹmwcc yA VN*l2R!}uʀ0[g:"\E@NWdz6ld +կTR!WZŴiٗQigV"y yLlx/N?x$R_fÊ+(e1 oF֏*nξ| lZъVWOOO=J jP2.e\ʸlBF6lW!p^ydn=(eu>222j߹s=z[OJ2+G^O@Ėgς[A>%J qrs@_1_|iR^~^׍~u?E؆؆؆p=kukF6ֺLv2E4q~yP={MONN޴VVVQⒸ$^XWK yPX!9MHΕsH!8SEHxcT:*ɘ\B?(\Y,f+e+e+ 7olBF6l-4ҜJs%%%eݬ}񣅏>Z}r@r@r`+J5*ըTo&IZ&I ~5j8TΩSĤyTҾkc!ڋP)w. TR'ũMym=pW@jϓցl2;Q`ޯWdM5E@-շTJ =F6"վ}W罷/d_ȾrZcFjjTjTjT=JćMt>}ȏU*VX]%poXfnoH@oeD$2P[}lk8Z;t`} '7|;)N1jгe&BKh"gĩ'l۬/lcX0'#M[%57,ߕm[Z. \c\oɛmIlɳ/Ϯ;*xL3qĔ2^x)w>똹wޙ{{%Jy{o1)W|^ιLtSsEKKKxe#cncncn9jQDI|,ǜr˖HK%Rm8*giiɣttt猰]=%zJ7 /HZjV:c-o۬E9YN DQ|S<#E6l־{'s=zԂ7{ÆWE!ᒸ$. ذq  /t%= A1(U?UUUw#W m (VUA*+jSm6OUs\Ea.vw>D8< }hGō0%&0 -rj騟B|ç?|=빏F1Y?4I8)jC-7?"WUkgs5̻P z^>O1҃G,4sKFyy-A K.p־-[i(QFo/q-Zֵl[-2~PAA#c_ľ})Nu:\/Mr()JOa &tI d ,:۔ .p r&FQJ8uCX38?*of~^_|M?f6IIILMMlMMMFzzz.~\tXaN{?o[mնUvk7|:֔ZSj}l賡o>Cl? ZA|D\D 2p-*Lˍ6cRfO~5j NsM.YY ,C[繎@V@!ޥOQҖ'5H.e G~q\73$~=?;8 uHtK`NJ*QDѹE{~s^y?:أcJ}ƹڟkh%ZQ$qrɬ?,~ y©S?ㅘ袣ddd*+ʊb---=ngggTnPg3j<)"EnUeUY}j a  s\2{!/4F6"]tkFc'u\ޯñO >}r0wr/bip%S܆ ucnhnhnq7ՕTuc|j>e^ K/yAԛ!-1-1-mx!8nNw1~c{+W7YduԨSN~ i?\˚_꿘::Z@O}8ji= *O4XLX~e˗_LjȓH"iJ% f'l rf)mcS/sOل^.?\]2~mbzwk`b"滥M^|WǪjG ~4V:6Ieƃ:& F ۔ik 2yZ`yscΔGGqB ,Ц@ԭTRJ w>y|#:ԯSl055%[?~nG|G6a۹i4uZ'B- %ْlInԊjEA7>@ xEa{M?mǸ >>>MN&'SlUe2Z49L3   ')Jx9@D1Qא[?ȫIW&Ƀ܏s5ѪuZ!/2t_̾}1GZD"@ԹH|5o ϟ>.OuuuNjf)grwqGOx>6M 6\+`. ,kր+>xYάL+03Lk' Ȁ36?32s#DCP4축x=C=~ل?pXݱ$^|zeZ<{*[Rs],c-A+.BWj^#D|Pg!= Lz"x3.x7X&62T޶v{/}\[T@<< +LkcƐ!YqdőP[nuݣ,?`ƌ9ve2QX'}żBƒy3UK^2_}4q>L`"( P,ߺ9;ի<8Ww+bѴ8 D-*X/Wm L- FjsW[Wnp(G 2gdAW )>`ng9 "Wx1ƾ< > rX'|O {"BDHp$wÝQ,,,&)-J={_b銥+6(壔R gx-ZХYggw}[nաB}hʣ)f\re)wU)qvd ' B7#CO封9zZLkCoSNl#ԫ ;H!K1  Sj PXJ;9-++; Ӷ JSұōō{޶ۚnk -ro;G{f;,wi>,;]whQb1Ş>PDy?&WNF#ԯ@09d|"˹ =1 #`63x#7Xj, E٢rmt# J v҃@1BT*fQqf?M"g\Zr, ;@w:g[n=x\smw~6~7-usݔNv3wnqs4r3{0a!scɨNأTZK1ϺwEy;@Ek.{.=Mos#=<ܒ6PQbP/PS^l x_s M *c(Gq TeH`LATUVǚ`$7a1x7ޅ;cH|?X l" "&GMO."~e>ke1R##=qnqnqnqa-Z|;vm{r&Gё kZiŦqŽ^7 (p3#όSvڡ?N;miK[%sU~??enf>y7()Ip<ȹ=*  v9󠞵ɑO#'OV56Bܫ(+5t! YC_s9inSp茩S3_l7驦=TS 8LqRq`zr;{Κn+Y)Eˆ_wV]@"+uL?AƦ`a i!'X{LQ/ãK?^^^|Җ'O9+c@Ve9 ݊Vt3B P;ȻI㫎:ꔌW_}\-{ϝwM5!s,㕏W>^9R)͔fjׂdxeK"e'!b @E΃=ں~3SQ1<֝+2ޑG=_4vux!^n[&Q=s{,(!>"|yEDrM |&u~>Xa68vjXx5Bx/r MO!DX#S[΂eӏK9r(Ew<b 'H&+hϢ XGF BǒI& _íN]+Vsb;HS&:۟oJ+m#yI#'O>NvʷS;zz顧|xrMxS8q8D,YAҹK.Dm )&i)kʚ)RhK-s.TRQtK=v<:nvgvB,9Yq5Ԥr >jS xIξ`^gciH[&zW'? HHoVQ hE!CQrLyx>؃j.ݶ2Z}~bZEt;Nu f} -|dM˗>X수$ibڅ`Mnf;3HVZ9\1DE?+\x7o@w ؐUO^uD~qOT`Ybs nn\nd0'4&Hq q 6Ӊ'6fn g[G+쿩#(f2e(l׶_~mȾ)㧌2>-2 W@\{wݵwWw;xc3sZpZpZpERN};rީR'Nrhbb8Wu.k]|dC/et3xxbkI_.QCmum-Zp]a/Bm?+Wn~jvY(((N?z:m2F;]\S~6FEEDIJR no#qqq(~ WaKq<ڵ:tSا$EV6Lm'J)8np.ǜ&QNb_S+TIeC aǝo{''ӯNN|i/|y1'bN4x.\e@z EbuF7G}W|œEZENpDg%r8X9Ou*$Mn e`nnNf›&Û7LSMSMS9(fQ̢_oUV [}9rBBBz)V # %_3q`00Ho+O8vr[C\.2F׾Y\+ӠNRTO`.6Tl|,5W׳KL q@wc # (Oq Eʻ)Bj3ܠ078!HK 717(E5b=&@Pb&SL P5EM(pP[`p.w @.҂2 3.t 1h8}xg4hPK43_T"jƫns]>g(` j,qg5-@SF^ka5XHTOsppk b7D'r6f$+DH~(:X ޽P! 0h,`,`,shhw[poq;1Y&d|R9fp;vm[RkhPJ}3Lߖyyy5FFFj 9dO.Wrlɱ%Ǯ4iȟD< s.tN:UTS˂- 1$σ?oN֖eN(CZ3-䑀 &m-TZFձ]Y0W@mTx9ҍ;ϙy k 8Vvq}s~p[;PSr\(w /JtV)`[] ;f6XrQ}}-z*Sjm&jZ:"!rLP`]um`䃑FZ}{G߃k/_o^ֶZ o7rF-g'Ob_* Z'ǽ&6MlZqfsWsWs>}.\zbGu\szp9rY18<}iZsxox?6* ۱.x| VV&-S-bSD%roX.; xl=[KU_^{# VG|G_@䎆 >u<`^ys<ңK.sF(-x!MtZi}kڃW>^}jގ={v 1dnݢE/@-gnqx-^(Hp5s!;Mw\ lcY^4mH'4P w[¢c&&D|M;C]׸q]3ޞ:hԨQS!g 6e>/ c{5߫^̀\sO;Q&EMj-DZ!n2չs%J>/DHRvK?037 "qL$(6P3&؝5ig~N܎yhP4vMHGݽu~IzПN:ak92w ԆNkR{#iRUNTdɂ^ pӊ +b BA(!0) *~%HuJ /Bvw~H|8gSrթ뭇y䩒Trm˵-v!C‡$;)(չ153YAN9.1^e|HSO„ i`(Qm4i;9s̝/cމFu(Tұ%Tjboϡ nu|Zy]uzX*Gq#M_y $pž- 9,1he] 3@:> ^GvouWNeuEfq GH7ZwQ쉉R9v~۵a>kd^MQZVtB- jYdM5Vtϡmd6^G.(.R N-/~o{oxpbk_׮סv}ZҤ")~j _%uڔ=RŠ‹[aK>kA81ҒRS_VOn(^4h7uyW]7~ͳͳI>[C@uVUg Đ`N .< E7=P33 }h^W^ߔ(߅;x&$"*zj=^BOۥۙ?>xaxy偗{#F%8∳ syi">E|\xegLZkm~tRtRtO=6yl|LB 'Tmmm}lЅ 9>r| k5j$ʽr/L6K/P*uN.-۞y\k1[)x,EWiXClbPpDS XvZ8CySP mEu B#"*@ù b1vѓ;v<+籧HE{kb11+[͔~=}m[#lѼ#=jG[fdpu"@Q$ ]{{~`"+ΪAnڗd5iLTz0k݂Z2-nHK!YgI&/}"$m ׃ t4Js v^-<)r="-qŕ+믮-[x2 +|)/-,,"O:m괩0xࡃ#[CXb--nqk]r$O`=}XoT\P7V,&5[["N$D,]^{M[ͼBqKNI9=7f02289sqO==_9#Fv+UW=jwB uW?3çO 6w"-G6̵WCirmfZ\kt=trGl?&u^Bk]  "OD>)ZdzV}o|6:+ t W&vug~m+t&uҽx Zxa / tx%׊Y+:Ĭj נ[]tQwzk}7 9Zux86=ύT"F ʁRUO>nc'g^l'F\#]^S)2:uvy[Ş{yiΧ'gMW![C׸H˔j`EC c]SiVa PlmT)qԿݔ*BzԢi!91~[kN8ZZZ֣_~eg>=|z;*ö9󟀭\=Nq(mi1ȥ5-mxbVQ92OIOx_78x#yh?bE/^DFf͚5k҈z#/roh\>u"ڥ}? NW06X[4\ :C} ͉OxS(8 J{CUu.pCNS'sXؐr`DD.ѮI˄[>Gӑu֭gϪu[5omۑ &l]ԉr >>kǮ:JIz;%}cba7ӎ-}TЩK~ŵMO|)gз2FNd>:27ÿ 7<C>j9A O~=d2ؼT8}ei`-8jeHĝ;ߟtMO7ɤNM;54;Y^{qEhRI&=d?BKmHeW ȉ@b"LC[ Uي=N?'WBg+D"W ec|%80[-V2!sdFa/.j(n]ǻ:;ppr T aCHBG-c^yyy_T3mn?)1)Δjfp]M<~ӓ-եuN׮T_k '\QFUU/|-ZZZINrܻYCaVΓuWD*NO_2:wf(ՠLjڀ\4fp\ǞQ_Y `jo `"a'@{<g=;|UנuBjB |6_fT{Yښ-O|}ֳMԤZrVVً誙;jh̭k:y> ӽݵZux%^"?eNU4NkkI\DפF㢃V6Me>/gC*頦ۖ&_tZ2ZXrlv,IZs~Ђ0T#H{87RK 6)ߤ|w]wQE0缞z?zR!m'H%bx)K( ( %i_;׉c#@ -5nݯLi2-^{N8=/kmQXyq[oj\u!$HY-L+N‘$m\v/^92@1֓x*vۭtq^a)xf;[v"?0kѬEA{={  -Pbf`|VHU&ۅ}T L@1LǾxah)5s ݀ (- p,[ki   2_|}f"(:XR} >24uqhj\l/ uXΑsZʁsy6&MC"JUFʗ2:DKZ|+N< "X0ᔡay: jN[1;?ao^ְJɥSIp:`gehbYo\EE;vVEk҉MD;ٰOD|~^2*3]'>.jht'QGk}ZjnkR3Z2S\#ZwdXX|B^7O`m'?˻*謁>ؑz.\7TxP`'/`ju?8 PQ&pm ҔL\n;UQ]P@'3eP)mmFp~ۻ@Ȝ+3*SxSOj0Dq4,*7Dor%?8amo\ftqJjg'ƙ6^ǟSh܅վ[\I!M(J> +%s]B"%NTߧ6%:vM]& e/;-[kGO3ndȸQ{;g8+ XI Bݟud% js=M/sΩGw01JV?6 Ct O/Lc?(2Vmr< =x@63,U>D] f{>aqTTs h( 52x|?]EerW_'Iqn˞tKBgOMAiކ@*xcYbI7<.GxFԎIOҒ<7B، 8&֊IGZfpM/h=ak/?C ci27[k)cJ%E7^5ުCzͳ[AeΦCCN].hW\=Ș gZ^F.θg=@ڢ$X;rNv JZm9_^xhsڡk⳴Ϻ3VF6w, SO̬o։]<^;^us/hhEϰ_߆WD˙Z;iSQƯfqۧ<MWjtLMIP kz{st:ճԫ;ۑJ{( Ja?ރ'/yMcޱ'rZQy?`ii JuR٫e^.rIb[B@E~p+5L 3 ]Ul)vd(]nO;QYv𑡿u-1œ%ףN&,̗9v{+ϓ "IᲯ)oC?]0hӈ45rs7 89Ԃ:^][uvmv:XJ,qZS«:roӀb ~ K޺wFZ>.B35f{GT[Rt_xݰO\NY>gD9sX]h>|@;"C̱|6jGHH g=K}k,i,i,0}Yg]֍[7n`mF«< Irp D~-Xq" *h~0h2n~Ci1+W k@1O|›8O5/KpÅs=yѵMgLB&^dۄ;\yML9U=rO=JV&(?*@9[ΐstU-Ckz,^<=wtaQբ>h]MOMOL񮣫F59[?x><&ΑE~l/v2/*梦PëýNckO^LwfpK%dJQ K{M? <1l%fiQFplry%8} X:^3y[dՋYkΌַ5_dDlGKJ ʅI VKf2]6I}Bu \~۞^53l4דӝ:hׯ[P3FZzjn"hh4"iYΪꄭu_MD1nj2޴V~>2i5XԧZ&ͽ [-m;U2sSy@n96eEKqP?G[7w~E] ?Oݕz1us %:ih>@M c=`+'Y$ DZT.w!2wBoDPd30\2\2\J+]ػwRp^amG58>W! cc#Y\q6oc@KCeS凲%`Ĉ d B1M#))$ KN,~"dHVR5rt(h)z-:wتfXaa7DVI9z0[ ITl9>޷SŽܩVԊ JYx󕰱շf==QǢsASYJ q( RGv(Z0L\EYN֛vw("׃~{u LלjEML׼ e9wZ{jdUШբM5lkn/Ihq [OKI_Phm2wUY5*5N?KW~dq=ZNtY,%:Ԧ("s)L̚FOh[lbߍ\h׷"LN(Gu*És~V_ufuHt 4! )j``ڰvc#Fxr|X|X|on6C1#`nkL~JY6)W_q#歧|KN@KE=c2/ܟ]P, lρTRH5w1FF"A<R'9%ÕnΫ;Yz1;lߏy6 iżmy8y h7Cn9_f=Az&?ofbriw'lEl `Ԅ;vᕵAԯgqeqyO9-&0mXڰa/Ǻ^Z&'5/e}Cu2UG?ӕ=,tzЩ7/דW=w#i`>bVUi 7s!g j W3i'ЉQKHW1N ՀONn59r*\8+'ާg_ Ή  ?`e_vs[n\|x~NM ƙRfɱZ;5r{VrAīMaSD{Ebu16b@wVq9Pдb_^zn y~?2^?z-'<\|m8lߪ2',ud^(C`pn.¡s˽7ӱMCѕUTjIPZ:ѼɩI$2;-D-K&w T'h0+Mb'/ ]wbJz׳+B ֞zj.5O8:{ R1u4ʵ%o&o㫇}e=Ⱥf:R?@֞wO)\+A>ZJ +19vuʛ-6Y52됿q\"ăPICF̂G&}uD=}\p%5Fpww91)6)6)lmmMd)y6qWXu1y }oӉD5(A]-A1HYzsw*2#^j7FtB!߽WM:-"8V8]p\j-'2Hp GF@*IX)KDv)z$u#tڣpƆ;}4TDVEq:^ͼy5;ª *ѢG?>Jy߬M:$/|$9//agxl9#};6tkX* SČ3NŭQ ]Gfk 64?tt}up؅^<>O}C K*E:Ӷ$zA9ee\{.NG!TZŜg+nvp+Wl] .9[@ťEm3 CshЦNjNӠ;;:r,'9d7?CC,-,/8fSp-$%dXfcZۉ](+.ːey͗&エ)*bg,l:9l{{\wY5mw=C>ur>ywѮj2/A4JiM+]5T' >旄ka"7 ZяSy 9C#K?Y|~p}Kp)%lBװO~ w>]Su(겈@(DQV|B%wEEL15BΓ~5)~9uXBרdYL6_Zk|֭_?a/ᴅ5ywb3Dmlmfe'Nc]d\xnbokk.c 40B~s Lb s-q3=rd#upH.ve]C#WYi|B6_aҝLQ.hѧ-W B2ug,a |a{'`nxÒ,R^84"+%#`f¶ B{ޟ#]`N@/0zm :S_:/+_fƧkkD-)L d̖%Y ֨ {hH8pTCkQc-|VKv~dI>^Yei6,hF[Pm^4ќ>j,㕥~} =Wib+SݾNZ>҉R iuΆHH=pBʼn&gUx5.\|Mc!@wsk/?y3Ǝ>B{Df>.~S3M <<\Ґ,Y$p/3=D-(썔Qa:^7(I9;-zŇ;!y NDJ\9_Ζ082GM "~rxQV9,gE!<{աbOwsyG\I[&Y[s#mnz'?:mvp$`xW:f8LOZ! YN+%%کeN=){[s)ೳɧ^ZIDbX5_gθ"cCtpQZY"Ψ+_=:]s̩9K9rb7]+v{˺-붬dT0uzQ:s0oD(ڹ_@Dиi E]_t/,_nBJ~%˫ܢo#RBY*Y#"L.vy[q|r84KCF=uSzO1z̗3$ݫQeW X1#JM. UV{V/g2ր򮡺1j8$B<7[]^)CT0+74@tE"PjKI7qmzsmw21ϫ5qj۩( O7ZXUah-Edq' / xg9M^5:4tWۓ㊏4Z94x)]#jk؞Y˚u&LAQ{Vhk 6)'rNurd1gHWk_@ߋ4Hʭ F[ (~ IӞ͟˙.uڢEAw8tau-ΰr!mVr\J~ -Fү:?#?ZXZZfm 2mdvoZ!6j~kWb13ēh[0`)K<9olZ` $R3wc< yRshܣrOrѽl_ڄqAB(cg]O9F}}W?_ٷ" +¤A: đQ OXqSIƾW߼zG˓ x9z-r2>#O:cҒӊ5敵eWF#xOp:bO9.|?9^kR 1M8_޸' &qA0|WnfܼkW~p᎒cKrJr\y-Ϝ9]q'h^ir&٬~*`H&Vz'/~VЮ3D&_&<{Vtx=;dHJ{jkrehT_Nc=n]_ סfZΌtv"tn0tӦii[ ]-4֏gviW^zF9݄zJ[+vӹ#kfڹM$FcÝWvO\~syZOZ{[_yk4[7 ^Y?t_~+vŞ. _ AjɚTUX{ݝ;/ &7[F|"$X&9sȍOb~OwozM^&mCY_y7zR RȰް0iso@qf H!TRӼ?;Ίkw! 9,9  A%H1PH I%I9<{p|w97+/ҕXiT3az`|["_ʛ*'ڍ7o-''{6ZTn"~[nkҿ~~͌"gwgçqCjľ#*/o{NVMkbO ) 7nU \  ^8d|/ߩ ٷf >~ c|ͽx͈7F$iRQ}KOx:|]EA/Znl^79Xȷ5`]j>9o4#GI\6Ӫd?HMIDAT]B)|8H@nmKq\ȭs x3E^7VDH`}[ HÖ.(.-^8vս}$84c򑹎?8q/)] kb~ob·xL3C*>8Ss#pOLJ)OyV%$OL)U_q׬YmI7UH <q4RNqdĉ&!^V}yӼҕNS߃߄::nlY&PD;UZG&@̞AEA!,zycl7^9C;N&%)OtE6&`g|$~8:)tWFe<;/U#u?[כ\]y˯8M;|*jvjROܡz֌323y6oI. tV|!] ī- [֋]녁N+iYL򉮋_Z {l~ظpߕ/B%t`L.6EA-bv|%_W߯UbۛhKY oWEJi ?|y76Ǝ' ̽Aۡ'CnQ%FF{mӯedW``Yr$XWT-:kmr3> &MJ#&򥬔U$' o7RK:8'gc)0ꉑɑE:}9ҋ%{֮کjzYMu ru]v7dڡvNL9CTչF0EHkYni>rjکҝn@ 8qWzmz-G<0e]pj'SJiz|7j7~Q֌j&H*#(%S9b!gޭC>JNW7Q@=U˽oa~mjʬ([}SSQ}Y{.?\*!3}qS ˴NK9sR+s;9c ^{nO֪w߫<9yEr/JD!DD"~︎8Kިf~`y}5`lJ) / E9 F%G% `Z~$twB86:;åG*x ҽsɷQQQnO;s97}|/WW}}S$K_+6yJ3Kr~1Ә%#)Š)S#U6|)o989ozo08jw',$*1m+H&&[zjg,s'LUs?+nL9پvVMAE>}LEDq+@&1%(!\1GmikI7Z8AjIe~&5x͘/|*~Xк3A{9v㔳s~vvup{3ݽO< yNe g$dڮ6< lY!bfe%e_vq-fN1y '߬//r!]:}~?>SK%]ES :qeǔ.Qcfշ[ )* bWd<垩7ݙvv{O-P.UjqRo甐Q}sTOW9||]:"+#cc7z6<iK8ivu|}?59+u9¾C]ݻ5 hC2Yp#@u6W/iVm1RK\QsS.$#yP)ۓ^.Y QU@eUU6ygmϚ/tfffl֪b2/fg:cn~"}H#ĺJ-#{]N͐jYN8w{;0Q8`0KS_@p lV)j&1}-ѯ6̎aE=,T ) ,jUzU6xXG.m򑶀OC/dսMl W]̶ȥ|}<ϻx[(YMQNc[TGʧg!NuPVC?Is~" \. qf\x4YVQרlͲZy<@ O$7p!j3GʈAL`*o9yC/]lyѬ?rs}?DuPUBr\,3ke%cLb"F:)KLD/cr|y7ej615-e]vu:RED\ju,zZdx9&{xj傜PJ_>wZ)zod{?5}AMsx/"gU5@xV2]@\ 7Dwd7{Ֆsr}; J:+tSȴ(̸v1 y]vIƨUwB=%H%LBu, #dI78UJ-¸=.kF栬62T9/Cd ea&'v~,1q߽댐/F5B'Q]9Pc +8:lL/_\wYD>_ܼKϗ}.72M&G [AwOgNydGo^M<s9"Wz?vcW(TYhYneǍ҂~탆֫jd)(VO@n`? +F^W=ꅁS-4;amlMnv/G`-,#yڒ_B˴R }l~AuIXA| OhMbBBVT{C`YM5Qm>gܯf:0N4҇-C"+f[s»S ;DhMmֿZ/T]zaW[&`5[#VCˎM۩9߷~J?~ %2CΪ<4au|ZpMo  |).SUςLy# ~oӿ[4 fQ)ljR[ea*&Zۃ@nrNq%ei oc}޺/ ~m(RfgY u}u[O+z|VP;}:@s&ܯ"O}45Wҏ4i]I*.b[X8L>@:ezAWzCdΣ:j`U/g7$L.zߣ'ZH6irq,X]{ Gw]hKuf}G =אl/-/K:Np`|,%ńd|PJJE, ߴdFA.I%?oEr՘n1/^#|P{׌v/Ʒjګx"#[x$qܽsSsDўk>W@6a|*߹ c"i50g#g?[Vle1SCww$5\=|A6dxޗ7KstبX~K%yyű>;'>o'^ 80%\ sHN+{mG)㌣S/yy[Ωʼ* ?ըk쐁5ޔҋMjΦңVȺ{[6)=#TFѿFYRa{z&nrtwnBzRT#[I$NFr>Jg2y1R"v_ZygGBĵ+!'|C1RN.ʸ-28:UD-W_|@^Xh>[y~/{œ{(6/ӌ Kݤ ][Po)~=^o> P6nvy +EI>3򆾂/ 7\ZNfv@B[߃ɘq PߙIj㌻xIW~2WZҤCn.~ې|6Dl@L3F,i r!u4ŋ|#+r޽y^:ԙIT!Cf/lƽXbə99 XjD-T[PkU5[#e䥜^9r_Ϲڏ\+B3!/޼w6Y'׹V>w5jRh w{FNrwxee(YiYxc6F-4ScƝw6}U3SH1N;N&VHs[}󻟘y mloޡQx/ѯ&ҟg-Ƴӄ& 2r5V86;s. 8p9HȚ+?]>{}M̋f Y:ͣG$~_o1Ѐ)yxIϷ7')*@5<.z̦R?=D(յ%h/yx< KyD{za *) ,?i.׽mWFK+nIOiiSǷD_m ۖKJ. m@-,R(&.hb[g&OK RoЂC :n(G|D&WJ~:z=XGWq+fW5LsV4Zh6AY}jژK٘\Ǘ𢰲 I} S,@.$JْN5 ol mkߢ;TJ'UEGs;D};}{W%Q-T{YV?gt_ؓU KG3*\9+S}f0(w̹{EEEwu׿پI{z!E7KYqOJY* ndѥ1/>kH.aqVP8Amzq6Mޖ'/\s=ۻMNS'ENX[ɯy1tZA&idDG" $C8Yu 9WXJbߓUuquj\ђ4tn/dQ.RĉS^"3yq}nz"bIt2gK59;f5F5W%I^Q*|?k',SeJv)g77\Ϲ9jeߵ]jdnuwroxze-iJKe7ۙ/sl֛v<9&u95y]z?wϯ{jJįE~'2!2=&OYVl!Bҙ`bT5U~T?V?r7nܡ[8 ΍}ER$K=!DmrS~xU9/$QDrk*ɔВ^|(Y)+(')|It8OtqkHeYV. _qgmW0QQ`y!\jMW0yH$y$ՠFm8?:dʍE.rwf=F,h(5$-TTJPʲwL:P4j%ks{jdڵ.39> WU%cwI"+(]",4T.-ԇ6Bʵ'U+MÛ-:G*`E5xix&xO P;acħ;}5gtNrРGʏ Mx?.XW-ժ'.[!5#ߋyP5KYS :)5W+KUwMv+$';.Sw@n7x'1iee5\RTat8[)0ɯdYbotAo3tZ[afVZ>>Pkcq$BJFj]Ѥ@*O w,׸|]4PVV|13錢0 RXtbWFƒzjYwXW P@_"֕tP"Jo9zuv<;N}z|_'ޗE*Vu@iG,x˅_B~\٨;ک _Y ?hKvӽqmĵuR ïH& Ns$[njaʙGCS^.iܣKn 711MY aFH:Q%J{;3UVQ n=Q:J[ZxyfܼR̼ܔmVO$)葁ҟoa\y2_ff}J}]7//oDLh׋Gf>r;үdL<]9UL]Zj|\zɷ8-fJP1j 0 T,͐7&eޛܨRUӥ;Wp]PF{ lŰg.UU2D{cg4d D5*d\ɴé7^VFROBWKȇ$(L|prG yvI͈y+ 7[1-^Itzߵ[ Jz~%s<[*qӑgm_mj+~~Z.B"3áD*qǴ[;3tbw颯42Rȩ˹ ';v-c?.[m+],`[g`a\X .,E;[ $od̓E6ڥy#t`kB7R>BD >rl OOp&7=nTuoYyJ|'|>jpwiSPܰw4 ]=TuU]=*@RWq/%]TN[?ƷMXsoVbۤ.C/RQBEYj2 r '<ǃ'ی9JQfu!pr)u2 ::RSBϻ,aES>w[Uŵʤo{jڐ5z(w֟vz .$s>US4?hj<&Q[RjH #{x{VOMkFt9OD/%wR^ǀdI*UBN@nskAٴu+`u9[Sc[W ߷kb)k\n$F`,j7PTmCr pkA|`88™{_= k}csNI:0~XMov uc"*5KjYA:~<92̸lYQc  f5HP[GIuXҜ4 E^ȫҘ2ژ7Va׺ _Jh j kC <]g h0Œ:~9LL7˃hR&:&XN>:Hrh\@Fү=^M+tNl"_1Jo1Q aE߇4pw̭Qڙ?N{Dw=p`H'h.8V@`8 }""<"P@=k C5A ^C}η%d2=9|FWr<\.~Tkn/+FO@^f]M7| |y`JpIx@* < µS;ÝW^O_UڈlP3uY&1xZN+yuŸˇ6K?JW$7[-LvoFrD/U PbݟYB~E&juE+Dcz, X o%xɒy^:XЅ0L{FzZ,hۖgO_n;=@믷)up8g[e}}*tv~za񤫺__h^ڭpsbCז,֑v?yNqH!3 ?kp &.V@-ǻC &ׁ ŘIut ^WDJ\Dl`:kYhXm7BBڞn} F%OBP3 wGgo }T }|._0Љ & x)}Y/=%g$$ܼZ|:(칸/b79Q0-H@1nJ RQʜ:4>XJ [60gfEw[#\9;:oyqwIa+N\8 sۊuW* OOmW(Y @oFh_C=/\y{ȝ>1c|[OD42ȼrh_5ړܫu?:3BpߐMimS֥%k93cֹUUIZr [\6efg\^G>9sC3?NjABCx@ >I N9'5A ? -rTfߩQ& +6|l9'?COYcBjgmDx[+b[uJN)jX9p~%Vu%s4@ֿJ&KW \ u[qd)|B!Mu c? %3Bʜ;_&_,Iv.$t2z}}`XlQ=zW/&@s-0Xn@Y0u )X|D-U5̱rP[0&@M:  =@M!0&DX@icoX{6bԇkM*Vj+m՛Y.vyG<"[ƺ|3m{{;&dʚkX5,VmWp, f~i<+b>[.K[/pn(ԗz+u)R:RHځʳ$|&+&pb5zr Smt RfWRl,ڥv]iD5QM|T%@F#N|ݸ`\2TdYdF[W? y>C[j WpLc)6v7L~2 ~P?* h,5_lza} G*O{8W_Ͽۮaۭ[R1S&ER֡C=,xjи'Rt8V QФ5|ġ}u%_ e,"Qޙ~YGnfBZ x13{9>~T?tGgII!m#WJ547$4"e^8I h7XuآK.*JĖ^[ٴk[4>rLUJ;uL:|cUWH~"*>J-L~>g_=@Mf8qs?8+8J;aW{>_QϏ:TbjLڂ֗nN/ԬܗSԠgi, ?(Z@E K\c8_=h@h0ɕ$`VN/%@>@SW?®@Bvq-ՖuegfY#RY!qZŐrN|]⁖R#a~bq˫+zX/uXl @&[Q"˽KS|@}`lʱ$a%VBӬUֵ (t']@Jk e 7=> IsfZXyY[}Ζs[~Zz'+E[QL{]f^UH{2Q/k`;gK&ީ Y!Z Ю{ ߰ K"H}&;!&' ]%Q??/%,Tx?6 ]\qq[5Dvݴ.P6Gό94ը-G"k];,+4*wsrsxuzJVg,vvq/3̗87&wK~7wЗ8^> ɴrl,[UhXŠfd E?= L֌A aSJQ +'&2Pq ' fKiI7?,g $*hЩ wXH,k/[# p?o5PEj1ŹI[D[ӸkV_!VI%ZdykNJ5㚨lk*ZPiaTS! *66 y.=kdZJM8{zNm44|'te K-_Vi=Y٢ctƒv݋b%0۪?.KiH myzOi;]ut~:Z=AgB\S-',LKȅg9͎oIex~i`VYu y`c{^=Xh X>v?9411vPV@mrl5!,?iӊV0c7̎n, X^~6  Ab O#uK4!3 _[mt&d\ʜ[*-hS2 |ZS?:-nqZЀU:p9avrc>~-W~Y/#v7svK/dƏvrzȝD-:Sg γ+gy$f@%_J"f i[Aa@6F:iUpщG鮦xnzxE>{ %xyEk᝔c~SϾ%EH&O<%DxRY߆r]Zxiy'ya8t!0AvbR 2؅b\|/|2n+Z,w1zrI{vk[ m[:u Q UzAZ38!xA ڧ /PuSTP[Q}TDT8Ձ*({eb->Gߩh:@h ےUG-E=I=GBZm'w~F@Ћ]Mݩ_Y1uU/G*fԤ剑Mt<֡@ ^ /"H'kAŧ& 's,C~];s{20!9iG\.H 1@_C`y}%+1dT~ _>q XA 0,Z^Qs[r%ttIiΫ:'K$;S71Lr(F{Ťý#he4w/?<|7kB-1>;~o*6'9ѐ<RI!b֔+, !Mmq ywgՅrFkq͸pY¬a6=C꠴fu!KEq#"o5 X{V"/Kye27EnPVM&QY*5?Tlph^CPȯޒ w*`Zg[IRR3O9׌Dg3ll00); DQL-u<|\iM"Vk+ESl_v9ny n3V,[q $m@n `.麿V듔SEB!/P|j9>2&wN {o"T^xO@nQv5S}kzT P,b ->?,[$}okrV5ʍ} W@|⻀<-|T[5^W[/;A[9ϲlJqshhJi-0hS"\ØzA4(R@+LO }}-Q%ob|m1r;R )X(~47ڀf\heg[ɞzV%@*IXRJ0@#jmndUTEMRV:CLZlg|c@N2_&x Cւ,,5H'd0&J,LRg{ޅǀIݛp82 ?`~w5ؕ܉EޡKӉ˕ .<7dCǦT0]>+\9!yUy~@񙳳&*9ʐ㿫Mj6 2_Y//k*喩GeLeRʎRݓ r{rSTgiDNJAMD*f44yvywgwfXVeXy8-J(OfO{ަyCRϤ) *f&d6ʾitjt`dKuL1Y*V6O?C+!M b @L*~!X%̰^2HG_[Kk[dixmO1IxhfA`RRHki%;uBfޠ HWHNf?t-vZ!ٯ. |y(S-5pB(S0G(o_WҀkk?Vg粬mGyhN4VBQT&xD*H *-t $ ~=tv^s(=Hsj/ HV9K` pJGp~RrɅ嬢/xW:^)VW(L5u*@i\L+*?pJdCZ{%oMo65esܼ+++_WC/\m ,XNM$>j#JpA+ߒ2GZA^Z(9& GhD{3<;3yq3" %qwyy@yS2LND7jLcF^->8\MO;8ǻHoMiEgB "mȋr nr]T>:I LS%ΏMol1iE]2WVIMI%UI9TyONS 幋r=Yzg]qLUH^^餖>2Y-Ln5GOM;VąwIZB$VN[^] BO>Bh@²mМTץmWbYNÝީrGE r~d9gA+Xȫ|>a":- F4ѥL|u]˕%R ^ҿUr9-?婯Ʀ5O O *(u}@1^ U7XzK\*g\{Ň/9ز\B]hn7(GE׿pƍ>8T RdYMF\鷇3geLz Bn ~iTf9/Jc\0;F }[ l3n [?jN\| 9}%}k9R@'К`6y ח;OeO%Q pUo.P=8 ծ֬'p~W+@0S6/9 t^2Ogf/j`v9S;=ˢ{P@n}NoZˤv.襖Dz^}C"ËCު .qT1Y-.8잨z@i0& ֨@ .y@T׵Ec-ed>WF+(K1 24m. 'rR{F{fk=K Bw}=:[Oh_L<'ŏAҘG=<,&v@ 3jbٺ=x:a `d\HkA<0,ѻ@1-Uk( Kn^GD Z&:z1vJ)-]"^P#D_B$]>=pCK2{Aڢwf"P(>DM NjiOCi{O.x_^T;5$.8a@ST1rT^^[6oټ^|pq;惔2^~勐 Tr |ſsosruHk!X뿺~uup=VkFFhF҈63 1G=]z8!澿bۥ@Z]c#Zݯ?2%h2AvHU3Z+%I1Db>lfX@d&#S[a+"|!RnKΟ__۝-s:/,cdw$?3SN%SKfVMY,qo}[zSvkb*[t1xwxJz8QTڛ?8EFvԈ9K )dGC|7{:O>Y2D^P <˹νr`qb߮A%Q)B׿lFgYb|όs 28d\4J&u̹1V@0.OS[*I1*0{'e{MmW\u/.z`3y2~s.73vE˷&[?il~׵i,BO/JeW>(Vؚ( 0DS? &|'b;_!# PIgjT ՟F|\c+v-ctm]GeLRHEX-pL~@4M!?+\1J?=-(}aV8 1}mq}=26]>?-pLFU>5Qk^Й|_(RJC{oۇ/ j,OwM.%,,`,%&-ҘE H92w[VܗU[Y ž" N@ 8d1H4a#H6챜*"J[%|TCJ{A,V~,\99fE1@R@C4Jț 9@p6Lr$l: -q`4x@bF(P Yrw/Hx|JsU ^z1I`$Yh(  Z9*=u{IQ#t0_A6M!d^> s-9)9AF=a Bk>/>C)MJz2bSyBTkZoX[mPkNu[͖i^r tڂȁQENU`22TuFVs ?4]tZԢ:g|K =q_2Dg|nY1S,ͼmHı$FkMIǥ]^2rYEWRzD 8f 6"G}*T]LDՠcc1O?:yӽ'뷛$|埭\r_zf㾵;&KȸFD%s^aPٺ\+K&?.i~J$8Q}P'ߊ y gnq& H*hU!(?-y Y4 db)I)&W w6I@idUt!QRВ&@Ae!S-7!`_Fn9\2Mjn֨4W0Xg3;Jq> OݯuٯNGdM>+l%SjɱIozp? Td25˴L`]\}ޢLj} 2 @&c iǵZ]e.Yۦ[ӏak_x.ry!w$⿺P|𚵡ޒf?_oPKZ ZcI`MKyrLz&HvB-uM9VC[G#֪VqK FLin9(p{ I҈@f^ bxA6TUu(.Dh^m]tIC VzyⴰRK\$eiK}Z=f}$`U=^SHeL2A@bI*2({5_{sHlYY`}+h%NI> d5nPHf#N(g)~,10?GMr8YK3ng~'NQr{ jU,g;1 kQ1L`y촬Ey]t_u/wR}fl^v[ CR6'9_:ӖQB$B3QvG<&rAw|>G)#hEm?֎q&U_C3ivQzW4e^mϻmI3 yk)OGx6|X}z[ZFږ_@jf4Q1F.~A=7Ttwv/$y@HW$꿌;4(_#=vl4@GUp::/n3 %J*9co4ֱ,^/HH΃ 4?4Kdn쐁RT5*\~sh-y+yǀow$&*VU]c 8s*v./A}9x5 j8 \W wCX _EsdavbH5,A`ymQէ=jGR+/{2b'/TUw ȭ䱅<6ۄֺϣ!f!N;qY໵}]}c>eu|\>$hc3 d-| 0d=^AVhK]}NK}X?AVHx,D/)πd@L`Hp9mn+i˻eY>j(@e|DHi /@2  ih%j2C-IT>č?tEXFHvX!dR3v,|ep(ryT* @>Yj'7'"eH.V>ˢ&_K[3*U[-W/Wh'2 #d+o td <Fe+wGEGn b0LLL)2#n}e KQW/珐4~Ţ%WJ hzC`)1? @B$Eޫ_}hU\ p3KcV1cnnReO9\"_wCiKe#}׹9.]i?ت$7ܖb߻\9Qܛܹt49 p2pKs3vy^ǾKW +1:Դ'-O Py~)&@7 cLU\] E6p8 e?lb58*րށEds08qDH 1qBJmnمptYxl0 0 E416r HVԯ@#>MP\usrFʘ 9 3ng& 1 S䩂P˹yʡ_s\5?@N2p7} $FZ" ^5?IOs/jKfcYޭAZcÄB"5=W]4^zUuw/]j]u ܂l*W !}@xc t(ppȂs(z+|سzCT\rP5G3l35ɤNcjby<tdVhG@TЊn0Aj^`vE/d-Yâq}p3O@q Θk|;43F>H9 G " efـPL-ƻe^5!L0/xU`6&23=C4#yY|67)00~t6s((j@> UVY3xAZk qRQ_.Xu%rK7|Oz`_=Pq x/DiԒ#[lb HYj]?OUuvO3J| %iIMT-]ڪPS0{js5ӽM3Eu+Ǻ/j.t,g# ȗz>\APKE;wKUA悼Jd:J$`mPd&7`0;jens8`x oFx-60;*>&JJ Ht6d,S$pÇK]c{ C>trڷEɐq0]EQj'9˱]NNP`ְ<\mnܸ@7:aËA$?̷Gf/LʌR T&hk;gn;NkMr>|Yw3`~րԌ,f ~ͥN% AUV2>c%?sxTmL@ZcI͟r[]6Zs+OmV"{"n;Tؔ%o%޻jor]]]0jF7Z\lw.lw {zۨ ]bCCEGEE}CL.@~/W=jTlo=m ߷Kld]ڂ*W-pwJj &bU4i2 ȋX1ffTU]] b2jz+ۚ;MaӜ ΁ίH)JӉn˛rIkL$maeCH^rK&?vVi?_/jV[9XԱyȧH, :, Oy[0@r$WkgĔ8@JIGi RM h"[@˜\JԦCoIJylRS4D_ւ[dU6WhVo FV=2i^hZlp]&'[',GqeQb2l+H3u  vQJȏ$cä(ӶsUuLf!眃QPA$(JVd$*A3H9ÐG {GE UUwՕ<( m͏gL{|jZj_F|zHaDSĐҬO c|&uƣ WB??}j^[U*VR4Oi;bl1{^W㶵'uxI{4cG`.ӟT4#5 M^g޷kQiI[ԑ=漷(Ƚnmw{8e$\7!M2utvL pR]/%py!f #X=% ! ハ>ېMB8(^"Dm??k^딵úHKQK+([ ~{AH|NC|EJx6[pfR k ;}/~!v48w FA3؈OMyjMh exV_GƭwgCґk !djN) kc/!>&7#q͙pY^e@"/Hq}wORLJk>]=u^S20B:u;9 ׯwoص- 7~!Yº+#\a7ܒ̗OQ|mۮg~0ۆ!^i /͙9^UmQ'$@grQ6EٺyH;C!QHv)!A2 lA!^d@<$݀,He!H*XRtc( K7I`gw(g%nef dGtMHIR 8 s_#L2,MHERS*IeR2 }#.H)]jP ֋/3G>A )a;NR y?(V;: dF1Kj¡:})0פP \ScVrb3@-^;,#;[R+%dJ:{7Ru{ltk*Y%;$wHpGr2C5_K6ufqx2Yd 9󺣗c,iaxdIDAT̓f:Bu\+g(T]5>*YY(l T|4y9f Y󾣫ybܓ>sk3wf}msX?mm3mW`~l~j%b..>wƨ.?F_s$ 'OgG5fh}SGJ-}w·/ɞj};ݯ^I3M|龺W$%\fo!Ɛиhe3Y#N ' X`v41-hKabc+wM ~s"#|[-#jåԣ3OM3< ec2r^SyⰈI+@J fc6遻d y]~NEb/~2A܄Bw [CTR5e $EIuD7YRt#& 0$Rؓ5;.-b:wHRKu !3@e,Ials1IO'Tknzv(;8FQi,@r2I n9{^7@/ JBJQ D†ˉikHHM)-ɚ',KmWhYu&e7)$GI fsR2~>咷`yi5;lp׿3Yjo@:< @9D6a+OgNu;Xګko7 QB{Oy{{]n:ze PpfgaNN?X009c3:#yש6Zcd[d R;<~av"a748~yOz14SknJGrH~k ^LH!uJm59s!!a7@g_d)1]rgnIo]c}=r]ǧScn~'#k@@PyoFM" Ӳ 5eenrS@i2^ <t#>gQi4X:{jl~p_? jZ χKߊ-zzh1yjfB*Оxid|`s 79 3E+IÎfN_b<:.;ߓ,|5mmYΑx!! N/}1Qpu_Hh?}2ӗ.rBZh0$FF[Uq"DI+]AA9( ;P4ld /$E$PF7  ɓ;üޞ?ԙ{I 4~}huI"! Ǩ FϏݷ"t)NHQEoÕE'_<;UP199IT%UIj+ZK5y jzt=0TuzBgɤGf3[Rj?ˆjHS-'#%>a?qAROBJ)C,h-$wpqR%J~),k:3;%mҝ9uc4Y}|/Jnl#r5)%{a/աZN]5jmҍ$ol]jUTVq+)L8U61N !G fkS h|:f8gn0&CDi+UKz֤rҟtD&7x Lbn78SC/^K_ =37[gkBFjCS}{4i/k}-g}7_dL?Ţ-G:j \H3 ә @q͐*<`_yºn` $m>m_~$/0jd7;i`f!xlf4Y8^%M\f[)i  Yd"}A|G&A58Q R%YH&s,Ҟ 3HdxAD2Q 'dEv_(]$ A#$, I:?!H^JR$68P&a5Ma_vχ3L9s|iE6`m͹H0FIH5hԿ;!ARt ^ 0OHR ďXdv a ŷ 0RŔGp;ױLϢMh #2+lYc fvzjvjZ: rꊴp:P~bL vHٚIX39qeL՘1Uo~@y`)РM^ %s 9pB ot2OH:J $'*)/UJic$.a!DXXaFW?gN7<8q/h%PG{/jn]$]cOrpvKjY9f_y:g'"/6)onwN/6H*z]nPcsionױzl"p9ZA_D /F?&pNP@c-x Ԣ* !$};8r;:o=U:' t3V2KWHcXNm^]kGh?+.Tpk.rf.>V~U;XwK7.C[D_ g*륏1Hcf[K؝2_dթiqXYs ]l"T M@c}JA,5jIFnhTQZ2@Q88˝aR_lwpJ= f>G1H*G( IR䖌X|%V5/ʈ*d;cfR-"WHґa-LX/ĢlLh E)$d'2$Lʑ$Mj4 a&7H ^;U.d t Iͥ0 2/Hfe! kqӟ_b-)Nq/Gק.^pqu)88;S ! "Y.ԗ:K# u"ƺH8}:;=: |nZclZNբ( R/>6Fo=  Q =5g|}J=7n\xfE?0LFg)d;60adtaC$([:?{ŎЯ6ҁ< IG0S dJxW <`2FDYk ), d mS()V2! 7HADZ{U/m@eH.FA d2c49F,kS\oqk`vq]F  cFO)R<8@) Flr0vme)(#Ɏ`4w /X8xw[}=a칏.}~w|oL>i3sc?/nxi1 @v$' (i3h $ 0V0ãK\\ ,_e*W;+UPC8L-S'p+>ԏ\G! upF%=RF|F3X5ſXcD .T uHRƘ3 $=( :VmV~sq JN W_:O'3G;:>{AR]7I XCs҆Hg9%aƇDwgc{O8qVq~w~snAg\ +RxF0:&;<edXBNl㙤nߝh( Xm$;۬cz >c5T3; M8d)q G}ܒe@vx O:wC?2GQdlZ9@OV>wdhټ7]߹Ǎ]Z=|=e\˝g!ϿM#k8mĹKɇ$ig&T$$ I/o YF Q;.̅ Y)UARB`% Mx@ћ0g.cH2M[vQCϮ4{tqQZLe*H7~V-*qZ4F3 I]l) AjHo^5EH*ߕ1#RyIJV;%6emw`HXĥ^{#8?uwG:G-pqs4mY!oBJפ:^7֏w̻'ߜqa kNM~$KXսaWm~3"E\vY_~W>?~L`R \VIY=l68N>l(CgtR^Z}fV -m5H#H_` 9Ssj9RH AM^`Ԇ|^'x푏>;QC#> [I$N\D~n ux8^{6Lh02T/+U+iRy \) ?H %p^2d<k@5\rω97I0q2Ŷ_N/ζh߰/W$ F}3 H9 2B"&ML Px@?n9>-ud+Īz/|== J%p ٠'cΠuIW@%o AyLUTPSŃ]\N\z=ܝr;x3 8( EPLyt׮-BAuVm'C͐2=@-F1,e)p<@y:$h3~}A,)Lgҗ"A3 e/˨RǪK ?>B!'<'x`d[KcwNl=LX";0((rR͖g_mGs .s_(V|?(rH{g_wYzݕ^ӱ875luY>B@B_2t0,?6¾ OԆzi)Z>>G^5>C{2+ؿ|@i=T;S.!0C PQ@7"zyI)Ƕ l:0y }F9ɨktbFO(V)[#hBH772:.꿭G_UμJ5Z\y%I~68G@e2?HX U,5HȞN<74W(0# 1LvcGb0Hl2UU~UXc^c ?Cc8lteB󉝧f!j[M 8?H.JQ4Ɏ0ɮ,: ȧ9 |%pHuld5Z`B—g7{V}8_8~ٴ"nUx3!*qb;}[ SH4aj JY=4vDޑ)dJ4>hRCf 㰬nz]5 <ܒ pG[T \:a%T0&# ?*>vog!Bs"D̉r}/=ϛb^2V7ĻRj$׶v8-#3JJ(e%!wxyLJ('^{F0A" n)ŹN8>LDӕqWߨolGJˏM\mӄ|>"4RŧdHO%$Д)%~ t͕2*aJKv'|Hv"3""ɴ *6/{pVwG8e|dt[?l2S-߈ LP_J yVyo*XXmzńz}8-*+8qpU$$X$m5I-< 3 z=Io/ ZOm}gHVK{ ԩIbK umu_?)M4/!s@Q@L/T>:驯| Q&DalC$` r/q[4F{3Yע/ڍoFe&HasNݏvLlpڼ9Q"[DkO7υ]S:%{9zuH:pWpm4LQ3#.ABVBb域{8zB!FQQ!"8j`#7yÑlw7 RLz;%nzFA8\jwCYP'MGϭRڙT:64ȏѳ'->Y;| Xei nkI2 d& 8EiX ^]q\P@f@޼EjK'Y=s@KA?v,XBi:)ڥvǴdf[=M*}H1Fw@ ZSHKE}}1>ӥ#~ba|WyQiP\h/ǎZ[nhأ۲hb9P?LLW32Zf}4ڐӆV'k DEqd Q24i XTrR{] GGhUB+oԯDnop38^wo_5ux~Gkȇ_>f{;9L#MHBC!>\ۨ(o6I H O/>fYnx^YXJʝ{}AoBluƳ0^_n[!HdZ{{E* u4~6}W=4dYDHؤCRxqw0/N8 V񵤂heni < N![\cNh6uJ%NC9vbg߾ro)xz5Y3!zQ̎齬 2b.fB%Vx 25Q6 yZAn]H ! q-- _;ӘƀTJQs< R _a `4S3րo,ulp  yF^${?mҦKQk=4讥~gYqK=*f. i\u՝yf]rxtԥM_ۆ"VA%01kԤ#aYV(8w8qu5/gHch y/IUiJSc9l]А^ sOw*/v{͞w2v[ラ TTUaddcGޱP]a@$)P)HK?aЯP.Pg@#A|`4~5tP ~ЙDk}m/?} ?k!߀^tϾ%2O+)zAGA|rV}Th%g^mW鑯axTaiG }m~lp2 ЗiM0D*뀃8@AxJi IOغWϛzhsB-V?U!)9rg]ֹN~V3!aSܹ!] [\R>l* ޡAnp!`40X!-{L: GqV<̶:Np"@ZBM5|-- szd,$x-7bd1@]Vraȅ!b#׵_~]{XZךo4a58u~3ӑjzͬNsZiO _ } kX'Mfgf1Se/8׆NWeVYT7V~/?èXF=~>=vqY&@sUחo,l"/MZ=47ʈؾN^E2qfa$ĐYϼ2W^k ~0 ehEo}D/>63iG`aM]6_/Ȅ84 Z&|@~'副/ܤAo5Qhݯ=AHU@Z1dv?޾.FM#+$|rx Gi<,og@ͮY'2Pd fz,$\+ 9ms 䜗/_.?qY'+$5OM>yqKɕ*Oʽ A:yg6n#-Xm벆g:1YMx*Ndg0'V}K`&`v/8X"`xxF 3AE Q \4b/~3 -;SG L.Q,^:aJ8p \uܺS2Zm%w CT꾊RokIzZgAMs"zF/e @1A-Q[@=b:cxxFuE8,2)+0ƛf8Sh3`׿oׯ#y<#&GL]W+ɞ'[0^+!vYl_݌FcPiZVg_IO+[]F5V]QWT!=Je.[:$j0-Owic\{g"TM WȜ17f4->l86DŊgGCڪ #b߂y~ΦhRSyY@6}Udn[j.u"ZgSSC(}{@DKo,)eR}y56gv/MH_m2Y!خJ1 &}Ѷ|vhkD2 d!h 4J -O#{QYBx d\@ SA-:M%}= G/T ¢bBAss Q1LK#r ,P_*XUwH8[h 2\ ~%\* ͻ@2n6$JQ2tyAY@oNMX>i2A;T'}Cow.~J^[&7xZ|'VK+j'n\qJ7T]P U~v\lo11"/=xx#=բ(^$X⠞a"| Y:. pp ;L6[ \ 8S;f b{ܺ~71b {⯟0W+uV{}/p+HJVj8Y] P)E'>j-Ọby'ZCMHG$D‰٨-B|.Ǘ:$K{9 /=}3U5KP&JQJ zY^ķ" U4&"1O"K~~sQZSc,2TsWzd yӋ&/ڃ=˗r/ 8J zKf^l}5UiHu}şp94Ui=w>{|$o}ҥUMK}O"Py~ަXw[:rqil1^__oKsn}00ϰZk)Azja iN3" >2w,o Z8@ R!c.`Fd֑n񑬺6K_ە4|l/n!oz\+=`6FTY.yS_Qdy',ɧ}OuԚ]2ΪK G9 ;Qr~j-8K ~ r9,y[l/ Xx@(@>-<aV M58 Ե z<@Ϝbs%p"YQMuV݀+UgXR:ljE^S- 3% ,4N{e97Ag:vbcݡ3me:^|6űꮮR!?[fjv[dcc\Rm; cnjU8^`ܱ@9v\+]+]+f-r^M;=;3]a~*0jDV 9ni:9ǚ|3: l0F_=󜏜 i-H!Q'GUcKJCeLq W t̓sS\2f 3BH@G%0#TH! 3Y9 5xQ) uuP1qz䵬6L63 )]AFI[ #^^8;ڴ҂}/X1\:9b 8lF9#۬W}Q@ q+geGˌb/%e$'`Ӳ dUAvPC(;H6uM|4Q63FJ068ȤdiY*1S,LxA~o_iE>I]iMFriJq_ꐝ, O JV%R, d-YA.3 #6(@N3/'PV[ xODD:m|umQ`=8I65|IT0b 85W|v0t9Vg=ݨ9bI8| AIc*`>9<"U_6 9j̕Z x`A$͢/쌘wxA$X) @KAL`d&9 Gr rUr "Q1IaH>d "Ag^@Z}ǹW\ g9P} '@ `RJJS,f~ g++u߼_:Ёy @#Oʗ,_|$I3`gĸq=z .z8xu< Zal|];?{\3ʹˑӽB=%AHW D20Mu9@ C%2[rjzng#_nF:wRhSρeҊ i9O"ż9eM]L$(GuQ\D`rt+w䪕4>)&AyG۠ZJAPZY>KLk\d91A G\`lD{p}g-96Ek~R˾vz{Wg+i"j fKs_qGinz?sc ?Mv =f pD-P@G#T>YSbG[S~y𵥽k8no n1̥bZ4a0$ts}%}%=G@"RE BR d+Y20<2 TGwJMAerMxI):{l)S&NAL`73pq@Ym/hs#@W\ 8 ߻+yyby"oZL n ȯ { !>% rv'-%mxN%Ra2Iߩ[/i8SߦT@(!1J~Y)xKQvyKT){Ay|΢<\ P#ƃy08KWu8 IP't;2;|R;4hsvWl2{1_`f4;eo36X}}Yd^^ԵyvّgǴ .17s0jAԂ Q;vF_y0 ZLarr4c *"`r2\Zu]5Rd%2RH!u|Ü`N*%jcc)-SbI#$h>tO\PZRZ&w}jE4n1JFZX= QO^$QBU'C~"oO 5NMY'd:.A1Wc\`8w} G2>x18_/FgwPvpQ>)=#Ļ]O' y1 O9>/kXOݽPym,M$~ˣo,n3dٛj ` &{ӀGū5Nk^@>C.T>]fVBߗtd^ 6UAw#t#+ڰ9d)b a vrG:@LuxkRWo0 zWnۊkrEohCYr $2DQ:F .\,e6uԍ~C & (lG)<IO=OR_rOu .6Ҏ}( FϷ]D1HAPfFtaIxԲ/L-=_Z;&U>V :Tnǔ/uT%($_ON ]rQh;m{>_5>_M"EAs maJԵi˿gw\>_C_˘oDF=`0o7 %? GkGkGk36Lũ+,gf?ؿ|p4p|&h1&\w43NO!i%݌VmF8?67JƬR򪛴MPmhش+龰Z3F{Y,]NJ)I~NXyY8]0wܢkB/@RUa%DH!,DR09 8`enw\Y-Ls'-tiH'[4n)'"#### fp3#nGr|_~8:*9.&uuq>KNE&]&ҋ)ʼq?O,|j|`3*x[zy7FP47}+ArV)Pj2$s^luooW_XGef36D Lz M>\)`óO?~b?Y "yT~0 \'0_k99pJ5Zq#8\H5VQ ȢNuGoؕ}xF𚴔7@NJEГn@={YPCV/7آ$4m 㑺:!Nj41A}*  ET󯸉go 5nkw>:fЭgv.lWY]~'ż`~([}/. Z7 pDl#>ԹO%6yL,i/PGHɗr &Yˇ~%Aޕ,z+S M mjf[R hBť^ HVhŧsdfQ@T|Fܸ@|7ёywIAj$k O*i;- wI,Aېs6舜GshF]Rm=kY A<Ԣ.HM+7mwRRUvG:2 /PATU Y 6v8偞1gH\&@L.}ƲB: 4h-2F ]QR8DK b0]1T)y_;o6<%R62Oy~}2>A6@&D}=M8.bTjH9d:Jw~FVjh&mGA<'?$'/G?A3YժVZEmqOӧO>}wz7 Gj''wAͶ[Fb^:.}̀ x@zSc*o+BJhrXʌeDs-9݀v_Yw+]Co˴iC<=5׹ j,M Gt)CGz2>4=rJ:pTua3N Fg@Ƿ| +_ ^ X:ep, Q=minQҐx ρd i3w.$Ly nM+:3" % QpsmtC㩫T5! '& UIƖU3|ӫpgfvhZ'>@[?gC;bJ3>j,)$0f &l\*)q¦9?uۼ 0'08`p|{z?MiO_x~2oU]-U-FI< R5'::ϧLˈNuFCrOo A0r_Y'͜f:cc榴ԂkB+``bd h#D?޽kZжk׋S³҇VuJ~Ý#?2!'*`~4A53|)mvRZڃ*6Z"ƨfuQŕյLn3p3@ & 8v7  inpfM8 ?\&H ̓f_1lm8;g4\kW_l{Nm9F%IO{f 2+9u -<)>Ñ CC`l23HcIij\64y@K4$ x Tv-&5Hü|)x NfX)VHw.`P1CA $#/dAQޡXxϟ|˕*T5H[lEUdnG>-u[MP7=[5 (79y4 ||'gf>&T#./k2˼nu㦭jjC|W  rP<%Q~r9{?_w򥄪(uS5Pw>v,SXX {ϙ=jbŤNxIÛUꈔ#\\8[լzkU5 jZ>5LuTwMO LLr/}.BhG|)jbqGw8 F̲ \rx}-7SeffW5WupU0RSۻ曎@]Tw"uKs(0:8>6i`k>Kz!~/*`+_}۔xzg.\abή~\۠{|( FU?8F8SdU@p jE>}n+7{7-Dg.5n$ɧYĦN|@Wns;2/M0}fg(cݖ6PC MfC.yCOyܵRя2?iۼ|P"i~9}pd`UB N -,^^$}?^mJ9 FSxAk 'jvGs,<=Q Q =G3B҄6!O{d e[ d҆me6x/ h2هC?aT?.n'І쬮ߑi{>jGڐq?r[ױXT'd 4u<@;zg\=riSVO=TNE'`&B<.D;hHJIGS^H_F}t*?=ZH^hcR\n >3^ ͘ӣFXjXjXe)}g&L7?n~\bN:1 f 5x`c!ȗ5333G2Nnb{SLlX 3@5%οMUOuMy)RqeDI)&磌Gu'k~H?$ahrX35Wyn_ZgdtcTm&LN @. K]w#2ЩQёK.q $\3GGnGȔX-oژj!D 4nN?53X14YM(DeA@c>&/BOs)Q#N@[I A ϡF>zj'OiC𥈱@uwD JuYJ('~nzL_"pКi@1ŢCזގz-2Cş{QYfjxL/2}I+_ط5j;T>z~yS\,i V_}Tqu\SvP7L#8%ؤm_=t+* WsKWvm\" d;Ae*Ɋdo ]a @H 2xPas[  $v́'Zm%WdX"@jֆ<ч jmYYn!NU /À\vD~v{չ_YOnIQ6da4p6 mf_ϧ5f^)=yS$R:6L&H޿.o33r;yL`@OUu^gt_+)9GDU-p8 t@5x bm$컎˚?;f1trfl&,ѳgGY^+zus -R_LJ<'dc|n,q syӂG<"?ub/G IHR ǜA=ŔET)ʕc2xVGSSɘ?O-eUU0#c8ҏϸ uPTj޴%? sl}s&XuNHGy[|$3dԉ"3A?dL ˗*^of#;8%Ipk@٠MrGkpq%lW_< YϱƗ(:= Øˣۃ9`jlFH}ĩ MymHk"oL ~5ʯN RE~% ]ѮπΌSdn}^>Ml#;>m\]ԈzSk"~9uuJ^rCz֍D[4-o֧HXuy`k4?55󏵎kc[[Ў h{Gx@zh_ʵ,;".fX~"d&WsxtΑ{'`s﫬<KVL+5 2oPNj;<ЮhAZh`@Ҥ@z,>s%FJ iHՍMɶ%T@"=pG˺K EeFR'Hb"e,Sϒ$$GZ 7b(Gʛ(K3.<2?>7uMaZ|d:|exAhݥmjZ *Pi`I  P AE/!. 9hXͣ=\Db;ZuwNu "P \ՎT1@sk^-ՆGG)s6{ ՝@P0#rG{Uo\V3ס C_pp l@ iڛ]V3f s$ﰎmDP6qpv6~X3uIKMi} JQmxRWwH|PnZo1?ó ޷.o3 WTwfyq"6H)E|Hp>;FiR*Ϝ[aZ p XR'&MFGO+0s6q ϊٰsc5K|}8,>rÄp=D_m_6lx(SQjPaA谼CAV`n a3𞺬K_`7 $F^cn 6dU}U_r8|q15!@,HAp.};*2 &#ᐫgA *ubUTβ΅w~KJĹ +-!:6<4R*YȫLAqJiMchޗ5sGihvi҄Fnu} > 2߫i-ʩV{ Rgc|s,\)|rf~ޜ/]Nk?gJ9@TT*m~#mXjvAW `i O:]" rP| H P恜&1^dF<)x@,i)-AYbl}PiNB ƻKKe/ R C>Ib(0ZcHn]68P.I{Jv4mCw|! Vcr)?63Dh>M;]Aq^b8Gt_q.e@`(-5H/5-`݀z/u S]OQi|~tySd Mj3!|LƣAARIuW欜Rk~Ix! oȗ(0uo߯t#-gkI hos[H%+4i?'vVkhLc'?G˯ y/:q)%>E?3ROYV Mr>ejd|'tws7H1p籵癧/{pX|!s@ЍHKJ0-n2>2&YV7^Q9Hr5^t.꠿HgF^+wg 8*\| l _\d\U^ԤZ-0k;385ϻ()9m [8|,XH1fq͘g '` 4'/`pVqUtV-XC/_=D N/-6𽄲륏g6l\ޱV@hL򑛠['.v%=S$O*ݫ70l^F+xq5Z2Әftʎ8@Xgv쾚oܜT@ p#/S~|twhsv|bPzR5{žG:o,r]ue\ [~Ө)]]Ľls*EAx67pLʛ ]+ud! 2zwHS/EFX # H=$BSCɦ2 5mIf!~@4d/P@V2숙-qCʿ\vD۰c< S173A{@lԎ7č;^fxAO1@h͗0ȋf5iV9|~b=d36"9LOcꆬv :yFQG.4Y>63Qs@8Ap0PFҒTJ3e?6:y7b_Aӂfm}Ѵx}ژ?'&VQ(8֪*9߽v&:~k%[=VV?%'Oۦ{g> Z7*3!G@;/>B}"+ű{͛h):Q饏WmV8t:ꦵKFvWV p5WGAb/;^6 V+Ȩm2fozo[trhy @uik(#=ABH5Qx"H(2Ӻ5a-oԓz YSrM֩b,x@)؜.T@Zj7 4.ܐh>p\֗KiA/#pX; ]6jz+nM[݆ R \ L %'{ rn$a(gz?u[^:.);|YO}Mz|(P?|B=oj GYiLjKg4?s_*{ |5tۓ`M:|`6{3(w<=s[kJ)G?D'G`'Fԃ7Fiz[( %W S\͠9o"'<-RbyXşSό' OI/A2XX}c׻ɯI$KN:ĿXbez H?4sstxج `mUU,Fq^fؔ(YԢ? 0p0[CxLt5j}aFr.eYm G3GC|4{i-0L <ҩɪ0x~Zy%m@kbp"a.[KARftŭ T X˽ü'Slc?#F%~!|pl8pD9x,u.NuӀ8 j Ɨ8p7BH٨!oo@0:@ x5KեHlc% έ?N;CYy tAy? }^Wi"C_>u:d@\_=þ{7Rzm#"+tVKkpnDhEYQy{:xpJ bk"sUe$tK}}rҎmZf qjF g\(kE$]\[z.1=Qw ytT<6j>lywA25rH#RJ̕@:1M.6 4֔4 umlTm'}o8Q  ";RB@~9.y|K-4j!_q5E06H-+5}6@WKYu0ՊxAZGQ`!nY"jCn1cSxm,ċ )"Hv`68Go v#Xǖ &HKH 5;eamt?zAH>{ާg(fVkuu}~g/(&qi]ܪBERLyu}%}Rɉ}lg| n);bo(ȋzwyJʞ'̲Bb?Ypw8.D^p*ie˅/{܃NZ1 aB8:R>S7̪]%Q1\STpM_{xP}f#;ȜAlfǷ~'eDb f n đH0(CN5Gn}J*3yý<)AA9S!rAjF6㾜d&OcGwuy)}V9BgH@.eW3N+4UDewlTV]9xms~ ?LOq]i-z l )'@묷ӃTjn. ?[|nxI΁ 8 &>  8'wjYVQa`z<%7bXMD&xSټ*p;Z]/ 6jvCY] <|WQ6cY~ԻpG \nLgILo%n<7O>\qk wv֥jPl5` /GqeS}i[֋aZta@zZ͜%&$:y`6e*|tWdF^Q2u${Sh9y̓C\1a߆#~ADGi>a4x$,1Pd|KYF \v)Aeȃb)ED aTN¬QJSEIr@QӢ9>XEnmdyD3!z|vN=Ej|(dbϫ^f"|%d5>fyE _ϼN1QY[0x8=UD soޞd&$p*Wݧr+[ŘGZ }ySMCLȕMϓ\WzZ}cRb\Ԣos͝5col묐AΗ|Hc\0pl2gEa@Xo4WiIՏ!P˗'nMPDKU7et;2h5\Y YHrR>hb@6hc{J?ߑ'þ/d_ֿf9H+kw!b Rӆl zQYRj/YfAK[=q>WLTn*?b MP-.́Lѝc!Q|kce"j_h.>k8Ls'QUZY33.l@$o1I) nx<4RjkzшDoLb"|'JEJPTN5_[EGT;sTNj&@d+Eo@t*D TF3FNTA T|iL]} f7W;ߡ\~YaN([گtx2sZ}OǨZcOmQVY{+++<\ #*t(AXϢ{\&#jNpP\4DyI>M˓]wު׼mӲMo:򅉉RܘTw ֢F7 sMWco _:0i `䫙UQjnbH2&C2i6xUE7qLϷ*hxMY<<4e`配>l5{k >/)JٝR;Y,#GNcmVBim@|i׀8?Cy3 sثzӃwR?pW4S$Z[4/y}} n79S U燼Llhq&AȮtee5n,B*H^\ԒANDh=ԎC16!x~uª/&| 4;;C~v ײË41X T%UE[\i~DMLO:QZlP/Z}'uBҦqyw%@|0/Op@U|Týboybb_j=kbfڧ#MYMoP Qa27Ev|U#+*XO4YE(SzE*F+JɷWpQI#yyK e/Mc=?5w|)߲4V]Mg۬~_L5rogn3=bU]caC P&-.qG9uTu`0HTwSXO(t,9&3ȭvS(|ⷄ,ȴ +h2J皆:V ]5q΀Iݒ:$TdxY/voO 83/ڛF-{}`iB/e-g';\A-Ӯ '?CwS` jɕc&/_J+nAҚ 55\qp@7 LЦVzT 5,,dYBV(z%37d^M%p[}@$oq1A{ oєd-8XrC 2:y;6.Zv gZO m@6C Spgb$@EBT#Pl<꾃|Sa>ɢ7.ցȟZδ1HcI: 8b#oU]C✩@jU Y6Ȣ$%Ȼ+E+:N7EO1Ra~e!xH "0 6yL DWau-7 t6p$P(4a|:A!\~& EI5-cĴXpBqJ: NQ@E#A@9Jw+3$(ЎjY*;fZTXq| -u#s ̱3k[ =ή~=C]o& ̷|$sJ꩷IAKuX+pgƩKYN6{fZ0K-H^-GR 싟|C\Fqѕ|3;F#GF#ȡ$P.k[I$O$䀓)Fly{i{_U>;Y:ikՃ~/=/L]W [,3Un/+/(Wʪ\e0Sd>#}gI{>Ŕ!1`ڲ[Ab^ `efyTΓYʞ/:L,A {1C*(gZAdS^=_uXȳЄ& <*߼xB7VP9"QA\7N5t5ޚ}bϔGa 1D93 ར<#?\r"I `!M<0G^ vN۬W$߫YJ+&Evh62l3DM0[)AU=V}* OAg].g +b) hS&+{ i'ooϚ7ѫgg }:t!W?tLc/ž"~;HfͽU<"Z΂ZN*#RNR}[ի:iXRr?c|# 1Nzr;M㰼4!%ضظllE}K}.h OuTo7 /$A@~"KSNېgbc"ׇ'ן+:>zM?Ni=([Eps9Vujfcp =8ۿWu@t2nfq a݆>~wui;]OϨUft[p3 ˒o[+ % I 3( J` #7A7Jʿ/ֶ. ]MOC9M|HQD7$O"Y޶ ї:c5C1]_@l5i$/@)pL4!b QGJTPar* ʂ Ĥ w?^ &]4߆W1Ma()JF`88ݬkp VL\P-jz6x@l.yA,#;b% IZo&Z ZvG)Rbۜ/S7oÒz=vHNo@ݗO;y'x.4m)5̽K샾SbmY]RfoW_7qR g)ؔpemeӸ)jN`3sF#zxx?71!@ rߐ׹Ia-IK=2\ٜ圳㊊bXH jR/m~rDq'Z$ < \Uᐤ@(?0c7* l;_ʰ apV½X WY6ԏ,ת[|+{[JQu#v!S# =_\mK\/&8?on? (>6u]T!iq|pƊr@t_:5/*N,PxA0܆)/x#Ϩ,pe#ϪzK P]dR R]٭XeX/V:%u\8YF֎ T~.軏dg w+ܤ)FÆ?<_Y W-Rߪ P@eS0Tff8TTkZfZc]K{U~jd+foNNYF z0zTS| hw{ {Ȋ X1nF|8'yԑosb} z}6Q O; icE"Б/i6C PU"<R#Mt5`A:sC| 3h|N!4TF(˼&* J19{3=3&R톫"4bƹQCO`e2b_뫡ޜi%߼~(NkEJRCc9!_gD8pHoR@4>.89=?.xZ}} kGD-.b\J?3|Q :^u,8*J 7ppLquGT§qAe4}<M}R7$9 )푑ݔrFti 9M304~vA)t||&f@"[ "1Mo%• t?),Np쵣S];Ȟt&n"ʰHT:h⌡b9hG:U>sKeqXyu* >U<Ȳ27;8 A3tƙ|Iޜpb1{öV5$&dO)$൴{5!VK?(qECNJ*f*Rfu xÃ'ʊ@/j}Whz3xt3Qгi_*}5szxtαM@oe{eX". 8C 1@eu^ǘ bbSA[|uͷ&7N3`R$Q@yhj2U7 Wٕ ]X}Fc0$1]Uz|uTh Xt1Q|FK1^'UI  }Ԙhu TRIB5N/Uv0]? 3BIQaLlBab bYI4C@; Ӗu3{6lEi!ah|wQC9Lv({ܰo55arzig$L~㻯 =dua4#t%Bm*@ jTJ* TɠC_).*8/]tjhHX4VbI9io| f^JZM"X@|3MN*^q .f;F/_ lm&7^fS$~IdHuӶnzRJ)EqQ_ƗrB4Kw#OJݮ`8x}.-\b$?[j:\'ׁبw,uhaBV@w9[+[ŴU"_ocnx9]9kgk~W4YKzd0P~tW-76vR;w&M&Z"-$nN꿧lNN~1AM[gmAHt.G#'~( KZfac6TR? k)\R) %{{K˚fW5ӏ}Pj7꺤uﶗgC%go -E_JTI IgJ{3/BywS4RZHmQi,/N:EOҁ\bT6'94l9@}v{/Gɹdz9iaC'#^co/^ZI b b2XvZ3V)UJF`:jFRU@j,EQ5NY0A,L V:Nq扉.3{SGȉς"zGXUr`8l'ʇ3Zmȭ< UUU|#zWWed3EX4QDfEی2mZu$,fc3]SmƁ7,?旃9{'}?,#1? zntBԐ*й<Gx zsziAd = S诅pH}&n`394zTI#P.z zU$`)gn1{$(1\q}IOc iojF9 f_O͔PY0#ej"E6nbMsugvweW!]Iщ'Ҍvts:YBImقow?`?´jM |:uc~oEsɶ/!zQSqx YE@j󿧙!W5px. q#cPJQ]|K]q 'O( .ݪ~b @y<s[XD'^ ~Y~:gLu1&rK-Gy5J,BczmB@$@ &Cs5B=Y 8YTL"ʠV "@m rQB(ow! Q*>7ھXhTyV9~bB}RXu/ @ ZEsUIܫ33*ozb'nj{ TϫjE^Z] 7Y.ծ[!2GEYD$9K@l$LZcoskzmʔp\2{.B ?^*ni~ީv1.'"E)PTГm+ESZ+W޿uj_Q"'şM ~M|6_z_]8(%Sf\AU4 o =4($G8&:ӃٞS;rܓdq+LeʂQ Wp'H)n^,TNn3n3~ C1cwk ʲbҨP S2OէU b>eSGbVܲkޗڛ`mx"*- `6>6@@?F. *n޶~C2ω.{5^F|Y5mSH4m#b :@6E-TwI M_*xTAͭ{/haDKA Ȇ蠐VT@Z(=?]f/j QW_y#]"L+0 TU'||Ajk?W\G@t3PJѱ<8G+˳05VlNEk3E?,zD%0|"1$9ܼ%SwP3u\f)OVhHQReGk* *+LES`pr\5 Z5W0pX}4xjCW _6 84剏|~|i[ʸ/ee݅Aߧw/ES80$BUS'RY>@*-<}@tCh W[q꧂EL{ IR{m*JjН mc]y@!Z`ɪمO"Gc Q޿mc ._b*>Y i\2m=b,DyE/(ݱ>>ĥlTMd$X~yÞbCV`jٯ3J)+5r[.hF-M7іE`| c# Z V+a 3P8raTr; R hOݺΡ 6tJqW(RDB Ñ iMm* %ǘIDKMX}q㛩g$YO33ͲԗT.gg.GAz`ҋF…l_W{L>..ֶU`As8p)7<ڙ$'Ӹjԇ-ٺe)[㤀{򛤵c. jt PI[U7MHkp~U.c>)D/Ń5H$sFrΏ+crvHwjGDZߞM>%DmuXxsi︫1OzE(аb2.+dqL ]u!J@vJV`X f K!~S(y,4yW薠ϩLY~& VXԂY,d>V*+`̈́#?RcT5h w<s,nE 2(ڀVO"8/Rv b2 f-Z"OI HʘC'yTUSo[}zέMO÷8"P;چYLsNݶ}25нe{1r0xu|^ ׋W ۶a8$KXZ&mVb D;[tA@d%N @߉rv13m8)#^QUOrMURʇJVSY Ű@R[\ςe9[ YDU:-SY TZB.QU=ñ.!LRo ?#+؈`Ǵ2aQByqja /FwkYыl)}s~s/Xa^|Y)Ug|+StsG vqxb 1! OlWhz=% jCX 2T+r,x@wz:s5u2¦Aw.@$ aTѩ,w{۵7"l3]cG Jlk8Ood[7o.AJ$h-ƨ]EfDi_kmZ98fZwhx|سSքT4q{fi7^i;i wuAd2Lf2/-AfnykW8O,>]5FxQǁwtmc^e Yle@Y_;O".~?;61(.++9ɽ:@9e[x;֊f^\ӫOyhDM6% Y.{~Yi-(ϼ-U4_JC0{}3lC0nׁ4 E4bYl9h^ >hFs|@f> 8Lfa%qn +â+(E1{O1w29[8l~ua饳ĝ!X 3Uǽ=XwWLX;`؎ծ~,Mٸ |beN jUHG7~/~3 OͶKmIg[Ho]uu~梕񙯫.2ؤ T?]ӵ^VYqp vE΍c>qYUDwl;x&h#Z6 hX&kN=By^ iئIlJ:%Tl .Rw)iҕq\]߬Ω_,hkgD8)b\|f4_ _㍞2?]Jfg+=#Job*lhl#iQb$ %[F;I⹒2[, %ɿNcR#@/r#xxJ)D#w!h9MMrYrˣ.7c2&#;DטqX/e,;<3O~Q "bAbⴈA ^0vKlr~ w qTe [QryNǝ cCFEqi[EKd?Uw!p": ~7C'm P(aWL^յvؓ\߀zeb)[D=sp |kRE Wd1'_>}]W'Xc& ԨZ:F^RYmVe>O-c$HEZXWUa5rʧ\`B>PJNuM[ bf5.rZscrΛ%o o0LHTGQʷ7 14P^fMoA5~;>{nd;jgr  l`>p惻,.Yv8Z@,.jZ&";!@Be;{7i)p ^-mX'41Y0}s@CCڳZثQhpF!ړg^*]GR8z:w;fCpAu [\; 9  Fi 6j_޷ygYTĩږBiYYTjh Fa =H_˵]P֊&QUߞʛX,gz`^DL˻+^胋{ kmfڠO?A ߄i'Ϟ > +&/M)_Zl鲅Hyz]_ד2'-Hbraȓ)Kgaj@qCf ~gb5:uKF m/;ZC|~ob >M흭] 釥?@y_E_K(j8fʙ iX-j'r2; ۮ0@,]AroѩuT&U.RӴWU4-T+ml_\l{iX֗-bto2#(HiǏx%OϷ7!t'4#Q)*0d*$ӛ7Z!W+Ž.)Rd;Dv>H0 iO5Gk#@gyn7})AO2jyE>ॼ˝m?7M Urh/4|Fxe|/ aWppo7zMt-(Wi ?_ek?-iM1|݋ Qo7 Vp^" X{`§kS(*>.d d&vRXbF\P`TWC), &, \Ɩb\uɡdc^g8& _lYP>)l򖃼CK\m?rܷg3v59Fg3#(Nj!>PԠN>550*g'ƀ@ /q8\' Dy,q/m͐0(`Ll!|KÙ^~ ,[CD .l-c[dyŝ{njWp~q{ʷ 3z'R3l5VkoX!/{n^u.څ2_?yAFUH1,DЛ)|*>i"r8(G OϵM!J ;zSu4SW]^ ʨ`PD BMuɟh_qlt4&:۲|$$QDGD/2M `'b꿼3QOk]q&|:!KA +x\@7 ;cMFݟi-nx+/-KުkUX LA~;.yPj8ӊ9!'7dG؊> $AM]q]"+duu#Z~Lz0UUI$533n)z묲ĺ f1fz'C5UFͻDwiJafϯAdpP` bh&opK/as{]s\:/_tt͋Ko{h5]|b :1`k3M`8p)cb.M,nw$~z-YO/YZ<LĜNŌm^7|g2()a[}d >*5h r@P.6aؕɡ,AP¦\ZrdKs3 y{yj҉j)7~oz.\[ Z>\sBJjn?-ZbyΨ>51ONH%JК Mcf;JexS1i b7KN%ڑ@}rSDoSmD>"k"Z/!c47ĥ r0-.b|X?{ k6W& $pmmp\YTyln35΂;jys_?ÙWЎ6 #x.!,p0#Lַ@|x[vi[nӔkq[v[w(CΫ^>5Vm Eek"@! BQܴWgtyVVj )τ!fOVwh{dx2qH:CO[z-oC+BgH)džoi76W_{E>^۠_]9E~r!U&p^U[Ng)rfP㕚\֨MJ3=$^yj+ՙ2W0j&UEY E:c*'w1C1֪MZWjzw+O\w52J|Af*ܦVhE^~ZlɍFJ̺hKlk$E}DJ7 YqgϺ?L|xTA³M@(.b(šbJxѧ+-,/.`MMGkt򻕰I羭ޯT tװt⸭#[D4oWj} 6qlz)6c0ׄm}Aվ*>Vj_d.qԣ wУkym }G 7kXG=CawiZ3CWv+ޮB((b-j4" >:_i&oi rʓjཽg1F8>M(7#3!G֦7X-m9~-"tfH,SŭnNc/iyt!~)Pϯ:0Q֢ ]MqqekVoKH!1DZ!I8wM^2ė4c'!$^NLIIN'w,2 _3kA9;?6(C3j/;$K7\;'6^w +a]4V9TB]sw?\?;([j,};뺬riH{?8H$i-L)SЄ<+ol4@kM2F59Nf6'4 1re!J_x,Mo7[z}7p$֑+HUOzJA6`Xjs%Jd.XIxs40c?iQ +R=SI8PCZ1Sj_qEɻ_) -9 L'@$ (m8wڀv^e D$>VlZ65b`VL<cB0Hf)SѶ~uZ%Wd3M>>=p|}2GA%gUgT_8Zϯ kl3H?-6tZҭzz[z ; ºAEܨMiAV&X"҈``' o M6yѦlxFWff*U]t8Q<m|bԓ0|n$=6r9춏%K|\~4`Ni!79!K~ʶƶI%~_t/xQ["z![n4{%Rc\ao3Zc7ExCjQ(`}n@B ג!M)M!-Yҵ4*D`N?TLo>I(vm˿nn7,I#[_MT1KK9,L g6 >cH+r^eH4ޫl+T; l%j)L"xH`_ z-%xiah~ж˽È L oI--8QLK#}-`—dd!L8w7x-+)#q=j Xb. d%XԅARmHX .sm"g.oqFKe/Aɿ%H nd1 Zn-e.\L01GNwqc;*4_o &O%圝_ o:8߀/`py icInP$8{|:'M #cUoN3x$^D}xD J00fʉr0x sa#$xٛh@\^Ǐ`.:kP?)蟳N,wLb9NLV`$߽ 1x Z9m3?.PRcW Ħc.A|;Y{\yM\cٝ)lJp(oXVTl|ISr 0b8@<3jɾ_@kRKeO??R I(;}4<;18\4?] -z/(M3P%ɵBU! CwgGG3m} B_a6 CA^D&5ƥxeT j`'tБx@&pQBtqJF@~8 jFhhfZr/*a@@ o@U,>R͋h8uq2^yV7^'ODM7]J uA'_<6.\BcaRe[|8ۙn[Wԃ[JEO. h@=D$9R"A?7 mY}rVLvh])8QQTGMi "AE Vˆ0J?e,@V:x)b D *1?VH"Jڱ@SjتL?wFEWuWo@MrG 5NW9_]Qdž8o2[d-WEyw>$Ï!"/Y%@.b55axYjPZKg^0ꖥ|}^ U3S<CӁ89u|!ˠk;П.uҗ0 tikc q'n\n'nq@g@QD2l#,׋xdCJ{+{%`HNZ EWQ vr#Un~.ML+7joog~+|o?Kp!q2 ~\$׼ *Q>qzS^ROw}g`kZj ~XnXEppڗ[ko/= !weEǽUG}q/d/_g Rrt4WTިjBl&A$ۍ#-Q]Vtq[dy@l`ǁ @k:^eIj~%PNӵ/&髑+ʃ@$V*Ap@"8W'iBA2(#2fo/o_wg7ћ^rb-EI$a($˳+g~1?{JPP2-ϡ[q-v} L]d_@OMC3t_ooJ ëtO(q~жs>1}>>4)]uWD@٣h~ՎO ON.DxyP=M-NX&ΉvzP W&u K*>q=tJ /_vwg^lwH`Ѝ6Qoy:. 3-V!4C?hjYɶ4]/J?75m=H,w @ Z @휖',hC@ YW!Bm[ZWηWZ[xoS23ݣߋ'Lȣ<ʗ64@UJC]VtLܭbX^ ^i)A{=}A\YO:gn?okq8`,sK:+>{N8HaSX(s"s?:qsssf'aK6'鬝ʺn,WJ+juA ?_iH;[ECr}_AHiBlHHѿRwSLEi F/"o@NN,؀2#7@dm!C{/"<߄Dgݑx&?=Ƶ5 ޽,w"~0B޻NxeUEZ}ޣzML[ݩunW΄5PVSw<!>+c9_QUΐep&jj#Al1ZxK!ʑ -8(F>Dz&Mm>GfxleZ.k >wh)A<f# Pд26cilOqKX޻nk=3hV"2DĒ`7>*EA/܂'T~Ƒdz"e>qD&q؎$iȶK3VIJE#TS}W 8ʁPo,vy;KMUhM;Ṿp^|$jzg^|7(ko8)446t~␉O,)$,7m%-ϱ1#QAW/ƅFsle <|=[}sF&94\9Atғ@ݖQ/6GIiRp<X >+ߦ%XbA<mDIwrlbH/3/H 18/ChK c<GGEW+p›l/dd7L`'*x?q@kJ?] J쬚Sxyp׬4uO~UIAx!سcRӨE*ժ&{rs-$0CL[ǵ~ŚI*~A?mՏA n?c~G3qKfg>~Lx6yxAߧA+u9qB+FGH~0 $"'dԴȺQS Kj$oEg~Xݙ(+?w nه Ut؂bw J-ܽs23^[+Sḯc䯲\v#ƿ"?:@t1`oF_=!( l}(vVX bV(t t(Lb2'oy ߁ q4L &hb1Ac1py@ 1HD Y1&|(o1QŨ&O?fQo ꩑/€`MZLEXeO5R*_=ղ-8nla~9EK9񼻬*Fϒ*'O{lemm1yTH=-7*0Nք&4K.LN %xd`V~,:dMȲrjSCBRt@2RC6Y~ 9U]AJEKCҎd{hpƌ~@酴"@{?#A\d_  m6PFc1X29k<rewدO"I走W3MF?< uEO!Mcٹ Xˊ}7v<w=CJ*:XG@&zS="- Ѣi~0-EPR P_BS7s~ngγ+t,Uǵ@w9U[uG#43AOKGC֞J.?>de^&kp"iǃ=ݱǓ\Q;H;|}mJ6/Lb̕!LGuV&Qx P@)| Di}XiTm bAĒ7{G4hű,<ٗT4 Zk4׉&rQ@YM]!|W">Rd*`@h ρS`N}d/B"$M:~}*esC[7O)E:򿭙~o${WDWp""qyZ% N-r ߏ⑆G1QnQҟTc)c; J< =GgI(X>$p !Mg˶2հt*2bM~yk2x0:8Bʖ$-6mHX e9=CTH/iU;:7WȨ?#!d-[JRl({&%g' ZTjfCTpj4Ld1x[J+~޹[IPRG;RRQsR9UQJRJ ;']nGo{Rezt33o#[IG_-ph@΋<}nt='nz}T(~)._]>SxʂϠ m]ۑ[ߟ|-$bF7^y ۣbN@Ժ~9$5ӒB .s/q >o\Ƹ&"_5CU, $dOO?@4DO?$7:[HaA`<3:4>'y }c|((RWz)_Ic; {yf%c%<=EM)$ɮrU@҃# 0)~3,9,$I 9)D@@(  "(9H$sg'wuU0s:Uz ͘(g ,Gr}1/N(Bər ZK떚` s 6/Lr{Kݼ}v|o;iZc]+(+毘,Ȃk$ȷU|J% -Z΂N|&$,EW@S}`*@O6`<=$> 0߲QXY[w=y[6u~+k.ZA҄ܩ;qU%ݻ<"Q2SbGiREB#=4^M 2 O-~ߎ9Ejmğ !`3d@ubu=14zO=FUu}z.VPl%tg_=W'_471|h蠞 5>IXX[cl^2;wy*l_w C)<Bnr<:QMD{):'`"6bڀ3_ѬV`a \ pOF7Fp5.@v $a5.a=(o0"@ nF̀ iR!MI^r7Jcu6D +4'(l AQkC̜Uހ'xٰ ԛFmVN[<"ȦRJ?hw%'~'j?:{ׯ?KOڵ}T%?RN+xEpXQd( Zu.j+A5eոV+hwPd*N@=&åafmKLCYHkT,꟏[7yцs#M{A,5A$7D-0*1XlM4&N?W~^5Wgc3<]ܡQҎ%-HVS So^3Mf}=rg5iJ m&4ui cP7{[{0jioh"e58ha.k޲N ʓW͈'sK=ګoTnG*?`ZQm}C]Syi(F3ztxá"GeLcqNTqUA9GkBxX"JXc060ўȆ fj;{-@ Eaj W]{Velh~m,:/aEmw`Q?A'u s@vyU m `1pD|j^ X82Al X K qU-<` m`H ki,0Gݕ@˧4f.9^s?qPDb#1d E0%"Z 2BMn@BE5=&#^{/-Lo.McvX+eV6v514l%[j|8hd+7@J 2^IrW44$d ᠲ"BZZ]UFAC`X`n zƥ>`b-aJ ց.:PPMGA=UgprqttԇRҷC3ijȉ>zAZCZPԇzN9E^[Pgz{{6Vfp9Sat5&Sv@ݧAgGL005Lef mtΤe[ᩡn2S)+>Z%VSG!'کSYſ>툛`-:dyA$@AGHW V bAd <j&xc *jX +,.NN8YsBfHkQ:0 Sb Yg`)?G09@~- :4gȎ26dfd3w+iYnt|Nw\ÓvG$S hA"kB!=͵2AZ1AeGoxKF~Ϩ:Ҥ~-=-q<o_;{?KE93fi7ZᲴ 㓜X{V;M5xGԋMpJ+ݓT>&"/ŋ-ޡзO]Vo MxNbh g(8)(&頮2`!4rJ Xf'}9! 1le>&wL8Nhc FA&V_AE 20`-II><'8 \P`m6<9osSf(]Dq\j;CڔƐ/f@Vk60bտ?B7VpL{snST~ 2MAmm _N[ߜ+4RmlV h} ޫZg-`TCYR9e |c\RΛŊrݑ`kJ4.Vx'hsvhr;-oi˺2?,dn~r}уgNc>a4,=F%k֌U( D,\--u&g0z\5/B5} ubo7e?4v7U1DPޔkڥʀBzrFZ*y[CK‹B rb5}{WMOunWm$hyDt.Z D|ٿE (PP[Y}9'9 J"3dT:jh1ŀiBP73ˌ_˾ V`col;JD (+ =ؽMy@2s(3I gb&߀%,tMGbm]BG75[4Ȩ ~rE!eУOo"mRW[7yuwqFAw,ֿ?;#!:GGls܌8b|aԷCύW ?+^(RKls z+~Cuð|J%@Sp$kގ?\ӷwRX K*lA| o bD%+kr`)u1H! 1XP,u?(7 ?+@Q~UA!X`s@k&]F*<ߩKAMVςZۻG}Z:O;Hc0c1cu0kmr&XBVZ4,0†\/򘢟CȭP5$ TU-(@\JN97h:h*Zi #A=%?3_z F-hGФ 6=NfԲM򃧺'gP |h "AC3JPNW4/3[FxVaw_@^h[ݕ GAK1Zurh508;h竓Dy9*pQ`i򲬌SN,r@|'{@釰=\ei r5MGk:X|Oo~wO}Û֧ߞoI!HkVpک86AGJgoDqodu)$x#Fweܭ_ pl EU * dQ"@8<ԏ'}ngث[PLeL^3t~|0^L}:%  f(4<BT5~hſY!OA+mTKQL}H{dTvp+cs=4% ?eȫ_ oaɐyt'`jba ͣAM ~LίT*Aqq$`mUH_߿{/Hv$$`]f S͟%xx{nxO4/t>ݱ  =sFXGY{()a(% lԡu'G+>!X}hy[Jw~TіK *Ut~%π;XLq;|Ԧ+!R )Ye~N/zrƍ`> Jկ5|Ӂ#ķ$j}ndd%w]/Q@.kl-moH 47Aˇu$# j,_[REXirܣO/_V7е#CuB3a 'ȾSA§yZ?V6v }1D'@ʛXjci@;CE!do'% И36@6R X@Mw HNQZ^9Z{9G--y"U8ƾN}ϧxǂn ~nu>rD-s|L0,eRE/.YD- X':S /pGLzkfmcotjT]?F]P:+!#-#apyaos,\ͺ79G#rB؋ʡ\ʼlKm+>iq@*#@#YMgCAwG։2*P𠀈#2 pY<w-OH980ŷ>d)(ŀZ!SA<"G5Tu{Bd #AH)q*\&>X'jO! ,@#FRr\Z yEu Z\ A,>PgzhK/`obk>I~} }@c#ж3WDDvyA.P6rEޞd&ߥ}ؚ[)aM*{Ⱥ0@;呾xW(MOC]DWm)Zwߤ|m_Q]Rzw*2^ x$sIDATڞƔsNvJ^]&ڱEw' AYLޒ-Q?^nS}'bP =,p|k*rc Ϛ^( Qz`}.<ƈ =WճZ 睌;Ӏ,D/Ap\wQrT~9U!y&D{+2;JKPykx3^d!TP_eRwZ@I5 p:xgYWA0>M4,eNy $Q_Z|m$tƴ|H)t߫P^r&*WIcU E1T_QG~ bCU;'bmރ W>A 3rGi% (xS| db( o+fHˤGpȭFOmVXl?0DsZ{ gߠпҟm:V4&3VLi&w,fh-L<"dQGtUڀZS`3PwU@;" Y9_k `|y@s)nןC٩ 3`cD(O!mNZߜ"YT3sO>թ_{%gHuT.8QMK~N/ pVDIKHuvX>Zf:t֫zT\4=+мGk_6Mj}@k'@zx䶸]2elmZX/$ (^ܸbQ(#)3&EL};v)=Dw|u85ey뙳[xŜY,(P1%<rZcZ qρpkʖצE :LK 3k!l(Mݗ`onc5L QɴY9X /lhwGmO3e{vV2?,Ӻ%b''t<op+\&O[6l@hk{833|>aLzk:ߠ}KE\eqP$O'%A\##em@`)ŎDGeh 91YWAgX  t/iLsLkyU3ۯwAq.ZC('|@MD=PJ.wWô#}fm>=u=Hy89eh _hWQbo/?H|~='4 `:+KZRbnq+V? KxfRWdk` ,P;:l%Xo K_<ӍnrNc'l Ae^Bl,RAsD( &]5&uN{?I'1iY7:M.0,e ׻PnqT zz8q9qAs=`,nN0 P \\PϫC``KϽ:`^oOu(+ebPu q}'KKinZ{P Xw:bŸ;t5Fv'X AcfV x[^Z'=R`Hi3)BMqGِ2_=mV4h\ =R/&vzPP{=d-% /q35*E.rx[ґW˿˲o~>.}G8ۿok_pf7  XZyfsE0EA+g2glk۵-=sto#y,ЮiÁvTw\2+ҫ_:~rpA +t)dD( GeN'&$U׶#0*voam(G80`.0lkItϡ\*.U5`O T@%飳P%o;k~Pdd2R<?[A% _&NcypV9)<-EW,yWUO6OLOi@2(e V۳Y'WPlLʶ~@t1I/L) N {~Gy8;NpְG9&:~%pFhr tsx Oi9(kH1hN Z_2P .z^J95{AlOHV)Ht>;<ٔ7Mc#3 KV `μ}N49{+(K 0cj TGWj ='ܬ@{T< A8OD I6_C4ŸF~i/Iuϻ`EҺNgOuqA [%@$IbȱrZ\)^fp-/EK)P#AϚ`rk52nd \sdu[@*=&`Ae@ݑy?0d緝RKuZޱ\7̆.o7iayi#]uJoȥ[_.Q( k h{!Se=-3 . 0L z 'MPҵ~|k3٧:5^Ӌf!8?z*?*2\uoKNv~uY;#񮳁V*SR<.b(SW݃<XrQM(#e~&lZ-S)j@ ~$ pYa_ e9ƂJz2F" 'ɱαѶڶ(RCg ,-"b|>s{%ruwK@+D}[>P+o*/ Ͻ!fdh>f&N"2,䃐`tC锫/@@̀Z {C</V"lQeVU/u~ei~nI6Meƥg}nYROaCPgMu2oreq&}TvN׻,q3w7NJs !7f. RSm8o):'GZ ~+_-&܆IPb6eM0,qraaZoMV oTXS42O03ԇݣ: *jŧgHߔ?i= JE1O /3h(kxw@3u >LćzC# E}W 2d 5!~Bڃ3Tp["_C*U(_3bQ0aZ SF[*i-Aߕ ~!i<$q<J|Ru/{ /~}7e8pC Csm://ŧ+}Թ{jRoSJeg85Ԑ/}TPuẈSxtت[/*t?c`^vA_-ܻ^%عߩ`l2:Swb]0ۈD)ePIte!iGd60J~qDD*)r맟N|.cR_%^TW&hPPH`ҍDmT`&XGY?"G*alog}s%mw; @gq]`hT+a3p|CPde+.8`ͨV>wϿq<6aWsL*t߬.䪑{\5P#2Q6{Y.Uݛ=u59!|6y˲4's@/x!@y( ,M0k}-*ЎEluSF3 (1p;& jmеߑ[b%@Njq@&,'fhpHm {^9hX/VQS끺Dk9hթU@V; 漈CEn:jVDO3.A$H '\Xu$N<=?.N'r[$j7/Վjql<; ҭ]fͫ>'}СҼoyn(ޕQD6 r;Z{ ԩ]X4ݝWuf7Rd[}#w\nݵ\~AKݰK}v< zʭWS֛hL Y3}EBo/Bh!\,b0UC6xzgA\ '! zϚ |S eϕ9.Z.[Krإ-n=' ,Dz13xAK_u ҁp1T/«C:(E geZ#VA4;ܯ-r q`M q!E o] !E<<Tl2 ENzѿk n抋<^ $@矾\|+ &@&ټ!jꠕ`~Fsϝ<CyUE# /\:$"Qt5Dq Z{T\S< `oj?[߁!Av D#,w%1b50<& ~ew"B^OMQa?K.Wkt% ƪ +"Оy{!5ΓDX{U`}6ͩ_'EhZm߂wrʝ+ \ƾ`, ?Vm4+fL,C sW< mvNxg[}G|#\ sZ^ٝwՕ;]VnȪ: 'k@^'WyMl9W[״Y+@yzR[[ ^:nu!RQP\h=M6֭}JulFuXݨCqǖ]?oM +(5M?gjʯjGGm PKb4R^WiC^@u̥3t#)C^vw )3&'02YO(} ӝ/q\_HZayH9PX]CG$Bz^9R!9h_D18\'"=y y!]jRҐ!_Ȝ<%<_xl5rᄿ$+y;*t80QRx)Ut I=;mG{:<<5!h[cm2s!jr:)aJdvPkMbHD3@bXa?Y~ dvZ *^ީ Om' My7fh$B@^Ԙ ъAO<@=]ɀ*КzQm ۾$/on>t~ZyIԑ SzBԬpiɏw-*N;+|prvyuf'M)]~`;7fCLds8h>!O-o1<^*7mfs m PV>B|YS߈?N(_>A &Sy)73d0&\;Af3J\M oTy=BȢy d9 % µu5yPKuONGYZeHJJ.N9jW?#Lh7[_g}[4qϙ埭uxÌƖep"xH)/"!JjsȣEGBfIIM/U/[luekN rֵNӽ:zD{)jz-!g|\VAI۪fЁt99SX}ϻṴwtp I*< |[L0a)KY-7d}e)WH0,0 Uu nAi܇\2Ƽtڒx9Nǜ>Ew?S!XZf K J]:o Ɨ;wr䓟ˉ9cM`%<2S|eg⢓vG8#G`gZ;O`me dVHڋi< H \)PQ@9s F I & T+ a1@Y[Ʀ̖p;},_Bx@LNӦ{fHX,iώ+9A Tw,&*z3/x|ԟ<}O1V,s08Pk2NF)^-U4 }Ug~s:CY .v<:ܱos0϶gYmɪ@kbJE}5#`@5 r*- (VbnA |?i'mOw&_arw}6N\Ao \dm.tҶ-&-i)(! 7i/I2P%6'͟v+7oS__Do(ԿXB40 }S/w  Me5=R`$wɋ> QN\z]ЧzU{wm٘(VpsߓEa9x1Jk9冔1Z!vJ(ݒ7 n鰤HqQ\P׫KC9q5zXJr&GCs0, ,dtaAsEd irM{w hxO{h-Ui^L>ᢢt.<ʫ]^=x@yrHHvFp C; f=*VY=Mģׁ֢(E '.b}Yfysr|} N22k;dO"e޹yr3c044Jc&?>L7aYM6݀RM>IΑS23oV 6vWn=l{3d6F, ; Wrǂsm 8ؖɜkY)`l,SԚ t#Os;v\.Eѫ$@*'1E\kʽp*pG_Dֳ{AJ_OW}h͏Zw{Tۆ/ yYM^4$8u}t@^Ԋ&@,ђNTk +HВ!ָgaΌf^<#~] ޚz p$؋;ã.w[w_*XҬm,% ±ЬS>hT&oB!_>R@OxD<H( DQZYihCSoy3v>qo/+W\7kldeG@aCF"Ag:4t b aQaApÓG :˟&6kO:UmF"tUw- B&lG#l!)cK):b!E~~>{ACƈoh雡nbONRdmyHGl'@ Umcq`pt≁ecҒfͱMW处AmF2g%LA1yOA9sDe5@hrPb PHNȵ-PtǪiv;sNsΑcD.yujJ'gΗ]=7b"6{EFK(~wtZ!puvѕhb ;mp|cK) bra?NJ3;\|sNN[0s E9)Y6!57nL3 jt *00l6|ăZk۵^TFoܕ.-8XZHjb]dyC_&w]}+?T0f (Ɇr G&UqY mtwhxDfQx J=Q2/fr{ YA'̔1[c :(Zqq{J/dҝgczMtIo_~o] 'B6=*`u`H,*T21M,Bn;[T]7M;Aa3wӍ@}`R(=|+6.C ͍J9]v?XB֣`m4gL$zE y U9Adii®r! |!粫<bӞv>9۝}s\~> [zҏҥ?~^#^X-e]dq)ݞY؜ia׬U?Z ‚.So^' _z{T=ĥtlSn]/AU:@/HՃF6A =4H+wspm[] !߽&A5C)@i̓@SP((Cg~k:{ ]>8n釓ہx;yi$ &\a`Q@|#^318e0n ^lܙ:ƧSCyEsPS@Q'A*I_(Կ名)s"j<z\|, '+'Me38y? %2"N) Ks IQmr-{95pϷ?χμ΁=]=}X9ݖjo۾̅ {29<Ha$dS}rߚqo \yti38)7thAgs'gk 6^]QQOuCW8j Xрjx1f>{X+У2ArMu{,fiv^uK\j l0DV+M,x\`8b0 /|f5鹗}Y J|UqasMȱ/<'T cn/=$B⾤ b_ "L5bXI10el)0Rd, 6p$:Ƒg qC93I)*Am*vyY|P #yMAI3>h_jv=a/W?#{\w=[;zbLk{ R~tP+w~ @!gVn/HO:r ήw= SߙWw{%cŀ9VJSK( B,mfW+P6)M^EAύԊjXGa'{KNN]#GFОk 2C,ڢ0h/PfNx 3PL4 2yQACHi4 O;wBcxA* Qf (1r+ MJ RjiQU k?گWqtC[<1ar0Js+.߃%dbHMZIprt_ZU;zr1xf Рl\oʔV Gt|>!A$'*P rP*K j"?rްO6]2ˤoLVIX-<C6Wۢ]`%+腏iܥw(wӃ3t5m:\qX? Aҩ r>71)nbX2tqd)3 \3\c=!QK(~5Zy^#h#pJL0Ăl)ߧ8|4 ;?M8,\6/aqQ_fwLƠN'AdErL/p}31S;oi>`#Z>}RO/92=gsvݽvl.^/rUg"RD<-'mZC-J֚Yh!-8LnÆN.: (80Y8sog(Rڢ*, kkL ~T*5 I(P#D= tz (5nmXH=X]HSLX)Ozg ԬQZ>&X{[ai 1I?[|3a_C!._t`y6$?Ib2&LM}o-Zo `EPp.h&bK1+Alx\`nd `{M;U (as Zz>^v 1iA*YJηr+z89 "GǛ'D@h@/P6`*hZV*Pp4rt@Fm|v|yd̽ l'[<*H;\*CNl1`[jsF{MU p{b( AsGA-E&AzΖ +Z6T}Qm@Pcbr-N) T(BI(H%n &.(9(;jnlOsmgI p[oZI4)҇@oVwuz>(e.|]sWb_S07  )t9b6(iφx^ w7MyjRyh%*#2rhSyM|jmoe~`>f8K ׊ctZm>uMNK<O=ZN <]whL A>o8Kmop}_uקvq$g>vqѧ~GO{^LzEGѕouu$nx۸RQ.A6/Ņ'p <|3Vle6ey&בׂ~jO%$_Vhė1Ҕ{Z_ʻ$-bHiȦZ3m0E af /^: h2PDK\+`Xde, z\4G2d?g-7 >OCpchn 3hQ[XV;a@9G JY%&672>bTNﮀ>"<3z&ۆ)M W*`XocrLN7%J:eܐFHyIH1dHR ,| -RS@Qa8+B&.7ȕqq ͵"r &_ '(( SZ@~C@mi}Yu+Sޡ l ^˳yLEX D̷@Sj :|TʇSm gO3l-70ɷ="ϐ~§c X,ͭX*銩i.Z/B!obt%@j*D@v ž} L M-L@nSi@. d텯o,/DzDA[ʳ a8)!a! n{cpޜK˒(Xv% BN{Ŋ x@=5Wǂe_}A}rN/`;_T{zU?AO]:(XAvaL4bB-ۈSA$NlF_-B=~igRhglE Ѹ'| n[ܵxӚ*<fݾUU_`T8E< &p lG0x]嚯OJPxGs9n^(g%rz[;oo:ݥ=>}b_T'k󴱲ҳbM NCF??/3 cf?y{wvFȈi9I9sVD vzZT4$A1 ?dB"Q1Іtg߸~q55oZi$@Q#eIPӼ ʼ8(%VDOP'1^>kE 1'%4-U;D+7$\u~;Vy qԇwCBC:X'V/K(c (_0;F@5}6Ydy"<-@hr5PdK5)o%_G~ qƏMuA@rn3UѲu(|!E، sd~m(Tzjz~,Y4MP (m[$WW69S.4c;4AṊAͣwg>h՚jPKy[Rjdh'ԶSn|uԝbBpPLcOe%g:#펮[܂ϫ3̹XcS  *Ӏwd5"5/dD Hh حȠF@[w4w`Ʌ e2 ^|x3@PVJy%ȯT88:Rti~eX:7>Zd* G @)ЦS@.Kl =>2g^%RN{)> ?# ZXG |1&`TH8s}X3B@҇ [XlRJ3Y;MO+3,:i ( lX3E9_r.}'s9:Bdu{^+ЙޜWi}f LҮj/21_PNq" Qg7EZ/(.#r hqhWvٟd 93ryxJ`,~ƒ?f%r O:(IaD-ehS#P@'c!Еh>x{ 1b8|4<r=,wNCʗOϟdkFxjCӰNad iٸxlSN|L̦4svh42]&\zmz$ x$ 3#8F~/rC#l\09I66`aclq0iL {!#O@xtȕ CۋIK~NgNߥS_g ɭrODi6S@!s<8)&`h+, ry@ʊ@^r}r (񤡂-2lojmCZNZ$- <` Cpw^t)v/"zaL*#J* ʉ2xzO= ..1< " p gBBZ d_L@oEvM X1_Dɥw]>eHk D^W ѷ&٪! a# A[B81h X&we1, Ciq'HQRf5)R걼8  5@6|~/qG9OCOC5oBÊV ⋒I?=ڶ՘ViuQ޻k7Y,eAvR/ʵp mztgDH,'pIe}_%4 IK,V r<(fzT4  Af^9 ie8$zց{!NСR1Zka!p0651޿j>bGue֕Is/구z;]aUʪ7M7TIWNL54_bb3y[/nlZm:ҶRswӏb6^T4%Ls{I޶UyU{ fOe|߅uF?*#=%kFƧVy۫\|=csfXsX]!i 5յ ГKU 勵.jvnp609Lݟxv{3& 9F UbB$PP T>1hץKZz*Jp* .[_zjGȌHK}^qJM*J%r4k*Ox'L PnxyrN? pJdW55΁T6yp .gNo obZK Gt9paàed] ̿ZbWb`%Ncs&DAK`%zkD=OK~50x0G{0(JJ=S7ܵ-B L( ݳדp|aԇzj+(dkwaM:s)`#L@l-nbo]>Oq/;EaM>{^w{, KGp }|+ _ ~M݁x( 2d"@Fc}AJa Wɵǥ>g37H~!y1\P= *W{,^fӓO̹2Ugx]1WԻ1?f92:i:~;|Wsg6{q b7 yX (V}+[CcxU7]R}c6=tnвkh).ܣVZUkFpma Ͽ"!t!,ߧ~' Y#mkA(wE&8Q$g%{gGX+^짘ua)x0wh@ֻּFo|Ae(i@#^RmK^P\`ܾ\OViAc6RcVAZ^z 9@BDGImoimi} ЄyLlDأu$u4|>ER*j\CWK{~{ dM<1@('}ݳ؇Oٝ BEoU9_" LJ@1 ){ i9͉,b5H,K6s ,ڳ>u #VY `'gA ?cP] xqLq٩@/S*FQլ#3>n r`xhX "lH}ph@j/Kk& /) 1 q(*U)A 5LS>>nt;ttWwo<4$,3Z止@=mr?eu0.50F`iI$iyi?[A99C͗Yd@@4ib-.rPCv; 5$/Pe?[չ}?-xDSXDqWۨ}|>ɏ/&V`JQ<Gz| Sj)oP8~Tw~B撱EgZ;Q  8p_grH}-Cҟ+у/SWJyT_k/ʍ? ވo*p (a;! @G~f(R$c#wZ%pg{܄WG ꓝ0 pag1CƅjZy̻ _i gQޝ GQZc!gbN F= z} nqSD09|ڦo.u>dqVkSu/W(K AH9Q^'6O+sjAUؕejsc(~̐s9$ *AQAEA $+9s94 ?ztv{ݽ{<L?};3X ۭ#}]*ksACЊxZzymM6;}T^9Xh))JQi=R<\)d=nxyMmqwOSOI]0ؙPZP?Q+}JAեk{};xF:_ggo Y>-k8rӷ{48ӨgPR`pK_fϺ_26+@:J*'{@?Oq XγW]G!}\¸9'sp ooE`LPy@Y7k@T @\{5m^w<5S֚B?CDne&tG-jap,^."B@5-j3أ}.7gwPtt%8VQW h hq >R R$者@^HRY@Ipt{۶nؿ.CkC*{:p(lxxFg: RKDZ-w9]MW5hՖ;V!Ͻ bJ ogK/K<ؿ[|&W`} ʓ jҞDM,<P C|((O /%G:|^oWpŗ7Z@1BZ6"62x7rD3g/4٢@ I? c2K )n.NT*1WQǪKu ^*dc6k<hOAFV OA <ڗ`efw@֞&#쨣ǽwU_~ή:8N{y 8q.o[>y M>hޘgO~ MgBތ. }w[GL{(@\rn&xA6s\?aݤL/SAF*?mj \ UnA20]ʘ(u G%dm{a֗WP7[\Cf@31#_WHhEFUMe!|[[yB%7["6Bvv <;zջQ-eVC)os,|΀Q;''YPo,q}~5R'v'l^SoŞGޗ@hOp< >DEw86w%I Co3owK7ݴlOr+!tVſW򺢬@2٫323³7fY@/硍LLE{m싹X ޜ iZ9 ~}CaLr.oVcG-R(Na</uX XH\ldv֜__ݵV<Vܝz~oȺeR,pt\3d.escЎP"Qp)njDH$ w._qkgU9g`WV1זɓdT G)􎥚GUU\_7c:S']s\U Mo;twz;ٙӀ@o OޒA~ ΰσkBV8m8dNl5dOu$1ϯ[ʏxPdaře{CHpd@iZ I[n^;$:]aw0,$jzfHj-Z:fnyf<^Q TI6;,}_;XY;,{-rNV3=HPxvxEP#Z@\q,X^AX嚞`,;༗z7qWnfdr@ңU ! o=@[h z@(թ$$Q'p8;%4.χf:@@ hHU'Eܖ0@|@:!@ΰ1 SS @zEeJ%J>+ŏ ˎ[3/.)!toI`RyCw >U7נv+UҖ~! ރvSzg5-FW! F<cpHTЬ*\~_R9Qu8 3ms'LF` ȥdwPd,%}p?!Aܢ&P3`Lgj[~Q} z8zmҶkO^]kwopE6c|v<!vf\@ >xeɃbps-m[9H<%z{UE#(OoU,>p% j\gl V6]rOʿ)F2UBJd\NxˣϪd_h/ʝrX׆#~9T,ؑ( J`nz\z V1SҏЉG'%+m}Cv9boD9*PQQy8gjLʞ4{~;9Ul!B#ږ 6=Q] ?;D_ e( ܒW >|BШoJ`g7O$"K֞pwc(^}t!W>} A֬Ay)M!ˌ5CzF܃ؒܙ$,p/ E+P|Ⱦl ~ %F(\%u)YX}xm 4\_~x#^;He50PO1It b3 Ԙ[+"Rm (n"`>{@+qF. "L[K#do9A,}=7\9uxGyx@KWR"O}-wt;ޱkyoQ_*<8P("2 GBK/ &GwO+},,-@W a݁|#Ж"e\D=QPqEq*aCxI%p,,_@%aW6C<;x K+*i^=u >[@/'CM{YD /OY*p(j\80,#7{H dɽќ!:\~C))~%orB!0&HDY &SP4c[U7+ȟAF0AA|a9 *^4<+`ӝUvV=RZ"pjg$?սYtCk :wxfSOgLȬ/Lm[d}kAkц DS.dXAbrܸ)iƲD}l\Db|KQxxe,]hύ֥֛ D q _dEYG~L~!ty+0oj\dBϕ!pXT6lYX X૧%R$>4wpGtDQ ިmKr9;sh!䜴AAlnqkFL(0ROqewCn37yw7gfU,a$muUh}?eǠX*iA|i'A+3,4Bԫi⷇ZOs LQ~myYKe64GTom04}bǃ@2yNlއMXe;> :-0)MLK9G[Hߛ$"x8/dbW;oRE {*=}ڳ g~F(J/!50~1[>1b\[1*Y ۺB@Jćy᠅k_ޛqNL9VD _S-#c1ʐ)RD5y5pkTJA3!3!!&WmH (Rdc) {VPx_e@P`DQ^q֋C+vOil @g9/򂷍G!Zc`O|c&@~=p?i3g3ho Uy9Q DIqH<wAy ~md47c?{ݱa%C_=M6ߎBゞ<}(֍*Wj́'?_@һq ;A΢ G"*M$@{?+{߸ KSe߿1[P7pC^蔪[V ޤ'h1ZYq ,#-򝵂u,XYX%D85pz> k.fm^Wb?vXRdґP4Ă"eaF}yM] ko Y\yMhFxpCkY+Ի&XEgY~𣑋"Z::6 `z$KJa3'SdXZ,uBלfɴM?ZUMV3\ ( #7~*8X!t fZh~pi//_|t8Dٞy~qVyrܞbG@|"".HN]6d 'vr[ ~L6 ydOVS((HRm]3sd^Jiw87״b tq":Ӧ@jrb) ~DEٛO$ZeKׯSp:2um_>!=poAտ)tS,E$h'mD~LZF~&CYQw?&F'G{FN}ڔ0餓K񗋡>@80&pz[ce+鴢9x_썇uc_Qk? qC䣿// S,pCE+A`7B0NL= ON]>83 Uay0/dLQRE 7B ,N뇐u'rif8GKQ=}@Kֶ[ǹ!'qqZV4%z DHUoY#gLss[? ,xd>$V2n9c][WuV("xoyywy&P*? 7y]Pu!>A@ π|j #1w@ k _sA }#(tpwiJ/&;1m]g@_>w&,? E|],Rq@s9PXH}e&&`N?&7J~2M+_>P@Gz~ *\3`om-b0(/#*6G{uM [MAto7D(^+j]֢~}±}@*+;]KO KAlŠy bK`>X, ҉LB+TkGMewrq<:$a$1 \ISXiWJ g<=h1)lu8lz[[qleEwý/1\^i䐼"_5aЊG%} eQWQGxUdn5Z]tj*Nhf@MN$VLncJ{N!}}+ooWYO]X~EA֟J:iiʢK3kH헒ڨAJWo2,?Ø7sy(Rb^oYEy?E/u33@ b!XL7>(ӾW}u:u.7Ӫ-{ { v[_@˝-]}#[F4pD,ߕ6em 9oRc;t綜Pγ\s]cT@⌯"'a cZGp 5-cmoOoR&ϒ, Ǒ-l q l~V}duC>?A!ׅO" cz!Vtt'" ;;\lW pYO4h$ЊXkO]tm~Osd e7$hD/;x,1U9<<=A ^; r!gh氬O}R`y&IA\]EdM\ݗ<@pF-+wz5_ ^_ƛo̓ dؿ A_8p2HVEmK`[ڼAPr 7j^ 4-^tT> 6X(f @T^`?UiTW)ȕF[" .u5_V1r5ժj jj]W* , g.BcAUr][ލy,9K"xJ]JyO}g3ֵ뼴y"w5{ݷSV2RI%OCbQ1)IDATV5|{-,q_)~#󩳇 XVlCI)jă|wG~Ӡj*͇aB2! 퍗3'Q汬&狯dLNr>؟(6g󱳺KL2JeS5tس@N\;J|<W` g\r=0BWQ@ t?k I*ȑYys!* Z!X k=6"+S _+P#p~5{C6%LДC^vɯ.wcs 091l58Vf͙iYĒl3ꬋ[A'~^>v.J۰'\AAU@!I E` AXI"sr&-V2S$e3`ziPIr5b?+O`y|%sJҰ`J18+P=*9Tܤ+IAlNf 8:^ֶYȍRE?O+۵oYg@hT=e!5QZuۼzͶZޣ1V: S0DzE~ P :|k|AvA\* |ef,pG^gP@]Heؼ1a#+m:}X޳kiy(ZG=.(o71co<S?S + B oR7;F.r!a'dR}I%W2h~s|p%U\?*^2 h,sJ̩$\<aMꅎ>}bL|=`fSu3T9-?WJUL*Vs])~]f_Wq]auOWik&JՏaj3_TZQ>4bߩW@=<1cg_v}=֯*PKni*ȏ,-u.X--ᵁT~ȭ7_ H"ˮr5 (?_ !ĉB@& $6Wr/ A+T ib4Ƶ;vH+sJЦjk WyBs=(+ N8 .-zO#1R^Ki)P5y4dOD,2F4kF2A~"Pࡨ.{*Y= dw<#<{ mJPKm(؀/<^O2x3e<!kGOiɐ/q>9;Up^*8pyPÀjR(DA 5I k $l<ɎTfBOp$' ɩr60R` &[π k> }BlAvǚ gy&G>33dq͠rPAl/PT*%eFh6rK'xtûô{? H.?iԫ>ܫcqT7`XA<"XBָ@<D{D$ccܗȟ{c@m+vue hD;DASx`Q dO9Q?-wh'Ɏ DA@ h#V}< Ap0]1 X[~́` s`,fh'em1GL-DU. :ǁr\ DQnKY Pd(JP\cQA $+> FU>l'@@TkWE{_\b7{qu0i2ƶ {9K2,8On7WtUvv~WMIح:juE}%\HR7Ü7Tht'MbêUTy㊥u&Ip6K)?_ڿ#YC3c}A "D2 ё&ۿy9$UiiQe'N (Mt.-BZ>\&$#}p9H@ ?!sW´Bӵ7}s (jgD\V/)VCɅ}9 bG!KPjnU Ro? ʶpHLS;KC!yhqlbxa1=<FD->>o,-ó)/O=PJi}wX+NI@yPd_2}# &qz[G>Tdr>xc-Qw(S<91^m+~;ϡӠjť]͍֭,u*#W$lMHZuجP "7B7eᎵ#}w FnY8oKN،K9\~VXK-;o>*Y4Koo{{՛ފDq)Pl@zAd VyBۀ,(?ῶpmY32%g /Ľ)5"_[[&OλKuz  6"TErܵgo&wG}DQI琀V![19pjh+)P@@20pWt=@ӟx[#<8X:Dv!X4njo|}|=> ]EGOX/πh@&0Q`PDeCdOV'֗mn*rü'ė91l߳m +`wF{m Y'yŹҎĿ8fQkV/5=v>`ԗ'^Bt/[]T*VrVfQZr_zW׿f|&YQZv2ah\f Ozާ7:ضh6GL/ b;UIb8"bxKx8!^"`L~X8"AT>h#N3 >%A Tud)Lbm@x)vN;$>1p.DÔ~\/y ײJ/Wgy&!}t}B- 'G F}-8A ޣ%@~+w@Pr}P݈JDK1#;xA}+1 HJbS7khiG,q*=PD vIi ۿiG5)*ɜ6:gοOp>\@xpRaˢsi+KLEk(h ,dĴStZ(HIbZEagFԾ r|+J}f%o}=*QИķ V+:[_KKrx9q ^׈s8 8:+N8Rlk&-MH)[8!n GR7 JϬ`_wŷ l XK8q%D=8. RGgdN}?<)XY߳*~?U K/~!xL,'3ȱ5dǁQfP=/{rm@~*v7փ Ds vtV?eف332:r7ςu}-6|m  &eP+W9pCP^ԥNMAܢZ#(I%H9*hcr@Sl8 28/rh 6땬FY!}q=spUfm֨^]wԿ(c(SC%POl F|Ѯ\2P$5D+8$[`~M W1^oV^6=jNNWw= }inv2(`̔ 1UAC^D A< "'Q8NA4a;x7@M֚6D|ڷ9h.&x_, 杨@RY6xQCpvydDžb(/˂^Dq>G%!>$a `8b*Bs@=H~KG{Sw;e.b"e 7AH 0F}1ufMW!J*͙%`>})DP > _i {K3"NĀfzlE[=s=!մ촥}%fA6 Yig ='QEC-,V.o x8J-8gf`O>1s77ey So糠YHq` (<  @|"/DxpNՂÅ y \TUA4+A_7ۀAzJz~T&6x\k#dphüQTG:m2I)U,bz)D ?Oh^V/Ty TEmJh+` Kzs~8`KA|zj]|WUмۍ޲C굻Vy Qk7^ "AA[jeŢM" .hZ12}AIˡ%0Er@fTPDB VZO C !}j%>8a?1-9Bb8oB3HٚNjyxROãuw=z R& z}1E jՔ7?LWzd3sBH4]m*fd|e.Zz{=/dO1 jo\KNv1@3`[bzQuXU|b0S} 1;PѿSOM@;nsktbDzK0!V5Z/? 81`yF{9H_gZcq\u-s~ys^?X3:Yl@~$JYМϡĤeuu{ FQ"Ha@Q@/Je^_~RzS,9J&WI~ ю88wFA U3'8,*܈A=TgDm`8D 7r`;aƃԩ`k(5#?Cu>w}8nZ%n ~F'sU64 A'k e$/ʶod+p9;^ 8flJ zA0eyR!yfpІ48 w 5v a; Vb$Q`N( v&3Xmk$^#,#,9Z1H~#IXXe)@ߋVC[ub tw װڶ@bC yFgO%{{pi 43[F%[U ۜm]8YzwsnîV>߱`WxVQ!^GN1>Q <^n|/—J.oϵÇLD?MzSr6dUè+2L aVbZ-a[ѥoJ[hѺvNzj{ōٹK%Nw\p !@4FVz rc;3#NG^_ObZOkΟswUm`~}rvg *@6 W?iѓF97޿֗տo ? _Q/FOEihBhӱq:\4 \+W ]d򶖠؄"gvK~&Ӝ&b!m- J6ٴI(qJ 4 `O lgv r6g,Kupx5-9^8! ^K~k; %I Rb@'[lNgl?Ț OdzA._@+iy>i`k;d>@|"<֓@e smx+{˼%a <<XåL)C}:^W@ȽY T[5_ɒ'H4r3 YBD#Mb XHC,RL`zZ?[@kg񳌄ċ11G`}zLcL<9f H Xӭl[Cj` tQw,HC};9O; !vWCH"}$x>v|Of"pK*D=.4$zAh4hҲ㒖z|H)[ŷ؁(bP#qDh$+{<ձLJB>-򘌓n [@d0 n UR E0ʡp:[@P_%hoZZ:AW*B-Y:v9CȼU# /<^>|P%KH/Ŝ9so,:=( >_a vq?u iWZ/ 8|WvŸqQ2q)*JSsb q̫Zy·W%֓0.;~Z;jkPjZzf}og 4)0\~e/QDbQ8.7 wwqiKZ8~L>,p=As>Fۖ|⎼Q38TJh^`u9 Yd~qM^ ⤘/Uq0 a?^`Dr 5e$p;/ 6t={T;̥J[w1 Nx"l߻>I_/HD8:Z@a l dPnVJOu@ŷ 9>}^9X{*r;Պ9&kë/%Q 0#m S=4R%j+9 Z!To( Z)vR݋oAǰևFڧ ߧN={ĚNw}xx1ѥKEtJH?܂ xa2F;c۟y }<@ШeokUtTW9\~!2 \/c!`1[ts=rԯ_0q^FOn[q Z[ůB勗Z%xDv!? #XAJzY= ;3Zf);g<#9l1Z0[}8n W% [HF'@|M  {D>D/ouu=R<=ܧA\k7@hW 7$1Tf ih;XZiK@fjmȿNP}vu .7%@aq8,   ,v-n`^&B *7]&ub-{b f=dA50:u-Nx'^g~nU?;~)>+ɚz ' @BsG`fc| v. /X۲!иP "Pqj{5&B;E} dߛ>zВ |s|kJk{P9301bxBN胗~ bx\a[t7[ynE'6 {WTho&z]P/P-UD+IH4n|@!FV \q۰ƴ#g^\4mvTߑ+\/_{pAӂ,jIz +n9j===ݬ]J1S| Z}KSrHPJ%ۂu޲(KQe3?z3dĀZPֶu~M1} VŲ8wnя  Fi$"ꈦ %$'ȁ moEo /~1eVO>25'Kl>7E|-5yAI%2bQ?ohA]Q 3O9 G>AS2#wU97m  z X'*P5QXvV fח;Iv7Hy8a$7*!OsWLHT ЂZ&V 8fx-D>,p5}[?fub>W|*_@g:bb[>4ILȳlZ3AX؁E LحKu*HV@@+VxE+ZCY5aL^>K=u!aHpgeq} =4V:1 ~#hVj 1B mrRJ Ʌ_HZޜs}װiʢk@vrYk9d+n+n+~ySQwQwQ{==f/d?B_tO̯@n@<|TRĴY)?0o|F &bCě?Ǘ3Xs稈/h,eQns_m{՛ӫWVIZ%[݇=lR':x_|-=)\ ߪнLO޵ﱿr(JWD+ 6YF? Q1Lؘ<3t yςuZe"2v'~5Ƃ~61_,% W,=XrIdV7>Zq}#df R|Phk˥Aʃ\%?SL( "@E{gΩ K/5;#ލ +cz]@[{߀73E6>eh=<D <#UAlF[0,2 6c@^;5Sf1bV aI\)C*-8},wxXECUQh&{6ʒ˵z(U}1+j_?t~d,G@ b8Dy` γK#jx@1 ? #bV8U>b 3EW״MluEX*F^XZfb_?NPYSk݆ :GÄg݀Ê.t~Fe@ 1(U~ÎTR5*C?I$vD'^g^N;,uٻ[]j+GY9kvmbMS4_b?kW!GTZ;o.ԂW}lx0 y=SDq@<FET& 9DQW} h`l9RFvX@U ٪/xG A՗x}bְf2eop%ޏىcO%>͜ ~d C-.c8 XаVNN`Ud+ִZ̙bf\__=H#A-A% WϦnPv]@6,,Or :Z,R|4TvuViUAIRͥ}G0q&2 r; (L vc]O8@<@C<' F0~ |7ҺJɝY^  <ܽ3jM \8LQ ):[0NUMFmn?R)y <j.X֖K UKSq}RWQOGLW)Jюw/ró; ߼ypD8X, 'Ƌꥼ9\&gI~i!+B@W+FM.1Kρ/tTZ`m먑|YwA@f=n.UN(y2h^OB1q<ONkrm$ʣMK'W eڟ~3b1T?(t~mQsϱ;KeqK\ YΪd*b4WX* Fn8icwQ19QKEB"Wߙ5.ɋ\+A49MkSߐv:C0oYRK-jbq8Z@ə)*GP1rҲ^NCn@ /ݿR;p0CݙxbIL[8 C\y{?;a',!gHۜ<2u8W}40ON_<WM.s7jܨq#% MhIpuw9Nsܶ:JjSp<52#!po %,{J8S}Ʋek+M8?*(:)ρItc &X**|S<-O_krKuGMwWEe~KE(isR n[Yls?vSO>7γ8Oi8 Z9]r],$ =U2ł}psc@ a(j 2F=;2f6Te5(UkK=/8 *WO͇BEAQ /*UU5-89u5(|R9zg07R@vCj3XOȵ/pNu*mK(oa3<)r9$'A*||ӃrYrCer~9E+I헪o gJw#  ddJ=~2ΦoS SLQ :OxĈbXVX] 8eYjplAVlϿ\{ݼDe M71IX*{*PW覼co{=zԣڅ´M~jwO9/5hɜ99]rn .\ܹ~֗c%Kp݀gj_WZڱ[2Z*C@.[kl7˃zfvvqw "(.QrwսgC;I' x ʅ e`|B,X[/ \xˈz?; N2jAQK~`"ISO댜J2y0(6D8p ܒ+UpΪޛʴ`~UxQzFMr"U*bWqc@)R<rF=N<΁?m%qE^`RjA VOnVۦbWo!j*KTԗZ(Q-083IQߧL2 L`sTߴ2OԝK֝|Oa?P6фIńG]:'8R`;߾r DD%ʀe{KCзxڙv0G n~ufx9;Ӹsń~#z7ٰgÞ߇%wK-OJ?)Ϳ\i)o'4{W^(ק&5輨=#iO)Z) ~c ]~]e-Q(Wf}[ZK+g~\6R.>=wv|)+ɺ}`Q3Z9;A8KZ.*NUBI'6ryHˀcGBa`W¯-\ oBN7^\~BJ.3>A4k,k# >H=W-[%yNL`esW͒6c概SV snXW7]?TD 2@# U*vP \O.cXr)ET%e溮Ե=R E`16P1-5X7B빈.dsM;]ʭr+7  _m_PwrOf ӎ?(|if%=Eg,􌃻+ nNoCȎͼ+xyڂ*E O-M4XA{ͷ w]s5)`|g~prUtJ*KM~7ȏ"?k5:?miOnC<6KN-˽ ʍXӂֲp[δ/Ҷt(ˤk˯e8O)QB paVY.?Ҭ],Uds/{/l-ȏfd;*?|!j!xq^ÇaӆjeQkT,./iqy z9Dr2>ж ? 7E?ń5u5,lǀ}lVDH%D-:&W~p-JR3-Ǫ5zk|똲ԯ+6-Xe~5 K}Vn+LH,u3&n现icZϙon*4_&OqbqC*0+oUkƨVF;es>Vޒہ3"H) wqR (qrp7caEUK 8짮< [| ȴX^OSizױ8:: w Hl=p#+a9C li0}M lJXg Y6[oƖl'c;vumvf2U6w5W9fxFGʧ/J&V̔%ff>ib:ė;E1q?_+O%;!S~Dҿ-]<ZTM/lC~YDdyW$k@v|CxbTx|ayҰp AalmPm1ʨ_p͛wjM`ҰIWXH~Z1XO{gy/rҞ{ξ?eˁcrqe<ˁhX\UcLtyV |@2?ə(u`U3-v>cs0 >K8{q6Di)ԭ<#,9HPjݰ!6׳EaAd=`C`7-i8q>wK9L^T1]fV BW=]r%{*3C]GE k/6x90fV|f濹ƷSFu>D׵g>?ҟmp)כb'O869:%!qsNu8Pm}ǝ~kݞi mSxgy4摕E'^z5|vʂ) wW#Fg%/ɕznJM dyOwp+e8#G?y/}\(z9Ʈk"w!HB\)PE:ck4>PDlcb=:!-GʈwEOp~"=x^Sο\w8/e; "P{W{DW1],XO#3;dZ|eR\>- `K2-ho/ˀ%`.:p^MS'Uk**F4]P \]=AJ3q'JQxT9Mp՚wƼ.aˣJ Z@?ޥ7b)!`$ '.C=FbےVJfurf(P h4c&GeؘrR|L3-P4#a2Z0_9='fTf(7E[%lnhr!_.T*G 7ៜbr_jBNWc*ron:ΪjaN)QP%Cnf̩~}}swk^=gZ{o~$ #98~ɺ-_t_/3Q/5c$5KsS!oWTwSjVO٩QvZ1eLY9#6 lvVhlhlh=BT CzЄ5?(x@)*m6_:ޣzGo@TgAldCMU| hGW5u+}n&NJ*}:#3tf|ki şX Flw-zxBDܨǚNPkX;`YR @yY|tc?XGݮvj lA<b6odV(}zE)\WUOc ߺ{~m#Op\ 28wfbX.>Eo1Hto=O>zbGm[Q<#gg8ր\‹B,-2_5^9~BwGChVԂ3{ojW@=nla <"ŀ c? OM^ȻeNvאwVwkJ(pʇ 5o@Th |Xx m%!{ZF*mbF9ȜFZ{BagoJ{U)À{Wqo~y} hH5q6 `YS)ΗqgGohNK~<&kܕ't@(vi}~h{nDWl Hq |Ou|Weh|֔gO.:MɻzӉ+kibbLp2A\k b/}qzn^xwu._[S IXFN}D[[ PBAo7_RL Nu"І gBXG nڵvl'b†M=yԚeXC~z뇞( n2}^I4B`^ {ItW@pO,쓓~HT)I'Wt\>{AU,L Hz6 7'Uip)~xҷśj~88!E@Ox,#-LwW)@t:8dxڷ7>amc)u]4N1BwyR0{"o"yNN1EE3u b b<_Xyrl.Gl.jHI |i5CnȤ2&&JrAE 6,o/ ?KIŵA*ٶh)Zdo37g܇k>Je4 M?m͕= e@nqM]z$.D_@EUqPwZܫ b뇎8q8@ҽnr-t K2WmWIQ @. h5|7\A b;VXGQm >c#d*#@?fWZGEA1K3 jcwp5ST1W|迟7HoxALu#$GՋ 5vNQZmUFN{ٞ;W{r>mV]yԓiZ.f֗Eۑ'm9V4y[F5qH%ʷ?2(0S:EO{q6@ؐOV>,071XQ,-m<"uhNJ3%DT'.+nKqǹO^O?r>TlUq+Jvq9ҷ8PӼR\bzP>ws-, 1Ppo;-98€kr2u.rsavl=%ƈIHc[Yaeِ ېq֚ixˤrͯNXj4(|@/| pEx6p5  h'R ,;Q'kIC^VHhM Dn8`ˇҷI-!)&Ak\KSG}hi35V!J A(@DQ6-dM^Ⲹ'v1BT5ETgM.YwG/8EqJjrd?8DNUn* }ilȳ m= _2wghjxԒoGLo\wt=P[s'7-{rH+XC 'h9f-xL&5uԗQ5tM}75CGSK\su.8tMݕ]W|w>;XL v64]toFE}5-}A`XEex#_"#>b%,삺o|W;MS5[`_.kԡ>"[Ȗ΂ګŠw7 _Y ,d;J;Js_`U- ,yA>9e >77Ⱦ8å.63\'=8Rv `v頻!٘r GG:NMߚL-V!{Q{/5B ,XWNT .R|M)"y?K95=Lt$|l ^5cRYi}-sKEc*Ʋ,uR5\&pmȫ ȟX6\QH`Ҍ"&ixaQVz\Cga.U{./5uKSM\:t^>B?v=uO x"j  uܽqSl\N~QA`=DWV&ko|wLߘ]y@lNSGQ^ lCi>wlؿeuʰCK@;$xl<ߜUz[\\_Pѧ7۲Nm4};Ws/X We6k0oi3My lEgY2]9~dpBN#"UPl(u 0ex^h T S@٪LS]D'FaQھ=|vMHM >D(cVAmبzZ KM?ꁘ"Ί W3E~m` 7]p @5lKz)M <1#rt=ٳ ր%|E]'!K@҃J5u fӵaۀH]S W8uf`wෑ( j5Ax(̀,d:xo{n{NG+o:vSX|786,Nս1U^LB+\P?!UKh|~do嶽Y˲_ϷoiNN7ij-QV(cϬEdy(`'F_8@Elÿ$+\9+E?/tp)2̵-'9@1`@i l,xL0$b"MPl票J\b5/l9[Jo9;V ,cX֘A{ 3 W{8߱Xmʧn7`jckIP*@-QJ(┰ %X J'@7@|\Yw?z{Ksׂw<添T^)JzQfC#]uoEEa.`!L2"z:<5z$!TΉZ9cZPZ1q R;ut~olA~D,Yr _cnz޺;6As9K&/Ɖ7Ad|=<_}?}K\oFwv i)q!Xk+[ɮVKPє2y<\ ߉][o~3-/AU~d{Z!L$S +Li0J/nS8.>ūSݱ?obx!?bbŒ̐qw}M-=eh #:B 戋blx`{oxCeE|ܒG9 'DNL*Q^7l2,c~k @06;\ LMk2X#!|rwt$dEqC["`;h] TeC"3Jw~z֯>OrB9Oǽ~Q]bV,z/Ϯc: E '|_u 򧘐 e #bBH|=&,|!@M|+wG˻7zMgnV.˷j%@ N|;_=Go|KJq[ Q M\f ,o<[184VᄱK;؈voޯ s_Nպl+[I,5Zga(Co|߈<mGnC|Z:7D m%RxP`uzvE56M)bI_rrHf.ȬU_pC QWuks J9Cn`i!!7J׽bz}6I{OIH))^d?9|8bm moX,΋? U2_۱c1I.ƀaq0g:(,@Ru*ֹ[ KǺMUSw_] ln-D & 5~5t~/xگ5uwGz/U6뫻^/z\Էͭ+9pmf';Y@&<;] 9G׎p0ɇ( 2\PԹ"iL=@{֊ ޮ7Anj@49.ۂ^6}qL₻_SN$/?Ӭ9hkjտ3ϻ\-'}VlzBŖwJ~B0%jol^׼?ZEgxKFo}HFOUcrܪN&)̑r ::7'8y$(6,*|NU D9t3mvwm.ˤGٹC~sEwM,Q811ؙ`b'3fĿL씑[19vlS}|hnUˬf+[]gr)dK3RZr @cgDH ' CMB@W P.,_rd3Ѻ5}z뿀\pUsfy& MKV@^׀;̗ S. 0cHUrV3ѿKxKni_"9 %㜠؀!BJe~*DZ>u36=& d-|1Q']+n#t2kAytNr"#OT"38׆1T\Kox3an1 㶅j̽jOuᎡ3يVd>kg) /=+h|)1!c")~'OTceZIMgKQJ_XyS !֫%sm m'&:ML+ݕJIN9-hMc\z*р |H'\>Wۋ E0QCiؘi5;37Ύ18*nSyKMIIQ)gQe 扞u<Ƃa(^fC)teָ3p c/7?~u߂% Q֑E A֣`dyhP^o {A]T3W%6/kNEGjbpi f+W8C=aahk)y Ẉ't*;2ks(Ѳʼ @ ͤ\$8VOaz}\v%=44wМ^YE 4&F 7Ek 5 ,lUao36Mg^Rsɋ$%'!<)1Pr%էƖ;޳oމxV|[N9C3M}J@@̉F g歓p'V2|׫6o'<4o 3Xtw i4/ ~~  l/P (w 9ҭ3y$O]eE#m@[lJq<+8Yn#C+^!p-.5~9q_}P|-K' .d T 'Uu y"#ƀ=W Et)-^or|*3MgkO'Apy#*b@%( @9}nGo DLay=]g\~-`;{:Xe2PQJTl-[¦R}\|Zqߩ൏j LkU5aL'RJ&J]Zr+wobKK2y1$I|G޾~O٧Y:#4y3uw od8Ӳ^IZ/yh^ k@YڇG942vwLQb*dd| C,EQ'Nŕnox' F'Y#cEˢKjt+eklT! {+֛5մipnrrf*@Bx=QKOqJ' 㼳lm=PBԠ2`'ejƸܦf_onϮih;8y^&Se®T bĒ (rO@E*n'nx9WpJrǒ>t2ݫ::qNkM>,r_-RɫRەj)Yl%bT\PlY yi2|qoAuNB{b>Ixr<CQ s3' ~X>7`9iIe \(2(K2F$6`&Na@KF7*&8"D b;cJԺ">(q*Ao,c,r{%>3D`.se4Yr|Fa\Ae Ẍ́%/"~P7@Viɥr` G5uwPZh$fq`yHxZ7=x C ժ'ɭ ꢸpY #Yqyw x3'D"uz'y(po`ɕ7GƜy~ ez4ڽu_E8J b,q_Efqξw Gߎy/<@b bv@+n;Q(]eq]ݱ%ʮoEE(%;L);Rcئk廿wzG31xU xy\VB[8&gq mZ+' 61W}WK"ߑl:o?y?[9oY:Ky4o#iЮy Ⱅ IMˌE3 b x, Ac_026ԲgEr[wTL1י#l&xf3! etQC,kg'/2M0=~oa~R7d71K|zxlIݺ&!qj;I%"Ɖ/Qֶ^n:p sٰýg;\ S?Ӹܼd6,M={_| ~T&S-_ mu/M }9^q 8O}P}%D7ďx7z%dAԂ֧ P*$q-r;!ޡ>#!j;Gb%/0sxr8Oc/(Ra}m=j*x|oJ}^y<m7[~IN!OWPT_\2}0-wO9 B&\OIME&F)$gēI8=h`\Kw>&D{bQs$|xF=\rM)QWJ+>~a6ƍX~E.SZPƣɹ s媞[e!(˳oSQNpil0n. ~ fAБO>` '+r# VE: ]zmwc_0 t0tTB>g RpbK d~+^ Q"@#&9d..p$d @(h JL*PMt5($ h=!nϋn; l)gd+e_6ehܯg|}\QWl,>+xGetBb<:_}eշH.ӟ>>q)P% )IK?_yGxΠӚ@,@ }}yv#hS4 .A@Y1b Vk\Z%R)>1B4UAB̾m΂S=G{bz>x6l>5x E QPOoAPFpyׇw>kӁ_gm}}`{;&~S^ihʹ9 ((@Xv-|GWYNp~mk,&y@@? Xm6}b{cF,4REGsCw q\r|kĔ> moߥ>SV*7, y,IqRH!G $nCt)mذ!&d3YAB yc,Ibdtɏ%KfOͪ3+Cr.+3V,3ŧ ww \=oO|ͫ$ ox~ MlLsT?.##p<|` 8b =؉A.]Guovvl/ Buc@ '" b/>9;־{{dօ1!.IxsyHF{A-=3{c|߀@|C[σ'ءxJz)((ɩ` 75|ųpP kALJU5VM5ct$8&CRVGgXw;rvzR76B:N-Coi8,M6w(+dRs%rsZ>^2:$cNŽt|x7|m)$ ^ƶ_\ D'Pz7v.m;=i"(t:ud՛VXR!J N%B-YJ=dOy2Qf̐s7s,C;ΑG>a@5a\9U;%N'~)Cm7еkgz!g}$Q露\yע|: mS"q"bS1W}V^[Ã[E_FRD5;r3R_)L)!^fk*W4n(Ea\eY/ D8:89-?l2K&鋔ez%[^ν+cf]3eRVϏS=RDME.rINr>.83  Tz*vpuݝΰs@͖這g+G1W(h.b'EQDt,35L4|ځQ`=UP(!йԒdg %TCYW_12_:VX-;bAWW3оuvFc-rd<YҲ2fRԬh? e;@9(SC+&G{c(eH#}x7nPiպ##j;N%ܭִRn88\[2GM;xF KVx&}ֆզ{ND JRT\!Bm ^]3V~&0vH(Xl%Z.Gwp ϱCQ'48( bMխ<[I6g$¤saAQ{Z.>bsHoGV2جZ*1j!R"Rޖ'3b?P߇U!Μa8R9QADшvY2s֡i3N2y|_Φ5mW[;98F9*9N(Janȑr=ĩdm8~B9sZ0Sb%)CIqx8pm:vw>-2/>#3K~d{]ޑm,_9umM94ɼZ[≐fV^0skcW9F-=KKZΎZ5,US'J?#O+tv|ב6;sƘ"1Ø~$F{2ޚe[n6ղZ ;N*Y"XTRf+hY&)3TvvSe_ .l+`td.Ξ E)b+Jwckʇ"C>rtqX?2Z&_Ebٽ/UM˓k>gNN](Tš{:=6eoFXZ~>gOԤ0?㬡p!>=Z5Z_ǘ<'˰Ey%hoj#`aFlЌx2DENBBPֳNWaSy[LD%L'<T*hknsyS}K% fT:ֈcw0IXrJr%>tr9[x8E)"&:u3Rw6tv6ܸPܸ^޴jϳЂ|`.uz)TUU"W[?:I˵[z~2bԞrl Kdf,J\̶Z9Cd8M\ ǣg{ ^Ӽ*z; ٲ +0~|k=-y`VݹZcrg(-, Y,]ul=n}'~wi53ZijIZDkoFQHD3{d:{cOC}  ˛<@JJja]p!c`Or"=cĄo^8cK,I6;X9_TNpjfcR~'|/1w5}[$eC~kTSI!PQ۝3U'ȟZcŊ3 p -iF}S"%&b„h*c6!غvy\kX2=q­-]+mM9SRL|b)>3YX[b7Yp&u*ax64zmחߤQ𠳠hմqՏՙj wƏ^"D;/2򆒣4V,^{mNX$Fyg7EWXG(w[-AlKpWvUfծjEXp`gc#O.qN-;3(o$-,8HU]4Ԥ:&6psc%݃\b=B^=[9gĿ΋r0H׀wC'žkޚ t.9t4888DaQXI.݈μΈFx@2mx`!{hw_+w}jR(8!BEk|L)j-=GeÁZODSaFIQLb&_+]`Ko[`m/]N LUQ8.:;Yy2iͨ/s2Ngeof2-6v-W)CBg'lkҎVNƖYCzn6=7E&{2Ԇ"\Y#jvUte,_P %]4?{-zWlwX[Ʃsn6" mWm: F G4q ن$Ȑg#ܓ!QkWc|yLYs=Ww:gG,qr]e&dHL xҸرadžIO4TLyCZD+ -I+NQ'xrڅ7[,s,M-;>tzx`Gr'He+jA_W!HToT~m[ ۱g+\E;-:`)G)kM%Iׇ<Lqt#DbX&5deWL&mrJO{8GMu5s=Q>ٿܧŵZlfM[J(==Bl;a~L]bKҵ~ʃ_<߅MX +xQo>Jŏ5,/֝M&|*N& &eNq䀼F YaBUAjV,bi&xoy  uI8)KUgV-N6xQ!t9K~%f[XYz,tf$3{~oΨgLևG'!OU^7ޘ0cR]SHZq!0A>PT& |+]ذhų3&Jz|c[񢪨A0P]^A!b&V.'gD.0c"đg9Y"I#4|(iEK )GI~<4hS>"Sΐ3W6k` y_< =T{r}eJSy^xY9!R] Ʒ5LψG)LQku{kYג OrzZ@}4Ͷ<984#'IT"W;9:Kx̹R6hmB^iGyNg:QӁ6tCyj^|">/kПljT,mnS+/ ¶s3m8Q8 n♳hKkE?uW)6I%VTEg|s=FOџ:yßxA^p: *6FALD3!*٨iX=r7ƾ BY=GΡRD:v*as}~ 2BLdzU67pMrC@fxG2% АVT8\qN,_| 3F{981804t!LrYNsΑSZxR^< Qwo8k.1?hnudi|f~XW+yCy=Xrysza_gqEM2#AB?=z4ZlFSy@e8Ry,#9_n>Gid͐?/bjn-fWź~6:bXCQbf"zTXtSoftwarexsLOJUMLO JML/Ԯ MIENDB`luciole_0.8.6/images/luciole_logo.png0000644000175000017500000033116311437126703016347 0ustar niconicoPNG  IHDRmbKGD X pHYsHHFk> vpAgIDATxutG,Y,cfff)q$昙-[Y,}Lf;s{Ujꮧv]UW*%TS R<{|s;qy*Ri'n UM#L~#L*%̼8`ƈ#Y~U]q%/J^ !EBs5[lu->/szۭ Î}Mq1˝ܳLtr.>ݭTj{S[%hP݅ v*'I:\R.)TL?u"W*_8+ys" "{zML"xVzX]r! +:@>pYDfH*9Y|x|rMí ,nTC.C9omlOmO˚Ö\\\rx.眗e}Y*_|?'rYl򭃯nCӋ-#?Qd͚Jx9p7Vc'=m#`d-o+/5,0g6lZk(Kԁi<RJT[0Cɡ` K$W*_ә.n9qlQo`'rGN-}qHJ $)" Ե48û7[58ml/kX$XB-PPMUW*vQ*s`hohohvY]{73iE;ka飩'16g[K7պrpMEN0sp .o9}[:~ *i;IȽtHK4iexS\}HUC*_.y],w\6fL\5j:8Gu(T AdfdJ:pe8v+: 3Se6 V2W1U w+m-r;r855ƼZ-G jPW*y:aꄩ컩nZf7yc{n}J{} 򶬧NH"%0q- <qs=;x(WyMr D [K쳊9g_d]QZ3PW*qy$I:`NT[-VVwSG02ś"Vm0wֱ'i+kӀ4áp@" ʿլXh%f0oM Z^s̤FB!6mۯUW %)II,,,y.&IbkӪ'HTI-sSp+{"#`P;xG3Z哥q;Nx}׷W*_? Gx/r_^zEНW+u)wʝ~CǧOxX &}+&.812Nմdw~P@.Kn-âiv _|vXg`uUW[DوeZZZn;d\ȸqV&P'ٺF?^B^+FMKSS P\Ϯ__ƚʘʘ|`yE2$dHh/%?ߓf= c_VcZi5~T#HuCI;4_^ЫWAyC6lٜvdoVp8qⶸ&nO}9Nذ}G/HIk ů=K?+yb8 ւEjԆp!-5y\wʏJdG1T C k\kj*- ]&ŒYZo9qlX.ʧkg&\x7j6餶ԅrvƷ--OiPn:a{CLQ\c[|e~UW{ç 76)9Rr䮛fMY'βPGhYdς= ,7T|xs3C3 666/$d 9l1[̅_;]s'ϰhp;y3r:bl&aۋ5(xXS6(G Tnqk@m1VP") hRpڡ_Ns=ߓxno媖V58u6Zha#qȾ!7N?&3B)YWU4 M7+q Ұ<6/Br^ .<7>g_ zU| }mq4MײOXZ@-(RڥK]߯/[[[ Sa|{+U֘VftCu .homwpyGE ȏHg 0xPvXڜϼ W@):Dx v4=i82T#ػ#+ c RR-ՠT-N>"$Lm˛y뚓?A_֞=[{qu)9tK֌,?GXYWmOPδXU/I D`n:ol'\;S``l"hSM Z l ӀƢ.ڞ/vn@iukj4xHsq6m`Zik25˔%ZpXpXpҧ T+q㖇 u78j(2j7ݬv"jZБt4td99W} )$u6RH+PD2HcũEMp(iy zVdMʽ7<e xJClhYdNyN.ȭrJɀX=nS0a RA ќ+H%4} qOd558s  2--Nlԋ3BR؏>weey@DŧGZi7h-rKVQ^O~~~zpELBY e-.]wXŸ dL2$׬׭}0V70040v:-6Uom#FO_DI Zk{݋}/Gӏ|_,鶤ےn0[B}9U#ˣ>o[crԫSNN@d"Fpi18}~ǭ rm@dpW"F 2 "!}nꀴvsM'jTV@تwY}gŜ> v/ؽ`SkN9zؑ#ZR};ߕ~W]鷦ߚ~r=EFdwwwϿ7poĽqU!CWrl3@k(,eiCCu VE.C惋h "2K]=$~rr'g8e4 FB4۟۰bRH!#8 C;>|" (gbDV?lJYAZ&pD+ zq R$‹q߀>| ^xͣ?1}" 0)Nw}>W+c_ƨ}!,l48螣{Zw!àLu:h'?/"C~ܗ/5NTEev]f"?ʟUV[g?xxI''~=+h_W_[p]{:@ĉv(8?v v]RN*eb:rӰ^sAGXhIS@XZ=<< :y#F團+1Wb&GIŶԶԶJV4' ԧ>AtEG044Luv!Ǜ9]mT{ܖs[mO>1^w8qg{]w~555F1cb,Ytk0!m/l/l/xꂫ uc: ײM6-4ظqYml BeY&W,0~gdIF% $k'[EssIf`XjjlM Ldf'¤@{Tm$N W_GeRAqJl'7-D$%BY("LBEm.TpOqEl<%kɑ ] 4YREl+";dlIl 1 ">]8x!9y#y b ]AT&>!c0 a( w@RʃSƀ%8"thBGͨ'`F[Yu\ȓrLaj̯ޑ) Oz(P7n@r+l3!y{1a8sOxÑ|a`qd,ZyaV:ILbґ Lcbi^ @:0}ԥe8!N<ǵk׎[;N:2EiVZHݜ9us(˖ܿtLұa[[[Dc1PtD W$^ 4IjPt y!cpA&amZe G̀/^ r"#78*'/Lg:ת'$9w:+\p|pƅArLlfeyPqSl1[̿?Pxve{#G|WHŇ=.`q Uˢ`2F{( au4?=⣊rIb*~wܘuMjr5>$RDHS gq>eҦԪo-4/4/4àA)_0`Dǖ8/_ֶEƃ /677O6mی)SLMMmJ)2EZ$tI75yjd2e ԬUAޅ^zuՕQ゚~s4/q;)QeS]7\ zx.f;`ϊ}`#QBrOcy.;;6s3!`g 0%2X#~JM,sF>)O +hN  4 7&t6=r^c&u52@~n,!hÜ^jf p>in18xdy qK)R̊ ,mr+kfw_>7u;D?z7CR_&罜rsntFWovrIhYe_oJ'm}k:r{jQ^m+X4^.\vӮ*JYf&_ďV?8t s~sfIqр` 8f +p!ǧr=g-3/: -~]vEЊ+E4hѤsWi^lXnΫWz?q=qcǍ[޷oӾr oC† }K7w ?jk;mY r/)ZM; yFͯ6YWJO*ٙ=C.sE;0V2ǘ{ͱ&8l&Oӏ S++AW|#H,:P# T2G=Q 8AF9V~)4 ,hk(h +Da@8_|-X߾ z!\1[2I W5M/Wl]@U-?,b8+vճ8Ι7/SB 냯.v^5sU3븮㺎#o7=nƾZjͫ5_iQS3f8Z]qjԩGyo罝897ܜs#\k]x1Eg|c1"#ǭ+( jSR-Uo0M6Y0^0#gPF<\c8sLC#?H@nG @n @3|tCьڀJVПt`ԯcox;W@"ztMWI 0 1T;V [ x7U~`;M.RB()il)xAk֫ږ eߎA^{ P WjKUAaY7&ZB/G?x$I//_4aJ$H.˭rU(W!_<٪jQUU@7xCpц1 p ssqCYS# 7nx-o3 ʝ0=g=bivg?h4ײ~_G'Ë[4mo,9aNFFC}˩o?@ިSjd*V^zkZuS P9TTO}8 ҁЩ~OM XrR05O0̀kyV~nA{`%~U΅_I1݋?3~n3gwX(w܅rfěo;/ ^/9P֊r}C^4}zT1z|~? ۏo?(\.wr#*0*xb*M²]72DqMrٶ~3.w1+PJ)޸=)`t69YKJ'H(vgi6UA8_u I/~codM(-^ydz~/jgwjǫ{k_^NkzkfvlohL;pڵN:=mtFj@4^O{ :0z襟.vCSQ9cg(q;>~T Z27ny0N ܓC= 2;dp{6mRۤfN|Ph0 R '6J F*Qu+{PJ*+o`1UG^!=E$6{GͨM˚GeL] uXZ˚b(-~a }6(!ɂrik(R-|d!yeW폟ǥUh3ʌbܰwuWf_9jC[l/r-K2xcyB~rVoP~.[vgW~m|Vug PV]mfxk?|Y2^k滦V;aR:)'2Z r<WݦRU/Sr3)\DS?ZNt}x#vpѦy@ho/Ѧ2UlQE8E=:~= FN74l̫?g^,9~+~\Q~Y 6v -hSbldx*,*o'Xkb/6/&d8rN9<`qg~W'\qDl5*:=۱cpG"8p7-rZҊuRk_MZu''?خ[Z߬;ܵ2ǫΛ&Q()*)U !|\-Ss/S6bh̳M%gk>ɞOI6fN>r6ⱈol9t\s^ΜιI?`V1 1Y/V¯p=h2w+DV,@֐q,R}6 '9_y(طoeZ6B=\A|5DpLv΃sڦUyHtmuP1QoziZu`!h &2Q?^;Cf;a @sEuJ(7 j94SZDMzuwQ:-E<=u`ͮn-?aIi]#OծswG,: Eyψ}){J1 u]d vއSginHRBgP(c1뛈bwәD,,۬?ۯ?cscscses[[[]{kǨVon||6=kT ) muMB;~lӝkUw!XqSϮ{}}Doa,io gS9'-5'=INڜX>ytJYnrk!;O>3yiޜtogm[m6 HgׅUGk9<W}t>c{d[ p_54dn8[bPr<  L<H=kSYQ@LFuI~vtaN{9MuB@ˀ  CvFTW7:_gdþĄzO<=+y\xY;˄,.#jݢ|&ɋ$SySώg. vn]'vtt5cN%dohׂKɫMkWb}jhYZJPcjG?^mR{EAF%Rѣ[n޹G` 6 ? ~ A`!RWs:1EoǞzi%ٓh!A|`vT eC- {h_hO  tDPĆD'6T4,mtv4h׻^|^&讗E3Aفn 98AwbwkW_+벎 R5IE8qNVQY/zzkB(p]̪ظ[s<} kzRZDGvl%#(PefmP1&Z{I}xSgȰ9 9y=M,_=D:k31N$:`Ԉ+Go:z躲׼좞1u oHU:~+/ki-QXk}QDhz(kiKY kP_b5NԷN5s_sC^/z~8%iCSxMa&݄Ex|LE*]h2UWFmNup|ۯ?CJi9-xFGëiFM%J)Di{5MŢk_[6ZlLhV lZN7&D%qBG5A {1% ьzKQEd%Q#)iu^WB>;׏8[R%F%HO#gY&:]xilw"}uLbQmy]x>NDS cE8cXZrj?MNd=t9gtvC7*|AhePKٖv) }U)8Wt[ UJndrzXwkhP}mɶT@řa6_@/e7իcM A{i'0L:]`ˆFG<j `Q[h ^ݾg{M?߮"DMQ:?>4oCKJS^?&o!+3%X*x/U4sLӄ&pK\8}ϋ? s'-kzwgZӚ3PP;i}kl)xw ccs>&bF#52A/1|mŪlm"c?*:˳;}~Pnǣ]2m,^٪u# *WYz=dMs2N9)}v<#$nz7p7T 񑋓!ĊIIOuUJR)k笝vlZiͦ#W!:G[/y qկo|Wǫe~I c(/bg~>XaeE9JpHB*b|t. 8FS BK- S`68sr+0(l\ue,p]Y}8pwMЃ֠\1|k%za;'. oVÜG\$ʁ@' @L۳1ٝPD'N6@ h]sÈzGZ[@v/S"_fjxPR^QC@_PvhO+F[ȭzdv'QL/рP!#SMl-;6'Rn?-BR$C`A^ӑXbj)kyrkn_ÁVY@^xQ㵯i3|dGWG,ALSN6Z#8B"@)'1!b- Ե#)d g~;9u]u,7MMHX|.ík1!&ح1ˢ;, J[T (G|5Cjow^ʽ7?GQWa(\&9Nmw`Xhf ik'OӻyQ@}ah&o;cZ|C)oN{:uj7oCxJ9p_mY0"vP+F{?h_H;<.zȫ3p51U o1_`QK BӢW.pبϑ'|Vʚ!ЙU#u6ѩz}JCD[64ҺA嗀D]+ \Z`{7=u`Ѹlie> R/55EQU/tyT\S6;OS Y*O ̐FTeޒ ]ߴo ,@p%4nDQvo9 :;4P'Tixr79PcjsşpyAAQ\&V~$ CHϨ~^uPɠ_XCv|I0| J(PIY4?#r"o'8ȂBtƫ/35lg$rבwW\ճ[zv+>q=77?^~DP o MGӟNn:z7|,:1ьǓJ*5@ꐕg-oXg7OxS)A)x[>+͕J18LR%Ұ0j?nkF9#JlliZbHTT P2z=݇xr yA񶼶6@kCr=\c8+$K1 rEqksxOgr8ŸZSg%wHDQ1Nbg^J^f\b;oJl|Q:y`lvv-O&ԶH=! ?|Λt .g<qH1OALѻH=rSю'QH>y|@ڟ/@\`. M_I!@u $dN5ї{3ԮiTHӠEg1?;ڬGtϳOL>l9 8ѴHQA RL. 'PHwʅ!AyzyCa%JeL^,^^y=g>g<@ojavu1E8c4Hlc"NM^y.)T|ώ>8 p+C`Q/ʢr/*9wz_دk9q\fajp41n1^ q1GN|P2ig>F-RV6cf,^ƀJ]:35gAA]o<=έeD}gcEI΢I%^^'[-I#KރijR+g%{>ь,"^UZѴӟz\BꯩR6viʴ=Nm_S4mRU[tUt$/ ǻ:es` l,kZamn0`)ɇ1W4cātNe6xL,SY|ukWޫpgn~j( B|asu)-g8PWF'&c/c0y pY1✒[x~1W@H5"x4OG1w@CKe&$]~@AL⁕hSpg[Nϋ׽Y@V^%f=__Ee̖ugѤr@4ҭ#s]F5|=Ѐ3+ZAYlY +pg0Pӥ֢E @ s+!t:@u@4d7!Å};(Ys/r׵j~u#5P[c5( mVP@ڠ J{@'1S,?_BiJS:8nwty 'ɒ,H']Il^=q# F{{OG'W\]V}~e\Ӕ {%[6l}{尋ѹ[b~f9WG..qYT L&v:ϖdui_^dA;NT;:B>wЯ\ҕ|NRpJd=0B8%B]="(VNOGezIPv}_=PtoQےOMDI/3$R/ pi{5 <7Z?\_r(7Fi۷=.G?OsêBqԶVw8~`;] u$K:|)h/u>-91UHYVܠ3)KzэA EWє'bņIzo3˽g]WfBqb[~,-p,/+ʚ1kdGDyEIZf4X%O5c{V2x2GOchO[:<&R' c_Y+dA "3gTcI'em/;};Rޞ?mreay`XpƔfzP|'ZS"J9&*EFZĵ9kS1y1h_/;b&Z4S%Z Doz9Dhn:hnF*}'J=^P1L߷Әw t]xkr4~=W@ hZ(+6.E +O]=>Oz~v/d8e8ci-";^{x'PpTg$$Vk@;>~/Ir>a#iiai];|RzRw6=ru)[fjtr\>r2@*ܖ9r}>m]?.pxǧ;?ٮѷ]bKݘR1-n[kNHݓZ#XJk>SrV(qp, c M@ja{q i2$nV P ~#  :OsвFLSLd_u`"_lF':Bct &fnz@cmQ1GnI+v}tЏ{/s@mO&.z4=յ(6uQh #DmZ"N!Hsl֓T^6H@}r^UQ:9 Bvo?ogKfj4kY+WLա~}tGOiG4{iwF% st]!(=.oj@(B|/$S6Bl;l1| 8xX7#+U7]M7[;>MKtO|pEٮQX9qz)x `b$6ZZ7}mkAif&ĠeYXz,##DZikG/sd\?>_зgL.^ fES֩d (SW=0V8ux+%/ʧ#޿qRӶ$[-xȞi"vؖ=D_~-S^N5"DL:Ƀcw?)8)臗J)?uyMzhozOKJ8v +8ۓì us@ga@#e$`{f h#ְ̣:f׊げ› ;<J]dрtX @Ws]#hty %Y^64!Z5yO-uoř(A]FֱCf'[~N_wฏB;rs[nVo=E=f.׹"\ύ?kg,sٸ|z"X Dm7!W^qpjƥ"5;p󶷯m9exjRcf#$L Y$5Wٴ饯:7r w5j~=]ߝcع;"1r?R&85kOMf&ZyYCwx`t[YqN&&li|64y^+ >>?ݧEϖL ݞTS6:qM# Dj"[6|cXo+2b-V-N|R',OT񬱌 O8?qp7庲Qm.m.`Z P֨'c#bŅ|'Im[oσCqQWEDeECv8keTեs(ٟͤLfʕ>dq+Z]61PУb@6אmi~s;P oA[!`o0=ˣ)p=:`xgCwh:j**Kt ٮoNz AQ p||'`6YZZxa';i(oڧb)&sTdt;Z|vy,*'/}^0M1)b=KVKe/yOsr_9E.jE*G Bf,O.`z`2l1<0\4v#muZ U>fb2ҫn8;b8 6u=i, <.w.[l{t\ $( Z^Yz9z Eu o0xԼIK4( +Wtx< "p}F) bD΅9OŻw5v4KHm:.MǢEݎi)Vz9K=gSn=WcG F䍀++3r$Whx.l wr-fRH?<[>(5Eԅ5}_#@L9!S&{%7tPK-6?üK&1ָ(!:iF/Qn8pѭs?H hNgAS1Rϱ?Zh஛iS\ eR)75 lbXVuF>3su"L$Z:TowA3V C2 (D(E; _4ހحկTK'69#('Q6bH0Diq_ dZ[ۆTMTץ* :> V)8p]XMt-3"N:q! \CI$K< HPCp r|5q@r0z}/kgDi|-Ac m `Շ5zr}e@>hʱ C?e+h*n{<\feO [V9C~CAC"7˽t&I8!'c|/ifX4Y aKX>6xSw|DT{!#GI^NE8o9ǯ^Yh`e.oY! %0Kw>STdZI kcܤt9݇(nW f|!2"g5޶#_S ֣-YB5{uyݤ2i4teNu(`-&?,S z8Ęo_]ڲi5L@,sHݓ<*D|) N\UfA:eQ\z2QDJ.6X}ddWަM%L[ge7:ΙZ-A)OIry\[?\#7H]uGMf}@Al@5!bNցIGtb**BtY _Rj$OA١<1490a:j67biىk'-1p1IXAם5#T?jS ߑ(K& `N7+wCE(jZs@1HϐB  L9ȣyXw=qu @ڽz'y=Ӽ9|EpUYd#C8&=#Dρ i3b$"{X22@n{H~#4t vH& oٍ;\ҞeG`˶5X*K۫#+nh/n \+enq~aMsެchXf}%;.M,1y-LI(P1ѥ`Zt>/$_x31ȟ)PD婎.]̦TK,+_eE"d5N~eIiZo0VJIr2ש@bQ&Yb8K dozbgzjuKc1Z2UZeKٳwƄ06ML{%m>npʱvim!4UjgN ~m)!-9ҀbZps2xP`{;@Zzcˠ氵.Uف6e[]XD72yǖ?ӢUYyL9ap&u~ \`#{8b>]68Sg@4*WA[B Ёt?|q6y;ڃ:ju:AҶ:.ԁAAy|Y~9l`&f C뮨9? 8NV~^O;q? @j,Z!E;`4*c.d;\ FqXATнڃo]G'$i91Xdnq>8į@obQC(q+:Ct6ȥS z@J/F"7ȣxzĒk>Rc7ꀛ$dG`OL Dos|$7B^cxLx bF, ې N'8S U (VGt(D+-h *PST\Pcr=?xS)#ozp-/ʱr4Ұ(:13ZdՐU&F̤OB9QiL%Ox}T˱Zjs^]a|}$mJi6mcrk_7P:"] I~Q]9di5vNuSxշ)c ƃ- 1BVN14Hlj28颥Oo~+|nILZ6`S\}SsѴW> '0Jo&M 0H> xIOxZ[3[F;&<z\[swKS$5OiKTsL,($$6UE H< dXX̰Г(oYpHD۵<߆ vmrPȰ'WBgCPs/@j/viwS0ہT0&uiO@jw,B(#"x|1ﵙ*Gp$<6Ŏu.ŊgӾ^U5(Áx+PZnaPp; ;@&;.b.V4QO3: JcVSt> 4!:YkSa\4}^ )Ӄ[bNX(һ܇/yQso:X8xP<C]Wy\B!dӑv5ݏl鰞H@䎼b)H`| 񔜀'y %@tlD P1QY Cjv۷@ Khf"O4fҡ!rdoqKǫ=vVm^'=G9r6c2y=EW>}ij03}EhWHSlb<թAENXZ Y'שM]u2r[Rq-%ܶE;vlGIfz]r<@j܌[m}>mj1YȮ͝kt剧aaCz9cfӞR SIgmNon VAsM:y |ʞ5%H,ضӤAV3w/rZ|9Q@Z]'4au,&AO"FҶr:wCQޟ<}ir\8e,W#yΗU?{I SG;@MoiO}3iiNH H`>Uu=ӼHٜshTb;uQB!zʋ9Gd wkA4ۦ-#0+y@tb.V N#KFxPTϘ} +HvHḃX7 q'~kT4gP^ID!}Thը[#@](džLާx[ۻ(TqHF~D3KЈmh&7`~3:A3u;Y3X(B8 r +Ky 3@Tuh#OE"Q1168)#9?̕pk9jPE'х #[T\u~%s [ӠUYKe1#gFCmm(d$ڲ;,9}uzC%Hջ'/k a315^.s e[]lqzlB"H"nwV>w C)S6[[6Ql8^VB:O9bC5VV)BV7LScR E2PN35x 9 yϺ& za\ح0;d%ɯs;: C|ೌ/XAփ0;5v=Qr<_>9fdj_=@j`f0b&PTVס]S]CISA׌Pf{AmR\I1aH1 X`Mt 4؆ e|M6cc3"F |Y)ENU_K'4B)4}6iY $q(lJQpc0H9 @gX)0/Ҙ@=9T XST lӡyv_+ t]<l7 r*o bƿ5\L"@N F3 K- ;%೬%o@reˈJ>iEHk[9d}t2q37I*?ɺ'ә9sirJbmK4/Ȣ8ˋbxgDٌ 6-RMlFad.v ܧJztwJ'POe8**ɹ2T-8tk. u?%5zt}Q9\1ÐӐ_yn(osS4÷=W\Qqgk̎afr9i 3606 4p 333C̱gFi9=s}~w?Tx4Fֆzl TI1w/ƿpI.ʱ?M&Im-{#\/*Ҷv-cMz}Ղ]/3ZnklլwsZe4 }/[6+czq'wڧ dEy 4d'Gm@`pݿg)J!9]R@?/w~Aran{نu}mp\mRoo/DF󸦛 kn8R5oX/IVhm47\?8ҾHyFʻ܄gST J{g=d\ZCȋ-oFӍJ!J3v;7POf`ymЇ؀1@p| ?7 d.rӄe0$S!,?byrDi Q*u@J?PR 5R t4>d"덈R7pT-RdPX) b@z2 M9xI p8\2J5 %?n2 g" Ud!]Ad lN`r OcAVcF)H}j9RԠQK(c|@w÷O)34tOWj"OG[Sy <]|AVB;5Dyg d< b ry'5E}1՜jRBJI9~Wk2q['+ *jФJu~Y,-WcAk¾~sZK+ +_)AxG e/eZr ȧ@Ko>zo?"<\Ij?j޾)wQec)G_qw"^Jsk?r<[Yvz{ ]s% F#PT#?a;H<$E@>NmkM@khyey*HA~4y^svFZxB*d4[ @ӬN5)C#7 j 03f|a4]:RsXVR洦˔A&u)n2$=YJ1 CfWjgzow xf}.ˁ5@ʔmvU Uk -  ]X "ɍK&`P|f4.]P)i. 1>ͦFًy/E rN,&rO2~40e+\ LQ0p̣$@: ҌR @Q"@wXS"pC,1up[ ķNi]6r2$NjKtkNT 7N3%Ups tkur{PwC ʔӪIG@rƄ܉@voll%,YlAp~cb,*ЅJfwm:.<;053L!*Ã$f~%1j:E_o 534#zrM81cS]_m'_ƕSON&vI78nz]* 9p2x$QtiS>SKEcdST^NŁ'!A.2% ؃Hwq1LW(TYp7Qޘ#,q,7TeN/YJ:#)*%Ty p /d; x 72uSv/ cPc.~ rx3+[G@ua? x@]@K9jZLVAW+A#2 U}EHrAOk55PrQ5,zҞAj&gkU{& tS@'ߦ |IܙT7)w-Loa82[ِ;ӽ²\t*Z<-A&Vў^ /α' 2Bk"͵gtrj8.7`h=jkyUww?}\1bǤf\zXr+y&w(dvAz崖Z7L@hEαN#; 8x V$1[e7L ?řD^I<SOy!cb:+s>P?4j<ťҪxQ!]4 lom@.[h[Y@l% $erPH+`efnѽM^G˛Ks{#LGty#RM/t5r=4=0>pi'qfOG?w- vH)LI d+}D .m2gc2]/`P#\@ jp#3.tr@giRl HUt 8A"*T78JT:rbDhjCQY3!2.F +a S+F'w>y 㸇TIJ c':k\򀊒mLU@ d& |]fִֺ98sp,o'&&&&&Cxu%A@NYKZ*QiML@v^3f;iV$n43XE"B<$wA5Q R?iC\ OŸr+d9Φ{{F1I}>r Y履!mlfT6jZY T[b5cZxUiG@'gx.PK]Pw$! Ź0Z)-T}Or~nH<8y DEr0,PT O)CQ(kmT弇+yس!TMxiy'j5ŵw\\|Fm"9 / ߚ6T+/+'>ݴך-8xeWC# +^ؿ= fqZ2[vKX$UsY]} =Y<&_T nW7h g z^wX&]`Q>VܺmؾLrCQcjjWw߶!h3Z.ujǯeuKJQ*Vr,7,- EmvUu+ohy㈤!b3=ERSMO_t)):t`SbL4` LG4 Gx 2 NJQd Kq 69H2Vzux? ZgeH-yޡʰ:s>+oR#^&';6m (Hi  %=H8An#FݜZFH~ 6i@ HWYIx)IH:J=`R,&B&c@:X7 ҒK򀔥1 \7\M܏QwSm('T i+rsZkT=^LCܠz6, S؆Y-4wU jLR@%PapNؓ>|3} +*FЀIa_PPq6W*U%wK}.z}ҒvZK=VUdW4oXڨ4֎LgZ J=,I)h,G-43H}mm{kݴmm9 pԠ 'nRRRYH[MzqbyG'q 8=!` *vd[cgq/sA{^^n?_ߕTMia5x*xpCVrm` x2A⁕*ZHGdI5b9 ,U-,@m)=ک1Hoct4c&(#uߘf ^f_l3DHdߩNxDҁ,% z ؄e6@ 'B:},p\ xt^2lb9LhUj_oګXV1o\h+F[P U +J*rL(\b&v`$xHIs 7C ;1ڡbN`/HH;R254ڰ)B&C+ ۼ6WbeE(ߨb2t40wAԪ$|HN8C zId,  Wtƒ ?N 7k@ U$XJց-d߱d$h.߃W2I,4<).@T / YL2f#Z *> 'u"o6?I0oֿ_r98Tp7ay Z],mL!] /Dd,aX*JւK~sݵnٞ gh~`lnԺVywi )9p&W? R\I?xT[2ZM^켿}x^'A+*(lw|i/ ^6x EX?EzdsPUO mVS[RhJ *OMxA =e~MUo,b%6# Q|pSfY%2. 1j?{؇;YZ7[w&oUy)w`3RvtDMj.=F$ppw=~{GsUtL*ȜMuŀ5hZ}HԐ<ՁGCKyj Lo^R?2<-|ǃu6MJ9>g}jCd2k-ՁFX ҞЛ׍^ŘvknKL!vL^Qfdirv25gIG~!tᦣM[5{ !X с!Fם&iK6H@ڣ.H)tր\^n*sR7vF1waOeC'uCaނa q4իbU\we5P@2+/@r$ @ YL36=A$xI3<@, dAVt oMp$In wM ]vBvC%La @H;2h x.\cVKZ~Bx7ۻI|A%I6q.,y=MrP]<g7PR^1d"9u\19“]R&p{꾮6)Zf|=\pZmS>k۠/$+wvld2P@J3Hydc> 1ѹ o'e?~g>XcR%ɡrکzkC,"no[nkf{a,c4?}i'a#,0sJw>,[ J?Ow=CLWPMK>[*X%zkk>*Lީ+}L+/ ]]}Q-&M~=Gm`%?YDH 7uj]^O=r2 A;7@,q3R*N%>}g6ϊla@*G| -Q IҒ 6#p4ZI1{O)bFl643J E+96J¡@qkӑV |Z d3сs$Sy ;Ax$/Ɍ+9> 2 P? JiAۚC: OPl:,95p6y`鷃FVB壍|i%ýL`oc\PTzP7Z 2jH!CTE3KI1"2 &j@kqқe†g Y.Smx0֓x|H{ϛ OއNjPވ\y{;=$ùdh =f0v䀓K4=ڕp6#(Ay Wwv}iק] W2CBR^D1d& n.]CZ^c-կP;A_MW@j$Konj4L H#jmI:ՉP9C56S7XHߟ#$Cl;-U0OtV XL@j5,z7-{^0h/w+lv}/wH VSֱ47|P0ZY 6[G?CX$wO,e-B5tpkSkZ4x1@px! "- צjH;`r]QClhy0EsfL1Iʘl:1@6n )%JQd_Il 7#afز6 @KOGFg>nW2@#q7znжK[++BR M\z ؿx<҂p}{BQKG)l@7N t<4 XZkۊSdg%K88û/g;\p!-OGOh?yж EA /qwhFH3vH~ P#j N5d o9ĈPz۫_l/z݊wζϼeؾ9gH LTj}HVBnAT;uWUZz@yg~R :{}H=i-@ʩEj$QY8;F485d߼Q}SNU;Uvlڱi]?ןC/8Y_NlAT!6QGߥ,v-kZZ REjKE8@AVYmI-z2ͱ`d\yB Ya}.X$@,I͟rGo{fM^*n+F"6 ~ip)Ht@8X EuN]HUKi'5>-ͣq,ԻJ*~4xuB)B? gµ>IsX ]=gn?O{(]M} iS dn44rdh303AeIK7Ѳy%P gLY W{K 5?ƥ+)?id镾6z h@9#Hӑ [H5UU`nD($%`*Ȁi.[g꯫zXvm>\ \6Px /psw=[{E:oڒCuR_B%nzV/P5dLmJ`8z#Pe{j#h[`Hj-|3D U XXZk~ί9to H*X `6ڜjs엲_~5""Vϓ`YfyZ>ku^SNz֊U 0I/hKY`uqU,iB$}lhO?'x![O׳k[NGem#(Z@H^*Ku)zSw}fzƻy>`g ]3RU wcg?@I|RM9c5OTcazçO!ɞk'o͘u!$EڹiIa0H &R.& DoeƢ34f:ܯbo(*~C a4C+JzgP@4䇷mZf2Đ"yeΝƏ d! n#Mg?eQ dI a-h'l}~ <8@Qw_JBKu/˿<^z{p 7rm׏9 ̔U#{KLSHE j߶v&NqwcLIWx4y'ыG<'+Pې4\zn>t6I{Qfۤ\2 =n"MGjIĔ&7]e5 2i  )qsZ/.4pFANcV < Zң@޳*;=]#{ԚlǦ[2eX6$WI M_f}J7'yHhYDё\;k3 C<zM ~J6U,fD'N %[YT& 5Ё9+hJ36 H^, OL'(g{/§1ptTdPMT UUAJ M@ Y*@ca24RKAMh~v2MiT6 ,tprW'FA߭Sm4s->+#G^HӣM6= W _1|?VV#HI N+ێݶqPK%-J=WOx@6c0.\ؤu[mvUfYVVժڡRNac*X Q+W,I611DCe̒LHڙX"}#<996Z텐#&W NC֮`i xM,MLFGe2x>B?YvZw<[FtJiy=N!’+&MOj >EWTmn\@WsrI3؁̄RUeJ=ޜSc&u.3 4awԒ„7mi1oDAb%pKjd@N!fuDϧm WҔn X7h-) 9('Ab Na2L5C5T@u/S@~hډA+#IRa'HMh5V @[l `=Aڑ!"L&#/ynsݍ̢Q:&P@M@=G'X\S(I0@@_pt#Hw nBa6`L[՗yġ b*)+3Y |*~'X;Y;Y;%UL>9猞3>?---:n+TT[g_CI,E,(\p)*z ~1!ၑPA+Y;R_*y3ìMdr%;Pthn2I죝LEg0fF{ӑKMňL6OV`n/\o=>T`/q@g_0 @v 9NO&T5JVH Y)CA.-6:2HCI.R, K A"YʫH2jKO\/J $,Q֚5EHk(R(Ert[L΁a@aJgߔ[i` 8ISrqR'LsQP8@x,uj PGjq(a6 N r=d./j$௦s Zf8[p=¸k e2 qܴ{@K[zw ?Cjuį_2INWjôps7j{s^(d&/Пb r%ݎ4W/a(&vc0?8T5YoA~˸G MNwڐǪ?  2B:cˤ+&<\X**bgj{3mslTƨO6 drm晓K94ZDt#s7~3ԍ̻S|D bΧYuc& z_R@q&e:b6n؁ Qǐ鄢+Q2l>3#a35٤KG* %(ibc n>& A"{ف$'ARA|X A8Av0Da5H3& h?@f7h ).Ruė*"Q bNK3\ YL"d(Hb9H)2lAN)n*IpݟUL0ȀfP 8ArWC8XH PbڌKۈdڱ1 u j%RJ橭"L4VR(P03(@b!>is˳nIwgzf\qUUSgL1z?Zh飥HU UT E5r%Zkٴގ D~#{"/XZZmj*?YlrY[C qakzFW%v$Kf iOO ?z'c3:Hun ~ $\o@$ y .4Y n7Hcu@Ut"?L$7 qy^&$#Ak&@{4YZQ$7sq6n| YLGZZP $yA`AF$3K,-?s!3L"g 6/!Q LYA*UXd‡ b=(n:W^0ps@ @-VomS,Tx7ìBL4V [] (J:DxX-oK׏zl +}z^l~,Ygfîj=۳xG5j_YJa,)3rghaa7HR.TNh1CR2RЕYmֶ[gQdKXjVexY|Qw .X#@Vkkk{ue%wR;~WK/'c? ^w7*A>$Y"`䓜`׶}ciнblʈZ"1ā.i@趸#i[gn{7'N -%ٲҤ ~YG.p=2dx'ЗclEJY]uiԗ:[@OvE]U Bk _qSNO9 \\\PaVvqUiK=i a>=6{{f1I7I$,QvZ٥QVvYզٚX'&NMr'eKceVVn0ׯlǠO/sDWw=w-t';n8;&^zU嫷UR$TIoq x hp|RxT33n$~qsO=ҚϚSԱ,/Ā6RM7-'} g#U[;>yZ,wuء^xԝBaƁ`Yѣ ج`a=oku<$`D1  %9Ɔ i= "r˺K5-$VO}.Gܸ5aR܈y<Yȥʨ406av0k 4?W#)R IY2?BF#N ;+L< 2=%k}Wvٮ‰9GtKfLO(cȔ,rSKgx2䓌Fq1O+2\Ƃd0Ap$@2W8%U@irT7]O Y7h(*c2 Ad:fdZb6.KC|=X@ғKjc8M'{YEF\/8pM%@v6r=1üځ!֑+F_ϫz_|k:2 l&z (" xlX_r `ֵFgJϔ?SL UUyTz{҇J@2i*Fт4luxۄqo0`~\CU7 ic9~h?xn3V5$UD9 %?B>g!Q:xM*5Oƿ-)R-R;/> %fѥageS{efq՚_{gԁ~Vf߻?0Ʌko\eNˌÝz 5Yl75?=BDa.IymlwܜqflPte69 n 7S%FȄHZ2 h@) 1U cd^T(59jIkl \_2LFDd& 1qiDN3  Ơt6a]nVH^ӑFK%t,!FF[r,,W.b]*sb4x~؁P3c<&n9NA's bPlBRoсl&qu 2}90d@Dv2 V^j ~wt[;k|#mfZPz{7߾:Ί'+!qq[k:NyОje5)?bI$'X8U1ݱ&I&oR_۹ֿR=}z(^%ыzO\]AO_nqLؗ9uHKzX&x ?mzH68^y| S,S6uHk#b |!i*'||'[>N]'hЭ_DrPze+}h-]tK{S@?R &ݡWj(WWU:y3"Aӗ4@)ZߌblR E=?d]d}KhW>}cE/oQ$>)hw-\E9kv)eh*Zj Fja.d:mnD Y3r6)^g֠1˗CtƷ>L9,g@Id'I>Hfꂼ / @ҍ4z YJK71dd(bc:ҽ7BlrxRTƁ~ w"B FĚ&k܉J(S,!H,YWlR ,#A/#]w2@ 3 ЊPDʂ%H"k@KVd99.@.%sAtI7o d/Kp|dvЊH{.EAHpsy]Q'Hv~$ ,,[,sB𴢋~w(;y+Q 1dZȔ57m~Y]͕RJ)JU|1&&x >2Y/[kܓqDF"n\$>{eNNY@Umon$ξ3r^?VwZAອpԼ%Nieuqv'i峔pZ0$Xl(VE ޸(Oʂ#P$7HBJ%9 R/ răr$,h@j KVee >{zqԏ3ĐOe2d_ **aP g1E oei*ܵkLHfnN#*sQNō$3o_-Eo8$um,/,ql$ȗ糧`{uO:d_lFq^ -_%JOt8e/%P1@O*iH-)yё l4\xL̓ \aՅ+ȣOB|Kr}z=[L>~ޛh>R*4 8<}[AC HG(|_x %oVHd'IӌS#1ask``rWBz [VŏUVMYis8t/KWJZ.#)7 }{i6y_d䧾(Z hL5#kdOoxnZ U߶|&[}5~q`Ԣ@ Џ=Q(n %]YI/C4R<) _ Oh 64ZJ&&ˤ ,ݥ!@wSP MeF&Ɏd/YsC'F@|LGpNJ Ar4(6όs#P2s= dYVeL 5p36҃-L _h?_ q2:IJ>|~56;}/}= |^v]ҵK\RM]{%.)rcgL}i$ zW.?d^NL|?wVW"*PN- xEٙS@Whl OڦwjWLf|sR(PIz5O$)mnyz*J{cv\øDOIc"x֨0T6IAfI^_΁tRL z) T=b0-?˱{p{u1uc h]5Xck4=X['+|ʼ tlAcԲ2ަ*UGU{^L6tfA(&7+?XAG1PhAV>.6+ QXrZYkl#-]A6I5he1Ą;A @Ɂ7Ɋ%iH *TO dѽg rvRCpA #\t#Dޚ>VH{d'5 f H"1T0NQdhqv#dQ"w(1vS L dŸ́6kr Llrl7dN\>,g,ʻW~IG̝؛cP8 ]wA7O1f+ũb3BZ}FBrm9}"8X [XNu_Akc/x,<mTc@ږ'K$~W(ߵ qˣ~߮9$͌? Y)%JΣgss ZGxK~ Z싽N{>Л6~H櫺hZ7<|MbaW+䅌ig=!{oœ i'YxCBA]~f]47Pn\V0KeL.& JշB@lH yя-FCs5 pڹA38/6,[@FP $n`'Q@;< ilˆaGHiJ}gFP Eg/bdy>Y`''}7b ,ɋ?fj/Q ɉ[c|ɤ[tK8f2 A|@6& $LI9 K1>RVlr|d yAbV<с3=nHG@yk!XLrh\{aKw@kPE|r׬cԝkFݮ=Vx =MA0f\<~WǺ|4#K%v1O ^O V ?wňBRJꪡIoi #`oR&'& A}D:J J>`/g}psMݷwG#9#$8z|}}| 10jJ3RRP>'#ub K _dy( p::{[GvlY=>~/<=w6o0dD/4o>den!?}MM -GPBVED=POd 3T2= }"M=T2Smުk1P~reBݢe%Ҏ^_gGosṅ aolݴJT @ P݌L+o`@ ؙ$dFb@*8)k乚Ió>vnnK]kQI;]|IځdKmgt@ڛĄ) @2R&5 KaɆ#1D6.uAFc@v? L{F$ѥ' N){Nsf l"XaDs 9D$H (0eAN.~e?q"@~҂lC(҆xТrN.?XX`֚e6Xd䆡>vAʥnSRK[OIr' rxeQ9fD ' 40:Cci306Kc5 r Y!~jb{xk䠜QU}b !7OcrLd.#=yD{oiGngNYz֌%]~s97+Awٿ.jߟ\hL3b{^ju/) C Tv2/V&q YlV'xj5'v[si@o>CY~ 1կ*FlƊNB;e*PBBEAr_hZO*jY͖FOgg.O_yH{"M,PD35* Hz0K&!T BҞIϞ{u(;^jaw24Fs'9^J {dJ T Ћ( 1^CI[\\[&{įf8:Wi're}ډI:{;ǹB<B:AF#\ |LY괦 Xlw%߆;7ɡ6J/ [1WF2j6j gj%)I rkD?l꡺ckNZ:}Sl(eOLd =JNuZ*qZ1-n;~J>8HwB~ՃjO2,4|i~"v6"@ EYm 6xdtGl#}GT0>@}R` zss) Ӂ(v9&き!/H+p㍒332BJΨr4ٍbM&Tv7!40Q3BR$'0xH ;QMi xtg7uk'ͪ|"hZ?pNH {̼t2v¡_B Y!4Bg},qQ\y?ys%|aW(}.J+cX)e [zZ\zu]Ptr֜?܅ʔB ՖF\fW6wEWm>Y07?Xqӕlw?E]ՅC*mlcyESBDZ]ztSL75gQܽ~+݃P6N ֒$O1nHuYj>¼Oz=1bAb8 h@:ɠ/zeXET3Nw<{tyNG: ^ `NSؾLe/$ԋ[ z{1jnfoO6)̥Z1$,:*|[t#9#38~6@jӍ-/`KK93.bD>5k:'ʼnD \Mi ph2R@ӳABAk>{ F !CM:B^uM$zWwOقK.ctW`  $-0#&@elhU@73fM I$F|'ՁR L~2INx;$#AFp8қ;&ݍ'&(=jr*xI5ot6S2IPM4܍P(04ɪJ]Ot-mH"5ՃM MUk:l-ir QTsx׿O/8*#_b6J3>z~ccd-+e/&Kno2>_M9'rz+X;Bt,j_)n8Ai5/x:F;kn>K'4Sݖ:z(bT34G޸ j`PL51j:d:գ":7B=SGwyʔHZNzR l8/YZ:6Z&1%YژS~ʴx6H )\ ˨(GcO-]1_`PR@,)3܆0{CpU׭ Wd|Z?j7 {vqR[VȺn C  8;@p !-6] W{ܷ33[S]u6V8o%2il(pЀ)O#]8S57,`kC%$0"@ao%Hu3)Lq FJu\xD8 r$$@娨)œ'%Qsso(M2Q&xBңf:۝E8kӷ%e("+yA~~k.).j68]^4s8*ZT&XD _d5#e4iiYYIEVR!=S&'^v$8uge |D@'p̓+gib53WyICػU/'<̖ΖfXȓOں]G*y7c بp{=0sQOZ[zQK}3x>t| Y$OMFY;K3H:6.X=0V zݲDR8!w "ݩGC.t$6~@Rf3^`fJ5MT1x/27 (]{-ҡ֗Yõ>N3P\"W*06 \|s5Yd뢍r,E7S ZȻhLxssENzRTBU.ƑמQPXzghI*Ej$(a"1t(:`B26yp t2|:ldN9ZyU  ރ4{M9ڲgYVca6:psiO{/0xYlrsB%@LATZ |=hhى͌1y\1k.:+!x3o" )P؍˲  M kZul2EYLc9|#3,;o°m{6Mη5g,NᗋWVGvjrSX)uskO(8;r: @~` R36_^Kxq[q RaO}mQcg6tA۠mP?~lgfP'yy%'o-29J9r;*9"6_/t%pY@z] QSz}X@bb ^w)>)/:ˈuiZ '1H UrW}i <|g ZÎDWWȐ!{o̠~iZk*E<*.jg@'|9eb4Ll6FT>Q!lC0R:hvhv0A{YѠ+L<@jWw(pԆ_24?[ws ~y ?簿ފ7~ ҟyZg"P([@؀i P5n!*pqQSuZzC# 㴱E~}Rfxwh[YzOCb&)] V(,~i2wj_8jx(@BUP*KEWA7 0٤0٥aD53d]X~yqfG?5ScCpz!:?8c8eHՓ@]l& DO:-S.e`SX`q3ޙřRK+<)i@fݾl6ɇ $>K~`Ĉ{ΩY„ ?/iWS,eBdVlq-ʉnzkJצSl#EnU ƫm g8graUa{uL p-c]i:9ѼMAHH\K*̚6[*TK].O.j4簟\5ã~GܬYӾ8x}͋~ l9=煥;:gg{ 1V 2=Ooy"ZV[Lr7RoOɍr#X=uO^g5 RM zzӵ`p%_]h?W&C-g 4ssWuޡS@ѓk|*iBpE8|f9R*'*U*E>De%mO4T[?%WE  ~~!A۠өW>[J;}$g nm= F l$'S^+ f_#,4hsLv@MԎi< nڬ| (JrA|x3} 8۫8.iZ= ;= ?9Lo.&Wa&K[׮i6a147;hkv"pIU2|26p?KփGl; Le8L" z%_n/__ub[?)|VzZb@E+(Q4҆Xqo\6Pg;NNsGtFA :ahXDNdv 98 G,2d)ܔq r l%ŽpI~^㻮} _ҿio}&Fuw'+tw.<8knl'׬f=Egso-nXm>9 3d[?+srQF6=mX &+@V?.J8.-7]w7& JyAi64Tkc5<4~NkELc bX/Vi͙۪y *UW|wz/WsB%{NOwws7) OxJOf(n06_;,ԥ,8j2G;o()&;y z+սVRWzݵ aS({ARxS%|(KWRߧ~~;Byb- p vW2< 񹲆 6D! O5}wپ"?y 4Az6 01En48>*.Sd,<ȍ 6v-[gh]ep/k`B{ؤ_qh~!3=)}'fgb@L$ɐ7`F2\\wPd=U@=#){n-ێVgYv*vk#2"YdQ* GvKyGP("LDOol/a˦o }hj8~9f^}.5?Eۊ2zfCk-@>%փs_%,2x5%AIXah! ZX0Ňk=lԦV{A9#_ fIL чl9_,"xc*H[;5z {="/pYtG.)-Tl-'b`ZLFx[1V"GCKNN u~X\+jnHkh.6W[i(M+fY[+Xkf=w͜u7|9*;Bݬ.R˷n묀gmp-e<#lb3sZzLF}p+s' a6,G`:al1A),m^,JzKe|Hڛy:9Z݃'>_WEEN"AV}h'nOj jm~SQj@| Ĉb6T6ɛO$5w' +0>k71Q22TCޫO@/+N"oL/H%{5X6JGvU,1N/ݾ)8~{ƽ!jku^ׇw7^wf;Q~i)PlKJ/"Jo* CPQIDAT|, " 0(L1jWQr\ |e|GWX |]Np`Fued{:s;PL\u=y  dqPl4 $MVA)Lnt@–I[ 4j}ߒQ O#F)YCR6#z%T4WZ h>;wUxoOu:V_h @<X^N60"bhKWwjۏzj.+;:Xup[em׈?b!0-znq%?eяaQ9\܄{= /h $R`̃FǼ cgʬ`4m@NַS!GxDpv F x 6I\).RL.Pz!KgAF>97'ٴgn~v u=U,bϛvQ<"9A9z9W]PFIBW.余kP>u@ `ڧs3g@Ix]rwAâr,o. KT-H $,EPT%UT W꽯{qqMNcGM"[, \\ 8TqQo{) OxB?A,qDL[]R/5˖y7 q^I&ѱ!Ij^=H˙N5 /ߴ;< "D $DP^y }2}o#! #Jo_4QS,f,0W.GA)ov3=ۂ&S=.ȄɑX{uOakOTHy_"ml[;@79y B% N _HH<\Q WX\~0`D.>ۤf t\bh¥ [C;ބ`R`e=`eu?=f<SSkѬp'RgW{ &D {- <4LݶxƋ%@yg*~LɊ[\wqoOg`R==Z\M"X`SgVg]ռ ,S0]7 x-Q,e, kh8[@(2d=unT/,-G'}(I]GWy'K^ OAoЯH"hTT r tJAcGt]ug9^n$Yxw>%REVU{lժV b< T.ϢXR U-@Ԡ8#lC?Yqc2hEy7> cYg+SY/FjC˃ oD$O@)\9:G,=x^TT˸2T?e#{CD~@[WZ@,x !NHI~C՛Br~@gϪ rE.q(I(eAd#gx>U.X4z xUDgNC*ek^3tZQJg`5qq] р `x9nƣ88aMӭp=-羃L%uozA0wl4 n~n5 c`;@dAϛ=Ŷ6 yzo'e|qQcGm~Wo Ñ~6#z"q*MEԴB^ɳ/t\U -Lo 9 BߧVOcGZ4?[X#-+8ޖ4Ni;Q%mIF,'&HK&(ijMJ>*b+܍/vyZNc%) bn@ Մ_U(": pִٳGOg ?OݴD,ZƘ34" c@ouGb!'N\13o)HۖV)!Xʻh J%KK?yO%@lT+BDP朦ՠWծi!sd5}  ȉ\!?b#x Dݸ qWʄbã_Ԫx .<we|h:ᅳV&g쾙 D_*> Oɭ5l uhͳ!,P(tۣ_I= S͍Mt*ZГ":R@-nVq%^ >ZQy#(iB4a]I6>iBJdJ1 ǤĿGR@Zթ !%Tr ǠO)k}J:`Jڈ-wE:44SK?߷|{dȓSp|mگ#c[RU"N,V%X o< t ôPyWH +{) B"B9 xP8Fw;3<{_ C%Bp+{J԰T,<3@I?t1 ٕkU*`? poܭ_MUAKgcV?.&^wuo`i#t @qOѧNiRNW՚N?n=uN-ZtSzZ[ޞ^^Gr|5N>3S5u,t,ȧ1 Vg;P"Ԣ@{y> N]h[wHA3ʒpP]`*2UȆa; D~ioɶToIPKfgzV,Ŷj˲wm kTf}9]N D&it^@-U)`3)oI? zZT+JW`%r"HRR=ou1\jx)/ˋƧ? Ӏ `(YUh]2Lٙlq3:XN*#\B/B7\pxG9OQ5,.k ޥR<}&qw8įH95 Tz޸ZrGP1(]#nJ_.$ yPG_+2ktRH%gЁ ;|~E,*+*K@bAɧPFt:onWʜ7]{ j?_[nWmwTжnLmj^^vq $N2 @<y?m[@,Cica滼QCc_^_'0\\q7:U[JfsgV\H8H͏ w9"M=/a$sɕEB|A83e`:.{vLտ@립C"| Qc$U|ܖw:e1V#m1{`_k O &{x{.qc sVΈJR8+1E]k[34{i9 f0V f@Pa|o}Nh ju!^)%SRg]plm6;c?-6(+|jԡ$Kтb E L/VG߃_O=QwFHvr\Μ֣s FX'$ϣ@I2](?jOΓ+<ɺ:|=IH:>1q$ϊ LXYCxÙp TP{?diM2`uwOil}s\VAz)n*w5q\eAQ%0SV5<&-Vb< ]in$ TG$ J3%ǝ Ó/*2Yͥ kL |M)b9d gf(lOZf;9~ /gѐ^}|KN dWp̣$9$O2)Sǁϖ#|P;s:.Do0?=.m(LqSWOo[U!P ebؿjls/v~(8U!wà/T hCn*vZ ZD- D-,PƋ~ cX{`{̪[Bd(,9ԼؠXIP:=߼ {[@[yUԯo`ԾI~O@W)c5W++R?#!AkC.1541Xlh.lk#;ȘVK\bg_C7f:}z.M9@P^ʯ QP_ Xmr01I4^K~z%)Զie raFHlT'f,|CP\x.~zWs G.bR&j^Ujz4{3]j5^UyA+/h؊D:@Sr}6Cű=svrs׾7w T۴tV =&eȉ9Hm)ՑrEKшh/-xk)cbz>9LU;jC'|ž=V@~`1!:3/(]KQE^<WG@w36^E!%$yPJ[6@yQt3?ko=,Eoc/!lꀴ[@ArQ0WAms$C̼r~; =vA 0Wu(^E&a3Sn8)g:KE $xX 4+e \?76 ܿqqpK|f%=䰀,?6H E!k{ƾxPk ϥB?kjyC C"FNG'{d_z]374 l g]0?)l|FZ}(8HL{yͧ½חYu21($3b%) b q x' RR2@m Mc>m(Egp߲qNJA\`s3PE1-!{%wa:wA?įZCN~Z| {8 Y" P^NLh~* 致o-{C{2),noCߞ n,l >rz{hao?@C{*˗֏ ПZruk4J\dM6zåi3"^bLf?j19ЈV4b`PSWI{a]83\_co2V<0"ISxKr!_7qTlc~y79g..lKܕj꩞Mʄ b_ 7,!u5 2~M*)2%Q)Xbz`55/zI>E=swv#P1C 1[S i`Yh Żiǫ_6 m'KxzHIp_W70#Y}w> <=pfColzv WKyvvSsx=kv`eNH*Ak/$ׯPMmo"/Hg%Y+`Ŋ8w-[0/ϾG̅ZW톹HEݫY[9Okyp/-nB2@f$[&xt 6%"xc cds=9 p>ސsd.KhFDE(/@TV)G RpA+³.{o8o%&vM0aLm&,A6@}%G"v`v7|.VW{p+p:5evMf[bXBeS}ڠ.z@w|rT@%R9/+-l(9!j޽+C_krP2Jo1ahbOQЏPLE7w[Tam`ue_B_熗<>|6l9՚sl!sE cc9`h)ՆTV,3X%YZiyy):lke](ryZ "C'(@<cрE揄 NHg؉4![V>p P +[P`TD`:\QB@ ͳZE6br;:Ah2K^SA_F~gBrp})nb HoAy3րOzoIГ'f+Ý퀥hژ<|t4҉g+}nγKۍhȗh;}>\EV~K4 ꩘=!F,f5z#S*HMwN#OP7rLc֞'@ae/.y22Oxص$-Z PW$% DԆP5F%2mޖ yM_߉Ίr̽-,;|%n y19VN*A\\V;>L?RlɄU"m|mM]飽ɭR*A漤ߒ RO _"vkV/8#ppZek N}fU9X@S4l@K.l an̟Sg _1߮^̓=o} >-.3~OD0=zL(f:6Rso\r\D咲D RjKeXÀc/jU >F&]C7T&QG+t pDyXPשv.43uXQ w7|#L^6)0`E?KNXѲa02eVjzjye+":V7 0Y]Zo!ePWeۀ$#57(G댊yk\EnFhw0W~ 0~R.LDyP>eߢrMeUB'17&&3ȽTᐩg8B3uvOH UVc/߀\+osș+M-9pjJ>j!.M:V]BbQad5yNhA+̢A]JN•d?42;͘NdZT@׷yf8L/go3yG&rbѿ@ yD-3z ˅rj^k]cnNcrAg 6u|Qo }sMj׻Uh$>'XIYTc/{>"\QqeUƾ@ʉ)`/9P@DҀXlFB6W+Z58$)g';E'*]ٺsy{ 0ҕO6g٠F-$Qd^RdN6 7qN:)ǕoeS[aG˭ŏ5=JVbm9E.@_"֠'Hx9Etҍ IWZ0-o3r.)^NIoOC4K.iNcڌ7*js]}VW0v>;=U~a*@?o9:87G-N++ѫer,X[nx`&?dd~nųu2A%XՕ@"\9"M:AU RR_CՄ7/1$@\uk">0- zN~|5PPgKHm&IPM/ uE Xz. <ֹ+?CΔ \ rD)0Ri 6;[0oK$L̛ 4?^9z1!0i9 ~Ap="p4y<%©9i3팊<Rr$npk߉fBdj Br7;zGo[s+4 ﵠ(؋ree !)ԡ,@AЁ؍ d~C_ M;)uwE5#x³1XYZ.,o6N/R*W|/?Y<\7Ңo:39Ag;; ւnצh@(0b.bA2o|(54;)_?|B&(gɵ@'.Ka?~R>9m?SK/@q؍UQ M<@) fڜ̞p΅wO5Tow-<`<$ \M4y[]>1_/ X1i=CNJ`0rS }<(͘bNYLܰ%\eh/g۲`.r=\9INub2fuHڮituLuttyfnfnn#ɽwn&2N" vga:?E  :)GbW@[̄go-7 bGy^)90bșrX8Sg/'@_>("/c3Rj9A\ 񦩦y`^>}crgKuœMe:V1 RC tӣ BJ3V38y TM ֲ+;<(C_!8ݻQ}3eL1zwfߘڃe V1ܓnP hBk EZ˴^9jB}xћ# mBlY1G zb<Ȫa*|`$@ƨ!A9B+l,Gv۶Tqq  SA(9*)y@IJUv]Qz>LjuLsA/%\XD,HK34ћ}K1P 8pN-xO1,9@r%zWxE=5475 @LP>R`ؾ.7'- rop6bp ^z14YbxI=I[gPucv7;[kյK)SVzUkG9(=(?D?0 OoeudRGDm{Z ʉz^x($yHΓ@}oi*9/ ɦ q+' _܇p*Ɩ^DžlK g(H;+ Aɡ.NoY,^:wɿg! |YF6P:̣{k%>O9oL[]òF~){@ r%>TlhAWC>0ȣK 6P {y-ڷo"$J@C7w6]x{7ތ!w3@iW;"((tH%[ ȱ%WP`U=>Tra1##p~ƽ}qϭXgZ;Xڃ8/-0_֑~ +뉲$U//L>6}S'$~6:@(4|^9kb`ѲVz F}:o_뺽w/"@n6޺mFS5B c#i0t.<w #_"6ŠM"M~Y^}cвD4E-<2 /ʾ5sשc]m$+-hBhe^jR$Af2 6w'$ Aj2KxaonrdLv<ſb7}e|9y&wz-_Rrwz>ⅴi?ܖy8sgE=_˾cc3Dcvfx|/#HnDmtu2n@Tݙ-}3A/r.S<'P:2I$  YZ>340!s5/<~' /x^x <bP&ǓNMLogd.w7J= d tN<*!C ʥr.H(Mܫ/u,JR!6 ύb gyE; Y p+u@-d#iCr$Gx |pQS^0P6iyy1=/uS-P܈?jŇoXrcH Eu4QD (MoHIΕ*=ڑ~аYG"SxА 1x}ܗ>t]XYZC e|3֧v!( 0QwV7EY`VYW)QTD&(AbD)6;f &{b (bhe4vꅗ=cvZwwgK? 65gh$j&U;?D N]>E/V"^xQ( #7&i>q&8G\{N21X`谕y %J!|h| 8# s/@eAveWb%zI!gN<U3kW(O=*7~M z <4onw߄ !}#Yox(Lb3N :U?yKY#if >1y@&C<)l v?{X T;\+pQr rl'JYL--?=!6mWNn"*P P@KPuABqO@:[|yb"3V ozm'PAT@S/AɭSɴݮ{TSۭj7g h\ȷAdg_\0Z:ׁشt喲 M:o9+H%'d+C`}6wmaܫA'mOpYRw}At]|^ŽC{!z9k)π y, emS  EõePqpUVI6dvT.p/.A8$ dQv rLS@̗%Ѭ۫zX+OCgZn/1*-2[aMFfZܯ}{Wz]{Bހ ^[wM #u4ٸ ]}Q:(o&6P,fq<_*4]Z)/l=t Pg-vtq#M=s8>Yʐell]X{bȌ~]1r kG"^q2ɳR2ԥ4+Jc<(Υ.l!U<ɂ<o ΥΟ!~Gu =ORFr7唊JA8?*&xn 3O- CG|<E'Wl_c z]T̙  L )"oA} WJ> >9D o*=<4R'x"v]@^QBc]%D!5O;+`kvw٠Nvjyi+ju(LS,PQJ*hǜpj¶ i)RUI_Q@eP x%{04^^_i38r%ܧ^OWg) [m@iUŠ/ߕJHCr 脎 DEK0m0=35;Ko\)K$ByʼIQs{;GruhC9/ @s%&UR&tM?;A^8π;mpڼ51\ >\AR]jlqMeP9r&zޓ=^!mazlVԌ»|{]u|ս[cGA[qk+GZQ_Vxm嬰Mq"cpq^XN\g*qt+ TQ5~e+3`RI]}dWeK9`i;-g㝥 ۣ_sM9"h`^s]wl}ލ%K<8dNHК\s Jq_T jXD@n˱2{Q'^j sr7/D}qY6F6\3EzJMx{ѣg;H*O+{ } 25>*>8#2W iPR^[A^WJ!oJ }ЫOODgs*xx~BU+MAHzB,O _q Z]D2FvJ:f`ȱQC}e? 7\x{3<@?W*\NQr dWDUL)bI@c$ =.S^^nW_.8`4]l2 p~r-CQPNAqI|LL'2eAܨWk *zyYX]5,(T 7mZg}}.z9. ;`= '\&-efa)dzqD%N2 ms1;&QKd )KssIƒ}@lnjvk_a^`>?>'5.}VtT_DVb/<[\]=..% 2ZRg[m@Ύ?g Ju*Q$<r.>,=؞VA ⡘L~ʠRA=x~H9"lQYg 7,d-~ ZOsJh/UnF ~x^j2r+,uΜjŝF{^gCLPJ()c>?۫}ہm`̫(eŒ݀O%L!elޠ8KҋVAnI9WOd<Яwt36b`R (?Np#Nw ג"""`͕B@H3@R/&Gn_zbY%~\_wɃ͟[5/}D틵BzEbY g;8ZĺLx=`24(GuIjN5I.;Iq :ElLf4}:!${pPֿ/5ɭr+trt4){Y⇤/Td&1VNw3y3~mc2OHR&i6Ak-8_> .!`4@ @ !w [{r͹yϹs{yٽWZœbEpY}ʤ+vsPYfŧ܄샨 /zQϏZs:Dk9Z~?!Kus x\L\Lَ4)t/HJP݇z~!nz.&EMT^6yc} .E>|p ^G@PkPx7c߮ Fۧ +EaY*6!.m+<N$z9 P @ s1_|"U9yJ- ]~'^L\LwhDXیyQWus_O$Jè6Ws5R{&I+ h{1aP("U[ᅢ~qw7Ǻrߊ'0LUZa -Ґlpd$/8Pt`){]N:|t(aө:~WIuv D'_4䛉WSCl(k짿 s&Mh/J(DM`D *QdU5%ϻlrbps6q2]HS=.)& Y9'~.q QH P;h󞵅lGz aK^(,v` Wx+?zq%?z=8&Xy~=vTPw 8&Mw/-cOz0P؉ַ-O  '!׵"[ Kiw3?x6G׉- )q$4 3O?DҰ5xV܎ytCpCJBLT HA 0U.eds8@ ;x1`9 $悌I?i` ­9NU7ȧZ>Uhl$凘Dbq68CӜ0waD;譮:eP6=-_p6u8Qb IS uJUB9 !K&`(94u_folPpq ( rdS!j9!~ۖVIl쉙᙭/ #`wr"a"/N.Y"mKz3fJ(4дȄIgeyf߳gyy>mǽ\DaeX.[MQA@.J+8ۯ:Q*>z$Kyy==AK5 RVHn3=3=Aɬ+[݃ ΆZw C C&$*#n'ӻ8+9q ʗbMŌP֭F9ji6n 4e(x? Gmwf P"?P>W%G(%AƓKoa˺Ivs_xn耽5PXZszz@<$:O<^ ^ɓ ր 0<];ΥɊEY7C"W@%ܘs>ZsTC/./ ͛ F+'1p44١;*#5 I%cĵ|:& 6-^u)BiP)A? ʈECƙK8OqACP7UH|9NAu׾1Ng 7Z<, %Q2 =y$ܪ'e BuEiriX>j:}Ưo3:~AOIJ^+AV\٠*5DP&w!J[V. IeUH`nT[@g;!‡7E󿇠\!nq°d9F*?/FD-`lkl'<*||'fcԪgiI1 )>؁-H7`8*)&ݢX~T`) 8 4 ح0vN\Tu+z]χ2D'Aƈ`Cwxʳq/??]hrYξJzʧЍU)]y[Nߚx'ՊC9/uA5[:6LW˜U:G)[";WG-;K]EU3łe c Ohu*vLb>e@._9zO'ʩ}=ϳK  #AW);So{;?)~qܕCc ߴ 3#/0^6@jKp&\OY=VZ & 7- @%/Dm JgX2&WSǁb°<\ p#A<10\*6ؚe, RՄщ!MbZ1aq 7̌>TeklZ)a1! /lQ_aq8Ke,~W ohY=z)Af_˾ ㈗CAl-F.0]6]B œezOxg/}QOqHށQއʴ/BP]y\gJjZ bX J(!Rt (r|"## 1N1Rlc V\ebȕ_EY 'w9T^6y"~heRԆJ^ChjC8[\ؤFb `,eT4߻]P ]Gb#8KzAų:/~L|O6hГO<{Cc[=%Bt}GY  1ahhhxtU"տ@@ )j Tx2N*o2 Z>#aΩ@EB4Arlf\qwOl.eл =ZZqZYbp޷//XxAªw#A-T`11_ϟ#~]%4;xOhL?f̼T@6~dL >!W繯CzEc[+H;. Ox2ÑenMjrKOHGJH <3կXJ{.Wm-{_oWP(l3jei,h<.y'YqnSAUdkuۭ/u:Q ;*~oGCa󟚮S^yzP fbp[ ~:V މMAV; ZLJ͜Q>rW@hmnU )%0L6\6,ncq`.>9r0 3ѝ8Hy7mUЊE]__.xn4Ex u*}KWw>Mq' A\i(\;f ErF>{I%wye(|rv[89^/A> <6Gv&魋ns\{vẂ͡8uzC_'h*"CA\AdWfqSe)b%(6h7·R-c_VYH)_j~Hߖ*/DFy,q@' qMmÅk5IE3TWAr5I|3ψQnܥ+ Y\̨]k]YQmfaM;̧HēTT2▴Y>Oi (gy:=[pu΀H0tUCRB8<êz-d,l'_#D~ri Sf?{1فc+k'A _pn1PNEsh%Q$c1 5 b*g(C, s 5 o"M `hxo;NS/őIZ=$jv,13e+&m Ƃ8i er9!oZNt ihճ淾(dye0@AÍ@ &Sq0U>wtm9$ J!*%bN,/;6bzCم׎x9 .a{P|}PBe^Csº{PSKǫ%V]AfhZ({. xy/x_ԁ1mCBq^*uOpr9^ոvnGGyG~v |t*aCx\d:>*yojRڤ 1X*LtQʁX&6uj !qCI!i섬&˷moZf&ղᨇ+N}POoE DQDIU_#'&G3*X/9,<|u<^d"'YXX[7+|ʭÖBr,g8r4]X[aP{eե^?U1w/s}K.(ϕϞ/jgCǙ3îߚi#nEcN,"`wھ9lj^Slӆ 68XO,B֔`c7fR3\;k_R0.R|qi0|dgve #RYDn'@ S>P99\nXo(_}O `qiH.\R8K#Tq)N=|@fb=n!ʒ eJnZ}-7ζ,c5#pC9JJme+܎Iߙ+6[-NvW)`g"P?֎B73G-nOJ(- ~ԇjtk^]ؔ TvjR!,3= -j*  (@=BA牌C}+eI]O{0lq@" xWd*@2DJ 3T2fcg0* {@`%o)gz|؁Szaj [lU5J?dR0AqB^syOz\?_w0DN6[֩xTA_flvG=w70;Ypk]u5POevu^y7"=0 Hykqn̓A R;hfrb>+b 3PX!'k%̹00hc]@΃Awsť.Gb T T÷[U8FVwXRqrAҺ7; 3w\si}vKGjTv|'|{?B?m5;+(Ki}ajn*>5;dV_E ?~&ɺ!N8,B筨MeJ,N_?zmR9y"ZC@rsJ;Jz& •eLihj}'&9*i9ئg$d+H yi1߷&y 8~QW#66Md.Pz: j.nE B+qTn⩼*yOI~Sb'ho h`.A1[@c{}럡OA) E2A,s1LRj,A桔 \m9>=X-e~En)?E;ALTׯTLqv,;b"`YkgDI^e.F1z@&]@&_ab~7ME,V>T@ĔbmޭG4X|ӱF @F8+ȅ}˯E_4_7|,6Q  O>j*l|=?r(82iKZ55^Ny[:BҒ%IK^LٙSLONǚ;QxNGQ}"yR* xΌprb'( 2x Ё>Ԕ2)|j"\?݀έfƁ}Jfb3,MZk'1eX3=w\Wr7C2KM /!nxd XLYbp6q r)^ _>41n iyhύ!&;dž@vwfp*ѺyB1<3?\m\,Sy!8DK~u)@ybq2,:ƹ]5.ꟿOQL-quzodFg!mT!{2Aa>e+/d b3(#J<:z(L*Ip}!:"EԖJ%&UW^~䏇@́3=#'V4&wf?*1rHq-b$F2o«\tH}XؽeQVr+)fA.g{cwg?X@,Q\eH5$ 69E{%|J3<3{>Y`Ho "Fi-KJ*n@%F&pKn@aiZ7Gyyߑma>mPpW;7x3zE12;, O@vNa.0Y_c8 "5 hqьc-{m׏ߣg~޻ݏ+h>p9|q<=`v` 70܁H'9>#ϠY/|I'˷:}lf08A:rHn&[tґ5.'ںO7煤krN؀oneTۺYw7wxr 6 J`FeaR^/}[wli0W;&.{$^PxUʿ3&C?|3mp]w]C&PsMӾA1U|,Uaq1Oy_ޓ?Kޑ%4JeLp vT*3E+x|)VA .}$$yeR. '/*so1_H,|J)b _5L6=12YT.9JN3@ 45NiuW1IDAT'Ug3844tW+ փ ԰ml z1ͩ3Boo5ի.NR_ dN PA.ZSXG pzz8,†dKg ȱ8K?~.8<f0I~oMt}\k*F׽b ^d'S㝍}Yatm [f 9N.K_`"4= 6悖J`ZM\ nfNm:ԼR8he>3  VmB)>[zf\@2H (("C|vsB`n &G]$) fIlqZPH{t:t_E2QSZNB_W:l1W~@,e/{.W"E88 []߭s{HdOIجчG^@ xgxچZjAGQt*z譢WhОWv^ 'i?ϮvrqJBz%Ί+-"ϻ7wVc񑳟\,ΉUDsy,+~+CɦщQ+cXb>b(xx kot0sd1o=n,KF1]=ؠkн0/n gcizЈ peEiPٻ[BIq!kYڰ8q"d7MpXyG^9E|xүEM޺6b=܈+ v#t Hޟ+$ny~r|F%C7ԏ߃,%*A1XAkA-w]bJG1KG,~X!ֈ58>c+\:^}=D`hio]z Li8e u>I%rY[Y>╼/I~8^xb ?l06qHf2Fʚly`SJb]8:"6`~uv\{D?ѝrUCUe<"/PKR`MVެQB+cYSCzpcCՔ^oRGV6}M~~|yqz͞6{&,97ФCTY  jv _E#jʍn$Gs+(6%MW_m\U%f r\$W27B(yy ?)kGcSO IهeƺBZe>{]e{ 71oP''X'y}&2- kA 12!WUQ3?(H0pW^7h3Z. q r~h#UFTάO*"R'=H3cwF2^; + MII6~q.=h6@͓$vS!ce`Lute}̐\jB9+t:,=XM pi-uMuׯ4mZLTuv\>&@l[vib \MQQbx;|A~T[~uJH1NDLK]Eg~ңEƢ1a $C)`nl Q{_<3|XfcNOs1_ ؽ*ûOgqUOkm}NS;@]-]- Ɋ1sXOQ([ņwxz_x${n^^盗 ٗox9`́KC4pыh rI F,;xL,~Tr̸ے'%kZjl=tCpۃ'\>-%~UW/5c|yVֱ۹Yp橌.Y5ORktIVa5għ8_aQ.eu,WigK0ߴd\fܸ@aS0x,=# Sݸʴ Mɦ`m>iX` RASe#D~L 19  s}e{9A95dثg{c%ܶTNqzЏMK @H?k6-O@.f0XK-$%'\bv?30,23qSkc P]gA4|` Sj)GK(b>>n$]I>ct;0r;nH6C_:^솋691g~CAy*8Ea;̾;p_3Ι?_kX#O1Ym{?kl9}tϪ40W3lT@>g)Ur^ iy D7NLc.ή.ƘU1;}Yl| B[h#rrI gG| Nmv]T2~gmH 2){_9{eT/>2u-k-0E,+,= ."ˀ2fS% R҅ ի5d9)9{x՜Cn 2A8PbLQؠY <.pNo8T]2pF2縼贈{r;g\P =A.w/Lq0V5?3 60uD#Ջ+Z: /AGdf8  -!X%Ή Cd+9nn=3,XP!SRy۟c˵9π]{֥Tb| tLnjnA.73 @Af=zrݢ3'wr\vI]!#1Q wwsujgbYwG)dL2FWѣ3z/-&B|?-D$?)dxyQXx! M`H40.p˷ qb!#2Ive 9\OJm2)W_<T Uv(Ttm& pw,@keNN~NYeeq\cPf4o92]ExW&y-ܵkpe/. >d!E=KY=֯Lˍfz C24†.XN mH?7 dQm0 Q_yxҖG#g~"^\~l& ɯ6ߔGYO [Vw9v]BTZN6P:ІfnSԾ7J'O]bgOo޿VLV[]EHwenQD~߃n}GrKVYʚ^zu?[4qfWpKӨ夽)y;ӓ:$(B}WUC30Cy`B[]c)9P9MD/kiuy$Me DGۦmͦVQ|--x$Re5MҥII6W:McD/D_bA\IBkG>;{͟>^mjEO0prdEL|Wa #5Ok]t/r!6Db60]d LcuC{{,,]u7`aN!dޤ(giҠ!F['.kszB+8 gjez`ٟ aWV'EA1^'ٿ1M)@~XS xZwE/0G2Q T<*J?&_an=_%wx[bܯdy@Fro3C€!ВdU?o X- PCyR/z]_*Ԧj +<'b!c^'0VYp43J! &TβF6v\UUF>]vqfT#X*fh,7\vʉ#׷cNK-jx n1GOktjw]u!rN ѕ҃Adzq8"m|?E*ڪ6ZbX!a8V_(Sֹ0hS2aXXoABjͮ\@6[,~UOQ1w- ZAu V) ;J_~p?Qׯw Q"ٟxWeaRlsRF-{i_kM^O^jpggu)kkZ'W4C 9E$Y,׸xX0Z|Ο 5Xy,!'k'xJ78AO<#ֱa21V2X4|]̂yE>+x (gH]_-"6+ESmT`r5D7 v{=vVFBKaAo.eiⅼ.e!`rʫ''n\ QL4RBJĀ{vo1͜9${8=7(_]^j@SrPO*+z@wΉ8ڋrb р"We$"Tx_y+Lp]&ƾ*S'YQ{,{s{UuPR|Rh[7ƙ(KʻϷgJAǾUBvm!tdH8ٰw)z}=-h?.Lj*O_r ꈳWs*7zϪ ([Y"-!ﳣ%ULc y&-[D)QTǟPx6‚ wlg|hI}x1hЄǹ}k컵/ݛ'5vڢ cOܗ:8&;_Ӷ QcCV<f< fK9 Sb5m' pCnt%]C17<Z7zx QU,egK pdiea20O⒘56\X+ڋT5T5sc2qrq?TK<2 PPBK*u5i>"x UHj_}apCl*~8 JYHYW=6 NϨܵ{uu pɞ mعi}^m{ǸY[7Zk=9qHbqj._Z, Ce!C%Pi ׫D=r7>O~<кO˟G̖&@Óy#"t o+3_~>zӻ2nn^2g*&ڈֲT'i+9yTW $]O<7c]~/'EP47e[%S_yyjNݬJrȻ%xw?!wb׾ oTz(<)rE kz^ W1M\iyh1(/F p9#":[.JMVWib|x7d2E;"DeѸ zco+`o~iJ{ (E E o@ٮ@k|߾O{bI`~ف ЧGqE2Cĉ ˳Upn` ní!b]iqڻR掘T +Q!9gw"x@C P^T1T9\ʌ m>8c7Vw= ]-<5Ԋ7JzI(,J)'K_ XhLiI?NhJڄohstlN7=??;: h-5/I7LiqAUNd$VmcQ'8|>.vuwލFXݬen<-ЗrX+<Yj oIR~$(DsTwC})vz_Xӯfg2y}UoY)R/ݰs_EkeC,-2Vkgi~M9=Εqv}q7j6m ]l3OeמfOqW|i/5S<+JK>jc.*Eȕ'˻*WjѺ2fSe)\n /sqж%MOH( i$K.2b$ڸ属uR0p;?jӡtO[[k[v;3̝w7Q)mpvnP=s\LCQ`lYWFݳjnF[7gコ &v[*FCmZ>w&6yρ}1wћ )aqM<;a݋LǭF/fg /);N,3KWEE J!I "U)=1dWԖJ2Z}2S+^5|f`fxVglZ 犲XI SohCmv͞NM;0ewcKl#|k01]m+vV'Ozb;kh ֿ[i9bZ DxƩ{D\-~'*ZEϔY2gGòOSY"#hLo%DXo1yO~VZkQW5Zԭ^etgwj#5:V*:;z"G$Rtʳ|bO#Z n4CYc2ϥTe$+%aޫOOO?[^D.Ҫ#DbG$21 ^ެVܛfv!;O5Уx@E*c"S/'pܤ,?#H$ň V1Ub!KQ^C/B OG]!4@9 92UL"#oD{7]§Z7{-7.z&X<|}^OF;{^UO5ycQ-àͣE7(;*Vi~%;7%#@j+j#9͊{?Ÿ_ƒVj]8 ) {bhQ{l8k][\vq3$igcӻ[=ܾI`hfi^fiLX+#,"D `(_r\)70L2o4ٜ餐YĐM,v,=iA~$p){w:S"vt3i|dnWV4~M%Sy3A(LǪMgl5uVrV@a!+yӼBuukBl^>ӳ{nc2*5DuM_O>jqmOgM+c{-G^sԲ i#-Rl+lSD'f4ɷpn0%F2JC) ڿkOSjRJt`XVzYģ6?qNq5.q#@/|EG~b G^i}Z32 tϪI3y%|#ϽYr1ިW:|b'se9Q',j5M-cI#qSe ,xa?(9cwNv+>=-Ֆ"!3"GⓇ;u :jֱOؘ|aW;={c^x&`*Dx|$)!'hi3d:N:?+㎇;( >o!c{EXũcV̙dsm67ۯ2D_9=~y4*n'KRWx>Yrz8[NgM~ҹ傁~4)Pc?9_lAPDfd`AuRL_r\3t&Oy" vpAg((p#7IDAThgTU׾{ۦ*RT@aAް{Ec7$K45*FH6{Sv[ps2Ny;}̱Xk͹~_\f"ⶫnO,(ypRӽ\%^`A#CY{1qX ;-*%u0ՇEzR "#,X\Jv)^?%'@o/[999iq +2fzJ8 MP.WlZuqssܺ.j!0y| `Toe#s.]vjjZ)_ZjL M*9C]>yßF 0[fv7f80$|'[03v+x-mj|y)soyQ̻JΕٗ,{%/LvI_ ؉.2\*ZA9񋏗`Q7h)yZ_au'=cETOVXR:2BztgK=8aÆ%%%4%~M5hVi ۞Yۦf SObi:PBC@Cc ㌑kV5 w|_W-ITS]!qCsCSCԎRnlK1xtz:׋t֨Q3u2;NJ=³%[^m,Y4&Y5@̲̒}47o^,|U_VΕUdF)\\\≧Ͳ6-igD4+qߧH6aut_g* uR(\(H [ 0nOXO܃dko[̔~4I7Q;Fd c\Pykk=Wd/z${yOCr~i>h_a#2p.{l-O:\i@#2SN.Uo5m;{w,7QKnX8گD[$ib xyUQ#rcbI6yfcd@!{<"."5$0V3{.yB 1]vO{Ie__X>|]q$/ga۴047;ZI4(^f<=d5 )T7Lf|y~ױ]! ':=peM|D["׉/y2< sc~$L. Ho+J tyHEٴ&Edq @瀂,]5wK8n;5T?WJX7x}D7^2@Kd+"1Tݣ*/7`Lo #h$Wb >3@ɞUYX0cJ|˧lM$*!v0߁?jTRfR'u?a0BNQ?U> w 8p^[48s Jʀ I"$~Ӻغ:M%?9Sӭ KYGS {Yn+˕]qʇ-1$aX~_|S&nZAuVR0ɔ>2_W -w 7Ys},/}'6m{- )8X9.w \PaW"3L0d=FNfKS+z-9'vm2#k!sv~k窸x$_hy4_8>=2<q{mv0lVES06z?)&SY#ƇЎ?Ct6Zp2k}{w3q:6@r pL BsUہEVJ>z[P>.|KPfoYd_`lkK:[Az¬c @vptqeS}tcq㼦yiCWV6ayeDagmN+",?8q4:hrXhLE%J)'p'Z2 P9^(1DV<2%fQdS@U*wV=[w86zMupہU{+U%h|n&Dl# m&[\,XPsŰ8mwD~uBo\tm m)n^DWKdqīo] `IYlf&HYt?v i=þ^h |tAxxz@BBlݜcitEm,Otfmj`JV;Mw'x\rR(UVQ.~S4OwɲVg6d*tS~f^ٖEC&[ 9 5ijN9Il=j4@Wbd[&SM.睞v\S<pdL02ǂse2 [0 vb̓:f/w%'MjTS"Ȼ*~o~LKVCȺ͜|R5kF,(ZhԴ(:֫{k?xbek`\,Er.+$=sm{V^6 H I-4/nh( eH* mdz/ фfoIF$ChH' 2Kf -jPDr4=(Ր ȫ=QV+F:/Rxea$I g2a;k i( zOsplFXZvyOm^qV9_٦_].)&"ξR@jUj1-ek\8:X.=n;PZdO:~(apFx/xP^oO1)C zg3؃ NԗR3@2@tѧ u7%ds3hE>6e-SOS,%K+^N$#j_M|4a`? niDu;iIfdFMEȊ}a|s!z" 9wqECO0E@h058ч4hm^ ޥ&`N]N:?=Ql]6Lep͔%D${]@vR5A ` lsNy{8MBEq>-KDKE׊Ŏ40f%*Ǻe\I*1z t#)'0Sl"vݮ8$h-Y d{VR$jY-ԛV'RFRw n(ϥO*GO% Hjjrb4Z_X .4%$a|!Yv,SʮDC)P4|6Zq$Izyрl5p}8Nf -Xd!=F"IQuO5Tbs7o:EbQab}oG9y0Țr(d.dM@PӪt}! i"-D|FBRBv&Jq>OLBbd( @%79|A4NЄes@n,˯4e?ឿ6caz `3Rg0 ;TBӈTonr+*8֎/~~=1 Qy.$E<<}NI)WepA pIl$S a|jR'};nX |̉VbA|~/O~I{DL翽Ys9+OW}Uo;xϐY;v9-Z2J>V{Cv]H_2r% f۞$XIv '3p0>4 5/=ecFy svsPM?M䜸M78_u/t1>r?22;q9P5.!Pu\dfp(HQJ(KC/$L0`Z'%__{~vh)Q>VMg2'8Wմ604f"H66#– F41GB;LӃ Xe;@di"#6)V>~wlH* RYz`~ev3eb31sdN /%@!{&]wsڴ-@-J*Rl` 3lxv;`TJ_3TSLlvNI#S-hx(?DNhӃ|0VqVVc D3DEMN2uY`Zƙ8}ֳWx=\}C"G|v_B6]B: !?m.4\R翟H]X:dqf]=\Gkϫ`عl.,g8P-mJ!_wo#Sx] zV |!_ucTŶ8f1b١ 3Ƶ%\ ō@ ]t7e]r.,,?J}a4,Hn1G$X-*7%ݢl Ud`-&ݕ&NТf։b! yy!ܨjG}v6/G^6P;8`ct9^" @rQqD~ @)24h>x!$x{Pp*~(z{ømɶbrQj^$|bAm0k]^~~n]lu@]C\ _f:Lp/JX |vqP ^d@mpW&%@3u>O;q6T u8>T,)(+\xLL`b{=bÉѯ@-UOWׁj \8 P0 uT(3S)Ob>M2]ȕ]9˞6.RW5 曀ag@onlAP<{MT SFKÌ?y]Fok٤[ {0@@I-o(t7m23Suՙ~Ԙ k 6br 4Fg;8x}By Y}41zd-9G$e@~lڏ@~e*ԀMs2_'L@~),buT%ֲnP)Xb`lo~? (Y2t*4G`۱-|Rc˓)q[^غczUoծiF,m $L+zCBS=NΓ+Vg:րxyK:`Qk:iN!@E;Xb@ʲۍ=oW7<˰/@2:GdWcFS[oe侖w@yA@G׋mfww | Rd# CBuwZ7<Dy'} ].t rt v #T+7:ۻ=.u1saM#&džK&@j>`1e98aX=175/H-3t5<7&é'߉Ÿ;ja'v?795kUwn=.Rs8. !t.7+YEY^I([}gP;aPF'1_)ـ  :FdWk&¡ݣpz9᯳R_u */#kbo;bg.~@ʣqb(MdƬyiR(nqyY]l!SrXQLi+Fߺms>ty5[`|JKS|,hp3f֟/<$)2j0~t"@2Jh`w-}fgDl'o7Tji QuÁU?CkEfyz5PR22h\AS6LMFm=śf*]^߸Nw.=[tT+iW{]shdQ$EH `NLVA 1Y!&xwΨa+E_?1C5}Bxָֽ V=E!:T}vv*bv媗.Ϫ̻x,GI`s"lڹ.r/t P'ն\coI3Egl%z~)(R8Q:jsi+f;Fބ*m+{)=R[б!Gkcٿ5έae< șKzCzB뱷iuc OkׯxH/C"ok/n$и@ݤ#ΩlKE{JKJBpƣ妸XLFWnpse.뻭 8 8\kIV?]P|nHO< 8CݦM bzH;CAkS_?ycg<"zTXtSoftwarexsLOJUMLO JML/Ԯ MIENDB`luciole_0.8.6/images/luciole-eveillee.png0000644000175000017500000002267011437126703017117 0ustar niconicoPNG  IHDR((nd.bKGD X pHYsHHFk> vpAg((p%IDAThgPI}$ *"0b UnmW]w@dkv^ i=KZ?Zk?0[Pu}[Azz[.]"Ӯ{]>}eZmc-!A9w'?Y,n_te2$; l\2M(UvSp.aS4Am@$`@^+ .-;+F*ː8T_pW$P\gQf7_Ki=%+wß 2 9d5ú3L D>$^vV3n4^.9bxڰ!ظrVYv0PotG 0&|tۦj%Z+ QikUdDd]O&H4-]m)hlZL;3k}ZpjWO/oW,Z;Ѵ@р^x.;`>F`paJ?|vi;H$(~fo%Ϗ37׻pQמ\TꜬ\O8U ` bv`*J#SRG> pL 3L@պ¥%榤)y?qĊ꒴1Hvh&o),%oL-,zyμpsGa@2)P(5ڶ(qZ0!7 ջޟ #^{M}n`0}JCI6@ΒX hIS#aLM ɹ\i^ت9pJRhSGM YsZ(jw+,bQ)n_1S?)m6{?R[of{UK>C6g?FUrC*n}]~07pWs2uhIC2_ӧou_=u"g/eR=5ډ5I -iw"="z]=2N@IÔOB@"R\( Q|P_Q]jnX˴[[.n'͎ixf;`9k+ޫgLA&gx6ijVmHOķΥ'8fCoK2C`❧UgR >6Rhsky(L+6ݍM{8@R1l"jm-_'ncpBvP :47 BU$aċnݪn .Yi\-%ϦaNSYgcסAI9UT3P7j7M#;Pf@o9j,u1ӟ}FnN,!UL ZukA@myvO]E[4m$@YWKh~l};uBR@Z.VJ^Ok`lk=zDeM唪_.W @_ckYS1ĩ7pyȥ+ ix2ޗ80(ߨW޽йMwUYBIGKL՝C;@qmdl `)ÞMf (qh$ nF᎝@ûAՓpT=^,ʃ$puc!^2sAgz!MVeZQap5% 3.Dk@A|Yf}Aihbl*6ǷtkikK^%|o>-wV8H敭FeuH$%ӝjsE͇S~n;N^Vk>:mVs>W3~F ng5`\KM 'd(a P3ڏc+2 "aaCNC>lT|L_!#W pM`:-x rp\'C@cq4ٮ՚*82Xv+3@7WA4q&/{'m?,>g­9R!"GsrJ@ ȿ@MEQhiO\Dkn[O rfPOz,@0z|%)Yڼ0M=FOxk,5zRq`32(2p}pM e%aIŹ @Rw)N*1`a[' * .G;ıU\[&bU++}kCpbWc[i ͶC(98 TbR )27"h[E@ˌ&7*_u-_zhl<{7!qJ$yO@X P Y40 (RԻЫi~G@/J#II%@I`P`ߒd5@OF5@p,Q #Z9wj>6U1;#VLu2yE(RAL afC -t|{}FO(ñOS~ޒΓ<Ҍ&!L'z-vD_^QhlBFD~iy+@ňpđQ;~tr㺳KxkǃK Lb >p:/νPp$N(2 R,DIfnSD< IPҁ`j*Uz~ pW$V۪rfo Q'n|81#Y6h< O27[jBYV,zH [ @ϲhyg :l?hn{p:Tpe> |1<1hFư_x~qi! M^ ɐ%m݁w3KC-|F;X\A@l) O['pWi^\p>RfB7ɉ{.a޺B-&MA2xFfw'|:W|<;8FNG3}@S%i>|@ͣ j 76 e P8gkub_/! `,N4Oou}RP&]Թ@.*Q`.-R7o@Ng׬@Mٕ |xO$oCk\'^|YK;l3p־%ާo/]%59Q'x˘>NGl'6bNVl#k,/y\8~9 |{ oKֈjY@ --@qZGӬG,mK-4J7Rz6Nw(`K;Rh[wKC!|Q{,E4$=r>B}IkQHzͷT+g+; Pߦ_kF>[)~;Z\[\wf#MgJ"[\J/б@KYv:]5$(*g.o-tS] hT7aiX&~.dN (ClBwNr-``ƈNEf}i!Bodhي*z~QQ HܸeiMWuO:Z.\3P?3j D6PϩѐHVt2EwvY&'sـ:C@f2t >+ 3cxpKmJe;w;wC0)ϝNulT)w( uX3o+vRsRĊ#}Ƨ?<7% D}K/oO#E]agt:7K s`FdRBYt\.lu48D+fCϜb056$I7Pw~(p䩸P ^v@N|Wleè)u >^Kߕ r;WMwΣV϶0vJQ@~X"`ZC5҃~ȯ{;Y w`,U"~SͿ?VymA}e`_0d6M3_ʎ|3}qzooP;CZoy?WQF׶T9|Z omY ZRYٖжW &Z,Lq[cյŃA8&MNd~e%@P(S9 kOP A_5 @M w|4gux:C9d߉^z 4ߵ@ڱOi7VI啟ߘ nw0#i'^"&}2mH2?LSgU7mot<"a0 #*A^6c֬tu* @m,34Up$.x2ް2nP}ÄM2ګ̔G"CGc*Wgn| zt7yٷ44Nb-w˶#D/2]~Ŧ"y;?W/n<p&`H65:tsbXb;MCZNW~_\rHwH)lj?O.-`q0}o hkOLSvd Oj$,UTrлiN/jtcG .: H;&JϊRPտa5 C#t ] )W-}0Guuq*/,dN=fbƯ Kb&p73v[{G/.ͯ,ZtRdݐnpZGE^e*E| ddʴRwM#m5 KHUSgOZP~RP~ :x+#PrJ7uE5MC^2% >$& w\@yHP_U}x;@V3_LR&mVS YuMMF DF/ vzm/@ߥ_IZZﰊrm >ipϾ1Lw ګizTa0]1ǚ루:l_{psxt|9]׷5ϳ4]Y-3fO^_|r}=fƒ [xL"zTXtSoftwarexsLOJUMLO JML/Ԯ MIENDB`luciole_0.8.6/images/luciole_petit.png0000644000175000017500000001734611437126703016540 0ustar niconicoPNG  IHDRddpTsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<cIDATxy|E==w2\ w +x(_AAP]`u]eoQQAVPPqAnDD !`9'לL"x NOWWWWק.҂fLWh!fBZifh!fBZifh!fBZifh!fBZifН ѽoRtڹ7e Zp6:dgr=mZ23mgB/=g#&b4P|'%jh!V{\)Ұ%%D-(z% !5UQG !'dB$V+|Q_#k`锝E\\\5LH`h4b0B%Iχ˹SYRqg̍淢#סTL1VK?BuӓٙL&z^0YQz<>TUe_lKʏ#2^BMMM}.mG4p Qpٔ[P bHrHp6\Dzz NgeJ#gw:ɀaNXY@ƏVo=8!$ؒĝFX,TWWc2z(xeȇ$Wftlh1S}HܬfFqO3NHL;ߜ-)W 4Jtx<Eh4Ƚt:gD>``2bDyC",;ž4ʯƢ3n{vGVt?I5z|Xχ"P lI S!!4ZC$?=$f;㱬'eG1 0jλ?Gb|$T;Bo=% hAFC?~oʽBxzdnOT :4BͧCt@UU&y)XJrr"#F]9 2Vszh=g!"^јFzv6-|Ǯ%63=3f(-8'g`\whCU|Ҫu oA޺jI; KuH':egЂj3Z8bZpVI<4n!\|=[r"^o,UUIJI>TVVug>_gо-fb㩭Rƒڇ~n7/#7#K~CD{YB R]ՂEkAɀ||^38|-k{YOϦA{JR<\@"ϟ4Te dnHˍ-Q) nʟnD]u=nAAlY'oK.ѥ{G nsؽc7Nz:EG|HpڊTIy%!Bh TYFX9*nGNʲXL2ł cΉס*E~͗#']Y"- g&o~}9[!-+E?K%%6"#\E ѸÍ1Y'{LsDIȝN "nd1uHDmM=16 eBBsbٗFzu-]6t1Ў= q81VLV3pr2o}xk %E Yh𭑤kv}%*vJ$;n 55NjN]5 4+uy׫6Oͷ<#2#W޺FAݿd;o8$DHE؞P>U(ZᨻNjٲ[w@oMܿN'F| J& 8ꝑ ,O[6pd1qpǞqIM d t^'@S@'7i t.j!K؉@oPسไxjlX/Wތw-N$kgUUZQ!ͦoqdCCȻf!K2> #) qtUUᮯCk7F KHÇB!sS 'Ė0O k $JzXl%, P"x560;%|lVY F5|UB r L6ML5N}zxAU#.%ж'X2{>$!KټȒ4R&?;GƜg^!7ge@x̝>vZ2:ۓo(/Gf0֑MWl?N$IL:g7,gkRUICd,,ݥڛOyI)6BszI @;H^ʬ3xaޱmc <!YgH'C Te_t.UXlMpo+I#Tz2%E78+p s|>#oD#) Sy;}Ȯ_%TD[P -' nv?p]Q @ i\9ۃͮ߬قѨl4 |!q߆S4 lɉ&%px}%?}* ǟ`< DI¿@qǖh2 IRI"!M8k*J@djkh9xZ1Ti:Xѓh(b(=6ncdpdʈ{'2ٻa[% 5 #7KApl )4gՓ8o/:;F}JJ #o[F#߬(cFz8vs (FU^C?i&@/]?mt9gqQݶ+HF N<&Ai  RrïBFnLFNd2DUJFLw2ZdC_XQ&cżō()Zq}!d&յC ŇIB5+oOMc%:V3 vS#Bt]N7^26TMUT4r/#zݰL&z'>xO~k[|cM_jƇ$I|՜9{ɪ/f#O߅UfYoAzBlv~ޠPiy}dʠBCd|mfRA'Y'(+KxS?vx] y^-1)|:w1͚@r$ EB(:XƏ"&>+_`pΘ 9HR<^T_BCj, $ܔE$χ'&E$$bPepZoNv:QL&:'ėqq2"#uvKX<${c0(Bq:ٰj=4u_oůcAF({qo> H .!dَ[ήܱ&a -t~&$>J AG~Ӫs|(&7š'? o"zV,gst|èj6ۆ4JtN72mƒhxY- xݚ[l1JDv:.1EQX6w1CF\Jl\g;6|)gۮE߇哩 ]QT_%6dcʤg?ۋ馲A]m>_t--{j2G08-mV;0X7}L?HBՕ6CଂTЅ,̜ꛃޥ ^}yHqFჇYzr$^1V*Re=%XjzSYUQQEq񈁸ߊ׭nj_E1w[SRW*Ix$\Z$&1:G5s9أVGfsom;qϬǂMwJ{ϭl^7yk\ʳӽOV#CQ%fN_GUq {|ΡZҼbHnF$m,#.9S6Tޟʧssu3xd\62YaVtȒໍۙ0vn7ubF0'U#\? 3q(uTT88x8\x+zhW|6Rq߮rȀY_UUdoNz1&io#UCLAPՠkTPH=JDCm_oԳضv%NNqׇo :wMF^n<JPׇIHK LJh4NN@Z4;uYf4NWT;j(8p Y6S(.x^x{;*)gd6PgC0.LSDx^⽥Kq'~-NнG?/T`D80bГخ5q)ISC 8XRFJyңxztޑ7^LЧo/n|#ɲLL=$ `|<|HIձH4j*H ޳qwxNBNng/륢8o܆SaP\Zް]k7EA|~?קI|h)z߆.!tڞFa648&Oڶ"-[pjPzсTJzg,~n7=G8+Wk/c!0hކ꺈q Z(}FVk+&x=.)ޞ]k6{ߘNzfw}=63_c>;ÅGyog_3JHdq۝cpֻq;p= ,nײqfh !K*#.!+;Xz͂KΥ LYg{Qge1a:Al5uج|=ЯD!$;^؏ ۷ttMvņfdkNԇ / ?g1pסAc0=ZJ/Y#2-D ! -43BH3C !hǎ9S5ׄb))p0}v)|!MÿV>Mo ;wGY23'Dpai_7.Xp!ĉZƍghՊ:cG._ڪUlqq=zף]yը5]ޚ5[,[gZ9h#cƄ=t  ee =탛o"뮟.#- +} 7WKԓhq2$G Z~>XZeM AEEZ\r |vcj '%Aa%<2bZmw/tNO`5!˗ÅOki9_}4}mPQm yy7гfKt]N\NB& ew8G802Ze}&''/\=\}x5y2mb}Sw3cW&}KϧٳW/ ` xetF=VtBee5g8MPSSQ8qXTyЌwtIԯ9ǣc2i{u*TĨ|!]|"TIɁ#ϽU5R3O5MnM-[2/J~of]E?t[NIENDB`luciole_0.8.6/images/black.png0000644000175000017500000000065511437126703014746 0ustar niconicoPNG  IHDR@ J= pHYs  tIME ,VGtEXtCommentCreated with The GIMPd%n#IDATx  Om7 9\WmIENDB`luciole_0.8.6/images/luciole_default.png0000644000175000017500000042660111437126703017035 0ustar niconicoPNG  IHDR@1QsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxyt\}'o}A$*ZH^⤳=I;Nq&['''9grgd&'i=mO;vě[heZ( @kUޝ? PU {uw B!, /!BYK(@B! ЄB!4!B!9M!BH(@B! ЄB!4!B!9M!BH(@B! ЄB!4!B!9M!BH(@B! ЄB!4!B!9M!BH(@B! ЄB!4!B!9M!BH(@B! ЄB!4!B!9M!BH(@B! ЄB!4!B!9M!BH(@B! ЄB!4!B!9M!BH(@B! ЄB!4!B!9M!BH(@B! ЄB!4!B!9M!BH(@B! ЄB!4!B!9M!BH(@B! ЄB!4!B!9K=B!|`8$ $D)F@zB!`fAuVH&X(@B!dMp8v*M!*6n܈Qv19B'& ЄB)1n|>LMMpڵkze0@"C2G<iYK!,hB!Yoބ@Cjۚ @\`&Qħ8o=Cʹ$I0 hbM!5EeT4Ԣn*je &fLaY3Ba[x0xrڵ9Bd I hB!=aGE] l†mW [afK$Yh xixHΑff)Dl(@B!,1QT:ivT77A%r0 !21~Zɭ4!B $Ե5΃hwՕ<4gc e< ),,4M!QӲ{턧BQ8c o7D4V4!BJNRdtuG>jasCrOɥ!BnmZ# d; IVpే0z:νVQO _zBYRԷoG[h߿VF^@̾.YsO7M؜TmhMgd]M!Y,@{nF2_uVg!*TMjCsڡ9ab + $YcpW)VB!~@HYfMbӠhNcgGIz2 =C{qIŕk !Rif=ю;4<gIfK|^0!f*Up\=^ɩF=^B!d}zNVQ8^+yBIު >6l΄Cyjn!LS`NkB2M! յ6eg3ԙX\tW煬(7_LÀc}`IG?Bɻ`0ak>/-%p+ 2M{w 'khB!]<G":.IB6 l.1t:lܾ!khB!䕪p\ُl˾VɆ2`:%P&=վ[hB!@oooKm"; Iwޗ? ЄBɫzBU]Cku(rx:hߋ;f }!@ ЄB+IVx!TW<3S`ӞVZAr@B!y9G__/ Ilc!0PQ[@Cm1[r@B!y#I&''=g^ȪRl#}!%) !7)ENhv;D/(,P&BH亻,aߕ!'@B!yvW8vA2 Cϲ) 5Q&BHl޼yVCYU9( Xډh ѩHڱl[4!B&-z%fˆLNcp8H&%)% ЄBɛ˗/CQEω$KBmEc9:pW )& ЄBɛD"B±kס:6IQlx>` @MO~ZD(@B!$o8<Ϣ ^#N24+=s&pXX]IQ&BHx%{AO #<> $Y\w\9s~9_|3Q&BH^ ǃ/.zԍ1 `$ln* t_B,2=K4!BV1ӉW.yH 0uliLOM}4M!aAUUHh4qƍ}s0 A) 0v$hB!p@Q$ >~+G `t`R1r1'CB!v0==ʭA(n6cY΄esd}i(@ ЄBY,˨qΡ*ꁁd' #\qýk5M+шH9)XB!j\v p87Cuuup~6mq#ĩ^KԴF1dM!8hii$_ݎX,X4x\O$ҷ~WAZbbW]ɗ^O;666VrCB!il6ӓ5 WUU!.zcǎ!d=E@fY3Α%yl6[Z 5Q&B< ΝzNmm-OI&P;mq Oʼn^I;Anr@)v>NhSSS(2;$֯`0MӠ:H )$I IdY|vai[Kf9S?,CI`&`3t]i0MM4ZZZog=188:kHxl/|Ѹ v a<|`AOxwsH$RqC[E ,I%qkSFee%( >vrC4l6D"yi"Hd\Vq- ݀5;7Ҳ3c, H$2.>˯c(YU=S>\.Leؕܚ(@resKAi۴=Yf?0MI$ ! EAcc#v؁ "˔ wk!x].dYF$Mٟ7L}ls;1 |mnX4HÁH$ۍp8\1/n/DHY*t_) oU%"$IT/}~c1ؒ`=EB1Y( l6z5$4l֎TBei^bAd$ #Ƶ 1tSc6mڄz;w###EZ5+IiLK?h φml)I* dZr&yO,$4sx fS>P&dZl1P_Ѷo'[}HYK>:g1r5sƖ-[PUU^{C)UU0==P(ɥ'2+*<\.fŠqA4tttwz2BR6||#0M,cP4 ;oB 8}v~N% <888`$7ũ^^`qy\z5E-1EQe^)Mz:" ØiH$0 #/۶måKf8dbۋVy?=~nI=wJ0!Im<_ =Y(@1_S:#h>S$YC81H_҂VknQ ꤺ7Ks XoݎEnx<.cAӴWS_?C2 0\ ?arF9)? Y^ulܾ Zk9,ؓ$/~{td9vwu^~e c , s "\40~$C7 LðZ2ĭN!f= \T BiQL 46u@!0Ơ*LӄA$Y4w܁7xcEЀ / AT77% #\EʘӠix?œUDC뺳mQNhB֨l3x`[CM؜vSm9X3G _9aGww7mKVAReh>n7*Q܄j^0 LIaMUz2 =jAV؄G2%0LC[SLt=cjF `lp7 \({jv:Hu*n޼$-ڶpn[[.\9ux ŦAO$}+uz4{| ?EbTLM0666iv}>Ե66y{|cނ3(dӓSxOaK/D8n4`+ߏzhy3iӔ\m޼݋*v?t?!4n i1E]z욍QxObE)IRQG5FUU0-UW<;BH/PRU=xՍk\ qk݆fTVuCaWz&)"'`% s$bq'152h8S7o a=^UVV0S9GCC\vwlփ{Ѿ*m4>b?D2ԍ1t|Y\|TQ hBEQ+k~wГjpYiPldUy뚥nlXox?3_&bo;Nر)o> \h*4 *5شg64_[eծ Ģ2mƙӶ0gp_?.sP%mlldQv|X4v ^Uc0@b:ɑQ څKvz TAB51fuϘ󖢷*obӞU·6MP5UKmmU\[$_~i v:;;9ɓIXؑ` dU*Hش 9ۉR Bcli+gʙnܸ:c X)fG eÆ ,b:9Ǫ6j~X3+Y  Y2͆\N<ϡ*HS6\N(U"pd`?kJ{r{Gf}X>f8PQ_;oG۞ + BTkk*xwbZy,IiOG G O# 46X8&G0z:'& !4:c3K$i6"/WR"Y. Є9Yx *W{W]cfjuY}RVLgs8x ~t!ߴ *X_&jo,ety`feiHDcVp2ν6z?h( uS=lڊW. !D2m6={v0ŊfKv6}W1hv~9/s9rݸ~z40`~?bȲ,CUUbN RPU6G@&T-gk`^V;>ŕxWq092QͶm000Pmݩ4!e .\–{?Ǖ۳3ΚY^S9H;e i?g]u$IBuu50>>Q躎@ ۍl6Ȳ EQ099 oI ӉQD"00>>^+I{yAlj =PتBEOb .ν6/\NS0:ZOᙬhBTEEn7f?׺{;߀ F2]j^/nP' ESqy/F@8ur*ǡ*]880 t:] nS;.B\fK/|UA4lmCE}-Zvv"P _M$IJ{a+e`N>&0BLGn:ޓ0toDJp@A/nIYMHڷozkkQzYQUU'Oɴ . >pB]%Ii90'KtÀtZ-Te^[eVoYwzo,sl0gחL6Ӵv[;s'_.>BHh)' )C27nT CqFTEUT@҇\D?+~yǶoߎ . BQl۶ P===Eg*l6\.&l6-8GyN['0ZMF`y6f9期>sϴ>Li8C>39;(´$!3~=:i& !7Q& mݺΝ#90I) !h*< Hj띗.(i%)}}}.ӵbzzhG*h{tBӴ3EsqS@Oeռ-Sfc3pƭ6sև $k1ߜ8!<.R!:kFӴ6 ) cfF_ӺKj*!LI\|='[aBOڻD(@Rf8hll9xOmw F̳ O"$K1?.z8f Ԅ \|9R}?Q__h4:Bs;ox^$ D2&tu[F]&ef,(H^i&K ؅K|L^lbmfl +F`rd u‰P&appp6<5nm'Kpz=~B@Rexkk2 Ȳ׿KRfEE֭[a&N>k+AKK F36~1~0UawAa- ,ןS\ dY*ֿeyK\/_W|L ؆ai]ԭ)3Zţ1DaLÕ81\zT6j!dK=BM1h6/<aw9s*w3Im\ @Nsl6$Yp8 ǃx<EQ:&'' \d2'Oc׮]Adge0@YRB!$qB@T?@sa"r2 1pY 2dN\)(oxAB2ΎAV@makOЏ`c=6n߆9S~o}U IDATrdMHI.NᒄƭmU%Dզ]s&aq[|Ui-n#1H$i$E*R 9p8|V*u0e9c||qyLLLɇzLMMk)!O&`$uH}ߏ? 0tz"v uj{eŚUVT ˲2ق:50hpK X;Դl?Ͽh8 UOHQ !ebʦz|Ͽ@}- } #}}-Hu%_5=LNUe^8C}r Ӊ)LLL@eߧ 19s&/3빐$ w}7{y6ۧ9h߿ m{wK|- ͜Ad(ŦYYQE}s\CnV_sI$$ :y<"n\ɭ74SgDŽ hBʄfLgV/&q[SUmN e.,`AUUւ1 ^i:::pELMMa{ǏD$T67ift=]Uz"&^|ݜeZɚ EӠTHI*["-[b qEU`#7/!:"LArkMHhhh@O']l cVҍ5#S)zO]|? VE!p;assvS7Y Dr,!FGG!2ZZZ -499 χx<^Ysǃ 6`ddCCCirqf_~{w@ILlf(  En.[50>TT Q.)݆M;;qv+1><MOO> ЄÑ5uE] =z8m+Y[m,L8ki3s8pϟ/2b@ea/WSS6n]ۋH$vMp>#1lܾ#,]);Ӭh*.'>^/lN-ϔ)exX@ &)`:$ [փ{0}iw(8n6mM>dY7cH8w+G*5Ņěo61?=;`,]N6+  ES_GJUQrl$L3։m1ӇEQQQM6-k.!v & Y' vyniB]k3b 24#,aPl<@ڱ5B* \.AܹsY UR6 ^M].dh,s#烡8&&&( 0::Jj )3X1$A8,Zbi -K4EǑZ$0011u[򁁁$ M[pbTl8s؜v\.6mD) s5֓IȪC?;oO>׿Y344atttk[Y(@RbRHdB@RH\o c X Pڱeqp Xr㕹4[F}{R/]ml; T#jh^J\=b&F >`ᗿ{5cLNBMM ExGLnE )7AZb*K 9!O :I;(Jֲv/cU#VԍZvn _)tUw(묌1lڊ_ox?[1CCCPnPqBS:45.c ?\±Rv}Y;\:?(5U0zI³M2oUoQEwy\ښb,\Qmr WID4oUW~AVEL&H$PUUUQ[@Rf㐵,OBK%@"I0:0с]|>_+%2L,#X]En%z+ .qkӓƓ/T!gsrq)Hpy=?|H?x. DoNJP&,e~,Ye=ogG"K8ѾNQ4nCSK%qnգgZ.#8 kkAME$E̼hsݐ B\-8khJ<9'uHkWz~OO q" (@Rnh:IOw-aF'2~Z-sMEmAǎvUCe0:X 1\Ћ_6Ο3K8dAUwQadE+qGb0.8d|&( ns 8N9]8<3@9ߖu2.08Fxowy1ضmΞ=[đ@Rf$YF]੬i$a[qY;?}L;xݚ*Gv㾇nǁ;`kf++f³iASs=vn/4fCŋN + H&Y_ kpcEC&F'0:0tzmh2_!!h*~u|B<8競9]z5^0 u<L;}F2BiDQlܸPh] G3ЄD,TZHбf DnKu` ];Ue$Iw̲Ŝk |pM`j"sp# p`Æ 8w\sj[qg>9p}8K)Lt;>B*>ŋc?n,#$q=.Hv +8jBs>cy]%cq8}^<GEm5~dݍ;vɪ 4!eFwvv1`s9\pIBt*X0U-:]Nv<ؽw`ZZ @Yis3`*8gr*[;*~WckG:nیmhnmD"DFwltRs:Ml޷l}AԵ  +'cq8&-Ʌwvs畎P3ͫ;i񇭛Y2Mslު.?t5ׯ_Ν;188XQ4!e(21]p0 )n}k(~80ƲZ~;*Pւ=tܱv+crY\~/\>Ȋf5J +LB h M%.stֱ v,$B2 G}^8u9]*8q iDzm4g?wn#aC88g˞\"M-Mhl*v#mQaldr-mohlh00zPڌ=}1{$Lwhvx~\Μ@We\؁y١lq[;6{1aWӔp8 MӨhBT4;9qs}hLg\Гt9񡇏bߡj4`&LÄHĒ0 zRn̚TƱlެvj,[:Z8po6,{<b&~<_EˮГMӄ88b3k#WѴ=RTk: Ϋz Q50˼fq.&и W]pRRhBj7mDmF+ q˱܇gO5cq φ#M O`:C<@<G<G,D<@"zj3l4MG<3a Ҧi>lli_Fvmmh?/k xAϻF%#po?ǵ P3sn Ȳ-+pt7"^n9ci5ϋTg^=f<0T vo_Gs'PY-ZΫTC-`:hֆoQx&+E2mĩciiBJ8MCsմE?sϥN|S`#z2H(Dx=Y !*-*$F2܌Ou a_m8_Ώw~4UG.ijmxivH4b8V+R3ɤd< A\ⳡO9$0L gzR!|kw|~3R@Sg;zOEx8pIBi3%c)J6V؜_yplsCs9VW]ifJwt \8~"וe!P&L$I޽>o&cشk;.M[p8DZ'S驪:okMSwn!#bA.:$s+1I2 ӄ[O$!K;|C׮gn_u5y )4ᯭc'AOXҏ֍l`upx=9Նb:#8f 0˜SH-uZ0LB@R$D42KNi|Kv!MHH$p8J Mvc dM%0!Ix_A4Aee%&&&}c{;>{fv0L4VT5CIܜd ,0  Ii"<A2P.]sO^}35 ϣyGG|Bs=]]Г:ME1۽hWLV\Epy9|bgycs^9pydNuH${h2blh4:X|:alؾ6(%9dU>'Md<W^:<]Ufd`!B2OuN?~ݟd| 8z<%LYQPӲ}'a0x,s'%ǃ޴ǟ~p`=Plӽʷw ΅ KKq¹-{o'$ ЄXuM:v}q}p:@CSN?TzPO/\Fk] A%(~[6AT?'o_å'm!̢1ڼIӡ}e<'^l{lpuD"s?|۷$'ID#e>'BX[sO~ʦz<` e5B( IDAT oefxmw`gzOAmk364Ulq9ܳy% PӮM),g+ )J_U pʲ6L(@Rd8|t}~= յ4m6(3'3zF&1x2$EA4nNc 'p7:^Ώ0>89˗/cr2TM}މZ 4Ġ!B{¿| $默qIkrpo^{=g#iVh@/LnC.\x} x4fv\E9:gds2\\/il,8i-D Ɇ4!EpO>wrvw칆c{&З C1Ӈ/WNZH"9z68KýWqg}~I\[racMM 6mڄ'N,an:  C7!6]خs18ǹS׿ufr;^oUrf0 naCnj^Ѣӕ:(8;(f ER(`OK}Us _J9 )}!TU!+KgK* uݶ cܟ\01׏wy{f)U,YoxARdȪ@`t`S51:0CO]hÆ {PU5{9H am]&1Ģ1;?d(9v FF7^B@ @Zb[nC7cq Ѿ$-{z΅u.Ep·rͷBH^)a 8N8 X~n`%yƮ AVU8}hNǼpssp!VhB`|p?{o$ו}[WP(;@B$6$[j%x4=G3;4v1>ȒF3nfs'@AľP^fVf= (G$Y޽2;y/y@6"Et]\r/֩_x}u<9{-A;1H$c?wdM{ {V +chb ioB7 8ܽ~3~(j:wCizӊ4ӛ#Ƈ?s %zV4_ȱNP)Cc3w.cYf$s|/u\<[7~F˱}ymܢC<ŒYHCG7t4MC+U o?3~+mξuaexwm,_dfvN)b%3fL'͹ȶKaY+JP)E,ghMLxgd$ۏ<q"{>>~5E6s iVY+o d],{Wl> yѧrȾ,DW Q;,p&]nم b~qEkuܕ\>sn%3ࡃitp4@rey-(2wbnl<7~󫬝]SC|.E (V@pa4$-Rk|~~ko/zٺu+xg\솵aA%:(#(}_" p*Bۿ/ 7H s-Bl14ٙl|cl4sŚ u^~EW~^r7ht.\aޝ?/> kN"@7tqg!IH I!@t&PX8K>WҧW~7֍9J'W{LiZ%{lbX"a340-Dj"żM>d8J8x)=W۹MR[0vg6;t)%3hN/iG,m=U(b1D"kٌah76y^&7P֍JQ>gOL_z2y^j$O,NxS_o݇Aa@\"\3Ύ=[ٰidx9{_zg"a)8#s9>GaS$ׅ@D׵Ou8UӇ|> 8򍯠d3dGyGW| !`jz-6}f~y׹zm"c#L*3)sI4I2ǴٛKy!nܲDy7PJ!5 QJ~q>OQ$E~{-~bȤ9‰H=Í3 2ajzuټm3 1- )E[D\F^ EJtR)Jk" ɤISB Y0l|P!e3Av:kR(?4426ѧp.es,.}k~y要 dfv tщaG1W¹.FG'ba_x׷uB8Vܪɽ-q=^ܸva}_z3f4Jf"֖滫<F$}%!Sj@iͮ9;1oզDn Ih솵}t'vna 2Cib1 I E$JY/*\_E܄@ AMJ!h^!i:B5da) Z~$n@H$Sq&Leʱ BmT,˅`?_sv_3$ӉFxy~?+H)%ov–VdB"Lu^Ĺ/yڟ4%U;}gzkz؉#lپd*Q1u\G (/)ED*N˪>>{y^6n%JVtF|%# L`ŬZ#*,aafϭF]Ģ&F?c$Shr!_$-$*c0jkZM}|Bv~VS 0_Ν{BƉ'b$q%Jе|eT:!!?׬X Z꺎.=2w0L.=:"< ݷ d]a^)Uu6}C#\Apbu] S+K{$IUȁ_<)(  Yǣ)B PJa&tT"^&łC~y^>a԰O]t狫?V% dx!;H:$(e(GC!W bީJ3z{k{E.6o3c;dr^аaYeR:0I%bV'4-3|z~@z>*PX1?#*PV!5y2 R乼.:ΟHv1 hmTL ?̶>D&E<\9N Am1 q~綍GҼ$hnwd[)|_}fu}o>[<{`abr=vu&xe!YxO`Nd:!cC1 uܦRMOJɐ8,} dD›x2.^M? &u?L*Vz"B`l (ken\͍k7{*S]Bf&TJX(Λx?e=l•+W*'Ja%=~Iy^((1RCMH{v DDV#]))anhdw=nxşU?C`Uaæu<;P9L9>\n4-x"na[!{VZR퐽G!qtӠ]JMd4-\'@*}{xxױ4ScPֲy(ᅨL֡(L N`TRy'oĭE@k׮_:m]Lmހz#f2=G]ж]B}nj۷٣Ϥ~nl~UQ\LB tèmSZ3ÇmS|ṧx^X)yv|c WeJ“n04[a:y|Nd )-BnE#~ԐgD" "/JnVߟ cf,y^վ6%jVѶVDt^cmvݭҫ~{VVՀP M@״]-Np0@J#R0FT8-EBynܸͽ;pM"泬_1n߾ͥKٳ~߽|#C tC;jVB?N×~þ~}q׃+#c (G%I ÅŠY~Q?pz*  Evq]EL4BX5)%f̬!^c"&yڲ})HqWhiŋLLLpa4Möİb w)E7y871RNq&$V>v64ZZK,6pb@x`0L/ebbq 3mxb +5u]qmq,RzRXQY)$%iSOuQf(*"8&E8i]sܽ{\6i Cg ܳ5O҅-5WדaZ:qN:=?łnȤa?wS~ر͛ol߽Ǎky6^ܸv'[nq֭m4]gݮ}y"`%/UۈN+AM{?Aߢdշ +mtےAi!xMi=-ೇ4 ϗ fhjH]034id~~w<Ş;HSsy<7LJ UE]|زtnjF%l޶[779ۗ>민M:b5Rؽ=J*r( -,k0ov)]eh) 3OLC| bv2?׸qfG6Z=u#vl ozR 2I#$yd]㟇s?s{Amt^)S߷)[/QD9;P1& Gi2=}G,nq}|+ٸe90\ k `iNJA<+OP,8SѼ5X"]:.,"P3yCX1/ ʾ7_{M[7yzvR"Ha3)ܘKh+KN)ݞ;ٻv˾###LLL`Y~k?z 0qPAj8ZY!<֨sOZ4v-_?Ec?n}rfB7 I5pBՃvbD'⹯~f\yjhƭ9} ?u "W=gdD2VCM)sn1_y߰RN"C״E]^(A2Z3QJvE4u=nݸ͙ӟg5G:j2+.躆a˅a?D;|tCGjk>1D`ΝdH3 IDATYn޼իW;[w^_d xv?$ô bqb.-l6B6c:vnf߁*m6Gq-z뭎R0<54f,$ۏ54CG30KpEn!92̇h2#=k5C'9Y{VyĹ>8wԿvm&6;6KLGp`*Zg]=246󭛟L[8woԮ>  Lvv $\.vӁTHbq8x8:γ?2uplt^7 Q7:[(E(_r\ۥ H!sOq||cY;oϲu&}= tC'i1b.إG\EX 4I:\xD<Ǹr gNaYSֳqnx3!t\T ;'{gsuG0<9S 9A3g<Цv5m$8?hܭn_ "Z|nlg)jڶ u+"ǀ@?| CgcyV< ł]60!fk(E?]ǫUOd43*i JIM(<]5tdWU b`ۮ-?e'gηwrP(9i>wnؽQtCdR`alLy>N%u-[712:[ױV<Ύ'rgY}3 vGinLx %̘,IJʒf<΁N u fPJacSF۲G"ϟEMO?2/4W{!ݐ~۫%s\ .G`!`;q5k'J2,]+۷R;7W_ #D ] a,( >W-6 Id,faDD+R˪m6Jwʗz;JXy'lٶ=ʞ; RT>Ix~+8n+R8R$S1c&FLg݆i~d[ԅLO1>;yvmð,| <$9}^oS.in|d'Sf{Ⱦ!$9} f'bK9 f m%-{ˋLZ1 0( ,,d1 v'c8QVkqM~ُ. OcVRDE 53H8l 8eӃ-Τٵo;wCJɺ]1=a~%?v_! NJ<}z)sGW"JFiǀz?fn^5]Unq;28IԜ_=WZJIl`vϾ4?yP  [iܙA%׮]_X"uX&oiyB@[3R !e(QV7\ufp= DI(W.]bvW.]8vqf74Xa.k;"hiS7ua`?yվV3Μǟ:319VRPMRAӲ}5|q2kAMՏr͆mv;u!Q@< IRҟU,@7 hlqJDqn47·j +`]c2"z>ctlȱJRUOj[7n3<:ġ,Wbvp29Ov1G(4ML'Y;3pB. 4M#I2K9s>Posx]dҠdsqQ4kf #3&0E&^isWRjfKw e;T `#~n6et;7oV6UvBͶ4sL+jQk9,u t}wmtI`%7?wRQ/7l^ƽ' $}$Ν4:9掾W}P:7NCl6%ntن~``@ L}< p4džX[zlnO~?%P|ݹy-.<ϧX(r t鉊7v\ܶXU.-@FFu=yM{zNNdeҌ>kWn{(kMiVr9_#kװfP(IEw;">YsپJbs,5jLU.F=^?!}#CNԹ.#ߦבvҿ#Ho7h71pWOks[g""^?L6=@_a,O?q ?W[E(P(K)ݽO^| B>[3_~ k+d<|t ORJ7rAPBmd"±D$%DGsw*}L}+Xm;dmeۿ~sg//}}ČIOL!ITUY,1&B߼ͽ[s8Fε 3~ɳa_Ώ~.woa3]mQ~N_Hs7voڵ_Ѯ+=ۨSe4C^p}[85m{|ٺ4G,nwNo\PZ4>|\0zmD2Q!ׯ7v^4#>ȁ_V !%q'iz13;[cU7|; Y*U&P#ChDAv1ُsq7ؾk #cKr$J)tC[v1PO߯䩖dܳ/ M t* 5Bd$<{.NHI]hL]ÑR!]/2FPq.u%NƊƩmՅg'rӡ@m5~_}Ha'ʗNHf5y&QvNj'vȵ(e9~b9auZ7 WU i24>Y󂁄c[ٷ kRTϾ8.LϢ4 CC)ryS(,E"`YR>{V>/]UitqòតcJ*E)$4;voN2Mq.6k4º[9dǓRr @6C #Ie~@3tοs.EF;N M6z Qt-2_ܵV"F7>=_(d7?sT-~kjWoO55FzE+;QH6K}^NMa [x?À'N{u*PW)ݩA)4T*YIW7w^{+z81>1ڙ)]t)wndEXLC'$e{>6u_2 JA`L;6{v|TJd|rCcڗx׿Fzt$̳zx 4fl|!%nBV ._C5H-e%kRXxM~agBjckUJ.1~es!͢-ǩoۄ8GmkFm6{ c#uKIo=mzmScyU3^#S A{؅|>0 tXb[F@y\tQT 0 2+kop•ffp}.Ҹ.U3Dy:/ܪJhJ9 SC/:ض=pP;fc'pڭeIJy57x% d"W4.43vpŠYg'X=?֯EHضC!_I iizv8iɎEAJ0O$JX #sqOٰy5mxe|Mbiuv(؝t(4ϱ.a gX\R,U]lLÿ9FNp5@!L5""V&zz* BNcrvbyvIhsLή%5<ż?ן#J~Ǩsm>gvy72&zG׾yo'RA6ĭ tma3B.$Hi><dc8c3) s=ݳ0t CG׵i:{}>a:4)+^B,-B0S%o~*B!KD2F*P; _,,,R,جdzv dѽ|g|~Iy~s Xq(E5AmIGmՙ1jW҈ 2z,kS/@}Zz%沱ז>܆[ -e9ѹk7]Xַ,o =@Xa-c|b$E^hDkWnpվ~ 3k0z=\mDMR\6ϵ7X\r+y (Lxn\E.2ucyصwNH&adtaJ4]C5y;_XW.]%w`7gN68N<ӿ n݄R^U [ 2Y LA49HJ#CHlxp5-7y.s=6쮭td'?L̮ūWJь8G#W8wD[FMXϩs>UT)}DԠ]"]HGoRu=@H&;qGU(*ZTk aՓ9RNޑɤٸe=*3(+N_(8'5Z8x2nfbj ˲P(&׌s~vN"G)2BRacY1.]֝8xd?/^% OMo}Ǟ?Ln_edB讋Hm4Oqvn!520:ZmG)*Ya[< @>a6Ӑ@/s+LmlDQVĹHs;E3Bȏ!UMǯ&ߪ5nq.H 6jsh${Y^O^W h/ mAj=wp}3JAJUowBr)I}^΍7s@f(PF)<_uJ)^[Pܛ_l[(x i|z2W/]{FQj[n_M}F׎!0 O}_}st}~0 1=w.5B2$p]/Dw;peeI.:s%\tOd!ar.ڥ KJhJdF)E̲ z:ײq,g?:s GRCxR,x}HFhv>:uj$4RJ&+ˑ-0_t+MP~H pgy6 _%9&ܨ֑Nssy?q tM(%s6!FaEtlj{SNJݛwp랆/Y8hT:cٺsse ~8nHM)=.>!3Š~ORND+,i2\ݾ?9'͟K.A"NJ[R)%|B4='9HR<ñ#4e^jxmnݘ}' \g)sHFAU.PqO w")R`:d Q(ҙ4["pӫYWʳaaS*LQ0q2㣍 q{+mo#I>;<7*oT2M~a7\;TMd"Ɏ,X#(kek؈WSq8K7ӄFYnf%-ouw6bwK?/n}F_ߋB6pĀ@?|b$xe[O`/kHUeܻ@-C#ChR#P)(Lgj c\|'?<! D2ciZEA53SLn\έصoW,+%]Fjd3k+o$=73Y_ha^D|ܼxMje4 9jk؈|Wƨn׀pEjJ|ضldl#:2hAKv}WJ7Rz{m|6,۩ދ^S1Éz,*[(|ϧX;* )J+Kr P7B`PX3b{P,/Q}wnwcRCKhrņtvQ6]îDl.pl iEP`ƭ熕(VŒYh E4"+jt^7OrgX֥|Ifm. y^{9q \Ou}kl#V/@S;|wbn_qJ7KaL'-P} x|z::-'blb{J'c8ݠj*-mnߺG$2ˆl/UP*ҿ'/wC^0LT:Q92TO%Y{;flf t4*x~B ͝+ע I~a1:o5JnXA4Z\ ĊǗu7aƚuC+6sd9Xw9Y5V-Ȩxv~A[(Dd_6mJ6jf QPpNanajD<zaFKv. ,G ϗ.\ 1<2Dz;˕אB:E"CJY*&ٸgЌ0Ç.D@1 Ȃ!$NH!4@jpwgkذ{{B6ǟ^}3fuE/iJ`% ZFxqnD@6'tču}ѶJqRzu ߐW վʶёc]OY31ÃzH 33;a좋M'n g˂ߙKY6#S!P ҭ)sB~oڼ7rw>x7pl~oE4LJXc3e.K']$q._&(e …4Xx$Zx?`eO D f*+ sf+nsy^Ez|4Z ҍe{;O Tr~?^_XW 3[6T;%7[]1NX[DƦcDkr^};юhcm 5amYYnh_!aV^L\cy(]ukPm&g;͝#R>|15=DovpvV$} pitCgfvMX4V1haȽnhRorrnR(,e )ʛkgOI h[aj4)W2,4 M+W,!(<.hjYR%j]_,E*K2"}p6ܹ@4-1_9_ϴ{'N]lْ,[lp!ئP~ %T) l0\p-KdYU^m1S>ە,st3;7?w;Lg`sm*]p6c>E3?} 7|c(M^F_e7v9 Ŀ3F>ZF\ކ07 AlMQ`]4Za7y&ل`ӓ9 b:VH{ Hgnn˪EXRPWuwHh( h"TmʶL֭ZB,OJe<ȏW <:\Wai22D D{d11PD"-E-K52HI+ $T$9De(ZWxbYPI$n) SDn-BVUEjw n;AJĦBu:P)qވ\w;YzfBĒ3DmDt/Gd9|; U`w{'QH w+YLf#`ϧfAڛ4> c@OU>бBe\ZKloGhɓdT*cx6 s식aLӍ2YYNd]5++;48 TF:tG5@Ѕld& *~+q?9~!LP%l qBC+g[="\%IB22I!ɲ$b?'vyu1d{"/c U dzn3q fY:>:opUӐf) [, IRKj2LWT>ŬPU"S肖N!DOV V%Is3S Y Z.W\s^>cvtN!CyQ6\XspNqEfL3 /:vEQBc: J29ǭӢ}p߻k.,9(x𾃾9"ʴ4W G,(8y`6DQL 32 `tdczL1j-ӄQ5:r᳍d,, ע(~̶f,6o6r@)AQ**cdr*W$׷9BK&Es RJǟ8sS`0Sԟc$IpTM}é쥅gzhQe 83?!ڽ[zF}?5]yݫL༹:Dն"9ې98Vp) ~Q kV6RR!o!UYu~̾fڽ/t}V$)>OaX>廲X|1{E[&/{Y-<cFF01QRϞMY Yhl1 TdE8W,; ÖQY`juyJ] В d ]{e&@rY( ͸3tʁTR z UӐe_bS̫x&ZEq S c;xi p]7g3=7E{]G5' t_y"nb*hV{ԼDqozϲq?S\=E(R:RSWW*FQ б|=o&,fc⋣Q1Q4QG'L6 @% ;:W?F]{񺏽O> ,LAVUza (&厧Hs y}ksA_ljBB( %]==dhD=[iYǐUM/Dq}u< z9Y ~@Manj0̛ ̀snC̙!@]4ר _q%{C&Z"罗d;&:x wP!y1>˝3z)XdY(t,f9գ7&!PKbVFwz*e4̎bAQ(JsQT2FU+P\ ab̢iB`VliE71PA4 n{ HwH%]p~BG2R,U#87:JRCQ  B)_w4ݳs@e9O'~ j6㇟*.^ZxMx`7x8GmA3y|~ Í~xj>w^D& mҼb;aq$J1>:=[wrK S[1@r(2eZvј^+%7-(t teYYPhM~N^(ނk?ntϘ DdȚKALR Mq|_fL ManhI1211:U6 Q.Dwj}x>W,}˯}a3<+;F+Q vbksfPTsS}yqH8oph h?8n\nBu)fb*K8ǽk, n6t1lڗPII~E4.zOOJ y%WPcʺ}US 5TIdT"q4CGBe$D"v#sbg,l '|#z<׶WKerx?D:w|x7ߟ"ƆmzAxouFs] 2#<AIN Bld*n?x}7PmNT_&-;w\s$bbb~O}5uǁ^45ҙ, Äi5uٙ(Gq1є]R,iգ2c%KN"~埿'RSzƓZ|P#92*V0 F 4`ɒ"Q76,wiԲc ϼ>X<>׿Y E2_݉'uT㤋Y8 &8^k,$eM,I0- #OaZ4,;k9:b)_H ]Mj8ǽ-ڷ]goō^jeE < m8XSW1@hBO74籗e1Q3\%u1>6ޱQfOCUĶ8vkWuL,߇R#ahMY}8uW |0 2%o*9bBX@Ѕ@0I02V,S~*V]q)R r!Y O1}L\f15xns}9'1xBu|_-vYqΥqϝ.ķBy<`,/ჳ$PT7o7?e<^gxק?L. Z·>|m_HoĊ]8b 4L{QS-;"C7080JDĉV5R}¸C:3Z5m6a\Y}0f "[>bd&|'TH$*xgcv ٣/| Cw=,JG?9!ROqx>Q"CM7sy٧]z׍9o/ ߻c7g+Vl%K$vT di<+MD\'hS5YQl ZF;Y@팾騖 -pc%A+@4RlK>,AKRfY eg &$P}GCϫ(lvVp<{&p5c]ȾI"8KaZ&,8q=5t,v:iٱ1ˎN^M RI| IDAT@lYG'|\ c#l?Eo.^I(E*E*|ďiǷ{F/ԄEw: D69Ay*Tq wŝ?;]|;ߎr- zWm1{~|Zq~-p7DX'.g0_g Ml1N>mZ޿`KG`; PdD"سcz ۱ѧ|U>Y3!?"wManYcr]9di'4Zp2D؋@T;n0 'Qg-ЖĘYQݝǼswTJd{Eq]BR,,@bxeYHR}ʉX:Om'Q$NN=-❦,ӄ$xϿ}TkAM_lxI]c+h'aMx y:Z$ܷfOX-~g/}*s1-tx0iBUARqFlXϬ^v].UxקߏY Z usE\m?%WcM- "cμw{(!p>rs.dZB-Ħطx},h%R 5g-̓<>UKf3H2p*"E(Eq?0gsءa;f}nϓCkT=[jMLD}3Ɲ?%ne'[n~xkqi'Y y!x̭Ϟ'iu 8נ9U9:-y:0;QP&k?%$ as_݅Ou7 ^+0@TOG}rU:u|3D43bC=vx1cMTɭǷrwMQJIbM /T*Z"jMjjEhV7˲ Y53!0B$*wzU8!0u\l|&J$i-Ͻ]8?/wڈYBxZ7aR׿79~9<0 x߈+泶_'}g~#GYeE*2U'"zjUBJ6D)$I(Ʊ;@f~x뮀$K0j6ČeA.ʮ#^-g֭[u" /$bZh.νx%9iXGCȪ E!FG 8x33~2N;s)$IFU0{c Rh ,addlب8_x{/2y~A 2y$2i9VӒ[ZZE 0wbg ,!h"5 Эy#y2} fSƱ@Ax@*yd:nXǾ1sm <gObG$ُwo^b ssgWnlF],LJ x)x'Ʊ摧uHgӘhUv#4ͅRI2TUD)%"~ï~?#OE0=3.R7go,$p^I1|憏 b l޼YXkj)@OqQbi]w RBoJ/LU;"4UbVCi()y k9T&󈔧 />agm_Xb(3[{lѫe8cmI#ϲ\7ZAԠ5E\o U\+/G-®Nbxw7| .{U.vC X} m>x$Iau${D s"PJWnOJfc_ط{~Faa>Ou7saءAsԉQ{iC8 <۞ۊmbmؿko'^kyfZF =voG<~њ!>F8\. ])TUEODҎlY6d :%fVTL#}' N/Jaբ1`ۑ8l7L:bo/<=T7}C>uAVd PX3T PHvbbhlPƯՑ uPAxnM30tS*%H׽z$Si|/ [{q7/w?.8 [! {_ |( QB ʥ26v<ĥ=,П3KeiBVd|b׶~ѳ1?< \rN8 ]bD`|d Ė cǖص}?#4}MKSʋ񆷿Z*ISv: {nH8Me vůf\Eŋe˖kj()t:bo7d, 8 A^ ertl0^(BӲȊjh EN O~Yed ]P45I´2]2iL#ܸ#Hs<) %. ytfZ@ozyǫ}vW\Zsg=wqc3Vu(3:BplظfnCw=ѡ_]VV@~]H"+2>OcpӷCzl0'`މj* ʥ?/P:!8x߼\v.R4D[ 1DAUMög`.?WLc?))l.Bˉl4,*p r0 h:iY j#Q8RsS|i;) Q4&,;I|ve'4ʱyYsjCVaT~~AP Ѥ7h &K/\zե򧾄' j |x5|xuSQqFo7_޾iuJ"޻x=&w }s>߿'zz M eA7c!ڲ,cb˫iPL}Y0Y8%J%J=.$R ; N眉'cUBD ϓ5*[4LqY5B=p9ض&ۀ税W%4º}1'J? ҧl 7c˺gs7tX OEWOgaəKŢe]p18.eO]Z"v4FG@uJl\z_cYaY ?s`-,)iESq`~#~.fxYykj*),US1gL=%JڙL˲X.!<1!MR*TuiB$ddJl:nbT`:1 tafd C o |'yyuP( ͌+$+-μh^ؼȿ#:2g\r+柴b)7RM$Q,F JJ6lƺbckgkNߵTQ,Ye+M30FҢL!1;/_K_gXzNh{;OR1@OaIf ,٫!Q PTUEYaB;|R͢du84i'& LÄPU5&K^߀^LA:L>m(`|x%A(!*xbt~׍{j^/} (-ӂaU;sq5#w=<ن׏}<3d:´zi96.^i$I'Ξ{rӞKG|Cn߼Փ<,l|tX1@OQɲ fP,,{8'Q kF;a)VTN! QѱQ+7WpYP+cRIrP&#b]9qťxu"Ja||=CXwu3{ƘFsxn$@gȃ`#[1S7`z׽+0 ^ظXo®v-&J(Mp(";^Hv݇z-^y嘳pD͂sZ~[YʸUKБAھ{^܍@fBNs%4$ $R0P< AE%qayX1@OQ% O#UXL<*~DqSRJidIB8HkfӐeɎ,kͶW M [`& +Nxƻ3@:/0UCT /PݺnAQ:p* 5\7x:Ao}}00À$Q̘3W\ݱ ϯۄMk6b u/۝+/9yXb)TM\ׂ(pTDH4̴UPJۃ8vPO1Ek zu.F7oŋ[ൡ;w8*bRU|DHj 4*w$iھ5KDgO`fj0L$Ht72c jBC7isg+.fR޹C ??Z hY;Oh]_ϟVYLf4l8e8e2\*ƆGo^پ۞ۂl γBRUSݸN@'SE,\| V'd*C7W(7 =#Ʀj4d9Jxz0Q8d]&|?A:6n/0xxtwwǑ7bE*)\>!0 SCqM k)@u$Sl$I,AP 5d  qmeOsc Ig}?B)&Fưc&0\:d㕷 uhʼ"۷? {c6T*Pދeg411:C{`T*eUăx(j⒘$IH$wPVD'iV\pO+<ٛϟ&;\[E.:݊1۟/HbͱPOt&$ vʮ "ĊUS STi `v<.)Ҧ6Rmѣi2Hh#A* ؋puQ3XpRL;4'̋lyقytc2_#:XdĻ- 8#m2 );ݒEb 9 fp, FUh7-3g߄u'YΫ$Z!ō@_\0̯9bꧾq^B+G޽vfB?uX@8F~) IPփt:Ց ޵N$m|A45aBxLZ*d> kAM&fݛXG_igt|cTlO(@c͟{Qۉv=jF ͅ*<o0trESZZRV@VawRێn2.q ˉ<9'ӻozc)CGk]13yHRucM]=$1kN b0X}'#1rґD.a0 7& ̎l]7e 3̃JP1HtW"֌Y^b煲ȹw *K:d]7q؅&iJp"o#m 94L/_ǯߋ(*L[M/+8*صkdYٳbbAe tPGWs)ʨ6|z mY_= 2P0ӕPcK ZNSO 42͏?VH3Pi'*oqYN3_^8Œ`a@m[OE5^y-y폳=3&V79n8uNj׏|n(Eil}OĮ]P(P*022&U SL$a(N78jD ja,Ae仲H$ի:UndliӴi *2MtMŴy"I   tZ:s'..TMyϒ}#Q;ur~Ms 3Ơ*fvpǺ )ߑXiXz9(,DݥЮ>t΂ӅsS5=dt]@FT'󭏑U xnQVỲr#(nk}9%Vx0Ѳ,cthW݌<-_M۝066QaXbbw0Y\g{KЄH2u_g2/(s`LkY2 FGG#Bqv?R,ZaB@% 2%-+>c?*˰jriȲqT&JطugXԪQo&m~IԸQc`3xDXϭ3oQOۇM&ycڍX{Ðc3x$ <1M8QV EŻ[𿸄ǿ9xi o>/NV-n7M0vS8ʒuw%J7qFἊ"}bsfR2@*thنҹob 6t`%"7AC2o˲P3A_.k$Ea 0AO^͞ Q1c(NB3n5wn89s S83n\ixnQ }!8m@a"C+o> H>s' cD47fΓfa::ZH:P!H{po }:bR"AUUvgJ̗(W>u#f>F`0"OUnd'P3{(Pi֐*VeTyB008-b#! d^k[: 7jB0k-,h4o斋n ?R-28s9  x2}K0nȻedwr'>ϠZu*4MFX()"Y0o2-Xuo,E;$ȡAT+!TlHʥEЉt lRYQA(* Uc~>jj L7'{& 6mbt t R04;ZNY#g[ù m s#Go"u87@ڗpysN Qv_4]m%>4m&[K,;PTء뢢-ŊS|LeivCVd;acބrh -Ē 1;Dq1eHfSu39ʊ*SXj LtթUGT3qy+XЍjk(mYQ87{vȏBc&<,gNm<KyQ=B#`/ϊ-פ->/Hh_bGx#L&!In3M% ntu/k`ŁT:\>vc8lC$ȑE:}òP3ϒH3H*dag$4G?3N+kN-D; j$)3rx>:ic9lw,k-nF+Fcx4P[4Xv9ۂ ᙷ=8Esz~>#| ?psl$paj駟{+BGwLB,mKD݅<(mY ! J* -dYAU 05׎,Ȋ Ќ1PIH21jV'`hIK%Mž:pA7ym'UhI3.gATQ6#Ljz33N}g\x,Rp"9ȼO[L!-6T->|xh*=/|q|C>ǡCBbŚbe] UQL(&&J34̭eb zU>gwN?dMsMr"YP5 HɨtEgQB4"xalp#cxa3O}@QPY?āj; f-=3OZk6,`aݰLwߌQݦML5ȸ{sO'·Y-ruph,%;L4P `_"-T!Pnа nhusXjW?hMf` 8.Ć  \7'R |oGKKbFqRXZU=$2RkY%/.ENh=*Qtut 8FF촬Dp0$SIT%Y tE۟417+!1MHz帇gYU`𥷼M-W{ߊC/AixCa *N4 *JF&i L |K/<T|uwkj-ZpX8~~nC/B8 #$}4{:aFC W^of٭uB垻P(8OT_@7___y=M#Hhx7̟#MӐH$0<.VVP&B&i0L&6/˽;|#u?kT2J*~2ΝU!@I&̄Z1(JM&0zd7ǿC;w_;a>,˄eX(O`mseY0tz R= h5B*~m(7 u|VNA*#pxa݋M? ES=0-| l~b=sƌSjE޶.\r6ZAp}PW=w~v +2?|>Sf͚:b؅c ("UQuxpߨvݰ_[(@+}‹mղ,'*DkbB2B\ S2Ơ$4͠U1J2 5Di I@PۿAd{6o@c_A*Qd (ΙY R0,BϬXr*YI JJc`Li&)hꤎyMbKL@qV,?[it]Ǯ^m;`X"Z69 dP1d9sY ZKx;vhP"IN:v1iaVU-DX@߂9سu}`W]jmߍ̍va+r]D3wN@x Zӈ]9p{ YI O=7}g3b < Ŋժb2 {u17dT,m.$<80̠ (WƐH%![B%EdzJIB+ESW*_^\kUHf2``0u1T&Jn1n0UM' !$=cS;{leYQk6>? 'u:t7Hxπ>‚SOƓ4v;J[+Fosa(3W4797xεx&htLQ?8:^LPOgRᙧ6pJZlvbQ|NŊ5I'.J)r,ЖBs<4Lm)%(NAwO~ ÀZՈ-L&a&e~fY+؏cdj:m[R-r b`R| |N_*Qʋڏ NZjFhG:5lܣuWdHI m]>7AM%>ꘆ, w{1hak,]Z}YyGga Crσ0Y@mǙ']3x7T!|w>_pO\,;~)2`1uvUU%aR;A`/$Ihg0gV1nyЍc0A|Tْt2_K-+Y !wd߉YNW $+KcYsJϧ<߲!UTs1ӆUj+8DpsAbT!#(r7ƌپ}i("'Go`MgTs$j:= fXcK&8E= W16Lz-X8zlAUTlғEa4"]@Xĩc&_\O?%zJC@xB.wڜ[xYNRJU!VXqq£z_!P5 ES2OK9ʾ-;J=߾ 3cyKs4K,6yey-,x ['X3Xiɬ% >o;TXbaBQae[<QWi}T|j9}~Rn{8c((>U<_qr%ㆆ95 Y\ ?ܠ}Q}+*44O 2AzqX/ 4UU"-[Stz,jDMP,_I5ʡ]{Kʛ:ڸV4رԷ4{eBĪi(¶5xλ~hÌR5PY7o}Qó{`D~AvSµ_u pMIL*] <4 Zx.; 9lsGs#:Hxh{~Ɇas9U Bĕ7~\7_UOb;ibF FD4\%g;N@z+}ٹHg;H)7cbx%PtűN@'Bue8V5ҋLC[ iL!~s_џ܉n)%D?փ #fwp6^W ]Ig4t.apƬ% JwoΏmmߙ貃U3~|jJ {]x_~xa[v\}܋2sG~*`#.,ͯo!H'x';X,Β%ٹc -E IDATu*ꃴńgcM#K5J&SX/k>=Y\dzB761nbg%۶y-$e[Vމ|̤ XU -@x!zIU\Se 5>}qI px&gf \Dt ;c7rwȱc-o}>UoK!y>EsgGh@~m>Xޕm}.f[]#jOqgsJA4~Q\ +W:s0׍;*FP=|^JD<Σ]/ZLࡻ8j_^zx"躆?j s]SMCUz}L+g-GcS}.[5$Ei9Φ[s*+c3{t:ZAr U:h΄30S;qK2I\EŊ!%Dw?ض\7 V0gFPuRLZ cXFQ4Cg玲s̡{r\}g:Ub] 1m;ihcȬŬ5.j`} sxOlyq}I?7m/_L>QQEr"r|#!`|&RT= P9J^P4fX]<{п #j\{ݕ۷[^ EA"#[|]zHUT5pTIpx0zR=r];JED@IYL:x0^joΠeJdHT^3l~3y J-ٶyO&HH4.;xN;I@Â(IX==/}]lVoI' r]EUy|.<'G;ӳF_%80T92l]Y@Yx.xV_XO|}Us,뮤E$qL@7tYu=#8jF5r̅|o$D "ESs#M Ӷ/ăko6|t(*±SI'9⇪N&ywG6>w ƆHR: -^anϝ7UnZRgUe;򏫈ӶmZc/cN&цv̴Nqkj_$3F?_YCHRŸy0c}A(P,9ԍ( +d@bq37c뮊^zE톫931M40 C׼l.ô-ϵ85 V5QF=Flq\lQ8ʘ)W}@K۸.6=û*[׼2̘yV B# 4-؎>v .^ٳeGI{dR~D,_),\A_7¶G&z =E- )EH_E/ϡpԦ~VDM6 o.;x"߾m-ʅVdo$X ͵5UP= IgHIy8U%Jr?-p*V_o~=M8vﳐ$0R7Mv2[>p߼)gdasrxC8?~n~/{VxUYOI<|F87{_wݏkC탱?W;n FtPEe2S*C^Ta[OP].رuϳ//TU\>6bfasمAK4Dbz(xDqJ³LٶK:M͍ftjU_WO^EE55RفTDH 8/YSlx%Wd9B-$z,F>1ϋnٻ_-v{%EFVz/=R%eRi73Њ.Z~p?ҕjs7ft2ES{ O5i|h/|x#f5U>vEuJ*DZGsԢxJ~|5=ɖ~'~8s}ilfu6 ]6L#ƑOQ ٰv>%ӮAtMp1Z<α8t%Vf$pxR`bMrX S7׉8#[QU͜Fᔻod=i[l3 ϏVQoq΁7&̞e{Hg!M|C5$(r_7}KUװ,U =w&}G/D.Z pH @5pR J,e6JM˘6査m/mҐb'L?  D@wpۋ[nQ~|*S?OpY\VɆ Q80=( CxΏ̓G5w-,}|(N% e .ȞN{McTQx{腃xqTZ cHBCOn:w34`gO@?W)%fLeH$G^tӸs+Uc.P !pSb}.߶,ں:p׬R> n{dM.ath t+ó[xe3 -{O΋L@꠺rC" ZU _ .\%p`V0g6|(ReDK)KRs娩|G4݋58[ī&麸H<R_ƍq`a>ޱQKb6Tif,Џ =YƁm;"M_zMcˆ㦗|ˆx'?,嚏}ҥOWK0~Tolj˯= 7Rj)5dڂ[荗:/g $¢o_W:9N}߆ 솨3{%`+/v!٦s ip~eiwi+. 9- .˦u-uaA zIhMlj.ЬsM(w~Et9&u uC^Hh ?@r ]l;yRz0SIRF/6k'Q'tUFBU 2b1,sm(!pCG?~D&fɕer%Jg7c >~l?&`ćvX ڟSxby>Ƽe C۶~;~?Q5[κ;x(!9yIme:ŭ"4TSI^(Ai_e 656}-By⠕9ù5MC7. 4xGK?86M S1XuaXҾ.VXl@~s<5 +H=UaY۸3_Dپ_UL21@\ 5.̺sH?nM5У@B(L>ISƣjÑX FEnϩʾ=رmOj--Ɖ}gnMDJm9M]s a"ESQ+D:mj:^}kUS9~D,l_R)]9%MiiB3&~o覎6/0~Ԋ##V*;c9e"+kQ߻y;(`ܴaVĨy}iˮ`lYC]ۦ%c9l_dmlX1468Π<*Aq9צ(e=g\ ^+Da\w%3eJ42Vo~V*{IpVhܒ Q]Ep.rITgdfeflRڅj=$` L9MӰ26`M)R0uTM4 ,fۦ 'O}}Ç䬝VƢ>̹u ¸PӼ@Up+A + j**УBNs֮-.An!x'IS&0isYf8(1^aKJ`64^ -FS JfM1&kϋhF.1kGG#|盹-o$]P?'3f`7^ow:'M([wߢQoaax> zo5TQ  ]5l6650yDAخG{spa@{UwR1̺B((V\*BpA@mhoe̤nϱӏ1T@ i[v=7&3X "%t.>~=p/ @QŊs VnVh5J`[+PR/}4P5aQ Co_Oc;u2}H45꯲oaXe:6Rռ:A^%ef {RJ4]iQH4`,2lEo}#ˮJS\% N/mbnds/,pjƭL7IsgFJ!" ]p\Gbn6^ˉ}%ٿs/>KGb͌4rR0(A6bC 7xnG=  +Va9,x,ʆㇿO}}y7soW.cҹu8`C0e! . ́lrwj0=UQD] \G:nb&)TM4 R4[7 lT`::Pt #Q I @uL;N?wXUU<̃Sz7^Aۄ TD4[Cض{CR˰-,fu:oBu=w)'c1y,t煇Dn9g WO,/NFUŠ ^q,[u!F`kKssvV?,-L;Mp@ !t@:?N7naЃjU놎;nW8{SUUYb!ݼŹ8Fȍ_S(<n]) u} tv_Fӫ@%{L:v`Y68FU"^Zoqxez..֢EزeKhYr }l=e|*BXұQG7q#j*={_dQV:ͦ^D"(ڰC2elƎ-hm,ci J"РK!4?A39td뺍.}zygHRL3Ɯ/t!گg旿Ͽ'cEq]w,Y<!\o 88%p"9a{%(XnzУD9S':mg@Rnt%۷bvwws~zο"F3c#ƍ$Igx֟rx:+,jUIr:S/>H kpuz.ϝ6Oc[hhn*[P @GAY9-g8-җ+f- ,2^lZ:'%‰U QPr(//}Vy񣒄͘ɳO?t*/"TB#M1UH P" 9ٲ`|=-.MJ]lt˻r4:UQ"۶ijn`i%plוضsFܙjyb3N0]Je5,Tㅧ IDATE0w$KJtq 34klK< 4K. L#%hx~N3a RZasHpFJf.=6ok@jfs6:NP>ats%I)q1XN-r-ػ}7zle+xqce/b3_XEcʪ-A]zUsJex5yYr/pݏEsoՃl\[AZKA:E(ζtQغAxB9jʪУH1muxWՎm%,Z4Mزq{dF,.Uc[+::;PNZ4UTIdY$Ҷl cC+^O=r}sg; /4=Mh69iΎK\FuדhjAUs2M6ctp;t6 ٷuctQQ4j!t$ 8/6/L?s/&86'*Ϥ޶z?8}8u"-(W%@`,X/B/(T%d[qr]xEAvb9LzL&|;nMD˼V.fL8>tdƬvM8 +xѥ-JQM8M]C=s/勩# qgt9xx"Nk{+8^9 1sl.*݃ٹe(hwaôt2|Z;ZϲJql+c1?x̪_0Lwms/ro׿-v` ,+ʼnX~Fti uuqL@QLCϒ8.W"xs(򠜍~}UEU]`ѰU]װ,ۃ{j+(GDR%ϡOk:3UQ$ud,?\Q<%%ضmY(wۯdzs{,EQ8S3sKESSjI)1uԵr!;9ЋzxC('t3˥ I~[Pg-_¤s*&VUi}l?CCཟ$cN}_9CGBBj OmoYr5Wm|,|j<$]t*,ǜs=]{Y_xX욒,G}*c'cKx̅]t\H|<,Jb&G{图~|T{ tuʆM驵zzan7ZTlS'xlqۃH ;/W>H{V<<{N?TrEr hf{w5%4AZuQC%aj5(82PDVXK&ihck?1g}}љ "06L\Ջl% #.ʟb8@OcccLKib%VI=Ԉ+DHL߬.O.I{- Ƕ9+hw>Yl..ooC$Xz\1~,V&KPA9Jt!3fsx[_˫{׿a:aMZ[0S&1d2)O`=H@DY9C"bٽ=oWW<$r/yݻCfi߿&Tl\8+$6 t~gBQu^Z[+}ﻖ>՟aCy7jK[w.p!+W.4S'qó"B<7sdz .0U|+geT;m۞u 8bqP G2i> rWx>+Ac`&woa{=ˆuNJb1d?v*mY9N"3>UoXo~~՛;;8Ys"H pdoxr'5}rԓ:4jf*"oz%\X,NƲ1M-uen,- ;QZ!T% uFt)͞w%zУLOF֍̑t%ebȺfN'ߵ@@:m61bu“HUdSIt4mH='‰#1t /Yiq(I̬( }GD8ouM^UO"Ʀ:B&3Rvl?~f{\yo;wMoz-xg;Ns}8< ę&z@;gMCl49¯k;9W,DytnI7tfϛNO}&~d2 _Faoᠮc £L3U'@!BAO'Q4B( h@EHOK}CMXK3yB.J#G7OTÃ{♒2EUYrּU-ƪPIj$PLv׶1qιbqp(:~l\'~}/wEL>;Ʈ[4_48]E8@ DhȵEKl~KR?j:JjS:"R d%!`q:0M]?|90J=ODr ʼn~ula38=j# q:XuylD>۷c˖]LHd4cEh(-!tCOdϧ\̂j=^=k'QUxd=|[ܧ ULf` Z-ı؊P|.eP fP5Ws9ˠPrş- wB4M'_xŲl,ͪf,ϵ guδsY . ۞WңM5eRi3'3e$oe BxVhU3Yi*DGٺyRR_DŽ3BcKUCq]t ĨK#tɀk۳g`㺻P5hYN4C'^_\Xj}m/Z'̞9oM oiVQFl?=-* +³Z(»%-%x?ZkXBsh^z;J6M\Ɂؾ~#7mcʜ4w."4<h˲V8^XeaCU .B˲UYMd˲]!0 ]ؿ 7]~Άsɥ̡̒.0z.}رG|;(Ywiקd,+!hćZ}nO[wsOz{q6dm)P)P\̅Gn>*~dl`|4l$UU8yȂqj felڬɴx_|?ře +ٲq;(ruW9ybDύCˤQ2Z pazxwbMq U!)ȱ!aSR>v^ EU?VU[ׅ2OZWS;e *gWҋC麤N =I䙻7߽;;2o&+UoΉ $'Ċ]iC> m-mHYUGaúM<-鍺hu^|z.^خS$d&YE}ٖ@E!@ !b[(n WpH3 'j_8q7ołӱl;n~EM cE)r>#B6#jk,=TQ(q9}}44-tFV'JhJGg;Dzm'2fD]Jk@O'q2}'cq 0vl;F,F'&$cM!mAPG[Tꌌ)~*t2\EJf0>MlTmdۺ_ҋ`6K.^F.p; %m@d壕_ vU. 咲xFď*Fr Ŷx{; 5ᚋhhIAJCe0 G6o !t QhIpU_ 3͟pׯ+9k=vgmgA6{̕sff/w)zЁ#{~BWzB3/]Nm3Y n^ 8XfL,.ؖn#ȋC'|5|NR:FI&I-qI냁hBg%+'ToJ( "p 33?<؞6`a>m!@J$C[[Ľ}*ݪ}JksuuYz{"ǽ6%NҞl"`Պ(ÈK-?rA&,u|v_Կv^7pװjj2lkAjч=xG7@ly얾 )BFZJ}w?F~&ǧV-į l:c%z^ܪ$'ĐīLWNT)F:h&3Y:_s)`)"DdH'@jGU@V 2k^7oA#zղ $Ww7%<7zj'ϧ 4EqĞ]yg.%-"N]'ʧǶXvˆh!%<_gWh,L׫A}2u& mIa:1tRAȯF>9J<^&͐e;kiz+Wg_ Ukl4~~z-_s-5E/gO_q1^z|g]x.6% B04wv_xK!h6ׯ\%]P/LgԘF5oIx-B! D,Ȑa, ]ק-FJٜQCfVK/;5kWg)bVJ5Y\*΢n%sӎ!Zl4󇩏| }}"B=\+ưpDaDض0X˞gw17#-D$(!Le^d2'Ҡ5d yJg:w\C9*r:rA5Z+Eat`++U3sǤo那n |A0D /y1[.<n?p`n{c+)uoz|ۿmnAngR1Q|~G#"K8OaI)#^xGR֛o޻+~3]4h-vyk_>n.l'TqNJ$BF1ipE3Du 탮"" \.S@زff8RHD%jРTĚټm}@?geQ|n^YuV/Q[h7ytC@8rhVKr@hM0cGLs N9=2OW, [DW.H-]PkdGf jU,H)()z>A6署r|X6RAH:m \WqK/ѻg9%ӻa>.hˆ]Oo?献w^7.804Ve]kthf7[Ţַn-1ηqtӲ@m-m7~m3=5-_3ӳy<q줽я75{_Emcd@yng f8("&)h$Mc4htAMR (܄p0RA Zx%dԺ ~w>;5!OO~6=y8='Ч1ʥ23ӳ&R)4~Wƍ |ےlش5VuK֋#{ㅎSiD_*pb?0EE]OktEMj"Ԋ_AhE1S vW%ZAt=NRГh' ilY`6gw6ma\x.7qDwBԑ o?͟_ou'!k* `۶ٍʼnB,H;>;ʗ˳|Bh$\A)ϕH}OG|jAmz>a[z.\34#<|G&٘0)l0 ycD1h&1$2)H! Akm{э<77RdPG`BV$;'p?`o/Gmn]_}~]}}# #J),ƊLظ q:5`qd:Fa[X5ʙnf׎-OvxTK9*elfiRBvmro(Lթ)BChE7sDn8fxr֭a;!s+"q2 4J Ryws׾#.yyɵĒ̪kYqO>{? `#O.zui?_׼:."|'bq6Kcٸ|!gUÈ8cGO?'3R86 8=r_DZd%FZr5ݚ]m8c-"^˸sY|Ȥkx57B%YBQ$ed8 ym+hLW:qz i,n#&fUXa%C2tcz8y`CN}}CŊ0 NNe5NhM'AblXΤٲmc#:pdH-A:[-a58IB zXUf@yr7-˳A %L%6";P0:uQ2wdVħcA'ㆴ,lǡ<3]_wƯ֨Km>ۿx3f/cݶ3sy󯾇57q'|o?3=w?u704:gofƵ*iP emR uE}0-iW-)w^ht-dDbּAQ-Wjsms˺!8]>gۆݢ-S$3L]!;DLBF!;^Ar@3<>yin-Oh}QQ.UDZh-M!)z$/c F;a ֬[[sxd롼e^Z)($}R M""-dCsl숦:5IyFP-8[.'QW4@G^{eaqD+!qӳ>|-#+Ǹ#s @ ,Sůc^nTi Iڨ ڜ؏Dg20fB}QVuۆ'{Ad6}bZ3Jm!,*X9B0<2/“0ѣOrp.\|h̝(g*U'{TT5N%78@qja[gƣ<%uS_֤ ՙ"G*E֫Ҕ3ybiZn<T{N(*di)q]ZRT-7P֚!4CCLM͠qM\6i;QuX9_q1n. _ȓJ9p. *ƫT^nw3mnx BI0;!0]mt@* Kax0D9Q}_1d(t|B[,V-R[}}F'Ч=fLdæX$ @ZDr8idc֚ IG1ea;67ctlJBqr'w~D*_Pu";GڶQj 8iB65n6@R"B=0 72ĖKJv?"}K<4sQs:pADR6R-NU:  35>lg$rT.zA,v3)3yZx2v&_jDZF)e`Zd35$3ӑU\μ%qW ׭ cȜX6Bҹ }{|?(<8:'zk䲦0Xsrjo>MyidYB/   ²P} jfr$B&.RqVJGwCjy,j$k 鮷vn ;ɤF+s0P0)EƏL084bw>x{l>K&e֍WrJ.͕,_( q[G~[zC]B!e+GyY.맾> ¥%ݰr4C20m ]+FCZXbUWm afub%Up>!Hvu=$7챠nwL}3s9~bPڻA>Inh&a y>+_̇~}OpGD}N Bea>UNxI@h)T$F+ht(e}{S)U4::ԡ-t70}> I''I >SN1[DDqrqqxDi۝:Qv!jjs&rVm:4鴹mO^FPআǢhI2M6kᆟ/yvg/7}Ë^yŒ 盲]|wruaoUo˯~Cˆ :cjM]:—]7X`nf?h6nbI0i1wѶں[רfՐIߢc**RjJ)!33xU#039CXb$Q342DyD 9;Ć-)͕xH) l\~PYnX )iF_̪+?XC^u#oz8Xa B0v8 >3)w%j$dnRZ%y;_K:{az@[]nIS'ZKz|#P 6hnh}4a0Ckxg:샃cuQ,ѰB^Jt>>}'}E8W&`VhSmX (iy&YZK°WklhFP.Ss]rʡAh#ҩ>\˶i-B9rC>k͐c05EPV(MW/|k<֒hphnT!)d|!q*ine#Os&׽q7EŊ7DMJ5/; +H2=mRY%H=IhM҃Ɠvm$:3({qsF Q#DγbIlHah~o(WU"U4)"B/>9fgex0qɤZgٿ O6pd78)0hku= DLl&(VhOq^ 0 "T2Qsq"u4nEEHbYJ \P&>\D9Jɺ&C!?26L&`;Fq QW<ΝÞ&D@֚ɉifg,_txi NmQl&Nږێe9<2UJc8uPa:K!*Ej9tt]`6:֦}5m!mxDkj :u4Ja]FNKrm-ʭo~g6g?~ͤJ' nR7ǘ:4sw^y 4 LT&e :5&}jx+AR|2m7?V3zmn/7YdHTziFkIWeer UP$,og<"ܔ)J-O#xMXdcaL,40ME? $)cqǏ.Q*wmPR#lq~l(JfZQb!b6mdz~B}tIiݹ dY)ϣt#A d6m\K8;>Q]*~ +YIK^l5XC&yE'+L!LDຍkxϽ~፬ZC89r&R4<y_.yʟ./y˰lA'b#!- ur6hn*u)m_@CmI~[y1jD2&QJ1* EJ(" CԾ{~L~@F]!qdlqLWifg[.>T%am [!JEv6J ͣ.Ѵ4 )۴okAA7S7*BSWuzKiQ.8tpeڦT+PY)ȝJrou/uWFb/+ss@}T*H4.Q~j2Q@PpAD4a&BV*RoSH??muqnljAEQh3d(XNfx;FXeo׼ڹ}0;>ɧ/ [qK/?jo_m m3HKR)Ux\\!gbؤDV^7s/r0w4$=&\y,zfjMy!oo$C?zzi%:QhC- ۊVR\uښ|>CTw>jln-!Mɖm)[n`tR5B Eu2V sQ)ոO/-}4pp!=ĊURx')O\}`FA۶h|/L&B"f>F[6" RdSQÃL0!8Tr?eJ!b ;خbJ>MX=Isn=<]t'`lpycWvaYN:E*Fڶ( n*Ƕ(WoXK&F$<__RX>@Ta n*Ů}Nn#]ͤ Tn{8x/%iݑ+5Wb9ըa!y>,8i)$J/"NJl\az~ q>z۞V柪?oSdj/jk)Q__L soyH튦ޞ"p0Ol# Xk,d=85Q*+/pyLǯ !( c=c1KqLuZm<*kIs[Á'BD²( H+35Nl9^$Fى]%~Ys˱Hnu#ƫV|{Iiw /(Ȥ\꿉t%B8eN;k*{vI9l9{3zj4W F=t{,&biӳKd"Si= ԣtC&O Ǻh-TIgR{J(B"F4:- mnt (j58V;na{E,n]r;i.q7nՕd]ZIt%l!}zi{=Z}Oh S3ZۖĎMAk0r8;Tt~Ƕ-tQ[.s|{S|dsYBG6mƻY6ļmß/~seIw^=[iY-~%zTƣ۲J򞝻ۙg5vhVC{K_;;MW)FZnrq7V8|HۧeƥP-q:w ma;02vxBmԪ5Qx& (>;dC{!/S.ͤYtY6J\!?:2H^{eL>B>R,PZrܟZ%X|x#?#K/`!BJ2y+z^hR& |o~=+ s=\kE4-]+ZXI‰CGwqhAosp6I[ԟx|:DA(1Ѽ]\eYسg?6iS^WMTEhh3#xMnBE$DPl^V@w;vd n]g:%,l%l)t墋fe~$-Ws0^s{1as}^>Py޵R %q\R=ZJjȣ?~ T5jvĭlY64N6<cv5s]08=C~dd稕&?4L0$)MplIMmp5/ǂd,={wu]Jξ|ҙ aqHq4\!ǻڷ4#"Rٌi3O6a}F6h903sgJ}4, ϝwRRָ{:>?pox͚7uNnk#m f#1J5H|:Da|b1t(NH²k~/sw]Dzb%F}Vc|rarmdUa6jUI;:Z yǖz t}{P*B`6'+4!e[3f`l(y-](¯KaaG>VԽܱ-)(2qDmfV;G&[(JlR3sf9΄4b2if&fI@B!nDnzVeQa=gt|-'޽7㪷ŮЍCw-ۢ85?9&un _|;BRhyUMs|M%?/x M4|ZCZ-:sرuFQl/Po:|HJ(T h]Mn?&+@PK!1bJX,lLG~}}ayz. $nQM`ҼJ+Ӿ= G5|_RX }|Ԓlx^'vc\|Hi!R zDa!;vUkӱm9g17>'$}?0iupk ,bgZ3TGL>ՙili=7"74HeEYV,7%^eVSƯGJUW(h W06~OHc3}xU  k_-ؾa~ <4/Юt5lkaEAn ύY/?q,K yUkWrpAXăsVJRǑC|@ovR,LO17[l+ YKSw"\4P(( $MAaB.El+(PCh!XalY_@Zs khU1:,&&^ȑq3LßOqk=88;LIukϽ6I|FBMtG;'=¦-Y6fNs GQ' DJ1jB!3^l25|ҹ VJ(i ʼnr0 ;7_*c)=ͣNd L;y\& TJ\ kvH)̕a[K%s $V_B m{]ᮃ,_ˮ ]SEFEݠ;9tLZ ŲaY-|~$bpxˮ嫖s[egj{7u> @ ׿o|5|h}C:>sHS~FaEP|oZ 5-Эw C!PB&6l C^B>Z( ;vO:}#~Wp59|?7V<_}nMWQE1Q5spasPbރLM̰ll˲]0NZaJZwO ZRk@#׼^r㛎cjZ[ŵol6mߺ-c]xb'_q1q/pq11qtʥru_/jWKv:II Vn!"t'D \.+Q[3wź$jPZ z~9o WA6 pWW{e>+eR8&n၎^ļn IDAT t=1;=lٶ˱beNGQ^(di&&:CRI&X6Jvp)<]~@X&5, HfіEʞBJI-?hڇ.AWkHe4#*Qx>X-[c\֟ZLy$QDZ,5XMyj \F1cyUaǞ':r.ݫk/T =ԌieZQ`N\'ٶm^vx{E_V0 ˚]@ !$׼j^wKf:!`Sp/}Z/0yy :B:VW=/B+DѰq nq\|=]w%$apHj0DZ3X'Ņj~BGߺq_DGOT+5v?JbuRbn_xnh4VIҒ G9VKg`$sh]j<"^x{v+X{!qQ+stQL!Ϻs]2a^3q2 38t]^BŤsNcW+NE)m7s ^v ^"VUnUUvVoZs=MTiO#"*&.Sq=wer?^L-ڊ0Ŀyhxۮ{Rd3>p-*FnB}cR۶Ie2Gz G]n_kU5:i)*ԺVe.U1y,%5%.t(τ(Qؖã⩧_òl~wuo|Xjh%uE@Ϸ[vl}#n&q̷oJB@J)>,RJ4LO6+$y^:!$ª$ëVP-B@FКԪK(D7 qS%Vu?fhU[``pJ5sxj<7'8Y67cٵuX>ry" RxrBܴ߾/} cl:ҙtӛe:qzZ;z&\<~#n]g - !kJ7( |ߐ $B ,MIe3tI\0y+_ʚk:!y{8J5 Jl[jMsG^{E{vLhN3ħ&MVj 1.7I.u)+UaȳVg-`d^y公Yc7-jAy[vƼ3O,lQ*t5|uyӍ17[dfzM[ R`IyTȫlL.RY6Z,57BP+S-1|3 ZCm;x#qkfg]9/y)";X`g$ZHITfjAVmݔxŝ'ZQϪ9낳 anlGb(vvl?'WW'跄e A*--?[8!ThMdTF6eH{*V -cUڵm٧!?2(gZڛSZk%Xw6zfw>>$b5 708 ՙij-:*sءO$rhKm'~;NhBJ\ᙇQv=;6l!O{xIT7ϝg4ҌQKF cDc`^]l/` $`I#F;Vx:0A>]ԩ;j}yƟqD/'qϽ'xrԲ_ ;=A+)1MMfXe7kR`0SĶm K+ّ+7ڲLFOr-ˊ~'ضEm *O67zѼWKQ9ذm B/44q]P'ߚJny%Ir@ÞQOc[i.1<>pa.l;iۛ~F^(*$A[WcsmN!y<.H ^<(k>踊ݮ@-t-],J 173VBK.h"Ь8)u[ !Mϑ U8wIgهgA*#?V"٠62 SgHOĨb?$Ӷ,..:|\v5xg֚x>ؕ\k:Nܓ^*2$D'RpWÿ?k*εT{y_["İZ+D*a[D[מMF`֟y4aKϴfo۽Cg@_ JT]ơ6^)pӴZ i1UM ˶}xpú>1'=r4T P_ 8wmk>- UF%4-KTUXGF9sjU1L#lVc10uvPJѻz1f'jO1SٶT(UVgP eTr=X^R4;}2CXN_)^z?qY0 ,LNӷvH<1YC qRIVm^Oq~ %B)uafB;`'NQ ]H31VLP.exv T[˃aX ~k|/?ԢӼ y+/k^n -*u4nd{r7(ZUhO? \u\5אL{{RZNؼCO:28T7#iOMC'ڌ6[^;\tPۑA۝sE?H=9.rOM\XO>״}dזn\b~yKՂx! ?Eߗ'8x~#"~>~yMV#qu7.bI3r ىiff8L37mK6RXYM0,L2~5n[*Dq% L:Qh(>RYX!Ȯ´wV òXs 3TKa;q!~i}XaG5uq!7 [Cqf'E9 lܵLot+J$(xVb>Lӭ`[X6X֋Jǿuw~ ZNnjrz+ZzǷ}^o~-/vCq#w?#w?p0-j,oo*].n[uR!B35yM4NJmߎ\PuAwe)4N_٦8L#^i=o7JE͍\ӑc>hmga:N]s[B;@X&S |kqb)jQ#" e^n\/ٶ4HrZ9Ad%֍0Tŏ"%QT9yB޾),@Gxc o'0͘)}b)%SGܰLAUcaf{s/FIJaӶ Wo zpE<ؾZF0 NL1a-(;=+q*{(0,uoíV>3}^$cNRe%1a-eI$/V@ K ni;N?F9 #Wm ?]~[ 3귽wE5a[[RJl Eo.MnՅeZIv]~1?޷[tvuc<]۾舺;r2]d'{ƭ=2:a1]z S3 Z>MhA9[w׏0i̲LTD|Ǘ9XuCi۲ٿ|:߰J#Ȳy֊s<7e[6 "&L1sM>^.~aZ&[ob`hI'H)[ܬ޺tonQa$3' |{*|A@%1=CI@7\wAJ0-乑vHf3g(/jo%%* ."/D2ؤs9 ST+BЇ^en|d{{0- ˲pR) @7߈ cxVU-cz&.:2hn<48 g1E Wx{ފmۡJ-jˍ ˏ+"""BMF@xM/cp zmQJfx}׹k fcMh?dY|I~~bA>;`UAБpAe\I}mߌ?~ɕ{x^ih@,}z_a݈} i2# e }Zq@Լ C"E/x# S޽f|#_jHyLiz3}O+ͮ^sJЙ0jE%]t.)<7af.mς!I<ɰ[=8ā/WAy9FAҽiv4Ldi]J!MRS'p]SS˝?ZJ,aS[ ( a`ppy0:d zTO wr􉧩-Ŝi{>ǟ~rȦ;IeB`&v"A2R(RѝT,-@I U*D7'HAZ~5L˶cN^ǮI&N9k"߸~Lpa@#D,Zli8yǃ|7^N}J#Dř$&XgG6R(ˢ@)H S '>ojd޺{[Ad sk/h!ge ge}s۷u s߈dyFmLTЧ-u*,*_8ܪ>G rD=?NyzF_^?.Y E=9lG6_ڬEPymn/*d4eBkKA#jJJƎw*2=yQ_#>+LX)mS^Bab,C8lۼ볁B0e#ӧϰ036W)/:u;epa4J_ _ﺜ8x6DAqvCgxMwaHD.[*k"v±3-sq|R"HRTF{00-4^v*7sxz~~_iQuۏT*lܾW]wǪu{ CkVfLl.C&ŲlMp‹ "X(90 LK=i?WU|-oڪ6+K yX0_8mK\vz*Glťl8I[F^ӯE H$c"$%mu*,e=B^, T+UfȳGxg~?X+\ C0M<$ݍ2.VM7v8d=#Z5ֵ|]"#.b٘v]֑P8<.Z&̰ȭM}KH>fL|;¾X,!9Ma֮$T#yPPJY@)6<ߏ:\F"˝Rk=rlB _u8qt>L('ú0Mtm[3D'f'uj\|˶2`njYƎ ϑez؉m%*>BTJ!0xCx{'}?=3Ka6Z^3gWJ=7Z&,aN7ZY8bg2AZ cr+Q O` BYH,󏷷]Wغ hJNu"ͯ>乮:P,X'^,.8S7z]t tF\ai}؎]; 3\Nj $knb(3c$ rcd dl?(EP8*l~"E%Kznxx řiLJ{Z_ *~g` GkH[޺ٱ όu0 R~bv|*31Lp 4LD: /@~C̍r]w` e*q߱V~{& wiCݖGA﷓ew*I?s]_gz sJ"ӳ;›ƚ*I_RTaA?<ԡxMlض=kAn4Bk[ ߌ}%r(?@E9:6Fv|o`Se\zU%ϲE}10׶\O&F}xܺј\WĻKXNe|l^@aL0 L@fGWEfsQ Zet`4 w175T FNf`&dQ ܢ&B$J O%׋ϊ7Bi`9C:#υE5w'l>R``jVZ*3?5fwOּ2R E&00A2 rEҤ*U̜Yy6LMvpO8rknD磕7jw`v|d&C*jז)ȦN&AP-U_\*S.8s4x#Tߧ0_`vzRDX\\Wzx;o{[Mw3?mGE o}.>/sӛo. jn+usLAͷe/L091˪MB# PMN󟻫횽%10CR{kDզLkcF<.uv=/ {2fhN袋8arbeF,DZ&m? o"JaXwM$7;U@JN2acXف~BJ%RŅή|{|Ej~T1,9+V$˲ffág]7xߐTNa癶u1幱 w@}/Ntew}nN]%]bepU?i8^kyz1OFt-/i/d al}3sfڴ[M !,J0G`v,6Tʹ^ QCJ,c=w+G0e#gƘm}yMLb`έ,紸AȤxE lXsSg\?U6߰5z]A@:"J Hr גf 'V'˰}yy֯&ӓCR]B۱[Ɉ,iNéc'y{y[ejljJq@X^VKsmٰ۬\U/%{/a-h/EK)g 8V%ä~%7JqS[Ԟkӛ#27Wu]妟x S rE~%alۿǯ]7U]JS8y[7 ; ʘU#$a`6gQ`u}..,p)FNa`/2lmԅD$@v4VKofǃ0L:TxN=$AxcGNгj;EY~ aPG)jDaJiN)0LJ~D< d2oN8޺IQ?I;0E[LQ[SJ0r=޲Yf', }[dRbIpITBN(- j~+hӏ!uWP gdJJzV anj#OR;pܰC*tÊ*dE!zW!YAWU]Ԋ+TJeϫ%(&f]asaNݹ՛_?R/Ւ6 cVsOm+n?w'i~q)\5Țٸm#7w۲0-d2I/Ъ TkѼNӳ^&I?oYT(g{r#buWV;7m9_X*>ή<bd:C2];V]fg ܡ`Agô8}f_{8|DeϾϓxn/lm#'ϑ%#mTus;}A[8.V x!ޫ/4MLlPjy9EJ) bxFfό*34@np8Z6Mʅ[E,E%sJt$(g{>wq% dΉD+I֯e~zaX 4=CK&>i:u# TŐ*RբD,yfٰ#A9TB0Lgf9!.rOuIܴH|g4HRa\\>G:&ͰvZ_#Mc;ihB`BWFRi!o{6Mi08ƪ@vzIc?r!DwdZoyOjO8zqأPY4`+BP0QM;Rݻ~yXg yذau|u} : #e9"ʡ.j<7^^F]%]G'9 vn!`ںQx6! 4 sn'ZUYz#%z?~R_0BS^`G>aYqHc%geD($Mmd ^:K9IO#T0 ATv\)R nZQf& àZ,2q>da@ÉN5:o !]fZ ˤuCl4 G'bc184u՞؅R$yGjO7O}k+΅,w6BGT:]/O^tDQf7RX͙i>CG{UZA):|ô<ٹ"k RXL${iO?÷x㲯2r*ұ2kR-57Hg:mom[Oh"A̺fFb.ժ,$|l<NR{QʢXQ)L8䔎t3 J  ۯd&݆ lR* pJ n#s+t伒E(HO=Rzj*JbMg;-+M̎M0q|77n Z)8=*!v4-L®%8?}ETDJITI%1myId;6xom.zݦuÿ7]zZu;LU^[0 LԄ4V_oќڛ2N"(>,-`.0oCÃ\i z {Z'nEw5Znrl0YS- of&8sjd2Ao=w=|t>G`u%zt\z<3D6IF#7|br "€Ͼtiz|;8Φ?=TBG+m a`'tWǨsaȔ5߽EvbEDZ?{`9c"^T-xwB;r֢eNa&RċLb2F*85269[}0k>tOx 8? <שAHR# 4)łusYJ,.nو &/ti'u平y]D.J)Μcfz0!-?8YǡRu^`eg&%C1q$9'&&'Ne=Bh(N)jHNda$l~e WB &YD>Rdua܊HtHu<>NƶՠZ*s$sy)aB0LnI_*qm#?wz_݊~iY:ؠ*ڧr|j?7WRZ[7^yqAvN㝎%̋jD[,_>E>\sw l)%~ݕȊuq:,ȫ=5$2ms)=ţ>mA*Պn@JQljs=9%"AH#BL=q{~Cz`b.yVVEM 'p]ЅBN*p1 $xGexͨ`dزw7mB3?9P޴b$92XdlZANNavB&\Ş3u)R5Y:Cַ0ba}ԮR$ir8TXbVKU%K`96Or:1,CP# D:7lODo;6WRnBH&p'8>#H%wNjgFV%WK{{W.Vlv+o o5\w#*U5[j^j/4y_ri~P`Dvߗ>Mh6 fը5< rQ rR{jgFP#%],]9Pё0BX9H8K T8%%ӳKH+?HA@ߚլݾEWaɃ*5ŶN+].rkS"H>Yƨ Ov o*Voݤ#9JPdC_0HN'X"Wt_!va| '͖}Y*(- ΰv*aLNgxW#ULaX]Љ79?:b1!ٗ>e~>/->n W໚dfmAݦ8Z{%A,.JϨuTe#$u/.yb.nCj7[wl0LLKbNF˃6-aTesTrيѲ*m(/(vH?`㥻pR6~lmDt9 85[.tCR~|;*d5LjadaN'tUSSUW7yqe,){vQ-XmC ǟzYi0.HĢ 4_FRA&R6%䐺ϱ93|'xsӌpt.TJ s{{Xi=2le28Rc޳cERCoZos^A*/[^ɇ@ R~GN]N˯jBTѳO0qM~֟䦷܂Kt ǵK<Ћ6^M!ժV0L?JS? ^~wGNqѮ-l޲L&T*X1`Ԫ[TX^S`mXxe0tvT S׹"z!Lo[7,rva%|8BJ>Dm0PBZ\RT deU >43vT|.dm;oil=h$j]#ToO}aRװsN~vmT,ΪRk.."zݼ;ދZ|6_fr_O_ CZt QUA$#rxˮb00P$F܆;"A#ꂨIJaJd׈ȳ7k9)6:.X)gx ]t 'MPDS&| :|WE)$-0m[+Av]H)9C$Nq>Z5*l QJ/-G$:ׇ4MR nZ,"7JhK}X2dz~^>qɑQP&N=6﹘T>[BGYWuA)!B`T !p9]|mĚk.՚tJ0 AXf~s.z-U,amFvXGqW'm?p[([ W۶XQ{Ml#Cpko`xjJR?[ǹЋs*4DaԄUC051 `/raD\@"bzAhS@jQt!x/VHrM٫F^cFzGO]80Wp.yzzz^ԁBB~>>H>xx3Z nB owN 0m*Xx(@5A"$1<@iZmGw[ƶ $2)󵘼Q_`~rFeKE%wZiΔY-]|ǫA*0M|b 5F4 })%}_X" s\úSyD-3z*wZt;LMqٵfg|XaβFﲈÈ7"V-럿?fx~}¯t:mI7нrOkMعQ)Eo{^r;/lir%֖N߷6FF}; ~/~ ?2 Zq_-aï͍NbQtd G~fuAu}<7ކk;Be`;չK8.+JV)qD|?^hhh[A4L`'.4QGʀ SWq=?J8OJ'},!a̕D$0=@"}\AmaZKwb {W b6ӧG+0+̍O"t.+:YX)Y[*/I,@ ڎ$wӿ?+=tdtz8#2ׯ!},E>WJߋ[w;'SU)^v X) bAInKk߈t)3S3-7_L&qyÙ;Á}O}a;:G)yz\{H$gCK۽q{oZa&b??l߱={vPuݺ"h 3#8=HsuDu~ Y|Κ8{Bº?nh&ڗݘux;03iZZ ](z * ,g$ZPIX&**bZm/#Y_ e{@aȴ  3HR$se_Lz9.%]-ePL$˶W೟{;$I^} }lٵ2W __eԱk}5XuMi8_꿦iL&;=_P.z |O~|o^+Blg}Qm_&O{F7?SJ>Gݼmmrm٪zT]_gIz먆k=B\&Ȟː ȆԚS3to;oH|<~2qU8z88vdN18ԏi(v zЊi dsaP^(07>Mqv"MIalRd09r%̦ܸnт.IG9dG .HRH˦3YCEK'Փ'ӻhz'"XkN Z/zn|vncxzx'Y7Ĺ[ !tq0;sd󹆨V04e~\~N;.D*R/^bL'/r }+l̉|o>5)܆H.C}㖈U)n"rAk 9ЁY4b]F?(t t3S3<;vm%jߧebY8a<4y5Ms[S)c _skG˒؉/Bܼ&[Wrt3Iյɝ`8>}0;KJᔣ^DDsHgR) 9 CZ&<@?BIals9:ưaU* SлjlOLWr##D]vn%~N"v, ϗwF?N~?صu^HOm95Ʊ D(r=9ټk;m5|Fm ;b•bYFhA[_O=`~~C ï[kDcwETPJ]{OƊ9މ0Y>S4ֶXxgF]ŅAy %;/`_&Y䬮0mu[nH?gh' A)E"J8̜5yBU]'0?<̒,sbkY{TURI-ɒl /`6=؆aXzffhi`q3cch/6mL{mْo%$U*՚c#޼k̪ͬR)ʼ'9|~4r#-.JvX)Cy~}LWs>RB!D0t/(X(;83Dy%YZ|~R[D7 2\ba/6V Ŏ>vFD3|g?W_t~aU7׼vm$y HG\!-oX8I ]dU <|i8<Tˌ026B6fДB*T)RRqba:RJ>I>'{K''LU|{2˿_(Bu0$F[wn-a!ulӠ11{x0wno+c&M~?/Kdɹޒ$7(YW<9:h#KKz)yNH#)6xl6M&!Gv7P -4~Q !]sɎXA0}+*Vy'gu gr/(BHEfd4v_>ͭ#]B33xV4)7Bn1U4A4'7>w9_? ?1ƵS_haGR=ORerV&o&?>'Y6QDƽm}!HQR/6nJDay'WR^?nlv߼COscZr;?o׿v ;^Χo~VJIaܡ#\7~:U֙?¹(-^ om$XM5wRo]y0noN*Mga׾3G^/ƥdSI]q)F7MVȘK:>@`(24ϐk;fU̞8MZ's--12eڱW{7ں)nWX剞ff9 l߳:RZ~_9=$NϬ8ٳ|wr?~ +ciQ)22>e!Q*.rjc;8 gj?[f:^."|ujdFG1.- ,0y%OaĻ[w=񓈗Ni029)\3k.DzO-؈?AL\ijG;}FNÃHd5ofH8owawlu2bz8Nrۮ&ztE[k:}:EFJSl(٧pCl2eH%U' P>8jE2m RS1ހtx cLOqpDG]xFƮW_f+T-!D.(J(;xʵɔkqpp(xid (! |Z sktM`!iU"5ř#/bXMhE%EO{K=ꦉ1ɏyr#\4ICƄZ'GQR fԶiSh0Vpc?IE&YlI-." 81?Nw(M-9i,^7|qNx\ ~♫FS"VvwRG$]LG][1&NX ]jiA:_ &aOw88C=c粺+hs |3_l-FVk1AhӅW:ѭC Zm.yF{vyHKJs@PضÓ {0=jъlK pl% Չ/͛~uӸ1; 8nH͢AN(aO{ex2p3y|"T:0$抄R#[Gs@6ٱ1\rJy5FY<;鳭AzcɘA@PѨXkٟiA~54$ #c'[-x za׉ɻӨR&wx}tE IJ,6o̞kpWspeMhr ^J% /(Ԫ.93[nyq"cr.ez==ۓ1sjyrkY\\CΒgss$HuWsݿ{"F#%)6ģOx Gp7ȑ#CZU݉1S_ddz yl!S0ɏr q#;~Ly!%vOX_t$Y(`r[cW+xcd@#0McUkm=Z(HGQDD(McdzI ^Pg,Vq [ۛS&Qsv,HۢU}xa6b&RϿ`M77}[6-䓈"4}Eiw__} uW.F&Cbq:G8|>ɇu"JS(M#_126`BxhNqȖ훙 25=Ů}4P$`)|+>>qǑW@$Eo\*U_ x BVʱ9th9d 1x,~I"llO&lO,#D4).&UDHqAPJ{#P8.S"뉘eYzQ} dyR^@( A|X.LB Re|`،FQװ$ZT8"va@ 5 !FJrmGXVqP@%nB <ץ^*xnSgcCҢCi!H~%0~$ϑ+1Mò02ebclB0X*]AH081VoJž JŶm}DInhLoĶ]ٴu&4Lu]0L=qIinD&qChG~)e>HVDZm("l1[3?BU/#4jKGJ \ Da6i $rtr3<7O\![,`f+ƍ'I}#PHw~t|"tBy%ZlA2t\_4ȏ1u[6Q ?64<7AeҢO 2͎{ڶM(=!2fA&byu}=>?)Qfw v%qKi;G[ 1 RAGŮCV1ep7}~fNKH|7tqٶ{'?K?x:o@9~(-Ȯ?."Ķ{MLt0:I1vp|Sœ2DJS\4~l}V6M|vڌd ZQ!D.q&[5Kј$i#d ] [E+T02&b0[7$jƏ(B]a`"oxVH*dDm8.Bn!-&%$2?m+ch j2i&=)cnN"Q3)T+=.7)0e{buzUdrES7:~q0}5=iQ((P_{9ܩ0McfLp(',v+ډnWg;&n=丛@7M Ge,Qpl/N~^az'q2@ھQh0me3Jq3qnYE8oBP0>F8 pj s\OZdz/X)0,+){:r %\3ixGy98p gnס8 ke3z[,dɬEvq Twl:w{*lWJfW7̩ Z r4yӻ޾u.F<_%D3t~?;:vql5W&E #EGnS^m7Oq|oLPRaCS&ưr =їEabɏPC,z"gf-0,+[Ki(=P'R-%ى0@s]D*E4b&0dT@JB= @FQhAlmhF0l8qw_L͐gVO 鉮j$ NyNʸ#ˑh9xcx8:wZHT({}c޽{^\+SHI).N8>Ɏ[)t] E=$o vAenH|o Qʤ! ɒuX,$g(ku4ɏY0'M9294Ao5"߶Rfl)EI ?/.({@CA`e a'}1(}6a:??smo}=Rٶāh06-{|7_ǻzAm,|R xsÍע"ʘ~zhy1:FrmDz.v9H dFG cTF ?nrlVol"vD†1yE"?"o~ʼn1U<ջm!|nlھ2>=(W59[2?i"(L؊ʶ']XrO^-a2'?+G'cpH)#O>Kauo'I9 rX搾$:G?HRW,9qĚ"EH tK3|l8R@MM}C\9edH\!ǖBPt<;"WW<4Q_,DČhNlzN@'mC <+^/c*HM\ڂatꮭdEA uk5zq~92q"Ӽ,Pxmuj {tfNak[wn>(Lm4MzJB>c|zѱs9#nV sA@i~|;?w'(ZhQtmK>qhUlcCGd~k{{iP-b")]8 L6ælٹ+c!zZcq=Efzt $ir73׿ڛǮ7:tN{lG>/|OyV~-SI!ǭ}{B!\?O[REr'Oo)֎4c,_ooIJ je:8:.BJRIqBJγp,{v1/g($7c ]j[G+cgߴ\RpMgrrFQGy.Dal}o؉T EB(LJ5Ǻw񓪋aĉd-d"+b~J}ßÿO}߽8rdxvy=V(4ɭo}={۱ Q^:>NB q} nU:M/'~wߺu+m9E DJS\8u _=Oq}(0LqyۄZ8Mur$3N=" \)L 03LR69(A\!dtjtbd4L 7kcԪv{@\A- |Ղhyng,ɒ,nq,X >>WCqk~/!c-WMn2=GuoYέ wg8#qmvh}HGL >gC\wTTX\\t)RX:e/`ێ͌!emDoRQH99}(oz5W s'e,vJt>VK:Au~0hei`4j1D$ C{߾yu/'43f&l\%7~kJ?n~<{0s7z(Zq+a,BsLm8cӓDDlz~kٶg'S[7io]UDxK4u'fuM~)K'RT՞)RX_:eygwnѻQplg]|ߣh022B\r 3NRdj7W fd2( Fv/aѨقH*|3+$oUɸ6-\^5DA@%?[&eq\B&na ["L+ 2XGGs.ao狀Xx'x9!Ϟ[ CsD [sn}XY3NuaR+s @$6ğaÒn)s 8MT?ҭ6 =$X|k~~y )R)NqYy<ɞ}t DDB&w;x^\v2l[o?|8>f^:ɱ/BbgСocdr1 >Dz|c1{WvcYR.FSHqH t s<v7Wفi{cp!j f͢R(Qr70g׀ǯ,Dr2tLTƮV;J7!VF$%.F`Z|,2QDMmh0St|8A';%yzQ A 5|-]A@yz},A/=^nHJl^:r㋟<]BLs)Nq 'xgټe2@d-^&A|zmh4zIǞ$6jy BBgH]GfZǭ(B2xʋҚ2yMËML &їcf E뇈*wQ+* !cr$UX kخq8]VG(x!RAs"/^Jkq<Ű :L8a }bweYض‰Hb#5pG8)FF (-&RQA }&*OL4쾚h$af3G[SЊK 3arR׶[ kI;f&&nIJN֤] k8B u. E{G}*q Ӡ4GA>Onf}TL"?J2ɳK^):L4dONP&?>UAdN\IzC4Ƭ,]#0UYDs*xWC%jC|"ːȕ-.Z$Z]oPZFb*I3| _xǎtI"%C*Hq# C| j;RIhԷﭯBmGdrI*XQ-9lf/ +ޝcn`i:Q.G~8nFBIf<oe @׉4#xʁc-zE =Ԝ._!jZe$ӰW BttLt2nÎ;v0@shM(nXYL@73G^deCK!KzdbH!j_ġ> :^a/~Ӎc؃7^(/ }A6seD5_~ӓ4jvi0s '?޽{T* l"EK@xY<{ wn o 2(L$ClY7kqrL4 uDaȩ"bRr"!it3'=|ų|!="T۱0@0l!vXNIwuzJV.(zK9ۣ(Kp2B#pERZiw~>yMOOsjڲRHq/;,̗R(WaA{ Bab|e`'9Ll50hV6TfX'>x)VY^$eK6͆"4# =h!%v\)%P}o4 3crg~o~N|w'B4Y0E)NKNq&rݫ#t ] v*Xqʕ2a ~gP/q>rccv2t/iY tݲ0Y]Zĵm0"¾ziX\!u]ڮo2R~J)km Ð33 !:Tt 4Yo>q>å4j~OH2@JSlq1>6MiAP_+B`7l\!_(Pǡ#?̞8MTfu0k{KbHȴ )΢h︱WcAzBD"d$MK ,q\qkr'53=3'Ea,Ї+eY?~C<9YŦM8~mSHqy %)^Ð#cLMOZݤ^7CAFKeE뺭 %hTAZ 0X%ȜneЭ Q>Aj .E#МBDeL@"( +XM:0Qe.$Z/<JG3cQzN)Ro|އxއOs/3: ={b˶MH0, v ^qzݰ1-4MωClvTюꇅ(@@3 t+]ԪM i@qsB7 bFW0n-Qae!Q'^|z趶+h%%N{i:>qyf /|oαcp?O"兔@xY# C|Wm-oBPX6DءñE!g8ء#=q|m\ͦ=;JK /CJ 3C3c2]/%yF L+>K$7`Kȱ@kM&dD|yZ̟س;]kx+J/{GKÐg =)%O)"EɹRxaz$|2=v~FS(2&AJ?!RSL}{ȍc L0;4Ի(Q`WG 2΂+],7ފD!!b+gjKa)"DZs"X0,'TKBqZjk;}zYccc,..ORxCRO"E EVV}&R ! !}^w(-X9OY Бr ^$Zf(Mx{(! ucYvZرwi[; L>{9 rsR!Hqk#Iwͽ_z>=ףXZsuav")NqŠZ[wl&_$JI~ `:Aa]tB}ǡt~ҹ4* Z(M"ShTvH$Ѳ^- v*I3F#̧fB'kA6[o˽)RW 9 l]1@IR" P{.Au4|h4۰-0zB 3cb8zfk͈}"0@qW4"pG@ 7sZCZyRa[:GF_&''ٺu+>(A"@va˶MLNǏD*9Z: }tC2 /^*S:7)rEhh@3MRqe6#: I.#>|z9IDkF;(Fi3|?GTsfc#G֥)R\H t+RZIFFIBAG6C $B, 窫"R.gvv[M╌@"!s1L#)PJap1nn1qvRP, qc"74G=aaf38*zf2vÒh)PVCZ|MV:N4@5'𼶽2A"Ì1aLWR_a0f@宇L}#ǟ؟eqn&0uZ{nFGGѣ!^*EWR⊅,Η)ټe]:H Xc6=G'yϞé7M =J_A&!e\NJ܆͙䳘ЋDɅa!͌M't\QpX.BX:/:§Իofm0Ms Ðy8w\ "+i%W4f/|([5ds(BJiD@ Ѿ @ߨ7plL6<<% YG(aBͩcd9cL_8B+Dx=<ŮT,;q![޵HJ(Wh˄WѪXV,v/* Np=clebC RaS.׾#Cf=77`6)Rx %)x|4_]xxsR;B*e$BFj F!A Y" C2ENarV&o812uʗ ) }S[,aWxy׾t\UIv"[tb ߱4k8p .=h{vj[텒aj&~ _hi{N=n""r̾=9;U !^z**y%0䁏M[{ c\GKApѦj c &ӶZ8B+EG%J"}Ơɶh^A 1θq(8 ("" RP-T2Imv1TJe*(tlmߴVj֊r݇ؿ-W 3? OJ6sw'% xrBT!.|$Da8a+f=&Y8N&#P*Q bue|91Өlɿcb1,AJ\NsHP )QHPR- *P/1դq0P*zn}EL{,[W#҂IFjxkR͏[%dJlwgijBxK9&>ܥzsr,Bc a[ßN9o0Qa΅/IWA^zn3mbK%V6(EPh+ѐ0kӸZ=}iN4b,GaHq$o*GaOr*oM&z؉8(QJe}uuҹ*ZWtbIV'؜ϢLu|/*tSdy?y.*Bgs^mF)OϿ;%*x-Da1zxlW. uIɋYomtTIBT`-FZ`u%A$Q\߄&dU !j֡RMV&ӭPav,6rv-#Ӓ\C/ъtTJ%r TeXh-|y/U%-wRl*Lʘ4O)#=峿I:ZVң#{d0b 1'^)5ס"x5Y(*T ڝcŎ!AHh1ˑ8"#(i(] q\/̘zqDk7k %I5?w2/B+hqEˆ;ԃln=Ƙz9B)*%d| $@d8LngFܢW 0#LsMp=8[Fl&TJM|ߺiwl(QTAUT;ݹЋoU]1c8<&|*??hr۸|ݍG!HK:yy= < !ĕBU+UROG mh CT'%au\0221 M3LOV>ژTD+ucu^Slk3ٖ\Aѹ>j'Z6Eq]jIoD.U9|j(͔YrR vUQ 9}8γɴoV~iiI]y-  jW Bw!ӟ\wㆴCŔ K+S . VTI ud}kOWI澶U+p2>q]\VA^TҿZ"}c>iAh)88GX@1RFuor=KU =ǜ|֚prH(6<&\,xƝcg8_k1 5=J%:_~XZ* J)ΞeǶ]3-D* #v؋5\q}R8((T,E^3z{Ye(q}\GZ)ob>8ɀp}&ZcuvQ^!V1RIߵ0/Rrxt#龭;\eVFC? 1`]S/|}|Kaի)*h;w\ %Zq0dǶ8ç? ֮_])6֐&.vgR@xڛ&*Iƚ677k8nhŸbY`lUXXyZUh1ZEULDg+_Rc =ݧ)ʬf]ý r5cOna d2KIi֚^vl@lO[q[B\j[wS{?݈jC6q/1E:: JgVqQ2Mp^ix¹f]kCYE[KTҍRB0o䶙YNھu7^%P~.9֯/^s 5o|aB'3w߿_z.r-<+FxgrE!FTfkx- *%۔Kl4>!Ny1}ݧJ[-.km<|_Lhk:~g J)vPzdZ\5Ǜ%Dk|H> V[r|󟠹^_+x= R!ĕF3ȏ[xg;Vh5ZM>֚_\b11b\.y𯴦Z.s|>##&EbyyRZ%(DESVx]y'P ؽ-:7}z|Ow\CۓBR )K|?A3g9"l.Ŧns\_~oޟ=1( k9yݷnZQk@8r8v#gl!-v_?rq~'hb֚bDpHq:Q8wPekVұf%yQ㹨% zґ#NB@:J;zb{*ݧė@[2̵ύN) h}ß} =O&8d3<򙇸Λ֢QJQ,ط}=S[ !L$@ 1a} IsKk.J+I((d2s8 ? `oetҝc% Tc**1iW]\q|#eul'%&C.CO9B,!z&ֱT^Sݟx1BoO/=?t;NV*yswAvPF!-N,@:(9V)Eo_?on8(hh!sgc#"۔NjcpB]/#XD##tvvr6Y1Q\?uj[#2c]R.@P"D`Rxl#Jq^G=N87ֵ(mӒεd!z|'N5^ѓq1ùg|;sx9wqoj?Cô/kW6eڠOT=;v'h!iXޞZR 5AҩT((\:bXZ0)MPȎ]֮t[DQ)8'/JtQ2ܱnG Qf΃oۿͷ7ic'oP)|XHg5r`No]ӟ8,kZS?RIRy=f_!ĥO 1eGycwv[2Ơ=qRLLp1)맥O)8ސքA Ϟc5i^ގDQDɨKB`Lf@Yʵ&.Ći=w_·~竜7o}C8`/c6Ӆd#'7N 7,롕F}MlyY?{ԑ7|v>5\jBm.\עtPx#}l~yG&ܧq(& pF+(Zg=\A[[ߏbhpͯ7ަ2ʻB̗h!Y />:E߰_Jiq61$`^$Lf+RTikoX,R( NZM Q 6r'_1204;x+LǪ>&e>F{~6_gV\*X//k'9g|(9c>/hB!'%B,jg8(Qwuܒ^/VJaV0V +Rf3dY ɆY{%Q2;s gPoКJZ*?Z`^fH55&TCB~V*l{ea x=|/£ɧ#Dg%Rm qlAǟK jEA)k9cMhtذ~vvn33BIb%6J>~/6qt<%%JuIm5PcȏR,d3tuu244DRuˆ{w kVdZɇQ0|,z-t aFeZ/+D[c0y/=Cq$?}\GI8$@ q%A|wNY|7>ZRοaPh|~RL)뺌àdaG+c(سsGj5x5PZe^a;Na׾4ub|гQJa=o)ԁ#ާO_a5V*4!iߜ5BHZx.#C/ꏟWCX,!m|7]DQHcT p=74d2Hd݇8{gI!BHP سs?r)yp+Wuzɪ`'ȬcXBT! vw3m>TJP38OQ2<Ohgմv.8v_ [Kc6:˭8w#)0N2wxϾg_! f/}2>/q}*7eg~-h۞7س)o'鬡"AHBgWALyǵ8Z)mZ+FG;ľ!{K(B%ln=q#ήeI)C1# "jHT&slT::-Qf22 AJZ\.[ƙt-QaF[Kkg+:LDŽC2*4WK^gapoԸ?&/C1pgRt,x3l<}z{%2&>_>ɶkm:N["qms:)p!;QҘ}}/6]ug/wۼ+ ~(&V1je;_e::&ۃ$hdPc&((ʳgAN͆B,h!.Q^y~3ae.$`Akc3DaHXZAhS 2͆rrB>?{xOsK Btpd58NV^C sar,`Lq1iJ&?PQR.3Ek<4!~5UG:ѡax<Ğ \/~{?hZ}qk>D7ҙCպ&wbqx2cL}9 Cv=ѱ5^3.kdX co7_Z*"IY~$ C<𱻹kq'.QGݥbR<{VLalE4JR )hsle:]1 UΜ9Non\IMј㸡4+*"L>Ed]b=(HW1m͓C}۲W;_2a|q#Sh i{SH{ɊCFzw/cO3xkI77Lc<{أބ{H빸uLnjxÐ='^B%'ZK@Pg3?#~941.ZZ+NM\MJ4fY X+q U_-`))X,Q,m39 g2ź-;hYցהd%{azUGqDX YKiB3ġ$XG<#9c7{6o;{(\6y-&\!J{O]'hh)zg ?4gvZ{s4 1j?r7X3)׍8&R!^~~g!!ZKDFsrH~6Fk[mXVJclJIKR(Nd}PJQ((޽3k.#GC#@OqߣeYm0&%&Z]r}:'ݰ\kWbXZ}tv8KdaPs^L1cmRdVAHlmk۹x[/z"pn9qJ+;"v|OXB$ZK{tܹ6V\β;Zi @-w>**jکca}/$@i3>uJL5&dZZoixK;kmJ)ThR1ʺT;SicΫ.BR0esl~zu3?8RxG_y֭!ӔMzj_.}NW5uT Kt;Daxd5m?ҍkmI<Ɨ` luBFh)Jغ#}h}kVq]rѹv5b5>;# ZR. w v#9rs3>Nι֞0c;jܾu'=F Vj:;GA-20#C cgc! #<# z5^}YV;B2)pRKZ8/5ɔJcm6^g;}YIBw&B!.q348;96F[G+Z!V1bKb)I!I:x5QXIShVi ¤tOӅlw3ijHz y--- LK8CSS|~_ k kMeK|Zߤ߰IW xdˀBÕR Nj8!mM:GO[8c28Mn0Νe8Ȕ.]wCCCaH[[B0 Y~5_±E=(" #<#<|77v=yb[ǐmN2|ɤ3KҦnϮ<[!h!.Sb9{k,mm;ڨlei)@ڙA_OK[sTa y#Qҿo:3)lX\,WkgO3Sr; !.Ѷ"!l[r[}wq3 5aq2:LF}WUJZ'=u{I}kijN}Fkw~v]+e?'lNZۚ9wS'pt#yG8w % X,Q)Wf=c?fheiimڍWsM֌ (p]wA)5>[('-;v/M!h!CѬ*ܹ6[-uKVC0& Bj@T~L>9\lO m~גeVizjx.JkڜL7I7)D!Bh^'>GLxU'^ki6)p Ӈ`hpob˫oqKB@ T,8qwM>o`޵6F۱cM>.liMR[芸?g}4+**xh1~%9|ɗT+U& #_sՄco2~:y *r4n9NGjO$Qe𳐮2ǎ L}Yq#q#wry=t1ژ)uf}<+!4HBiimmfk\}:ZۚXN)S?j8SK#0 ( )AGNojh`u,̫琄Jʎv?xc/vu磽>a>hikNC! tn~7/<[^sO=R!IBL+۔emtur 6g\vMb6 1ܒkV5jꢽg qL~EQ2E%50X9 +3Z<^-A@ =sH7SWds]\۹֍\UW檕ޘFo+sT&?AqTOed(0Q(bHB,\s֬`\I׊t\Nk[ ~Ɵ0tea(&V) EN<]xݜ9uN"}uˆr"+B+h!ĒF}r-MX5׮eŪN[r;etOE1#yiz244‰'R,Bqe-`<ߣ֯fլYe;hehikhCTkJJM褱}}=J%٬&ₐ-RxK[Gk}Pˍ^G6s #ãq{ PJcT,148̱#'9wWVB\pֶ5GF ImN[EqBuZ*B!. B!B4`B!BiIB!B!hh!B! Z!BHB!B!hh!B! Z!BHB!B!hh!B! Z!BHB!B!hh!B! Z!BHB!B!hh!B! Z!BHB!B!hh!B! Z!BHB!B!hh!B! Z!BHB!B!hh!B! Z!BHB!B!hh!B! Z!BHB!B!hh!B! Z!BHB!B!hh!B! Z!BHB!B!h0WIENDB`luciole_0.8.6/images/luciole.png0000644000175000017500000021315711437126703015331 0ustar niconicoPNG  IHDRbKGD X pHYsHHFk> vpAg01IDATxu|Usy kqw/RSJq/Bq-P),BYk>ks=}}};>0K|֜o3N#GqֺQ[3!'ydccvv+cXm_1+gF~~!7 5FZnMIN$?E_姥.-?z2>٠z͙]FEXs{Sk4>_Ψsr>C5;;;^i;O(!7r퇶r􏬚l{)1{Vh ~#1[7|b :j,k6ٝsuι}#ܑ;2Xs/ErTmU[RȈ|=n@+m}1h+UP'>mLPo B,Y|!aʛ/cþs^}kWG1g<89?E amچ5qM\*T[oNvzwΧ*(ї} ٴ2SC!O w t6z=<_/iH֐!Y۟ͭͭ?חlpܳ%e(&FxL I~|F6'Ux^OPvgcH(RZr_vO/d^#35K=ĭ\/#ݎt; g =u_}>ѧX ww h;yAZ$@I=0e 75,0oq)0SUSЫ eE+$'y?سg> 6WPQS^ S% /oG/|RJ)ʪꪺd }ej) ˚9@<-:`8 ʤf==a HJZjnst+ȕ˕/EP*Y4h|||  1۬orޚ(g_&WQo \Z*NSsܹ|4bӀ4KE?/vq^<{-'===VJJJZyQK>}C~UY993 pܥC棴b2Nv@S 'Ns[4H@BO)4;Dmjԙ%oI_R9RH,XF< 9V `ޛ}^QgkwP]rM#uRjS;;[nv5n׀awv <-;܂PCy߿NUW] վe/ (ܢp 3_ze[c[c[ގ8G#nGGGJ{=z쭷ѳgCφ zM5}}}h ɔL,ՇE{@ɼ~?_xmo{=\*r#b"b"b-^xPjtѥFk+y乒sǤ^Iz-mwK=g{=93M̛7[Z [ n 6bYqz'x4H OQQ@0A3N5ëO}ݲÒR^mYo{Sey!ӑncj隿)SI' sjq7^=eM=/ǃ"zDB="Eju|Q=ӕW\9v1k>|a&t{GccqQ/P:?JQ*V[_ 4rY/g-s,s,s#d~gddTaυ  -}Z 2w^^vJӟw)`֍ G)55éJ͛vJ͛|J{toZ0ƖmvkGXB}޹z}۫ummm8H@zo (S%_yoz.ϺVfkqg,Y(/hoV@S#mz|I?ǻZBh|#rt?w7;b}VxTl6wed'mřg֟YϾ+1pn¹ 2eRKZZZ-O >@[$@Yc(CZt#tI3A2ūBj]Γ ekm=aDW~}J]+cs_iN5@V*|0հ37M{{H/b>2RG$0UϯzFY8N F.*R&W'ƛ'nigoY~lޛy}ZW_zjмڼڼ 瞟{*q'qI0?a>xxh-Z q3/h v^붷 ~޴7u^LM=M9(|g7Y=YĭaߒW_//.KޫNj§얧rR:6tQ|3 >1MmWfm,vƅOҳr6 7-oYJyY~KŃ *s1$ڊ[?sG[MQvvǴF ~n2g~yhLy@'N&f\V8tQ*-,V[AnJe m%A g$5=6󧴁!>Ϗ~$$@Vd;e9JWTV-w֯--;>X\;]^z>>>yTIT?o?| #+FV .<Bmq7ڽ9wOT]=6$7yB-&C]7a8 5g» eLdnew{MzM^//UAbt+w2,5߂J]D {(?(nmO+A=מ̺2doMa Qn2q&|'a6AakCBJ+" ) '5<;L]057EqT!U |1x[@d '.A07wSH<Mk>;VY~Y#p- Rf&| iU>5J|ֽjl˯Ŷ;AĠ߃jZ/$a1x!TC~d[ O O OӉO.iEJlށP=4ub&:)ec:'ˏl-:cbV[ ~;N\e@展V grv \ իgꐜ+F5пX)Z{5d2w0?y5GEG9`*pGd2Rcf5fYR#FJ }***xШm",l%ƤIKS)˔Ż)r )\p{W??쩉$h7W+K=n _qk@L1 n}>nјNC3ԕ4KKK|vqo5oĶɶɶuYϫgٲlYiVMz-Jr3or\-lllSUWi~<}?/rᗀ{7^Z׼]7tS-Xw;tJp*j /Ŷ6ɳG] , ScKYnA5T*7^L OOfvNӟNP:uŭiقf 5kBׄ}ShLU!'SO5s[mM# z4ck^xmEs\~ѥ5]o8\KfWV}-6 RY6o< R>j ^AoL>NY.Nt@kV*ZXʀ}XnRR䙖rXekt^F$>d# $;fMEUQ@(a](C"EI@tq#=rV`J]_ 'BM|3j7 /} GB3 V7*5o&O&[w,ο Ϣ^M7o|*铳Pv=!yHC"""/gUVZWE|qǽ~,s[ܫ\A2)bh R:4M+Y/?BԥKa͘?L~Q.g,+_ZUW;Lڜ9isJ}=X>yefUf{7u+ҹH" O6qWH_13 ҀGM YBo>yvn *Iց*&@2 $ LInq@%S LsߛUOַvҦhAKi ᬺXCLҀprҔZ0xvr\6GE:Pr @"B@$n0 BP>'@aPX*(H^uGO{T~m>} ޭ>w<;{lFȚ_ٲc_vj٩e_N777ZRf9wd}K^|:J[5*,3x? " DǍG/LVq{RAx4|k/ޭĨ⹺-Iޞ=y{BNr L?/ޡCO^.O{ߺu}zVJTUnn]YQۂZo*ڮZtǣ-sjݬ,^ʶnqkL6 Bq@)PL~DUpG+/|: #E%uPwyB:`Ê(%mi@>p} 7`oy '@ Fi[pܨɇ 4lxV"?VcFl=# x:;7K/ 7qWW_3dgOww6s6t6 ypG|HONON T[e:b2VsTB\u(h?j%7x24&n996 (IIU"U_:g:Kf\6o1Pm4jӽWZ^EP)3.yrƜtkvi 4ƭ6yA T+xt<((RpJ$7. "U   4H_ynSǥ6 T*Q^qʻhBz*<:x %y=mSM꿳썲]P'N@LsG9w9 _ʦڳmN=o rWEb҃-y4<ːK'nm.@C n_Ȇ  @"(@1\nK~|Ϲ5|ACx0\)qh_i +"B#maVLB^Nk;ߚY3r(ǭE\\E]œ7ܞq{i i[K5V9TO`rXb)}ќ?;^ǭ^h)Zv9/VzԺV}p%Fa_kMލlf.l>nJSf^`jGsY \+^쒩ҩJS]K{9`,$ܳ2Tn]ߦ3ddO]ls,J?6) ŇQ*/L"I`ify^[|v?@;/i#L a ^@i ZӀLUÔ6Ũj;/H{,{h.P0NxbI rtwR|psr8wPb Fb`[hmpX:`{7= -C\PUk057WC~τ<;y ΣCν!Qb' I9k~mQWWWi/hZ %3C2 f$׵^|ZWW q6KЛw?ݚ|/߁3`X{L :&񷤁wzU1wMEowt?jP` a*a{ذU9'I{(S: Bsok[<{5I2^'uOPO/533WcWcW{9 ~Ąe7g_7pk|aNmҤs١cZ6Xڌ)%6]r[H0̇|z;l[3揧]U}xv϶?\ ~R:g澰ȰrS[ 8c-E[EXFq{~sܷϥ7WM/$~]R+*-w+]r]:68I'H J( $.6+u( n 򋩞fԯjHM6cNE[=p4Z :]q4HsЁVRqަTt/j+l=􊺙T2? fpowyaor-)Jn`ˏݢhu0K%! eգ5Nϛ5⮾zy->g]RԿr̒2Nz~]s{V{,x؝f'[BRAQPT[hvPqW-7c73_k !`gpsԁ\qkVrOј-l/l1]::f8 <R*]͑68GK8<;zz⍭W{ߙYۢzsWzyEiylʐu<K*2 T>^;xg7Ϸ/TbpuفϏׅ_<;_M_& }N>[5t5vpk%@nv࣍G1(k,2b ` /2,ji<n@RѨ`Jrs@ˆF1 CpXN:n<Ж|ֺ:/nIKi?Z!&}b֓K]i Iv1K/9F[@VˌC$I_jikMק_͏1W-K'S=ԭfz섲 ] UkTpPTay[r=+2!5[!͕7]pfӞpx SAśł2 )qo˩5@-^=l{ٿ_TKPUyAiO<$4L˯Ny3$n__VZ5?ݳ~@K4rZΫ4LhGMNq!͖"hPvg[J`ꭾ d `A%ÍI m@|> c6 (nw64G^рSͰax?jA7P7h{ל6 4zePOl|^s>"4=2vHn1CwN5.{eYe*T5f|b!5G<-u]斦u4^ ɣ[.wCTL\&-2t!S,=酸i ͑UϽ0iEgG\%.ծY [.d! t)iņtda6(c.xlj ԗt2yp$qI34}ໍ0x W8Ntܱ |-c6 0(dGx@nATz#khP!XeA4Os/:?\B[uzxfAa kJ.<4O 8ȡU?hJArrN<4:]΀qGf<8}j5Ya!Ce;7Нןys{%Y<^gXy%~J?zEDAj'U ]ѮQ <\9@KH}oJ >tU þ(hO]Xv;HZa.:̱!|jگ7< 4[y(5{5ۯnNTqu6ʸ5 6v!"[c%ڬcMi0m0 ,}m: b52I/ )RYA33M7_FTs2\F 2 @} x77^/G[vklio  ۠9au>~#/k BnAEJr|L/7A>D rKvO?>@Qx dyC߼N;?@2ޤ5d `YO> q+^zXаh%Y3 `k=VP> z{CUR J`!2|BۤM+9n}:HzI1^`W"·γk, "lB޲Ok{?.g?<5`Rɵ>z%;WϻͿ8~yh5g \)::W;C>gV}v5V'YX9E{8U&5xw+čƦ2-3O-U]2wmrγԷMGdfyj| ~dAYdNAP:eJ~wXogŮ*XTڱqd+YSȵ%zJZ8iK5u3 5V~SӵuLo>hcX-ZƘ}3tvwYF{㍫HEY,*\!oz?4Ӡ'Jbz~g|m"V9#B*er4NUyTJ{G#{<ߜV*ݦp8gjLY/o=M?G.fuZ͒g'/R{/^I+^OSe鱀HF:jcB<,6Z<>yG0/p/i M#&F~zM;X|FTI)SZ }!`6c76 f2@:`'vn,%j@bFzog,[ W0^:@4j%m^RrǨ̎'.`a 4 ݯ/C0h(n3 :ī`~iioc(x '8N iR2+O U}=/kLv!O\n@6OMMgoJꝴr O7}Rpن#&ѷJ8W8':MS!/x%pgIc&$O-H_ƙ2N&LMH0ecʾ}%ֹ:鏭?J_#ͥգq(D%H+W3r-<)o%甧sSovKlsx]~K|iT\m3 βEK%~}RJ11Kds`KU13^_XSOԾ{9Ie&ֲw-)pY+=̷ɘ@nē@Zx?`0Ɨ xr UIH lRB޳3*wa 4[¸OEH+W^6a7O ʨ;P?w?O61!V^{^zX)'шF49u@JS\&ӎV)gWU}}{?_<%e1`Nj2i{j*rrWrDeOY2$O <0(`秣v1;|lq-\#m3kc,ަ9k)$o@hk?jIf?sS!}g] xcmgjuFpLQԏ'@s>|xՏg5~UI#bMr9B~săkkk-zJ{~꽝/_~uK7/?91QwPrZҸ'ǽhtح =ܦ}|J^!v ~ȵT_pa^p`[(moA^) ?~.cU4WBT)nyƔhB&h [ @F2 4Pn;HyHf٦A]@(TivE & M@!8G~uiO(YXb,-ߧ o6Ӫi-jo}y%"(Ae)'(^Hb}cMMM=2 ,zԕmRX]I*iIɌN|>k| 4% iosqwen,99U/2/[b{JM?o++`_7|m<Wyğ\qZ`ċiӯIKU,UwKx(vK֟=o0%x,WbyTWEzbי3]=Mwx-n0W 圿uZs%hu1ojT@93A>SQf'x|[ջjM=jDGR@pdn2d*0dC1@zhC47Ș83 0&3@F:q\nS^~Eƀ=T)`MvЀHH$F wBo;Q' ^B(҆\Xh1bn@K%C94H12A=3> cO? "@*Ш}gdBײ83?1W^~Ko{TuP$KkZ}:z9 {uXKXK ߒ(3XܦrɦˮY 2g˻-A:e.i }>Y_*HS횾,ybĭRަI.AM!y䲬hO S"~IMh{^=mo+4G;^%c14mP.u)eYVVmٛ9j@& =x|/Y,d9B!ܕ> )xK~B%@gd-Jpc<a>^;l!MC.! 9tۨe|hXq9f&\Os?7w5K/^-n;|d*p=q]p9*T]U gWtT:iЂU_~jjZB=JVTqW$kZPA΀zV%2S2~^n3~n)y򷪃*Z݄2rw&dˎCi4sOe^~F _ XR {yht#^>0z{ދ]}6ʞiaR(Bpc-p|dK+_[_@0d78e6l1OLxvaۂ+/S?K+[qlzpMky[u/lYd .pIdkbD48o w:QF?|tJ_*Q-TЎXA~I0bɈҧ㎄/CQI"dڳҚ5|.4 rd-@!TɍP}Ds,@;ڠ^1"HN^ox[2q%yxK,I88E5N@u., jP8A@MUрܭin BLZYbWO,X[zׁ4QY!d-S%x+Ͻzcz인n檫FCi?xр)i?4`:56q=꽯LMgLr\)Y))>1϶Js֤+=گHpkϕ\gXzs-ޯ$Ͱ3ulY1 Ӽˮ==|. lw< vK\眿'<\wIWSlgR;&_|MM?6! CjmGYv@11I&뿃~WgA6ʏ2ߖ~q8x= h?rQV 5=2xz鞹=.@Nr# se.e 54he@w.nM#ӥ- h<J8Y ~r[@R8<2:r+\ N~$r FDx8:.)C/.i 2/k_c҆*@IWtMlوH[t4 N\R 4a,@ F;^^@ʱ (nܗ(eN:ðtVX, MS9 Q7x'[B8' j=H#?(P3YM H7uw&T` YЎ jpDqZO}lNn ${)y8<T-$ Z[WF۬Yd-0W\ނ~.{ ֒CNm%Ay<噠ix"3K=y^]㰣A|0rB/כk{7x}--iY7ˊ#'!cPhc] w͠ fĿ|wc_]hG*>26Z6.Hi:L>Nr}W޿OZ5 TUՊ)dUK9ρ_\iv9_^O: *3@#t6\ G>ߑGjQE7E>#ꕲSyu%㎽5SP1 u";?}pw!DL3rݾ|o,z"u2Qp #OU9~0e*\/JP{h5L F%@>,e Ez53iҽWK\$4 r5 # #(ڭQeD-9 e ˤ\,t-5#xxܱ*\%sZ 2@L E$xndGJPiq8L_ ]Dfxʳk͵kj$I%sU+5NM,ILKXZO4Kj\,=yO ory>a`-^EUS=ڿ'ڴ 2@JۯMue'oouy[3y5L͔ގX{8.wZߍ+|ĶεLjMCMLu]7w\^7gA3\R]ʗp]SE|!ϴm}^oHH(?J85.O*>)2g-fՙ@F 'Y@x c26e43qPM,N&1KG%ύA;hmVo sd<}pw4XFT =Pt hd 7@AF2h.,_$x5a姁.7E qOl X`P4j,%  A@t}//A с $*rV vϒad&`'['3~@ 5_7YH#p'du  ]~C*hH1ye..x P">6xJ ЧŐR3aV'2z_eǁ ysQ}ddh?8t ~|-ohO35Rv*8+m[E I7փtCr73Y87 0y]5P#zeg_U-t@[N8?quq0'ʺF=d|՘7_gmq_B!+}կoMsM]%emGR&?Ǘ fjnqF뎦g|= H.=P2O]z=,%+Hs'Cm O%}@0 iȊwxy":I8=fO!h#LAmK1`oxH[7 mG:Bc?Wy{a4¨;c܃\,l!$9ڒ#NMod ŧT+QW`=$,qlf:Sijs:H~F JVis6@nPx"}P n] AyHA %!d'AIe D > Kt܁I$_#N&>@I Q?>6mf:(aƪ~ҧ/uj Va =8U=TTJUŒ7KC6ͻZ& +\WlΰGW*tL[B,JDPv{?W6V{_$PEw(ߣrɐ\}Zh0X[A){ J5-TJFK0e!xp d"(azic;/p&5L c^gR^F#?vG oyg+^v[Ypʩ}nAC[~17UcAαOJ@yk;˱$4 (҄Rki ^T ) l %NdO@2)EԢ"plIc'^@3@cT:08%-fO0K Rr  Ǘ0wuO8%PUo@~g<2@e&PC҇|@ dYFJX!=(eK6x}&݊%;{ΚJ'7`߬ TFVg b3uHh5Z9]B ix2>LJw-Ii7vwo69 l~xTLjM[\}v$NC)j#bۄ}Zy}-ˎ~[V] !J+%{=49x (,Uf}>8@kp3^@9 ` J,'pV^C|WzhH1I$0w*~.K NYXiFNuhA:0wq .AB@oa4A04WwErCPSt/}Ƅm v(پpyر(PtT`)luXvZ֍!)2G)7 0H pVĸn F}b4@ISZ\g3CA.Rb -KjbNфJCk$aZS&TT4-6]א *)?douO6hi,f;dmAfD]S@U3nI]' -@rz UK^|= zK2+"U,_Z{҂<u2rʩj 0V)>T䄳Ӛ<&ksʧ֪ VF̴#́W`)2L-L%fPze Uڻ$_`F0YsA>'4gT"Gog:aаJ  >hZ>;xY] ;|@{5V^-\4FZ+P8A -hHbMuMK?e&V$RJO@M!Gz ߩaj<eW@ >I_oRϦc\q ;_!E,#-?VTWA h$  @ t 'HOW,#:1 o4 HO>R%kNa;0 N^V}_~=Pcoۃi)4 dL%K-z\4 VItk-&$)fqR&q$; 'Tم?A%u_J0a@Yj$ե`Fe o*^$/hH`/0T+E U΂cuhHO,Bh)O+UAFvP{ܫ9!R^ R=3#*jj!XZVX 7WBY,<==jlpT\lb#:[N *SHgkezTNX.JuvV]X EW5-G~Zٺ˒`78!ΌfӸxIVT+e*kR`9 =\7rCBNDj:brZZ3SG'C7U<e5lFH$s,afXo+m WY'ZתK# Oj­9G nRt>UUuԶ[ -!zJ ]]{H5X*r<RJH Bl%AKWm\o6`wY w|-gpU8jQ:X>Q %,!4T睰iW,}GxVU Q@3A PF pMل >hեA9 9'+ N_\ YO(h HZiz'̖Gi|yFEJr7p7 : PL8}@4;r\U\f > [ن.6T6:#Y %zWk(}n=HSܾ }x.팍4فFn? Fnj: nנbUW(Ӳ*=&c֕ d4@e@Rk.) M'5@T>a$H[qV)R: RsO % ,BRB XPu0j #* :TdJ߽J;Pellx'1^͉ ݎ8Yo. \S_Ó[L5IUV۟?8=zMb>jjo9wdx];,uחJ59[(D>n~tpb~Oջ2QH*|F:khgnsRh(DuzoSS{͔Z:.hL 5L24*xN~ NRu)gKhTUs]+#,g'2zM9]E| !}wuxjQ{=:l<2ARdn|K#52\<2}neJצ֦S?{3( ,cd:6*Xi !2&TYX,L-SinQ<{@옇`6!vr44 rY>m7/he ߃v!!pld-.>A%d,Jtփ&v]&rQfK].K@n6XrЊZL"<2^J6Hus}Gu9er[v6rFYZ1Y!,h^x~& `2=J'p͙˫tmv b7hi`ӚjGќoVndg:cq\VֻwY2&\@ oZkoj=־=.sR$F똾O2"rpJ~SF!66K^n zj6dn>xD}H MǜW['n\Qmb[N2i ٰ\Z> u޳+cAUċ=ءy+l}- qjqy*5C$\~H>=-SRv?lu+o2\yHY0^9xA?~K 0aB/RLuxԌOxg' ~;9hCr]3O1[X [{~g3!]hG+ӀVWzZ> tɚn^<j/*_wK.7I%`k}xAD]੺n47h`>= ~-Y6/L4Guʃ x޻4fPM^}]f+ e|"4E7z{'`q\7 #YCtr_P}FSg|i^d #n2+ ojsܪ%ӫ]& e``Y9J* 22,-ӈy!TZԣ1_vTмğy*Nx0o$RV2=9b&`>amJ@9j:٫Ƌ3ɶجK0_{ bRe5P&AƷk3@b[mlvxxp/vCY該m.#O]Qws]v]FZ`$_U'osmLs9!e2%~5RERy""KF[V[ښN&J;0jX⿙RI&VFB2Cr3g6W =_e|Z@ kLLLL/3o-c(…I~k3&ff*^!m3gVfCx={@l9<^ =<g0D;{Qt[ۣ {V%&y?cɜz2}&>ZNZ m|AA`-n脋`~U3ʽ 3N 0{62*H7ye%+04tihd)(&%$1F#Vb `che 9R`/^Og7?Δ6]/Ϟl(e:1|>hHs[A>z/z9ehm8@^9fv2X!]O)Z ?5JKׁm @5b>$@@рztTWoϊH_g#=?ԀˇN޿UuBEO}?U7 !ќ}z}:jmq^xm ziK\ m ufO7+!HZsO>m3jjԶg߻ Sg|u^S޲Xo5X:i>=m^#|PRN4R̓?6Q/MAvU9ּ5lSlAv%s = y#\ڹ!|=rjZvʩgcjZڏxǏG>14wW+k.]86ΐCj 9AL,؁H,Mo'$aq$PV…As!CT5J!S=ΉMI7VњFKfTHA?W;34WH: MJk-Be{zgo|$^>uLU1w2',3$8x G=~ћ>73NM$G9{< ,3"wZjw\*r=EV_x0(x @6HGv0[>ˍZo00L@$L2)i8 d5W KIBJttie8:hITv%pZ/ Ϳ1]A~;փ{ l2̻Oh/*md_w7wl6p-=+k0{CT!F ojH7c M۸Nk=zc.w<Kz?J &|nWFF{ݻ|'UA#4'HQy',# :1̓ hʊP?RT!pw)Wp^kO囐9!-gZ%bb)JL7e:2@2{Fr לf:ZKf9sfյ{U@ ! H$$%  w ݪrݶ9}tgbsc!oϣ':Nnp;\@#꫁'$ 8jLX6D͵#"  vT0?QЕ3,塇 Ti2xjшU[a\v+v ^c RmfiN_"E>:r}^0vaX:464{vx:駴kZ]mܖCtZS)Sv}k\Uz7Ũn-Ҟj.^G!de=K.Bu'vXiU;Z5hy?}uEW'Y"~dKOr|ml$]oZ_iCDu5 6Pd" PfJ%"8On)%yPJݤ!gL109 J'} E?|ؒ^L: |Ogɖ"gHO(e0H+K FFf d.͏+Բz@)]BUz~Wҋb*iSڷǎN?#{Uxgy:TiÒ!bdcg?)m7w@?ˇo* ~遇 CkLНSCϟoW&BM/o퐶W} FqXwL7\,=Ѥ]:1ÇhkPbŃLr]DD>/Wx@ Hc\PlS1@XXOXhGd;ВX d>&J#)kP;<B&h&-AI_F|&1\ E*;P o:ޑ%腟|Щ FC/.tB aI$Qe%(>PujaL3 tY Z]?U,y^6.TYpxy\qu:8=8=8nG3y-,䎘6gz>*сA98ACC͇M܋MڧM&?Rϕ+Sv^wOW=Yg {S{s/J$N{'JtklTۗ;.+XzS@=KK4åJm5^_d?E5ܒJ[@$8֨zb`LcA|O-S>yvi^e_=ټ$+D)>/@3ύ$]Go}_ .A;]v)!lEhCNsTQtF f6c@M.rl-P2 'TVb_eHbH9+'3e6^YE7z d"pBtYfh#G03ib+ nF<& x/0JAbhE!'}:ZT%: , HofSIm2Y- 2G[ ߭H WnU1xW#~һ/Mx*%LRR:뜯s^51cnj3 Yh{ @QPsS)4eMbWo0)F  r;ŵiJin:/ w,f8iLPGݣk'}3X/`X ?(PѲM+䱜Z~)@ꝷW~@ptT߈`c<(L5j5iISxٸ:R^UqK,ړn:WW-m><rsM{W|['H6=K5ɞ!J7L8>05Ѿh*}d4Z_Z.plLִ5ʩߕ8]Cty ήӮpᡧcw{%Y;YAȱ-Yzޅqn ֮6 Ln`ک BN1nt6w~Ui* 9h%X,?b")] =,!TKnoJ-i/^DXjd?5 tiR% ŒذN*K.}␵-}UAh=k@;mm ~!xz jRUj+A?T+@.9!): r򑬦7 梁K/rQyIululh@7oa(Eg2GO'|7H`[  ^z[_7Zq(Ԉbzwv rP 2$}TiC:@nb $˟R Y @ƒ$~&_VD-hXW}I%dt%h+ d!IW@ i-M Q:ܔqK" b?$)D2'FUd =Wă: сI$P5 c#<|d͔=jݭ6Iّzm]+_xU|MUkW6#eľptMO qbk t8>Zu_ZPO+Da exxlxoŢkA6:=|w72PKӶڷ u͙Ҡjj2;=̋ͺ 4*xzRߪctɨP)3{gE1침Q> O\Aӯ@ccoqt7|VKM GJ՞c<&^T-KڑgՀS5@* ɧ PAKor_0&?@HKS/KIDAT7Ht v6HUI&@`6@+Cy,UZ{VY!$`.'Afti/Y ҄߈JGtD5+YE4-A&S(X*==@,O]!)(Ta@SrV$2A*9~ȩw طfe^J=ɈYs.޴kslۋzPuσfɹ7E/L G9RE/d~dP\pǿon~i53CA)C~J%sg+VoSΫ*iR9="A_P ӯ▕0;aSm4W|ޟj ]ζ|E+έO^ݧ֪A?Kb$n];9s65ue_/%=w~C>m)´ le}}Q0[cj:o;#!eʛzO@>Q`(XP7" ?pG]&7*ju8Dȳk[@w_:T<C֣Av~~O3- Hry$*%<^Lr#(p^pEGF];8H>FR K8A45 i<@$?Y-< LH>7S ݸ@Dnx#H^R':Fjf,2b@"nKHKZ,きxX [c桰TB ~o@A$J'hAMQǰ退&PF+/E ZN׊ɯ<Wu9o*kcN;*@=;oS3K2IR]%Ak.fy7wjV&%:mTs5Ä+Vvʢ:7ZnXWrCAa 3ܑK5XLWaJ#]]ίU,$AK|~vʖ,EsjZx0^qRE;I_oZ-XMPuF߽>`ml]BlߝN`oj}滦o!agVS!rCk#  *:xJUA%R's!k&34c.ZP' <\02MGD hn.U6R& u|J$^wAe)F"w^H3-~+,s iFVD "@+%YB@JSr e(Hq{)EM*dJ+|AJF$?mt~F@4Jjx @Z0 % @B+`-$_J7HcY %[p4/n@z K{r)L4n+A#lZǜ96gWmҥkü Ṋ?3X3Q꘩3\!r[փ=?yhIs`GT'"ecŒo[MuSݥi%ļ̲K(q;ryFw9) Ic?O)_OQ3=.XR[P*S( ( XdZ G%AX|k>L/j JkđDEpdž7ܯeߴf(!LL?.~R0wu S $P2Y+*Xwx\㟮Go.R,lV>Z`ClZc}nC!q/C:Ǚ;s<}y2v?<v ; P| ԣ@bdqm3@S ό KnK8(L,,t3?z( $AE E-*Q dD@6S d+5AJ x@RJJ8ñtRJKUgTiDk-*Rj4FH0XĢ@7 WKe"X?{-Ns/CsnQݛys ϻwn  fs,ޑ|DsP/J5I N "5jw${QSSrP-WY#ðh$$.KMʨnhjlr1vT 3җ ?^t22Bӧ/TtشCB,} A=o;?}uH&K!GS@N <7:W}-عh^7oYϯS`/L뭍ǁjW 7EzvdӡHߪJe+/H @5MLU'pHWj7>uu*U_\,rm6اV{&=j h7M5@{)}/O\cS])Pl̤_*/&x=@Su'd,KQ+Jd &Q|ʢ; lsT*J r>^i gܠHL Nْ$:T-ܜ/ŽOn{djCu~踓W8U|QK\iyVR T.a^/n~^mVZyTB̭99CKYncMTKGj%Jz'C3;fJ"5$HI=x|ɝ0IN];A@RؙK`c k.[zG*,Y-{1%Lm8\vU3Ik[^kԁ;HdujP2hxg<@xI׃2V$ c5BU+k83HmV쳷w?P ;<ӊQ?O,h@tFx%H0ƈ'Mcbv'Pu_ TZTeo&N-f6+2'No[;XTWC GI@E~BAIQlP$ll o34 U0rx@TtE@ (f%ކrl'-@җ YBQ7P@mCi牗CQi~8?¹?d' .+Sv.X!9i;]ߜ/ZvMz}׹{h ! ӇO~һz2=N !өN㪫#5ď2ם>9rvϷZ^R/ҊG aidq Tcq q5(+L8C t"dtdHS( ǂ{ttx酗D@#0hB0׶LXP5!\vXNM@c7Sܝ |:5m5B1#uгF 2Dj` 5+P5*JI" @a0*3l\:5G<˃si }r:\TɂK0dC6!VTWwgJy)¨k `&@sZ RdjG :$ny0#~mw; %߅Lw>i5avPpz? Ajdj0 9M(U\ʬ+CbЁGFvс @3n7ҏ `;V=]a1dk\⤀jv \;>}އf,`Iɛ&}gwv1O_>,7xeLOXLT^p4w38Nx[5gP>^M;ma: AgYoIS9ȱ LglU&^@oR'Hˎu6w>q*? _~/3jWŒznB׮`?^l8H^ $v?\ѾҾGCλc jm@<`d˶(n2O+m^r e_|᫚3@\ҩBW=U]ZQO(E1>+gbh( 䗒F&;(i1ޒ-b'|]||z9e3g EC! Z{@;2+H tr[D9R0 ER>xL6fY9߅o^_*> Pas?6φ jjN 7V[(Pvv4<sSS_}tq}~]iN :j#vXЍ&y~"HQ1o`pkcj^F ֟n6UY3\{,lq8>yYpףΞ*T+u*KT:PK՞/X4 fVlCF2sKu&MĄ646F#z?J8){x b"Ki)IXۏߔ} r6;澜s.gΥ;éz\[]}^6l??7yvg&UˊvwPS]U%5C{!UdVud<.yz0 빈;&Vqs~zACeĐ\^oDR'9ꙿ0O0w79Tu3U߯fRKBu;QGftiKaL8*rg\Rޞ[ HUG@ 4!pV@ .f,L6w 0X:~/@kJ>{gy xQվŖE#\?2o5w.?> Vb! DR@*"TBPE4xxGs@>0#R@FHk2A՗qqGg#C+'VJ1f0=Scvf\`gO Fȗu)>о.TU@߯Cxܥz;ߤ0yؒǞ=IRAr`a^jP}KRyet7D@ʒM2k3&f02<"F&2:$$$UąE]S)Uz8_K`XWǙar GunyXwyՅs͋^o{GOV.o1kIOWkŷ-<197֞,'G3?:އ(#ƻ[ p/*@SY8TJ(-;Բu`P N8|Uy?:6ZXP"% -:5Y9V1pT5}m9i9sڧ ?wf@+jW fТr+si$vDtg6kwMAFDc8?8s@rdNkD7*=_2Qʪ \YgVA 1bB@>706l-#-X+k\BW| 5Gu o{.SiRۑw Q1Wp󹾗K߿ ˧fV_\1㤪*hANoaȗ^rTBQ@/oAzU^1 ZZU,ԧ=ȢEN# Km@1IRy^H"*-:sSzU6 py Q@y$dhJS`vxUWE`+_Vpp_OT3t4Tz3 {S{d}ٰz1+η3 S)ԚFum矜;kݫsQtjH=(e0֜m-{07 DYog`Zd䗿;E*k` Ry \5W 糌A`׈Mw\9`$pRuP)0yLĂiLQb x"go_@ 'U!c 3|d A(e|BX= $SG};[[C-~hVR8vo#ٰ+equwu5Ig[_oֱи6ȵ;b.hml?LPwN;4c*X=Q&4z, /6s"2(o&h(߃ĩL VX{R0b5R7H<b^Ѐ#O:K#Wy@ey Z/ӗ h!->pZ^89́LvAk49rOl}_AXvSĤCO?tWwtйn~bšv;k r\Kl`cg6QTXnq~?|bݟ4I>o4A ׼a1K^[fyd)].`V8uTmU]u~twv}2#s3NPc%o>t-9jutHg)oo(Xv4kW<>!}֦T؞VR2}A}x%ăi_ yK衬u%qz_v'XX>g;xV_yFUfrVqp;uk@^b1u㤏  eA*5[ AvG+@X0@#D0jK-qgjhfֲDj}*n*e֫mؼc+{pwQ$W6hTE8(R⭡r@{5עUAlisJj6 EԷ+fHU8JQ]-t3pvJH[{6I%@ 2 3|詨tk+cYثp _{{[W\jr#ߕ27PiŇCT6-+ܾ4U?G-'wT ٶ27#iJ04sB?_P`*{*]9OkAMTf]Nl?"ێ= ,230+)x-j-Pf鈴r }l6xꭺy*x-rsr /'_)L 1-j)̣8+E]?j@Z*#IZ;XwjLE5! dI'NP_D7d 42@K>= \[}\Qe -2soԷZj`X:k'-/ rgegӁl+U{Іt[x~QQ$'sXJ1o2qP0`/n!]dmi~?qqW6f׺ ܋G5J&<N/M ~@}eMm]jt~Uw%ID/LbX#:іt}n2+Tj1A xʂ'S sGp9rAjckGmO.ݘ7\.uOyv{}SS~b In-4,_!p̶ `>*]0Ao<192.#UD89ҏJ>N*cTPVUv@)Wԣ6,vpT'aD${l{Hg62I)#_Oٓ f 4  4}8+Y:E"K87Vi[vվeeߏ/z٩sg>Fxcꓶ l|OAknibIn?՟xC+&\fKKCSج rUOBA>6qg]N7Cv'B35JQaH.6!tPN]F`1v#^}A "N(:QDHy!SZeq 녏>[]m]pf#{MXk@pz$!WmsU B: ̈́̊鎌{68w g-pstseڐ7(+1/~(Q7s5k peNۓ~}Pm&YҊfr>Ԕ$%x#.2N%N֘[5h<-b]̆ Ϥڹ['WG{o0 ["/L+ hٖ ѓAJwydZmTL`=@5u *pHm-L2-K1o{VK۔)֫'N,S,bP!VdWdq0VO@~1L8 ֚.Ϯ@òkf9Ug骩⹮Ϋs\Y?|/oxD<ķqj"4$qtMi]25]y\2KXsQYIK[ns8l~:y뽝lbZY f?ò~S˳&6ߖq@"Nj/`xP(X\hx|JU3*^=ЛUr =̓vwWPUx(h$!ۛ|xC5@*P@. klCG6\G+U6TԸCm'T+ڸz0H>5M\l ^uy4Ԏnְlh;N!bmĈ'ݽr~2e_t{4N6 ov;]iZ|x} pv2z{6zB5V=RrƕF; S_%1;,eq;s^li_`{AjwcE(> EiY'ȿh ܻ^o#<ɀu%U5W+e߁u=,iGqK}?,({# LY N Y(xOP[ r,ٚBƨ!ຘՑ|[ 4ӖO%A!|ihtY͆IXH:r^綃SC`.]x+PoΆ7v5~( 0\_ћ6IE\*JIWxC+8;tW뿚¶lXv BD6 -?zuCN,r,C5|VێkV?ӌWB;¯w<ο &sndj*?Hu5KA2'[9̃*?}_o3Xr2U3@,mіjfnΣq[j`}=̝~<=GIx"jb H}##S 87_pY4#5CuA '`R׼;B]#{tPƽ0w/eRJUzĵ=-w}7ϨΒtL |%fS 9{O;I R7{3Ԟ~,+I )4֚Hz=PgMMxcms|~9~ 9h K:7=W/xXv"–=^sKΣ@:?2x5u إ;ط  E;W/\[?xz}}]P?8 >|4̆EhFÌP 4~ # xs0^}͉텄BO< {-(/=|oD}vM`κ\vyy8 /O>v<}7S`zfղcpB]j0Y&_:&oN?I-7:t$6 0 륬 _d̡H 5;кd󵧐g3m/t5*ۇ ^“JS=THWYOx]o|j3[pmrnPe,O3fS>TPq_U:&:jf{tحE/;ƹUyWfp 2J_E'R^Ci^\  >4KYx W\ԑ@DvR^לW\'^@i2+pz%( 6rv\( DJPT%j .q<ޕGzfS땄*{7U4RtR%a&l Qϊ:M,ZƃƳj3S6G*H $z>u4fM[aRGƟ+ww s X0pyc !!rsfjпћy~} z[<@&j>dI ^/{ ~*P[5`{ ZȔ:@mb\H.צD~D5c!x3)QMɊG=x޶K1H0.mx~i)zx;45ֳV55 ޽q ը޷eu?}v]g{zɍjYceLNgggu [nAORccvd̖oQ߱ݙj_%܋~I+'_BVi+2ynEyKeFpCcԯ3dlt."?7|F^pÐ6&q\pNʩpST.$A-e_Ou- :2M, Xdʘ ҆ \ t2qy *0Um1d?" [UIRbJߜj ~k딬: 'mluL'‘t߿N]^ἚCsw_#=V@sk;悋)WS@z1su7c.6<;ЎhE%$Y~ H"+#ŋue'Oy>{Spv&X;]hakIThP-՗_s@^ Ӌ=t4@r D&]=&~f_ʮyRˮzחZiP^_Q֫QU3~ɪ<3+g։ }_o:Du?;KprG7y O;S(.MB ^,TFn~G*# SgZ_r;f7ݩӝ@aJP0cKOL |Yw1 $?ctƃqꔤVqwYVmxQPǬ=RT2^mRqKmp}.WձL FH\ j)Hّ:x &`|6΀.j29~c_~_ߡе6l[AK׮ 'K^u/˛P9F9һfqLT n%vwI|>v)+4y?,N81_6~M.T:ef{GqN;> a ~w$I{EI#u1$[XdF7<4B{sH)Mc-r3d~j ?";VV@8!Md@x4XwLY W}8 #]q "D jꤾBddK!q 늁Wz'gwϟ[XgO@='B9@VNvVUG׆jZ/]} #Lc-4>[2T=j-x=^ )QHP z)]!Z [-C_G3mmוCu&T}=YiԠ2 jZ_CF<WpNʴg2He9)j1H ##Ā+ 1a5O* xpSS58&h؁.]@c, ?|W9wZ>o( 3#ē3yE_./?qy@pz1͜f|ߟM~}@|L>5:dvT[ٙ?dv_Ϸ, ݞz `(UՊ A9;U yEe$iyԏjopVg^[W2;B:Rߓ[/.{K^a~9 (X1jh'?w$Ĥ5r' `TVH/ot*$!| N^{(x; ƀzBQWt .h$[L>r!?PyAł'Jyӎ8Lzw=CLXuqx"pS=ޣ3 No{k.3:9_<w3H5C jZkV#rR}2 P B'PHS*'r8r j.Y4+caB.ChH9"`.N[53"SNxΖU P <4\24x)S2GY ĒKoxK"H'3!" v\,x ͹Χ|0ƼYGݦ/ W _Ueu' _[`[+8>4Nz?#4X/{RAyϦZQpf=m8: c~e7&$%n:Y}7~}.pOSmI03HKPyU}# x6~P$LOb?[w9t,[@χF菠RKYK +WN_sPZj(TZo@?@ >g6+Jr`c\GŎVpހ؀=m @?"̠|Mbë$#}eDApYꀺ*{xܓFH:y0P4{*!_hW#?agDCT nU`҂< QSs פiqn[ĭ^?+;M4zD Sn%ua=|(&حY O kݧg 榗~g]YiS^B򗜱W/=p|b>ݩܮbh6GZ+OKyy-*^%6 ( $T~%PHI7-~ i]yfF^<$ HU7&OuPU oQM@[yC7pir.pnZ|"$5i_ {Qm$+{]r{PH2z DApXDHz?U˹{y{Ξ2A-utwW|f|کtWSDUUR(4j2/[e($E|D-t'_MxW:vzS'N*@p ;d sm{hubnx0gjU*TO9~Rr<9lvOփ\r1;>}JT]\BĔۑ[Q=kfV|[O+:ϞW|5+d jJS0;1oTEkZU7TWS~NuBãƂc(@ 7|e1m,ؚeԅ5w"r'g4b6ZseP;*P G^流lG@G p) I;G^ɔZQx_2qcBx4шP|_ArV Bװ2~u,ו*ZXN96w <чԽ?n/'ۨaz15yϻ]SFy׬X*z8Ye5L`z^ 4փ T6"w9<ۚ)sOV`3(.hp Bg $qҧn ѿ7M\S{UO0`,AqJ?i ]!Ks\ U}ߖ7Oy /_t5%cdiG m6C9>_D~9Oz~ӡI pk؂ѠtڬyeIȄ|y_c][< (ۨ,-%AmW><>T?P7j^m = ~#+ 6 rO;~ρ(o'G!m = TwEߟaG")@:ڞ{a CxV܉u R0<@U#n>C#=?!) 9 A>`H~;xDM>",\vI.qfiđ u1hfoi;pgF׷B,PXF@\Z@Z$wJm0jսa[OZ%7򃎹~ڹļʛ][} }>~ֶ,뭉 Hmh%eT &<-^] ˬ޹s0_'C/vV4K_!Ù/<Mtٺ6~Zj>_R@Jū$@]FV^Bu_u x[恺%}#95O $fZE/~5ߣt_5vc[Ue~4NoSgSwFvSwA&=;Zm;wM0Z{s1X?'^2E}bT5.౮[T >H]>f s,T~JUlY=~U-{ߙ~ |'P]U_<uJLML[S k :*Sb6HqeI ? +BnĂ%ȧ0-31C *9?+xʓ"`_W  $^uy{I%P8Npfj(^17pE]#(^1 Ǥ$_aW:iB.k:mg )?Aj0 ZSEjtBlw-h,"B-~m<{/KOoԁ؆ŕ}/䭘z^;i5} 2TB]_~JVe`}-i3aniM=7brj-qo}0,.C]A>/<{k % 8O2QQO#16 /!-|D[APd982\e ~u{/^4zߪ)æ׺v{NyWo^֟XpR _;2όҪ}U3 _F{8Xs̪pbrݧ zjie'|,fUS 8xu wwZ.I'r }K_K<}y,8HG z\[ t:jMoFZcS BVH<;~/d93g΄aӋ*!󃞂\wd2^vII{RAk-v:ӟ pŸq}'N!'B ;u`:M@:A׀[mXȩnpFz:K K@hЀ`kR꘶cd 9|a3)E흏7}tFyLH p٭:94)rx߲fxxTO2y>F?kﱒU .4m08GSFz"}6Plx4'8 rEʮF/eZ&՜كE&cbNYՖ!+n?IײXΑ9sfe eUk5,mlwT+R- ^|u<;8[zl >IyA) *'%|v!К, u't]yʹ+_AAP0/ez%ot˝!nHy۟\d(CaFww*7'-?3*OO+7S2}"р/l<]_ F"q'4%d8y"n@O͍̟B${2=_S6Zw#HIw@]M*0yMr 8 S.сt'`:+8/eyyɛ 5 I/v_8H |) Y-(Li챆[}w_ˀRys sCJ4{ ` 6f%2N |SƦzw6]3}吥>ֽ^+c1P3v`.m<[iFߚyW!=5qHR x kWs@WJ,GmKt4$P{#@nIGyrR2.XvriCrNI3L0`&`L9D"crNB$!RRw?hfLw{U*Sӽ{9{X+vpi(,b?coyj I_̆G=Yr%)4>({och|hrn.>7,Z~|`T_W]Kó<?orxTtGtu3`%)y/NH? tl_qqupwLhۻ9з;O]W>_h[6A'~p׏!>~1a]姳>^CSXcDOIH) Fq^ $4\U[]+9NgP,̫}aw/vb }孽Zn2q21 1Gy2뾼-[`#aTz?cBN;h<>)Lu,W/%e-v{+:h*??Zkz):~]JợBx]9?jgI[vcc-'ML[w9nSf}7FNcLIx*RWS/R$oO>r+m zHy|pJ_]%Y]ázJ/!|67uo=Y^|s5hl>n|,JݴSi߁cƺp0{x -bׯdPؖԇi +ƻWQpڻ ([W7Hlj4YMɐDph[ħ+=2P;I#A;BB[Ie#B-z@ /Wo־[ bVoxe6v d9p+DаR-m^B%&FzAW@yD“w݁ۆ4}Z!%3萁_ܔ9oK{̷o-[kP*(W ŚY,F}1؈ {ZghfR>zĚW(wqi )6[>6qoVYQ2 膆 cMX 6țhmbbXz(nrF| VZAQ*w!6b*}V)$o9_BnT)p8˭P,α`klm-Q6ČJ[yG7+:>s/ a=NϺot}SQ =Ex*q3|~ hQnصBB}l$c& ر@tVҞ"?S-}t͟usW2Ɛ*EXzHKM Y__l--6xW&M A{ïn_~ S Rr~yfsII0x Wr gy#5oEL2[kl,YeM S֗SRQܼ2v~}j} (k5ASj:jhwc*F㩣28.;j%p`O^Eߣ~_x K ^lJ>ڑ㊞m']3"Y ,ss]Gy,\XzJi0q{ mI1UTїzx41J e?qk ݍ!dNX`=(m8(1LF˫&@DO=ЮFh:I{J>vc J_26k8Vieu9cb PAg9 !XQpئc bRCC~XҰ}EϾ)F1vQ; ' S5n8Cx!tW]~rqw685?to>GOOƿq'h@&tTQg_SMrfN5ί9ܞ&vE,Ik|jՆ_$nhN=mo5+]4x_Η+pv]$cMʒ8u ?j}Cʹf3) ZcЎH(O3wԃz>=ʀ-Xѽn պO-ƧJ:9g/>?O 0,Ġ dSTo 0O5kEY`c;joE}}&&[WOAoD?Q_QVX34@<T (I]K. T <w"cQ+n{G@‘!PdD‰@('6B!sqhSvՠu.ZTɠmR*A_ TL[hu3A92h1>R+[6x7w/sرN Tպ=XFmQ{9r-pDl5Ii;A.UPbNU1(OZ[y}5ؾ'O(|+iHga3OIq\ @Z µ]kWzkM֐j9G_ثD%ZSnQjZr@s"=hyz.[$n=MAHb?Fr 6#K@*rz?ZU JHƤy ݕv%1XtQs!HL btOCbw@D3=,A iPQ6(YTmxkpn̡Cf`uAGQP1wGo BA4tu@IPP>#PZ'az:z;B.s!Xv/3Ŧͭ6+xzQnHRtG>?Q󙮏/lSClA]X {n1K<_ƀ<4n &SQb^C^J6<:+캶w{MܚṟomK_w9%B $WyLvJ4qVF (w ?_k O,rJ}Z\ T+G2~4]hujpn@m|9hѡE7򞴋[/~Lm z]e_8;}Pb)SiL;@0Q?z9BNٖ(xy@Zy ݦC"ݺz8(r&{RLP /9{9fu9 %.m[nc̀]yl 0NN {97+Z{{MY]u#P(h}r: RP;O_wlۗ5!{ጒ =/ۤqT6@^*>q ;c %;Aezh e=x@con=h_oGo'{ R罿:3dՅɅ7=q!h=չK$ǿIL2P!fVcUZA̐7qV|8b"sp0ˣAid@bsuKOjcb&]I#{/N)dn#?V43!'ml;\s8C[;/xs|QN}O/yFy휏d`:;$ԭ*,؉p#Ȼ׀xyލ_w|w|1CDY*w ႅ`/.̹:5`pS8଴ȓo2 }sO!%t qqX`\2]^7ᰀG9 {~A`4@ `!8JyGA) ̦1*$HZ iŮTw_ xyNtnWU„E!ĭIӚbouA{I;Xb%z>pWA_nZ>~n]Li/RjnoUT9`J3;{?Y .2SMIٿR}>}Z{-0[F;pDCB|A<6TkJ߿ˊL5 nn8j*{}e>􃱁%T;%S4W#;,f^ϠW܎iֆN#Cy!P'jУâP(dz_}kpY{@A]Z|'bYh@M|@,9p/ꢫTPP{CM=7o*H.SufAݨ?jY]7}ڒ@޾v 4m~yVvl ~DhBDHRnhʃXB.,V8BADlzd >$ ԃyV}UA|HS/?/sI_ |SqVޠ$k~Tރ.0Fsg@XH]Y`f2j[70nt3AwOE)+# pVlh|45bCcۡCC3x$Vb|3`Uy.@$<1x sN'̇_K^?ƓFa-?YDX`fmW_7 ~3*Kd]٪Ht:]%E' zHxD[vF*o`уvlõYWsK^ehdًZb" g63ǿUkIPTDj lʩmv%EY|V~;p65"Q SknyC"Qb ֲ?Eg_)yQ L@ܤ88D? 0$/g-x%W | 5(;HD -'Y" w VKFH&:E\@?J Tq7c%T1 <-i$cM6s!LnՔ~?FLҬ$Ks+/J79MWW4ge*;yKm>?\"74`grV܍:ai(ɒ=r FCaֈE\mi^2Sd#bŎNDSW IZnaf5/ϼ]Yq}eaXqLDv﹀>\?\ V.uU޺`=lci@.-wkaMn; AdXb.p=/)"u}p;Q$!=h:&se3~K8f)\!A A<5l8J !Z`H{)a6 # (/A G)v@]8TⰳDW-"bxf/.-|sQi= 8A8(^#Ju̲vթ[kR.>}}beeYgIJʾ'Tx7Og9d ab9cĊA^z{6v=MOEF}Fr"w*8!|gyd`a÷ ?ZëkW J-9_U\*utVPR4M@‚ #eQ. X {k?/5TKU`t{ a4_I_DҏN;1M4Zg+ B8 *n栂X쌗D {O8N@t.c}DC>zR[X,LAx,ޮq/gX21gnâ-: ;gE9d+`Sß$,Php[P6 H[O2kix\֬a߶·t:_8ʿi%\<.qɕ%ʉ@T A}L]IT~$Ȼ<_.ZAq+IY)J*D h#88@wm%J"]HSJSpNrF 8qkfQ H` wysDiQ DaJQ vIlqZvc⨳_ĉ8@QÛ۽2%KY=,R'''f)Yi#@ḅwdXzv~`w#;9|'YUzr⺰~?xTpR@$bB>OyF?m z3Vl͉29#ȳSO&\0%i̪pNetCCAǥپ>AyT+ =0`!|2N{>D"\ݧNEb+zJLFGP쩎K`.1S$SM0coh/ xO"uC>ǩ B=@uq}x?ᲀW]W$p ,uܢ "He.pЀ{^ yzp][Ib k@'09 97KIlBLWSmOu,!:*͕(So"/گӆO?^ľ) '|jޫ/D-]{']F>vJ؂NNٗ4ew'~ |?^e'cCRUn^>Eu3p`2VOnw˪&U\b"C:Ǘ~tIAM?( #kIFY:bOqX!gq`J̇Q@ijS"n)O@̐a`]oQ 搜rNѦkGG>@Y= u'|ʗJ fyfvho8-p(*7#كۣȓyOlvZ26ZoR3' Wr_ X$XE%Fr%&$qS\pڴȳS2i.ƈb,LbNtw;M>-ެ`1< xLm[.o>;yZ;#E`XSk횷k)Sz'YSO]{#?ޕ1V#ɨfp)Q}i!C|3ʯBJa%BeXTC ]~X'L+: 9[MWo {r8q_ϼqKJ.e|Kb^1x]n{ncjyk 2<3TZL` 0b&PYR~XD7JڦU-iG\̽ _M=s7oc=3HG $D9ʁJg1X̄6١W%xH. :yG^]zvPUqO@4^$W$`u]Ӎة =*S^W(!+6ʷb%ij{u:/HpgsOzKX"Y&B؟?x;, lQ{iKRZw;j "ۧHq?3ewQZuZ8!k.^:0C aQ.Ev:E=4ؔ6)ϴIx7^`{=3:hA"<雎Vjișg@Z0W2lB5z@ҩcRZB+plA^W}'yKKPĉU ؍^lK=+qX"++RtS *(K|BDˮ b>P`Ց ꏈb%rYEM3f":.Zqj_Bf7?Pl3#6%EU|~Ҟy9ھH]J4w=CwZ̎an lZ~(,Ia>ޏ3vȟK^Nh.>-j6"LRjZUِ7,l~cS9&-b/-[n8L)S=ꁾͭ,HMU%]C) =3RϘ> e %@dP8[NJTDhzl#KIT"Eo+:w6 2IgSQE$++$l%VWr3qOE+PN@Qoݳւ-~> ^ xB n_Ւ~:)*QԂG>L巖oty𷩕2x7:Sk2yu}Vq+Iu'7 /(&b$)$ 'EE )@֐/P´,uN%n5zwW$R}ʦ]S֑giy6h8KS8)tF;QIi%9rZR9ȯ,8^qEYN1EE*:=pQMQ N@>o~},>e6 q@*% r\[]Z@ e2̆yqpa Ǎp(mm 1yח-c^}jO(=~8zvs]Vcߜg?>"7`cX joUU걙DMЙ?3W.;q`ΊOR&I)X⸮9"6b:E܁QN+fH0NG-7gi9<$5Wy:O`6YRO.:֪qN[ ,m"P4Rk^4;庬3\~Sg ~ W@NUA0@FJopB0c]a;0(7EH۳p63ca(4YS6X gj˅nKZkPQNf&0X|@Ҭt)Z&Ӝ4aM\ݲ.AS{T| I75yzZZU/VPbKKХXKCp|y:N֍H{r -'۔)SGywe?0'y~!>g%?435`@MM/E_ǀ=>k [N}_c\rރоx镾6'8bA5X4ow^~80zLzSHP:.'@NttwF.&$븤&4&A0V QAԌVB҈7ް)nz煯 ?T'w7\Wucō; ŁNl"]ur(&Rr"A L<¯'y$":p;QDGSv;Ml2~HR/ț[dyYJ+2ة9}B5l߲M毊  P Yhx]2VΰtD[7"QGžUirq9bYL?hC{ !qLj;zr\w k#U=yoL)b[lgEy! #7ᷬrE=Y9AMi "n݌@ԘA _/hK YG f*?h DJ޿!XjY<|0穩rxu1 MltGwEcWŨ,+A;4mgy-y '&t|u5~P/(ܬb@fK+i"*c/٠kJh޺[}>f#7U}bi&"ǭ-mrNG#F/r:xU~f}@1 zk+ 2LUg[Uf=Kb3Q+%t%$6%~CB]Zw@q":^Bw_g"k Dx2%ls,})Kr3f 0((Ι}җhx74V>W/-]=k̺WWxx7vmK(G;|+K@'@0Y؂3Ob } [Mkgjn5+c9. ފ "YjJp̾qۊF\kfl/sGT後2 }-'hl`8հDߊ_|PJE,r ^.{8|p_z۱ͻwˮ>9h_1<1.j/ 't3Vw:F;h= yOOwju&`1O%-! %K}&y݂ ?ֻXJH&_Zx^2fLF"Qs5%i) DJYK)H?owRN-z]gLoL9Ɂ<&GS38/"d0x'}+7T駔F7K, yB6E&:Q 8-+]Ķ4Fq_| jzܔrZijbM CI qAg(kp1l.e-ݷ-[MN^4iY֌CrGw%b34bPw>8Ű%Wl- -e#J1enRHɝ6?z |1`3p_|yyZLhz58??뷩KJgXek,8A>6,ȃr<ƧذaG ȥXCQQ¼R'9GI%LV/~]•32g'϶Muw7k颵}nҭ=x`ϭ Q/ T.r+/J,!+xP°;`_~]-}ks ˹r\4Ƅ߿Cw}┈b"nr[R[?J쏼S (07S?:yw}/ʳV3UL@(( fwU4l5l ۩tC_ϓNTΠ\';RH eX-Jyr۾fY{oһV<ck$QhS~5iߒǾzr3N7YR}EM,"64~.X"䱬Sf-R'qі5?i|{1%|n|=⬡9IG|VS{}X򝡢~\r>~:IUbrZ!EunCQ}KѳcO1K&x@!-p+5Wox; ڝD;Q&,PPp,Oڷwڛ'nn͍MGms ƗFbQzLe"r+D.?!y*>EE3ƋQN)f(f8%)oZy_-o_fḸr˚G[]b;i-bkSl#dVR[שuʹ3[=uPБ`cgAێPX('7w CR.w)BׁX'(P2T\.+{_0>O`tѳ/cuQwtl5H(_/K $\~d$Z|5m{=z(WuSvzL8$'\_*C@EWj3l{mP?'N#/',W.kNB XV3TsZMMuĎWY%9K2e۾%6Y@ S(lVQMgѕrȨL^ufm^ꆘhifjK[jW29A^uhAoY l {=#hN[,-gDci.[,; w/wiҨ@!Mfk]&v:QI3om6~&?l zhhΐ!WFM*.T0s r厾wz{OIuA-6R|VB8]mArzRxHFBTl20Q3犹.Eۚ4#nawbhX֐e{2/e7"r72ZnX)(HќvzT.pT*ԡ?] 尬t?kow:iݟ"EYK2K4ݕF|񝺅XG?SvDiY%tEXtcreate-date2009-07-19T17:54:58+02:00uV%tEXtmodify-date2009-07-19T12:20:46+02:00KtEXtSoftwareAdobe ImageReadyqe<IENDB`luciole_0.8.6/images/luciole.xpm0000644000175000017500000002706711437126703015354 0ustar niconico/* XPM */ static char * luciole_xpm[] = { "32 32 600 2", " c None", ". c #23302B", "+ c #3F5B52", "@ c #293B35", "# c #86C0AD", "$ c #8FCEBA", "% c #517569", "& c #30443E", "* c #93D5C0", "= c #94D4C0", "- c #5B8376", "; c #567B6F", "> c #466259", ", c #090D0C", "' c #131B18", ") c #121A18", "! c #78AD9C", "~ c #8BC8B5", "{ c #3E5951", "] c #6A988A", "^ c #8CC9B6", "/ c #90D0BB", "( c #587E72", "_ c #23332D", ": c #436158", "< c #6E9F90", "[ c #88C4B2", "} c #8CCAB7", "| c #8DCBB7", "1 c #87C2AF", "2 c #6C9A8B", "3 c #446158", "4 c #25342F", "5 c #000000", "6 c #0B100F", "7 c #374F48", "8 c #8BC9B5", "9 c #90CFBB", "0 c #90D0BC", "a c #699688", "b c #5C8477", "c c #78AE9D", "d c #8DCBB8", "e c #92D2BE", "f c #96D7C2", "g c #99DBC5", "h c #9CDEC8", "i c #9DDFC9", "j c #A0E1CB", "k c #A2E4CE", "l c #95D2BD", "m c #719F8F", "n c #283732", "o c #324A42", "p c #91D0BC", "q c #6A9A8C", "r c #B5C3A5", "s c #334840", "t c #47665D", "u c #82BCA9", "v c #93D4BF", "w c #99DAC6", "x c #9BDDC7", "y c #9CDCC7", "z c #9DDDC7", "A c #9EDDC8", "B c #9FDDC8", "C c #9FDEC8", "D c #A0DEC8", "E c #93CDB9", "F c #395047", "G c #707D6B", "H c #669182", "I c #85BFAD", "J c #76AB9A", "K c #3F5248", "L c #C9D6B7", "M c #DAE9C8", "N c #6E7E6D", "O c #73A595", "P c #78AC9C", "Q c #9CDFC9", "R c #9DDDC8", "S c #A0DEC7", "T c #A1DFC8", "U c #A2DFC8", "V c #A3DFC8", "W c #8ABDAA", "X c #BDCBAD", "Y c #C1D0B1", "Z c #C1CFB1", "` c #B6C3A6", " . c #8B947F", ".. c #7D8C79", "+. c #DCE9C7", "@. c #A4B097", "#. c #4C6C61", "$. c #89C6B3", "%. c #97D9C4", "&. c #9BDCC6", "*. c #A1DEC7", "=. c #A4DFC8", "-. c #A4E0C9", ";. c #A5E0C9", ">. c #A5E0C8", ",. c #AAE6CE", "'. c #608376", "). c #D3E2C1", "!. c #C2CFB1", "~. c #CCDABA", "{. c #C4D3B4", "]. c #C6D5B5", "^. c #C4D1B2", "/. c #2E3730", "(. c #516E62", "_. c #26332D", ":. c #79B09F", "<. c #95D5C1", "[. c #9ADCC7", "}. c #9FDFC9", "|. c #A1E1CA", "1. c #A2DEC8", "2. c #A6E0C9", "3. c #A8E0C9", "4. c #A9E1C9", "5. c #AAE1C9", "6. c #ABE2C9", "7. c #AAE1C8", "8. c #ABE4CC", "9. c #78A190", "0. c #D1E0C0", "a. c #BDCCAD", "b. c #CEDCBD", "c. c #C2D0B1", "d. c #121917", "e. c #8EA892", "f. c #90C3AE", "g. c #2E433D", "h. c #91D1BD", "i. c #9ADCC6", "j. c #9EDFC9", "k. c #86BAA8", "l. c #77A494", "m. c #A6E3CB", "n. c #ADE2CA", "o. c #AFE3CA", "p. c #B1E4CA", "q. c #B2E4CB", "r. c #B0E4CB", "s. c #B1E6CD", "t. c #80A996", "u. c #D3E1C1", "v. c #809480", "w. c #7AAE9D", "x. c #8AC7B4", "y. c #8CC7B3", "z. c #89C7B3", "A. c #364E46", "B. c #9CDDC7", "C. c #9EDAC4", "D. c #435B52", "E. c #A9E3CB", "F. c #ACE3CA", "G. c #B0E3CA", "H. c #B4E5CA", "I. c #B7E6CB", "J. c #B9E6CB", "K. c #BDE9CE", "L. c #BCE8CD", "M. c #BAE6CC", "N. c #BAE8CD", "O. c #BAEBD0", "P. c #729281", "Q. c #CBDABA", "R. c #CEDDBD", "S. c #DCEBCA", "T. c #344B44", "U. c #97CEB9", "V. c #97D8C3", "W. c #97D9C5", "X. c #98DBC6", "Y. c #94D5C0", "Z. c #3A534C", "`. c #9EE1CB", " + c #A6E2CB", ".+ c #90C0AC", "++ c #577367", "@+ c #B6E9CF", "#+ c #BAE9CD", "$+ c #BFE9CE", "%+ c #C2EACF", "&+ c #C4EBCF", "*+ c #A5C6AE", "=+ c #C2E7CB", "-+ c #CEF5D8", ";+ c #A9CDB5", ">+ c #B3DBC1", ",+ c #5B7063", "'+ c #D4E3C3", ")+ c #CDDCBC", "!+ c #E4F2CF", "~+ c #586557", "{+ c #8DCCB9", "]+ c #9ADDC8", "^+ c #99DCC7", "/+ c #9BE0CA", "(+ c #385148", "_+ c #A1E4CE", ":+ c #A1DEC8", "<+ c #ACE2CA", "[+ c #9DC9B3", "}+ c #5E7568", "|+ c #96B7A1", "1+ c #9FBFA8", "2+ c #A7C4AC", "3+ c #CEEED1", "4+ c #A7C1A9", "5+ c #4E5A4F", "6+ c #586659", "7+ c #98B29C", "8+ c #AECFB6", "9+ c #404B43", "0+ c #DEEDCC", "a+ c #B0BDA2", "b+ c #A6CBB2", "c+ c #99DEC9", "d+ c #9CE0CB", "e+ c #A1E6CF", "f+ c #405B52", "g+ c #9AD9C4", "h+ c #A2DFC7", "i+ c #A5DFC9", "j+ c #A9E1CA", "k+ c #B0E3C9", "l+ c #B9E8CD", "m+ c #C2ECD0", "n+ c #A8C7AF", "o+ c #B1CBB3", "p+ c #D2F0D2", "q+ c #D2EECF", "r+ c #D7F2D2", "s+ c #DBF7D6", "t+ c #DAF6D7", "u+ c #D3F2D3", "v+ c #7E9280", "w+ c #D5E4C3", "x+ c #ADC1A7", "y+ c #BBDCC0", "z+ c #98D9C4", "A+ c #9EE4CE", "B+ c #689788", "C+ c #598074", "D+ c #8BC7B4", "E+ c #81B7A5", "F+ c #648D7F", "G+ c #A4E4CC", "H+ c #94C8B3", "I+ c #99C8B2", "J+ c #B5E4CA", "K+ c #BCE7CC", "L+ c #C4E9CD", "M+ c #CCEDD0", "N+ c #D3EFD0", "O+ c #D6EFCF", "P+ c #DAF0D0", "Q+ c #DBF0D0", "R+ c #DCF1D0", "S+ c #DCF3D3", "T+ c #BFD5BA", "U+ c #161917", "V+ c #C5D4B5", "W+ c #DDECCB", "X+ c #AFC8AE", "Y+ c #C3E5C9", "Z+ c #A4D7BF", "`+ c #7CB4A3", " @ c #6FA091", ".@ c #93D0BC", "+@ c #9CDAC5", "@@ c #5F8477", "#@ c #91C7B3", "$@ c #9CD0BA", "%@ c #6E8E7E", "&@ c #B5E3C9", "*@ c #C0E8CD", "=@ c #C8EBCE", "-@ c #D0ECCF", ";@ c #D5EFCF", ">@ c #DFF1D0", ",@ c #E2F2D1", "'@ c #E3F3D2", ")@ c #CCDEC1", "!@ c #2C2E27", "~@ c #C2D0B2", "{@ c #C6D5B6", "]@ c #9DB8A1", "^@ c #C2E6C9", "/@ c #B7DEC3", "(@ c #618C7E", "_@ c #7EB6A5", ":@ c #72A495", "<@ c #659183", "[@ c #9EE0CA", "}@ c #9EDEC8", "|@ c #8DC4B0", "1@ c #5A7C6F", "2@ c #B1EBD1", "3@ c #9BC8B2", "4@ c #738F7F", "5@ c #ADD0B7", "6@ c #C3E3C6", "7@ c #D2EDCE", "8@ c #D9F0D0", "9@ c #DFF1D1", "0@ c #E9F7D5", "a@ c #C7D4B7", "b@ c #53564A", "c@ c #FFFFE4", "d@ c #D6E6C4", "e@ c #455349", "f@ c #97B9A2", "g@ c #C2E5C9", "h@ c #C1E4C8", "i@ c #7F9C8A", "j@ c #8AC6B3", "k@ c #46655B", "l@ c #9CDDC8", "m@ c #9FDEC7", "n@ c #A4E2CB", "o@ c #90C5B0", "p@ c #628375", "q@ c #6A8B7C", "r@ c #BAEDD3", "s@ c #B7E2C8", "t@ c #A6C5AD", "u@ c #BEDBBF", "v@ c #D3EECF", "w@ c #DCF2D1", "x@ c #E8FBD8", "y@ c #F1FFDB", "z@ c #979F87", "A@ c #515644", "B@ c #A2A67F", "C@ c #9DA183", "D@ c #FFFFDC", "E@ c #DBEAC9", "F@ c #DFEECC", "G@ c #758876", "H@ c #92C2AD", "I@ c #C0E4C8", "J@ c #ACC4AA", "K@ c #9FCFB7", "L@ c #3A564E", "M@ c #A1E6D0", "N@ c #9DDCC7", "O@ c #A8E1C9", "P@ c #638375", "Q@ c #28342E", "R@ c #708979", "S@ c #A2C1AA", "T@ c #CCECCE", "U@ c #D4EFD1", "V@ c #C6DABD", "W@ c #7C8573", "X@ c #36392F", "Y@ c #C0C498", "Z@ c #F9F8D5", "`@ c #FEFDE7", " # c #C0C49F", ".# c #CECFAD", "+# c #CFDEBE", "@# c #AFC3A9", "## c #8CC5B2", "$# c #B6DDC2", "%# c #C3E6CA", "&# c #AFCAB0", "*# c #BFDCBF", "=# c #728977", "-# c #96D3BE", ";# c #9DDEC8", "># c #A2E0C8", ",# c #A6E1CA", "'# c #496055", ")# c #576C60", "!# c #6D8374", "~# c #87A08D", "{# c #617062", "]# c #677566", "^# c #697566", "/# c #434F46", "(# c #B1CAAB", "_# c #F7FCD0", ":# c #FFFFFF", "<# c #F3F2DA", "[# c #B5B894", "}# c #BCBFA0", "|# c #C8D6B8", "1# c #DEEECC", "2# c #9DAB93", "3# c #9CC5AD", "4# c #9BDAC4", "5# c #BDDFC4", "6# c #B5D3B8", "7# c #B6D3B8", "8# c #C1E1C4", "9# c #A2C3AA", "0# c #A1D7C0", "a# c #A0E1CA", "b# c #A8E7CF", "c# c #5D7F72", "d# c #8DB29E", "e# c #7D9B88", "f# c #6D8373", "g# c #6B7E6E", "h# c #819481", "i# c #A0B49D", "j# c #E4FCDB", "k# c #728776", "l# c #CCF3D6", "m# c #CBEDCF", "n# c #E3F2C8", "o# c #939477", "p# c #84866C", "q# c #F9FCD6", "r# c #D9E8C7", "s# c #A0B39B", "t# c #AFC8AD", "u# c #A2D1B8", "v# c #9FDAC3", "w# c #C0E1C5", "x# c #A5BCA3", "y# c #C1E2C5", "z# c #B5D2B7", "A# c #A4BAA0", "B# c #9CB69E", "C# c #547266", "D# c #7BA08E", "E# c #AEDCC3", "F# c #A9CEB6", "G# c #748A79", "H# c #6C7E6D", "I# c #5C695B", "J# c #BBCFB4", "K# c #B5C6AC", "L# c #86A28F", "M# c #C8EED1", "N# c #C7EBCE", "O# c #CCE2BC", "P# c #C1C493", "Q# c #929475", "R# c #F2F5D0", "S# c #D2E1C0", "T# c #A0B49B", "U# c #BADBBF", "V# c #B2CCB1", "W# c #A6D4BB", "X# c #A6D8BF", "Y# c #B9DABE", "Z# c #A8BFA6", "`# c #BFE0C3", " $ c #C3E4C6", ".$ c #C4E4C6", "+$ c #B9DBBF", "@$ c #A0D0B9", "#$ c #678172", "$$ c #95B8A2", "%$ c #6B7D6E", "&$ c #BDD9BE", "*$ c #BCD4B9", "=$ c #555D51", "-$ c #596B5E", ";$ c #C9F3D6", ">$ c #C3E9CC", ",$ c #C7EACE", "'$ c #B4CFB2", ")$ c #4C4E3F", "!$ c #D1D3B3", "~$ c #AABBA0", "{$ c #BDDEC3", "]$ c #B6D4BA", "^$ c #B2CDB3", "/$ c #A8D0B7", "($ c #A4D6BE", "_$ c #AED0B7", ":$ c #ADC3A9", "<$ c #AEC8AD", "[$ c #AFC7AD", "}$ c #A5BDA3", "|$ c #719383", "1$ c #536E63", "2$ c #8DAA96", "3$ c #7F9583", "4$ c #9AB19B", "5$ c #A5B9A1", "6$ c #7A8674", "7$ c #A5CCB3", "8$ c #C0E9CD", "9$ c #C1E8CC", "0$ c #CAF1D4", "a$ c #7E917F", "b$ c #D4E3C2", "c$ c #C5D3B5", "d$ c #AEC9AF", "e$ c #C2E6CA", "f$ c #BEE0C4", "g$ c #BFE1C5", "h$ c #B7DABE", "i$ c #A2CFB7", "j$ c #A2D4BC", "k$ c #B3D0B5", "l$ c #B7CFB3", "m$ c #A5CBB2", "n$ c #A3DDC7", "o$ c #A1D9C2", "p$ c #485B51", "q$ c #576559", "r$ c #647263", "s$ c #576558", "t$ c #759180", "u$ c #A8CFB8", "v$ c #BAE3C8", "w$ c #C7F2D5", "x$ c #7F9987", "y$ c #ABB99F", "z$ c #B8D6BB", "A$ c #C1E2C6", "B$ c #B1D1B5", "C$ c #9DDCC6", "D$ c #A0DFC8", "E$ c #A3DEC8", "F$ c #ADE6CD", "G$ c #A8DDC7", "H$ c #ADE0C8", "I$ c #B7EBD1", "J$ c #BBECD1", "K$ c #8CB19C", "L$ c #A6CDB6", "M$ c #7D9886", "N$ c #AFBDA2", "O$ c #AFC6AD", "P$ c #B5D4B9", "Q$ c #BFE1C6", "R$ c #BFE2C6", "S$ c #BDDEC2", "T$ c #BEDABD", "U$ c #B0D6BC", "V$ c #A0DBC5", "W$ c #A7E0C9", "X$ c #ABE2CA", "Y$ c #B0E2C9", "Z$ c #BCEFD5", "`$ c #698374", " % c #445249", ".% c #C2D1B2", "+% c #DEEDCB", "@% c #CDDABC", "#% c #B1BFA5", "$% c #A1B59C", "%% c #C3E3C7", "&% c #ACD8BF", "*% c #9FDFC8", "=% c #A7E2CA", "-% c #A7DFC7", ";% c #ABE1CA", ">% c #B1E7CE", ",% c #88B09D", "'% c #6D7B69", ")% c #BCCAAC", "!% c #D9E9C8", "~% c #A2AE95", "{% c #ADC6AD", "]% c #C1E5C9", "^% c #C2E4C8", "/% c #C3E4C8", "(% c #B0D7BD", "_% c #9EDDC7", ":% c #9FDAC4", "<% c #7AA796", "[% c #9DD3BD", "}% c #A6DEC6", "|% c #84AC9A", "1% c #626C5C", "2% c #CCDBBB", "3% c #C0CBAE", "4% c #ACBCA2", "5% c #B6CEB3", "6% c #B8D3B8", "7% c #99BBA3", "8% c #7CB09F", "9% c #3E534B", "0% c #506B60", "a% c #82AF9D", "b% c #698474", "c% c #6E7462", "d% c #CDDBBC", "e% c #BFCCAE", "f% c #ABB79C", "g% c #7A8774", "h% c #8E9A83", "i% c #A8B499", " . + ", " @ # $ % ", " & * = - ", " ; > , ' ) ! ~ { ", " ] ^ / ( _ : < [ } | 1 2 3 4 5 6 ", " 7 8 9 0 a b c d e f g h i j k l m n ", " o 0 9 p q r s t u v w x x y z A A B C D E F ", " G H I J K L M N O [ P Q x y R C S S T U U V V W ", " X Y Z ` ... +.@.#.$.%.g &.R A S *.U V =.-.;.>.;.,.'.", " ).!.~.{.]. ).^./.(._.:.<.[.y }.|.S 1.=.2.3.4.5.6.5.7.8.9.", " 0.a. b.c.M d.e.f.} g.h.i.y j.k.l.m.;.4.n.o.p.q.q.q.r.s.t.", " u. ). v.w.x.y.z.A.%.B.R C C.D.E.F.G.H.I.J.K.L.M.N.O.P.", " Q.R. S. T.U.V.W.X.Y.Z.`.R C *. +.+++@+#+$+%+&+*+=+-+;+>+,+", " '+)+ !+~+{+]+X.^+^+/+(+_+A :+V >.<+[+}+|+1+2+3+4+5+6+7+8+9+", " 0+R. a+b+c+X.d+W.^+e+f+g+D h+i+j+k+l+m+n+o+p+q+r+s+t+u+v+ ", "Y 0+w+ x+y+z+A+B+C+D+Q E+F+G+V H+I+J+K+L+M+N+O+P+Q+R+S+T+U+ ", "V+W+S. X+Y+Z+`+- ~ @.@+@@@#@;.$@%@&@*@=@-@;@Q+>@,@'@)@!@ ", "~@W+W+{@ ]@^@/@(@_@:@<@[@}@|@1@H+2@3@4@5@6@7@8@9@'@0@a@b@c@ ", " W+S.d@e@f@g@h@i@j@k@[.l@m@n@o@p@q@r@s@t@u@v@w@x@y@z@A@B@C@D@ ", " E@S.F@G@H@I@h@J@K@L@M@N@m@U i+O@P@Q@R@S@T@U@V@W@X@Y@Z@`@ #.# ", " +#S.S.@###$#%#&#*#=#-#;#D >#,#'#)#!#~#{#]#^#/#*+(#_#:#<#[#}# ", " |#W+1#2#3#4#5#6#7#8#9#0#a#b#c#d#e#f#g#h#i#j#k#l#m#n#c@o#p#q# ", " r#0+s#t#u#v#w#x#y#z#A#B#C#D#E#F#G#H#I#J#K#L#M#N#O#P#Q#R# ", " S#0+T#U#V#W#X#Y#Z#`# $.$+$@$#$$$%$&$*$=$-$;$>$,$'$)$!$ ", " W+~${$]$^$/$($_$:$<$[$}$|$1$2$3$4$5$6$7$8$9$0$a$ ", " b$c$d$e$f$g$h$i$j$k$l$m$n$o$p$q$r$s$t$u$v$w$x$ ", " r#y$z$h@g@g@A$B$j$C$D$E$;.F$G$H$I$J$K$L$M$ ", " c.r#N$O$P$Q$R$S$T$U$V$:+-.W$X$n.Y$Z$`$ % ", " .%+%@%#%$%<$]$A$%%&%*%V =%-%;%>%,%'% ", " )%!%F@~%{%]%^%/%(%_%:%<%[%}%|%1% ", " 2%0+3%4%5%6%7%8%9%0%a%b%c% ", " .%d%e%f% g%h%i% "}; luciole_0.8.6/Makefile0000644000175000017500000001524511437126703013360 0ustar niconico# # Copyright Nicolas Bertrand (nico@inattendu.org), 2009-2010 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # # # Project : Luciole # # Url : Location # # File : Makefile # # Owner : Nicolas Bertrand # # Type : makefile # # # Name : Makefile # # Synopsis : make # # Arguments : none # # Description : Makefile for building luciole and installation of luciole # # See Also : # SOURCE_DIR=./ PREFIX ?= /usr LIBDIR ?= /lib BASEDIR= `basename $(PWD)` all: compile trans-compile @echo "Done" @echo "Type: 'make install' now" version_update : bzr version-info --format python > _version.py compile: python -m compileall lucioLib python -m py_compile luciole.py python -m py_compile _version.py python -O -m compileall lucioLib python -O -m py_compile luciole.py python -O -m py_compile _version.py trans-compile : python po/createpot.py compile trans-po-update : python po/createpot.py update_po make-install-dirs: mkdir -p $(DESTDIR)$(PREFIX)/bin mkdir -p $(DESTDIR)$(PREFIX)$(LIBDIR) mkdir -p $(DESTDIR)$(PREFIX)$(LIBDIR)/luciole mkdir -p $(DESTDIR)$(PREFIX)$(LIBDIR)/luciole/lucioLib mkdir -p $(DESTDIR)$(PREFIX)$(LIBDIR)/luciole/lucioLib/lcl_export mkdir -p $(DESTDIR)$(PREFIX)$(LIBDIR)/luciole/lucioLib/lcl_gst mkdir -p $(DESTDIR)$(PREFIX)$(LIBDIR)/luciole/lucioLib/gui mkdir -p $(DESTDIR)$(PREFIX)$(LIBDIR)/luciole/lucioLib/lucioWebCamDetect mkdir -p $(DESTDIR)$(PREFIX)$(LIBDIR)/luciole/lucioLib/controller mkdir -p $(DESTDIR)$(PREFIX)/share/ mkdir -p $(DESTDIR)$(PREFIX)/share/pixmaps mkdir -p $(DESTDIR)$(PREFIX)/share/applications mkdir -p $(DESTDIR)$(PREFIX)/share/luciole mkdir -p $(DESTDIR)$(PREFIX)/share/luciole/templates mkdir -p $(DESTDIR)$(PREFIX)/share/luciole/images mkdir -p $(DESTDIR)$(PREFIX)/share/luciole/sounds mkdir -p $(DESTDIR)$(PREFIX)/share/luciole/po mkdir -p $(DESTDIR)$(PREFIX)/share/luciole/ui mkdir -p $(DESTDIR)$(PREFIX)/share/luciole/themes mkdir -p $(DESTDIR)$(PREFIX)/share/luciole/themes/Tropical mkdir -p $(DESTDIR)$(PREFIX)/share/luciole/themes/Tropical/icons mkdir -p $(DESTDIR)$(PREFIX)/share/man/man1 install: make-install-dirs install -m 644 $(CURDIR)/$(SOURCE_DIR)luciole.py $(DESTDIR)$(PREFIX)$(LIBDIR)/luciole install -m 644 $(CURDIR)/$(SOURCE_DIR)_version.py $(DESTDIR)$(PREFIX)$(LIBDIR)/luciole install -m 644 $(CURDIR)/$(SOURCE_DIR)ui/*.glade $(DESTDIR)$(PREFIX)/share/luciole/ui install -m 644 $(CURDIR)/$(SOURCE_DIR)images/*.png $(DESTDIR)$(PREFIX)/share/luciole/images install -m 644 $(CURDIR)/$(SOURCE_DIR)sounds/*.ogg $(DESTDIR)$(PREFIX)/share/luciole/sounds install -m 644 $(CURDIR)/$(SOURCE_DIR)lucioLib/*.py $(DESTDIR)$(PREFIX)$(LIBDIR)/luciole/lucioLib/ -install -m 644 $(CURDIR)/$(SOURCE_DIR)lucioLib/*.py[co] $(DESTDIR)$(PREFIX)$(LIBDIR)/luciole/lucioLib/ install -m 644 $(CURDIR)/$(SOURCE_DIR)lucioLib/lcl_export/*.py $(DESTDIR)$(PREFIX)$(LIBDIR)/luciole/lucioLib/lcl_export -install -m 644 $(CURDIR)/$(SOURCE_DIR)lucioLib/lcl_export/*.py[co] $(DESTDIR)$(PREFIX)$(LIBDIR)/luciole/lucioLib/lcl_export install -m 644 $(CURDIR)/$(SOURCE_DIR)lucioLib/lcl_gst/*.py $(DESTDIR)$(PREFIX)$(LIBDIR)/luciole/lucioLib/lcl_gst -install -m 644 $(CURDIR)/$(SOURCE_DIR)lucioLib/lcl_gst/*.py[co] $(DESTDIR)$(PREFIX)$(LIBDIR)/luciole/lucioLib/lcl_gst install -m 644 $(CURDIR)/$(SOURCE_DIR)lucioLib/gui/*.py $(DESTDIR)$(PREFIX)$(LIBDIR)/luciole/lucioLib/gui -install -m 644 $(CURDIR)/$(SOURCE_DIR)lucioLib/gui/*.py[co] $(DESTDIR)$(PREFIX)$(LIBDIR)/luciole/lucioLib/gui install -m 644 $(CURDIR)/$(SOURCE_DIR)lucioLib/lucioWebCamDetect/*.py $(DESTDIR)$(PREFIX)$(LIBDIR)/luciole/lucioLib/lucioWebCamDetect -install -m 644 $(CURDIR)/$(SOURCE_DIR)lucioLib/lucioWebCamDetect/*.py[co] $(DESTDIR)$(PREFIX)$(LIBDIR)/luciole/lucioLib/lucioWebCamDetect install -m 644 $(CURDIR)/$(SOURCE_DIR)lucioLib/controller/*.py $(DESTDIR)$(PREFIX)$(LIBDIR)/luciole/lucioLib/controller -install -m 644 $(CURDIR)/$(SOURCE_DIR)lucioLib/controller/*.py[co] $(DESTDIR)$(PREFIX)$(LIBDIR)/luciole/lucioLib/controller install -m 644 $(CURDIR)/$(SOURCE_DIR)templates/*.xml $(DESTDIR)$(PREFIX)/share/luciole/templates install -m 644 $(CURDIR)/$(SOURCE_DIR)templates/*.kdenlive $(DESTDIR)$(PREFIX)/share/luciole/templates install -m 644 $(CURDIR)/$(SOURCE_DIR)templates/*.xptv $(DESTDIR)$(PREFIX)/share/luciole/templates install -m 644 $(CURDIR)/$(SOURCE_DIR)luciole.desktop $(DESTDIR)$(PREFIX)/share/applications/ install -m 644 $(CURDIR)/$(SOURCE_DIR)images/luciole.xpm $(DESTDIR)$(PREFIX)/share/pixmaps/ install -m 644 $(CURDIR)/$(SOURCE_DIR)themes/*.rc $(DESTDIR)$(PREFIX)/share/luciole/themes/ install -m 644 $(CURDIR)/$(SOURCE_DIR)themes/Tropical/icons/*.png $(DESTDIR)$(PREFIX)/share/luciole/themes/Tropical/icons/ cd $(DESTDIR)$(PREFIX)/bin && \ /bin/echo -e \ "#!/bin/sh\n" \ "cd $(PREFIX)/share/luciole\n" \ "exec python $(PREFIX)$(LIBDIR)/luciole/luciole.py \"\$$@\"" \ > luciole && \ chmod 755 luciole # traduction for f in `find po -name luciole.mo` ; do \ install -d -m 755 \ `echo $$f | sed "s|^po|$(DESTDIR)$(PREFIX)/share/luciole/po|" | \ xargs dirname` && \ install -m 644 $$f \ `echo $$f | sed "s|^po|$(DESTDIR)$(PREFIX)/share/luciole/po|"` ; \ done tarball: clean @echo "Creating tarball $(BASEDIR).tar.gz archive in parent dir " @cd .. && tar --exclude .bzr --exclude .bzrignore --exclude debian -czf $(BASEDIR).tar.gz $(BASEDIR) debian-orig: clean cleanbzr @echo "Creating debian $(BASEDIR).orig.tar.gz archive in parent dir" @cd .. && tar --exclude .bzr --exclude .bzrignore --exclude debian -czf $(BASEDIR).orig.tar.gz $(BASEDIR) uninstall: rm -rf $(DESTDIR)$(PREFIX)/share/luciole rm -rf $(DESTDIR)$(PREFIX)$(LIBDIR)/luciole rm -rf $(DESTDIR)$(PREFIX)/bin/luciole rm -f $(DESTDIR)$(PREFIX)/share/applications/luciole.desktop rm -f $(DESTDIR)$(PREFIX)/share/pixmaps/luciole.xpm clean : @echo "Removing temporary files" @find . -name "*.py[co]" -exec rm -f {} \; @find . -name "*~" -exec rm -f {} \; @find . -name "*.swp" -exec rm -f {} \; cleanbzr : rm -rf .bzr rm -f .bzrignore luciole_0.8.6/luciole_lint.rc0000644000175000017500000002130311437126703014720 0ustar niconico# lint Python modules using external checkers. # # This is the main checker controling the other ones and the reports # generation. It is itself both a raw checker and an astng checker in order # to: # * handle message activation / deactivation at the module level # * handle some basic but necessary stats'data (number of classes, methods...) # [MASTER] # Specify a configuration file. #rcfile= # Profiled execution. profile=no # Add to the black list. It should be a base name, not a # path. You may set this option multiple times. ignore=CVS # Pickle collected data for later comparisons. persistent=yes # Set the cache size for astng objects. cache-size=500 # List of plugins (as comma separated values of python modules names) to load, # usually to register additional checkers. load-plugins= [COMMANDS] # Display a help message for the given message id and exit. The value may be a # comma separated list of message ids. #help-msg= [MESSAGES CONTROL] # Enable only checker(s) with the given id(s). This option conflict with the # disable-checker option #enable-checker= # Enable all checker(s) except those with the given id(s). This option conflict # with the disable-checker option #disable-checker= # Enable all messages in the listed categories. #enable-msg-cat= # Disable all messages in the listed categories. #disable-msg-cat= # Enable the message(s) with the given id(s). #enable-msg= # Disable the message(s) with the given id(s). #disable-msg= [REPORTS] # set the output format. Available formats are text, parseable, colorized and # html output-format=parseable # Include message's id in output include-ids=no # Put messages in a separate file for each module / package specified on the # command line instead of printing them on stdout. Reports (if any) will be # written in a file name "pylint_global.[txt|html]". files-output=yes # Tells wether to display a full report or only the messages reports=yes # Python expression which should return a note less than 10 (10 is the highest # note).You have access to the variables errors warning, statement which # respectivly contain the number of errors / warnings messages and the total # number of statements analyzed. This is used by the global evaluation report # (R0004). evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) # Add a comment according to your evaluation note. This is used by the global # evaluation report (R0004). comment=no # Enable the report(s) with the given id(s). #enable-report= # Disable the report(s) with the given id(s). #disable-report= # checks for # * unused variables / imports # * undefined variables # * redefinition of variable from builtins or from an outer scope # * use of variable before assigment # [VARIABLES] # Tells wether we should check for unused import in __init__ files. init-import=no # A regular expression matching names used for dummy variables (i.e. not used). dummy-variables-rgx=_|dummy # List of additional names supposed to be defined in builtins. Remember that # you should avoid to define new builtins when possible. additional-builtins= # try to find bugs in the code using type inference # [TYPECHECK] # Tells wether missing members accessed in mixin class should be ignored. A # mixin class is detected if its name ends with "mixin" (case insensitive). ignore-mixin-members=yes # When zope mode is activated, consider the acquired-members option to ignore # access to some undefined attributes. zope=no # List of members which are usually get through zope's acquisition mecanism and # so shouldn't trigger E0201 when accessed (need zope=yes to be considered). acquired-members=REQUEST,acl_users,aq_parent # checks for : # * doc strings # * modules / classes / functions / methods / arguments / variables name # * number of arguments, local variables, branchs, returns and statements in # functions, methods # * required module attributes # * dangerous default values as arguments # * redefinition of function / method / class # * uses of the global statement # [BASIC] # Required attributes for module, separated by a comma required-attributes= # Regular expression which should only match functions or classes name which do # not require a docstring no-docstring-rgx=__.*__ # Regular expression which should only match correct module names module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ # Regular expression which should only match correct module level names const-rgx=(([A-Z_][A-Z1-9_]*)|(__.*__))$ # Regular expression which should only match correct class names class-rgx=[A-Z_][a-zA-Z0-9]+$ # Regular expression which should only match correct function names function-rgx=[a-z_][a-z0-9_]{2,30}$ # Regular expression which should only match correct method names method-rgx=[a-z_][a-z0-9_]{2,30}$ # Regular expression which should only match correct instance attribute names attr-rgx=[a-z_][a-z0-9_]{2,30}$ # Regular expression which should only match correct argument names argument-rgx=[a-z_][a-z0-9_]{2,30}$ # Regular expression which should only match correct variable names variable-rgx=[a-z_][a-z0-9_]{2,30}$ # Regular expression which should only match correct list comprehension / # generator expression variable names inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ # Good variable names which should always be accepted, separated by a comma good-names=i,j,k,ex,Run,_ # Bad variable names which should always be refused, separated by a comma bad-names=foo,bar,baz,toto,tutu,tata # List of builtins function names that should not be used, separated by a comma bad-functions=map,filter,apply,input # checks for : # * methods without self as first argument # * overridden methods signature # * access only to existant members via self # * attributes not defined in the __init__ method # * supported interfaces implementation # * unreachable code # [CLASSES] # List of interface methods to ignore, separated by a comma. This is used for # instance to not check methods defines in Zope's Interface base class. ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by # List of method names used to declare (i.e. assign) instance attributes. defining-attr-methods=__init__,__new__,setUp # checks for # * external modules dependencies # * relative / wildcard imports # * cyclic imports # * uses of deprecated modules # [IMPORTS] # Deprecated modules which should not be used, separated by a comma deprecated-modules=regsub,string,TERMIOS,Bastion,rexec # Create a graph of every (i.e. internal and external) dependencies in the # given file (report R0402 must not be disabled) import-graph= # Create a graph of external dependencies in the given file (report R0402 must # not be disabled) ext-import-graph= # Create a graph of internal dependencies in the given file (report R0402 must # not be disabled) int-import-graph= # checks for sign of poor/misdesign: # * number of methods, attributes, local variables... # * size, complexity of functions, methods # [DESIGN] # Maximum number of arguments for function / method max-args=5 # Maximum number of locals for function / method body max-locals=15 # Maximum number of return / yield for function / method body max-returns=6 # Maximum number of branch for function / method body max-branchs=12 # Maximum number of statements in function / method body max-statements=50 # Maximum number of parents for a class (see R0901). max-parents=7 # Maximum number of attributes for a class (see R0902). max-attributes=7 # Minimum number of public methods for a class (see R0903). min-public-methods=2 # Maximum number of public methods for a class (see R0904). max-public-methods=20 # checks for similarities and duplicated code. This computation may be # memory / CPU intensive, so you should disable it if you experiments some # problems. # [SIMILARITIES] # Minimum lines number of a similarity. min-similarity-lines=4 # Ignore comments when computing similarities. ignore-comments=yes # Ignore docstrings when computing similarities. ignore-docstrings=yes # checks for: # * warning notes in the code like FIXME, XXX # * PEP 263: source code with non ascii character but no encoding declaration # [MISCELLANEOUS] # List of note tags to take in consideration, separated by a comma. notes=FIXME,XXX,TODO # checks for : # * unauthorized constructions # * strict indentation # * line length # * use of <> instead of != # [FORMAT] # Maximum number of characters on a single line. max-line-length=100 # Maximum number of lines in a module max-module-lines=1000 # String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 # tab). indent-string=' ' luciole_0.8.6/themes/0000755000175000017500000000000011437126703013176 5ustar niconicoluciole_0.8.6/themes/Default.rc0000644000175000017500000000000111437126703015077 0ustar niconico luciole_0.8.6/themes/Tropical.rc0000644000175000017500000000641411437126703015306 0ustar niconico# Theme: Luciole Tropical # Description: Based on theme Tropical from ZgegBall / François Vogelweith # (http://www.bisigi-project.org/) under GPL lience # # Copyright Nicolas Bertrand (nico@inattendu.org), 2010 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # # style "Tropical" { fg[NORMAL] = '#101010' fg[PRELIGHT] = '#101010' fg[SELECTED] = '#1A1A1A' fg[ACTIVE] = '#101010' fg[INSENSITIVE] = darker ('#EDEDED') bg[NORMAL] = '#EDEDED' bg[PRELIGHT] = shade (1.02, '#EDEDED') bg[SELECTED] = '#9DDDC8' bg[INSENSITIVE] = '#EDEDED' bg[ACTIVE] = shade (0.90, '#EDEDED') base[NORMAL] = '#fff' base[PRELIGHT] = shade (0.95, '#EDEDED') base[ACTIVE] = shade (0.90, '#EDEDED') base[SELECTED] = shade (1.25, '#BFF44B') base[INSENSITIVE] = '#EDEDED' text[NORMAL] = '#1A1A1A' text[PRELIGHT] = '#1A1A1A' text[ACTIVE] = '#1A1A1A' text[SELECTED] = '#1A1A1A' text[INSENSITIVE] = darker ('#EDEDED') stock["gtk-go-forward"] = { { "Tropical/icons/gtk-go-forward-ltr.png", *, *, * } } stock["gtk-go-up"] = { { "Tropical/icons/gtk-go-up.png", *, *, * } } stock["gtk-go-down"] = { { "Tropical/icons/gtk-go-down.png", *, *, * } } stock["gtk-open"] = { { "Tropical/icons/gtk-open.png", *, *, * } } stock["gtk-new"] = { { "Tropical/icons/gtk-new.png", *, *, * } } stock["gtk-save"] = { { "Tropical/icons/gtk-save.png", *, *, * } } stock["gtk-save-as"] = { { "Tropical/icons/gtk-save-as.png", *, *, * } } stock["gtk-add"] = { { "Tropical/icons/gtk-add.png", *, *, * } } stock["gtk-close"] = { { "Tropical/icons/gtk-close.png", *, *, * } } stock["gtk-properties"] = { { "Tropical/icons/gtk-properties.png", *, *, * } } stock["gtk-delete"] = { { "Tropical/icons/gtk-delete.png", *, *, * } } stock["gtk-cancel"] = { { "Tropical/icons/gtk-cancel.png", *, *, * } } stock["gtk-apply"] = { { "Tropical/icons/gtk-apply.png", *, *, * } } stock["gtk-yes"] = { { "Tropical/icons/gtk-yes.png", *, *, * } } stock["gtk-no"] = { { "Tropical/icons/gtk-no.png", *, *, * } } stock["gtk-ok"] = { { "Tropical/icons/gtk-ok.png", *, *, * } } stock["gtk-ok"] = { { "Tropical/icons/gtk-ok.png", *, *, * } } stock["gtk-dialog-error"] = { { "Tropical/icons/gtk-dialog-error.png", *, *, * } } stock["gtk-dialog-info"] = { { "Tropical/icons/gtk-dialog-info.png", *, *, * } } stock["gtk-dialog-warning"] = { { "Tropical/icons/gtk-dialog-warning.png", *, *, * } } } class "GtkWidget" style "Tropical" luciole_0.8.6/themes/Tropical/0000755000175000017500000000000011437126703014753 5ustar niconicoluciole_0.8.6/themes/Tropical/icons/0000755000175000017500000000000011437126703016066 5ustar niconicoluciole_0.8.6/themes/Tropical/icons/gtk-go-forward-ltr.png0000644000175000017500000002272711437126703022237 0ustar niconicoPNG  IHDR>asRGBbKGD pHYs  tIME  6!i IDATxiuFwSM,q,Gےl+#[{2dNt|cLr$3g>Lı35Z"R})KwcޝU @ tST_w (wWj``ey^e,2e˲ eY,`Y,X7DCI6=@BTLME9GO?T7ۀ@bN? @x |x.>@LƀsP$GnS Wzp#&(v!7<"p?7g"6@t>(s`g; vN@A]ihR*7>JO|[22e.#3}ҐJY "DMmHBѹF\5i'_ܒ2F%5pl r27E/$fBr@ѵ^ӹ^t }K[3?[ M\SÆqC~J!ޫ\@c|i[e"ڟ\ۙBJ=6=aJ{0xGm] ݄/]9 %S~1s3k&wm*[Y$Nf;֭XyEO52ys_$7p|ahc+ф b[!ƆbJ(%+vXDW ėߔ)aW{k}i`EIheA[bI7l[LŌb>Q :h.buC'y{f O܅@YfcW$_鳹̸o=4tk>3o|roW@&%'ݡo[݊7I =*XRZʥoޤ0CʎuW6^b =".OWXU=kgcMO%y_]G9/0n3BjD 9 u}}eyJ* ^`%\%MuKƧZo F oJ0Cꤠ-]H)mbusocgFk:sB8Oն/ {/'? {Ya)4ZQ]Ě;#B$N&O+V5a~=[|䛁{Ɔ5ʏ+zVkHN $zE43ƆaC)vŪp'_wįk8C~:xE ݲљvKwnE,t@fNrp1ѫf W̉ įY]1g7FɮAMv"kV'@\%M ڿ٨i=4N ӯ*VwB;9v_zWZDcjuvw6v\e}SI2Bzb⊞ABNqwTs"|*_)Bz4H4I5'v_t[΁=hRN1Noz`J`;_'#uW)vEGOk3s!uwc[l~;D5eQUw&ڦ| s\*єgOwdƟ緳Bf*E z^kgFn`|W3:@.#,)̤ &n:j 9ѡiE5 (V~mn.뻑u.A_&"Kg!l_Q%ȴ-@eo;+v,L2 4R):ЗS5n` ǖ S@aL(UaVTmr;lzʉ03"&^:g>' YtZX;5uh,+r?b]f㛹HF#qlrF5 !̍Wg㉞ŷJ_RAʭvE,ZtlV5Qo"eGI\Jָ KSRA37. 7E')P I5i7+?Mb;vDUԸ!5>?8۫){=pz{BԜk 5 5/IFzٳxӚ[}]&BsD"HKiϽnY:NǟW q.]PJV4JYMqoKo'ck;뭈0yڐyT#KўQ,8։ẅBc)^\elq;a1}UVxgDqph dU"~{o$tFWd'(,W2i mqFX1`rA>{ / w=[e_OWkՊbk}J:y&..]-WǞ`ͱs g_Fiēj޸K*05T Yh`q0kj p_k ]{q[_Ko==hv[Á_0=t/hM$4SUBD͓['p(! ņmhe-9 z-H?_xC ?e}9zQygW훯m1ETvEA%T˒n?CM$lx/}ako0SLrYXi=)T)T1"zg[`y<8 ,;6q?bm Ʒ&^Saw%`S l[K a !&Ge` -qE7罬jN'rٹgHpuik[?hBO I":ZFkW_rA*uL8L:sZ UL oD-gF7_i~3\ֻzriaM ĈVu,~:!gk,a}B;Eaef[yˆx7q b[ ;g7V:45; gahi9ʚܲYsly/ Ԅa|w(C tBg= \m{IDxSύLB^9a Jh+heCqIn.o|z7áFs=5L?ɬߪtjY>S3[h X^f nlNwt ;z~dl0r)7Ff !\2Rժx_ܵz󓓩: s&eݚXLUQJHGw3Nc, rhrJ0јUv`` %RH*㿸e/0'8𕻙̎0]:㔤@gEB  Z] h+٩e 4Ɵb"'3Zxa`p'lv'@T  8826Dޤ8y=E=V b0JՀj*+-  #\}*ǁHx8? C=6cTYB<HD,#"ul #7_J^j:e ?c?1EetHDnm'mqAЈrVEydj\8DqPpDzE ZP$ˏQDzOR4:;X*BNu^s[iDl$Z$ mY"ߕ}r`NyfnYolyo??95s«kVw~]7шFBcyGV]֑}߾)I^`1}c+ߏ<Ɩ<'rϒqF#_C4 " Q;D"eZ#]T^Bf YmS [SG_眘y vnmH|ɍOs2dN5|Sfe,APxU5*g&N(JO7-Gڛm1SpGrcMKo)~yaSb0D0h mި7 AA V#}A+m1 `iEX3'<0om@,(U(fr:{c'(*{T ebfg1-S`׾W) 'S0t&l\?@$LeԻ& ceƯ܈  St?``yN _y}N~Oӓ~ߔ)9$ۢtvEEkb=jS^鑝"JyV,T|ĪIyukd,wb#!X5zWY`\qHAoi9iO'oݘ+P̐?(zNu6m|5k߭W>0q=@͒/Rr L0Y:p6xIW=JRRNyMhwߟ+,( % iӝ& tek+P5=*wcU *alaK93M2g E=h2 ؈ZAd d'^MYF!kJŻ0/p.ANHS_aZvj~NPX6SC0'3Vڇ#%֮XuMy?S 턪iwF r0^jMmO oߔDY*]1%Ns ټJU?SΛ"ϴhmvq0.PF}osL0R²`M\a=Vŕ2MktAPq[Y @:ٿ| 7 խIry!١+ʥbFty?~ߧZ"XzрZ04xt78>d(`2uv F#h}VRxI\M%88>OT٩@^#53&2?c ]$f}X"cguU*\UZp uTkI]FGxt7ɗdLڇA  +W{ѹx9|'ew( L}eX Y2>rFgE;WB| C.?-@ot+_Lϫ#ZT5 ~~0Gyx'[bǤ}WmU|a ]0.aXÁGÁE7qLx |i)-oۓ cկJ6q+C?M蚎)Z(4+w3>IQRL`Sdu[7n"bYޤ 7B}cUSY ,K 9>G? c[eU SV}g{ǻRQ'XnxI"Q  gtG^;/F'H;L^Eiåm岋bD W?9軨hE {o˒a{8 mѐ/ߴ*cϨ~/hC4sZE|֠wߦङvNЙ;f튵(mN*M G)Q4Nuɽ ǿ wK']f2lFQ8Kce|/YQi8jPuI!!wP ON.{H'(3 ld*9{5D*$kK*G:%n#sӁkJǶMG{s%,RE`fҸ}[unr'R(<^c;kǹC*?F9δ}h4UvrɆDTB*UUZ+>ZXapbZ15f?K[,k> |i"F ‹C@? @U0_&_)*+fsr1@ .۴hԛg_I5_)xxVA/ Ly~@C"hpMxqoz!`sr>G]JSݱ bԋރADQ\С1<@Nƙrc(rɆ\sմGp?­j ? p: U; }-U c]3?7Sg͵ JoZ/,tY9xyW,T쏝C):!a8`pH;( x|7K򸏛F~"OSE˵wʟ0i' SgtM>/?V@1e!R IB_.\TɤJ. &B j(I)g?ER\;.:Du 5!jЕ"7=ĩx0+hǝ#yQ?s~(A؍07alr'ya;1~ܭD&6/5 %f!|%WmE[+Y w^W.8U[#sPR.R禟pXp#H=a>ϴBW-{۽,Bѿ nw6\( ժ+^e=wr |l7!_%QUP+mPZt<6s #4G?-"援JOV"homxn\&QV$n%|5h|BnN@Wعc]^E#zA'0VK"5!Jx;yU7i󉟐5Oupjh{c?탑Nm"@~F0Әa:"D*7< r +.NRD(R)",>q[Tpp֯hF%«|_?kZ,HODxN <=$/:t N CK&zjCz> GTu%ly+`Q 3O̓nwfx *@}2',TsӛpC'T:#Ivu+z j08itr:0yArW/ޤ`shuǓ<38c4+&N9cy=5׸$4&²2]='2SXbjA!g ?a;V|9O)xQ 麏[Y,,*ʲm6XB/dW;IZ]5.6\7>)g~~}WP -Œ[{A-X!IR($/hSq_70/KIDAT6ۧ_ =,vS|=+ChLbCR5fmlW.6 Y`9 Gs9{8uޠH^3rn=ޞ?T:XR'y<52*6%.$Q|6UWi&9})}I3vȮLaԷn|v)@A\^MZuf~acvַCFP!TM~4)$Lp,7ġܯcIM6<#/K*@:sn8(zWFHTsBeXUVEKWPcI4Y'K<$hҧSvo{t妯Ƿ_njhLѷҢWQW]ɠEJ01P*zyZ_kwxykfUY~&us MɛyEfLٹ4|@W[jz Xtk6`㶹HErb]RQ'5h(?y}{!khQW_MmSDbHX1a NQ`bQ(3G+RZ )o#ۯ~]j|v߶ubsrBwnunOafqa,~Yg9(W5oHߴ~#Ҧv7b8%y]l2_g-Gzcg- +OGGDi6)(bx͔ʍg\E!>' >o  ٔ|ѓ>Cy6#P֦5"qէ#$t,IhM256ics29}Hx>QbΠFYΙ:! fɺ@BzQIHI׳i@,uf58?Z,\\M a qQ0k|+Z=@ 'ͧW~;uߗiT3z+j yz/_SH릒f )i/KVYzٟKdJ+,]lONp;韯Bc€X8k"igu#bz.!M\!0L9%s4 !3(g?0Z ea<\ %Q\:t|gJ<sРT|sQZ 9\Ar/zCjVgـa & u.t\AdEEIlIENDB`luciole_0.8.6/themes/Tropical/icons/gtk-go-down.png0000644000175000017500000002270611437126703020740 0ustar niconicoPNG  IHDR>asRGBbKGD pHYs  tIME  62 IDATx{W}?V{^4%!Ąٜ8K ^<cd$NN8I8 $7c6lKfFwWݻTu3=RwHL\UuuOw}(ۯ&׻`:ַuoX`}[Wcs/lvC5H'9}9Bv$#7 \m~`/}|Kv$nn6''yg }x';wh`/oG5<|ХOg\nۀJ\/4pS7 b|Ty]EvBSk*JUՎHH8 A,nZпEܶtݿoܲ')ݞ/gAfT0MҿM"d#D^>|_= F4nkS,R4Z$$7JwHd|I0ٝ{mKlr0s7oʷ '+JzeJ:`Zpϊ;1 NҷP|_ϝZ@T2 ?´/}J KM |JJ %~!9,ZB:'w5{|'7ZB@,-H @/x76AyQSZr~iʌ 6!>G?wC+ ?y=3|%ڗ^ ,Q&-H gvA+4(g B@MNݘ^ϼ 5jOUW-;5="HzMÊ_MM ȝgp`hdni]s~eHJŅRh.䠠ocs/̂_\7W 84, 93@vJSla38VN7vYc34WQ )?9ԇw0D~g=]~}<0WvRvBdsbfh |o]gdpgp%LKdQ+Go䷯ywGə KF,  9Xx%%&^NҿAp}{2wrKO Bx_Fh;G<㩗}`0z _)-j"u~0r-^%Z~^v'de4T&Y^1_RC4>Z-ռ1߃}`d8"0Z<)ظ!x%K>7:*ޗ2o$W3[<&i}1!ǵ)r% A3{=&. olW 4I4K }5 <5WO^F Id H.9E6KGijƵb:u0 hބ,^ ,T,S֨ 2C3=KδQIzV |}d>5סP:=,%2refX@t 9ēUTuTҟXoOf OZL-?߉ 6lrB3z< o6lq'x]ʖW|#ϧ]5tӯhe#ҺᎵ^ \s]w8af{i${9s{M.Q# bqqٯmq- IJMd*#H_5AT/T!;e}TFẗjpEF?t!i:;PÂA/e~ DQ##  ]>sQE$=;kTȧoܜm8](+h#**BCy1n[T edOH[JKiaTyϦ߽Ŵ y<),F}.eDOHaǎ.hfϦc͇2(wΔV;RpV '̟mP|xՈP֔J:VQm+6HC?g #ϧм )$ с0hUp܁-,Jen_Xqrz'C>HH)"*@"D/&Ն/d Xq Y)"Pjue}@H>3vwgufBB+t#pOL.)q @G8&zT?$t8uKp EvE4ǵ & h\'VfAXI%1q>MRKv0T(#2拋RQ5{(}&NBF 믫׆7yzxCrɩqc6ӡNtZs] xR[<.H$DsRk`qa:.8ݧ⌮( XXWEfP[f^+m @`uUM&LB&|spDR.j \;dK"y#09XB00, q:iZ#6hɗ>QБ6IN^|)\nVOlwH̗8p<]hicv=gߨj u~kUмv-x\040? \-޹&G1x׿TT1D2d6X@m K w ZJD @m`pء\.d(Ó}x7;or^=4g0U:\F@8vk˭Vj6G8-GO"A0)8=GEx]vŸ+?q:2dXN.ҭثENzga\Yqr7ٻ/9lܔħ̱sx~~=~gSsZC"-iB 䉮@â9[DRzO&}__Yי\<ɞ?lo-r:EdLadMF:S:r^b<Ʀk `#Hяpq0QѱDU /K^Gg_+WN3S>B&cd4Fo^gL/oP-&Pj B5sÖ-?RKZӇ*Jn iJ55 dJcj1aސ_vQEm伃*Z*ь!H%lژr.!W㩣ߺt/ 'ϣǖAX !.R8!:otByxBbmE*`qi;0qPHOьΫ"(~Hb.wAwu ?sL^gdd8xT`>РBk:nVWyUP XQp* C&iJ[/]C}鸆rGyO3LJټ?tD|~/ґ5qv@7'4U@c,5#ET&j7|671m[7/%wi>ex̩‹8R}p@ ' +xߨ0 bH]6'V X ^h4Hw={̔3x/JLq.p0xw#` f@9H1}Za%xH+!`JW]õ9~q"$q]1@UF~0zhre{%_:MW53FzĢ2tIS̲/AdmGS}Js<] 0Q܃wlu  ` ^ @U}=YP~fk (NB֍ȠZ !&+{e"[e:ecQ25%h7²wu>rexcp x@=U|(z,j [tmcb1Ε"Ozήr$iҌo_&i8\4->n~B}뎂5GٳSPGke )ξI?6[X<5\U*~kXT<}A<]dr͎Ez#:Mu(,/AOzP(B^=\h`Fɲ^%,`C@+ "Z"ca j1&OďV1e*~^4>;wl%K"qqpqc܇cupp@e٘<3|㝅ǢbkUBG"[ՈS@u6p,p/^uT1Jj_133= t c<GEU@X1yD} BȖ=;hWKhPŊ*>*[W]N8(܁>5Gz*hQxL#dWa&L5!hMBd!gs$JCh<4߼0I<+W(Eǭ[0UWysl%octp$OqdAk+9Η(s6҉oesRp\̕*_ϓj0ZuS ւEkg (OMV$<$3CxӇkwg=D?KA0aэ5&\0/Dri  Ş 5,La󂢏/WyycryNu-[&c;g>%kTt5\(OߣzH%\wՖU/3~fET' p !/">;5锃B*XKXrYEFt#t2RxWu9^>k#Hӡ"Rd_ǩ ZDS]e%QQu:)$?zY+YM7*K/VY8Fj \)R3QԽ@޴sVůt|U{%O220Ub}bz0f>o&˝.% zp|iEOq"w pޱiQGrR4LїWSf;װy̼w禝,-f*;D|u`٣Uw,h/v:s+*h>+x~y(MBVMyDlf4RL3Qt.KFYELF@yFaAt^WXݤ |ዧt49uʲ}6Ɔ6}{+i0^r*.s^('8`D3_3dг٩`&bI~mh4 *(gϩ9L?w\qMU&[Vkթ%Uaހ>s Gu]}[1_ }2Y(f3\(YK}J!#gDS̞I҉ J+f"X?G**<)!\$У3l a??+t WO{(eh}It|U%F?`>Dyjh/«ta4TΙxk Q9^:fsJǍW]Oz=F^_}Յ=dUQͧ;--j4w0Vlp<0lRc(4|*kUvpo\{3tXT'Pe\}Srj E=CI/0>:ζM]Hvt׏D>?W̟=zCŎ<;oz> |*e,8-Oniu`QHq}Y" Opv, ,ٱPoe'} ED[3"}n pqHaE::T9U$'aq! ? ٠[), y&˓'AحGڰ/38ԷB4_`o ͑P)zYqy З 6F<ך VԄPn] C#3#_Hy2·*v++>3ZF gyoEo!J6r%E}^L*"SCQIOI|޶ц?ɯmɜ7ˏf~Ȃ >ʇH>tWnʨk Pcoy/~ f`A|7c} ņk_f#I4i}:d : qvN̿ HY/RTn;X  :8Mf"/g˻J2y XQ]u\^q4ou ۟qP1m=L4.)qE}A)+Sn73}  (W|r/zOSb."!cƓȄ*=kxi编~Fs Gfk~=}Yoyz{7 +RD$px0}QMcVnF CLM+ si3(ʼe[N[- Ԑƭ Z(əpM>,G{8%HzsY>=j >S@g7H:T˼!LȶwC$4qu/eQϒg8Y«ysv:- G)Jk5 |)yE9wעl$2"Aɐqs60oE?OST-Kg53gV#^_>ȽSkm_L|gbq&AU=_4FnERLTK^'Z5 m[2ÈO+A(MkfyAhn)\}`=ߡǍШCI 8 JM`\hfqJ17ewwnB.\n6w@7YW}ǼroKjuXx}律XZ[>԰xqW9l>T}iO`abKGD pHYs oy IDATx_WǿsfFsMZMPh fkDZ H_ BB^mњ7(I$RKDZ TH{0ݽٳ;gv2{w3|̙9x<x<) 4µZmMqo7.\`lXWbV[pTRph\ ɴV-2"uD-ܪ삐$, &oыDG-l%3CDfީܯ[VgK߾1ii͉gD;"4Cik̾Bv,V٤˯Hl`l_ j~{QfBTҬ\R.\/@ɱn"|+59s {<G>uVvr]h6#{eOcK%U84mp]v/]cz!kfŋJ8&U pU7'vCb+W._}AG% Pr% Pr%Y$pFez!f\/UX&ߙ'W*U? O|xJxJxJNfAisK+q H"W ̛|Assq% Pr% Pr% Pr| rrJ/@/@/@0jH9ԎScRVp8+W z|xJxJxJ8̜ \U^Q.'˯N?MG!;oKʻZ,βPN`ql۶ Aoc*uω>y:ySimͻ(ce/rnnD]4f7^ o?ӽ@DD("uCxz,yizxS~p"5ҎL]]>a%g 82DhE EP"!NƕKe˃x6E6s?oа К@$)a0310 tE!4(Q@$? Fr9{SH_ ߊo^7Fh1^˚(O$Cԓ u*4~&\(A/MS~ZM/^NMi`^G^ cZXM=B^KvƑ`?C>;v$\^`Hv_Z\SxXm"0VIz翬$pL~dzD:X[Ӑ l\SxX=2$"̣$pM`1f0 26N  M LCN5 4fSJ卐5 k3,e%@0~$pM` 1e%Ab{5@D`By&d˴1MtdLLbGI aQΤ4C%pM`#_Iй^1v! z',$pL`:a{H'p$5 j ڭMR̂'65p ,/4uI 3ZCrඑH#$pM. l^xb ׌%˯g[6IH|=^ 0tC$^]K !# 04^Cç%AZv( \Sx"}J@ ah@Nt$HR^ $~… -JE6 /@gXX?JfqgrWDNd%CрR{L0lYHRT4X<єV +P*p* "g.T,t[Jп|68trJ (^ݷ VRК$*r5b[4-zochH9ah*z8kΝ;kD8SZ{iaq|SIFьcQ( Mxjz`s+LzK/J4MDđ4Y@2+8e5QK.qlvg;(*X޽{IΣ3dB4(PPB !:{F E Mn!PJSϠ!4v[mmtv!䩧~nؘ+ Lt[n?7 ]yf‘l+O)(Re;3&7d,7Js壵 0+h+V`L a|/XM,oOZrG=?1m'N?&"۳;/Roc^ 1XGAU^?z<x<)1w"zTXtSoftwarex+//.NN,H/J6XS\IENDB`luciole_0.8.6/themes/Tropical/icons/gtk-save-as.png0000644000175000017500000001104511437126703020717 0ustar niconicoPNG  IHDR>abKGD pHYs oyIDATxyp}ǿI>MJ$Hu)Q-[vRי$mƝ4cLNNGS'n3M튖l)IL:(˖%QuXx$H.!@{Ǿ<<<<<<<<<<<<<<4eL |A?97ayE]t)cI hkMЃm^E$ 2]&' E~^ޓ.kV`HXKI/^@֘m9chXBe3^Jأ8e2N^ HI^Mz#xA` xq<8 4R*e՘\dT#CJ㺹fߡ$XTV%DFPU]{x1@ xq<8r wP*ãɔfWB@3Q"8bGK՘)t( 2b@ xq<8mB!H鎠'@^QdVB`BiJ)t2Zx/y<8rO9'@fT )eBi2}#\J4oy2 0 rK4_Qg8/y2}sc,4`/`79}~On-) 2REjlхA z/{&q%FұcԔUCQ3훧q8K'tB&|8{$&30(Xh 6'4B E_ӿ 1(aO27QXj*⦋A,])GW fX~wrr=a@beyx/D3=oȐ*-+ϩ6`g |,7YH)IrI5(( 1r@i(l1َGI'͂q{, fb5D;w>ζnzon7~qW'n G]ҹslJG܈@```qkso7"r5w3wuHDL4m?G%Rlee嬾 5@*& ~ s56@ގqhs[w VduI 4iH02O))%RPֻ\0Cqh>v)j܈S&̱;lRsVD (e>nj[ W= hu@e?=(*~w:ޘ1@:!s֩"^丛Tv s"u@""Ӑ_f߰ LRut{k'ן\;eh`:Q*.oHjAG@P sPV5 "wS TboNAI{1c|DݸӁ!;ǣ~AJc]A* 8>@_Y:NH'E)}7ۜY R)p`NprWUGyS* lrr}q-TaџWެ `YqW58>?7+1 9PV\]|106 EZ"@Bj r#A6R8h'b1"5v:_Y^$=UUXY!6ݏZH2_!. ~lzSD~ԍ  M^_w-H|=gĠ Nʙ)R;vSlx?ʼnmm5y{F/=),3 e1LGK=HBN^4 ~Is, .ê  E:)c, ]Jʀ!% )z,bż !wǷD>[Og8~>v͘k $'0z FC7qc1n Bqp | \c>|/ۆ1%gJ)њqcgۊMxNt:'ԣ7li fz"?DPLO +vݛW>q5@%K_6x{Ҕ;=YRu7`o~O1:&]Xհ ݯ@^ +(P*@g]B^BC+i 5޾( TPi4vb u#-"`'^G7#X LϸL Sj>C&#>ӽ}+lxy q5$KURƼ%['w/~{v&4T/g AG0a szZZ`pOQ4ƦGpB'._TX2TqJz~@.Mr8xzP_7KjW t@B!`Ƥ\1|gôjVhf@XS8@D5IufTzzH."K| jWC205)h0=K& ;pA\90D̘PDQA ecXU=*fs ., E]u&:!$"zI FS./l F Rk[5M{EVlV-Aa![(/C 8D)+&z IOWyz?w_fVcჸQ?ܘֲ^vCN CIB}y^ >XIJJZ8y/_ G3ÙrTZ>m gf{֭}E22KI7$ǞW/lJB%-H$J0kP),x\㭣b;8HZ 7ђ8FhةgMzAUc1s xїq'êMoW[qNWhH.+A=dڃa)ĴM+`[6bQ LNMbj*ԋf"y.Gנ &<:^ "M/}[/:Ů}hߏ }ht6?;)_"HIWL k|^ O`Ǎ%[za{bOk?ipb4穞^?O,n {(z1+Uw6îOcOq68gk3bֻٛy /;=}r 8σ=~ݝswڊ|aISmۦXӴ>`8\>|zxxxxxxxxxxxxxxd'ؖ65E"zTXtSoftwarex+//.NN,H/J6XS\IENDB`luciole_0.8.6/themes/Tropical/icons/gtk-no.png0000644000175000017500000001361711437126703020003 0ustar niconicoPNG  IHDR>abKGD pHYs oyIDATx{l\՝?Ǐ؉8 ٪4;J 1і wQ l+(yPζTM@$jb'! 8$1&qxRX2QiیJD<|VRpqw7J˜9]E\&683ϰ綾<2UQuȐ; Y(l ..D6^TO>Ɏ_x8 |ZDPUXY'+_aʕ:b3w/r|\a*dHڬ4rȉ شXr3p[X{9U# h3Ͳ|ř;+(7 Bh2.EkXVe5@Lڷ$ 78|4͚ŌŋiN&9ק t*.wܡENjUpkgBE4E($3"s QQD~ | ($N_|"\6..*& ??G:8|XI륺/*"U@#ۙ{W+.7f"XΈl(2 '.Kp6i"H$"X -* #BpsA&XD~1­f,>bK9DPV1p`Ml:8|eRսP6D7^8P­'DpYHQ,@!;vxTBhjwA 8<7a>b91ܽ[/vEH(I"B|x پdP &14Ü K{@D%"ZoNؘQWhBoɊ D? TIP­d|\BDKwDX<K;v0!*(NJE`l/^LS<Α={RKCBZ"B<|WO}=goϑ ᅇeVMg3c"ƌ" _Ԍo9K~]g_)U܎=8tHw0{63 3u!!QxY0k"<. 6OΪڕ"ZgW5c Y!<ԗąviF2EfT^U@>< "Ľ+F[ڐde7ڂw­>D" X\o]}5;pk&܈N.ܸ'}pءC1:h8w~s!!EA9 n B_F~i\ì+ ?cRmHodڵ573ӟfQƌ"pN!@?-c1DpSHKN_2Kis9khh+EnKeojl"'AGHȊ@r"@($ġ(Vbڣ\uGm t6}ɒ;tA|)pcӻ]XF7kb!Uq%W%3i .^mzHwn.);Y_kkjbڵ"P HDGsn3Ԏ lN$8RAŹ^) :Ĝuh*< "Z|p:6ARҟqzA7ok7E`֮.:~7u!0uU}>n&"521L9U2Z. |t<ڵN.Qʟv;R:H{0#czm895k8ߟ׾pJPO\G­ݽ Ӻpa ұaC._/s2+:7g?2헃}}־),ِOe{㺵(pl@kWW\oE6'2<(Mt#E㶝tr\;{7oSk55#ٿNhQ]渹.7k'O^#v^Ѿ>V."aKr{o2a=]Cf8(8<o߼7wHxA]@:@NL(V;sr9r}} >>u';*t{%&LfS)Hv.NEm(w)I:ӤNT{%I pSr "Nqd2Ly?iNy(1i=p/sJ耫gMeΐ׷tv27<qW<׃oɝ@:;[MAVlJW+_#,~zt^;mJn_ka'?$O;˚O\oIKg'7|,x9گ,Q*|4δU!ꞷfZ4}~P [Z4\sMɲnڪ_Ƶ,vHݸEy0e<徕$ Ĕ72"ADuLbWrp+0FrbwWwbW{OSɿ3,;CDP70`;x_I NN1Q\)_ϑ/RBSo k!!BX L"Hblg3;˫]p@NLp"kq/$RLOW ®DÁ_ׇ7m#3AOC+W*EsXʟ8R8)lFձ??_'WB44p9SR5F/0sfvKk]^4/f|ɿ/,+VwGa[HSgi &VV\~2V~eYXWCBnk:˯g]==&|& y@"9̈@zu{*kj0,prH$pg'|Z.+a)7z7D/!!@71LVa)g />-|4&^u.GJ]%"/BB4@N9p̹\Wa\#U !!pP X̑3GRCBW&Fp`cX X2K=QŸBBW@N3 sjT5Ղ|fP.(1$ rȟ yr宫 zzh5M0, ). yjjz/$?R4/e@H瀏f3Lsb=Z|a{" Z UQ $`r"8i >quL?lx={86pK "DZhlULZ0Aw"XWU+@ɳ# , K9&BDa7F s oF3!f+mC KnjjjjsmC"zTXtSoftwarex+//.NN,H/J6XS\IENDB`luciole_0.8.6/themes/Tropical/icons/gtk-cancel.png0000644000175000017500000001361711437126703020614 0ustar niconicoPNG  IHDR>abKGD pHYs oyIDATx{l\՝?Ǐ؉8 ٪4;J 1і wQ l+(yPζTM@$jb'! 8$1&qxRX2QiیJD<|VRpqw7J˜9]E\&683ϰ綾<2UQuȐ; Y(l ..D6^TO>Ɏ_x8 |ZDPUXY'+_aʕ:b3w/r|\a*dHڬ4rȉ شXr3p[X{9U# h3Ͳ|ř;+(7 Bh2.EkXVe5@Lڷ$ 78|4͚ŌŋiN&9ק t*.wܡENjUpkgBE4E($3"s QQD~ | ($N_|"\6..*& ??G:8|XI륺/*"U@#ۙ{W+.7f"XΈl(2 '.Kp6i"H$"X -* #BpsA&XD~1­f,>bK9DPV1p`Ml:8|eRսP6D7^8P­'DpYHQ,@!;vxTBhjwA 8<7a>b91ܽ[/vEH(I"B|x پdP &14Ü K{@D%"ZoNؘQWhBoɊ D? TIP­d|\BDKwDX<K;v0!*(NJE`l/^LS<Α={RKCBZ"B<|WO}=goϑ ᅇeVMg3c"ƌ" _Ԍo9K~]g_)U܎=8tHw0{63 3u!!QxY0k"<. 6OΪڕ"ZgW5c Y!<ԗąviF2EfT^U@>< "Ľ+F[ڐde7ڂw­>D" X\o]}5;pk&܈N.ܸ'}pءC1:h8w~s!!EA9 n B_F~i\ì+ ?cRmHodڵ573ӟfQƌ"pN!@?-c1DpSHKN_2Kis9khh+EnKeojl"'AGHȊ@r"@($ġ(Vbڣ\uGm t6}ɒ;tA|)pcӻ]XF7kb!Uq%W%3i .^mzHwn.);Y_kkjbڵ"P HDGsn3Ԏ lN$8RAŹ^) :Ĝuh*< "Z|p:6ARҟqzA7ok7E`֮.:~7u!0uU}>n&"521L9U2Z. |t<ڵN.Qʟv;R:H{0#czm895k8ߟ׾pJPO\G­ݽ Ӻpa ұaC._/s2+:7g?2헃}}־),ِOe{㺵(pl@kWW\oE6'2<(Mt#E㶝tr\;{7oSk55#ٿNhQ]渹.7k'O^#v^Ѿ>V."aKr{o2a=]Cf8(8<o߼7wHxA]@:@NL(V;sr9r}} >>u';*t{%&LfS)Hv.NEm(w)I:ӤNT{%I pSr "Nqd2Ly?iNy(1i=p/sJ耫gMeΐ׷tv27<qW<׃oɝ@:;[MAVlJW+_#,~zt^;mJn_ka'?$O;˚O\oIKg'7|,x9گ,Q*|4δU!ꞷfZ4}~P [Z4\sMɲnڪ_Ƶ,vHݸEy0e<徕$ Ĕ72"ADuLbWrp+0FrbwWwbW{OSɿ3,;CDP70`;x_I NN1Q\)_ϑ/RBSo k!!BX L"Hblg3;˫]p@NLp"kq/$RLOW ®DÁ_ׇ7m#3AOC+W*EsXʟ8R8)lFձ??_'WB44p9SR5F/0sfvKk]^4/f|ɿ/,+VwGa[HSgi &VV\~2V~eYXWCBnk:˯g]==&|& y@"9̈@zu{*kj0,prH$pg'|Z.+a)7z7D/!!@71LVa)g />-|4&^u.GJ]%"/BB4@N9p̹\Wa\#U !!pP X̑3GRCBW&Fp`cX X2K=QŸBBW@N3 sjT5Ղ|fP.(1$ rȟ yr宫 zzh5M0, ). yjjz/$?R4/e@H瀏f3Lsb=Z|a{" Z UQ $`r"8i >quL?lx={86pK "DZhlULZ0Aw"XWU+@ɳ# , K9&BDa7F s oF3!f+mC KnjjjjsmC"zTXtSoftwarex+//.NN,H/J6XS\IENDB`luciole_0.8.6/themes/Tropical/icons/gtk-ok.png0000644000175000017500000002272711437126703020002 0ustar niconicoPNG  IHDR>asRGBbKGD pHYs  tIME  7_= IDATxiuFwSM,q,Gےl+#[{2dNt|cLr$3g>Lı35Z"R})KwcޝU @ tST_w (wWj``ey^e,2e˲ eY,`Y,X7DCI6=@BTLME9GO?T7ۀ@bN? @x |x.>@LƀsP$GnS Wzp#&(v!7<"p?7g"6@t>(s`g; vN@A]ihR*7>JO|[22e.#3}ҐJY "DMmHBѹF\5i'_ܒ2F%5pl r27E/$fBr@ѵ^ӹ^t }K[3?[ M\SÆqC~J!ޫ\@c|i[e"ڟ\ۙBJ=6=aJ{0xGm] ݄/]9 %S~1s3k&wm*[Y$Nf;֭XyEO52ys_$7p|ahc+ф b[!ƆbJ(%+vXDW ėߔ)aW{k}i`EIheA[bI7l[LŌb>Q :h.buC'y{f O܅@YfcW$_鳹̸o=4tk>3o|roW@&%'ݡo[݊7I =*XRZʥoޤ0CʎuW6^b =".OWXU=kgcMO%y_]G9/0n3BjD 9 u}}eyJ* ^`%\%MuKƧZo F oJ0Cꤠ-]H)mbusocgFk:sB8Oն/ {/'? {Ya)4ZQ]Ě;#B$N&O+V5a~=[|䛁{Ɔ5ʏ+zVkHN $zE43ƆaC)vŪp'_wįk8C~:xE ݲљvKwnE,t@fNrp1ѫf W̉ įY]1g7FɮAMv"kV'@\%M ڿ٨i=4N ӯ*VwB;9v_zWZDcjuvw6v\e}SI2Bzb⊞ABNqwTs"|*_)Bz4H4I5'v_t[΁=hRN1Noz`J`;_'#uW)vEGOk3s!uwc[l~;D5eQUw&ڦ| s\*єgOwdƟ緳Bf*E z^kgFn`|W3:@.#,)̤ &n:j 9ѡiE5 (V~mn.뻑u.A_&"Kg!l_Q%ȴ-@eo;+v,L2 4R):ЗS5n` ǖ S@aL(UaVTmr;lzʉ03"&^:g>' YtZX;5uh,+r?b]f㛹HF#qlrF5 !̍Wg㉞ŷJ_RAʭvE,ZtlV5Qo"eGI\Jָ KSRA37. 7E')P I5i7+?Mb;vDUԸ!5>?8۫){=pz{BԜk 5 5/IFzٳxӚ[}]&BsD"HKiϽnY:NǟW q.]PJV4JYMqoKo'ck;뭈0yڐyT#KўQ,8։ẅBc)^\elq;a1}UVxgDqph dU"~{o$tFWd'(,W2i mqFX1`rA>{ / w=[e_OWkՊbk}J:y&..]-WǞ`ͱs g_Fiēj޸K*05T Yh`q0kj p_k ]{q[_Ko==hv[Á_0=t/hM$4SUBD͓['p(! ņmhe-9 z-H?_xC ?e}9zQygW훯m1ETvEA%T˒n?CM$lx/}ako0SLrYXi=)T)T1"zg[`y<8 ,;6q?bm Ʒ&^Saw%`S l[K a !&Ge` -qE7罬jN'rٹgHpuik[?hBO I":ZFkW_rA*uL8L:sZ UL oD-gF7_i~3\ֻzriaM ĈVu,~:!gk,a}B;Eaef[yˆx7q b[ ;g7V:45; gahi9ʚܲYsly/ Ԅa|w(C tBg= \m{IDxSύLB^9a Jh+heCqIn.o|z7áFs=5L?ɬߪtjY>S3[h X^f nlNwt ;z~dl0r)7Ff !\2Rժx_ܵz󓓩: s&eݚXLUQJHGw3Nc, rhrJ0јUv`` %RH*㿸e/0'8𕻙̎0]:㔤@gEB  Z] h+٩e 4Ɵb"'3Zxa`p'lv'@T  8826Dޤ8y=E=V b0JՀj*+-  #\}*ǁHx8? C=6cTYB<HD,#"ul #7_J^j:e ?c?1EetHDnm'mqAЈrVEydj\8DqPpDzE ZP$ˏQDzOR4:;X*BNu^s[iDl$Z$ mY"ߕ}r`NyfnYolyo??95s«kVw~]7шFBcyGV]֑}߾)I^`1}c+ߏ<Ɩ<'rϒqF#_C4 " Q;D"eZ#]T^Bf YmS [SG_眘y vnmH|ɍOs2dN5|Sfe,APxU5*g&N(JO7-Gڛm1SpGrcMKo)~yaSb0D0h mި7 AA V#}A+m1 `iEX3'<0om@,(U(fr:{c'(*{T ebfg1-S`׾W) 'S0t&l\?@$LeԻ& ceƯ܈  St?``yN _y}N~Oӓ~ߔ)9$ۢtvEEkb=jS^鑝"JyV,T|ĪIyukd,wb#!X5zWY`\qHAoi9iO'oݘ+P̐?(zNu6m|5k߭W>0q=@͒/Rr L0Y:p6xIW=JRRNyMhwߟ+,( % iӝ& tek+P5=*wcU *alaK93M2g E=h2 ؈ZAd d'^MYF!kJŻ0/p.ANHS_aZvj~NPX6SC0'3Vڇ#%֮XuMy?S 턪iwF r0^jMmO oߔDY*]1%Ns ټJU?SΛ"ϴhmvq0.PF}osL0R²`M\a=Vŕ2MktAPq[Y @:ٿ| 7 խIry!١+ʥbFty?~ߧZ"XzрZ04xt78>d(`2uv F#h}VRxI\M%88>OT٩@^#53&2?c ]$f}X"cguU*\UZp uTkI]FGxt7ɗdLڇA  +W{ѹx9|'ew( L}eX Y2>rFgE;WB| C.?-@ot+_Lϫ#ZT5 ~~0Gyx'[bǤ}WmU|a ]0.aXÁGÁE7qLx |i)-oۓ cկJ6q+C?M蚎)Z(4+w3>IQRL`Sdu[7n"bYޤ 7B}cUSY ,K 9>G? c[eU SV}g{ǻRQ'XnxI"Q  gtG^;/F'H;L^Eiåm岋bD W?9軨hE {o˒a{8 mѐ/ߴ*cϨ~/hC4sZE|֠wߦङvNЙ;f튵(mN*M G)Q4Nuɽ ǿ wK']f2lFQ8Kce|/YQi8jPuI!!wP ON.{H'(3 ld*9{5D*$kK*G:%n#sӁkJǶMG{s%,RE`fҸ}[unr'R(<^c;kǹC*?F9δ}h4UvrɆDTB*UUZ+>ZXapbZ15f?K[,k> |i"F ‹C@? @U0_&_)*+fsr1@ .۴hԛg_I5_)xxVA/ Ly~@C"hpMxqoz!`sr>G]JSݱ bԋރADQ\С1<@Nƙrc(rɆ\sմGp?­j ? p: U; }-U c]3?7Sg͵ JoZ/,tY9xyW,T쏝C):!a8`pH;( x|7K򸏛F~"OSE˵wʟ0i' SgtM>/?V@1e!R IB_.\TɤJ. &B j(I)g?ER\;.:Du 5!jЕ"7=ĩx0+hǝ#yQ?s~(A؍07alr'ya;1~ܭD&6/5 %f!|%WmE[+Y w^W.8U[#sPR.R禟pXp#H=a>ϴBW-{۽,Bѿ nw6\( ժ+^e=wr |l7!_%QUP+mPZt<6s #4G?-"援JOV"homxn\&QV$n%|5h|BnN@Wعc]^E#zA'0VK"5!Jx;yU7i󉟐5Oupjh{c?탑Nm"@~F0Әa:"D*7< r +.NRD(R)",>q[Tpp֯hF%«|_?kZ,HODxN <=$/:t N CK&zjCz> GTu%ly+`Q 3O̓nwfx *@}2',TsӛpC'T:#Ivu+z j08itr:0yArW/ޤ`shuǓ<38c4+&N9cy=5׸$4&²2]='2SXbjA!g ?a;V|9O)xQ 麏[Y,,*ʲm6XB/dW;IZ]5.6\7>)g~~}WP -Œ[{A-X!IR($/hSq_70/KIDAT6ۧ_ =,vS|=+ChLbCR5fmlW.6 Y`9 Gs9{8uޠH^3rn=ޞ?T:XR'y<52*6%.$Q|6UWi&9})}I3vȮLaԷn|v)@A\^MZuf~acvַCFP!TM~4)$Lp,7ġܯcIM6<#/K*@:sn8(zWFHTsBeXUVEKWPcI4Y'K<$hҧSvo{t妯Ƿ_njhLѷҢWQW]ɠEJ01P*zyZ_kwxykfUY~&us MɛyEfLٹ4|@W[jz Xtk6`㶹HErb]RQ'5h(?y}{!khQW_MmSDbHX1a NQ`bQ(3G+RZ )o#ۯ~]j|v߶ubsrBwnunOafqa,~Yg9(W5oHߴ~#Ҧv7b8%y]l2_g-Gzcg- +OGGDi6)(bx͔ʍg\E!>' >o  ٔ|ѓ>Cy6#P֦5"qէ#$t,IhM256ics29}Hx>QbΠFYΙ:! fɺ@BzQIHI׳i@,uf58?Z,\\M a qQ0k|+Z=@ 'ͧW~;uߗiT3z+j yz/_SH릒f )i/KVYzٟKdJ+,]lONp;韯Bc€X8k"igu#bz.!M\!0L9%s4 !3(g?0Z ea<\ %Q\:t|gJ<sРT|sQZ 9\Ar/zCjVgـa & u.t\AdEEIlIENDB`luciole_0.8.6/themes/Tropical/icons/gtk-delete.png0000644000175000017500000001227111437126703020624 0ustar niconicoPNG  IHDR>abKGD pHYs oy+IDATxk$U[y1dw$uHb@ɇ !RE@)@"ł`d8ٗ_kzcfvwv^=ǽ3ӳ;NݪTSknսU@FFFFFFFFFFFFFFFFFFFFFFFFFF mwn6~kI2¤F2TB!% *Pac@u"SE H5EҲMhny,n)'MqR} tQ"#HDnVȍko ($Kg / <ݸȎo}lB[[J{w1$3 X]y+u[lyc&ufU!9"z ~Nc}?Ӵ7-C,7ݼVlUo37 1S_G?Rۖö / / o|&[tTۘ@"Ig>ɳ}?_ؿ,Ke*KՏ~2\?׾r{mŜ(?Ͽ2cAW &`Z(=!M}*|:&_}1JD "baE`@ZZٵ"zk{z[3kat`j?<(SEs:4P⥋ `f~###cnLNN`hhh;m(ƠlZl1;lG7ۘEFGGQB>ӎiF%y"Tj|uK+hҦ \!naE8IRj}43H1hL]\A`C!0TȁPoTV*UTkb ;ȶT|` \ ΦDaXbR Z1w։ %:/2?"Cald#Z qv<Ș LOj14OJ)7fV.\Asj C)1`"Py۰8pGNtG6uv;Juz2$6hD60FI8:7"Cx`3/lqd2NemgbE X1j. <ׁ z-ZQTV :e&lDZ% 6{"8IIOow pϽ}&A?E ѹS{z뇏c^[j;M 9 zvZC:^&\D+teg[ v<&Yu#G㰅Ϋ{:[f ~ePmHPoU!*Wpq11>r(N`ju[:fKĨU-XsQlP(;mDg.A!{0Sܙ aRҧ+om58xh+8 0<:]w`|bϠy[`f|xp1?w`ԝ(Gʠ^* ߏ|W1kbqmqkrO|{|=#%IjwOT. BPYZ@z gq ߙ&&'111 K=k s8N7;7D Nq}x#ǰ1ӝRY51 j5,,, ^^9}/]"qࡃO} wyFGEe%jxc"UFKq¥9xvJ# y>hX]YFJXY^ĩ_/mJ)8 \ ss  b t}>=w`|| CCCpqlj0޾LxĉSh!?Z } d4[mxb 0nwnbQ_V[A^GGdL$q!BaE̢!Lb`š"" åa b!@S(GTX$I'F1J}=?-^@5Nz>ugz_kcxd v F"H$ҸkZdwڴ9˷΍;ӫuK /VQ a؛R@Aݤfꦑ w@ܛL튼Sx'WL| .~>3 r2RN&@H9)' dL r2RN&@H9)' dL r2RN&@H9)' dL r2RN&@H9)' dL r2RN&@H9)' dL r2RN&@H9)' dL r2RN&@H9)' dL r)}ַN\r! )6U{8c\t{VOC4>O:w]J9caJ"PMڒw^;zZM* G~ (aE1<y(!JJP1pJIQ| G2Z-H t l ҉ٹ59IKQ!BXkˋW Zlor̺:QZO> {Ǟd0ݱkW-b$DabnnS8)[(PDX @Mչm GQafnO|9sI򖆺brI"GϋY-!PR &.H@ V].;j BZcG6.WMz᱑ T_`1B"",k S1y}^g"r҅t,MPߧf|Z1L0PBGh50Ƽ}j5PWaaR U"뇮K$N@lԂ'(ZeϝƋǵkQ*z\G#"KޓObieR C1ɛKA;+x_\!TZBH} 7s #yR|X{awL)=wžSw` f0 I)b3C)333S䞒ַWJQ Dvu\t 'N>|q\026zUOR"tԎ?ʵpB!*1R9DJ.91 S9YIJLD<"OAAzwrÇ\FTP[{GԎXMZ$I c a>sG˧^z0EDD刕2Db<)"MY &N~13xcX#Gx@kk}O<՞VþR [O=\&:ƒDt7j{>CPD4ݻvc޽A>G.C>C>C=8 k L 1I q00m.^qu~f1:(%D@&rx"5ƊGAIML{//}Ġ1ᩩ%8Dyp]qkh".%bwt8 ?sk"8 yZ\ @ E"Q ȴu'I=؄qt7 qMOOsZURI5GM50PW"Dp fZcnLa x#K:\*3V,FXD%t@lEb閮1a&jftt<쳂kR;!K47 n rr)W)톡ҊYD+HkikX1^ZV-+Q, 9s ,@m iLYj[˖!cɲl [kR(IH$qNbcߘ&nUzd9؎^P965 Qns 18q1=ac D) [uD1,8BtD$$D$IIbNRƱbD**6rb:mquy]^^=OpTADhpM!%IBQ4cc1c( CYc(c6& ֒C"_S'bR̂UqږeU)ǩ[yZZ<ϓS| ?FO57"zTXtSoftwarex+//.NN,H/J6XS\IENDB`luciole_0.8.6/themes/Tropical/icons/gtk-dialog-info.png0000644000175000017500000004152111437126703021552 0ustar niconicoPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxyy'}WUuUF7HIL$ZuYY˞Yi7޼}fAξx㕽k{3Į#٢D"%$x A}4ꪮ8#3 %+62~]E~Kj{L~6::x)T*EA/8vB$ R$tl;r۷]"!TSO$IE?ҍ֚ak܈qv9rՉ !.!gKl19͛޽{-"} ;汓?݌; ,/ί?r?pMw/ kػ !ʯb}Z`{ށZݟygښw}zu z{絲-KCJ=w޶n޸.DC5C4ٗ FD,8Mo-מ˧s4ÿПWʑ|otz)⁃竵rT<ڹ>Us9<0D9j2fCK^_7օ pg^{5s=y>#nj՝JU*eԃw޾'d"G$Ƙb %C4z9g1"\#D$uDw O7ݱEƺPpq|}?P&0]@Dqn߾}fߊ@Pn[簾&EQQ8?ynZk)c<0D R1D!  q@5(j:놜#9ZmfggO̥J*hc΁/}KZI߿׆T~7U?W T0Q0mx}{S(ku9Q#q)gMV=/GD{[ڂ1N# 0IRP3`LLMnjfh4]K_oo)(kO>/F~V00a ]"2Y~6 AΘB QΤ60@<b?}+~cms]IQz'O 3&X9 `}?M_|)߿rг/?ZFQRTa ]64w-^|tλ/3W;jxUSO=%~5AR( ]{6 " NLp<  #c]^O5N-;1 ( <8Rc^FB!tFFkmRZ)v:;;ykکqDpy@9` "OԙCQxU~o07lذ3  t Fs` 2j\<$w*5~PYbPpIjș3ƅ߷:wsa9kʵ_ G`p:t`3PVχGFo~K_gͮ]?#W0??՟x\.a(l. C qCbC_FCcumofrKdQ›ػ,H99/Y&r8*SeO}j&$e7Jv}UUO9݈sZ Sw~NJ J!H@guYǶ?wÃUD{?~gNx|sHp `hyPH63ZI#)"BT 2UoH"2ߏj[d$=^Q?X{jcOxn޶mƑOwpa8pCDsb,83891d!:p /3t{cFbǶM@r0`Է+<~\)200 xVEZư0fxƷm* nrrߺi}OYpl͚:r# VU+_2844!|VqK%yTpDl+_+@ /35\8gsf,"Xyeo.>ډ  |!<,E!zβ <Bǎ{l& "f- eǽ AR^H 89QOWvEa2,bsy}v1-L$R&Ke!2d {n1{zBWGK˛V fLLL=U9 0;o 9JOd?y +XgaP͸ZhA' C ^VBpEpe~! 'Js1F/n\T՚íq0*6}U֭c3s[:yP /_mݶu=\0zh( L(ZzLԊ9{8$}]x^=^H/(}l.rB_O09scN@[ 9u (8϶c{x-s#^ya9<ͪIk-&ɔ'PI|rvfx[!N9c"ѣG6CV}eM$ Ԥ?aܫ?zea&2EP^+^Hb\YK%1HVn;!"sɉ kեv{򩧞:qc V XT5 ^pU9iZ<#"RΝ8qbwe~US,!`<GW2 pBۇ1\.K͉a9+r]\5ڠf,}oC 裏b:gFJ-|+L1&:٢Cސ F<~(9[Du? )\kYS3 s΁^6(?on`""C"p[?858{,*ʪ]v'ϔ9 f8q(\V !7UJu!szp.\P?tcz2PU`^ߏ50߳ )A vc~ Ȝ [q=X26Mcv05cTt839ciĸKVjZcl)UHQl:\cQG"ZcL oٲy/x''N|g۶m>g}v뻻y=כW?<;wq楠`8}+~N!9gFGtql8>"HQDs1Ƙ0rsνyW=/hq```)nג$7Toՙ]Zlo*Wzhxorm2jLZs)Sn-EΞ[-[<~m a4ʅRY9:6T7mdn`ԗ237?s㮭{2]by•J4w ƑC^ `$5KD1D: ,dT+c~czzzl4u:(ZSSS'!"Sooܸfs?K"5q=Ƙf/_35T*.Tdbrn[cSېB3Dg S'ʜqW A(;;wpݟU@0pq6{͛USPi[sDC3fISIDD):|/šm۶-OMM5֯_«ԇ Buvơ;o~ﻳ%@0QFō3+ trj'J֭k;@ļ324;pla6GY9l 3>}ԟ4,dj,A\,!"Jܷo{**`̈́˦\C"'Ol{MCDڼygnocTGGGUo*~8Sxfh r~FVwdsØZ.X}̉76rm"7:ܯQY溟@AF˳ p>ZKj6FJ\P)}Hk c@$%{ʛU+RkFDH9B[ZZ˙Rf$ΐ0#`޽w'>]B`2MYf>:׭o>TTiSjsLv]L8^ryTO~hL#"\8491f//4F nkQk ̐Ɍ] @ UMaa K.c9nqzԈfggv{'ϟ?y1B o$aã!^EፈHOQĚ̴?v2Vt; 2Gm¬1U`B.*\u%Ampƥ絊k?\3g^BDp+c(&A"jÜ.U=*طos Y 1"ZIw1v^EG,%Ih{ib{kK/t+_c/^XhHz#BB,~|b_4V2s2 4 p]Z;9u6 lXaᖭ[;Xɡ8kǹ=O t斁)Fy4ڝeQTjwy={Y/9 ^zjYv~;ʺA7޸⋯Wdq1np~6U%|7Ag J_k'ܐAc YkwHa0@Ȭ;<24. 2!f]n9C^V[G*7D*۫ZjY>jNG&n+; rI]N3`vv~{ٟ[nkeqFŔyY˧"@ vbbm >%ٖY@h82 83hzJ*@5a2ĝs={%%X>0Chb9ZNхU3hUo>w7 `hcV@6Kk3Qo,%,24YaŹ-!Y䨡8&̞xuZJ)ޓs`A*)ˬ5"QFhv>s},!~g~ޅT(U:RʄT6K25A+؛r|@$i/5s)?;o8qxF`8ဆA YpdA= k50/c*#؟=Ka&J]J cITkfLk_D<7V|w'F+;m)dp68qfvRzn}۞@hUÀ 4%:%Q>SJD3+.SIzqJ'x^ǮlG1K?#oI*3~*dK̈0t˸<.73 yj g?||nh.O.57N_s̝oZz:߾?|g({lgyð̥֚IiwS;iTJi?ת77Lԛ_?]u۷=SM~{Rc_I?MyҥsIOnEM=,nܱwn=58TI4\#^>qrc8Ɖ޵X yܒqxg^=1 ! p9BED,藒iӌ^h?M|\+4V;æ/5 oZ p=JKA4ƣۈd򚁹[9cR:HJv]eE3FX*$ҏԗFD؁u~?jF`??r71)%q],K+D+CE}nqf+t:ւ6֎UնɡJ\ FhJ쎍Ri7fX`DJ)LMʖ%R}m&3&.?yjR5 ePt(ǩtRZ̙H}ݬ jˋ27Qɭ%5Z[c.;=7v뎩Z;c chfqiJRJ( 4w8T~Ki_zkb(kDtx7(iJ]~S#y{c+"᳍ƒ$ @DR\U~`~;AlAk-I)M`*eA)%KaT4~@j$JJ9:޽{ 6O6_ d*'b$վҲ4MQ)Uڬ(D|u sbu9ZSZJi֮(vOm ic54MuӑJ)"p9PJɒ88 4 z{^@fg>Re4IDq72eּQn=515Z]' 6O56-oXkCZkr\X- ~ ODx'biEơJ O|:W5  C畲V.S%R])yb Zc7b]==/+KDkV!Ibh~{O %z0c4THqRk?ٳg`ߏ)#9b_|_߿Q*ɄI6gdy=:}1bko=}#nN*5i+ Zh)\tKA0SQ~uq5iqX;r,4QڗR0O]7=׌O,^ytldGa"e<$ᮘ BE<ک'Oz%zvo 3x5[%_r O~t^+U f֚+D/It-[_=r5' &U@A{5{#emS R=j:YW;LC?v}뱘( xwhA܌;MZ_=~v{ik-i+%R_HyN{}] ;v畒AC(%M%2c F` 292[+ZZ=. ft9`#8W0RqLf:Q\J,K6v-~kw^A\F2U70%g=9BѺ"zgq);!#EYh)KS<Rjܵnnر]Y37ƆJ_JudI,@"F}n`,-S DpE2uVZ=0!"i2ЯV(e[p}katnY$JJOk'"#HD7;2cSnExݙD3PF;_KxMKzN]926T3R+_#Rrk #4c ]9\?OQX`~{QhEi-7ֈD)OkIci_߿޼c5*嬧S-&4po-灻\%!C~o^B"|{,#L 7ƉX|zh/jmDVhТ&͵ZǴBtyyaap Tt:#RX־1NXJ&BzĘE#:~I4F!d2Y.1-na&f:\k͝L)# e8+p 7uۑQ-UqLHA[%>p2r7 gA)-302uq0)-X)[iŒDV7Di6'Hjt1 94M]h[vlСkQ:L4w1LӤd)5'NC1$;my8kwLA\(m9)Y5Ʃiwn-I\2 pݸ':;RI%oh/V8I@eX"`>4cBM`48"h,kpgNbveNH 绝nI9I\i_ߏGXT7?6lU|=l g 5BΗt%(f Ю"@C AhM9G]@V'ǴL"I\ý&t ZJəs{@\R)!<@c! ED0Aj(48@@6@A6t*Dy h0­Τ'IU<cSi l;a:LzE!0 :!D/3Ap{0d 3=0??K5ӧ@İyÄ>:3_~!T` V) q`:@ ]7m ԉ!' B(@}p֬] Sn:X~}Zkh4p8u4z} d뎮W T @V)ظa=  BFy8P.W\.C\0 a:q *UjP@)>~qKp xWC0}"];'Z; ;^@ _ ҰZ+zrQBVzjA3gsЍ rm~80㮽fst Z4**UH-wqW q(H$z* MKCxx<\xV@URyGi$K=:<7\I7-k>n.:33YZ*j?5sóYذ-Ӥ37w{8I@',//t ܦKq:Nfff?lnG1zUY]]e뺸nK[.X$n*NBe[``QHms˲QIegG/o{HHض$؎nX)߈Ig2Iӡhhi4i4먚ixOחtǕ2P8vo+dY&Ĵ+bfAiuL*tHod*$PT;I:LN晞&t0L|zTM7r Ub` =׋Q:a 'N*dzz/gwt۶u}d,;$ >fvj+W8Ü9{|{~@ЫvC\ץѨ4Q $˯xJnRU#$I$ll9DV+(;>^8x =8q<n?'a  mR(,87:uK/t0z;Prگ>u߱⬬(r99< L0PUutD>o im|cD cdt]M(./ykh,-](B8$W芢80b@RVB.lD"8m膁k$)dY%J!) L#Gm6)(J>'͒4zf:$8mc\ Oo__\L1,aC $l 2 es`Ke(2MS{'ȓ*011eY0y:KKTt]RTlτ%:wU-INٳg/c"7m[hȣ~Ӳf3lڤZxMWF.7}* A@ݢjy2/_biiZJ.]x၏/+@mx{tvG}(DQH5YJXئE2"Nc6:7븭6#q)8e[(n4\(f 먊J7lEsUǾ_oKq<$ijydnv!n0-Gp2o/fFyQr9N,==ϣri.j( lqÐn¼(LIz1X` ]KCVSD00tT*M:B5&&r43N11gzfg/0jJnbA F;JfsȲ$18zo? |hHcG$IfL<{$䡩B^ٳwt*5ޑB"FuܬQ SSS={RJzN8ƶ-W_}/OJ~ЄIDAT cMI `ZQu]m&޺M88IEs~)VG) "8 C|'llR6paMq$"k6 g0 ĀCݎn[ $0  xq<)m=8$IZB,xjk>n|ml?;sNq^ qܓ$iCqh3x5G?=110 LztdIENDB`luciole_0.8.6/themes/Tropical/icons/gtk-dialog-warning.png0000644000175000017500000002321711437126703022266 0ustar niconicoPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxY$WvX2+^nl5X6$Ȟll`X="= 6 le Gf!93dsZs!"3#ުu3rgㆨ*O/<\y\1'x sy\1'x s <=w>~ݢt1\hL㹆O<;X d21pDhb$w^G" Jaq2' (-HȎS'ƭ ^M'&êwKf=ȋX Dt]@Z@XlfՙQ@40LL(x}",G x/\9 kY7H{W] @Uĭs{1ܣ 2! FQjNU3ؙ_A‘( &"8[=rr;9)G ߋeJ#vXp+ti?DsӮJ/B\TzNWY`aa(,p[hMk2'b-}: a 9˄Y!LSgQp \(8w(0Ea 5Mߐ1%)ȋUn6 OnvNՆhj^]1eD Co)c,l1&X_6 71o#Ly}9,D9?c""0̋ڔ Й>s wh!2"Z0C@)8P.8"d( n1/k*bd |/S8 텼b+4KfT0b̿.L}$8 Jjzԡ-t f{@I^`#'NbF1̠,ļNbD39LDq]Ui5p!iJ6By16*o,eDQO \!6%8Owxx> [75T~`'1#듾ܽ/Q_Z e.E]ڒҗe㲥HA3@^)TQ̣ !0 z ۻHt1]RZ--Pu+]aa>[pI!G(V&8`Υ'p-^A(Ch=T9po2$.@<Ҷ vxn^B>:HZ_.#8 OH#{{ի6yMvob <\i|X)@ ة H&B 82~.deoJ Ⱝ` ГC8TV˶]Kiocf{!sr 4p}݋0K rW\S^!{ۘ~B]WZP~`;$ճM Ÿd1ABIr.f!a@62=Ek唶d_TxGQ.[fliub,N ^?_3T,Ȥwb 3eBݛ{"‡9KsRKrVQ{^Ä3dx}ֹn'yߗD}} c82|' *i]2vaɽP|*,$Weyam7(^}w;~i\$ (˥0y 5]@esRKV奎a`V:<)6LY:}M¶g/P̴:f @R1pv8 [x?'{T^Ԕj{9̀kl/`g{c{ pK0S*و`Fk$~}`QqP^ uli]'{ QdH9mQh.w1xuNwv 0c/b2eBX뺃Roq)oaP\]O#@Ǩc{mWhN 9SJ 3Rӧтs8) CB6,J9Jnbx:tR(Y2Oul\$TL"f8q~0}}9$QRl"ab%.`X]n™`ӫ_8/z (n7n]Y;hKK stB˴ {Աp[i*/fn" o; 1Z]2}PS1DjwP=į? Z CK4DW~dU^ +ꯢ,r&^m$+aC/tW/,m\T>^@RJN@mogVTBrףbWfƒB85v?,!!乀eiqmcƚdW4a`'!A ha&tf]RV1idžb oa[ ʦ 2es`dL/Cg]GV[P2Zh\DU,4xCFSnR՞KZَ7F4Xt BϿ!1|.ABC9/[nI&-|M|o58;W%XР۝휿=^2'y1 ghf^/c&&e4}Cqbˈm,%[o]_I҂HGc/7.nүjn]F[+Y'lҷKU6ר~7tDLfýK,l %PH!FJ Gl]~/_+ w&5۸o# :v*~ĩe̜Ox*Dzl0ó!l Dg]yJ7+fG]8;L0t?cT/ָoxi[%( $ϭ;pг2< DGxamp̐_ؽ@?˚9WE]bT'%=@8E.(XÖ/֞Z1\q1>Rm+@Dc T/2W㪾T Q;~p#Յ`ƿY `V£y&!(ABrPy:pKk؈EIҸo ?%?p-힯{&"9իf4tUϴucG0|n*[oAۅ00K^Tn߯bF+uLiHVt&Yp\Y-=s)y}\gN(e^k6 *؉c#?Iֻ;Iv~Hqqazv~IthSɿ]?e^GHcֱ{WٻdT/0=E}>]Ӳ؉"|Dw&bo>dKEm.(nm ?'> lԳFS׳ݛ?I)ՋY%^igUG >oԭn;5( ik`'yVBN~IaG8H1n夑{$E2 κUC`ObKױ-0:زw(0%|&mo JϞBR_թ6x3O*T|WҞR"b (ERKc#[ la 렯Xv!| vpȨcjc+ݷz9Zk\5=$.b ۛd]ڏ"_4-i')feA;m"|BHmT_v0\%i:vw>r2qUysS$8@4@kg [Yi󫀫JBm/o "[kaukk™SO| 4.K_H`/pXC]xl^^E}5(l{_@;'U;)ix]|i]`WFa`1~Ii"@X$^JFt>{=x(e@:7.p ,G@S0'|ܪAl![{(M!H0Lttz792g{p8vNAW/[IYLxyl3.:VIdA70~lwk؉w6􇔟?pqp #L' fֱ]Xz=}Kt{׎c'1 ~Xf46pQ[n{ن. ~ b+[,1gۥ1Bؿ3}K< - ;ܾ߭ς[{QvMD[?J)w€՟3O4~]$a~9ʉe=:!(X? NwEܒY7/٨mw`"DPи%Nas:s|A󭵕ۚb2ѱC zo\Z u >+o | ZCʁ@CV~M6=ulg^&z%w8ݸ b NbF¬/t mPz4 }uMg g4T,ePY[q5V723;WV`{p P-l CR:vC6/K8;c2C3/}b"v-x詳#_`܋jPYPo-1FcSQY$qm~ 3s @C5dghSh &Jyg=1Χm+ ʯ4PvcF}..mc~@t'EI/BW|3 ZXrCvˆOao ڸo(L!P'J(ci|ϧ |ӯaKLuv% ~v?hf\-]IDATaa;q+H/[H.NWZ/ Q3F,CN{muҩ^l[Jo)z;w2| ?$(=S x3S(c|Nմs'ax2!U`<x0 7^DW02x~i׳v[sWwYvֻǭ!) m4I4&q;L /T>hF0'cn0ADBbGʘ2fxS^v/p'_Tvi׻[k/ޕPpH\Ɩ-b !΀{+UP2Ut8N dٛ)zCNX8fҳZ'&o('`RZ@FTL,])=HA -θ{ߩeT'7>ÄkPVE#EQҤg9>:ɘ){h}Fz oBh2Hѽ,{c ~nQOf[v|)0*"ކ(di11Rn;-#$MԷ"xUڽT5ٴv/OF1H\cxԙ"m~&e8@6NLeuC(UR NwD6#DlJ=H` m8_H6{qds*u[@<ڗh,Ɣ-7hoo8|#%_0پ`J!&H0%DD!>1DxVK80Lp[5u+x-Y"-?QOJJpR[)ZO/;#VOdZFK1:amhIC.-O,4>^?YS˖@UV$ű(ב|2ViVK7?_":rtػMTl ;Vdj>݋iaö͸cO|S.M|L6<%c fQ C<Q&%@o7W4 {sNMvyME#8gM\%npe4nv*pUR wWxFQ*JAj(z;-+_|'cxw-@koPZVQ[4,2uZ|3nt?R&4"ϭ_s> PN:wCnmIޥG$ BO4x&I3}l~b{CJ&p +ޫz+vh37wQ^GçRO6c\qO <@ϑcB e{`p?(m~``msgO[<}'d' sy\1'x>KĕVIENDB`luciole_0.8.6/themes/Tropical/icons/gtk-apply.png0000644000175000017500000002272711437126703020516 0ustar niconicoPNG  IHDR>asRGBbKGD pHYs  tIME  5 p IDATxiuFwSM,q,Gےl+#[{2dNt|cLr$3g>Lı35Z"R})KwcޝU @ tST_w (wWj``ey^e,2e˲ eY,`Y,X7DCI6=@BTLME9GO?T7ۀ@bN? @x |x.>@LƀsP$GnS Wzp#&(v!7<"p?7g"6@t>(s`g; vN@A]ihR*7>JO|[22e.#3}ҐJY "DMmHBѹF\5i'_ܒ2F%5pl r27E/$fBr@ѵ^ӹ^t }K[3?[ M\SÆqC~J!ޫ\@c|i[e"ڟ\ۙBJ=6=aJ{0xGm] ݄/]9 %S~1s3k&wm*[Y$Nf;֭XyEO52ys_$7p|ahc+ф b[!ƆbJ(%+vXDW ėߔ)aW{k}i`EIheA[bI7l[LŌb>Q :h.buC'y{f O܅@YfcW$_鳹̸o=4tk>3o|roW@&%'ݡo[݊7I =*XRZʥoޤ0CʎuW6^b =".OWXU=kgcMO%y_]G9/0n3BjD 9 u}}eyJ* ^`%\%MuKƧZo F oJ0Cꤠ-]H)mbusocgFk:sB8Oն/ {/'? {Ya)4ZQ]Ě;#B$N&O+V5a~=[|䛁{Ɔ5ʏ+zVkHN $zE43ƆaC)vŪp'_wįk8C~:xE ݲљvKwnE,t@fNrp1ѫf W̉ įY]1g7FɮAMv"kV'@\%M ڿ٨i=4N ӯ*VwB;9v_zWZDcjuvw6v\e}SI2Bzb⊞ABNqwTs"|*_)Bz4H4I5'v_t[΁=hRN1Noz`J`;_'#uW)vEGOk3s!uwc[l~;D5eQUw&ڦ| s\*єgOwdƟ緳Bf*E z^kgFn`|W3:@.#,)̤ &n:j 9ѡiE5 (V~mn.뻑u.A_&"Kg!l_Q%ȴ-@eo;+v,L2 4R):ЗS5n` ǖ S@aL(UaVTmr;lzʉ03"&^:g>' YtZX;5uh,+r?b]f㛹HF#qlrF5 !̍Wg㉞ŷJ_RAʭvE,ZtlV5Qo"eGI\Jָ KSRA37. 7E')P I5i7+?Mb;vDUԸ!5>?8۫){=pz{BԜk 5 5/IFzٳxӚ[}]&BsD"HKiϽnY:NǟW q.]PJV4JYMqoKo'ck;뭈0yڐyT#KўQ,8։ẅBc)^\elq;a1}UVxgDqph dU"~{o$tFWd'(,W2i mqFX1`rA>{ / w=[e_OWkՊbk}J:y&..]-WǞ`ͱs g_Fiēj޸K*05T Yh`q0kj p_k ]{q[_Ko==hv[Á_0=t/hM$4SUBD͓['p(! ņmhe-9 z-H?_xC ?e}9zQygW훯m1ETvEA%T˒n?CM$lx/}ako0SLrYXi=)T)T1"zg[`y<8 ,;6q?bm Ʒ&^Saw%`S l[K a !&Ge` -qE7罬jN'rٹgHpuik[?hBO I":ZFkW_rA*uL8L:sZ UL oD-gF7_i~3\ֻzriaM ĈVu,~:!gk,a}B;Eaef[yˆx7q b[ ;g7V:45; gahi9ʚܲYsly/ Ԅa|w(C tBg= \m{IDxSύLB^9a Jh+heCqIn.o|z7áFs=5L?ɬߪtjY>S3[h X^f nlNwt ;z~dl0r)7Ff !\2Rժx_ܵz󓓩: s&eݚXLUQJHGw3Nc, rhrJ0јUv`` %RH*㿸e/0'8𕻙̎0]:㔤@gEB  Z] h+٩e 4Ɵb"'3Zxa`p'lv'@T  8826Dޤ8y=E=V b0JՀj*+-  #\}*ǁHx8? C=6cTYB<HD,#"ul #7_J^j:e ?c?1EetHDnm'mqAЈrVEydj\8DqPpDzE ZP$ˏQDzOR4:;X*BNu^s[iDl$Z$ mY"ߕ}r`NyfnYolyo??95s«kVw~]7шFBcyGV]֑}߾)I^`1}c+ߏ<Ɩ<'rϒqF#_C4 " Q;D"eZ#]T^Bf YmS [SG_眘y vnmH|ɍOs2dN5|Sfe,APxU5*g&N(JO7-Gڛm1SpGrcMKo)~yaSb0D0h mި7 AA V#}A+m1 `iEX3'<0om@,(U(fr:{c'(*{T ebfg1-S`׾W) 'S0t&l\?@$LeԻ& ceƯ܈  St?``yN _y}N~Oӓ~ߔ)9$ۢtvEEkb=jS^鑝"JyV,T|ĪIyukd,wb#!X5zWY`\qHAoi9iO'oݘ+P̐?(zNu6m|5k߭W>0q=@͒/Rr L0Y:p6xIW=JRRNyMhwߟ+,( % iӝ& tek+P5=*wcU *alaK93M2g E=h2 ؈ZAd d'^MYF!kJŻ0/p.ANHS_aZvj~NPX6SC0'3Vڇ#%֮XuMy?S 턪iwF r0^jMmO oߔDY*]1%Ns ټJU?SΛ"ϴhmvq0.PF}osL0R²`M\a=Vŕ2MktAPq[Y @:ٿ| 7 խIry!١+ʥbFty?~ߧZ"XzрZ04xt78>d(`2uv F#h}VRxI\M%88>OT٩@^#53&2?c ]$f}X"cguU*\UZp uTkI]FGxt7ɗdLڇA  +W{ѹx9|'ew( L}eX Y2>rFgE;WB| C.?-@ot+_Lϫ#ZT5 ~~0Gyx'[bǤ}WmU|a ]0.aXÁGÁE7qLx |i)-oۓ cկJ6q+C?M蚎)Z(4+w3>IQRL`Sdu[7n"bYޤ 7B}cUSY ,K 9>G? c[eU SV}g{ǻRQ'XnxI"Q  gtG^;/F'H;L^Eiåm岋bD W?9軨hE {o˒a{8 mѐ/ߴ*cϨ~/hC4sZE|֠wߦङvNЙ;f튵(mN*M G)Q4Nuɽ ǿ wK']f2lFQ8Kce|/YQi8jPuI!!wP ON.{H'(3 ld*9{5D*$kK*G:%n#sӁkJǶMG{s%,RE`fҸ}[unr'R(<^c;kǹC*?F9δ}h4UvrɆDTB*UUZ+>ZXapbZ15f?K[,k> |i"F ‹C@? @U0_&_)*+fsr1@ .۴hԛg_I5_)xxVA/ Ly~@C"hpMxqoz!`sr>G]JSݱ bԋރADQ\С1<@Nƙrc(rɆ\sմGp?­j ? p: U; }-U c]3?7Sg͵ JoZ/,tY9xyW,T쏝C):!a8`pH;( x|7K򸏛F~"OSE˵wʟ0i' SgtM>/?V@1e!R IB_.\TɤJ. &B j(I)g?ER\;.:Du 5!jЕ"7=ĩx0+hǝ#yQ?s~(A؍07alr'ya;1~ܭD&6/5 %f!|%WmE[+Y w^W.8U[#sPR.R禟pXp#H=a>ϴBW-{۽,Bѿ nw6\( ժ+^e=wr |l7!_%QUP+mPZt<6s #4G?-"援JOV"homxn\&QV$n%|5h|BnN@Wعc]^E#zA'0VK"5!Jx;yU7i󉟐5Oupjh{c?탑Nm"@~F0Әa:"D*7< r +.NRD(R)",>q[Tpp֯hF%«|_?kZ,HODxN <=$/:t N CK&zjCz> GTu%ly+`Q 3O̓nwfx *@}2',TsӛpC'T:#Ivu+z j08itr:0yArW/ޤ`shuǓ<38c4+&N9cy=5׸$4&²2]='2SXbjA!g ?a;V|9O)xQ 麏[Y,,*ʲm6XB/dW;IZ]5.6\7>)g~~}WP -Œ[{A-X!IR($/hSq_70/KIDAT6ۧ_ =,vS|=+ChLbCR5fmlW.6 Y`9 Gs9{8uޠH^3rn=ޞ?T:XR'y<52*6%.$Q|6UWi&9})}I3vȮLaԷn|v)@A\^MZuf~acvַCFP!TM~4)$Lp,7ġܯcIM6<#/K*@:sn8(zWFHTsBeXUVEKWPcI4Y'K<$hҧSvo{t妯Ƿ_njhLѷҢWQW]ɠEJ01P*zyZ_kwxykfUY~&us MɛyEfLٹ4|@W[jz Xtk6`㶹HErb]RQ'5h(?y}{!khQW_MmSDbHX1a NQ`bQ(3G+RZ )o#ۯ~]j|v߶ubsrBwnunOafqa,~Yg9(W5oHߴ~#Ҧv7b8%y]l2_g-Gzcg- +OGGDi6)(bx͔ʍg\E!>' >o  ٔ|ѓ>Cy6#P֦5"qէ#$t,IhM256ics29}Hx>QbΠFYΙ:! fɺ@BzQIHI׳i@,uf58?Z,\\M a qQ0k|+Z=@ 'ͧW~;uߗiT3z+j yz/_SH릒f )i/KVYzٟKdJ+,]lONp;韯Bc€X8k"igu#bz.!M\!0L9%s4 !3(g?0Z ea<\ %Q\:t|gJ<sРT|sQZ 9\Ar/zCjVgـa & u.t\AdEEIlIENDB`luciole_0.8.6/themes/Tropical/icons/gtk-add.png0000644000175000017500000001171311437126703020112 0ustar niconicoPNG  IHDR>abKGD pHYs oy=IDATx]K%Q"Ϲ=#{zlH$#BlXX K,Xš oC ,cez}OUeȈȬ:vsjN+QOשש"2hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhxN@s?[/XN^=* f~Cvsu9",1"3./r(/KЍDڀz 0p{.vYro?Gr \mVWowvw߻ĝ8u?lur9 ;bwr GxLlXy#>>zGc/ 2gTx>`o"g0@lVL,( DQ$p⠼#X,Mf*-D ](!}&q$#N))Ύ>8(" *6 ,BC:v8\X-s 7&Wwn ,<R=%4pԍK'ARvZLKo#&E+͎}P{!o"Xep>4N"-r<Fgq^@p r 6e1yFE % 8R%a,lԼYEؔv)aL`!do>vW!! \:ys`8@UWJFQ8yn߿KƛE͒#r/y"B`^]G]z,ysW-(`Lπ;fS xޔ|^k IZ,aNkl׹V2HRtn!P~Q#\|/e >2ck?}?렐XM@fvNچTPz%x%ցvy\\uI\(%"xkC_ )=`Lͩ}c= =ب|6/xÇn~جM8wzVSrq7rXG+V>fIȈyY++"\;Ѕ%ŀ-Ӱ:B샭 o}ró|mpCRɽS㇘O^=-Q%(f4p] 3lj D]=$Bi##,E9"'K|~oC4SD /tY7[ݼ%psqMni+i?(]'eTIغ/rns!2bȈ'xLw@0JB-<1kFa0W۶S BNs秖B13^ z_6Z}7Cm0uڄ|KuE~*F06 S\E> `-Sk_!V) f2tO9s%+ЅT>ifVGB7(^K>7`^%7y~MR,PaQ5ps6uȮ96?-^'8&0y\ sY*>zuhr}`pU=PgɦtpDRI8W_x S li~P`R*TvqJnN^=(֟9*|WAY1< ȵK!y@zǨ0ĻiGq#=Զ%`KfdkesȄR!mJ\C*ʕ`s@_e/~`C[eQUI`q)b$;o"t cHI'$+g5'ZC-_~zv.FQZ-e[\lӸ;yE<[Z&FvP "d"^0.B]zudBqUcyl?:nf$picǓJ_NΥ`7>`uX>Y=s9#qRыR̉1J_SO0R+ !h[6)N~L];A #`K'.Md?OR7c[A#aG?t}1 =aroMGv?rsITX03A˵ yynR7$;^33 \ g膋RNh& 'ka :C:ulIgaiz:Kw9!qdm)R:bIi~|&TkH?K}D”3wxx¥R@X}! 2E.n1̣\恶X 5wڤa3e9nt|!Bxbe]} ]㶽S:>wp.GlqRQ͙Cqܿp>eoi ?SpYYW·J\)=rM+/Q{]РYfJ]!'T?£;8ߓ=ʍ#!r(/T  Ϋ"=vR h?`( @ q;mY*Y>M?^|\ Vuq j_8E,r S]:.h."wBPZ󔽀<"$V.T',_C"׼pX7[M7ˌξDTF"}4J؛=s'ZE[9f^ˏc|l@?M`/^`2T$~e GpK.}6k"d Z ˽8o77 AE&X?u@{.5ʖ|il^xotMC2~?7x!/k뿬 K_BWcKؔaߠ0j`e02YX~Mt c ֛o(7K~xU_! 1t1E `rA #G l&xs2QwoXƘ&X< nQ –TC#h/sO~;}s0n ֹLB>}_TpP\p~.vY.tXf󯍯0Pm{D#=.+9D]7 \_gk{x€ S`>'/,x—^xYlx.R$p]j h(ɉMf@Ð\?`d}Eq%H?Y``u ` gvY p P4 \}ZXN#`u,Ħs\CJ8e@gEWx5 R fI 0.A]`"zTXtSoftwarex+//.NN,H/J6XS\IENDB`luciole_0.8.6/themes/Tropical/icons/gtk-new.png0000644000175000017500000001326411437126703020156 0ustar niconicoPNG  IHDR>abKGD pHYs oy&IDATx]{\y}>fgw{x^X %PXjHB($UVAS 5UDHDx64Ml lc6׏}̝{?ιϝ]{w=;IW3sݻ;qȑ#G9r#(J%ٕm{mˈeK/TivAV -[|o4<S_/Jf|a5E}k}W\ٕ}G+ 6o^?|hO5k֬hvυԽ-Q,!BV#k׭~~×5!fnˣc'N^;?\*x}}}_ff +@?|82YFwͪU;22G.k=dmjRa]v[z=֭H˛Fv>v;`b|>lIZ뮍Wkڵm3W ocѻޅrJʺ 144D;vrhhhڵkk#ĢE@D(Z)+ĪAڱcǕK҂P t܌C ZH2D!aժGFF:0 l>7pgΜ188Hs###, eR{K.֭[wuʞ,JnaYP&'s }{zzv *6u MRwquWW}R% UeY}:җa۶+Juh=7mޟ΃(Ƿn-tM;T*-KRBdP]3Ϫ/|wӦM[]f&^pdͶ:D{7Y;:o~ժUs]/ZJt*nZ X$]o~ҥKoQveYT  o}k]ww###.d00òmJY_̳ ֏}k ?\~lVQv &,QO<@Dk[neeYݸqcUfq MyΞ=qLLNbrrJ9+7tS_yJ%'goQT0>>ZWDq]q6,ۆ8( ZRp]_v_pOeN8brg/%@J*Bpj~w BXĢn,A߲>g{0ߏn8OWg'o\g|Veo8۝w||;̌AJJ)sQ.rJSSSj\.Z󪐊10Џe`6}ڶm۞r]w /0E3c#ng(flFGGmu] 쬠RWEk}3m2} m;زCشiu?xGp{eM@߲,˂eٰmömHqt!Xێ@ap]bػon]vݻw"/&m|:p}Bu:: @GG"b-u].F%س5pRfQ΋6Ԏ/O$b_B)ݑ a,W 67q*c?;DDZh@oGIb#3`8 upUWOgѣo} 1#DGm_w!|߂adfUGA `%~˜a 8NEVA _>$v#3`qP X+~0 M@Aj qRz i/P(,Bc8 KRm;ٶ퇓H#meqtH #.uc! J4p>a"Gв,#v@PcqtP /(if3@"i L6ML!9je[gAmxR^w4i&B 0xٵs{]ɡ r.<@+"flFPcvp30shE,<ѪȣĂ%,]?TV.[Xh-{=ligcؗez ^> \: C|q̭xwwl6g$(N6{CG Uk?ω| P*.P,tq2=9dgLq4~å[`ۚEu4XnrhRIH% m92j $2i2b;(e2 [mU+,ˆ" 1&]"y|flL̗ ˈ;BOP5Ym`R:BZLf7  xt,<@Pvdj p]! @=&Obek/җ >@v}QUpl tnOF2P, \0GAzll< :6Xj8}GJ/6&AD PZ1,;r2@X8p $4@2CyDck ?fC00Hi`;0<Pkplv* ٿ0, }0%>@ wJp JOSDa8~= HA33EYNAxB@ ܵ`4k+h'j(M8&: ?xǕI0XHQ'O7~ RbF|g/N^ a> YGGv)(x|k6;\wye6uY:u{pnśo1[ 8qn+@B!xէԫOMwDPJ-U+ԧ d"IXz?ѻON98pȒ|ZF"an?hp̹B'0RmEH00@aN‡ң,n,aLEH`E"xAp I,ˋ\xx'l̵v@o$FR7OMj0#èP11ݩH-\)6! .5 oh`X/d#-(x;h?;"#` $ pPƹH!Ƶ07:ـ}S 2z`?b4 BZ!ǩqLWƤon1Ou0ZB`PS5HUCM҇ϐJAI$AI6)<i㦍[G+ D1"(V OVͬ  i;h ܗqg/jL\RRAƮAAO aLs0qe<_eY4M`O3>% ׹*T2`Z|`P'(N,W^䩔9V*?3^9zghM ^{ ίPp`ɀ vIFo?A,82+J)P~_(w`vexFP6Oظsc]]ۅͿajBA20$h^E \sq?]>GW[0 O=W0@W KZ͇sg{{ڋGJ@ `+떫Y&~zWƞ{ wc;Zb J"15|,|Q 4vxiXfjVyR3@ 0ʹp8R!]i 9g0W{Db!$PRbV r@ x^ H23}R DD&X;Jj~&ȲeHRT00m 'P7>-MdfJlq jJqJ\@% >tXT_<{W PՎ9rlYV[2ehT(LM(@mĉU)k R\쳿JbD1fyLYos/ADSo!"tuwA_קF0LLLݿm۾^jի{($HAٞHMXۻ%رS>7_{gϞ}ѲgO8asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxyW}?{,i$Yac [9%AƦc8y@XbR1$*Mb$xAmŻd2lw>?;wFcJUtYrZk˱+R,'1. pqrǸ'1. pqrǸ ,kY E,ҐXzvG/ڱ;}T꽔ǰf`p0 GFgo}8#T/(ۼysϝv/mjQRnV* @<#(Js=5ɭ}9G~m Zh5Z'hgc!F)98A|>V~ qƎS6nb`^@Η^cbb/~qԦ?Z^# z4qV*ixˀv>w='$\IDt ߢ}*.XE{`s]s0/? ߿zի~*C?GvDx -_.q硕B6iC.ԺiT h}H~wb/QD s_.#(Zsd5Ԃ+T<֊(hަ롥&5Vr=nmjg\'+a"R \NȰlYPY7[ްo~ htfm޼vrǎKዄ!|4TX}I^қh)<TJxA '#/p F.59Ic61tm8.3#X 𲷼?1b`V#N|qˇ'Fcܻ7MNNN&>\)T."ڹck9=Mw/_QF.뿐qZ%ύj^P?|%%2^\F9#i\$&ӏ<²e(>G95E4=M}zzC}>VgVzO~8b~Jzu[Q5E)ne[=۶ј95Embbվ\EWpBJ~S|ԏ!moC7DΫ>ǥ{D7 sdv$㧟8\ !uPOL$Cn^壱1&Cq2RѬ׻zΜ iljeWb@IRvRKnDMMJ%SSfS6HsGFT:¦D)uT-<-)RjftOz]-(thz.9mlGzk! Aח2-BmTd ij$h.3/ }?T=s.5\mٕR(Bʮ`^1tfݴi0;BRnZ h7Wf{XsR00+!4]Vۅ@1*Yv/. R+4q!,@eDvMkA,ekdNMlA|̽tp7Xh9UH3Iz^L̳PD \5J]-c^ @L# 88Y~:-%n"[hļ "QvRHg<KeR12K.a@>/57o&n6J,)C٭3Bku JƠ GȞbANr;^r{ߋ?9M3W0&{eo6DJs[ʉoxC[O>#xZ ;pY=ӟAzH54+F#]^g #xG!VRW<cE1]ƺ7yA'op衇MC`N:Xbt2%<3kgl#W\9o/x>2$())+E) aXRRo6i4DQdY>A%/("2`61]J꽯ӓ$1@'rwxbWvT}ClS? R Q,qh67410)W\of#^0wf$) ~5$Asubt^ +[LW#W^ɪϟ_.s?Қ=V,\Y8h0/yW2:xA9(JکCLPٗGN0(vs/%p*q#W]׼ \挏|x!TQ.CD`J)")i4TuQ70|'./w~d-g8{8B#%G:"% eξS>4ayIlRi400n6m V/wdqL}N #qFf^ Ky߿YǦd ѭ2r<|j%%21F1=[w'?"ɀ0  :)P;7no(ؖ-Lm߾wVrW @ujI&&&ZB_x{8o_hxG?16G~֦Vz&qYlW}bBky_T*G׾HfV>N] ﻏw݅VL=~f{KR^U.J\3(N0 iP޽<s- ?׽7~^y 6mg񤮐ֻg>9S%Uz3mC%!g "%{1$8`ݯ*5k8/_<﹇->$3#Y YBN0`qHflA4w4t&<`ѷåqLm^?eS, \wx5眳heǷV }LHګ /N)O/ ߟַM(E5!PPk{g?3,Z`s|;=בI vZʤ]z^js\@ = b)q<{qB!(>%Ç LLql-e/@ ) o JiMG <Z,(~]<''zx%!ZwvH)F';9LvR؞p҄R̊!A}I~gU8e!~Bd!ҞN-jEy3ڗ(]y x^@QV&8{O)%k[n ,O?8!ʞG5Ri݊*d.,t]Q t~`Pyo \֔C@s.Fƶm[r()y% *@yI'DB槊acUe,tp>l.l;@4`Di@I3w>atH{:͒^6 ׭co$n6z{ " dN0.$gF }TSݹ?I.gYu晋ҥ$JJz+4a`0hVr8e|9k(\IyZ*'}Ɵ}=ρ[o.to&1<].n= t0drN'[X}Ho~mފ?5@2T*1hU;sѶ^GFAkRZpxݻ9N&vX_l MVm=[)lI?"M'K{=e%%Q3s'?9N8E%4?#&&(*C*jCdhx|9+WRZh|mɻzHHeT*TN;Ǻ]Pp,r.vͳBP:c|սVPxۨ:ĠSQC b W_lR߷LosќBvKw˔2&GسϢ'Gh( 7ED&QD1lRcFv^uɘRxT*\xMccg?#~qǚ5f*s 6]tssue͗cܮ ǤYn]UHW6FJ>RZ2.@UkVگnHAZ͞k;KAz\gƏ/={B$ `"%gB'oSNoAm{_ -9'h^ PS C 0tK Œ(Jmk͸LiM8o¿kSퟋE9RY_nsg:Va M]}!F3zi8PN:de=;Bi9 DoD"iͤTٸ~xa/Zu7L[}H?:pt*0iZך()вx;S2iΚJCBK:u缂|h9UӨ|K FFFG&!%$!EM,z[@h`Q?lS?mM`ͥr4/ﺋ(u"QRVm_¢hl6y?\TFG9;!a,Y~քN[ XM9=<Jo. )Ksk$~5ܸ֬W} qɷ?An{y_^KP;42BĥMTQ;4s ^:`̿3I龰RN$so5dƍҀ"yj&P{<:DB$u|ډTY ("=tQ9DKp$.@ꭷ/M r!~pulW֯tbC2f?q'Zw\]8iNH)ѡK/E>!^Y)#)I2]֯~u(_iwI0:JlԺX)/yK ?kǔ]p>TRd/{>V~qOkO֜󻿻')w7 mum!="7wvu+|3(bӇ?nBp2p^,ךz] K5([ `re|S%%{>q.b"fM ~ɷOd9۫5uY e f'?7I7| B0UZIɞk`ƍ=IEя5~8L|CGh@kC1$ip 2K>͐8;((/{/`|duR5ZJFw05[n'{qZ0y=V/Pp۶r,H!4AY 㘽\=t&~#ܴa!8 Ń=tW+AMhͣ7ܐmPo| fmkm垻eIc1P 0o][El>VDBFȁo`*`#!Z+<~l\f>7A3 E_q t6+`Aِys*xcc|&5FW yG{#D HH2,' !(h]\tO林iҽU:&߭kd݌NALdɧ *]Zg-[[o|&rޚy4LAimo2;~^Es{lhYsw2p3]=bUm0zm2ghm}}Q hd|, 1߽3Ac5'4`oA\g{{)c "7K/8MwB KP*"5 bs&AW2$IooC5aF, 2ߺ#j/f V"0ǖX*hf.`.o@[W|.=h*%TbdSB !U]Zɡ xzBR Śjh+q]>K/جiLȧ6 /ȃ)i \Z (I.y֏rCkWNxoRapIazUd}.o7i5o/`89DKN=h f6K˛}MpTrB eo˘|nm?i_\σ +Α1C7@wسIpd="]Ez. Sm}qvs9:W:;*iȒ"eX~i}oNڡ:"zWqX||eпwxY+|!}?c{8ovZ+jM7a?uNA- "gSLWJ*a|̿U^#g~iUZN6+8sc(Po$h4M` sve?yey ҩ~Fm(ZEϜ3asRGBbKGD pHYs  tIME  70HH IDATxiuFwSM,q,Gےl+#[{2dNt|cLr$3g>Lı35Z"R})KwcޝU @ tST_w (wWj``ey^e,2e˲ eY,`Y,X7DCI6=@BTLME9GO?T7ۀ@bN? @x |x.>@LƀsP$GnS Wzp#&(v!7<"p?7g"6@t>(s`g; vN@A]ihR*7>JO|[22e.#3}ҐJY "DMmHBѹF\5i'_ܒ2F%5pl r27E/$fBr@ѵ^ӹ^t }K[3?[ M\SÆqC~J!ޫ\@c|i[e"ڟ\ۙBJ=6=aJ{0xGm] ݄/]9 %S~1s3k&wm*[Y$Nf;֭XyEO52ys_$7p|ahc+ф b[!ƆbJ(%+vXDW ėߔ)aW{k}i`EIheA[bI7l[LŌb>Q :h.buC'y{f O܅@YfcW$_鳹̸o=4tk>3o|roW@&%'ݡo[݊7I =*XRZʥoޤ0CʎuW6^b =".OWXU=kgcMO%y_]G9/0n3BjD 9 u}}eyJ* ^`%\%MuKƧZo F oJ0Cꤠ-]H)mbusocgFk:sB8Oն/ {/'? {Ya)4ZQ]Ě;#B$N&O+V5a~=[|䛁{Ɔ5ʏ+zVkHN $zE43ƆaC)vŪp'_wįk8C~:xE ݲљvKwnE,t@fNrp1ѫf W̉ įY]1g7FɮAMv"kV'@\%M ڿ٨i=4N ӯ*VwB;9v_zWZDcjuvw6v\e}SI2Bzb⊞ABNqwTs"|*_)Bz4H4I5'v_t[΁=hRN1Noz`J`;_'#uW)vEGOk3s!uwc[l~;D5eQUw&ڦ| s\*єgOwdƟ緳Bf*E z^kgFn`|W3:@.#,)̤ &n:j 9ѡiE5 (V~mn.뻑u.A_&"Kg!l_Q%ȴ-@eo;+v,L2 4R):ЗS5n` ǖ S@aL(UaVTmr;lzʉ03"&^:g>' YtZX;5uh,+r?b]f㛹HF#qlrF5 !̍Wg㉞ŷJ_RAʭvE,ZtlV5Qo"eGI\Jָ KSRA37. 7E')P I5i7+?Mb;vDUԸ!5>?8۫){=pz{BԜk 5 5/IFzٳxӚ[}]&BsD"HKiϽnY:NǟW q.]PJV4JYMqoKo'ck;뭈0yڐyT#KўQ,8։ẅBc)^\elq;a1}UVxgDqph dU"~{o$tFWd'(,W2i mqFX1`rA>{ / w=[e_OWkՊbk}J:y&..]-WǞ`ͱs g_Fiēj޸K*05T Yh`q0kj p_k ]{q[_Ko==hv[Á_0=t/hM$4SUBD͓['p(! ņmhe-9 z-H?_xC ?e}9zQygW훯m1ETvEA%T˒n?CM$lx/}ako0SLrYXi=)T)T1"zg[`y<8 ,;6q?bm Ʒ&^Saw%`S l[K a !&Ge` -qE7罬jN'rٹgHpuik[?hBO I":ZFkW_rA*uL8L:sZ UL oD-gF7_i~3\ֻzriaM ĈVu,~:!gk,a}B;Eaef[yˆx7q b[ ;g7V:45; gahi9ʚܲYsly/ Ԅa|w(C tBg= \m{IDxSύLB^9a Jh+heCqIn.o|z7áFs=5L?ɬߪtjY>S3[h X^f nlNwt ;z~dl0r)7Ff !\2Rժx_ܵz󓓩: s&eݚXLUQJHGw3Nc, rhrJ0јUv`` %RH*㿸e/0'8𕻙̎0]:㔤@gEB  Z] h+٩e 4Ɵb"'3Zxa`p'lv'@T  8826Dޤ8y=E=V b0JՀj*+-  #\}*ǁHx8? C=6cTYB<HD,#"ul #7_J^j:e ?c?1EetHDnm'mqAЈrVEydj\8DqPpDzE ZP$ˏQDzOR4:;X*BNu^s[iDl$Z$ mY"ߕ}r`NyfnYolyo??95s«kVw~]7шFBcyGV]֑}߾)I^`1}c+ߏ<Ɩ<'rϒqF#_C4 " Q;D"eZ#]T^Bf YmS [SG_眘y vnmH|ɍOs2dN5|Sfe,APxU5*g&N(JO7-Gڛm1SpGrcMKo)~yaSb0D0h mި7 AA V#}A+m1 `iEX3'<0om@,(U(fr:{c'(*{T ebfg1-S`׾W) 'S0t&l\?@$LeԻ& ceƯ܈  St?``yN _y}N~Oӓ~ߔ)9$ۢtvEEkb=jS^鑝"JyV,T|ĪIyukd,wb#!X5zWY`\qHAoi9iO'oݘ+P̐?(zNu6m|5k߭W>0q=@͒/Rr L0Y:p6xIW=JRRNyMhwߟ+,( % iӝ& tek+P5=*wcU *alaK93M2g E=h2 ؈ZAd d'^MYF!kJŻ0/p.ANHS_aZvj~NPX6SC0'3Vڇ#%֮XuMy?S 턪iwF r0^jMmO oߔDY*]1%Ns ټJU?SΛ"ϴhmvq0.PF}osL0R²`M\a=Vŕ2MktAPq[Y @:ٿ| 7 խIry!١+ʥbFty?~ߧZ"XzрZ04xt78>d(`2uv F#h}VRxI\M%88>OT٩@^#53&2?c ]$f}X"cguU*\UZp uTkI]FGxt7ɗdLڇA  +W{ѹx9|'ew( L}eX Y2>rFgE;WB| C.?-@ot+_Lϫ#ZT5 ~~0Gyx'[bǤ}WmU|a ]0.aXÁGÁE7qLx |i)-oۓ cկJ6q+C?M蚎)Z(4+w3>IQRL`Sdu[7n"bYޤ 7B}cUSY ,K 9>G? c[eU SV}g{ǻRQ'XnxI"Q  gtG^;/F'H;L^Eiåm岋bD W?9軨hE {o˒a{8 mѐ/ߴ*cϨ~/hC4sZE|֠wߦङvNЙ;f튵(mN*M G)Q4Nuɽ ǿ wK']f2lFQ8Kce|/YQi8jPuI!!wP ON.{H'(3 ld*9{5D*$kK*G:%n#sӁkJǶMG{s%,RE`fҸ}[unr'R(<^c;kǹC*?F9δ}h4UvrɆDTB*UUZ+>ZXapbZ15f?K[,k> |i"F ‹C@? @U0_&_)*+fsr1@ .۴hԛg_I5_)xxVA/ Ly~@C"hpMxqoz!`sr>G]JSݱ bԋރADQ\С1<@Nƙrc(rɆ\sմGp?­j ? p: U; }-U c]3?7Sg͵ JoZ/,tY9xyW,T쏝C):!a8`pH;( x|7K򸏛F~"OSE˵wʟ0i' SgtM>/?V@1e!R IB_.\TɤJ. &B j(I)g?ER\;.:Du 5!jЕ"7=ĩx0+hǝ#yQ?s~(A؍07alr'ya;1~ܭD&6/5 %f!|%WmE[+Y w^W.8U[#sPR.R禟pXp#H=a>ϴBW-{۽,Bѿ nw6\( ժ+^e=wr |l7!_%QUP+mPZt<6s #4G?-"援JOV"homxn\&QV$n%|5h|BnN@Wعc]^E#zA'0VK"5!Jx;yU7i󉟐5Oupjh{c?탑Nm"@~F0Әa:"D*7< r +.NRD(R)",>q[Tpp֯hF%«|_?kZ,HODxN <=$/:t N CK&zjCz> GTu%ly+`Q 3O̓nwfx *@}2',TsӛpC'T:#Ivu+z j08itr:0yArW/ޤ`shuǓ<38c4+&N9cy=5׸$4&²2]='2SXbjA!g ?a;V|9O)xQ 麏[Y,,*ʲm6XB/dW;IZ]5.6\7>)g~~}WP -Œ[{A-X!IR($/hSq_70/KIDAT6ۧ_ =,vS|=+ChLbCR5fmlW.6 Y`9 Gs9{8uޠH^3rn=ޞ?T:XR'y<52*6%.$Q|6UWi&9})}I3vȮLaԷn|v)@A\^MZuf~acvַCFP!TM~4)$Lp,7ġܯcIM6<#/K*@:sn8(zWFHTsBeXUVEKWPcI4Y'K<$hҧSvo{t妯Ƿ_njhLѷҢWQW]ɠEJ01P*zyZ_kwxykfUY~&us MɛyEfLٹ4|@W[jz Xtk6`㶹HErb]RQ'5h(?y}{!khQW_MmSDbHX1a NQ`bQ(3G+RZ )o#ۯ~]j|v߶ubsrBwnunOafqa,~Yg9(W5oHߴ~#Ҧv7b8%y]l2_g-Gzcg- +OGGDi6)(bx͔ʍg\E!>' >o  ٔ|ѓ>Cy6#P֦5"qէ#$t,IhM256ics29}Hx>QbΠFYΙ:! fɺ@BzQIHI׳i@,uf58?Z,\\M a qQ0k|+Z=@ 'ͧW~;uߗiT3z+j yz/_SH릒f )i/KVYzٟKdJ+,]lONp;韯Bc€X8k"igu#bz.!M\!0L9%s4 !3(g?0Z ea<\ %Q\:t|gJ<sРT|sQZ 9\Ar/zCjVgـa & u.t\AdEEIlIENDB`luciole_0.8.6/themes/Tropical/icons/gtk-properties.png0000644000175000017500000001323311437126703021555 0ustar niconicoPNG  IHDR>abKGD pHYs oy IDATxkpu|x )H5J,9E8I]7iӤ88I&MId$|ǎR[7d˶( _HI <pbAE`{ݳ{{{n"qJ8R+,,[BQ/^qƊeS)'XJ,022`0( x_yn[AnZq;(Z}wOeeeZW(LNNŋ>v׾ׂ===cZ-Yh~anyPZZǏG՟?ojjj^lѺlɢXA(3 ZW$TVVbtt(zzf}j._0J/s|+j PZV9'Ν;gϿ8==׺[XȲL;͛wߝ/~1++uuueZq+ @^Q d ̯~ޢu9oYw呗[yJ  ;V]v+yyyp8k4@DZjkkte!إ6!$iU[D`X'Gfs'.zRێ<,.,@ ?hĘL=3f3 kЉ 5R\,|D15 D9st<B|Z:sFjM !`]JN+ߏNQLMM!;;{c#L&? P===eى @2K],uuZ֛(>~UĶeFz>P===Ъ{& `ee%򱶏h2Q?|syy566ժMV&ΏB "$IEma_3:h4R>GyL}}R]BDbŒ҄k _䅈zꩧ:oVv;u ح@H 3h}DMBxTw>,c՚ҩuMLSYO"y,BoXo(?uJt:?K/ZߴTԉ00Ani DQnlx34W FFFN}GnThcLzu/DZ}ڿy+j?| Q08h6rrr &@>//q>fz]Ͳ$ll֪PXPQ$QUYַjjjP5WZ ˆ_ "IDS'|rNѾ}T0IA  Ut:׌dcbC=tu/9y l62F <iPuM`&p3h,qٳ?Z_ɲV_0,cee `hO!6Gy,qt`Q<=Vt:[;::9e'hv;ׯ_ǥ? AQ!Ƞ둓<J FeE} YWO_?455#ReW6Ⱨ~Fo'#2DQ Ç>_>++~,//#GR%o %%%`Y/_ږHDdEeYdd8˲y:]23WGvv6?A`h2  Y0>X;N:W_}iO( IL&c,˂e`Yȁ$Ȳ+CaD:!<`Ã>X4M_8{a*,˄ρBG:ddd ##zz>wF<((GEyzzz'+$I2rj -D(81M0GF5@~~>jf tKYqFDX"HAB  ?Dž 8Dh1i:I M!Gc iՎ 0ЈB2[I`xd#{&` UUUMC:D!AmM ʤ+@%DAePMۻFaɶ&H42:QHjZ/dÓ'md{ݷ@>n3Y SQ@#oyj$IzkꑡC"^o:w4Ay`()Iiv<χv~|&~_QY0k3L,"Z҂'|>+!2Kx+DQğ;;L0S p:t:Z)Ço BRnK 0LZ#$?@*iiiԔ"M!P N=4&&011Ҋfd4!4ܸ eejz=JoPo6FGGݱcǐ#F L L(Hx Ih<OR|aa!%]$)**2{z_8a<ؿ?4\M48_vxVPO@aajU{۷=|q~bvDX-0L>8~A*^/%DHŢydlV%Cx,DW˥jă88b)<w$ ]$Rǣp8u8qU_QYYp@V5~rGͅff[(a;nj[tNU̪\.88=mLYw'pzz[u$CQq11??ө(vM zz}h9щ5^{uE#Ɔ51b[0s4ɱUǭH6+OY433ح׳?pnW TXP=A^v M"^TXŢZaySA%~mUJB|Lz(Ռ /aELLL(2=I cfHTN ?\ 1;; ,fÂ4;;!RI `PBJ88=\;paa##;¢jcXNTϭOA>D < _@qƟSn{zQWW_ JU?LDuu3/--*uJLydWi&.Nh^UU?E("_U89sK4"HbMs.$IJi ȍ7RO#r=eukPV5351ɽT+t(ב+nZdYR~I''i? b[:s8rHh(}UƩp@Zo?MR&&'7`1?!2 OJqb "{?0ɌʄG) saphh j[!''ep-χwvxYzz{ ^RdeeA#CC||X^vcXb2mBHd@>6WaphP2|JIInMBDYe `yynС,MMwq6{L(AEvNQ__wDUYQO~l{ʲ a},Th | $155EQ9]W^gWVVRb jjj04<`0ql`E&ƤX+^5KB ÿ;v잯:ٜuCLLL.x<11MI˵"Ƅ#ygasRGBbKGD pHYs  tIME  7 B Y IDATxg#Ǖ̴rq8C7(RHqqg(GQ%V2!*RNqWdnurKUɮn%JݐC3wTt7:;*PB2+KV|^k55555555?{WӇ2 msmxxv>굔 \ 8^'(Ny|L 8ކaV<+r5Caw?ꙹ5t|L ėbX1`Bn^p>gB%_|uw]@>v3^5,*yR$2vL@T VoTdNk;hzx +1+ްŃÆٗ qiˉQ lo(6nY_`i?խ\W /37:E&X =H3)6L>e(Ҝt@@E++Kb,MvSK7a |k{s/ j3?|aB8GiĖ|VEWE9- RU+B(ܗ> |pxk+"9ov`Bi(3=!Q>ǿ~vg O)s:p;h[%xcU4ih@2HC"mK BoiPBs oԌ$srG?e.Ol*' /V/Y&tsVP mլۣ]+o{x*s?UrzT ͹55ȎXӧf8q!=싹 BNId_kT9o4>TF6DžzMcD7|,k0.DžD,ţyyI^{D(n "ʼnÆ Rê[|7`S'3@\~h|t77` &6 LL(΀&`sq-5om@rKO&Փ%=kD^/~d BNC;ZBIљ-QldGuB&2L=ۢ]|G35# Sy̿*(Em۬ȬW3 &Fֿ&.<=$4{@<(Neś_fhFkν"{CD|/L3ayzsv9 XE(:!8$8z_SISci )1[@i%+W/T$3R^|Wp?&G5*fu7]3})k&."w`a!`%1c̐"3_J+iQJ=\{G/e3٘>T >t[&=h#c3\|-enZ @iR~ގ^Z-9T`kv1.fSOxWyx݃t2gvmh!+7uP;ҷFX?YqP* ^IQZ[3_fĹj{D,-Ӱn㧷y?L9dC}cHo[9-J tb`viWh/ILWD.ac)tVLusW-} Gٷe[!_m?ד RrX/I,\zo]U`:|u+E8/'Fْ9&.^ R S*6ޱs /|1Q+ʽEB#”!߀?%|햁oigsdRj-Gn>T@iB(VQU-7e0v_J,;k=zⴾ= 'RC)'KN/ t4ڡ֞ł ЪcH!O5j;/RFS;MXqnyH3x#I&7-OutBu5~[&. 3nx-@$hvNT L~%=$܄YZmC֮Dg޽.`*)PM@{`?NCvˆ6| lΜ[rf )7ޟN0\y_Zws,lΜO|!_Mog$-}G) BwD-+ BX{ H'zUAp_)H:s >tBS{?LI{p?J0VS7%~cpU/]57sSG9s{Y͒\ IaWe&[+#iHV ƀ)4tkz6D8J:?sn`<IIJe;mvS. 9YԍD=y[w>˴\Lx)6Dv2*,C]$!,MO6ًIdžX܊t@d(:@xG8}V/Cv%V<7*|7ipV}]y?6*xpMUh뢕P Quϖ&ʥ[>!ub+v̌b:Ɏˉ;U- :Zb*Ɏ`(qA+p`ۓG#*F t " ͑欗r &e/=BSř휻 7pZ9TJ~AL& ?TsV4ZMBToZ|S:PZܬP*#]Ole[^9`Xp0;N_! c%'<<4#tٰ @Dk^Y1;rٚy= oNֳ?LL'؞}#35^WAhke!oEPjE5S\qT -}z*ޖyǸV8J8al1G5FD@vEW3nEؔ>Ll-cyKle$B07cP8(n8f e鮺)n]r( ؐ: -Wn:3줋[b tmG-OzT8UQ^iIe.=B%遽8;p?Z;VWw_v @۾U#'JV_'U0Nr!_e(x}p+ Ji>uNU)&zr}rH16] k26ŵIs3a8ĖS6k ^yf`rWHgbdo`oFYKhEN:|'8+^M12.i5 98ۨ)jmW0p?E:Ap<Z;=_-4Ɩ ),H;÷];XppFSu+BktC:ziDf!FpAPYQR(VP(It;\f; X='bgj\p+$b5Bާkph)TH{U IB{9С(@Dađ r٦GS/6' wJ5#U*QuZc ڣ>, anNƝz5W5 67,]{ؽz=R + kʨ^W{SM(ǦPX N)==uFZZ9PBG5}m}oU#ULYn E%f%kA<xaX&ǮT( =p{USFv שK&L"*p /k/q)N-)4¯,Vph`\NdQH:*<ͱ :/-2E)rO3S$I{ |? E!Q-[+5T(<εVҽ*ԩtdO :+\:-^τGUHj|vﯤ>+͝~ x.|A͖+|H[0&N37P(&#sA-邪pB!- r&0)yNDjсB =( I^ɏpIoWdn:$afo\u͉еYGK6j ŋ G,QRbD{be5{+.ӥhhǢKZٚF:z\0dgDnLdTBy~]Yg4EέXfp#`Y1~tMA[JYH`fRa܀"ӡ[E82CzFI8 PVBvqєC#nڕ?æ#? &ssppΩGaECh>w.Rh3"r -lq`nʋ.;-p[bЅXW L&jTXW*tq\>c6 Osxq#Y뷜sn:-<&]Mھa酗{E?9T-س$ B9vc{+Pϻ9YxjVLQ;+>v ` CyrSgCXl{Ձݼ -lWfꭲ%S'|NЊcc]ȃ9O* /#| ƒ<4h p@6U!A&֓Fh,J ;muFs,y/NnY*|' w"UyͼW?ևCB(OjvLׇ{ V?x_=ǹGY 2BC::\nQn UHygu8g:jU{f#V#WJ$%hyJI/: w^GvE9b0CWyd!4~;U= TPh zq~Pь]rKפ_xӯ#˧)P7'Pt/NzѿM;.{E~3k=_i_t޻>\|{QM| b={,=ɟ1ζ prȱ «$И ̸|25񈊾OuC7 k\`[_WR^HiYjR:0o@5$"O{mubkÅϨHŪshƟs)$J_ⷺ]dOn' z.{%Vyl5­O$յ{ Uh"h}d cE(ᑹeO4Gq9~5r7zn 3t+G(ut,|` f5+U_y$028BC{MO*wJ̀&}k.Ά.HBmxaMg9Lf`&.u"m0xL9^>1 / Me[߿;/^1@znaP.*ow(*9#L8.TH &:l?kX)X5^p3p?3/O}c;Rmä/QHT ~96yЭYHZt@WK떱\< /σs?MW(Tri1V 9 #xB15F%՜ ٔʮlNPPTk-R0U#nZlj' \Q^) 5TJMxXղ/W* |h,x*7(YX4v3}ak"yC zJYIDAT X[2͡<壋.h&s4,~({n*WWpgT lr8'GcCl;-} UC$XcIuxX`^Yx$ dƝ9o'{͝}ZNխ>O(opHSTb^w% *0uģR^ n'[[۩+50ðKJ\B'B aj[・Oj>v7У{hġX$*8QP(O!.%a~03^ {K'{۞/Jmp43H&"PĒ$-xe-[eT*^,RX%/B6r]PrPK+x'4yNN~Kέgy pgiN_fVZjø6ߙc3E,WuxCyx>[e_m\-/jDE<nMozWiv)1lR2Fó“ {,b1iq^Zz0t]db@iF<]W;Zcu,&` 9w 2={HJsC2,rl  db=Y0mž>Hh6DDoeV7iP:X [lNfhcvBmB {@@Pמ`1!N؋mq"&,%X̧/a{M6˴P*+AK"? `,Tiۛz ^ߑ=<@3G28_V bf"ѪЖ nQR؎X H D b!@gT@J!X ei#0D9Us!x,1_KJ- nxjyN 6"d)mǨ8QjVxl1І;5-\ZhYFeQ +[!HBjWH:=:dhbbkIENDB`luciole_0.8.6/themes/Tropical/icons/gtk-close.png0000644000175000017500000000721011437126703020464 0ustar niconicoPNG  IHDR>abKGD pHYs oy IDATx[l\'^{ILhZi CUUMJh;Pr UrFH}H@J>% obzUqEKb'!(:ر׻;{wx7_ZsΙ=}|96XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\9ptN0o QٶǝEZ{8 Yyr{JVt^%ٹ*kNWknbm2O vw`'9&<]u ZqX93rE&7 1)ڶXU".~<) hu[QxU|>\Nwis{F2|tFK%t[8Nyݴ!1‘M2 t#IStKxkԏ"%&:˪;ՍGF½);D@awCڦ#@oh$_+k jZKOxjc57>Ktav[|7ǚɗp!X k>d8⊐FDW7W'_B`m>v W0@|U,ЕGE/A[@ %pp Ԟ|KH,^ q/$_BFnOpO#ݺo4#@5"pӑ/ѕӳBs:''_ܑ>!6rcd$LVܦ|HI/;['_Bp`vp}MzB//ѕwA KMks\AvpPXCY eME(/GW=_zf. W}!PoN6{IVƏ' ` ?6{ [6fVBp {aaaw@qL!24Y32^ 87¡' ` \sq?ˀD_= `.Aհ c$_;{}&B 'ާX< v'!wfxndYH#E0;}AsJw4G6ŒWP @7$FƒG 0~G-|_QmngD\n-$$/tCm*)8G=(x/O}~3x?VJgjZ;`v mc~bG= 18&"P{S/ԇ E}gJ2vn =6"Ï@񈿝~KA>~ `Ő߃™9'I11מ W|E%hM{^Ar@H q9~Ə4^K_+l15d6e o 4n$c|?j6$l|orRj`/IM8X߉WL`v ި|+%pˢnqJLE9/);JY^7x~'  qi9p *Sϭ41 qw}Yt#Ō?2W*X[? _>O1g(S8"j9h4!Ca~}r"G,a> lӪd{K~[k |/{$q-YBj D<9k-W=/ÒɎp~73UoTI N:IE* {"y5Gœմjc%{Ba$eCK$ZM+ݽpWUq{u!@J]Րռ8i`Eu2tNO}k5K}$_@W04 [U O^wl .nfDPМ>lxpo( w Fw/wߤ) 8f98(MQD.}']o6 a٦d7ֻi3LJug>"~ҐQة˸2Ls:>k9yr(> _ VU[Q{bP*"J~3"ppLtKjW{Sdp/|o/6OIxaՑ=G9"p 4🈩x38\<{ៃ@z$xV[V:EneVxׅ g.«EP!HkF--þA82Uv^t1ɏ;c{"(MЭg [ exaNګ+@D rj!xy0J"d{O25*ex3: ѽ*(G`J"TK8:|r!I;CA@WM! iYva}"y:ի8bl64 "Bt^#"9[ҧ#F#t9bt^4)3I~^("Y|CdQ!1IYI{uq?Opz9ɶkC;Y^%-%U +?~K<]1n9DMat8$?C);׻5J6 X'gP'C&dIabkD!M3ݫ;2xYYsMv;4l<{[det`fD;.Gg^{urEYҌ6-w08=#@S:rr٫ Vޕrz^ezk~#FPra mqb\CpUysNt=R~V.OVe}]ie_?6Z[EY`>@ςE̛_u+L_:/Sm{O[^YNs m{ܙnEHH"zTXtSoftwarex+//.NN,H/J6XS\IENDB`luciole_0.8.6/themes/Tropical/icons/gtk-open.png0000644000175000017500000003311111437126703020317 0ustar niconicoPNG  IHDR>abKGD pHYs oy5IDATx}yy߯|o޽vX uXnE3NI,ljJ%)%aRˉ9\T\ȶJC*$%@ű}c{z{XHf۹Lxjo_Fn="1m?'?7wz?n_զr iD^TNgP,[]/mֻʵ:9.8x w=i,vBcJeS.OKR\2RŒPh!h"$Q,޸5#3 ס&ko3O.M-!\V;P;}N4Y˵Fj eA@C(l Xkw8{eZ>>~ ao." |t|vaRwz =i85cK1N8'nBC$3hUQ H7(kQ\վ=` a}o e4@vpȴ#Sgfg@Tk ` ]auDڗp Ė_s0F"X^ąMǑ>> lZ"!:!Nӧ ƃS?㓻*2k(:$kLfDS\#Xaoȯ'~Lx{8ElE>( ` $DK(g>ȄÍj9mrzZa4aj! 2:HxIPo}S_}R\K hLűw $rQ@zC2FX77yt#NB69=Ω}3sƮYa6 $"bM!6>_~MgfS/D1μ<-'wCVa7AX F!\P ۋsxx_1{a}v^u0H`1i@7A)ExmɅ׀s;Db ayhbfa<~ BZOH,"g3O&!<Ïz@Ruz[c @0[24=ٿmb9/%Y+xDz 89` B#R0 $)&Fw*1FA4Q&RO|13 e;\F*R_?1߇݃E`a'٫y^z2{?9Dĉ$IҶXb0?E%8먘nR;-ح5o*ܞ|20t.~7/>c04E ,P=a/J7 PCu8P}CD;r|I69-isΧanӳVA  S*cbrWEQnm:.Del`emcϔ'ѨQ PJ0C1bRp,P _|~FO('\t=*wv('83DQ(yz&666t6m݄m(X !ìAT$J2KyX`)f;XAqXɸ%m;":>@)i(0Mz#A0 \"V]esZ قi$5(T.ad npċ!9)̽)N'$@u] < nn@b7 F&W3R 9#&Ww?"-:(YM@RRAJ+@b[HC@2v06VX\z `v>:`'=ۈr<AW@/3Վa [HLR)c`LڒC1,ڽ|\ZśX\iihڇ{`;qހiZv]N|#}|D@&c~` 0c41SqB %~+S8L6s SSc24m{Mu;e 7 B H0ϥAu{\m$CN /RIy}A>KJUPӝÇg>vqC̲,n9φLY3! Q*^TFpQ˅ 3dX*SNpO//vjy\̙3μ2c4Mr~PeY(˘A1{=t:lll`ccV nn# R ÀA3|٤ DG)/|aO+W!8 ۅ*td3- 'N[Dut><σyZRH 0 \A\/ WKl ~22N[{oD+=a[m9$AD[[[c= 'ATĕybmömETk5Fؐ! CI|Ca&gS1!)gFGsE\H0 +W y6._zw߿Vz=&2l*~?e a" CjrrE CxX˳l8x @fRR_Fϟk>tH _0t]mmt:0Ja6* (BTRt`[v kumۨV;l6 &\ @7 4<^A/h2`D@F^et8gȏ ;pY蚆riez2X4Kv}ɤyhmnbyi ~?9w{a0P80!<<0 ߹ZD?DvJśgΜY%m[ȑ#vfAAs6 I߶mTUض-0ylkz.&Z6\EBu) @XDWU?jG!p,GDla 4bUPs=w.Ȱ6cX\\2ʥ* &Co6q ^z~?f)aJ\HJ) D^Gq0 |a 6A9@Yp?,5SPvJ Vkj=&^p4vMO}m,..n#\vG@j8s@ABٔ@Bד Mb 0 BT]AO~4S&=A>ӀgT(eRz…^|EXJjY^PHB~,OE(yB "@t@qP.d:/lNdQܟH!1A xF`s;zO aɓ yt:<-]F54%Hr66Mömy^ʻaߌ rBj1(u/)Xi48w9>?1p%[-EeLNL`޽xg1==Bo=̨T!XlHFܓlOS(ޘ*`ii)x/8)Y^;,18w>L ;{ ˲ )P0U|?1SCsR`Nl` ԆЭ]xn:Ţ|l576pʕJTB\Y8r4#"l[4B,ӄiY0 CJzզp~Ǝ5ܟGԴ/F(q|ҥαc|9z'y2G=*C@A(9~66( e^4hY$ʳs!.OS x>hpcGsL=q8D%1w.<ׅ/Ҹ iZlۆe( ( ˳2n@?7QVE@ sg:/ J˯J'詭\z)OI>k&A"<>yODzFEM^\2w]< oR0۲`6Nvf3)q:)7 GHχ|s.P΁b0V}?(!ɔ[^pT5@)Ԁ[zv:苄ƣy%nq 1*m20_gM?1ƫn.o4v7ooh@<\GgΟ?'O pT.bη,ETUҴߏyIئHpE2zhbH.XW[Zr<ǡ6(E߸6'څϷbcnnN&˿Ho&<8`5Tx @ċ=0e0*)xሻA{-$qD7A[pU r{~=C :܄x?{~7 i U?w]t;l4hnlXs J$:t^1 (u/%}{(jz_ntPJ0M_җP*Hky/W BD Q!!|C$fByA =1YV J ɤTz^ SjqҢ]~ֆ|`dPf5B`LÀ@|2(SAux/T)8r&+Cjh`Ӣ#ׯ_`Y,ӔlqHTN@9;RZRw1Yp` d Pr ;$cλ'O>6۶jB\ʝ!D~]|Kv"6(r"+A%˽Mr6oX [7mvjȽ_N|MOOw lۆiY(J)GxUAt:q.QM9`P (NW?)U1 dK8s9/*Q'&&peI=J?tio DݲPV1>6n+V.7(r A`71ig*X W?` 6d1M= Z ױkjJS4U 2nӲPrY, *\~N+GxH~ų9ʺ,p;H{U VBӮ _BZ /'҂m7b:k8zpӉgPr0MX|-K`Rݮ +h`+^3g,KP> MlƂ|ݠ{ EC[z ٗ{\xDQ)% i(JqN~nubGtNXLE*c60*BPŴ 0g0=,^t{?7B;ibbq0@B;_y=Cߗb>vFJbQ(Vf8Uc4E{AbH HW%7,6Xi}ar/Q@h|Jq dP.D0mHabg#*E!k0eiJH/`}~O[[g'h4#]H_zaR9/QL$EOiKY2YpO)7o`iX_[KHݖP7d8y׍kNÖBnO *biO{Ⱊ,R2H?|7 Kr ?1H SŒ5 a 0 #.y6Jy,u1SX*+[M8 +R107 jTqS487? L1 jWVVPEG Ni]C%vB`:,>iY6t]kvV (B?PY,B4i0?>V? ۻ2§d a0lOOpjP @# `$qt$766pr#QJc"v:P0P*Ps, [- .)" §uZn_~?CtwMFH3^qCIQyP]aFPq>I2e>x!+ҩ2w(^DܔV80 5˦}4]GP3!$zPD<[Wo<$ DSY=4 AJqr Ga8>)H1vtw4MjP*Aa׊߂ FZЕ #-`4M0XI2)qZ  ݲ#nfY>>w&!u:hZ P#rUŢFP.']@,+L9 Vި@@JN` 5)#SQ.㉡b&!.UkOſ:+GbV TsM1'/IyD9HYM"ONpױ{v7|G)Ja_Z^4g}{0MA( i(|*8prqDHЩU |\8yQh(D$Db܎MKĊ`YbтA436;Ȃ("%1X>c)ng+X@x1 s][c) Z kNpbrwN oD x;ގFaJa(=A( G\\IJ$2FJTU؁^( - Dq&V&nL}0`, ]QOB7k H<z>@)aI/E0x`ځ~{mD2! T%t]?~͍ &WEiP(TrP*Q,Q(`| c\ĹFnkxϷFPtzSX)Z@H@dd]i15Gfs89G,0>~ uq} W/zsK7 !L1lMGghmX )"#!CQh v`R S˜C@鮔c6z~1 M?+?pJOdTЭH2.6c,÷ N>pE'7Yy@ MFio\6 X[ZD`\41^)`%X!XeB" @PEu7lEEB:Ȕ/gr$w~2ti?Wh`*zHrmIloo Ws`Gz4ȉLӀ30t' (b%sA,,C/K?]@ l# g05̺ +ooPNs@ЃS4Q.hT 8ۂe±MT* fLlˀm"HXL4/z@DŽEGĵYfēC:NVÏس_v& N @# Ti 0ǤHph*% 77{UXJ%F6PLضӌ_-[jW/"- th Yfb魮\XK a oU :\.gSĿ@D U{`*In)13QDMZ5M$]HM ̌xdE*ꉦ Њc(" `^յ+/_g{i >wBo5S &c<cznS{!;M迬=l@=骅7zԡ_Np!JT_hc(V'a}X|߻z?'⟾g_|(ME $-3Q!J9^w} }$|2qA70ׯ= {/}=P9Um\0pJ2q SP (|2v/~SΞ彄#6>tX}i?tG@e|sciD׹ @ _ !d Xu (Mt+qnC\DDD$V 6Be2*T'}M60&_\Co{R9%1@7E>P;kO&bT`ڙKwtN2ŸEKFVb:: >Ɋ]Yp4 _ᏟϟƷrv:T#!M< pɱٲtt<@'>>g_ERtq?p'$b5/ #W}oH5'>=q(QONENm#w(_^o}/"9;HI)|@s)M$e hvo~#5~൙-\}p1XG|0pgN:;#ONv)ˍ)kbeg^(~gz}bky {\l@ңJ '+o~"Ҝx@L2!!(,A2z_Kxbg~j5TV܏ ei?w D6CP׵^,Οw*,W>ٟ5/k^)ꋉbdnd G?鿵g܁WV׿u;nΈ}a;.̈́wz g5&PPͼۿ'/Lnz"-TH9^͖Bw)e ń`;}<Wۓ_Z _WfxIN}+-R F[4 fZ/}}?:ڝkjH w[y?NF^x^ g#Y/pgZ^0/F%]oε<§ǦCb*."zTXtSoftwarex+//.NN,H/J6XS\IENDB`luciole_0.8.6/create_pot.txt0000644000175000017500000000352411437126703014603 0ustar niconicoArticle de base : http://daniel.coquette.free.fr/dotclear/index.php/post/2007/10/01/Traduction-dapplication-Python/PyGTK Le fichier glade doit etre déja en anglais. pourquoi ? 1. Extraire le texte a traduire de glade ------------------------------------------------------------------------------- $> intltool-extract --type=gettext/glade images/myrtille.glade Creer un fichier images/myrtille.glade.h 2. creation du fichier .pot ( base de la traduction) ------------------------------------------------------------------------------- On suppose ici que tout les messages a traduire dans python sont dans myrtille.py $> xgettext --language=Python --keyword=_ --keyword=N_ --from-code=UTF-8 --output=po/myrtille.pot myrtille.py images/myrtille.glade.h 3. creation des fichier .po ( un par langue) ------------------------------------------------------------------------------- Pour du francais : $> msginit --input=po/luciole.pot --locale=fr_FR --output-file=po/luciole-fr.po Attention : le .po pour l'anglais (en_US) est directement remplis. 4. Traduire ------------------------------------------------------------------------------- Modifile les .po avec la traduction voulue 5. creation des fichier .mo ( un par langue, utilisable par gettext ) ------------------------------------------------------------------------------- pour une langue creer le repertoire de dest $> mkdir -p po/fr/LC_MESSAGES creation du .mo $> msgfmt po/luciole-fr.po -o po/fr/LC_MESSAGES/luciole.mo 6. Voir comment cela passe a l'install surtout avec le localedir 7. pour mise a jour utiliser msgmerge Mise a jours : 1. si besoin mettre a jour le POTFILES.in avec les fichiers pythons ayant besoin de traduction 2. faire un make trans-po-update 3. faire la traduction dans le fr_FR.po 4. faire ensuite un make trans-compile --> creer la fichier de langue compiler qui va bien luciole_0.8.6/sounds/0000755000175000017500000000000011437126703013224 5ustar niconicoluciole_0.8.6/sounds/camera.ogg0000644000175000017500000002231411437126703015154 0ustar niconicoOggSS}QrvorbisDwOggSS}-vorbisXiph.Org libVorbis I 20070622vorbis)BCV1L ŀАU`$)fI)(yHI)0c1c1c 4d( Ij9g'r9iN8 Q9 &cnkn)% Y@H!RH!b!b!r!r * 2 L2餓N:騣:(B -JL1Vc]|s9s9s BCV BdB!R)r 2ȀАU GI˱$O,Q53ESTMUUUUu]Wvevuv}Y[}Y[؅]aaaa}}} 4d #9)"9d ")Ifjihm˲,˲ iiiiiiifYeYeYeYeYeYeYeYeYeYeYeYeY@h*@@qq$ER$r, Y@R,r4Gs4shHj)dSǫ_u#u5Lͯ5EPMIq ]՚$)7c?Ò'x6vy!EbP*Vl9Nb}B ^xn7AG3Dk 90PvS7C=13ԈTՃ|:w73 cɸÅi[C}#LkTl1 #{Ocȡ\wm8)xD몿+D2T֋%AREJx۸JkQF<QcPa\9ȕA\[XsEtjcto&}F2{ߋYs.ZW)TI-gt^F&$\jAKh?4`Dpʨ[ lh].#T B?4q s:NFsth8Okߗu 4K5eLt5v*eOrA8^3B@# T1l"$F4:ɚ)֍Wjmб^ELht͐lv< gUmV1CoAN*y q*'7Q(LܯEv ( wCd\R\>3{w'% lef&#ԙE_j0DbG<jlŲj%~Yyl+DXr8:XFzvjۻhe̽AuV`Dr!5E2Ew= l C(7+ǯNWcb}g6%C-U9I1:EAsG 6هk'ϯ=j& <ɔE\TUi Fܘޗ]=oİ<,krM:s»T?w_w6Յ&M5Pk8MIN$,.ƒF }Yu+y6sdžՁ) Qj^f/_J%_o|(90ʎ7,ǕKi?S$r~\.c5/ u\wғ#_U u&SDz0`n(y|t{Rl wIC c3@ 1۲Z\+p۟8W-+T&RqWgÔS{0%V2Y2x8?t%/ j+w{=)\(SdprS9TOt{k| </`!?{^kR3Sd[XF̹UG5j~1{t"o⬯g0 ֫6.a'27*C%Pna1>r2Wf~I /L1{fuDvZ̧: 0R;YpTutqF04'-]ew%tlPﲜJ`LJdl d`,q3͘I)]vxnmJɌ~} Di`ǂliX`uY.=ɝ6]-sA. <IŚMLUPL4!QMdӃs&`zOg54_YkDw*E-`W?ˑkYw!#8P*=%<U2ٖ=KG&Ѐ`!g'éy>yn[HvvotE-QЊm.ɇ5L[>vYޫfIEw{1cq[4[~1dƼ_+uNs=# oXM}g1Un[N-"K0;E0X36gu3XkB"TbJS3Z/DBaڣu7xi>l Zi_nÃ+d 2t%o+K!H'cyis4̯*z:5&f,8,wF`* liՌ@$t7fn>kSWk:ֻU'ÐiQxyF4DPMg?z#O,SJX]6wbZKaVM5 К'ptԭ}M~Bn!7^%)bYA"3-7P;2-=%@Q EgV1^lR*`v B"Fݸڝ}m?hu#"ݫIYOldq8|(ޅ~Om @Y@p#=%PFxkԽ,uEs&N䈒acz~[d@_}`3mW /NGpk  /%LDˮ*aH9o+DUp/^pM)8> {%uAOx9bP@m>5 uN䫠|;uK΅h5mc2|ЋP2r??Bܥz#P}߷o_ &js,e-,< ^΃ A#$E3Hێ٠Q~3:D=]'CH*S#)O!S]^U8r6`uGU}U@nC-uBVܬ'`fLZ[=׳硻,Gkm):%,3ٵtrwr3^z[9'_("HB0> P+%Xn軁0^cQCC,]rt;0`![x`QsmgO9X/(웍I-v 3 &aNYsGO6OS4/Wi 5- a~U $:VE93({=H ^|zCۆJNBp?,S1zPm[T;c[ZwNgHĵ݆DtHO[PZT żWVYv#MY:y4ukEui@?SEV܉1q""^> aIi >6ԵV*(`} f Iv/Qp|])rB)ɍcdY٠`׵F;2i7i(I7w=¢3!V}}VNl(yiYqROf L"b#Z#J Ae {}a46,FZ%V$%PH}v9 ?6>?wy+̨4hƲUhHy9y73yFp~: kPP:.\L'\EKrnj7>jyc{VmZe=cm%P۾hd͈RMne܎wiKâ%i mXri(ߟKReퟔKyiNX0ZZ>k9"呸ʭk"k(5-i QyHMOŧ1 )e&-!:PE%C44E~v,)yM M `{䏑Jطm:uluciole_0.8.6/luciole.py0000755000175000017500000001001311437126703013715 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vim:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009-2010 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # """ luciole.py : Main file of application luciole """ from optparse import OptionParser from optparse import make_option import lucioLib import logging import sys import gtk import os.path try: # Import Psyco if available import psyco psyco.full() except ImportError: pass def init_logging(is_verbose = False, log_to_file = False ): # create logger with "spam_application" logger = logging.getLogger("luciole") if is_verbose == True : logger.setLevel(logging.DEBUG) else : logger.setLevel(logging.INFO) # create console handler with a higher log level ch = logging.StreamHandler() #ch.setLevel(logging.DEBUG) # create formatter and add it to the handlers formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(threadName)s - (%(filename)s, %(lineno)d) - %(message)s") # add handler to gui ch.setFormatter(formatter) logger.addHandler(ch) # add handler to file if log_to_file == True : logger.setLevel(logging.DEBUG) if is_verbose == False : # if verbositoy option is not set only log to file ch.setLevel(logging.WARNING) # create file handler which logs even debug messages home_dir = os.path.expandvars('$HOME') home_dir = os.path.join(home_dir,'.luciole') if os.path.isdir(home_dir) : fh = logging.FileHandler(os.path.join(home_dir,"luciole.log")) fh.setLevel(logging.DEBUG) log_to_file = True fh.setFormatter(formatter) logger.addHandler(fh) logger.info("Starting log to file") return logger def luciole_option_parser() : option_list = [ make_option("-f", "--file", action="store", type="string", dest="filename", help=u'"Luciole project file (.xml) to load', metavar="FILE"), make_option("-v", "--verbose", action="store_true", dest="is_verbose", default=False, help=u'Toogle verbosity'), make_option("-l", "--logfile", action="store_true", dest="is_logfile", default=False, help=u'Log verbosity/luciole data to $HOME/luciole.log') ] usage = "usage: %prog [options] " parser = OptionParser(option_list=option_list,usage=usage) (options, args2) = parser.parse_args() return options def main(args) : """ Main function of program """ #parse options options = luciole_option_parser() try : gtk.gdk.threads_init() except : print " No Threading available with pyGtk, exit !!!" sys.exit(1) # init logging logger = init_logging(options.is_verbose, log_to_file = options.is_logfile) logger.info("Starting luciole") # init controller app_ctrller = lucioLib.Luciole_controller() #load of a project gtk.gdk.threads_enter() if ( options.filename and os.path.exists(options.filename)) : X= app_ctrller.open_project(options.filename) gtk.main() gtk.gdk.threads_leave() logger.info("Leaving luciole") #import cProfile #cProfile.run('main(None)', 'profile.out') if __name__ == '__main__' : sys.exit(main(sys.argv)) luciole_0.8.6/_version.py0000644000175000017500000000114511437126703014110 0ustar niconico#!/usr/bin/env python """This file is automatically generated by generate_version_info It uses the current working tree to determine the revision. So don't edit it. :) """ version_info = {'branch_nick': u'0.8', 'build_date': '2010-08-31 10:23:19 +0400', 'clean': None, 'date': '2010-03-03 08:58:40 +0400', 'revision_id': 'nico@inattendu.org-20100303045840-7krj91ul9wk257gc', 'revno': 78} revisions = {} file_revisions = {} if __name__ == '__main__': print 'revision: %(revno)d' % version_info print 'nick: %(branch_nick)s' % version_info print 'revision id: %(revision_id)s' % version_info luciole_0.8.6/luciole.desktop0000644000175000017500000000067411437126703014747 0ustar niconico[Desktop Entry] Type=Application Version=1.0 Name=Luciole GenericName=Stopmotion tool GenericName[fr]=Outil d'acquisition image par image Comment=Image Per Image capture tool for making animation movies. Comment[fr]=Outil de capture image par image pour creation de films d'animations StartupNotify=true Exec=luciole MimeType=video/x-luciole; Icon=luciole Terminal=false Categories=AudioVideo;Video;Graphics;GNOME;Photography; Encoding=UTF-8 luciole_0.8.6/lucioLib/0000755000175000017500000000000011437126703013453 5ustar niconicoluciole_0.8.6/lucioLib/luciole_acquisition.py0000644000175000017500000002020411437126703020067 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vim:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009-2010 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # import pygtk pygtk.require("2.0") import os.path import time from lcl_gst import lcl_gst_acq as LGA import luciole_constants as LCONST import luciole_exceptions as M_EXCEP class luciole_acquisition(object) : """ Handle the acquisition from digital devices """ ALPHA_DEFAULT = LCONST.ALPHA_DEFAULT ################################################################################################ # class properties ################################################################################################ def get_IsOnionSkinActive(self) : return self.__IsOnionSkinActive def set_IsOnionSkinActive(self,value) : self.__IsOnionSkinActive = value IsOnionSkinActive = property(get_IsOnionSkinActive,set_IsOnionSkinActive,None,"Onion Skin activity " ) def get_Image2Mix(self) : return self.__Image2Mix def set_Image2Mix(self,ImagePath) : if ( os.path.isfile(ImagePath)) : self.__Image2Mix = ImagePath if ( self.__IsOnionSkinActive) and ( self.GstObj != None ) : self.GstObj.image2Mix = self.__Image2Mix Image2Mix = property(get_Image2Mix,set_Image2Mix,None," Image to mix oin Mixer" ) def get_IsStreamingActive(self) : return self.__IsStreamingActive IsStreamingActive = property(get_IsStreamingActive,None,None,"Streaming activity " ) def get_HardType(self) : return self.__HardType HardType = property(get_HardType,None,None,"Hard type for acquisition " ) def __init__(self,displayWidget,IsOnionSkinActive = False,HardType=LCONST.FAKE, project_dir = None, cb_error = None, cb_capture_done = None ): """ Init of class luciole_acquisition : inputs : - displayWidget : The gtk.DrawingArea object for display the acquired stream from video - IsOnionSkinActive : Is onion skin need to be activated - HardType : Type of video to acquire - project_dir : path to the project dir - cb_error : callback to indicate gstreamer error - cb_capture_done : callback to indicate is done and a file is available """ self.__HardType = HardType self.__project_dir = project_dir self._ctrller_on_error = cb_error self._cb_capture_done = cb_capture_done if self.__HardType != LCONST.DIGICAM : # Acquisition is gstreamer based self.GstObj = LGA.Lcl_gst_acq(displayWidget,self.__project_dir,self._cb_on_error, self._cb_capture_done) self.Image2save = os.path.join(project_dir, LCONST.ACQUIRED_IMAGE_NAME) self.__Image2Mix = None #No image to mix at creation #set Gstreamer default properties self.GstObj.inputType = self.__HardType # Is onion skin active ? self.__IsOnionSkinActive=IsOnionSkinActive self.GstObj.mix = LGA.Lcl_gst_acq.NOMIX self.GstObj.CaptureImagePath = self.Image2save else : # Acquistion is based on image import self.__IsOnionSkinActive = False self.__IsStreamingActive = False def start_acquisition(self) : """ start the acquisition on digital device""" if self.GstObj.is_playing(): self.GstObj.stop() # stop playing self.__IsStreamingActive = False else: #test if onion skin is yet requested if (self.__IsOnionSkinActive) and (self.__Image2Mix) : #set gstreamer object with onion skin self.GstObj.mix = LGA.Lcl_gst_acq.MIX self.GstObj.alphaImage = 0.4 self.GstObj.image2Mix = self.__Image2Mix self.GstObj.reset_pipe() # nbd@grape : test play return failure or not self.GstObj.play() # start playing self.__IsStreamingActive = True def stop_acquisition(self) : """ stop acquisition on video device """ if self.GstObj.is_playing(): self.GstObj.stop() # stop playing self.__IsStreamingActive = False def capture_image(self) : """ capture/snapshot of an image from video device """ self.GstObj.capture() def active_onion_skin(self,Img = None) : """ activation of onion skin""" # When onion skin activation is set the image2mix have to be choosen # The logic of choice is : # first if an image was yet captured ( self.__Image2Mix Not empty) # if no image select, checl if an image is given as parameter # if no image as parm image. get an image from stream by forcing a capture if ( self.__Image2Mix ) : self.GstObj.image2Mix = self.__Image2Mix else : if (Img) : self.GstObj.image2Mix = Img else : # force image capture self.GstObj.capture() #wait acquisition is done i.e. file self.Image2save exists on dir # this wait is done for simplification . could be also done with # callback on_capture while not os.path.exists(self.Image2save) : time.sleep(0.01) self.__Image2Mix = self.Image2save if ( self.__Image2Mix ) : self.GstObj.image2Mix = self.__Image2Mix self.GstObj.mix = LGA.Lcl_gst_acq.MIX self.GstObj.alphaImage = self.ALPHA_DEFAULT if self.GstObj.is_playing(): self.GstObj.stop() self.GstObj.reset_pipe() # reset pipe to take into account the mix self.GstObj.play() self.__IsOnionSkinActive=True def deactive_onion_skin(self) : """ deactivation of onion skin """ self.GstObj.mix = LGA.Lcl_gst_acq.NOMIX self.GstObj.stop() self.GstObj.reset_pipe() # reset pipe to take into account the mix self.GstObj.play() self.__IsOnionSkinActive=False def set_alpha_onion_skin (self,value) : """ Set alpha value on Image""" self.GstObj.alphaImage = value def _cb_on_error(self, code =0, message="") : """ Error detected by gstremer during acquisition """ self.__IsStreamingActive = False # controller callbacl for error if self._ctrller_on_error : self._ctrller_on_error(message) class luciole_acquisition_digicam(luciole_acquisition) : """ Heritage of luciole_acquisition class to handle digicam device : Dummy class dor debug purpose only. """ def __init__(self,display): """ constructor : - display : The gtk.DrawingArea object for display the image acquired from digicam. REMARK Is this needed ?? """ luciole_acquisition.__init__(self,display,False,LCONST.DIGICAM,None) class luciole_acquisition_webcam(luciole_acquisition) : """ Heritage of luciole acquisition for webcam usage """ def __init__(self,displayWidget,IsOnionSkinActive = False,data=None, project_dir = None, cb_error = None, cb_capture_done = None): """ module init as parent + new param (data) """ luciole_acquisition.__init__( self, displayWidget, HardType = LCONST.WEBCAM ,project_dir = project_dir, cb_error = cb_error , cb_capture_done = cb_capture_done ) # add webcam data info to gst obj self.GstObj.webcam_data = data luciole_0.8.6/lucioLib/gui/0000755000175000017500000000000011437126703014237 5ustar niconicoluciole_0.8.6/lucioLib/gui/luciole_tree.py0000644000175000017500000004500111437126703017264 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vi:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # # The origin for this code is quod libet, file view.py, Authors :Joe Wreschnig, Michael Urman # import gtk import gobject import pango import capture_list_store as CLS class MultiDragTreeView(gtk.TreeView): """ This class origin is from quod Libet , file view.py . Author :Joe Wreschnig, Michael Urman TreeView with multirow drag support: * Selections don't change until button-release-event... * Unless they're a Shift/Ctrl modification, then they happen immediately * Drag icons include 3 rows/2 plus a "and more" count""" def __init__(self, *args): super(MultiDragTreeView, self).__init__(*args) self.connect_object( 'button-press-event', MultiDragTreeView.__button_press, self) self.connect_object( 'button-release-event', MultiDragTreeView.__button_release, self) self.connect_object('drag-begin', MultiDragTreeView.__begin, self) self.__pending_event = None def __button_press(self, event): if event.button == 1: return self.__block_selection(event) def __block_selection(self, event): x, y = map(int, [event.x, event.y]) try: path, col, cellx, celly = self.get_path_at_pos(x, y) except TypeError: return True self.grab_focus() selection = self.get_selection() if ((selection.path_is_selected(path) and not (event.state & (gtk.gdk.CONTROL_MASK|gtk.gdk.SHIFT_MASK)))): self.__pending_event = [x, y] selection.set_select_function(lambda *args: False) elif event.type == gtk.gdk.BUTTON_PRESS: self.__pending_event = None selection.set_select_function(lambda *args: True) def __button_release(self, event): if self.__pending_event: selection = self.get_selection() selection.set_select_function(lambda *args: True) oldevent = self.__pending_event self.__pending_event = None if oldevent != [event.x, event.y]: return True x, y = map(int, [event.x, event.y]) try: path, col, cellx, celly = self.get_path_at_pos(x, y) except TypeError: return True self.set_cursor(path, col, 0) def __begin(self, ctx): """ callback dor drag-begin signal Enable the display of moved rows. At MAX 3 rows ares shown during motion. """ model, paths = self.get_selection().get_selected_rows() MAX = 3 if paths: icons = map(self.create_row_drag_icon, paths[:MAX]) height = ( sum(map(lambda s: s.get_size()[1], icons))-2*len(icons))+2 width = max(map(lambda s: s.get_size()[0], icons)) final = gtk.gdk.Pixmap(icons[0], width, height) gc = gtk.gdk.GC(final) gc.copy(self.style.fg_gc[gtk.STATE_NORMAL]) gc.set_colormap(self.window.get_colormap()) count_y = 1 for icon in icons: w, h = icon.get_size() final.draw_drawable(gc, icon, 1, 1, 1, count_y, w-2, h-2) count_y += h - 2 if len(paths) > MAX: count_y -= h - 2 bgc = gtk.gdk.GC(final) bgc.copy(self.style.base_gc[gtk.STATE_NORMAL]) final.draw_rectangle(bgc, True, 1, count_y, w-2, h-2) more = ("and %d more...") % (len(paths) - MAX + 1) layout = self.create_pango_layout(more) attrs = pango.AttrList() attrs.insert(pango.AttrStyle(pango.STYLE_ITALIC, 0, len(more))) layout.set_attributes(attrs) layout.set_width(pango.SCALE * (w - 2)) lw, lh = layout.get_pixel_size() final.draw_layout(gc, (w-lw)//2, count_y + (h-lh)//2, layout) final.draw_rectangle(gc, False, 0, 0, width-1, height-1) self.drag_source_set_icon(final.get_colormap(), final) else: gobject.idle_add(ctx.drag_abort, gtk.get_current_event_time()) self.drag_source_set_icon_stock(gtk.STOCK_MISSING_IMAGE) class Luciole_tree(MultiDragTreeView) : """ capture list list of images """ # 3 types of tagrets : same widget ; same application ; external ( not used) # source target : type of allowed drag targets_source = [ ('tree_model', gtk.TARGET_SAME_WIDGET, 0), ("text/x-luciole-images", gtk.TARGET_SAME_APP, 1), ("text/uri-list", 0, 2)] # source target : type of allowed drop targets_dest = [ ('tree_model', gtk.TARGET_SAME_WIDGET, 0), ("text/x-luciole-images", gtk.TARGET_SAME_APP, 1), ("text/uri-list", 0, 2)] def __init__(self, capture_list , images_source, cb_on_treeview_change,cb_on_image_preview): """ capture_list : list of image by name images_source : object with list of all images ( rush) """ super(Luciole_tree, self).__init__() # save the callback self.cb_on_treeview_change = cb_on_treeview_change self.cb_on_image_preview = cb_on_image_preview # Create the model (liststore) self._capture_list = capture_list self._images_source = images_source self.liststore = CLS.capture_list_store(self._capture_list, self._images_source, gtk.gdk.Pixbuf,str) self.set_model(self.liststore) # Create 1 columns : # 1st column : thumbnail pixbuf self.cell = gtk.CellRendererPixbuf() # black color not good : The motion maks are noo seen # self.cell.set_property('cell-background','black') self.tvcolumn = gtk.TreeViewColumn(' Image',self.cell,pixbuf=0) # fix column size self.tvcolumn.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) self.tvcolumn.set_fixed_width(100) self.append_column(self.tvcolumn) # 2nd column : name of image #self.cell = gtk.CellRendererText() #tvcolumn = gtk.TreeViewColumn(' Image',self.cell,text=1) #self.append_column(tvcolumn) #Apparence : # Allow multiple selection self.get_selection().set_mode(gtk.SELECTION_MULTIPLE) # Enable Drag and Drop self.enable_drop() # connect signals # signal drag-data-get : origin of drag # signal drag-data-received : where drag is done self.connect("drag-data-get", self.__drag_data_get) self.connect("drag-data-received", self.__drag_data_received) # why this signal ? # self.connect( # 'drag-leave', lambda s, ctx, time: s.parent.drag_unhighlight()) self.connect('drag-motion', self.__drag_motion) self.connect('button-press-event', self._button_press) self.connect('key-press-event', self._key_press) def enable_drop(self, by_row=True): """ enable DnD , use of global DnD methods not treeview specific """ # enable drag and drop self.drag_source_set( gtk.gdk.BUTTON1_MASK, self.targets_source, gtk.gdk.ACTION_DEFAULT| gtk.gdk.ACTION_MOVE) self.drag_dest_set(gtk.DEST_DEFAULT_ALL, self.targets_dest, gtk.gdk.ACTION_COPY|gtk.gdk.ACTION_MOVE) self.__drop_by_row = by_row def set_model(self, model): """ save the model """ super(Luciole_tree, self).set_model(model) self.model = model def dump_images(self) : """ return the images list name""" l_list = [] for row in self.liststore : l_list.append(row[1]) return l_list def remove(self) : """ remove selected images """ model, pathlist = self._get_selected_rows() if pathlist : # in model the remov function is for iter so transform pathlist in iter list iterList = [ model.get_iter(path) for path in pathlist] for iter in iterList : model.remove(iter) # model trreview changed emit signal self.cb_on_treeview_change(self.dump_images()) def __drag_motion(self, view, ctx, x, y, time): """ Used to know if Drag and Drop are action type MOVE or COPY. MOVE : for same WIDGET COPY : for another WIDGET This function indicates/highlight the destination. The origin of this function is the Treeview class SongList in quodLibet """ if self.__drop_by_row: # This try/except strutcure allow the # display a bar to indicate where the # draged rows will be droped try: self.set_drag_dest_row(*self.get_dest_row_at_pos(x, y)) except TypeError: if len(self.get_model()) == 0: path = 0 else: # this TypeError exception manage the case of a motion over # an empty zone of a treeview. # the last path is choosen path = len(self.get_model()) - 1 self.set_drag_dest_row(path, gtk.TREE_VIEW_DROP_AFTER) # when drag on same treeview do a move # drag elsewhere is a copy if ctx.get_source_widget() == self: kind = gtk.gdk.ACTION_MOVE else: kind = gtk.gdk.ACTION_COPY ctx.drag_status(kind, time) else: self.parent.drag_highlight() ctx.drag_status(gtk.gdk.ACTION_COPY, time) # Why return True return True def __drag_data_delete(self, view, ctx): map(view.get_model(), self.__drag_iters) self.__drag_iters = [] def __drag_data_get(self, view, ctx, sel, tid, etime): """ drag-data-get callback : get date on slected rows for drag Params : view : the treeview widget ctx : the drag context cf. gtk.gdk.DragContext sel : a gtk.SelectionData object tid : an integer ID for the drag etime : the time of the drag event """ model, paths = self.get_selection().get_selected_rows() if tid == 1: # move on SAME_APP from widget to widget # get image name # image name ares transmitted to another widget images = [model[path][1] for path in paths] sel.set("text/x-luciole-images", 8, "\x00".join(images)) elif tid == 0 : # move inside treeviw sel.set("tree_model", 8, " SAME_WIDGET") else: # move to external # action to be defined # in quod libet uri are send pass def _get_selected_rows(self) : """ get selected rows , sort it ans rever list """ treeselection = self.get_selection() model, pathlist = treeselection.get_selected_rows() if pathlist : pathlist.sort() return model, pathlist def _move_rows(self,pathlist,path,position,model) : """ Move rows in pathlist after or before path acorring value of position """ if path != None : # nbd@tf number of pathliostreverse to optimize ... check wiyh # _get_selected_rows , move_up and moved_down function if position == gtk.TREE_VIEW_DROP_AFTER : # path list is reverse sorted when action is drop after # this is needed to ensure, during moving loop, element # moved in the right order # first Last item is copied after drop, than the previous after drop etc ... # if list is A, B, C, D, E and B and C have to be moved after D so : # first move C inserted after D : A, B, D, C, E # second move B inserted after D : A, D, B, C, E pathlist.reverse() # get iter from dest row iter = self.model.get_iter(path) # create a list of slected iters, best to work with iters # absolute id according who change after move operation selected_iters = [self.model.get_iter(path_s) for path_s in pathlist] for selected_iter in selected_iters : if ( position == gtk.TREE_VIEW_DROP_BEFORE or position == gtk.TREE_VIEW_DROP_INTO_OR_BEFORE ): model.move_before(selected_iter, iter) else: model.move_after(selected_iter, iter) #scroll also to new position self.scroll_to_cell(self.model.get_path(selected_iter)) # model trreview changed emit signal self.cb_on_treeview_change(self.dump_images()) def _insert_rows(self, image_names, path, position, model ) : """ Inert rows in treeview after or before path acorring value of position """ if path != 0 : # path, position = drop_info # get iter from dest row if position == gtk.TREE_VIEW_DROP_AFTER : # image_names list is reverse when action is drop after # this is needed to ensure, during moving loop, element # moved in the right order # first Last item is copied after drop, than the previous after drop etc ... # if list is A, B, C, D, E and B and C have to be moved after D so : # first move C inserted after D : A, B, D, C, E # second move B inserted after D : A, D, B, C, E image_names.reverse() iter = model.get_iter(path) # reverse image list cf. reason in "if" statement #image_names.reverse() for image_name in image_names : image = self._images_source.get_image(image_name) #move each selected rows BEFORE or AFTER dest row according position if ( position == gtk.TREE_VIEW_DROP_BEFORE or position == gtk.TREE_VIEW_DROP_INTO_OR_BEFORE ): model.insert_before(iter, [image.pixbuf_thumb,image.name]) else: model.insert_after( iter, [image.pixbuf_thumb,image.name]) # scroll to drop poistion self.scroll_to_cell(path) # model treeview changed emit signal else : # No row on treeview so append it for image_name in image_names : image = self._images_source.get_image(image_name) model.append([image.pixbuf_thumb,image.name]) # scroll to last cell on treeview self.scroll_to_cell( ( len(model)-1 , ) ) # model treeview changed emit signal self.cb_on_treeview_change(self.dump_images()) def __drag_data_received(self, treeview, context, x, y, selection, info, etime): """ drag-data-received callback Params : treeview : the treeview that received the signal context : the gtk.gdk.DragContext x : the X position of the drop y : the Y position of the drop selection : a gtk.SelectionData object info : an integer ID for the drag etime : the time of the drag event """ data = selection.data if info == 0 : # move from same widget model, pathlist = self._get_selected_rows() # get info on dest row position try: path, position = treeview.get_dest_row_at_pos(x, y) except TypeError: # this TypeError exception manage the case of a drop in the empty zone # of a treeview # the last path is choosen path = max(0, len(model) - 1) position = gtk.TREE_VIEW_DROP_AFTER # now move the rows in path list self._move_rows(pathlist,path,position,model) elif info == 1 : # get data from another widget # copy operation image_names = selection.data.split("\x00") # get info on dest row position try: path, position = treeview.get_dest_row_at_pos(x, y) except TypeError: # this TypeError exception manage the case of a drop in the empty zone # of a treeview # the last path is choosen path = max(0, len(self.model) - 1) position = gtk.TREE_VIEW_DROP_AFTER self._insert_rows( image_names, path, position, self.model ) def append_image(self,image) : """ append an image as row on treeview """ self.model.append([image.pixbuf_thumb,image.name]) # scroll to the last object i.e. the object appended self.scroll_to_cell( ( len(self.model)-1 , ) ) # model treeview changed emit signal self.cb_on_treeview_change(self.dump_images()) def _button_press(self,view,event) : if event.type == gtk.gdk._2BUTTON_PRESS : x, y = map(int, [event.x, event.y]) try: path, col, cellx, celly = view.get_path_at_pos(x, y) except TypeError: return True # Image preview request on double click self.cb_on_image_preview(self._images_source.get_image(self.model[path][1])) def _key_press(self,view,event) : pass luciole_0.8.6/lucioLib/gui/capture_tree.py0000644000175000017500000000326011437126703017274 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vi:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # # import luciole_tree as LT import gtk class Capture_tree(LT.Luciole_tree) : # Allow only Drag On app targets_source = [ ("text/x-luciole-images", gtk.TARGET_SAME_APP, 1) ] # Disallow all type of Drop in capture, the image sequence cannot be changed targets_dest = [] def __init__(self, capture_list , images_source , cb_on_treeview_change, cb_on_image_preview): super(Capture_tree,self).__init__(capture_list , images_source , cb_on_treeview_change, cb_on_image_preview) self.tvcolumn.set_property('title'," Capture ") self.set_name('luciole_capture_tree') def images_to_move(self) : model, pathlist = self._get_selected_rows() images = None if pathlist : images = [model[path][1] for path in pathlist] return images luciole_0.8.6/lucioLib/gui/dialog_project_properties.py0000644000175000017500000006064711437126703022067 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vim:si:ai:et:sw=4:sts=4:ts=4 # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009-2010 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # """ dialog_project_properties.py : Dialog who display the luciole project properties """ #i18n from gettext import gettext as _ import gtk import pango from .. import luciole_constants as LCONST from .. import luciole_exceptions as LEXCEP import webcam_detection_widget as LWDW import logging module_logger = logging.getLogger('luciole') #type of widgets for displaying webcam data (LABEL,ENTRY,SCALE)=range(3) class Project_properties(object): # This tow 2 tables descibes how to display project info _PROJECT_PREFS = { 'project_dir' : { 'desc' : _('Project folder :'), 'type' : LABEL }, 'project_name' : { 'desc' : _('Project name :'), 'type' : LABEL }, 'xml_filename' : { 'desc' : _('XML file :'), 'type' : LABEL }, 'fpi' : { 'desc' : _('Number of frames / image'), 'type' : LABEL }, 'hardtype' : { 'desc' : _('Device type'), 'type' : LABEL }, } _WEBCAM_PREFS = { 'device' : { 'desc' : _('Device :'), 'type' : ENTRY }, 'name' : { 'desc' : _('Webcam name :'), 'type' : LABEL }, 'source_input' : { 'desc' : _('Video capture driver :'), 'type' : LABEL }, 'width' : { 'desc' : _('Video width :'), 'type' : LABEL }, 'height' : { 'desc' : _('Video height :'), 'type' : LABEL }, 'framerate_list': { 'desc' : _('Webcam framerate \n (number of images per second)'), 'type' : SCALE }, } _title = _('Project properties') def __init__(self,main_window, project, cb_project_change) : """ create a Dialog with project properties and display it""" # init logger self.logger = logging.getLogger('luciole') self._dialog = gtk.Dialog ( _(self._title), main_window, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, ( gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL, gtk.STOCK_CLOSE,gtk.RESPONSE_CLOSE, gtk.STOCK_APPLY,gtk.RESPONSE_APPLY) ) self._project = project self._cb_project_change = cb_project_change # keep framerate list and framerate selected those value can change self._framerate_selected = None self._framerate_list = None self.webcam_widget_table_position = 0 if self._project['hardtype'] == LCONST.WEBCAM and self._project['webcam_data'] != {} : self._framerate_selected = self._project['webcam_data']['framerate_selected'] self._framerate_list = self._project['webcam_data']['framerate_list'] # connect destroy signal #self._dialog.connect("destroy", self._cb_on_exit) self._dialog.connect("delete-event", self._cb_on_exit) # Created 'entry' widget will be stored here self.webcam_widgets = {} # make dialog displays self.make_widget() self._dialog.show_all() self._exit = False while (self._exit == False) : # run dialog result = self._dialog.run() # wait for reponse # nbd@grape : missing what to do when info changed # probably add callback to update project if result == gtk.RESPONSE_CANCEL : self._dialog.destroy() self._exit = True elif result == gtk.RESPONSE_CLOSE : self._dialog.destroy() self._exit = True elif result == gtk.RESPONSE_APPLY : # apply button clicked # loop on each entry widget , get the text and compare it with project so see if value changed # assumption only enry on webcam data # only webcam data can be modified if self._project['hardtype'] == LCONST.WEBCAM and self._project['webcam_data'] != {} : webcam_dict = self._project['webcam_data'] for (key_entry, widget_entry) in self.webcam_widgets.iteritems() : # specific treatment when the wigdet is associated to framerate_list # store framerate_list and framerate_selected if key_entry == 'framerate_list' : # callback for updated framerate self._cb_project_change('webcam_data', 'framerate_selected',self._framerate_selected) # check if framerate list has changed if yes callback for framerate list if webcam_dict[key_entry] != self._framerate_list : self._cb_project_change('webcam_data', 'framerate_list',self._framerate_list) else : if widget_entry.get_text() != webcam_dict[key_entry] : # entry value changed # emit callback to inidcate project change self._cb_project_change('webcam_data', key_entry, widget_entry.get_text()) def _cb_on_exit(self,widget,event) : self._dialog.destroy() self._exit = True return True def make_title_label(self, text) : """ set a title label (i.e 1st column of table): play wiyh pango""" label= gtk.Label() label.set_text("%s"%text) attrs = pango.AttrList() attrs.insert( pango.AttrWeight(pango.WEIGHT_BOLD,0, -1)) label.set_attributes(attrs) # positionning of label label.set_alignment(xalign=0.0,yalign=0.5) # left justification of label # Insert label into the upper left quadrant of the table label.show() return label def make_table_title(self,title) : """ set a Table title : play with pango""" label= gtk.Label() label.set_text(title) attrs = pango.AttrList() attrs.insert( pango.AttrWeight(pango.WEIGHT_BOLD,0, -1)) attrs.insert( pango.AttrSize(18000,0, -1)) label.set_attributes(attrs) # positionning of label label.set_alignment(xalign=0.5,yalign=0.5) # center # Insert label into the upper left quadrant of the table label.show() return label def make_table_row(self,table,row,key): """ Craate the row for the gtk.Table used for project properties display """ label= self.make_title_label(_(self._PROJECT_PREFS[key]['desc'])) table.attach(label, 0, 1, row, row +1 ,xpadding = 10 ) widget = None if key == 'hardtype' : widget = gtk.Label(LCONST.HardTypeName[self._project[key]] ) else : if self._PROJECT_PREFS[key]['type'] == LABEL : widget = gtk.Label(self._project[key]) widget.set_alignment(xalign=0.0,yalign=0.5) # left justification of label widget.show() table.attach(widget, 1, 2, row, row+1,xpadding = 10 ) def make_table_webcam_row(self,table,row,key): """ Craate the row for the gtk.Table used for webcam properties display """ label= self.make_title_label(_(self._WEBCAM_PREFS[key]['desc'])) table.attach(label, 0, 1, row, row +1 ,xpadding = 10 ) widget = None if self._WEBCAM_PREFS[key]['type'] == ENTRY : widget = gtk.Entry() widget.set_alignment(xalign = 0.0) # left justification widget.set_text("%s"%self._project['webcam_data'][key]) elif self._WEBCAM_PREFS[key]['type'] == LABEL : widget = gtk.Label() widget.set_alignment(xalign = 0.0, yalign = 0.5) # left justification widget.set_text("%s"%self._project['webcam_data'][key]) elif self._WEBCAM_PREFS[key]['type'] == SCALE : # display scale bar if several framerates are available if len( self._project['webcam_data'][key]) > 1 : widget = Framerate_scale(self._project['webcam_data'][key], self._project['webcam_data']['framerate_selected'], self._cb_framerate_selected) elif len( self._project['webcam_data'][key]) == 1 : widget = gtk.Label() widget.set_alignment(xalign = 0.0, yalign = 0.5) # left justification # in that case framerate_selected = framerate_list[0] framerate = int(self._project['webcam_data']['framerate_selected'][0]/self._project['webcam_data']['framerate_selected'][1]) widget.set_text("%s"%framerate) else : self.logging.debug('Something goes wrong') self.webcam_widget_table_position = row self.webcam_widgets[key] = widget # save the widget widget.show() table.attach(widget, 1, 2, row, row+1,xpadding = 10 ) def make_webcam_data(self) : """ build widgets for display of webcam properties""" self._dialog.vbox.pack_start( child = gtk.HSeparator(), expand = True, fill = True, padding = 5 ) label = self.make_table_title(_('Webcam properties')) self._dialog.vbox.pack_start( child = label, expand = True, fill = True, padding = 10 ) Hbox = gtk.HBox() if Hbox : # # Display Table # table = gtk.Table() table.set_homogeneous(False) self.make_table_webcam_row(table,0,'name') self.make_table_webcam_row(table,1,'width') self.make_table_webcam_row(table,2,'height') self.make_table_webcam_row(table,3,'source_input') self.make_table_webcam_row(table,4,'device') self.make_table_webcam_row(table,5,'framerate_list') # No lines for framerate_selected tag : handled framerate_list tag Hbox.pack_start( child = table, expand = True, fill = True, padding = 10 ) # # Display Button fo webcam detetction # button = gtk.Button(_('Webcam detection')) button.connect('clicked', self.on_button_webcam_clicked) Hbox.pack_start( child = button, expand = False, fill = False, padding = 10 ) # pack The HBox self._dialog.vbox.pack_start( child = Hbox, expand = True, fill = True, padding = 10 ) def make_widget(self) : """ build widgets for display of project properties """ label = self.make_table_title(_(self._title)) self._dialog.vbox.pack_start( child = label, expand = True, fill = True, padding = 10 ) table = gtk.Table(2, 2, True) table.set_homogeneous(False) self.make_table_row(table,0,'project_name') self.make_table_row(table,1,'project_dir') self.make_table_row(table,2,'xml_filename') self.make_table_row(table,3,'fpi') self.make_table_row(table,4,'hardtype') table.show() self._dialog.vbox.pack_start( child = table, expand = True, fill = True, padding = 10 ) if self._project['hardtype'] == LCONST.WEBCAM : # if webcam based project display webcam properties self.make_webcam_data() def on_button_webcam_clicked(self,widget,) : """ Button webcam clicked """ Webcam_detection_dialog(self._dialog,self._cb_webcam_detection) def _cb_webcam_detection(self,project_data) : """ callback when webcam detection is done update webcam data """ if project_data.has_key('webcam_data') and project_data['webcam_data'] != {} : for (w_key, w_widget) in self.webcam_widgets.iteritems() : # Sepcific operation for framerate_list widget if w_key == 'framerate_list' : self._framerate_list = project_data['webcam_data']['framerate_list'] self._framerate_selected = project_data['webcam_data']['framerate_selected'] # 2 cases only one framerate or several framerates : # display a Label or a Scale # current widget is a label if type(w_widget) == gtk.Label : # how many framerates in framerate list if len( self._framerate_list) > 1 : # Sevaral framerates # Hide current widget w_widget.hide() # create a Framerate_scale widget widget = Framerate_scale(self._framerate_list, self._framerate_selected, self._cb_framerate_selected) # Parent is a table attach new widget w_widget.parent.attach( widget, 1, 2, self.webcam_widget_table_position, self.webcam_widget_table_position+1, xpadding = 10 ) self.webcam_widgets[w_key] = widget # replace the widget elif len( self._framerate_list ) == 1 : # only one framerate update label w_text = int( self._framerate_selected[0] / self._framerate_selected[1]) w_text ="%s"%w_text w_widget.set_text(w_text) else : # Not normal lerr = " 0 is an invalid number of framerates." raise LEXCEP.LucioException, lerr # current widegt is a framerate scale else : # how many framerates in framerate list if len(self._framerate_list) > 1 : # Several framerates # refresh Framerate_scale widget w_widget.refresh(self._framerate_list,self._framerate_selected ) elif len( self._framerate_list ) == 1 : # only one framerate is available # Hide current widget w_widget.hide() # create a Label widget widget = gtk.Label() widget.set_alignment(xalign = 0.0, yalign = 0.5) # left justification w_text = int( self._framerate_selected[0]/ self._framerate_selected[1]) w_text ="%s"%w_text widget.set_text("%s"%framerate) # Parent is a table attach new widget w_widget.parent.attach( widget, 1, 2, self.webcam_widget_table_position, self.webcam_widget_table_position+1, xpadding = 10 ) self.webcam_widgets[w_key] = widget # replace the widget else : # Not normal lerr = " 0 is an invalid number of framerates." raise LEXCEP.LucioException, lerr # for other webcam widgets : only text to update else : if project_data['webcam_data'].has_key(w_key) : w_text ="%s"%project_data['webcam_data'][w_key] w_widget.set_text(w_text) else : w_widget.set_text('') def _cb_framerate_selected(self,framerate) : """ callback to update selected framerate used by Framerate_scale widget """ self._framerate_selected = framerate class Webcam_detection_dialog(gtk.MessageDialog) : """ Opens Dialog for webcam Detection """ def __init__(self,parent, cb_ok = None ) : """ create a Dialog with project properties and disqpay it parent : The parent window cb_ok : The callback when on button is clicked """ super(Webcam_detection_dialog,self).__init__( parent = parent, flags = gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, type = gtk.MESSAGE_INFO, buttons = gtk.BUTTONS_OK_CANCEL ) self.cb_ok = cb_ok # detected data will be stored here self.project_webcam=dict() self.webcam_widget = LWDW.Webcam_detection_Box(self.project_webcam) self.vbox.pack_start( child = self.webcam_widget , expand = True , fill = True , padding = 10 ) # connect destroy signal self.connect("delete-event", self._cb_on_exit) self.show_all() #start webcam detection self.webcam_widget.prepare_webcam_detection() result = self.run() if result == gtk.RESPONSE_OK : # repsonse ok upddate callback if self.cb_ok != None : self.cb_ok(self.project_webcam) self.destroy() def _cb_on_exit(self,widget,event) : """ On exit callback """ self.destroy() return True class Framerate_scale(gtk.HScale) : """ Widget use to display an horizontal scale : represenation of webcam framerates in number of images per seconds """ def __init__(self,framerate_range,initial_range,cb_framerate_changed) : """ Constructor params : - framerate_range : The framerate range - a list of framerate tuple - initial_range : The initial range to dipslay - a tuple - cb_framerate_changed : the callback function to indicate framerate change """ # # store params # self._framerate_range = framerate_range self._initial_range = initial_range self._cb_framerate_changed = cb_framerate_changed # # configure widget # # compute the initial position on Scale bar initial_f_value = float(self._framerate_range.index(self._initial_range)) # # compute an adjustment in range [0 .. nb_framerate], icrement is 1 # Use floats as ints actually # Display framerates instead of float values # adj = gtk.Adjustment(value =initial_f_value, lower = 0.0, upper = float(len( self._framerate_range)), step_incr = 1.0, page_incr = 1.0) super(Framerate_scale,self).__init__(adjustment = adj) # configure signals self.connect("format-value", self.on_format_value) self.connect("value-changed", self.on_value_changed) # configure widget display properties self.set_update_policy(gtk.UPDATE_DISCONTINUOUS) self.set_value_pos(gtk.POS_BOTTOM) self.show_all() def on_format_value(self,widget,value) : """ Signal 'format-value' : Used to display value in scale in image/seconds format. Computed according the adjustment value, the intger round of value is the index of framerate_range """ int_val = int(value) if int_val >= len(self._framerate_range) : int_val = len(self._framerate_range) -1 val_to_display = self._framerate_range[int_val] # compute and return the number of images per second return int(val_to_display[0]/val_to_display[1]) def on_value_changed(self,widget) : """ Emited when a value is changed and selected by user the signal function get the float value, round it, get the equivalent framerate. """ # TODO : how to update webcam date # get rounded value int_val = int(widget.get_value()) if int_val >= len(self._framerate_range) : int_val = len(self._framerate_range) -1 # update project data : do callback call self._cb_framerate_changed( self._framerate_range[int_val]) def refresh(self, framerate_list, framerate_selected) : """ Update Scale bar and ajustment according new framerate range """ self._framerate_range = framerate_list self._initial_range = framerate_selected # # recompute adjustment # initial_f_value = float(self._framerate_range.index(self._initial_range)) adj = gtk.Adjustment(value =initial_f_value, lower = 0.0, upper = float(len( self._framerate_range)), step_incr = 1.0, page_incr = 1.0) self.set_adjustment(adj) luciole_0.8.6/lucioLib/gui/luciole_drawaera.py0000644000175000017500000001074211437126703020117 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vi:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # """ luciole_drawaera.py Started on ven 28 déc 2007 12:57:52 @USER-NAME@ Last update ven 28 déc 2007 12:57:52 @USER-NAME@ @Author Nico @version 1 """ from .. import luciole_tools as LT from .. import luciole_exceptions as L_EXCEP import gtk class PreviewPixbuf(LT.Singleton) : """ Class for mamaging the display of image/pixbuf in the Preview window (drawing area)""" def f_get_pixbufToDisplay(self) : """ getter of pixbufToDisplay""" return self.__pixbufToDisplay def f_set_pixbufToDisplay(self,x): """ setter of pixbufToDisplay""" if x : self.__pixbufToDisplay=x self._PreviewImage(self.__pixbufToDisplay) else : # nothing to display self.displayDefault() self.__pixbufToDisplay = None pixbufToDisplay = property(f_get_pixbufToDisplay,f_set_pixbufToDisplay,None,"Pixbuf to display") def f_get_isDisplayAllowed(self) : """ getter of isDisplayAllowed""" return self.__isDisplayAllowed def f_set_isDisplayAllowed(self,x): """ setter of isDisplayAllowed""" self.__isDisplayAllowed=x if self.__isDisplayAllowed == True : #force image view self.on_expose_event(self.__DAwidget,None) isDisplayAllowed = property(f_get_isDisplayAllowed,f_set_isDisplayAllowed,"Is display allowed") def __init__(self,DAwidget): """ init of module PreviewPixbuf""" if DAwidget == None : # raise exception no drawarea widget given raise L_EXCEP.LucioException,"No Drawing area defined" else : self.__DAwidget = DAwidget #drawingArea widget self.__DAwidget.connect("expose-event",self.on_expose_event) self.splash = gtk.gdk.pixbuf_new_from_file("images/luciole_default.png") self.__pixbufToDisplay=None self.__isDisplayAllowed = True ############################################################ ### PUBLIC METHODS ############################################################ def on_expose_event(self,widget,event) : """ Called when expose event signal is emitted by the preview drawing area widget. Used to refresh the widget with the image to display""" if (self.__isDisplayAllowed == True ): if (self.__pixbufToDisplay): self._PreviewImage(self.__pixbufToDisplay) else : self.displayDefault() def displayDefault(self) : """ When no image/pixbuf need to be displayed, a black background scren is displayed""" gc = self.__DAwidget.window.new_gc() width = self.__DAwidget.allocation.width height = self.__DAwidget.allocation.height image = self.splash.scale_simple(width,height,gtk.gdk.INTERP_BILINEAR) self.__DAwidget.window.draw_pixbuf(gc,image,0, 0, 0, 0, -1, -1, gtk.gdk.RGB_DITHER_NORMAL, 0, 0) ############################################################ ### PRIVATE METHODS ############################################################ def _PreviewImage(self,pixbuf): """ Display of the pixbuf image in the preview drawing area.""" if (self.__isDisplayAllowed): if (pixbuf) : gc = self.__DAwidget.window.new_gc() width = self.__DAwidget.allocation.width height = self.__DAwidget.allocation.height image = pixbuf.scale_simple(width,height,gtk.gdk.INTERP_BILINEAR) self.__DAwidget.window.draw_pixbuf(gc,image,0, 0, 0, 0, -1, -1, gtk.gdk.RGB_DITHER_NORMAL, 0, 0) else : self.displayDefault() luciole_0.8.6/lucioLib/gui/luciole_export_window.py0000644000175000017500000002201611437126703021236 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vim:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009-2010 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # import gtk import os.path import re # for i18n from gettext import gettext as _ import dialog as G_DIALOG from ..lcl_export import lcl_export_video as LEXP import logging module_logger = logging.getLogger('luciole') class luciole_export_window(object) : """ This class manages the window used for video export""" ################################################################################ ### PROPERTIES ################################################################################ def _get_progress_bar_fraction(self): return self._progressbar.get_fraction() def _set_progress_bar_fraction(self, fraction): if (fraction >= 0.0) and (fraction <= 1.0) : self._progressbar.set_fraction(fraction) else : # no value in range : just pulse self._progressbar.pulse() progress_bar_fraction = property( _get_progress_bar_fraction, _set_progress_bar_fraction, None , "Progress bar fraction. value in range [0.0 .. 1.0] ") def _get_progress_bar_text(self): return self._progressbar.get_text() def _set_progress_bar_text(self, text): self._progressbar.set_text("%s"%text) progress_bar_text = property( _get_progress_bar_text, _set_progress_bar_text, None , " Text to display in progress bar") def __init__(self,builder,windowname): """ Init of module """ # init logger self.logger = logging.getLogger('luciole') self._builder=builder self._windowname=windowname self._dialog = self._builder.get_object(self._windowname) self._dialog.connect('delete-event', self._export_close) self._combobox =self._builder.get_object("combobox4") self._combobox.set_active(0) # get filename entry self._filename = self._builder.get_object("entry1_filename") self._filename.set_text("export") # set initial folder self._filechooser = self._builder.get_object("filechooserbutton1") self._filechooser.connect('current-folder-changed', self._current_folder_changed) initial_folder = os.path.expandvars('$HOME') self._filechooser.set_current_folder(initial_folder) self._entry_folder = self._builder.get_object("entry_folder1") self._entry_folder.set_text(initial_folder) #expander for options self._expander = self._builder.get_object("expander_options1") self._expander.set_label('Options') self._export_dir = None # export dir set up self._progressbar = self._builder.get_object("progressbar1_export") ################################################################################ ### CALLBACKS ################################################################################ def _export_close(self,widget,event) : """ close action """ self._dialog.hide() self.exit = True return True def _current_folder_changed(self,widget) : """ New directory selected update folder entry.""" self._entry_folder.set_text(widget.get_filename()) self._export_dir = widget.get_filename() ################################################################################ ### PUBLIC METHODS ################################################################################ def gui_export(self , project_data = None) : """ export window handling """ # a project exists and loaded, the export Window can be opened #Update entry folder with _project_dir export_dir = os.path.join( project_data['project_dir'],project_data['export_dir']) # Test if export dir has changed i.e . Project has changed --> in that case update # the export dir. if (self._export_dir != export_dir) : self._entry_folder.set_text(export_dir) self._filechooser.set_current_folder(export_dir) self._export_dir = export_dir # clear progress bar . self._progressbar.set_fraction(0.0) self._progressbar.set_text('') # create an export object : Need the poroject tmp dir and widget to interact with expObj = LEXP.lcl_export_video(os.path.join(project_data['project_dir'],project_data['tmp_dir']), self) # create export_data dictionnary who goes to collect data needed for export tools export_data = {} export_data['fpi'] = project_data['fpi'] #set nb of frame per Image export_data['export_dir'] = self._export_dir # loop on exit for aplly button , when apply is clicked # the video export is done but the window is not closed # other reponse from gui can be handled self.exit = False while (self.exit == False) : response = self._dialog.run() #wait for a response if response == gtk.RESPONSE_CANCEL: if expObj.export_on_progress == False : # no export close export window self._dialog.hide() self.exit = True else : # export stop export progression expObj.cancel_export() elif response == gtk.RESPONSE_APPLY: # export is requested : collect info for export # # get image list from chrono/montage # export_data['image_input']= LEXP.IMAGE_LIST # export data is type IMAGE_LIST # Verify that a video name is entered and correct l_pattern = re.compile(r'^\w+$') l_video_name = self._filename.get_text() if l_pattern.match(l_video_name) : # format is correct export_data['video_name'] = l_video_name else : msg = _("%s is not valid. Not valid video name. It should be a combination of alphanumeric and '_' characters ")%l_video_name G_DIALOG.Dialog.ErrorMessage(self._dialog,msg) # by pass loop continue # creation of image list In chrono_images the image names are listed, but the full path is need by export module # so each file is concated with abasolute pathname to rush_dir export_data['image_list'] = [ os.path.join( project_data['project_dir'], project_data['rush_dir'],image_name) for image_name in project_data['chrono_images'] ] # get the type of export requested form the combobox comboVal = self._combobox.get_active() if comboVal == 0 : exportType= LEXP.EXPORT_DV elif comboVal == 1 : #export do dvd exportType= LEXP.EXPORT_DVD elif comboVal == 2 : #export do xvid exportType= LEXP.EXPORT_XVID else : self.logger.info('unknown video export command') exportType=None export_data['export_type'] = exportType # update export dir export_data['export_dir'] =self._export_dir # launch Export action ForceExport = False # by default overide of export filename is not allowed (ResExport, videopath) = expObj.export(export_data , False) if (ResExport == LEXP.ERR_FILE_EXIST) : # Launch Dialog window to ask if export file can be overide msg =_("File %s already exists. Replace file ?") % videopath ForceExport = G_DIALOG.Dialog.QuestionMessage(self._dialog,msg) # if response is True replace file, else do nothing. if ForceExport== True : (ResExport, videopath) = expObj.export(export_data , True) elif response == gtk.RESPONSE_CLOSE : #close export window self._dialog.hide() self.exit = True luciole_0.8.6/lucioLib/gui/assistant_new_project.py0000644000175000017500000004654411437126703021236 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vim:si:ai:et:sw=4:sts=4:ts=4 # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009-2010 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # """ assistant_new_project.py : GTK assistant for creation of new projects """ from .. import luciole_constants as LCONST from .. import luciole_image as LIMG import webcam_detection_widget as LWDW import dialog as GMSG import gtk import os.path import re import threading from gettext import gettext as _ class Page_intro(gtk.VBox) : """ Assistant introduction page """ def __init__(self,assistant, project_data,*args ) : """ Init Introduction page of assistant""" super(Page_intro,self).__init__(homogeneous = False, spacing = 5) self.set_name('page_intro') self.assistant = assistant self.project_data = project_data self.pattern_filename = re.compile(r'^\w+$') # # Initailize widgets for first page # # A label label = gtk.Label(_('This assistant will help you on configuration of a new Luciole project.')) self.pack_start( child = label, expand = False, fill = False, padding = 10 ) # A line separator self.pack_start( child = gtk.HSeparator(), expand = False, fill = False, padding = 10 ) # A label label = gtk.Label(_('Select project name and destination folder.')) self.pack_start( child = label, expand = False, fill = False, padding = 10 ) # Use a gtk.table to display project/folder chosse table = gtk.Table(3, 2, True) label_project_name = gtk.Label(_('Project Name')) # positionning of label label_project_name.set_alignment(xalign=0.0,yalign=0.5) # left justification of label # Insert label into the upper left quadrant of the table table.attach(label_project_name, 0, 1, 0, 1,xpadding = 10 ) self.entry_project_name = gtk.Entry() self.entry_project_name.set_text('') self.entry_project_name.connect('changed',self.on_project_name_changed) # Insert entry_project_name into the upper right quadrant of the table table.attach(self.entry_project_name, 1, 2, 0, 1, xpadding =10) label_folder = gtk.Label(_('Folder')) # positionning of label label_folder.set_alignment(xalign=0.0,yalign=0.5) # left justification of label # Insert label into the lower left quadrant of the table table.attach(label_folder, 0, 1, 1, 2,xpadding = 10 ) dialog = gtk.FileChooserDialog( title = _('Select a folder'), parent = None, action = gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER , buttons = ( gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL, gtk.STOCK_OK,gtk.RESPONSE_OK) ) self.fileChooser = gtk.FileChooserButton(dialog) self.fileChooser.connect('selection-changed',self.on_dir_is_changed) self.fileChooser.set_current_folder(os.path.expandvars('$HOME')) self.fileChooser.set_filename(os.path.expandvars('$HOME')) # Insert label into the lower right quadrant of the table table.attach(self.fileChooser, 1, 2, 1, 2, yoptions=gtk.SHRINK, xpadding =10) #label for message self.message_label = gtk.Label('') self.message_label.set_alignment(xalign=0.0,yalign=0.5) # left justification of label table.attach(self.message_label,0,2,2,3,yoptions=gtk.FILL,xpadding=10) # pack table to main widget self.pack_start( child = table, expand = True, fill = True, padding = 10 ) def _isProjectExists(self, project_path) : """ Check if a project path exists""" return os.path.exists(project_path) def _isProjectNameValid(self, name) : """ Check ig entered project name is correct""" isValid = False if self.pattern_filename.match(name) : isValid = True return isValid def UpdateProjectData(self,project_name, project_folder) : """ Update project data like 'project_name' and 'project_fir'. projetct dict. is updated if the project project_name is correct and if path project_dir/project_name doe not exists yet. Return True if project has been updated""" isProjectUpdated = False # get project name and dir self.message_label.set_text(' ') self.assistant.set_page_complete(self,False) # verify if input date are not balnk if project_name != '' and project_folder != None : # check projetc name validity if self._isProjectNameValid(project_name) : # check if project already exist fullpath = os.path.join(project_folder, project_name) if not self._isProjectExists(fullpath) : # all cons ok update project data self.project_data['project_name'] = project_name self.project_data['project_dir'] = project_folder self.assistant.set_page_complete(self,True) isProjectUpdated = True else : # project with same name alreday exists msg = _("The project %s already exists !"%(fullpath)) self.message_label.set_text(msg) else : # invalid projetc name msg = _("%s isn't a valid project name. It should be a combination of alphanumeric and '_' characters "%project_name) self.message_label.set_text(msg) return isProjectUpdated def on_project_name_changed(self,widget): """ indicate project name change. Set page complete if non blank text is set.""" l_project_name = widget.get_text() l_project_folder = self.fileChooser.get_filename() self.UpdateProjectData(l_project_name, l_project_folder) def on_dir_is_changed(self,widget) : """ Call back for 'selection-changed' signal """ l_project_folder = widget.get_filename() l_project_name = self.entry_project_name.get_text() self.UpdateProjectData(l_project_name, l_project_folder) class Page_matos(gtk.VBox) : """ Asistant page for hardware selection and poject image rate """ def __init__(self,assistant, project_data,*args ) : """ Init page for hardware selection """ super(Page_matos,self).__init__(*args ) self.set_name('page_matos') self.assistant = assistant self.project_data = project_data # # set default values # # webcam by default self.project_data['hardtype'] = LCONST.WEBCAM # choose of a value in the middle of the progress bar l_Hdefault = 3 (fpsDisplay,fpi) = LCONST.VIDEO_FPS_TABLE[int(l_Hdefault)] self.project_data['fpi']= fpi # # Initailize widgets for hardware selection page # # # FIRST VBOX -- hardware selection VBox = gtk.VBox() if VBox : label = gtk.Label(_('Select a device')) VBox.add(label) HBox = gtk.HBox() if HBox : l_hardtype = LCONST.DVCAM radiobutton1 = gtk.RadioButton(group=None, label=LCONST.HardTypeName[l_hardtype]) # conect toggled signal to button radiobutton1.connect('toggled',self.radiobutton_toggled,l_hardtype) HBox.add(radiobutton1) l_hardtype = LCONST.WEBCAM radiobutton = gtk.RadioButton(group=radiobutton1, label= LCONST.HardTypeName[l_hardtype]) # conect toggled signal to button radiobutton.connect('toggled',self.radiobutton_toggled,l_hardtype) # set webcam button as default button radiobutton.set_active(True) HBox.add(radiobutton) l_hardtype = LCONST.DIGICAM desc=_(" Other device.\n(Manual import)") radiobutton = gtk.RadioButton(group=radiobutton1, label= desc ) # conect toggled signal to button radiobutton.connect('toggled',self.radiobutton_toggled,l_hardtype) HBox.add(radiobutton) # add 1st Hbox to main widget VBox.add(HBox) self.add(VBox) # # SECOND VBO -- image frame rate selection VBox = gtk.VBox() if VBox : HBox = gtk.HBox() if HBox : label = gtk.Label(_('Images per second')) HBox.add(label) # an horizontal scale bar is used to select the framerate Hscale = gtk.HScale() #set range of fpi [1..6] to be converted to [1..25] # with callback scale_fps_value_changed Hscale.set_range(1,6) Hscale.set_increments(1,1) Hscale.set_value(l_Hdefault) Hscale.connect('value-changed',self.scale_fps_value_changed) Hscale.connect('format-value',self.scale_fps_format_value) HBox.add(Hscale) # add 2nd Hbox to main widget VBox.add(HBox) self.add(VBox) def radiobutton_toggled(self,widget,type): """ Hardware radio button """ if (widget.get_active() ) : self.project_data['hardtype'] = type def scale_fps_value_changed(self,widget) : """ Fps Scale value changed""" value= widget.get_value() #robustness if value > 5 : value =5 if value < 1 : value =1 # get the choosen number of frame per image value (fpsDisplay,fpi) = LCONST.VIDEO_FPS_TABLE[int(value)] self.project_data['fpi']= fpi def scale_fps_format_value(self,widget,value) : """ Fps Scale value changed. This callback allow display of range [1..25 ] in the scale bar instead of [1..6] """ #robustness if value > 5 : value =5 if value < 1 : value =1 (fpsDisplay, NbFrame) = LCONST.VIDEO_FPS_TABLE[int(value)] # return converted value to display return fpsDisplay class Page_webcam(LWDW.Webcam_detection_Box) : """ Assistant page for webcam detection """ def __init__(self, assistant, project_data, *args ) : super(Page_webcam,self).__init__(project_data,*args ) self.assistant = assistant def assistant_prepare_webcam_detection(self,page) : """ prepare assistant page for the webcam detection page """ # during detection not indicate page complete self.assistant.set_page_complete(page,False) super(Page_webcam,self).prepare_webcam_detection() def _on_webcam_detect_complete(self,webcam_obj) : """ callback , executed when webcam detection is complete """ nb_webcam = super(Page_webcam,self)._on_webcam_detect_complete(webcam_obj) if nb_webcam > 0 : # almost one webcam detected # assisant page can now be set as complete self.assistant.set_page_complete(self,True) class Page_summary(gtk.VBox) : """ Asistant summary page : show lucuile project info""" def __init__(self,assistant, project_data,*args ) : """ init class ofr assistnat page summary """ super(Page_summary,self).__init__(*args ) self.set_name('Page_summary') self.assistant = assistant self.project_data = project_data # # Initailize widgets for sumary page -- only a textview widget # self.text_wdg = gtk.TextView() self.add(self.text_wdg) def assistant_prepare_summary_page(self,page) : """ prepare summary page """ textbuffer = self.text_wdg.get_buffer() string="" text_list=list() # display project name string = "%s : %s"%( _('Project Name'), self.project_data['project_name']) text_list.append(string) # display project path string = "%s : %s \n"%( _('Project Path'), self.project_data['project_dir']) text_list.append(string) # display project FPI # loop on FPS TABLE to found the fps value fps ="0" for k,v in LCONST.VIDEO_FPS_TABLE.iteritems() : if v[1] == self.project_data['fpi'] : fps =v[0] string = "%s : %s "%( _('Number of frames per seconds'), fps) text_list.append(string) # display Hardware type string = "%s : %s "%( _('Hardware type'), LCONST.HardTypeName[self.project_data['hardtype']] ) text_list.append(string) # display info specific for webcam if ( self.project_data['hardtype'] == LCONST.WEBCAM ) : # webcam name string = "\n%s : %s"%(_('Webcam name'),self.project_data['webcam_data']['name']) text_list.append(string) #webcam device string = "%s : %s"%(_('Webcam device'),self.project_data['webcam_data']['device']) text_list.append(string) #webcam resolution string = "%s : %sx%s"%( _('Webcam resolution used'), self.project_data['webcam_data']['width'], self.project_data['webcam_data']['height']) text_list.append(string) #webcam device string = "%s : %s"%(_('Webcam driver used'),self.project_data['webcam_data']['source_input']) text_list.append(string) # Final message string = "\n %s "%(_('Have fun with luciole !')) text_list.append(string) string = "\n".join(text_list) textbuffer.set_text(string) class Assistant_new_project(object) : """ Class for managing a Gtk Assitant to configure a luciole project """ def __init__(self,apply_callback) : """ Initialize assistant window """ self.apply_callback = apply_callback # # init project datas # self.project_data = dict() self.assistant = gtk.Assistant() self.assistant.connect('delete-event',self.on_quit) self.assistant.connect('destroy-event',self.on_quit) self.assistant.connect('apply',self.on_apply) self.assistant.connect('cancel',self.on_cancel) self.assistant.connect('close',self.on_close) self.assistant.connect('prepare',self.on_prepare) self.assistant.set_property('title',_('Luciole project assistant')) # assistant logo with no text image = LIMG.Image('images/luciole_logo.png',True,2,False) # # configure page 1 # self.p1 = Page_intro( self.assistant, self.project_data) self.assistant.append_page(self.p1) self.assistant.set_page_title( self.p1, _(' Select a project path ')) self.assistant.set_page_type( self.p1, gtk.ASSISTANT_PAGE_INTRO) self.assistant.set_page_side_image(self.p1,image.pixbuf_thumb) # # configure page 2 # self.p2 = Page_matos( self.assistant, self.project_data) self.assistant.append_page(self.p2) self.assistant.set_page_title( self.p2, _(' Select hardware ')) self.assistant.set_page_type( self.p2, gtk.ASSISTANT_PAGE_CONTENT) self.assistant.set_page_complete( self.p2,True) self.assistant.set_page_side_image(self.p1,image.pixbuf_thumb) # # configure page 3 # self.p3 = Page_webcam( self.assistant, self.project_data) self.assistant.append_page(self.p3) self.assistant.set_page_title( self.p3, _(' Webcam detection ')) #self.assistant.set_page_type( self.p3, gtk.ASSISTANT_PAGE_PROGRESS) self.assistant.set_page_type( self.p3, gtk.ASSISTANT_PAGE_CONTENT) self.assistant.set_page_side_image(self.p1,image.pixbuf_thumb) # # configure page 4 # self.p4 = Page_summary( self.assistant, self.project_data) self.assistant.append_page(self.p4) self.assistant.set_page_title( self.p4, _(' Project overview ')) self.assistant.set_page_type( self.p4, gtk.ASSISTANT_PAGE_CONFIRM) self.assistant.set_page_complete( self.p4,True) self.assistant.set_page_side_image(self.p1,image.pixbuf_thumb) # page_func setup : used to manage the page sequences. self.assistant.set_forward_page_func(self.page_func) self.assistant.show_all() def page_func(self,page_num) : """ call back to know wcih next page to load """ page_out = page_num if (page_out == 1 ) and (self.project_data['hardtype'] != LCONST.WEBCAM) : # if web cam selected go to page 2 # else go to page 3 page_out = 3 else : page_out = page_out +1 return page_out def on_quit(self,widget,event) : """ Quit button clicked """ self.assistant.destroy() def on_apply(self,widget) : """ Apply button clicked. send project data to appliation mainframe. """ self.apply_callback(self.project_data) def on_cancel(self,widget) : """ Quit button clicked """ self.assistant.destroy() def on_prepare(self,widget,page) : """ prepare callback for initiating a new page""" # prepare webcam detection if widget.get_current_page() == 2 : self.p3.assistant_prepare_webcam_detection(page) # prepare last page display if widget.get_current_page() == 3: self.p4.assistant_prepare_summary_page(page) def on_close(self,widget) : """ close action """ self.assistant.destroy() luciole_0.8.6/lucioLib/gui/capture_list_store.py0000644000175000017500000000312211437126703020521 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vim:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009-2010 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # """ capture_list_store.py : ListStore class for Treeviews capture and monatge. """ import pygtk pygtk.require('2.0') import gtk class capture_list_store(gtk.ListStore) : def __init__(self,capture_list, images_source, column_type,*args) : self._capture_list = capture_list super(capture_list_store,self).__init__(column_type,*args) for capture in self._capture_list : image = images_source.get_image(capture) self.append([image.pixbuf_thumb,image.name]) def swap(self,a,b) : # update treeview super(capture_list_store,self).swap(a,b) # update image list a_path = self.get_path(a)[0] b_path = self.get_path(b)[0] self._capture_list.swap(a_path,b_path) luciole_0.8.6/lucioLib/gui/open_project_widget.py0000644000175000017500000000456211437126703020652 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vi:si:ai:et:sw=4:sts=4:ts=4 # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # """ widgets who propose open/new project when no project are loaded """ import gtk from gettext import gettext as _ class Gui_open_project_widget(gtk.HButtonBox) : """ widget for diplay New/open project buttons """ # some constants for widget _WIDTH_REQUEST =-1 _HEIGHT_REQUEST = 51 # same value as hbox_acquisition in glade _IMAGE_POS = gtk.POS_TOP def __init__(self,cb_new,cb_open) : super(Gui_open_project_widget,self).__init__() # ste widget properties self.set_name('hbox_open_project') self.set_size_request(self._WIDTH_REQUEST, self._HEIGHT_REQUEST) self.set_layout(gtk.BUTTONBOX_SPREAD) self.set_spacing(25) self.set_homogeneous(True) # create New button project msg = _('Create a new project') Button = gtk.Button(msg) Button.set_image(gtk.image_new_from_stock(gtk.STOCK_NEW,gtk.ICON_SIZE_BUTTON)) Button.set_property('image-position',self._IMAGE_POS) Button.connect('clicked',cb_new) self.pack_start(Button,expand = False, fill = False) Button.show() # create open button project msg = _('Open an existing project') Button = gtk.Button(msg) Button.set_image(gtk.image_new_from_stock(gtk.STOCK_OPEN,gtk.ICON_SIZE_BUTTON)) Button.set_property('image-position',self._IMAGE_POS) Button.connect('clicked',cb_open) self.pack_start(Button,expand = False, fill = False) Button.show() # show widget self.show() luciole_0.8.6/lucioLib/gui/webcam_detection_widget.py0000644000175000017500000001561511437126703021460 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vi:si:ai:et:sw=4:sts=4:ts=4 # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # """ webcam detetction widget """ import gtk import gobject import threading import time from gettext import gettext as _ from .. import lucioWebCamDetect as M_WEBCAM class Webcam_detection_thread_worker(threading.Thread): """ Thread in charge of calling the webcam detection """ def __init__(self,on_finish) : """ init thread for webcam detection """ super(Webcam_detection_thread_worker, self).__init__() self._on_finish = on_finish def run (self) : """ run thread for webcam detection """ WebCamObj = M_WEBCAM.luciole_webcam_detection() nb_webcam = WebCamObj.detect_webcam() self._on_finish(nb_webcam, WebCamObj ) class Webcam_detection_thread(object): """ Manages webcam detection : comunication between gui and webcam detection thread """ _TIMEOUT = 100 def __init__(self,progress_bar_widget,on_finish) : """ init thread communication : finsih status and progress bar """ self._is_worker_finished = False self._webcam_obj = None self._progress_bar_widget = progress_bar_widget self._on_finish = on_finish # initialize thread t_worker = Webcam_detection_thread_worker(self._worker_finished) #clear progressbar self._progress_bar_clear() # start Thread t_worker.start() # start timer gobject.timeout_add(self._TIMEOUT,self._on_timeout) def _worker_finished(self, nb_webcam, webcam_obj) : """ callback to indicate that thread is finished""" self._is_worker_finished = True if nb_webcam > 0 : self._webcam_obj = webcam_obj def _on_timeout(self) : """ Call cyclicly to check worker thread job """ rearm_timer = True if self._is_worker_finished == False : self._progress_bar_on_progress() else : # detection is finished self._progress_bar_complete() rearm_timer = False #stop timer self._on_finish(self._webcam_obj) # finish callback return rearm_timer def _progress_bar_clear(self): """ Clear progress bar """ self._progress_bar_widget.set_fraction(0.0) self._progress_bar_widget.set_text(_('Please wait for webcam detection')) def _progress_bar_complete(self): """ Progress bar full : detecyion complete """ self._progress_bar_widget.set_fraction(1.0) self._progress_bar_widget.set_text(_('Webcam detection done')) def _progress_bar_on_progress(self): """ indicate that detection is going on """ self._progress_bar_widget.pulse() class Webcam_detection_Box(gtk.VBox) : """ Assistant page for webcam detection """ def __init__(self, project_data, *args ) : super(Webcam_detection_Box,self).__init__(*args ) self.set_name('Page_webcam') self.project_data = project_data # # set default values # self.project_data['webcam_data'] = dict() # # Initailize widgets for webcam detection page # # Progress bar widget self.progressbar = gtk.ProgressBar() self.progressbar.set_size_request(width =400, height = 50) self.pack_start( child = self.progressbar, expand=False, fill=False, padding=3) # label to indicate result of detection self.label = gtk.Label('') self.pack_start( child = self.label, expand=False, fill=False, padding=3) # Hbox used to list the detecteds webcams HBox = gtk.HBox() if HBox : self.VBox = gtk.VBox() HBox.add(self.VBox) self.pack_start( child = HBox, expand = True, fill = True , padding = 3) def prepare_webcam_detection(self) : """ prepare assistant page for the webcam detection page """ # Hide label for webcam status self.label.hide() # launch webcam detection thread t_webcam = Webcam_detection_thread(self.progressbar,self._on_webcam_detect_complete) def _on_webcam_detect_complete(self,webcam_obj) : """ callback , executed when webcam detection is complete Return the number of detected webcams""" status = 0 if webcam_obj != None and webcam_obj.webcam_devices != None: vbox = self.VBox # firt clean childs on the vbox widget for my_child in vbox.get_children() : vbox.remove(my_child) # loop on detected webcams RadioButton = None for (webcam_index, webcam ) in enumerate(webcam_obj.webcam_devices) : RadioButton = gtk.RadioButton(group=RadioButton, label= webcam["name"] ) vbox.pack_start(RadioButton) RadioButton.show() #connect event RadioButton.connect("clicked",self.on_webcam_radio_button_clicked,webcam_index,webcam_obj ) # First set if webcam_index == 0 : # select by default. self.project_data['webcam_data'] = webcam_obj.get_gst_best_input(webcam_index) self.label.set_text(_('Detected webcam(s)')) status = len(webcam_obj.webcam_devices) else : self.project_data['webcam_data'] = None self.label.set_text(_('No webcam detected')) self.label.show() return status def on_webcam_radio_button_clicked(self,widget,webcam_index,webcam_obj): """ callback for webcam rasdio button. Save info on selected webcam """ # when a webcam is selected select webcam data self.project_data['webcam_data'] = webcam_obj.get_gst_best_input(webcam_index) luciole_0.8.6/lucioLib/gui/luciole_export_tool_window.py0000644000175000017500000001720311437126703022275 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vim:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2010 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # # for i18n from gettext import gettext as _ import gtk import os.path from ..lcl_export import lcl_export_cinelerra as LEC from ..lcl_export import lcl_export_pitivi as LEP from ..lcl_export import lcl_export_kdenlive as LEK import dialog as G_DIALOG # TODO : base dir. should be provided by luciole . Not computed here BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) TEMPLATE_DIR = 'templates' GLADE_DIR = 'ui' class SimpleBuilderApp(gtk.Builder): def __init__(self): self.GLADE_DIR = GLADE_DIR gtk.Builder.__init__(self) class dialog_export_file(SimpleBuilderApp): EXPORTERS = { 'cinelerra' : { 'ext' : '.xml', 'template' : os.path.join(TEMPLATE_DIR, "cinelerra_template.xml"), 'func' : LEC.lcl_export_cinelerra }, 'pitivi': { 'ext' : '.xptv', 'template' : os.path.join(TEMPLATE_DIR,"pitivi_template.xptv"), 'func' : LEP.lcl_export_pitivi }, 'kdenlive' : { 'ext' : '.kdenlive', 'template' : os.path.join(TEMPLATE_DIR,"kdenlive_template.kdenlive"), 'func' : LEK.lcl_export_kdenlive }, 'openshot' : { 'ext' : '.osp', 'template' : os.path.join(TEMPLATE_DIR,"openshot_template"), 'func' : None }, } def __init__(self, path="export_file.glade", root="dialog_export_file", domain="", form=None, project=None, **kwargs): """ init dialog_export_file class : Manage the export tool window path : the path to the glade file to use root : main window name domain : i18n TBD / Not used form : TBD / Not used project : luciole project data """ self.project=project # # initialize window # SimpleBuilderApp.__init__(self) self.add_from_file(os.path.join(self.GLADE_DIR,path)) self.connect_signals(self) self.window = self.get_object(root) # Default Export type self.export_type = "cinelerra" # # widgets configuration # self._fn_widget = self.get_object("entry_fn") self._fn_widget.set_text("export.xml") initial_folder = os.path.expandvars('$HOME') self._filechooser = self.get_object("filechooserbutton1") self._filechooser.set_current_folder(initial_folder) # Status bar initialization self._status_bar_widget = self.get_object("statusbar1") self._status_bar_widget_cid = 1 msg = _("Select an application and a file name for export") self._status_bar_widget.push(self._status_bar_widget_cid,msg) # show window self.window.show() # # SIGNAL methods # def on_dialog_export_file_destroy(self, widget, data=None): """ Signal destroy : close window """ self.window.destroy() def on_dialog_export_file_close(self, widget, data=None): """ Signal close window : close window """ self.window.destroy() def on_filechooserbutton1_file_set(self, widget, data=None): """ Signal filechooser : get filename """ self.export_folder = widget.get_filename() def on_radio_cine_toggled(self, widget, data=None): """ Signal cinelerra button toggled : set the export type and update filename window """ self.export_type ="cinelerra" self.__update_fn_ext() def on_radio_kdenlive_toggled(self, widget, data=None): """ Signal kdenlive button toggled : set the export type and update filename window """ self.export_type ="kdenlive" self.__update_fn_ext() def on_radio_pitivi_toggled(self, widget, data=None): """ Signal pitivi button toggled : set the export type and update filename window """ self.export_type ="pitivi" self.__update_fn_ext() def on_radio_openshot_toggled(self, widget, data=None): """ Signal openshot button toggled : set the export type and update filename window """ self.export_type ="openshot" self.__update_fn_ext() def __update_fn_ext(self) : """ update filename entry with the correct extension """ (filename, extension)=os.path.splitext(self._fn_widget.get_text()) if extension != self.EXPORTERS[self.export_type]['ext'] : self._fn_widget.set_text(filename+self.EXPORTERS[self.export_type]['ext'] ) def __make_export(self) : """ Render export, according export type, folder, and filename""" # clear status bar self._status_bar_widget.pop(self._status_bar_widget_cid) # get filename from entry object (self.filename, __extension)=os.path.splitext(self._fn_widget.get_text()) # get folder self.export_folder = self._filechooser.get_filename() # correct extension if needed if __extension != self.EXPORTERS[self.export_type]['ext'] : __extension = self.EXPORTERS[self.export_type]['ext'] self._fn_widget.set_text(self.filename+__extension ) self.full_export_path = os.path.join(self.export_folder,self.filename+__extension) ForceExport = True # by default override of export filename is allowed # display a message to allow overwrite or not if os.path.exists(self.full_export_path): # add message display msg =_("File %s already exists. Replace file ?") % self.full_export_path ForceExport = G_DIALOG.Dialog.QuestionMessage(self.window,msg) if ForceExport == True : # launch export according retrieved data X = self.EXPORTERS[self.export_type]['func']( lcl_project = self.project, template= self.EXPORTERS[self.export_type]['template'], export_file = self.full_export_path ) X.generate() msg = _("Export Done") self._status_bar_widget.push(self._status_bar_widget_cid,msg) def run(self) : """ main function in window, wait for an action of the user""" exit_loop = False while (exit_loop == False) : response = self.window.run() #wait for a response if response == 2 : # export button self.__make_export() else : # exit exit_loop = True #exit export window self.window.destroy() luciole_0.8.6/lucioLib/gui/__init__.py0000644000175000017500000000167511437126703016361 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vi:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # from gui_controller import * from dialog import * #from capture_tree import * #from montage_tree import * luciole_0.8.6/lucioLib/gui/dialog_preferences.py0000644000175000017500000001136511437126703020437 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vi:si:ai:et:sw=4:sts=4:ts=4 # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # """ dialog_preferences.py """ import gtk import pango import copy from .. import luciole_constants as LCONST class Luciole_preferences(object) : _Dialog_name = 'Dialog_preferences' _Label_preferences = 'label_preferences' _Viewport_title = 'viewport3' _Checkbox_trash = 'checkbutton_trash' _Combobox_theme = 'combobox_theme' _Combo_Table = ['Default.rc','Tropical.rc'] def __init__(self,builder) : """ """ self.conf_options = None self.cb_on_apply = None self.builder = builder self.wdg_dict = dict() self.dialog = self.builder.get_object(self._Dialog_name) #self.dialog.add_parent(parent) self.dialog.add_buttons( gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL, gtk.STOCK_CLOSE,gtk.RESPONSE_CLOSE, gtk.STOCK_APPLY,gtk.RESPONSE_APPLY) self.dialog.connect("delete-event", self._cb_on_exit) def _update_widgets(self) : # set title in bold self.title = self.builder.get_object(self._Label_preferences) attrs = pango.AttrList() attrs.insert( pango.AttrWeight(pango.WEIGHT_BOLD,0, -1)) self.title.set_attributes(attrs) # Change Title background colour viewport = self.builder.get_object(self._Viewport_title) map = viewport.get_colormap() colour = map.alloc_color("#9DDDC8") # firefly grey style = viewport.get_style().copy() style.bg[gtk.STATE_NORMAL] = colour viewport.set_style(style) # Theme Combo box combo = self.builder.get_object(self._Combobox_theme) combo.set_active(self._Combo_Table.index(self.conf_options['Theme'])) # Tropical Theme active by default self.wdg_dict['Theme'] = combo # Trash Check Box checkBox = self.builder.get_object(self._Checkbox_trash) if ( self.conf_options['CaptureTrashDisplay'] == 'yes' ) : checkBox.set_active(True) else : checkBox.set_active(False) self.wdg_dict['CaptureTrashDisplay'] = checkBox def run(self,conf_options,cb_on_apply ) : """ run dialog : Dialog defined in glade so __init__ makes glade stuff init; so called once. run function cnd called multiple, and so param conf_options and cb_on_apply is given in run function insteaf of __init__""" self.conf_options = conf_options self.cb_on_apply = cb_on_apply self._update_widgets() self.dialog.show_all() self._exit = False while (self._exit == False) : # run dialog result = self.dialog.run() # wait for reponse if result == gtk.RESPONSE_CANCEL : self.dialog.hide() self._exit = True elif result == gtk.RESPONSE_CLOSE : self.dialog.hide() self._exit = True elif result == gtk.RESPONSE_APPLY : # parse configurations widgets self.modif_options = copy.copy(self.conf_options) for (key,wdg) in self.wdg_dict.iteritems() : # parse each option and udpate modified if key == 'CaptureTrashDisplay' : if wdg.get_active() == True : self.modif_options['CaptureTrashDisplay'] = 'yes' else : self.modif_options['CaptureTrashDisplay'] = 'no' if key == 'Theme' : if wdg.get_active() != -1 : self.modif_options['Theme'] = self._Combo_Table[wdg.get_active()] #callback call if self.cb_on_apply != None : self.cb_on_apply(self.modif_options) def _cb_on_exit(self,widget,event) : self.dialog.hide() self._exit = True return True luciole_0.8.6/lucioLib/gui/montage_tree.py0000644000175000017500000000710411437126703017264 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vi:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # # import luciole_tree as LT import gtk class Montage_tree(LT.Luciole_tree) : # redefinition of targets to allow DnD only inside the treeview # Drag only on treeview targets_source = [ ('tree_model', gtk.TARGET_SAME_WIDGET, 0), ] # Drop from treeview or montage treeview targets_dest = [ ('tree_model', gtk.TARGET_SAME_WIDGET, 0), ("text/x-luciole-images", gtk.TARGET_SAME_APP, 1), ] def __init__(self, capture_list, images_source, cb_on_treeview_change, cb_on_image_preview): super(Montage_tree,self).__init__(capture_list , images_source, cb_on_treeview_change, cb_on_image_preview) self.tvcolumn.set_property('title'," Montage ") selection = self.get_selection() # This signal is used to manage the selection of a row and display image preview selection.connect('changed', self._on_selection_changed) def move_up(self) : """ Move up one position a selection in treeview""" model, pathlist = self._get_selected_rows() if pathlist : # Move one position : get the path of the previous row in selection if exist path = pathlist[0] if path[0] > 0 : path = (path[0]-1,) else : path = None # to indicate insetion before position = gtk.TREE_VIEW_DROP_BEFORE self._move_rows(pathlist,path,position,model) def move_down(self) : """ Move down one position a selection in treeview""" model, pathlist = self._get_selected_rows() if pathlist : # Move one position : get the path of the last row in selection if exist path = pathlist[-1] if path[0] < ( len(model) -1 ) : path = (path[0]+ 1,) else : path = None # to indicate insetion after position = gtk.TREE_VIEW_DROP_AFTER self._move_rows(pathlist,path,position,model) def get_position_selected_row(self): """ Get the position/index of a selected row. Only if one image is selected""" model, pathlist = self._get_selected_rows() l_pos = 0 if len(pathlist) == 1 : # only one row selected # return the index l_pos = pathlist[0][0] return l_pos def _on_selection_changed(self,selection) : """ selction changed : display image preview. only if one image is selected """ (model, pathlist) = selection.get_selected_rows() if len(pathlist) == 1 : path =pathlist[-1] self.cb_on_image_preview(self._images_source.get_image(self.model[path][1])) luciole_0.8.6/lucioLib/gui/gui_controller.py0000644000175000017500000007066311437126703017654 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- mode: python -*- # vim:si:ai:et:sw=4:sts=4:ts=4 # # # copyright nicolas bertrand (nico@inattendu.org), 2009-2010 # # this file is part of luciole. # # luciole 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. # # luciole 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 luciole. if not, see . # # import sys import pygtk import gtk import gtk.glade import gobject import gnome.ui import glob import os.path import locale import gettext import time import gc import logging module_logger = logging.getLogger('luciole') import luciole_drawaera as GLD import montage_tree as GMT import capture_tree as GCAT import assistant_new_project as GLA import dialog as GDIALOG import open_project as GOF import luciole_export_window as GEXPORT import luciole_export_tool_window as GEXPORT_TOOL import open_project_widget as GOPEN import dialog_project_properties as GDIALOG_PROJ import dialog_preferences as GPREF from .. import luciole_constants as LCONST from .. import luciole_exceptions as LEXCEP import _version # nbd@grape : APP NAME place to change APP_NAME = "luciole" _ = gettext.gettext """ gui_controller.py main file for gui management gui init and call backs """ class Gui_status_controller(object) : def __init__(self, status_bar, progress_bar=None) : """ init gui status controller """ self._status_bar = status_bar self._context_id = self._status_bar.get_context_id("Statusbar example") self._progress_bar = progress_bar def on_progress(self,msg,ratio) : """ update status and progress bar """ self._status_bar.push(self._context_id, msg) if self._progress_bar != None : # if a ratio is given update progress bar with set fraction if not update with just a pulse if ratio != None : self._progress_bar.set_fraction(ratio) else : self._progress_bar.pulse() def start(self,msg) : """ Start progress/status bar """ self._status_bar.push(self._context_id, msg) if self._progress_bar != None : self._progress_bar.show() self._progress_bar.set_fraction(0.0) def stop(self,msg) : """ Stop progress/status bar """ self._status_bar.push(self._context_id, msg) if self._progress_bar != None : self._progress_bar.set_fraction(1.0) self._progress_bar.hide() def display_message(self,msg) : """ display a message on status bar """ self._status_bar.push(self._context_id, msg) def clear_message(self) : """ clear a message on status bar """ self._status_bar.pop(self._context_id) class Gui_controller(object): """ class handling interface with GUI/glade """ # # constants # # UI file specification GUI_FILE = "luciole.glade" # main window name GUI_MAIN_WINDOW = "window1" # # properties # def f_get_display(self) : return self.previsuDrawingArea display = property(f_get_display,None,None,"DrawArea widget for display") def f_get_view_image(self) : return self.PreviewObj.isDisplayAllowed def f_set_view_image(self,bVal) : if type(bVal) == bool : self.PreviewObj.isDisplayAllowed = bVal view_image = property(f_get_view_image,f_set_view_image,None, " propert to know if display of image is allowed in drawing area. if True preview of image is possible") def f_get_pixbufToDisplay(self) : """ getter of pixbufToDisplay""" return self.PreviewObj.pixbufToDisplay def f_set_pixbufToDisplay(self,x): """ setter of pixbufToDisplay""" self.PreviewObj.pixbufToDisplay = x pixbufToDisplay = property(f_get_pixbufToDisplay,f_set_pixbufToDisplay,None,"Pixbuf to display") def f_get_open_recent_menu(self) : return self.builder.get_object('menu_file_open_recent') open_recent_menu = property(f_get_open_recent_menu,None,None, 'The Open recent menu') def f_get_status_progress_bar(self) : return Gui_status_controller(self._status_bar,self._status_progress_bar) status_progress_bar = property(f_get_status_progress_bar,None,None, 'The status progress bar') def f_get_is_button_snapshot_sensitive(self) : return self._snapshot_button.get_property('sensitive') def f_set_is_button_snapshot_sensitive(self, value) : if type(value) == bool : self._snapshot_button.set_sensitive(value) self._snapshot_button.grab_focus() is_button_snapshot_sensitive = property(f_get_is_button_snapshot_sensitive,f_set_is_button_snapshot_sensitive,None, 'Snapshot button sensitivity') def _init_i18n(self): """ Initialize all translation/i18n stuff """ self.locale_path = self.ctrl_obj.lcl_program['PO_DIR'] # Init the list of languages to support langs = [] #Check the default locale lc, encoding = locale.getdefaultlocale() if (lc): #If we have a default, it's the first in the list langs = [lc] # Now lets get all of the supported languages on the system language = os.environ.get('LANGUAGE', None) msg = " language : ",language self.logger.debug(msg) if (language): # langage comes back something like en_CA:en_US:en_GB:en # on linuxy systems, on Win32 it's nothing, so we need to # split it up into a list langs += language.split(":") # Now add on to the back of the list the translations that we # know that we have, our defaults""" langs += ["en_US"] # Now langs is a list of all of the languages that we are going # to try to use. First we check the default, then what the system # told us, and finally the 'known' list msg = "locale path", self.locale_path self.logger.debug(msg) # # nbd@ grape WARNING : Why it is needed to do a bindtextdomain and textdomain # on glade as glade is no more use. Gtk.builder instead. # if the bind on glade is not performed : the translation in glade files are not translated. # gtk.glade.bindtextdomain(APP_NAME, self.locale_path) gtk.glade.textdomain(APP_NAME) gettext.bindtextdomain(APP_NAME, self.locale_path) gettext.textdomain(APP_NAME) #print "langs %s de %s %s" % (APP_NAME,langs,self.local_path) # Get the language to use self.lang = gettext.translation(APP_NAME, self.locale_path , languages=langs, fallback = True) # Install the language, map _() (which we marked our # strings to translate with) to self.lang.gettext() which will # translate them.""" global _ _ = self.lang.gettext def __init__(self, ctrl_obj) : """ init GUI main obkect """ # init logger self.logger = logging.getLogger('luciole') self.ctrl_obj = ctrl_obj self._init_i18n() # GtkBuilder File load self.builder = gtk.Builder() self.builder.add_from_file( os.path.join(self.ctrl_obj.lcl_program['UI_DIR'],self.GUI_FILE) ) self.window = self.builder.get_object(self.GUI_MAIN_WINDOW) self.window.set_icon_from_file('images/luciole.png') self.window.set_title( "%s : %s"%(APP_NAME, 'No project' ) ) self.window.show() # widgets for project init self._init_project_buttons() # acquistion buttons initialization self._init_acquistion_buttons() callbacks = { 'on_acquisition_button_toggled' :self.on_acquisition_button_toggled, 'on_button_capture_clicked' :self.on_button_capture_clicked, 'on_button_up_clicked' :self.on_button_up_clicked, 'on_button_down_clicked' :self.on_button_down_clicked, 'on_button_trash_clicked' :self.on_button_trash_clicked, 'on_button_trash_capture_clicked' : self.on_button_trash_capture_clicked, 'on_button_capture_to_montage_clicked' :self.on_button_capture_to_montage_clicked, 'on_button_import_clicked' : self.on_button_import_clicked, 'on_button_play_toggled' : self.on_button_play_toggled, 'on_mixer_checkbutton_toggled' : self.on_mixer_checkbutton_toggled, 'on_alpha_hscale_value_changed' : self.on_alpha_hscale_value_changed, 'on_hscale_fps_value_changed' : self.on_hscale_fps_value_changed, 'on_hscale_fps_format_value' : self.on_hscale_fps_format_value, # menu file signals 'on_file_new_activate' :self.on_file_new_activate, 'on_file_save_activate' :self.on_file_save_activate, 'on_file_save_as_activate' : self.on_file_save_as_activate, 'on_file_open_activate' : self.on_file_open_activate, 'on_file_import_activate' : self.on_file_import_activate, 'on_file_export_activate' : self.on_file_export_activate, 'on_file_export_tool_activate' :self.on_file_export_tool_activate, 'on_file_quit_activate' : self.on_file_quit_activate, 'on_file_close_activate' : self.on_file_close_activate, 'on_view_project_activate' : self.on_view_project_activate, 'on_Preferences_activate' : self.on_Preferences_activate, 'on_help_about_activate' : self.on_help_about_activate, 'on_window1_delete_event' : self.on_window_delete_event, 'on_window1_destroy_event' : self.on_window_delete_event, } self.builder.connect_signals(callbacks) #Force destroy event , even if in glade file, for exiting properly self.window.connect("destroy",self.on_window_delete_event,"WM destroy") #preview window load self.previsuDrawingArea = self.builder.get_object("drawingarea1") self.PreviewObj = GLD.PreviewPixbuf(self.previsuDrawingArea) self.PreviewObj.displayDefault() # nbd@grape : to clarify self.wdg_capture_default = self.builder.get_object('treeview_capture') self.wdg_capture_parent = self.builder.get_object('scrolledwindow_capture') self.wdg_montage_default = self.builder.get_object('treeview_montage') self.wdg_montage_parent = self.builder.get_object('scrolledwindow_montage') self.clear_treeviews_ctr = 0 self.load_treeviews_ctr = 0 # initialize export obj, mainly the window gui self._exportObj = GEXPORT.luciole_export_window(self.builder,"export1") # # play pause button init # self._play_button = self.builder.get_object('button_play') self._play_pause_image = self.builder.get_object('image_play_pause') #status bar self._status_bar = self.builder.get_object('statusbar1') self._status_progress_bar = self.builder.get_object('progressbar_status') self.luciole_prefs = GPREF.Luciole_preferences(self.builder) def _init_acquistion_buttons(self) : """ acquisition buttons init """ #get objects from glade self._snapshot_button = self.builder.get_object('snapshot_button') self._mixer_checkbutton = self.builder.get_object('mixer_checkbutton') self._alpha_hscale = self.builder.get_object('alpha_hscale') # get default alpha value for mixer self._alpha_hscale.set_value(LCONST.ALPHA_DEFAULT) # focus disable on Hscale does not work with glade forced here self._alpha_hscale.set_property('can-focus',False) self._alpha_hscale.set_property('can-default',False) # load pixbuf for luciole activity in acquisition button self._pxb_luciole_sleep = gtk.gdk.pixbuf_new_from_file("images/luciole-dodo.png") self._pxb_luciole_wakedup = gtk.gdk.pixbuf_new_from_file("images/luciole-eveillee.png") self.acquisition_widget_hide() #by default buttons are not active def acquisition_widget_hide(self) : """ set acquisition buttons in non acquisition mode """ self._acq_button_image.set_from_pixbuf(self._pxb_luciole_sleep) # by default firefly is sleeping - no acquisition started self._snapshot_button.hide() # snapshot button hide by default self._mixer_checkbutton.hide() # mixer checkbox hide by default self._alpha_hscale.hide() # mixer alpha level Hscale hide by default if self._acq_button.get_active() == True : # the set_active function cause the toggle button signal emitted self._acq_button.set_active(False) def acquisition_widget_show(self) : """ Set acquisition for acquisition show """ # wake up luciole; i.e. change acquisition button logo self._acq_button_image.set_from_pixbuf(self._pxb_luciole_wakedup) self._snapshot_button.show() # snapshot button hide by default self._mixer_checkbutton.show() # mixer checkbox hide by default # if toggle button not active : activate it if self._acq_button.get_active() == False : # the set_active function cause the toggle button signal emitted self._acq_button.set_active(True) def _init_project_buttons(self) : """ initialisation of fpi buttons """ # get Hbox with acquisition widgets nas prent of this box self._hbox_acq = self.builder.get_object('hbox_acquisition') self._parent_hbox_acq = self._hbox_acq.get_parent() # get View/menu widget self._menu_view_project = self.builder.get_object('view_project') # Not allow Menu --> View --> Project window self._menu_view_project.set_sensitive(False) # create the open/new project widget self._open_project_wdg = GOPEN.Gui_open_project_widget(self.on_file_new_activate,self.on_file_open_activate) # set open/new project widgets self.project_open_widgets() # get fpi hscale self._acq_button = self.builder.get_object('acquisition_button') self._acq_button_image = self.builder.get_object('acquisition_button_image') self._fpi_hscale = self.builder.get_object('hscale_fps') # focus disable on Hscalse does not work with glade forced here self._fpi_hscale.set_property('can-focus',False) self._fpi_hscale.set_property('can-default',False) self._fpi_label = self.builder.get_object('label_fpi') def project_open_widgets(self) : """ When this function is called the project open/new buttons are dispalyed The acquisition buttons are hidden """ child = self._parent_hbox_acq.get_child() if child != None : self._parent_hbox_acq.remove(child) self._parent_hbox_acq.add(self._open_project_wdg) # Not allow access to Prroject properies window self._menu_view_project.set_sensitive(False) def project_acquistion_widgets(self) : """ When this function is called the acquisition widgets are displayed. The open.new buttons are hidden """ child = self._parent_hbox_acq.get_child() if child != None : self._parent_hbox_acq.remove(child) self._parent_hbox_acq.add(self._hbox_acq) # Allow access to Prroject properies window self._menu_view_project.set_sensitive(True) def alpha_show(self) : """ Show Hscale for alpha mixer """ self._alpha_hscale.show() def alpha_hide(self) : """ Hide Hscale for alpha mixer """ self._alpha_hscale.hide() def load_treeviews(self, rushs, capture_list, montage_list) : """ this function load the treeviews : capture and chrono both treeview defined in the xml/glade file are replaced by the Capture_tres and Chrono_tree who are inherited from gtk.treeview """ l_isOk = False self.load_treeviews_ctr = self.load_treeviews_ctr +1 # get treeview capture and replace it wdg_tvcapture = self.wdg_capture_default if wdg_tvcapture != None : #get parent and remove treeview wdg_tvparent = wdg_tvcapture.get_parent() wdg_tvparent.remove(wdg_tvcapture) # Create capture treeview wdg_tv = GCAT.Capture_tree(capture_list, rushs, self.cb_on_treeview_capture_change, self.cb_on_image_preview_capture) # add it in gui wdg_tvparent.add(wdg_tv) wdg_tv.show() self._tv_capture = wdg_tv l_isOk = True else : # raise error lerr = " unable to find treeview capture " raise LEXCEP.LucioException, lerr wdg_tvcapture = self.wdg_montage_default if ( l_isOk == True ) and (wdg_tvcapture != None) : #get parent and remove treeview wdg_tvparent = wdg_tvcapture.get_parent() wdg_tvparent.remove(wdg_tvcapture) # Create capture treeview wdg_tv = GMT.Montage_tree(montage_list, rushs, self.cb_on_treeview_montage_change, self.cb_on_image_preview_montage) # add it in gui wdg_tvparent.add(wdg_tv) wdg_tv.show() self._tv_montage = wdg_tv l_isOk = True else : # raise errror lerr = " unable to find treeview capture " raise LEXCEP.LucioException, lerr l_isOk = False def clear_treeviews(self): """ clear both capture and montage treeviews """ self.clear_treeviews_ctr = self.clear_treeviews_ctr +1 wdg_tvcapture = self._tv_capture if wdg_tvcapture != None : wdg_tvparent = wdg_tvcapture.get_parent() wdg_tvparent.remove(wdg_tvcapture) wdg_tvparent.add(self.wdg_capture_default) wdg_tvcapture = self._tv_montage if wdg_tvcapture != None : wdg_tvparent = wdg_tvcapture.get_parent() wdg_tvparent.remove(wdg_tvcapture) wdg_tvparent.add(self.wdg_montage_default) def append_capture(self, image) : """ append an image on capture treeview """ self._tv_capture.append_image(image) def show_capture_trash_button(self,active = False) : """ Indicate to show or not the capture trash button """ trash_button = self.builder.get_object('button_trash_capture') if active == True : trash_button.show() else : trash_button.hide() def cb_on_treeview_capture_change(self,image_list) : """callback for treeview capture change """ self.ctrl_obj.project_change('capture_images',image_list) def cb_on_treeview_montage_change(self,image_list) : """callback for treeview montage change """ self.ctrl_obj.project_change('chrono_images',image_list) def cb_on_image_preview_montage(self,image_obj) : """ image double click on treeview : means request preview """ self.ctrl_obj.image_preview(image_obj,LCONST.MONTAGE) def cb_on_image_preview_capture(self,image_obj) : """ image double click on treeview : means request preview """ self.ctrl_obj.image_preview(image_obj,LCONST.CAPTURE) def new_project_assistant(self,cb_apply): """ launch the project assistant window cb_apply : call back called when assisnt apply is done """ # start assistant self.ass = GLA.Assistant_new_project(cb_apply) def open_project(self) : """ launch the open project window """ filename = GOF.Open_file.open() return filename def set_programbar(self,text, isModified = False) : if isModified == True : self.window.set_title( "%s : %s (*)"%(APP_NAME,text ) ) else : self.window.set_title( "%s : %s"%(APP_NAME,text ) ) def button_preview_deactivate(self) : """ deactivate button """ widget = self.builder.get_object('acquisition_button') if widget.get_active() : # deactivate the button widget.set_active(False) def import_dialog(self): """ launch import Dialog filechooser """ return GDIALOG.Dialog.ImportDialog(self.window) def dir_chooser_dialog(self) : """ launch Dir selection filechooser """ return GDIALOG.Dialog.DirChooserDialog(self.window) def export_dialog(self,project_data) : """ Display export window """ self._exportObj.gui_export(project_data) def export_tool_dialog(self,project_data) : """ Display export tool window """ X = GEXPORT_TOOL.dialog_export_file(project=project_data) X.run() def update_play_button(self,is_active = False) : """ update pressed state and icon image for play pause button """ # the set_active function cause the toggle button signal emitted self._play_button.set_active(is_active) def update_fpi(self,fpi) : """ update fpi """ index = 1 # loop conversion fps table, the hscale need the key value for (k,v) in LCONST.VIDEO_FPS_TABLE.iteritems() : # find the position (l_framerate,l_fpi) = v if l_fpi == fpi : index = k self._fpi_hscale.set_value(float(index)) def quit(self): """ quit appluication/gui """ gtk.main_quit() def display_project_properties(self,project,cb_project_change) : GDIALOG_PROJ.Project_properties(self.window, project, cb_project_change) def display_preferences_dialog(self,conf_options, cb_on_finish = None) : self.luciole_prefs.run(conf_options,cb_on_finish) ############################################################################ # glade/XML builder callbacks ############################################################################ def on_acquisition_button_toggled(self,widget): """ Acquisition button toggled """ if widget.get_active() : # if butonn set active start acquisition self.ctrl_obj.start_acquisition() else : # button unactive ; Stop acquiistion self.ctrl_obj.stop_acquisition() def on_button_capture_clicked(self,widget) : """Capture button clicked """ self.ctrl_obj.image_capture() def on_button_up_clicked(self,widget) : """up button clicked""" self._tv_montage.move_up() def on_button_down_clicked(self,widget) : """down button clicked """ self._tv_montage.move_down() def on_button_trash_clicked(self,widget) : """Trash button clicled""" self._tv_montage.remove() # to remove also preview self.PreviewObj.pixbufToDisplay = None def on_button_trash_capture_clicked(self,widget) : """Trash button capture clicked""" self._tv_capture.remove() # to remove also preview self.PreviewObj.pixbufToDisplay = None def on_button_capture_to_montage_clicked(self,widget) : """ move to chrono button clicked """ self.ctrl_obj.move_to_chrono() def on_button_import_clicked(self,widget): """button import clicked""" self.ctrl_obj.image_import() def on_button_play_toggled(self,widget) : """ Play/Stop button clicked """ if widget.get_active() == True : # display stop button - to allow player stop self._play_pause_image.set_from_stock(gtk.STOCK_MEDIA_STOP,gtk.ICON_SIZE_BUTTON) # call play l_pos = self._tv_montage.get_position_selected_row() self.ctrl_obj.play(l_pos) else : # display play image self._play_pause_image.set_from_stock(gtk.STOCK_MEDIA_PLAY,gtk.ICON_SIZE_BUTTON) # call stop on main controller self.ctrl_obj.stop() def on_mixer_checkbutton_toggled(self,widget) : """ Mixer button toggle """ if widget.get_active() == True : # active mixer/onion skin self.ctrl_obj.mixer_on() else : # deactive mixer/onion skin self.ctrl_obj.mixer_off() def on_alpha_hscale_value_changed(self,widget) : """ Alpha mixer value changed """ # parameter should be a value between 0 and 1 , so value is divided by max self.ctrl_obj.mixer_alpha_changed( widget.get_value()/ widget.get_adjustment().upper) def on_hscale_fps_value_changed(self,widget) : """ Fps Scale value changed""" value= widget.get_value() #robustness if value > 5 : value =5 if value < 1 : value =1 # get the choosen number of frame per image value (fpsDisplay,fpi) = LCONST.VIDEO_FPS_TABLE[int(value)] self.ctrl_obj.update_fpi(fpi) self._fpi_hscale.set_property('has-focus',False) self._fpi_hscale.set_property('has-default',False) def on_hscale_fps_format_value(self,widget,value) : """ Fps Scale value changed. This callback allow display of range [1..25 ] in the scale bar instead of [1..6] """ #robustness if value > 5 : value =5 if value < 1 : value =1 (fpsDisplay, NbFrame) = LCONST.VIDEO_FPS_TABLE[int(value)] # return converted value to display return fpsDisplay def on_file_new_activate(self,widget) : """menu new clicked """ self.ctrl_obj.new_project() def on_file_save_activate(self,widget) : """menu save clicked """ self.ctrl_obj.save_project() def on_file_save_as_activate(self,widget) : """menu save as clicked """ self.ctrl_obj.save_as_project() def on_file_open_activate(self,widget): """file open activate """ self.ctrl_obj.open_project() def on_file_import_activate(self,widget): """file import activate """ self.ctrl_obj.image_import() def on_file_export_activate(self,widget): """file export activate """ self.ctrl_obj.export() def on_file_export_tool_activate(self,widget): """file export activate """ self.ctrl_obj.export_tool() def on_file_quit_activate(self,widget): """ file quit actovated""" self.ctrl_obj.quit() return True def on_file_close_activate(self,widget): """file close activate """ self.ctrl_obj.close() def on_file_close_activate(self,widget): """file close activate """ self.ctrl_obj.close() def on_view_project_activate(self,widget): """ view project properties """ self.ctrl_obj.project_properties() def on_Preferences_activate(self,widget) : """ Prefrences button activated """ self.ctrl_obj.luciole_preferences() def __UpdateAbout(self, aboutWidget) : """ Update with version of about window""" strRev= '%(revno)d' % _version.version_info strBranch = '%(branch_nick)s'% _version.version_info strVersion = "\n %s (%s)"%(strBranch,strRev) aboutWidget.set_version(strVersion) def on_help_about_activate(self,widget): """On help about activate""" aboutdialog = self.builder.get_object('aboutdialog') self.__UpdateAbout(aboutdialog) aboutdialog.show_all() result = aboutdialog.run() aboutdialog.hide() def on_window_delete_event(self,widget,event): """ destroy/delete event : """ self.ctrl_obj.quit() # the 'return true' avoid the automatic close of application return True luciole_0.8.6/lucioLib/gui/open_project.py0000644000175000017500000000432311437126703017302 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vi:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # """ open_project.py : Open project window """ import gtk import os.path class Open_file(object) : """ class to manage open file action """ def __init__(self) : pass def open(cls) : """ Class method for opening a file """ filename = None # create a filechooser Dialog window dialog = gtk.FileChooserDialog(title='Select a luciole file', action=gtk.FILE_CHOOSER_ACTION_OPEN, buttons=( gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN,gtk.RESPONSE_OK) ) # defulat action is OK dialog.set_default_response(gtk.RESPONSE_OK) # set $HOME as default folder dialog.set_current_folder(os.path.expandvars('$HOME')) # set a filter on xml files filter = gtk.FileFilter() filter.set_name("Luciole files (*.xml)") filter.add_mime_type("xml/luciole") filter.add_pattern("*.xml") dialog.add_filter(filter) # launch wait for reponse response = dialog.run() # check response if response == gtk.RESPONSE_OK: filename = dialog.get_filename() dialog.destroy() return filename open = classmethod(open) luciole_0.8.6/lucioLib/gui/dialog.py0000644000175000017500000001172311437126703016054 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vi:si:ai:et:sw=4:sts=4:ts=4 # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # """ Display a dialog window """ import gtk import os.path import gettext _ = gettext.gettext class Dialog(object): """ Dialog display """ def ErrorMessage(cls,parent = None ,message = None ): """ Display an Error message """ dialog = gtk.MessageDialog(parent = parent, flags = gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, type = gtk.MESSAGE_ERROR, buttons = gtk.BUTTONS_CLOSE, message_format = message) dialog.show_all() result = dialog.run() if result == gtk.RESPONSE_CLOSE: dialog.destroy() ErrorMessage = classmethod(ErrorMessage) def QuestionMessage(cls,parent = None ,message = None ): """ Display a question message. return True if reponse is YES , FALSE if response is NO. None if window closed without reponse. """ dialog = gtk.MessageDialog(parent = parent, flags = gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, type = gtk.MESSAGE_QUESTION, buttons = gtk.BUTTONS_YES_NO , message_format = message) dialog.show_all() result = dialog.run() r_val = None if result == gtk.RESPONSE_YES: r_val = True elif result == gtk.RESPONSE_NO: r_val = False dialog.destroy() return r_val QuestionMessage = classmethod(QuestionMessage) def ImportDialog(cls , parent): """ Import file chooser dialog""" l_filenames = [] dialog = gtk.FileChooserDialog( title=_('Select files to import'), parent = parent, action=gtk.FILE_CHOOSER_ACTION_OPEN, buttons=( gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN,gtk.RESPONSE_OK) ) # default action is OK dialog.set_default_response(gtk.RESPONSE_OK) # allow multiple selection dialog.set_select_multiple(True) # set $HOME as default folder dialog.set_current_folder(os.path.expandvars('$HOME')) filter = gtk.FileFilter() filter.add_mime_type("image/jpeg") filter.set_name("Images ( jpeg )") dialog.add_filter(filter) # all files filter = gtk.FileFilter() filter.add_pattern("*") filter.set_name("All files") dialog.add_filter(filter) # start dialog response=dialog.run() if response == gtk.RESPONSE_OK: # OK clicked get selected filenames l_filenames = dialog.get_filenames() # close dialog dialog.destroy() # return filename list return l_filenames ImportDialog = classmethod(ImportDialog) def DirChooserDialog(cls, parent) : """ Select a directory """ dialog = gtk.FileChooserDialog( title=_('Select a Folder'), parent = parent, action=gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, buttons=( gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN,gtk.RESPONSE_OK) ) # default action is OK dialog.set_default_response(gtk.RESPONSE_OK) # set $HOME as default folder dialog.set_current_folder(os.path.expandvars('$HOME')) # start dialog response=dialog.run() if response == gtk.RESPONSE_OK: # OK clicked get selected dir l_dir = dialog.get_filename() # close dialog dialog.destroy() # return dir return l_dir DirChooserDialog = classmethod(DirChooserDialog) luciole_0.8.6/lucioLib/lcl_export/0000755000175000017500000000000011437126703015626 5ustar niconicoluciole_0.8.6/lucioLib/lcl_export/lcl_export_cinelerra.py0000644000175000017500000000776611437126703022417 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vim:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2010 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # # for i18n from gettext import gettext as _ import os.path import lcl_export_tool_base as LETBASE class lcl_export_cinelerra (LETBASE.luciole_export_tool): """ class to export luciole project in cinelerra format """ """ ATTRIBUTES N/A """ def __init__(self, lcl_project = "./luciole_project.xml", template="./template.xml", export_file = "./export.xml"): """ initialization of class lcl_export_cinelerra @param object lcl_project : Luciole project or file @param string template : Path to template @param string export_file : Path to export_file """ super(lcl_export_cinelerra, self).__init__(lcl_project,template,export_file ) def _gen_ressources(self): """ ressource is called asset in cinelerra template """ resources_tag = self._template_xml.find("//ASSETS") resource_elem_tpl = self._template_xml.find("//ASSET") for image in self._lcl_project_data['resources_images'] : # build image_path image_p = os.path.join(self._lcl_project_data['image_path'], image) # create a resource element --> i.e an ASSET element new_element = self._template_xml.SubElement(resources_tag,"ASSET",{"SRC":image_p}) # copy subelement ASSET template tag in new element for elem_tpl in resource_elem_tpl.getchildren() : new_element.append(elem_tpl) #remove template tag resources_tag.remove(resource_elem_tpl) def _gen_timeline(self): """ generate timeline """ (timeline_tag, timeline_item_tpl) = self.__get_timeline_tags() for image in self._lcl_project_data['timelines_images'] : # build image_path image_p = os.path.join(self._lcl_project_data['image_path'], image) # create New EDIT element per image for frame in range(self._lcl_project_data['fpi']): framerate = str(self._lcl_project_data['fpi']) new_element = self._template_xml.SubElement(timeline_tag,"EDIT",{"STARTSOURCE":"0","CHANNEL":"0", "LENGTH":"1"}) # create FILE subElement of EDIT self._template_xml.SubElement(new_element,"FILE",{"SRC":image_p}) # remove EDIT template tag timeline_tag.remove(timeline_item_tpl) # # class PRIVATE methods # def __get_timeline_tags(self) : """ in cinelerra timeline tags is TRACK with type video, and EDITS/EDIT tag """ video_track = None tracks = self._template_xml.findall("//TRACK") for track in tracks : if track.get("TYPE") == "VIDEO" : # video track is found video_track = track break # get EDIT tag return ( video_track.find("EDITS"), video_track.find("EDITS/EDIT")) if __name__ == '__main__' : X = lcl_export_cinelerra( lcl_project = "/home/nico/temp/testLuciole/luciole_project_isight/luciole_project_isight.xml",template="./cinelerra_template.xml",export_file = "./cine_export.xml" ) X.generate() luciole_0.8.6/lucioLib/lcl_export/lcl_export_video.py0000644000175000017500000006627211437126703021556 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vim:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009-2010 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # import subprocess as SP import os import os.path import dircache import fnmatch import string import tempfile import dircache import re from .. import luciole_tools as MT from .. import luciole_exceptions as LEXCEP import logging module_logger = logging.getLogger('luciole') import gobject import threading import Queue import time # for i18n from gettext import gettext as _ import os import signal (IMAGE_LIST,IMAGE_DIR)=range(2) ERR_FILE_EXIST = 1 (EXPORT_DV,EXPORT_DVD,EXPORT_XVID) = range(3) # Mencoder commands for export , according export type dictPal= { #EXPORT_DV : "-vf scale=720:576 -ofps 25 -ovc lavc -oac pcm", EXPORT_DV : "-target pal-dv -aspect 4:3", EXPORT_DVD : "-vf scale=720:576 -ofps 25 -oac pcm -ovc lavc -lavcopts vcodec=mpeg2video:vbitrate=9600:aspect=4/3", EXPORT_XVID : "-vf scale=720:576 -ofps 25 -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=2000:aspect=4/3 -oac mp3lame -lameopts cbr:br=128", } dictEncoder= { "PAL":dictPal, } class MyThreadConvertToYuv(threading.Thread): """ Thread class for convert a sequence of image to a YUV file """ def _get_abort(self): return self.__abort def _set_abort(self, value): if value in (True,False) : self.__abort = value abort = property(_get_abort, _set_abort, None, "abort thread work") def __init__(self,imageInputType,imageDir,imageList,ppmtoy4m_opts,framesPerImage,tmpDir,VideoName,finish_queue,export_gui_obj): """ Thread class initialisation """ super(MyThreadConvertToYuv, self).__init__() self.__imageInputType = imageInputType self.__imageDir = imageDir self.__imageList = imageList self.__ppmtoy4m_opts = ppmtoy4m_opts self.__framesPerImage = framesPerImage self.__tmpDir = tmpDir self.__VideoName = VideoName self.__queue= finish_queue self._export_gui_obj = export_gui_obj self._export_gui_obj.progress_bar_text = _("Pass 1/2") self._export_gui_obj.progress_bar_fraction = 0 self.__abort = False # reset abort value def _on_finish(self, file_path,abort): """Callback function. Raised when conversions is finished""" #preparation of next pass if no abort if abort == False : self._export_gui_obj.progress_bar_text = _("Pass 2/2") self._export_gui_obj.progress_bar_fraction = 0.0 # TBD : missing update of file path in export obj self.__abort = False # reset abort value return False def _on_progress(self, value): """Callback function. used to know the conversion progress """ self._export_gui_obj.progress_bar_fraction = value return False def _convertToYuv(self) : """ This memthod is used to convert the sequence of image in a raw video in YUV4MPEG format. This method use external tools as imagemagick and tools (ppmtoy4m) from mjpegtools suite.""" # Get first the list of image To co_nvert is depending of the type if self.__imageInputType == IMAGE_DIR : # input images are stored in a directory imagesToConv = MT.filesInDir(self.__imageDir,"*.jpeg") else : # input images are in a list imagesToConv = self.__imageList # copmute the number of frames to genarate = Number of images * nf of frame per image nbFrames = len(imagesToConv)*self.__framesPerImage self.__ppmtoy4m_opts['-n'] = str(nbFrames) #update the numner of frames for video_temp_base=os.path.join(self.__tmpDir,self.__VideoName) # build ppmtoy4m_cmd ppmtoy4m_cmd = "" for key,value in self.__ppmtoy4m_opts.items() : mystring = " "+ key if value : mystring = mystring + " "+value ppmtoy4m_cmd = mystring + ppmtoy4m_cmd ppmtoy4m_cmd = 'ppmtoy4m'+ppmtoy4m_cmd # launch ppmtoy4m, this process run during all the image convesrion # and receive in stdin images converted in ppm format # the ppm images are sent to this subprocess by the convert operation # see p2 below fd5 = os.open(video_temp_base+".yuv",os.O_WRONLY|os.O_CREAT) fd6 = os.open(video_temp_base+".log",os.O_WRONLY|os.O_CREAT) ppm_proc = SP.Popen(ppmtoy4m_cmd, shell=True, stdin=SP.PIPE,stdout=fd5,stderr=fd6) frame_cpt = 0 for (count_image,image) in enumerate(imagesToConv) : # check abort if self.__abort == True : break #loop on images to convert #conversion and rezizing of cuurent image imagePath = os.path.join(self.__imageDir,image) montage_cmd = "montage -type TrueColor -quality 100 -geometry 720x576 "+imagePath+ " " + video_temp_base+".jpg" pMontage =SP.call(montage_cmd,shell=True) convert_cmd = "convert -type TrueColor -quality 100 "+video_temp_base+".jpg " +video_temp_base+".pnm " pconvert =SP.call(convert_cmd,shell=True) for i in range(self.__framesPerImage) : # check abort if self.__abort == True : break frame_cpt = frame_cpt +1 convert_cmd = "convert -depth 8 ppm:"+video_temp_base+".pnm -" p1 = SP.Popen(convert_cmd,shell=True, stdout=ppm_proc.stdin,stderr=SP.PIPE) p1.wait() # progress bar update progression = ((count_image+1.0)/len(imagesToConv)) gobject.idle_add(self._on_progress,progression) os.fsync(fd5) os.close(fd5) os.close(fd6) #return the path to yuv file return video_temp_base+".yuv" def run(self) : """ Thread start --> launch images to video conversion """ yuvfile_path = self._convertToYuv() self.__queue.put(yuvfile_path) gobject.idle_add(self._on_finish,yuvfile_path,self.__abort) class MyExportThread(threading.Thread): """ Export Thread. Thread in charge to enconde video in Yuv format to DV, DVD or XVID format """ def _get_abort(self): return self.__abort def _set_abort(self, value): if value in (True,False) : self.__abort = value abort = property(_get_abort, _set_abort, None, "abort thread work") def __init__(self, exportType, videoOutPath, yuv_queue, export_gui_obj) : """ Init export video Thread""" super(MyExportThread, self).__init__() self.logger = logging.getLogger('luciole') self.__abort = False (self._exportType,self._videoInPath,self._videoOutPath) = (exportType,None,videoOutPath) self.__queue = yuv_queue self._export_gui_obj = export_gui_obj def _on_finish(self,abort): """Callback function. Raised when conversions is finished""" # update gui progress bar if abort == False : # Terminated normaly self._export_gui_obj.progress_bar_text = _("Export Done") self._export_gui_obj.progress_bar_fraction = 1.0 else : self._export_gui_obj.progress_bar_text = _("Export Canceled") self._export_gui_obj.progress_bar_fraction = 0.0 self.__abort = False # reset abort return False def _on_progress(self, value): """Callback function. used to know the conversion progress """ self._export_gui_obj.progress_bar_fraction = value return False def run(self): """ Thread execution --> generate export """ """ Build and launch ffmpeg command. """ yuv_is_finished=False data = None while (yuv_is_finished == False) : time.sleep(0.1) try : data=self.__queue.get(block=False) yuv_is_finished=True except Queue.Empty : pass # check abort if true leave it if self.__abort == True : data = None break if data : self._videoInPath = data if self._exportType == EXPORT_DV : self._ffmpeg_launcher() else : self._mencoder_launcher() gobject.idle_add(self._on_finish,self.__abort) def _ffmpeg_launcher(self): """ Video conversion with ffmpeg : only used for DV conversion """ self.__videoFormat = "PAL" # only PAL is supported self.__withSound = False # no sound by default if ( (self._exportType == EXPORT_DV) and ( self._videoInPath ) and ( self._videoOutPath ) ) : # # Build ffmpeg command # ffmpeg_cmd = [] ffmpeg_cmd.append("ffmpeg") # add input video name ffmpeg_cmd.append('-i') ffmpeg_cmd.append(self._videoInPath) # add video conversion options coding_command = dictEncoder["PAL"][EXPORT_DV] for ffmpeg_w in coding_command.split() : ffmpeg_cmd.append(ffmpeg_w) # add output video name ffmpeg_cmd.append(self._videoOutPath) # # launch ffmpeg subprocess # self.logger.debug("command :%s"%ffmpeg_cmd) sb_encoder =SP.Popen(ffmpeg_cmd,stdout=SP.PIPE,stderr=SP.PIPE) # # check encoding process and finish # encode_not_finish = True pulse_counter = 0 pulse_modulo = 20 while encode_not_finish == True: ret_code = sb_encoder.poll() if type(ret_code) == int : # encoding is finished when a code is returned encode_not_finish = False if pulse_counter % pulse_modulo == 0 : # update progress bar only with pulses gobject.idle_add(self._on_progress, 2.0 ) pulse_counter = pulse_counter +1 def _mencoder_launcher(self) : """ Video conversion with mencoder : used for convestion in DVD and XVID format""" self.__videoFormat = "PAL" # only PAL is supported self.__withSound = False # no sound by default if ( (self._exportType in (EXPORT_DVD,EXPORT_XVID)) and ( self._videoInPath ) and ( self._videoOutPath ) ) : # # Build mencoder command # mencoder_cmd =[] mencoder_cmd.append("mencoder") # add export video options if self.__videoFormat == "PAL" : coding_command = dictEncoder["PAL"][self._exportType] for mencoder_w in coding_command.split() : mencoder_cmd.append(mencoder_w) #finally add the input and output : mencoder_cmd.append(self._videoInPath) mencoder_cmd.append('-o') mencoder_cmd.append(self._videoOutPath) # # launch mencoder command # self.logger.debug("command :%s"%mencoder_cmd) sb_encoder =SP.Popen(mencoder_cmd,stdout=SP.PIPE,stderr=SP.PIPE) # # check encoding process and finish # encode_not_finish = True res_value = 0 res_value_old = 0 while encode_not_finish == True: # First loop until child is finished buffer = [] ret_code = sb_encoder.poll() if type(ret_code) == int : encode_not_finish = False while True: # second loop to detect a line # remark : I have no success to use readline or readlines # missing some characters # mencoder display info on stdout, # read one char to no be blocked until eof char = sb_encoder.stdout.readline(1) if not char : break else : if char == '\r': aLine = string.join( buffer, '' ) buffer = [] break else: buffer.append(char) #extact Frame num #print aLine #Exemple line : #Pos: 19.0s 475f (99%) 30.68fps Trem: 0min 65mb A-V:0.000 [28800:0] # regeexp for select percent value here : 99. # value in parenthis ; with one or digits; select only the number pattern = re.compile("\(\s*([0-9]+)\%\)") # get Match_object # cf tuto : http://docs.python.org/howto/regex.html#regex-howto re_res = pattern.search(aLine) if re_res : # result is at first index of groups method # divide by 100 to have a value in range 0 .. 100 res_value = re_res.groups()[0] if res_value != res_value_old : # if send message only when percentage value change # avoid sending unuseful message gobject.idle_add(self._on_progress, float(res_value)/100.0 ) res_value_old = res_value # check if abort requested if self.__abort == True : pid = sb_encoder.pid os.kill(pid, signal.SIGTERM) time.sleep(1.0) # check if is process really dead if not isinstance(sb_encoder.poll(),int) : os.kill(pid,signal.SIGKILL) encode_not_finish = False class lcl_export_video(object) : """ Class in charge of managing exports. The class use threads for conversions""" _exportType = (EXPORT_DV,EXPORT_DVD,EXPORT_XVID) _suffixList =(".dv",".mpeg2",".avi") def _get_imageDir(self): return self.__imageDir def _set_imageDir(self, value): self.__imageDir = value def _del_imageDir(self): del self.__imageDir imageDir = property(_get_imageDir, _set_imageDir, _del_imageDir, "Image's directory. ") def _get_imageList(self): return self.__imageList def _set_imageList(self, value): self.__imageList = value def _del_imageList(self): del self.__imageList imageList = property(_get_imageList, _set_imageList, _del_imageList, "Image's list to encode. This list should be sorted. images are encodede in list order. ") def _get_imageInputType(self): return self.__imageInputType def _set_imageInputType(self, value): if value in (IMAGE_LIST,IMAGE_DIR) : self.__imageInputType = value else : msg = "[",self.__class__.__name__,"] ",value," not in correct type" self.logger.info(msg) def _del_imageInputType(self): del self.__imageInputType imageInputType = property(_get_imageInputType, _set_imageInputType, _del_imageInputType, "Image's input type ") def _get_VideoName(self): return self.__VideoName def _set_VideoName(self, value): self.__VideoName = value def _del_VideoName(self): del self.__VideoName VideoName = property(_get_VideoName, _set_VideoName, _del_VideoName, "Image's directory. ") def _get_videoDir(self): return self.__videoDir def _set_videoDir(self, value): self.__videoDir = value def _del_videoDir(self): del self.__videoDir videoDir = property(_get_videoDir, _set_videoDir, _del_videoDir, "Image's directory. ") def _get_framesPerImage(self): return self.__framesPerImage def _set_framesPerImage(self, value): self.__framesPerImage = value def _del_framesPerImage(self): del self.__framesPerImage framesPerImage = property(_get_framesPerImage, _set_framesPerImage, _del_framesPerImage, "Number of frames per image. ") def _get_outputFPS(self): return self.__outputFPS def _set_outputFPS(self, value): self.__outputFPS = value def _del_outputFPS(self): del self.__outputFPS outputFPS = property(_get_outputFPS, _set_outputFPS, _del_outputFPS, "Image's directory. ") def _get_videoFormat(self): return self.__videoFormat def _set_videoFormat(self, value): self.__videoFormat = value #set values for PAL format if self.__videoFormat == "PAL" : self.__ppmtoy4m_opts['F'] = "-F 25:1" # framerate - see man ppmtoy4m self.__ppmtoy4m_opts['A'] = "-A 59:54" # aspect ratio - see man ppmtoy4m def _del_videoFormat(self): del self.__videoFormat videoFormat = property(_get_videoFormat, _set_videoFormat, _del_videoFormat, "Image's directory. ") def _get_videoType(self): return self.__videoType def _set_videoType(self, value): self.__videoType = value def _del_videoType(self): del self.__videoType videoType = property(_get_videoType, _set_videoType, _del_videoType, "Image's directory. ") def _get_videoAspect(self): return self.__videoAspect def _set_videoAspect(self, value): self.__videoAspect = value def _del_videoAspect(self): del self.__videoAspect videoAspect = property(_get_videoAspect, _set_videoAspect, _del_videoAspect, "Image's directory. ") def _get_withSound(self): return self.__withSound def _set_withSound(self, value): self.__withSound = value def _del_withSound(self): del self.__withSound withSound = property(_get_withSound, _set_withSound, _del_withSound, "Image's directory. ") def _get_export_on_progress(self): """ export status is knowed by the status of the last expôpt thread """ if self._t_encoder and self._t_encoder.isAlive() == True : self._export_on_progress = True else : self._export_on_progress = False return self._export_on_progress export_on_progress = property(_get_export_on_progress, None, None, "export status") def __init__(self,tmp_dir, export_gui_obj): """Init of class""" self.__tmpDir = os.path.join(tmp_dir,"export") self.logger = logging.getLogger('luciole') self._cleanTmpDir() self.__imageList = list() # input image list self.__imageInputType = IMAGE_LIST # image type input is imageList by default self.__VideoName = "export" self.__outputFPS = "25" self.__videoFormat = "PAL" self.__videoType = "DV" self.__videoAspect ="4/3" # set ppmtoy4m options self.__ppmtoy4m_opts=dict() self.__ppmtoy4m_opts['-F'] = "25:1" # framerate - see man ppmtoy4m self.__ppmtoy4m_opts['-A'] = "59:54" # aspectRatio - see man ppmtoy4m self.__ppmtoy4m_opts['-S'] = "420mpeg2" # subsamplimg chroma mode - see man ppmtoy4m self.__ppmtoy4m_opts['-I'] = "p" # interlacing mode,progressive, non-interlaced - see man ppmtoy4m self.__ppmtoy4m_opts['-n'] = "0" # total output frames - see man ppmtoy4m self.__ppmtoy4m_opts['-v'] = "2" # verbosity - see man ppmtoy4m self.__framesPerImage=10 # default value for frame Per image self.__withSound = False # no sound by default self._export_on_progress = False # export progression self._t_yuv = None self._t_encoder = None self._videopath = None self.__imageDir = None if self.__videoFormat == "PAL": self.__videoRes=(720,576) # export gui obj self._export_gui_obj = export_gui_obj def export(self, export_data ,forceExport=False) : """ Export function exportData is a dict with the following items : 'image_input' = type of image put list or dir (IMAGE_LIST,IMAGE_DIR) 'image_list' = List of image to convert, each element is an absolute path yo the image or 'image_dir' = dir with all the images to impot : Not implemented 'export_dir' = the directory where the video will be exported 'video_name' = the export video name wihout extension 'export_type' = the type of export (EXPORT_DV,EXPORT_DVD,EXPORT_XVID) 'fpi' = the frame rate """ (VideoExsists,videopath) = self._IsVideoExists(export_data) if ( ( VideoExsists == False) or (forceExport == True) and ( videopath != None ) ) : # check tmp dir is clean self._cleanTmpDir() self._export_on_progress = True # initiate queue for comunication between yuv converter and export converter self._dataQueue=Queue.Queue() self._ResQueue=Queue.Queue() # # Check input parameters # self.logger.debug("export Data : %s "%export_data) export_is_valid = False if export_data.has_key('image_input') : self.__imageInputType = export_data['image_input'] export_is_valid = True # check type of input validity if( (export_is_valid == True ) and ( ( export_data.has_key('image_list') and export_data['image_input'] == IMAGE_LIST ) or ( export_data.has_key('image_dir') and ( export_data['image_input'] == IMAGE_DIR ) ) )) : if export_data.has_key('image_list') : self.__imageList = export_data['image_list'] if export_data.has_key('image_dir') : self.__imageList = export_data['image_dir'] export_is_valid = True else : export_is_valid = False if (export_is_valid == True) and (export_data.has_key('fpi')) : self.__framesPerImage = int(export_data['fpi']) export_is_valid = True else : export_is_valid = False if (export_is_valid == True) and (export_data.has_key('video_name')) : self.__VideoName = export_data['video_name'] export_is_valid = True else : export_is_valid = False if (export_is_valid == True) and os.path.exists(videopath) : try : os.remove(videopath) except OSError,err : videopath = None export_is_valid = False lerr = _('Unable to erase : %s')%err.filename lerr = "%s \n %s"%(lerr, err.strerror) raise LEXCEP.LucioException, lerr if export_is_valid == True : # start yuv converter sub process self._t_yuv = MyThreadConvertToYuv(self.__imageInputType,self.__imageDir,self.__imageList,self.__ppmtoy4m_opts,self.__framesPerImage,self.__tmpDir,self.__VideoName,self._dataQueue, self._export_gui_obj) self._t_yuv.start() # start video export encoder subprocess self._videopath = videopath self._t_encoder = MyExportThread(export_data['export_type'], self._videopath, self._dataQueue, self._export_gui_obj) self._t_encoder.start() else : return (0,videopath) if ( VideoExsists == True ) : return (ERR_FILE_EXIST,videopath) else : return (0,videopath) def cancel_export(self): """ Cancel export """ if self._export_on_progress == True : # kill the eport Threads if self._t_yuv.isAlive() : self._t_yuv.abort= True if self._t_encoder.isAlive() : self._t_encoder.abort= True #check if process remains while ( self._t_yuv.isAlive() or self._t_encoder.isAlive() ) : time.sleep(0.1) # clean temporary files self._cleanTmpDir() try : os.remove(self._videopath ) self.logger.debug("%s is removed"%self._videopath) except OSError,err : lerr = _('Unable to erase : %s')%err.filename lerr = "%s \n %s"%(lerr, err.strerror) raise LEXCEP.LucioException, lerr ################################################################################ # private methods ################################################################################ def _cleanTmpDir(self) : """ Clean or create tmp dir if needed""" if not os.path.exists(self.__tmpDir) : #create it try : os.makedirs(self.__tmpDir) except OSError,err : lerr = _('Creation of export folder not possible -- %s'% err.strerror ) raise LEXCEP.LucioException, lerr else : # directory exist, clean it list = dircache.listdir( self.__tmpDir) for file in list : filePath = os.path.join(self.__tmpDir,file) try : os.remove(filePath) self.logger.debug("%s is removed"%filePath) except OSError,err : lerr = _('Unable to erase : %s')%err.filename lerr = "%s \n %s"%(lerr, err.strerror) raise LEXCEP.LucioException, lerr def _IsVideoExists(self,export_data): """ test if a video path exists """ exists = False video_path = None # check export type if export_data.has_key('export_type') and export_data['export_type'] in self._exportType : suffix = self._suffixList[export_data['export_type']] # check export video name if export_data.has_key('video_name') : video_name = export_data['video_name']+suffix # check export dir if not os.path.exists(export_data['export_dir']) : #create it try : MT.mkdirs(export_data['export_dir']) except LEXCEP.LucioException , err : # to robustify : Error handling raise LEXCEP.LucioException, lerr video_path = os.path.join(export_data['export_dir'], video_name) # check if video path exists if os.path.exists(video_path) : exists = True return (exists,video_path) luciole_0.8.6/lucioLib/lcl_export/lcl_export_tool_base.py0000644000175000017500000001357411437126703022414 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vim:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2010 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # """ lcl_export_tool_base.py Base export to tool definition and class """ # for i18n from gettext import gettext as _ import os.path from .. import luciole_et as LE from .. import luciole_exceptions as LEXCEP from .. import luciole_project as LPROJECT class luciole_export_tool(object) : """ Base class for export to tool """ """ ATTRIBUTES @_export_file : Path to file to export @_template : Path to template @_lcl_project : The luciole project a file or a dict @_lcl_project_data : luciole project data dictionary filled with ecport data @_export_template : File to update with export data @_template_xml : the export template loaded as xml file """ def __init__(self, lcl_project = "./luciole_project.xml", template="./template.xml", export_file = "./export.xml"): """ @param lcl_project : luciole project @param template : Path to template @param export_file : Path to export_file """ # # Atributes init # self._lcl_project = lcl_project self._template = template self._export_file = export_file self._lcl_project_data = {} self._lcl_project_data['resources_images'] = [] self._lcl_project_data['timelines_images'] = [] self._export_template = None self._template_xml = None if (type(lcl_project) == str) : # test file type if os.path.exists(lcl_project) : #filetype exits load it self.__load_lcl_file() else : #Raise Error excep_message = "%s is ot a file",lcl_project raise LEXCEP.LucioException,excep_message elif (type(lcl_project) == LPROJECT.project_dico) : # input is a dictionary self.__load_lcl_dict() else : # template does not exists : raise an exception excep_message = "Invalid projetc type nor file nor luciole_project" raise LEXCEP.LucioException,excep_message # # Test template # if os.path.exists(self._template) : self._load_template() else : # template does not exists : raise an exception excep_message = " Template file %s does not exist"%self._template raise LEXCEP.LucioException,excep_message def generate(self): """ @return : @author """ self._gen_meta() self._gen_ressources() self._gen_timeline() self.__write_export_file() def _load_template(self): """ @return : @author """ self._template_xml = LE.lcl_et(self._template) def _gen_ressources(self): """ generate date for resources @return : @author """ pass def _gen_timeline(self): """ Generate data for timeline @return : @author """ pass def _gen_meta(self) : """ Generate meta information for project @return : @author """ pass def __load_lcl_file(self): """ Load a Luciole project from a file dictionary @return : @author """ try : _lcl_project_xml = LE.lcl_et(self._lcl_project) except : pass else : self._lcl_project_data['image_path'] = os.path.join(_lcl_project_xml.findtext("metas/projectPath").strip() , _lcl_project_xml.findtext("metas/rush_dir").strip() ) self._lcl_project_data['fpi'] = int(_lcl_project_xml.findtext("metas/fpi").strip()) # get resources images from project capture data list_image = _lcl_project_xml.find("captureData").getiterator('image') [ self._lcl_project_data['resources_images'].append(image.text.strip()) for image in list_image] # get timelines images from project chrono data list_image = _lcl_project_xml.find("chronoData").getiterator('image') [self._lcl_project_data['timelines_images'].append(image.text.strip()) for image in list_image] def __load_lcl_dict(self): """ Load a Luciole project from a dictionary @return : @author """ self._lcl_project_data['image_path'] = os.path.join(self._lcl_project['project_dir'], self._lcl_project['rush_dir']) self._lcl_project_data['fpi'] = int(self._lcl_project['fpi']) self._lcl_project_data['resources_images'] = self._lcl_project['capture_images'] self._lcl_project_data['timelines_images'] = self._lcl_project['chrono_images'] def __write_export_file(self): """ @return : @author """ self._template_xml.write(self._export_file) luciole_0.8.6/lucioLib/lcl_export/__init__.py0000644000175000017500000000152111437126703017736 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vim:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2010 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # luciole_0.8.6/lucioLib/lcl_export/lcl_export_pitivi.py0000644000175000017500000001576711437126703021757 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vim:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2010 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # # for i18n from gettext import gettext as _ import os.path import lcl_export_tool_base as LETBASE class lcl_export_pitivi (LETBASE.luciole_export_tool): """ class to export luciole project in pitivi format """ """ ATTRIBUTES @__element_id : Xml tag id for pitivi export file """ """ CONSTANTS """ # hard coded value in pitivi template __SOURCE_DURATION ="18446744073709551615" # pitivi type __SOURCE_TYPE = "pitivi.factories.file.PictureFileSourceFactory" __STREAM_CAPS = "video/x-raw-yuv, format=(fourcc)I420, width=(int)720, height=(int)576, framerate=(fraction)0/1" __STREAM_NAME = "src0" __STREAM_TYPE = "pitivi.stream.VideoStream" __BASE_DURATION_NS = 1000000000 __TIMELINE_TYPE = "pitivi.timeline.track.SourceTrackObject" __TIMELINE_IN_POINT = "(gint64)0" __TIMELINE_PRIORITY = "(int)0" def __init__(self, lcl_project = "./luciole_project.xml", template="./pitivi_template.xptv", export_file = "./export.xptv"): """ initialization of class lcl_export_pitivi @param object lcl_project : luciole project or file @param string template : Path to template @param string export_file : Path to export_file """ super(lcl_export_pitivi, self).__init__(lcl_project,template,export_file ) # # Attributes init. # self.__element_id = 0 def _gen_ressources(self): """ heritage method resources is called sources in pitivi """ resources_tag = self._template_xml.find("//sources") for image in self._lcl_project_data['resources_images'] : # build image_path image_p = os.path.join(self._lcl_project_data['image_path'], image) image_p = "file://"+image_p # create a resource element --> i.e a source element new_element = self._template_xml.SubElement(resources_tag,"source", {"filename":image_p, "type":self.__SOURCE_TYPE, "duration":self.__SOURCE_DURATION, "id":self.__new_element_id(), "default_duration":self.__calc_duration(int(self._lcl_project_data['fpi'])) }) # create and sub element new_output_stream = self._template_xml.SubElement(new_element,"output-streams") new_stream = self._template_xml.SubElement(new_output_stream,"stream", {"caps":self.__STREAM_CAPS, "name":self.__STREAM_NAME, "id":self.__new_element_id(), "type":self.__STREAM_TYPE }) def _gen_timeline(self): """ heritage method generate timeline : in pitivi each image is a track object with ref to """ # get video track on timeline video_track = self.__get_timeline_video_tags() # create for each resource track_objects = video_track.find('track-objects') # loop on luciole project timeline images for (index,image) in enumerate(self._lcl_project_data['timelines_images']) : # compute duration and start point track_duration = int( self.__calc_duration(int(self._lcl_project_data['fpi']))) start_point = index * int(track_duration) # create a track_object new_track_object = self._template_xml.SubElement(track_objects,"track-object", { "id":self.__new_element_id(), "type": self.__TIMELINE_TYPE, "duration" :self.__convert_to_gint64(track_duration), "media_duration" : self.__convert_to_gint64(track_duration), "start": self.__convert_to_gint64(start_point), "in_point": self.__TIMELINE_IN_POINT, "priority": self.__TIMELINE_PRIORITY }) # get and create ref tags with sources (factory_id, stream_id) = self.__find_track_id(image) self._template_xml.SubElement(new_track_object,"factory-ref", { "id":factory_id}) self._template_xml.SubElement(new_track_object,"stream-ref", { "id":stream_id}) # # class PRIVATE methods # def __new_element_id(self): """ generates an element id """ element_id = self.__element_id self.__element_id += 1 return str(element_id) def __calc_duration(self,fpi) : """ compute duration in pitivi format. Input is the fpi : number of frame per image """ duration = (1.0/fpi)*self.__BASE_DURATION_NS # use of str and int : int for a rounded value and str for string in element tree return str(int(duration)) def __get_timeline_video_tags(self) : """ in pitivi timeline tag is video is on / with typepitivi.stream.VideoStream """ video_track = None tracks = self._template_xml.findall("//track") for track in tracks: stream = track.find("stream") if stream.attrib["type"] == self.__STREAM_TYPE : video_track = track break return video_track def __convert_to_gint64(self,value) : """ convert to gint64 format. Only str conversion""" return "(gint64)"+str(value) def __find_track_id(self,image) : """ find image ids for pitivi according image name """ sources = self._template_xml.findall("//source") (source_id, stream_id) = (None,None) for source in sources : filename = source.attrib["filename"] filename = filename.split('/')[-1] if filename == image : # get source id source_id = source.attrib['id'] # find stream id stream_id = source.find('output-streams/stream').attrib['id'] break return (source_id, stream_id) luciole_0.8.6/lucioLib/lcl_export/lcl_export_kdenlive.py0000644000175000017500000002536411437126703022246 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vim:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2010 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # # for i18n from gettext import gettext as _ import os.path import subprocess as SP import os import stat import lcl_export_tool_base as LETBASE from .. import luciole_constants as LCONST class lcl_export_kdenlive (LETBASE.luciole_export_tool): """ class to export luciole project in cinelerra format kdenlive files are xml files based on MLT framework """ """ ATTRIBUTES @___element_id : Xml tag id for kdenlive export file @__list_id_producer : List of kdenlive producer tag's id @__total_duration : Total duration, in frame, or movie in timeline """ """ CONSTANTS """ __PRODUCER_AUDIO_MAX = "0" __PRODUCER_VIDEO_MAX = "0" __PRODUCER_CHANNELS = "0" __PRODUCER_DEFAULT_AUDIO = "0" __PRODUCER_FRAME_SIZE = str(LCONST.VIDEO_PAL_RES[0])+"x"+ str(LCONST.VIDEO_PAL_RES[1]) __PRODUCER_FREQUENCY = "0" __PRODUCER_IN = "0" __PRODUCER_ASPECT_RATIO = "1.000000" __PRODUCER_TYPE ="5" __PRODUCER_DEFAULT_VIDEO = "0" __PRODUCER_POS = 4 __PLAYLIST_ID = "lcl_track" __META_HOMEDIR = os.path.expandvars('$HOME') __META_PROJECFOLDER = os.path.join(os.path.expandvars('$HOME'),"kdenlive") __META_PROJECT_NAME = "Submission from luciole" def __init__(self, lcl_project = "./luciole_project.xml", template="templates/kdenlive_template.kdenlive", export_file = "./export.xptv"): """ initialization of class lcl_export_kdenlive @param object lcl_project : luciole project or file @param string template : Path to template @param string export_file : Path to export_file @return : @author """ super(lcl_export_kdenlive, self).__init__(lcl_project,template,export_file ) self.__element_id = 1 self.__list_id_producer = [] self.__total_duration = 0 def _gen_meta(self): """ generate meta information for kdenlive file """ mlt_tag = self._template_xml.getroot() mlt_tag.attrib["root"] = self.__META_HOMEDIR mlt_tag.attrib["title"] = self.__META_PROJECT_NAME kdenlivedoc = self._template_xml.find("//kdenlivedoc") kdenlivedoc.attrib["projectfolder"] = self.__META_PROJECFOLDER def _gen_ressources(self): """ resources is called and is stored in """ resources_tag = self._template_xml.find("//kdenlivedoc") duration = self.__calc_duration( self._lcl_project_data['fpi']) for image in self._lcl_project_data['resources_images'] : # build image_path image_p = os.path.join(self._lcl_project_data['image_path'], image) # create a resource element --> i.e a kdenlive_producer element new_element = self._template_xml.SubElement(resources_tag,"kdenlive_producer", {"audio_max": self.__PRODUCER_AUDIO_MAX, "channels" : self.__PRODUCER_CHANNELS, "duration" : str(duration), "default_audio" : self.__PRODUCER_DEFAULT_AUDIO, "video_max" : self.__PRODUCER_VIDEO_MAX, "frame_size" : self.__PRODUCER_FRAME_SIZE, "frequency" : self.__PRODUCER_FREQUENCY, "in" : self.__PRODUCER_IN, "file_size" : self.__calc_file_size(image_p), "aspect_ratio" : self.__PRODUCER_ASPECT_RATIO, "out" : str(duration-1), "file_hash" : self.__calc_file_hash(image_p), "type" : self.__PRODUCER_TYPE, "id" : self.__new_element_id(), "name" : image, "default_video" : self.__PRODUCER_DEFAULT_VIDEO, "resource" : image_p, }) def _gen_timeline(self): """ The timeline in kdenlive is divided in 3 steps : the tag, the , and """ self.__gen_producer() self.__gen_playlist() self.__gen_tractor() # # class PRIVATE methods # def __new_element_id(self): """ generates an element id """ element_id = self.__element_id self.__element_id += 1 return str(element_id) def __calc_file_hash(self,file) : """ compute the md5sum of a file. These function needs robustness in cas on non success of md5sum command""" output =SP.Popen(["md5sum",file], stdout=SP.PIPE).communicate()[0] # output is a srting who looks like : hash_code file # return only the hashcode return output.split()[0] def __calc_file_size(self,file) : """ compute the file size """ fsz = os.stat(file)[stat.ST_SIZE] return str(fsz) def __calc_duration(self,fpi) : """ kdenlive does not support ressource with duration less then 3 frames ....""" fr = int(fpi) if fr < 3 : fr =3 return fr def __get_timeline_video_tags(self) : """ in pitivi timeline tag is video is on / with typepitivi.stream.VideoStream, """ video_track = None tracks = self._template_xml.findall("//track") for track in tracks: stream = track.find("stream") if stream.attrib["type"] == self.STREAM_TYPE : video_track = track break return video_track def __find_black_track(self) : """ get back track play list. return the entry element """ pl_found = None for pl in self._template_xml.findall("//playlist") : if pl.attrib["id"] == "black_track" : pl_found = pl break return pl_found.find("entry") def __find_kdenlive_producer_id(self,image) : """ find the id of a tag """ kd_producer_tags = self._template_xml.findall("//kdenlive_producer") id_found = None for kd_producer_tag in kd_producer_tags : if kd_producer_tag.attrib['name'] == image : id_found = kd_producer_tag.attrib['id'] # raise error if id not found return id_found def __gen_proprety_tag(self,producer_tag,name,text) : """ generate property tag """ prop_tag = self._template_xml.SubElement(producer_tag,"property",{ "name":name}) prop_tag.text = text def __gen_producer_properties(self,producer_tag, image_p) : """ properties of producer tag. Dirty generation. """ self.__gen_proprety_tag(producer_tag,"mlt_type","producer") self.__gen_proprety_tag(producer_tag,"aspect_ratio","1") self.__gen_proprety_tag(producer_tag,"length","15000") self.__gen_proprety_tag(producer_tag,"eof","pause") self.__gen_proprety_tag(producer_tag,"resource",image_p) self.__gen_proprety_tag(producer_tag,"ttl","25") self.__gen_proprety_tag(producer_tag,"progressive","1") self.__gen_proprety_tag(producer_tag,"mlt_service","pixbuf") def __gen_producer(self) : """ tag have attributes and property subtag. Producer tag is a son of tag """ mlt_tag = self._template_xml.getroot() producer_pos = self.__PRODUCER_POS duration = str(self._lcl_project_data['fpi']) # loop on luciole project timeline images for (index,image) in enumerate(self._lcl_project_data['timelines_images']) : id_kd_producer = self.__find_kdenlive_producer_id(image) if id_kd_producer != None : # create the tag producer_tag= self._template_xml.Element("producer") producer_tag.set("in",self.__PRODUCER_IN) producer_tag.set("out",duration) producer_tag.set("id",id_kd_producer) mlt_tag.insert(producer_pos,producer_tag) # create tags image_p = os.path.join(self._lcl_project_data['image_path'], image) self.__gen_producer_properties(producer_tag, image_p) # remember the id for playlist generation self.__list_id_producer.append(id_kd_producer) #increment position for next element producer_pos += 1 def __gen_playlist_entry(self,pl_tag,out,producer) : """ playlist entry tag""" self._template_xml.SubElement(pl_tag,"entry",{ "in":self.__PRODUCER_IN, "out":out, "producer":producer}) def __gen_playlist(self) : """ generate playlist """ mlt_tag = self._template_xml.getroot() # get playlist tag playlists_tag = self._template_xml.findall("//playlist") playlist_tag = None for tag in playlists_tag : if tag.attrib["id"] == self.__PLAYLIST_ID : playlist_tag = tag # generate entry tag and compute duration of all timeline if playlist_tag != None : # compute duration duration = int(self._lcl_project_data['fpi']) for id_p in self.__list_id_producer : self.__gen_playlist_entry(playlist_tag,str(duration),id_p) self.__total_duration += duration self.__total_duration = self.__total_duration -1 def __gen_tractor(self) : """ modify tractor tag""" tractor_tag = self._template_xml.find("tractor") tractor_tag.attrib['out'] = str(self.__total_duration) #update duration in black_track playlist pl_entry=self.__find_black_track() pl_entry.attrib["out"] = str(self.__total_duration) luciole_0.8.6/lucioLib/luciole_et.py0000644000175000017500000000515011437126703016152 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vim:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009-2010 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # # for i18n from gettext import gettext as _ import xml.etree.ElementTree as ET #python 2.5 from xml.parsers.expat import ParserCreate, ExpatError import luciole_exceptions as LEXCEP def indent(elem, level=0): i = "\n" + level*" " if len(elem): if not elem.text or not elem.text.strip(): elem.text = i + " " if not elem.tail or not elem.tail.strip(): elem.tail = i for elem in elem: indent(elem, level+1) if not elem.tail or not elem.tail.strip(): elem.tail = i else: if level and (not elem.tail or not elem.tail.strip()): elem.tail = i class lcl_et(object) : def __init__(self,xml_file) : self.xml_file = xml_file #parse XML tempalte file try : self.xml_obj = ET.parse(self.xml_file) except ExpatError , err_value : # Raise Error lerr = "XML parse error in ",self.xml_file, "\nerror :",err_value raise LEXCEP.LucioException, lerr self.xml_obj = None def findtext(self,condition) : return self.xml_obj.findtext(condition) def find(self,match) : return self.xml_obj.find(match) def findall(self,match) : return self.xml_obj.findall(match) def Element(self, tag) : return ET.Element(tag) def SubElement(self,parent,tag,attrib={}) : return ET.SubElement(parent,tag,attrib) def insert(self,index,element) : return self.xml_obj.insert(index,element) def tostring(self,element) : return ET.tostring(element) def getroot(self) : return self.xml_obj.getroot() def write(self,file) : indent(self.xml_obj.getroot()) return self.xml_obj.write(file,"UTF-8") luciole_0.8.6/lucioLib/luciole_manage_recent.py0000644000175000017500000000644611437126703020343 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vim:si:ai:et:sw=4:sts=4:ts=4 # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009-2010 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # import gtk import luciole_exceptions as L_EXCEP import os.path #i18n from gettext import gettext as _ class luciole_recent(object): """ Manage recent projects, display 5 projects can be dsiplayed at max """ __MAX_PROJECT = 5 __ui_recent_path = '/menubar1/menu_file/menu_file_open_recent' def __init__(self,ProjectList,gui,cb_open,conf) : """ Init of module """ self.__ProjectList = list() self.gui = gui self._open_recent_menu = self.gui.open_recent_menu self._cb_open = cb_open # callback for open project self._conf = conf # create a List of valid projects : i.e Existing projects _valid_project = [] if ProjectList != [] : for project in ProjectList : if os.path.exists(project) : _valid_project.append(project) if len(ProjectList) <= self.__MAX_PROJECT : self.__ProjectList.extend(_valid_project) self._displayRecentProject() def add_project(self,project) : """ add a project ro recent used projects """ # verify project is not yet present # count shall return 0 if self.__ProjectList.count(project) == 0 : if len(self.__ProjectList) >= self.__MAX_PROJECT : # remove older project self.__ProjectList.pop() #insert project self.__ProjectList.insert(0,project) self._displayRecentProject() self._conf.update_last_project(self.__ProjectList) def _displayRecentProject(self) : """ Update submenu widget with recently used projects """ # Get submenus Menu = self._open_recent_menu.get_submenu() MenuChilds = Menu.get_children() # first clean menu by removing all menu childs for child in MenuChilds : Menu.remove(child) ## then add menuItem for eachProject for project in self.__ProjectList : MenuItem = gtk.MenuItem(project) MenuItem.connect("activate",self.menu_activate,project) Menu.append(MenuItem) MenuItem.show() def menu_activate(self,widget,project): """ Callback on menu activation. open selected project """ try : self._cb_open(project) except L_EXCEP.LucioException,err : import gui as LTK msg = _("Project %s no more exist"%project) LTK.Dialog.ErrorMessage(self.gui.window, msg) luciole_0.8.6/lucioLib/luciole_player.py0000644000175000017500000001143711437126703017043 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vim:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009-2010 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # from lcl_gst import lcl_gst_play as LGST_P import luciole_exceptions as L_EXCEP import luciole_tools as LT import luciole_constants as LCONST import os.path import gtk class luciole_player(object): """ Manage play of image per image video in the preview window """ _local_tmp_dir="play" _jpeg_format = "output-%05d.jpeg" def __init__(self,videowidget,cb_eos,tmp_dir) : """ init of class luciole_player : inputs : - videoWidget : Drawing area widget where video is played - cb_eos : callback for video eos (eos) - tmp_dir : path to a temp dir Exeption : - raise if temp dirs cannot be created """ self._cb_eos = cb_eos self._tmp_dir = tmp_dir # create temp dir, where image go to be stored for play PathToImage = os.path.join(self._tmp_dir,self._local_tmp_dir) #clean or create temp dir try : self._cleanTmpDir(PathToImage) except L_EXCEP.LucioException,err : raise L_EXCEP.LucioException,err.message else : self.PathToImage=PathToImage # init gstreamer player imagesLocation = os.path.join(self.PathToImage, self._jpeg_format) self.player = LGST_P.lcl_gst_play(videowidget,imagesLocation, on_eos_cb = self.on_eos) def on_eos(self) : """ action to do when gestreamer EOS( end of stream) occurs """ #self.player.on_eos = lambda *x: on_eos() # Why this line ? self.player.stop() self._cb_eos() def start_play(self,player_data) : """ starts playing player_data is a dictionary with : image_list : the image list to play. each element of the list is a full image path fpi : the video framerate """ self._copy_file_to_play(player_data ) # prepare image to play # get framerate to be used fpi = player_data['fpi'] framerate = None for (k,v) in LCONST.VIDEO_FPS_TABLE.iteritems() : # find the position (l_framerate,l_fpi) = v if l_fpi == fpi : framerate= l_framerate # update gstreamer playe number of images self.player.framerate=framerate self.player.play() def stop_play(self) : """ Stop Video player """ # stop gstreamer player self.player.stop() def _copy_file_to_play(self,player_data) : """ This method prepare the image to play. Preparation is : - copy in a ordered way images in tmp dir all the images to play - set the number of image to play - set the framerate """ for index,image in enumerate(player_data['image_list']) : path_src = image file_dest = self._jpeg_format%index path_dest = os.path.join(self.PathToImage,file_dest) if os.path.exists(path_dest) : os.remove(path_dest) # delete image if image exist # REMARK : Exception check is not made : TODO os.link(path_src,path_dest) # copy image # numbers of image to play self.player.nbImages = len(player_data['image_list']) def _cleanTmpDir(tmp_dir) : """ Clean or create tmp dir if needed""" if not os.path.exists(tmp_dir) : #create it try : LT.mkdirs(tmp_dir) except L_EXCEP.LucioException,err : raise L_EXCEP.LucioException,err.message else : # directory exist, clean it list = LT.filesInDir(tmp_dir) for file in list : filePath = os.path.join(tmp_dir,file) try : LT.delf(filePath) except L_EXCEP.LucioException,err : raise L_EXCEP.LucioException,err.message _cleanTmpDir = staticmethod(_cleanTmpDir) luciole_0.8.6/lucioLib/luciole_exceptions.py0000644000175000017500000000174111437126703017725 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vi:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # import sys class LucioException(Exception) : def __init__(self,*params): Exception.__init__(self,*params) self.wrapped_exc=sys.exc_info() luciole_0.8.6/lucioLib/controller/0000755000175000017500000000000011437126703015636 5ustar niconicoluciole_0.8.6/lucioLib/controller/controller_load_project.py0000644000175000017500000001716511437126703023132 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vi:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # import os import gobject import threading import Queue from .. import luciole_tools as LT from .. import luciole_image as LI from .. import luciole_acquisition as LACQ from .. import luciole_constants as LCONST from gettext import gettext as _ class rush_loader_thread(threading.Thread): """ this thread is used to load the rush images, its take a while so this action is threaded """ def __init__(self,project,queue) : """ initilise thread progress_bar : the status/progres bar for diplay info about project load cb_on_finish : The callback function when thread is finished, the rush_obj is returned by thread project : the project dictionary """ # init thread super(rush_loader_thread, self).__init__() self.project = project self.queue = queue def run(self) : """ run thread """ # create rush list object rush_dir = os.path.join(self.project['project_dir'],self.project['rush_dir']) rush_obj = LI.Rush_images(rush_dir,self.project['rush_images'],self._cb_progression) # indicate finsih on queue and send rush_obj # send finsih message on queueu qmsg = dict() qmsg['finish'] = rush_obj self.queue.put(qmsg,block=False) def _cb_progression(self,ratio = None): """ indicate progression of rsuh object init """ # put in on queue qmsg = dict() qmsg['progression'] = ratio self.queue.put(qmsg,block=False) class Controller_load_project(object): """ This class is used to manage the load of a project in application. The class use a Thread for launch rush object init. (it can takes) long. The thread and this class communicate vai a queue. Information on queue are progression and finish. The queue is checked cyclicly via a gobject timer """ _TIMEOUT = 10 # 10 ms timer def __init__(self, project, gui, cb_on_finish, cb_acq_error, cb_image_capture_done) : """ Init Thread, init gobject timer and clear progressbar """ self.project = project self.gui = gui self._cb_on_finish = cb_on_finish self._cb_acq_error = cb_acq_error self._cb_image_capture_done = cb_image_capture_done self._progress_bar_widget = self.gui.status_progress_bar # initialize thread self.queue = Queue.Queue() self.t_rush = rush_loader_thread(project,self.queue) #clear progressbar self._progress_bar_clear() # start Thread self.t_rush.start() # start timer gobject.timeout_add(self._TIMEOUT,self._on_timeout) #print " Controller load : ", threading.currentThread() def _on_timeout(self) : """ function call peridodically by gobject timeout . The periodicity is ensured by returning True. When False is return timer is stop the goal of the time is too check the queue """ #print " on timeout : ", threading.currentThread() rearm_timer = True try: qmsg = self.queue.get(block = False) except Queue.Empty : pass else : if qmsg.has_key('progression') : self._progress_bar_on_progress(qmsg['progression']) if qmsg.has_key('finish') : # finisg project load ( Non threaded section ) self._on_rush_finish(qmsg['finish']) #update as finsih staus/progress bard self._progress_bar_complete() # stop the timer rearm_timer = False return rearm_timer def _progress_bar_clear(self): """ Clear progress bar """ msg = _('Project Load started') self._progress_bar_widget.start(msg) def _progress_bar_complete(self): """ Progress bar full : Project loaded """ msg = _( 'Project %s is loaded')%self.project['project_name'] # use of idle_add because gui update not in the same thread self._progress_bar_widget.stop(msg) def _progress_bar_on_progress(self,ratio = None): """ indicate that detection is going on """ msg = _('Project %s is loading')%self.project['project_name'] self._progress_bar_widget.on_progress(msg,ratio) def _on_rush_finish(self, rush_obj): """ Finish the load after rush generation """ acq_obj = None if rush_obj != None : # load treeviews self.gui.load_treeviews(rush_obj, self.project['capture_images'], self.project['chrono_images']) # update acquisition object if self.project['hardtype'] == LCONST.DIGICAM : # No acquisition for digital camera acq_obj = None elif self.project['hardtype'] == LCONST.WEBCAM : # acquisition for WEBCAM acq_obj = LACQ.luciole_acquisition_webcam( self.gui.display, data = self.project['webcam_data'], project_dir = self.project['project_dir'], cb_error = self._cb_acq_error, cb_capture_done = self._cb_image_capture_done) else : # default acquisition load i.e. DVCAM acq_obj = LACQ.luciole_acquisition( self.gui.display, False, self.project['hardtype'], project_dir = self.project['project_dir'], cb_error = self._cb_acq_error, cb_capture_done = self._cb_image_capture_done) # for mixer initialisation set image to miw with the last image of the capture view. only if capture image is not empty if len( self.project['capture_images'] ) > 0 : l_last_image_path = os.path.join(self.project['project_dir'],self.project['rush_dir'],self.project['capture_images'][-1]) if os.path.exists(l_last_image_path) and acq_obj != None : acq_obj.Image2Mix = l_last_image_path # update fpi on gui and show it self.gui.update_fpi(int(self.project['fpi'])) # show project acquisition widgets self.gui.project_acquistion_widgets() # update project name on Main bar self.gui.set_programbar(self.project['project_name'],False) # call back to indicate finish at controller self._cb_on_finish(rush_obj, acq_obj) luciole_0.8.6/lucioLib/controller/__init__.py0000644000175000017500000000157111437126703017753 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vi:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # from controller_load_project import * luciole_0.8.6/lucioLib/controller/controller_import.py0000644000175000017500000001570411437126703021774 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vim:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009-2010 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # import os.path import gobject import threading import Queue from .. import luciole_tools as LT from .. import luciole_image as LI from .. import luciole_constants as LCONST from .. import luciole_exceptions as L_EXCEP from gettext import gettext as _ class Import_thread(threading.Thread): """ this thread is used to load the rush images, its take a while so this action is threaded """ def __init__(self,filenames,project,rush_obj,queue) : """ initilise thread """ # init thread super(Import_thread, self).__init__() self.filenames = filenames self.project = project self.rush_obj = rush_obj self.queue = queue def run(self) : """ run thread """ # create rush list object image_objs = [] for (index,filename) in enumerate(self.filenames) : # copy image to rush folder and resize it try : l_rush_image_name = self.__copy_import_to_rush_folder(filename) except L_EXCEP.LucioException,err : image = None lerr = "ERROR on import image : ",err raise L_EXCEP.LucioException,lerr else : # append image to rush list : usage of append_threaded special for thread execution image_objs.append(self.rush_obj.append_threaded(l_rush_image_name)) # indicate progression on queue qmsg = dict() qmsg['progression'] = (index + 1.0)/len(self.filenames) self.queue.put(qmsg,block=False) # indicate finsih on queue and send rush_obj # send finsih message on queueu qmsg = dict() qmsg['finish'] = image_objs self.queue.put(qmsg,block=False) def __copy_import_to_rush_folder(self,p_image_path): """ copy imported image to rush dir : 1. copy image to tmp dir. 2. resize it. 3. move it to rush image dir """ # build temp impage path l_temp_dir = os.path.join(self.project['project_dir'], LCONST.TMP_DIR) # copy name l_ac_image_temp = os.path.join(l_temp_dir,LCONST.ACQUIRED_IMAGE_NAME) # resized copy name l_ac_image_temp_rz = os.path.join(l_temp_dir,LCONST.ACQUIRED_IMAGE_NAME_RZ) # build rush image name l_basename = LCONST.RUSH_FILENAME_TPL%self.rush_obj.rush_index l_rush_image = os.path.join(self.project['project_dir'], self.project['rush_dir']) l_rush_image = os.path.join(l_rush_image, l_basename) try : # 1. move image acquired image to tmp dir LT.copyf(p_image_path,l_ac_image_temp) # 2. resize image result is in l_ac_image_temp_rz l_rz_obj = LI.Image_resize(l_ac_image_temp,l_ac_image_temp_rz ) l_rz_obj.convert() # 3. move resized image to rush dire LT.movef(l_ac_image_temp_rz,l_rush_image) except L_EXCEP.LucioException,err : raise L_EXCEP.LucioException,err l_basename = None return l_basename class Controller_import(object): """ This class is used to manage the import of image in project . The class use a Thread for importing images (it can takes) long. The thread and this class communicate via a queue. Information on queue are progression and finish. The queue is checked cyclicly via a gobject timer """ _TIMEOUT = 50 # 50 ms timer def __init__(self, filenames, project, gui, rush_obj, ctrl_obj ) : """ Init Thread, init gobject timer and clear progressbar """ self.filenames = filenames self.project = project self.gui = gui self.rush_obj = rush_obj self.ctrl_obj = ctrl_obj self._progress_bar_widget = self.gui.status_progress_bar # initialize thread self.queue = Queue.Queue() self.t_rush = Import_thread(self.filenames, self.project, self.rush_obj, self.queue) #clear progressbar self._progress_bar_clear() # start Thread self.t_rush.start() # start timer gobject.timeout_add(self._TIMEOUT,self._on_timeout) def _on_timeout(self) : """ function call peridodically by gobject timeout . The periodicity is ensured by returning True. When False is return timer is stop the goal of the time is too check the queue """ rearm_timer = True try: qmsg = self.queue.get(block = False) except Queue.Empty : pass else : if qmsg.has_key('progression') : self._progress_bar_on_progress(qmsg['progression']) if qmsg.has_key('finish') : # finisg project load ( Non threaded section ) self._on_import_finish(qmsg['finish']) #update as finsih staus/progress bard self._progress_bar_complete() # stop the timer rearm_timer = False return rearm_timer def _progress_bar_clear(self): """ Clear progress bar """ msg = _('Import started') self._progress_bar_widget.start(msg) def _progress_bar_complete(self): """ Progress bar full : Import done """ msg = _('All images imported') # use of idle_add because gui update not in the same thread self._progress_bar_widget.stop(msg) def _progress_bar_on_progress(self,ratio = None): """ indicate that import is going on """ msg = _('Importing images ...') self._progress_bar_widget.on_progress(msg,ratio) def _on_import_finish(self, image_objs = []) : """ callback for import finish """ if image_objs != [] : self.ctrl_obj.project_change('rush_images',self.rush_obj.dump_image_name()) # Not to be don in thread : interacts with gui for image_obj in image_objs : self.gui.append_capture(image_obj) luciole_0.8.6/lucioLib/luciole_project.py0000644000175000017500000004316011437126703017213 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vim:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009-2010 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # """ luciole_project.py : Manage project """ import os.path import xml.etree.ElementTree as ET #python 2.5 from xml.parsers.expat import ParserCreate, ExpatError import luciole_constants as LCONST import luciole_tools as LT import luciole_exceptions as LEXCEP import logging module_logger = logging.getLogger('luciole') class project_dico(dict): """ Luciole project dicitionary : contains all porject data as dictionary """ # # CONSTANTS # # mandatory tags for webcam description WEBCAM_DATA_TAGS = [ 'name', 'device', 'source_input', 'height', 'width', 'framerate_list', 'framerate_selected', ] # default values for webcam WEBCAM_TAGS_DEFAULT_VALUES = { 'framerate_list' : [(5,1) ], 'framerate_selected' : (5,1) , } def __init__(self): """ constructor : init a dict """ super(project_dico,self).__init__() class project_controller(object) : """ Class for handling luciole projects : creation, open, save """ def __init__(self): """ Constructor""" # init logger self.logger = logging.getLogger('luciole') self.logger.debug("Entering project_controller") # by default no project loaded self.__project_loaded = False def create(self,p_project_dico) : """ create project hiararchy and XML structure""" p_project_dico['project_dir'] = os.path.join(p_project_dico['project_dir'],p_project_dico['project_name']) # create project dir and dirs hierarchy p_project_dico = self.__create_folders(p_project_dico) # update XML filename p_project_dico['xml_filename'] = p_project_dico['project_name']+'.xml' self.__project_xml = self.__create_xml_file(p_project_dico) # create 3 empties list for rsuh capture and chrono p_project_dico['rush_images'] = [] p_project_dico['capture_images'] = [] p_project_dico['chrono_images'] = [] self.__save_to_xml_file( os.path.join( p_project_dico['project_dir'],p_project_dico['xml_filename']), self.__project_xml ) def open(self,project_file_path) : """ open an existing project """ l_project = project_dico() if os.path.isfile(project_file_path) : #create project dico l_project['project_path'] = project_file_path l_project['project_dir'] = os.path.split(project_file_path)[0] #parse XML project file try : self.__project_xml = ET.parse(project_file_path) except ExpatError , err_value : l_project = None lerr = "XML parse error in ",project_file_path, "\nerror :",err_value raise LEXCEP.LucioException, lerr else : l_project['xml_filename'] = os.path.basename(project_file_path) l_project['is_modified'] = LCONST.PROJECT_NOT_MODIFIED # tmp dir nit in xml file but needed l_project['tmp_dir'] = LCONST.TMP_DIR try : (l_is_valid, l_project_changed, l_project) = self.__scan_project_file(l_project) except LEXCEP.LucioException, err : raise LEXCEP.LucioException, err else : self.__project_loaded = True if l_project_changed == True : # save to file loaded project due to project cange # outside application self.save(l_project) else: # exception handling lerr = " invalid file name : ",project_file_path raise LEXCEP.LucioException, lerr l_project = None return (l_is_valid, l_project) def save(self,p_project_dico ) : """ save a project to XML file """ # create XML object identical to create a new one self.__project_xml = self.__create_xml_file(p_project_dico) # put image name info ( rush, capture,chrono) in XML file self.__project_xml = self.__create_xml_images_tag(p_project_dico, self.__project_xml) self.__save_to_xml_file( os.path.join( p_project_dico['project_dir'],p_project_dico['xml_filename']), self.__project_xml ) def save_as(self,p_new_project_dir,p_project_dico) : """ save as """ #memorise old rush_images dir l_src_rush_dir = os.path.join(p_project_dico['project_dir'], p_project_dico['rush_dir']) p_project_dico['project_dir'] = p_new_project_dir # the new project name is the dir basename (last fir) of the path p_project_dico['project_name'] = os.path.basename(p_new_project_dir) p_project_dico['xml_filename'] = p_project_dico['project_name']+'.xml' # 2. create folders hierarchy p_project_dico = self.__create_folders(p_project_dico) # 3. copy rush images try : for image_name in p_project_dico['rush_images'] : LT.copyf( os.path.join(l_src_rush_dir,image_name) , os.path.join(p_project_dico['project_dir'], p_project_dico['rush_dir']) ) except LEXCEP.LucioException, err : lerr = " Impossible to copy %s : ",err raise LEXCEP.LucioException, lerr else : # 4 call save self.save(p_project_dico) #################################################################################################### ##### PRIVATE METHODS #################################################################################################### def __save_to_xml_file(self,p_xml_file_path,p_project_xml): """ save an XML obect to file """ # XML file indetation for readability self.__indent(p_project_xml.getroot()) p_project_xml.write(p_xml_file_path,"UTF-8") def __scan_project_file(self,p_project) : """ scan xml project file """ # by default a project is valid : # validity is only available with WEBCAM hardtype is_valid = True l_project_changed = False # get path and dir data p_project['project_name'] = self.__project_xml.findtext("metas/projectName").strip() # check if path cahnged if p_project['project_dir'] != self.__project_xml.findtext("metas/projectPath").strip() : l_project_changed = True p_project['export_dir'] = self.__project_xml.findtext("metas/export_dir").strip() p_project['rush_dir'] = self.__project_xml.findtext("metas/rush_dir").strip() # tmp dir nit in xml file but needed p_project['tmp_dir'] = LCONST.TMP_DIR # get FPI # nbd@grape text or int value needed ? p_project['fpi'] = self.__project_xml.findtext("metas/fpi").strip() # get hardware data elem=self.__project_xml.find("metas/hardtype") p_project['hardtype'] = int(elem.attrib["id"]) # get webcam data if p_project['hardtype'] == LCONST.WEBCAM : # loop on webcam datas et_webcam_data = self.__project_xml.find("//hard_type_data") if et_webcam_data != None : # loop on webcam data and save on data dictionary webcam_data={} for my_item in et_webcam_data.getchildren() : # for framerate_selected and framerate_list tage : evaluate to convert in tuple and list # for others keep it as str if my_item.tag == 'framerate_selected' or my_item.tag == 'framerate_list' : webcam_data[my_item.tag] = eval(my_item.attrib.get("key")) else : webcam_data[my_item.tag] = my_item.attrib.get("key") # check webcam data validity is_valid = True missing_tags = [] for data in p_project.WEBCAM_DATA_TAGS : if not webcam_data.has_key(data) : is_valid = False missing_tags.append(data) if is_valid == False : # not a valid project for missing_tag in missing_tags : if p_project.WEBCAM_TAGS_DEFAULT_VALUES.has_key(missing_tag) : webcam_data[missing_tag] = p_project.WEBCAM_TAGS_DEFAULT_VALUES[missing_tag] msg = " missing_tag : ",missing_tag self.logger.debug(msg) else : err = 'Invalid Project webcam data , tag %s is missing '%missing_tag raise LEXCEP.LucioException, err p_project['webcam_data'] = webcam_data else : # raise Error err = "Invalid webcam data found " raise LEXCEP.LucioException, err p_project['rush_images'] = self.__scanImages("rushData") p_project['capture_images'] = self.__scanImages("captureData") p_project['chrono_images'] = self.__scanImages("chronoData") p_project = self.__check_rush_images(p_project) return (is_valid, l_project_changed, p_project) def __scanImages(self,p_type) : """ scan image tag and return image list """ l_list_out = [] # get tag for image : param p_type DataTag = self.__project_xml.find(p_type) list_image = DataTag.getiterator('image') for image in list_image : # append image name to list l_list_out.append(image.text.strip()) return l_list_out def __check_rush_images(self,p_project) : """ verify if all images in project really exist in dir. if not remove it in p_project """ rush_dir = os.path.join( p_project['project_dir'] , p_project['rush_dir'] ) images_to_remove = [] for image_name in p_project['rush_images'] : # test if image exists img_path = os.path.join(rush_dir,image_name) if not os.path.exists(img_path) : msg = "Not an image : ", image_name self.logger.info(msg) # image is not on rush dir # collect image to suppress from rush_list images_to_remove.append(image_name) # now remove images in rush list for image_name in images_to_remove : p_project['rush_images'].remove(image_name) # remove also image ref in capture_images l_nb_images = p_project['capture_images'].count(image_name) if l_nb_images >0 : for l_i in xrange(l_nb_images) : p_project['capture_images'].remove(image_name) # remove also image ref in chrono_images l_nb_images = p_project['chrono_images'].count(image_name) if l_nb_images >0 : for l_i in xrange(l_nb_images) : p_project['chrono_images'].remove(image_name) return p_project #################################################################################################### ##### STATIC METHODS #################################################################################################### def __indent(elem, level=0): i = "\n" + level*" " if len(elem): if not elem.text or not elem.text.strip(): elem.text = i + " " for elem in elem: project_controller.__indent(elem, level+1) if not elem.tail or not elem.tail.strip(): elem.tail = i else: if level and (not elem.tail or not elem.tail.strip()): elem.tail = i __indent = staticmethod(__indent) def __create_xml_file(p_project_dico) : """ create the xml file for a project ans return it """ # load new xml file from template __project_xml = ET.parse("./templates/project_template.xml") # update element tree file elem = __project_xml.find("metas/projectName") elem.text = p_project_dico['project_name'] elem = __project_xml.find("metas/projectPath") elem.text =p_project_dico['project_dir'] if p_project_dico.has_key('rush_dir') : elem = __project_xml.find("metas/rush_dir") elem.text =p_project_dico['rush_dir'] if p_project_dico.has_key('export_dir') : elem = __project_xml.find("metas/export_dir") elem.text =p_project_dico['export_dir'] # update fpi elem = __project_xml.find("metas/fpi") if (p_project_dico['fpi']): elem.text=str(p_project_dico['fpi']) else : elem.text='5' # nbd@grape :Warning Static method = Think nefor using logger print" !!! No FPI selected, default value 5 frame per image is set " # update hardtype elem = __project_xml.find("metas/hardtype") if (p_project_dico['hardtype']): elem.attrib['id'] = str(p_project_dico['hardtype']) hard_type_desc = ET.SubElement(elem, 'hard_type_desc') hard_type_desc.text = LCONST.HardTypeName[p_project_dico['hardtype']] # in case of webcam save specific data if p_project_dico['hardtype'] == LCONST.WEBCAM and p_project_dico['webcam_data'] != None : hard_type_data = ET.SubElement(elem, 'hard_type_data') # create new elements with same tage name as dictionary for k,v in p_project_dico['webcam_data'].iteritems() : t_elem = ET.SubElement(hard_type_data,k) t_elem.attrib['key'] = str(v) else : elem.attrib['id']=str(LCONST.FAKE) elem.text=LCONST.HardTypeName[LCONST.FAKE] # nbd@grape :Warning Static method = Think before using logger print " !!! No hardware selected, FAKE hardware selected" return __project_xml __create_xml_file = staticmethod(__create_xml_file) def __create_xml_images_tag(p_project_dico,p_xml_file) : """ create image tag for rush, chrono and image """ # rush images __parent_image_tag = p_xml_file.find('rushData') __images_list = p_project_dico['rush_images'] __parent_image_tag = project_controller.__make_tag_image_list(__parent_image_tag, __images_list) # capture images __parent_image_tag = p_xml_file.find('captureData') __images_list = p_project_dico['capture_images'] __parent_image_tag = project_controller.__make_tag_image_list(__parent_image_tag, __images_list) # chrono images __parent_image_tag = p_xml_file.find('chronoData') __images_list = p_project_dico['chrono_images'] __parent_image_tag = project_controller.__make_tag_image_list(__parent_image_tag, __images_list) # returm XML file with images return p_xml_file __create_xml_images_tag = staticmethod(__create_xml_images_tag) def __make_tag_image_list(p_tag , p_list) : """ create all the image tag elems and appen it to tag """ for image in p_list : # create image element elem = ET.Element('image') elem.text = image # then append it in parent p_tag.append(elem) return p_tag __make_tag_image_list = staticmethod(__make_tag_image_list) def __create_folders(p_project_dico) : """ create project dir and dirs hierarchy """ p_project_dico['export_dir'] = 'export' p_project_dico['rush_dir'] = 'rush' p_project_dico['tmp_dir'] = LCONST.TMP_DIR folder_to_create = [ p_project_dico['project_dir'], os.path.join( p_project_dico['project_dir'], p_project_dico['export_dir']), os.path.join( p_project_dico['project_dir'], p_project_dico['rush_dir']), os.path.join( p_project_dico['project_dir'],LCONST.TMP_DIR) ] try : for folder in folder_to_create : LT.mkdirs(folder) except LEXCEP.LucioException, err : lerr = "impossible to create %s : %s"%(folder,err) raise LEXCEP.LucioException, lerr else : return p_project_dico __create_folders = staticmethod(__create_folders) luciole_0.8.6/lucioLib/__init__.py0000644000175000017500000000156111437126703015567 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vi:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # from luciole_controller import * luciole_0.8.6/lucioLib/luciole_controller.py0000644000175000017500000007532111437126703017734 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vim:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009-2010 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # """ luciole_controller.py : Software controller manage interactions between elements """ import logging module_logger = logging.getLogger('luciole') import luciole_tools as LT import luciole_project as LP import luciole_image as LI import luciole_constants as LCONST import luciole_exceptions as L_EXCEP import luciole_conf as LCONF import luciole_manage_recent as LRECENT import controller.controller_import as LC_IMPORT import controller.controller_load_project as LC_LOAD import luciole_player as LPLAYER from lcl_gst import lcl_gst_play_sound as LSOUND import gui as LTK import time import threading import os.path from gettext import gettext as _ # project type status (NO_PROJECT,ON_CONFIGURATION,LOADED,MODIFIED) = range(4) class Luciole_controller(object) : __metaclass__ = LT.SingletonType def __init__(self) : """ controller init """ # init logger self.logger = logging.getLogger('luciole') self.lcl_program = {} self._set_program_path() # init Luciole conf obj self.conf_obj = LCONF.LucioleConf() # load theme self.conf_obj.load_theme() #init gui self.gui = LTK.Gui_controller(self) if self.conf_obj.conf_options['CaptureTrashDisplay'] == 'yes' : self.gui.show_capture_trash_button(True) # init project object self.project_ctrller = LP.project_controller() # get the recent project list self.recent_project_list = self.conf_obj.conf_options["LastProjects"] # init the recent project manager self.recent_project_obj = LRECENT.luciole_recent(self.recent_project_list, self.gui, self.open_project ,self.conf_obj) # get status bar self.status_bar = self.gui.status_progress_bar #init sound player self.sound_player = LSOUND.Lcl_gst_sound('./sounds/camera.ogg') self.acq_obj = None self.rush_obj = None self.project = None self.lucio_player = None self._imager_active = True self._player_active = False self._acquirer_active = False self._mixer_active = False self.time = 0.0 #################################################################################################### ##### PUBLIC METHODS #################################################################################################### def new_project (self) : """ action for create a new project """ # if project exist clos it if self.project != None : self.close() # launch project assistant self.gui.new_project_assistant(self.cb_new_project) def cb_new_project(self,project_data) : """ callback to indicate that project assistant is finsihed """ # 1. copy data in a project_dico object project_dico_data = LP.project_dico() for k,v in project_data.iteritems() : project_dico_data[k] = project_data[k] self.project = project_dico_data # 2. create project ( folder structure ,etc ...) self.project_ctrller.create(project_dico_data) # 3. load created project in application self.__load_project_in_app() def open_project(self,project_path = None) : """ open project if param projecet_path is None start a Gui dialog """ if project_path == None : # if no project_path as paramter open dialog to choose one project_path = self.gui.open_project() if self.project != None : # if a project is loaded close it self.logger.debug("Close a project Before loading a new one") self.close() # checj if a projetct path was entered if project_path != None: try : (is_valid,self.project) = self.project_ctrller.open(project_path) except L_EXCEP.LucioException,err : raise L_EXCEP.LucioException,err # webcam data are not valid if is_valid == False : msg = _(" Webcam data not valid in project. Please restart webcam detection") LTK.Dialog.ErrorMessage(self.gui.window, msg) #load project in application self.__load_project_in_app() def save_project(self): """ save the current project """ self.project_ctrller.save(self.project) self.project['is_modified'] = LCONST.PROJECT_NOT_MODIFIED self.gui.set_programbar(self.project['project_name'],False) # add project to recent list self.recent_project_obj.add_project(os.path.join( self.project['project_dir'], self.project['xml_filename'] )) msg = _('Project %s saved'%self.project['project_name']) self.status_bar.display_message(msg) def save_as_project(self): """ save into a new project""" if self.project != None : #launch dir chooser l_dir = self.gui.dir_chooser_dialog() if l_dir != None : # launch project save as self.project_ctrller.save_as(l_dir,self.project) self._set_acquirer(False) # stop acquirer self._set_imager(True) # allow imager self._set_player(False) # diasallow player self.project['is_modified'] = LCONST.PROJECT_NOT_MODIFIED # # Minimal actions to destroy a project before loading it # self.acq_obj = None self.rush_obj = None self.gui.clear_treeviews() self.__load_project_in_app() msg = _('Project saved as %s'%self.project['project_name']) self.status_bar.display_message(msg) def image_capture(self) : """ add an image from capture """ if self._acquirer_active == True and self.acq_obj.IsStreamingActive == True : # play sound self.sound_player.play() #inactive(sentitivity) snapshot button self.gui.is_button_snapshot_sensitive = False # streaming is active video capture can be made is active self.acq_obj.capture_image() def _cb_image_catpure_done(self): """ callback to indicate capture is done. Now image can be proccessed into poject""" try : # 1. copy it to rush dir and rename it l_rush_imagename = self.__move_capture_to_rush_folder() except L_EXCEP.LucioException,err : err_msg = " ERROR in image capture :", err raise L_EXCEP.LucioException,err_msg else : #2.append it to rush and capture obj self.__append_image_to_project(l_rush_imagename) #active(sentitivity) snapshot button self.gui.is_button_snapshot_sensitive = True def image_import(self) : """ import images from external source """ if self.project != None : # import imges ony if a project is loaded # open filename chooser dialog filenames = self.gui.import_dialog() if filenames != [] : # start import controller LC_IMPORT.Controller_import(filenames, self.project, self.gui, self.rush_obj , self) else : msg = _("No files or valid files choosen for image import.") LTK.Dialog.ErrorMessage(self.gui.window, msg) else : msg = _("Impossible to import images when no project are loaded.") LTK.Dialog.ErrorMessage(self.gui.window, msg) def image_preview(self,image_obj, tv_type = LCONST.CAPTURE) : """ image preview """ # image preview when image is not in correct foramt not allowed when player is active if type(image_obj) == LI.Image and self._player_active == False : if self._mixer_active == True and tv_type == LCONST.CAPTURE : # Mix image self.acq_obj.Image2Mix = image_obj.path else : # Display image # stop acquisition to display image if self._acquirer_active == True : self._set_acquirer(False) self.gui.pixbufToDisplay = image_obj.pixbuf_normal self._set_imager(True) # imager display def export(self) : """ manage exports """ if self.project != None : self.gui.export_dialog(self.project) else : msg = _("Nothing to export. No project loaded") LTK.Dialog.ErrorMessage(self.gui.window, msg) def export_tool(self) : """ Manage tool exports """ if self.project != None : self.gui.export_tool_dialog(self.project) else : msg = _("Nothing to export. No project loaded") LTK.Dialog.ErrorMessage(self.gui.window, msg) def play(self,index_chrono) : """ play video """ # Test if project exists if self.project != None : # test if images are availbale in chron widget zone if self.project['chrono_images'] != [] : try : # Initialize player player self.lucio_player = LPLAYER.luciole_player( self.gui.previsuDrawingArea, self.cb_player_eos, os.path.join(self.project['project_dir'], LCONST.TMP_DIR) ) except L_EXCEP.LucioException,err : # nbd@grape specify action to do err message or raise exception ? err_msg = "Imposible to initialize player.\n", err raise L_EXCEP.LucioException,err_msg else : # disable imager and acquirer self._set_imager(False) self._set_acquirer(False) # Init OK play can be started. player_data = {} # creation of image list In chrono_images the image names are listed, but the full path is need by export module # so each file is concated with abasolute pathname to rush_dir player_data['image_list'] = [ os.path.join( self.project['project_dir'], self.project['rush_dir'],image_name ) for image_name in self.project['chrono_images'] ] #Slice with index_monatge to remove all images before selection player_data['image_list'] = player_data['image_list'][index_chrono:] player_data['fpi'] = self.project['fpi'] self.lucio_player.start_play(player_data) self._set_player(True) # player is active else : # nbd@grape to transform as error message msg = _("Can not play animantion : No image on montage view ") LTK.Dialog.ErrorMessage(self.gui.window, msg) # set play button as deacivated self.gui.update_play_button(is_active = False) else : # nbd@grape to transform as error message masg = _("Can not play animantion : No project loaded ") LTK.Dialog.ErrorMessage(self.gui.window, msg) # set play button as deacivated self.gui.update_play_button(is_active = False) def cb_player_eos(self) : """ callback for end of stream signal from player """ # set play button as deacivated self.gui.update_play_button(is_active = False) # set player as inactive self._set_player(False) # allow imager activity self._set_imager(True) # destroy player object self.lucio_player = None def stop(self) : """ Stop video playing """ if self.lucio_player != None : self.lucio_player.stop_play() # set player as inactive self._set_player(False) # allow imager activity self._set_imager(True) def project_change(self,project_key,data) : """ function called to update a project. usualy called by gui to indicate change on capture or chrono list """ if self.project != None : if self.project.has_key(project_key) : self.project[project_key] = data self.project['is_modified'] = LCONST.PROJECT_MODIFIED self.gui.set_programbar(self.project['project_name'],True) else : #raise Error/Exception err = "key %s not in project "%project_key raise L_EXCEP.LucioException,err else : # raise Error/Exception err = " Project not loaded " raise L_EXCEP.LucioException,err def close(self) : """ Close current project """ if self.project != None : # project exist if self.project['is_modified'] == LCONST.PROJECT_MODIFIED : # nbd@grape : ask for save if save set status as loaded l_bRes = LTK.Dialog.QuestionMessage(self.gui.window, _('Save Project before closing')) if l_bRes == True : self.save_project() self._set_acquirer(False) # stop acquirer self._set_imager(True) # allow imager self._set_player(False) # diasallow player # 1. clear acq_obj self.acq_obj = None # 2. Preview widget deactivate self.gui.button_preview_deactivate() # 3. Clear widget treeviews self.gui.clear_treeviews() # 4. Clear rush list self.rush_obj = None # 5. Clear program name bar self.gui.set_programbar('',False) # 6. show open/new project widgets self.gui.project_open_widgets() msg = _('Project %s is closed'%self.project['project_name']) self.status_bar.display_message(msg) # 7.. Remove project obj self.project = None def start_acquisition(self) : """ start the acquisition """ if self.project != None : #a project is loaded # test if player is not active if self._player_active == False : if self.acq_obj != None : # acqusition is not active so it can be started if self._acquirer_active == False : self.acq_obj.start_acquisition() self.gui.acquisition_widget_show() # clear message status bar self.status_bar.display_message(_('Acquiring')) self._set_acquirer(True) # set acquirer as active self._set_imager(False) # set imager as inactive self._set_player(False) # set player as inactive else : #acquisition yet started self.logger.debug("acquisition Yet started : Not expected event ") # State not normal - stop acquirer self._set_acquirer(False) # stop acquirer self._set_imager(True) # allow imager self._set_player(False) # diasallow player else : # check if ack obj is None due to DIGICAM hardware if self.project['hardtype'] == LCONST.DIGICAM : self.gui.acquisition_widget_hide() self._set_acquirer(False) # stop acquirer msg = _("No acquisition available. Use 'import image' button to load images in project.") LTK.Dialog.ErrorMessage(self.gui.window, msg) else : # deactivate acqusition button acquisition not allowed when palyer is active self.gui.acquisition_widget_hide() self._set_acquirer(False) # stop acquirer else : # deactivate acqusitionn button self.gui.acquisition_widget_hide() msg = _(' Can not start acquisition when no project are loaded.') LTK.Dialog.ErrorMessage(self.gui.window, msg) #robustness self._set_acquirer(False) # stop acquirer self._set_imager(True) # allow imager self._set_player(False) # diasallow player def _cb_acq_error(self,message) : """ callback for detection of acquistion errors """ msg = _("Acquisition error. %s"%message) #LTK.Dialog.ErrorMessage(None, msg) self.status_bar.display_message(msg) self._set_acquirer(False) # stop acquirer self._set_imager(True) # allow imager self._set_player(False) # diasallow player robsutness def stop_acquisition(self) : """ stop the acquisition """ # acqusition active so it can be stoped # check also used to avoid loopback problem with the toggle button of acquisition if self._acquirer_active == True : self.status_bar.display_message(_('No Acquistion')) self._set_acquirer(False) # deactivate acquirer self._set_imager(True) # allow imager self._set_player(False) # Player not activated (robsutness) def move_to_chrono(self) : """ move selected images in capture view to Montage view """ # get images to move from capture widget images_name = self.gui._tv_capture.images_to_move() # append this images in montage widget images_obj = [ self.rush_obj.get_image(image) for image in images_name ] for image in images_obj : self.gui._tv_montage.append_image(image) def mixer_on(self) : """ Request for mixer activation """ # check some conidtions : # acq object is active # mixer is not yet active if ( (self._acquirer_active == True) and (self._mixer_active == False) and (self.acq_obj.IsStreamingActive == True) and (self.acq_obj.IsOnionSkinActive == False ) ) : # active mixer self.acq_obj.active_onion_skin() # show alpha bar self.gui.alpha_show() #indicate mixer active self._set_mixer(True) def mixer_off(self) : """ Request for mixer desactivation """ # check some conditions # acquisition acive and running ok if ( (self._acquirer_active == True) and (self._mixer_active == True) and (self.acq_obj.IsStreamingActive == True) and (self.acq_obj.IsOnionSkinActive == True ) ) : # desactive mixer self.acq_obj.deactive_onion_skin() # show alpha bar self.gui.alpha_hide() #indicate mixer active self._set_mixer(False) def mixer_alpha_changed(self,alpha) : """ update value of alpha """ # check some conditions # acquisition acive and running ok if ( (self._acquirer_active == True) and (self._mixer_active == True) and (self.acq_obj.IsStreamingActive == True) and (self.acq_obj.IsOnionSkinActive == True ) ) : # check alpha range if alpha < 0.0 : alpha = 0.0 if alpha > 1.0 : alpha = 1.0 # update alph on acquiistion object self.acq_obj.set_alpha_onion_skin(alpha) def update_fpi(self,fpi) : """ update frame per image (fpi) of projetct """ if self.project != None : # update fpi on projetct self.project_change('fpi',fpi) def quit(self) : """ quit application """ if self.project != None : # project exist if self.project['is_modified'] == LCONST.PROJECT_MODIFIED : # nbd@grape : ask for save if save set status as loaded l_bRes = LTK.Dialog.QuestionMessage(self.gui.window, _('Project modified. Save project before exit ?')) if l_bRes == True : self.save_project() self.gui.quit() elif l_bRes == False : self.gui.quit() else : self.gui.quit() else : self.gui.quit() def project_properties(self) : """ request Display of project properties """ if self.project != None : if self._acquirer_active == True : self.status_bar.display_message(_('No Acquistion')) self._set_acquirer(False) # deactivate acquirer self._set_imager(True) # allow imager self._set_player(False) # Player not activated (robsutness) self.gui.display_project_properties(self.project,self._cb_project_change) def _cb_project_change(self,key,key_webcam= None, data =None) : """ Project change callback """ # webcam_data field of project dictionaty is a dictionaty # Test if webcam data change key if key == 'webcam_data': # make a local copy of webcam_data webcam_dict = self.project['webcam_data'] #test if webcam dict key exists if webcam_dict.has_key(key_webcam) : # update webcal key and call project change webcam_dict[key_webcam] = data self.project_change('webcam_data',webcam_dict) # stop acquirer self._set_acquirer(False) # stop acquirer self._set_imager(True) # allow imager self._set_player(False) # diasallow player robsutness def luciole_preferences(self) : """ Display Luciole prefrences """ self.gui.display_preferences_dialog(self.conf_obj.conf_options,self._cb_preferences_change) def _cb_preferences_change(self,modif_options): """ Called after preference change """ # get the intersecttion of modified dict with conf dict to get the differences intersect = [] for item in self.conf_obj.conf_options.keys(): #check key if modif_options.has_key(item): # check if value different if self.conf_obj.conf_options[item] != modif_options[item] : intersect.append(item) for item in intersect : if item == 'Theme' : self.conf_obj.conf_options[item] = modif_options[item] msg = _('Please restart Luciole to take into account the new theme ') self.status_bar.display_message(msg) if item == 'CaptureTrashDisplay' : if modif_options[item] == 'yes' : # show the trash on capture view self.gui.show_capture_trash_button(True) self.conf_obj.conf_options[item] = modif_options[item] else : # hide the trash on capture view self.gui.show_capture_trash_button(False) self.conf_obj.conf_options[item] = 'no' # save modofied options to file self.conf_obj.save_options() #################################################################################################### ##### PRIVATE METHODS #################################################################################################### def __load_project_in_app(self) : """ load treview, pepare acquiistion rush list , etc ..""" self.time = time.time() if self.project != None : self.logger.debug("---------------------------------------------------------------------") self.logger.debug("Luciole_controller project info: ") self.logger.debug("---------------------------------------------------------------------") for k,v in self.project.iteritems() : self.logger.debug("**%s** : %s "%(k,v)) self.logger.debug( "---------------------------------------------------------------------") # Initilaisation of rush ogbj is threaded because its take a while (generation of images pixbufs) # When rush load is finish : __on_rush_finish is called LC_LOAD.Controller_load_project(self.project, self.gui, self.__cb_project_load_finsih, self._cb_acq_error, self._cb_image_catpure_done) def __cb_project_load_finsih(self,rush_obj,acq_obj) : if (rush_obj != None) : self.rush_obj = rush_obj self.acq_obj = acq_obj # add project to recent list self.recent_project_obj.add_project(os.path.join( self.project['project_dir'], self.project['xml_filename'] )) # set project as not modified self.project['is_modified'] = LCONST.PROJECT_NOT_MODIFIED self.logger.debug('load time = %s'%( time.time() - self.time )) else : msg = _("Failed to load project ") LTK.Dialog.ErrorMessage(self.gui.window, msg) def __move_capture_to_rush_folder(self): """ move acquired image to rush dir : 1. move image to tmp dir. 2. resize it. 3. move it to rush image dir """ # get acquired image name l_acq_image = self.acq_obj.Image2save # build temp impage path l_temp_dir = os.path.join(self.project['project_dir'], 'tmp') # copy name l_ac_image_temp = os.path.join(l_temp_dir,LCONST.ACQUIRED_IMAGE_NAME) # resized copy name l_ac_image_temp_rz = os.path.join(l_temp_dir,LCONST.ACQUIRED_IMAGE_NAME_RZ) # build rush image name l_basename = LCONST.RUSH_FILENAME_TPL%self.rush_obj.rush_index l_rush_image = os.path.join(self.project['project_dir'], self.project['rush_dir']) l_rush_image = os.path.join(l_rush_image, l_basename) try : # 1. move image acquired image to tmp dir LT.movef(l_acq_image,l_ac_image_temp) # 2. resize image result is in l_ac_image_temp_rz l_rz_obj = LI.Image_resize(l_ac_image_temp,l_ac_image_temp_rz ) l_rz_obj.convert() # 3. move resized image to rush dire LT.movef(l_ac_image_temp_rz,l_rush_image) except L_EXCEP.LucioException,err : raise L_EXCEP.LucioException,err l_basename = None return l_basename def __append_image_to_project(self, p_image_name): """ append an imge to the project. the parameter p_image_name is the image name . Image is supposed to be in rush dir""" # 1. append image to rush list self.rush_obj.append(p_image_name) # indicate project change (rush list) self.project_change('rush_images',self.rush_obj.dump_image_name()) # 2. append image object to capture list l_rush_image = self.rush_obj.get_image(p_image_name) self.gui.append_capture(l_rush_image) # always update the image 2 mix, even if mixer is not active # used to memorize the last capture self.acq_obj.Image2Mix = l_rush_image.path def _stop_acquisition(self): """ private stop acquisition method """ if self.acq_obj != None : # stop gstreamer acquisition self.acq_obj.stop_acquisition() # infor gui to close/hide the acqsuisition widgets self.gui.acquisition_widget_hide() def _set_imager(self,is_active = False): """ """ # test type and change only on transition if (type(is_active) == bool) and (self._imager_active != is_active) : self._imager_active = is_active self.gui.view_image = self._imager_active if is_active == False : # clear the displayed buffer . self.gui.pixbufToDisplay = None def _set_player(self,is_active = False): """ """ # test type and change only on transition if (type(is_active) == bool) and (self._player_active != is_active) : self._player_active = is_active def _set_acquirer(self,is_active = False): """ """ # test type and change only on transition if (type(is_active) == bool) and (self._acquirer_active != is_active) : self._acquirer_active = is_active if self._acquirer_active == False : # stop acquisition self._stop_acquisition() def _set_mixer(self,is_active = False): """ """ # test type and change only on transition if (type(is_active) == bool) and (self._mixer_active != is_active) : self._mixer_active = is_active def _set_program_path(self) : """ set some program path usefull for other luciole objects """ # get execution path BASE_DIR = os.path.realpath('.') self.lcl_program['BASE_DIR'] = BASE_DIR self.lcl_program['THEMES_DIR'] = os.path.join(BASE_DIR,'themes') self.lcl_program['UI_DIR'] = os.path.join(BASE_DIR,'ui') self.lcl_program['PO_DIR'] = os.path.join(BASE_DIR,'po') luciole_0.8.6/lucioLib/luciole_constants.py0000644000175000017500000000546511437126703017567 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vim:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009-2010 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # # Luciole constants file from gettext import gettext as _ ######################################## # Hardware constants ######################################## FAKE = 0 DVCAM = 1 WEBCAM = 2 DIGICAM= 3 HardType=(FAKE,DVCAM,WEBCAM,DIGICAM) HardTypeName=( "FAKE", "DVCAM", "WEBCAM", _("OTHER DEVICE"), ) ######################################## # Image screen display constants ######################################## SCREEN_BOTH = 0 # when action on both screen is required SCREEN_CAMERA = 1 # input stream display SCREEN_PREVIEW = 2 # preview screen ######################################## # LUCIOLE PROJECT CONSTANTS ######################################## PROJECT_NOT_MODIFIED = 0 PROJECT_MODIFIED = 1 ACQUIRED_IMAGE_NAME = 'capture.jpeg' # name for resized capture ACQUIRED_IMAGE_NAME_RZ = 'capture_rz.jpeg' RUSH_FILENAME_TPL = "rush_%05d.jpeg" TMP_DIR = 'tmp' (CAPTURE,MONTAGE) = range(2) ######################################## # VIDEO FORMATS ######################################## VIDEO_PAL_RES = (720,576) VIDEO_PAL_FPS = 25 VIDEO_FPS_TABLE = { 0 : ("0",0), 1 : ("1",25), 2 : ("2.5",10), 3 : ("5",5), 4 : ("12.5",2), 5 : ("25",1) } ######################################## # IMAGE FORMATS ######################################## THUMB_RATIO = 4 # ration normal/thumbnail. To set size ot thumbnail images in treeview. # clor in rgb format muliply by 255 each level to go in gtk.gdk.Color format THUMB_COLOR_RATIO = 256 THUMB_TEXT_COLOR = ( 191 * THUMB_COLOR_RATIO, 244 * THUMB_COLOR_RATIO, 75 * THUMB_COLOR_RATIO ) THUMB_TEXT_SIZE = 8200 # text size THUMB_TEXT_FAMILY = 'sans' # font family ALPHA_DEFAULT = 0.4 # default alpha value used for mixer luciole_0.8.6/lucioLib/luciole_tools.py0000644000175000017500000000560411437126703016706 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vi:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # import dircache import fnmatch import os.path import os import luciole_exceptions as M_EXCEP import shutil def filesInDir (path, pattern='*') : """ Return the list of file in a dir according pattern""" fl = dircache.listdir(path) #split to have only the file path ofile=fnmatch.filter(fl,pattern) return ofile def mkdirs(path) : """ Make directory. Raise Exception if not possible """ status = 1 if not os.path.exists(path): try : os.makedirs(path) except OSError,err : raise M_EXCEP.LucioException, "Impossible de creer :" + path +"\n"+err.strerror + " on : "+err.filename status = 0 return status def movef(src,dest) : """ Move file , Raise exception in case of failure""" status = None try : status = shutil.move(src,dest) except IOError,err: raise M_EXCEP.LucioException, "Impossible de deplacer :" + src +"\n"+err.strerror + " on : "+err.filename return status def copyf(src,dest) : """ Move file , Raise exception in case of failure""" status = None try : status = shutil.copy(src,dest) except IOError,err: raise M_EXCEP.LucioException, "Impossible de copier :" + src +"\n"+err.strerror + " on : "+err.filename return status def delf(file) : """ delete file , Raise exception in case of failure""" status = None try : status = os.remove(file) except OSError,err: raise M_EXCEP.LucioException, "Impossible de copier :" + src +"\n"+err.strerror + " on : "+err.filename return status class Singleton(object): """ A Pythonic Singleton """ _singletons={} def __new__(cls, *args, **kwargs): if cls not in cls._singletons : cls._singletons[cls] = super(Singleton,cls).__new__(cls) return cls._singletons[cls] class SingletonType(type): def __call__(cls): if getattr(cls, '__instance__', None) is None: instance = cls.__new__(cls) instance.__init__() cls.__instance__ = instance return cls.__instance__ luciole_0.8.6/lucioLib/luciole_image.py0000644000175000017500000003025711437126703016632 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vim:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009-2010 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # """ luciole_image.py : Handle imges in luciole application. - Manage image type and rush - Resize image """ import Image as PIL import os.path import gtk import pango import subprocess as SP import threading import gobject import time import Queue import re import luciole_tools as LT import luciole_constants as LCONST import logging module_logger = logging.getLogger('luciole') #i18n support import gettext _ = gettext.gettext class Image(object): # class attributes : # image_path def __get_path(self): return self._image_path path = property(__get_path, None, None, "Image's path ") # image_name def __get_name(self): return self._name name = property(__get_name, None, None, "Image's name. ") # pixbuf_normal def __get_pixbuf_normal(self): return self._pixbuf_normal pixbuf_normal = property(__get_pixbuf_normal, None, None, "Normal size pixbuf ") # pixbuf_thumb def __get_pixbuf_thumb(self): return self._pixbuf_thumb pixbuf_thumb = property(__get_pixbuf_thumb, None, None, "Thumbnail pixbuf ") # thumb_ratio def __init__(self, image_path = None, generate_pixbuf = False, thumb_ratio = LCONST.THUMB_RATIO, generate_text = True ): """ init Image object image_path : absolute imapge path generate_pixbuf : set to True to generate pixbuf during init thumb_ratio : A thumb ratio from Normal size. Should be an integer value """ self.logger = logging.getLogger('luciole') self._load_from_file(image_path) self._pixbuf_normal = None self._pixbuf_thumb = None self._thumb_ratio = thumb_ratio self._generate_text = generate_text self.generated = False if generate_pixbuf == True : # launch generation of poixbuf at init. Not threaded self._generare_pixbuf() def generate_pixbuf_in_gui_thread(self) : """ generate pixbuf in gui thread : usage of idle_add""" gobject.idle_add(self._generare_pixbuf) def _generare_pixbuf(self) : """ Generation of normal and thumbnail pixbuf """ self.generated = False self._pixbuf_normal = gtk.gdk.pixbuf_new_from_file(self._image_path) # generate normal and thumb pixbuf if requested # generate thumbnail according the given ratio and image size width = self._pixbuf_normal.get_width() / self._thumb_ratio height = self._pixbuf_normal.get_height() / self._thumb_ratio self._pixbuf_thumb = self._pixbuf_normal.scale_simple( width , height , gtk.gdk.INTERP_BILINEAR) if self._generate_text == True : self._generate_thumb_with_text() self.generated =True return False def _generate_thumb_with_text(self) : """ Generate the text on the pixbuf """ # This technique is used to compose image with text # create a pixmap with the data of the pixbuf then insert text # cf. pygtk FAQ How do I draw a text [or something else] on a gtk.gdk.pixbuf? for mor explication # (http://faq.pygtk.org/index.py?req=show&file=faq08.020.htp ) pixmap,mask = self._pixbuf_thumb.render_pixmap_and_mask() # graphic context and Drawarea any created to allow generation of pixbuf composition gc = pixmap.new_gc() area = gtk.DrawingArea() # create pango layout self.pangolayout = area.create_pango_layout("") # extract only the image name without extenstion text_buffer, ext = os.path.splitext(self._name) text_buffer =" "+text_buffer+" " self.pangolayout.set_text(text_buffer) # set text attributes attrs = pango.AttrList() attrs.insert(pango.AttrFamily(LCONST.THUMB_TEXT_FAMILY,0,-1)) attrs.insert(pango.AttrStyle(pango.STYLE_ITALIC,0, -1)) attrs.insert(pango.AttrForeground(LCONST.THUMB_TEXT_COLOR[0],LCONST.THUMB_TEXT_COLOR[1],LCONST.THUMB_TEXT_COLOR[2],0,-1)) attrs.insert(pango.AttrBackground(0,0,0,0,-1)) attrs.insert(pango.AttrSize(LCONST.THUMB_TEXT_SIZE,0,-1)) self.pangolayout.set_attributes(attrs) # compute text layout position and set it on pixmap (w,h) = (self._pixbuf_thumb.get_width(),self._pixbuf_thumb.get_height()) (lw,lh) = self.pangolayout.get_pixel_size() pixmap.draw_layout(gc, (w-lw)//2, (h -lh -2), self.pangolayout) # function get_from_drawable gets the the pixbuf from the pixmap # no need to affect resuly to a new pisbuf: self._pixbuf_thumb is changed whe get_from_drawable is used self._pixbuf_thumb.get_from_drawable(pixmap, pixmap.get_colormap(), 0, 0, 0, 0, -1, -1) def _load_from_file(self, image_path) : """ Private function for loading images""" if os.path.isfile(image_path) : self._image_path=image_path self._name=os.path.split(image_path)[1] else : self.logger.info( "Not a file : %s"%image_path) class Rush_images(list): """ list of images sources """ # class attributes : # rush_index def __get_rush_index(self): return self._rush_index rush_index = property(__get_rush_index, None, None, " Rush image index ") def __init__(self,rush_folder,images_list=None,cb_progress = None) : """ Warning : the init of Rush_images shall be done inside a thread or thread not in gui thead rush_folder : folder whe re the images are : images_list : list of image to generate cb_progress : used to indicate rush_obj progress creation : (ie number of image object generated """ self.logger = logging.getLogger('luciole') if (os.path.exists(rush_folder)) : self._rush_folder = rush_folder self._rush_index = 0 # if image list not empty generate images if images_list != [] : self._progression = 1 self._progression_ratio = 0.0 self._cb_progress = cb_progress # the execution of pixbuf are threaded # 1. create the image list for index,image in enumerate(images_list) : # craate image onject image_obj = Image(os.path.join(self._rush_folder,image), False) # append it to list super(Rush_images,self).append(image_obj ) # genratat pixbug i threaded way (idle_add) image_obj.generate_pixbuf_in_gui_thread() # wait for pixbuf generation while image_obj.generated == False : time.sleep(0.005) #inidcate ptogression self._progression_ratio = (index +1.0)/len(images_list) if self._cb_progress != None : self._cb_progress(self._progression_ratio) self._rush_index = self.__get_rush_number_index() else : self.logger.info('Rush folder not valid') def __get_rush_number_index(self) : """ this functions extract the rush number according last file name. rush list is sorted before. """ if self != [] : images_name = [ obj.name for obj in self] # sort rush list images_name.sort() # get last element l_last = images_name[-1] # on this rush name extract th number l_pattern = re.compile(r'\d+') # we have just one match we take the first element. l_index = int (l_pattern.findall(l_last)[0]) # now increment index l_index = l_index + 1 else : # rush image is emty so inex is 0 l_index = 0 return l_index def get_image(self,image_name): """ return image object according image_name """ for image in self : if image.name == image_name : return image # if this return is reached no image was found return None def append(self,image_name) : """ append an image name : generater pixbuf """ image_path = os.path.join(self._rush_folder,image_name) # the generation of pixbuf in not threaded and made imedialtely super(Rush_images,self).append(Image(image_path,True)) self._rush_index += 1 def append_threaded(self,image_name) : """ append an image name : generater pixbuf for threaded calls Manage the iddle_add stuff for pixbuf generation """ image_path = os.path.join(self._rush_folder,image_name) # the generation of pixbuf in not threaded and made imedialtely image = Image(image_path,False) super(Rush_images,self).append(image ) image.generate_pixbuf_in_gui_thread() self._rush_index += 1 while image.generated == False : time.sleep(0.05) return image def dump_image_name(self) : """ test function display rush image """ l_list =[] for l_i in self : l_list.append(l_i.name) return l_list class Image_resize(object) : """ resize an image. If image is lower then specifoed format , black bands are dawn if image is lower image resized ratio is repected, black bands are generated to repect final video format The convert tool from image magic used. """ convert_cmd_tpl ="convert %s -resize %s\> -size %s xc:black +swap -gravity center -composite %s" def __init__(self, source, dest, format=LCONST.VIDEO_PAL_RES) : """ init object : """ if os.path.isfile(source) : self._source = source self._dest = dest self._format="%sx%s"%format # check source size self._im_format = "" try : im = PIL.open(self._source) self._im_format="%sx%s"%im.size except : err = 'problem with pil' raise L_EXCEP.LucioException,err else : self._convert_cmd = self.convert_cmd_tpl %(self._source,self._format,self._format,self._dest) else : #error to raise lerr = "Error, path does not exist : %s"%source raise L_EXCEP.LucioException,lerr def convert(self) : """ scale an image if needed """ if self._convert_cmd != None : if self._format != self._im_format : # image is not at correct size Image need to be scalled pCmd =SP.call(self._convert_cmd,shell=True) else : # format is identical just rename file try : LT.movef(self._source,self._dest) except L_EXCEP.LucioException,err : raise L_EXCEP.LucioException,err # test if __name__ == '__main__' : X = Image_resize ('/home/nico/temp/testLuciole/Lefilm/capture.jpeg', '/home/nico/temp/testLuciole/Lefilm/tmp/capture.jpeg') X.convert() luciole_0.8.6/lucioLib/lucioWebCamDetect/0000755000175000017500000000000011437126703016776 5ustar niconicoluciole_0.8.6/lucioLib/lucioWebCamDetect/luciole_webcam_detection.py0000644000175000017500000004117711437126703024372 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vim:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009-2010 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # import dbus import dbus.glib import sys import os import fcntl import gst import time import gobject import logging module_logger = logging.getLogger('luciole') from .. import luciole_exceptions as LEXCEP # Availables video sources for gstreamer GSTREAMER_VIDEO_SOURCES = [ "v4l2src", "v4lsrc" ] class luciole_webcam_detection(object) : """ class in charge of detection of available webcams """ def __get_webcam_devices(self) : return self._webcam_devices webcam_devices = property(__get_webcam_devices, None, None, "webcam devices description") def __init__(self) : """ class init""" # init logger self.logger = logging.getLogger('luciole') self._webcam_devices = list() ############################################################ ### PUBLIC METHODS ############################################################ def detect_webcam(self) : """ performs webcam detection . returns number of webcam detected """ status = self._hal_detection() if status != 0 : # at least webcam was found , perform gstremer detection status = self._gst_detection() return status def get_gst_best_input(self, webcam_device_index=0) : """ for selected webcam device returns the gst.Bin with the best video quality . Criteria are : 1) first select mimetype in the following order : 1) video/x-raw-yuv 2) video/x-raw-rgb 3) image/jpeg 2) get the greatest resolution according video mimetype 'width' 'height' 'source_input' -> v4lsrc or v4l2src 'device ' -> device path ex. : /dev/video0 The method returns a dict with the following keys : """ video_formats = self._webcam_devices[webcam_device_index]['webcam_data']['video_formats'] mimetypes = ('video/x-raw-yuv','video/x-raw-rgb','image/jpeg') (width,height)=(None,None) for mimetype in mimetypes : if video_formats.has_key(mimetype) : # the resolution format are sorted by resolution # the higher resolution is first in list width = video_formats[mimetype][0]['width'] height = video_formats[mimetype][0]['height'] framerate = video_formats[mimetype][0]['framerate'] # leave loop when mimetype is found break webcam_bin_data = dict() if width != None : # a format was detected : prepare pipeline info webcam_bin_data['width'] = width webcam_bin_data['height'] = height webcam_bin_data['framerate_list'] = framerate webcam_bin_data['framerate_selected'] = framerate[len(framerate)/2] webcam_bin_data['source_input'] = self._webcam_devices[webcam_device_index]['v4l_driver'] webcam_bin_data['device'] = self._webcam_devices[webcam_device_index]['device'] webcam_bin_data['name'] = self._webcam_devices[webcam_device_index]['name'] return webcam_bin_data ############################################################ ### PRIVATE METHODS ############################################################ def _hal_detection(self) : """ performs hal detection """ # get a connection to the system bus bus = dbus.SystemBus () # get a HAL object and an interface to HAL to make function calls hal_obj = bus.get_object ('org.freedesktop.Hal', '/org/freedesktop/Hal/Manager') hal = dbus.Interface (hal_obj, 'org.freedesktop.Hal.Manager') # find all devices that have the capability 'video4linux' udis = hal.FindDeviceByCapability ('video4linux') # loop on found device for udi in udis : webcam_device = dict() # get a device object dev_obj = bus.get_object ('org.freedesktop.Hal', udi) # get an interface to the device dev = dbus.Interface (dev_obj, 'org.freedesktop.Hal.Device') webcam_device["name"] = dev.GetProperty ('info.product') if webcam_device["name"] == None : webcam_device["name"] = "Unknown" webcam_device["device"] = dev.GetProperty ('video4linux.device') # detect if need to use v4lsrc or v4l2sec ; property :video4linux.version # for robustness if version = 1 , than use v4lsrc else use v4l2src version = dev.GetProperty ('video4linux.version') # default is v4l2src webcam_device['v4l_driver'] = 'v4l2src' if version != None and int(version) == 1 : webcam_device['v4l_driver'] = 'v4lsrc' if (not webcam_device["device"] == None) and ( self.__is_device_readable(webcam_device["device"]) ) : self._webcam_devices.append(webcam_device) # the function returns the number of device found. nb_device_found = 0 if not self._webcam_devices == None : nb_device_found = len(self._webcam_devices) return nb_device_found def _gst_detection(self) : """ performs webcam type detection with gstreamer : _ detects what source yo use ( v4lsrc or v4l2src) _ resolution _ video mime types """ nb_device_detected = 0 for webcam_device in self._webcam_devices : # for each detected device get the data (source type, mimetype, resolution) (status, webcam_device_data) = self.__get_gst_webcam_data(webcam_device["device"], webcam_device["v4l_driver"]) if status[0] == gst.STATE_CHANGE_SUCCESS and webcam_device_data != None : # detection is success webcam_device["webcam_data"] = webcam_device_data nb_device_detected = nb_device_detected +1 else : # gstreamer test unsuccesfull : test with other driver if webcam_device["v4l_driver"] == 'v4lsrc' : webcam_device["v4l_driver"] = 'v4l2src' else : webcam_device["v4l_driver"] ='v4lsrc' (status, webcam_device_data) = self.__get_gst_webcam_data(webcam_device["device"], webcam_device["v4l_driver"]) if status[0] == gst.STATE_CHANGE_SUCCESS and webcam_device_data != None : # detection is success webcam_device["webcam_data"] = webcam_device_data nb_device_detected = nb_device_detected +1 else : #Nothing detected . Reset webcam device webcam_device=dict() return nb_device_detected ############################################################ ### PRIVATE STATIC METHODS ############################################################ def __is_device_readable(device) : """ check if device is readable """ is_readable = False try : fd = open(device,'r') except IOError,err: is_readable = False else : is_readable = True fd.close() return is_readable __is_device_readable = staticmethod(__is_device_readable) def __get_gst_webcam_data(device_name,driver) : """ get data from the webcam test compatible sources input device_name is the file path ( ex. /dev/video0) """ # creation of a fake gstreamer to test webcam with v4lsrc ot v4l2src webcam_device=dict() pipeline_desc = "%s name=source device =%s ! fakesink" %(driver, device_name) pipeline = gst.parse_launch(pipeline_desc) #Start pipeline and check for state pipeline.set_state(gst.STATE_PLAYING) ret = pipeline.get_state(timeout=10000*gst.MSECOND) if ret[0] == gst.STATE_CHANGE_SUCCESS : # webcam is detected succefully pipeline.set_state(gst.STATE_PAUSED) # get source element name and webcam name src = pipeline.get_by_name('source') name = src.get_property('device-name') # start detection of source video formats # video formats are accesible in the capabilities # of the source "src" pad pad = src.get_pad("src") caps = pad.get_caps() luciole_webcam_detection.gst_get_supported_video_formats(webcam_device,caps) # stop playing with webcam pipeline.set_state(gst.STATE_NULL) return (ret,webcam_device) __get_gst_webcam_data = staticmethod(__get_gst_webcam_data) def __gst_get_supported_video_formats(webcam_device, caps) : """ get video mimetypes and resolution Format example webcam_device ["mimetypes"] ==> ["video/x-raw-yuv"] ==> ( (["width"] = 320 , ["height"] = 240) (["width"] = 640 , ["height"] = 480) ) ==> ["video/x-raw-rgb"] ==> ( (["width"] = 640 , ["height"] = 480) ) The input structures are identified by the mime type and have the width and height as field some other fields as bpp , depth or framerate are also available but not used here. """ num_structures = caps.get_size() webcam_device["video_formats"] = dict() for i in range(num_structures) : # loop on each strutcures structure = caps[i] if ( structure.has_name("video/x-raw-yuv") or structure.has_name("video/x-raw-rgb") or structure.has_name("image/jpeg") ) : # get resolution list or create it if not webcam_device["video_formats"].has_key(structure.get_name()): webcam_device["video_formats"][structure.get_name()] = list() resolution_list = webcam_device["video_formats"][structure.get_name()] #print " resolution_list at the begin : \n %s"%webcam_device["video_formats"] # take in acount only structure wih fields width and height if (structure.has_field("width") and structure.has_field("height")) : #print " %s : %s x %s"%(structure.get_name(),structure["width"],structure["height"] ) resolution=dict() # check if result is in GST_TYPE_INT_RANGE format if (isinstance(structure["width"], gst.IntRange)): # when type is range --> some resolution points are created in the range # value are *2 from min to max width_cur = structure["width"].low height_cur = structure["height"].low while ( ( width_cur <= structure["width"].high ) and ( height_cur <= structure["height"].high ) ): ( resolution["width"] , resolution["height"] ) = (width_cur,height_cur) #store framerate resolution["framerate"] = None if structure.has_field("framerate") : resolution["framerate"] = structure["framerate"] # Append resolution dict to list if not resolution in resolution_list : resolution_list.append(resolution) (width_cur,height_cur) = (width_cur*2,height_cur*2) # check if result is in G_TYPE_INT format elif structure.has_field_typed("width",gobject.TYPE_INT) : (resolution["width"] , resolution["height"] ) = (structure["width"],structure["height"]) resolution["framerate"] = None if structure.has_field("framerate") : resolution["framerate"] = luciole_webcam_detection.gst_get_framerate(structure["framerate"]) if not resolution in resolution_list : resolution_list.append(resolution) else : # raise error excep_message = "unkown video type %s"% structure.get_field_type("width") raise LEXCEP.LucioException,excep_message for mimetype,res_list in webcam_device["video_formats"].iteritems(): # loop on video on formats to stort it # data are sorted by width , in reverse order; i.e max res is the first in the list # for sorting see howto sort : http://wiki.python.org/moin/SortingListsOfDictionaries from operator import itemgetter result = sorted(res_list, key=itemgetter('width')) result.reverse() webcam_device["video_formats"][mimetype] = result # debug purpose #for mimetype,res_list in webcam_device["video_formats"].iteritems(): # print "----- %s : %s"%(mimetype,res_list) gst_get_supported_video_formats = staticmethod(__gst_get_supported_video_formats) def __gst_get_framerate(framerate_obj): """ create a list of gst.Fraction framerates """ framerate = list() if type(framerate_obj) == list : framerate = framerate_obj elif isinstance(framerate_obj, gst.FractionRange) : # convert also to list of framerate NB_FRAMERATE = 4 MAX_FRAMERATE = gst.Fraction(25,1) # limit max framerate if framerate_obj.high < MAX_FRAMERATE : framerate_obj.high = MAX_FRAMERATE new_framerate = framerate_obj.high for i in range(NB_FRAMERATE) : framerate.append(new_framerate) new_framerate = new_framerate/2 # at end of loop append the lowest framerate if not 0 if framerate_obj.low != gst.Fraction(0,1) : framerate.append(framerate_obj.low) else : # raise error excep_message = " unable to detect framerate : unknown type : %s for "%(type(framerate_obj),framerate_obj) raise LEXCEP.LucioException,excep_message # transform framerate in not gst format if framerate != None : framerate_trans = [ (fraction.num,fraction.denom) for fraction in framerate] return framerate_trans gst_get_framerate = staticmethod(__gst_get_framerate) if __name__ == '__main__' : # TEST PURPOSE : for webcam detection CamObj = luciole_webcam_detection() val = CamObj.detect_webcam() print " found %s webCam device "%val #if val >0 : # for device in CamObj.webcam_devices : # for k,j in device.iteritems() : print "%s : %s"%(k,j) # print "----------------------------------------------------------------" for i in range(val) : #for enumerate(index,device) in CamObj.webcam_devices : best = CamObj.get_gst_best_input(i) print "Best webcam resolution found " print best print "\n \n" luciole_0.8.6/lucioLib/lucioWebCamDetect/__init__.py0000644000175000017500000000156711437126703021120 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vi:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # from luciole_webcam_detection import * luciole_0.8.6/lucioLib/lcl_gst/0000755000175000017500000000000011437126703015102 5ustar niconicoluciole_0.8.6/lucioLib/lcl_gst/lcl_gst_play.py0000644000175000017500000001220311437126703020126 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vim:si:ai:et:sw=4:sts=4:ts=4 # # Copyright Nicolas Bertrand (nico@inattendu.org), 2010 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # import lcl_gst_base as LG class lcl_gst_play(LG.lcl_gstreamer) : """ implementation of image per image video playing with gstreamer . Description of pipeline : _______________________________________________________________________________________________________ | | -->-- | multifilesrc --> capsfilter(framerate, image ratio) --> decodebin --> ffmpegcolorspace -->xvimagesink | |_______________________________________________________________________________________________________| """ _filter_caps_string = "image/jpeg, framerate=(fraction)%s/1 ,width=360,height=288 " def _get_nbImages(self): return self._nbImages def _set_nbImages(self, value): if isinstance(value, int) and self.MyImageSrc : self._nbImages = value self.MyImageSrc.set_property('num-buffers', self._nbImages) nbImages = property(_get_nbImages, _set_nbImages, "Number of image to play") def _get_framerate(self): return self._framerate def _set_framerate(self, value): if isinstance(value, str) and self.ImageFilter : caps_string = self._filter_caps_string % value caps = LG.Caps(caps_string) self.ImageFilter.set_property("caps", caps) self._framerate = value framerate = property(_get_framerate, _set_framerate, "Framerate for displaying image ") def __init__(self, videowidget, location, framerate="5", nbImages= -1, start_buf=0, on_eos_cb=None) : """ init of gstreamer player inputs : - videowidget : Drawing area widgert, in gstreamer style for playing video - location : where the image are stored - framerate : the video framerate - nbImages : Number of images to play - start_buf : index of the first image to play - on_eos_cb : callback for EOS signal """ LG.lcl_gstreamer.__init__(self,video_widget =videowidget, pipe_name = 'Play pipe', cb_on_eos = on_eos_cb ) ElementList = [] self._location = location self._nbImages = nbImages self._framerate = framerate self._start_buf = start_buf # image load self.MyImageSrc = LG.element_factory_make('multifilesrc') self.MyImageSrc.set_property('location', self._location) self.MyImageSrc.set_property('num-buffers', self._nbImages) self.MyImageSrc.set_property('index', self._start_buf) ElementList.append(self.MyImageSrc) # filter self.ImageFilter = LG.element_factory_make("capsfilter") caps_string = self._filter_caps_string % self._framerate caps = LG.gst.Caps(caps_string) self.ImageFilter.set_property("caps", caps) ElementList.append(self.ImageFilter) # decodebin self.dec = LG.element_factory_make('decodebin') # Connect handler for 'new-decoded-pad' signal self.dec.connect('new-decoded-pad', self.on_new_decoded_pad) ElementList.append(self.dec) # ffmpegclorspace self.Myffmpeg = LG.element_factory_make('ffmpegcolorspace') # Reference used in self.on_new_decoded_pad() self.vpad = self.Myffmpeg.get_pad('sink') ElementList.append(self.Myffmpeg) # Image sink MyImageSink = LG.element_factory_make('xvimagesink') ElementList.append(MyImageSink) # # Add elements to pipeline # for elem in ElementList : self.pipe.add(elem) # link all elements LG.element_link_many(self.MyImageSrc, self.ImageFilter) self.ImageFilter.link(self.dec) LG.element_link_many(self.Myffmpeg, MyImageSink) LG.lcl_gstreamer.connect_bus(self) def on_new_decoded_pad(self, element, pad, last): """ call back to connect decodebin to videopad """ caps = pad.get_caps() name = caps[0].get_name() if name == 'video/x-raw-yuv': if not self.vpad.is_linked(): # Only link once pad.link(self.vpad) def stop(self): """ Stop the video """ # call upper class stop LG.lcl_gstreamer.stop(self) self.MyImageSrc.set_property('index', 0) luciole_0.8.6/lucioLib/lcl_gst/lcl_gst_base.py0000644000175000017500000001245511437126703020104 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vim:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2010 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # import logging module_logger = logging.getLogger('luciole') import sys # # gst import # import pygst pygst.require('0.10') from gst import * import gst.interfaces import gobject import pygtk pygtk.require('2.0') import gtk # # constants # # # FUNCTIONS # # # CLASSES # class Pipeline(gst.Pipeline) : """ Interface class for gst pipeline """ def __init__(self, *args,**kwargs) : super(Pipeline, self).__init__(*args,**kwargs) class Bin(gst.Bin) : """ Interface class for gst Bin """ def __init__(self, *args,**kwargs) : super(Bin, self).__init__(*args,**kwargs) self.__gobject_init__() self.logger = logging.getLogger('luciole') class VideoWidget(object): """ class usage to be understood """ def __init__(self,DrawingArea): """ init videwWidget : update Drawingarea widget with gstreamer propoerties """ self.VideoArea = DrawingArea self.VideoArea.imagesink = None self.VideoArea.unset_flags(gtk.DOUBLE_BUFFERED) def do_expose_event(self, event): """ nbd@grape : with gstreamer is this function useful . Get from player.py example in pygst """ if self.VideoArea.imagesink: self.VideoArea.imagesink.expose() return False else: return True def set_sink(self, sink): assert self.VideoArea.window.xid self.VideoArea.imagesink = sink self.VideoArea.imagesink.set_xwindow_id(self.VideoArea.window.xid) class lcl_gstreamer(object) : def __init__(self,video_widget = None, pipe_name=None, cb_on_error = None, cb_on_eos = None ): # init logger self.logger = logging.getLogger('luciole') # # link display window widget with gstreamer # self.video_widget = video_widget if video_widget != None : self.video_widget = VideoWidget(video_widget) self.playing = False self._cb_on_error = cb_on_error self._cb_on_eos = cb_on_eos self.pipe = Pipeline(pipe_name) self.logger.debug(self.pipe) def connect_bus(self) : """ Connect to bus """ bus = self.pipe.get_bus() bus.enable_sync_message_emission() bus.add_signal_watch() bus.connect('sync-message::element', self.on_sync_message) bus.connect('message', self.on_message) def on_sync_message(self, bus, message) : """ Gstreamer sync Message callback. """ if message.structure is None: return if message.structure.get_name() == 'prepare-xwindow-id': # Assign the viewport # all this is needed to sync with the X server before giving the # x id to the sink if self.video_widget != None : gtk.gdk.threads_enter() gtk.gdk.display_get_default().sync() self.video_widget.set_sink(message.src) message.src.set_property('force-aspect-ratio', True) gtk.gdk.threads_leave() def on_message(self,bus,message) : """ Gstreamer message callback""" t = message.type if t == gst.MESSAGE_ERROR: err, debug = message.parse_error() error_message = "%s : %s" %(err.copy(),err.message) self.pipe.set_state(gst.STATE_NULL) self.playing = False # usage tbd if self._cb_on_error != None : self._cb_on_error(err.code,error_message) self.playing = False # usage tbd elif t == gst.MESSAGE_EOS: if self._cb_on_eos: self._cb_on_eos() self.playing = False # usage tbd self.pipe.set_state(gst.STATE_NULL) elif t == gst.MESSAGE_STATE_CHANGED : pass def pause(self): gst.info("pausing pipe") self.pipe.set_state(gst.STATE_PAUSED) state = self.pipe.get_state(timeout=1000) # wait the state to GST_STATE_CHANGE_NO_PREROLL with a timeout od 1 micro second self.playing = False def play(self): gst.info("playing pipe") self.pipe.set_state(gst.STATE_PLAYING) self.playing = True def stop(self): self.pipe.set_state(gst.STATE_NULL) gst.info("stopped pipe") self.playing = False def get_state(self, timeout=1): return self.pipe.get_state(timeout=timeout) def is_playing(self): return self.playing if __name__ == '__main__' : pipe = Pipeline('toto') luciole_0.8.6/lucioLib/lcl_gst/__init__.py0000644000175000017500000000152011437126703017211 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vi:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # luciole_0.8.6/lucioLib/lcl_gst/lcl_gst_play_sound.py0000644000175000017500000000451611437126703021346 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vim:si:ai:et:sw=4:sts=4:ts=4 # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # import lcl_gst_base as LG class Lcl_gst_sound(LG.lcl_gstreamer) : """ gstreamer : play a sound """ def __init__(self,soundfile,cb_error = None) : """ soundfile : The soundfile to play cb_error : callback arror function """ LG.lcl_gstreamer.__init__(self,video_widget = None, pipe_name = 'Sound pipe', cb_on_error = cb_error ) self._soundfile = soundfile # # Creation of gstreamer pipeline # # Create elements self.src = LG.element_factory_make('filesrc') self.src.set_property('location', self._soundfile) self.dec = LG.element_factory_make('decodebin') # Connect handler for 'new-decoded-pad' signal self.dec.connect('new-decoded-pad', self.on_new_decoded_pad) self.conv = LG.element_factory_make('audioconvert') self.rsmpl = LG.element_factory_make('audioresample') self.sink = LG.element_factory_make('alsasink') # # Add elements to pipeline # self.pipe.add(self.src, self.dec, self.conv, self.rsmpl, self.sink) # Linkelements self.src.link(self.dec) LG.element_link_many(self.conv, self.rsmpl, self.sink) # Reference used in self.on_new_decoded_pad() self.apad = self.conv.get_pad('sink') self._on_error = False # connect bus LG.lcl_gstreamer.connect_bus(self) def on_new_decoded_pad(self, element, pad, last): caps = pad.get_caps() name = caps[0].get_name() if name == 'audio/x-raw-float' or name == 'audio/x-raw-int': if not self.apad.is_linked(): # Only link once pad.link(self.apad) luciole_0.8.6/lucioLib/lcl_gst/lcl_gst_acq.py0000644000175000017500000006240111437126703017732 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vim:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009-2010 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # import pygtk pygtk.require('2.0') import gtk import sys import gobject import lcl_gst_base as LG from .. import luciole_constants as MCONST from .. import luciole_tools as MT import os.path class PhotoSaveBin(LG.Bin) : """ Bin Pad to save in jpeg format image from stream. Stream alyays encoded but the result will be saved to file only when a capture is done """ # Do jpeg encoding with a framerate of 5 images per second used to reduce cpu JPEG_CAPS_FILTER = " video/x-raw-yuv, framerate=5/1 " def __init__(self) : """ Description of pipeline : sink pad | jpegenc --> fakesink | """ super(PhotoSaveBin,self).__init__() ImageBinElems=[] Myvideorate = LG.element_factory_make('videorate') # rate transformation ImageBinElems.append(Myvideorate) MyJpegFilter = LG.element_factory_make("capsfilter", "JpegFilter") # create caps string according, width, height and framerate caps = LG.Caps(self.JPEG_CAPS_FILTER) self.logger.debug(" Webcam cap : %s"%caps.to_string()) MyJpegFilter.set_property("caps", caps) ImageBinElems.append(MyJpegFilter) MyJpegenc = LG.element_factory_make("jpegenc","MyJpegenc") # jpeg encoding ImageBinElems.append(MyJpegenc) photosink = LG.element_factory_make("fakesink","PhotoSink") ImageBinElems.append(photosink) for elem in ImageBinElems : self.add(elem) LG.element_link_many(Myvideorate,MyJpegFilter,MyJpegenc,photosink) self.add_pad(LG.GhostPad('sink', Myvideorate.get_pad('sink'))) class InputImageBin(LG.Bin): """ Load image to mix with stream""" def get_image2Mix(self): return self.__image2Mix def set_image2Mix(self, value): if ( os.path.isfile(value) ): self.__image2Mix = value image2Mix = property(get_image2Mix, set_image2Mix, None, " Path to Image To Mix ") def get_framerate(self): return self.__framerate def set_framerate(self, value): if ( os.path.isfile(value) ): self.__framerate = value framerate = property(get_framerate, set_framerate, None, " Framerate for displaying input image ") def get_alphaValueImage(self): return self.__alphaValueImage def set_alphaValueImage(self, value): self.__alphaValueImage = value self.MyAlpha.set_property("alpha",self.__alphaValueImage) alphaValueImage = property(get_alphaValueImage, set_alphaValueImage, None, " Framerate for displaying input image ") def __init__(self,image,alphaValue,framerate=1) : """ Description of pipeline : | multifilesrc --> capsfilter --> jpegdec --> videoscale --> capsfilter --> alpha --> | src pad """ super(InputImageBin,self).__init__() self.__image2Mix = image self.__framerate = framerate self.__alphaValueImage = alphaValue ImageBinElems=[] # load input image self.InputImage= LG.element_factory_make('multifilesrc') self.InputImage.set_property('location',self.__image2Mix) ImageBinElems.append(self.InputImage) # filter to set frame rate self.ImageFilter = LG.element_factory_make("capsfilter") self._filter_caps_string = "image/jpeg, framerate=(fraction)%s/1 ,width=%s,height=%s " caps_string = self._filter_caps_string%(self.__framerate,MCONST.VIDEO_PAL_RES[0],MCONST.VIDEO_PAL_RES[1]) caps = LG.Caps(caps_string) self.ImageFilter.set_property("caps", caps) ImageBinElems.append(self.ImageFilter) # dec jpeg as stream MyJpecdec = LG.element_factory_make('jpegdec') ImageBinElems.append(MyJpecdec) # scale image Myvideoscale = LG.element_factory_make('videoscale') ImageBinElems.append(Myvideoscale) # needed again for setting aspect ratio InputImageFilter = LG.element_factory_make('capsfilter',"InputImageFilter") # set filter on scale caps2 = LG.Caps("video/x-raw-yuv, width=%s,height=%s"%(MCONST.VIDEO_PAL_RES[0],MCONST.VIDEO_PAL_RES[1])) InputImageFilter.set_property("caps", caps2) ImageBinElems.append(InputImageFilter) self.MyAlpha = LG.element_factory_make("alpha") # set alpha of image self.MyAlpha.set_property("alpha",self.__alphaValueImage ) ImageBinElems.append(self.MyAlpha) for elem in ImageBinElems : self.add(elem) LG.element_link_many(self.InputImage,self.ImageFilter, MyJpecdec, Myvideoscale,InputImageFilter, self.MyAlpha) self.add_pad(LG.GhostPad('src', self.MyAlpha.get_pad('src'))) class MixStreamAndImage(LG.Bin) : """ Mix the input stream with an image """ def get_image2Mix(self): return self.__image2Mix def set_image2Mix(self, value): if ( os.path.isfile(value) ): self.__image2Mix = value self.ImageBin.image2Mix = self.__image2Mix image2Mix = property(get_image2Mix, set_image2Mix, None, " Path to Image To Mix ") def get_alphaValueImage(self): return self.__alphaValueImage def set_alphaValueImage(self, value): self.__alphaValueImage = value self.ImageBin.alphaValueImage = self.__alphaValueImage alphaValueImage = property(get_alphaValueImage, set_alphaValueImage, None, " alpha value to change. ") def __init__(self,alphaValueStream, image, alphaValueImage) : """ Description of pipeline : sink pad | --> queue --> videorate --> videoscale --> capsfilter --> videobox --> videoMixer | src pad """ super(MixStreamAndImage,self).__init__() self.__image2Mix = image self.__alphaValueImage=alphaValueImage ImageBinElems=[] queueB2 = LG.element_factory_make("queue","queueB2") # queue of branch 2 ImageBinElems.append(queueB2) Myvideorate = LG.element_factory_make('videorate') # rate transformation ImageBinElems.append(Myvideorate) Myvideoscale = LG.element_factory_make('videoscale') # scale image ImageBinElems.append(Myvideoscale) VideoFilter = LG.element_factory_make("capsfilter") caps = LG.Caps("video/x-raw-yuv, framerate=(fraction)10/1, width=720,height=576") # scale image with caps VideoFilter.set_property("caps", caps) ImageBinElems.append(VideoFilter) MyVideoBox = LG.element_factory_make('videobox', "MyVideoBox") # videoBox where input video stream is displayed MyVideoBox.set_property('border-alpha', 0) MyVideoBox.set_property('alpha', alphaValueStream) ImageBinElems.append(MyVideoBox) # Video mixer : mix input in videobox with image MyVideomixer = LG.element_factory_make('videomixer', "MyVideomixer") # video mixer ImageBinElems.append(MyVideomixer) # input image to mix # create Bin for input Image self.ImageBin = InputImageBin(self.__image2Mix,alphaValueImage); ImageBinElems.append(self.ImageBin) for elem in ImageBinElems : self.add(elem) #input stream LG.element_link_many(queueB2,Myvideorate,Myvideoscale,VideoFilter,MyVideoBox,MyVideomixer) # mix with image self.ImageBin.link(MyVideomixer) # this module has a sink pad and a src pad self.add_pad(LG.GhostPad('sink', queueB2.get_pad('sink'))) self.add_pad(LG.GhostPad('src', MyVideomixer.get_pad('src'))) class ScaleBin(LG.Bin) : """ This Bin allow to fit a display in fixed size with preserving aspect ratio """ def __init__(self,width=640,height=480) : """ Description of pipeline : sink pad | --> videoscale --> capsfilter --> videobox --> | src pad """ super(ScaleBin,self).__init__() ImageBinElems=[] # compute the image size if neeeded image_size_d = self.calc_video_size(float(width),float(height),MCONST.VIDEO_PAL_RES[0],MCONST.VIDEO_PAL_RES[1]) Myvideoscale = LG.element_factory_make('videoscale') # scale image ImageBinElems.append(Myvideoscale) MyVideoFilter = LG.element_factory_make("capsfilter") caps = LG.Caps("video/x-raw-yuv,width=%s,height=%s"%(image_size_d['width'],image_size_d['height'])) # scale image with caps MyVideoFilter.set_property("caps", caps) ImageBinElems.append(MyVideoFilter) MyVideoBox = LG.element_factory_make('videobox', "MyVideoBox") # videoBox where input video stream is displayed MyVideoBox.set_property('fill',0 ) # fill with black # borders are negative values for videobox . postive value used dor crop MyVideoBox.set_property('top', -1*image_size_d['top'] ) MyVideoBox.set_property('bottom', -1*image_size_d['bottom']) MyVideoBox.set_property('left', -1*image_size_d['left']) MyVideoBox.set_property('right', -1*image_size_d['right']) ImageBinElems.append(MyVideoBox) # add bins for elem in ImageBinElems : self.add(elem) # link bins LG.element_link_many(Myvideoscale,MyVideoFilter,MyVideoBox ) # this module has a sink pad and a src pad self.add_pad(LG.GhostPad('sink', Myvideoscale.get_pad('sink'))) self.add_pad(LG.GhostPad('src', MyVideoBox.get_pad('src'))) def calc_video_size(w_src, h_src, w_dst, h_dst): """ copmpute the scale for the image : The new image size if needed to scale + border to fill in target destination""" w_scale = (w_src*1.0) / w_dst h_scale = (h_src*1.0) / h_dst if w_scale > h_scale : scale_f = w_scale else : scale_f = h_scale if scale_f > 1.0 : # Scale to fill in defined zone (w_final , h_final) = (int(w_src/scale_f) , int(h_src/scale_f)) else : # input source lower than target don't scale it (w_final , h_final) = (int(w_src) , int(h_src)) (border_left, border_right) = ScaleBin.calc_border_size(w_final,w_dst) (border_top, border_bottom) = ScaleBin.calc_border_size(h_final,h_dst) size_dict = dict() size_dict['width'] = int(w_final) size_dict['height'] = int(h_final) size_dict['bottom'] = int(border_bottom) size_dict['top'] = int(border_top) size_dict['left'] = int(border_left) size_dict['right'] = int(border_right) return size_dict calc_video_size = staticmethod(calc_video_size) def calc_border_size(src,tgt) : """ This function computes the size of the borders. Images is centered so borders size are equals at one pixel""" (border_x, border_y) = (0,0) if src < tgt : border_size = int( (tgt - src)/2) if border_size*2 + src < tgt : # to esnsure that border + src = target size # means that border size or src are odd; so the first is filled with the missing pixel border_x = int(tgt - src -border_size) border_y = border_size else : (border_x,border_y) = ( border_size, border_size) return (border_x, border_y) calc_border_size = staticmethod(calc_border_size) class WebcamInputBin(LG.Bin) : """ LG.Bin for Web cam input""" def __init__(self,width=640,height=480,framerate=(2,25),source_input='v4l2src',device='/dev/video0') : """build webcam cam input bin Description of pipeline : | v4lsrc or v4l2src --> capsfilter --> ffmpegcolorspace --> ScaleBin | src pad params : width : The webcam width. Integer value height : The webcam width. Integer value framerate : The webcam framerate. A tuple for fraction representation (denom,num) source_input : The type of driver input. A string device : Path to webcam device. A string """ super(WebcamInputBin,self).__init__() ImageBinElems=[] MyVideoSrc = LG.element_factory_make(source_input) MyVideoSrc.set_property("device", device) ImageBinElems.append(MyVideoSrc) MyVideoSrcFilter = LG.element_factory_make("capsfilter", "MyVideoSrc") # create caps string according, width, height and framerate caps = LG.Caps("video/x-raw-yuv, width=%s,height=%s , framerate=%s/%s "%(width,height,framerate[0],framerate[1]) ) self.logger.debug(" Webcam cap : %s"%caps.to_string()) MyVideoSrcFilter.set_property("caps", caps) ImageBinElems.append(MyVideoSrcFilter) MyyuvInput = LG.element_factory_make('ffmpegcolorspace') ImageBinElems.append(MyyuvInput) # scale Webcam Display to DV SCALE MyScaleBin = ScaleBin(width,height) ImageBinElems.append(MyScaleBin) for elem in ImageBinElems : self.add(elem) LG.element_link_many(MyVideoSrc,MyVideoSrcFilter,MyyuvInput,MyScaleBin) #this bin has only a src ghostPad self.add_pad(LG.GhostPad('src', MyScaleBin.get_pad('src'))) class DvInputBin(LG.Bin) : """ LG.Bin for DV cam input""" def __init__(self) : """build Dv cam input bin Description of pipeline : | dv1394src --> dvdemux --> dvdec --> ffmpegcolorspace --> | src_pad """ super(DvInputBin,self).__init__() ImageBinElems=[] MyVideoSrc = LG.element_factory_make('dv1394src') ImageBinElems.append(MyVideoSrc) #set demuxer ( separation image/sound) MyDemux = LG.element_factory_make("dvdemux", "demuxer") ImageBinElems.append(MyDemux) MyDemux.connect("pad-added", self.MyDemux_callback) self.MyVideodecoder = LG.element_factory_make("dvdec", "video-decoder") ImageBinElems.append(self.MyVideodecoder) # ffmpeg needed for pipe ; without the next elements dont understand the stream flow MyffmpegInput = LG.element_factory_make('ffmpegcolorspace') ImageBinElems.append(MyffmpegInput) for elem in ImageBinElems : self.add(elem) LG.element_link_many(MyVideoSrc,MyDemux) LG.element_link_many(self.MyVideodecoder,MyffmpegInput) #this bin has only a src ghostPad self.add_pad(LG.GhostPad('src', MyffmpegInput.get_pad('src'))) def MyDemux_callback(self, demuxer, pad): """ Call back function to create the video pad of dvdemux.""" if pad.get_property("template").name_template == "video": dec_pad = self.MyVideodecoder.get_pad("sink") pad.link(dec_pad) class FakeInputBin(LG.Bin) : """ LG.Bin for fake input""" def __init__(self) : """build Fake input bin. Description of pipeline : | videotestsrc --> capsfilter --> | src pad """ super(FakeInputBin,self).__init__() ImageBinElems=[] MyVideoSrc = LG.element_factory_make('videotestsrc') ImageBinElems.append(MyVideoSrc) MyVideoSrcFilter = LG.element_factory_make("capsfilter", "MyVideoSrc") caps = LG.Caps("video/x-raw-yuv, framerate=(fraction)10/1, width=720,height=576") MyVideoSrcFilter.set_property("caps", caps) ImageBinElems.append(MyVideoSrcFilter) for elem in ImageBinElems : self.add(elem) LG.element_link_many(MyVideoSrc,MyVideoSrcFilter) #this bin has only a src ghostPad self.add_pad(LG.GhostPad('src', MyVideoSrcFilter.get_pad('src'))) class DisplayBin(LG.Bin) : """ Bin used for video display on screen Description of pipeline : sink pad | --> ffmpegcolorspace --> videoscale --> autovideosink | """ def __init__(self) : """ Build display bin """ super(DisplayBin,self).__init__() ImageBinElems=[] Myffmpeg = LG.element_factory_make('ffmpegcolorspace') # ffmpegcolorspace for display ImageBinElems.append(Myffmpeg) # scale image Myvideoscale = LG.element_factory_make('videoscale', 'DisplayVideoScale') ImageBinElems.append(Myvideoscale) MyImageSink = LG.element_factory_make('autovideosink') ImageBinElems.append(MyImageSink) for elem in ImageBinElems : self.add(elem) LG.element_link_many(Myffmpeg,Myvideoscale,MyImageSink) # only a sink (input) pad self.add_pad(LG.GhostPad('sink', Myffmpeg.get_pad('sink'))) class Lcl_gst_acq(LG.lcl_gstreamer) : """ Main class for hardware video acquisition with gstreamer""" # # Class constants declaration __HardType=MCONST.HardType (NOMIX,MIX) = range(2) __MixType=(NOMIX,MIX) __ToMixImageName="ToMix.jpeg" # # Properties declaration # def get_inputType(self): return self.__inputType def set_inputType(self, value): if value in self.__HardType : self.__inputType = value else : msg = " Invalid Type",value," ",self.__HardType self.logger.info(msg) def del_inputType(self): del self.__inputType inputType = property(get_inputType, set_inputType, del_inputType, " Hard input type ") def get_mix(self): return self.__mix def set_mix(self, value): if value in self.__MixType : self.__mix = value def del_mix(self): del self.__mix mix = property(get_mix, set_mix, del_mix, " Mix type ") def get_CaptureImagePath(self): return self.__CaptureImagePath def set_CaptureImagePath(self, value): self.__CaptureImagePath = value def del_CaptureImagePath(self): del self.__CaptureImagePath CaptureImagePath = property(get_CaptureImagePath, set_CaptureImagePath, del_CaptureImagePath, " Path to save file ") def get_alphaStream(self): return self.__alphaStream def set_alphaStream(self, value): if ( (value >= 0.0) and (value <= 1.0) ): self.__alphaStream = value def del_alphaStream(self): del self.__alphaStream alphaStream = property(get_alphaStream, set_alphaStream, del_alphaStream, " Stream alpha value ") def get_alphaImage(self): return self.__alphaImage def set_alphaImage(self, value): if ( (value >= 0.0) and (value <= 1.0)) : self.__alphaImage = value if self.MixBin : self.MixBin.alphaValueImage = self.__alphaImage def del_alphaImage(self): del self.__alphaImage alphaImage = property(get_alphaImage, set_alphaImage, del_alphaImage, " Image alpha value ") def get_image2Mix(self): return self.__image2Mix def set_image2Mix(self, value): if ( os.path.isfile(value) ): MT.copyf(value,self.__image2Mix) if self.MixBin : self.MixBin.image2Mix = self.__image2Mix def del_image2Mix(self): del self.__image2Mix image2Mix = property(get_image2Mix, set_image2Mix, del_image2Mix, " Path to Image To Mix ") def get_webcam_data(self): return self.__webcam_data def set_webcam_data(self, value): self.__webcam_data = value def del_webcam_data(self): del self.__webcam_data webcam_data = property(get_webcam_data, set_webcam_data, del_webcam_data, " webcam parameters for gstreamer : source_input,device,height, width ") def __init__(self,videowidget,baseDirPath="/dev/tmp", on_error = None, cb_capture_done = None) : """ Initialisation of class LucioleGstreamer Input parameters : - videowidget : the widget into display acquisition - baseDirPath : a base path to store the image to mix - cb_on_error : callback to inidicate error - cb_capture_done : callback to indicate that capture is done. """ self.pipe_name = 'Acquistion Pipe' LG.lcl_gstreamer.__init__(self,video_widget =videowidget, pipe_name = self.pipe_name, cb_on_error = on_error ) self.__inputType = MCONST.FAKE self.__alphaStream = 1.0 self.__alphaImage =0.5 self.__mix = self.NOMIX self.__image2Mix = os.path.join(baseDirPath,self.__ToMixImageName) #init videowidget #self.DispWidget = videowidget self._cb_capture_done = cb_capture_done self.playing = False self.MixBin=None # init webcam data - set default values # standard vga self.__webcam_data={} self.__webcam_data['width'] = 640 self.__webcam_data['height'] = 480 self.__webcam_data['device'] = "/dev/video0" self.__webcam_data['source_input'] = "v4l2src" self.__webcam_data['framerate_list'] = [ (25,2) ] self.__webcam_data['framerate_selected'] = (25,2) def reset_pipe(self): """ Gstreamer pipe configuration : Build the elements according acquisition input, availablity of mixer, and set output to videop display and file. """ ElementList = [] self.pipe = LG.Pipeline(self.pipe_name) if (self.__inputType == MCONST.WEBCAM) : InputBin = WebcamInputBin( width = self.__webcam_data['width'], height = self.__webcam_data['height'], framerate = self.__webcam_data['framerate_selected'], source_input = self.__webcam_data['source_input'], device = self.__webcam_data['device'] ) elif (self.__inputType == MCONST.DVCAM) : InputBin = DvInputBin() else : InputBin = FakeInputBin() ElementList.append(InputBin) #create tee ( One for file sink, the other for video sink) MyTee = LG.element_factory_make("tee", "MyTee") ElementList.append(MyTee) # both "branch" of the tee are queued # # File queue # queueFile = LG.element_factory_make("queue","queueFile") ElementList.append(queueFile) #fileSink = SaveCapturedImageBin(self.__CaptureImagePath) fileSink = PhotoSaveBin() ElementList.append(fileSink) # # Display queue # queueDisplay = LG.element_factory_make("queue","queueDisplay") ElementList.append(queueDisplay) if (self.__mix == self.MIX) : self.MixBin =MixStreamAndImage(self.__alphaStream, self.__image2Mix, self.__alphaImage) ElementList.append(self.MixBin) DisplaySink = DisplayBin() ElementList.append(DisplaySink) # # Add elements to pipeline # for elem in ElementList : self.pipe.add(elem) # # link pipeline elements # #link input LG.element_link_many(InputBin,MyTee) # link tee File branch LG.element_link_many(MyTee,queueFile,fileSink) #link tee display Branch LG.element_link_many(MyTee,queueDisplay) if (self.__mix == self.MIX) : LG.element_link_many(queueDisplay,self.MixBin, DisplaySink) else : LG.element_link_many(queueDisplay,DisplaySink) self.on_eos = False # usage tbd # connect bus LG.lcl_gstreamer.connect_bus(self) def capture(self) : """ capture is requested : - get jpegnec src pad (output pad of jpege enc) - and add a buffer probe with callback when frame is encoded """ # only one src pad with jpegenc pad = self.pipe.get_by_name("MyJpegenc").src_pads().next() # add the probe self.grabprobe = pad.add_buffer_probe(self._cb_process_frame) def _cb_process_frame(self, pad, buffer): """ Callbak to inidicate that buffer is available from probe """ # remove the prove pad.remove_buffer_probe(self.grabprobe) # save to file file = open(self.__CaptureImagePath,'w') file.write(buffer) file.close() # callback to indicate that job is done # the execution here is not in the same thread as gui , so call capture_done with idle add if self._cb_capture_done != None : gobject.idle_add(self._cb_capture_done) return True luciole_0.8.6/lucioLib/luciole_conf.py0000644000175000017500000001642211437126703016473 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vim:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009-2010 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # """ file luciole_conf.py """ import os.path import luciole_exceptions as LEXCEP import luciole_tools as MT from xml.sax.handler import ContentHandler from xml.sax import make_parser import xml.etree.ElementTree as ET import copy import gtk from gettext import gettext as _ import logging module_logger = logging.getLogger('luciole') class LucioleConf(object): """ Manage the configuration file of luciole """ __USER_LUCIOLE_DIR = ".luciole" __CONF_FILE_NAME = "lucioleConf.xml" __ORIGINAL_DIR = "templates" __THEME_DIR = "themes" def _get_conf_options(self): """ get method for option dicrionary """ return self._option_dict def _set_conf_options(self,key,value) : if self._option_dict.has_key(key) : self._option_dict[key] = value conf_options = property(_get_conf_options, _set_conf_options, None, "Options dictionary") def __init__(self): """ init of luciole conf : - if conf file does not exist in user dir create it - parse xml conf file """ self.logger = logging.getLogger('luciole') self._home_dir = os.path.expandvars('$HOME') self._option_dict = dict() self._option_dict["LastProjects"] = list() self._conf_et = None # verify if luciole confile exits conf_file_path = os.path.join(self.__USER_LUCIOLE_DIR, self.__CONF_FILE_NAME) self._conf_file_path = os.path.join(self._home_dir, conf_file_path) if os.path.exists(self._conf_file_path) : # luciole file exist parse it self._parse_conf_file() else : try : # copy file to local dir self._copy_conf_file(os.path.join(self.__ORIGINAL_DIR,self.__CONF_FILE_NAME)) # and parse it self._parse_conf_file() except LEXCEP.LucioException, err : lerr = "Error in copy %s : ",err raise LEXCEP.LucioException, lerr # # Public methods # def update_last_project(self, project_list = [] ) : """ update project list file """ if project_list != [] : self._option_dict["LastProjects"] = project_list last_projects = self._conf_et.find("LastProjects") #copy list objecy lproject_list = copy.copy(project_list) lproject_list.reverse() for my_iter in last_projects.getiterator("LastProject") : if lproject_list : my_iter.text = lproject_list.pop() self._conf_et.write(self._conf_file_path ,"UTF-8") def load_theme(self) : """ Load a gtk theme """ self.logger.debug('Entering theme load') if self._option_dict.has_key('Theme') : l_path = os.path.join(self.__THEME_DIR,self._option_dict['Theme']) if os.path.exists(l_path) : gtk.rc_parse(l_path) else : msg = _('Theme %s does not exist'%l_path) self.logger.info(msg) else : msg = _('Impossible to load theme') self.logger.info(msg) self.logger.debug('Exiting theme load') def save_options(self) : options_el = self._conf_et.find("options") for my_iter in options_el.getiterator("option") : (name , value ) = (my_iter.get('name'), my_iter.get('value')) if self._option_dict.has_key(name) and self._option_dict[name] != value : # key exist and value change update xml file my_iter.set('value',self._option_dict[name]) #save to file self._conf_et.write(self._conf_file_path ,"UTF-8") # # Private methods # def _copy_conf_file(self, source_conf_file) : """ copy config file to user dir """ #check if user luciole dir exist ldir = os.path.join(self._home_dir, self.__USER_LUCIOLE_DIR) if os.path.exists(ldir) : if os.path.isdir(ldir) : # cp luciole_conf file try : MT.copyf(source_conf_file, ldir) except LEXCEP.LucioException, err : raise LEXCEP.LucioException, err else : try : MT.delf(ldir) except LEXCEP.LucioException, err : raise LEXCEP.LucioException, err else : # dir .luciole does not exist try : MT.mkdirs(ldir) except LEXCEP.LucioException, err : raise LEXCEP.LucioException, err else : # cp luciole_conf file try : MT.copyf(source_conf_file, ldir) except LEXCEP.LucioException, err : raise LEXCEP.LucioException, err def _parse_conf_file(self) : """ parse user config file """ # first XML validity of document try : LucioleConf._check_xml_validity(self._conf_file_path) except Exception, err : lerr == " File %s is NOT well formed !! %s" % (self._conf_file_path, err) raise LEXCEP.LucioException, lerr else : # parse configFile with elemenent Tree self._conf_et = ET.parse(self._conf_file_path) # get used projects history last_projects = self._conf_et.find("LastProjects") for my_iter in last_projects.getiterator("LastProject") : # check that Last project tag is not empty if my_iter.text : project_path = my_iter.text.strip() # update options only if project exists if os.path.exists(project_path) : self._option_dict["LastProjects"].append(project_path) # get theme self._parse_options() def _parse_options(self) : """ Parse options """ options_el = self._conf_et.find("options") for my_iter in options_el.getiterator("option") : (name , value ) = (my_iter.get('name'), my_iter.get('value')) if name != None and value != None : self._option_dict[name] = value def _check_xml_validity(my_file) : """ check if config XML file is well formed """ parser = make_parser() parser.setContentHandler(ContentHandler()) parser.parse(my_file) _check_xml_validity = staticmethod(_check_xml_validity) luciole_0.8.6/ui/0000755000175000017500000000000011437126703012326 5ustar niconicoluciole_0.8.6/ui/export_file.glade0000644000175000017500000003023311437126703015645 0ustar niconico 5 Tool Exporter ../images/luciole.png luciole normal False True vertical 2 True 0.25 8 Export to another application False False 5 1 True vertical True 2 2 Cinelerra True True False Export to cinelerra True True Kdenlive True True False Export to Kdenlive True radio_cine 1 2 Pitivi True True False Export to pitivi True radio_cine 1 2 Openshot True False False False Coming soon True True radio_cine 1 2 1 2 10 0 True 250 True Select an export directory False False 0 True select-folder Select a folder False False 1 1 10 1 True 250 True Select a filename False False 0 True True 1 10 2 True 2 False False 3 3 2 True end gtk-cancel True True True True False False 0 gtk-convert True True True True False False 1 gtk-close True True True True False False 2 False end 0 button1 button2 button3 luciole_0.8.6/ui/luciole.glade0000644000175000017500000031627211437126703014773 0ustar niconico 0.40000000000000002 1 0.10000000000000001 0.10000000000000001 1 1 6 1 1 1 DV format (raw DV) Format DVD (mpeg2) Format divx/xvid (avi) Default Tropical ../images/luciole.png Luciole True vertical True True _File True True gtk-new True True True gtk-open True True True True Open recent True True True project1 True True project2 True True project3 True True project4 True True project5 True gtk-save True True True gtk-save-as True True True True Import images True cursor image1 False Export True image2 False Tool Export True image5 False True gtk-close True True True gtk-quit True True True True _View True True Project properties True False image3 False Preferences True image4 False True _Help True True gtk-about True True True False 0 True True vertical 360 288 True 7 0 0 in 0.10000000149011612 0.10000000149011612 1.25 False 360 288 True 0 10 True False False 1 True 0 none 55 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 1 56 46 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Activate/Deactivate camera preview ../images/luciole-dodo.png 0 150 True 56 46 True True True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK make a snapshot ../images/capture.png False False 0 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False False 1 94 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical Mixer True False False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False False 0 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK discontinuous adjustment1 bottom False False 1 False False 2 False False 1 9 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False False 2 20 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 3 True vertical 1 True False False 0 150 True Image per seconds center False False 1 4 True False False 2 True True adjustment2 0 bottom False False 3 4 3 True 5 False False 2 0 True True False False 0 215 True queue etched-out 215 True vertical 215 True True automatic automatic in True 0 True vertical 10 True False False 0 45 True True 0 45 45 True False False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True Import images True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-add 5 False False 1 True 2 45 45 False False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK To trash True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-delete 5 False False 3 True 4 45 45 True False False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Move snapshot to montage area True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-go-forward 5 False False 5 True 6 False False 1 5 True False False 2 False False end 1 False 3 1 20 True False False 3 2 215 True queue etched-out 215 True vertical 215 True True automatic automatic in True True 0 True vertical 10 True False False 0 45 True True 0 45 45 True False False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Move up one or several images True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-go-up 5 False False 1 True 2 45 45 True False False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Move down one or several images True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-go-down 5 False False 3 True 4 45 45 True False False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK To trash True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-delete 5 False False 5 True 6 45 45 True False False Play video True gtk-media-play 5 7 True 8 False False 1 5 True False False 2 False False end 1 False 3 3 20 True False False 4 False False 1 1 True True 2 0 200 10 False False 3 1 False 2 2 5 Select a Luciole project center-on-parent menu False True vertical 2 True end False end 0 GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 About Luciole False center-on-parent dialog False Luciole 0.8 Copyright 2009-2010 Nicolas Bertrand (nico@inattendu.org) Stop-motion tool for making animated cartoon Makes live video acquistion from Webcam or DV cam http://festival.inattendu.org/Luciole Luciole on line 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Nico : nico@inattendu.org Elise : elise@inattendu.org Xtine : xtine@inattendu.org (broker) Elise : elise@inattendu.org Dave : erpizzo@alice.it Nounours : daniel@inattendu.org Raffaella : raffaella.traniello@livecom.it Rodolphe : rodolphe@unmauvaisstrip.net ../images/luciole_logo.png True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK end False end 0 GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 Video Export center-on-parent dialog False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical 20 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Choose export format. 0 16 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False False 1 False False 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK queue True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 10 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False False 0 30 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 7 File format : False False 1 200 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK model1 0 False False 2 False False 10 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 10 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False False 0 10 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Export file name (without extension) : False False 9 1 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK ? 15 False False 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 4 10 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False False end 3 False False 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 10 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False False 0 121 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 14 Export path: False False 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 2 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 10 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False False 0 30 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK select-folder False True Select a folder 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK end 3 1 False False 9 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False False 3 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 20 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False False 0 Export video with sound. True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True 1 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK options False False 10 4 15 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False end 5 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True 3 0 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK end gtk-cancel True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False False 0 gtk-apply True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False False 1 gtk-close True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False False 2 False end 0 button13 button16 button18 5 center-on-parent dialog False True vertical 2 True end False end 0 5 Preferences center-on-parent dialog False 269 True vertical 2 True vertical 40 True queue etched-in True Preferences 26 0 True True 0.10000000149011612 Select Theme 0 True model2 0 1 False False 20 1 Add Trash to montage view True True False True 20 2 1 True end False end 0 True gtk-add True gtk-convert True gtk-properties True gtk-preferences True gtk-connect luciole_0.8.6/po/0000755000175000017500000000000011437126703012327 5ustar niconicoluciole_0.8.6/po/de.po0000644000175000017500000004744711437126703013277 0ustar niconico# German translation for luciole # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the luciole package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: luciole\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-02-05 10:29+0400\n" "PO-Revision-Date: 2010-02-05 12:17+0000\n" "Last-Translator: Nounours \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-02-06 04:54+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../ui/luciole.glade.h:1 msgid " " msgstr " " #: ../ui/luciole.glade.h:2 msgid " Export file name (without extension) :" msgstr " Name der Exportdatei (ohne Erweiterung)" #: ../ui/luciole.glade.h:3 msgid "About Luciole" msgstr "Über Luciole" #: ../ui/luciole.glade.h:4 msgid "Activate/Deactivate camera preview" msgstr "Kameravorschau einschalten/ausschalten" #: ../ui/luciole.glade.h:5 msgid "Add Trash to montage view" msgstr "Papierkorb zur Schnittvorschau hinzufügen" #: ../ui/luciole.glade.h:6 msgid "Choose export format." msgstr "Exportformat wählen" #: ../ui/luciole.glade.h:7 msgid "Copyright 2009-2010 Nicolas Bertrand (nico@inattendu.org)" msgstr "Copyright 2009-2010 Nicolas Bertrand (nico@inattendu.org)" #: ../ui/luciole.glade.h:8 msgid "DV format (raw DV)" msgstr "DV Format (roh DV)" #: ../ui/luciole.glade.h:9 msgid "Default" msgstr "Standard" #: ../ui/luciole.glade.h:10 msgid "" "Elise : elise@inattendu.org\n" "Dave : erpizzo@alice.it\n" "Nounours : daniel@inattendu.org\n" "Nico : nico@inattendu.org" msgstr "" "Elise : elise@inattendu.org\n" "Dave : erpizzo@alice.it\n" "Daniel : daniel@inattendu.org\n" "Nico : nico@inattendu.org" #: ../ui/luciole.glade.h:14 msgid "Export" msgstr "Exportieren" #: ../ui/luciole.glade.h:15 msgid "Export path:" msgstr "Exportpfad:" #: ../ui/luciole.glade.h:16 msgid "Export video with sound." msgstr "Video mit Ton exportieren" #: ../ui/luciole.glade.h:17 msgid "File format :" msgstr "Dateiformat:" #: ../ui/luciole.glade.h:18 msgid "Format DVD (mpeg2)" msgstr "DVD Format (mpeg2)" #: ../ui/luciole.glade.h:19 msgid "Format divx/xvid (avi)" msgstr "divx/xvid Format (avi)" #: ../ui/luciole.glade.h:20 msgid "Image per seconds" msgstr "Bild pro Sekunde" #. Caller une image sur le flux video #: ../ui/luciole.glade.h:22 msgid "Import images" msgstr "Bilder importieren" #: ../ui/luciole.glade.h:23 msgid "Luciole on line" msgstr "Luciole online" #: ../ui/luciole.glade.h:24 msgid "Mixer" msgstr "Mischer" #. Descendre un/ou plusieurs images #: ../ui/luciole.glade.h:26 msgid "Move down one or several images" msgstr "ein oder mehrere Bilder runterschieben" #. Déplacer des images capturées dans la zone de montage #: ../ui/luciole.glade.h:28 msgid "Move snapshot to montage area" msgstr "Erfasste Bilder zur Montagefläche verschieben" #. Monter un/ou plusieurs images #: ../ui/luciole.glade.h:30 msgid "Move up one or several images" msgstr "ein oder mehrere Bilder raufschieben" #: ../ui/luciole.glade.h:31 msgid "Open recent" msgstr "Zuletzt geöffnet" #: ../ui/luciole.glade.h:32 msgid "Play video" msgstr "Video abspielen" #: ../ui/luciole.glade.h:33 msgid "Preferences" msgstr "Einstellungen" #: ../ui/luciole.glade.h:34 ../lucioLib/gui/dialog_project_properties.py:101 msgid "Project properties" msgstr "Projekteigenschaften" #: ../ui/luciole.glade.h:35 msgid "Select Theme" msgstr "Thema auswählen" #: ../ui/luciole.glade.h:36 msgid "Select a Luciole project" msgstr "Luciole-Projekt wählen" #: ../ui/luciole.glade.h:37 ../ui/export_file.glade.h:11 #: ../lucioLib/gui/assistant_new_project.py:102 msgid "Select a folder" msgstr "Ordner auswählen" #: ../ui/luciole.glade.h:38 msgid "" "Stop-motion tool for making animated cartoon\n" "Makes live video acquistion from Webcam or DV cam" msgstr "" "Stop-motion-Tool zur Erstellung von Animationsfilmen\n" "Live-Video-Erfassung von Webcam oder DV-Kamera" #: ../ui/luciole.glade.h:40 msgid "" "This program is free software; you can redistribute it and/or\n" "modify it under the terms of the GNU General Public License\n" "as published by the Free Software Foundation; either \n" "version 2 of the License, or (at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied \n" "warranty of MERCHANTABILITY or FITNESS FOR A \n" "PARTICULAR PURPOSE. See the GNU General Public \n" "License for more details.\n" "\n" "You should have received a copy of the GNU General Public\n" "License along with this program; if not, write to the \n" "Free Software Foundation, \n" "Inc., 59 Temple Place - \n" "Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Dieses Programm ist freie Software; es kann vertrieben und/oder\n" "verändert werden, unter den Bedingungen der GNU General Public License\n" "wie von der Free Software Foundation veröffentlicht; entweder\n" "Version 2 der Lizenz oder (nach Ihrer Option) jeder späteren Version.\n" "\n" "Dieses Programm wird in der Hoffnung vertrieben, dass es nützlich sein " "wird,\n" "aber OHNE IRGENDEINE GARANTIE; sogar ohne die implizite\n" "Garantie der MARKTGÄNGIGKEIT oder EIGNUNG FÜR EINEN\n" "BESTIMMTEN ZWECK. Lesen Sie die GNU General Public\n" "Lizenz für weitere Informationen.\n" "\n" "Sie sollten eine Kopie der GNU General Public License\n" "zusammen mit diesem Programm erhalten haben; wenn nicht,\n" "schreiben Sie an die\n" "Free Software Foundation,\n" "Inc., 59 Temple Place -\n" "Suite 330, Boston, MA 02111-1307, USA." #. Jeter à la poubelle #: ../ui/luciole.glade.h:57 msgid "To trash" msgstr "Zum Papierkorb" #: ../ui/luciole.glade.h:58 msgid "Tool Export" msgstr "Toolexport" #: ../ui/luciole.glade.h:59 msgid "Tropical" msgstr "Tropisch" #: ../ui/luciole.glade.h:60 msgid "Video Export" msgstr "Videoexport" #: ../ui/luciole.glade.h:61 msgid "_File" msgstr "_Datei" #: ../ui/luciole.glade.h:62 msgid "_Help" msgstr "_Hilfe" #: ../ui/luciole.glade.h:63 msgid "_View" msgstr "_Anzeigen" #: ../ui/luciole.glade.h:64 msgid "make a snapshot" msgstr "Ein Bild erfassen" #: ../ui/luciole.glade.h:65 msgid "options" msgstr "Optionen" #: ../ui/luciole.glade.h:66 msgid "project1" msgstr "Projekt1" #: ../ui/luciole.glade.h:67 msgid "project2" msgstr "Projekt2" #: ../ui/luciole.glade.h:68 msgid "project3" msgstr "Projekt3" #: ../ui/luciole.glade.h:69 msgid "project4" msgstr "Projekt4" #: ../ui/luciole.glade.h:70 msgid "project5" msgstr "Projekt5" #: ../ui/export_file.glade.h:1 msgid "Cinelerra" msgstr "Cinelerra" #: ../ui/export_file.glade.h:2 msgid "Coming soon" msgstr "Demnächst" #: ../ui/export_file.glade.h:3 msgid "Export to Kdenlive" msgstr "Exportieren (Kdenlive)" #: ../ui/export_file.glade.h:4 msgid "Export to another application" msgstr "Exportieren (andere Anwendung)" #: ../ui/export_file.glade.h:5 msgid "Export to cinelerra" msgstr "Exportieren (Cinelerra)" #: ../ui/export_file.glade.h:6 msgid "Export to pitivi" msgstr "Exportieren (Pitivi)" #: ../ui/export_file.glade.h:7 msgid "Kdenlive" msgstr "Kdenlive" #: ../ui/export_file.glade.h:8 msgid "Openshot" msgstr "Openshot" #: ../ui/export_file.glade.h:9 msgid "Pitivi" msgstr "Pitivi" #: ../ui/export_file.glade.h:10 msgid "Select a filename" msgstr "Dateiname auswählen" #: ../ui/export_file.glade.h:12 msgid "Select an export directory" msgstr "Ordner zum Exportieren auswählen" #: ../ui/export_file.glade.h:13 msgid "Tool Exporter" msgstr "Tool Exporter" #: ../lucioLib/controller/controller_load_project.py:134 msgid "Project Load started" msgstr "Projekt wird geladen" #: ../lucioLib/controller/controller_load_project.py:139 #, python-format msgid "Project %s is loaded" msgstr "Projekt %s ist geladen" #: ../lucioLib/controller/controller_load_project.py:145 #, python-format msgid "Project %s is loading" msgstr "Projekt %s wird geladen" #: ../lucioLib/controller/controller_import.py:177 msgid "Import started" msgstr "Wird importiert" #: ../lucioLib/controller/controller_import.py:182 msgid "All images imported" msgstr "Alle Bild sind importiert" #: ../lucioLib/controller/controller_import.py:188 msgid "Importing images ..." msgstr "Bilder importieren..." #: ../lucioLib/gui/dialog_project_properties.py:47 msgid "Project folder :" msgstr "Ordner des Projekts:" #: ../lucioLib/gui/dialog_project_properties.py:51 msgid "Project name :" msgstr "Name des Projekts:" #: ../lucioLib/gui/dialog_project_properties.py:55 msgid "XML file :" msgstr "XML-Datei:" #: ../lucioLib/gui/dialog_project_properties.py:60 msgid "Number of frames / image" msgstr "Anzahl Frames / Bild" #: ../lucioLib/gui/dialog_project_properties.py:64 msgid "Device type" msgstr "Gerätetyp" #: ../lucioLib/gui/dialog_project_properties.py:72 msgid "Device :" msgstr "Gerät:" #: ../lucioLib/gui/dialog_project_properties.py:76 msgid "Webcam name :" msgstr "Name der Webcam:" #: ../lucioLib/gui/dialog_project_properties.py:81 msgid "Video capture driver :" msgstr "Treiber der Videoerfassung:" #: ../lucioLib/gui/dialog_project_properties.py:85 msgid "Video width :" msgstr "Breite der Video:" #: ../lucioLib/gui/dialog_project_properties.py:89 msgid "Video height :" msgstr "Höhe der Video:" #: ../lucioLib/gui/dialog_project_properties.py:93 msgid "" "Webcam framerate \n" " (number of images per second)" msgstr "" "Webcam Frameanteil\n" " (Anzahl Bilder pro Sekunde)" #: ../lucioLib/gui/dialog_project_properties.py:200 #: ../lucioLib/gui/dialog_project_properties.py:216 msgid "desc" msgstr "Beschreibung" #: ../lucioLib/gui/dialog_project_properties.py:247 msgid "Webcam properties" msgstr "Eigenschaften der Webcam" #. #. Display Button fo webcam detetction #. #: ../lucioLib/gui/dialog_project_properties.py:276 msgid "Webcam detection" msgstr "Webcam suchen" #: ../lucioLib/gui/luciole_export_window.py:174 #, python-format msgid "" "%s is not valid. Not valid video name. It should be a combination of " "alphanumeric and '_' characters " msgstr "" "%s ist nicht gültig. Ungültiger Name. Es sollte eine Kombination von " "alphanumerischen und '_' Zeichen sein. " #. Launch Dialog window to ask if export file can be overide #. add message display #: ../lucioLib/gui/luciole_export_window.py:207 #: ../lucioLib/gui/luciole_export_tool_window.py:196 #, python-format msgid "File %s already exists. Replace file ?" msgstr "Datei %s gibt es bereits. Ersetzen?" #: ../lucioLib/gui/luciole_export_tool_window.py:115 msgid "Select an application and a file name for export" msgstr "Anwendung und Dateiname zum Exportieren auswählen" #. Terminated normaly #: ../lucioLib/gui/luciole_export_tool_window.py:209 #: ../lucioLib/lcl_export/lcl_export_video.py:207 msgid "Export Done" msgstr "Exportieren erledigt" #. #. Initailize widgets for first page #. #. A label #: ../lucioLib/gui/assistant_new_project.py:59 msgid "" "This assistant will help you on configuration of a new Luciole project." msgstr "" "Dieser Assistent wir Ihnen bei der Konfiguration eines neues Luciole-" "Projekts helfen." #. A label #: ../lucioLib/gui/assistant_new_project.py:72 msgid "Select project name and destination folder." msgstr "Name des Projektes und Zielordner wählen" #. display project name #: ../lucioLib/gui/assistant_new_project.py:82 #: ../lucioLib/gui/assistant_new_project.py:362 msgid "Project Name" msgstr "Name des Projektes" #: ../lucioLib/gui/assistant_new_project.py:95 msgid "Folder" msgstr "Ordner" #. project with same name alreday exists #: ../lucioLib/gui/assistant_new_project.py:167 #, python-format msgid "The project %s already exists !" msgstr "Das Projekt % s existiert bereits!" #. invalid projetc name #: ../lucioLib/gui/assistant_new_project.py:171 #, python-format msgid "" "%s isn't a valid project name. It should be a combination of alphanumeric " "and '_' characters " msgstr "" "%s ist nicht ein gültiger Projektname. Es sollte eine Kombination von " "alphanumerischen und '_' Zeichen sein. " #: ../lucioLib/gui/assistant_new_project.py:226 msgid "Select a device" msgstr "Gerät wählen" #: ../lucioLib/gui/assistant_new_project.py:246 msgid "" " Other device.\n" "(Manual import)" msgstr " Anderes Gerät." #: ../lucioLib/gui/assistant_new_project.py:263 msgid "Images per second" msgstr "Bilder pro Sekunde" #. display project path #: ../lucioLib/gui/assistant_new_project.py:366 msgid "Project Path" msgstr "Pfad des Projektes" #: ../lucioLib/gui/assistant_new_project.py:375 msgid "Number of frames per seconds" msgstr "Anzahl Frames pro Sekunde" #. display Hardware type #: ../lucioLib/gui/assistant_new_project.py:379 msgid "Hardware type" msgstr "Hardwaretyp" #. webcam name #: ../lucioLib/gui/assistant_new_project.py:385 msgid "Webcam name" msgstr "Name der Webcam" #. webcam device #: ../lucioLib/gui/assistant_new_project.py:389 msgid "Webcam device" msgstr "Webcam" #. webcam resolution #: ../lucioLib/gui/assistant_new_project.py:393 msgid "Webcam resolution used" msgstr "benutzte Auflösung der Webcam" #. webcam device #: ../lucioLib/gui/assistant_new_project.py:399 msgid "Webcam driver used" msgstr "benutzter Treiber der Webcam" #. Final message #: ../lucioLib/gui/assistant_new_project.py:404 msgid "Have fun with luciole !" msgstr "Viel Spaß mit Luciole!" #: ../lucioLib/gui/assistant_new_project.py:434 msgid "Luciole project assistant" msgstr "Assistent für Luciole-Projekt" #: ../lucioLib/gui/assistant_new_project.py:445 msgid " Select a project path " msgstr " Pfad eines Projektes wählen " #: ../lucioLib/gui/assistant_new_project.py:454 msgid " Select hardware " msgstr " Hardware wählen " #: ../lucioLib/gui/assistant_new_project.py:464 msgid " Webcam detection " msgstr " Webcam suchen " #: ../lucioLib/gui/assistant_new_project.py:474 msgid " Project overview " msgstr " Übersicht des Projektes " #. create New button project #: ../lucioLib/gui/open_project_widget.py:50 msgid "Create a new project" msgstr "Neues Projekt erstellen" #. create open button project #: ../lucioLib/gui/open_project_widget.py:59 msgid "Open an existing project" msgstr "Vorhandenes Projekt öffnen" #: ../lucioLib/gui/webcam_detection_widget.py:98 msgid "Please wait for webcam detection" msgstr "Bitte auf Webcamsuche warten" #: ../lucioLib/gui/webcam_detection_widget.py:103 msgid "Webcam detection done" msgstr "Webcamsuche erledigt" #: ../lucioLib/gui/webcam_detection_widget.py:188 msgid "Detected webcam(s)" msgstr "Gefundene Webcam(s)" #: ../lucioLib/gui/webcam_detection_widget.py:192 msgid "No webcam detected" msgstr "Keine Webcam gefunden" #: ../lucioLib/gui/dialog.py:73 msgid "Select files to import" msgstr "Dateien zum Importieren auswählen" #: ../lucioLib/gui/dialog.py:114 msgid "Select a Folder" msgstr "Ordner wählen" #: ../lucioLib/luciole_constants.py:42 msgid "OTHER DEVICE" msgstr "ANDERES GERÄT" #: ../lucioLib/luciole_controller.py:152 msgid " Webcam data not valid in project. Please restart webcam detection" msgstr " Ungültige Webcamdaten. Bitte Erkennung der Webcam neu starten." #: ../lucioLib/luciole_controller.py:170 #, python-format msgid "Project %s saved" msgstr "Projekt %s gespeichert" #: ../lucioLib/luciole_controller.py:197 #, python-format msgid "Project saved as %s" msgstr "Projekt als %s gespeichert" #: ../lucioLib/luciole_controller.py:242 msgid "No files or valid files choosen for image import." msgstr "Keine (gültigen) Dateien zum Bildimportieren gewählt" #: ../lucioLib/luciole_controller.py:246 msgid "Impossible to import images when no project are loaded." msgstr "Bilder können nicht importiert werden wenn kein Porjekt geladen ist." #: ../lucioLib/luciole_controller.py:274 ../lucioLib/luciole_controller.py:282 msgid "Nothing to export. No project loaded" msgstr "Es kann nichts exportiert werden. Kein Projekt ist geladen" #. nbd@grape to transform as error message #: ../lucioLib/luciole_controller.py:324 msgid "Can not play animantion : No image on montage view " msgstr "" "Animation kann nicht abgespielt werden: Kein Bild auf der Schnittvorschau " #. nbd@grape to transform as error message #: ../lucioLib/luciole_controller.py:333 msgid "Can not play animantion : No project loaded " msgstr "Animation kann nicht abgespielt werden: Kein Projekt geladen " #. nbd@grape : ask for save if save set status as loaded #: ../lucioLib/luciole_controller.py:385 msgid "Save Project before closing" msgstr "Projekt vor Beenden abspeichern" #: ../lucioLib/luciole_controller.py:411 #, python-format msgid "Project %s is closed" msgstr "Projekt %s ist geschlossen" #. clear message status bar #: ../lucioLib/luciole_controller.py:432 msgid "Acquiring" msgstr "Erfassen" #. stop acquirer #: ../lucioLib/luciole_controller.py:449 msgid "" "No acquisition available. Use 'import image' button to load images in " "project." msgstr "" "Keine Erfassung vorhanden. Taste 'Bilder importieren' zum Laden von Bildern " "in ein Projekt benutzen." #: ../lucioLib/luciole_controller.py:461 msgid " Can not start acquisition when no project are loaded." msgstr " Erfassung kann nicht starten wenn kein Projekt geladen ist." #: ../lucioLib/luciole_controller.py:470 #, python-format msgid "Acquisition error. %s" msgstr "Fehler bei Erfassung. %s" #: ../lucioLib/luciole_controller.py:484 msgid "No Acquistion" msgstr "Keine Erfassung" #. nbd@grape : ask for save if save set status as loaded #: ../lucioLib/luciole_controller.py:573 msgid "Project modified. Save project before exit ?" msgstr "Projekt geändert. Projekt abspeichern vor Beenden?" #: ../lucioLib/luciole_controller.py:625 msgid "Please restart Luciole to take into account the new theme " msgstr "" "Bitte Luciole neu starten um das neue Motiv berücksichtigen zu können " #: ../lucioLib/luciole_controller.py:675 msgid "Failed to load project " msgstr "Fehler beim Laden des Projektes " #: ../lucioLib/lcl_export/lcl_export_video.py:94 msgid "Pass 1/2" msgstr "Durchlauf 1/2" #: ../lucioLib/lcl_export/lcl_export_video.py:103 msgid "Pass 2/2" msgstr "Durchlauf 2/2" #: ../lucioLib/lcl_export/lcl_export_video.py:210 msgid "Export Canceled" msgstr "Exportieren abgebrochen" #: ../lucioLib/lcl_export/lcl_export_video.py:569 #: ../lucioLib/lcl_export/lcl_export_video.py:605 #: ../lucioLib/lcl_export/lcl_export_video.py:632 #, python-format msgid "Unable to erase : %s" msgstr "Fehler beim Löschen: %s" #: ../lucioLib/lcl_export/lcl_export_video.py:621 #, python-format msgid "Creation of export folder not possible -- %s" msgstr "Erstellen des Exportordners unmöglich -- %s" #~ msgid "" #~ "DV format (raw DV)\n" #~ "Format DVD (mpeg2)\n" #~ "Format divx/xvid (avi)" #~ msgstr "" #~ "DV Format (raw DV)\n" #~ "DVD Format (mpeg2)\n" #~ "divx/xvid Format (avi)" #~ msgid "Transparency level" #~ msgstr "Transparenzniveau" #~ msgid "gtk-cancel" #~ msgstr "gtk-cancel" #~ msgid "gtk-close" #~ msgstr "gtk-close" #~ msgid "gtk-apply" #~ msgstr "gtk-apply" #~ msgid "About" #~ msgstr "Über" #~ msgid "Copyright 2009 Nicolas Bertrand /GRAPE" #~ msgstr "Copyright 2009 Nicolas Bertrand / GRAPE" #~ msgid "" #~ "Default\n" #~ "Tropical" #~ msgstr "" #~ "Standard\n" #~ "Tropical" #~ msgid "Project Properties" #~ msgstr "Eigenschaften des Projektes" #~ msgid "unknown video export command" #~ msgstr "unbekannter Befehl zum Exportieren von Videos" #~ msgid "Imposible to initialize player." #~ msgstr "Player kann nicht iniziiert werden." #~ msgid "Unable to erase" #~ msgstr "Löschen unmöglich" #~ msgid "rush folder not valid" #~ msgstr "ungültiger Rohfassungsordner" #, python-format #~ msgid "Not a file : %s" #~ msgstr "Keine Datei: %s" #, python-format #~ msgid "The project already %s exists !" #~ msgstr "Das Projekt %s gibt es!" #, python-format #~ msgid "Error, path does not exist : %s" #~ msgstr "Fehler - ungültiger Pfad: %s" #, python-format #~ msgid "" #~ "%s is not valid. Not valid project name. It should be a combination of " #~ "alphanumeric and '_' characters " #~ msgstr "" #~ "%s ist nicht gültig. Ungültiger Name. Sollte eine Kombination von " #~ "alphanumerischen und '_' Zeichen sein. " luciole_0.8.6/po/tr.po0000644000175000017500000003403311437126703013317 0ustar niconico# Turkish translation for luciole # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the luciole package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: luciole\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-02-07 22:05+0400\n" "PO-Revision-Date: 2010-02-07 15:18+0000\n" "Last-Translator: NicoInattendu \n" "Language-Team: Turkish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-02-08 04:47+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../ui/luciole.glade.h:1 msgid " " msgstr " " #: ../ui/luciole.glade.h:2 msgid " Export file name (without extension) :" msgstr " Ihracat dosya adı uzantısı (olmadan)" #: ../ui/luciole.glade.h:3 msgid "About Luciole" msgstr "Luciole Hakkında" #: ../ui/luciole.glade.h:4 msgid "Activate/Deactivate camera preview" msgstr "" #: ../ui/luciole.glade.h:5 msgid "Add Trash to montage view" msgstr "" #: ../ui/luciole.glade.h:6 msgid "Choose export format." msgstr "" #: ../ui/luciole.glade.h:7 msgid "Copyright 2009-2010 Nicolas Bertrand (nico@inattendu.org)" msgstr "" #: ../ui/luciole.glade.h:8 msgid "DV format (raw DV)" msgstr "" #: ../ui/luciole.glade.h:9 msgid "Default" msgstr "Öntanımlı" #: ../ui/luciole.glade.h:10 msgid "Export" msgstr "Dışarı aktar" #: ../ui/luciole.glade.h:11 msgid "Export path:" msgstr "Ihracat yolu:" #: ../ui/luciole.glade.h:12 msgid "Export video with sound." msgstr "" #: ../ui/luciole.glade.h:13 msgid "File format :" msgstr "" #: ../ui/luciole.glade.h:14 msgid "Format DVD (mpeg2)" msgstr "" #: ../ui/luciole.glade.h:15 msgid "Format divx/xvid (avi)" msgstr "" #: ../ui/luciole.glade.h:16 msgid "Image per seconds" msgstr "" #. Caller une image sur le flux video #: ../ui/luciole.glade.h:18 msgid "Import images" msgstr "" #: ../ui/luciole.glade.h:19 msgid "Luciole on line" msgstr "" #: ../ui/luciole.glade.h:20 msgid "Mixer" msgstr "Karıştırıcı" #. Descendre un/ou plusieurs images #: ../ui/luciole.glade.h:22 msgid "Move down one or several images" msgstr "" #. Déplacer des images capturées dans la zone de montage #: ../ui/luciole.glade.h:24 msgid "Move snapshot to montage area" msgstr "" #. Monter un/ou plusieurs images #: ../ui/luciole.glade.h:26 msgid "Move up one or several images" msgstr "" #: ../ui/luciole.glade.h:27 msgid "Open recent" msgstr "" #: ../ui/luciole.glade.h:28 msgid "Play video" msgstr "" #: ../ui/luciole.glade.h:29 msgid "Preferences" msgstr "Tercihler" #: ../ui/luciole.glade.h:30 ../lucioLib/gui/dialog_project_properties.py:101 msgid "Project properties" msgstr "Proje özellikleri" #: ../ui/luciole.glade.h:31 msgid "Select Theme" msgstr "Tema Seç" #: ../ui/luciole.glade.h:32 msgid "Select a Luciole project" msgstr "" #: ../ui/luciole.glade.h:33 ../ui/export_file.glade.h:11 #: ../lucioLib/gui/assistant_new_project.py:102 msgid "Select a folder" msgstr "Bir klasör seç" #: ../ui/luciole.glade.h:34 msgid "" "Stop-motion tool for making animated cartoon\n" "Makes live video acquistion from Webcam or DV cam" msgstr "" #: ../ui/luciole.glade.h:36 msgid "" "This program is free software; you can redistribute it and/or\n" "modify it under the terms of the GNU General Public License\n" "as published by the Free Software Foundation; either \n" "version 2 of the License, or (at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied \n" "warranty of MERCHANTABILITY or FITNESS FOR A \n" "PARTICULAR PURPOSE. See the GNU General Public \n" "License for more details.\n" "\n" "You should have received a copy of the GNU General Public\n" "License along with this program; if not, write to the \n" "Free Software Foundation, \n" "Inc., 59 Temple Place - \n" "Suite 330, Boston, MA 02111-1307, USA." msgstr "" #. Jeter à la poubelle #: ../ui/luciole.glade.h:53 msgid "To trash" msgstr "" #: ../ui/luciole.glade.h:54 msgid "Tool Export" msgstr "" #: ../ui/luciole.glade.h:55 msgid "Tropical" msgstr "" #: ../ui/luciole.glade.h:56 msgid "Video Export" msgstr "" #: ../ui/luciole.glade.h:57 msgid "_File" msgstr "_Dosya" #: ../ui/luciole.glade.h:58 msgid "_Help" msgstr "_Yardım" #: ../ui/luciole.glade.h:59 msgid "_View" msgstr "_Görünüm" #: ../ui/luciole.glade.h:60 msgid "make a snapshot" msgstr "" #: ../ui/luciole.glade.h:61 msgid "options" msgstr "seçenekler" #: ../ui/luciole.glade.h:62 msgid "project1" msgstr "proje1" #: ../ui/luciole.glade.h:63 msgid "project2" msgstr "proje2" #: ../ui/luciole.glade.h:64 msgid "project3" msgstr "proje3" #: ../ui/luciole.glade.h:65 msgid "project4" msgstr "proje4" #: ../ui/luciole.glade.h:66 msgid "project5" msgstr "proje5" #: ../ui/export_file.glade.h:1 msgid "Cinelerra" msgstr "" #: ../ui/export_file.glade.h:2 msgid "Coming soon" msgstr "" #: ../ui/export_file.glade.h:3 msgid "Export to Kdenlive" msgstr "" #: ../ui/export_file.glade.h:4 msgid "Export to another application" msgstr "" #: ../ui/export_file.glade.h:5 msgid "Export to cinelerra" msgstr "" #: ../ui/export_file.glade.h:6 msgid "Export to pitivi" msgstr "" #: ../ui/export_file.glade.h:7 msgid "Kdenlive" msgstr "" #: ../ui/export_file.glade.h:8 msgid "Openshot" msgstr "" #: ../ui/export_file.glade.h:9 msgid "Pitivi" msgstr "" #: ../ui/export_file.glade.h:10 msgid "Select a filename" msgstr "" #: ../ui/export_file.glade.h:12 msgid "Select an export directory" msgstr "" #: ../ui/export_file.glade.h:13 msgid "Tool Exporter" msgstr "" #: ../lucioLib/controller/controller_load_project.py:134 msgid "Project Load started" msgstr "" #: ../lucioLib/controller/controller_load_project.py:139 #, python-format msgid "Project %s is loaded" msgstr "" #: ../lucioLib/controller/controller_load_project.py:145 #, python-format msgid "Project %s is loading" msgstr "" #: ../lucioLib/controller/controller_import.py:177 msgid "Import started" msgstr "" #: ../lucioLib/controller/controller_import.py:182 msgid "All images imported" msgstr "" #: ../lucioLib/controller/controller_import.py:188 msgid "Importing images ..." msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:47 msgid "Project folder :" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:51 msgid "Project name :" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:55 msgid "XML file :" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:60 msgid "Number of frames / image" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:64 msgid "Device type" msgstr "Aygıt tipi" #: ../lucioLib/gui/dialog_project_properties.py:72 msgid "Device :" msgstr "Aygıt :" #: ../lucioLib/gui/dialog_project_properties.py:76 msgid "Webcam name :" msgstr "Web kamerası adı:" #: ../lucioLib/gui/dialog_project_properties.py:81 msgid "Video capture driver :" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:85 msgid "Video width :" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:89 msgid "Video height :" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:93 msgid "" "Webcam framerate \n" " (number of images per second)" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:206 #: ../lucioLib/gui/dialog_project_properties.py:222 msgid "desc" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:253 msgid "Webcam properties" msgstr "" #. #. Display Button fo webcam detetction #. #: ../lucioLib/gui/dialog_project_properties.py:282 msgid "Webcam detection" msgstr "" #: ../lucioLib/gui/luciole_export_window.py:174 #, python-format msgid "" "%s is not valid. Not valid video name. It should be a combination of " "alphanumeric and '_' characters " msgstr "" #. Launch Dialog window to ask if export file can be overide #. add message display #: ../lucioLib/gui/luciole_export_window.py:207 #: ../lucioLib/gui/luciole_export_tool_window.py:196 #, python-format msgid "File %s already exists. Replace file ?" msgstr "" #: ../lucioLib/gui/luciole_export_tool_window.py:115 msgid "Select an application and a file name for export" msgstr "" #. Terminated normaly #: ../lucioLib/gui/luciole_export_tool_window.py:209 #: ../lucioLib/lcl_export/lcl_export_video.py:207 msgid "Export Done" msgstr "" #. #. Initailize widgets for first page #. #. A label #: ../lucioLib/gui/assistant_new_project.py:59 msgid "" "This assistant will help you on configuration of a new Luciole project." msgstr "" #. A label #: ../lucioLib/gui/assistant_new_project.py:72 msgid "Select project name and destination folder." msgstr "" #. display project name #: ../lucioLib/gui/assistant_new_project.py:82 #: ../lucioLib/gui/assistant_new_project.py:362 msgid "Project Name" msgstr "Proje Adı" #: ../lucioLib/gui/assistant_new_project.py:95 msgid "Folder" msgstr "Klasör" #. project with same name alreday exists #: ../lucioLib/gui/assistant_new_project.py:167 #, python-format msgid "The project %s already exists !" msgstr "" #. invalid projetc name #: ../lucioLib/gui/assistant_new_project.py:171 #, python-format msgid "" "%s isn't a valid project name. It should be a combination of alphanumeric " "and '_' characters " msgstr "" #: ../lucioLib/gui/assistant_new_project.py:226 msgid "Select a device" msgstr "" #: ../lucioLib/gui/assistant_new_project.py:246 msgid "" " Other device.\n" "(Manual import)" msgstr "" #: ../lucioLib/gui/assistant_new_project.py:263 msgid "Images per second" msgstr "" #. display project path #: ../lucioLib/gui/assistant_new_project.py:366 msgid "Project Path" msgstr "" #: ../lucioLib/gui/assistant_new_project.py:375 msgid "Number of frames per seconds" msgstr "" #. display Hardware type #: ../lucioLib/gui/assistant_new_project.py:379 msgid "Hardware type" msgstr "" #. webcam name #: ../lucioLib/gui/assistant_new_project.py:385 msgid "Webcam name" msgstr "" #. webcam device #: ../lucioLib/gui/assistant_new_project.py:389 msgid "Webcam device" msgstr "" #. webcam resolution #: ../lucioLib/gui/assistant_new_project.py:393 msgid "Webcam resolution used" msgstr "" #. webcam device #: ../lucioLib/gui/assistant_new_project.py:399 msgid "Webcam driver used" msgstr "" #. Final message #: ../lucioLib/gui/assistant_new_project.py:404 msgid "Have fun with luciole !" msgstr "" #: ../lucioLib/gui/assistant_new_project.py:434 msgid "Luciole project assistant" msgstr "" #: ../lucioLib/gui/assistant_new_project.py:445 msgid " Select a project path " msgstr "" #: ../lucioLib/gui/assistant_new_project.py:454 msgid " Select hardware " msgstr "" #: ../lucioLib/gui/assistant_new_project.py:464 msgid " Webcam detection " msgstr "" #: ../lucioLib/gui/assistant_new_project.py:474 msgid " Project overview " msgstr "" #. create New button project #: ../lucioLib/gui/open_project_widget.py:50 msgid "Create a new project" msgstr "" #. create open button project #: ../lucioLib/gui/open_project_widget.py:59 msgid "Open an existing project" msgstr "" #: ../lucioLib/gui/webcam_detection_widget.py:98 msgid "Please wait for webcam detection" msgstr "" #: ../lucioLib/gui/webcam_detection_widget.py:103 msgid "Webcam detection done" msgstr "" #: ../lucioLib/gui/webcam_detection_widget.py:188 msgid "Detected webcam(s)" msgstr "" #: ../lucioLib/gui/webcam_detection_widget.py:192 msgid "No webcam detected" msgstr "" #: ../lucioLib/gui/dialog.py:73 msgid "Select files to import" msgstr "" #: ../lucioLib/gui/dialog.py:114 msgid "Select a Folder" msgstr "" #: ../lucioLib/luciole_constants.py:42 msgid "OTHER DEVICE" msgstr "" #: ../lucioLib/luciole_controller.py:154 msgid " Webcam data not valid in project. Please restart webcam detection" msgstr "" #: ../lucioLib/luciole_controller.py:171 #, python-format msgid "Project %s saved" msgstr "" #: ../lucioLib/luciole_controller.py:198 #, python-format msgid "Project saved as %s" msgstr "" #: ../lucioLib/luciole_controller.py:243 msgid "No files or valid files choosen for image import." msgstr "" #: ../lucioLib/luciole_controller.py:247 msgid "Impossible to import images when no project are loaded." msgstr "" #: ../lucioLib/luciole_controller.py:275 ../lucioLib/luciole_controller.py:283 msgid "Nothing to export. No project loaded" msgstr "" #. nbd@grape to transform as error message #: ../lucioLib/luciole_controller.py:325 msgid "Can not play animantion : No image on montage view " msgstr "" #. nbd@grape to transform as error message #: ../lucioLib/luciole_controller.py:334 msgid "Can not play animantion : No project loaded " msgstr "" #. nbd@grape : ask for save if save set status as loaded #: ../lucioLib/luciole_controller.py:386 msgid "Save Project before closing" msgstr "" #: ../lucioLib/luciole_controller.py:412 #, python-format msgid "Project %s is closed" msgstr "" #. clear message status bar #: ../lucioLib/luciole_controller.py:433 msgid "Acquiring" msgstr "" #. stop acquirer #: ../lucioLib/luciole_controller.py:450 msgid "" "No acquisition available. Use 'import image' button to load images in " "project." msgstr "" #: ../lucioLib/luciole_controller.py:462 msgid " Can not start acquisition when no project are loaded." msgstr "" #: ../lucioLib/luciole_controller.py:471 #, python-format msgid "Acquisition error. %s" msgstr "" #: ../lucioLib/luciole_controller.py:485 msgid "No Acquistion" msgstr "" #. nbd@grape : ask for save if save set status as loaded #: ../lucioLib/luciole_controller.py:574 msgid "Project modified. Save project before exit ?" msgstr "" #: ../lucioLib/luciole_controller.py:626 msgid "Please restart Luciole to take into account the new theme " msgstr "" #: ../lucioLib/luciole_controller.py:676 msgid "Failed to load project " msgstr "" #: ../lucioLib/lcl_export/lcl_export_video.py:94 msgid "Pass 1/2" msgstr "" #: ../lucioLib/lcl_export/lcl_export_video.py:103 msgid "Pass 2/2" msgstr "" #: ../lucioLib/lcl_export/lcl_export_video.py:210 msgid "Export Canceled" msgstr "" #: ../lucioLib/lcl_export/lcl_export_video.py:569 #: ../lucioLib/lcl_export/lcl_export_video.py:605 #: ../lucioLib/lcl_export/lcl_export_video.py:632 #, python-format msgid "Unable to erase : %s" msgstr "" #: ../lucioLib/lcl_export/lcl_export_video.py:621 #, python-format msgid "Creation of export folder not possible -- %s" msgstr "" luciole_0.8.6/po/ru.po0000644000175000017500000005055011437126703013322 0ustar niconico# Russian translation for luciole # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the luciole package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: luciole\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-02-14 16:37+0400\n" "PO-Revision-Date: 2010-08-11 13:04+0000\n" "Last-Translator: Maxim Strukov \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-08-12 04:10+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../ui/luciole.glade.h:1 msgid " " msgstr "" "Представляет собой пробел. Используйте пробел в соответствующей позиции " "перевода. " #: ../ui/luciole.glade.h:2 msgid " Export file name (without extension) :" msgstr " Имя файла для экспортирования (без расширения) :" #: ../ui/luciole.glade.h:3 msgid "About Luciole" msgstr "Сведения о Luciole" #: ../ui/luciole.glade.h:4 msgid "Activate/Deactivate camera preview" msgstr "Задействовать/отключить предпросмотр с камеры" #: ../ui/luciole.glade.h:5 msgid "Add Trash to montage view" msgstr "Добавить корзину для режима монтажа" #: ../ui/luciole.glade.h:6 msgid "Choose export format." msgstr "Формат для экспорта." #: ../ui/luciole.glade.h:7 msgid "Copyright 2009-2010 Nicolas Bertrand (nico@inattendu.org)" msgstr "" #: ../ui/luciole.glade.h:8 msgid "DV format (raw DV)" msgstr "DV формат (raw DV)" #: ../ui/luciole.glade.h:9 msgid "Default" msgstr "По умолчанию" #: ../ui/luciole.glade.h:10 msgid "Export" msgstr "Экспортировать" #: ../ui/luciole.glade.h:11 msgid "Export path:" msgstr "Размещение экспортирования:" #: ../ui/luciole.glade.h:12 msgid "Export video with sound." msgstr "Экспортировать видео со звуком" #: ../ui/luciole.glade.h:13 msgid "File format :" msgstr "Формат файла :" #: ../ui/luciole.glade.h:14 msgid "Format DVD (mpeg2)" msgstr "Формат DVD (mpeg2)" #: ../ui/luciole.glade.h:15 msgid "Format divx/xvid (avi)" msgstr "Формат divx/xvid (avi)" #: ../ui/luciole.glade.h:16 msgid "Image per seconds" msgstr "Картинок в секунду" #. Caller une image sur le flux video #: ../ui/luciole.glade.h:18 msgid "Import images" msgstr "Импортировать картинки" #: ../ui/luciole.glade.h:19 msgid "Luciole on line" msgstr "Luciole онлайн" #: ../ui/luciole.glade.h:20 msgid "Mixer" msgstr "Микшер" #. Descendre un/ou plusieurs images #: ../ui/luciole.glade.h:22 msgid "Move down one or several images" msgstr "Переместить вниз одну или несколько картинок" #. Déplacer des images capturées dans la zone de montage #: ../ui/luciole.glade.h:24 msgid "Move snapshot to montage area" msgstr "Переместить снимок в область монтажа" #. Monter un/ou plusieurs images #: ../ui/luciole.glade.h:26 msgid "Move up one or several images" msgstr "Переместить вверх одну или несколько картинок" #: ../ui/luciole.glade.h:27 msgid "Open recent" msgstr "Открыть недавние" #: ../ui/luciole.glade.h:28 msgid "Play video" msgstr "Воспроизвести видеофрагмент" #: ../ui/luciole.glade.h:29 msgid "Preferences" msgstr "Параметры" #: ../ui/luciole.glade.h:30 ../lucioLib/gui/dialog_project_properties.py:105 msgid "Project properties" msgstr "Свойства проекта" #: ../ui/luciole.glade.h:31 msgid "Select Theme" msgstr "Выберите тему" #: ../ui/luciole.glade.h:32 msgid "Select a Luciole project" msgstr "Выберите проект Luciole" #: ../ui/luciole.glade.h:33 ../ui/export_file.glade.h:11 #: ../lucioLib/gui/assistant_new_project.py:102 msgid "Select a folder" msgstr "Выберите каталог" #: ../ui/luciole.glade.h:34 msgid "" "Stop-motion tool for making animated cartoon\n" "Makes live video acquistion from Webcam or DV cam" msgstr "" "Инструмент стоп-кадр, для создания анимированных фрагментов\n" "Записывает видео-поток с вэб-камеры или DV-камеры" #: ../ui/luciole.glade.h:36 msgid "" "This program is free software; you can redistribute it and/or\n" "modify it under the terms of the GNU General Public License\n" "as published by the Free Software Foundation; either \n" "version 2 of the License, or (at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied \n" "warranty of MERCHANTABILITY or FITNESS FOR A \n" "PARTICULAR PURPOSE. See the GNU General Public \n" "License for more details.\n" "\n" "You should have received a copy of the GNU General Public\n" "License along with this program; if not, write to the \n" "Free Software Foundation, \n" "Inc., 59 Temple Place - \n" "Suite 330, Boston, MA 02111-1307, USA." msgstr "" #. Jeter à la poubelle #: ../ui/luciole.glade.h:53 msgid "To trash" msgstr "В корзину." #: ../ui/luciole.glade.h:54 msgid "Tool Export" msgstr "Инструмент экспортирования" #: ../ui/luciole.glade.h:55 msgid "Tropical" msgstr "Тропический" #: ../ui/luciole.glade.h:56 msgid "Video Export" msgstr "Экспортирование видео" #: ../ui/luciole.glade.h:57 msgid "_File" msgstr "_Файл" #: ../ui/luciole.glade.h:58 msgid "_Help" msgstr "_Справка" #: ../ui/luciole.glade.h:59 msgid "_View" msgstr "_Вид" #: ../ui/luciole.glade.h:60 msgid "make a snapshot" msgstr "создать снимок" #: ../ui/luciole.glade.h:61 msgid "options" msgstr "параметры" #: ../ui/luciole.glade.h:62 msgid "project1" msgstr "проект1" #: ../ui/luciole.glade.h:63 msgid "project2" msgstr "проект2" #: ../ui/luciole.glade.h:64 msgid "project3" msgstr "проект3" #: ../ui/luciole.glade.h:65 msgid "project4" msgstr "проект4" #: ../ui/luciole.glade.h:66 msgid "project5" msgstr "проект5" #: ../ui/export_file.glade.h:1 msgid "Cinelerra" msgstr "" #: ../ui/export_file.glade.h:2 msgid "Coming soon" msgstr "В разработке" #: ../ui/export_file.glade.h:3 msgid "Export to Kdenlive" msgstr "Экспортировать в Kdenlive" #: ../ui/export_file.glade.h:4 msgid "Export to another application" msgstr "Экспортировать в другое приложение" #: ../ui/export_file.glade.h:5 msgid "Export to cinelerra" msgstr "Экспортировать в cinelerra" #: ../ui/export_file.glade.h:6 msgid "Export to pitivi" msgstr "Экспортировать в pitivi" #: ../ui/export_file.glade.h:7 msgid "Kdenlive" msgstr "" #: ../ui/export_file.glade.h:8 msgid "Openshot" msgstr "" #: ../ui/export_file.glade.h:9 msgid "Pitivi" msgstr "" #: ../ui/export_file.glade.h:10 msgid "Select a filename" msgstr "Выберите имя файла" #: ../ui/export_file.glade.h:12 msgid "Select an export directory" msgstr "Выберите каталог экспортирования" #: ../ui/export_file.glade.h:13 msgid "Tool Exporter" msgstr "Инструмент экспортирования" #: ../lucioLib/controller/controller_load_project.py:134 msgid "Project Load started" msgstr "Запущена загрузка проекта" #: ../lucioLib/controller/controller_load_project.py:139 #, python-format msgid "Project %s is loaded" msgstr "Проект %s загружен" #: ../lucioLib/controller/controller_load_project.py:145 #, python-format msgid "Project %s is loading" msgstr "Проект %s загружается" #: ../lucioLib/controller/controller_import.py:177 msgid "Import started" msgstr "Запущено импортирование" #: ../lucioLib/controller/controller_import.py:182 msgid "All images imported" msgstr "Все картинки импортированы" #: ../lucioLib/controller/controller_import.py:188 msgid "Importing images ..." msgstr "Импортирование картинок ..." #: ../lucioLib/gui/dialog_project_properties.py:51 msgid "Project folder :" msgstr "Каталог проекта:" #: ../lucioLib/gui/dialog_project_properties.py:55 msgid "Project name :" msgstr "Имя проекта:" #: ../lucioLib/gui/dialog_project_properties.py:59 msgid "XML file :" msgstr "Файл XML :" #: ../lucioLib/gui/dialog_project_properties.py:64 msgid "Number of frames / image" msgstr "Количество кадров / картинок" #: ../lucioLib/gui/dialog_project_properties.py:68 msgid "Device type" msgstr "Тип устройства" #: ../lucioLib/gui/dialog_project_properties.py:76 msgid "Device :" msgstr "Устройство :" #: ../lucioLib/gui/dialog_project_properties.py:80 msgid "Webcam name :" msgstr "Название вэб-камеры :" #: ../lucioLib/gui/dialog_project_properties.py:85 msgid "Video capture driver :" msgstr "Драйвер записи видео-потока:" #: ../lucioLib/gui/dialog_project_properties.py:89 msgid "Video width :" msgstr "Ширина видео :" #: ../lucioLib/gui/dialog_project_properties.py:93 msgid "Video height :" msgstr "Высотка видео:" #: ../lucioLib/gui/dialog_project_properties.py:97 msgid "" "Webcam framerate \n" " (number of images per second)" msgstr "" "Частота кадров вэб-камеры\n" " (количество картинок в секунду)" #: ../lucioLib/gui/dialog_project_properties.py:213 #: ../lucioLib/gui/dialog_project_properties.py:229 msgid "desc" msgstr "описание" #: ../lucioLib/gui/dialog_project_properties.py:271 msgid "Webcam properties" msgstr "Свойства вэб-камеры" #. #. Display Button fo webcam detetction #. #: ../lucioLib/gui/dialog_project_properties.py:300 msgid "Webcam detection" msgstr "Поиск вэб-камеры" #: ../lucioLib/gui/luciole_export_window.py:174 #, python-format msgid "" "%s is not valid. Not valid video name. It should be a combination of " "alphanumeric and '_' characters " msgstr "" "%s не является правильным. Неправильное имя видео. Оно должно содержать " "букво-циферную последовательность '_' символов " #. Launch Dialog window to ask if export file can be overide #. add message display #: ../lucioLib/gui/luciole_export_window.py:207 #: ../lucioLib/gui/luciole_export_tool_window.py:196 #, python-format msgid "File %s already exists. Replace file ?" msgstr "Файл %s уже существует. Заменить его ?" #: ../lucioLib/gui/luciole_export_tool_window.py:115 msgid "Select an application and a file name for export" msgstr "Выберите приложение и имя файла для экспортирования" #. Terminated normaly #: ../lucioLib/gui/luciole_export_tool_window.py:209 #: ../lucioLib/lcl_export/lcl_export_video.py:207 msgid "Export Done" msgstr "Экспортирование завершено" #. #. Initailize widgets for first page #. #. A label #: ../lucioLib/gui/assistant_new_project.py:59 msgid "" "This assistant will help you on configuration of a new Luciole project." msgstr "Этот мастер поможет вам настроить новый проект Luciole." #. A label #: ../lucioLib/gui/assistant_new_project.py:72 msgid "Select project name and destination folder." msgstr "Выберите имя проекта и папку назначения." #. display project name #: ../lucioLib/gui/assistant_new_project.py:82 #: ../lucioLib/gui/assistant_new_project.py:362 msgid "Project Name" msgstr "Название проекта" #: ../lucioLib/gui/assistant_new_project.py:95 msgid "Folder" msgstr "Каталог" #. project with same name alreday exists #: ../lucioLib/gui/assistant_new_project.py:167 #, python-format msgid "The project %s already exists !" msgstr "Проект %s уже существует !" #. invalid projetc name #: ../lucioLib/gui/assistant_new_project.py:171 #, python-format msgid "" "%s isn't a valid project name. It should be a combination of alphanumeric " "and '_' characters " msgstr "" "%s неправильное имя проекта. Оно должно состоять из буквенно-цифровых '_' " "символов " #: ../lucioLib/gui/assistant_new_project.py:226 msgid "Select a device" msgstr "Выберите устройство" #: ../lucioLib/gui/assistant_new_project.py:246 msgid "" " Other device.\n" "(Manual import)" msgstr "" " Другое устройство.\n" "(Самостоятельное импортирование)" #: ../lucioLib/gui/assistant_new_project.py:263 msgid "Images per second" msgstr "Картинок в секунду" #. display project path #: ../lucioLib/gui/assistant_new_project.py:366 msgid "Project Path" msgstr "Размещение проекта" #: ../lucioLib/gui/assistant_new_project.py:375 msgid "Number of frames per seconds" msgstr "Количество кадров в секунду" #. display Hardware type #: ../lucioLib/gui/assistant_new_project.py:379 msgid "Hardware type" msgstr "Тип устройства" #. webcam name #: ../lucioLib/gui/assistant_new_project.py:385 msgid "Webcam name" msgstr "Название вэб-камеры" #. webcam device #: ../lucioLib/gui/assistant_new_project.py:389 msgid "Webcam device" msgstr "Вэб-камера" #. webcam resolution #: ../lucioLib/gui/assistant_new_project.py:393 msgid "Webcam resolution used" msgstr "Используемое вэб-камерой разрешение" #. webcam device #: ../lucioLib/gui/assistant_new_project.py:399 msgid "Webcam driver used" msgstr "Используемый вэб-камерой драйвер" #. Final message #: ../lucioLib/gui/assistant_new_project.py:404 msgid "Have fun with luciole !" msgstr "Веселитесь вместе с luciole !" #: ../lucioLib/gui/assistant_new_project.py:434 msgid "Luciole project assistant" msgstr "Мастер проекта Luciole" #: ../lucioLib/gui/assistant_new_project.py:445 msgid " Select a project path " msgstr " Выберите размещение проекта " #: ../lucioLib/gui/assistant_new_project.py:454 msgid " Select hardware " msgstr " Выберите устройство " #: ../lucioLib/gui/assistant_new_project.py:464 msgid " Webcam detection " msgstr " Поиск вэб-камеры " #: ../lucioLib/gui/assistant_new_project.py:474 msgid " Project overview " msgstr " Обзор проекта " #. create New button project #: ../lucioLib/gui/open_project_widget.py:50 msgid "Create a new project" msgstr "Создать новый проект" #. create open button project #: ../lucioLib/gui/open_project_widget.py:59 msgid "Open an existing project" msgstr "Открыть существующий проект" #: ../lucioLib/gui/webcam_detection_widget.py:98 msgid "Please wait for webcam detection" msgstr "Пожалуйста, подождите идет поиск вэб-камеры" #: ../lucioLib/gui/webcam_detection_widget.py:103 msgid "Webcam detection done" msgstr "Поиск вэб-камеры завершён" #: ../lucioLib/gui/webcam_detection_widget.py:188 msgid "Detected webcam(s)" msgstr "Определена(ы) вэб-камера(ы)" #: ../lucioLib/gui/webcam_detection_widget.py:192 msgid "No webcam detected" msgstr "Вэб-камера не обнаружена" #: ../lucioLib/gui/dialog.py:73 msgid "Select files to import" msgstr "Выберите файлы для импортирования" #: ../lucioLib/gui/dialog.py:114 msgid "Select a Folder" msgstr "Выберите каталог" #: ../lucioLib/luciole_constants.py:42 msgid "OTHER DEVICE" msgstr "ДРУГОЕ УСТРОЙСТВО" #: ../lucioLib/luciole_controller.py:154 msgid " Webcam data not valid in project. Please restart webcam detection" msgstr "" " В проекте неправильные данные вэб-камеры. Пожалуйста, перезапустите поиск " "вэб-камеры" #: ../lucioLib/luciole_controller.py:171 #, python-format msgid "Project %s saved" msgstr "Проект %s сохранён" #: ../lucioLib/luciole_controller.py:198 #, python-format msgid "Project saved as %s" msgstr "Проект сохранён как %s" #: ../lucioLib/luciole_controller.py:243 msgid "No files or valid files choosen for image import." msgstr "" "Не выбраны или выбраны неправильные файлы для импортирования картинок." #: ../lucioLib/luciole_controller.py:247 msgid "Impossible to import images when no project are loaded." msgstr "Невозможно импортировать картинки, если проект не загружен." #: ../lucioLib/luciole_controller.py:275 ../lucioLib/luciole_controller.py:283 msgid "Nothing to export. No project loaded" msgstr "Нечего экспортировать. Проект не загружен." #. nbd@grape to transform as error message #: ../lucioLib/luciole_controller.py:325 msgid "Can not play animantion : No image on montage view " msgstr "Невозможно воспроизвести анимацию : Нет картинки в режиме монтажа " #. nbd@grape to transform as error message #: ../lucioLib/luciole_controller.py:334 msgid "Can not play animantion : No project loaded " msgstr "Невозможно воспроизвести анимацию : Проект не загружен " #. nbd@grape : ask for save if save set status as loaded #: ../lucioLib/luciole_controller.py:386 msgid "Save Project before closing" msgstr "Сохранить проект перед закрытием" #: ../lucioLib/luciole_controller.py:412 #, python-format msgid "Project %s is closed" msgstr "Проект %s закрыт" #. clear message status bar #: ../lucioLib/luciole_controller.py:433 msgid "Acquiring" msgstr "Получение" #. stop acquirer #: ../lucioLib/luciole_controller.py:450 msgid "" "No acquisition available. Use 'import image' button to load images in " "project." msgstr "" "Получение недоступно. Используйте кнопку 'импортировать картинку' для " "загрузки картинок в проект." #: ../lucioLib/luciole_controller.py:462 msgid " Can not start acquisition when no project are loaded." msgstr " Невозможно получить, так как проект не загружен." #: ../lucioLib/luciole_controller.py:471 #, python-format msgid "Acquisition error. %s" msgstr "Ошибка получения. %s" #: ../lucioLib/luciole_controller.py:485 msgid "No Acquistion" msgstr "Нечего получать" #. nbd@grape : ask for save if save set status as loaded #: ../lucioLib/luciole_controller.py:574 msgid "Project modified. Save project before exit ?" msgstr "Проект изменён. Сохранить проект перед выходом ?" #: ../lucioLib/luciole_controller.py:626 msgid "Please restart Luciole to take into account the new theme " msgstr "" "Пожалуйста, перезапустите Luciole для добавления к учетной записи новой темы " #: ../lucioLib/luciole_controller.py:676 msgid "Failed to load project " msgstr "Ошибка загрузки проекта " #: ../lucioLib/lcl_export/lcl_export_video.py:94 msgid "Pass 1/2" msgstr "Проход 1/2" #: ../lucioLib/lcl_export/lcl_export_video.py:103 msgid "Pass 2/2" msgstr "Проход 2/2" #: ../lucioLib/lcl_export/lcl_export_video.py:210 msgid "Export Canceled" msgstr "Экспортирование отменено" #: ../lucioLib/lcl_export/lcl_export_video.py:569 #: ../lucioLib/lcl_export/lcl_export_video.py:605 #: ../lucioLib/lcl_export/lcl_export_video.py:632 #, python-format msgid "Unable to erase : %s" msgstr "Невозможно стереть : %s" #: ../lucioLib/lcl_export/lcl_export_video.py:621 #, python-format msgid "Creation of export folder not possible -- %s" msgstr "Создание папки экспортирования невозможно -- %s" #: ../lucioLib/luciole_manage_recent.py:95 #, python-format msgid "Project %s no more exist" msgstr "Проект %s не существует" luciole_0.8.6/po/pt.po0000644000175000017500000004472111437126703013322 0ustar niconico# Portuguese translation for luciole # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the luciole package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: luciole\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-02-14 16:37+0400\n" "PO-Revision-Date: 2010-05-07 20:54+0000\n" "Last-Translator: Hugo Ferreira \n" "Language-Team: Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-05-20 05:29+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../ui/luciole.glade.h:1 msgid " " msgstr " " #: ../ui/luciole.glade.h:2 msgid " Export file name (without extension) :" msgstr " Nome do ficheiro a exportar (sem extensão) :" #: ../ui/luciole.glade.h:3 msgid "About Luciole" msgstr "Sobre o Luciole" #: ../ui/luciole.glade.h:4 msgid "Activate/Deactivate camera preview" msgstr "Activar/Desactivar pré-visualização da câmara" #: ../ui/luciole.glade.h:5 msgid "Add Trash to montage view" msgstr "Adicionar Lixo à visão de montagem" #: ../ui/luciole.glade.h:6 msgid "Choose export format." msgstr "Escolher formato de exportação." #: ../ui/luciole.glade.h:7 msgid "Copyright 2009-2010 Nicolas Bertrand (nico@inattendu.org)" msgstr "Copyright 2009-2010 Nicolas Bertrand (nico@inattendu.org)" #: ../ui/luciole.glade.h:8 msgid "DV format (raw DV)" msgstr "Formato DV (raw DV)" #: ../ui/luciole.glade.h:9 msgid "Default" msgstr "Predefinição" #: ../ui/luciole.glade.h:10 msgid "Export" msgstr "Exportar" #: ../ui/luciole.glade.h:11 msgid "Export path:" msgstr "Caminho de exportação:" #: ../ui/luciole.glade.h:12 msgid "Export video with sound." msgstr "Exportar vídeo com som." #: ../ui/luciole.glade.h:13 msgid "File format :" msgstr "Formato de ficheiro :" #: ../ui/luciole.glade.h:14 msgid "Format DVD (mpeg2)" msgstr "Formato DVD (mpeg2)" #: ../ui/luciole.glade.h:15 msgid "Format divx/xvid (avi)" msgstr "Formato divx/xvid (avi)" #: ../ui/luciole.glade.h:16 msgid "Image per seconds" msgstr "Imagens por segundos" #. Caller une image sur le flux video #: ../ui/luciole.glade.h:18 msgid "Import images" msgstr "Importar imagens" #: ../ui/luciole.glade.h:19 msgid "Luciole on line" msgstr "Página web do Luciole" #: ../ui/luciole.glade.h:20 msgid "Mixer" msgstr "Misturador" #. Descendre un/ou plusieurs images #: ../ui/luciole.glade.h:22 msgid "Move down one or several images" msgstr "Descer uma ou várias imagens" #. Déplacer des images capturées dans la zone de montage #: ../ui/luciole.glade.h:24 msgid "Move snapshot to montage area" msgstr "Mover imagem capturada para área de montagem" #. Monter un/ou plusieurs images #: ../ui/luciole.glade.h:26 msgid "Move up one or several images" msgstr "Subir uma ou várias imagens" #: ../ui/luciole.glade.h:27 msgid "Open recent" msgstr "Aberto recentemente" #: ../ui/luciole.glade.h:28 msgid "Play video" msgstr "Reproduzir vídeo" #: ../ui/luciole.glade.h:29 msgid "Preferences" msgstr "Preferências" #: ../ui/luciole.glade.h:30 ../lucioLib/gui/dialog_project_properties.py:105 msgid "Project properties" msgstr "Propriedades do Projecto" #: ../ui/luciole.glade.h:31 msgid "Select Theme" msgstr "Seleccionar Tema" #: ../ui/luciole.glade.h:32 msgid "Select a Luciole project" msgstr "Seleccionar um projecto Luciole" #: ../ui/luciole.glade.h:33 ../ui/export_file.glade.h:11 #: ../lucioLib/gui/assistant_new_project.py:102 msgid "Select a folder" msgstr "Seleccionar uma pasta" #: ../ui/luciole.glade.h:34 msgid "" "Stop-motion tool for making animated cartoon\n" "Makes live video acquistion from Webcam or DV cam" msgstr "" "Ferramenta stop-motion para criar animações\n" "Captura de vídeo em tempo real a partir de Webcam ou DV cam" #: ../ui/luciole.glade.h:36 msgid "" "This program is free software; you can redistribute it and/or\n" "modify it under the terms of the GNU General Public License\n" "as published by the Free Software Foundation; either \n" "version 2 of the License, or (at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied \n" "warranty of MERCHANTABILITY or FITNESS FOR A \n" "PARTICULAR PURPOSE. See the GNU General Public \n" "License for more details.\n" "\n" "You should have received a copy of the GNU General Public\n" "License along with this program; if not, write to the \n" "Free Software Foundation, \n" "Inc., 59 Temple Place - \n" "Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Este programa é Software Livre: pode redistribuí-lo e/ou\n" "modificá-lo sob os termos da GNU General Public License\n" "tal como publicada pela Free Software Foundation, na \n" "versão 2 da Licença ou (opção sua) em qualquer versão posterior.\n" "\n" "Este programa é distribuído na esperança de que será útil,\n" "mas SEM QUALQUER GARANTIA; nem mesmo a garantia \n" "implícita de COMERCIALIZAÇÃO ou ADEQUAÇÃO A UM\n" "DETERMINADO PROPÓSITO. Consulte a GNU General\n" "Public License para mais detalhes.\n" "\n" "Deverá ter recebido uma cópia da GNU General Public\n" "License juntamente com este programa. Caso contrário, escreva à\n" "Free Software Foundation, \n" "Inc., 59 Temple Place - \n" "Suite 330, Boston, MA 02111-1307, USA." #. Jeter à la poubelle #: ../ui/luciole.glade.h:53 msgid "To trash" msgstr "Para o lixo" #: ../ui/luciole.glade.h:54 msgid "Tool Export" msgstr "Ferramenta de exportação" #: ../ui/luciole.glade.h:55 msgid "Tropical" msgstr "Tropical" #: ../ui/luciole.glade.h:56 msgid "Video Export" msgstr "Exportação de Vídeo" #: ../ui/luciole.glade.h:57 msgid "_File" msgstr "_Ficheiro" #: ../ui/luciole.glade.h:58 msgid "_Help" msgstr "_Ajuda" #: ../ui/luciole.glade.h:59 msgid "_View" msgstr "_Visualizar" #: ../ui/luciole.glade.h:60 msgid "make a snapshot" msgstr "capturar imagem" #: ../ui/luciole.glade.h:61 msgid "options" msgstr "opções" #: ../ui/luciole.glade.h:62 msgid "project1" msgstr "projecto1" #: ../ui/luciole.glade.h:63 msgid "project2" msgstr "projecto2" #: ../ui/luciole.glade.h:64 msgid "project3" msgstr "projecto3" #: ../ui/luciole.glade.h:65 msgid "project4" msgstr "projecto4" #: ../ui/luciole.glade.h:66 msgid "project5" msgstr "projecto5" #: ../ui/export_file.glade.h:1 msgid "Cinelerra" msgstr "Cinelerra" #: ../ui/export_file.glade.h:2 msgid "Coming soon" msgstr "Brevemente" #: ../ui/export_file.glade.h:3 msgid "Export to Kdenlive" msgstr "Exportar para Kdenlive" #: ../ui/export_file.glade.h:4 msgid "Export to another application" msgstr "Exportar para outra aplicação" #: ../ui/export_file.glade.h:5 msgid "Export to cinelerra" msgstr "Exportar para Cinelerra" #: ../ui/export_file.glade.h:6 msgid "Export to pitivi" msgstr "Exportar para PiTiVi" #: ../ui/export_file.glade.h:7 msgid "Kdenlive" msgstr "Kdenlive" #: ../ui/export_file.glade.h:8 msgid "Openshot" msgstr "Openshot" #: ../ui/export_file.glade.h:9 msgid "Pitivi" msgstr "PiTiVi" #: ../ui/export_file.glade.h:10 msgid "Select a filename" msgstr "Seleccionar um nome de ficheiro" #: ../ui/export_file.glade.h:12 msgid "Select an export directory" msgstr "Seleccionar uma pasta para exportação" #: ../ui/export_file.glade.h:13 msgid "Tool Exporter" msgstr "Ferramenta de exportação" #: ../lucioLib/controller/controller_load_project.py:134 msgid "Project Load started" msgstr "Carregamento do Projecto iniciado" #: ../lucioLib/controller/controller_load_project.py:139 #, python-format msgid "Project %s is loaded" msgstr "Projecto %s está carregado" #: ../lucioLib/controller/controller_load_project.py:145 #, python-format msgid "Project %s is loading" msgstr "Projecto %s a carregar" #: ../lucioLib/controller/controller_import.py:177 msgid "Import started" msgstr "Importação iniciada" #: ../lucioLib/controller/controller_import.py:182 msgid "All images imported" msgstr "Todas as imagens importadas" #: ../lucioLib/controller/controller_import.py:188 msgid "Importing images ..." msgstr "Importando imagens ..." #: ../lucioLib/gui/dialog_project_properties.py:51 msgid "Project folder :" msgstr "Pasta do Projecto :" #: ../lucioLib/gui/dialog_project_properties.py:55 msgid "Project name :" msgstr "Nome do Projecto :" #: ../lucioLib/gui/dialog_project_properties.py:59 msgid "XML file :" msgstr "Ficheiro XML :" #: ../lucioLib/gui/dialog_project_properties.py:64 msgid "Number of frames / image" msgstr "Número de frames / imagem" #: ../lucioLib/gui/dialog_project_properties.py:68 msgid "Device type" msgstr "Tipo de dispositivo" #: ../lucioLib/gui/dialog_project_properties.py:76 msgid "Device :" msgstr "Dispositivo :" #: ../lucioLib/gui/dialog_project_properties.py:80 msgid "Webcam name :" msgstr "Nome da Webcam :" #: ../lucioLib/gui/dialog_project_properties.py:85 msgid "Video capture driver :" msgstr "Controlador de captura vídeo :" #: ../lucioLib/gui/dialog_project_properties.py:89 msgid "Video width :" msgstr "Largura do vídeo :" #: ../lucioLib/gui/dialog_project_properties.py:93 msgid "Video height :" msgstr "Altura do vídeo :" #: ../lucioLib/gui/dialog_project_properties.py:97 msgid "" "Webcam framerate \n" " (number of images per second)" msgstr "" "Frames por segundo da Webcam \n" " (número de imagens por segundo)" #: ../lucioLib/gui/dialog_project_properties.py:213 #: ../lucioLib/gui/dialog_project_properties.py:229 msgid "desc" msgstr "desc" #: ../lucioLib/gui/dialog_project_properties.py:271 msgid "Webcam properties" msgstr "Propriedades da webcam" #. #. Display Button fo webcam detetction #. #: ../lucioLib/gui/dialog_project_properties.py:300 msgid "Webcam detection" msgstr "Detecção da webcam" #: ../lucioLib/gui/luciole_export_window.py:174 #, python-format msgid "" "%s is not valid. Not valid video name. It should be a combination of " "alphanumeric and '_' characters " msgstr "" "%s não é válido. Nome do vídeo não é válido. Deverá ser uma combinação de " "caracteres alfanuméricos e '_' " #. Launch Dialog window to ask if export file can be overide #. add message display #: ../lucioLib/gui/luciole_export_window.py:207 #: ../lucioLib/gui/luciole_export_tool_window.py:196 #, python-format msgid "File %s already exists. Replace file ?" msgstr "Ficheiro %s já existe. Substituir ficheiro ?" #: ../lucioLib/gui/luciole_export_tool_window.py:115 msgid "Select an application and a file name for export" msgstr "Seleccionar uma aplicação e um nome de ficheiro para exportar" #. Terminated normaly #: ../lucioLib/gui/luciole_export_tool_window.py:209 #: ../lucioLib/lcl_export/lcl_export_video.py:207 msgid "Export Done" msgstr "Exportação Concluída" #. #. Initailize widgets for first page #. #. A label #: ../lucioLib/gui/assistant_new_project.py:59 msgid "" "This assistant will help you on configuration of a new Luciole project." msgstr "" "Este assistente irá ajudá-lo a configurar um novo projecto no Luciole." #. A label #: ../lucioLib/gui/assistant_new_project.py:72 msgid "Select project name and destination folder." msgstr "Seleccionar um nome para o projecto e uma pasta de destino." #. display project name #: ../lucioLib/gui/assistant_new_project.py:82 #: ../lucioLib/gui/assistant_new_project.py:362 msgid "Project Name" msgstr "Nome do Projecto" #: ../lucioLib/gui/assistant_new_project.py:95 msgid "Folder" msgstr "Pasta" #. project with same name alreday exists #: ../lucioLib/gui/assistant_new_project.py:167 #, python-format msgid "The project %s already exists !" msgstr "O projecto %s já existe !" #. invalid projetc name #: ../lucioLib/gui/assistant_new_project.py:171 #, python-format msgid "" "%s isn't a valid project name. It should be a combination of alphanumeric " "and '_' characters " msgstr "" "%s não é um nome de projecto válido. Deverá ser uma combinação de caracteres " "alfanuméricos e '_' " #: ../lucioLib/gui/assistant_new_project.py:226 msgid "Select a device" msgstr "Seleccionar um dispositivo" #: ../lucioLib/gui/assistant_new_project.py:246 msgid "" " Other device.\n" "(Manual import)" msgstr "" " Outro dispositivo.\n" "(Importação manual)" #: ../lucioLib/gui/assistant_new_project.py:263 msgid "Images per second" msgstr "Imagens por segundo" #. display project path #: ../lucioLib/gui/assistant_new_project.py:366 msgid "Project Path" msgstr "Caminho do Projecto" #: ../lucioLib/gui/assistant_new_project.py:375 msgid "Number of frames per seconds" msgstr "Número de frames por segundos" #. display Hardware type #: ../lucioLib/gui/assistant_new_project.py:379 msgid "Hardware type" msgstr "Tipo de hardware" #. webcam name #: ../lucioLib/gui/assistant_new_project.py:385 msgid "Webcam name" msgstr "Nome da webcam" #. webcam device #: ../lucioLib/gui/assistant_new_project.py:389 msgid "Webcam device" msgstr "Dispositivo webcam" #. webcam resolution #: ../lucioLib/gui/assistant_new_project.py:393 msgid "Webcam resolution used" msgstr "Resolução de webcam utilizada" #. webcam device #: ../lucioLib/gui/assistant_new_project.py:399 msgid "Webcam driver used" msgstr "Controlador de webcam utilizado" #. Final message #: ../lucioLib/gui/assistant_new_project.py:404 msgid "Have fun with luciole !" msgstr "Divirta-se com o Luciole !" #: ../lucioLib/gui/assistant_new_project.py:434 msgid "Luciole project assistant" msgstr "Assistente de projecto do Luciole" #: ../lucioLib/gui/assistant_new_project.py:445 msgid " Select a project path " msgstr " Seleccionar um caminho para o projecto " #: ../lucioLib/gui/assistant_new_project.py:454 msgid " Select hardware " msgstr " Seleccionar hardware " #: ../lucioLib/gui/assistant_new_project.py:464 msgid " Webcam detection " msgstr " Detecção da webcam " #: ../lucioLib/gui/assistant_new_project.py:474 msgid " Project overview " msgstr " Resumo do projecto " #. create New button project #: ../lucioLib/gui/open_project_widget.py:50 msgid "Create a new project" msgstr "Criar um novo projecto" #. create open button project #: ../lucioLib/gui/open_project_widget.py:59 msgid "Open an existing project" msgstr "Abrir um projecto existente" #: ../lucioLib/gui/webcam_detection_widget.py:98 msgid "Please wait for webcam detection" msgstr "Por favor aguarde pela detecção da webcam" #: ../lucioLib/gui/webcam_detection_widget.py:103 msgid "Webcam detection done" msgstr "Detecção da webcam concluída" #: ../lucioLib/gui/webcam_detection_widget.py:188 msgid "Detected webcam(s)" msgstr "Webcam(s) detectada(s)" #: ../lucioLib/gui/webcam_detection_widget.py:192 msgid "No webcam detected" msgstr "Nenhuma webcam detectada" #: ../lucioLib/gui/dialog.py:73 msgid "Select files to import" msgstr "Seleccionar ficheiros a importar" #: ../lucioLib/gui/dialog.py:114 msgid "Select a Folder" msgstr "Seleccionar uma Pasta" #: ../lucioLib/luciole_constants.py:42 msgid "OTHER DEVICE" msgstr "OUTROS DISPOSITIVOS" #: ../lucioLib/luciole_controller.py:154 msgid " Webcam data not valid in project. Please restart webcam detection" msgstr "" " Dados de webcam inválidos no projecto. Por favor reinicie a detecção da " "webcam" #: ../lucioLib/luciole_controller.py:171 #, python-format msgid "Project %s saved" msgstr "Projecto %s gravado" #: ../lucioLib/luciole_controller.py:198 #, python-format msgid "Project saved as %s" msgstr "Projecto gravado como %s" #: ../lucioLib/luciole_controller.py:243 msgid "No files or valid files choosen for image import." msgstr "" "Nenhuns ficheiros ou ficheiros inválidos seleccionados para importação de " "imagens." #: ../lucioLib/luciole_controller.py:247 msgid "Impossible to import images when no project are loaded." msgstr "Impossível importar imagens se não existir um projecto aberto." #: ../lucioLib/luciole_controller.py:275 ../lucioLib/luciole_controller.py:283 msgid "Nothing to export. No project loaded" msgstr "Nada para exportar. Nenhum projecto aberto" #. nbd@grape to transform as error message #: ../lucioLib/luciole_controller.py:325 msgid "Can not play animantion : No image on montage view " msgstr "" "Não é possível reproduzir a animação: não há nenhuma imagem na visão de " "montagem " #. nbd@grape to transform as error message #: ../lucioLib/luciole_controller.py:334 msgid "Can not play animantion : No project loaded " msgstr "Não é possível reproduzir a animação: nenhum projecto carregado " #. nbd@grape : ask for save if save set status as loaded #: ../lucioLib/luciole_controller.py:386 msgid "Save Project before closing" msgstr "Gravar Projecto antes de fechar" #: ../lucioLib/luciole_controller.py:412 #, python-format msgid "Project %s is closed" msgstr "Projecto %s fechado" #. clear message status bar #: ../lucioLib/luciole_controller.py:433 msgid "Acquiring" msgstr "Adquirindo" #. stop acquirer #: ../lucioLib/luciole_controller.py:450 msgid "" "No acquisition available. Use 'import image' button to load images in " "project." msgstr "" "Nenhuma aquisição disponível. Utilize botão 'importar imagem' para carregar " "imagens para o projecto." #: ../lucioLib/luciole_controller.py:462 msgid " Can not start acquisition when no project are loaded." msgstr " Impossível iniciar aquisição sem nenhum projecto aberto" #: ../lucioLib/luciole_controller.py:471 #, python-format msgid "Acquisition error. %s" msgstr "Erro de aquisição. %s" #: ../lucioLib/luciole_controller.py:485 msgid "No Acquistion" msgstr "Nenhuma aquisição" #. nbd@grape : ask for save if save set status as loaded #: ../lucioLib/luciole_controller.py:574 msgid "Project modified. Save project before exit ?" msgstr "Projecto modificado. Gravar projecto antes de sair ?" #: ../lucioLib/luciole_controller.py:626 msgid "Please restart Luciole to take into account the new theme " msgstr "Por favor reinicie o Luciole para visualizar o novo tema " #: ../lucioLib/luciole_controller.py:676 msgid "Failed to load project " msgstr "Falha no carregamento do projecto " #: ../lucioLib/lcl_export/lcl_export_video.py:94 msgid "Pass 1/2" msgstr "Passo 1/2" #: ../lucioLib/lcl_export/lcl_export_video.py:103 msgid "Pass 2/2" msgstr "Passo 2/2" #: ../lucioLib/lcl_export/lcl_export_video.py:210 msgid "Export Canceled" msgstr "Exportação Cancelada" #: ../lucioLib/lcl_export/lcl_export_video.py:569 #: ../lucioLib/lcl_export/lcl_export_video.py:605 #: ../lucioLib/lcl_export/lcl_export_video.py:632 #, python-format msgid "Unable to erase : %s" msgstr "Não foi possível apagar : %s" #: ../lucioLib/lcl_export/lcl_export_video.py:621 #, python-format msgid "Creation of export folder not possible -- %s" msgstr "Não é possível criar pasta de exportação -- %s" #: ../lucioLib/luciole_manage_recent.py:95 #, python-format msgid "Project %s no more exist" msgstr "Projecto %s já não existe" luciole_0.8.6/po/POTFILES.in0000644000175000017500000000113711437126703014106 0ustar niconico[encoding: UTF-8] luciole.py ui/luciole.glade ui/export_file.glade lucioLib/controller/controller_load_project.py lucioLib/controller/controller_import.py lucioLib/gui/dialog_project_properties.py lucioLib/gui/luciole_export_window.py lucioLib/gui/luciole_export_tool_window.py lucioLib/gui/assistant_new_project.py lucioLib/gui/open_project_widget.py lucioLib/gui/gui_controller.py lucioLib/gui/webcam_detection_widget.py lucioLib/gui/dialog.py lucioLib/luciole_constants.py lucioLib/luciole_controller.py lucioLib/luciole_image.py lucioLib/lcl_export/lcl_export_video.py lucioLib/luciole_manage_recent.py luciole_0.8.6/po/createpot.py0000755000175000017500000000365411437126703014702 0ustar niconico#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- Mode: Python -*- # vi:si:ai:et:sw=4:sts=4:ts=4 # # # Copyright Nicolas Bertrand (nico@inattendu.org), 2009 # # This file is part of Luciole. # # Luciole 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. # # Luciole 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 Luciole. If not, see . # # """ create_pot.py Used for management of pot file """ import os, sys, glob command = None locale = None try: command = sys.argv[1] locale = sys.argv[2] except IndexError: pass os.chdir('po') if command == 'compile': files = glob.glob('*.po') for f in files: print "working on language %s"%f l = os.path.splitext(f) os.system('mkdir -p -m 0777 %s/LC_MESSAGES' % l[0]) print "Generating translation for %s locale" % l[0] os.system('msgmerge -o - %s luciole.pot | msgfmt -c -o %s/LC_MESSAGES/luciole.mo -' % (f, l[0])) elif command == 'update_po' : os.system('intltool-update --pot --gettext-package=luciole --verbose ') files = glob.glob('*.po') for f in files: l = os.path.splitext(f) if l : print "Generating po file for %s locale" %l[0] os.system('msgmerge -U %s luciole.pot'%(f)) else : print "\n\n**********\n" print "Now edit luciole.pot, save it as .po, and post it on\n" \ "our but tracker (https://bugs.launchpad.net/luciole/)\n\n" \ "Thank you!" os.chdir('..') luciole_0.8.6/po/es.po0000644000175000017500000004705611437126703013312 0ustar niconico# Spanish translation for luciole # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the luciole package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: luciole\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-02-14 16:37+0400\n" "PO-Revision-Date: 2010-03-03 05:59+0000\n" "Last-Translator: DiegoJ \n" "Language-Team: Spanish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-03-04 04:53+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../ui/luciole.glade.h:1 msgid " " msgstr " " #: ../ui/luciole.glade.h:2 msgid " Export file name (without extension) :" msgstr " Exportar nombre de archivo (sin extensión)" #: ../ui/luciole.glade.h:3 msgid "About Luciole" msgstr "A proposito de Luciole" #: ../ui/luciole.glade.h:4 msgid "Activate/Deactivate camera preview" msgstr "Activar/Desactivar previsualización de la camara" #: ../ui/luciole.glade.h:5 msgid "Add Trash to montage view" msgstr "Agregar papelera a las vista del montaje" #: ../ui/luciole.glade.h:6 msgid "Choose export format." msgstr "Seleccionar un formato a exportar" #: ../ui/luciole.glade.h:7 msgid "Copyright 2009-2010 Nicolas Bertrand (nico@inattendu.org)" msgstr "Copyright 2009-2010 Nicolas Bertrand (nico@inattendu.org)" #: ../ui/luciole.glade.h:8 msgid "DV format (raw DV)" msgstr "Formato DV ( DV de baja calidad)" #: ../ui/luciole.glade.h:9 msgid "Default" msgstr "Por defecto" #: ../ui/luciole.glade.h:10 msgid "Export" msgstr "Exportar" #: ../ui/luciole.glade.h:11 msgid "Export path:" msgstr "Ruta de exportación" #: ../ui/luciole.glade.h:12 msgid "Export video with sound." msgstr "Exportar video con sonido" #: ../ui/luciole.glade.h:13 msgid "File format :" msgstr "Formato de archivo" #: ../ui/luciole.glade.h:14 msgid "Format DVD (mpeg2)" msgstr "Formato DVD (mpeg2)" #: ../ui/luciole.glade.h:15 msgid "Format divx/xvid (avi)" msgstr "Formato divx/xvid (avi)" #: ../ui/luciole.glade.h:16 msgid "Image per seconds" msgstr "Imagen por segundos" #. Caller une image sur le flux video #: ../ui/luciole.glade.h:18 msgid "Import images" msgstr "Importar imagenes" #: ../ui/luciole.glade.h:19 msgid "Luciole on line" msgstr "Luciole en linea" #: ../ui/luciole.glade.h:20 msgid "Mixer" msgstr "Mezclador" #. Descendre un/ou plusieurs images #: ../ui/luciole.glade.h:22 msgid "Move down one or several images" msgstr "Bajar una ó varias imagenes" #. Déplacer des images capturées dans la zone de montage #: ../ui/luciole.glade.h:24 msgid "Move snapshot to montage area" msgstr "Mover instantanea a área de montaje" #. Monter un/ou plusieurs images #: ../ui/luciole.glade.h:26 msgid "Move up one or several images" msgstr "Subir una ó varias imagenes" #: ../ui/luciole.glade.h:27 msgid "Open recent" msgstr "Abrir reciente" #: ../ui/luciole.glade.h:28 msgid "Play video" msgstr "Reproducir video" #: ../ui/luciole.glade.h:29 msgid "Preferences" msgstr "Preferencias" #: ../ui/luciole.glade.h:30 ../lucioLib/gui/dialog_project_properties.py:105 msgid "Project properties" msgstr "Propiedades de proyecto" #: ../ui/luciole.glade.h:31 msgid "Select Theme" msgstr "Seleccione un tema" #: ../ui/luciole.glade.h:32 msgid "Select a Luciole project" msgstr "Seleccionar un proyecto Luciole" #: ../ui/luciole.glade.h:33 ../ui/export_file.glade.h:11 #: ../lucioLib/gui/assistant_new_project.py:102 msgid "Select a folder" msgstr "Seleccionar una carpeta" #: ../ui/luciole.glade.h:34 msgid "" "Stop-motion tool for making animated cartoon\n" "Makes live video acquistion from Webcam or DV cam" msgstr "" "Stop-motion herramienta para hacer dibujos animados\n" "Hace vivir la captación en el vídeo del Webcam o DV Cam" #: ../ui/luciole.glade.h:36 msgid "" "This program is free software; you can redistribute it and/or\n" "modify it under the terms of the GNU General Public License\n" "as published by the Free Software Foundation; either \n" "version 2 of the License, or (at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied \n" "warranty of MERCHANTABILITY or FITNESS FOR A \n" "PARTICULAR PURPOSE. See the GNU General Public \n" "License for more details.\n" "\n" "You should have received a copy of the GNU General Public\n" "License along with this program; if not, write to the \n" "Free Software Foundation, \n" "Inc., 59 Temple Place - \n" "Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Este programa es software libre; puede redistribuirlo y/o\n" "modificarlo bajo los términos de la GNU General Public LIcense\n" "publicada por la Free Software Foundation; bien \n" "en su versión 2 o en cualquiera (a su elección) posterior.\n" "\n" "Este programa se distribuye con la esperanza de ser útil,\n" "pero SIN NINGUNA GARANTÍA; ni tan siquiera la garantía\n" "implícita de MERCANTIBILIDAD o CALIDAD PARA UN \n" "OBJETIVO PARTICULAR. Vea la GNU General Public \n" "License para más detalles.\n" "\n" "Debería haber recibido una copia de la GNU General Public\n" "License con este programa; si no es así, escriba a la \n" "Free Software Foundation,\n" "Inc., 59 Temple Place -\n" "Suite 330, Boston, MA 02111-1307, USA." #. Jeter à la poubelle #: ../ui/luciole.glade.h:53 msgid "To trash" msgstr "A la basura" #: ../ui/luciole.glade.h:54 msgid "Tool Export" msgstr "Exportación herramientas" #: ../ui/luciole.glade.h:55 msgid "Tropical" msgstr "Tropical" #: ../ui/luciole.glade.h:56 msgid "Video Export" msgstr "Exportación de video" #: ../ui/luciole.glade.h:57 msgid "_File" msgstr "_Archivo" #: ../ui/luciole.glade.h:58 msgid "_Help" msgstr "_Ayuda" #: ../ui/luciole.glade.h:59 msgid "_View" msgstr "Visualización" #: ../ui/luciole.glade.h:60 msgid "make a snapshot" msgstr "crear una instantánea" #: ../ui/luciole.glade.h:61 msgid "options" msgstr "opciones" #: ../ui/luciole.glade.h:62 msgid "project1" msgstr "proyecto1" #: ../ui/luciole.glade.h:63 msgid "project2" msgstr "proyecto2" #: ../ui/luciole.glade.h:64 msgid "project3" msgstr "proyecto3" #: ../ui/luciole.glade.h:65 msgid "project4" msgstr "proyecto4" #: ../ui/luciole.glade.h:66 msgid "project5" msgstr "proyecto5" #: ../ui/export_file.glade.h:1 msgid "Cinelerra" msgstr "Cinelerra" #: ../ui/export_file.glade.h:2 msgid "Coming soon" msgstr "En breve" #: ../ui/export_file.glade.h:3 msgid "Export to Kdenlive" msgstr "Exportar a Kdenlive" #: ../ui/export_file.glade.h:4 msgid "Export to another application" msgstr "Exportar a otra aplicación" #: ../ui/export_file.glade.h:5 msgid "Export to cinelerra" msgstr "Exportar a cinelerra" #: ../ui/export_file.glade.h:6 msgid "Export to pitivi" msgstr "Exportar a pitivi" #: ../ui/export_file.glade.h:7 msgid "Kdenlive" msgstr "Kdenlive" #: ../ui/export_file.glade.h:8 msgid "Openshot" msgstr "Openshot" #: ../ui/export_file.glade.h:9 msgid "Pitivi" msgstr "Pitivi" #: ../ui/export_file.glade.h:10 msgid "Select a filename" msgstr "Seleccione un nombre de archivo" #: ../ui/export_file.glade.h:12 msgid "Select an export directory" msgstr "Seleccione un directorio de exportación" #: ../ui/export_file.glade.h:13 msgid "Tool Exporter" msgstr "Exportador Herramienta" #: ../lucioLib/controller/controller_load_project.py:134 msgid "Project Load started" msgstr "Carga del proyecto iniciada" #: ../lucioLib/controller/controller_load_project.py:139 #, python-format msgid "Project %s is loaded" msgstr "Se ha cargado el proyecto %s" #: ../lucioLib/controller/controller_load_project.py:145 #, python-format msgid "Project %s is loading" msgstr "El proyecto %s se está cargando" #: ../lucioLib/controller/controller_import.py:177 msgid "Import started" msgstr "Importación iniciada" #: ../lucioLib/controller/controller_import.py:182 msgid "All images imported" msgstr "Todas las imágenes fueron importadas" #: ../lucioLib/controller/controller_import.py:188 msgid "Importing images ..." msgstr "Importando imágenes..." #: ../lucioLib/gui/dialog_project_properties.py:51 msgid "Project folder :" msgstr "Carpeta del proyecto:" #: ../lucioLib/gui/dialog_project_properties.py:55 msgid "Project name :" msgstr "Nombre del proyecto:" #: ../lucioLib/gui/dialog_project_properties.py:59 msgid "XML file :" msgstr "Archivo XML:" #: ../lucioLib/gui/dialog_project_properties.py:64 msgid "Number of frames / image" msgstr "Numero de cuadernos/ imagenes" #: ../lucioLib/gui/dialog_project_properties.py:68 msgid "Device type" msgstr "Tipo de dispositivo" #: ../lucioLib/gui/dialog_project_properties.py:76 msgid "Device :" msgstr "Dispositivo:" #: ../lucioLib/gui/dialog_project_properties.py:80 msgid "Webcam name :" msgstr "Nombre de la Webcam" #: ../lucioLib/gui/dialog_project_properties.py:85 msgid "Video capture driver :" msgstr "Controlador del dispositivo de captura de video:" #: ../lucioLib/gui/dialog_project_properties.py:89 msgid "Video width :" msgstr "Anchura del video:" #: ../lucioLib/gui/dialog_project_properties.py:93 msgid "Video height :" msgstr "Altura del video:" #: ../lucioLib/gui/dialog_project_properties.py:97 msgid "" "Webcam framerate \n" " (number of images per second)" msgstr "" "Webcam framerate\n" "Numero de imagen per segundo" #: ../lucioLib/gui/dialog_project_properties.py:213 #: ../lucioLib/gui/dialog_project_properties.py:229 msgid "desc" msgstr "desc" #: ../lucioLib/gui/dialog_project_properties.py:271 msgid "Webcam properties" msgstr "Propiedades de la cámara web" #. #. Display Button fo webcam detetction #. #: ../lucioLib/gui/dialog_project_properties.py:300 msgid "Webcam detection" msgstr "Detección de la cámara web" #: ../lucioLib/gui/luciole_export_window.py:174 #, python-format msgid "" "%s is not valid. Not valid video name. It should be a combination of " "alphanumeric and '_' characters " msgstr "" "%s no es válido. No es un nombre de video válido. Debe tener una combinación " "de carácteres alfanuméricos y el carácter '_' " #. Launch Dialog window to ask if export file can be overide #. add message display #: ../lucioLib/gui/luciole_export_window.py:207 #: ../lucioLib/gui/luciole_export_tool_window.py:196 #, python-format msgid "File %s already exists. Replace file ?" msgstr "El archivo %s ya existe. ¿Desea reemplazarlo?" #: ../lucioLib/gui/luciole_export_tool_window.py:115 msgid "Select an application and a file name for export" msgstr "Seleccione una aplicación y un nombre de archivo para la exportación" #. Terminated normaly #: ../lucioLib/gui/luciole_export_tool_window.py:209 #: ../lucioLib/lcl_export/lcl_export_video.py:207 msgid "Export Done" msgstr "Exportación Finalizada" #. #. Initailize widgets for first page #. #. A label #: ../lucioLib/gui/assistant_new_project.py:59 msgid "" "This assistant will help you on configuration of a new Luciole project." msgstr "" "Este asistente le ayudará en la configuración de un nuevo proyecto Luciole." #. A label #: ../lucioLib/gui/assistant_new_project.py:72 msgid "Select project name and destination folder." msgstr "Seleccione el nombre del proyecto y la carpeta de destino." #. display project name #: ../lucioLib/gui/assistant_new_project.py:82 #: ../lucioLib/gui/assistant_new_project.py:362 msgid "Project Name" msgstr "Nombre del Proyecto" #: ../lucioLib/gui/assistant_new_project.py:95 msgid "Folder" msgstr "Carpeta" #. project with same name alreday exists #: ../lucioLib/gui/assistant_new_project.py:167 #, python-format msgid "The project %s already exists !" msgstr "El proyecto %s ya existe" #. invalid projetc name #: ../lucioLib/gui/assistant_new_project.py:171 #, python-format msgid "" "%s isn't a valid project name. It should be a combination of alphanumeric " "and '_' characters " msgstr "%s no esta un nombre de proyecto valido " #: ../lucioLib/gui/assistant_new_project.py:226 msgid "Select a device" msgstr "Seleccione un dispositivo" #: ../lucioLib/gui/assistant_new_project.py:246 msgid "" " Other device.\n" "(Manual import)" msgstr " Otro dispositivo (Importacion manual)" #: ../lucioLib/gui/assistant_new_project.py:263 msgid "Images per second" msgstr "Imagenes por segundo" #. display project path #: ../lucioLib/gui/assistant_new_project.py:366 msgid "Project Path" msgstr "Ruta del proyecto" #: ../lucioLib/gui/assistant_new_project.py:375 msgid "Number of frames per seconds" msgstr "Numero de fotogramas por segundo" #. display Hardware type #: ../lucioLib/gui/assistant_new_project.py:379 msgid "Hardware type" msgstr "Tipo de hardware" #. webcam name #: ../lucioLib/gui/assistant_new_project.py:385 msgid "Webcam name" msgstr "Nombre de la cámara web" #. webcam device #: ../lucioLib/gui/assistant_new_project.py:389 msgid "Webcam device" msgstr "Dispositivo de la cámara web" #. webcam resolution #: ../lucioLib/gui/assistant_new_project.py:393 msgid "Webcam resolution used" msgstr "Resolución usada por la cámara web" #. webcam device #: ../lucioLib/gui/assistant_new_project.py:399 msgid "Webcam driver used" msgstr "Controlador usado por la cámara web" #. Final message #: ../lucioLib/gui/assistant_new_project.py:404 msgid "Have fun with luciole !" msgstr "¡Diviértase con Luciole!" #: ../lucioLib/gui/assistant_new_project.py:434 msgid "Luciole project assistant" msgstr "Asistente de proyectos Luciole" #: ../lucioLib/gui/assistant_new_project.py:445 msgid " Select a project path " msgstr " Seleccione una ruta para el proyecto " #: ../lucioLib/gui/assistant_new_project.py:454 msgid " Select hardware " msgstr " Seleccionar hardware " #: ../lucioLib/gui/assistant_new_project.py:464 msgid " Webcam detection " msgstr " Detección de la cámara web " #: ../lucioLib/gui/assistant_new_project.py:474 msgid " Project overview " msgstr " Resumen del proyecto " #. create New button project #: ../lucioLib/gui/open_project_widget.py:50 msgid "Create a new project" msgstr "Crear un nuevo proyecto" #. create open button project #: ../lucioLib/gui/open_project_widget.py:59 msgid "Open an existing project" msgstr "Abrir un proyecto existente" #: ../lucioLib/gui/webcam_detection_widget.py:98 msgid "Please wait for webcam detection" msgstr "Espere a la detección de la cámara web" #: ../lucioLib/gui/webcam_detection_widget.py:103 msgid "Webcam detection done" msgstr "Se ha detectado la cámara web" #: ../lucioLib/gui/webcam_detection_widget.py:188 msgid "Detected webcam(s)" msgstr "Cámara(s) web detectada(s)" #: ../lucioLib/gui/webcam_detection_widget.py:192 msgid "No webcam detected" msgstr "No se ha detectado alguna cámara web" #: ../lucioLib/gui/dialog.py:73 msgid "Select files to import" msgstr "Seleccionar archivos para importar" #: ../lucioLib/gui/dialog.py:114 msgid "Select a Folder" msgstr "Seleccione una carpeta" #: ../lucioLib/luciole_constants.py:42 msgid "OTHER DEVICE" msgstr "OTROS DISPOSITIVOS" #: ../lucioLib/luciole_controller.py:154 msgid " Webcam data not valid in project. Please restart webcam detection" msgstr "" " Las Informaciones de camara no estan validas en el proyecto. Por favor, " "pona en marcha otra vez la detection de la camara" #: ../lucioLib/luciole_controller.py:171 #, python-format msgid "Project %s saved" msgstr "Proyecto %s guardado" #: ../lucioLib/luciole_controller.py:198 #, python-format msgid "Project saved as %s" msgstr "Proyecto guardado como %s" #: ../lucioLib/luciole_controller.py:243 msgid "No files or valid files choosen for image import." msgstr "No se eligieron archivos (válidos) para importar como imágenes." #: ../lucioLib/luciole_controller.py:247 msgid "Impossible to import images when no project are loaded." msgstr "No se puede importar imágenes cuando no hay un proyecto abierto." #: ../lucioLib/luciole_controller.py:275 ../lucioLib/luciole_controller.py:283 msgid "Nothing to export. No project loaded" msgstr "Nada para exportar. No hay un proyecto abierto." #. nbd@grape to transform as error message #: ../lucioLib/luciole_controller.py:325 msgid "Can not play animantion : No image on montage view " msgstr "" "No se puede reproducir la animación: no hay una imágen o una vista montada " #. nbd@grape to transform as error message #: ../lucioLib/luciole_controller.py:334 msgid "Can not play animantion : No project loaded " msgstr "No se puede reproducir la animación: no hay un proyecto abierto " #. nbd@grape : ask for save if save set status as loaded #: ../lucioLib/luciole_controller.py:386 msgid "Save Project before closing" msgstr "Guardar proyecto antes de cerrar" #: ../lucioLib/luciole_controller.py:412 #, python-format msgid "Project %s is closed" msgstr "El proyecto %s está cerrado" #. clear message status bar #: ../lucioLib/luciole_controller.py:433 msgid "Acquiring" msgstr "Adquiriendo" #. stop acquirer #: ../lucioLib/luciole_controller.py:450 msgid "" "No acquisition available. Use 'import image' button to load images in " "project." msgstr "" "No hay una adquisición disponible. Use el botón 'Importar imagen' para " "agregar imágenes al proyecto." #: ../lucioLib/luciole_controller.py:462 msgid " Can not start acquisition when no project are loaded." msgstr "" " No se puede iniciar una adquisición cuando no hay un proyecto abierto." #: ../lucioLib/luciole_controller.py:471 #, python-format msgid "Acquisition error. %s" msgstr "Error de adquisición: %s" #: ../lucioLib/luciole_controller.py:485 msgid "No Acquistion" msgstr "Sin adquisición" #. nbd@grape : ask for save if save set status as loaded #: ../lucioLib/luciole_controller.py:574 msgid "Project modified. Save project before exit ?" msgstr "Proyecto modificado. ¿Desea guardarlo antes de salir?" #: ../lucioLib/luciole_controller.py:626 msgid "Please restart Luciole to take into account the new theme " msgstr "Reinicie Luciole para usar el nuevo tema " #: ../lucioLib/luciole_controller.py:676 msgid "Failed to load project " msgstr "Error al abrir el proyecto " #: ../lucioLib/lcl_export/lcl_export_video.py:94 msgid "Pass 1/2" msgstr "Pasada 1/2" #: ../lucioLib/lcl_export/lcl_export_video.py:103 msgid "Pass 2/2" msgstr "Pasada 2/2" #: ../lucioLib/lcl_export/lcl_export_video.py:210 msgid "Export Canceled" msgstr "Exportación anulada" #: ../lucioLib/lcl_export/lcl_export_video.py:569 #: ../lucioLib/lcl_export/lcl_export_video.py:605 #: ../lucioLib/lcl_export/lcl_export_video.py:632 #, python-format msgid "Unable to erase : %s" msgstr "No se puede borrar : %s" #: ../lucioLib/lcl_export/lcl_export_video.py:621 #, python-format msgid "Creation of export folder not possible -- %s" msgstr "Creación de la carpeta de exportación no es posible -- %s" #: ../lucioLib/luciole_manage_recent.py:95 #, python-format msgid "Project %s no more exist" msgstr "El proyecto %s ya no existe" #~ msgid "" #~ "\n" #~ "Tool for video capture, for making animated cartoon from image per image " #~ "\n" #~ msgstr "" #~ "\n" #~ "Herramienta para capturar vídeo, para hacer dibujos animados imagen por " #~ "imagen \n" #~ msgid "unknown video export command" #~ msgstr "Comando de exportación de video desconocido" #~ msgid "Imposible to initialize player." #~ msgstr "Imposible iniciar el reproductor." #, python-format #~ msgid "Not a file : %s" #~ msgstr "%s no es un archivo" #, python-format #~ msgid "Error, path does not exist : %s" #~ msgstr "Error: La ruta %s no existe" #~ msgid "" #~ "Elise : elise@inattendu.org\n" #~ "Dave : erpizzo@alice.it\n" #~ "Nounours : daniel@inattendu.org\n" #~ "Nico : nico@inattendu.org" #~ msgstr "" #~ "Elise : elise@inattendu.org\n" #~ "Dave : erpizzo@alice.it\n" #~ "Nounours : daniel@inattendu.org\n" #~ "Nico : nico@inattendu.org" #~ msgid "Transparency level" #~ msgstr "Nivel de transparencia" #~ msgid "rush folder not valid" #~ msgstr "carpeta rápida no válida" #~ msgid "Mixer activation (onion skin)" #~ msgstr "Activación del mezclador (piel de cebolla)" luciole_0.8.6/po/en_GB.po0000644000175000017500000004311411437126703013644 0ustar niconico# English (United Kingdom) translation for luciole # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the luciole package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: luciole\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-02-14 16:37+0400\n" "PO-Revision-Date: 2010-04-05 23:16+0000\n" "Last-Translator: Jonathon Fernyhough \n" "Language-Team: English (United Kingdom) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-04-07 03:48+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../ui/luciole.glade.h:1 msgid " " msgstr " " #: ../ui/luciole.glade.h:2 msgid " Export file name (without extension) :" msgstr " Destination filename (without extension) :" #: ../ui/luciole.glade.h:3 msgid "About Luciole" msgstr "About Luciole" #: ../ui/luciole.glade.h:4 msgid "Activate/Deactivate camera preview" msgstr "Enable/Disable camera preview" #: ../ui/luciole.glade.h:5 msgid "Add Trash to montage view" msgstr "Add Trash button to capture area" #: ../ui/luciole.glade.h:6 msgid "Choose export format." msgstr "Choose destination file format." #: ../ui/luciole.glade.h:7 msgid "Copyright 2009-2010 Nicolas Bertrand (nico@inattendu.org)" msgstr "Copyright 2009-2010 Nicolas Bertrand (nico@inattendu.org)" #: ../ui/luciole.glade.h:8 msgid "DV format (raw DV)" msgstr "DV format (raw DV)" #: ../ui/luciole.glade.h:9 msgid "Default" msgstr "Default" #: ../ui/luciole.glade.h:10 msgid "Export" msgstr "Render" #: ../ui/luciole.glade.h:11 msgid "Export path:" msgstr "Path of the destination file" #: ../ui/luciole.glade.h:12 msgid "Export video with sound." msgstr "Render video with sound" #: ../ui/luciole.glade.h:13 msgid "File format :" msgstr "File format :" #: ../ui/luciole.glade.h:14 msgid "Format DVD (mpeg2)" msgstr "DVD format (mpeg2)" #: ../ui/luciole.glade.h:15 msgid "Format divx/xvid (avi)" msgstr "divx/xvid format (avi)" #: ../ui/luciole.glade.h:16 msgid "Image per seconds" msgstr "Framerate" #. Caller une image sur le flux video #: ../ui/luciole.glade.h:18 msgid "Import images" msgstr "Import images" #: ../ui/luciole.glade.h:19 msgid "Luciole on line" msgstr "Luciole on line" #: ../ui/luciole.glade.h:20 msgid "Mixer" msgstr "Onion skinning (Mixer)" #. Descendre un/ou plusieurs images #: ../ui/luciole.glade.h:22 msgid "Move down one or several images" msgstr "Move one or several images downward" #. Déplacer des images capturées dans la zone de montage #: ../ui/luciole.glade.h:24 msgid "Move snapshot to montage area" msgstr "Move one or several images to the Editing area" #. Monter un/ou plusieurs images #: ../ui/luciole.glade.h:26 msgid "Move up one or several images" msgstr "Move one or several images upward" #: ../ui/luciole.glade.h:27 msgid "Open recent" msgstr "Open recent" #: ../ui/luciole.glade.h:28 msgid "Play video" msgstr "Play animation" #: ../ui/luciole.glade.h:29 msgid "Preferences" msgstr "Preferences" #: ../ui/luciole.glade.h:30 ../lucioLib/gui/dialog_project_properties.py:105 msgid "Project properties" msgstr "Project properties" #: ../ui/luciole.glade.h:31 msgid "Select Theme" msgstr "Select Theme" #: ../ui/luciole.glade.h:32 msgid "Select a Luciole project" msgstr "Select a Luciole project" #: ../ui/luciole.glade.h:33 ../ui/export_file.glade.h:11 #: ../lucioLib/gui/assistant_new_project.py:102 msgid "Select a folder" msgstr "Select a folder" #: ../ui/luciole.glade.h:34 msgid "" "Stop-motion tool for making animated cartoon\n" "Makes live video acquistion from Webcam or DV cam" msgstr "" "Tool for making stop-motion animations\n" "Captures frames from live video stream (Webcam or DVcam)" #: ../ui/luciole.glade.h:36 msgid "" "This program is free software; you can redistribute it and/or\n" "modify it under the terms of the GNU General Public License\n" "as published by the Free Software Foundation; either \n" "version 2 of the License, or (at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied \n" "warranty of MERCHANTABILITY or FITNESS FOR A \n" "PARTICULAR PURPOSE. See the GNU General Public \n" "License for more details.\n" "\n" "You should have received a copy of the GNU General Public\n" "License along with this program; if not, write to the \n" "Free Software Foundation, \n" "Inc., 59 Temple Place - \n" "Suite 330, Boston, MA 02111-1307, USA." msgstr "" "This program is free software; you can redistribute it and/or\n" "modify it under the terms of the GNU General Public License\n" "as published by the Free Software Foundation; either \n" "version 2 of the License, or (at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied \n" "warranty of MERCHANTABILITY or FITNESS FOR A \n" "PARTICULAR PURPOSE. See the GNU General Public \n" "License for more details.\n" "\n" "You should have received a copy of the GNU General Public\n" "License along with this program; if not, write to the \n" "Free Software Foundation, \n" "Inc., 59 Temple Place - \n" "Suite 330, Boston, MA 02111-1307, USA." #. Jeter à la poubelle #: ../ui/luciole.glade.h:53 msgid "To trash" msgstr "Move to Trash" #: ../ui/luciole.glade.h:54 msgid "Tool Export" msgstr "Export tool" #: ../ui/luciole.glade.h:55 msgid "Tropical" msgstr "Tropical" #: ../ui/luciole.glade.h:56 msgid "Video Export" msgstr "Rendering" #: ../ui/luciole.glade.h:57 msgid "_File" msgstr "_File" #: ../ui/luciole.glade.h:58 msgid "_Help" msgstr "_Help" #: ../ui/luciole.glade.h:59 msgid "_View" msgstr "_View" #: ../ui/luciole.glade.h:60 msgid "make a snapshot" msgstr "Capture a frame" #: ../ui/luciole.glade.h:61 msgid "options" msgstr "Options" #: ../ui/luciole.glade.h:62 msgid "project1" msgstr "project1" #: ../ui/luciole.glade.h:63 msgid "project2" msgstr "project2" #: ../ui/luciole.glade.h:64 msgid "project3" msgstr "project3" #: ../ui/luciole.glade.h:65 msgid "project4" msgstr "project4" #: ../ui/luciole.glade.h:66 msgid "project5" msgstr "project5" #: ../ui/export_file.glade.h:1 msgid "Cinelerra" msgstr "Cinelerra" #: ../ui/export_file.glade.h:2 msgid "Coming soon" msgstr "Coming soon" #: ../ui/export_file.glade.h:3 msgid "Export to Kdenlive" msgstr "Export to Kdenlive" #: ../ui/export_file.glade.h:4 msgid "Export to another application" msgstr "Export to another application" #: ../ui/export_file.glade.h:5 msgid "Export to cinelerra" msgstr "Export to Cinelerra" #: ../ui/export_file.glade.h:6 msgid "Export to pitivi" msgstr "Export to Pitivi" #: ../ui/export_file.glade.h:7 msgid "Kdenlive" msgstr "Kdenlive" #: ../ui/export_file.glade.h:8 msgid "Openshot" msgstr "Openshot" #: ../ui/export_file.glade.h:9 msgid "Pitivi" msgstr "Pitivi" #: ../ui/export_file.glade.h:10 msgid "Select a filename" msgstr "Select a filename" #: ../ui/export_file.glade.h:12 msgid "Select an export directory" msgstr "Select a directory" #: ../ui/export_file.glade.h:13 msgid "Tool Exporter" msgstr "Export tool" #: ../lucioLib/controller/controller_load_project.py:134 msgid "Project Load started" msgstr "Project Load started" #: ../lucioLib/controller/controller_load_project.py:139 #, python-format msgid "Project %s is loaded" msgstr "Project %s is loaded" #: ../lucioLib/controller/controller_load_project.py:145 #, python-format msgid "Project %s is loading" msgstr "Project %s is loading" #: ../lucioLib/controller/controller_import.py:177 msgid "Import started" msgstr "Import started" #: ../lucioLib/controller/controller_import.py:182 msgid "All images imported" msgstr "All images imported" #: ../lucioLib/controller/controller_import.py:188 msgid "Importing images ..." msgstr "Importing images ..." #: ../lucioLib/gui/dialog_project_properties.py:51 msgid "Project folder :" msgstr "Project folder :" #: ../lucioLib/gui/dialog_project_properties.py:55 msgid "Project name :" msgstr "Project name :" #: ../lucioLib/gui/dialog_project_properties.py:59 msgid "XML file :" msgstr "XML file :" #: ../lucioLib/gui/dialog_project_properties.py:64 msgid "Number of frames / image" msgstr "Framerate :" #: ../lucioLib/gui/dialog_project_properties.py:68 msgid "Device type" msgstr "Hardware :" #: ../lucioLib/gui/dialog_project_properties.py:76 msgid "Device :" msgstr "Device :" #: ../lucioLib/gui/dialog_project_properties.py:80 msgid "Webcam name :" msgstr "Webcam name :" #: ../lucioLib/gui/dialog_project_properties.py:85 msgid "Video capture driver :" msgstr "Video driver :" #: ../lucioLib/gui/dialog_project_properties.py:89 msgid "Video width :" msgstr "Video width :" #: ../lucioLib/gui/dialog_project_properties.py:93 msgid "Video height :" msgstr "Video height :" #: ../lucioLib/gui/dialog_project_properties.py:97 msgid "" "Webcam framerate \n" " (number of images per second)" msgstr "Framerate :" #: ../lucioLib/gui/dialog_project_properties.py:213 #: ../lucioLib/gui/dialog_project_properties.py:229 msgid "desc" msgstr "desc" #: ../lucioLib/gui/dialog_project_properties.py:271 msgid "Webcam properties" msgstr "Webcam properties" #. #. Display Button fo webcam detetction #. #: ../lucioLib/gui/dialog_project_properties.py:300 msgid "Webcam detection" msgstr "" "Webcam detection\n" "click to activate" #: ../lucioLib/gui/luciole_export_window.py:174 #, python-format msgid "" "%s is not valid. Not valid video name. It should be a combination of " "alphanumeric and '_' characters " msgstr "" "%s is not valid. Filenames for video should be a combination of alphanumeric " "and '_' characters " #. Launch Dialog window to ask if export file can be overide #. add message display #: ../lucioLib/gui/luciole_export_window.py:207 #: ../lucioLib/gui/luciole_export_tool_window.py:196 #, python-format msgid "File %s already exists. Replace file ?" msgstr "File %s already exists. Replace file ?" #: ../lucioLib/gui/luciole_export_tool_window.py:115 msgid "Select an application and a file name for export" msgstr "Select an application and a file name for export" #. Terminated normaly #: ../lucioLib/gui/luciole_export_tool_window.py:209 #: ../lucioLib/lcl_export/lcl_export_video.py:207 msgid "Export Done" msgstr "Render done" #. #. Initailize widgets for first page #. #. A label #: ../lucioLib/gui/assistant_new_project.py:59 msgid "" "This assistant will help you on configuration of a new Luciole project." msgstr "This assistant will help you configuring a new Luciole project." #. A label #: ../lucioLib/gui/assistant_new_project.py:72 msgid "Select project name and destination folder." msgstr "Select a project name and a destination folder." #. display project name #: ../lucioLib/gui/assistant_new_project.py:82 #: ../lucioLib/gui/assistant_new_project.py:362 msgid "Project Name" msgstr "Project name" #: ../lucioLib/gui/assistant_new_project.py:95 msgid "Folder" msgstr "Folder" #. project with same name alreday exists #: ../lucioLib/gui/assistant_new_project.py:167 #, python-format msgid "The project %s already exists !" msgstr "The project %s already exists !" #. invalid projetc name #: ../lucioLib/gui/assistant_new_project.py:171 #, python-format msgid "" "%s isn't a valid project name. It should be a combination of alphanumeric " "and '_' characters " msgstr "" "%s isn't valid. Project names should be a combination of alphanumeric and " "'_' characters " #: ../lucioLib/gui/assistant_new_project.py:226 msgid "Select a device" msgstr "Select a device" #: ../lucioLib/gui/assistant_new_project.py:246 msgid "" " Other device.\n" "(Manual import)" msgstr " Manual import from disk" #: ../lucioLib/gui/assistant_new_project.py:263 msgid "Images per second" msgstr "Framerate (images per second)" #. display project path #: ../lucioLib/gui/assistant_new_project.py:366 msgid "Project Path" msgstr "Project path" #: ../lucioLib/gui/assistant_new_project.py:375 msgid "Number of frames per seconds" msgstr "Framerate" #. display Hardware type #: ../lucioLib/gui/assistant_new_project.py:379 msgid "Hardware type" msgstr "Hardware" #. webcam name #: ../lucioLib/gui/assistant_new_project.py:385 msgid "Webcam name" msgstr "Webcam name" #. webcam device #: ../lucioLib/gui/assistant_new_project.py:389 msgid "Webcam device" msgstr "Webcam device" #. webcam resolution #: ../lucioLib/gui/assistant_new_project.py:393 msgid "Webcam resolution used" msgstr "Resolution" #. webcam device #: ../lucioLib/gui/assistant_new_project.py:399 msgid "Webcam driver used" msgstr "Webcam driver" #. Final message #: ../lucioLib/gui/assistant_new_project.py:404 msgid "Have fun with luciole !" msgstr "Have fun with Luciole!" #: ../lucioLib/gui/assistant_new_project.py:434 msgid "Luciole project assistant" msgstr "Luciole project assistant" #: ../lucioLib/gui/assistant_new_project.py:445 msgid " Select a project path " msgstr " Select a project path " #: ../lucioLib/gui/assistant_new_project.py:454 msgid " Select hardware " msgstr " Hardware selection " #: ../lucioLib/gui/assistant_new_project.py:464 msgid " Webcam detection " msgstr " Webcam detection " #: ../lucioLib/gui/assistant_new_project.py:474 msgid " Project overview " msgstr " Project overview " #. create New button project #: ../lucioLib/gui/open_project_widget.py:50 msgid "Create a new project" msgstr "Create a new project" #. create open button project #: ../lucioLib/gui/open_project_widget.py:59 msgid "Open an existing project" msgstr "Open an existing project" #: ../lucioLib/gui/webcam_detection_widget.py:98 msgid "Please wait for webcam detection" msgstr "Please wait for webcam detection" #: ../lucioLib/gui/webcam_detection_widget.py:103 msgid "Webcam detection done" msgstr "Webcam detected" #: ../lucioLib/gui/webcam_detection_widget.py:188 msgid "Detected webcam(s)" msgstr "Detected webcam(s)" #: ../lucioLib/gui/webcam_detection_widget.py:192 msgid "No webcam detected" msgstr "No webcam detected" #: ../lucioLib/gui/dialog.py:73 msgid "Select files to import" msgstr "Select image files to import" #: ../lucioLib/gui/dialog.py:114 msgid "Select a Folder" msgstr "Select a folder" #: ../lucioLib/luciole_constants.py:42 msgid "OTHER DEVICE" msgstr "OTHER DEVICE" #: ../lucioLib/luciole_controller.py:154 msgid " Webcam data not valid in project. Please restart webcam detection" msgstr " Invalid Webcam data. Please restart Webcam detection" #: ../lucioLib/luciole_controller.py:171 #, python-format msgid "Project %s saved" msgstr "Project %s saved" #: ../lucioLib/luciole_controller.py:198 #, python-format msgid "Project saved as %s" msgstr "Project saved as %s" #: ../lucioLib/luciole_controller.py:243 msgid "No files or valid files choosen for image import." msgstr "No files or no valid files selected for image import." #: ../lucioLib/luciole_controller.py:247 msgid "Impossible to import images when no project are loaded." msgstr "Image import impossible : No projects loaded" #: ../lucioLib/luciole_controller.py:275 ../lucioLib/luciole_controller.py:283 msgid "Nothing to export. No project loaded" msgstr "Nothing to export : No projects loaded" #. nbd@grape to transform as error message #: ../lucioLib/luciole_controller.py:325 msgid "Can not play animantion : No image on montage view " msgstr "Can not play animation : No images on Editing area " #. nbd@grape to transform as error message #: ../lucioLib/luciole_controller.py:334 msgid "Can not play animantion : No project loaded " msgstr "Can not play animation : No projects loaded " #. nbd@grape : ask for save if save set status as loaded #: ../lucioLib/luciole_controller.py:386 msgid "Save Project before closing" msgstr "Save project before closing" #: ../lucioLib/luciole_controller.py:412 #, python-format msgid "Project %s is closed" msgstr "Project %s is closed" #. clear message status bar #: ../lucioLib/luciole_controller.py:433 msgid "Acquiring" msgstr "Acquiring" #. stop acquirer #: ../lucioLib/luciole_controller.py:450 msgid "" "No acquisition available. Use 'import image' button to load images in " "project." msgstr "" "No acquisition available. Use the 'import image' button to load images into " "the project." #: ../lucioLib/luciole_controller.py:462 msgid " Can not start acquisition when no project are loaded." msgstr " Can not start acquisition: No projects loaded" #: ../lucioLib/luciole_controller.py:471 #, python-format msgid "Acquisition error. %s" msgstr "Acquisition error. %s" #: ../lucioLib/luciole_controller.py:485 msgid "No Acquistion" msgstr "No acquistion" #. nbd@grape : ask for save if save set status as loaded #: ../lucioLib/luciole_controller.py:574 msgid "Project modified. Save project before exit ?" msgstr "Project modified. Save project before exiting ?" #: ../lucioLib/luciole_controller.py:626 msgid "Please restart Luciole to take into account the new theme " msgstr "Please restart Luciole to load the new theme " #: ../lucioLib/luciole_controller.py:676 msgid "Failed to load project " msgstr "Failed to load project " #: ../lucioLib/lcl_export/lcl_export_video.py:94 msgid "Pass 1/2" msgstr "Pass 1/2" #: ../lucioLib/lcl_export/lcl_export_video.py:103 msgid "Pass 2/2" msgstr "Pass 2/2" #: ../lucioLib/lcl_export/lcl_export_video.py:210 msgid "Export Canceled" msgstr "Export cancelled" #: ../lucioLib/lcl_export/lcl_export_video.py:569 #: ../lucioLib/lcl_export/lcl_export_video.py:605 #: ../lucioLib/lcl_export/lcl_export_video.py:632 #, python-format msgid "Unable to erase : %s" msgstr "Unable to erase : %s" #: ../lucioLib/lcl_export/lcl_export_video.py:621 #, python-format msgid "Creation of export folder not possible -- %s" msgstr "Impossible to create destination folder -- %s" #: ../lucioLib/luciole_manage_recent.py:95 #, python-format msgid "Project %s no more exist" msgstr "Project %s no longer exists" luciole_0.8.6/po/id.po0000644000175000017500000003734411437126703013276 0ustar niconico# Indonesian translation for luciole # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the luciole package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: luciole\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-02-14 16:37+0400\n" "PO-Revision-Date: 2010-03-27 13:16+0000\n" "Last-Translator: Abdul Munif Hanafi \n" "Language-Team: Indonesian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-03-28 03:47+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../ui/luciole.glade.h:1 msgid " " msgstr " " #: ../ui/luciole.glade.h:2 msgid " Export file name (without extension) :" msgstr " Ekspor nama berkas (tanpa akhiran) :" #: ../ui/luciole.glade.h:3 msgid "About Luciole" msgstr "Tentang Luciole" #: ../ui/luciole.glade.h:4 msgid "Activate/Deactivate camera preview" msgstr "Aktifkan/Nonaktifkan pratinjau kamera" #: ../ui/luciole.glade.h:5 msgid "Add Trash to montage view" msgstr "" #: ../ui/luciole.glade.h:6 msgid "Choose export format." msgstr "Pilih format ekspor." #: ../ui/luciole.glade.h:7 msgid "Copyright 2009-2010 Nicolas Bertrand (nico@inattendu.org)" msgstr "Hak Cipta 2009-2010 Nicolas Bertrand (nico@inattendu.org)" #: ../ui/luciole.glade.h:8 msgid "DV format (raw DV)" msgstr "DV format (raw DV)" #: ../ui/luciole.glade.h:9 msgid "Default" msgstr "Standar" #: ../ui/luciole.glade.h:10 msgid "Export" msgstr "Ekspor" #: ../ui/luciole.glade.h:11 msgid "Export path:" msgstr "" #: ../ui/luciole.glade.h:12 msgid "Export video with sound." msgstr "Ekspor video dengan suara." #: ../ui/luciole.glade.h:13 msgid "File format :" msgstr "Format berkas :" #: ../ui/luciole.glade.h:14 msgid "Format DVD (mpeg2)" msgstr "Format DVD (mpeg2)" #: ../ui/luciole.glade.h:15 msgid "Format divx/xvid (avi)" msgstr "Format divx/xvid (avi)" #: ../ui/luciole.glade.h:16 msgid "Image per seconds" msgstr "Gambar per detik" #. Caller une image sur le flux video #: ../ui/luciole.glade.h:18 msgid "Import images" msgstr "Impor gambar" #: ../ui/luciole.glade.h:19 msgid "Luciole on line" msgstr "" #: ../ui/luciole.glade.h:20 msgid "Mixer" msgstr "Mixer" #. Descendre un/ou plusieurs images #: ../ui/luciole.glade.h:22 msgid "Move down one or several images" msgstr "" #. Déplacer des images capturées dans la zone de montage #: ../ui/luciole.glade.h:24 msgid "Move snapshot to montage area" msgstr "" #. Monter un/ou plusieurs images #: ../ui/luciole.glade.h:26 msgid "Move up one or several images" msgstr "" #: ../ui/luciole.glade.h:27 msgid "Open recent" msgstr "" #: ../ui/luciole.glade.h:28 msgid "Play video" msgstr "Mainkan video" #: ../ui/luciole.glade.h:29 msgid "Preferences" msgstr "Preferensi" #: ../ui/luciole.glade.h:30 ../lucioLib/gui/dialog_project_properties.py:105 msgid "Project properties" msgstr "Properti proyek" #: ../ui/luciole.glade.h:31 msgid "Select Theme" msgstr "Pilih Tema" #: ../ui/luciole.glade.h:32 msgid "Select a Luciole project" msgstr "Pilih sebuah proyek Luciole" #: ../ui/luciole.glade.h:33 ../ui/export_file.glade.h:11 #: ../lucioLib/gui/assistant_new_project.py:102 msgid "Select a folder" msgstr "Pilih direktori" #: ../ui/luciole.glade.h:34 msgid "" "Stop-motion tool for making animated cartoon\n" "Makes live video acquistion from Webcam or DV cam" msgstr "" #: ../ui/luciole.glade.h:36 msgid "" "This program is free software; you can redistribute it and/or\n" "modify it under the terms of the GNU General Public License\n" "as published by the Free Software Foundation; either \n" "version 2 of the License, or (at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied \n" "warranty of MERCHANTABILITY or FITNESS FOR A \n" "PARTICULAR PURPOSE. See the GNU General Public \n" "License for more details.\n" "\n" "You should have received a copy of the GNU General Public\n" "License along with this program; if not, write to the \n" "Free Software Foundation, \n" "Inc., 59 Temple Place - \n" "Suite 330, Boston, MA 02111-1307, USA." msgstr "" "This program is free software; you can redistribute it and/or\n" "modify it under the terms of the GNU General Public License\n" "as published by the Free Software Foundation; either \n" "version 2 of the License, or (at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied \n" "warranty of MERCHANTABILITY or FITNESS FOR A \n" "PARTICULAR PURPOSE. See the GNU General Public \n" "License for more details.\n" "\n" "You should have received a copy of the GNU General Public\n" "License along with this program; if not, write to the \n" "Free Software Foundation, \n" "Inc., 59 Temple Place - \n" "Suite 330, Boston, MA 02111-1307, USA." #. Jeter à la poubelle #: ../ui/luciole.glade.h:53 msgid "To trash" msgstr "Ke kotak sampah" #: ../ui/luciole.glade.h:54 msgid "Tool Export" msgstr "" #: ../ui/luciole.glade.h:55 msgid "Tropical" msgstr "" #: ../ui/luciole.glade.h:56 msgid "Video Export" msgstr "" #: ../ui/luciole.glade.h:57 msgid "_File" msgstr "" #: ../ui/luciole.glade.h:58 msgid "_Help" msgstr "" #: ../ui/luciole.glade.h:59 msgid "_View" msgstr "" #: ../ui/luciole.glade.h:60 msgid "make a snapshot" msgstr "" #: ../ui/luciole.glade.h:61 msgid "options" msgstr "pilihan" #: ../ui/luciole.glade.h:62 msgid "project1" msgstr "proyek1" #: ../ui/luciole.glade.h:63 msgid "project2" msgstr "proyek2" #: ../ui/luciole.glade.h:64 msgid "project3" msgstr "proyek3" #: ../ui/luciole.glade.h:65 msgid "project4" msgstr "proyek4" #: ../ui/luciole.glade.h:66 msgid "project5" msgstr "proyek5" #: ../ui/export_file.glade.h:1 msgid "Cinelerra" msgstr "Cinelerra" #: ../ui/export_file.glade.h:2 msgid "Coming soon" msgstr "Segera" #: ../ui/export_file.glade.h:3 msgid "Export to Kdenlive" msgstr "Ekspor ke Kdenlive" #: ../ui/export_file.glade.h:4 msgid "Export to another application" msgstr "Ekspor ke aplikasi lainnya" #: ../ui/export_file.glade.h:5 msgid "Export to cinelerra" msgstr "Ekspor ke cinelerra" #: ../ui/export_file.glade.h:6 msgid "Export to pitivi" msgstr "Ekspor ke pitivi" #: ../ui/export_file.glade.h:7 msgid "Kdenlive" msgstr "Kdenlive" #: ../ui/export_file.glade.h:8 msgid "Openshot" msgstr "Openshot" #: ../ui/export_file.glade.h:9 msgid "Pitivi" msgstr "Pitivi" #: ../ui/export_file.glade.h:10 msgid "Select a filename" msgstr "Pilih sebuah nama berkas" #: ../ui/export_file.glade.h:12 msgid "Select an export directory" msgstr "Pilih sebuah direktori ekspor" #: ../ui/export_file.glade.h:13 msgid "Tool Exporter" msgstr "" #: ../lucioLib/controller/controller_load_project.py:134 msgid "Project Load started" msgstr "" #: ../lucioLib/controller/controller_load_project.py:139 #, python-format msgid "Project %s is loaded" msgstr "Proyek %s telah termuat" #: ../lucioLib/controller/controller_load_project.py:145 #, python-format msgid "Project %s is loading" msgstr "Proyek %s sedang dimuat" #: ../lucioLib/controller/controller_import.py:177 msgid "Import started" msgstr "" #: ../lucioLib/controller/controller_import.py:182 msgid "All images imported" msgstr "" #: ../lucioLib/controller/controller_import.py:188 msgid "Importing images ..." msgstr "Mengimpor gambar ..." #: ../lucioLib/gui/dialog_project_properties.py:51 msgid "Project folder :" msgstr "Direktori proyek :" #: ../lucioLib/gui/dialog_project_properties.py:55 msgid "Project name :" msgstr "Nama proyek :" #: ../lucioLib/gui/dialog_project_properties.py:59 msgid "XML file :" msgstr "Berkas XML :" #: ../lucioLib/gui/dialog_project_properties.py:64 msgid "Number of frames / image" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:68 msgid "Device type" msgstr "Tipe perangkat" #: ../lucioLib/gui/dialog_project_properties.py:76 msgid "Device :" msgstr "Perangkat :" #: ../lucioLib/gui/dialog_project_properties.py:80 msgid "Webcam name :" msgstr "Nama webcam :" #: ../lucioLib/gui/dialog_project_properties.py:85 msgid "Video capture driver :" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:89 msgid "Video width :" msgstr "Lebar video :" #: ../lucioLib/gui/dialog_project_properties.py:93 msgid "Video height :" msgstr "Tinggi video :" #: ../lucioLib/gui/dialog_project_properties.py:97 msgid "" "Webcam framerate \n" " (number of images per second)" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:213 #: ../lucioLib/gui/dialog_project_properties.py:229 msgid "desc" msgstr "keterangan" #: ../lucioLib/gui/dialog_project_properties.py:271 msgid "Webcam properties" msgstr "" #. #. Display Button fo webcam detetction #. #: ../lucioLib/gui/dialog_project_properties.py:300 msgid "Webcam detection" msgstr "" #: ../lucioLib/gui/luciole_export_window.py:174 #, python-format msgid "" "%s is not valid. Not valid video name. It should be a combination of " "alphanumeric and '_' characters " msgstr "" #. Launch Dialog window to ask if export file can be overide #. add message display #: ../lucioLib/gui/luciole_export_window.py:207 #: ../lucioLib/gui/luciole_export_tool_window.py:196 #, python-format msgid "File %s already exists. Replace file ?" msgstr "Berkas %s telah ada. Menimpa berkas ?" #: ../lucioLib/gui/luciole_export_tool_window.py:115 msgid "Select an application and a file name for export" msgstr "Pilih sebuah aplikasi dan sebuah nama untuk ekspor" #. Terminated normaly #: ../lucioLib/gui/luciole_export_tool_window.py:209 #: ../lucioLib/lcl_export/lcl_export_video.py:207 msgid "Export Done" msgstr "Ekspor Selesai" #. #. Initailize widgets for first page #. #. A label #: ../lucioLib/gui/assistant_new_project.py:59 msgid "" "This assistant will help you on configuration of a new Luciole project." msgstr "" #. A label #: ../lucioLib/gui/assistant_new_project.py:72 msgid "Select project name and destination folder." msgstr "Pilih nama proyek dan direktori tujuan ." #. display project name #: ../lucioLib/gui/assistant_new_project.py:82 #: ../lucioLib/gui/assistant_new_project.py:362 msgid "Project Name" msgstr "Nama Proyek" #: ../lucioLib/gui/assistant_new_project.py:95 msgid "Folder" msgstr "Direktori" #. project with same name alreday exists #: ../lucioLib/gui/assistant_new_project.py:167 #, python-format msgid "The project %s already exists !" msgstr "Proyek %s sudah ada !" #. invalid projetc name #: ../lucioLib/gui/assistant_new_project.py:171 #, python-format msgid "" "%s isn't a valid project name. It should be a combination of alphanumeric " "and '_' characters " msgstr "" #: ../lucioLib/gui/assistant_new_project.py:226 msgid "Select a device" msgstr "Pilih perangkat" #: ../lucioLib/gui/assistant_new_project.py:246 msgid "" " Other device.\n" "(Manual import)" msgstr "" " Perangkat lainnya.\n" "(Impor Manual)" #: ../lucioLib/gui/assistant_new_project.py:263 msgid "Images per second" msgstr "Gambar per detik" #. display project path #: ../lucioLib/gui/assistant_new_project.py:366 msgid "Project Path" msgstr "" #: ../lucioLib/gui/assistant_new_project.py:375 msgid "Number of frames per seconds" msgstr "" #. display Hardware type #: ../lucioLib/gui/assistant_new_project.py:379 msgid "Hardware type" msgstr "Jenis perangkat keras" #. webcam name #: ../lucioLib/gui/assistant_new_project.py:385 msgid "Webcam name" msgstr "Nama webcam" #. webcam device #: ../lucioLib/gui/assistant_new_project.py:389 msgid "Webcam device" msgstr "Perangkat webcam" #. webcam resolution #: ../lucioLib/gui/assistant_new_project.py:393 msgid "Webcam resolution used" msgstr "" #. webcam device #: ../lucioLib/gui/assistant_new_project.py:399 msgid "Webcam driver used" msgstr "" #. Final message #: ../lucioLib/gui/assistant_new_project.py:404 msgid "Have fun with luciole !" msgstr "" #: ../lucioLib/gui/assistant_new_project.py:434 msgid "Luciole project assistant" msgstr "Asisten proyek Luciole" #: ../lucioLib/gui/assistant_new_project.py:445 msgid " Select a project path " msgstr "" #: ../lucioLib/gui/assistant_new_project.py:454 msgid " Select hardware " msgstr "" #: ../lucioLib/gui/assistant_new_project.py:464 msgid " Webcam detection " msgstr "" #: ../lucioLib/gui/assistant_new_project.py:474 msgid " Project overview " msgstr "" #. create New button project #: ../lucioLib/gui/open_project_widget.py:50 msgid "Create a new project" msgstr "" #. create open button project #: ../lucioLib/gui/open_project_widget.py:59 msgid "Open an existing project" msgstr "" #: ../lucioLib/gui/webcam_detection_widget.py:98 msgid "Please wait for webcam detection" msgstr "" #: ../lucioLib/gui/webcam_detection_widget.py:103 msgid "Webcam detection done" msgstr "" #: ../lucioLib/gui/webcam_detection_widget.py:188 msgid "Detected webcam(s)" msgstr "" #: ../lucioLib/gui/webcam_detection_widget.py:192 msgid "No webcam detected" msgstr "" #: ../lucioLib/gui/dialog.py:73 msgid "Select files to import" msgstr "" #: ../lucioLib/gui/dialog.py:114 msgid "Select a Folder" msgstr "" #: ../lucioLib/luciole_constants.py:42 msgid "OTHER DEVICE" msgstr "" #: ../lucioLib/luciole_controller.py:154 msgid " Webcam data not valid in project. Please restart webcam detection" msgstr "" #: ../lucioLib/luciole_controller.py:171 #, python-format msgid "Project %s saved" msgstr "" #: ../lucioLib/luciole_controller.py:198 #, python-format msgid "Project saved as %s" msgstr "" #: ../lucioLib/luciole_controller.py:243 msgid "No files or valid files choosen for image import." msgstr "" #: ../lucioLib/luciole_controller.py:247 msgid "Impossible to import images when no project are loaded." msgstr "" #: ../lucioLib/luciole_controller.py:275 ../lucioLib/luciole_controller.py:283 msgid "Nothing to export. No project loaded" msgstr "" #. nbd@grape to transform as error message #: ../lucioLib/luciole_controller.py:325 msgid "Can not play animantion : No image on montage view " msgstr "" #. nbd@grape to transform as error message #: ../lucioLib/luciole_controller.py:334 msgid "Can not play animantion : No project loaded " msgstr "" #. nbd@grape : ask for save if save set status as loaded #: ../lucioLib/luciole_controller.py:386 msgid "Save Project before closing" msgstr "" #: ../lucioLib/luciole_controller.py:412 #, python-format msgid "Project %s is closed" msgstr "" #. clear message status bar #: ../lucioLib/luciole_controller.py:433 msgid "Acquiring" msgstr "" #. stop acquirer #: ../lucioLib/luciole_controller.py:450 msgid "" "No acquisition available. Use 'import image' button to load images in " "project." msgstr "" #: ../lucioLib/luciole_controller.py:462 msgid " Can not start acquisition when no project are loaded." msgstr "" #: ../lucioLib/luciole_controller.py:471 #, python-format msgid "Acquisition error. %s" msgstr "" #: ../lucioLib/luciole_controller.py:485 msgid "No Acquistion" msgstr "" #. nbd@grape : ask for save if save set status as loaded #: ../lucioLib/luciole_controller.py:574 msgid "Project modified. Save project before exit ?" msgstr "" #: ../lucioLib/luciole_controller.py:626 msgid "Please restart Luciole to take into account the new theme " msgstr "" #: ../lucioLib/luciole_controller.py:676 msgid "Failed to load project " msgstr "" #: ../lucioLib/lcl_export/lcl_export_video.py:94 msgid "Pass 1/2" msgstr "" #: ../lucioLib/lcl_export/lcl_export_video.py:103 msgid "Pass 2/2" msgstr "" #: ../lucioLib/lcl_export/lcl_export_video.py:210 msgid "Export Canceled" msgstr "" #: ../lucioLib/lcl_export/lcl_export_video.py:569 #: ../lucioLib/lcl_export/lcl_export_video.py:605 #: ../lucioLib/lcl_export/lcl_export_video.py:632 #, python-format msgid "Unable to erase : %s" msgstr "" #: ../lucioLib/lcl_export/lcl_export_video.py:621 #, python-format msgid "Creation of export folder not possible -- %s" msgstr "" #: ../lucioLib/luciole_manage_recent.py:95 #, python-format msgid "Project %s no more exist" msgstr "" luciole_0.8.6/po/it.po0000644000175000017500000005052611437126703013313 0ustar niconico# Italian translation for luciole # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the luciole package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: luciole\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-02-14 16:37+0400\n" "PO-Revision-Date: 2010-02-19 21:04+0000\n" "Last-Translator: Guybrush88 \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-02-20 04:44+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../ui/luciole.glade.h:1 msgid " " msgstr " " #: ../ui/luciole.glade.h:2 msgid " Export file name (without extension) :" msgstr " Nome del file da esportare (senza estensione) :" #: ../ui/luciole.glade.h:3 msgid "About Luciole" msgstr "Informazioni su Luciole" #: ../ui/luciole.glade.h:4 msgid "Activate/Deactivate camera preview" msgstr "Abilita/Disabilita l'anteprima della videocamera" #: ../ui/luciole.glade.h:5 msgid "Add Trash to montage view" msgstr "Aggiungi il pulsante Cestino all'area di cattura" #: ../ui/luciole.glade.h:6 msgid "Choose export format." msgstr "Scegli il formato di esportazione." #: ../ui/luciole.glade.h:7 msgid "Copyright 2009-2010 Nicolas Bertrand (nico@inattendu.org)" msgstr "Copyright 2009-2010 Nicolas Bertrand (nico@inattendu.org)" #: ../ui/luciole.glade.h:8 msgid "DV format (raw DV)" msgstr "Formato DV (rawDV)" #: ../ui/luciole.glade.h:9 msgid "Default" msgstr "Predefinito" #: ../ui/luciole.glade.h:10 msgid "Export" msgstr "Esporta" #: ../ui/luciole.glade.h:11 msgid "Export path:" msgstr "Percorso di esportazione:" #: ../ui/luciole.glade.h:12 msgid "Export video with sound." msgstr "Esporta video con audio" #: ../ui/luciole.glade.h:13 msgid "File format :" msgstr "Formato del file" #: ../ui/luciole.glade.h:14 msgid "Format DVD (mpeg2)" msgstr "Formato DVD (mpeg2)" #: ../ui/luciole.glade.h:15 msgid "Format divx/xvid (avi)" msgstr "Formato divx/xvid (avi)" #: ../ui/luciole.glade.h:16 msgid "Image per seconds" msgstr "Immagini al secondo" #. Caller une image sur le flux video #: ../ui/luciole.glade.h:18 msgid "Import images" msgstr "Importa immagini" #: ../ui/luciole.glade.h:19 msgid "Luciole on line" msgstr "Luciole on line" #: ../ui/luciole.glade.h:20 msgid "Mixer" msgstr "Mixer" #. Descendre un/ou plusieurs images #: ../ui/luciole.glade.h:22 msgid "Move down one or several images" msgstr "Sposta in basso una o più immagini" #. Déplacer des images capturées dans la zone de montage #: ../ui/luciole.glade.h:24 msgid "Move snapshot to montage area" msgstr "Sposta il fotogramma nell'area di montaggio" #. Monter un/ou plusieurs images #: ../ui/luciole.glade.h:26 msgid "Move up one or several images" msgstr "Sposta in alto una o più immagini" #: ../ui/luciole.glade.h:27 msgid "Open recent" msgstr "Apri recenti" #: ../ui/luciole.glade.h:28 msgid "Play video" msgstr "Riproduci video" #: ../ui/luciole.glade.h:29 msgid "Preferences" msgstr "Preferenze" #: ../ui/luciole.glade.h:30 ../lucioLib/gui/dialog_project_properties.py:105 msgid "Project properties" msgstr "Proprietà del progetto" #: ../ui/luciole.glade.h:31 msgid "Select Theme" msgstr "Selezione tema" #: ../ui/luciole.glade.h:32 msgid "Select a Luciole project" msgstr "Seleziona un progetto Luciole" #: ../ui/luciole.glade.h:33 ../ui/export_file.glade.h:11 #: ../lucioLib/gui/assistant_new_project.py:102 msgid "Select a folder" msgstr "Seleziona una cartella" #: ../ui/luciole.glade.h:34 msgid "" "Stop-motion tool for making animated cartoon\n" "Makes live video acquistion from Webcam or DV cam" msgstr "" "Strumento per fare animazioni stop-motion\n" "Acquisisce da segnale video da Webcam o videocamera DV" #: ../ui/luciole.glade.h:36 msgid "" "This program is free software; you can redistribute it and/or\n" "modify it under the terms of the GNU General Public License\n" "as published by the Free Software Foundation; either \n" "version 2 of the License, or (at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied \n" "warranty of MERCHANTABILITY or FITNESS FOR A \n" "PARTICULAR PURPOSE. See the GNU General Public \n" "License for more details.\n" "\n" "You should have received a copy of the GNU General Public\n" "License along with this program; if not, write to the \n" "Free Software Foundation, \n" "Inc., 59 Temple Place - \n" "Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Questo programma è software libero; puoi redistribuirlo e/o\n" "modificarlo sotto i termini della Licenza Pubblica Generale GNU\n" "come pubblicata dalla Free Software Foundation; o \n" "la versione 2 della Licenza, o (a tua scelta) ogni versione successiva.\n" "\n" "Questo programma è distribuito nella speranza che sia utile,\n" "ma SENZA ALCUNA GARANZIA; senza nemmeno la garanzia\n" "sottintesa di COMMERCIABILITÀ o ADATTABILITÀ AD UNO\n" "SCOPO PARTICOLARE. Consulta la Licenza Pubblica Generale\n" "GNU per ulteriori dettagli.\n" "\n" "Dovresti avere ricevuto una copia della Licenza Pubblica Generale\n" "GNU assieme a questo programma; se non l'hai ricevuta, scrivi alla \n" "Free Software Foundation, \n" "Inc., 59 Temple Place - \n" "Suite 330, Boston, MA 02111-1307, USA." #. Jeter à la poubelle #: ../ui/luciole.glade.h:53 msgid "To trash" msgstr "Sposta nel cestino" #: ../ui/luciole.glade.h:54 msgid "Tool Export" msgstr "Strumento per l'esportazione" #: ../ui/luciole.glade.h:55 msgid "Tropical" msgstr "Tropical" #: ../ui/luciole.glade.h:56 msgid "Video Export" msgstr "Esportazione video" #: ../ui/luciole.glade.h:57 msgid "_File" msgstr "_File" #: ../ui/luciole.glade.h:58 msgid "_Help" msgstr "_Aiuto" #: ../ui/luciole.glade.h:59 msgid "_View" msgstr "_Visualizza" #: ../ui/luciole.glade.h:60 msgid "make a snapshot" msgstr "cattura fotogramma" #: ../ui/luciole.glade.h:61 msgid "options" msgstr "opzioni" #: ../ui/luciole.glade.h:62 msgid "project1" msgstr "progetto1" #: ../ui/luciole.glade.h:63 msgid "project2" msgstr "progetto2" #: ../ui/luciole.glade.h:64 msgid "project3" msgstr "progetto3" #: ../ui/luciole.glade.h:65 msgid "project4" msgstr "progetto4" #: ../ui/luciole.glade.h:66 msgid "project5" msgstr "progetto5" #: ../ui/export_file.glade.h:1 msgid "Cinelerra" msgstr "Cinelerra" #: ../ui/export_file.glade.h:2 msgid "Coming soon" msgstr "In arrivo" #: ../ui/export_file.glade.h:3 msgid "Export to Kdenlive" msgstr "Esporta in Kdenlive" #: ../ui/export_file.glade.h:4 msgid "Export to another application" msgstr "Esporta in un'altra applicazione" #: ../ui/export_file.glade.h:5 msgid "Export to cinelerra" msgstr "Esporta in cinelerra" #: ../ui/export_file.glade.h:6 msgid "Export to pitivi" msgstr "Esporta in pitivi" #: ../ui/export_file.glade.h:7 msgid "Kdenlive" msgstr "Kdenlive" #: ../ui/export_file.glade.h:8 msgid "Openshot" msgstr "Openshot" #: ../ui/export_file.glade.h:9 msgid "Pitivi" msgstr "Pitivi" #: ../ui/export_file.glade.h:10 msgid "Select a filename" msgstr "Seleziona un nome file" #: ../ui/export_file.glade.h:12 msgid "Select an export directory" msgstr "Seleziona una directory di esportazione" #: ../ui/export_file.glade.h:13 msgid "Tool Exporter" msgstr "Strumento per l'esportazione" #: ../lucioLib/controller/controller_load_project.py:134 msgid "Project Load started" msgstr "Caricamento Progetto avviato" #: ../lucioLib/controller/controller_load_project.py:139 #, python-format msgid "Project %s is loaded" msgstr "Il progetto %s è stato caricato" #: ../lucioLib/controller/controller_load_project.py:145 #, python-format msgid "Project %s is loading" msgstr "Caricamento del progetto %s in corso" #: ../lucioLib/controller/controller_import.py:177 msgid "Import started" msgstr "Importazione avviata" #: ../lucioLib/controller/controller_import.py:182 msgid "All images imported" msgstr "Tutte le immagini sono state importate" #: ../lucioLib/controller/controller_import.py:188 msgid "Importing images ..." msgstr "Importazione immagini in corso ..." #: ../lucioLib/gui/dialog_project_properties.py:51 msgid "Project folder :" msgstr "Cartella progetto :" #: ../lucioLib/gui/dialog_project_properties.py:55 msgid "Project name :" msgstr "Nome progetto :" #: ../lucioLib/gui/dialog_project_properties.py:59 msgid "XML file :" msgstr "File XML :" #: ../lucioLib/gui/dialog_project_properties.py:64 msgid "Number of frames / image" msgstr "Numero di fotogrammi / immagini" #: ../lucioLib/gui/dialog_project_properties.py:68 msgid "Device type" msgstr "Tipo di dispositivo" #: ../lucioLib/gui/dialog_project_properties.py:76 msgid "Device :" msgstr "Dispositivo :" #: ../lucioLib/gui/dialog_project_properties.py:80 msgid "Webcam name :" msgstr "Nome webcam :" #: ../lucioLib/gui/dialog_project_properties.py:85 msgid "Video capture driver :" msgstr "Driver per la cattura video :" #: ../lucioLib/gui/dialog_project_properties.py:89 msgid "Video width :" msgstr "Larghezza video :" #: ../lucioLib/gui/dialog_project_properties.py:93 msgid "Video height :" msgstr "Altezza video :" #: ../lucioLib/gui/dialog_project_properties.py:97 msgid "" "Webcam framerate \n" " (number of images per second)" msgstr "" "Frequenza dei fotogrammi della webcam\n" " (numero di immagini al secondo)" #: ../lucioLib/gui/dialog_project_properties.py:213 #: ../lucioLib/gui/dialog_project_properties.py:229 msgid "desc" msgstr "desc" #: ../lucioLib/gui/dialog_project_properties.py:271 msgid "Webcam properties" msgstr "Proprietà webcam" #. #. Display Button fo webcam detetction #. #: ../lucioLib/gui/dialog_project_properties.py:300 msgid "Webcam detection" msgstr "Riconoscimento webcam" #: ../lucioLib/gui/luciole_export_window.py:174 #, python-format msgid "" "%s is not valid. Not valid video name. It should be a combination of " "alphanumeric and '_' characters " msgstr "" "%s non è valido. Nome video non valido. Deve essere una combinazione di " "caratteri alfanumerici e '_' " #. Launch Dialog window to ask if export file can be overide #. add message display #: ../lucioLib/gui/luciole_export_window.py:207 #: ../lucioLib/gui/luciole_export_tool_window.py:196 #, python-format msgid "File %s already exists. Replace file ?" msgstr "Il file %s esiste già. Vuoi sostituire il file ?" #: ../lucioLib/gui/luciole_export_tool_window.py:115 msgid "Select an application and a file name for export" msgstr "Seleziona un'applicazione ed il nome del file per l'esportazione" #. Terminated normaly #: ../lucioLib/gui/luciole_export_tool_window.py:209 #: ../lucioLib/lcl_export/lcl_export_video.py:207 msgid "Export Done" msgstr "Esportazione Completata" #. #. Initailize widgets for first page #. #. A label #: ../lucioLib/gui/assistant_new_project.py:59 msgid "" "This assistant will help you on configuration of a new Luciole project." msgstr "" "Questo assistente ti aiuterà nella configurazione di un nuovo progetto " "Luciole." #. A label #: ../lucioLib/gui/assistant_new_project.py:72 msgid "Select project name and destination folder." msgstr "Seleziona il nome del progetto e la cartella di destinazione." #. display project name #: ../lucioLib/gui/assistant_new_project.py:82 #: ../lucioLib/gui/assistant_new_project.py:362 msgid "Project Name" msgstr "Nome del progetto" #: ../lucioLib/gui/assistant_new_project.py:95 msgid "Folder" msgstr "Cartella" #. project with same name alreday exists #: ../lucioLib/gui/assistant_new_project.py:167 #, python-format msgid "The project %s already exists !" msgstr "Il progetto %s esiste già !" #. invalid projetc name #: ../lucioLib/gui/assistant_new_project.py:171 #, python-format msgid "" "%s isn't a valid project name. It should be a combination of alphanumeric " "and '_' characters " msgstr "" "%s non è un valido nome di progetto. Dev'essere una combinazione di " "caratteri alfanumerici e '_' " #: ../lucioLib/gui/assistant_new_project.py:226 msgid "Select a device" msgstr "Seleziona un dispositivo" #: ../lucioLib/gui/assistant_new_project.py:246 msgid "" " Other device.\n" "(Manual import)" msgstr "" " Altro dispositivo.\n" "(Importazione manuale)" #: ../lucioLib/gui/assistant_new_project.py:263 msgid "Images per second" msgstr "Immagini al secondo" #. display project path #: ../lucioLib/gui/assistant_new_project.py:366 msgid "Project Path" msgstr "Percorso Progetto" #: ../lucioLib/gui/assistant_new_project.py:375 msgid "Number of frames per seconds" msgstr "Numero di fotogrammi al secondo" #. display Hardware type #: ../lucioLib/gui/assistant_new_project.py:379 msgid "Hardware type" msgstr "Tipo di hardware" #. webcam name #: ../lucioLib/gui/assistant_new_project.py:385 msgid "Webcam name" msgstr "Nome webcam" #. webcam device #: ../lucioLib/gui/assistant_new_project.py:389 msgid "Webcam device" msgstr "Dispositivo webcam" #. webcam resolution #: ../lucioLib/gui/assistant_new_project.py:393 msgid "Webcam resolution used" msgstr "Risoluzione usata dalla webcam" #. webcam device #: ../lucioLib/gui/assistant_new_project.py:399 msgid "Webcam driver used" msgstr "Driver usato dalla webcam" #. Final message #: ../lucioLib/gui/assistant_new_project.py:404 msgid "Have fun with luciole !" msgstr "Divertiti con Luciole !" #: ../lucioLib/gui/assistant_new_project.py:434 msgid "Luciole project assistant" msgstr "Assistente di progetto per Luciole" #: ../lucioLib/gui/assistant_new_project.py:445 msgid " Select a project path " msgstr " Seleziona un percorso per il progetto " #: ../lucioLib/gui/assistant_new_project.py:454 msgid " Select hardware " msgstr " Seleziona hardware " #: ../lucioLib/gui/assistant_new_project.py:464 msgid " Webcam detection " msgstr " Riconoscimento webcam " #: ../lucioLib/gui/assistant_new_project.py:474 msgid " Project overview " msgstr " Visione d'insieme del progetto " #. create New button project #: ../lucioLib/gui/open_project_widget.py:50 msgid "Create a new project" msgstr "Crea un nuovo progetto" #. create open button project #: ../lucioLib/gui/open_project_widget.py:59 msgid "Open an existing project" msgstr "Apri un progetto esistente" #: ../lucioLib/gui/webcam_detection_widget.py:98 msgid "Please wait for webcam detection" msgstr "Attendere il riconoscimento della webcam" #: ../lucioLib/gui/webcam_detection_widget.py:103 msgid "Webcam detection done" msgstr "Riconoscimento webcam completato" #: ../lucioLib/gui/webcam_detection_widget.py:188 msgid "Detected webcam(s)" msgstr "Webcam riconosciute" #: ../lucioLib/gui/webcam_detection_widget.py:192 msgid "No webcam detected" msgstr "Nessuna webcam riconosciuta" #: ../lucioLib/gui/dialog.py:73 msgid "Select files to import" msgstr "Seleziona i file da importare" #: ../lucioLib/gui/dialog.py:114 msgid "Select a Folder" msgstr "Seleziona una Cartella" #: ../lucioLib/luciole_constants.py:42 msgid "OTHER DEVICE" msgstr "ALTRO DISPOSITIVO" #: ../lucioLib/luciole_controller.py:154 msgid " Webcam data not valid in project. Please restart webcam detection" msgstr "" " Dati della webcam non validi nel progetto. Avviare di nuovo il " "riconoscimento della webcam." #: ../lucioLib/luciole_controller.py:171 #, python-format msgid "Project %s saved" msgstr "Progetto %s salvato" #: ../lucioLib/luciole_controller.py:198 #, python-format msgid "Project saved as %s" msgstr "Progetto salvato come %s" #: ../lucioLib/luciole_controller.py:243 msgid "No files or valid files choosen for image import." msgstr "" "Nessun file o nessun file valido scelto per l'importazione delle immagini." #: ../lucioLib/luciole_controller.py:247 msgid "Impossible to import images when no project are loaded." msgstr "Impossibile importare immagini senza un progetto caricato." #: ../lucioLib/luciole_controller.py:275 ../lucioLib/luciole_controller.py:283 msgid "Nothing to export. No project loaded" msgstr "Niente da esportare. Nessun progetto caricato" #. nbd@grape to transform as error message #: ../lucioLib/luciole_controller.py:325 msgid "Can not play animantion : No image on montage view " msgstr "" "Impossibile riprodurre l'animazione : Non ci sono immagini nell'area di " "montaggio " #. nbd@grape to transform as error message #: ../lucioLib/luciole_controller.py:334 msgid "Can not play animantion : No project loaded " msgstr "" "Impossibile riprodurre l'animazione : Non è stato caricato alcun progetto " #. nbd@grape : ask for save if save set status as loaded #: ../lucioLib/luciole_controller.py:386 msgid "Save Project before closing" msgstr "Salva Progetto prima di chiudere" #: ../lucioLib/luciole_controller.py:412 #, python-format msgid "Project %s is closed" msgstr "Il progetto %s è stato chiuso" #. clear message status bar #: ../lucioLib/luciole_controller.py:433 msgid "Acquiring" msgstr "Acquisizione in corso" #. stop acquirer #: ../lucioLib/luciole_controller.py:450 msgid "" "No acquisition available. Use 'import image' button to load images in " "project." msgstr "" "Acquisizione non disponibile. Utilizzare il pulsante 'importa immagine' per " "caricare immagini nel progetto." #: ../lucioLib/luciole_controller.py:462 msgid " Can not start acquisition when no project are loaded." msgstr "" " È Impossibile avviare l'acquisizione se non è stato caricato alcun progetto." #: ../lucioLib/luciole_controller.py:471 #, python-format msgid "Acquisition error. %s" msgstr "Errore di acquisizione. %s" #: ../lucioLib/luciole_controller.py:485 msgid "No Acquistion" msgstr "Nessuna Acquisizione" #. nbd@grape : ask for save if save set status as loaded #: ../lucioLib/luciole_controller.py:574 msgid "Project modified. Save project before exit ?" msgstr "" "Il progetto è stato modificato. Salvare il progetto prima di uscire ?" #: ../lucioLib/luciole_controller.py:626 msgid "Please restart Luciole to take into account the new theme " msgstr "Riavviare Luciole per attivare il nuovo tema " #: ../lucioLib/luciole_controller.py:676 msgid "Failed to load project " msgstr "Caricamento progetto non riuscito " #: ../lucioLib/lcl_export/lcl_export_video.py:94 msgid "Pass 1/2" msgstr "Passaggio 1/2" #: ../lucioLib/lcl_export/lcl_export_video.py:103 msgid "Pass 2/2" msgstr "Passaggio 2/2" #: ../lucioLib/lcl_export/lcl_export_video.py:210 msgid "Export Canceled" msgstr "Esportazione Annullata" #: ../lucioLib/lcl_export/lcl_export_video.py:569 #: ../lucioLib/lcl_export/lcl_export_video.py:605 #: ../lucioLib/lcl_export/lcl_export_video.py:632 #, python-format msgid "Unable to erase : %s" msgstr "Cancellazione non effettuabile : %s" #: ../lucioLib/lcl_export/lcl_export_video.py:621 #, python-format msgid "Creation of export folder not possible -- %s" msgstr "Impossibile creare cartella di esportazione -- %s" #: ../lucioLib/luciole_manage_recent.py:95 #, python-format msgid "Project %s no more exist" msgstr "Il progetto %s non esiste più" #~ msgid "" #~ "DV format (raw DV)\n" #~ "Format DVD (mpeg2)\n" #~ "Format divx/xvid (avi)" #~ msgstr "" #~ "Formato DV (DV grezzo)\n" #~ "Formatta DVD (mpeg2)\n" #~ "Formatta divx/xvid (avi)" #~ msgid "Transparency level" #~ msgstr "Livello di trasparenza" #~ msgid "About" #~ msgstr "Riguardo A" #~ msgid "Copyright 2009 Nicolas Bertrand /GRAPE" #~ msgstr "Copyright 2009 Nicolas Bertrand /GRAPE" #~ msgid "" #~ "Default\n" #~ "Tropical" #~ msgstr "" #~ "Predefinito\n" #~ "Tropicale" #~ msgid "Mixer activation (onion skin)" #~ msgstr "Attivazione mixer (buccia di cipolla)" #~ msgid "Project Properties" #~ msgstr "Proprietà Progetto" #~ msgid "unknown video export command" #~ msgstr "comando di esportazione video sconosciuto" #~ msgid "Imposible to initialize player." #~ msgstr "Impossibile inizializzare il lettore." #, python-format #~ msgid "Not a file : %s" #~ msgstr "Non un file : %s" #~ msgid "Unable to erase" #~ msgstr "Non è stato possibile cancellare" #~ msgid "rush folder not valid" #~ msgstr "cartella di afflusso non valida" #~ msgid "" #~ "Elise : elise@inattendu.org\n" #~ "Dave : erpizzo@alice.it\n" #~ "Nounours : daniel@inattendu.org\n" #~ "Nico : nico@inattendu.org" #~ msgstr "" #~ "Elise : elise@inattendu.org\n" #~ "Dave : erpizzo@alice.it\n" #~ "Nounours : daniel@inattendu.org\n" #~ "Nico : nico@inattendu.org" #, python-format #~ msgid "The project already %s exists !" #~ msgstr "Il progetto %s esiste !" #, python-format #~ msgid "Error, path does not exist : %s" #~ msgstr "Errore, il percorso non esiste : %s" #, python-format #~ msgid "" #~ "%s is not valid. Not valid project name. It should be a combination of " #~ "alphanumeric and '_' characters " #~ msgstr "" #~ "%s non è valido. Nome progetto non valido. Dovrebbe essere una combinazione " #~ "di caratteri alfanumerici e '_' " luciole_0.8.6/po/hu.po0000644000175000017500000003540411437126703013311 0ustar niconico# Hungarian translation for luciole # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the luciole package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: luciole\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-02-14 16:37+0400\n" "PO-Revision-Date: 2010-04-25 21:18+0000\n" "Last-Translator: Krasznecz Zoltán \n" "Language-Team: Hungarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-04-26 03:43+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../ui/luciole.glade.h:1 msgid " " msgstr " " #: ../ui/luciole.glade.h:2 msgid " Export file name (without extension) :" msgstr "" #: ../ui/luciole.glade.h:3 msgid "About Luciole" msgstr "A Luciole névjegye" #: ../ui/luciole.glade.h:4 msgid "Activate/Deactivate camera preview" msgstr "" #: ../ui/luciole.glade.h:5 msgid "Add Trash to montage view" msgstr "" #: ../ui/luciole.glade.h:6 msgid "Choose export format." msgstr "" #: ../ui/luciole.glade.h:7 msgid "Copyright 2009-2010 Nicolas Bertrand (nico@inattendu.org)" msgstr "Copyright 2009-2010 Nicolas Bertrand (nico@inattendu.org)" #: ../ui/luciole.glade.h:8 msgid "DV format (raw DV)" msgstr "DV formátum (nyers DV)" #: ../ui/luciole.glade.h:9 msgid "Default" msgstr "Alapértelmezett" #: ../ui/luciole.glade.h:10 msgid "Export" msgstr "Exportálás" #: ../ui/luciole.glade.h:11 msgid "Export path:" msgstr "" #: ../ui/luciole.glade.h:12 msgid "Export video with sound." msgstr "" #: ../ui/luciole.glade.h:13 msgid "File format :" msgstr "Fájlformátum :" #: ../ui/luciole.glade.h:14 msgid "Format DVD (mpeg2)" msgstr "" #: ../ui/luciole.glade.h:15 msgid "Format divx/xvid (avi)" msgstr "" #: ../ui/luciole.glade.h:16 msgid "Image per seconds" msgstr "Képkockák másodpercenként" #. Caller une image sur le flux video #: ../ui/luciole.glade.h:18 msgid "Import images" msgstr "Képek importálása" #: ../ui/luciole.glade.h:19 msgid "Luciole on line" msgstr "Luciole online" #: ../ui/luciole.glade.h:20 msgid "Mixer" msgstr "Keverő" #. Descendre un/ou plusieurs images #: ../ui/luciole.glade.h:22 msgid "Move down one or several images" msgstr "" #. Déplacer des images capturées dans la zone de montage #: ../ui/luciole.glade.h:24 msgid "Move snapshot to montage area" msgstr "" #. Monter un/ou plusieurs images #: ../ui/luciole.glade.h:26 msgid "Move up one or several images" msgstr "" #: ../ui/luciole.glade.h:27 msgid "Open recent" msgstr "Legutóbbi megnyitása" #: ../ui/luciole.glade.h:28 msgid "Play video" msgstr "Videó lejátszása" #: ../ui/luciole.glade.h:29 msgid "Preferences" msgstr "Beállítások" #: ../ui/luciole.glade.h:30 ../lucioLib/gui/dialog_project_properties.py:105 msgid "Project properties" msgstr "Projekt tulajdonságai" #: ../ui/luciole.glade.h:31 msgid "Select Theme" msgstr "Téma kiválasztása" #: ../ui/luciole.glade.h:32 msgid "Select a Luciole project" msgstr "" #: ../ui/luciole.glade.h:33 ../ui/export_file.glade.h:11 #: ../lucioLib/gui/assistant_new_project.py:102 msgid "Select a folder" msgstr "Mappa kiválasztása" #: ../ui/luciole.glade.h:34 msgid "" "Stop-motion tool for making animated cartoon\n" "Makes live video acquistion from Webcam or DV cam" msgstr "" #: ../ui/luciole.glade.h:36 msgid "" "This program is free software; you can redistribute it and/or\n" "modify it under the terms of the GNU General Public License\n" "as published by the Free Software Foundation; either \n" "version 2 of the License, or (at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied \n" "warranty of MERCHANTABILITY or FITNESS FOR A \n" "PARTICULAR PURPOSE. See the GNU General Public \n" "License for more details.\n" "\n" "You should have received a copy of the GNU General Public\n" "License along with this program; if not, write to the \n" "Free Software Foundation, \n" "Inc., 59 Temple Place - \n" "Suite 330, Boston, MA 02111-1307, USA." msgstr "" #. Jeter à la poubelle #: ../ui/luciole.glade.h:53 msgid "To trash" msgstr "Kukába" #: ../ui/luciole.glade.h:54 msgid "Tool Export" msgstr "" #: ../ui/luciole.glade.h:55 msgid "Tropical" msgstr "Trópusi" #: ../ui/luciole.glade.h:56 msgid "Video Export" msgstr "" #: ../ui/luciole.glade.h:57 msgid "_File" msgstr "_Fájl" #: ../ui/luciole.glade.h:58 msgid "_Help" msgstr "_Súgó" #: ../ui/luciole.glade.h:59 msgid "_View" msgstr "_Nézet" #: ../ui/luciole.glade.h:60 msgid "make a snapshot" msgstr "" #: ../ui/luciole.glade.h:61 msgid "options" msgstr "beállítások" #: ../ui/luciole.glade.h:62 msgid "project1" msgstr "projekt 1" #: ../ui/luciole.glade.h:63 msgid "project2" msgstr "projekt 2" #: ../ui/luciole.glade.h:64 msgid "project3" msgstr "projekt 3" #: ../ui/luciole.glade.h:65 msgid "project4" msgstr "projekt 4" #: ../ui/luciole.glade.h:66 msgid "project5" msgstr "projekt 5" #: ../ui/export_file.glade.h:1 msgid "Cinelerra" msgstr "Cinelerra" #: ../ui/export_file.glade.h:2 msgid "Coming soon" msgstr "Hamarossan" #: ../ui/export_file.glade.h:3 msgid "Export to Kdenlive" msgstr "" #: ../ui/export_file.glade.h:4 msgid "Export to another application" msgstr "" #: ../ui/export_file.glade.h:5 msgid "Export to cinelerra" msgstr "" #: ../ui/export_file.glade.h:6 msgid "Export to pitivi" msgstr "" #: ../ui/export_file.glade.h:7 msgid "Kdenlive" msgstr "Kdenlive" #: ../ui/export_file.glade.h:8 msgid "Openshot" msgstr "Openshot" #: ../ui/export_file.glade.h:9 msgid "Pitivi" msgstr "Pitivi" #: ../ui/export_file.glade.h:10 msgid "Select a filename" msgstr "Fájlnév kiválasztása" #: ../ui/export_file.glade.h:12 msgid "Select an export directory" msgstr "" #: ../ui/export_file.glade.h:13 msgid "Tool Exporter" msgstr "" #: ../lucioLib/controller/controller_load_project.py:134 msgid "Project Load started" msgstr "Projekt betöltése elkezdve" #: ../lucioLib/controller/controller_load_project.py:139 #, python-format msgid "Project %s is loaded" msgstr "" #: ../lucioLib/controller/controller_load_project.py:145 #, python-format msgid "Project %s is loading" msgstr "" #: ../lucioLib/controller/controller_import.py:177 msgid "Import started" msgstr "Importálás elkezdve" #: ../lucioLib/controller/controller_import.py:182 msgid "All images imported" msgstr "" #: ../lucioLib/controller/controller_import.py:188 msgid "Importing images ..." msgstr "Kép importálása" #: ../lucioLib/gui/dialog_project_properties.py:51 msgid "Project folder :" msgstr "Projekt mappája :" #: ../lucioLib/gui/dialog_project_properties.py:55 msgid "Project name :" msgstr "Projekt neve :" #: ../lucioLib/gui/dialog_project_properties.py:59 msgid "XML file :" msgstr "XML fájl :" #: ../lucioLib/gui/dialog_project_properties.py:64 msgid "Number of frames / image" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:68 msgid "Device type" msgstr "Eszköz típusa" #: ../lucioLib/gui/dialog_project_properties.py:76 msgid "Device :" msgstr "Eszköz :" #: ../lucioLib/gui/dialog_project_properties.py:80 msgid "Webcam name :" msgstr "Webkamera neve :" #: ../lucioLib/gui/dialog_project_properties.py:85 msgid "Video capture driver :" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:89 msgid "Video width :" msgstr "Videó szélessége :" #: ../lucioLib/gui/dialog_project_properties.py:93 msgid "Video height :" msgstr "Videó magassága :" #: ../lucioLib/gui/dialog_project_properties.py:97 msgid "" "Webcam framerate \n" " (number of images per second)" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:213 #: ../lucioLib/gui/dialog_project_properties.py:229 msgid "desc" msgstr "leírás" #: ../lucioLib/gui/dialog_project_properties.py:271 msgid "Webcam properties" msgstr "" #. #. Display Button fo webcam detetction #. #: ../lucioLib/gui/dialog_project_properties.py:300 msgid "Webcam detection" msgstr "Webkamera felismerése" #: ../lucioLib/gui/luciole_export_window.py:174 #, python-format msgid "" "%s is not valid. Not valid video name. It should be a combination of " "alphanumeric and '_' characters " msgstr "" #. Launch Dialog window to ask if export file can be overide #. add message display #: ../lucioLib/gui/luciole_export_window.py:207 #: ../lucioLib/gui/luciole_export_tool_window.py:196 #, python-format msgid "File %s already exists. Replace file ?" msgstr "" #: ../lucioLib/gui/luciole_export_tool_window.py:115 msgid "Select an application and a file name for export" msgstr "" #. Terminated normaly #: ../lucioLib/gui/luciole_export_tool_window.py:209 #: ../lucioLib/lcl_export/lcl_export_video.py:207 msgid "Export Done" msgstr "" #. #. Initailize widgets for first page #. #. A label #: ../lucioLib/gui/assistant_new_project.py:59 msgid "" "This assistant will help you on configuration of a new Luciole project." msgstr "" #. A label #: ../lucioLib/gui/assistant_new_project.py:72 msgid "Select project name and destination folder." msgstr "" #. display project name #: ../lucioLib/gui/assistant_new_project.py:82 #: ../lucioLib/gui/assistant_new_project.py:362 msgid "Project Name" msgstr "Projektnév" #: ../lucioLib/gui/assistant_new_project.py:95 msgid "Folder" msgstr "Mappa" #. project with same name alreday exists #: ../lucioLib/gui/assistant_new_project.py:167 #, python-format msgid "The project %s already exists !" msgstr "A(z) %s projekt már létezik !" #. invalid projetc name #: ../lucioLib/gui/assistant_new_project.py:171 #, python-format msgid "" "%s isn't a valid project name. It should be a combination of alphanumeric " "and '_' characters " msgstr "" #: ../lucioLib/gui/assistant_new_project.py:226 msgid "Select a device" msgstr "Eszköz kiválasztása" #: ../lucioLib/gui/assistant_new_project.py:246 msgid "" " Other device.\n" "(Manual import)" msgstr "" #: ../lucioLib/gui/assistant_new_project.py:263 msgid "Images per second" msgstr "Képkockák másodpercenként" #. display project path #: ../lucioLib/gui/assistant_new_project.py:366 msgid "Project Path" msgstr "" #: ../lucioLib/gui/assistant_new_project.py:375 msgid "Number of frames per seconds" msgstr "" #. display Hardware type #: ../lucioLib/gui/assistant_new_project.py:379 msgid "Hardware type" msgstr "" #. webcam name #: ../lucioLib/gui/assistant_new_project.py:385 msgid "Webcam name" msgstr "Webkamera neve" #. webcam device #: ../lucioLib/gui/assistant_new_project.py:389 msgid "Webcam device" msgstr "" #. webcam resolution #: ../lucioLib/gui/assistant_new_project.py:393 msgid "Webcam resolution used" msgstr "" #. webcam device #: ../lucioLib/gui/assistant_new_project.py:399 msgid "Webcam driver used" msgstr "" #. Final message #: ../lucioLib/gui/assistant_new_project.py:404 msgid "Have fun with luciole !" msgstr "" #: ../lucioLib/gui/assistant_new_project.py:434 msgid "Luciole project assistant" msgstr "" #: ../lucioLib/gui/assistant_new_project.py:445 msgid " Select a project path " msgstr "" #: ../lucioLib/gui/assistant_new_project.py:454 msgid " Select hardware " msgstr "" #: ../lucioLib/gui/assistant_new_project.py:464 msgid " Webcam detection " msgstr "" #: ../lucioLib/gui/assistant_new_project.py:474 msgid " Project overview " msgstr "" #. create New button project #: ../lucioLib/gui/open_project_widget.py:50 msgid "Create a new project" msgstr "Új projekt létrehozása" #. create open button project #: ../lucioLib/gui/open_project_widget.py:59 msgid "Open an existing project" msgstr "Létező projekt megnyitása" #: ../lucioLib/gui/webcam_detection_widget.py:98 msgid "Please wait for webcam detection" msgstr "" #: ../lucioLib/gui/webcam_detection_widget.py:103 msgid "Webcam detection done" msgstr "" #: ../lucioLib/gui/webcam_detection_widget.py:188 msgid "Detected webcam(s)" msgstr "" #: ../lucioLib/gui/webcam_detection_widget.py:192 msgid "No webcam detected" msgstr "" #: ../lucioLib/gui/dialog.py:73 msgid "Select files to import" msgstr "" #: ../lucioLib/gui/dialog.py:114 msgid "Select a Folder" msgstr "" #: ../lucioLib/luciole_constants.py:42 msgid "OTHER DEVICE" msgstr "" #: ../lucioLib/luciole_controller.py:154 msgid " Webcam data not valid in project. Please restart webcam detection" msgstr "" #: ../lucioLib/luciole_controller.py:171 #, python-format msgid "Project %s saved" msgstr "" #: ../lucioLib/luciole_controller.py:198 #, python-format msgid "Project saved as %s" msgstr "" #: ../lucioLib/luciole_controller.py:243 msgid "No files or valid files choosen for image import." msgstr "" #: ../lucioLib/luciole_controller.py:247 msgid "Impossible to import images when no project are loaded." msgstr "" #: ../lucioLib/luciole_controller.py:275 ../lucioLib/luciole_controller.py:283 msgid "Nothing to export. No project loaded" msgstr "" #. nbd@grape to transform as error message #: ../lucioLib/luciole_controller.py:325 msgid "Can not play animantion : No image on montage view " msgstr "" #. nbd@grape to transform as error message #: ../lucioLib/luciole_controller.py:334 msgid "Can not play animantion : No project loaded " msgstr "" #. nbd@grape : ask for save if save set status as loaded #: ../lucioLib/luciole_controller.py:386 msgid "Save Project before closing" msgstr "" #: ../lucioLib/luciole_controller.py:412 #, python-format msgid "Project %s is closed" msgstr "" #. clear message status bar #: ../lucioLib/luciole_controller.py:433 msgid "Acquiring" msgstr "" #. stop acquirer #: ../lucioLib/luciole_controller.py:450 msgid "" "No acquisition available. Use 'import image' button to load images in " "project." msgstr "" #: ../lucioLib/luciole_controller.py:462 msgid " Can not start acquisition when no project are loaded." msgstr "" #: ../lucioLib/luciole_controller.py:471 #, python-format msgid "Acquisition error. %s" msgstr "" #: ../lucioLib/luciole_controller.py:485 msgid "No Acquistion" msgstr "" #. nbd@grape : ask for save if save set status as loaded #: ../lucioLib/luciole_controller.py:574 msgid "Project modified. Save project before exit ?" msgstr "" #: ../lucioLib/luciole_controller.py:626 msgid "Please restart Luciole to take into account the new theme " msgstr "" #: ../lucioLib/luciole_controller.py:676 msgid "Failed to load project " msgstr "" #: ../lucioLib/lcl_export/lcl_export_video.py:94 msgid "Pass 1/2" msgstr "" #: ../lucioLib/lcl_export/lcl_export_video.py:103 msgid "Pass 2/2" msgstr "" #: ../lucioLib/lcl_export/lcl_export_video.py:210 msgid "Export Canceled" msgstr "" #: ../lucioLib/lcl_export/lcl_export_video.py:569 #: ../lucioLib/lcl_export/lcl_export_video.py:605 #: ../lucioLib/lcl_export/lcl_export_video.py:632 #, python-format msgid "Unable to erase : %s" msgstr "" #: ../lucioLib/lcl_export/lcl_export_video.py:621 #, python-format msgid "Creation of export folder not possible -- %s" msgstr "" #: ../lucioLib/luciole_manage_recent.py:95 #, python-format msgid "Project %s no more exist" msgstr "" luciole_0.8.6/po/he.po0000644000175000017500000003401211437126703013263 0ustar niconico# Hebrew translation for luciole # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the luciole package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: luciole\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-02-14 16:37+0400\n" "PO-Revision-Date: 2010-08-25 10:10+0000\n" "Last-Translator: Yaron \n" "Language-Team: Hebrew \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-08-26 03:58+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../ui/luciole.glade.h:1 msgid " " msgstr " " #: ../ui/luciole.glade.h:2 msgid " Export file name (without extension) :" msgstr "" #: ../ui/luciole.glade.h:3 msgid "About Luciole" msgstr "על אודות Luciole" #: ../ui/luciole.glade.h:4 msgid "Activate/Deactivate camera preview" msgstr "" #: ../ui/luciole.glade.h:5 msgid "Add Trash to montage view" msgstr "" #: ../ui/luciole.glade.h:6 msgid "Choose export format." msgstr "" #: ../ui/luciole.glade.h:7 msgid "Copyright 2009-2010 Nicolas Bertrand (nico@inattendu.org)" msgstr "" "כל הזכויות שמורות 2010-2009 ל־Nicolas Bertrand‏ (nico@inattendu.org)" #: ../ui/luciole.glade.h:8 msgid "DV format (raw DV)" msgstr "" #: ../ui/luciole.glade.h:9 msgid "Default" msgstr "בררת מחדל" #: ../ui/luciole.glade.h:10 msgid "Export" msgstr "יצוא" #: ../ui/luciole.glade.h:11 msgid "Export path:" msgstr "" #: ../ui/luciole.glade.h:12 msgid "Export video with sound." msgstr "" #: ../ui/luciole.glade.h:13 msgid "File format :" msgstr "" #: ../ui/luciole.glade.h:14 msgid "Format DVD (mpeg2)" msgstr "" #: ../ui/luciole.glade.h:15 msgid "Format divx/xvid (avi)" msgstr "" #: ../ui/luciole.glade.h:16 msgid "Image per seconds" msgstr "" #. Caller une image sur le flux video #: ../ui/luciole.glade.h:18 msgid "Import images" msgstr "" #: ../ui/luciole.glade.h:19 msgid "Luciole on line" msgstr "" #: ../ui/luciole.glade.h:20 msgid "Mixer" msgstr "" #. Descendre un/ou plusieurs images #: ../ui/luciole.glade.h:22 msgid "Move down one or several images" msgstr "" #. Déplacer des images capturées dans la zone de montage #: ../ui/luciole.glade.h:24 msgid "Move snapshot to montage area" msgstr "" #. Monter un/ou plusieurs images #: ../ui/luciole.glade.h:26 msgid "Move up one or several images" msgstr "" #: ../ui/luciole.glade.h:27 msgid "Open recent" msgstr "" #: ../ui/luciole.glade.h:28 msgid "Play video" msgstr "" #: ../ui/luciole.glade.h:29 msgid "Preferences" msgstr "" #: ../ui/luciole.glade.h:30 ../lucioLib/gui/dialog_project_properties.py:105 msgid "Project properties" msgstr "" #: ../ui/luciole.glade.h:31 msgid "Select Theme" msgstr "" #: ../ui/luciole.glade.h:32 msgid "Select a Luciole project" msgstr "" #: ../ui/luciole.glade.h:33 ../ui/export_file.glade.h:11 #: ../lucioLib/gui/assistant_new_project.py:102 msgid "Select a folder" msgstr "" #: ../ui/luciole.glade.h:34 msgid "" "Stop-motion tool for making animated cartoon\n" "Makes live video acquistion from Webcam or DV cam" msgstr "" #: ../ui/luciole.glade.h:36 msgid "" "This program is free software; you can redistribute it and/or\n" "modify it under the terms of the GNU General Public License\n" "as published by the Free Software Foundation; either \n" "version 2 of the License, or (at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied \n" "warranty of MERCHANTABILITY or FITNESS FOR A \n" "PARTICULAR PURPOSE. See the GNU General Public \n" "License for more details.\n" "\n" "You should have received a copy of the GNU General Public\n" "License along with this program; if not, write to the \n" "Free Software Foundation, \n" "Inc., 59 Temple Place - \n" "Suite 330, Boston, MA 02111-1307, USA." msgstr "" #. Jeter à la poubelle #: ../ui/luciole.glade.h:53 msgid "To trash" msgstr "" #: ../ui/luciole.glade.h:54 msgid "Tool Export" msgstr "" #: ../ui/luciole.glade.h:55 msgid "Tropical" msgstr "" #: ../ui/luciole.glade.h:56 msgid "Video Export" msgstr "" #: ../ui/luciole.glade.h:57 msgid "_File" msgstr "" #: ../ui/luciole.glade.h:58 msgid "_Help" msgstr "" #: ../ui/luciole.glade.h:59 msgid "_View" msgstr "" #: ../ui/luciole.glade.h:60 msgid "make a snapshot" msgstr "" #: ../ui/luciole.glade.h:61 msgid "options" msgstr "" #: ../ui/luciole.glade.h:62 msgid "project1" msgstr "" #: ../ui/luciole.glade.h:63 msgid "project2" msgstr "" #: ../ui/luciole.glade.h:64 msgid "project3" msgstr "" #: ../ui/luciole.glade.h:65 msgid "project4" msgstr "" #: ../ui/luciole.glade.h:66 msgid "project5" msgstr "" #: ../ui/export_file.glade.h:1 msgid "Cinelerra" msgstr "" #: ../ui/export_file.glade.h:2 msgid "Coming soon" msgstr "" #: ../ui/export_file.glade.h:3 msgid "Export to Kdenlive" msgstr "" #: ../ui/export_file.glade.h:4 msgid "Export to another application" msgstr "" #: ../ui/export_file.glade.h:5 msgid "Export to cinelerra" msgstr "" #: ../ui/export_file.glade.h:6 msgid "Export to pitivi" msgstr "" #: ../ui/export_file.glade.h:7 msgid "Kdenlive" msgstr "" #: ../ui/export_file.glade.h:8 msgid "Openshot" msgstr "" #: ../ui/export_file.glade.h:9 msgid "Pitivi" msgstr "" #: ../ui/export_file.glade.h:10 msgid "Select a filename" msgstr "" #: ../ui/export_file.glade.h:12 msgid "Select an export directory" msgstr "" #: ../ui/export_file.glade.h:13 msgid "Tool Exporter" msgstr "" #: ../lucioLib/controller/controller_load_project.py:134 msgid "Project Load started" msgstr "" #: ../lucioLib/controller/controller_load_project.py:139 #, python-format msgid "Project %s is loaded" msgstr "" #: ../lucioLib/controller/controller_load_project.py:145 #, python-format msgid "Project %s is loading" msgstr "" #: ../lucioLib/controller/controller_import.py:177 msgid "Import started" msgstr "" #: ../lucioLib/controller/controller_import.py:182 msgid "All images imported" msgstr "" #: ../lucioLib/controller/controller_import.py:188 msgid "Importing images ..." msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:51 msgid "Project folder :" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:55 msgid "Project name :" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:59 msgid "XML file :" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:64 msgid "Number of frames / image" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:68 msgid "Device type" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:76 msgid "Device :" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:80 msgid "Webcam name :" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:85 msgid "Video capture driver :" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:89 msgid "Video width :" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:93 msgid "Video height :" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:97 msgid "" "Webcam framerate \n" " (number of images per second)" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:213 #: ../lucioLib/gui/dialog_project_properties.py:229 msgid "desc" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:271 msgid "Webcam properties" msgstr "" #. #. Display Button fo webcam detetction #. #: ../lucioLib/gui/dialog_project_properties.py:300 msgid "Webcam detection" msgstr "" #: ../lucioLib/gui/luciole_export_window.py:174 #, python-format msgid "" "%s is not valid. Not valid video name. It should be a combination of " "alphanumeric and '_' characters " msgstr "" #. Launch Dialog window to ask if export file can be overide #. add message display #: ../lucioLib/gui/luciole_export_window.py:207 #: ../lucioLib/gui/luciole_export_tool_window.py:196 #, python-format msgid "File %s already exists. Replace file ?" msgstr "" #: ../lucioLib/gui/luciole_export_tool_window.py:115 msgid "Select an application and a file name for export" msgstr "" #. Terminated normaly #: ../lucioLib/gui/luciole_export_tool_window.py:209 #: ../lucioLib/lcl_export/lcl_export_video.py:207 msgid "Export Done" msgstr "" #. #. Initailize widgets for first page #. #. A label #: ../lucioLib/gui/assistant_new_project.py:59 msgid "" "This assistant will help you on configuration of a new Luciole project." msgstr "" #. A label #: ../lucioLib/gui/assistant_new_project.py:72 msgid "Select project name and destination folder." msgstr "" #. display project name #: ../lucioLib/gui/assistant_new_project.py:82 #: ../lucioLib/gui/assistant_new_project.py:362 msgid "Project Name" msgstr "" #: ../lucioLib/gui/assistant_new_project.py:95 msgid "Folder" msgstr "" #. project with same name alreday exists #: ../lucioLib/gui/assistant_new_project.py:167 #, python-format msgid "The project %s already exists !" msgstr "" #. invalid projetc name #: ../lucioLib/gui/assistant_new_project.py:171 #, python-format msgid "" "%s isn't a valid project name. It should be a combination of alphanumeric " "and '_' characters " msgstr "" #: ../lucioLib/gui/assistant_new_project.py:226 msgid "Select a device" msgstr "" #: ../lucioLib/gui/assistant_new_project.py:246 msgid "" " Other device.\n" "(Manual import)" msgstr "" #: ../lucioLib/gui/assistant_new_project.py:263 msgid "Images per second" msgstr "" #. display project path #: ../lucioLib/gui/assistant_new_project.py:366 msgid "Project Path" msgstr "" #: ../lucioLib/gui/assistant_new_project.py:375 msgid "Number of frames per seconds" msgstr "" #. display Hardware type #: ../lucioLib/gui/assistant_new_project.py:379 msgid "Hardware type" msgstr "" #. webcam name #: ../lucioLib/gui/assistant_new_project.py:385 msgid "Webcam name" msgstr "" #. webcam device #: ../lucioLib/gui/assistant_new_project.py:389 msgid "Webcam device" msgstr "" #. webcam resolution #: ../lucioLib/gui/assistant_new_project.py:393 msgid "Webcam resolution used" msgstr "" #. webcam device #: ../lucioLib/gui/assistant_new_project.py:399 msgid "Webcam driver used" msgstr "" #. Final message #: ../lucioLib/gui/assistant_new_project.py:404 msgid "Have fun with luciole !" msgstr "" #: ../lucioLib/gui/assistant_new_project.py:434 msgid "Luciole project assistant" msgstr "" #: ../lucioLib/gui/assistant_new_project.py:445 msgid " Select a project path " msgstr "" #: ../lucioLib/gui/assistant_new_project.py:454 msgid " Select hardware " msgstr "" #: ../lucioLib/gui/assistant_new_project.py:464 msgid " Webcam detection " msgstr "" #: ../lucioLib/gui/assistant_new_project.py:474 msgid " Project overview " msgstr "" #. create New button project #: ../lucioLib/gui/open_project_widget.py:50 msgid "Create a new project" msgstr "" #. create open button project #: ../lucioLib/gui/open_project_widget.py:59 msgid "Open an existing project" msgstr "" #: ../lucioLib/gui/webcam_detection_widget.py:98 msgid "Please wait for webcam detection" msgstr "" #: ../lucioLib/gui/webcam_detection_widget.py:103 msgid "Webcam detection done" msgstr "" #: ../lucioLib/gui/webcam_detection_widget.py:188 msgid "Detected webcam(s)" msgstr "" #: ../lucioLib/gui/webcam_detection_widget.py:192 msgid "No webcam detected" msgstr "" #: ../lucioLib/gui/dialog.py:73 msgid "Select files to import" msgstr "" #: ../lucioLib/gui/dialog.py:114 msgid "Select a Folder" msgstr "" #: ../lucioLib/luciole_constants.py:42 msgid "OTHER DEVICE" msgstr "" #: ../lucioLib/luciole_controller.py:154 msgid " Webcam data not valid in project. Please restart webcam detection" msgstr "" #: ../lucioLib/luciole_controller.py:171 #, python-format msgid "Project %s saved" msgstr "" #: ../lucioLib/luciole_controller.py:198 #, python-format msgid "Project saved as %s" msgstr "" #: ../lucioLib/luciole_controller.py:243 msgid "No files or valid files choosen for image import." msgstr "" #: ../lucioLib/luciole_controller.py:247 msgid "Impossible to import images when no project are loaded." msgstr "" #: ../lucioLib/luciole_controller.py:275 ../lucioLib/luciole_controller.py:283 msgid "Nothing to export. No project loaded" msgstr "" #. nbd@grape to transform as error message #: ../lucioLib/luciole_controller.py:325 msgid "Can not play animantion : No image on montage view " msgstr "" #. nbd@grape to transform as error message #: ../lucioLib/luciole_controller.py:334 msgid "Can not play animantion : No project loaded " msgstr "" #. nbd@grape : ask for save if save set status as loaded #: ../lucioLib/luciole_controller.py:386 msgid "Save Project before closing" msgstr "" #: ../lucioLib/luciole_controller.py:412 #, python-format msgid "Project %s is closed" msgstr "" #. clear message status bar #: ../lucioLib/luciole_controller.py:433 msgid "Acquiring" msgstr "" #. stop acquirer #: ../lucioLib/luciole_controller.py:450 msgid "" "No acquisition available. Use 'import image' button to load images in " "project." msgstr "" #: ../lucioLib/luciole_controller.py:462 msgid " Can not start acquisition when no project are loaded." msgstr "" #: ../lucioLib/luciole_controller.py:471 #, python-format msgid "Acquisition error. %s" msgstr "" #: ../lucioLib/luciole_controller.py:485 msgid "No Acquistion" msgstr "" #. nbd@grape : ask for save if save set status as loaded #: ../lucioLib/luciole_controller.py:574 msgid "Project modified. Save project before exit ?" msgstr "" #: ../lucioLib/luciole_controller.py:626 msgid "Please restart Luciole to take into account the new theme " msgstr "" #: ../lucioLib/luciole_controller.py:676 msgid "Failed to load project " msgstr "" #: ../lucioLib/lcl_export/lcl_export_video.py:94 msgid "Pass 1/2" msgstr "" #: ../lucioLib/lcl_export/lcl_export_video.py:103 msgid "Pass 2/2" msgstr "" #: ../lucioLib/lcl_export/lcl_export_video.py:210 msgid "Export Canceled" msgstr "" #: ../lucioLib/lcl_export/lcl_export_video.py:569 #: ../lucioLib/lcl_export/lcl_export_video.py:605 #: ../lucioLib/lcl_export/lcl_export_video.py:632 #, python-format msgid "Unable to erase : %s" msgstr "" #: ../lucioLib/lcl_export/lcl_export_video.py:621 #, python-format msgid "Creation of export folder not possible -- %s" msgstr "" #: ../lucioLib/luciole_manage_recent.py:95 #, python-format msgid "Project %s no more exist" msgstr "" luciole_0.8.6/po/fr.po0000644000175000017500000005117311437126703013305 0ustar niconico# French translations for myrtille-i package. # Copyright (C) 2008 THE myrtille-i'S COPYRIGHT HOLDER # This file is distributed under the same license as the myrtille-i package. # nico , 2008. # nico , 2009. # # msgid "" msgstr "" "Project-Id-Version: myrtille export\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-02-14 16:37+0400\n" "PO-Revision-Date: 2010-02-15 05:19+0000\n" "Last-Translator: NicoInattendu \n" "Language-Team: French \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-02-15 14:58+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. Monter un/ou plusieurs images #: ../ui/luciole.glade.h:26 msgid "Move up one or several images" msgstr "Monter une ou plusieurs images" #: ../ui/luciole.glade.h:1 msgid " " msgstr " " #: ../ui/luciole.glade.h:2 msgid " Export file name (without extension) :" msgstr " Nom du fichier (sans extension)" #: ../ui/luciole.glade.h:3 msgid "About Luciole" msgstr "À propos de Luciole" #: ../ui/luciole.glade.h:4 msgid "Activate/Deactivate camera preview" msgstr "Activer/Désactiver l'aperçu caméra" #: ../ui/luciole.glade.h:5 msgid "Add Trash to montage view" msgstr "Ajouter une poubelle à la zone de capture" #: ../ui/luciole.glade.h:6 msgid "Choose export format." msgstr "Choisir un format d'export" #: ../ui/luciole.glade.h:7 msgid "Copyright 2009-2010 Nicolas Bertrand (nico@inattendu.org)" msgstr "Copyright 2009-2010 Nicolas Bertrand (nico@inattendu.org)" #: ../ui/luciole.glade.h:8 msgid "DV format (raw DV)" msgstr "Format DV (raw DV)" #: ../ui/luciole.glade.h:9 msgid "Default" msgstr "Défaut" #: ../ui/luciole.glade.h:10 msgid "Export" msgstr "Exporter" #: ../ui/luciole.glade.h:11 msgid "Export path:" msgstr "Chemin d'export :" #: ../ui/luciole.glade.h:12 msgid "Export video with sound." msgstr "Exporter la vidéo avec le son" #: ../ui/luciole.glade.h:13 msgid "File format :" msgstr "Format du fichier :" #: ../ui/luciole.glade.h:14 msgid "Format DVD (mpeg2)" msgstr "Format DVD (mpeg2)" #: ../ui/luciole.glade.h:15 msgid "Format divx/xvid (avi)" msgstr "Format divx/xvid (avi)" #: ../ui/luciole.glade.h:16 msgid "Image per seconds" msgstr "Images par seconde" #. Caller une image sur le flux video #: ../ui/luciole.glade.h:18 msgid "Import images" msgstr "Importer des images" #: ../ui/luciole.glade.h:19 msgid "Luciole on line" msgstr "Luciole en ligne" #: ../ui/luciole.glade.h:20 msgid "Mixer" msgstr "Mixer" #. Descendre un/ou plusieurs images #: ../ui/luciole.glade.h:22 msgid "Move down one or several images" msgstr "Descendre une ou plusieurs images" #. Déplacer des images capturées dans la zone de montage #: ../ui/luciole.glade.h:24 msgid "Move snapshot to montage area" msgstr "Déplacer les images capturées dans la zone de montage" #: ../ui/luciole.glade.h:27 msgid "Open recent" msgstr "Ouvrir un projet récent" #: ../ui/luciole.glade.h:28 msgid "Play video" msgstr "Lire la vidéo" #: ../ui/luciole.glade.h:29 msgid "Preferences" msgstr "Préférences" #: ../ui/luciole.glade.h:30 ../lucioLib/gui/dialog_project_properties.py:105 msgid "Project properties" msgstr "Propriétés du projet" #: ../ui/luciole.glade.h:31 msgid "Select Theme" msgstr "Choisir un thème" #: ../ui/luciole.glade.h:32 msgid "Select a Luciole project" msgstr "Choisir un projet Luciole" #: ../ui/luciole.glade.h:33 ../ui/export_file.glade.h:11 #: ../lucioLib/gui/assistant_new_project.py:102 msgid "Select a folder" msgstr "Sélectionner un dossier" #: ../ui/luciole.glade.h:34 msgid "" "Stop-motion tool for making animated cartoon\n" "Makes live video acquistion from Webcam or DV cam" msgstr "" "Outil de capture image par image dédié à la réalisation de films " "d’animation.\n" "Permet de faire de la capture en temps réel depuis une webcam ou une caméra " "DV" #: ../ui/luciole.glade.h:36 msgid "" "This program is free software; you can redistribute it and/or\n" "modify it under the terms of the GNU General Public License\n" "as published by the Free Software Foundation; either \n" "version 2 of the License, or (at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied \n" "warranty of MERCHANTABILITY or FITNESS FOR A \n" "PARTICULAR PURPOSE. See the GNU General Public \n" "License for more details.\n" "\n" "You should have received a copy of the GNU General Public\n" "License along with this program; if not, write to the \n" "Free Software Foundation, \n" "Inc., 59 Temple Place - \n" "Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Ce programme est un logiciel libre, vous pouvez le redistribuer et / ou le \n" "modifier selon les termes de la GNU General Public License publiée par la \n" "Free Software Foundation ; soit la version 2 de la Licence, ou (à votre \n" "convenance) toute version ultérieure.\n" "Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE " "\n" "GARANTIE ; sans même une garantie implicite de commercialisation ou \n" "d'adaptation à un USAGE PARTICULIER. Voir la GNU General Public\n" "License pour plus de détails.\n" "Vous devriez avoir reçu une copie de la GNU General Public License avec ce \n" "programme ; sinon, écrivez à la\n" "Free Software Foundation,\n" "Inc, 59 Temple Place -\n" "Suite 330, Boston, MA 02111-1307, USA." #. Jeter à la poubelle #: ../ui/luciole.glade.h:53 msgid "To trash" msgstr "Mettre à la poubelle" #: ../ui/luciole.glade.h:54 msgid "Tool Export" msgstr "Exports spécifiques" #: ../ui/luciole.glade.h:55 msgid "Tropical" msgstr "Tropical" #: ../ui/luciole.glade.h:56 msgid "Video Export" msgstr "Export vidéo" #: ../ui/luciole.glade.h:57 msgid "_File" msgstr "_Fichier" #: ../ui/luciole.glade.h:58 msgid "_Help" msgstr "Aide" #: ../ui/luciole.glade.h:59 msgid "_View" msgstr "_Affichage" #: ../ui/luciole.glade.h:60 msgid "make a snapshot" msgstr "Capturer une image" #: ../ui/luciole.glade.h:61 msgid "options" msgstr "Options" #: ../ui/luciole.glade.h:62 msgid "project1" msgstr "projet1" #: ../ui/luciole.glade.h:63 msgid "project2" msgstr "projet2" #: ../ui/luciole.glade.h:64 msgid "project3" msgstr "projet3" #: ../ui/luciole.glade.h:65 msgid "project4" msgstr "projet4" #: ../ui/luciole.glade.h:66 msgid "project5" msgstr "projet5" #: ../ui/export_file.glade.h:1 msgid "Cinelerra" msgstr "Cinelerra" #: ../ui/export_file.glade.h:2 msgid "Coming soon" msgstr "Bientôt disponible" #: ../ui/export_file.glade.h:3 msgid "Export to Kdenlive" msgstr "Export vers Kdenlive" #: ../ui/export_file.glade.h:4 msgid "Export to another application" msgstr "Export vers d'autres application video" #: ../ui/export_file.glade.h:5 msgid "Export to cinelerra" msgstr "Export vers cinlerra" #: ../ui/export_file.glade.h:6 msgid "Export to pitivi" msgstr "Export vers pitivi" #: ../ui/export_file.glade.h:7 msgid "Kdenlive" msgstr "Kdenlive" #: ../ui/export_file.glade.h:8 msgid "Openshot" msgstr "Openshot" #: ../ui/export_file.glade.h:9 msgid "Pitivi" msgstr "Pitivi" #: ../ui/export_file.glade.h:10 msgid "Select a filename" msgstr "Choisisr un nom de fichier" #: ../ui/export_file.glade.h:12 msgid "Select an export directory" msgstr "Choisir un dossier d'export" #: ../ui/export_file.glade.h:13 msgid "Tool Exporter" msgstr "Export vers une autre application" #: ../lucioLib/controller/controller_load_project.py:134 msgid "Project Load started" msgstr "Chargement du projet démarré" #: ../lucioLib/controller/controller_load_project.py:139 #, python-format msgid "Project %s is loaded" msgstr "Le projet %s est chargé" #: ../lucioLib/controller/controller_load_project.py:145 #, python-format msgid "Project %s is loading" msgstr "Le projet %s est en cours de chargement" #: ../lucioLib/controller/controller_import.py:177 msgid "Import started" msgstr "Import démarré" #: ../lucioLib/controller/controller_import.py:182 msgid "All images imported" msgstr "Toutes les images ont été importées" #: ../lucioLib/controller/controller_import.py:188 msgid "Importing images ..." msgstr "Images en cours d'importation..." #: ../lucioLib/gui/dialog_project_properties.py:51 msgid "Project folder :" msgstr "Dossier du projet :" #: ../lucioLib/gui/dialog_project_properties.py:55 msgid "Project name :" msgstr "Nom du projet :" #: ../lucioLib/gui/dialog_project_properties.py:59 msgid "XML file :" msgstr "Fichier XML :" #: ../lucioLib/gui/dialog_project_properties.py:64 msgid "Number of frames / image" msgstr "Nombre de frame / image" #: ../lucioLib/gui/dialog_project_properties.py:68 msgid "Device type" msgstr "Type de périphérique" #: ../lucioLib/gui/dialog_project_properties.py:76 msgid "Device :" msgstr "Chemin du périphérique :" #: ../lucioLib/gui/dialog_project_properties.py:80 msgid "Webcam name :" msgstr "Nom de la webcam :" #: ../lucioLib/gui/dialog_project_properties.py:85 msgid "Video capture driver :" msgstr "Driver de capture vidéo :" #: ../lucioLib/gui/dialog_project_properties.py:89 msgid "Video width :" msgstr "Largeur :" #: ../lucioLib/gui/dialog_project_properties.py:93 msgid "Video height :" msgstr "Hauteur :" #: ../lucioLib/gui/dialog_project_properties.py:97 msgid "" "Webcam framerate \n" " (number of images per second)" msgstr "" "Flux d'image de la webcam\n" " (nombre d'image par seconde)" #: ../lucioLib/gui/dialog_project_properties.py:213 #: ../lucioLib/gui/dialog_project_properties.py:229 msgid "desc" msgstr "desc" #: ../lucioLib/gui/dialog_project_properties.py:271 msgid "Webcam properties" msgstr "Propriétés de la webcam" #. #. Display Button fo webcam detetction #. #: ../lucioLib/gui/dialog_project_properties.py:300 msgid "Webcam detection" msgstr "Détecter la webcam" #: ../lucioLib/gui/luciole_export_window.py:174 #, python-format msgid "" "%s is not valid. Not valid video name. It should be a combination of " "alphanumeric and '_' characters " msgstr "" "%s n'est pas valide. Nom de fichier vidéo invalide. Utilisez une combinaison " "de caractères alphanumériques et '_' " #. Launch Dialog window to ask if export file can be overide #. add message display #: ../lucioLib/gui/luciole_export_window.py:207 #: ../lucioLib/gui/luciole_export_tool_window.py:196 #, python-format msgid "File %s already exists. Replace file ?" msgstr "Le fichier %s existe déjà. Voulez-vous le remplacer ?" #: ../lucioLib/gui/luciole_export_tool_window.py:115 msgid "Select an application and a file name for export" msgstr "Choisir le type d'export, un dossier et un nom de fichier." #. Terminated normaly #: ../lucioLib/gui/luciole_export_tool_window.py:209 #: ../lucioLib/lcl_export/lcl_export_video.py:207 msgid "Export Done" msgstr "Export terminé" #. #. Initailize widgets for first page #. #. A label #: ../lucioLib/gui/assistant_new_project.py:59 msgid "" "This assistant will help you on configuration of a new Luciole project." msgstr "" "Cet assistant va vous aider dans la configuration d'un nouveau projet " "Luciole." #. A label #: ../lucioLib/gui/assistant_new_project.py:72 msgid "Select project name and destination folder." msgstr "Choisir un nom de projet et un répertoire." #. display project name #: ../lucioLib/gui/assistant_new_project.py:82 #: ../lucioLib/gui/assistant_new_project.py:362 msgid "Project Name" msgstr "Nom de projet" #: ../lucioLib/gui/assistant_new_project.py:95 msgid "Folder" msgstr "Dossier" #. project with same name alreday exists #: ../lucioLib/gui/assistant_new_project.py:167 #, python-format msgid "The project %s already exists !" msgstr "Le projet %s existe déjà !" #. invalid projetc name #: ../lucioLib/gui/assistant_new_project.py:171 #, python-format msgid "" "%s isn't a valid project name. It should be a combination of alphanumeric " "and '_' characters " msgstr "" "%s est un nom de projet invalide. Utilisez une combinaison de caractères " "alphanumériques et '_' " #: ../lucioLib/gui/assistant_new_project.py:226 msgid "Select a device" msgstr "Choisir un périphérique" #: ../lucioLib/gui/assistant_new_project.py:246 msgid "" " Other device.\n" "(Manual import)" msgstr "" " Autre matériel\n" "(import manuel)" #: ../lucioLib/gui/assistant_new_project.py:263 msgid "Images per second" msgstr "Images par seconde" #. display project path #: ../lucioLib/gui/assistant_new_project.py:366 msgid "Project Path" msgstr "Chemin du projet" #: ../lucioLib/gui/assistant_new_project.py:375 msgid "Number of frames per seconds" msgstr "Nombre de frames par seconde" #. display Hardware type #: ../lucioLib/gui/assistant_new_project.py:379 msgid "Hardware type" msgstr "Type de matériel" #. webcam name #: ../lucioLib/gui/assistant_new_project.py:385 msgid "Webcam name" msgstr "Nom de la webcam" #. webcam device #: ../lucioLib/gui/assistant_new_project.py:389 msgid "Webcam device" msgstr "Webcam driver" #. webcam resolution #: ../lucioLib/gui/assistant_new_project.py:393 msgid "Webcam resolution used" msgstr "Résolution utilisée par la webcam" #. webcam device #: ../lucioLib/gui/assistant_new_project.py:399 msgid "Webcam driver used" msgstr "Driver de webcam utilisé" #. Final message #: ../lucioLib/gui/assistant_new_project.py:404 msgid "Have fun with luciole !" msgstr "Amusez-vous bien avec luciole !" #: ../lucioLib/gui/assistant_new_project.py:434 msgid "Luciole project assistant" msgstr "Assistant de projet luciole" #: ../lucioLib/gui/assistant_new_project.py:445 msgid " Select a project path " msgstr " Choisir un chemin de projet " #: ../lucioLib/gui/assistant_new_project.py:454 msgid " Select hardware " msgstr " Choisir un matériel " #: ../lucioLib/gui/assistant_new_project.py:464 msgid " Webcam detection " msgstr " Détection de webcam " #: ../lucioLib/gui/assistant_new_project.py:474 msgid " Project overview " msgstr " Propriétés du projet " #. create New button project #: ../lucioLib/gui/open_project_widget.py:50 msgid "Create a new project" msgstr "Créer un nouveau projet" #. create open button project #: ../lucioLib/gui/open_project_widget.py:59 msgid "Open an existing project" msgstr "Ouvrir un projet existant" #: ../lucioLib/gui/webcam_detection_widget.py:98 msgid "Please wait for webcam detection" msgstr "Détection de webcam en cours. Merci de patienter." #: ../lucioLib/gui/webcam_detection_widget.py:103 msgid "Webcam detection done" msgstr "Détection de webcam terminée" #: ../lucioLib/gui/webcam_detection_widget.py:188 msgid "Detected webcam(s)" msgstr "Webcam détectée(s)" #: ../lucioLib/gui/webcam_detection_widget.py:192 msgid "No webcam detected" msgstr "Pas de webcam détectée" #: ../lucioLib/gui/dialog.py:73 msgid "Select files to import" msgstr "Choisir les fichiers à importer" #: ../lucioLib/gui/dialog.py:114 msgid "Select a Folder" msgstr "Sélectionner un dossier" #: ../lucioLib/luciole_constants.py:42 msgid "OTHER DEVICE" msgstr "AUTRE MATÉRIEL" #: ../lucioLib/luciole_controller.py:154 msgid " Webcam data not valid in project. Please restart webcam detection" msgstr " Données de la webcam invalides. Relancez la détection le la webcam." #: ../lucioLib/luciole_controller.py:171 #, python-format msgid "Project %s saved" msgstr "Le Projet %s a été sauvegardé" #: ../lucioLib/luciole_controller.py:198 #, python-format msgid "Project saved as %s" msgstr "Projet sauvegardé en tant que %s" #: ../lucioLib/luciole_controller.py:243 msgid "No files or valid files choosen for image import." msgstr "Pas d'image ou d'images valides choisies pour l'import." #: ../lucioLib/luciole_controller.py:247 msgid "Impossible to import images when no project are loaded." msgstr "Impossible d'importer des images. Aucun projet n'est chargé." #: ../lucioLib/luciole_controller.py:275 ../lucioLib/luciole_controller.py:283 msgid "Nothing to export. No project loaded" msgstr "Rien à exporter. Il n'y a pas de projet chargé." #. nbd@grape to transform as error message #: ../lucioLib/luciole_controller.py:325 msgid "Can not play animantion : No image on montage view " msgstr "" "Impossible de lire la vidéo : il n'y a pas d'image dans la zone de montage. " #. nbd@grape to transform as error message #: ../lucioLib/luciole_controller.py:334 msgid "Can not play animantion : No project loaded " msgstr "Impossible de lire la vidéo : il n'y a pas de projet chargé " #. nbd@grape : ask for save if save set status as loaded #: ../lucioLib/luciole_controller.py:386 msgid "Save Project before closing" msgstr "Sauvegardez le projet avant de fermer ?" #: ../lucioLib/luciole_controller.py:412 #, python-format msgid "Project %s is closed" msgstr "Le projet %s est fermé" #. clear message status bar #: ../lucioLib/luciole_controller.py:433 msgid "Acquiring" msgstr "En cours d'acquisition" #. stop acquirer #: ../lucioLib/luciole_controller.py:450 msgid "" "No acquisition available. Use 'import image' button to load images in " "project." msgstr "" "L'acquisition n'est pas disponible pour ce type de matériel. Veuillez " "utiliser le bouton 'import images' pour ajouter des images dans le projet." #: ../lucioLib/luciole_controller.py:462 msgid " Can not start acquisition when no project are loaded." msgstr " Impossible de démarrer l'acquisition. Aucun projet n'est chargé." #: ../lucioLib/luciole_controller.py:471 #, python-format msgid "Acquisition error. %s" msgstr "Erreur d'acquisition : %s" #: ../lucioLib/luciole_controller.py:485 msgid "No Acquistion" msgstr "Pas d'acquisition." #. nbd@grape : ask for save if save set status as loaded #: ../lucioLib/luciole_controller.py:574 msgid "Project modified. Save project before exit ?" msgstr "Le projet a été modifié. Le sauvegarder avant de quitter ?" #: ../lucioLib/luciole_controller.py:626 msgid "Please restart Luciole to take into account the new theme " msgstr "" "Merci de redémarrer Luciole pour prendre en compte le nouveau thème. " #: ../lucioLib/luciole_controller.py:676 msgid "Failed to load project " msgstr "Impossible de charger le projet " #: ../lucioLib/lcl_export/lcl_export_video.py:94 msgid "Pass 1/2" msgstr "Progression 1/2" #: ../lucioLib/lcl_export/lcl_export_video.py:103 msgid "Pass 2/2" msgstr "Progression 2/2" #: ../lucioLib/lcl_export/lcl_export_video.py:210 msgid "Export Canceled" msgstr "Export annulé" #: ../lucioLib/lcl_export/lcl_export_video.py:569 #: ../lucioLib/lcl_export/lcl_export_video.py:605 #: ../lucioLib/lcl_export/lcl_export_video.py:632 #, python-format msgid "Unable to erase : %s" msgstr "Impossible d'effacer : %s" #: ../lucioLib/lcl_export/lcl_export_video.py:621 #, python-format msgid "Creation of export folder not possible -- %s" msgstr "Création du dossier d'export impossible -- %s" #: ../lucioLib/luciole_manage_recent.py:95 #, python-format msgid "Project %s no more exist" msgstr "Le projet %s n'existe plus" #~ msgid "" #~ "\n" #~ "Tool for video capture, for making animated cartoon from image per image " #~ "\n" #~ msgstr "" #~ "\n" #~ "Outil de capture vidéo, pour la réalisation d'animation image par image \n" #~ msgid "Mix an image with video stream" #~ msgstr "Caller une image sur le flux vidéo" #~ msgid "Transparency level" #~ msgstr "Niveau de transparence" #, python-format #~ msgid "File %s exists. Replace file ?" #~ msgstr "Le Fichier %s existe. Le remplacer ?" #~ msgid "Image cannot be imported if a project is not open" #~ msgstr "Import d'image impossible sans un projet ouvert" #~ msgid "" #~ "Default\n" #~ "Tropical" #~ msgstr "Tropical" #~ msgid "About" #~ msgstr "À propos" #~ msgid "Project Properties" #~ msgstr "Propriétés du projet" #~ msgid "" #~ "This assistant will help you on configuration of a new luciole project." #~ msgstr "" #~ "Cet assistant va vous aider dans la configuration d'un nouveau projet " #~ "luciole." #~ msgid "unknown video export command" #~ msgstr "Commande d'export vidéo inconnue" #, python-format #~ msgid "The project %s exists !" #~ msgstr "Le projet %s existe déjà !" #, python-format #~ msgid "Not a file : %s" #~ msgstr "%s n'est pas un fichier" #~ msgid "rush folder not valid" #~ msgstr "Répertoire 'rush' invalide" #, python-format #~ msgid "Error path does not exist : %s" #~ msgstr "Erreur. Le chemin %s n'existe pas." #~ msgid "Unable to erase" #~ msgstr "Impossible d'effacer" #~ msgid "Imposible to initialize player." #~ msgstr "Impossible d'initialiser la lecture de la vidéo." #~ msgid "Copyright 2009 Nicolas Bertrand /GRAPE" #~ msgstr "Copyright 2009 Nicolas Bertrand / GRAPE" #, python-format #~ msgid "" #~ "%s is not valid. Not valid project name. It should be a combination of " #~ "alphanumeric and '_' characters " #~ msgstr "" #~ "%s n'est pas valide. Nom de projet invalide. Utilisez une combinaison de " #~ "caractères alphanumériques et '_' " #, python-format #~ msgid "The project already %s exists !" #~ msgstr "Le projet %s existe déjà !" #, python-format #~ msgid "Error, path does not exist : %s" #~ msgstr "Erreur. Le chemin %s n'existe pas." luciole_0.8.6/po/luciole.pot0000644000175000017500000003324311437126703014514 0ustar niconico#, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-02-14 16:37+0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-03-03 04:36+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../ui/luciole.glade.h:1 msgid " " msgstr "" #: ../ui/luciole.glade.h:2 msgid " Export file name (without extension) :" msgstr "" #: ../ui/luciole.glade.h:3 msgid "About Luciole" msgstr "" #: ../ui/luciole.glade.h:4 msgid "Activate/Deactivate camera preview" msgstr "" #: ../ui/luciole.glade.h:5 msgid "Add Trash to montage view" msgstr "" #: ../ui/luciole.glade.h:6 msgid "Choose export format." msgstr "" #: ../ui/luciole.glade.h:7 msgid "Copyright 2009-2010 Nicolas Bertrand (nico@inattendu.org)" msgstr "" #: ../ui/luciole.glade.h:8 msgid "DV format (raw DV)" msgstr "" #: ../ui/luciole.glade.h:9 msgid "Default" msgstr "" #: ../ui/luciole.glade.h:10 msgid "Export" msgstr "" #: ../ui/luciole.glade.h:11 msgid "Export path:" msgstr "" #: ../ui/luciole.glade.h:12 msgid "Export video with sound." msgstr "" #: ../ui/luciole.glade.h:13 msgid "File format :" msgstr "" #: ../ui/luciole.glade.h:14 msgid "Format DVD (mpeg2)" msgstr "" #: ../ui/luciole.glade.h:15 msgid "Format divx/xvid (avi)" msgstr "" #: ../ui/luciole.glade.h:16 msgid "Image per seconds" msgstr "" #. Caller une image sur le flux video #: ../ui/luciole.glade.h:18 msgid "Import images" msgstr "" #: ../ui/luciole.glade.h:19 msgid "Luciole on line" msgstr "" #: ../ui/luciole.glade.h:20 msgid "Mixer" msgstr "" #. Descendre un/ou plusieurs images #: ../ui/luciole.glade.h:22 msgid "Move down one or several images" msgstr "" #. Déplacer des images capturées dans la zone de montage #: ../ui/luciole.glade.h:24 msgid "Move snapshot to montage area" msgstr "" #. Monter un/ou plusieurs images #: ../ui/luciole.glade.h:26 msgid "Move up one or several images" msgstr "" #: ../ui/luciole.glade.h:27 msgid "Open recent" msgstr "" #: ../ui/luciole.glade.h:28 msgid "Play video" msgstr "" #: ../ui/luciole.glade.h:29 msgid "Preferences" msgstr "" #: ../ui/luciole.glade.h:30 ../lucioLib/gui/dialog_project_properties.py:105 msgid "Project properties" msgstr "" #: ../ui/luciole.glade.h:31 msgid "Select Theme" msgstr "" #: ../ui/luciole.glade.h:32 msgid "Select a Luciole project" msgstr "" #: ../ui/luciole.glade.h:33 ../ui/export_file.glade.h:11 #: ../lucioLib/gui/assistant_new_project.py:102 msgid "Select a folder" msgstr "" #: ../ui/luciole.glade.h:34 msgid "" "Stop-motion tool for making animated cartoon\n" "Makes live video acquistion from Webcam or DV cam" msgstr "" #: ../ui/luciole.glade.h:36 msgid "" "This program is free software; you can redistribute it and/or\n" "modify it under the terms of the GNU General Public License\n" "as published by the Free Software Foundation; either \n" "version 2 of the License, or (at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied \n" "warranty of MERCHANTABILITY or FITNESS FOR A \n" "PARTICULAR PURPOSE. See the GNU General Public \n" "License for more details.\n" "\n" "You should have received a copy of the GNU General Public\n" "License along with this program; if not, write to the \n" "Free Software Foundation, \n" "Inc., 59 Temple Place - \n" "Suite 330, Boston, MA 02111-1307, USA." msgstr "" #. Jeter à la poubelle #: ../ui/luciole.glade.h:53 msgid "To trash" msgstr "" #: ../ui/luciole.glade.h:54 msgid "Tool Export" msgstr "" #: ../ui/luciole.glade.h:55 msgid "Tropical" msgstr "" #: ../ui/luciole.glade.h:56 msgid "Video Export" msgstr "" #: ../ui/luciole.glade.h:57 msgid "_File" msgstr "" #: ../ui/luciole.glade.h:58 msgid "_Help" msgstr "" #: ../ui/luciole.glade.h:59 msgid "_View" msgstr "" #: ../ui/luciole.glade.h:60 msgid "make a snapshot" msgstr "" #: ../ui/luciole.glade.h:61 msgid "options" msgstr "" #: ../ui/luciole.glade.h:62 msgid "project1" msgstr "" #: ../ui/luciole.glade.h:63 msgid "project2" msgstr "" #: ../ui/luciole.glade.h:64 msgid "project3" msgstr "" #: ../ui/luciole.glade.h:65 msgid "project4" msgstr "" #: ../ui/luciole.glade.h:66 msgid "project5" msgstr "" #: ../ui/export_file.glade.h:1 msgid "Cinelerra" msgstr "" #: ../ui/export_file.glade.h:2 msgid "Coming soon" msgstr "" #: ../ui/export_file.glade.h:3 msgid "Export to Kdenlive" msgstr "" #: ../ui/export_file.glade.h:4 msgid "Export to another application" msgstr "" #: ../ui/export_file.glade.h:5 msgid "Export to cinelerra" msgstr "" #: ../ui/export_file.glade.h:6 msgid "Export to pitivi" msgstr "" #: ../ui/export_file.glade.h:7 msgid "Kdenlive" msgstr "" #: ../ui/export_file.glade.h:8 msgid "Openshot" msgstr "" #: ../ui/export_file.glade.h:9 msgid "Pitivi" msgstr "" #: ../ui/export_file.glade.h:10 msgid "Select a filename" msgstr "" #: ../ui/export_file.glade.h:12 msgid "Select an export directory" msgstr "" #: ../ui/export_file.glade.h:13 msgid "Tool Exporter" msgstr "" #: ../lucioLib/controller/controller_load_project.py:134 msgid "Project Load started" msgstr "" #: ../lucioLib/controller/controller_load_project.py:139 #, python-format msgid "Project %s is loaded" msgstr "" #: ../lucioLib/controller/controller_load_project.py:145 #, python-format msgid "Project %s is loading" msgstr "" #: ../lucioLib/controller/controller_import.py:177 msgid "Import started" msgstr "" #: ../lucioLib/controller/controller_import.py:182 msgid "All images imported" msgstr "" #: ../lucioLib/controller/controller_import.py:188 msgid "Importing images ..." msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:51 msgid "Project folder :" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:55 msgid "Project name :" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:59 msgid "XML file :" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:64 msgid "Number of frames / image" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:68 msgid "Device type" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:76 msgid "Device :" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:80 msgid "Webcam name :" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:85 msgid "Video capture driver :" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:89 msgid "Video width :" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:93 msgid "Video height :" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:97 msgid "" "Webcam framerate \n" " (number of images per second)" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:213 #: ../lucioLib/gui/dialog_project_properties.py:229 msgid "desc" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:271 msgid "Webcam properties" msgstr "" #. #. Display Button fo webcam detetction #. #: ../lucioLib/gui/dialog_project_properties.py:300 msgid "Webcam detection" msgstr "" #: ../lucioLib/gui/luciole_export_window.py:174 #, python-format msgid "" "%s is not valid. Not valid video name. It should be a combination of " "alphanumeric and '_' characters " msgstr "" #. Launch Dialog window to ask if export file can be overide #. add message display #: ../lucioLib/gui/luciole_export_window.py:207 #: ../lucioLib/gui/luciole_export_tool_window.py:196 #, python-format msgid "File %s already exists. Replace file ?" msgstr "" #: ../lucioLib/gui/luciole_export_tool_window.py:115 msgid "Select an application and a file name for export" msgstr "" #. Terminated normaly #: ../lucioLib/gui/luciole_export_tool_window.py:209 #: ../lucioLib/lcl_export/lcl_export_video.py:207 msgid "Export Done" msgstr "" #. #. Initailize widgets for first page #. #. A label #: ../lucioLib/gui/assistant_new_project.py:59 msgid "" "This assistant will help you on configuration of a new Luciole project." msgstr "" #. A label #: ../lucioLib/gui/assistant_new_project.py:72 msgid "Select project name and destination folder." msgstr "" #. display project name #: ../lucioLib/gui/assistant_new_project.py:82 #: ../lucioLib/gui/assistant_new_project.py:362 msgid "Project Name" msgstr "" #: ../lucioLib/gui/assistant_new_project.py:95 msgid "Folder" msgstr "" #. project with same name alreday exists #: ../lucioLib/gui/assistant_new_project.py:167 #, python-format msgid "The project %s already exists !" msgstr "" #. invalid projetc name #: ../lucioLib/gui/assistant_new_project.py:171 #, python-format msgid "" "%s isn't a valid project name. It should be a combination of alphanumeric " "and '_' characters " msgstr "" #: ../lucioLib/gui/assistant_new_project.py:226 msgid "Select a device" msgstr "" #: ../lucioLib/gui/assistant_new_project.py:246 msgid "" " Other device.\n" "(Manual import)" msgstr "" #: ../lucioLib/gui/assistant_new_project.py:263 msgid "Images per second" msgstr "" #. display project path #: ../lucioLib/gui/assistant_new_project.py:366 msgid "Project Path" msgstr "" #: ../lucioLib/gui/assistant_new_project.py:375 msgid "Number of frames per seconds" msgstr "" #. display Hardware type #: ../lucioLib/gui/assistant_new_project.py:379 msgid "Hardware type" msgstr "" #. webcam name #: ../lucioLib/gui/assistant_new_project.py:385 msgid "Webcam name" msgstr "" #. webcam device #: ../lucioLib/gui/assistant_new_project.py:389 msgid "Webcam device" msgstr "" #. webcam resolution #: ../lucioLib/gui/assistant_new_project.py:393 msgid "Webcam resolution used" msgstr "" #. webcam device #: ../lucioLib/gui/assistant_new_project.py:399 msgid "Webcam driver used" msgstr "" #. Final message #: ../lucioLib/gui/assistant_new_project.py:404 msgid "Have fun with luciole !" msgstr "" #: ../lucioLib/gui/assistant_new_project.py:434 msgid "Luciole project assistant" msgstr "" #: ../lucioLib/gui/assistant_new_project.py:445 msgid " Select a project path " msgstr "" #: ../lucioLib/gui/assistant_new_project.py:454 msgid " Select hardware " msgstr "" #: ../lucioLib/gui/assistant_new_project.py:464 msgid " Webcam detection " msgstr "" #: ../lucioLib/gui/assistant_new_project.py:474 msgid " Project overview " msgstr "" #. create New button project #: ../lucioLib/gui/open_project_widget.py:50 msgid "Create a new project" msgstr "" #. create open button project #: ../lucioLib/gui/open_project_widget.py:59 msgid "Open an existing project" msgstr "" #: ../lucioLib/gui/webcam_detection_widget.py:98 msgid "Please wait for webcam detection" msgstr "" #: ../lucioLib/gui/webcam_detection_widget.py:103 msgid "Webcam detection done" msgstr "" #: ../lucioLib/gui/webcam_detection_widget.py:188 msgid "Detected webcam(s)" msgstr "" #: ../lucioLib/gui/webcam_detection_widget.py:192 msgid "No webcam detected" msgstr "" #: ../lucioLib/gui/dialog.py:73 msgid "Select files to import" msgstr "" #: ../lucioLib/gui/dialog.py:114 msgid "Select a Folder" msgstr "" #: ../lucioLib/luciole_constants.py:42 msgid "OTHER DEVICE" msgstr "" #: ../lucioLib/luciole_controller.py:154 msgid " Webcam data not valid in project. Please restart webcam detection" msgstr "" #: ../lucioLib/luciole_controller.py:171 #, python-format msgid "Project %s saved" msgstr "" #: ../lucioLib/luciole_controller.py:198 #, python-format msgid "Project saved as %s" msgstr "" #: ../lucioLib/luciole_controller.py:243 msgid "No files or valid files choosen for image import." msgstr "" #: ../lucioLib/luciole_controller.py:247 msgid "Impossible to import images when no project are loaded." msgstr "" #: ../lucioLib/luciole_controller.py:275 ../lucioLib/luciole_controller.py:283 msgid "Nothing to export. No project loaded" msgstr "" #. nbd@grape to transform as error message #: ../lucioLib/luciole_controller.py:325 msgid "Can not play animantion : No image on montage view " msgstr "" #. nbd@grape to transform as error message #: ../lucioLib/luciole_controller.py:334 msgid "Can not play animantion : No project loaded " msgstr "" #. nbd@grape : ask for save if save set status as loaded #: ../lucioLib/luciole_controller.py:386 msgid "Save Project before closing" msgstr "" #: ../lucioLib/luciole_controller.py:412 #, python-format msgid "Project %s is closed" msgstr "" #. clear message status bar #: ../lucioLib/luciole_controller.py:433 msgid "Acquiring" msgstr "" #. stop acquirer #: ../lucioLib/luciole_controller.py:450 msgid "" "No acquisition available. Use 'import image' button to load images in " "project." msgstr "" #: ../lucioLib/luciole_controller.py:462 msgid " Can not start acquisition when no project are loaded." msgstr "" #: ../lucioLib/luciole_controller.py:471 #, python-format msgid "Acquisition error. %s" msgstr "" #: ../lucioLib/luciole_controller.py:485 msgid "No Acquistion" msgstr "" #. nbd@grape : ask for save if save set status as loaded #: ../lucioLib/luciole_controller.py:574 msgid "Project modified. Save project before exit ?" msgstr "" #: ../lucioLib/luciole_controller.py:626 msgid "Please restart Luciole to take into account the new theme " msgstr "" #: ../lucioLib/luciole_controller.py:676 msgid "Failed to load project " msgstr "" #: ../lucioLib/lcl_export/lcl_export_video.py:94 msgid "Pass 1/2" msgstr "" #: ../lucioLib/lcl_export/lcl_export_video.py:103 msgid "Pass 2/2" msgstr "" #: ../lucioLib/lcl_export/lcl_export_video.py:210 msgid "Export Canceled" msgstr "" #: ../lucioLib/lcl_export/lcl_export_video.py:569 #: ../lucioLib/lcl_export/lcl_export_video.py:605 #: ../lucioLib/lcl_export/lcl_export_video.py:632 #, python-format msgid "Unable to erase : %s" msgstr "" #: ../lucioLib/lcl_export/lcl_export_video.py:621 #, python-format msgid "Creation of export folder not possible -- %s" msgstr "" #: ../lucioLib/luciole_manage_recent.py:95 #, python-format msgid "Project %s no more exist" msgstr "" luciole_0.8.6/po/luciole-en_GB.po0000644000175000017500000003727311437126703015307 0ustar niconico# English (United Kingdom) translation for luciole # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the luciole package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: luciole\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-02-14 16:37+0400\n" "PO-Revision-Date: 2010-02-14 07:54+0000\n" "Last-Translator: NicoInattendu \n" "Language-Team: English (United Kingdom) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-03-03 04:36+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../ui/luciole.glade.h:1 msgid " " msgstr " " #: ../ui/luciole.glade.h:2 msgid " Export file name (without extension) :" msgstr " Destination filename (without extension) :" #: ../ui/luciole.glade.h:3 msgid "About Luciole" msgstr "" #: ../ui/luciole.glade.h:4 msgid "Activate/Deactivate camera preview" msgstr "Enable/Disable camera preview" #: ../ui/luciole.glade.h:5 msgid "Add Trash to montage view" msgstr "Add Trash button to capture area" #: ../ui/luciole.glade.h:6 msgid "Choose export format." msgstr "Choose destination file format." #: ../ui/luciole.glade.h:7 msgid "Copyright 2009-2010 Nicolas Bertrand (nico@inattendu.org)" msgstr "" #: ../ui/luciole.glade.h:8 msgid "DV format (raw DV)" msgstr "" #: ../ui/luciole.glade.h:9 msgid "Default" msgstr "" #: ../ui/luciole.glade.h:10 msgid "Export" msgstr "Render" #: ../ui/luciole.glade.h:11 msgid "Export path:" msgstr "Path of the destination file" #: ../ui/luciole.glade.h:12 msgid "Export video with sound." msgstr "Render video with sound" #: ../ui/luciole.glade.h:13 msgid "File format :" msgstr "" #: ../ui/luciole.glade.h:14 msgid "Format DVD (mpeg2)" msgstr "DVD format (mpeg2)" #: ../ui/luciole.glade.h:15 msgid "Format divx/xvid (avi)" msgstr "divx/xvid format (avi)" #: ../ui/luciole.glade.h:16 msgid "Image per seconds" msgstr "Framerate" #. Caller une image sur le flux video #: ../ui/luciole.glade.h:18 msgid "Import images" msgstr "" #: ../ui/luciole.glade.h:19 msgid "Luciole on line" msgstr "" #: ../ui/luciole.glade.h:20 msgid "Mixer" msgstr "Onion skinning (Mixer)" #. Descendre un/ou plusieurs images #: ../ui/luciole.glade.h:22 msgid "Move down one or several images" msgstr "Move one or several images downward" #. Déplacer des images capturées dans la zone de montage #: ../ui/luciole.glade.h:24 msgid "Move snapshot to montage area" msgstr "Move one or several images to the Editing area" #. Monter un/ou plusieurs images #: ../ui/luciole.glade.h:26 msgid "Move up one or several images" msgstr "Move one or several images upward" #: ../ui/luciole.glade.h:27 msgid "Open recent" msgstr "" #: ../ui/luciole.glade.h:28 msgid "Play video" msgstr "Play animation" #: ../ui/luciole.glade.h:29 msgid "Preferences" msgstr "" #: ../ui/luciole.glade.h:30 ../lucioLib/gui/dialog_project_properties.py:105 msgid "Project properties" msgstr "" #: ../ui/luciole.glade.h:31 msgid "Select Theme" msgstr "" #: ../ui/luciole.glade.h:32 msgid "Select a Luciole project" msgstr "" #: ../ui/luciole.glade.h:33 ../ui/export_file.glade.h:11 #: ../lucioLib/gui/assistant_new_project.py:102 msgid "Select a folder" msgstr "" #: ../ui/luciole.glade.h:34 msgid "" "Stop-motion tool for making animated cartoon\n" "Makes live video acquistion from Webcam or DV cam" msgstr "" "Tool for making stop-motion animations\n" "Captures frames from live video stream (Webcam or DVcam)" #: ../ui/luciole.glade.h:36 msgid "" "This program is free software; you can redistribute it and/or\n" "modify it under the terms of the GNU General Public License\n" "as published by the Free Software Foundation; either \n" "version 2 of the License, or (at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied \n" "warranty of MERCHANTABILITY or FITNESS FOR A \n" "PARTICULAR PURPOSE. See the GNU General Public \n" "License for more details.\n" "\n" "You should have received a copy of the GNU General Public\n" "License along with this program; if not, write to the \n" "Free Software Foundation, \n" "Inc., 59 Temple Place - \n" "Suite 330, Boston, MA 02111-1307, USA." msgstr "" #. Jeter à la poubelle #: ../ui/luciole.glade.h:53 msgid "To trash" msgstr "Move to Trash" #: ../ui/luciole.glade.h:54 msgid "Tool Export" msgstr "Export tool" #: ../ui/luciole.glade.h:55 msgid "Tropical" msgstr "" #: ../ui/luciole.glade.h:56 msgid "Video Export" msgstr "Rendering" #: ../ui/luciole.glade.h:57 msgid "_File" msgstr "" #: ../ui/luciole.glade.h:58 msgid "_Help" msgstr "" #: ../ui/luciole.glade.h:59 msgid "_View" msgstr "" #: ../ui/luciole.glade.h:60 msgid "make a snapshot" msgstr "Capture a frame" #: ../ui/luciole.glade.h:61 msgid "options" msgstr "Options" #: ../ui/luciole.glade.h:62 msgid "project1" msgstr "" #: ../ui/luciole.glade.h:63 msgid "project2" msgstr "" #: ../ui/luciole.glade.h:64 msgid "project3" msgstr "" #: ../ui/luciole.glade.h:65 msgid "project4" msgstr "" #: ../ui/luciole.glade.h:66 msgid "project5" msgstr "" #: ../ui/export_file.glade.h:1 msgid "Cinelerra" msgstr "" #: ../ui/export_file.glade.h:2 msgid "Coming soon" msgstr "" #: ../ui/export_file.glade.h:3 msgid "Export to Kdenlive" msgstr "" #: ../ui/export_file.glade.h:4 msgid "Export to another application" msgstr "" #: ../ui/export_file.glade.h:5 msgid "Export to cinelerra" msgstr "Export to Cinelerra" #: ../ui/export_file.glade.h:6 msgid "Export to pitivi" msgstr "Export to Pitivi" #: ../ui/export_file.glade.h:7 msgid "Kdenlive" msgstr "" #: ../ui/export_file.glade.h:8 msgid "Openshot" msgstr "" #: ../ui/export_file.glade.h:9 msgid "Pitivi" msgstr "" #: ../ui/export_file.glade.h:10 msgid "Select a filename" msgstr "" #: ../ui/export_file.glade.h:12 msgid "Select an export directory" msgstr "Select a directory" #: ../ui/export_file.glade.h:13 msgid "Tool Exporter" msgstr "Export tool" #: ../lucioLib/controller/controller_load_project.py:134 msgid "Project Load started" msgstr "" #: ../lucioLib/controller/controller_load_project.py:139 #, python-format msgid "Project %s is loaded" msgstr "" #: ../lucioLib/controller/controller_load_project.py:145 #, python-format msgid "Project %s is loading" msgstr "" #: ../lucioLib/controller/controller_import.py:177 msgid "Import started" msgstr "" #: ../lucioLib/controller/controller_import.py:182 msgid "All images imported" msgstr "" #: ../lucioLib/controller/controller_import.py:188 msgid "Importing images ..." msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:51 msgid "Project folder :" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:55 msgid "Project name :" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:59 msgid "XML file :" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:64 msgid "Number of frames / image" msgstr "Framerate :" #: ../lucioLib/gui/dialog_project_properties.py:68 msgid "Device type" msgstr "Hardware :" #: ../lucioLib/gui/dialog_project_properties.py:76 msgid "Device :" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:80 msgid "Webcam name :" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:85 msgid "Video capture driver :" msgstr "Video driver :" #: ../lucioLib/gui/dialog_project_properties.py:89 msgid "Video width :" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:93 msgid "Video height :" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:97 msgid "" "Webcam framerate \n" " (number of images per second)" msgstr "Framerate :" #: ../lucioLib/gui/dialog_project_properties.py:213 #: ../lucioLib/gui/dialog_project_properties.py:229 msgid "desc" msgstr "" #: ../lucioLib/gui/dialog_project_properties.py:271 msgid "Webcam properties" msgstr "" #. #. Display Button fo webcam detetction #. #: ../lucioLib/gui/dialog_project_properties.py:300 msgid "Webcam detection" msgstr "" "Webcam detection\n" "click to activate" #: ../lucioLib/gui/luciole_export_window.py:174 #, python-format msgid "" "%s is not valid. Not valid video name. It should be a combination of " "alphanumeric and '_' characters " msgstr "" "%s is not valid. Filenames for video should be a combination of alphanumeric " "and '_' characters " #. Launch Dialog window to ask if export file can be overide #. add message display #: ../lucioLib/gui/luciole_export_window.py:207 #: ../lucioLib/gui/luciole_export_tool_window.py:196 #, python-format msgid "File %s already exists. Replace file ?" msgstr "" #: ../lucioLib/gui/luciole_export_tool_window.py:115 msgid "Select an application and a file name for export" msgstr "" #. Terminated normaly #: ../lucioLib/gui/luciole_export_tool_window.py:209 #: ../lucioLib/lcl_export/lcl_export_video.py:207 msgid "Export Done" msgstr "Render done" #. #. Initailize widgets for first page #. #. A label #: ../lucioLib/gui/assistant_new_project.py:59 msgid "" "This assistant will help you on configuration of a new Luciole project." msgstr "This assistant will help you configuring a new Luciole project." #. A label #: ../lucioLib/gui/assistant_new_project.py:72 msgid "Select project name and destination folder." msgstr "Select a project name and a destination folder." #. display project name #: ../lucioLib/gui/assistant_new_project.py:82 #: ../lucioLib/gui/assistant_new_project.py:362 msgid "Project Name" msgstr "Project name" #: ../lucioLib/gui/assistant_new_project.py:95 msgid "Folder" msgstr "" #. project with same name alreday exists #: ../lucioLib/gui/assistant_new_project.py:167 #, python-format msgid "The project %s already exists !" msgstr "" #. invalid projetc name #: ../lucioLib/gui/assistant_new_project.py:171 #, python-format msgid "" "%s isn't a valid project name. It should be a combination of alphanumeric " "and '_' characters " msgstr "" "%s isn't valid. Project names should be a combination of alphanumeric and " "'_' characters " #: ../lucioLib/gui/assistant_new_project.py:226 msgid "Select a device" msgstr "" #: ../lucioLib/gui/assistant_new_project.py:246 msgid "" " Other device.\n" "(Manual import)" msgstr " Manual import from disk" #: ../lucioLib/gui/assistant_new_project.py:263 msgid "Images per second" msgstr "Framerate (images per second)" #. display project path #: ../lucioLib/gui/assistant_new_project.py:366 msgid "Project Path" msgstr "Project path" #: ../lucioLib/gui/assistant_new_project.py:375 msgid "Number of frames per seconds" msgstr "Framerate" #. display Hardware type #: ../lucioLib/gui/assistant_new_project.py:379 msgid "Hardware type" msgstr "Hardware" #. webcam name #: ../lucioLib/gui/assistant_new_project.py:385 msgid "Webcam name" msgstr "" #. webcam device #: ../lucioLib/gui/assistant_new_project.py:389 msgid "Webcam device" msgstr "Webcam device" #. webcam resolution #: ../lucioLib/gui/assistant_new_project.py:393 msgid "Webcam resolution used" msgstr "Resolution" #. webcam device #: ../lucioLib/gui/assistant_new_project.py:399 msgid "Webcam driver used" msgstr "Webcam driver" #. Final message #: ../lucioLib/gui/assistant_new_project.py:404 msgid "Have fun with luciole !" msgstr "" #: ../lucioLib/gui/assistant_new_project.py:434 msgid "Luciole project assistant" msgstr "" #: ../lucioLib/gui/assistant_new_project.py:445 msgid " Select a project path " msgstr "" #: ../lucioLib/gui/assistant_new_project.py:454 msgid " Select hardware " msgstr " Hardware selection " #: ../lucioLib/gui/assistant_new_project.py:464 msgid " Webcam detection " msgstr "" #: ../lucioLib/gui/assistant_new_project.py:474 msgid " Project overview " msgstr "" #. create New button project #: ../lucioLib/gui/open_project_widget.py:50 msgid "Create a new project" msgstr "" #. create open button project #: ../lucioLib/gui/open_project_widget.py:59 msgid "Open an existing project" msgstr "" #: ../lucioLib/gui/webcam_detection_widget.py:98 msgid "Please wait for webcam detection" msgstr "" #: ../lucioLib/gui/webcam_detection_widget.py:103 msgid "Webcam detection done" msgstr "Webcam detected" #: ../lucioLib/gui/webcam_detection_widget.py:188 msgid "Detected webcam(s)" msgstr "" #: ../lucioLib/gui/webcam_detection_widget.py:192 msgid "No webcam detected" msgstr "" #: ../lucioLib/gui/dialog.py:73 msgid "Select files to import" msgstr "Select image files to import" #: ../lucioLib/gui/dialog.py:114 msgid "Select a Folder" msgstr "Select a folder" #: ../lucioLib/luciole_constants.py:42 msgid "OTHER DEVICE" msgstr "" #: ../lucioLib/luciole_controller.py:154 msgid " Webcam data not valid in project. Please restart webcam detection" msgstr " Invalid Webcam data. Please restart Webcam detection" #: ../lucioLib/luciole_controller.py:171 #, python-format msgid "Project %s saved" msgstr "" #: ../lucioLib/luciole_controller.py:198 #, python-format msgid "Project saved as %s" msgstr "" #: ../lucioLib/luciole_controller.py:243 msgid "No files or valid files choosen for image import." msgstr "No files or no valid files selected for image import." #: ../lucioLib/luciole_controller.py:247 msgid "Impossible to import images when no project are loaded." msgstr "Image import impossible : No projects loaded" #: ../lucioLib/luciole_controller.py:275 ../lucioLib/luciole_controller.py:283 msgid "Nothing to export. No project loaded" msgstr "Nothing to export : No projects loaded" #. nbd@grape to transform as error message #: ../lucioLib/luciole_controller.py:325 msgid "Can not play animantion : No image on montage view " msgstr "Can not play animation : No images on Editing area " #. nbd@grape to transform as error message #: ../lucioLib/luciole_controller.py:334 msgid "Can not play animantion : No project loaded " msgstr "Can not play animation : No projects loaded " #. nbd@grape : ask for save if save set status as loaded #: ../lucioLib/luciole_controller.py:386 msgid "Save Project before closing" msgstr "Save project before closing" #: ../lucioLib/luciole_controller.py:412 #, python-format msgid "Project %s is closed" msgstr "" #. clear message status bar #: ../lucioLib/luciole_controller.py:433 msgid "Acquiring" msgstr "" #. stop acquirer #: ../lucioLib/luciole_controller.py:450 msgid "" "No acquisition available. Use 'import image' button to load images in " "project." msgstr "" "No acquisition available. Use the 'import image' button to load images into " "the project." #: ../lucioLib/luciole_controller.py:462 msgid " Can not start acquisition when no project are loaded." msgstr " Can not start acquisition: No projects loaded" #: ../lucioLib/luciole_controller.py:471 #, python-format msgid "Acquisition error. %s" msgstr "" #: ../lucioLib/luciole_controller.py:485 msgid "No Acquistion" msgstr "No acquistion" #. nbd@grape : ask for save if save set status as loaded #: ../lucioLib/luciole_controller.py:574 msgid "Project modified. Save project before exit ?" msgstr "Project modified. Save project before exiting ?" #: ../lucioLib/luciole_controller.py:626 msgid "Please restart Luciole to take into account the new theme " msgstr "Please restart Luciole to load the new theme " #: ../lucioLib/luciole_controller.py:676 msgid "Failed to load project " msgstr "" #: ../lucioLib/lcl_export/lcl_export_video.py:94 msgid "Pass 1/2" msgstr "" #: ../lucioLib/lcl_export/lcl_export_video.py:103 msgid "Pass 2/2" msgstr "" #: ../lucioLib/lcl_export/lcl_export_video.py:210 msgid "Export Canceled" msgstr "Export cancelled" #: ../lucioLib/lcl_export/lcl_export_video.py:569 #: ../lucioLib/lcl_export/lcl_export_video.py:605 #: ../lucioLib/lcl_export/lcl_export_video.py:632 #, python-format msgid "Unable to erase : %s" msgstr "" #: ../lucioLib/lcl_export/lcl_export_video.py:621 #, python-format msgid "Creation of export folder not possible -- %s" msgstr "Impossible to create destination folder -- %s" #: ../lucioLib/luciole_manage_recent.py:95 #, python-format msgid "Project %s no more exist" msgstr ""